diff --git a/mysql-test/r/ctype_ucs.result b/mysql-test/r/ctype_ucs.result index 15ff85866c1..e58aaa4554f 100644 --- a/mysql-test/r/ctype_ucs.result +++ b/mysql-test/r/ctype_ucs.result @@ -719,3 +719,11 @@ lily river drop table t1; deallocate prepare stmt; +create table t1(a blob, b text charset utf8, c text charset ucs2); +select data_type, character_octet_length, character_maximum_length +from information_schema.columns where table_name='t1'; +data_type character_octet_length character_maximum_length +blob 65535 65535 +text 65535 65535 +text 65535 32767 +drop table t1; diff --git a/mysql-test/r/func_gconcat.result b/mysql-test/r/func_gconcat.result index b0a6d91ee40..23a587ca3a7 100644 --- a/mysql-test/r/func_gconcat.result +++ b/mysql-test/r/func_gconcat.result @@ -626,3 +626,8 @@ latin1 latin1 drop table t1, t2, t3; set names default; +create table t1 (c1 varchar(10), c2 int); +select charset(group_concat(c1 order by c2)) from t1; +charset(group_concat(c1 order by c2)) +latin1 +drop table t1; diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result index 19e68128e74..edbdd6b08da 100644 --- a/mysql-test/r/func_time.result +++ b/mysql-test/r/func_time.result @@ -360,6 +360,42 @@ extract(SECOND FROM "1999-01-02 10:11:12") select extract(MONTH FROM "2001-02-00"); extract(MONTH FROM "2001-02-00") 2 +SELECT EXTRACT(QUARTER FROM '2004-01-15') AS quarter; +quarter +1 +SELECT EXTRACT(QUARTER FROM '2004-02-15') AS quarter; +quarter +1 +SELECT EXTRACT(QUARTER FROM '2004-03-15') AS quarter; +quarter +1 +SELECT EXTRACT(QUARTER FROM '2004-04-15') AS quarter; +quarter +2 +SELECT EXTRACT(QUARTER FROM '2004-05-15') AS quarter; +quarter +2 +SELECT EXTRACT(QUARTER FROM '2004-06-15') AS quarter; +quarter +2 +SELECT EXTRACT(QUARTER FROM '2004-07-15') AS quarter; +quarter +3 +SELECT EXTRACT(QUARTER FROM '2004-08-15') AS quarter; +quarter +3 +SELECT EXTRACT(QUARTER FROM '2004-09-15') AS quarter; +quarter +3 +SELECT EXTRACT(QUARTER FROM '2004-10-15') AS quarter; +quarter +4 +SELECT EXTRACT(QUARTER FROM '2004-11-15') AS quarter; +quarter +4 +SELECT EXTRACT(QUARTER FROM '2004-12-15') AS quarter; +quarter +4 SELECT "1900-01-01 00:00:00" + INTERVAL 2147483648 SECOND; "1900-01-01 00:00:00" + INTERVAL 2147483648 SECOND 1968-01-20 03:14:08 diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index 798efff3003..5e915b5742c 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -1084,14 +1084,6 @@ select 1 from (select 1 from test.t1) a; 1 use test; drop table t1; -create table t1(a blob, b text charset utf8, c text charset ucs2); -select data_type, character_octet_length, character_maximum_length -from information_schema.columns where table_name='t1'; -data_type character_octet_length character_maximum_length -blob 65535 65535 -text 65535 65535 -text 65535 32767 -drop table t1; create table t1 (f1 int(11)); create view v1 as select * from t1; drop table t1; diff --git a/mysql-test/t/ctype_ucs.test b/mysql-test/t/ctype_ucs.test index d4ea8dd57ad..af46b9c385a 100644 --- a/mysql-test/t/ctype_ucs.test +++ b/mysql-test/t/ctype_ucs.test @@ -455,3 +455,11 @@ execute stmt using @param1; select utext from t1 where utext like '%%'; drop table t1; deallocate prepare stmt; + +# +# Bug #14290: character_maximum_length for text fields +# +create table t1(a blob, b text charset utf8, c text charset ucs2); +select data_type, character_octet_length, character_maximum_length + from information_schema.columns where table_name='t1'; +drop table t1; diff --git a/mysql-test/t/func_gconcat.test b/mysql-test/t/func_gconcat.test index 1b88ed90fa3..aa28c9d5f52 100644 --- a/mysql-test/t/func_gconcat.test +++ b/mysql-test/t/func_gconcat.test @@ -414,3 +414,11 @@ select charset(a) from t2; select charset(a) from t3; drop table t1, t2, t3; set names default; + +# +# Bug#18281 group_concat changes charset to binary +# +create table t1 (c1 varchar(10), c2 int); +select charset(group_concat(c1 order by c2)) from t1; +drop table t1; + diff --git a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test index 3a2eea59bed..c98c1c94609 100644 --- a/mysql-test/t/func_time.test +++ b/mysql-test/t/func_time.test @@ -139,6 +139,24 @@ select extract(MINUTE_SECOND FROM "10:11:12"); select extract(SECOND FROM "1999-01-02 10:11:12"); select extract(MONTH FROM "2001-02-00"); +# +# test EXTRACT QUARTER (Bug #18100) +# + +SELECT EXTRACT(QUARTER FROM '2004-01-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-02-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-03-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-04-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-05-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-06-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-07-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-08-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-09-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-10-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-11-15') AS quarter; +SELECT EXTRACT(QUARTER FROM '2004-12-15') AS quarter; + + # # Test big intervals (Bug #3498) # diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test index e06d316f084..c6dd9c7226d 100644 --- a/mysql-test/t/information_schema.test +++ b/mysql-test/t/information_schema.test @@ -742,15 +742,6 @@ select 1 from (select 1 from test.t1) a; use test; drop table t1; -# -# Bug #14290: character_maximum_length for text fields -# - -create table t1(a blob, b text charset utf8, c text charset ucs2); -select data_type, character_octet_length, character_maximum_length - from information_schema.columns where table_name='t1'; -drop table t1; - # # Bug#14476 `information_schema`.`TABLES`.`TABLE_TYPE` with empty value # diff --git a/sql/item_sum.cc b/sql/item_sum.cc index f28f8b668e2..bb919bd1f13 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -3249,7 +3249,10 @@ Item_func_group_concat::fix_fields(THD *thd, Item **ref) } if (agg_item_charsets(collation, func_name(), - args, arg_count, MY_COLL_ALLOW_CONV)) + args, + /* skip charset aggregation for order columns */ + arg_count - arg_count_order, + MY_COLL_ALLOW_CONV)) return 1; result.set_charset(collation.collation); diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 7ee206a4195..24daa08220c 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -2168,7 +2168,7 @@ longlong Item_extract::val_int() switch (int_type) { case INTERVAL_YEAR: return ltime.year; case INTERVAL_YEAR_MONTH: return ltime.year*100L+ltime.month; - case INTERVAL_QUARTER: return ltime.month/3 + 1; + case INTERVAL_QUARTER: return (ltime.month+2)/3; case INTERVAL_MONTH: return ltime.month; case INTERVAL_WEEK: { diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc index aac47707d1b..d4e7745551a 100644 --- a/sql/opt_sum.cc +++ b/sql/opt_sum.cc @@ -123,8 +123,11 @@ int opt_sum_query(TABLE_LIST *tables, List &all_fields,COND *conds) If the storage manager of 'tl' gives exact row count, compute the total number of rows. If there are no outer table dependencies, this count may be used as the real count. + Schema tables are filled after this function is invoked, so we can't + get row count */ - if (tl->table->file->table_flags() & HA_NOT_EXACT_COUNT) + if ((tl->table->file->table_flags() & HA_NOT_EXACT_COUNT) || + tl->schema_table) { is_exact_count= FALSE; count= 1; // ensure count != 0 @@ -149,31 +152,15 @@ int opt_sum_query(TABLE_LIST *tables, List &all_fields,COND *conds) switch (item_sum->sum_func()) { case Item_sum::COUNT_FUNC: /* - If the expr in count(expr) can never be null we can change this + If the expr in COUNT(expr) can never be null we can change this to the number of rows in the tables if this number is exact and there are no outer joins. */ if (!conds && !((Item_sum_count*) item)->args[0]->maybe_null && !outer_tables && is_exact_count) { - longlong count= 1; - TABLE_LIST *table; - for (table= tables; table; table= table->next_leaf) - { - if (outer_tables || (table->table->file->table_flags() & - HA_NOT_EXACT_COUNT) || table->schema_table) - { - const_result= 0; // Can't optimize left join - break; - } - tables->table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK); - count*= table->table->file->records; - } - if (!table) - { - ((Item_sum_count*) item)->make_const(count); - recalc_const_item= 1; - } + ((Item_sum_count*) item)->make_const(count); + recalc_const_item= 1; } else const_result= 0; diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh index 1892e8b4a46..bf17375c0eb 100644 --- a/support-files/mysql.server.sh +++ b/support-files/mysql.server.sh @@ -72,6 +72,10 @@ else libexecdir="$basedir/libexec" fi +# datadir_set is used to determine if datadir was set (and so should be +# *not* set inside of the --basedir= handler.) +datadir_set= + # # Use LSB init script functions for printing messages, if possible # @@ -105,11 +109,15 @@ parse_server_arguments() { case "$arg" in --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` bindir="$basedir/bin" - datadir="$basedir/data" + if test -z "$datadir_set"; then + datadir="$basedir/data" + fi sbindir="$basedir/sbin" libexecdir="$basedir/libexec" ;; - --datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; + --datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'` + datadir_set=1 + ;; --user=*) user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; --pid-file=*) server_pid_file=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; --use-mysqld_safe) use_mysqld_safe=1;;