From 1d578310b72c13057165b369f0becb53998c0b75 Mon Sep 17 00:00:00 2001 From: Defnull <879658+define-null@users.noreply.github.com> Date: Wed, 11 Mar 2026 19:06:43 +0100 Subject: [PATCH 1/3] Treat missing table as a BadRequest, update query dependencies to use nullable columns --- Cargo.lock | 5 +---- Cargo.toml | 10 +++++++--- src/controller/p2p.rs | 3 ++- src/query/result.rs | 9 +++++++-- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 46a52c3..c02b9db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7232,7 +7232,6 @@ dependencies = [ [[package]] name = "sqd-bloom-filter" version = "0.1.0" -source = "git+https://github.com/subsquid/data.git?rev=b10a969#b10a9692b92920e4d97306f8dd32c77c79291983" dependencies = [ "xxhash-rust", ] @@ -7309,7 +7308,6 @@ dependencies = [ [[package]] name = "sqd-polars" version = "0.1.0" -source = "git+https://github.com/subsquid/data.git?rev=b10a969#b10a9692b92920e4d97306f8dd32c77c79291983" dependencies = [ "anyhow", "arrow", @@ -7321,12 +7319,10 @@ dependencies = [ [[package]] name = "sqd-primitives" version = "0.1.0" -source = "git+https://github.com/subsquid/data.git?rev=b10a969#b10a9692b92920e4d97306f8dd32c77c79291983" [[package]] name = "sqd-query" version = "0.1.0" -source = "git+https://github.com/subsquid/data.git?rev=b10a969#b10a9692b92920e4d97306f8dd32c77c79291983" dependencies = [ "anyhow", "arrow", @@ -7345,6 +7341,7 @@ dependencies = [ "sqd-bloom-filter", "sqd-polars", "sqd-primitives", + "tracing", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c490de3..85bfa00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,10 @@ license = "AGPL-3.0-or-later" version = "2.10.0" edition = "2021" -[dependencies] +[features] +query-tracing = ["sqd-query/max_level_trace"] + +[dependencies] anyhow = "1.0" async-compression = { version = "0.4.27", features = ["gzip", "tokio"] } async-stream = "0.3.5" @@ -62,8 +65,9 @@ sqd-contract-client = { git = "https://github.com/subsquid/sqd-network.git", rev sqd-messages = { git = "https://github.com/subsquid/sqd-network.git", rev = "7ac249a", version = "2.0.2", features = ["bitstring"] } sqd-network-transport = { git = "https://github.com/subsquid/sqd-network.git", rev = "7ac249a", version = "3.0.0", features = ["worker", "metrics"] } -sqd-query = { git = "https://github.com/subsquid/data.git", rev = "b10a969", features = ["parquet"] } -sqd-polars = { git = "https://github.com/subsquid/data.git", rev = "b10a969" } +sqd-query = { git = "https://github.com/subsquid/data.git", rev = "ab4d4c73ab87e8d8d8c8e3b2712aca04a1a95a00", features = ["parquet"] } +sqd-polars = { git = "https://github.com/subsquid/data.git", rev = "ab4d4c73ab87e8d8d8c8e3b2712aca04a1a95a00" } + sql_query_plan = {git = "https://github.com/subsquid/qplan.git", rev = "658f88f" } [profile.release] diff --git a/src/controller/p2p.rs b/src/controller/p2p.rs index 9b6c199..e39d8f6 100644 --- a/src/controller/p2p.rs +++ b/src/controller/p2p.rs @@ -485,7 +485,8 @@ impl + Send + 'static> P2PController for QueryError { } impl From for QueryError { - fn from(value: anyhow::Error) -> Self { - Self::Other(value.to_string()) + fn from(err: anyhow::Error) -> Self { + if let Some(_) = err.downcast_ref::() { + QueryError::BadRequest(err.to_string()) + } else { + Self::Other(err.to_string()) + } } } From c87452803366c28fe1cdbfa8d3857786fd1ecf95 Mon Sep 17 00:00:00 2001 From: Defnull <879658+define-null@users.noreply.github.com> Date: Mon, 16 Mar 2026 11:05:47 +0100 Subject: [PATCH 2/3] Treat missing column as a bad request --- Cargo.lock | 4 ++++ Cargo.toml | 4 ++-- src/query/result.rs | 6 ++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c02b9db..cd9abcb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7232,6 +7232,7 @@ dependencies = [ [[package]] name = "sqd-bloom-filter" version = "0.1.0" +source = "git+https://github.com/subsquid/data.git?rev=ad62dc2#ad62dc206e4ae7d0edc79e6875876dea1f2639df" dependencies = [ "xxhash-rust", ] @@ -7308,6 +7309,7 @@ dependencies = [ [[package]] name = "sqd-polars" version = "0.1.0" +source = "git+https://github.com/subsquid/data.git?rev=ad62dc2#ad62dc206e4ae7d0edc79e6875876dea1f2639df" dependencies = [ "anyhow", "arrow", @@ -7319,10 +7321,12 @@ dependencies = [ [[package]] name = "sqd-primitives" version = "0.1.0" +source = "git+https://github.com/subsquid/data.git?rev=ad62dc2#ad62dc206e4ae7d0edc79e6875876dea1f2639df" [[package]] name = "sqd-query" version = "0.1.0" +source = "git+https://github.com/subsquid/data.git?rev=ad62dc2#ad62dc206e4ae7d0edc79e6875876dea1f2639df" dependencies = [ "anyhow", "arrow", diff --git a/Cargo.toml b/Cargo.toml index 85bfa00..886761a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,8 +65,8 @@ sqd-contract-client = { git = "https://github.com/subsquid/sqd-network.git", rev sqd-messages = { git = "https://github.com/subsquid/sqd-network.git", rev = "7ac249a", version = "2.0.2", features = ["bitstring"] } sqd-network-transport = { git = "https://github.com/subsquid/sqd-network.git", rev = "7ac249a", version = "3.0.0", features = ["worker", "metrics"] } -sqd-query = { git = "https://github.com/subsquid/data.git", rev = "ab4d4c73ab87e8d8d8c8e3b2712aca04a1a95a00", features = ["parquet"] } -sqd-polars = { git = "https://github.com/subsquid/data.git", rev = "ab4d4c73ab87e8d8d8c8e3b2712aca04a1a95a00" } +sqd-query = { git = "https://github.com/subsquid/data.git", rev = "ad62dc2", features = ["parquet"] } +sqd-polars = { git = "https://github.com/subsquid/data.git", rev = "ad62dc2" } sql_query_plan = {git = "https://github.com/subsquid/qplan.git", rev = "658f88f" } diff --git a/src/query/result.rs b/src/query/result.rs index de89ef6..5c38966 100644 --- a/src/query/result.rs +++ b/src/query/result.rs @@ -1,7 +1,7 @@ use std::time::Duration; use axum::{http::StatusCode, response::IntoResponse}; -use sqd_query::TableDoesNotExist; +use sqd_query::{TableDoesNotExist, ColumnDoesNotExist}; use tracing::instrument; use crate::util::hash::sha3_256; @@ -99,7 +99,9 @@ impl From for QueryError { impl From for QueryError { fn from(err: anyhow::Error) -> Self { - if let Some(_) = err.downcast_ref::() { + let is_bad_request = err.is::() || err.is::(); + + if is_bad_request { QueryError::BadRequest(err.to_string()) } else { Self::Other(err.to_string()) From 6f9104d2757334161dc3b5b7ae1550fad2247a60 Mon Sep 17 00:00:00 2001 From: Defnull <879658+define-null@users.noreply.github.com> Date: Mon, 16 Mar 2026 11:09:57 +0100 Subject: [PATCH 3/3] Fixed format --- src/query/result.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/query/result.rs b/src/query/result.rs index 5c38966..fca0af9 100644 --- a/src/query/result.rs +++ b/src/query/result.rs @@ -1,7 +1,7 @@ use std::time::Duration; use axum::{http::StatusCode, response::IntoResponse}; -use sqd_query::{TableDoesNotExist, ColumnDoesNotExist}; +use sqd_query::{ColumnDoesNotExist, TableDoesNotExist}; use tracing::instrument; use crate::util::hash::sha3_256; @@ -100,7 +100,7 @@ impl From for QueryError { impl From for QueryError { fn from(err: anyhow::Error) -> Self { let is_bad_request = err.is::() || err.is::(); - + if is_bad_request { QueryError::BadRequest(err.to_string()) } else {