#At file:///home/mayank/mysql-tree/my_WL/5885/ based on revid:jimmy.yang@stripped
3134 Mayank Prasad 2011-05-31
WL#5885 : TIME/TIMESTAMP/DATETIME with fractional seconds, information_schema
First Code drop for adding a new field in I_S.COLUMNS/PARAMETERS/ROUTINES.
@ sql/field.h
Added two new functions to:
1. return true if field has DATETIME_PRECISION.
2. return DATETIME_PRECISION for the field.
@ sql/sql_show.cc
Added :
1. A new field DATETIME_PRECISION in I_S.COLUMNS/PARAMETERS/ROUTINES
2. Added code to populate this new field and
3. Modified required indexes for displaying data from
I_S.COLUMNS/PARAMETERS/ROUTINES.
modified:
sql/field.h
sql/sql_show.cc
=== modified file 'sql/field.h'
--- a/sql/field.h 2011-05-26 15:20:09 +0000
+++ b/sql/field.h 2011-05-31 14:30:13 +0000
@@ -476,6 +476,10 @@ public:
virtual const CHARSET_INFO *sort_charset(void) const { return charset(); }
virtual bool has_charset(void) const { return FALSE; }
virtual void set_charset(const CHARSET_INFO *charset_arg) { }
+ /* returns TRUE if this field has DATETIME_PRECISION. */
+ virtual bool has_dtprecision(void) const { return FALSE; }
+ /* returns DATETIME_PRECISION value for this field. */
+ virtual longlong dtprecision(void){ return 0; }
virtual enum Derivation derivation(void) const
{ return DERIVATION_IMPLICIT; }
virtual uint repertoire(void) const { return MY_REPERTOIRE_UNICODE30; }
=== modified file 'sql/sql_show.cc'
--- a/sql/sql_show.cc 2011-05-26 15:20:09 +0000
+++ b/sql/sql_show.cc 2011-05-31 14:30:13 +0000
@@ -4135,6 +4135,7 @@ err:
/**
@brief Store field characteristics into appropriate I_S table columns
+ starting from DATA_TYPE column till DTD_IDENTIFIER column.
@param[in] table I_S table
@param[in] field processed field
@@ -4156,8 +4157,8 @@ void store_column_type(TABLE *table, Fie
field->sql_type(column_type);
/* DTD_IDENTIFIER column */
- table->field[offset + 7]->store(column_type.ptr(), column_type.length(), cs);
- table->field[offset + 7]->set_notnull();
+ table->field[offset + 8]->store(column_type.ptr(), column_type.length(), cs);
+ table->field[offset + 8]->set_notnull();
/*
DATA_TYPE column:
MySQL column type has the following format:
@@ -4248,13 +4249,19 @@ void store_column_type(TABLE *table, Fie
{
/* CHARACTER_SET_NAME column*/
tmp_buff= field->charset()->csname;
- table->field[offset + 5]->store(tmp_buff, strlen(tmp_buff), cs);
- table->field[offset + 5]->set_notnull();
- /* COLLATION_NAME column */
- tmp_buff= field->charset()->name;
table->field[offset + 6]->store(tmp_buff, strlen(tmp_buff), cs);
table->field[offset + 6]->set_notnull();
+ /* COLLATION_NAME column */
+ tmp_buff= field->charset()->name;
+ table->field[offset + 7]->store(tmp_buff, strlen(tmp_buff), cs);
+ table->field[offset + 7]->set_notnull();
}
+ if (!field->has_dtprecision())
+ {
+ /* DATETIME_PRECISION column*/
+ table->field[offset + 5]->store(field->dtprecision(), TRUE);
+ table->field[offset + 5]->set_notnull();
+ }
}
@@ -4329,7 +4336,7 @@ static int get_schema_column_record(THD
end=strmov(end,grant_types.type_names[bitnr]);
}
}
- table->field[17]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs);
+ table->field[18]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs);
#endif
table->field[0]->store(STRING_WITH_LEN("def"), cs);
@@ -4339,7 +4346,7 @@ static int get_schema_column_record(THD
cs);
table->field[4]->store((longlong) count, TRUE);
field->sql_type(type);
- table->field[14]->store(type.ptr(), type.length(), cs);
+ table->field[15]->store(type.ptr(), type.length(), cs);
if (get_field_default_value(thd, timestamp_field, field, &type, 0))
{
@@ -4353,17 +4360,17 @@ static int get_schema_column_record(THD
pos=(uchar*) ((field->flags & PRI_KEY_FLAG) ? "PRI" :
(field->flags & UNIQUE_KEY_FLAG) ? "UNI" :
(field->flags & MULTIPLE_KEY_FLAG) ? "MUL":"");
- table->field[15]->store((const char*) pos,
+ table->field[16]->store((const char*) pos,
strlen((const char*) pos), cs);
if (field->unireg_check == Field::NEXT_NUMBER)
- table->field[16]->store(STRING_WITH_LEN("auto_increment"), cs);
+ table->field[17]->store(STRING_WITH_LEN("auto_increment"), cs);
if (timestamp_field == field &&
field->unireg_check != Field::TIMESTAMP_DN_FIELD)
- table->field[16]->store(STRING_WITH_LEN("on update CURRENT_TIMESTAMP"),
+ table->field[17]->store(STRING_WITH_LEN("on update CURRENT_TIMESTAMP"),
cs);
- table->field[18]->store(field->comment.str, field->comment.length, cs);
+ table->field[19]->store(field->comment.str, field->comment.length, cs);
if (schema_table_store_record(thd, table))
DBUG_RETURN(1);
}
@@ -4651,7 +4658,7 @@ bool store_schema_params(THD *thd, TABLE
table->field[3]->store((longlong) 0, TRUE);
get_field(thd->mem_root, proc_table->field[MYSQL_PROC_MYSQL_TYPE],
&tmp_string);
- table->field[14]->store(tmp_string.ptr(), tmp_string.length(), cs);
+ table->field[15]->store(tmp_string.ptr(), tmp_string.length(), cs);
field_def= &sp->m_return_field_def;
field= make_field(&share, (uchar*) 0, field_def->length,
(uchar*) "", 0, field_def->pack_flag,
@@ -4704,7 +4711,7 @@ bool store_schema_params(THD *thd, TABLE
table->field[5]->set_notnull();
get_field(thd->mem_root, proc_table->field[MYSQL_PROC_MYSQL_TYPE],
&tmp_string);
- table->field[14]->store(tmp_string.ptr(), tmp_string.length(), cs);
+ table->field[15]->store(tmp_string.ptr(), tmp_string.length(), cs);
field= make_field(&share, (uchar*) 0, field_def->length,
(uchar*) "", 0, field_def->pack_flag,
@@ -4821,40 +4828,40 @@ bool store_schema_proc(THD *thd, TABLE *
if (full_access)
{
- copy_field_as_string(table->field[14],
+ copy_field_as_string(table->field[15],
proc_table->field[MYSQL_PROC_FIELD_BODY_UTF8]);
- table->field[14]->set_notnull();
+ table->field[15]->set_notnull();
}
- table->field[13]->store(STRING_WITH_LEN("SQL"), cs);
- table->field[17]->store(STRING_WITH_LEN("SQL"), cs);
- copy_field_as_string(table->field[18],
+ table->field[14]->store(STRING_WITH_LEN("SQL"), cs);
+ table->field[18]->store(STRING_WITH_LEN("SQL"), cs);
+ copy_field_as_string(table->field[19],
proc_table->field[MYSQL_PROC_FIELD_DETERMINISTIC]);
- table->field[19]->store(sp_data_access_name[enum_idx].str,
+ table->field[20]->store(sp_data_access_name[enum_idx].str,
sp_data_access_name[enum_idx].length , cs);
- copy_field_as_string(table->field[21],
+ copy_field_as_string(table->field[22],
proc_table->field[MYSQL_PROC_FIELD_SECURITY_TYPE]);
memset(&time, 0, sizeof(time));
((Field_timestamp *) proc_table->field[MYSQL_PROC_FIELD_CREATED])->
get_time(&time);
- table->field[22]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
+ table->field[23]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
memset(&time, 0, sizeof(time));
((Field_timestamp *) proc_table->field[MYSQL_PROC_FIELD_MODIFIED])->
get_time(&time);
- table->field[23]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
- copy_field_as_string(table->field[24],
- proc_table->field[MYSQL_PROC_FIELD_SQL_MODE]);
+ table->field[24]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
copy_field_as_string(table->field[25],
+ proc_table->field[MYSQL_PROC_FIELD_SQL_MODE]);
+ copy_field_as_string(table->field[26],
proc_table->field[MYSQL_PROC_FIELD_COMMENT]);
table->field[26]->store(definer.ptr(), definer.length(), cs);
- copy_field_as_string(table->field[27],
+ copy_field_as_string(table->field[28],
proc_table->
field[MYSQL_PROC_FIELD_CHARACTER_SET_CLIENT]);
- copy_field_as_string(table->field[28],
+ copy_field_as_string(table->field[29],
proc_table->
field[MYSQL_PROC_FIELD_COLLATION_CONNECTION]);
- copy_field_as_string(table->field[29],
+ copy_field_as_string(table->field[30],
proc_table->field[MYSQL_PROC_FIELD_DB_COLLATION]);
return schema_table_store_record(thd, table);
@@ -6558,7 +6565,7 @@ int make_table_names_old_format(THD *thd
int make_columns_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table)
{
- int fields_arr[]= {3, 14, 13, 6, 15, 5, 16, 17, 18, -1};
+ int fields_arr[]= {3, 15, 14, 6, 16, 5, 17, 18, 19, -1};
int *field_num= fields_arr;
ST_FIELD_INFO *field_info;
Name_resolution_context *context= &thd->lex->select_lex.context;
@@ -6566,9 +6573,9 @@ int make_columns_old_format(THD *thd, ST
for (; *field_num >= 0; field_num++)
{
field_info= &schema_table->fields_info[*field_num];
- if (!thd->lex->verbose && (*field_num == 13 ||
- *field_num == 17 ||
- *field_num == 18))
+ if (!thd->lex->verbose && (*field_num == 14 ||
+ *field_num == 18 ||
+ *field_num == 19))
continue;
Item_field *field= new Item_field(context,
NullS, NullS, field_info->field_name);
@@ -6612,7 +6619,7 @@ int make_character_sets_old_format(THD *
int make_proc_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table)
{
- int fields_arr[]= {2, 3, 4, 26, 23, 22, 21, 25, 27, 28, 29, -1};
+ int fields_arr[]= {2, 3, 4, 27, 24, 23, 22, 26, 28, 29, 30, -1};
int *field_num= fields_arr;
ST_FIELD_INFO *field_info;
Name_resolution_context *context= &thd->lex->select_lex.context;
@@ -7038,6 +7045,8 @@ ST_FIELD_INFO columns_fields_info[]=
0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), 0, OPEN_FRM_ONLY},
{"NUMERIC_SCALE", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONGLONG,
0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), 0, OPEN_FRM_ONLY},
+ {"DATETIME_PRECISION", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONGLONG,
+ 0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), 0, OPEN_FULL_TABLE},
{"CHARACTER_SET_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 1, 0,
OPEN_FRM_ONLY},
{"COLLATION_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 1, "Collation",
@@ -7155,6 +7164,8 @@ ST_FIELD_INFO proc_fields_info[]=
{"NUMERIC_PRECISION", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG,
0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), 0, SKIP_OPEN_TABLE},
{"NUMERIC_SCALE", 21 , MYSQL_TYPE_LONG, 0, 1, 0, SKIP_OPEN_TABLE},
+ {"DATETIME_PRECISION", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONGLONG,
+ 0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), 0, SKIP_OPEN_TABLE},
{"CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE},
{"COLLATION_NAME", 64, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE},
{"DTD_IDENTIFIER", 65535, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE},
@@ -7566,6 +7577,8 @@ ST_FIELD_INFO parameters_fields_info[]=
{"NUMERIC_PRECISION", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG,
0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), 0, OPEN_FULL_TABLE},
{"NUMERIC_SCALE", 21 , MYSQL_TYPE_LONG, 0, 1, 0, OPEN_FULL_TABLE},
+ {"DATETIME_PRECISION", MY_INT64_NUM_DECIMAL_DIGITS , MYSQL_TYPE_LONGLONG,
+ 0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), 0, OPEN_FULL_TABLE},
{"CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 1, 0, OPEN_FULL_TABLE},
{"COLLATION_NAME", 64, MYSQL_TYPE_STRING, 0, 1, 0, OPEN_FULL_TABLE},
{"DTD_IDENTIFIER", 65535, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FULL_TABLE},
Attachment: [text/bzr-bundle] bzr/mayank.prasad@oracle.com-20110531143013-z1ouxzemyzs5jebe.bundle