| 1129 | #define MAX_DAY_NUMBER 3652424L |
| 1130 | |
| 1131 | bool date_add_interval(MYSQL_TIME *ltime, interval_type int_type, INTERVAL interval) |
| 1132 | { |
| 1133 | long period, sign; |
| 1134 | |
| 1135 | ltime->neg= 0; |
| 1136 | |
| 1137 | sign= (interval.neg ? -1 : 1); |
| 1138 | |
| 1139 | switch (int_type) { |
| 1140 | case INTERVAL_SECOND: |
| 1141 | case INTERVAL_SECOND_MICROSECOND: |
| 1142 | case INTERVAL_MICROSECOND: |
| 1143 | case INTERVAL_MINUTE: |
| 1144 | case INTERVAL_HOUR: |
| 1145 | case INTERVAL_MINUTE_MICROSECOND: |
| 1146 | case INTERVAL_MINUTE_SECOND: |
| 1147 | case INTERVAL_HOUR_MICROSECOND: |
| 1148 | case INTERVAL_HOUR_SECOND: |
| 1149 | case INTERVAL_HOUR_MINUTE: |
| 1150 | case INTERVAL_DAY_MICROSECOND: |
| 1151 | case INTERVAL_DAY_SECOND: |
| 1152 | case INTERVAL_DAY_MINUTE: |
| 1153 | case INTERVAL_DAY_HOUR: |
| 1154 | { |
| 1155 | longlong sec, days, daynr, microseconds, extra_sec; |
| 1156 | ltime->time_type= MYSQL_TIMESTAMP_DATETIME; // Return full date |
| 1157 | microseconds= ltime->second_part + sign*interval.second_part; |
| 1158 | extra_sec= microseconds/1000000L; |
| 1159 | microseconds= microseconds%1000000L; |
| 1160 | |
| 1161 | sec=((ltime->day-1)*3600*24L+ltime->hour*3600+ltime->minute*60+ |
| 1162 | ltime->second + |
| 1163 | sign* (longlong) (interval.day*3600*24L + |
| 1164 | interval.hour*LL(3600)+interval.minute*LL(60)+ |
| 1165 | interval.second))+ extra_sec; |
| 1166 | if (microseconds < 0) |
| 1167 | { |
| 1168 | microseconds+= LL(1000000); |
| 1169 | sec--; |
| 1170 | } |
| 1171 | days= sec/(3600*LL(24)); |
| 1172 | sec-= days*3600*LL(24); |
| 1173 | if (sec < 0) |
| 1174 | { |
| 1175 | days--; |
| 1176 | sec+= 3600*LL(24); |
| 1177 | } |
| 1178 | ltime->second_part= (uint) microseconds; |
| 1179 | ltime->second= (uint) (sec % 60); |
| 1180 | ltime->minute= (uint) (sec/60 % 60); |
| 1181 | ltime->hour= (uint) (sec/3600); |
| 1182 | daynr= calc_daynr(ltime->year,ltime->month,1) + days; |
| 1183 | /* Day number from year 0 to 9999-12-31 */ |
| 1184 | if ((ulonglong) daynr > MAX_DAY_NUMBER) |
| 1185 | goto invalid_date; |
| 1186 | get_date_from_daynr((long) daynr, <ime->year, <ime->month, |
| 1187 | <ime->day); |
| 1188 | break; |
no test coverage detected