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

This commit is contained in:
unknown 2005-05-20 15:30:15 +02:00
commit 355000fa4e
2 changed files with 23 additions and 26 deletions

View file

@ -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,
{ {
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
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
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
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
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
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
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);

View file

@ -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);