Skip to content

Commit ef0cb55

Browse files
committed
fix(query): add udf name(in meta) into UdfServerCall
chore: fix review suggestion in https://github.com/datafuselabs/databend/pull/14098\#discussion_r1433048221
1 parent 9a58e79 commit ef0cb55

File tree

13 files changed

+42
-6
lines changed

13 files changed

+42
-6
lines changed

.github/actions/test_stateless_standalone_linux/action.yml

+8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ inputs:
88
runs:
99
using: "composite"
1010
steps:
11+
- uses: actions/checkout@v3
12+
- name: Start UDF Server
13+
shell: bash
14+
run: |
15+
pip install databend-udf
16+
python3 tests/udf/udf_server.py &
17+
sleep 2
18+
1119
- uses: ./.github/actions/setup_bendsql
1220

1321
- name: Download artifact

src/query/sql/src/planner/binder/ddl/table.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -992,23 +992,24 @@ impl Binder {
992992
} = stmt;
993993

994994
let tenant = self.ctx.get_tenant();
995-
let (catalog, database, table) =
995+
let (catalog, db_name, table) =
996996
self.normalize_object_identifier_triple(catalog, database, table);
997997

998998
let (new_catalog, new_database, new_table) =
999999
self.normalize_object_identifier_triple(new_catalog, new_database, new_table);
10001000

1001-
if new_catalog != catalog || new_database != database {
1001+
if new_catalog != catalog || new_database != db_name {
10021002
return Err(ErrorCode::BadArguments(
10031003
"Rename table not allow modify catalog or database",
1004-
));
1004+
)
1005+
.set_span(database.as_ref().and_then(|ident| ident.span)));
10051006
}
10061007

10071008
Ok(Plan::RenameTable(Box::new(RenameTablePlan {
10081009
tenant,
10091010
if_exists: *if_exists,
10101011
catalog,
1011-
database,
1012+
database: db_name,
10121013
table,
10131014
new_database,
10141015
new_table,

src/query/sql/src/planner/binder/sort.rs

+1
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ impl Binder {
392392
.collect::<Result<Vec<_>>>()?;
393393
Ok(UDFServerCall {
394394
span: udf.span,
395+
name: udf.name.clone(),
395396
func_name: udf.func_name.clone(),
396397
display_name: udf.display_name.clone(),
397398
server_addr: udf.server_addr.clone(),

src/query/sql/src/planner/optimizer/decorrelate/flatten_scalar.rs

+1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ impl SubqueryRewriter {
9696
.collect::<Result<Vec<_>>>()?;
9797
Ok(ScalarExpr::UDFServerCall(UDFServerCall {
9898
span: udf.span,
99+
name: udf.name.clone(),
99100
func_name: udf.func_name.clone(),
100101
display_name: udf.display_name.clone(),
101102
server_addr: udf.server_addr.clone(),

src/query/sql/src/planner/optimizer/decorrelate/subquery_rewriter.rs

+1
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ impl SubqueryRewriter {
353353

354354
let expr: ScalarExpr = UDFServerCall {
355355
span: udf.span,
356+
name: udf.name.clone(),
356357
func_name: udf.func_name.clone(),
357358
display_name: udf.display_name.clone(),
358359
server_addr: udf.server_addr.clone(),

src/query/sql/src/planner/optimizer/rule/rewrite/agg_index/query_rewrite.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,7 @@ fn rewrite_query_item(
10121012
Some(
10131013
UDFServerCall {
10141014
span: udf.span,
1015+
name: udf.name.clone(),
10151016
func_name: udf.func_name.clone(),
10161017
display_name: udf.display_name.clone(),
10171018
server_addr: udf.server_addr.clone(),

src/query/sql/src/planner/optimizer/rule/rewrite/rule_push_down_filter_eval_scalar.rs

+1
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ impl RulePushDownFilterEvalScalar {
229229

230230
Ok(ScalarExpr::UDFServerCall(UDFServerCall {
231231
span: udf.span,
232+
name: udf.name.clone(),
232233
func_name: udf.func_name.clone(),
233234
display_name: udf.display_name.clone(),
234235
server_addr: udf.server_addr.clone(),

src/query/sql/src/planner/optimizer/rule/rewrite/rule_push_down_filter_scan.rs

+1
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ impl RulePushDownFilterScan {
260260

261261
Ok(ScalarExpr::UDFServerCall(UDFServerCall {
262262
span: udf.span,
263+
name: udf.name.clone(),
263264
func_name: udf.func_name.clone(),
264265
display_name: udf.display_name.clone(),
265266
server_addr: udf.server_addr.clone(),

src/query/sql/src/planner/optimizer/s_expr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ pub fn get_udf_names(scalar: &ScalarExpr) -> Result<HashSet<&String>> {
504504
self.visit(expr)?;
505505
}
506506

507-
self.udfs.insert(&udf.func_name);
507+
self.udfs.insert(&udf.name);
508508
Ok(())
509509
}
510510

src/query/sql/src/planner/plans/scalar_expr.rs

+3
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,9 @@ fn hash_column_set<H: Hasher>(columns: &ColumnSet, state: &mut H) {
589589
pub struct UDFServerCall {
590590
#[educe(Hash(ignore), PartialEq(ignore), Eq(ignore))]
591591
pub span: Span,
592+
// name in meta
593+
pub name: String,
594+
// name in handler
592595
pub func_name: String,
593596
pub display_name: String,
594597
pub server_addr: String,

src/query/sql/src/planner/semantic/type_check.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -2796,7 +2796,8 @@ impl<'a> TypeChecker<'a> {
27962796
.await?,
27972797
)),
27982798
UDFDefinition::UDFServer(udf_def) => Ok(Some(
2799-
self.resolve_udf_server(span, arguments, udf_def).await?,
2799+
self.resolve_udf_server(span, name, arguments, udf_def)
2800+
.await?,
28002801
)),
28012802
}
28022803
}
@@ -2806,6 +2807,7 @@ impl<'a> TypeChecker<'a> {
28062807
async fn resolve_udf_server(
28072808
&mut self,
28082809
span: Span,
2810+
name: String,
28092811
arguments: &[Expr],
28102812
udf_definition: UDFServer,
28112813
) -> Result<Box<(ScalarExpr, DataType)>> {
@@ -2852,6 +2854,7 @@ impl<'a> TypeChecker<'a> {
28522854
Ok(Box::new((
28532855
UDFServerCall {
28542856
span,
2857+
name,
28552858
func_name: udf_definition.handler,
28562859
display_name,
28572860
server_addr: udf_definition.address,

tests/suites/0_stateless/18_rbac/18_0001_udf_priv.result

+2
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,5 @@ Error: APIError: ResponseError with 1063: Permission denied, privilege [Usage] i
5454
200
5555
100
5656
200
57+
4
58+
Error: APIError: ResponseError with 1063: Permission denied, privilege [Usage] is required on UDF b for user 'test-user'@'%' with roles [public]

tests/suites/0_stateless/18_rbac/18_0001_udf_priv.sh

+13
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,22 @@ echo "select case when i > 100 then 200 else f2(f1(100)) end as c1 from t;" | $T
123123
echo "select case when i > 100 then f2(f1(200)) else 100 end as c1 from t;" | $TEST_USER_CONNECT
124124
echo "delete from t;" | $TEST_USER_CONNECT
125125

126+
#udf server test
127+
echo "drop function if exists a;" | $BENDSQL_CLIENT_CONNECT
128+
echo "drop function if exists b;" | $BENDSQL_CLIENT_CONNECT
129+
echo "CREATE FUNCTION a (TINYINT, SMALLINT, INT, BIGINT) RETURNS BIGINT LANGUAGE python HANDLER = 'add_signed' ADDRESS = 'http://0.0.0.0:8815';" | $BENDSQL_CLIENT_CONNECT
130+
echo "CREATE FUNCTION b (TINYINT, SMALLINT, INT, BIGINT) RETURNS BIGINT LANGUAGE python HANDLER = 'add_signed' ADDRESS = 'http://0.0.0.0:8815';" | $BENDSQL_CLIENT_CONNECT
131+
132+
echo "grant usage on udf a to 'test-user'" | $BENDSQL_CLIENT_CONNECT
133+
echo "select a(1,1,1,1)" | $TEST_USER_CONNECT
134+
echo "select b(1,1,1,1)" | $TEST_USER_CONNECT
135+
136+
126137
echo "drop user if exists 'test-user'" | $BENDSQL_CLIENT_CONNECT
127138
echo "DROP FUNCTION IF EXISTS f1;" | $BENDSQL_CLIENT_CONNECT
128139
echo "DROP FUNCTION IF EXISTS f2;" | $BENDSQL_CLIENT_CONNECT
140+
echo "drop function if exists a;" | $BENDSQL_CLIENT_CONNECT
141+
echo "drop function if exists b;" | $BENDSQL_CLIENT_CONNECT
129142
echo "drop table if exists default.t;" | $BENDSQL_CLIENT_CONNECT
130143
echo "drop table if exists default.t2;" | $BENDSQL_CLIENT_CONNECT
131144
echo "unset enable_experimental_rbac_check" | $BENDSQL_CLIENT_CONNECT

0 commit comments

Comments
 (0)