@@ -620,6 +620,9 @@ class Generator:
620620
621621 UNSUPPORTED_TYPES : t .ClassVar [set [exp .DType ]] = set ()
622622
623+ TYPE_DEFAULT_PARAMS : t .ClassVar [dict [exp .DType , tuple [int , ...]]] = {}
624+ TYPE_PARAM_BOUNDS : t .ClassVar [dict [exp .DType , tuple [int | None , ...]]] = {}
625+
623626 TIME_PART_SINGULARS : t .ClassVar = {
624627 "MICROSECONDS" : "MICROSECOND" ,
625628 "SECONDS" : "SECOND" ,
@@ -1629,11 +1632,65 @@ def datatypeparam_sql(self, expression: exp.DataTypeParam) -> str:
16291632 specifier = f" { specifier } " if specifier and self .DATA_TYPE_SPECIFIERS_ALLOWED else ""
16301633 return f"{ this } { specifier } "
16311634
1635+ def datatype_param_bound_limiter (
1636+ self , expression : exp .DataType , type_value : exp .DType
1637+ ) -> exp .DataType :
1638+ params = expression .expressions
1639+
1640+ if not params :
1641+ if defaults := self .TYPE_DEFAULT_PARAMS .get (type_value ):
1642+ expression = expression .copy ()
1643+ expression .set (
1644+ "expressions" ,
1645+ [exp .DataTypeParam (this = exp .Literal .number (d )) for d in defaults ],
1646+ )
1647+ return expression
1648+
1649+ bounds = self .TYPE_PARAM_BOUNDS .get (type_value )
1650+ if not bounds :
1651+ return expression
1652+
1653+ new_params = list (params )
1654+ changed = False
1655+ for i , param in enumerate (params ):
1656+ bound = bounds [i ] if i < len (bounds ) else None
1657+ if bound is None :
1658+ continue
1659+
1660+ param_value = param .this if isinstance (param , exp .DataTypeParam ) else param
1661+ if (
1662+ isinstance (param_value , exp .Literal )
1663+ and param_value .is_number
1664+ and int (param_value .to_py ()) > bound
1665+ ):
1666+ self .unsupported (
1667+ f"{ type_value .value } parameter ({ int (param_value .to_py ())} ) "
1668+ f"exceeds { self .dialect .__class__ .__name__ } 's maximum capping to { bound } "
1669+ )
1670+ new_param = param .copy ()
1671+ capped = exp .Literal .number (bound )
1672+ if isinstance (new_param , exp .DataTypeParam ):
1673+ new_param .set ("this" , capped )
1674+ else :
1675+ new_param = capped
1676+ new_params [i ] = new_param
1677+ changed = True
1678+
1679+ if changed :
1680+ expression = expression .copy ()
1681+ expression .set ("expressions" , new_params )
1682+ return expression
1683+
16321684 def datatype_sql (self , expression : exp .DataType ) -> str :
16331685 nested = ""
16341686 values = ""
16351687
16361688 expr_nested = expression .args .get ("nested" )
1689+ type_value = expression .this
1690+
1691+ if not expr_nested and isinstance (type_value , exp .DType ):
1692+ expression = self .datatype_param_bound_limiter (expression , type_value )
1693+
16371694 interior = (
16381695 self .expressions (
16391696 expression , dynamic = True , new_line = True , skip_first = True , skip_last = True
@@ -1642,7 +1699,6 @@ def datatype_sql(self, expression: exp.DataType) -> str:
16421699 else self .expressions (expression , flat = True )
16431700 )
16441701
1645- type_value = expression .this
16461702 if type_value in self .UNSUPPORTED_TYPES :
16471703 self .unsupported (
16481704 f"Data type { type_value .value } is not supported when targeting { self .dialect .__class__ .__name__ } "
0 commit comments