Commit 355000fa authored by unknown's avatar unknown

Merge mysql.com:/home/bkroot/mysql-4.1 into mysql.com:/home/bk/c4944-4.1

parents 9364130a f4a584f5
...@@ -96,6 +96,12 @@ static Geometry::Class_info ...@@ -96,6 +96,12 @@ static Geometry::Class_info
geometrycollection_class("GEOMETRYCOLLECTION",Geometry::wkb_geometrycollection, geometrycollection_class("GEOMETRYCOLLECTION",Geometry::wkb_geometrycollection,
create_geometrycollection); create_geometrycollection);
static void get_point(double *x, double *y, const char *data)
{
float8get(*x, data);
float8get(*y, data + SIZEOF_STORED_DOUBLE);
}
/***************************** Geometry *******************************/ /***************************** Geometry *******************************/
Geometry::Class_info *Geometry::find_class(const char *name, uint32 len) Geometry::Class_info *Geometry::find_class(const char *name, uint32 len)
...@@ -266,14 +272,13 @@ const char *Geometry::append_points(String *txt, uint32 n_points, ...@@ -266,14 +272,13 @@ const char *Geometry::append_points(String *txt, uint32 n_points,
{ {
while (n_points--) while (n_points--)
{ {
double d; double x,y;
data+= offset; data+= offset;
float8get(d, data); get_point(&x, &y, data);
txt->qs_append(d);
txt->qs_append(' ');
float8get(d, data + SIZEOF_STORED_DOUBLE);
data+= SIZEOF_STORED_DOUBLE * 2; data+= SIZEOF_STORED_DOUBLE * 2;
txt->qs_append(d); txt->qs_append(x);
txt->qs_append(' ');
txt->qs_append(y);
txt->qs_append(','); txt->qs_append(',');
} }
return data; return data;
...@@ -426,8 +431,7 @@ bool Gis_line_string::get_data_as_wkt(String *txt, const char **end) const ...@@ -426,8 +431,7 @@ bool Gis_line_string::get_data_as_wkt(String *txt, const char **end) const
while (n_points--) while (n_points--)
{ {
double x, y; double x, y;
float8get(x, data); get_point(&x, &y, data);
float8get(y, data + SIZEOF_STORED_DOUBLE);
data+= SIZEOF_STORED_DOUBLE * 2; data+= SIZEOF_STORED_DOUBLE * 2;
txt->qs_append(x); txt->qs_append(x);
txt->qs_append(' '); txt->qs_append(' ');
...@@ -460,15 +464,13 @@ int Gis_line_string::length(double *len) const ...@@ -460,15 +464,13 @@ int Gis_line_string::length(double *len) const
if (n_points < 1 || no_data(data, SIZEOF_STORED_DOUBLE * 2 * n_points)) if (n_points < 1 || no_data(data, SIZEOF_STORED_DOUBLE * 2 * n_points))
return 1; return 1;
float8get(prev_x, data); get_point(&prev_x, &prev_y, data);
float8get(prev_y, data + SIZEOF_STORED_DOUBLE);
data+= SIZEOF_STORED_DOUBLE*2; data+= SIZEOF_STORED_DOUBLE*2;
while (--n_points) while (--n_points)
{ {
double x, y; double x, y;
float8get(x, data); get_point(&x, &y, data);
float8get(y, data + SIZEOF_STORED_DOUBLE);
data+= SIZEOF_STORED_DOUBLE * 2; data+= SIZEOF_STORED_DOUBLE * 2;
*len+= sqrt(pow(prev_x-x,2)+pow(prev_y-y,2)); *len+= sqrt(pow(prev_x-x,2)+pow(prev_y-y,2));
prev_x= x; prev_x= x;
...@@ -497,13 +499,11 @@ int Gis_line_string::is_closed(int *closed) const ...@@ -497,13 +499,11 @@ int Gis_line_string::is_closed(int *closed) const
return 1; return 1;
/* Get first point */ /* Get first point */
float8get(x1, data); get_point(&x1, &y1, data);
float8get(y1, data + SIZEOF_STORED_DOUBLE);
/* get last point */ /* get last point */
data+= SIZEOF_STORED_DOUBLE*2 + (n_points-2)*POINT_DATA_SIZE; data+= SIZEOF_STORED_DOUBLE*2 + (n_points-2)*POINT_DATA_SIZE;
float8get(x2, data); get_point(&x2, &y2, data);
float8get(y2, data + SIZEOF_STORED_DOUBLE);
*closed= (x1==x2) && (y1==y2); *closed= (x1==x2) && (y1==y2);
return 0; return 0;
...@@ -681,15 +681,13 @@ int Gis_polygon::area(double *ar, const char **end_of_data) const ...@@ -681,15 +681,13 @@ int Gis_polygon::area(double *ar, const char **end_of_data) const
n_points= uint4korr(data); n_points= uint4korr(data);
if (no_data(data, (SIZEOF_STORED_DOUBLE*2) * n_points)) if (no_data(data, (SIZEOF_STORED_DOUBLE*2) * n_points))
return 1; return 1;
float8get(prev_x, data+4); get_point(&prev_x, &prev_y, data+4);
float8get(prev_y, data+(4+SIZEOF_STORED_DOUBLE));
data+= (4+SIZEOF_STORED_DOUBLE*2); data+= (4+SIZEOF_STORED_DOUBLE*2);
while (--n_points) // One point is already read while (--n_points) // One point is already read
{ {
double x, y; double x, y;
float8get(x, data); get_point(&x, &y, data);
float8get(y, data + SIZEOF_STORED_DOUBLE);
data+= (SIZEOF_STORED_DOUBLE*2); data+= (SIZEOF_STORED_DOUBLE*2);
/* QQ: Is the following prev_x+x right ? */ /* QQ: Is the following prev_x+x right ? */
lr_area+= (prev_x + x)* (prev_y - y); lr_area+= (prev_x + x)* (prev_y - y);
...@@ -779,7 +777,8 @@ int Gis_polygon::interior_ring_n(uint32 num, String *result) const ...@@ -779,7 +777,8 @@ int Gis_polygon::interior_ring_n(uint32 num, String *result) const
int Gis_polygon::centroid_xy(double *x, double *y) const int Gis_polygon::centroid_xy(double *x, double *y) const
{ {
uint32 n_linear_rings; uint32 n_linear_rings;
double res_area, res_cx, res_cy; double res_area;
double res_cx, res_cy;
const char *data= m_data; const char *data= m_data;
bool first_loop= 1; bool first_loop= 1;
LINT_INIT(res_area); LINT_INIT(res_area);
...@@ -805,15 +804,13 @@ int Gis_polygon::centroid_xy(double *x, double *y) const ...@@ -805,15 +804,13 @@ int Gis_polygon::centroid_xy(double *x, double *y) const
data+= 4; data+= 4;
if (no_data(data, (SIZEOF_STORED_DOUBLE*2) * n_points)) if (no_data(data, (SIZEOF_STORED_DOUBLE*2) * n_points))
return 1; return 1;
float8get(prev_x, data); get_point(&prev_x, &prev_y, data);
float8get(prev_y, data+SIZEOF_STORED_DOUBLE);
data+= (SIZEOF_STORED_DOUBLE*2); data+= (SIZEOF_STORED_DOUBLE*2);
while (--n_points) // One point is already read while (--n_points) // One point is already read
{ {
double x, y; double x, y;
float8get(x, data); get_point(&x, &y, data);
float8get(y, data + SIZEOF_STORED_DOUBLE);
data+= (SIZEOF_STORED_DOUBLE*2); data+= (SIZEOF_STORED_DOUBLE*2);
/* QQ: Is the following prev_x+x right ? */ /* QQ: Is the following prev_x+x right ? */
cur_area+= (prev_x + x) * (prev_y - y); cur_area+= (prev_x + x) * (prev_y - y);
......
...@@ -411,7 +411,7 @@ int mysql_create_function(THD *thd,udf_func *udf) ...@@ -411,7 +411,7 @@ int mysql_create_function(THD *thd,udf_func *udf)
This is done to ensure that only approved dll from the system This is done to ensure that only approved dll from the system
directories are used (to make this even remotely secure). directories are used (to make this even remotely secure).
*/ */
if (strchr(udf->dl, '/') || IF_WIN(strchr(dl_name, '\\'),0)) if (strchr(udf->dl, '/') || IF_WIN(strchr(udf->dl, '\\'),0))
{ {
send_error(thd, ER_UDF_NO_PATHS,ER(ER_UDF_NO_PATHS)); send_error(thd, ER_UDF_NO_PATHS,ER(ER_UDF_NO_PATHS));
DBUG_RETURN(1); DBUG_RETURN(1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment