~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/innobase/handler/ha_innodb.h

  • Committer: Stewart Smith
  • Date: 2010-08-12 16:48:46 UTC
  • mto: This revision was merged to the branch mainline in revision 1707.
  • Revision ID: stewart@flamingspork.com-20100812164846-s9bhy47g60bvqs41
bug lp:611379 Equivalent queries with Impossible where return different results

The following two equivalent queries return different results in maria 5.2 and 5.3 (and identical results in mysql 5.5.5) :

SELECT SUM( DISTINCT table1 .`pk` ) FROM B table1 STRAIGHT_JOIN ( BB table2 JOIN CC ON table2 .`col_varchar_key` ) ON table2 .`pk` ;

SELECT * FROM ( SELECT SUM( DISTINCT table1 .`pk` ) FROM B table1 STRAIGHT_JOIN ( BB table2 JOIN CC ON table2 .`col_varchar_key` ) ON table2 .`pk` );

MariaDB returns 0 on the second query and NULL on the first, whereas MySQL returns NULL on both. In MariaDB, both EXPLAIN plans agree that "Impossible WHERE noticed after reading const tables"



We have some slightly different output in drizzle:

main.bug_lp611379 [ fail ]
drizzletest: At line 9: query 'explain select * from (select sum(distinct t1.a) from t1,t2 where t1.a=t2.a)
as t' failed: 1048: Column 'sum(distinct t1.a)' cannot be null

but the fix gets us the correct query results, although with slightly different execution plans.



This fix is directly ported from MariaDB.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*****************************************************************************
2
2
 
3
 
Copyright (c) 2000, 2010, MySQL AB & Innobase Oy. All Rights Reserved.
 
3
Copyright (c) 2000, 2009, MySQL AB & Innobase Oy. All Rights Reserved.
4
4
 
5
5
This program is free software; you can redistribute it and/or modify it under
6
6
the terms of the GNU General Public License as published by the Free Software
11
11
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
12
 
13
13
You should have received a copy of the GNU General Public License along with
14
 
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
15
 
St, Fifth Floor, Boston, MA 02110-1301 USA
 
14
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 
15
Place, Suite 330, Boston, MA 02111-1307 USA
16
16
 
17
17
*****************************************************************************/
18
18
 
31
31
#include <drizzled/plugin/transactional_storage_engine.h>
32
32
 
33
33
using namespace drizzled;
34
 
 
35
 
/* Structure defines translation table between mysql index and innodb
36
 
index structures */
37
 
typedef struct innodb_idx_translate_struct {
38
 
        ulint           index_count;    /*!< number of valid index entries
39
 
                                        in the index_mapping array */
40
 
        ulint           array_size;     /*!< array size of index_mapping */
41
 
        dict_index_t**  index_mapping;  /*!< index pointer array directly
42
 
                                        maps to index in Innodb from MySQL
43
 
                                        array index */
44
 
} innodb_idx_translate_t;
45
 
 
46
34
/** InnoDB table share */
47
35
typedef struct st_innobase_share {
48
36
        THR_LOCK        lock;           /*!< MySQL lock protecting
49
37
                                        this structure */
50
 
        char    table_name[FN_REFLEN];  /*!< InnoDB table name */
 
38
        const char*     table_name;     /*!< InnoDB table name */
51
39
        uint            use_count;      /*!< reference count,
52
40
                                        incremented in get_share()
53
41
                                        and decremented in free_share() */
54
42
        void*           table_name_hash;/*!< hash table chain node */
55
 
        innodb_idx_translate_t  idx_trans_tbl;  /*!< index translation
56
 
                                                table between MySQL and
57
 
                                                Innodb */
58
 
 
59
 
        st_innobase_share(const char *arg) :
60
 
          use_count(0)
61
 
        {
62
 
          strncpy(table_name, arg, FN_REFLEN);
63
 
        }
64
 
 
65
43
} INNOBASE_SHARE;
66
44
 
67
45
 
115
93
        UNIV_INTERN ulint innobase_reset_autoinc(uint64_t auto_inc);
116
94
        UNIV_INTERN ulint innobase_get_autoinc(uint64_t* value);
117
95
        ulint innobase_update_autoinc(uint64_t  auto_inc);
118
 
        UNIV_INTERN void innobase_initialize_autoinc();
 
96
        UNIV_INTERN ulint innobase_initialize_autoinc();
119
97
        UNIV_INTERN dict_index_t* innobase_get_index(uint keynr);
 
98
        UNIV_INTERN uint64_t innobase_get_int_col_max_value(const Field* field);
120
99
 
121
100
        /* Init values for the class: */
122
101
 public:
123
102
        UNIV_INTERN ha_innobase(plugin::StorageEngine &engine,
124
 
                                Table &table_arg);
 
103
                                TableShare &table_arg);
125
104
        UNIV_INTERN ~ha_innobase();
126
105
  /**
127
106
   * Returns the plugin::TransactionStorageEngine pointer
133
112
   */
134
113
  UNIV_INTERN plugin::TransactionalStorageEngine *getTransactionalEngine()
135
114
  {
136
 
    return static_cast<plugin::TransactionalStorageEngine *>(getEngine());
 
115
    return static_cast<plugin::TransactionalStorageEngine *>(engine);
137
116
  }
138
117
 
139
118
        UNIV_INTERN const char* index_type(uint key_number);
264
243
innobase_trx_allocate(
265
244
/*==================*/
266
245
        Session         *session);      /*!< in: user thread handle */
267
 
 
268
 
/***********************************************************************
269
 
This function checks each index name for a table against reserved
270
 
system default primary index name 'GEN_CLUST_INDEX'. If a name matches,
271
 
this function pushes an error message to the client, and returns true. */
272
 
extern "C"
273
 
bool
274
 
innobase_index_name_is_reserved(
275
 
/*============================*/
276
 
                                        /* out: true if index name matches a
277
 
                                        reserved name */
278
 
        const trx_t*    trx,            /* in: InnoDB transaction handle */
279
 
        const drizzled::KeyInfo*        key_info,/* in: Indexes to be created */
280
 
        ulint           num_of_keys);   /* in: Number of indexes to
281
 
                                        be created. */
282
 
 
283
246
#endif /* INNODB_HANDLER_HA_INNODB_H */