summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2022-12-01 15:04:59 +0400
committerAlexander Barkov <bar@mariadb.com>2022-12-02 08:14:00 +0400
commitb91b4e0b970381603b42e52d701a4f5a176ccfd6 (patch)
tree62d5dbd40668a54a4e0498c36cc6d56b7a0f216f
parentcc86360f4afb5b7b9fe64bbffef18538b2e3589b (diff)
downloadmariadb-git-b91b4e0b970381603b42e52d701a4f5a176ccfd6.tar.gz
MDEV-28696 View created as "select b''; " references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
-rw-r--r--mysql-test/main/varbinary.test3
-rw-r--r--mysql-test/main/view.result8
-rw-r--r--mysql-test/main/view.test9
-rw-r--r--sql/item.cc19
-rw-r--r--sql/item.h1
5 files changed, 37 insertions, 3 deletions
diff --git a/mysql-test/main/varbinary.test b/mysql-test/main/varbinary.test
index b35819b0fb3..19e0e88932e 100644
--- a/mysql-test/main/varbinary.test
+++ b/mysql-test/main/varbinary.test
@@ -149,12 +149,9 @@ select N'', length(N'');
select '', length('');
--enable_view_protocol
-#enable after fix MDEV-28696
---disable_view_protocol
select b'', 0+b'';
select x'', 0+x'';
---enable_view_protocol
--error ER_BAD_FIELD_ERROR
select 0x;
diff --git a/mysql-test/main/view.result b/mysql-test/main/view.result
index fd84cff9fa1..7354e1dbb91 100644
--- a/mysql-test/main/view.result
+++ b/mysql-test/main/view.result
@@ -6905,5 +6905,13 @@ deallocate prepare stmt;
drop view v1;
drop table t1;
#
+# MDEV-28696 View created as "select b''; " references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
+#
+CREATE VIEW v1 as select b'';
+SELECT * FROM v1;
+b''
+
+DROP VIEW v1;
+#
# End of 10.3 tests
#
diff --git a/mysql-test/main/view.test b/mysql-test/main/view.test
index 038c7107d07..987e96fc79d 100644
--- a/mysql-test/main/view.test
+++ b/mysql-test/main/view.test
@@ -6645,5 +6645,14 @@ drop view v1;
drop table t1;
--echo #
+--echo # MDEV-28696 View created as "select b''; " references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
+--echo #
+
+CREATE VIEW v1 as select b'';
+SELECT * FROM v1;
+DROP VIEW v1;
+
+
+--echo #
--echo # End of 10.3 tests
--echo #
diff --git a/sql/item.cc b/sql/item.cc
index 012dcebdaee..757f09dec01 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -7409,6 +7409,25 @@ Item_bin_string::Item_bin_string(THD *thd, const char *str, size_t str_length):
}
+void Item_bin_string::print(String *str, enum_query_type query_type)
+{
+ if (!str_value.length())
+ {
+ /*
+ Historically a bit string such as b'01100001'
+ prints itself in the hex hybrid notation: 0x61
+ In case of an empty bit string b'', the hex hybrid
+ notation would result in a bad syntax: 0x
+ So let's print empty bit strings using bit string notation: b''
+ */
+ static const LEX_CSTRING empty_bit_string= {STRING_WITH_LEN("b''")};
+ str->append(empty_bit_string);
+ }
+ else
+ Item_hex_hybrid::print(str, query_type);
+}
+
+
bool Item_temporal_literal::eq(const Item *item, bool binary_cmp) const
{
return
diff --git a/sql/item.h b/sql/item.h
index a291678529e..07fbe848bb7 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -4490,6 +4490,7 @@ class Item_bin_string: public Item_hex_hybrid
{
public:
Item_bin_string(THD *thd, const char *str, size_t str_length);
+ void print(String *str, enum_query_type query_type);
};