summaryrefslogtreecommitdiff
path: root/storage/csv
diff options
context:
space:
mode:
authorunknown <antony@pcg5ppc.xiphis.org>2007-10-18 14:48:04 -0700
committerunknown <antony@pcg5ppc.xiphis.org>2007-10-18 14:48:04 -0700
commit57600b02d0faaa6d3346a66beb6d3cedb273bae3 (patch)
tree5fe9a13eb429d1a6ce589363a5186339f72b8403 /storage/csv
parent03bef972d3b508013cfcad2de294569ecdf16158 (diff)
downloadmariadb-git-57600b02d0faaa6d3346a66beb6d3cedb273bae3.tar.gz
Bug#31473
"CSV does not work with NULL value in datetime fields" Attempting to insert a row with a NULL value for a DATETIME field results in a CSV file which the storage engine cannot read. Don't blindly assume that "0" is acceptable for all field types, Since CSV does not support NULL, we find out from the field the default non-null value. Do not permit the creation of a table with a nullable columns. mysql-test/r/csv.result: test for bug 31473 mysql-test/r/log_tables.result: change in results due to bugfix 31473 mysql-test/r/system_mysql_db.result: change in results due to bugfix 31473 mysql-test/t/csv.test: test for bug 31473 mysql-test/t/log_tables.test: due to bug31473, all columns in CSV tables must be declared as NOT NULL scripts/mysql_system_tables.sql: due to bug31473, all columns in CSV tables must be declared as NOT NULL storage/csv/ha_tina.cc: bug31473 Don't blindly assume that "0" is acceptable for all field types, Since CSV does not support NULL, we find out from the field the default non-null value. Do not permit the creation of a table with a nullable columns;
Diffstat (limited to 'storage/csv')
-rw-r--r--storage/csv/ha_tina.cc36
1 files changed, 27 insertions, 9 deletions
diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc
index 9a7781e017d..6a87b8ecc72 100644
--- a/storage/csv/ha_tina.cc
+++ b/storage/csv/ha_tina.cc
@@ -471,22 +471,30 @@ int ha_tina::encode_quote(uchar *buf)
{
const char *ptr;
const char *end_ptr;
+ const bool was_null= (*field)->is_null();
/*
- CSV does not support nulls. Write quoted 0 to the buffer. In fact,
- (*field)->val_str(&attribute,&attribute) would usually return 0
- in this case but we write it explicitly here.
- Basically this is a safety check, as no one ensures that the
- field content is cleaned up every time we use Field::set_null()
- in the code.
+ CSV does not support nulls. ::create() prevents creation of a table
+ with nullable columns so if we encounter them here, there is a bug.
+ This may only occur if the frm was created by an older version of
+ mysqld which permitted table creation with nullable columns.
*/
- if ((*field)->is_null())
+ DBUG_ASSERT(!(*field)->maybe_null());
+
+ /*
+ assistance for backwards compatibility in production builds.
+ note: this will not work for ENUM columns.
+ */
+ if (was_null)
{
- buffer.append(STRING_WITH_LEN("\"0\","));
- continue;
+ (*field)->set_default();
+ (*field)->set_notnull();
}
(*field)->val_str(&attribute,&attribute);
+
+ if (was_null)
+ (*field)->set_null();
if ((*field)->str_needs_quotes())
{
@@ -1480,6 +1488,16 @@ int ha_tina::create(const char *name, TABLE *table_arg,
File create_file;
DBUG_ENTER("ha_tina::create");
+ /*
+ check columns
+ */
+ for (Field **field= table_arg->s->field; *field; field++)
+ {
+ if ((*field)->real_maybe_null())
+ DBUG_RETURN(-1);
+ }
+
+
if ((create_file= my_create(fn_format(name_buff, name, "", CSM_EXT,
MY_REPLACE_EXT|MY_UNPACK_FILENAME), 0,
O_RDWR | O_TRUNC,MYF(MY_WME))) < 0)