summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Petrunia <psergey@askmonty.org>2017-08-07 16:13:17 +0300
committerSergei Petrunia <psergey@askmonty.org>2017-08-07 16:13:17 +0300
commit1fad491cffd37c4b7b6ee6536e2dc03c91cab3b9 (patch)
treef5967518a8eaa39baaca083b152e88a9182511e9
parent0b30ce4f31cfbaad9582432d35e3c38464eba08e (diff)
parentdcdc1c6d09b4a49b13fa8b1448064110bc296f86 (diff)
downloadmariadb-git-1fad491cffd37c4b7b6ee6536e2dc03c91cab3b9.tar.gz
Merge branch '10.2' of github.com:MariaDB/server into 10.2
-rw-r--r--mysql-test/r/func_json.result6
-rw-r--r--mysql-test/r/gis-json.result15
-rw-r--r--mysql-test/t/func_json.test6
-rw-r--r--mysql-test/t/gis-json.test7
-rw-r--r--sql/item_geofunc.cc33
-rw-r--r--sql/spatial.cc52
-rw-r--r--sql/spatial.h1
-rw-r--r--storage/innobase/ibuf/ibuf0ibuf.cc3
-rw-r--r--storage/innobase/log/log0log.cc3
-rw-r--r--storage/innobase/mtr/mtr0mtr.cc3
-rw-r--r--strings/json_lib.c2
11 files changed, 118 insertions, 13 deletions
diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result
index 997d3e4d062..894e46017f7 100644
--- a/mysql-test/r/func_json.result
+++ b/mysql-test/r/func_json.result
@@ -642,3 +642,9 @@ SELECT JSON_KEYS(f) FROM t1 ORDER BY 1;
JSON_KEYS(f)
NULL
DROP TABLE t1;
+SELECT JSON_EXTRACT( '{"foo":"bar"}', '$[*].*' );
+JSON_EXTRACT( '{"foo":"bar"}', '$[*].*' )
+NULL
+SELECT JSON_EXTRACT( '{"foo":"bar"}', '$[*]' );
+JSON_EXTRACT( '{"foo":"bar"}', '$[*]' )
+NULL
diff --git a/mysql-test/r/gis-json.result b/mysql-test/r/gis-json.result
index 8d7c2d12172..d888b08351d 100644
--- a/mysql-test/r/gis-json.result
+++ b/mysql-test/r/gis-json.result
@@ -74,6 +74,21 @@ POINT(5.3 15)
SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',4));
ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',4))
POINT(5.3 15)
+SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),2);
+ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),2)
+{"type": "Point", "coordinates": [5.36, 7.27]}
+SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),1);
+ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),1)
+{"type": "Point", "coordinates": [5.4, 7.3]}
+SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),10);
+ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),10)
+{"type": "Point", "coordinates": [5.363, 7.266]}
+SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 1);
+ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 1)
+{"bbox": [10, 11, 10, 11], "type": "Point", "coordinates": [10, 11]}
+SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5);
+ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5)
+{"bbox": [10, 11, 10, 11], "type": "Point", "coordinates": [10, 11]}
#
# End of 10.2 tests
#
diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test
index 0fc8e97b284..0ce742aac11 100644
--- a/mysql-test/t/func_json.test
+++ b/mysql-test/t/func_json.test
@@ -296,3 +296,9 @@ INSERT INTO t1 VALUES (0);
SELECT JSON_KEYS(f) FROM t1 ORDER BY 1;
DROP TABLE t1;
+#
+# MDEV-12324 Wrong result (phantom array value) on JSON_EXTRACT.
+#
+SELECT JSON_EXTRACT( '{"foo":"bar"}', '$[*].*' );
+SELECT JSON_EXTRACT( '{"foo":"bar"}', '$[*]' );
+
diff --git a/mysql-test/t/gis-json.test b/mysql-test/t/gis-json.test
index 67674c9b33f..5e695fbca9c 100644
--- a/mysql-test/t/gis-json.test
+++ b/mysql-test/t/gis-json.test
@@ -33,6 +33,13 @@ SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.
SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',3));
SELECT ST_AsText(ST_GeomFromGeoJSON('{ "type": "Point", "coordinates": [5.3, 15.0, 4.3]}',4));
+SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),2);
+SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),1);
+SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),10);
+
+SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 1);
+SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5);
+
--echo #
--echo # End of 10.2 tests
--echo #
diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc
index 8c9b61d98a1..3f0efbfa871 100644
--- a/sql/item_geofunc.cc
+++ b/sql/item_geofunc.cc
@@ -259,6 +259,8 @@ String *Item_func_as_geojson::val_str_ascii(String *str)
DBUG_ASSERT(fixed == 1);
String arg_val;
String *swkb= args[0]->val_str(&arg_val);
+ uint max_dec= FLOATING_POINT_DECIMALS;
+ longlong options= 0;
Geometry_buffer buffer;
Geometry *geom= NULL;
const char *dummy;
@@ -268,12 +270,41 @@ String *Item_func_as_geojson::val_str_ascii(String *str)
!(geom= Geometry::construct(&buffer, swkb->ptr(), swkb->length())))))
return 0;
+ if (arg_count > 1)
+ {
+ max_dec= (uint) args[1]->val_int();
+ if (args[1]->null_value)
+ max_dec= FLOATING_POINT_DECIMALS;
+ if (arg_count > 2)
+ {
+ options= args[2]->val_int();
+ if (args[2]->null_value)
+ options= 0;
+ }
+ }
+
str->length(0);
str->set_charset(&my_charset_latin1);
- if ((null_value= geom->as_json(str, FLOATING_POINT_DECIMALS, &dummy)))
+
+ if (str->reserve(1, 512))
return 0;
+ str->qs_append('{');
+
+ if (options & 1)
+ {
+ if (geom->bbox_as_json(str) || str->append(", ", 2))
+ goto error;
+ }
+
+ if ((geom->as_json(str, max_dec, &dummy) || str->append("}", 1)))
+ goto error;
+
return str;
+
+error:
+ null_value= 1;
+ return 0;
}
diff --git a/sql/spatial.cc b/sql/spatial.cc
index 095f7ff81db..1ba754b6b13 100644
--- a/sql/spatial.cc
+++ b/sql/spatial.cc
@@ -21,6 +21,10 @@
#include "gstream.h" // Gis_read_stream
#include "sql_string.h" // String
+/* This is from item_func.h. Didn't want to #include the whole file. */
+double my_double_round(double value, longlong dec, bool dec_unsigned,
+ bool truncate);
+
#ifdef HAVE_SPATIAL
/*
@@ -250,6 +254,8 @@ static const uchar feature_type[]= "feature";
static const int feature_type_len= 7;
static const uchar feature_coll_type[]= "featurecollection";
static const int feature_coll_type_len= 17;
+static const uchar bbox_keyname[]= "bbox";
+static const int bbox_keyname_len= 4;
int Geometry::as_json(String *wkt, uint max_dec_digits, const char **end)
@@ -258,7 +264,7 @@ int Geometry::as_json(String *wkt, uint max_dec_digits, const char **end)
if (wkt->reserve(4 + type_keyname_len + 2 + len + 2 + 2 +
coord_keyname_len + 4, 512))
return 1;
- wkt->qs_append("{\"", 2);
+ wkt->qs_append("\"", 1);
wkt->qs_append((const char *) type_keyname, type_keyname_len);
wkt->qs_append("\": \"", 4);
wkt->qs_append(get_class_info()->m_geojson_name.str, len);
@@ -269,10 +275,35 @@ int Geometry::as_json(String *wkt, uint max_dec_digits, const char **end)
wkt->qs_append((const char *) coord_keyname, coord_keyname_len);
wkt->qs_append("\": ", 3);
- if (get_data_as_json(wkt, max_dec_digits, end) ||
- wkt->reserve(1))
+ if (get_data_as_json(wkt, max_dec_digits, end))
return 1;
- wkt->qs_append('}');
+
+ return 0;
+}
+
+
+int Geometry::bbox_as_json(String *wkt)
+{
+ MBR mbr;
+ const char *end;
+ if (wkt->reserve(5 + bbox_keyname_len + (FLOATING_POINT_DECIMALS+2)*4, 512))
+ return 1;
+ wkt->qs_append("\"", 1);
+ wkt->qs_append((const char *) bbox_keyname, bbox_keyname_len);
+ wkt->qs_append("\": [", 4);
+
+ if (get_mbr(&mbr, &end))
+ return 1;
+
+ wkt->qs_append(mbr.xmin);
+ wkt->qs_append(", ", 2);
+ wkt->qs_append(mbr.ymin);
+ wkt->qs_append(", ", 2);
+ wkt->qs_append(mbr.xmax);
+ wkt->qs_append(", ", 2);
+ wkt->qs_append(mbr.ymax);
+ wkt->qs_append("]", 1);
+
return 0;
}
@@ -670,6 +701,11 @@ static void append_json_point(String *txt, uint max_dec, const char *data)
{
double x,y;
get_point(&x, &y, data);
+ if (max_dec < FLOATING_POINT_DECIMALS)
+ {
+ x= my_double_round(x, max_dec, FALSE, FALSE);
+ y= my_double_round(y, max_dec, FALSE, FALSE);
+ }
txt->qs_append('[');
txt->qs_append(x);
txt->qs_append(", ", 2);
@@ -3106,12 +3142,14 @@ bool Gis_geometry_collection::get_data_as_json(String *txt, uint max_dec_digits,
if (!(geom= create_by_typeid(&buffer, wkb_type)))
return 1;
geom->set_data_ptr(data, (uint) (m_data_end - data));
- if (geom->as_json(txt, max_dec_digits, &data) ||
- txt->append(STRING_WITH_LEN(", "), 512))
+ if (txt->append("{", 1) ||
+ geom->as_json(txt, max_dec_digits, &data) ||
+ txt->append(STRING_WITH_LEN("}, "), 512))
return 1;
}
txt->length(txt->length() - 2);
- txt->qs_append(']');
+ if (txt->append("]", 1))
+ return 1;
*end= data;
return 0;
diff --git a/sql/spatial.h b/sql/spatial.h
index 45f335596c8..78e850dc2d7 100644
--- a/sql/spatial.h
+++ b/sql/spatial.h
@@ -323,6 +323,7 @@ public:
String *res, Gcalc_result_receiver &rr);
int as_wkt(String *wkt, const char **end);
int as_json(String *wkt, uint max_dec_digits, const char **end);
+ int bbox_as_json(String *wkt);
inline void set_data_ptr(const char *data, uint32 data_len)
{
diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc
index b4cbe7d4480..d021f8c0085 100644
--- a/storage/innobase/ibuf/ibuf0ibuf.cc
+++ b/storage/innobase/ibuf/ibuf0ibuf.cc
@@ -534,7 +534,6 @@ ibuf_init_at_db_start(void)
fseg_n_reserved_pages(header_page + IBUF_HEADER + IBUF_TREE_SEG_HEADER,
&n_used, &mtr);
- ibuf_enter(&mtr);
ut_ad(n_used >= 2);
@@ -556,7 +555,7 @@ ibuf_init_at_db_start(void)
mutex_exit(&ibuf_mutex);
ibuf->empty = page_is_empty(root);
- ibuf_mtr_commit(&mtr);
+ mtr.commit();
ibuf->index = dict_mem_index_create(
"innodb_change_buffer", "CLUST_IND",
diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc
index 9a61e2067a4..d892f22f967 100644
--- a/storage/innobase/log/log0log.cc
+++ b/storage/innobase/log/log0log.cc
@@ -359,7 +359,6 @@ log_reserve_and_open(
loop:
ut_ad(log_mutex_own());
- ut_ad(!recv_no_log_write);
if (log_sys->is_extending) {
log_mutex_exit();
@@ -416,7 +415,6 @@ log_write_low(
ut_ad(log_mutex_own());
part_loop:
- ut_ad(!recv_no_log_write);
/* Calculate a part length */
data_len = (log->buf_free % OS_FILE_LOG_BLOCK_SIZE) + str_len;
@@ -2291,6 +2289,7 @@ log_pad_current_log_block(void)
ulint i;
lsn_t lsn;
+ ut_ad(!recv_no_log_write);
/* We retrieve lsn only because otherwise gcc crashed on HP-UX */
lsn = log_reserve_and_open(OS_FILE_LOG_BLOCK_SIZE);
diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc
index 0b9185ba508..faa00b1518b 100644
--- a/storage/innobase/mtr/mtr0mtr.cc
+++ b/storage/innobase/mtr/mtr0mtr.cc
@@ -478,6 +478,7 @@ mtr_write_log(
const ulint len = log->size();
mtr_write_log_t write_log;
+ ut_ad(!recv_no_log_write);
DBUG_PRINT("ib_log",
(ULINTPF " extra bytes written at " LSN_PF,
len, log_sys->lsn));
@@ -799,6 +800,8 @@ mtr_t::release_page(const void* ptr, mtr_memo_type_t type)
ulint
mtr_t::Command::prepare_write()
{
+ ut_ad(!recv_no_log_write);
+
switch (m_impl->m_log_mode) {
case MTR_LOG_SHORT_INSERTS:
ut_ad(0);
diff --git a/strings/json_lib.c b/strings/json_lib.c
index 0e2a17b0ae0..7167b6a2a54 100644
--- a/strings/json_lib.c
+++ b/strings/json_lib.c
@@ -1756,7 +1756,7 @@ int json_path_parts_compare(
goto step_fits;
goto step_failed;
}
- if (a->n_item == 0)
+ if ((a->type & JSON_PATH_WILD) == 0 && a->n_item == 0)
goto step_fits_autowrap;
goto step_failed;
}