Merge lp:~stewart/drizzle/table-proto-message-error-checking into lp:~drizzle-trunk/drizzle/development

Proposed by Stewart Smith
Status: Merged
Merged at revision: not available
Proposed branch: lp:~stewart/drizzle/table-proto-message-error-checking
Merge into: lp:~drizzle-trunk/drizzle/development
Prerequisite: lp:~stewart/drizzle/enum_field_type_to_table_message_type
Diff against target: 654 lines (+479/-8)
18 files modified
drizzled/error.cc (+3/-1)
drizzled/error.h (+2/-1)
drizzled/message/table_writer.cc (+69/-5)
drizzled/plugin/storage_engine.cc (+16/-1)
drizzled/table.cc (+6/-0)
plugin/blackhole/ha_blackhole.cc (+7/-0)
plugin/tableprototester/plugin.ini (+5/-0)
plugin/tableprototester/tableprototester.cc (+292/-0)
plugin/tableprototester/tableprototester.h (+58/-0)
plugin/tableprototester/tests/r/basic.result (+3/-0)
plugin/tableprototester/tests/r/drop_table.result (+2/-0)
plugin/tableprototester/tests/r/missing_engine.result (+5/-0)
plugin/tableprototester/tests/t/basic-master.opt (+1/-0)
plugin/tableprototester/tests/t/basic.test (+1/-0)
plugin/tableprototester/tests/t/drop_table-master.opt (+1/-0)
plugin/tableprototester/tests/t/drop_table.test (+2/-0)
plugin/tableprototester/tests/t/missing_engine-master.opt (+1/-0)
plugin/tableprototester/tests/t/missing_engine.test (+5/-0)
To merge this branch: bzr merge lp:~stewart/drizzle/table-proto-message-error-checking
Reviewer Review Type Date Requested Status
Brian Aker Pending
Drizzle Developers Pending
Review via email: mp+18672@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Stewart Smith (stewart) wrote :

Fix error reporting on bad table protobuf messages.

Also introduce testing of this.

We use a storage engine that presents tables and definitions to test server
functions such as parse_table_proto() instead of writing the proto out to a
file as some versions of the protobuf lib won't let you write out a proto
message that's missing required fields but within the server, it's possible
to get a message that is missing these fields.

We load this plugin ONLY for the test suite. It is NEVER designed to be used
by end users *at all*.

1315. By Stewart Smith

Merged enum_field_type_to_table_message_type into table-proto-message-error-checking.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'drizzled/error.cc'
--- drizzled/error.cc 2010-02-04 08:14:46 +0000
+++ drizzled/error.cc 2010-02-08 01:35:22 +0000
@@ -1418,7 +1418,9 @@
1418/* ER_INVALID_ENUM_VALUE */1418/* ER_INVALID_ENUM_VALUE */
1419N_("Received an invalid enum value '%s'."),1419N_("Received an invalid enum value '%s'."),
1420/* ER_NO_PRIMARY_KEY_ON_REPLICATED_TABLE */1420/* ER_NO_PRIMARY_KEY_ON_REPLICATED_TABLE */
1421N_("Tables which are replicated require a primary key.")1421N_("Tables which are replicated require a primary key."),
1422/* ER_CORRUPT_TABLE_DEFINITION */
1423N_("Corrupt or invalid table definition: %s")
1422};1424};
14231425
1424const char * error_message(unsigned int code)1426const char * error_message(unsigned int code)
14251427
=== modified file 'drizzled/error.h'
--- drizzled/error.h 2010-02-04 08:14:46 +0000
+++ drizzled/error.h 2010-02-08 01:35:22 +0000
@@ -723,7 +723,8 @@
723 ER_INVALID_TIME_VALUE,723 ER_INVALID_TIME_VALUE,
724 ER_INVALID_ENUM_VALUE,724 ER_INVALID_ENUM_VALUE,
725 ER_NO_PRIMARY_KEY_ON_REPLICATED_TABLE,725 ER_NO_PRIMARY_KEY_ON_REPLICATED_TABLE,
726 ER_ERROR_LAST= ER_NO_PRIMARY_KEY_ON_REPLICATED_TABLE726 ER_CORRUPT_TABLE_DEFINITION,
727 ER_ERROR_LAST= ER_CORRUPT_TABLE_DEFINITION
727};728};
728729
729} /* namespace drizzled */730} /* namespace drizzled */
730731
=== modified file 'drizzled/message/table_writer.cc'
--- drizzled/message/table_writer.cc 2009-12-11 21:54:18 +0000
+++ drizzled/message/table_writer.cc 2010-02-08 01:35:22 +0000
@@ -22,6 +22,7 @@
22#include <iostream>22#include <iostream>
23#include <fstream>23#include <fstream>
24#include <string>24#include <string>
25#include <getopt.h>
25#include <drizzled/message/table.pb.h>26#include <drizzled/message/table.pb.h>
2627
27using namespace std;28using namespace std;
@@ -78,6 +79,13 @@
78 index->set_is_primary(is_primary);79 index->set_is_primary(is_primary);
79 index->set_is_unique(is_unique);80 index->set_is_unique(is_unique);
8081
82 int key_length= 0;
83
84 for(int i=0; i< num_index_parts; i++)
85 key_length+= compare_lengths[i];
86
87 index->set_key_length(key_length);
88
81 while (x < num_index_parts)89 while (x < num_index_parts)
82 {90 {
83 index_part= index->add_index_part();91 index_part= index->add_index_part();
@@ -190,21 +198,77 @@
190198
191}199}
192200
201static void fill_table1(message::Table *table)
202{
203 message::Table::Field *field;
204 message::Table::TableOptions *tableopts;
205
206 table->set_name("t1");
207 table->set_type(message::Table::INTERNAL);
208
209 tableopts= table->mutable_options();
210 tableopts->set_comment("Table without a StorageEngine message");
211
212 {
213 field= table->add_field();
214 field->set_name("number");
215 field->set_type(message::Table::Field::INTEGER);
216 }
217
218}
219
220static void usage(char *argv0)
221{
222 cerr << "Usage: " << argv0 << " [-t N] TABLE_NAME.dfe" << endl;
223 cerr << endl;
224 cerr << "-t N\tTable Number" << endl;
225 cerr << "\t0 - default" << endl;
226 cerr << endl;
227}
228
193int main(int argc, char* argv[])229int main(int argc, char* argv[])
194{230{
231 int opt;
232 int table_number= 0;
233
195 GOOGLE_PROTOBUF_VERIFY_VERSION;234 GOOGLE_PROTOBUF_VERIFY_VERSION;
196235
197 if (argc != 2)236 while ((opt= getopt(argc, argv, "t:")) != -1)
198 {237 {
199 cerr << "Usage: " << argv[0] << " SCHEMA" << endl;238 switch (opt)
200 return -1;239 {
240 case 't':
241 table_number= atoi(optarg);
242 break;
243 default:
244 usage(argv[0]);
245 exit(EXIT_FAILURE);
246 }
247 }
248
249 if (optind >= argc) {
250 fprintf(stderr, "Expected Table name argument\n\n");
251 usage(argv[0]);
252 exit(EXIT_FAILURE);
201 }253 }
202254
203 message::Table table;255 message::Table table;
204256
205 fill_table(&table, "example_table");257 switch (table_number)
258 {
259 case 0:
260 fill_table(&table, "example_table");
261 break;
262 case 1:
263 fill_table1(&table);
264 break;
265 default:
266 fprintf(stderr, "Invalid table number.\n\n");
267 usage(argv[0]);
268 exit(EXIT_FAILURE);
269 }
206270
207 fstream output(argv[1], ios::out | ios::trunc | ios::binary);271 fstream output(argv[optind], ios::out | ios::trunc | ios::binary);
208 if (!table.SerializeToOstream(&output))272 if (!table.SerializeToOstream(&output))
209 {273 {
210 cerr << "Failed to write schema." << endl;274 cerr << "Failed to write schema." << endl;
211275
=== modified file 'drizzled/plugin/storage_engine.cc'
--- drizzled/plugin/storage_engine.cc 2010-02-04 08:14:46 +0000
+++ drizzled/plugin/storage_engine.cc 2010-02-08 01:35:22 +0000
@@ -579,7 +579,7 @@
579 if (ret != ENOENT)579 if (ret != ENOENT)
580 *err= ret;580 *err= ret;
581581
582 return *err == EEXIST;582 return *err == EEXIST || *err != ENOENT;
583 }583 }
584};584};
585585
@@ -705,6 +705,13 @@
705 identifier,705 identifier,
706 &src_proto);706 &src_proto);
707707
708 if (error_proto == ER_CORRUPT_TABLE_DEFINITION)
709 {
710 my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
711 src_proto.InitializationErrorString().c_str());
712 return ER_CORRUPT_TABLE_DEFINITION;
713 }
714
708 engine= plugin::StorageEngine::findByName(session,715 engine= plugin::StorageEngine::findByName(session,
709 src_proto.engine().name());716 src_proto.engine().name());
710717
@@ -732,6 +739,14 @@
732 if (error_proto && error == 0)739 if (error_proto && error == 0)
733 return 0;740 return 0;
734741
742 if (((error_proto != EEXIST && error_proto != ENOENT)
743 && !engine && generate_warning)
744 | ( error && !engine && generate_warning))
745 {
746 my_error(ER_GET_ERRNO, MYF(0), error_proto);
747 return error_proto;
748 }
749
735 if (error && generate_warning)750 if (error && generate_warning)
736 {751 {
737 /*752 /*
738753
=== modified file 'drizzled/table.cc'
--- drizzled/table.cc 2010-02-08 01:35:22 +0000
+++ drizzled/table.cc 2010-02-08 01:35:22 +0000
@@ -262,6 +262,12 @@
262{262{
263 int error= 0;263 int error= 0;
264264
265 if (! table.IsInitialized())
266 {
267 my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), table.InitializationErrorString().c_str());
268 return ER_CORRUPT_TABLE_DEFINITION;
269 }
270
265 share->setTableProto(new(nothrow) message::Table(table));271 share->setTableProto(new(nothrow) message::Table(table));
266272
267 share->storage_engine= plugin::StorageEngine::findByName(session, table.engine().name());273 share->storage_engine= plugin::StorageEngine::findByName(session, table.engine().name());
268274
=== modified file 'plugin/blackhole/ha_blackhole.cc'
--- plugin/blackhole/ha_blackhole.cc 2010-02-04 08:14:46 +0000
+++ plugin/blackhole/ha_blackhole.cc 2010-02-08 01:35:22 +0000
@@ -259,6 +259,13 @@
259 {259 {
260 close(fd);260 close(fd);
261 delete input;261 delete input;
262 if (! table_proto->IsInitialized())
263 {
264 my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
265 table_proto->InitializationErrorString().c_str());
266 return ER_CORRUPT_TABLE_DEFINITION;
267 }
268
262 return HA_ERR_CRASHED_ON_USAGE;269 return HA_ERR_CRASHED_ON_USAGE;
263 }270 }
264271
265272
=== added directory 'plugin/tableprototester'
=== added file 'plugin/tableprototester/plugin.ini'
--- plugin/tableprototester/plugin.ini 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/plugin.ini 2010-02-08 01:35:22 +0000
@@ -0,0 +1,5 @@
1[plugin]
2title=Table Proto Message Tester
3description=Used only to test other bits of the server.
4sources=tableprototester.cc
5headers=tableprototester.h
06
=== added file 'plugin/tableprototester/tableprototester.cc'
--- plugin/tableprototester/tableprototester.cc 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tableprototester.cc 2010-02-08 01:35:22 +0000
@@ -0,0 +1,292 @@
1/*
2 Copyright (C) 2010 Stewart Smith
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17*/
18
19#include "config.h"
20#include <drizzled/table.h>
21#include <drizzled/error.h>
22#include "drizzled/internal/my_pthread.h"
23
24#include "tableprototester.h"
25
26#include <fcntl.h>
27
28#include <string>
29#include <map>
30#include <fstream>
31#include <drizzled/message/table.pb.h>
32#include "drizzled/internal/m_string.h"
33
34#include "drizzled/global_charset_info.h"
35
36
37using namespace std;
38using namespace google;
39using namespace drizzled;
40
41#define TABLEPROTOTESTER_EXT ".TBT"
42
43static const char *TableProtoTesterCursor_exts[] = {
44 NULL
45};
46
47class TableProtoTesterEngine : public drizzled::plugin::StorageEngine
48{
49public:
50 TableProtoTesterEngine(const string &name_arg)
51 : drizzled::plugin::StorageEngine(name_arg,
52 HTON_NULL_IN_KEY |
53 HTON_CAN_INDEX_BLOBS |
54 HTON_SKIP_STORE_LOCK |
55 HTON_AUTO_PART_KEY |
56 HTON_HAS_DATA_DICTIONARY)
57 {
58 table_definition_ext= TABLEPROTOTESTER_EXT;
59 }
60
61 virtual Cursor *create(TableShare &table,
62 drizzled::memory::Root *mem_root)
63 {
64 return new (mem_root) TableProtoTesterCursor(*this, table);
65 }
66
67 const char **bas_ext() const {
68 return TableProtoTesterCursor_exts;
69 }
70
71 int doCreateTable(Session*,
72 const char *,
73 Table&,
74 drizzled::message::Table&);
75
76 int doDropTable(Session&, const string table_name);
77
78 int doGetTableDefinition(Session& session,
79 const char* path,
80 const char *db,
81 const char *table_name,
82 const bool is_tmp,
83 drizzled::message::Table *table_proto);
84
85 void doGetTableNames(drizzled::CachedDirectory &directory,
86 string&, set<string>& set_of_names)
87 {
88 (void)directory;
89 set_of_names.insert("t1");
90
91 }
92
93 /* The following defines can be increased if necessary */
94 uint32_t max_supported_keys() const { return 64; }
95 uint32_t max_supported_key_length() const { return 1000; }
96 uint32_t max_supported_key_part_length() const { return 1000; }
97
98 uint32_t index_flags(enum ha_key_alg) const
99 {
100 return (HA_READ_NEXT |
101 HA_READ_PREV |
102 HA_READ_RANGE |
103 HA_READ_ORDER |
104 HA_KEYREAD_ONLY);
105 }
106
107};
108
109TableProtoTesterCursor::TableProtoTesterCursor(drizzled::plugin::StorageEngine &engine_arg,
110 TableShare &table_arg)
111 :Cursor(engine_arg, table_arg)
112{ }
113
114int TableProtoTesterCursor::open(const char *, int, uint32_t)
115{
116 return(0);
117}
118
119int TableProtoTesterCursor::close(void)
120{
121 return 0;
122}
123
124int TableProtoTesterEngine::doCreateTable(Session*, const char *,
125 Table&,
126 drizzled::message::Table&)
127{
128 return EEXIST;
129}
130
131
132int TableProtoTesterEngine::doDropTable(Session&, const string)
133{
134 return EPERM;
135}
136
137static void fill_table1(message::Table *table)
138{
139 message::Table::Field *field;
140 message::Table::TableOptions *tableopts;
141
142 table->set_name("t1");
143 table->set_type(message::Table::INTERNAL);
144
145 tableopts= table->mutable_options();
146 tableopts->set_comment("Table without a StorageEngine message");
147
148 {
149 field= table->add_field();
150 field->set_name("number");
151 field->set_type(message::Table::Field::INTEGER);
152 }
153
154}
155int TableProtoTesterEngine::doGetTableDefinition(Session&,
156 const char* path,
157 const char *,
158 const char *,
159 const bool,
160 drizzled::message::Table *table_proto)
161{
162 if (strcmp(path, "./test/t1") == 0)
163 {
164 if (table_proto)
165 fill_table1(table_proto);
166 return EEXIST;
167 }
168 return ENOENT;
169}
170
171const char *TableProtoTesterCursor::index_type(uint32_t)
172{
173 return("BTREE");
174}
175
176int TableProtoTesterCursor::write_row(unsigned char *)
177{
178 return(table->next_number_field ? update_auto_increment() : 0);
179}
180
181int TableProtoTesterCursor::rnd_init(bool)
182{
183 return(0);
184}
185
186
187int TableProtoTesterCursor::rnd_next(unsigned char *)
188{
189 return(HA_ERR_END_OF_FILE);
190}
191
192
193int TableProtoTesterCursor::rnd_pos(unsigned char *, unsigned char *)
194{
195 assert(0);
196 return(0);
197}
198
199
200void TableProtoTesterCursor::position(const unsigned char *)
201{
202 assert(0);
203 return;
204}
205
206
207int TableProtoTesterCursor::info(uint32_t flag)
208{
209 memset(&stats, 0, sizeof(stats));
210 if (flag & HA_STATUS_AUTO)
211 stats.auto_increment_value= 1;
212 return(0);
213}
214
215
216int TableProtoTesterCursor::index_read_map(unsigned char *, const unsigned char *,
217 key_part_map, enum ha_rkey_function)
218{
219 return(HA_ERR_END_OF_FILE);
220}
221
222
223int TableProtoTesterCursor::index_read_idx_map(unsigned char *, uint32_t, const unsigned char *,
224 key_part_map, enum ha_rkey_function)
225{
226 return(HA_ERR_END_OF_FILE);
227}
228
229
230int TableProtoTesterCursor::index_read_last_map(unsigned char *, const unsigned char *, key_part_map)
231{
232 return(HA_ERR_END_OF_FILE);
233}
234
235
236int TableProtoTesterCursor::index_next(unsigned char *)
237{
238 return(HA_ERR_END_OF_FILE);
239}
240
241
242int TableProtoTesterCursor::index_prev(unsigned char *)
243{
244 return(HA_ERR_END_OF_FILE);
245}
246
247
248int TableProtoTesterCursor::index_first(unsigned char *)
249{
250 return(HA_ERR_END_OF_FILE);
251}
252
253
254int TableProtoTesterCursor::index_last(unsigned char *)
255{
256 return(HA_ERR_END_OF_FILE);
257}
258
259static drizzled::plugin::StorageEngine *tableprototester_engine= NULL;
260
261static int tableprototester_init(drizzled::plugin::Registry &registry)
262{
263
264 tableprototester_engine= new TableProtoTesterEngine("TABLEPROTOTESTER");
265 registry.add(tableprototester_engine);
266
267 return 0;
268}
269
270static int tableprototester_fini(drizzled::plugin::Registry &registry)
271{
272 registry.remove(tableprototester_engine);
273 delete tableprototester_engine;
274
275 return 0;
276}
277
278DRIZZLE_DECLARE_PLUGIN
279{
280 DRIZZLE_VERSION_ID,
281 "TABLEPROTOTESTER",
282 "1.0",
283 "Stewart Smith",
284 "Used to test rest of server with various table proto messages",
285 PLUGIN_LICENSE_GPL,
286 tableprototester_init, /* Plugin Init */
287 tableprototester_fini, /* Plugin Deinit */
288 NULL, /* status variables */
289 NULL, /* system variables */
290 NULL /* config options */
291}
292DRIZZLE_DECLARE_PLUGIN_END;
0293
=== added file 'plugin/tableprototester/tableprototester.h'
--- plugin/tableprototester/tableprototester.h 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tableprototester.h 2010-02-08 01:35:22 +0000
@@ -0,0 +1,58 @@
1/*
2 Copyright (C) 2010 Stewart Smith
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17*/
18
19#ifndef PLUGIN_TABLEPROTOTESTER_TABLEPROTOTESTER_H
20#define PLUGIN_TABLEPROTOTESTER_TABLEPROTOTESTER_H
21
22#include <drizzled/cursor.h>
23
24class TableProtoTesterCursor: public drizzled::Cursor
25{
26public:
27 TableProtoTesterCursor(drizzled::plugin::StorageEngine &engine, drizzled::TableShare &table_arg);
28 ~TableProtoTesterCursor()
29 {}
30
31 /*
32 The name of the index type that will be used for display
33 don't implement this method unless you really have indexes
34 */
35 const char *index_type(uint32_t key_number);
36 uint32_t index_flags(uint32_t inx) const;
37 int open(const char *name, int mode, uint32_t test_if_locked);
38 int close(void);
39 int write_row(unsigned char * buf);
40 int rnd_init(bool scan);
41 int rnd_next(unsigned char *buf);
42 int rnd_pos(unsigned char * buf, unsigned char *pos);
43
44 int index_read_map(unsigned char * buf, const unsigned char * key, drizzled::key_part_map keypart_map,
45 drizzled::ha_rkey_function find_flag);
46 int index_read_idx_map(unsigned char * buf, uint32_t idx, const unsigned char * key,
47 drizzled::key_part_map keypart_map,
48 drizzled::ha_rkey_function find_flag);
49 int index_read_last_map(unsigned char * buf, const unsigned char * key, drizzled::key_part_map keypart_map);
50 int index_next(unsigned char * buf);
51 int index_prev(unsigned char * buf);
52 int index_first(unsigned char * buf);
53 int index_last(unsigned char * buf);
54 void position(const unsigned char *record);
55 int info(uint32_t flag);
56};
57
58#endif /* PLUGIN_TABLEPROTOTESTER_TABLEPROTOTESTER_H */
059
=== added directory 'plugin/tableprototester/tests'
=== added directory 'plugin/tableprototester/tests/r'
=== added file 'plugin/tableprototester/tests/r/basic.result'
--- plugin/tableprototester/tests/r/basic.result 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tests/r/basic.result 2010-02-08 01:35:22 +0000
@@ -0,0 +1,3 @@
1SHOW TABLES;
2Tables_in_test
3t1
04
=== added file 'plugin/tableprototester/tests/r/drop_table.result'
--- plugin/tableprototester/tests/r/drop_table.result 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tests/r/drop_table.result 2010-02-08 01:35:22 +0000
@@ -0,0 +1,2 @@
1DROP TABLE t1;
2ERROR HY000: Got error 17 from storage engine
03
=== added file 'plugin/tableprototester/tests/r/missing_engine.result'
--- plugin/tableprototester/tests/r/missing_engine.result 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tests/r/missing_engine.result 2010-02-08 01:35:22 +0000
@@ -0,0 +1,5 @@
1SHOW TABLES;
2Tables_in_test
3t1
4SHOW CREATE TABLE t1;
5ERROR HY000: Corrupt or invalid table definition: engine
06
=== added directory 'plugin/tableprototester/tests/t'
=== added file 'plugin/tableprototester/tests/t/basic-master.opt'
--- plugin/tableprototester/tests/t/basic-master.opt 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tests/t/basic-master.opt 2010-02-08 01:35:22 +0000
@@ -0,0 +1,1 @@
1--plugin_add=tableprototester
02
=== added file 'plugin/tableprototester/tests/t/basic.test'
--- plugin/tableprototester/tests/t/basic.test 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tests/t/basic.test 2010-02-08 01:35:22 +0000
@@ -0,0 +1,1 @@
1SHOW TABLES;
02
=== added file 'plugin/tableprototester/tests/t/drop_table-master.opt'
--- plugin/tableprototester/tests/t/drop_table-master.opt 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tests/t/drop_table-master.opt 2010-02-08 01:35:22 +0000
@@ -0,0 +1,1 @@
1--plugin_add=tableprototester
02
=== added file 'plugin/tableprototester/tests/t/drop_table.test'
--- plugin/tableprototester/tests/t/drop_table.test 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tests/t/drop_table.test 2010-02-08 01:35:22 +0000
@@ -0,0 +1,2 @@
1--error 1030
2DROP TABLE t1;
03
=== added file 'plugin/tableprototester/tests/t/missing_engine-master.opt'
--- plugin/tableprototester/tests/t/missing_engine-master.opt 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tests/t/missing_engine-master.opt 2010-02-08 01:35:22 +0000
@@ -0,0 +1,1 @@
1--plugin_add=tableprototester
02
=== added file 'plugin/tableprototester/tests/t/missing_engine.test'
--- plugin/tableprototester/tests/t/missing_engine.test 1970-01-01 00:00:00 +0000
+++ plugin/tableprototester/tests/t/missing_engine.test 2010-02-08 01:35:22 +0000
@@ -0,0 +1,5 @@
1
2SHOW TABLES;
3
4--error 1693
5SHOW CREATE TABLE t1;