@@ -114,7 +114,7 @@ func (td *Extract) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
114114
115115 switch unit {
116116 case "DAY" :
117- return dateTime . Day ( ), nil
117+ return day ( dateTime ), nil
118118 case "HOUR" :
119119 return dateTime .Hour (), nil
120120 case "MINUTE" :
@@ -124,57 +124,66 @@ func (td *Extract) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
124124 case "MICROSECOND" :
125125 return dateTime .Nanosecond () / 1000 , nil
126126 case "QUARTER" :
127- return ( int ( dateTime . Month ()) - 1 ) / 3 + 1 , nil
127+ return quarter ( dateTime ) , nil
128128 case "MONTH" :
129- return int (dateTime . Month () ), nil
129+ return month (dateTime ), nil
130130 case "WEEK" :
131- date , err := getDate (ctx , expression.UnaryExpression {Child : td .RightChild }, row )
132- if err != nil {
133- return nil , err
134- }
135- yyyy , ok := year (date ).(int32 )
131+ yyyy , ok := year (dateTime ).(int )
136132 if ! ok {
137133 return nil , sql .ErrInvalidArgumentDetails .New ("WEEK" , "invalid year" )
138134 }
139- mm , ok := month (date ).(int32 )
135+ mm , ok := month (dateTime ).(int )
140136 if ! ok {
141137 return nil , sql .ErrInvalidArgumentDetails .New ("WEEK" , "invalid month" )
142138 }
143- dd , ok := day (date ).(int32 )
139+ dd , ok := day (dateTime ).(int )
144140 if ! ok {
145141 return nil , sql .ErrInvalidArgumentDetails .New ("WEEK" , "invalid day" )
146142 }
147- yearForWeek , week := calcWeek (yyyy , mm , dd , weekBehaviourYear )
148- if yearForWeek < yyyy {
143+ yr := int32 (yyyy )
144+ yearForWeek , week := calcWeek (yr , int32 (mm ), int32 (dd ), weekBehaviourYear )
145+ if yearForWeek < yr {
149146 week = 0
150- } else if yearForWeek > yyyy {
147+ } else if yearForWeek > yr {
151148 week = 53
152149 }
153150 return int (week ), nil
154151 case "YEAR" :
155- return dateTime . Year ( ), nil
152+ return year ( dateTime ), nil
156153 case "DAY_HOUR" :
157- dd := dateTime .Day () * 1_00
154+ dd , ok := day (dateTime ).(int )
155+ if ! ok {
156+ return nil , sql .ErrInvalidArgumentDetails .New ("DAY_HOUR" , "invalid day" )
157+ }
158158 hh := dateTime .Hour ()
159- return dd + hh , nil
159+ return ( dd * 1_00 ) + hh , nil
160160 case "DAY_MINUTE" :
161- dd := dateTime .Day () * 1_00_00
161+ dd , ok := day (dateTime ).(int )
162+ if ! ok {
163+ return nil , sql .ErrInvalidArgumentDetails .New ("DAY_MINUTE" , "invalid day" )
164+ }
162165 hh := dateTime .Hour () * 1_00
163166 mm := dateTime .Minute ()
164- return dd + hh + mm , nil
167+ return ( dd * 1_00_00 ) + hh + mm , nil
165168 case "DAY_SECOND" :
166- dd := dateTime .Day () * 1_00_00_00
169+ dd , ok := day (dateTime ).(int )
170+ if ! ok {
171+ return nil , sql .ErrInvalidArgumentDetails .New ("DAY_SECOND" , "invalid day" )
172+ }
167173 hh := dateTime .Hour () * 1_00_00
168174 mm := dateTime .Minute () * 1_00
169175 ss := dateTime .Second ()
170- return dd + hh + mm + ss , nil
176+ return ( dd * 1_00_00_00 ) + hh + mm + ss , nil
171177 case "DAY_MICROSECOND" :
172- dd := dateTime .Day () * 1_00_00_00_000000
178+ dd , ok := day (dateTime ).(int )
179+ if ! ok {
180+ return nil , sql .ErrInvalidArgumentDetails .New ("DAY_MICROSECOND" , "invalid day" )
181+ }
173182 hh := dateTime .Hour () * 1_00_00_000000
174183 mm := dateTime .Minute () * 1_00_000000
175184 ss := dateTime .Second () * 1_000000
176185 mmmmmm := dateTime .Nanosecond () / 1000
177- return dd + hh + mm + ss + mmmmmm , nil
186+ return ( dd * 1_00_00_00_000000 ) + hh + mm + ss + mmmmmm , nil
178187 case "HOUR_MINUTE" :
179188 hh := dateTime .Hour () * 1_00
180189 mm := dateTime .Minute ()
@@ -204,10 +213,15 @@ func (td *Extract) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
204213 mmmmmm := dateTime .Nanosecond () / 1000
205214 return ss + mmmmmm , nil
206215 case "YEAR_MONTH" :
207- yyyy := dateTime .Year () * 1_00
208- dateTime .Month ()
209- mm := int (dateTime .Month ())
210- return yyyy + mm , nil
216+ yyyy , ok := year (dateTime ).(int )
217+ if ! ok {
218+ return nil , sql .ErrInvalidArgumentDetails .New ("YEAR_MONTH" , "invalid year" )
219+ }
220+ mm , ok := month (dateTime ).(int )
221+ if ! ok {
222+ return nil , sql .ErrInvalidArgumentDetails .New ("YEAR_MONTH" , "invalid month" )
223+ }
224+ return (yyyy * 1_00 ) + mm , nil
211225 default :
212226 return nil , fmt .Errorf ("invalid time unit" )
213227 }
0 commit comments