inline void print_field_value(byte *value, ulint len, field_def_t *field) { switch (field->type) { case FT_INTERNAL: break; case FT_CHAR: case FT_TEXT: print_string((char*)value, len, field); break; case FT_UINT: printf("%llu", get_uint_value(field, value)); break; case FT_INT: printf("%lli", get_int_value(field, value)); break; case FT_FLOAT: printf("%f", mach_float_read(value)); break; case FT_DOUBLE: printf("%lf", mach_double_read(value)); break; case FT_DATETIME: print_datetime(make_longlong(mach_read_from_8(value))); break; case FT_DATE: print_date(mach_read_from_3(value)); break; case FT_TIME: print_time(mach_read_from_3(value)); break; case FT_ENUM: print_enum(mach_read_from_1(value), field); break; case FT_DECIMAL: print_decimal(value, field); break; default: printf("undef(%d)", field->type); } }
/*************************************************************//** Innobase uses this function to compare two data fields for which the data type is such that we must compare whole fields or call MySQL to do the comparison @return 1, 0, -1, if a is greater, equal, less than b, respectively */ static int cmp_whole_field( /*============*/ ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ const byte* a, /*!< in: data field */ unsigned int a_length, /*!< in: data field length, not UNIV_SQL_NULL */ const byte* b, /*!< in: data field */ unsigned int b_length) /*!< in: data field length, not UNIV_SQL_NULL */ { float f_1; float f_2; double d_1; double d_2; int swap_flag = 1; switch (mtype) { case DATA_DECIMAL: /* Remove preceding spaces */ for (; a_length && *a == ' '; a++, a_length--); for (; b_length && *b == ' '; b++, b_length--); if (*a == '-') { if (*b != '-') { return(-1); } a++; b++; a_length--; b_length--; swap_flag = -1; } else if (*b == '-') { return(1); } while (a_length > 0 && (*a == '+' || *a == '0')) { a++; a_length--; } while (b_length > 0 && (*b == '+' || *b == '0')) { b++; b_length--; } if (a_length != b_length) { if (a_length < b_length) { return(-swap_flag); } return(swap_flag); } while (a_length > 0 && *a == *b) { a++; b++; a_length--; } if (a_length == 0) { return(0); } if (*a > *b) { return(swap_flag); } return(-swap_flag); case DATA_DOUBLE: d_1 = mach_double_read(a); d_2 = mach_double_read(b); if (d_1 > d_2) { return(1); } else if (d_2 > d_1) { return(-1); } return(0); case DATA_FLOAT: f_1 = mach_float_read(a); f_2 = mach_float_read(b); if (f_1 > f_2) { return(1); } else if (f_2 > f_1) { return(-1); } return(0); case DATA_BLOB: if (prtype & DATA_BINARY_TYPE) { ut_print_timestamp(stderr); fprintf(stderr, " InnoDB: Error: comparing a binary BLOB" " with a character set sensitive\n" "InnoDB: comparison!\n"); } /* fall through */ case DATA_VARMYSQL: case DATA_MYSQL: return(innobase_mysql_cmp( (int)(prtype & DATA_MYSQL_TYPE_MASK), (uint)dtype_get_charset_coll(prtype), a, a_length, b, b_length)); default: fprintf(stderr, "InnoDB: unknown type number %lu\n", (ulong) mtype); ut_error; } return(0); }