Commit 45ad9919 authored by unknown's avatar unknown

Merge laptop.sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.1

into laptop.sanja.is.com.ua:/home/bell/mysql/bk/work-collation-4.1
parents 83ad7aee caa8b467
...@@ -254,3 +254,18 @@ ERROR 42000: This version of MySQL doesn't yet support 'CUBE' ...@@ -254,3 +254,18 @@ ERROR 42000: This version of MySQL doesn't yet support 'CUBE'
select product, country_id , year, sum(profit) from t1 group by product, country_id, year with cube union all select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup; select product, country_id , year, sum(profit) from t1 group by product, country_id, year with cube union all select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup;
ERROR 42000: This version of MySQL doesn't yet support 'CUBE' ERROR 42000: This version of MySQL doesn't yet support 'CUBE'
drop table t1,t2; drop table t1,t2;
CREATE TABLE t1 (i int);
INSERT INTO t1 VALUES(100);
CREATE TABLE t2 (i int);
INSERT INTO t2 VALUES (100),(200);
SELECT i, COUNT(*) FROM t1 GROUP BY i WITH ROLLUP;
i COUNT(*)
100 1
NULL 1
SELECT t1.i, t2.i, COUNT(*) FROM t1,t2 GROUP BY t1.i,t2.i WITH ROLLUP;
i i COUNT(*)
100 100 1
100 200 1
100 NULL 2
NULL NULL 2
drop table t1,t2;
...@@ -15,7 +15,3 @@ truncate table t1; ...@@ -15,7 +15,3 @@ truncate table t1;
load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',' LINES STARTING BY ',' (b,c,d); load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',' LINES STARTING BY ',' (b,c,d);
SELECT * from t1; SELECT * from t1;
drop table t1; drop table t1;
...@@ -77,3 +77,14 @@ select product, country_id , year, sum(profit) from t1 group by product, country ...@@ -77,3 +77,14 @@ select product, country_id , year, sum(profit) from t1 group by product, country
drop table t1,t2; drop table t1,t2;
#
# Test bug with const tables
#
CREATE TABLE t1 (i int);
INSERT INTO t1 VALUES(100);
CREATE TABLE t2 (i int);
INSERT INTO t2 VALUES (100),(200);
SELECT i, COUNT(*) FROM t1 GROUP BY i WITH ROLLUP;
SELECT t1.i, t2.i, COUNT(*) FROM t1,t2 GROUP BY t1.i,t2.i WITH ROLLUP;
drop table t1,t2;
...@@ -24,26 +24,26 @@ ...@@ -24,26 +24,26 @@
/* My memory allocator */ /* My memory allocator */
gptr my_malloc(unsigned int Size, myf MyFlags) gptr my_malloc(unsigned int size, myf my_flags)
{ {
gptr point; gptr point;
DBUG_ENTER("my_malloc"); DBUG_ENTER("my_malloc");
DBUG_PRINT("my",("Size: %u MyFlags: %d",Size, MyFlags)); DBUG_PRINT("my",("size: %u my_flags: %d",size, my_flags));
if (!Size) if (!size)
Size=1; /* Safety */ size=1; /* Safety */
if ((point = (char*)malloc(Size)) == NULL) if ((point = (char*)malloc(size)) == NULL)
{ {
my_errno=errno; my_errno=errno;
if (MyFlags & MY_FAE) if (my_flags & MY_FAE)
error_handler_hook=fatal_error_handler_hook; error_handler_hook=fatal_error_handler_hook;
if (MyFlags & (MY_FAE+MY_WME)) if (my_flags & (MY_FAE+MY_WME))
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),Size); my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),size);
if (MyFlags & MY_FAE) if (my_flags & MY_FAE)
exit(1); exit(1);
} }
else if (MyFlags & MY_ZEROFILL) else if (my_flags & MY_ZEROFILL)
bzero(point,Size); bzero(point,size);
DBUG_PRINT("exit",("ptr: %lx",point)); DBUG_PRINT("exit",("ptr: %lx",point));
DBUG_RETURN(point); DBUG_RETURN(point);
} /* my_malloc */ } /* my_malloc */
...@@ -64,29 +64,29 @@ void my_no_flags_free(gptr ptr) ...@@ -64,29 +64,29 @@ void my_no_flags_free(gptr ptr)
/* malloc and copy */ /* malloc and copy */
gptr my_memdup(const byte *from, uint length, myf MyFlags) gptr my_memdup(const byte *from, uint length, myf my_flags)
{ {
gptr ptr; gptr ptr;
if ((ptr=my_malloc(length,MyFlags)) != 0) if ((ptr=my_malloc(length,my_flags)) != 0)
memcpy((byte*) ptr, (byte*) from,(size_t) length); memcpy((byte*) ptr, (byte*) from,(size_t) length);
return(ptr); return(ptr);
} }
char *my_strdup(const char *from, myf MyFlags) char *my_strdup(const char *from, myf my_flags)
{ {
gptr ptr; gptr ptr;
uint length=(uint) strlen(from)+1; uint length=(uint) strlen(from)+1;
if ((ptr=my_malloc(length,MyFlags)) != 0) if ((ptr=my_malloc(length,my_flags)) != 0)
memcpy((byte*) ptr, (byte*) from,(size_t) length); memcpy((byte*) ptr, (byte*) from,(size_t) length);
return((my_string) ptr); return((my_string) ptr);
} }
char *my_strdup_with_length(const byte *from, uint length, myf MyFlags) char *my_strdup_with_length(const byte *from, uint length, myf my_flags)
{ {
gptr ptr; gptr ptr;
if ((ptr=my_malloc(length+1,MyFlags)) != 0) if ((ptr=my_malloc(length+1,my_flags)) != 0)
{ {
memcpy((byte*) ptr, (byte*) from,(size_t) length); memcpy((byte*) ptr, (byte*) from,(size_t) length);
((char*) ptr)[length]=0; ((char*) ptr)[length]=0;
......
...@@ -23,40 +23,41 @@ ...@@ -23,40 +23,41 @@
/* My memory re allocator */ /* My memory re allocator */
gptr my_realloc(gptr oldpoint, uint Size, myf MyFlags) gptr my_realloc(gptr oldpoint, uint size, myf my_flags)
{ {
gptr point; gptr point;
DBUG_ENTER("my_realloc"); DBUG_ENTER("my_realloc");
DBUG_PRINT("my",("ptr: %lx Size: %u MyFlags: %d",oldpoint, Size, MyFlags)); DBUG_PRINT("my",("ptr: %lx size: %u my_flags: %d",oldpoint, size,
my_flags));
if (!oldpoint && (MyFlags & MY_ALLOW_ZERO_PTR)) if (!oldpoint && (my_flags & MY_ALLOW_ZERO_PTR))
DBUG_RETURN(my_malloc(Size,MyFlags)); DBUG_RETURN(my_malloc(size,my_flags));
#ifdef USE_HALLOC #ifdef USE_HALLOC
if (!(point = malloc(Size))) if (!(point = malloc(size)))
{ {
if (MyFlags & MY_FREE_ON_ERROR) if (my_flags & MY_FREE_ON_ERROR)
my_free(oldpoint,MyFlags); my_free(oldpoint,my_flags);
if (MyFlags & MY_HOLD_ON_ERROR) if (my_flags & MY_HOLD_ON_ERROR)
DBUG_RETURN(oldpoint); DBUG_RETURN(oldpoint);
my_errno=errno; my_errno=errno;
if (MyFlags & MY_FAE+MY_WME) if (my_flags & MY_FAE+MY_WME)
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),Size); my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),size);
} }
else else
{ {
memcpy(point,oldpoint,Size); memcpy(point,oldpoint,size);
free(oldpoint); free(oldpoint);
} }
#else #else
if ((point = (char*)realloc(oldpoint,Size)) == NULL) if ((point = (char*)realloc(oldpoint,size)) == NULL)
{ {
if (MyFlags & MY_FREE_ON_ERROR) if (my_flags & MY_FREE_ON_ERROR)
my_free(oldpoint,MyFLAGS); my_free(oldpoint,MyFLAGS);
if (MyFlags & MY_HOLD_ON_ERROR) if (my_flags & MY_HOLD_ON_ERROR)
DBUG_RETURN(oldpoint); DBUG_RETURN(oldpoint);
my_errno=errno; my_errno=errno;
if (MyFlags & (MY_FAE+MY_WME)) if (my_flags & (MY_FAE+MY_WME))
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG), Size); my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG), size);
} }
#endif #endif
DBUG_PRINT("exit",("ptr: %lx",point)); DBUG_PRINT("exit",("ptr: %lx",point));
......
...@@ -587,7 +587,7 @@ net_safe_read(MYSQL *mysql) ...@@ -587,7 +587,7 @@ net_safe_read(MYSQL *mysql)
DBUG_PRINT("error",("Wrong connection or packet. fd: %s len: %d", DBUG_PRINT("error",("Wrong connection or packet. fd: %s len: %d",
vio_description(net->vio),len)); vio_description(net->vio),len));
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
if (socket_errno == SOCKET_EINTR) if (vio_errno(net->vio) == SOCKET_EINTR)
return (packet_error); return (packet_error);
#endif /*MYSQL_SERVER*/ #endif /*MYSQL_SERVER*/
end_server(mysql); end_server(mysql);
......
...@@ -117,10 +117,8 @@ static Item* part_of_refkey(TABLE *form,Field *field); ...@@ -117,10 +117,8 @@ static Item* part_of_refkey(TABLE *form,Field *field);
static uint find_shortest_key(TABLE *table, key_map usable_keys); static uint find_shortest_key(TABLE *table, key_map usable_keys);
static bool test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order, static bool test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,
ha_rows select_limit, bool no_changes); ha_rows select_limit, bool no_changes);
static int create_sort_index(THD *thd, JOIN_TAB *tab,ORDER *order, static int create_sort_index(THD *thd, JOIN *join, ORDER *order,
ha_rows filesort_limit, ha_rows select_limit); ha_rows filesort_limit, ha_rows select_limit);
static int create_sort_index(THD *thd, JOIN_TAB *tab,ORDER *order,
ha_rows select_limit);
static int remove_duplicates(JOIN *join,TABLE *entry,List<Item> &fields, static int remove_duplicates(JOIN *join,TABLE *entry,List<Item> &fields,
Item *having); Item *having);
static int remove_dup_with_compare(THD *thd, TABLE *entry, Field **field, static int remove_dup_with_compare(THD *thd, TABLE *entry, Field **field,
...@@ -916,7 +914,7 @@ JOIN::optimize() ...@@ -916,7 +914,7 @@ JOIN::optimize()
{ {
DBUG_PRINT("info",("Sorting for group")); DBUG_PRINT("info",("Sorting for group"));
thd->proc_info="Sorting for group"; thd->proc_info="Sorting for group";
if (create_sort_index(thd, &join_tab[const_tables], group_list, if (create_sort_index(thd, this, group_list,
HA_POS_ERROR, HA_POS_ERROR) || HA_POS_ERROR, HA_POS_ERROR) ||
alloc_group_fields(this, group_list) || alloc_group_fields(this, group_list) ||
make_sum_func_list(all_fields, fields_list, 1)) make_sum_func_list(all_fields, fields_list, 1))
...@@ -931,7 +929,7 @@ JOIN::optimize() ...@@ -931,7 +929,7 @@ JOIN::optimize()
{ {
DBUG_PRINT("info",("Sorting for order")); DBUG_PRINT("info",("Sorting for order"));
thd->proc_info="Sorting for order"; thd->proc_info="Sorting for order";
if (create_sort_index(thd, &join_tab[const_tables], order, if (create_sort_index(thd, this, order,
HA_POS_ERROR, HA_POS_ERROR)) HA_POS_ERROR, HA_POS_ERROR))
DBUG_RETURN(1); DBUG_RETURN(1);
order=0; order=0;
...@@ -1235,7 +1233,7 @@ JOIN::exec() ...@@ -1235,7 +1233,7 @@ JOIN::exec()
if (curr_join->group_list) if (curr_join->group_list)
{ {
thd->proc_info= "Creating sort index"; thd->proc_info= "Creating sort index";
if (create_sort_index(thd, curr_join->join_tab, curr_join->group_list, if (create_sort_index(thd, curr_join, curr_join->group_list,
HA_POS_ERROR, HA_POS_ERROR) || HA_POS_ERROR, HA_POS_ERROR) ||
make_group_fields(this, curr_join)) make_group_fields(this, curr_join))
{ {
...@@ -1416,7 +1414,7 @@ JOIN::exec() ...@@ -1416,7 +1414,7 @@ JOIN::exec()
} }
} }
} }
if (create_sort_index(thd, &curr_join->join_tab[curr_join->const_tables], if (create_sort_index(thd, curr_join,
curr_join->group_list ? curr_join->group_list ?
curr_join->group_list : curr_join->order, curr_join->group_list : curr_join->order,
curr_join->select_limit, unit->select_limit_cnt)) curr_join->select_limit, unit->select_limit_cnt))
...@@ -6770,16 +6768,23 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit, ...@@ -6770,16 +6768,23 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
*/ */
static int static int
create_sort_index(THD *thd, JOIN_TAB *tab, ORDER *order, create_sort_index(THD *thd, JOIN *join, ORDER *order,
ha_rows filesort_limit, ha_rows select_limit) ha_rows filesort_limit, ha_rows select_limit)
{ {
SORT_FIELD *sortorder; SORT_FIELD *sortorder;
uint length; uint length;
ha_rows examined_rows; ha_rows examined_rows;
TABLE *table=tab->table; TABLE *table;
SQL_SELECT *select=tab->select; SQL_SELECT *select;
JOIN_TAB *tab;
DBUG_ENTER("create_sort_index"); DBUG_ENTER("create_sort_index");
if (join->tables == join->const_tables)
DBUG_RETURN(0); // One row, no need to sort
tab= join->join_tab + join->const_tables;
table= tab->table;
select= tab->select;
if (test_if_skip_sort_order(tab,order,select_limit,0)) if (test_if_skip_sort_order(tab,order,select_limit,0))
DBUG_RETURN(0); DBUG_RETURN(0);
if (!(sortorder=make_unireg_sortorder(order,&length))) if (!(sortorder=make_unireg_sortorder(order,&length)))
......
...@@ -4380,6 +4380,7 @@ keyword: ...@@ -4380,6 +4380,7 @@ keyword:
| BOOL_SYM {} | BOOL_SYM {}
| BOOLEAN_SYM {} | BOOLEAN_SYM {}
| BYTE_SYM {} | BYTE_SYM {}
| BTREE_SYM {}
| CACHE_SYM {} | CACHE_SYM {}
| CHANGED {} | CHANGED {}
| CHARSET {} | CHARSET {}
...@@ -4425,6 +4426,7 @@ keyword: ...@@ -4425,6 +4426,7 @@ keyword:
| GRANTS {} | GRANTS {}
| GLOBAL_SYM {} | GLOBAL_SYM {}
| HANDLER_SYM {} | HANDLER_SYM {}
| HASH_SYM {}
| HEAP_SYM {} | HEAP_SYM {}
| HELP_SYM {} | HELP_SYM {}
| HOSTS_SYM {} | HOSTS_SYM {}
...@@ -4507,6 +4509,7 @@ keyword: ...@@ -4507,6 +4509,7 @@ keyword:
| ROWS_SYM {} | ROWS_SYM {}
| ROW_FORMAT_SYM {} | ROW_FORMAT_SYM {}
| ROW_SYM {} | ROW_SYM {}
| RTREE_SYM {}
| SAVEPOINT_SYM {} | SAVEPOINT_SYM {}
| SECOND_SYM {} | SECOND_SYM {}
| SERIAL_SYM {} | SERIAL_SYM {}
......
...@@ -1207,17 +1207,14 @@ bool get_field(MEM_ROOT *mem, Field *field, String *res) ...@@ -1207,17 +1207,14 @@ bool get_field(MEM_ROOT *mem, Field *field, String *res)
char *get_field(MEM_ROOT *mem, Field *field) char *get_field(MEM_ROOT *mem, Field *field)
{ {
char buff[MAX_FIELD_WIDTH], *to; char buff[MAX_FIELD_WIDTH];
String str(buff,sizeof(buff),&my_charset_bin); String str(buff,sizeof(buff),&my_charset_bin);
uint length; uint length;
field->val_str(&str,&str); field->val_str(&str,&str);
if (!(length= str.length())) if (!(length= str.length()))
return NullS; return NullS;
to= (char*) alloc_root(mem,length+1); return strmake_root(mem, str.ptr(), length);
memcpy(to, str.ptr(), (uint) length);
to[length]=0;
return to;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment