@@ -4458,6 +4458,26 @@ timestamp_part(PG_FUNCTION_ARGS)
44584458 result = date2isoyear (tm -> tm_year , tm -> tm_mon , tm -> tm_mday );
44594459 break ;
44604460
4461+ case DTK_DOW :
4462+ case DTK_ISODOW :
4463+ if (timestamp2tm (timestamp , NULL , tm , & fsec , NULL , NULL ) != 0 )
4464+ ereport (ERROR ,
4465+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
4466+ errmsg ("timestamp out of range" )));
4467+ result = j2day (date2j (tm -> tm_year , tm -> tm_mon , tm -> tm_mday ));
4468+ if (val == DTK_ISODOW && result == 0 )
4469+ result = 7 ;
4470+ break ;
4471+
4472+ case DTK_DOY :
4473+ if (timestamp2tm (timestamp , NULL , tm , & fsec , NULL , NULL ) != 0 )
4474+ ereport (ERROR ,
4475+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
4476+ errmsg ("timestamp out of range" )));
4477+ result = (date2j (tm -> tm_year , tm -> tm_mon , tm -> tm_mday )
4478+ - date2j (tm -> tm_year , 1 , 1 ) + 1 );
4479+ break ;
4480+
44614481 case DTK_TZ :
44624482 case DTK_TZ_MINUTE :
44634483 case DTK_TZ_HOUR :
@@ -4481,26 +4501,6 @@ timestamp_part(PG_FUNCTION_ARGS)
44814501#endif
44824502 break ;
44834503
4484- case DTK_DOW :
4485- case DTK_ISODOW :
4486- if (timestamp2tm (timestamp , NULL , tm , & fsec , NULL , NULL ) != 0 )
4487- ereport (ERROR ,
4488- (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
4489- errmsg ("timestamp out of range" )));
4490- result = j2day (date2j (tm -> tm_year , tm -> tm_mon , tm -> tm_mday ));
4491- if (val == DTK_ISODOW && result == 0 )
4492- result = 7 ;
4493- break ;
4494-
4495- case DTK_DOY :
4496- if (timestamp2tm (timestamp , NULL , tm , & fsec , NULL , NULL ) != 0 )
4497- ereport (ERROR ,
4498- (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
4499- errmsg ("timestamp out of range" )));
4500- result = (date2j (tm -> tm_year , tm -> tm_mon , tm -> tm_mday )
4501- - date2j (tm -> tm_year , 1 , 1 ) + 1 );
4502- break ;
4503-
45044504 default :
45054505 ereport (ERROR ,
45064506 (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
@@ -4672,6 +4672,26 @@ timestamptz_part(PG_FUNCTION_ARGS)
46724672 result = date2isoyear (tm -> tm_year , tm -> tm_mon , tm -> tm_mday );
46734673 break ;
46744674
4675+ case DTK_DOW :
4676+ case DTK_ISODOW :
4677+ if (timestamp2tm (timestamp , & tz , tm , & fsec , NULL , NULL ) != 0 )
4678+ ereport (ERROR ,
4679+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
4680+ errmsg ("timestamp out of range" )));
4681+ result = j2day (date2j (tm -> tm_year , tm -> tm_mon , tm -> tm_mday ));
4682+ if (val == DTK_ISODOW && result == 0 )
4683+ result = 7 ;
4684+ break ;
4685+
4686+ case DTK_DOY :
4687+ if (timestamp2tm (timestamp , & tz , tm , & fsec , NULL , NULL ) != 0 )
4688+ ereport (ERROR ,
4689+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
4690+ errmsg ("timestamp out of range" )));
4691+ result = (date2j (tm -> tm_year , tm -> tm_mon , tm -> tm_mday )
4692+ - date2j (tm -> tm_year , 1 , 1 ) + 1 );
4693+ break ;
4694+
46754695 default :
46764696 ereport (ERROR ,
46774697 (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
@@ -4693,26 +4713,6 @@ timestamptz_part(PG_FUNCTION_ARGS)
46934713#endif
46944714 break ;
46954715
4696- case DTK_DOW :
4697- case DTK_ISODOW :
4698- if (timestamp2tm (timestamp , & tz , tm , & fsec , NULL , NULL ) != 0 )
4699- ereport (ERROR ,
4700- (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
4701- errmsg ("timestamp out of range" )));
4702- result = j2day (date2j (tm -> tm_year , tm -> tm_mon , tm -> tm_mday ));
4703- if (val == DTK_ISODOW && result == 0 )
4704- result = 7 ;
4705- break ;
4706-
4707- case DTK_DOY :
4708- if (timestamp2tm (timestamp , & tz , tm , & fsec , NULL , NULL ) != 0 )
4709- ereport (ERROR ,
4710- (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
4711- errmsg ("timestamp out of range" )));
4712- result = (date2j (tm -> tm_year , tm -> tm_mon , tm -> tm_mday )
4713- - date2j (tm -> tm_year , 1 , 1 ) + 1 );
4714- break ;
4715-
47164716 default :
47174717 ereport (ERROR ,
47184718 (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
0 commit comments