@@ -522,48 +522,11 @@ def grants(self) -> t.Optional[GrantsConfig]:
522522 if not self .grants_ .expressions :
523523 return {}
524524
525- def expr_to_string (expr : exp .Expression , context : str ) -> str :
526- if isinstance (expr , (d .MacroFunc , d .MacroVar )):
527- raise ConfigError (
528- f"Unresolved macro in { context } : { expr .sql (dialect = self .dialect )} "
529- )
530-
531- if isinstance (expr , exp .Null ):
532- raise ConfigError (f"NULL value in { context } " )
533-
534- if isinstance (expr , exp .Literal ):
535- return str (expr .this ).strip ()
536- if isinstance (expr , exp .Identifier ):
537- return expr .name
538- if isinstance (expr , exp .Column ):
539- return expr .name
540- return expr .sql (dialect = self .dialect ).strip ()
541-
542- def normalize_to_string_list (value_expr : exp .Expression ) -> t .List [str ]:
543- result = []
544-
545- def process_expression (expr : exp .Expression ) -> None :
546- if isinstance (expr , exp .Array ):
547- for elem in expr .expressions :
548- process_expression (elem )
549-
550- elif isinstance (expr , (exp .Tuple , exp .Paren )):
551- expressions = (
552- [expr .unnest ()] if isinstance (expr , exp .Paren ) else expr .expressions
553- )
554- for elem in expressions :
555- process_expression (elem )
556- else :
557- result .append (expr_to_string (expr , "grant value" ))
558-
559- process_expression (value_expr )
560- return result
561-
562525 grants_dict = {}
563526 for eq_expr in self .grants_ .expressions :
564527 try :
565- permission_name = expr_to_string (eq_expr .left , "permission name" )
566- grantee_list = normalize_to_string_list (eq_expr .expression )
528+ permission_name = self . _validate_config_expression (eq_expr .left )
529+ grantee_list = self . _validate_nested_config_values (eq_expr .expression )
567530 grants_dict [permission_name ] = grantee_list
568531 except ConfigError as e :
569532 permission_name = (
@@ -637,3 +600,33 @@ def on_additive_change(self) -> OnAdditiveChange:
637600 @property
638601 def ignored_rules (self ) -> t .Set [str ]:
639602 return self .ignored_rules_ or set ()
603+
604+ def _validate_config_expression (self , expr : exp .Expression ) -> str :
605+ if isinstance (expr , (d .MacroFunc , d .MacroVar )):
606+ raise ConfigError (f"Unresolved macro: { expr .sql (dialect = self .dialect )} " )
607+
608+ if isinstance (expr , exp .Null ):
609+ raise ConfigError ("NULL value" )
610+
611+ if isinstance (expr , exp .Literal ):
612+ return str (expr .this ).strip ()
613+ if isinstance (expr , (exp .Column , exp .Identifier )):
614+ return expr .name
615+ return expr .sql (dialect = self .dialect ).strip ()
616+
617+ def _validate_nested_config_values (self , value_expr : exp .Expression ) -> t .List [str ]:
618+ result = []
619+
620+ def flatten_expr (expr : exp .Expression ) -> None :
621+ if isinstance (expr , exp .Array ):
622+ for elem in expr .expressions :
623+ flatten_expr (elem )
624+ elif isinstance (expr , (exp .Tuple , exp .Paren )):
625+ expressions = [expr .unnest ()] if isinstance (expr , exp .Paren ) else expr .expressions
626+ for elem in expressions :
627+ flatten_expr (elem )
628+ else :
629+ result .append (self ._validate_config_expression (expr ))
630+
631+ flatten_expr (value_expr )
632+ return result
0 commit comments