diff options
author | unknown <monty@mysql.com> | 2004-03-17 10:36:12 +0200 |
---|---|---|
committer | unknown <monty@mysql.com> | 2004-03-17 10:36:12 +0200 |
commit | 219bbd5232d6ff958f97b30abbc0cb9646abf6a8 (patch) | |
tree | 6f4235e7fd4eb101374c74e2c3c02470bb69d2ab | |
parent | b523802138eef0c66d6ce89263b512c1494a277b (diff) | |
parent | b54698374b5eea922a6f054338d804c2ba3aa682 (diff) | |
download | mariadb-git-219bbd5232d6ff958f97b30abbc0cb9646abf6a8.tar.gz |
merge with 4.0
innobase/btr/btr0cur.c:
Auto merged
innobase/btr/btr0sea.c:
Auto merged
innobase/include/log0log.h:
Auto merged
innobase/include/log0log.ic:
Auto merged
innobase/log/log0recv.c:
Auto merged
innobase/page/page0cur.c:
Auto merged
innobase/que/que0que.c:
Auto merged
myisam/myisam_ftdump.c:
Auto merged
mysql-test/r/func_if.result:
Auto merged
mysql-test/t/func_if.test:
Auto merged
-rw-r--r-- | include/my_tree.h | 4 | ||||
-rw-r--r-- | innobase/btr/btr0cur.c | 12 | ||||
-rw-r--r-- | innobase/btr/btr0sea.c | 2 | ||||
-rw-r--r-- | innobase/cry/makefilewin | 12 | ||||
-rw-r--r-- | innobase/include/btr0cur.h | 10 | ||||
-rw-r--r-- | innobase/include/btr0sea.h | 2 | ||||
-rw-r--r-- | innobase/include/log0log.h | 4 | ||||
-rw-r--r-- | innobase/include/log0log.ic | 2 | ||||
-rw-r--r-- | innobase/include/page0cur.h | 5 | ||||
-rw-r--r-- | innobase/include/que0que.h | 16 | ||||
-rw-r--r-- | innobase/include/que0que.ic | 18 | ||||
-rw-r--r-- | innobase/log/log0log.c | 54 | ||||
-rw-r--r-- | innobase/log/log0recv.c | 20 | ||||
-rw-r--r-- | innobase/page/page0cur.c | 7 | ||||
-rw-r--r-- | innobase/que/que0que.c | 4 | ||||
-rw-r--r-- | myisam/myisam_ftdump.c | 2 | ||||
-rw-r--r-- | mysql-test/r/func_if.result | 6 | ||||
-rw-r--r-- | mysql-test/t/func_if.test | 6 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 6 |
19 files changed, 110 insertions, 82 deletions
diff --git a/include/my_tree.h b/include/my_tree.h index 0e705e19bba..0159dc891e5 100644 --- a/include/my_tree.h +++ b/include/my_tree.h @@ -22,7 +22,9 @@ extern "C" { #include "my_base.h" /* get 'enum ha_rkey_function' */ -#define MAX_TREE_HEIGHT 40 /* = max 1048576 leafs in tree */ +/* Worst case tree is half full. This gives use 2^(MAX_TREE_HIGHT/2) leafs */ +#define MAX_TREE_HIGHT 64 + #define ELEMENT_KEY(tree,element)\ (tree->offset_to_key ? (void*)((byte*) element+tree->offset_to_key) :\ *((void**) (element+1))) diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c index af3a61041cb..f6a4a6f38f0 100644 --- a/innobase/btr/btr0cur.c +++ b/innobase/btr/btr0cur.c @@ -66,6 +66,16 @@ this many index pages */ #define BTR_BLOB_HDR_SIZE 8 /*********************************************************************** +Marks all extern fields in a record as owned by the record. This function +should be called if the delete mark of a record is removed: a not delete +marked record always owns all its extern fields. */ +static +void +btr_cur_unmark_extern_fields( +/*=========================*/ + rec_t* rec, /* in: record in a clustered index */ + mtr_t* mtr); /* in: mtr */ +/*********************************************************************** Adds path information to the cursor for the current page, for which the binary search has been performed. */ static @@ -2933,7 +2943,7 @@ btr_cur_mark_dtuple_inherited_extern( Marks all extern fields in a record as owned by the record. This function should be called if the delete mark of a record is removed: a not delete marked record always owns all its extern fields. */ - +static void btr_cur_unmark_extern_fields( /*=========================*/ diff --git a/innobase/btr/btr0sea.c b/innobase/btr/btr0sea.c index 238f118e260..2093d5ea757 100644 --- a/innobase/btr/btr0sea.c +++ b/innobase/btr/btr0sea.c @@ -22,7 +22,9 @@ Created 2/17/1996 Heikki Tuuri ulint btr_search_this_is_zero = 0; /* A dummy variable to fool the compiler */ +#ifdef UNIV_SEARCH_PERF_STAT ulint btr_search_n_succ = 0; +#endif /* UNIV_SEARCH_PERF_STAT */ ulint btr_search_n_hash_fail = 0; byte btr_sea_pad1[64]; /* padding to prevent other memory update diff --git a/innobase/cry/makefilewin b/innobase/cry/makefilewin deleted file mode 100644 index 9e791b8d073..00000000000 --- a/innobase/cry/makefilewin +++ /dev/null @@ -1,12 +0,0 @@ -include ..\include\makefile.i - -doall: cr.exe dcr.exe wro.exe - -cr.exe: cry0cry.c - $(CCOM) $(CFLW) -o cr.exe -I.. cry0cry.c ..\ut.lib ..\os.lib - -dcr.exe: cry0dcr.c - $(CCOM) $(CFLW) -o dcr.exe -I.. cry0dcr.c ..\ut.lib ..\os.lib - -wro.exe: cry0wro.c - $(CCOM) $(CFLW) -o wro.exe -I.. cry0wro.c ..\ut.lib ..\os.lib diff --git a/innobase/include/btr0cur.h b/innobase/include/btr0cur.h index 221f479df40..f1334656d53 100644 --- a/innobase/include/btr0cur.h +++ b/innobase/include/btr0cur.h @@ -435,16 +435,6 @@ btr_cur_mark_dtuple_inherited_extern( ulint n_ext_vec, /* in: number of elements in ext_vec */ upd_t* update); /* in: update vector */ /*********************************************************************** -Marks all extern fields in a record as owned by the record. This function -should be called if the delete mark of a record is removed: a not delete -marked record always owns all its extern fields. */ - -void -btr_cur_unmark_extern_fields( -/*=========================*/ - rec_t* rec, /* in: record in a clustered index */ - mtr_t* mtr); /* in: mtr */ -/*********************************************************************** Marks all extern fields in a dtuple as owned by the record. */ void diff --git a/innobase/include/btr0sea.h b/innobase/include/btr0sea.h index 68396d47193..ce4140ecf92 100644 --- a/innobase/include/btr0sea.h +++ b/innobase/include/btr0sea.h @@ -214,7 +214,9 @@ extern rw_lock_t* btr_search_latch_temp; #define btr_search_latch (*btr_search_latch_temp) +#ifdef UNIV_SEARCH_PERF_STAT extern ulint btr_search_n_succ; +#endif /* UNIV_SEARCH_PERF_STAT */ extern ulint btr_search_n_hash_fail; /* After change in n_fields or n_bytes in info, this many rounds are waited diff --git a/innobase/include/log0log.h b/innobase/include/log0log.h index dc44429d636..2bdc158502f 100644 --- a/innobase/include/log0log.h +++ b/innobase/include/log0log.h @@ -18,7 +18,9 @@ typedef struct log_struct log_t; typedef struct log_group_struct log_group_t; extern ibool log_do_write; +#ifdef UNIV_LOG_DEBUG extern ibool log_debug_writes; +#endif /* UNIV_LOG_DEBUG */ /* Wait modes for log_write_up_to */ #define LOG_NO_WAIT 91 @@ -719,11 +721,13 @@ struct log_struct{ ulint max_buf_free; /* recommended maximum value of buf_free, after which the buffer is flushed */ +#ifdef UNIV_LOG_DEBUG ulint old_buf_free; /* value of buf free when log was last time opened; only in the debug version */ dulint old_lsn; /* value of lsn when log was last time opened; only in the debug version */ +#endif /* UNIV_LOG_DEBUG */ ibool check_flush_or_checkpoint; /* this is set to TRUE when there may be need to flush the log buffer, or diff --git a/innobase/include/log0log.ic b/innobase/include/log0log.ic index 16423286f6d..e273b6a292b 100644 --- a/innobase/include/log0log.ic +++ b/innobase/include/log0log.ic @@ -10,6 +10,7 @@ Created 12/9/1995 Heikki Tuuri #include "mach0data.h" #include "mtr0mtr.h" +#ifdef UNIV_LOG_DEBUG /********************************************************** Checks by parsing that the catenated log segment for a single mtr is consistent. */ @@ -21,6 +22,7 @@ log_check_log_recs( in the log_sys->buf log buffer */ ulint len, /* in: segment length in bytes */ dulint buf_start_lsn); /* in: buffer start lsn */ +#endif /* UNIV_LOG_DEBUG */ /**************************************************************** Gets a log block flush bit. */ diff --git a/innobase/include/page0cur.h b/innobase/include/page0cur.h index c3f0decdb4b..c85669ed4df 100644 --- a/innobase/include/page0cur.h +++ b/innobase/include/page0cur.h @@ -32,8 +32,11 @@ Created 10/4/1994 Heikki Tuuri which extend it */ #define PAGE_CUR_DBG 6 - +#ifdef PAGE_CUR_ADAPT +# ifdef UNIV_SEARCH_PERF_STAT extern ulint page_cur_short_succ; +# endif /* UNIV_SEARCH_PERF_STAT */ +#endif /* PAGE_CUR_ADAPT */ /************************************************************* Gets pointer to the page frame where the cursor is positioned. */ diff --git a/innobase/include/que0que.h b/innobase/include/que0que.h index e1874edcaf2..bcd7aed7e88 100644 --- a/innobase/include/que0que.h +++ b/innobase/include/que0que.h @@ -307,22 +307,6 @@ que_thr_peek_stop( mutex reserved is necessary before deciding the actual stopping */ que_thr_t* thr); /* in: query thread */ -/*************************************************************************** -Returns TRUE if the query graph is for a SELECT statement. */ -UNIV_INLINE -ibool -que_graph_is_select( -/*================*/ - /* out: TRUE if a select */ - que_t* graph); /* in: graph */ -/************************************************************************** -Prints info of an SQL query graph node. */ - -void -que_node_print_info( -/*================*/ - que_node_t* node); /* in: query graph node */ - /* Query graph query thread node: the fields are protected by the kernel mutex with the exceptions named below */ diff --git a/innobase/include/que0que.ic b/innobase/include/que0que.ic index ae4ed10560f..a63922f8c80 100644 --- a/innobase/include/que0que.ic +++ b/innobase/include/que0que.ic @@ -238,21 +238,3 @@ que_thr_peek_stop( return(FALSE); } - -/*************************************************************************** -Returns TRUE if the query graph is for a SELECT statement. */ -UNIV_INLINE -ibool -que_graph_is_select( -/*================*/ - /* out: TRUE if a select */ - que_t* graph) /* in: graph */ -{ - if (graph->fork_type == QUE_FORK_SELECT_SCROLL - || graph->fork_type == QUE_FORK_SELECT_NON_SCROLL) { - - return(TRUE); - } - - return(FALSE); -} diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c index cd6e6e803a7..e99ea269920 100644 --- a/innobase/log/log0log.c +++ b/innobase/log/log0log.c @@ -32,7 +32,9 @@ ulint log_fsp_current_free_limit = 0; log_t* log_sys = NULL; ibool log_do_write = TRUE; +#ifdef UNIV_LOG_DEBUG ibool log_debug_writes = FALSE; +#endif /* UNIV_LOG_DEBUG */ /* These control how often we print warnings if the last checkpoint is too old */ @@ -86,9 +88,8 @@ the previous */ Completes a checkpoint write i/o to a log file. */ static void -log_io_complete_checkpoint( -/*=======================*/ - log_group_t* group); /* in: log group */ +log_io_complete_checkpoint(void); +/*============================*/ /********************************************************** Completes an archiving i/o. */ static @@ -928,11 +929,12 @@ log_group_check_flush_completion( #endif /* UNIV_SYNC_DEBUG */ if (!log_sys->one_flushed && group->n_pending_writes == 0) { - +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { printf("Log flushed first to group %lu\n", (ulong) group->id); } +#endif /* UNIV_LOG_DEBUG */ log_sys->written_to_some_lsn = log_sys->write_lsn; log_sys->one_flushed = TRUE; @@ -940,10 +942,12 @@ log_group_check_flush_completion( return(LOG_UNLOCK_NONE_FLUSHED_LOCK); } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes && (group->n_pending_writes == 0)) { printf("Log flushed to group %lu\n", (ulong) group->id); } +#endif /* UNIV_LOG_DEBUG */ return(0); } @@ -1019,7 +1023,15 @@ log_io_complete( fil_flush(group->space_id); } - log_io_complete_checkpoint(group); +#ifdef UNIV_LOG_DEBUG + if (log_debug_writes) { + fprintf(stderr, + "Checkpoint info written to group %lu\n", + group->id); + } +#endif /* UNIV_LOG_DEBUG */ + + log_io_complete_checkpoint(); return; } @@ -1084,11 +1096,13 @@ log_group_file_header_flush( dest_offset = nth_file * group->file_size; +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { printf( "Writing log file header to group %lu file %lu\n", (ulong) group->id, (ulong) nth_file); } +#endif /* UNIV_LOG_DEBUG */ if (log_do_write) { log_sys->n_log_ios++; @@ -1173,6 +1187,7 @@ loop: write_len = len; } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { printf( @@ -1197,6 +1212,7 @@ loop: + i * OS_FILE_LOG_BLOCK_SIZE)); } } +#endif /* UNIV_LOG_DEBUG */ /* Calculate the checksums for each log block and write them to the trailer fields of the log blocks */ @@ -1324,6 +1340,7 @@ loop: return; } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { printf("Writing log from %lu %lu up to lsn %lu %lu\n", (ulong) ut_dulint_get_high(log_sys->written_to_all_lsn), @@ -1331,6 +1348,7 @@ loop: (ulong) ut_dulint_get_high(log_sys->lsn), (ulong) ut_dulint_get_low(log_sys->lsn)); } +#endif /* UNIV_LOG_DEBUG */ log_sys->n_pending_writes++; @@ -1556,9 +1574,8 @@ log_complete_checkpoint(void) Completes an asynchronous checkpoint info write i/o to a log file. */ static void -log_io_complete_checkpoint( -/*=======================*/ - log_group_t* group) /* in: log group */ +log_io_complete_checkpoint(void) +/*============================*/ { mutex_enter(&(log_sys->mutex)); @@ -1566,11 +1583,6 @@ log_io_complete_checkpoint( log_sys->n_pending_checkpoint_writes--; - if (log_debug_writes) { - printf("Checkpoint info written to group %lu\n", - (ulong) group->id); - } - if (log_sys->n_pending_checkpoint_writes == 0) { log_complete_checkpoint(); } @@ -1895,12 +1907,14 @@ log_checkpoint( log_sys->next_checkpoint_lsn = oldest_lsn; +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { printf("Making checkpoint no %lu at lsn %lu %lu\n", (ulong) ut_dulint_get_low(log_sys->next_checkpoint_no), (ulong) ut_dulint_get_high(oldest_lsn), (ulong) ut_dulint_get_low(oldest_lsn)); } +#endif /* UNIV_LOG_DEBUG */ log_groups_write_checkpoint_info(); @@ -2287,9 +2301,11 @@ loop: exit(1); } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { printf("Created archive file %s\n", name); } +#endif /* UNIV_LOG_DEBUG */ ret = os_file_close(file_handle); @@ -2316,6 +2332,7 @@ loop: len = group->file_size - (next_offset % group->file_size); } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { printf( "Archiving starting at lsn %lu %lu, len %lu to group %lu\n", @@ -2323,6 +2340,7 @@ loop: (ulong) ut_dulint_get_low(start_lsn), (ulong) len, (ulong) group->id); } +#endif /* UNIV_LOG_DEBUG */ log_sys->n_pending_archive_ios++; @@ -2417,10 +2435,12 @@ log_archive_write_complete_groups(void) trunc_files = n_files - 1; } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes && trunc_files) { printf("Complete file(s) archived to group %lu\n", (ulong) group->id); } +#endif /* UNIV_LOG_DEBUG */ /* Calculate the archive file space start lsn */ start_lsn = ut_dulint_subtract(log_sys->next_archived_lsn, @@ -2443,9 +2463,11 @@ log_archive_write_complete_groups(void) fil_space_truncate_start(group->archive_space_id, trunc_files * group->file_size); +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { printf("Archiving writes completed\n"); } +#endif /* UNIV_LOG_DEBUG */ } /********************************************************** @@ -2464,9 +2486,11 @@ log_archive_check_completion_low(void) if (log_sys->n_pending_archive_ios == 0 && log_sys->archiving_phase == LOG_ARCHIVE_READ) { +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { printf("Archiving read completed\n"); } +#endif /* UNIV_LOG_DEBUG */ /* Archive buffer has now been read in: start archive writes */ @@ -2729,12 +2753,14 @@ log_archive_close_groups( group->archived_file_no += 2; } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { printf( "Incrementing arch file no to %lu in log group %lu\n", (ulong) group->archived_file_no + 2, (ulong) group->id); } +#endif /* UNIV_LOG_DEBUG */ } } @@ -3204,6 +3230,7 @@ loop: ut_a(0 == ut_dulint_cmp(lsn, log_sys->lsn)); } +#ifdef UNIV_LOG_DEBUG /********************************************************** Checks by parsing that the catenated log segment for a single mtr is consistent. */ @@ -3256,6 +3283,7 @@ log_check_log_recs( return(TRUE); } +#endif /* UNIV_LOG_DEBUG */ /********************************************************** Peeks the current lsn. */ diff --git a/innobase/log/log0recv.c b/innobase/log/log0recv.c index f80181cc207..432a6ed1e85 100644 --- a/innobase/log/log0recv.c +++ b/innobase/log/log0recv.c @@ -487,6 +487,7 @@ recv_find_max_checkpoint( log_group_read_checkpoint_info(group, field); if (!recv_check_cp_is_consistent(buf)) { +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { fprintf(stderr, "InnoDB: Checkpoint in group %lu at %lu invalid, %lu\n", @@ -496,6 +497,7 @@ recv_find_max_checkpoint( + LOG_CHECKPOINT_CHECKSUM_1)); } +#endif /* UNIV_LOG_DEBUG */ goto not_consistent; } @@ -509,12 +511,14 @@ recv_find_max_checkpoint( checkpoint_no = mach_read_from_8(buf + LOG_CHECKPOINT_NO); +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { fprintf(stderr, "InnoDB: Checkpoint number %lu found in group %lu\n", (ulong) ut_dulint_get_low(checkpoint_no), (ulong) group->id); } +#endif /* UNIV_LOG_DEBUG */ if (ut_dulint_cmp(checkpoint_no, max_no) >= 0) { *max_group = group; @@ -1147,6 +1151,7 @@ recv_recover_page( start_lsn = recv->start_lsn; } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { fprintf(stderr, "InnoDB: Applying log rec type %lu len %lu to space %lu page no %lu\n", @@ -1154,7 +1159,8 @@ recv_recover_page( (ulong) recv_addr->space, (ulong) recv_addr->page_no); } - +#endif /* UNIV_LOG_DEBUG */ + recv_parse_or_apply_log_rec_body(recv->type, buf, buf + recv->len, page, &mtr); mach_write_to_8(page + UNIV_PAGE_SIZE @@ -1984,12 +1990,14 @@ loop: recv_sys->recovered_offset += len; recv_sys->recovered_lsn = new_recovered_lsn; +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { fprintf(stderr, "InnoDB: Parsed a single log rec type %lu len %lu space %lu page no %lu\n", (ulong) type, (ulong) len, (ulong) space, (ulong) page_no); } +#endif /* UNIV_LOG_DEBUG */ if (type == MLOG_DUMMY_RECORD) { /* Do nothing */ @@ -2071,13 +2079,15 @@ loop: */ } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { fprintf(stderr, "InnoDB: Parsed a multi log rec type %lu len %lu space %lu page no %lu\n", (ulong) type, (ulong) len, (ulong) space, (ulong) page_no); } - +#endif /* UNIV_LOG_DEBUG */ + total_len += len; n_recs++; @@ -2482,6 +2492,7 @@ recv_group_scan_log_recs( start_lsn = end_lsn; } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { fprintf(stderr, "InnoDB: Scanned group %lu up to log sequence number %lu %lu\n", @@ -2489,6 +2500,7 @@ recv_group_scan_log_recs( (ulong) ut_dulint_get_high(*group_scanned_lsn), (ulong) ut_dulint_get_low(*group_scanned_lsn)); } +#endif /* UNIV_LOG_DEBUG */ } /************************************************************ @@ -2869,10 +2881,12 @@ recv_recovery_from_checkpoint_finish(void) recv_apply_hashed_log_recs(TRUE); } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { fprintf(stderr, "InnoDB: Log records applied to the database\n"); } +#endif /* UNIV_LOG_DEBUG */ if (recv_needed_recovery) { trx_sys_print_mysql_master_log_pos(); @@ -3184,6 +3198,7 @@ ask_again: break; } +#ifdef UNIV_LOG_DEBUG if (log_debug_writes) { fprintf(stderr, "InnoDB: Archive read starting at lsn %lu %lu, len %lu from file %s\n", @@ -3191,6 +3206,7 @@ ask_again: (ulong) ut_dulint_get_low(start_lsn), (ulong) len, name); } +#endif /* UNIV_LOG_DEBUG */ fil_io(OS_FILE_READ | OS_FILE_LOG, TRUE, group->archive_space_id, read_offset / UNIV_PAGE_SIZE, diff --git a/innobase/page/page0cur.c b/innobase/page/page0cur.c index eb2ba5b8bf8..5d26d12bf20 100644 --- a/innobase/page/page0cur.c +++ b/innobase/page/page0cur.c @@ -16,11 +16,12 @@ Created 10/4/1994 Heikki Tuuri #include "log0recv.h" #include "rem0cmp.h" -ulint page_cur_short_succ = 0; - -ulint page_rnd = 976722341; +static ulint page_rnd = 976722341; #ifdef PAGE_CUR_ADAPT +# ifdef UNIV_SEARCH_PERF_STAT +ulint page_cur_short_succ = 0; +# endif /* UNIV_SEARCH_PERF_STAT */ /******************************************************************** Tries a search shortcut based on the last insert. */ diff --git a/innobase/que/que0que.c b/innobase/que/que0que.c index d31b4e6813c..77495246bb0 100644 --- a/innobase/que/que0que.c +++ b/innobase/que/que0que.c @@ -1036,9 +1036,10 @@ que_thr_stop_for_mysql_no_error( trx->n_active_thrs--; } +#ifdef UNIV_DEBUG /************************************************************************** Prints info of an SQL query graph node. */ - +static void que_node_print_info( /*================*/ @@ -1095,6 +1096,7 @@ que_node_print_info( fprintf(stderr, "Node type %lu: %s, address %p\n", (ulong) type, str, node); } +#endif /* UNIV_DEBUG */ /************************************************************************** Performs an execution step on a query thread. */ diff --git a/myisam/myisam_ftdump.c b/myisam/myisam_ftdump.c index 015604aa1ad..7d1b20eb854 100644 --- a/myisam/myisam_ftdump.c +++ b/myisam/myisam_ftdump.c @@ -267,7 +267,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), static void usage() { - printf("Use: ft_dump <table_name> <index_no>\n"); + printf("Use: myisam_ftdump <table_name> <index_num>\n"); my_print_help(my_long_options); my_print_variables(my_long_options); exit(1); diff --git a/mysql-test/r/func_if.result b/mysql-test/r/func_if.result index bea16c07f86..0a04585d77d 100644 --- a/mysql-test/r/func_if.result +++ b/mysql-test/r/func_if.result @@ -59,6 +59,12 @@ id select_type table type possible_keys key key_len ref rows Extra Warnings: Note 1003 select high_priority nullif((test.t1.u = 0),_latin1'test') AS `nullif(u=0, 'test')` from test.t1 drop table t1; +select NULLIF(NULL,NULL), NULLIF(NULL,1), NULLIF(NULL,1.0), NULLIF(NULL,"test"); +NULLIF(NULL,NULL) NULLIF(NULL,1) NULLIF(NULL,1.0) NULLIF(NULL,"test") +NULL NULL NULL NULL +select NULLIF(1,NULL), NULLIF(1.0, NULL), NULLIF("test", NULL); +NULLIF(1,NULL) NULLIF(1.0, NULL) NULLIF("test", NULL) +1 1.0 test create table t1 (num double(12,2)); insert into t1 values (144.54); select sum(if(num is null,0.00,num)) from t1; diff --git a/mysql-test/t/func_if.test b/mysql-test/t/func_if.test index e44a7f6d6f9..36c3a38d2fe 100644 --- a/mysql-test/t/func_if.test +++ b/mysql-test/t/func_if.test @@ -30,6 +30,12 @@ explain extended select nullif(u=0, 'test') from t1; drop table t1; # +# Bug 2629 +# +select NULLIF(NULL,NULL), NULLIF(NULL,1), NULLIF(NULL,1.0), NULLIF(NULL,"test"); +select NULLIF(1,NULL), NULLIF(1.0, NULL), NULLIF("test", NULL); + +# # Problem with IF() # diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index f0bc73e9501..122cc93bc3c 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -977,7 +977,7 @@ double Item_func_nullif::val() { double value; - if (!cmp.compare() || null_value) + if (!cmp.compare()) { null_value=1; return 0.0; @@ -991,7 +991,7 @@ longlong Item_func_nullif::val_int() { longlong value; - if (!cmp.compare() || null_value) + if (!cmp.compare()) { null_value=1; return 0; @@ -1005,7 +1005,7 @@ String * Item_func_nullif::val_str(String *str) { String *res; - if (!cmp.compare() || null_value) + if (!cmp.compare()) { null_value=1; return 0; |