Commit 83001499 authored by unknown's avatar unknown
Browse files

Merge rurik.mysql.com:/home/igor/dev/mysql-4.1-0

into  rurik.mysql.com:/home/igor/dev/mysql-5.0-0


mysql-test/t/having.test:
  Auto merged
mysql-test/r/having.result:
  Manual merge
sql/sql_lex.cc:
  Manual merge
sql/sql_lex.h:
  Manual merge
sql/sql_prepare.cc:
  Manual merge
sql/sql_select.cc:
  Manual merge
parents 6a2a94b5 67575038
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -141,6 +141,40 @@ SUM(a)
6
4
DROP TABLE t1;

















CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (1), (2), (1), (3), (2), (1);
SELECT a FROM t1 GROUP BY a HAVING a > 1;
a
2
3
SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1;
a
SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1;
x	a
EXPLAIN SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	Impossible HAVING
EXPLAIN SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	Impossible HAVING
DROP table t1;
create table t1 (col1 int, col2 varchar(5), col_t1 int);
create table t2 (col1 int, col2 varchar(5), col_t2 int);
create table t3 (col1 int, col2 varchar(5), col_t3 int);
+16 −0
Original line number Diff line number Diff line
@@ -135,6 +135,22 @@ SELECT SUM(a) FROM t1 GROUP BY a HAVING SUM(a);

DROP TABLE t1;

#
# Bug #14927: HAVING clause containing constant false conjunct
#

CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (1), (2), (1), (3), (2), (1);

SELECT a FROM t1 GROUP BY a HAVING a > 1;
SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1;
SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1;

EXPLAIN SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1;
EXPLAIN SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1;

DROP table t1;  

# End of 4.1 tests

#
+1 −1
Original line number Diff line number Diff line
@@ -1122,7 +1122,7 @@ void st_select_lex::init_query()
  embedding= leaf_tables= 0;
  item_list.empty();
  join= 0;
  having= where= prep_where= 0;
  having= prep_having= where= prep_where= 0;
  olap= UNSPECIFIED_OLAP_TYPE;
  having_fix_field= 0;
  context.select_lex= this;
+1 −0
Original line number Diff line number Diff line
@@ -474,6 +474,7 @@ class st_select_lex: public st_select_lex_node
  char *db;
  Item *where, *having;                         /* WHERE & HAVING clauses */
  Item *prep_where; /* saved WHERE clause for prepared statement processing */
  Item *prep_having;/* saved HAVING clause for prepared statement processing */
  /* point on lex in which it was created, used in view subquery detection */
  st_lex *parent_lex;
  enum olap_type olap;
+110 −12
Original line number Diff line number Diff line
@@ -1862,6 +1862,96 @@ void mysql_stmt_prepare(THD *thd, const char *packet, uint packet_length)
  {
    /* Statement map deletes statement on erase */
    thd->stmt_map.erase(stmt);


























































































  }
  else
    mysql_log.write(thd, COM_STMT_PREPARE, "[%lu] %s", stmt->id, packet);
@@ -1955,11 +2045,14 @@ static const char *get_dynamic_sql_string(LEX *lex, uint *query_len)
  }
  else
  {
    query_str= lex->prepared_stmt_code.str;
    *query_len= lex->prepared_stmt_code.length;
  }
end:
  return query_str;
    stmt->setup_set_params();
    SELECT_LEX *sl= stmt->lex->all_selects_list;
    for (; sl; sl= sl->next_select_in_list())
    {
      /*
        during query optimisation.
      */
      sl->prep_where= sl->where;
}


@@ -2066,13 +2159,18 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
      sl->exclude_from_table_unique_test= FALSE;

      /*
        Copy WHERE clause pointers to avoid damaging they by optimisation
        Copy WHERE, HAVING clause pointers to avoid damaging them by optimisation
      */
     if (sl->prep_where)
     {
       sl->where= sl->prep_where->copy_andor_structure(thd);
       sl->where->cleanup();
     }
     if (sl->prep_having)
     {
       sl->having= sl->prep_having->copy_andor_structure(thd);
       sl->having->cleanup();
     }
     DBUG_ASSERT(sl->join == 0);
      ORDER *order;
      /* Fix GROUP list */
Loading