Skip to content

Commit 576ef04

Browse files
committed
fix: segfault for queries without parameters
1 parent 7c98c23 commit 576ef04

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

src/backend.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use pgrx::pg_sys::{
44
error, fetch_search_path_array, get_namespace_oid, get_relname_relid, palloc0,
55
CustomExecMethods, CustomScan, CustomScanMethods, CustomScanState, EState, ExplainPropertyText,
66
ExplainState, InvalidOid, List, ListCell, MyLatch, MyProcNumber, Node, NodeTag, Oid,
7-
ParamListInfo, RegisterCustomScanMethods, ResetLatch, TupleTableSlot, WaitLatch,
8-
PG_WAIT_EXTENSION, WL_LATCH_SET, WL_POSTMASTER_DEATH, WL_TIMEOUT,
7+
ParamExternData, ParamListInfo, RegisterCustomScanMethods, ResetLatch, TupleTableSlot,
8+
WaitLatch, PG_WAIT_EXTENSION, WL_LATCH_SET, WL_POSTMASTER_DEATH, WL_TIMEOUT,
99
};
1010
use pgrx::{check_for_interrupts, pg_guard};
1111
use rmp::decode::{read_array_len, read_bin_len};
@@ -124,13 +124,18 @@ unsafe extern "C" fn create_df_scan_state(cscan: *mut CustomScan) -> *mut Node {
124124
}
125125
}
126126
}
127+
let mut params: &[ParamExternData] = &[];
127128
let param_list = (*list_nth(list, 1)).ptr_value as ParamListInfo;
128-
let num_params = unsafe { (*param_list).numParams } as usize;
129-
let params = unsafe { (*param_list).params.as_slice(num_params) };
129+
if !param_list.is_null() {
130+
let num_params = unsafe { (*param_list).numParams } as usize;
131+
params = unsafe { (*param_list).params.as_slice(num_params) };
132+
}
130133
let stream = wait_stream();
131134
if let Err(err) = send_params(my_slot(), stream, params) {
132135
error!("Failed to send the parameter list: {}", err);
133136
}
137+
// TODO: request plan fields from the worker to build custom_scan_tlist
138+
// with repack_output().
134139
let css = CustomScanState {
135140
methods: exec_methods(),
136141
..Default::default()

0 commit comments

Comments
 (0)