summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2003-08-19 00:10:21 +0300
committerunknown <monty@mashka.mysql.fi>2003-08-19 00:10:21 +0300
commit755e72a0f55b593cf930ae9bd69998f82b70d5cf (patch)
treebf340fae8765f9d5f1e1ac543d2926bef0021e03 /sql
parent2901c3b8fa7d4095445c6ca2070367d2f61af2d1 (diff)
parenta7c82c5693110bfa744bd4cf481b02eaabb7a0aa (diff)
downloadmariadb-git-755e72a0f55b593cf930ae9bd69998f82b70d5cf.tar.gz
merge
configure.in: Auto merged mysql-test/r/func_time.result: Auto merged mysql-test/r/subselect.result: Auto merged mysql-test/t/func_time.test: Auto merged mysql-test/t/subselect.test: Auto merged sql/field.cc: Auto merged sql/field.h: Auto merged sql/item.h: Auto merged sql/item_cmpfunc.cc: Auto merged sql/item_timefunc.cc: Auto merged sql/item_timefunc.h: Auto merged sql/lex.h: Auto merged sql/sql_parse.cc: Auto merged sql/sql_select.cc: Auto merged sql/sql_table.cc: Auto merged sql/sql_union.cc: Auto merged sql/sql_update.cc: Auto merged sql/sql_yacc.yy: Auto merged
Diffstat (limited to 'sql')
-rw-r--r--sql/field.cc24
-rw-r--r--sql/item.h4
-rw-r--r--sql/item_cmpfunc.cc2
-rw-r--r--sql/item_sum.cc5
-rw-r--r--sql/item_timefunc.cc148
-rw-r--r--sql/item_timefunc.h80
-rw-r--r--sql/lex.h3
-rw-r--r--sql/share/charsets/Index.xml9
-rw-r--r--sql/share/charsets/geostd8.xml121
-rw-r--r--sql/sql_derived.cc3
-rw-r--r--sql/sql_parse.cc16
-rw-r--r--sql/sql_select.cc14
-rw-r--r--sql/sql_select.h3
-rw-r--r--sql/sql_table.cc47
-rw-r--r--sql/sql_union.cc5
-rw-r--r--sql/sql_update.cc3
-rw-r--r--sql/sql_yacc.yy22
-rw-r--r--sql/unireg.h7
18 files changed, 421 insertions, 95 deletions
diff --git a/sql/field.cc b/sql/field.cc
index c972c116b1c..051a4fa8057 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -4014,7 +4014,7 @@ void Field_string::sql_type(String &res) const
(table->db_options_in_use &
HA_OPTION_PACK_RECORD) ?
"varchar" : "char"),
- (int) field_length);
+ (int) field_length / charset()->mbmaxlen);
res.length(length);
}
@@ -4180,7 +4180,7 @@ void Field_varstring::sql_type(String &res) const
CHARSET_INFO *cs=res.charset();
ulong length= cs->cset->snprintf(cs,(char*) res.ptr(),
res.alloced_length(),"varchar(%u)",
- field_length);
+ field_length / charset()->mbmaxlen);
res.length(length);
}
@@ -5274,6 +5274,26 @@ bool Field_num::eq_def(Field *field)
** Handling of field and create_field
*****************************************************************************/
+void create_field::create_length_to_internal_length(void)
+{
+ switch (sql_type)
+ {
+ case MYSQL_TYPE_TINY_BLOB:
+ case MYSQL_TYPE_MEDIUM_BLOB:
+ case MYSQL_TYPE_LONG_BLOB:
+ case MYSQL_TYPE_BLOB:
+ case MYSQL_TYPE_VAR_STRING:
+ case MYSQL_TYPE_STRING:
+ length*= charset->mbmaxlen;
+ pack_length= calc_pack_length(sql_type == FIELD_TYPE_VAR_STRING ?
+ FIELD_TYPE_STRING : sql_type, length);
+ break;
+ default:
+ /* do nothing */
+ break;
+ }
+}
+
/*
Make a field from the .frm file info
*/
diff --git a/sql/item.h b/sql/item.h
index 457978fced6..35fc94211b6 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -436,7 +436,7 @@ public:
{
collation.set(cs, dv);
str_value.set(str,length,cs);
- max_length=length;
+ max_length= str_value.numchars()*cs->mbmaxlen;
set_name(str, length, cs);
decimals=NOT_FIXED_DEC;
}
@@ -445,7 +445,7 @@ public:
{
collation.set(cs, dv);
str_value.set(str,length,cs);
- max_length=length;
+ max_length= str_value.numchars()*cs->mbmaxlen;
set_name(name_par,0,cs);
decimals=NOT_FIXED_DEC;
}
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index b9e7b1d14ad..21de9a96f03 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -2158,7 +2158,7 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const
int shift = pattern_len;
int j = 0;
int u = 0;
- CHARSET_INFO *cs=system_charset_info; // QQ Needs to be fixed
+ CHARSET_INFO *cs= cmp.cmp_collation.collation; // QQ Needs to be fixed
const int plm1= pattern_len - 1;
const int tlmpl= text_len - pattern_len;
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index 0da2725f3ab..71c4fe9f4b8 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -1147,7 +1147,7 @@ bool Item_sum_count_distinct::setup(THD *thd)
if (!(table= create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1,
0,
select_lex->options | thd->options,
- HA_POS_ERROR)))
+ HA_POS_ERROR, (char*)"")))
return 1;
table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows
table->no_rows=1;
@@ -1834,7 +1834,8 @@ bool Item_func_group_concat::setup(THD *thd)
(types, sizes and so on).
*/
if (!(table=create_tmp_table(thd, tmp_table_param, all_fields, 0,
- 0, 0, 0,select_lex->options | thd->options)))
+ 0, 0, 0,select_lex->options | thd->options,
+ (char *) "")))
DBUG_RETURN(1);
table->file->extra(HA_EXTRA_NO_ROWS);
table->no_rows= 1;
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc
index c3e441b33a4..6ddafd40755 100644
--- a/sql/item_timefunc.cc
+++ b/sql/item_timefunc.cc
@@ -571,21 +571,21 @@ longlong Item_func_from_days::val_int()
void Item_func_curdate::fix_length_and_dec()
{
- struct tm tm_tmp,*start;
- time_t query_start=current_thd->query_start();
+ struct tm start;
collation.set(default_charset());
decimals=0;
max_length=10*default_charset()->mbmaxlen;
- localtime_r(&query_start,&tm_tmp);
- start=&tm_tmp;
- value=(longlong) ((ulong) ((uint) start->tm_year+1900)*10000L+
- ((uint) start->tm_mon+1)*100+
- (uint) start->tm_mday);
+
+ store_now_in_tm(current_thd->query_start(),&start);
+
+ value=(longlong) ((ulong) ((uint) start.tm_year+1900)*10000L+
+ ((uint) start.tm_mon+1)*100+
+ (uint) start.tm_mday);
/* For getdate */
- ltime.year= start->tm_year+1900;
- ltime.month= start->tm_mon+1;
- ltime.day= start->tm_mday;
+ ltime.year= start.tm_year+1900;
+ ltime.month= start.tm_mon+1;
+ ltime.day= start.tm_mday;
ltime.hour= 0;
ltime.minute= 0;
ltime.second= 0;
@@ -594,6 +594,7 @@ void Item_func_curdate::fix_length_and_dec()
ltime.time_type=TIMESTAMP_DATE;
}
+
bool Item_func_curdate::get_date(TIME *res,
bool fuzzy_date __attribute__((unused)))
{
@@ -601,6 +602,27 @@ bool Item_func_curdate::get_date(TIME *res,
return 0;
}
+
+/*
+ Converts time in time_t to struct tm represenatation for local timezone.
+ Defines timezone (local) used for whole CURDATE function
+*/
+void Item_func_curdate_local::store_now_in_tm(time_t now, struct tm *now_tm)
+{
+ localtime_r(&now,now_tm);
+}
+
+
+/*
+ Converts time in time_t to struct tm represenatation for UTC
+ Defines timezone (UTC) used for whole UTC_DATE function
+*/
+void Item_func_curdate_utc::store_now_in_tm(time_t now, struct tm *now_tm)
+{
+ gmtime_r(&now,now_tm);
+}
+
+
String *Item_func_curtime::val_str(String *str)
{
str_value.set(buff,buff_length,default_charset());
@@ -609,23 +631,43 @@ String *Item_func_curtime::val_str(String *str)
void Item_func_curtime::fix_length_and_dec()
{
- struct tm tm_tmp,*start;
- time_t query_start=current_thd->query_start();
- CHARSET_INFO *cs=default_charset();
+ struct tm start;
+ CHARSET_INFO *cs= default_charset();
decimals=0;
max_length=8*cs->mbmaxlen;
- localtime_r(&query_start,&tm_tmp);
- start=&tm_tmp;
collation.set(cs);
- value=(longlong) ((ulong) ((uint) start->tm_hour)*10000L+
- (ulong) (((uint) start->tm_min)*100L+
- (uint) start->tm_sec));
+
+ store_now_in_tm(current_thd->query_start(),&start);
+
+ value=(longlong) ((ulong) ((uint) start.tm_hour)*10000L+
+ (ulong) (((uint) start.tm_min)*100L+
+ (uint) start.tm_sec));
buff_length=cs->cset->snprintf(cs,buff,sizeof(buff),"%02d:%02d:%02d",
- (int) start->tm_hour,
- (int) start->tm_min,
- (int) start->tm_sec);
+ (int) start.tm_hour,
+ (int) start.tm_min,
+ (int) start.tm_sec);
+}
+
+
+/*
+ Converts time in time_t to struct tm represenatation for local timezone.
+ Defines timezone (local) used for whole CURTIME function
+*/
+void Item_func_curtime_local::store_now_in_tm(time_t now, struct tm *now_tm)
+{
+ localtime_r(&now,now_tm);
+}
+
+
+/*
+ Converts time in time_t to struct tm represenatation for UTC.
+ Defines timezone (UTC) used for whole UTC_TIME function
+*/
+void Item_func_curtime_utc::store_now_in_tm(time_t now, struct tm *now_tm)
+{
+ gmtime_r(&now,now_tm);
}
@@ -638,37 +680,37 @@ String *Item_func_now::val_str(String *str)
void Item_func_now::fix_length_and_dec()
{
- struct tm tm_tmp,*start;
- time_t query_start=current_thd->query_start();
+ struct tm start;
CHARSET_INFO *cs= &my_charset_bin;
decimals=0;
max_length=19*cs->mbmaxlen;
collation.set(cs);
- localtime_r(&query_start,&tm_tmp);
- start=&tm_tmp;
- value=((longlong) ((ulong) ((uint) start->tm_year+1900)*10000L+
- (((uint) start->tm_mon+1)*100+
- (uint) start->tm_mday))*(longlong) 1000000L+
- (longlong) ((ulong) ((uint) start->tm_hour)*10000L+
- (ulong) (((uint) start->tm_min)*100L+
- (uint) start->tm_sec)));
+
+ store_now_in_tm(current_thd->query_start(),&start);
+
+ value=((longlong) ((ulong) ((uint) start.tm_year+1900)*10000L+
+ (((uint) start.tm_mon+1)*100+
+ (uint) start.tm_mday))*(longlong) 1000000L+
+ (longlong) ((ulong) ((uint) start.tm_hour)*10000L+
+ (ulong) (((uint) start.tm_min)*100L+
+ (uint) start.tm_sec)));
buff_length= (uint) cs->cset->snprintf(cs,buff, sizeof(buff),
"%04d-%02d-%02d %02d:%02d:%02d",
- ((int) (start->tm_year+1900)) % 10000,
- (int) start->tm_mon+1,
- (int) start->tm_mday,
- (int) start->tm_hour,
- (int) start->tm_min,
- (int) start->tm_sec);
+ ((int) (start.tm_year+1900)) % 10000,
+ (int) start.tm_mon+1,
+ (int) start.tm_mday,
+ (int) start.tm_hour,
+ (int) start.tm_min,
+ (int) start.tm_sec);
/* For getdate */
- ltime.year= start->tm_year+1900;
- ltime.month= start->tm_mon+1;
- ltime.day= start->tm_mday;
- ltime.hour= start->tm_hour;
- ltime.minute= start->tm_min;
- ltime.second= start->tm_sec;
+ ltime.year= start.tm_year+1900;
+ ltime.month= start.tm_mon+1;
+ ltime.day= start.tm_mday;
+ ltime.hour= start.tm_hour;
+ ltime.minute= start.tm_min;
+ ltime.second= start.tm_sec;
ltime.second_part=0;
ltime.neg=0;
ltime.time_type=TIMESTAMP_FULL;
@@ -690,6 +732,26 @@ int Item_func_now::save_in_field(Field *to, bool no_conversions)
}
+/*
+ Converts time in time_t to struct tm represenatation for local timezone.
+ Defines timezone (local) used for whole CURRENT_TIMESTAMP function
+*/
+void Item_func_now_local::store_now_in_tm(time_t now, struct tm *now_tm)
+{
+ localtime_r(&now,now_tm);
+}
+
+
+/*
+ Converts time in time_t to struct tm represenatation for UTC.
+ Defines timezone (UTC) used for whole UTC_TIMESTAMP function
+*/
+void Item_func_now_utc::store_now_in_tm(time_t now, struct tm *now_tm)
+{
+ gmtime_r(&now,now_tm);
+}
+
+
String *Item_func_sec_to_time::val_str(String *str)
{
char buff[23*2];
diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h
index 4b0ef02f20d..29cfad2e095 100644
--- a/sql/item_timefunc.h
+++ b/sql/item_timefunc.h
@@ -350,6 +350,8 @@ public:
};
+/* Abstract CURTIME function. Children should define what timezone is used */
+
class Item_func_curtime :public Item_func
{
longlong value;
@@ -363,29 +365,77 @@ public:
double val() { return (double) value; }
longlong val_int() { return value; }
String *val_str(String *str);
- const char *func_name() const { return "curtime"; }
void fix_length_and_dec();
Field *tmp_table_field() { return result_field; }
Field *tmp_table_field(TABLE *t_arg)
{
return (new Field_time(maybe_null, name, t_arg, default_charset()));
- }
+ }
+ /*
+ Abstract method that defines which time zone is used for conversion.
+ Converts time from time_t representation to broken down representation
+ in struct tm using gmtime_r or localtime_r functions.
+ */
+ virtual void store_now_in_tm(time_t now, struct tm *now_tm)=0;
};
+class Item_func_curtime_local :public Item_func_curtime
+{
+public:
+ Item_func_curtime_local() :Item_func_curtime() {}
+ Item_func_curtime_local(Item *a) :Item_func_curtime(a) {}
+ const char *func_name() const { return "curtime"; }
+ void store_now_in_tm(time_t now, struct tm *now_tm);
+};
+
+
+class Item_func_curtime_utc :public Item_func_curtime
+{
+public:
+ Item_func_curtime_utc() :Item_func_curtime() {}
+ Item_func_curtime_utc(Item *a) :Item_func_curtime(a) {}
+ const char *func_name() const { return "utc_time"; }
+ void store_now_in_tm(time_t now, struct tm *now_tm);
+};
+
+
+/* Abstract CURDATE function. See also Item_func_curtime. */
+
class Item_func_curdate :public Item_date
{
longlong value;
TIME ltime;
public:
Item_func_curdate() :Item_date() {}
+ void set_result_from_tm(struct tm *now);
longlong val_int() { return (value) ; }
- const char *func_name() const { return "curdate"; }
- void fix_length_and_dec(); /* Retrieves curtime */
+ void fix_length_and_dec();
bool get_date(TIME *res,bool fuzzy_date);
+ virtual void store_now_in_tm(time_t now, struct tm *now_tm)=0;
+};
+
+
+class Item_func_curdate_local :public Item_func_curdate
+{
+public:
+ Item_func_curdate_local() :Item_func_curdate() {}
+ const char *func_name() const { return "curdate"; }
+ void store_now_in_tm(time_t now, struct tm *now_tm);
};
+class Item_func_curdate_utc :public Item_func_curdate
+{
+public:
+ Item_func_curdate_utc() :Item_func_curdate() {}
+ const char *func_name() const { return "utc_date"; }
+ void store_now_in_tm(time_t now, struct tm *now_tm);
+};
+
+
+/* Abstract CURRENT_TIMESTAMP function. See also Item_func_curtime */
+
class Item_func_now :public Item_date_func
{
longlong value;
@@ -400,9 +450,29 @@ public:
longlong val_int() { return value; }
int save_in_field(Field *to, bool no_conversions);
String *val_str(String *str);
- const char *func_name() const { return "now"; }
void fix_length_and_dec();
bool get_date(TIME *res,bool fuzzy_date);
+ virtual void store_now_in_tm(time_t now, struct tm *now_tm)=0;
+};
+
+
+class Item_func_now_local :public Item_func_now
+{
+public:
+ Item_func_now_local() :Item_func_now() {}
+ Item_func_now_local(Item *a) :Item_func_now(a) {}
+ const char *func_name() const { return "now"; }
+ void store_now_in_tm(time_t now, struct tm *now_tm);
+};
+
+
+class Item_func_now_utc :public Item_func_now
+{
+public:
+ Item_func_now_utc() :Item_func_now() {}
+ Item_func_now_utc(Item *a) :Item_func_now(a) {}
+ const char *func_name() const { return "utc_timestamp"; }
+ void store_now_in_tm(time_t now, struct tm *now_tm);
};
diff --git a/sql/lex.h b/sql/lex.h
index 15d33e761ef..24bfe796cc0 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -405,6 +405,9 @@ static SYMBOL symbols[] = {
{ "USE_FRM", SYM(USE_FRM),0,0},
{ "USER", SYM(USER),0,0},
{ "USING", SYM(USING),0,0},
+ { "UTC_DATE", SYM(UTC_DATE_SYM),0,0},
+ { "UTC_TIME", SYM(UTC_TIME_SYM),0,0},
+ { "UTC_TIMESTAMP", SYM(UTC_TIMESTAMP_SYM),0,0},
{ "UPDATE", SYM(UPDATE_SYM),0,0},
{ "USAGE", SYM(USAGE),0,0},
{ "VALUE", SYM(VALUE_SYM),0,0},
diff --git a/sql/share/charsets/Index.xml b/sql/share/charsets/Index.xml
index c5a2ae5dfb6..3661784325c 100644
--- a/sql/share/charsets/Index.xml
+++ b/sql/share/charsets/Index.xml
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding="utf-8"?>
-<charsets max-id="91">
+<charsets max-id="93">
<description>
This file lists all of the available character sets.
@@ -522,6 +522,13 @@ To make maintaining easier please:
</collation>
</charset>
+<charset name="geostd8">
+ <family>South Asian</family>
+ <description>GEOSTD8 Georgian</description>
+ <collation name="geostd8_general_ci" id="92" order="Georgian" flag="primary"/>
+ <collation name="geostd8_bin" id="93" order="Binary" flag="binary"/>
+</charset>
+
<charset name="binary">
<description>Binary pseudo charset</description>
<collation name="binary" id="63" order="Binary">
diff --git a/sql/share/charsets/geostd8.xml b/sql/share/charsets/geostd8.xml
new file mode 100644
index 00000000000..caf01af58d0
--- /dev/null
+++ b/sql/share/charsets/geostd8.xml
@@ -0,0 +1,121 @@
+<?xml version='1.0' encoding="utf-8"?>
+
+<charsets>
+
+<charset name="geostd8">
+
+<ctype>
+<map>
+ 00
+ 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10
+ 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01
+ 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10
+ 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02
+ 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20
+ 00 00 10 00 10 10 10 10 00 10 00 10 00 00 00 00
+ 00 10 10 10 10 10 10 10 00 00 00 10 00 00 00 00
+ 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
+ 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
+ 03 03 03 03 03 03 00 00 00 00 00 00 00 00 00 00
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+</map>
+</ctype>
+
+
+<lower>
+<map>
+ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+ 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
+ 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
+ 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
+ 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
+ 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F
+ 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
+ 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
+ 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
+ 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
+ A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
+ B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
+ C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
+ D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
+ E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
+ F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
+</map>
+</lower>
+
+
+<upper>
+<map>
+ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+ 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
+ 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
+ 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
+ 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
+ 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
+ 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
+ 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F
+ 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
+ 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
+ A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
+ B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
+ C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
+ D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
+ E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
+ F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
+</map>
+</upper>
+
+
+<unicode>
+<map>
+0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F
+0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F
+0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F
+0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F
+0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F
+0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F
+0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F
+20AC 0000 201A 0000 201E 2026 2020 2021 0000 2030 0000 2039 0000 0000 0000 0000
+0000 2018 2019 201C 201D 2022 2013 2014 0000 0000 0000 203A 0000 0000 0000 0000
+00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF
+00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00BA 00BB 00BC 00BD 00BE 00BF
+10D0 10D1 10D2 10D3 10D4 10D5 10D6 10F1 10D7 10D8 10D9 10DA 10DB 10DC 10F2 10DD
+10DE 10DF 10E0 10E1 10E2 10F3 10E3 10E4 10E5 10E6 10E7 10E8 10E9 10EA 10EB 10EC
+10ED 10EE 10F4 10EF 10F0 10F5 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 2116 0000 0000
+</map>
+</unicode>
+
+
+<collation name="geostd8_general_ci">
+<map>
+ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+ 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
+ 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
+ 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
+ 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
+ 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
+ 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
+ 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F
+ 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
+ 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
+ A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
+ B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
+ C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
+ D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
+ E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
+ F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
+</map>
+</collation>
+
+<collation name="geostd8_bin" flag="binary"/>
+
+</charset>
+
+</charsets>
diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc
index 81439a19918..7f70cecdb04 100644
--- a/sql/sql_derived.cc
+++ b/sql/sql_derived.cc
@@ -157,7 +157,8 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit,
is_union && !unit->union_option, 1,
(select_cursor->options | thd->options |
TMP_TABLE_ALL_COLUMNS),
- HA_POS_ERROR)))
+ HA_POS_ERROR,
+ org_table_list->alias)))
{
res= -1;
goto exit;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index e8df7c39c70..694d1148867 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2102,10 +2102,20 @@ mysql_execute_command(THD *thd)
res= mysql_create_like_table(thd, tables, &lex->create_info,
(Table_ident *)lex->name);
else
+ {
+ List_iterator<create_field> fields(lex->create_list);
+ create_field *field;
+ while ((field= fields++))
+ {
+ if (!field->charset)
+ field->charset= lex->create_info.table_charset;
+ field->create_length_to_internal_length();
+ }
res= mysql_create_table(thd,tables->db ? tables->db : thd->db,
tables->real_name, &lex->create_info,
lex->create_list,
lex->key_list,0,0,0); // do logging
+ }
if (!res)
send_ok(thd);
}
@@ -3851,7 +3861,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
break;
case FIELD_TYPE_STRING:
case FIELD_TYPE_VAR_STRING:
- if (new_field->length < MAX_FIELD_WIDTH || default_value)
+ if (new_field->length <= MAX_FIELD_CHARLENGTH || default_value)
break;
/* Convert long CHAR() and VARCHAR columns to TEXT or BLOB */
new_field->sql_type= FIELD_TYPE_BLOB;
@@ -4017,13 +4027,13 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
}
}
- if (new_field->length >= MAX_FIELD_WIDTH ||
+ if (new_field->length > MAX_FIELD_CHARLENGTH ||
(!new_field->length && !(new_field->flags & BLOB_FLAG) &&
type != FIELD_TYPE_STRING &&
type != FIELD_TYPE_VAR_STRING && type != FIELD_TYPE_GEOMETRY))
{
net_printf(thd,ER_TOO_BIG_FIELDLENGTH,field_name,
- MAX_FIELD_WIDTH-1); /* purecov: inspected */
+ MAX_FIELD_CHARLENGTH); /* purecov: inspected */
DBUG_RETURN(1); /* purecov: inspected */
}
type_modifier&= AUTO_INCREMENT_FLAG;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index a75f9ddf3b6..988634fa3d6 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -789,7 +789,8 @@ JOIN::optimize()
group_list && simple_group,
select_options,
(order == 0 || skip_sort_order) ? select_limit :
- HA_POS_ERROR)))
+ HA_POS_ERROR,
+ (char *) "")))
DBUG_RETURN(1);
/*
@@ -1122,7 +1123,8 @@ JOIN::exec()
curr_join->select_distinct &&
!curr_join->group_list,
1, curr_join->select_options,
- HA_POS_ERROR)))
+ HA_POS_ERROR,
+ (char *) "")))
DBUG_VOID_RETURN;
curr_join->exec_tmp_table2= exec_tmp_table2;
}
@@ -4328,7 +4330,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
TABLE *
create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
ORDER *group, bool distinct, bool save_sum_fields,
- ulong select_options, ha_rows rows_limit)
+ ulong select_options, ha_rows rows_limit,
+ char *table_alias)
{
TABLE *table;
uint i,field_count,reclength,null_count,null_pack_length,
@@ -4417,10 +4420,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
table->field=reg_field;
table->blob_field= (Field_blob**) blob_field;
table->real_name=table->path=tmpname;
- /*
- This must be "" as field may refer to it after tempory table is dropped
- */
- table->table_name= (char*) "";
+ table->table_name= table_alias;
table->reginfo.lock_type=TL_WRITE; /* Will be updated */
table->db_stat=HA_OPEN_KEYFILE+HA_OPEN_RNDFILE;
table->blob_ptr_size=mi_portable_sizeof_char_ptr;
diff --git a/sql/sql_select.h b/sql/sql_select.h
index 76960876158..72ea42db87c 100644
--- a/sql/sql_select.h
+++ b/sql/sql_select.h
@@ -274,7 +274,8 @@ void TEST_join(JOIN *join);
bool store_val_in_field(Field *field,Item *val);
TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
ORDER *group, bool distinct, bool save_sum_fields,
- ulong select_options, ha_rows rows_limit);
+ ulong select_options, ha_rows rows_limit,
+ char* alias);
void free_tmp_table(THD *thd, TABLE *entry);
void count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields,
bool reset_with_sum_func);
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index b99dec8f250..198d598ff8e 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -457,12 +457,14 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
else
{
/* Field redefined */
+ sql_field->sql_type= dup_field->sql_type;
+ sql_field->charset= dup_field->charset ? dup_field->charset : create_info->table_charset;
sql_field->length= dup_field->length;
+ sql_field->pack_length= dup_field->pack_length;
+ sql_field->create_length_to_internal_length();
sql_field->decimals= dup_field->decimals;
sql_field->flags= dup_field->flags;
- sql_field->pack_length= dup_field->pack_length;
sql_field->unireg_check= dup_field->unireg_check;
- sql_field->sql_type= dup_field->sql_type;
it2.remove(); // Remove first (create) definition
select_field_pos--;
break;
@@ -480,10 +482,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
while ((sql_field=it++))
{
if (!sql_field->charset)
- sql_field->charset = create_info->table_charset ?
- create_info->table_charset :
- thd->variables.character_set_database;
-
+ sql_field->charset = create_info->table_charset;
switch (sql_field->sql_type) {
case FIELD_TYPE_BLOB:
case FIELD_TYPE_MEDIUM_BLOB:
@@ -1895,18 +1894,42 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
}
/* Full alter table */
+
+ /* let new create options override the old ones */
+ if (!(used_fields & HA_CREATE_USED_MIN_ROWS))
+ create_info->min_rows=table->min_rows;
+ if (!(used_fields & HA_CREATE_USED_MAX_ROWS))
+ create_info->max_rows=table->max_rows;
+ if (!(used_fields & HA_CREATE_USED_AVG_ROW_LENGTH))
+ create_info->avg_row_length=table->avg_row_length;
+ if (!(used_fields & HA_CREATE_USED_CHARSET))
+ create_info->table_charset=table->table_charset;
+
restore_record(table,default_values); // Empty record for DEFAULT
List_iterator<Alter_drop> drop_it(drop_list);
List_iterator<create_field> def_it(fields);
List_iterator<Alter_column> alter_it(alter_list);
List<create_field> create_list; // Add new fields here
List<Key> key_list; // Add new keys here
+ create_field *def;
+
+ /*
+ For each column set charset to the table
+ default if the column charset hasn't been specified
+ explicitely. Change CREATE length into internal length
+ */
+ def_it.rewind();
+ while ((def= def_it++))
+ {
+ if (!def->charset)
+ def->charset= create_info->table_charset;
+ def->create_length_to_internal_length();
+ }
/*
First collect all fields from table which isn't in drop_list
*/
- create_field *def;
Field **f_ptr,*field;
for (f_ptr=table->field ; (field= *f_ptr) ; f_ptr++)
{
@@ -2125,16 +2148,6 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
if (!create_info->comment)
create_info->comment=table->comment;
- /* let new create options override the old ones */
- if (!(used_fields & HA_CREATE_USED_MIN_ROWS))
- create_info->min_rows=table->min_rows;
- if (!(used_fields & HA_CREATE_USED_MAX_ROWS))
- create_info->max_rows=table->max_rows;
- if (!(used_fields & HA_CREATE_USED_AVG_ROW_LENGTH))
- create_info->avg_row_length=table->avg_row_length;
- if (!(used_fields & HA_CREATE_USED_CHARSET))
- create_info->table_charset=table->table_charset;
-
table->file->update_create_info(create_info);
if ((create_info->table_options &
(HA_OPTION_PACK_KEYS | HA_OPTION_NO_PACK_KEYS)) ||
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index 4a61639b3ee..6c3c5350966 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -178,7 +178,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result,
(ORDER*) 0, !union_option,
1, (select_cursor->options | thd->options |
TMP_TABLE_ALL_COLUMNS),
- HA_POS_ERROR)))
+ HA_POS_ERROR, (char*) "")))
goto err;
table->file->extra(HA_EXTRA_WRITE_CACHE);
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
@@ -354,7 +354,8 @@ int st_select_lex_unit::exec()
global_parameters->order_list.elements,
(ORDER*)global_parameters->order_list.first,
(ORDER*) NULL, NULL, (ORDER*) NULL,
- thd->options, result, this, fake_select, 0);
+ thd->options | SELECT_NO_UNLOCK,
+ result, this, fake_select, 0);
if (found_rows_for_union && !res)
thd->limit_found_rows = (ulonglong)table->file->records;
fake_select->exclude();
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 199693df7d6..3fc9f77a8da 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -641,7 +641,8 @@ multi_update::initialize_tables(JOIN *join)
temp_fields,
(ORDER*) &group, 0, 0,
TMP_TABLE_ALL_COLUMNS,
- HA_POS_ERROR)))
+ HA_POS_ERROR,
+ (char *) "")))
DBUG_RETURN(1);
tmp_tables[cnt]->file->extra(HA_EXTRA_WRITE_CACHE);
}
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index a40dcc42183..98746410470 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -527,6 +527,9 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token UNIQUE_USERS
%token UNIX_TIMESTAMP
%token USER
+%token UTC_DATE_SYM
+%token UTC_TIME_SYM
+%token UTC_TIMESTAMP_SYM
%token WEEK_SYM
%token WHEN_SYM
%token WORK_SYM
@@ -1936,7 +1939,8 @@ select:
LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT;
lex->select_lex.resolve_mode= SELECT_LEX::SELECT_MODE;
- };
+ }
+ ;
/* Need select_init2 for subselects. */
select_init:
@@ -2393,12 +2397,12 @@ simple_expr:
| CONCAT_WS '(' expr ',' expr_list ')'
{ $$= new Item_func_concat_ws($3, *$5); }
| CURDATE optional_braces
- { $$= new Item_func_curdate(); Lex->safe_to_cache_query=0; }
+ { $$= new Item_func_curdate_local(); Lex->safe_to_cache_query=0; }
| CURTIME optional_braces
- { $$= new Item_func_curtime(); Lex->safe_to_cache_query=0; }
+ { $$= new Item_func_curtime_local(); Lex->safe_to_cache_query=0; }
| CURTIME '(' expr ')'
{
- $$= new Item_func_curtime($3);
+ $$= new Item_func_curtime_local($3);
Lex->safe_to_cache_query=0;
}
| DATE_ADD_INTERVAL '(' expr ',' interval_expr interval ')'
@@ -2560,9 +2564,9 @@ simple_expr:
{ $$= new Item_func_spatial_collection(* $3,
Geometry::wkbMultiPolygon, Geometry::wkbPolygon ); }
| NOW_SYM optional_braces
- { $$= new Item_func_now(); Lex->safe_to_cache_query=0;}
+ { $$= new Item_func_now_local(); Lex->safe_to_cache_query=0;}
| NOW_SYM '(' expr ')'
- { $$= new Item_func_now($3); Lex->safe_to_cache_query=0;}
+ { $$= new Item_func_now_local($3); Lex->safe_to_cache_query=0;}
| PASSWORD '(' expr ')'
{ $$= new Item_func_password($3); }
| PASSWORD '(' expr ',' expr ')'
@@ -2690,6 +2694,12 @@ simple_expr:
{ $$= new Item_func_unix_timestamp($3); }
| USER '(' ')'
{ $$= new Item_func_user(); Lex->safe_to_cache_query=0; }
+ | UTC_DATE_SYM optional_braces
+ { $$= new Item_func_curdate_utc(); Lex->safe_to_cache_query=0;}
+ | UTC_TIME_SYM optional_braces
+ { $$= new Item_func_curtime_utc(); Lex->safe_to_cache_query=0;}
+ | UTC_TIMESTAMP_SYM optional_braces
+ { $$= new Item_func_now_utc(); Lex->safe_to_cache_query=0;}
| WEEK_SYM '(' expr ')'
{
$$= new Item_func_week($3,new Item_int((char*) "0",
diff --git a/sql/unireg.h b/sql/unireg.h
index 4bbfa8b0fae..4920d4b609a 100644
--- a/sql/unireg.h
+++ b/sql/unireg.h
@@ -58,7 +58,12 @@
#endif
#define MAX_HOSTNAME 61 /* len+1 in mysql.user */
-#define MAX_FIELD_WIDTH 256 /* Max column width +1 */
+#define MAX_MBWIDTH 3 /* Max multibyte sequence */
+#define MAX_FIELD_CHARLENGTH 255
+/* Max column width +1 */
+#define MAX_FIELD_WIDTH (MAX_FIELD_CHARLENGTH*MAX_MBWIDTH+1)
+
+
#define MAX_TABLES (sizeof(table_map)*8-2) /* Max tables in join */
#define OUTER_REF_TABLE_BIT (((table_map) 1) << (sizeof(table_map)*8-2))
#define RAND_TABLE_BIT (((table_map) 1) << (sizeof(table_map)*8-1))