@@ -48,6 +48,7 @@ class Redshift(Postgres):
4848 HEX_LOWERCASE = True
4949 HAS_DISTINCT_ARRAY_CONSTRUCTORS = True
5050 COALESCE_COMPARISON_NON_STANDARD = True
51+ REGEXP_EXTRACT_POSITION_OVERFLOW_RETURNS_NULL = False
5152
5253 # ref: https://docs.aws.amazon.com/redshift/latest/dg/r_FORMAT_strings.html
5354 TIME_FORMAT = "'YYYY-MM-DD HH24:MI:SS'"
@@ -69,6 +70,13 @@ class Parser(Postgres.Parser):
6970 "DATE_DIFF" : _build_date_delta (exp .TsOrDsDiff ),
7071 "GETDATE" : exp .CurrentTimestamp .from_arg_list ,
7172 "LISTAGG" : exp .GroupConcat .from_arg_list ,
73+ "REGEXP_SUBSTR" : lambda args : exp .RegexpExtract (
74+ this = seq_get (args , 0 ),
75+ expression = seq_get (args , 1 ),
76+ position = seq_get (args , 2 ),
77+ occurrence = seq_get (args , 3 ),
78+ parameters = seq_get (args , 4 ),
79+ ),
7280 "SPLIT_TO_ARRAY" : lambda args : exp .StringToArray (
7381 this = seq_get (args , 0 ), expression = seq_get (args , 1 ) or exp .Literal .string ("," )
7482 ),
@@ -201,6 +209,7 @@ class Generator(Postgres.Generator):
201209 exp .JSONExtractScalar : json_extract_segments ("JSON_EXTRACT_PATH_TEXT" ),
202210 exp .GroupConcat : rename_func ("LISTAGG" ),
203211 exp .Hex : lambda self , e : self .func ("UPPER" , self .func ("TO_HEX" , self .sql (e , "this" ))),
212+ exp .RegexpExtract : rename_func ("REGEXP_SUBSTR" ),
204213 exp .Select : transforms .preprocess (
205214 [
206215 transforms .eliminate_window_clause ,
0 commit comments