MCPcopy Create free account
hub / github.com/MaterializeInc/materialize / rewrite_function

Method rewrite_function

src/sql/src/plan/transform_ast.rs:376–447  ·  view source on GitHub ↗
(&mut self, func: &Function<Aug>)

Source from the content-addressed store, hash-verified

374 }
375
376 fn rewrite_function(&mut self, func: &Function<Aug>) -> Option<(Ident, Expr<Aug>)> {
377 if let Function {
378 name,
379 args: FunctionArgs::Args { args, order_by: _ },
380 filter,
381 distinct,
382 over,
383 } = func
384 {
385 let pg_catalog_id = self
386 .scx
387 .catalog
388 .resolve_schema(None, PG_CATALOG_SCHEMA)
389 .expect("pg_catalog schema exists")
390 .id();
391 let mz_catalog_id = self
392 .scx
393 .catalog
394 .resolve_schema(None, MZ_CATALOG_SCHEMA)
395 .expect("mz_catalog schema exists")
396 .id();
397 let name = match name {
398 ResolvedItemName::Item {
399 qualifiers,
400 full_name,
401 ..
402 } => {
403 if ![*pg_catalog_id, *mz_catalog_id].contains(&qualifiers.schema_spec) {
404 return None;
405 }
406 full_name.item.clone()
407 }
408 _ => unreachable!(),
409 };
410
411 let filter = filter.clone();
412 let distinct = *distinct;
413 let over = over.clone();
414 let expr = if args.len() == 1 {
415 let arg = args[0].clone();
416 match name.as_str() {
417 "avg_internal_v1" => self.plan_avg_internal_v1(arg, filter, distinct, over),
418 "avg" => self.plan_avg(arg, filter, distinct, over),
419 "variance" | "var_samp" => {
420 self.plan_variance(arg, filter, distinct, true, over)
421 }
422 "var_pop" => self.plan_variance(arg, filter, distinct, false, over),
423 "stddev" | "stddev_samp" => self.plan_stddev(arg, filter, distinct, true, over),
424 "stddev_pop" => self.plan_stddev(arg, filter, distinct, false, over),
425 "bool_and" => self.plan_bool_and(arg, filter, distinct, over),
426 "bool_or" => self.plan_bool_or(arg, filter, distinct, over),
427 _ => return None,
428 }
429 } else if args.len() == 2 {
430 let (lhs, rhs) = (args[0].clone(), args[1].clone());
431 match name.as_str() {
432 "mod" => lhs.modulo(rhs),
433 "pow" => Expr::call(

Callers 2

rewrite_exprMethod · 0.80

Calls 15

expectMethod · 0.80
plan_avg_internal_v1Method · 0.80
plan_avgMethod · 0.80
plan_varianceMethod · 0.80
plan_stddevMethod · 0.80
plan_bool_andMethod · 0.80
plan_bool_orMethod · 0.80
moduloMethod · 0.80
idMethod · 0.45
resolve_schemaMethod · 0.45
containsMethod · 0.45

Tested by

no test coverage detected