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
65 changes: 65 additions & 0 deletions integration/rust/tests/integration/empty_query.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
use anyhow::{Context, Result, ensure};
use serial_test::serial;
use tokio_postgres::{SimpleQueryMessage, error::SqlState};

use crate::setup::{admin_tokio, connections_tokio};

#[tokio::test]
#[serial]
async fn empty_query_then_rollback_parser_on() -> Result<()> {
check_empty_query_then_rollback("on").await
}

#[tokio::test]
#[serial]
async fn empty_query_then_rollback_parser_auto() -> Result<()> {
check_empty_query_then_rollback("auto").await
}

#[tokio::test]
#[serial]
async fn empty_query_then_rollback_parser_off() -> Result<()> {
check_empty_query_then_rollback("off").await
}

async fn check_empty_query_then_rollback(level: &str) -> Result<()> {
let admin = admin_tokio().await;
admin
.batch_execute(&format!("SET query_parser TO '{level}'"))
.await?;

let result = async {
let clients = connections_tokio().await;
let client = &clients[0];
client.batch_execute("BEGIN").await?;
let error = client
.simple_query("SELECT 1/0")
.await
.err()
.context("division by zero must fail")?;
ensure!(error.code() == Some(&SqlState::DIVISION_BY_ZERO));

let messages = client.simple_query(";").await?;
// tokio-postgres exposes EmptyQueryResponse as CommandComplete(0).
ensure!(matches!(
messages.as_slice(),
[SimpleQueryMessage::CommandComplete(0)]
));

// An empty query must not clear the failed transaction state.
let error = client
.simple_query("SELECT 1")
.await
.err()
.context("query in failed transaction must fail")?;
ensure!(error.code() == Some(&SqlState::IN_FAILED_SQL_TRANSACTION));

client.batch_execute("ROLLBACK").await?;
client.simple_query("SELECT 1").await?;
Ok(())
}
.await;

admin.batch_execute("RELOAD").await?;
result
}
1 change: 1 addition & 0 deletions integration/rust/tests/integration/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ pub mod cross_shard_disabled;
mod cross_shard_oid_drift;
mod cross_shard_omni_check;
pub mod distinct;
mod empty_query;
pub mod explain;
pub mod fake_transactions;
pub mod having;
Expand Down
2 changes: 1 addition & 1 deletion pgdog/src/frontend/client/query_engine/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,7 @@ impl QueryEngine {
&& client_request
.ast
.as_ref()
.is_none_or(|ast| ast.ast.stmts().next().is_some())
.is_some_and(|ast| ast.ast.stmts().next().is_some())
{
let error = ErrorResponse::in_failed_transaction();

Expand Down
1 change: 0 additions & 1 deletion pgdog/src/frontend/client/query_engine/test/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ mod pub_sub;
mod regression_auto_two_pc;
mod regression_bind_transaction_end;
mod regression_flush_error;
mod regression_parser_off_rollback;
mod regression_pinned_portal;
mod regression_pinned_sync;
mod regression_prepare_transaction_end;
Expand Down

This file was deleted.

Loading