@@ -131,12 +131,15 @@ def _check_valid(
131131 * ,
132132 case_sensitive : set [str ] | None = None ,
133133 case_insensitive : set [str ] | None = None ,
134+ value_type : type = str ,
134135) -> None :
135136 if case_sensitive is None :
136137 case_sensitive = set ()
137138 if case_insensitive is None :
138139 case_insensitive = set ()
139- if not isinstance (value , str ) or (
140+ if not isinstance (value , value_type ):
141+ raise ValueError (f"{ value } is not valid, must be { value_type } " )
142+ if isinstance (value , str ) and (
140143 value not in case_sensitive and value .lower () not in case_insensitive
141144 ):
142145 raise ValueError (
@@ -274,36 +277,40 @@ def _replace_placeholder(
274277 )
275278 result .append (value )
276279 else :
277- if clause is not None and clause .text .lower () == "order by" :
278- _check_valid (
279- value ,
280- case_sensitive = ctx .columns ,
281- case_insensitive = {"asc" , "ascending" , "desc" , "descending" },
282- )
283- new_node = Part (text = typing .cast (str , value ), parent = node .parent )
284- elif placeholder_type == PlaceholderType .COLUMN :
285- _check_valid (value , case_sensitive = ctx .columns )
286- new_node = Part (text = typing .cast (str , value ), parent = node .parent )
287- elif placeholder_type == PlaceholderType .TABLE :
288- _check_valid (value , case_sensitive = ctx .tables )
289- new_node = Part (text = typing .cast (str , value ), parent = node .parent )
290- elif placeholder_type == PlaceholderType .LOCK :
291- _check_valid (value , case_insensitive = {"" , "nowait" , "skip locked" })
292- new_node = Part (text = typing .cast (str , value ), parent = node .parent )
293- else :
294- if (
295- value is RewritingValue .IS_NULL or value is RewritingValue .IS_NOT_NULL
296- ) and placeholder_type == PlaceholderType .VARIABLE_CONDITION :
297- for part in node .parent .parts :
298- if isinstance (part , Operator ):
299- if value is RewritingValue .IS_NULL :
300- part .text = "IS"
301- else :
302- part .text = "IS NOT"
303- new_node = Part (text = "NULL" , parent = node .parent )
304- else :
305- new_node = node
306- result .append (value )
280+ match placeholder_type :
281+ case PlaceholderType .COLUMN :
282+ _check_valid (value , case_sensitive = ctx .columns )
283+ new_node = Part (text = typing .cast (str , value ), parent = node .parent )
284+ case PlaceholderType .FRAME :
285+ _check_valid (value , value_type = int )
286+ new_node = Part (text = str (value ), parent = node .parent )
287+ case PlaceholderType .LOCK :
288+ _check_valid (value , case_insensitive = {"" , "nowait" , "skip locked" })
289+ new_node = Part (text = typing .cast (str , value ), parent = node .parent )
290+ case PlaceholderType .SORT :
291+ _check_valid (
292+ value ,
293+ case_sensitive = ctx .columns ,
294+ case_insensitive = {"asc" , "ascending" , "desc" , "descending" },
295+ )
296+ new_node = Part (text = typing .cast (str , value ), parent = node .parent )
297+ case PlaceholderType .TABLE :
298+ _check_valid (value , case_sensitive = ctx .tables )
299+ new_node = Part (text = typing .cast (str , value ), parent = node .parent )
300+ case _:
301+ if (
302+ value is RewritingValue .IS_NULL or value is RewritingValue .IS_NOT_NULL
303+ ) and placeholder_type == PlaceholderType .VARIABLE_CONDITION :
304+ for part in node .parent .parts :
305+ if isinstance (part , Operator ):
306+ if value is RewritingValue .IS_NULL :
307+ part .text = "IS"
308+ else :
309+ part .text = "IS NOT"
310+ new_node = Part (text = "NULL" , parent = node .parent )
311+ else :
312+ new_node = node
313+ result .append (value )
307314
308315 if isinstance (node .parent , (Expression , ExpressionGroup , Function , Group )):
309316 node .parent .parts [index ] = new_node
0 commit comments