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;
alter
table
t1
enable
keys
;
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)
...
...
sql/item_geofunc.cc
View file @
08431e78
...
...
@@ -35,6 +35,7 @@ void Item_geometry_func::fix_length_and_dec()
collation
.
set
(
&
my_charset_bin
);
decimals
=
0
;
max_length
=
MAX_BLOB_WIDTH
;
maybe_null
=
1
;
}
int
Item_geometry_func
::
get_geometry_type
()
const
...
...
@@ -121,6 +122,7 @@ String *Item_func_as_wkt::val_str(String *str)
void
Item_func_as_wkt
::
fix_length_and_dec
()
{
max_length
=
MAX_BLOB_WIDTH
;
maybe_null
=
1
;
}
...
...
@@ -386,7 +388,8 @@ String *Item_func_spatial_collection::val_str(String *str)
for
(
i
=
0
;
i
<
arg_count
;
++
i
)
{
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
;
if
(
coll_type
==
Geometry
::
wkb_geometrycollection
)
...
...
@@ -395,13 +398,12 @@ String *Item_func_spatial_collection::val_str(String *str)
In the case of GeometryCollection we don't need any checkings
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
;
}
else
{
enum
Geometry
::
wkbType
wkb_type
;
uint32
len
=
res
->
length
();
const
char
*
data
=
res
->
ptr
()
+
1
;
/*
...
...
@@ -409,8 +411,6 @@ String *Item_func_spatial_collection::val_str(String *str)
are of specific type, let's do this checking now
*/
if
(
len
<
5
)
goto
err
;
wkb_type
=
(
Geometry
::
wkbType
)
uint4korr
(
data
);
data
+=
4
;
len
-=
5
;
...
...
@@ -532,9 +532,13 @@ longlong Item_func_spatial_rel::val_int()
longlong
Item_func_isempty
::
val_int
()
{
DBUG_ASSERT
(
fixed
==
1
);
String
tmp
;
null_value
=
0
;
return
args
[
0
]
->
null_value
?
1
:
0
;
String
tmp
;
String
*
swkb
=
args
[
0
]
->
val_str
(
&
tmp
);
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()
{
DBUG_ASSERT
(
fixed
==
1
);
String
tmp
;
String
*
wkb
=
args
[
0
]
->
val_str
(
&
tmp
);
if
((
null_value
=
(
!
wkb
||
args
[
0
]
->
null_value
)))
return
0
;
String
*
swkb
=
args
[
0
]
->
val_str
(
&
tmp
);
Geometry_buffer
buffer
;
null_value
=
args
[
0
]
->
null_value
||
!
(
Geometry
::
construct
(
&
buffer
,
swkb
->
ptr
(),
swkb
->
length
()));
/* TODO: Ramil or Holyfoot, add real IsSimple calculation */
return
0
;
}
...
...
sql/item_geofunc.h
View file @
08431e78
...
...
@@ -34,6 +34,7 @@ class Item_geometry_func: public Item_str_func
enum_field_types
field_type
()
const
{
return
MYSQL_TYPE_GEOMETRY
;
}
Field
*
tmp_table_field
(
TABLE
*
t_arg
);
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
...
...
@@ -81,6 +82,7 @@ class Item_func_geometry_type: public Item_str_func
void
fix_length_and_dec
()
{
max_length
=
20
;
// "GeometryCollection" is the most long
maybe_null
=
1
;
};
};
...
...
@@ -225,6 +227,8 @@ class Item_func_spatial_rel: public Item_bool_func2
}
}
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
...
...
@@ -234,6 +238,7 @@ class Item_func_isempty: public Item_bool_func
longlong
val_int
();
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
const
char
*
func_name
()
const
{
return
"isempty"
;
}
void
fix_length_and_dec
()
{
maybe_null
=
1
;
}
};
class
Item_func_issimple
:
public
Item_bool_func
...
...
@@ -243,6 +248,7 @@ class Item_func_issimple: public Item_bool_func
longlong
val_int
();
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
const
char
*
func_name
()
const
{
return
"issimple"
;
}
void
fix_length_and_dec
()
{
maybe_null
=
1
;
}
};
class
Item_func_isclosed
:
public
Item_bool_func
...
...
@@ -252,6 +258,7 @@ class Item_func_isclosed: public Item_bool_func
longlong
val_int
();
optimize_type
select_optimize
()
const
{
return
OPTIMIZE_NONE
;
}
const
char
*
func_name
()
const
{
return
"isclosed"
;
}
void
fix_length_and_dec
()
{
maybe_null
=
1
;
}
};
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
)
{}
longlong
val_int
();
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
...
...
@@ -271,6 +278,11 @@ class Item_func_x: public Item_real_func
Item_func_x
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
double
val_real
();
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
Item_func_y
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
double
val_real
();
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
Item_func_numgeometries
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
longlong
val_int
();
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
Item_func_numinteriorring
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
longlong
val_int
();
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
Item_func_numpoints
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
longlong
val_int
();
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
Item_func_area
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
double
val_real
();
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
Item_func_glength
(
Item
*
a
)
:
Item_real_func
(
a
)
{}
double
val_real
();
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
Item_func_srid
(
Item
*
a
)
:
Item_int_func
(
a
)
{}
longlong
val_int
();
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
...
...
sql/spatial.cc
View file @
08431e78
...
...
@@ -213,23 +213,24 @@ static uint32 wkb_get_uint(const char *ptr, Geometry::wkbByteOrder bo)
}
int
Geometry
::
create_from_wkb
(
Geometry_buffer
*
buffer
,
const
char
*
wkb
,
uint32
len
,
String
*
res
)
Geometry
*
Geometry
::
create_from_wkb
(
Geometry_buffer
*
buffer
,
const
char
*
wkb
,
uint32
len
,
String
*
res
)
{
uint32
geom_type
;
Geometry
*
geom
;
if
(
len
<
WKB_HEADER_SIZE
)
return
1
;
return
NULL
;
geom_type
=
wkb_get_uint
(
wkb
+
1
,
(
wkbByteOrder
)
wkb
[
0
]);
if
(
!
(
geom
=
create_by_typeid
(
buffer
,
(
int
)
geom_type
))
||
res
->
reserve
(
WKB_HEADER_SIZE
,
512
))
return
1
;
return
NULL
;
res
->
q_append
((
char
)
wkb_ndr
);
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
static
Geometry
*
create_from_wkt
(
Geometry_buffer
*
buffer
,
Gis_read_stream
*
trs
,
String
*
wkt
,
bool
init_stream
=
1
);
static
int
create_from_wkb
(
Geometry_buffer
*
buffer
,
const
char
*
wkb
,
uint32
len
,
String
*
res
);
static
Geometry
*
create_from_wkb
(
Geometry_buffer
*
buffer
,
const
char
*
wkb
,
uint32
len
,
String
*
res
);
int
as_wkt
(
String
*
wkt
,
const
char
**
end
)
{
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