1515package functions
1616
1717import (
18+ "strings"
1819 "time"
1920
2021 "github.com/dolthub/go-mysql-server/sql"
@@ -41,15 +42,16 @@ var date_in = framework.Function1{
4142 Strict : true ,
4243 Callable : func (ctx * sql.Context , _ [2 ]* pgtypes.DoltgresType , val any ) (any , error ) {
4344 input := val .(string )
44- if date , _ , err := pgdate . ParseDate ( time . Now (), pgdate . ParseModeYMD , input ); err == nil {
45- return date . ToTime ()
46- } else if date , _ , err = pgdate . ParseDate ( time . Now (), pgdate . ParseModeDMY , input ); err == nil {
47- return date . ToTime ()
48- } else if date , _ , err = pgdate .ParseDate (time .Now (), pgdate . ParseModeMDY , input ); err == nil {
49- return date . ToTime ()
50- } else {
51- return nil , err
45+ formatsInOrder := getDateStyleInputFormat ( ctx )
46+ var date pgdate. Date
47+ var err error
48+ for _ , format := range formatsInOrder {
49+ date , _ , err = pgdate .ParseDate (time .Now (), format , input )
50+ if err == nil {
51+ return date . ToTime ()
52+ }
5253 }
54+ return nil , err
5355 },
5456}
5557
@@ -60,7 +62,7 @@ var date_out = framework.Function1{
6062 Parameters : [1 ]* pgtypes.DoltgresType {pgtypes .Date },
6163 Strict : true ,
6264 Callable : func (ctx * sql.Context , _ [2 ]* pgtypes.DoltgresType , val any ) (any , error ) {
63- return FormatDateTimeWithBC (val .(time.Time ), "2006-01-02" , false ), nil
65+ return FormatDateTimeWithBC (val .(time.Time ), getLayoutStringFormat ( ctx , true ) , false ), nil
6466 },
6567}
6668
@@ -106,3 +108,42 @@ var date_cmp = framework.Function2{
106108 return int32 (ab .Compare (bb )), nil
107109 },
108110}
111+
112+ // getDateStyleInputFormat sets the defined format in DateStyle config as the first in the ordered list of date parsing modes.
113+ // TODO: this or something similar should be used in postgres/parser/sem/tree/datum.go when parsing timestamp/timestamptz/date values.
114+ func getDateStyleInputFormat (ctx * sql.Context ) []pgdate.ParseMode {
115+ formatsInOrder := []pgdate.ParseMode {pgdate .ParseModeMDY , pgdate .ParseModeDMY , pgdate .ParseModeYMD } // default
116+ if ctx == nil {
117+ return formatsInOrder
118+ }
119+ val , err := ctx .GetSessionVariable (ctx , "datestyle" )
120+ if err != nil {
121+ return formatsInOrder
122+ }
123+
124+ ds := strings .ReplaceAll (val .(string ), " " , "" )
125+ values := strings .Split (ds , "," )
126+ setFormat := pgdate .ParseModeYMD
127+ for _ , value := range values {
128+ switch value {
129+ case "MDY" :
130+ setFormat = pgdate .ParseModeMDY
131+ case "DMY" :
132+ setFormat = pgdate .ParseModeDMY
133+ case "YMD" :
134+ setFormat = pgdate .ParseModeYMD
135+ }
136+ }
137+ if setFormat == formatsInOrder [0 ] {
138+ return formatsInOrder
139+ }
140+
141+ curFirst := formatsInOrder [0 ]
142+ for i , f := range formatsInOrder {
143+ if setFormat == f {
144+ formatsInOrder [i ] = curFirst
145+ }
146+ }
147+ formatsInOrder [0 ] = setFormat
148+ return formatsInOrder
149+ }
0 commit comments