summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <ram@mysql.r18.ru>2003-06-23 18:38:45 +0500
committerunknown <ram@mysql.r18.ru>2003-06-23 18:38:45 +0500
commit105c1a80269507b1bbcdc3d221fe9cf062714d21 (patch)
treeb4dcc6f4c72233ab737ba21bb90553ffc2192493 /sql
parentfd3abc83eaef975979f227c564bd11d9a76a0cb4 (diff)
parent01450dbb79540c01e6b0381ce0760418dcdfc133 (diff)
downloadmariadb-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.cc62
-rw-r--r--sql/sql_lex.cc21
-rw-r--r--sql/sql_lex.h3
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_yacc.yy1
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();
}