caddr_t arithm_dt_subtract (ccaddr_t box1, ccaddr_t box2, caddr_t *err_ret) { dtp_t dtp1 = DV_TYPE_OF (box1), dtp2 = DV_TYPE_OF (box2); if ((DV_DATETIME == dtp1) && (DV_DATETIME == dtp2)) { boxint s1 = DT_CAST_TO_TOTAL_SECONDS(box1); boxint s2 = DT_CAST_TO_TOTAL_SECONDS(box2); int frac1 = DT_FRACTION(box1); int frac2 = DT_FRACTION(box2); if (frac1 == frac2) return box_num (s1 - s2); else { numeric_t res = numeric_allocate (); numeric_from_int64 (res, ((s1 - s2) * 1000000000L) + (frac1 - frac2)); res->n_len -= 9; res->n_scale += 9; return (caddr_t)res; } } if ((DV_DATETIME == dtp1) && ((DV_LONG_INT == dtp2) || (DV_DOUBLE_FLOAT == dtp2) || (DV_NUMERIC == dtp2))) { caddr_t res = arithm_dt_add_num (box1, box2, 1, err_ret); if (NULL != err_ret) return res; if (NULL == res) goto generic_err; return res; } generic_err: err_ret[0] = srv_make_new_error ("22003", "SR087", "Wrong arguments for datetime arithmetic, can not subtract value of type %d (%s) from value type %d (%s).", dtp2, dv_type_title (dtp2), dtp1, dv_type_title (dtp1) ); return NULL; }
caddr_t arithm_dt_add (ccaddr_t box1, ccaddr_t box2, caddr_t *err_ret) { dtp_t dtp1 = DV_TYPE_OF (box1), dtp2 = DV_TYPE_OF (box2); if ((DV_DATETIME == dtp1) && ((DV_LONG_INT == dtp2) || (DV_DOUBLE_FLOAT == dtp2) || (DV_NUMERIC == dtp2))) { caddr_t res = arithm_dt_add_num (box1, box2, 0, err_ret); if (NULL != err_ret) return res; if (NULL == res) goto generic_err; return res; } if ((DV_DATETIME == dtp2) && ((DV_LONG_INT == dtp1) || (DV_DOUBLE_FLOAT == dtp1) || (DV_NUMERIC == dtp1))) { caddr_t res = arithm_dt_add_num (box2, box1, 0, err_ret); if (NULL != err_ret) return res; if (NULL == res) goto generic_err; return res; } generic_err: err_ret[0] = srv_make_new_error ("22003", "SR087", "Wrong arguments for datetime arithmetic, can not add values of type %d (%s) and type %d (%s).", dtp1, dv_type_title (dtp1), dtp2, dv_type_title (dtp2) ); return NULL; }
caddr_t bif_date_arg (caddr_t * qst, state_slot_t ** args, int nth, char *func) { caddr_t arg = bif_arg (qst, args, nth, func); dtp_t dtp = DV_TYPE_OF (arg); if (dtp != DV_DATETIME && dtp != DV_BIN) sqlr_new_error ("22007", "DT001", "Function %s needs a datetime, date or time as argument %d, not an arg of type %s (%d)", func, nth + 1, dv_type_title (dtp), dtp); return arg; }
void row_print_wide (caddr_t thing, dk_session_t * ses, dbe_column_t * col, caddr_t * err_ret, dtp_t dtp, wcharset_t * wcharset) { switch (dtp) { case DV_STRING: if (0 > print_narrow_string_as_wide (ses, (unsigned char *) thing, wcharset)) { caddr_t err = NULL; err = srv_make_new_error ("22005", "IN009", "Bad value for wide string column %s, dtp = %d.", col->col_name, dtp); if (err_ret) *err_ret = err; else sqlr_resignal (err); return; } break; case DV_WIDE: wide_serialize (thing, ses); break; default: { caddr_t err = NULL; err = srv_make_new_error ("22005", "IN011", "Bad value for wide string column %s, type=%s.", col->col_name, dv_type_title (dtp)); if (err_ret) *err_ret = err; else sqlr_resignal (err); } break; } }