summaryrefslogtreecommitdiff
path: root/sql/unireg.cc
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2013-04-09 16:18:33 +0200
committerSergei Golubchik <sergii@pisem.net>2013-04-09 16:18:33 +0200
commit02c712aa546df8d6e9c285e6adc95309925673e3 (patch)
tree8d6654dac2666dcd738db1f10dbd919610087795 /sql/unireg.cc
parentf6168bb67bb5cab0584809c876c674a92051b5d1 (diff)
downloadmariadb-git-02c712aa546df8d6e9c285e6adc95309925673e3.tar.gz
* frm extra2 segment.
* persistent table versions in the extra2 * ha_archive::frm_compare using TABLE_SHARE::tabledef_version * distinguish between "important" and "optional" extra2 frm values * write engine-defined attributes (aka "table options") to extra2, not to extra, but still read from the old location, if they're found there.
Diffstat (limited to 'sql/unireg.cc')
-rw-r--r--sql/unireg.cc80
1 files changed, 51 insertions, 29 deletions
diff --git a/sql/unireg.cc b/sql/unireg.cc
index 588ed622a60..5da9f88132d 100644
--- a/sql/unireg.cc
+++ b/sql/unireg.cc
@@ -1,5 +1,6 @@
/*
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
+ Copyright (c) 2009, 2013, Monty Program Ab.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -122,13 +123,6 @@ LEX_CUSTRING build_frm_image(THD *thd, const char *table,
create_fields,
keys, key_info);
DBUG_PRINT("info", ("Options length: %u", options_len));
- if (options_len)
- {
- create_info->table_options|= HA_OPTION_TEXT_CREATE_OPTIONS;
- create_info->extra_size+= (options_len + 4);
- }
- else
- create_info->table_options&= ~HA_OPTION_TEXT_CREATE_OPTIONS;
/*
This gives us the byte-position of the character at
@@ -193,13 +187,31 @@ LEX_CUSTRING build_frm_image(THD *thd, const char *table,
forminfo[46]=(uchar) create_info->comment.length;
}
+ if (!create_info->tabledef_version.str)
+ {
+ uchar *to= (uchar*) thd->alloc(MY_UUID_SIZE);
+ if (unlikely(!to))
+ DBUG_RETURN(frm);
+ my_uuid(to);
+ create_info->tabledef_version.str= to;
+ create_info->tabledef_version.length= MY_UUID_SIZE;
+ }
+ DBUG_ASSERT(create_info->tabledef_version.length > 0);
+ DBUG_ASSERT(create_info->tabledef_version.length <= 255);
+
prepare_frm_header(thd, reclength, fileinfo, create_info, keys, key_info);
+ /* one byte for a type, one or three for a length */
+ uint extra2_size= 1 + 1 + create_info->tabledef_version.length;
+ if (options_len)
+ extra2_size+= 1 + (options_len > 255 ? 3 : 1) + options_len;
+
key_buff_length= uint4korr(fileinfo+47);
frm.length= FRM_HEADER_SIZE; // fileinfo;
- frm.length+= uint2korr(fileinfo+4) + 4; // "form entry"
+ frm.length+= extra2_size + 4; // mariadb extra2 frm segment
+ int2store(fileinfo+4, extra2_size);
int2store(fileinfo+6, frm.length);
frm.length+= key_buff_length;
frm.length+= reclength; // row with default values
@@ -214,11 +226,34 @@ LEX_CUSTRING build_frm_image(THD *thd, const char *table,
if (!frm_ptr)
DBUG_RETURN(frm);
- pos = frm_ptr + uint2korr(fileinfo+6);
- key_info_length= pack_keys(pos, keys, key_info, data_offset);
+ /* write the extra2 segment */
+ pos = frm_ptr + 64;
+ *pos++ = EXTRA2_TABLEDEF_VERSION;
+ *pos++ = create_info->tabledef_version.length;
+ memcpy(pos, create_info->tabledef_version.str,
+ create_info->tabledef_version.length);
+ pos+= create_info->tabledef_version.length;
- memcpy(frm_ptr + FRM_HEADER_SIZE, "//", 3);
- int4store(frm_ptr + 67, filepos);
+ if (options_len)
+ {
+ *pos++= EXTRA2_ENGINE_TABLEOPTS;
+ if (options_len < 255)
+ *pos++= options_len;
+ else
+ {
+ DBUG_ASSERT(options_len <= 65535); // FIXME if necessary
+ int2store(pos + 1, options_len);
+ pos+= 3;
+ }
+ pos= engine_table_options_frm_image(pos, create_info->option_list,
+ create_fields, keys, key_info);
+ }
+
+ int4store(pos, filepos); // end of the extra2 segment
+ pos+= 4;
+
+ DBUG_ASSERT(pos == frm_ptr + uint2korr(fileinfo+6));
+ key_info_length= pack_keys(pos, keys, key_info, data_offset);
maxlength=(uint) next_io_size((ulong) (uint2korr(forminfo)+1000));
int2store(forminfo+2,maxlength);
@@ -285,19 +320,8 @@ LEX_CUSTRING build_frm_image(THD *thd, const char *table,
pos+= create_info->comment.length;
}
- if (options_len)
- {
- int4store(pos, options_len);
- pos+= 4;
- engine_table_options_frm_image(pos,
- create_info->option_list,
- create_fields,
- keys, key_info);
- pos+= options_len;
- }
-
- memcpy(frm_ptr + filepos, forminfo, FRM_FORMINFO_SIZE);
- if (pack_fields(frm_ptr + filepos + FRM_FORMINFO_SIZE, create_fields, data_offset))
+ memcpy(frm_ptr + filepos, forminfo, 288);
+ if (pack_fields(frm_ptr + filepos + 288, create_fields, data_offset))
goto err;
{
@@ -332,14 +356,12 @@ err:
SYNOPSIS
rea_create_table()
thd Thread handler
+ frm binary frm image of the table to create
path Name of file (including database, without .frm)
db Data base name
table_name Table name
create_info create info parameters
- create_fields Fields to create
- keys number of keys to create
- key_info Keys to create
- file Handler to use
+ file Handler to use or NULL if only frm needs to be created
RETURN
0 ok