diff options
author | unknown <jimw@mysql.com> | 2005-04-04 12:46:43 -0700 |
---|---|---|
committer | unknown <jimw@mysql.com> | 2005-04-04 12:46:43 -0700 |
commit | a1112ca0563313c8274c9dc2eda6f734ea06da1a (patch) | |
tree | 12c2096a60a620e7cf9e98f9201146669b4f6d8d /sql | |
parent | 9176a1f442252187a7c027570d8a843bb6edf549 (diff) | |
parent | a64487fcd59f2df4352e9fbe6fbc4bd7f1888e8a (diff) | |
download | mariadb-git-a1112ca0563313c8274c9dc2eda6f734ea06da1a.tar.gz |
Merge bk-internal:/home/bk/mysql-4.1
into mysql.com:/home/jimw/my/mysql-4.1-clean
Diffstat (limited to 'sql')
-rw-r--r-- | sql/ha_innodb.cc | 57 |
1 files changed, 38 insertions, 19 deletions
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 0bdd620706d..3e3a48f4ab9 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -1923,8 +1923,11 @@ inline ulint get_innobase_type_from_mysql_type( /*==============================*/ - /* out: DATA_BINARY, DATA_VARCHAR, ... */ - Field* field) /* in: MySQL field */ + /* out: DATA_BINARY, DATA_VARCHAR, ... */ + ulint* unsigned_flag, /* out: DATA_UNSIGNED if an 'unsigned type'; + at least ENUM and SET, and unsigned integer + types are 'unsigned types' */ + Field* field) /* in: MySQL field */ { /* The following asserts try to check that the MySQL type code fits in 8 bits: this is used in ibuf and also when DATA_NOT_NULL is ORed to @@ -1936,6 +1939,27 @@ get_innobase_type_from_mysql_type( DBUG_ASSERT((ulint)FIELD_TYPE_FLOAT < 256); DBUG_ASSERT((ulint)FIELD_TYPE_DECIMAL < 256); + if (field->flags & UNSIGNED_FLAG) { + + *unsigned_flag = DATA_UNSIGNED; + } else { + *unsigned_flag = 0; + } + + if (field->real_type() == FIELD_TYPE_ENUM + || field->real_type() == FIELD_TYPE_SET) { + + /* MySQL has field->type() a string type for these, but the + data is actually internally stored as an unsigned integer + code! */ + + *unsigned_flag = DATA_UNSIGNED; /* MySQL has its own unsigned + flag set to zero, even though + internally this is an unsigned + integer type */ + return(DATA_INT); + } + switch (field->type()) { /* NOTE that we only allow string types in DATA_MYSQL and DATA_VARMYSQL */ @@ -1968,8 +1992,6 @@ get_innobase_type_from_mysql_type( case FIELD_TYPE_DATETIME: case FIELD_TYPE_YEAR: case FIELD_TYPE_NEWDATE: - case FIELD_TYPE_ENUM: - case FIELD_TYPE_SET: case FIELD_TYPE_TIME: case FIELD_TYPE_TIMESTAMP: return(DATA_INT); @@ -2247,10 +2269,11 @@ build_template( get_field_offset(table, field); templ->mysql_col_len = (ulint) field->pack_length(); - templ->type = get_innobase_type_from_mysql_type(field); + templ->type = index->table->cols[i].type.mtype; + templ->is_unsigned = index->table->cols[i].type.prtype + & DATA_UNSIGNED; templ->charset = dtype_get_charset_coll_noninline( index->table->cols[i].type.prtype); - templ->is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); if (templ->type == DATA_BLOB) { prebuilt->templ_contains_blob = TRUE; @@ -2676,9 +2699,9 @@ calc_row_difference( o_len = field->pack_length(); n_len = field->pack_length(); - col_type = get_innobase_type_from_mysql_type(field); - is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); - + col_type = prebuilt->table->cols[i].type.mtype; + is_unsigned = prebuilt->table->cols[i].type.prtype & + DATA_UNSIGNED; switch (col_type) { case DATA_BLOB: @@ -2720,8 +2743,7 @@ calc_row_difference( (mysql_byte*)n_ptr, n_len, col_type, is_unsigned); ufield->exp = NULL; - ufield->field_no = - (prebuilt->table->cols + i)->clust_pos; + ufield->field_no = prebuilt->table->cols[i].clust_pos; n_changed++; } } @@ -3546,19 +3568,14 @@ create_table_def( for (i = 0; i < n_cols; i++) { field = form->field[i]; - col_type = get_innobase_type_from_mysql_type(field); + col_type = get_innobase_type_from_mysql_type(&unsigned_type, + field); if (field->null_ptr) { nulls_allowed = 0; } else { nulls_allowed = DATA_NOT_NULL; } - if (field->flags & UNSIGNED_FLAG) { - unsigned_type = DATA_UNSIGNED; - } else { - unsigned_type = 0; - } - if (field->binary()) { binary_type = DATA_BINARY_TYPE; } else { @@ -3612,6 +3629,7 @@ create_index( ulint ind_type; ulint col_type; ulint prefix_len; + ulint is_unsigned; ulint i; ulint j; @@ -3661,7 +3679,8 @@ create_index( ut_a(j < form->fields); - col_type = get_innobase_type_from_mysql_type(key_part->field); + col_type = get_innobase_type_from_mysql_type( + &is_unsigned, key_part->field); if (DATA_BLOB == col_type || key_part->length < field->pack_length()) { |