diff options
author | unknown <ram@mysql.r18.ru> | 2003-06-23 18:38:45 +0500 |
---|---|---|
committer | unknown <ram@mysql.r18.ru> | 2003-06-23 18:38:45 +0500 |
commit | 105c1a80269507b1bbcdc3d221fe9cf062714d21 (patch) | |
tree | b4dcc6f4c72233ab737ba21bb90553ffc2192493 /sql | |
parent | fd3abc83eaef975979f227c564bd11d9a76a0cb4 (diff) | |
parent | 01450dbb79540c01e6b0381ce0760418dcdfc133 (diff) | |
download | mariadb-git-105c1a80269507b1bbcdc3d221fe9cf062714d21.tar.gz |
Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.r18.ru:/usr/home/ram/work/4.1.gis
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item_cmpfunc.cc | 62 | ||||
-rw-r--r-- | sql/sql_lex.cc | 21 | ||||
-rw-r--r-- | sql/sql_lex.h | 3 | ||||
-rw-r--r-- | sql/sql_parse.cc | 2 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 1 |
5 files changed, 56 insertions, 33 deletions
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index d4997f78a9e..5c2b9ed4682 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -90,38 +90,58 @@ static bool convert_constant_item(Field *field, Item **item) bool Item_bool_func2::set_cmp_charset(CHARSET_INFO *cs1, enum coercion co1, CHARSET_INFO *cs2, enum coercion co2) { - if ((cs1 == &my_charset_bin) || (cs2 == &my_charset_bin)) + if (cs1 == &my_charset_bin || cs2 == &my_charset_bin) { cmp_charset= &my_charset_bin; + coercibility= co1 > co2 ? co1 : co2; return 0; } - if ((co1 == COER_NOCOLL) || (co2 == COER_NOCOLL)) - return 1; - - if (!my_charset_same(cs1,cs2)) - return 1; - - if (co1 < co2) + if (!my_charset_same(cs1, cs2)) + { + /* + We do allow to use BLOBS together with character strings + BLOBS have more precedance + */ + if ((co1 <= co2) && (cs1==&my_charset_bin)) + { + cmp_charset= cs1; + coercibility= co1; + } + else if ((co2 <= co1) && (cs2==&my_charset_bin)) + { + cmp_charset= cs2; + coercibility= co2; + } + else + { + cmp_charset= 0; + coercibility= COER_NOCOLL; + return 1; + } + } + else if (co1 < co2) + { cmp_charset= cs1; + coercibility= co1; + } else if (co2 < co1) - cmp_charset= cs2; - else // co1==co2 { + cmp_charset= cs2; + coercibility= co1; + } + else + { if (cs1 == cs2) + { cmp_charset= cs1; - else + coercibility= co1; + } + else { - if (co1 == COER_COERCIBLE) - { - CHARSET_INFO *c; - if ((c= get_charset_by_csname(cs1->csname, MY_CS_PRIMARY, MYF(0)))) - { - cmp_charset= c; - return 0; - } - } - return 1; + coercibility= COER_NOCOLL; + cmp_charset= 0; + return (co1 == COER_EXPLICIT) ? 1 : 0; } } return 0; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index c61149b8313..bc9ad4f36b0 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -963,6 +963,8 @@ int yylex(void *arg, void *yythd) void st_select_lex_node::init_query() { + options= 0; + linkage= UNSPECIFIED_TYPE; no_table_names_allowed= uncacheable= dependent= 0; ref_pointer_array= 0; } @@ -981,8 +983,8 @@ void st_select_lex_node::init_select() void st_select_lex_unit::init_query() { - linkage= GLOBAL_OPTIONS_TYPE; st_select_lex_node::init_query(); + linkage= GLOBAL_OPTIONS_TYPE; global_parameters= this; select_limit_cnt= HA_POS_ERROR; offset_limit_cnt= 0; @@ -996,11 +998,10 @@ void st_select_lex_unit::init_query() void st_select_lex::init_query() { st_select_lex_node::init_query(); - table_list.elements= 0; - table_list.first= 0; - table_list.next= (byte**) &table_list.first; + table_list.empty(); item_list.empty(); join= 0; + where= 0; olap= UNSPECIFIED_OLAP_TYPE; having_fix_field= 0; with_wild= 0; @@ -1009,11 +1010,15 @@ void st_select_lex::init_query() void st_select_lex::init_select() { st_select_lex_node::init_select(); - group_list.elements= 0; - group_list.first= 0; - group_list.next= (byte**) &group_list.first; + group_list.empty(); + type= db= db1= table1= db2= table2= 0; + having= 0; + group_list.empty(); + use_index_ptr= ignore_index_ptr= 0; + table_join_options= 0; + in_sum_expr= with_wild= 0; options= 0; - where= having= 0; + braces= 0; when_list.empty(); expr_list.empty(); interval_list.empty(); diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 184618353fa..6226fbe1bb5 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -215,8 +215,7 @@ public: static void *operator new(size_t size) { - // TODO: Change to alloc() and explicitely clear elements in constructors - return (void*) sql_calloc((uint) size); + return (void*) sql_alloc((uint) size); } static void operator delete(void *ptr,size_t size) {} st_select_lex_node(): linkage(UNSPECIFIED_TYPE) {} diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 4f54b0fc3ba..5070466007e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3590,7 +3590,7 @@ void mysql_init_multi_delete(LEX *lex) lex->select_lex.select_limit= lex->unit.select_limit_cnt= HA_POS_ERROR; lex->auxilliary_table_list= lex->select_lex.table_list; - lex->select_lex.init_query(); + lex->select_lex.table_list.empty(); } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 937fe94e3f2..e3fb81b39f2 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3571,7 +3571,6 @@ delete: { LEX *lex= Lex; lex->sql_command= SQLCOM_DELETE; - lex->select_lex.options= 0; lex->lock_option= lex->thd->update_lock_default; lex->select_lex.init_order(); } |