~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/pbxt/src/thread_xt.cc

  • 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
 
/* Copyright (C) 2005 PrimeBase Technologies GmbH
 
1
/* Copyright (c) 2005 PrimeBase Technologies GmbH
2
2
 *
3
3
 * PrimeBase XT
4
4
 *
14
14
 *
15
15
 * You should have received a copy of the GNU General Public License
16
16
 * along with this program; if not, write to the Free Software
17
 
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
 *
19
19
 * 2005-01-03   Paul McCullagh
20
20
 *
258
258
#else
259
259
        /* Use the buffer, unless it is too small */
260
260
        va_list ap2;
261
 
        int bufsize;
262
261
 
263
262
        va_copy(ap2, ap);
264
 
        bufsize = vsnprintf(buffer, DEFAULT_LOG_BUFFER_SIZE, fmt, ap);
265
 
        if (bufsize >= DEFAULT_LOG_BUFFER_SIZE) {
266
 
                log_string = (char *) malloc(bufsize + 1);
267
 
                if (vsnprintf(log_string, bufsize + 1, fmt, ap2) > bufsize) {
268
 
                        free(log_string);
 
263
        if (vsnprintf(buffer, DEFAULT_LOG_BUFFER_SIZE, fmt, ap) >= DEFAULT_LOG_BUFFER_SIZE) {
 
264
                if (vasprintf(&log_string, fmt, ap2) == -1)
269
265
                        log_string = NULL;
270
 
                }
271
266
        }
272
267
        else
273
268
                log_string = buffer;
861
856
        char buffer[XT_TABLE_NAME_BUF_SIZE];
862
857
 
863
858
        xt_tab_make_table_name(tab_item, buffer, sizeof(buffer));
864
 
        xt_register_i2xterr(func, file, line, xt_err, buffer, item2);
 
859
        xt_strcat(sizeof(buffer), buffer, ".");
 
860
        xt_strcat(sizeof(buffer), buffer, item2);
 
861
        xt_register_ixterr(func, file, line, xt_err, buffer);
865
862
}
866
863
 
867
864
xtPublic void xt_register_taberr(c_char *func, c_char *file, u_int line, int xt_err, XTPathStrPtr tab_item)