Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
08431e78
Commit
08431e78
authored
Feb 28, 2007
by
ramil/ram@mysql.com/ramil.myoffice.izhnet.ru
Browse files
Options
Browse Files
Download
Plain Diff
Merge mysql.com:/home/ram/work/b26038/b26038.4.1
into mysql.com:/home/ram/work/b26038/b26038.5.0
parents
486dfab3
04925162
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
93 additions
and
26 deletions
+93
-26
mysql-test/t/gis.test
mysql-test/t/gis.test
+35
-1
sql/item_geofunc.cc
sql/item_geofunc.cc
+17
-12
sql/item_geofunc.h
sql/item_geofunc.h
+32
-5
sql/spatial.cc
sql/spatial.cc
+7
-6
sql/spatial.h
sql/spatial.h
+2
-2
No files found.
mysql-test/t/gis.test
View file @
08431e78
...
@@ -389,7 +389,41 @@ load data infile '../std_data_ln/bad_gis_data.dat' into table t1;
...
@@ -389,7 +389,41 @@ load data infile '../std_data_ln/bad_gis_data.dat' into table t1;
alter
table
t1
enable
keys
;
alter
table
t1
enable
keys
;
drop
table
t1
;
drop
table
t1
;
# End of 4.1 tests
#
# Bug #26038: is null and bad data
#
create
table
t1
(
a
int
,
b
blob
);
insert
into
t1
values
(
1
,
''
),
(
2
,
NULL
),
(
3
,
'1'
);
select
*
from
t1
;
select
geometryfromtext
(
b
)
IS
NULL
,
geometryfromwkb
(
b
)
IS
NULL
,
astext
(
b
)
IS
NULL
,
aswkb
(
b
)
IS
NULL
,
geometrytype
(
b
)
IS
NULL
,
centroid
(
b
)
IS
NULL
,
envelope
(
b
)
IS
NULL
,
startpoint
(
b
)
IS
NULL
,
endpoint
(
b
)
IS
NULL
,
exteriorring
(
b
)
IS
NULL
,
pointn
(
b
,
1
)
IS
NULL
,
geometryn
(
b
,
1
)
IS
NULL
,
interiorringn
(
b
,
1
)
IS
NULL
,
multipoint
(
b
)
IS
NULL
,
isempty
(
b
)
IS
NULL
,
issimple
(
b
)
IS
NULL
,
isclosed
(
b
)
IS
NULL
,
dimension
(
b
)
IS
NULL
,
numgeometries
(
b
)
IS
NULL
,
numinteriorrings
(
b
)
IS
NULL
,
numpoints
(
b
)
IS
NULL
,
area
(
b
)
IS
NULL
,
glength
(
b
)
IS
NULL
,
srid
(
b
)
IS
NULL
,
x
(
b
)
IS
NULL
,
y
(
b
)
IS
NULL
from
t1
;
select
within
(
b
,
b
)
IS
NULL
,
contains
(
b
,
b
)
IS
NULL
,
overlaps
(
b
,
b
)
IS
NULL
,
equals
(
b
,
b
)
IS
NULL
,
disjoint
(
b
,
b
)
IS
NULL
,
touches
(
b
,
b
)
IS
NULL
,
intersects
(
b
,
b
)
IS
NULL
,
crosses
(
b
,
b
)
IS
NULL
from
t1
;
select
point
(
b
,
b
)
IS
NULL
,
linestring
(
b
)
IS
NULL
,
polygon
(
b
)
IS
NULL
,
multipoint
(
b
)
IS
NULL
,
multilinestring
(
b
)
IS
NULL
,
multipolygon
(
b
)
IS
NULL
,
geometrycollection
(
b
)
IS
NULL
from
t1
;
drop
table
t1
;
--
echo
End
of
4.1
tests
#
#
# Bug #12281 (Geometry: crash in trigger)
# Bug #12281 (Geometry: crash in trigger)
...
...
sql/item_geofunc.cc
View file @
08431e78
...
@@ -35,6 +35,7 @@ void Item_geometry_func::fix_length_and_dec()
...
@@ -35,6 +35,7 @@ void Item_geometry_func::fix_length_and_dec()
collation
.
set
(
&
my_charset_bin
);
collation
.
set
(
&
my_charset_bin
);
decimals
=
0
;
decimals
=
0
;
max_length
=
MAX_BLOB_WIDTH
;
max_length
=
MAX_BLOB_WIDTH
;
maybe_null
=
1
;
}
}
int
Item_geometry_func
::
get_geometry_type
()
const
int
Item_geometry_func
::
get_geometry_type
()
const
...
@@ -121,6 +122,7 @@ String *Item_func_as_wkt::val_str(String *str)
...
@@ -121,6 +122,7 @@ String *Item_func_as_wkt::val_str(String *str)
void
Item_func_as_wkt
::
fix_length_and_dec
()
void
Item_func_as_wkt
::
fix_length_and_dec
()
{
{
max_length
=
MAX_BLOB_WIDTH
;
max_length
=
MAX_BLOB_WIDTH
;
maybe_null
=
1
;
}
}
...
@@ -386,7 +388,8 @@ String *Item_func_spatial_collection::val_str(String *str)
...
@@ -386,7 +388,8 @@ String *Item_func_spatial_collection::val_str(String *str)
for
(
i
=
0
;
i
<
arg_count
;
++
i
)
for
(
i
=
0
;
i
<
arg_count
;
++
i
)
{
{
String
*
res
=
args
[
i
]
->
val_str
(
&
arg_value
);
String
*
res
=
args
[
i
]
->
val_str
(
&
arg_value
);
if
(
args
[
i
]
->
null_value
)
uint32
len
;
if
(
args
[
i
]
->
null_value
||
((
len
=
res
->
length
())
<
WKB_HEADER_SIZE
))
goto
err
;
goto
err
;
if
(
coll_type
==
Geometry
::
wkb_geometrycollection
)
if
(
coll_type
==
Geometry
::
wkb_geometrycollection
)
...
@@ -395,13 +398,12 @@ String *Item_func_spatial_collection::val_str(String *str)
...
@@ -395,13 +398,12 @@ String *Item_func_spatial_collection::val_str(String *str)
In the case of GeometryCollection we don't need any checkings
In the case of GeometryCollection we don't need any checkings
for item types, so just copy them into target collection
for item types, so just copy them into target collection
*/
*/
if
(
str
->
append
(
res
->
ptr
(),
res
->
length
()
,
(
uint32
)
512
))
if
(
str
->
append
(
res
->
ptr
(),
len
,
(
uint32
)
512
))
goto
err
;
goto
err
;
}
}
else
else
{
{
enum
Geometry
::
wkbType
wkb_type
;
enum
Geometry
::
wkbType
wkb_type
;
uint32
len
=
res
->
length
();
const
char
*
data
=
res
->
ptr
()
+
1
;
const
char
*
data
=
res
->
ptr
()
+
1
;
/*
/*
...
@@ -409,8 +411,6 @@ String *Item_func_spatial_collection::val_str(String *str)
...
@@ -409,8 +411,6 @@ String *Item_func_spatial_collection::val_str(String *str)
are of specific type, let's do this checking now
are of specific type, let's do this checking now
*/
*/
if
(
len
<
5
)
goto
err
;
wkb_type
=
(
Geometry
::
wkbType
)
uint4korr
(
data
);
wkb_type
=
(
Geometry
::
wkbType
)
uint4korr
(
data
);
data
+=
4
;
data
+=
4
;
len
-=
5
;
len
-=
5
;
...
@@ -532,9 +532,13 @@ longlong Item_func_spatial_rel::val_int()
...
@@ -532,9 +532,13 @@ longlong Item_func_spatial_rel::val_int()
longlong
Item_func_isempty
::
val_int
()
longlong
Item_func_isempty
::
val_int
()
{
{
DBUG_ASSERT
(
fixed
==
1
);
DBUG_ASSERT
(
fixed
==
1
);
String
tmp
;
String
tmp
;
null_value
=
0
;
String
*
swkb
=
args
[
0
]
->
val_str
(
&
tmp
);
return
args
[
0
]
->
null_value
?
1
:
0
;
Geometry_buffer
buffer
;
null_value
=
args
[
0
]
->
null_value
||
!
(
Geometry
::
construct
(
&
buffer
,
swkb
->
ptr
(),
swkb
->
length
()));
return
null_value
?
1
:
0
;
}
}
...
@@ -542,10 +546,11 @@ longlong Item_func_issimple::val_int()
...
@@ -542,10 +546,11 @@ longlong Item_func_issimple::val_int()
{
{
DBUG_ASSERT
(
fixed
==
1
);
DBUG_ASSERT
(
fixed
==
1
);
String
tmp
;
String
tmp
;
String
*
wkb
=
args
[
0
]
->
val_str
(
&
tmp
);
String
*
swkb
=
args
[
0
]
->
val_str
(
&
tmp
);
Geometry_buffer
buffer
;
if
((
null_value
=
(
!
wkb
||
args
[
0
]
->
null_value
)))
return
0
;
null_value
=
args
[
0
]
->
null_value
||
!
(
Geometry
::
construct
(
&
buffer
,
swkb
->
ptr
(),
swkb
->
length
()));
/* TODO: Ramil or Holyfoot, add real IsSimple calculation */
/* TODO: Ramil or Holyfoot, add real IsSimple calculation */
return
0
;
return
0
;
}
}
...
...
sql/item_geofunc.h
View file @
08431e78
...
@@ -34,6 +34,7 @@ class Item_geometry_func: public Item_str_func
...
@@ -34,6 +34,7 @@ class Item_geometry_func: public Item_str_func
enum_field_types
field_type
()
const
{
return
MYSQL_TYPE_GEOMETRY
;
}
enum_field_types
field_type
()
const
{
return
MYSQL_TYPE_GEOMETRY
;
}
Field
*
tmp_table_field
(
TABLE
*
t_arg
);
Field
*
tmp_table_field
(
TABLE
*
t_arg
);
virtual
int
get_geometry_type
()
const
;
virtual
int
get_geometry_type
()
const
;
bool
is_null
()
{
(
void
)
val_int
();
return
null_value
;
}
};
};
class
Item_func_geometry_from_text
:
public
Item_geometry_func
class
Item_func_geometry_from_text
:
public
Item_geometry_func
...
@@ -81,6 +82,7 @@ class Item_func_geometry_type: public Item_str_func
...
@@ -81,6 +82,7 @@ class Item_func_geometry_type: public Item_str_func
void
fix_length_and_dec
()
void
fix_length_and_dec
()
{
{
max_length
=
20
;
// "GeometryCollection" is the most long
max_length
=
20
;
// "GeometryCollection" is the most long
maybe_null
=
1
;
};
};
};
};
...
@@ -225,6 +227,8 @@ class Item_func_spatial_rel: public Item_bool_func2
...
@@ -225,6 +227,8 @@ class Item_func_spatial_rel: public Item_bool_func2
}
}
}
}
void
print
(
String
*
str
)
{
Item_func
::
print
(
str
);
}
void
print
(
String
*
str
)
{
Item_func
::
print
(
str
);
}
void
fix_length_and_dec
()
{
maybe_null
=
1
;
}
bool
is_null
()
{
(
void
)
val_int
();
return
null_value
;
}
};
};
class
Item_func_isempty
:
public
Item_bool_func
class
Item_func_isempty
:
public
Item_bool_func
...
@@ -234,6 +238,7 @@ class Item_func_isempty: public Item_bool_func
...
@@ -234,6 +238,7 @@ class Item_func_isempty: public Item_bool_func
longlong
val_int
();
longlong
val_int
();
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
const
char
*
func_name
()
const
{
return
"isempty"
;
}
const
char
*
func_name
()
const
{
return
"isempty"
;
}
void
fix_length_and_dec
()
{
maybe_null
=
1
;
}
};
};
class
Item_func_issimple
:
public
Item_bool_func
class
Item_func_issimple
:
public
Item_bool_func
...
@@ -243,6 +248,7 @@ class Item_func_issimple: public Item_bool_func
...
@@ -243,6 +248,7 @@ class Item_func_issimple: public Item_bool_func
longlong
val_int
();
longlong
val_int
();
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
const
char
*
func_name
()
const
{
return
"issimple"
;
}
const
char
*
func_name
()
const
{
return
"issimple"
;
}
void
fix_length_and_dec
()
{
maybe_null
=
1
;
}
};
};
class
Item_func_isclosed
:
public
Item_bool_func
class
Item_func_isclosed
:
public
Item_bool_func
...
@@ -252,6 +258,7 @@ class Item_func_isclosed: public Item_bool_func
...
@@ -252,6 +258,7 @@ class Item_func_isclosed: public Item_bool_func
longlong
val_int
();
longlong
val_int
();
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
const
char
*
func_name
()
const
{
return
"isclosed"
;
}
const
char
*
func_name
()
const
{
return
"isclosed"
;
}
void
fix_length_and_dec
()
{
maybe_null
=
1
;
}
};
};
class
Item_func_dimension
:
public
Item_int_func
class
Item_func_dimension
:
public
Item_int_func
...
@@ -261,7 +268,7 @@ class Item_func_dimension: public Item_int_func
...
@@ -261,7 +268,7 @@ class Item_func_dimension: public Item_int_func
Item_func_dimension
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
Item_func_dimension
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
longlong
val_int
();
longlong
val_int
();
const
char
*
func_name
()
const
{
return
"dimension"
;
}
const
char
*
func_name
()
const
{
return
"dimension"
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
maybe_null
=
1
;
}
};
};
class
Item_func_x
:
public
Item_real_func
class
Item_func_x
:
public
Item_real_func
...
@@ -271,6 +278,11 @@ class Item_func_x: public Item_real_func
...
@@ -271,6 +278,11 @@ class Item_func_x: public Item_real_func
Item_func_x
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
Item_func_x
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
double
val_real
();
double
val_real
();
const
char
*
func_name
()
const
{
return
"x"
;
}
const
char
*
func_name
()
const
{
return
"x"
;
}
void
fix_length_and_dec
()
{
Item_real_func
::
fix_length_and_dec
();
maybe_null
=
1
;
}
};
};
...
@@ -281,6 +293,11 @@ class Item_func_y: public Item_real_func
...
@@ -281,6 +293,11 @@ class Item_func_y: public Item_real_func
Item_func_y
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
Item_func_y
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
double
val_real
();
double
val_real
();
const
char
*
func_name
()
const
{
return
"y"
;
}
const
char
*
func_name
()
const
{
return
"y"
;
}
void
fix_length_and_dec
()
{
Item_real_func
::
fix_length_and_dec
();
maybe_null
=
1
;
}
};
};
...
@@ -291,7 +308,7 @@ class Item_func_numgeometries: public Item_int_func
...
@@ -291,7 +308,7 @@ class Item_func_numgeometries: public Item_int_func
Item_func_numgeometries
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
Item_func_numgeometries
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
longlong
val_int
();
longlong
val_int
();
const
char
*
func_name
()
const
{
return
"numgeometries"
;
}
const
char
*
func_name
()
const
{
return
"numgeometries"
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
maybe_null
=
1
;
}
};
};
...
@@ -302,7 +319,7 @@ class Item_func_numinteriorring: public Item_int_func
...
@@ -302,7 +319,7 @@ class Item_func_numinteriorring: public Item_int_func
Item_func_numinteriorring
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
Item_func_numinteriorring
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
longlong
val_int
();
longlong
val_int
();
const
char
*
func_name
()
const
{
return
"numinteriorrings"
;
}
const
char
*
func_name
()
const
{
return
"numinteriorrings"
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
maybe_null
=
1
;
}
};
};
...
@@ -313,7 +330,7 @@ class Item_func_numpoints: public Item_int_func
...
@@ -313,7 +330,7 @@ class Item_func_numpoints: public Item_int_func
Item_func_numpoints
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
Item_func_numpoints
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
longlong
val_int
();
longlong
val_int
();
const
char
*
func_name
()
const
{
return
"numpoints"
;
}
const
char
*
func_name
()
const
{
return
"numpoints"
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
maybe_null
=
1
;
}
};
};
...
@@ -324,6 +341,11 @@ class Item_func_area: public Item_real_func
...
@@ -324,6 +341,11 @@ class Item_func_area: public Item_real_func
Item_func_area
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
Item_func_area
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
double
val_real
();
double
val_real
();
const
char
*
func_name
()
const
{
return
"area"
;
}
const
char
*
func_name
()
const
{
return
"area"
;
}
void
fix_length_and_dec
()
{
Item_real_func
::
fix_length_and_dec
();
maybe_null
=
1
;
}
};
};
...
@@ -334,6 +356,11 @@ class Item_func_glength: public Item_real_func
...
@@ -334,6 +356,11 @@ class Item_func_glength: public Item_real_func
Item_func_glength
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
Item_func_glength
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
double
val_real
();
double
val_real
();
const
char
*
func_name
()
const
{
return
"glength"
;
}
const
char
*
func_name
()
const
{
return
"glength"
;
}
void
fix_length_and_dec
()
{
Item_real_func
::
fix_length_and_dec
();
maybe_null
=
1
;
}
};
};
...
@@ -344,7 +371,7 @@ class Item_func_srid: public Item_int_func
...
@@ -344,7 +371,7 @@ class Item_func_srid: public Item_int_func
Item_func_srid
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
Item_func_srid
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
longlong
val_int
();
longlong
val_int
();
const
char
*
func_name
()
const
{
return
"srid"
;
}
const
char
*
func_name
()
const
{
return
"srid"
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
}
void
fix_length_and_dec
()
{
max_length
=
10
;
maybe_null
=
1
;
}
};
};
#define GEOM_NEW(obj_constructor) new obj_constructor
#define GEOM_NEW(obj_constructor) new obj_constructor
...
...
sql/spatial.cc
View file @
08431e78
...
@@ -213,23 +213,24 @@ static uint32 wkb_get_uint(const char *ptr, Geometry::wkbByteOrder bo)
...
@@ -213,23 +213,24 @@ static uint32 wkb_get_uint(const char *ptr, Geometry::wkbByteOrder bo)
}
}
int
Geometry
::
create_from_wkb
(
Geometry_buffer
*
buffer
,
Geometry
*
Geometry
::
create_from_wkb
(
Geometry_buffer
*
buffer
,
const
char
*
wkb
,
uint32
len
,
String
*
res
)
const
char
*
wkb
,
uint32
len
,
String
*
res
)
{
{
uint32
geom_type
;
uint32
geom_type
;
Geometry
*
geom
;
Geometry
*
geom
;
if
(
len
<
WKB_HEADER_SIZE
)
if
(
len
<
WKB_HEADER_SIZE
)
return
1
;
return
NULL
;
geom_type
=
wkb_get_uint
(
wkb
+
1
,
(
wkbByteOrder
)
wkb
[
0
]);
geom_type
=
wkb_get_uint
(
wkb
+
1
,
(
wkbByteOrder
)
wkb
[
0
]);
if
(
!
(
geom
=
create_by_typeid
(
buffer
,
(
int
)
geom_type
))
||
if
(
!
(
geom
=
create_by_typeid
(
buffer
,
(
int
)
geom_type
))
||
res
->
reserve
(
WKB_HEADER_SIZE
,
512
))
res
->
reserve
(
WKB_HEADER_SIZE
,
512
))
return
1
;
return
NULL
;
res
->
q_append
((
char
)
wkb_ndr
);
res
->
q_append
((
char
)
wkb_ndr
);
res
->
q_append
(
geom_type
);
res
->
q_append
(
geom_type
);
return
geom
->
init_from_wkb
(
wkb
+
WKB_HEADER_SIZE
,
len
-
WKB_HEADER_SIZE
,
(
wkbByteOrder
)
wkb
[
0
],
res
);
return
geom
->
init_from_wkb
(
wkb
+
WKB_HEADER_SIZE
,
len
-
WKB_HEADER_SIZE
,
(
wkbByteOrder
)
wkb
[
0
],
res
)
?
geom
:
NULL
;
}
}
...
...
sql/spatial.h
View file @
08431e78
...
@@ -246,8 +246,8 @@ class Geometry
...
@@ -246,8 +246,8 @@ class Geometry
static
Geometry
*
create_from_wkt
(
Geometry_buffer
*
buffer
,
static
Geometry
*
create_from_wkt
(
Geometry_buffer
*
buffer
,
Gis_read_stream
*
trs
,
String
*
wkt
,
Gis_read_stream
*
trs
,
String
*
wkt
,
bool
init_stream
=
1
);
bool
init_stream
=
1
);
static
int
create_from_wkb
(
Geometry_buffer
*
buffer
,
static
Geometry
*
create_from_wkb
(
Geometry_buffer
*
buffer
,
const
char
*
wkb
,
const
char
*
wkb
,
uint32
len
,
String
*
res
);
uint32
len
,
String
*
res
);
int
as_wkt
(
String
*
wkt
,
const
char
**
end
)
int
as_wkt
(
String
*
wkt
,
const
char
**
end
)
{
{
uint32
len
=
get_class_info
()
->
m_name
.
length
;
uint32
len
=
get_class_info
()
->
m_name
.
length
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment