diff options
author | igor@rurik.mysql.com <> | 2006-04-21 00:36:20 -0700 |
---|---|---|
committer | igor@rurik.mysql.com <> | 2006-04-21 00:36:20 -0700 |
commit | 37ac7822065195d0bf7061d947306f2481c7191c (patch) | |
tree | 12430c67bf33ee7014ca554819c453fb616380b5 /sql/sql_yacc.yy | |
parent | 4cbad914ca5a4978e21e424f0c68cbb3185e0073 (diff) | |
parent | fd3e9241647e70139a44baca9be5e336bc22e6da (diff) | |
download | mariadb-git-37ac7822065195d0bf7061d947306f2481c7191c.tar.gz |
Merge rurik.mysql.com:/home/igor/dev/mysql-4.1-0
into rurik.mysql.com:/home/igor/dev/mysql-5.0-0
Diffstat (limited to 'sql/sql_yacc.yy')
-rw-r--r-- | sql/sql_yacc.yy | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 31dcb982cbb..a911ad41cd7 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -5697,14 +5697,32 @@ order_clause: ORDER_SYM BY { LEX *lex=Lex; - if (lex->current_select->linkage != GLOBAL_OPTIONS_TYPE && - lex->current_select->olap != - UNSPECIFIED_OLAP_TYPE) + SELECT_LEX *sel= lex->current_select; + SELECT_LEX_UNIT *unit= sel-> master_unit(); + if (sel->linkage != GLOBAL_OPTIONS_TYPE && + sel->olap != UNSPECIFIED_OLAP_TYPE) { my_error(ER_WRONG_USAGE, MYF(0), "CUBE/ROLLUP", "ORDER BY"); YYABORT; } + if (lex->sql_command != SQLCOM_ALTER_TABLE && !unit->fake_select_lex) + { + /* + A query of the of the form (SELECT ...) ORDER BY order_list is + executed in the same way as the query + SELECT ... ORDER BY order_list + unless the SELECT construct contains ORDER BY or LIMIT clauses. + Otherwise we create a fake SELECT_LEX if it has not been created + yet. + */ + SELECT_LEX *first_sl= unit->first_select(); + if (!first_sl->next_select() && + (first_sl->order_list.elements || + first_sl->select_limit != HA_POS_ERROR) && + unit->add_fake_select_lex(lex->thd)) + YYABORT; + } } order_list; order_list: |