Skip to content

Commit 42f17a6

Browse files
authored
fix(pgwire): process empty query correctly (risingwavelabs#8535)
1 parent 84a9831 commit 42f17a6

File tree

2 files changed

+42
-15
lines changed

2 files changed

+42
-15
lines changed

src/utils/pgwire/src/pg_protocol.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,12 @@ where
394394

395395
async fn process_parse_msg(&mut self, msg: FeParseMessage) -> PsqlResult<()> {
396396
let sql = cstr_to_str(&msg.sql_bytes).unwrap();
397-
tracing::trace!("(extended query)parse query: {}", sql);
397+
let statement_name = cstr_to_str(&msg.statement_name).unwrap().to_string();
398+
tracing::trace!(
399+
"(extended query)parse query: {}, statement name: {}",
400+
sql,
401+
statement_name
402+
);
398403

399404
let is_query_sql = {
400405
let stmts = Parser::parse_sql(sql)
@@ -407,8 +412,12 @@ where
407412
));
408413
}
409414

410-
StatementType::infer_from_statement(&stmts[0])
411-
.map_or(false, |stmt_type| stmt_type.is_query())
415+
if stmts.is_empty() {
416+
false
417+
} else {
418+
StatementType::infer_from_statement(&stmts[0])
419+
.map_or(false, |stmt_type| stmt_type.is_query())
420+
}
412421
};
413422

414423
let prepared_statement = PreparedStatement::parse_statement(sql.to_string(), msg.type_ids)?;
@@ -426,12 +435,7 @@ where
426435
vec![]
427436
};
428437

429-
let statement = PgStatement::new(
430-
cstr_to_str(&msg.statement_name).unwrap().to_string(),
431-
prepared_statement,
432-
fields,
433-
is_query_sql,
434-
);
438+
let statement = PgStatement::new(statement_name, prepared_statement, fields, is_query_sql);
435439

436440
let name = statement.name();
437441
if name.is_empty() {
@@ -445,11 +449,12 @@ where
445449

446450
fn process_bind_msg(&mut self, msg: FeBindMessage) -> PsqlResult<()> {
447451
let statement_name = cstr_to_str(&msg.statement_name).unwrap().to_string();
452+
let portal_name = cstr_to_str(&msg.portal_name).unwrap().to_string();
448453
// 1. Get statement.
449454
trace!(
450455
target: "pgwire_query_log",
451-
"(extended query)bind: get statement name: {}",
452-
&statement_name
456+
"(extended query)bind: statement name: {}, portal name: {}",
457+
&statement_name,&portal_name
453458
);
454459
let statement = if statement_name.is_empty() {
455460
self.unnamed_statement
@@ -473,7 +478,6 @@ where
473478
.try_collect()?;
474479

475480
// 2. Instance the statement to get the portal.
476-
let portal_name = cstr_to_str(&msg.portal_name).unwrap().to_string();
477481
let portal = statement.instance(
478482
portal_name.clone(),
479483
&msg.params,
@@ -505,7 +509,7 @@ where
505509
.ok_or_else(PsqlError::no_portal)?
506510
};
507511

508-
tracing::trace!(target: "pgwire_query_log", "(extended query)execute query: {}", portal.query_string());
512+
tracing::trace!(target: "pgwire_query_log", "(extended query)execute query: {}, portal name: {}", portal.query_string(),portal_name);
509513

510514
// 2. Execute instance statement using portal.
511515
let session = self.session.clone().unwrap();

src/utils/pgwire/tests/js/test/pgwire.test.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ describe('PgwireTest', () => {
1111
try {
1212
const conn = await pool.connect();
1313
try {
14-
// FIXME: RisingWave currently will fail on this test due to the lacking support of prepared statement.
15-
// Related issue: https://github.com/risingwavelabs/risingwave/issues/5293
1614
const res = await conn.query({
1715
text: 'SELECT $1::int AS number',
1816
values: ['1'],
@@ -25,4 +23,29 @@ describe('PgwireTest', () => {
2523
await pool.end();
2624
}
2725
});
26+
27+
test('empty query', async () => {
28+
const pool = new Pool({
29+
host: '127.0.0.1',
30+
database: 'dev',
31+
port: 4566,
32+
user: 'root',
33+
});
34+
try {
35+
const conn = await pool.connect();
36+
try {
37+
const query = {
38+
name: 'empty',
39+
text: '',
40+
values: [],
41+
};
42+
const res = await conn.query(query);
43+
expect(res.rowCount).toBe(null);
44+
} finally {
45+
await conn.release();
46+
}
47+
} finally {
48+
await pool.end();
49+
}
50+
});
2851
});

0 commit comments

Comments
 (0)