diff options
-rw-r--r-- | sql/gstream.cc | 17 | ||||
-rw-r--r-- | sql/gstream.h | 9 | ||||
-rw-r--r-- | sql/item_geofunc.cc | 10 | ||||
-rw-r--r-- | sql/item_strfunc.cc | 4 | ||||
-rw-r--r-- | sql/spatial.h | 2 |
5 files changed, 25 insertions, 17 deletions
diff --git a/sql/gstream.cc b/sql/gstream.cc index 6b1e12ec733..f7d11d76b0c 100644 --- a/sql/gstream.cc +++ b/sql/gstream.cc @@ -24,7 +24,7 @@ enum Gis_read_stream::enum_tok_types Gis_read_stream::get_next_toc_type() { skip_space(); - if (!*m_cur) + if (m_cur >= m_limit) return eostream; if (my_isvar_start(&my_charset_bin, *m_cur)) return word; @@ -53,7 +53,7 @@ bool Gis_read_stream::get_next_word(LEX_STRING *res) my_isvar() is a macro that would cause side effects */ m_cur++; - while (my_isvar(&my_charset_bin, *m_cur)) + while ((m_cur < m_limit) && my_isvar(&my_charset_bin, *m_cur)) m_cur++; res->length= (uint32) (m_cur - res->str); @@ -71,16 +71,21 @@ bool Gis_read_stream::get_next_word(LEX_STRING *res) bool Gis_read_stream::get_next_number(double *d) { char *endptr; + int err; skip_space(); - /* The following will also test for end \0 */ - if ((*m_cur < '0' || *m_cur > '9') && *m_cur != '-' && *m_cur != '+') + + if ((m_cur >= m_limit) || + (*m_cur < '0' || *m_cur > '9') && *m_cur != '-' && *m_cur != '+') { set_error_msg("Numeric constant expected"); return 1; } - *d = my_strtod(m_cur, &endptr); + *d = my_strntod(m_charset, (char *)m_cur, + m_limit-m_cur, &endptr, &err); + if (err) + return 1; if (endptr) m_cur = endptr; return 0; @@ -90,7 +95,7 @@ bool Gis_read_stream::get_next_number(double *d) bool Gis_read_stream::check_next_symbol(char symbol) { skip_space(); - if (*m_cur != symbol) + if ((m_cur >= m_limit) || (*m_cur != symbol)) { char buff[32]; strmov(buff, "'?' expected"); diff --git a/sql/gstream.h b/sql/gstream.h index 2e9513d2639..bfbf28851ce 100644 --- a/sql/gstream.h +++ b/sql/gstream.h @@ -29,8 +29,8 @@ public: comma }; - Gis_read_stream(const char *buffer, int size) - :m_cur(buffer), m_limit(buffer + size), m_err_msg(NULL) + Gis_read_stream(CHARSET_INFO *charset, const char *buffer, int size) + :m_cur(buffer), m_limit(buffer + size), m_err_msg(NULL), m_charset(charset) {} Gis_read_stream(): m_cur(NullS), m_limit(NullS), m_err_msg(NullS) {} @@ -46,14 +46,14 @@ public: inline void skip_space() { - while (my_isspace(&my_charset_latin1, *m_cur)) + while ((m_cur < m_limit) && my_isspace(&my_charset_latin1, *m_cur)) m_cur++; } /* Skip next character, if match. Return 1 if no match */ inline bool skip_char(char skip) { skip_space(); - if (*m_cur != skip) + if ((m_cur >= m_limit) || *m_cur != skip) return 1; /* Didn't find char */ m_cur++; return 0; @@ -72,4 +72,5 @@ protected: const char *m_cur; const char *m_limit; char *m_err_msg; + CHARSET_INFO *m_charset; }; diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc index 02c0f5829fd..1c9338f5f35 100644 --- a/sql/item_geofunc.cc +++ b/sql/item_geofunc.cc @@ -31,10 +31,13 @@ String *Item_func_geometry_from_text::val_str(String *str) { Geometry_buffer buffer; - Geometry *geom; String arg_val; String *wkt= args[0]->val_str(&arg_val); - Gis_read_stream trs(wkt->c_ptr(), wkt->length()); + + if ((null_value= args[0]->null_value)) + return 0; + + Gis_read_stream trs(wkt->charset(), wkt->ptr(), wkt->length()); uint32 srid= 0; if ((arg_count == 2) && !args[1]->null_value) @@ -44,8 +47,7 @@ String *Item_func_geometry_from_text::val_str(String *str) return 0; str->length(0); str->q_append(srid); - if ((null_value=(args[0]->null_value || - !(geom= Geometry::create_from_wkt(&buffer, &trs, str, 0))))) + if ((null_value= !Geometry::create_from_wkt(&buffer, &trs, str, 0))) return 0; return str; } diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index bcf534c9e84..3c8689e1588 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -2241,7 +2241,7 @@ String *Item_func_hex::val_str(String *str) return &tmp_value; } -int inline hexchar_to_int(char c) +inline int hexchar_to_int(char c) { if (c <= '9' && c >= '0') return c-'0'; @@ -2721,7 +2721,7 @@ String *Item_func_uuid::val_str(String *str) { ulong tmp=sql_rnd_with_mutex(); uchar mac[6]; - int i; + unsigned int i; if (my_gethwaddr(mac)) { /* diff --git a/sql/spatial.h b/sql/spatial.h index 5d425725437..26396dd0f90 100644 --- a/sql/spatial.h +++ b/sql/spatial.h @@ -157,7 +157,7 @@ struct Geometry_buffer; class Geometry { public: - static void *operator new(unsigned size_t, void *buffer) + static void *operator new(size_t size, void *buffer) { return buffer; } |