Just making commit in order to stop getting erors.
Will do a push when it starts working ..
This commit is contained in:
parent
6377f501df
commit
c5738005c4
@ -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[] = {
|
|||||||
{ "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[] = {
|
|||||||
{ "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},
|
||||||
|
@ -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
|
|||||||
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
|
|||||||
{
|
{
|
||||||
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 */
|
||||||
@ -178,7 +184,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;
|
||||||
|
|
||||||
|
@ -2728,7 +2728,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;
|
||||||
@ -3270,6 +3272,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);
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
||||||
cursor->table= ((TABLE_LIST*) cursor->table)->table;
|
{
|
||||||
|
if (cursor->do_redirect)
|
||||||
|
{
|
||||||
|
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);
|
|||||||
%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);
|
|||||||
%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:
|
|||||||
|
|
||||||
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:
|
|||||||
| 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:
|
|||||||
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:
|
|||||||
/* 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;
|
||||||
};
|
};
|
||||||
@ -3011,6 +3030,7 @@ keyword:
|
|||||||
| COMMIT_SYM {}
|
| COMMIT_SYM {}
|
||||||
| COMPRESSED_SYM {}
|
| COMPRESSED_SYM {}
|
||||||
| CONCURRENT {}
|
| CONCURRENT {}
|
||||||
|
| CUBE {}
|
||||||
| DATA_SYM {}
|
| DATA_SYM {}
|
||||||
| DATETIME {}
|
| DATETIME {}
|
||||||
| DATE_SYM {}
|
| DATE_SYM {}
|
||||||
@ -3104,6 +3124,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
|
|||||||
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;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user