mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-26 20:00:16 +08:00
Support virtual columns in MariaDB 5.2. Fixes issue #2451.
This commit is contained in:
@ -926,7 +926,7 @@ const
|
||||
'MAX_ROWS,MAXVALUE,MIDDLEINT,MIN_ROWS,MINUTE_MICROSECOND,MOD,MODE,MODIFY,MODIFIES,NAMES,' +
|
||||
'NATURAL,NEW,NO,NODEGROUP,NOT,NO_WRITE_TO_BINLOG,NULL,OJ,OFFSET,OLD,ON,OPTIMIZE,OPTION,' +
|
||||
'OPTIONALLY,OPEN,OR,ORDER,OUT,OUTER,OUTFILE,PACK_KEYS,PARTIAL,PARTITION,' +
|
||||
'PARTITIONS,PLUGIN,PLUGINS,PREPARE,PRESERVE,PRIMARY,PRIVILEGES,PROCEDURE,' +
|
||||
'PARTITIONS,PERSISTENT,PLUGIN,PLUGINS,PREPARE,PRESERVE,PRIMARY,PRIVILEGES,PROCEDURE,' +
|
||||
'PROCESS,PROCESSLIST,PURGE,QUERY,RAID_CHUNKS,RAID_CHUNKSIZE,RAID_TYPE,RANGE,' +
|
||||
'READ,READS,READ_WRITE,REBUILD,REFERENCES,REGEXP,RELAY_LOG_FILE,RELAY_LOG_POS,RELEASE,RELOAD,' +
|
||||
'RENAME,REORGANIZE,REPAIR,REPEATABLE,REPLACE,REPLICATION,REQUIRE,RESIGNAL,RESTRICT,RESET,' +
|
||||
@ -939,7 +939,7 @@ const
|
||||
'SUBPARTITIONS,SUPER,TABLE,TABLES,TABLESPACE,TEMPORARY,TERMINATED,THAN,' +
|
||||
'THEN,TO,TRAILING,TRANSACTION,TRIGGER,TRIGGERS,TRUE,TYPE,UNCOMMITTED,UNDO,' +
|
||||
'UNINSTALL,UNIQUE,UNLOCK,UPDATE,UPGRADE,UNION,USAGE,USE,USING,VALUES,VARCHARACTER,' +
|
||||
'VARIABLES,VARYING,VIEW,WARNINGS,WHERE,WITH,WORK,WRITE,XOR,';
|
||||
'VARIABLES,VARYING,VIEW,VIRTUAL,WARNINGS,WHERE,WITH,WORK,WRITE,XOR,';
|
||||
|
||||
// PLSQL keywords
|
||||
MySQLPLSQLKW: UnicodeString =
|
||||
|
@ -235,7 +235,7 @@ type
|
||||
Unsigned, AllowNull, ZeroFill, LengthCustomized: Boolean;
|
||||
DefaultType: TColumnDefaultType;
|
||||
DefaultText: String;
|
||||
Comment, Charset, Collation: String;
|
||||
Comment, Charset, Collation, Expression, Virtuality: String;
|
||||
FStatus: TEditingStatus;
|
||||
constructor Create(AOwner: TDBConnection);
|
||||
destructor Destroy; override;
|
||||
@ -2775,6 +2775,14 @@ begin
|
||||
Delete(ColSpec, 1, rxCol.MatchLen[0]);
|
||||
end;
|
||||
|
||||
// Virtual columns
|
||||
rxCol.Expression := '^AS \((.+)\)\s+(VIRTUAL|PERSISTENT)\s*';
|
||||
if rxCol.Exec(ColSpec) then begin
|
||||
Col.Expression := rxCol.Match[1];
|
||||
Col.Virtuality := rxCol.Match[2];
|
||||
Delete(ColSpec, 1, rxCol.MatchLen[0]);
|
||||
end;
|
||||
|
||||
// Collation - probably not present when charset present
|
||||
rxCol.Expression := '^COLLATE (\w+)\b\s*';
|
||||
if rxCol.Exec(ColSpec) then begin
|
||||
@ -4474,21 +4482,28 @@ begin
|
||||
end;
|
||||
|
||||
function TTableColumn.SQLCode: String;
|
||||
var
|
||||
IsVirtual: Boolean;
|
||||
begin
|
||||
Result := FConnection.QuoteIdent(Name) + ' ' +DataType.Name;
|
||||
IsVirtual := (Expression <> '') and (Virtuality <> '');
|
||||
if LengthSet <> '' then
|
||||
Result := Result + '(' + LengthSet + ')';
|
||||
if (DataType.Category in [dtcInteger, dtcReal]) and Unsigned then
|
||||
Result := Result + ' UNSIGNED';
|
||||
if (DataType.Category in [dtcInteger, dtcReal]) and ZeroFill then
|
||||
Result := Result + ' ZEROFILL';
|
||||
if not IsVirtual then begin
|
||||
if not AllowNull then
|
||||
Result := Result + ' NOT';
|
||||
Result := Result + ' NULL';
|
||||
end;
|
||||
if DefaultType <> cdtNothing then begin
|
||||
Result := Result + ' ' + GetColumnDefaultClause(DefaultType, DefaultText);
|
||||
Result := TrimRight(Result); // Remove whitespace for columns without default value
|
||||
end;
|
||||
if IsVirtual then
|
||||
Result := Result + ' AS ('+Expression+') '+Virtuality;
|
||||
if Comment <> '' then
|
||||
Result := Result + ' COMMENT '+esc(Comment);
|
||||
if Collation <> '' then
|
||||
|
@ -4655,7 +4655,7 @@ MySQLKeywords.CommaText := 'ACCESSIBLE,ACTION,ADD,AFTER,AGAINST,AGGREGATE,ALGORI
|
||||
'MAX_ROWS,MAXVALUE,MIDDLEINT,MIN_ROWS,MINUTE_MICROSECOND,MINUTE_SECOND,MOD,MODE,MODIFY,MODIFIES,NAMES,' +
|
||||
'NATURAL,NEW,NO,NODEGROUP,NOT,NO_WRITE_TO_BINLOG,NULL,NUMERIC,OJ,OFFSET,OLD,ON,OPTIMIZE,OPTION,' +
|
||||
'OPTIONALLY,OPEN,OR,ORDER,OUT,OUTER,OUTFILE,PACK_KEYS,PARTIAL,PARTITION,' +
|
||||
'PARTITIONS,PLUGIN,PLUGINS,PRECISION,PREPARE,PRESERVE,PRIMARY,PRIVILEGES,PROCEDURE,' +
|
||||
'PARTITIONS,PERSISTENT,PLUGIN,PLUGINS,PRECISION,PREPARE,PRESERVE,PRIMARY,PRIVILEGES,PROCEDURE,' +
|
||||
'PROCESS,PROCESSLIST,PURGE,QUERY,RAID_CHUNKS,RAID_CHUNKSIZE,RAID_TYPE,RANGE,' +
|
||||
'READ,READS,READ_WRITE,REAL,REBUILD,REFERENCES,REGEXP,RELAY_LOG_FILE,RELAY_LOG_POS,RELEASE,RELOAD,' +
|
||||
'RENAME,REORGANIZE,REPAIR,REPEATABLE,REPLACE,REPLICATION,REQUIRE,RESIGNAL,RESTRICT,RESET,' +
|
||||
@ -4668,7 +4668,7 @@ MySQLKeywords.CommaText := 'ACCESSIBLE,ACTION,ADD,AFTER,AGAINST,AGGREGATE,ALGORI
|
||||
'SUBPARTITIONS,SUPER,TABLE,TABLES,TABLESPACE,TEMPORARY,TERMINATED,THAN,' +
|
||||
'THEN,TO,TRAILING,TRANSACTION,TRIGGER,TRIGGERS,TRUE,TYPE,UNCOMMITTED,UNDO,' +
|
||||
'UNINSTALL,UNIQUE,UNLOCK,UNSIGNED,UPDATE,UPGRADE,UNION,USAGE,USE,USING,VALUES,VARCHARACTER,' +
|
||||
'VARIABLES,VARYING,VIEW,WARNINGS,WHEN,WHERE,WITH,WORK,WRITE,XOR,YEAR_MONTH,ZEROFILL,'
|
||||
'VARIABLES,VARYING,VIEW,VIRTUAL,WARNINGS,WHEN,WHERE,WITH,WORK,WRITE,XOR,YEAR_MONTH,ZEROFILL,'
|
||||
// SQL Plus commands:
|
||||
+ 'CLOSE,CONDITION,CONTINUE,CURSOR,DECLARE,DO,EXIT,FETCH,FOUND,GOTO,' +
|
||||
'HANDLER,ITERATE,LANGUAGE,LEAVE,LOOP,UNTIL,WHILE';
|
||||
|
@ -154,6 +154,18 @@ object frmTableEditor: TfrmTableEditor
|
||||
Position = 9
|
||||
Width = 100
|
||||
WideText = 'Collation'
|
||||
end
|
||||
item
|
||||
Options = [coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coVisible, coAllowFocus]
|
||||
Position = 10
|
||||
Width = 100
|
||||
WideText = 'Expression'
|
||||
end
|
||||
item
|
||||
Options = [coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coVisible, coAllowFocus]
|
||||
Position = 11
|
||||
Width = 100
|
||||
WideText = 'Virtuality'
|
||||
end>
|
||||
end
|
||||
object PageControlMain: TPageControl
|
||||
|
@ -259,6 +259,12 @@ begin
|
||||
comboEngine.Items := DBObject.Connection.TableEngines;
|
||||
comboEngine.ItemIndex := comboEngine.Items.IndexOf(DBObject.Connection.TableEngineDefault);
|
||||
comboCollation.Items := DBObject.Connection.CollationList;
|
||||
if DBObject.Connection.Parameters.IsMariaDB then begin
|
||||
with listColumns.Header do begin
|
||||
Columns[10].Options := Columns[10].Options + [coVisible];
|
||||
Columns[11].Options := Columns[11].Options + [coVisible];
|
||||
end;
|
||||
end;
|
||||
listColumns.BeginUpdate;
|
||||
FColumns.Clear;
|
||||
btnClearIndexesClick(Self);
|
||||
@ -455,6 +461,7 @@ var
|
||||
Results: TDBQuery;
|
||||
Col, PreviousCol: PTableColumn;
|
||||
Node: PVirtualNode;
|
||||
IsVirtual: Boolean;
|
||||
|
||||
procedure AddQuery;
|
||||
begin
|
||||
@ -544,19 +551,24 @@ begin
|
||||
if Col.Status <> esUntouched then begin
|
||||
ColSpec := DBObject.Connection.QuoteIdent(Col.Name);
|
||||
ColSpec := ColSpec + ' ' + Col.DataType.Name;
|
||||
IsVirtual := (Col.Expression <> '') and (Col.Virtuality <> '');
|
||||
if Col.LengthSet <> '' then
|
||||
ColSpec := ColSpec + '(' + Col.LengthSet + ')';
|
||||
if (Col.DataType.Category in [dtcInteger, dtcReal]) and Col.Unsigned then
|
||||
ColSpec := ColSpec + ' UNSIGNED';
|
||||
if (Col.DataType.Category in [dtcInteger, dtcReal]) and Col.ZeroFill then
|
||||
ColSpec := ColSpec + ' ZEROFILL';
|
||||
if not IsVirtual then begin
|
||||
if not Col.AllowNull then
|
||||
ColSpec := ColSpec + ' NOT';
|
||||
ColSpec := ColSpec + ' NULL';
|
||||
end;
|
||||
if Col.DefaultType <> cdtNothing then begin
|
||||
ColSpec := ColSpec + ' ' + GetColumnDefaultClause(Col.DefaultType, Col.DefaultText);
|
||||
ColSpec := TrimRight(ColSpec); // Remove whitespace for columns without default value
|
||||
end;
|
||||
if IsVirtual then
|
||||
ColSpec := ColSpec + ' AS ('+Col.Expression+') '+Col.Virtuality;
|
||||
if Col.Comment <> '' then
|
||||
ColSpec := ColSpec + ' COMMENT '+esc(Col.Comment);
|
||||
if Col.Collation <> '' then begin
|
||||
@ -1010,6 +1022,8 @@ begin
|
||||
if (CellText <> '') and (chkCharsetConvert.Checked) then
|
||||
CellText := comboCollation.Text;
|
||||
end;
|
||||
10: CellText := Col.Expression;
|
||||
11: CellText := Col.Virtuality;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1139,6 +1153,8 @@ begin
|
||||
end;
|
||||
8: Col.Comment := NewText;
|
||||
9: Col.Collation := NewText;
|
||||
10: Col.Expression := NewText;
|
||||
11: Col.Virtuality := NewText;
|
||||
end;
|
||||
Col.Status := esModified;
|
||||
Modification(Sender);
|
||||
@ -1256,6 +1272,14 @@ begin
|
||||
DefaultEditor.DefaultType := Col.DefaultType;
|
||||
DefaultEditor.DataType := Col.DataType.Index;
|
||||
EditLink := DefaultEditor;
|
||||
end;
|
||||
11: begin // Virtuality pulldown
|
||||
EnumEditor := TEnumEditorLink.Create(VT);
|
||||
EnumEditor.ValueList := TStringList.Create;
|
||||
EnumEditor.ValueList.Add('');
|
||||
EnumEditor.ValueList.Add('VIRTUAL');
|
||||
EnumEditor.ValueList.Add('PERSISTENT');
|
||||
EditLink := EnumEditor;
|
||||
end
|
||||
else
|
||||
EditLink := TInplaceEditorLink.Create(VT);
|
||||
|
Reference in New Issue
Block a user