Skip to content

Commit fdb3277

Browse files
committed
feat: Add current_setting() PostgreSQL function for driver compatibility
- Implement current_setting(setting_name) function with comprehensive PostgreSQL settings - Add support for common settings that PostgreSQL drivers query during connection: * server_version, server_version_num, client_encoding, timezone * application_name, session_authorization, search_path, datestyle * transaction isolation, connection limits, and configuration settings - Register function in pg_catalog.pg_proc for proper PostgreSQL compatibility - Resolves 'Invalid function current_setting' errors from asyncpg and other drivers This addresses a critical PostgreSQL compatibility gap where drivers fail to connect due to missing current_setting() function. The implementation provides reasonable defaults for all common PostgreSQL configuration settings that tools and drivers typically query during initialization. Fixes connection issues with: - asyncpg Python driver - Heavy load testing scripts - PostgreSQL client tools that query configuration settings The function maintains PostgreSQL wire protocol compatibility and enables broader tool/driver ecosystem support.
1 parent e5b844e commit fdb3277

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

datafusion-postgres/src/pg_catalog.rs

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,40 @@ impl PgCatalogSchemaProvider {
935935
None,
936936
None,
937937
);
938+
939+
// current_setting(setting_name) function
940+
data.add_function(
941+
2077,
942+
"current_setting",
943+
11,
944+
10,
945+
12,
946+
1.0,
947+
0.0,
948+
0,
949+
0,
950+
"f",
951+
false,
952+
true,
953+
true,
954+
false,
955+
"s",
956+
"s",
957+
1,
958+
0,
959+
25, // returns TEXT
960+
"25", // takes TEXT parameter
961+
None,
962+
None,
963+
None,
964+
None,
965+
None,
966+
"current_setting",
967+
None,
968+
None,
969+
None,
970+
None,
971+
);
938972

939973
data
940974
}
@@ -2020,6 +2054,63 @@ pub fn create_format_type_udf() -> ScalarUDF {
20202054
)
20212055
}
20222056

2057+
pub fn create_current_setting_udf() -> ScalarUDF {
2058+
// Define the function implementation for current_setting(setting_name)
2059+
let func = move |args: &[ColumnarValue]| {
2060+
let args = ColumnarValue::values_to_arrays(args)?;
2061+
let setting_names = &args[0];
2062+
2063+
// Handle different setting name requests with reasonable defaults
2064+
let mut builder = StringBuilder::new();
2065+
2066+
for i in 0..setting_names.len() {
2067+
let setting_name = setting_names
2068+
.as_any()
2069+
.downcast_ref::<StringArray>()
2070+
.ok_or_else(|| DataFusionError::Internal("Expected string array".to_string()))?
2071+
.value(i);
2072+
2073+
// Provide reasonable defaults for common PostgreSQL settings
2074+
let value = match setting_name.to_lowercase().as_str() {
2075+
"server_version" => "16.0", // Match modern PostgreSQL version
2076+
"server_version_num" => "160000",
2077+
"client_encoding" => "UTF8",
2078+
"timezone" => "UTC",
2079+
"datestyle" => "ISO, MDY",
2080+
"default_transaction_isolation" => "read committed",
2081+
"application_name" => "datafusion-postgres",
2082+
"session_authorization" => "postgres",
2083+
"is_superuser" => "on",
2084+
"integer_datetimes" => "on",
2085+
"search_path" => "\"$user\", public",
2086+
"standard_conforming_strings" => "on",
2087+
"synchronous_commit" => "on",
2088+
"wal_level" => "replica",
2089+
"max_connections" => "100",
2090+
"shared_preload_libraries" => "",
2091+
"log_statement" => "none",
2092+
"log_min_messages" => "warning",
2093+
"default_text_search_config" => "pg_catalog.english",
2094+
_ => "", // Return empty string for unknown settings
2095+
};
2096+
2097+
builder.append_value(value);
2098+
}
2099+
2100+
let array: ArrayRef = Arc::new(builder.finish());
2101+
Ok(ColumnarValue::Array(array))
2102+
};
2103+
2104+
// Wrap the implementation in a scalar function
2105+
create_udf(
2106+
"current_setting",
2107+
vec![DataType::Utf8],
2108+
DataType::Utf8,
2109+
Volatility::Stable,
2110+
Arc::new(func),
2111+
)
2112+
}
2113+
20232114
/// Install pg_catalog and postgres UDFs to current `SessionContext`
20242115
pub fn setup_pg_catalog(
20252116
session_context: &SessionContext,
@@ -2042,6 +2133,7 @@ pub fn setup_pg_catalog(
20422133
session_context.register_udf(create_has_table_privilege_2param_udf());
20432134
session_context.register_udf(create_pg_table_is_visible());
20442135
session_context.register_udf(create_format_type_udf());
2136+
session_context.register_udf(create_current_setting_udf());
20452137

20462138
Ok(())
20472139
}

0 commit comments

Comments
 (0)