#At file:///home/lb200670/devel/mysql/nanna21/
2901 lars-erik.bjork@stripped 2008-11-05
This is a commit for bug#40158
(Falcon assertion in StorageInterface::encodeRecord() line 2635 on CREATE TABLE)
The nature of this bug is explained earlier.
This patch adds a bool argument to StorageTableShare::cleanupFieldName
telling if the function should double the number of quotes or not. So
far, StorageInterface::mapFields, is the only place this method is
called, passing 'false'. All other places it is called passing
'true'. This will ensure that the parser still gets the expected
number of quotes and we are able to look up the fields correctly.
I have also added a regression test for this bug, creating - and
inserting into - a table with a field name containing quotes.
added mysql-test/suite/falcon/r/falcon_bug_40158.result
-------------------------------------------------------
Result file for the regression test
added mysql-test/suite/falcon/t/falcon_bug_40158.test
-----------------------------------------------------
* Regression test, testing differently quoted field names
modified storage/falcon/StorageTableShare.cpp
---------------------------------------------
* Modified StorageTableShare::cleanupFieldName to handle the new
argument.
modified storage/falcon/StorageTableShare.h
-------------------------------------------
* Added new argument to the signature of
StorageTableShare::cleanupFieldName
* Made sure that all usages of StorageTableShare::cleanupFieldName
passes the new argument
modified storage/falcon/ha_falcon.cpp
-------------------------------------
* Made sure that all usages of StorageTableShare::cleanupFieldName
passes the new argument
added:
mysql-test/suite/falcon/r/falcon_bug_40158.result
mysql-test/suite/falcon/t/falcon_bug_40158.test
modified:
storage/falcon/StorageTableShare.cpp
storage/falcon/StorageTableShare.h
storage/falcon/ha_falcon.cpp
=== added file 'mysql-test/suite/falcon/r/falcon_bug_40158.result'
--- a/mysql-test/suite/falcon/r/falcon_bug_40158.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_40158.result 2008-11-05 12:48:46 +0000
@@ -0,0 +1,25 @@
+*** Bug #40158 ***
+SET @@storage_engine = 'Falcon';
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (`"strangename"` int);
+INSERT INTO t1 VALUES (1);
+SELECT * FROM t1;
+"strangename"
+1
+DROP TABLE t1;
+SET LOCAL SQL_MODE=ANSI_QUOTES;
+CREATE TABLE t1 ("""strangename""" int);
+INSERT INTO t1 VALUES (1);
+SELECT * FROM t1;
+"strangename"
+1
+DROP TABLE t1;
+CREATE TABLE t1 (`""strangename""` int);
+INSERT INTO t1 VALUES (1);
+SELECT * FROM t1;
+""strangename""
+1
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+1
+DROP TABLE t1;
=== added file 'mysql-test/suite/falcon/t/falcon_bug_40158.test'
--- a/mysql-test/suite/falcon/t/falcon_bug_40158.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_40158.test 2008-11-05 12:48:46 +0000
@@ -0,0 +1,47 @@
+--source include/have_falcon.inc
+
+#
+# Bug #40158: Falcon assertion in StorageInterface::encodeRecord() line 2635 on CREATE
TABLE
+#
+--echo *** Bug #40158 ***
+
+# ----------------------------------------------------- #
+# --- Initialisation --- #
+# ----------------------------------------------------- #
+let $engine = 'Falcon';
+eval SET @@storage_engine = $engine;
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+
+# ----------------------------------------------------- #
+# --- Test --- #
+# ----------------------------------------------------- #
+
+CREATE TABLE t1 (`"strangename"` int);
+INSERT INTO t1 VALUES (1);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+SET LOCAL SQL_MODE=ANSI_QUOTES;
+
+CREATE TABLE t1 ("""strangename""" int);
+INSERT INTO t1 VALUES (1);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (`""strangename""` int);
+INSERT INTO t1 VALUES (1);
+SELECT * FROM t1;
+
+# ----------------------------------------------------- #
+# --- Check --- #
+# ----------------------------------------------------- #
+
+SELECT COUNT(*) FROM t1;
+
+# ----------------------------------------------------- #
+# --- Final cleanup --- #
+# ----------------------------------------------------- #
+DROP TABLE t1;
=== modified file 'storage/falcon/StorageTableShare.cpp'
--- a/storage/falcon/StorageTableShare.cpp 2008-10-22 20:44:09 +0000
+++ b/storage/falcon/StorageTableShare.cpp 2008-11-05 12:48:46 +0000
@@ -262,7 +262,7 @@ int StorageTableShare::truncateTable(Sto
return res;
}
-const char* StorageTableShare::cleanupFieldName(const char* name, char* buffer, int
bufferLength)
+const char* StorageTableShare::cleanupFieldName(const char* name, char* buffer, int
bufferLength, bool doubleQuotes)
{
char *q = buffer;
char *end = buffer + bufferLength - 1;
@@ -273,7 +273,11 @@ const char* StorageTableShare::cleanupFi
{
if (*p == '"')
{
- *q++ = UPPER(*p);
+ if (doubleQuotes)
+ {
+ *q++ = UPPER(*p);
+ }
+
quotes = !quotes;
}
@@ -321,7 +325,7 @@ char* StorageTableShare::createIndexName
else
{
char nameBuffer[indexNameSize];
- cleanupFieldName(rawName, nameBuffer, sizeof(nameBuffer));
+ cleanupFieldName(rawName, nameBuffer, sizeof(nameBuffer), true);
sprintf(indexName, "%s$%s", name.getString(), nameBuffer);
}
=== modified file 'storage/falcon/StorageTableShare.h'
--- a/storage/falcon/StorageTableShare.h 2008-10-22 20:44:09 +0000
+++ b/storage/falcon/StorageTableShare.h 2008-11-05 12:48:46 +0000
@@ -123,7 +123,7 @@ public:
virtual INT64 getSequenceValue(int delta);
virtual int setSequenceValue(INT64 value);
virtual int haveIndexes(int indexCount);
- virtual const char* cleanupFieldName(const char* name, char* buffer, int bufferLength);
+ virtual const char* cleanupFieldName(const char* name, char* buffer, int bufferLength,
bool doubleQuotes);
virtual void setTablePath(const char* path, bool tempTable);
virtual void registerCollation(const char* collationName, void* arg);
=== modified file 'storage/falcon/ha_falcon.cpp'
--- a/storage/falcon/ha_falcon.cpp 2008-10-31 15:49:48 +0000
+++ b/storage/falcon/ha_falcon.cpp 2008-11-05 12:48:46 +0000
@@ -2486,7 +2486,7 @@ int StorageInterface::genTable(TABLE* ta
if (charset)
storageShare->registerCollation(charset->name, charset);
- storageShare->cleanupFieldName(field->field_name, nameBuffer,
sizeof(nameBuffer));
+ storageShare->cleanupFieldName(field->field_name, nameBuffer, sizeof(nameBuffer),
true);
gen->gen("%s \"%s\" ", sep, nameBuffer);
int ret = genType(field, gen);
@@ -2632,7 +2632,7 @@ void StorageInterface::genKeyFields(KEY*
{
KEY_PART_INFO *part = key->key_part + n;
Field *field = part->field;
- storageShare->cleanupFieldName(field->field_name, nameBuffer,
sizeof(nameBuffer));
+ storageShare->cleanupFieldName(field->field_name, nameBuffer, sizeof(nameBuffer),
true);
if (part->key_part_flag & HA_PART_KEY_SEG)
gen->gen("%s\"%s\"(%d)", sep, nameBuffer, part->length);
@@ -3557,7 +3557,7 @@ void StorageInterface::mapFields(TABLE *
for (uint n = 0; n < table->s->fields; ++n)
{
Field *field = table->field[n];
- storageShare->cleanupFieldName(field->field_name, nameBuffer,
sizeof(nameBuffer));
+ storageShare->cleanupFieldName(field->field_name, nameBuffer, sizeof(nameBuffer),
false);
int id = storageShare->getFieldId(nameBuffer);
if (id >= 0)