Estendere CREATE TABLE
A partire da MariaDB 5.2, gli Storage Engine possono dare la possibilità all'utente di specificare nuovi attributi per gli indici, i campi e le tabella. Lo SE deve dichiarare quali attributi introduce.
API
Ci sono tre nuovi membri nella struttura hanlerton
, che possono essere impostati nella funzione di inizializzazione dell'engine nel modo seguente:
example_hton->table_options= example_table_option_array; example_hton->field_options= example_field_option_array; example_hton->index_options= example_index_option_array;
Gli array sono dichiarati staticamente, come nell'esempio seguente:
struct ha_table_option_struct { char *strparam; ulonglong ullparam; uint enumparam; bool boolparam; }; ha_create_table_option example_table_option_list[]= { HA_TOPTION_NUMBER("NUMBER", ullparam, UINT_MAX32, 0, UINT_MAX32, 10), HA_TOPTION_STRING("STR", strparam), HA_TOPTION_ENUM("one_or_two", enumparam, "one,two", 0), HA_TOPTION_BOOL("YESNO", boolparam, 1), HA_TOPTION_END };
L'engine dichiara una struttura ha_table_option_struct
che contiene i valori di questi nuovi attributi.
E descrive gli attributi a MySQL creando un array di macroHA_TOPTION_*
. Si noti un dettaglio: queste macro si aspettano una struttura chiamata ha_table_option_struct
, se ha un nome differente occorrerà un #define
.
Ecco i quattro tipi di attributi supportati:
Tipo | Tipo C corrispondente | Nome macro | Parametri macro aggiuntivi |
---|---|---|---|
un numero intero | unsigned long long | HA_TOPTION_NUMBER | valore di default, valore minimo ammesso, valore massimo, un fattore del quale i valori devono essere multipli per poter essere ammessi. |
una stringa | char * | HA_TOPTION_STRING | nessuno. Il valore di default è un puntatore null. |
un valore da una lista di valori ammessi | unsigned int | HA_TOPTION_ENUM | una stringa contenente un elenco di valori ammessi separati da virgola e un valore di default che è un numero, il minimo è 0. |
un booleano | bool | HA_TOPTION_BOOL | un valore di default |
Non è permesso usare enum
per i membri di una struttura C HA_TOPTION_ENUM
, perché le dimensioni di enum
dipendono dal compilatore e dalle opzioni di compilazione, mentre l'API dei plugin utilizza soltanto tipi le cui dimensioni sono note a priori.
In tutte le macro i primi due parametri sono il nome dell'attributo come verrà usato in SQL nell'istruzione CREATE TABLE
, e il nome del membro corrispondente della struttura ha_table_option_struct
.
L'array termina con una macro HA_TOPTION_END
.
Gli attributi dei campi e degli indici (chiavi) si dichiarano in modo simile, usando le macro HA_FOPTION_*
e HA_IOPTION_*
macros.
Quando in un'istruzione CREATE TABLE
viene chiamato il metodo handler ::create()
, gli attributi di tabella sono disponibili in table_arg->s->option_struct
; gli attributi dei campi nel membro option_struct
o nei singoli campi (cioè oggetti della classe Field
); le strutture degli indici nel membro option_struct
delle singole chiavi (oggetti della classe KEY
).
Sono inoltre disponibili nella maggior parte degli altri metodi handler: gli attributi vengono registrati nel file .frm
e ogni MySQL li rende disponibili all'engine assegnandoli ai corrispondenti membri option_struct
della tabella, dei campi e delle chiavi.
ALTER TABLE
necessita di un particolare supporto da parte dell'engine. MySQL compara la vecchia e la nuova definizione per determinare se deve ricostruire la tabella o meno. Poiché la semantica dell'engine con cui sono stati dichiarati gli attributi non è nota, MySQL non può prendere questa decisione analizzando i valori degli attributi - questo compito è delegato all'engine. La struttura HA_CREATE_INFO
ha tre nuovi membri:
ha_table_option_struct *option_struct; ///< struttura con le opzioni di tabella già sottoposte a parsing ha_field_option_struct **fields_option_struct; ///< array delle strutture delle opzioni dei campi ha_index_option_struct **indexes_option_struct; ///< array delle strutture delle opzioni degli indici
L'engine (nel metodo ::check_if_incompatible_data()
) ha la responsabilità di comparare i nuovi valori degli attributi presenti nella struttura HA_CREATE_INFO
con i vecchi presenti nella tabella e restituire COMPATIBLE_DATA_NO
se sono stati modificati in modo tale da dover ricostruire la tabella.
Nell'engine EXAMPLE si può trovare un esempio di come dichiarare gli attributi e confrontare i valori per ALTER TABLE
.
SQL
Gli attributi dichiarati dall'engine possono essere specificati per campo, indice o tabella nelle istruzioni CREATE TABLE
e ALTER TABLE
. La sintassi è quella convenzionale:
CREATE TABLE ... ( campo... [attributo=valore [attributo=valore ...]], ... indice... [attributo=valore [attributo=valore ...]], ... ) ... [attributo=valore [attributo=valore ...]]
Tutti i valori devono essere specificati come letterali, non come espressioni. Il valore di un'opzione booleana può essere specificato come YES, NO, ON, OFF, 1 o 0. Un valore stringa può essere virgolettato oppure no, come un identificatore (se è un identificatore valido, naturalmente). Ad esempio:
CREATE TABLE ... ( ) ENGINE=FEDERATED CONNECTION='mysql://root@127.0.0.1';
Il valore dell'attributo ENGINE non è virgolettato, mentre il valore di CONNECTION lo è.
Quando un attributo viene impostato, viene registrato nella definizione della tabella e mostrato nell'output di SHOW CREATE TABLE;
. Se si vuole rimuovere un attributo dalla definizione si può usare ALTER TABLE
per impostarlo a DEFAULT
.
I valori degli attributi sconosciuti e i valori con valori non validi provocano un errore per default. Abilitando la modalità SQL IGNORE_BAD_TABLE_OPTIONS
questo errore può essere convertito in un warning. In questo caso gli attributi non validi vengono registrati così come sono nel file .frm
perché in futuro, se la tabella viene modificata e convertita a un altro Storage Engine, potrebbero essere validi per il nuovo engine. Questa modalità è abilitata implicitamente nel thread di replica dello slave.