I could possibly compromise on what Stewart/you talk about here.
Basically, you're discussing changing the AlterTableStatement message
from the proposed:
message AlterTableStatement
{
required Table before= 1;
required Table after= 2;
}
to:
message AlterTableStatement
{
message AlterColumn
{
required string before_name;
required string after_name;
// other stuff...
}
message AlterIndex
{
// fields describing index changes...
}
// .. many more submessages like DropColumn, etc
repeated AlterColumn alter_column= 1;
repeated AlterIndex alter_index= 2;
repeated DropColumn drop_column= 3;
repeated DropIndex drop_index= 4;
// etc, etc
}
Whereas I prefer to keep the message simple (i.e. the former message
format) I can see a case for the latter.
The above, however, does not affect my original proposal to use GPB
Statement messages in the engine API and to adapt the engine API to use
startStatement(), endStatement(), etc and to allow the engine to advise
the kernel it wishes to handle all, part, or none of the statement
execution.
Cheers,
Jay
Paul McCullagh wrote:
On Dec 15, 2009, at 11:08 PM, Stewart Smith wrote:
On Tue, Dec 15, 2009 at 09:16:42AM -0800, Brian Aker wrote:
On Dec 14, 2009, at 9:27 PM, Stewart Smith wrote:
You can go from actions to SQL easily.
You can also use the actions to simply write code that does the alter
on non-sql systems (e.g. an applier that just uses Embedded InnoDB)
SQL statements are interpreted by an engine. One engine may need to
do a rebuild of a full table, another may not.
If an engine can just "add" a column, then the action for it may just
be "add column". If another engine needs to copy/rename/delete then
it will have a different set of actions.
We need to be descriptive about the change, but the actual mechanics
are up to the individual engine.
I see it working as a 2 step process.
step 1 is pass a list of changes to the engine and it returns a list
of what it can't do. (this could then be used for EXPLAIN ALTER
TABLE).
If the list of what it can't do is not empty, we do a copying alter
table.
Yup, but actually I see only 2 possibilities here:
1. The engine can handle ALL actions internally.
2. We use the (default) copy alter table method.
I don't see why we would need a combination of 1 and 2.
For example if an ALTER TABLE calls for 2 actions: ADD COLUMN and ADD
INDEX, and the engine can only do ADD INDEX internally, then it would
make no sense to use method 1 for ADD INDEX and method 2 for ADD COLUMN.
In fact, if an ALTER TABLE adds 2 indexes it may be better to for the
engine to pick method 2 (which does all changes at once), if its
implementation of ADD INDEX can only add one index at a time.
This would be applied the same way on a slave, as we have the original
set of actions in the replication stream.
Yes, I know what you mean. You mean the same actions (ADD COLUMN, ADD
INDEX) are executed on the slave, but they may use a different method (1
instead of 2, or 2 instead of 1).
--
Stewart Smith
_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help : https://help.launchpad.net/ListHelp
--
Paul McCullagh
PrimeBase Technologies
www.primebase.org
www.blobstreaming.org
pbxt.blogspot.com
_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help : https://help.launchpad.net/ListHelp