Commit ff260809 authored by Sinisa@sinisa.nasamreza.org's avatar Sinisa@sinisa.nasamreza.org

Merge sinisa@work.mysql.com:/home/bk/mysql-4.0

into sinisa.nasamreza.org:/mnt/work/mysql-4.0
parents 8a4502f1 c5738005
...@@ -81,7 +81,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc \ ...@@ -81,7 +81,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc \
sql_udf.cc sql_analyse.cc sql_analyse.h sql_cache.cc \ sql_udf.cc sql_analyse.cc sql_analyse.h sql_cache.cc \
slave.cc sql_repl.cc sql_union.cc \ slave.cc sql_repl.cc sql_union.cc \
mini_client.cc mini_client_errors.c \ mini_client.cc mini_client_errors.c \
stacktrace.c repl_failsafe.h repl_failsafe.cc stacktrace.c repl_failsafe.h repl_failsafe.cc sql_olap.cc
gen_lex_hash_SOURCES = gen_lex_hash.cc gen_lex_hash_SOURCES = gen_lex_hash.cc
gen_lex_hash_LDADD = $(LDADD) $(CXXLDFLAGS) gen_lex_hash_LDADD = $(LDADD) $(CXXLDFLAGS)
......
...@@ -98,6 +98,7 @@ static SYMBOL symbols[] = { ...@@ -98,6 +98,7 @@ static SYMBOL symbols[] = {
{ "CONSTRAINT", SYM(CONSTRAINT),0,0}, { "CONSTRAINT", SYM(CONSTRAINT),0,0},
{ "CREATE", SYM(CREATE),0,0}, { "CREATE", SYM(CREATE),0,0},
{ "CROSS", SYM(CROSS),0,0}, { "CROSS", SYM(CROSS),0,0},
{ "CUBE", SYM(CUBE),0,0},
{ "CURRENT_DATE", SYM(CURDATE),0,0}, { "CURRENT_DATE", SYM(CURDATE),0,0},
{ "CURRENT_TIME", SYM(CURTIME),0,0}, { "CURRENT_TIME", SYM(CURTIME),0,0},
{ "CURRENT_TIMESTAMP", SYM(NOW_SYM),0,0}, { "CURRENT_TIMESTAMP", SYM(NOW_SYM),0,0},
...@@ -303,6 +304,7 @@ static SYMBOL symbols[] = { ...@@ -303,6 +304,7 @@ static SYMBOL symbols[] = {
{ "RIGHT", SYM(RIGHT),0,0}, { "RIGHT", SYM(RIGHT),0,0},
{ "RLIKE", SYM(REGEXP),0,0}, /* Like in mSQL2 */ { "RLIKE", SYM(REGEXP),0,0}, /* Like in mSQL2 */
{ "ROLLBACK", SYM(ROLLBACK_SYM),0,0}, { "ROLLBACK", SYM(ROLLBACK_SYM),0,0},
{ "ROLLUP", SYM(ROLLUP),0,0},
{ "ROW", SYM(ROW_SYM),0,0}, { "ROW", SYM(ROW_SYM),0,0},
{ "ROWS", SYM(ROWS_SYM),0,0}, { "ROWS", SYM(ROWS_SYM),0,0},
{ "SECOND", SYM(SECOND_SYM),0,0}, { "SECOND", SYM(SECOND_SYM),0,0},
......
...@@ -2873,7 +2873,7 @@ static struct my_option my_long_options[] = ...@@ -2873,7 +2873,7 @@ static struct my_option my_long_options[] =
"Tells the master that updates to the given database should not be logged tothe binary log", "Tells the master that updates to the given database should not be logged tothe binary log",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"bind-address", OPT_BIND_ADDRESS, "Ip address to bind to", {"bind-address", OPT_BIND_ADDRESS, "Ip address to bind to",
(gptr*) &my_bind_addr, (gptr*) &my_bind_addr, 0, GET_ULONG, REQUIRED_ARG, 0, (gptr*) &my_bind_addr, (gptr*) &my_bind_addr, 0, GET_STR, REQUIRED_ARG, 0,
0, 0, 0, 0, 0}, 0, 0, 0, 0, 0},
{"bootstrap", OPT_BOOTSTRAP, "Used by mysql installation scripts", 0, 0, 0, {"bootstrap", OPT_BOOTSTRAP, "Used by mysql installation scripts", 0, 0, 0,
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
......
...@@ -89,7 +89,12 @@ typedef struct st_lex_master_info ...@@ -89,7 +89,12 @@ typedef struct st_lex_master_info
enum sub_select_type enum sub_select_type
{ {
UNSPECIFIED_TYPE, UNION_TYPE, INTERSECT_TYPE, EXCEPT_TYPE, NOT_A_SELECT UNSPECIFIED_TYPE, UNION_TYPE, INTERSECT_TYPE, EXCEPT_TYPE, OLAP_TYPE, NOT_A_SELECT
};
enum olap_type
{
NON_EXISTING_ONE, CUBE_TYPE, ROLLUP_TYPE
}; };
/* The state of the lex parsing for selects */ /* The state of the lex parsing for selects */
...@@ -97,6 +102,7 @@ enum sub_select_type ...@@ -97,6 +102,7 @@ enum sub_select_type
typedef struct st_select_lex typedef struct st_select_lex
{ {
enum sub_select_type linkage; enum sub_select_type linkage;
enum olap_type olap;
char *db,*db1,*table1,*db2,*table2; /* For outer join using .. */ char *db,*db1,*table1,*db2,*table2; /* For outer join using .. */
Item *where,*having; Item *where,*having;
ha_rows select_limit,offset_limit; ha_rows select_limit,offset_limit;
...@@ -133,7 +139,7 @@ typedef struct st_lex ...@@ -133,7 +139,7 @@ typedef struct st_lex
{ {
uint yylineno,yytoklen; /* Simulate lex */ uint yylineno,yytoklen; /* Simulate lex */
LEX_YYSTYPE yylval; LEX_YYSTYPE yylval;
SELECT_LEX select_lex, *select; SELECT_LEX select_lex, *select, *last_selects;
uchar *ptr,*tok_start,*tok_end,*end_of_query; uchar *ptr,*tok_start,*tok_end,*end_of_query;
char *length,*dec,*change,*name; char *length,*dec,*change,*name;
char *backup_dir; /* For RESTORE/BACKUP */ char *backup_dir; /* For RESTORE/BACKUP */
...@@ -179,7 +185,7 @@ typedef struct st_lex ...@@ -179,7 +185,7 @@ typedef struct st_lex
uint grant,grant_tot_col,which_columns, union_option; uint grant,grant_tot_col,which_columns, union_option;
thr_lock_type lock_option; thr_lock_type lock_option;
bool drop_primary,drop_if_exists,local_file; bool drop_primary,drop_if_exists,local_file;
bool in_comment,ignore_space,verbose,simple_alter, option_type; bool in_comment,ignore_space,verbose,simple_alter, option_type, olap;
uint slave_thd_opt; uint slave_thd_opt;
} LEX; } LEX;
......
...@@ -2730,7 +2730,9 @@ mysql_init_select(LEX *lex) ...@@ -2730,7 +2730,9 @@ mysql_init_select(LEX *lex)
select_lex->offset_limit=0; select_lex->offset_limit=0;
select_lex->options=0; select_lex->options=0;
select_lex->linkage=UNSPECIFIED_TYPE; select_lex->linkage=UNSPECIFIED_TYPE;
select_lex->olap= NON_EXISTING_ONE;
lex->exchange = 0; lex->exchange = 0;
lex->olap = 0;
lex->proc_list.first=0; lex->proc_list.first=0;
select_lex->order_list.elements=select_lex->group_list.elements=0; select_lex->order_list.elements=select_lex->group_list.elements=0;
select_lex->order_list.first=0; select_lex->order_list.first=0;
...@@ -3272,6 +3274,7 @@ static bool create_total_list(THD *thd, LEX *lex, TABLE_LIST **result) ...@@ -3272,6 +3274,7 @@ static bool create_total_list(THD *thd, LEX *lex, TABLE_LIST **result)
for (; aux; aux=next) for (; aux; aux=next)
{ {
TABLE_LIST *cursor; TABLE_LIST *cursor;
aux->do_redirect=true;
next= aux->next; next= aux->next;
for (cursor= *result; cursor; cursor=cursor->next) for (cursor= *result; cursor; cursor=cursor->next)
if (!strcmp(cursor->db,aux->db) && if (!strcmp(cursor->db,aux->db) &&
......
...@@ -146,7 +146,7 @@ static bool update_sum_func(Item_sum **func); ...@@ -146,7 +146,7 @@ static bool update_sum_func(Item_sum **func);
static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
bool distinct, const char *message=NullS); bool distinct, const char *message=NullS);
static void describe_info(JOIN *join, const char *info); static void describe_info(JOIN *join, const char *info);
extern int handle_olaps(LEX *lex, SELECT_LEX *select);
/* /*
This handles SELECT with and without UNION This handles SELECT with and without UNION
*/ */
...@@ -155,6 +155,23 @@ int handle_select(THD *thd, LEX *lex, select_result *result) ...@@ -155,6 +155,23 @@ int handle_select(THD *thd, LEX *lex, select_result *result)
{ {
int res; int res;
register SELECT_LEX *select_lex = &lex->select_lex; register SELECT_LEX *select_lex = &lex->select_lex;
if (lex->olap)
{
SELECT_LEX *sl, *last_sl;
int returned;
for (sl= &lex->select_lex;sl;sl=sl->next)
{
if (sl->olap != NON_EXISTING_ONE)
{
last_sl=sl->next;
if ((returned=handle_olaps(lex,sl)))
return returned;
lex->last_selects->next=sl=last_sl;
if (!sl) break;
}
}
lex->select = select_lex;
}
if (select_lex->next) if (select_lex->next)
res=mysql_union(thd,lex,result); res=mysql_union(thd,lex,result);
else else
......
...@@ -49,7 +49,13 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) ...@@ -49,7 +49,13 @@ int mysql_union(THD *thd, LEX *lex,select_result *result)
for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first;
cursor; cursor;
cursor=cursor->next) cursor=cursor->next)
{
if (cursor->do_redirect)
{
cursor->table= ((TABLE_LIST*) cursor->table)->table; cursor->table= ((TABLE_LIST*) cursor->table)->table;
cursor->do_redirect=false;
}
}
} }
/* last_sel now points at the last select where the ORDER BY is stored */ /* last_sel now points at the last select where the ORDER BY is stored */
......
...@@ -109,6 +109,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); ...@@ -109,6 +109,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token COUNT_SYM %token COUNT_SYM
%token CREATE %token CREATE
%token CROSS %token CROSS
%token CUBE
%token DELETE_SYM %token DELETE_SYM
%token DO_SYM %token DO_SYM
%token DROP %token DROP
...@@ -130,6 +131,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); ...@@ -130,6 +131,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token REPLICATION %token REPLICATION
%token RESET_SYM %token RESET_SYM
%token ROLLBACK_SYM %token ROLLBACK_SYM
%token ROLLUP
%token SELECT_SYM %token SELECT_SYM
%token SHOW %token SHOW
%token SLAVE %token SLAVE
...@@ -2160,7 +2162,7 @@ opt_escape: ...@@ -2160,7 +2162,7 @@ opt_escape:
group_clause: group_clause:
/* empty */ /* empty */
| GROUP BY group_list; | GROUP BY group_list olap_opt;
group_list: group_list:
group_list ',' order_ident order_dir group_list ',' order_ident order_dir
...@@ -2168,6 +2170,19 @@ group_list: ...@@ -2168,6 +2170,19 @@ group_list:
| order_ident order_dir | order_ident order_dir
{ if (add_group_to_list($1,(bool) $2)) YYABORT; }; { if (add_group_to_list($1,(bool) $2)) YYABORT; };
olap_opt:
/* empty */ {}
| WITH CUBE
{
Lex->olap = true;
Select->olap= CUBE_TYPE;
}
| WITH ROLLUP
{
Lex->olap = true;
Select->olap= ROLLUP_TYPE;
}
/* /*
Order by statement in select Order by statement in select
*/ */
...@@ -2180,7 +2195,7 @@ order_clause: ...@@ -2180,7 +2195,7 @@ order_clause:
ORDER_SYM BY ORDER_SYM BY
{ {
LEX *lex=Lex; LEX *lex=Lex;
if (lex->sql_command == SQLCOM_MULTI_UPDATE) if (lex->sql_command == SQLCOM_MULTI_UPDATE || lex->olap)
YYABORT; YYABORT;
lex->select->sort_default=1; lex->select->sort_default=1;
} order_list; } order_list;
...@@ -2201,12 +2216,16 @@ limit_clause: ...@@ -2201,12 +2216,16 @@ limit_clause:
/* empty */ {} /* empty */ {}
| LIMIT ULONG_NUM | LIMIT ULONG_NUM
{ {
if (Lex->olap)
YYABORT;
SELECT_LEX *sel=Select; SELECT_LEX *sel=Select;
sel->select_limit= $2; sel->select_limit= $2;
sel->offset_limit=0L; sel->offset_limit=0L;
} }
| LIMIT ULONG_NUM ',' ULONG_NUM | LIMIT ULONG_NUM ',' ULONG_NUM
{ {
if (Lex->olap)
YYABORT;
SELECT_LEX *sel=Select; SELECT_LEX *sel=Select;
sel->select_limit= $4; sel->offset_limit=$2; sel->select_limit= $4; sel->offset_limit=$2;
}; };
...@@ -3024,6 +3043,7 @@ keyword: ...@@ -3024,6 +3043,7 @@ keyword:
| COMMIT_SYM {} | COMMIT_SYM {}
| COMPRESSED_SYM {} | COMPRESSED_SYM {}
| CONCURRENT {} | CONCURRENT {}
| CUBE {}
| DATA_SYM {} | DATA_SYM {}
| DATETIME {} | DATETIME {}
| DATE_SYM {} | DATE_SYM {}
...@@ -3117,6 +3137,7 @@ keyword: ...@@ -3117,6 +3137,7 @@ keyword:
| RESOURCES {} | RESOURCES {}
| RESTORE_SYM {} | RESTORE_SYM {}
| ROLLBACK_SYM {} | ROLLBACK_SYM {}
| ROLLUP {}
| ROWS_SYM {} | ROWS_SYM {}
| ROW_FORMAT_SYM {} | ROW_FORMAT_SYM {}
| ROW_SYM {} | ROW_SYM {}
......
...@@ -151,6 +151,7 @@ typedef struct st_table_list ...@@ -151,6 +151,7 @@ typedef struct st_table_list
bool straight; /* optimize with prev table */ bool straight; /* optimize with prev table */
bool updating; /* for replicate-do/ignore table */ bool updating; /* for replicate-do/ignore table */
bool shared; /* Used twice in union */ bool shared; /* Used twice in union */
bool do_redirect; /* To get the struct in UNION's */
} TABLE_LIST; } TABLE_LIST;
......
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