mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00
Issue #1605: support dropping table indexes on SQLite
This commit is contained in:
@ -207,10 +207,9 @@ type
|
|||||||
FLoaded: Boolean;
|
FLoaded: Boolean;
|
||||||
CreateCodeValid, AlterCodeValid: Boolean;
|
CreateCodeValid, AlterCodeValid: Boolean;
|
||||||
FColumns: TTableColumnList;
|
FColumns: TTableColumnList;
|
||||||
FKeys: TTableKeyList;
|
FKeys, FDeletedKeys: TTableKeyList;
|
||||||
FForeignKeys: TForeignKeyList;
|
FForeignKeys: TForeignKeyList;
|
||||||
FCheckConstraints: TCheckConstraintList;
|
FCheckConstraints: TCheckConstraintList;
|
||||||
FDeletedKeys,
|
|
||||||
FDeletedForeignKeys,
|
FDeletedForeignKeys,
|
||||||
FDeletedCheckConstraints: TStringList;
|
FDeletedCheckConstraints: TStringList;
|
||||||
FAlterRestrictedMessageDisplayed: Boolean;
|
FAlterRestrictedMessageDisplayed: Boolean;
|
||||||
@ -250,7 +249,7 @@ begin
|
|||||||
FColumns := TTableColumnList.Create;
|
FColumns := TTableColumnList.Create;
|
||||||
FKeys := TTableKeyList.Create;
|
FKeys := TTableKeyList.Create;
|
||||||
FForeignKeys := TForeignKeyList.Create;
|
FForeignKeys := TForeignKeyList.Create;
|
||||||
FDeletedKeys := TStringList.Create;
|
FDeletedKeys := TTableKeyList.Create;
|
||||||
FDeletedForeignKeys := TStringList.Create;
|
FDeletedForeignKeys := TStringList.Create;
|
||||||
FDeletedCheckConstraints := TStringList.Create;
|
FDeletedCheckConstraints := TStringList.Create;
|
||||||
FDeletedCheckConstraints.Duplicates := dupIgnore;
|
FDeletedCheckConstraints.Duplicates := dupIgnore;
|
||||||
@ -614,7 +613,7 @@ begin
|
|||||||
// ALTER TABLE statement. Separate statements are required."
|
// ALTER TABLE statement. Separate statements are required."
|
||||||
for i:=0 to FForeignKeys.Count-1 do begin
|
for i:=0 to FForeignKeys.Count-1 do begin
|
||||||
if FForeignKeys[i].Modified and (not FForeignKeys[i].Added) then
|
if FForeignKeys[i].Modified and (not FForeignKeys[i].Added) then
|
||||||
Specs.Add(DBObject.Connection.GetSQLSpecifity(spForeignKeyDrop, [Conn.QuoteIdent(FForeignKeys[i].OldKeyName)]));
|
Specs.Add(Conn.GetSQLSpecifity(spForeignKeyDrop, [Conn.QuoteIdent(FForeignKeys[i].OldKeyName)]));
|
||||||
end;
|
end;
|
||||||
FinishSpecs;
|
FinishSpecs;
|
||||||
|
|
||||||
@ -800,14 +799,18 @@ begin
|
|||||||
|
|
||||||
// Drop indexes, also changed indexes, which will be readded below
|
// Drop indexes, also changed indexes, which will be readded below
|
||||||
for i:=0 to FDeletedKeys.Count-1 do begin
|
for i:=0 to FDeletedKeys.Count-1 do begin
|
||||||
if FDeletedKeys[i] = TTableKey.PRIMARY then
|
if not FDeletedKeys[i].InsideCreateCode then
|
||||||
|
Continue;
|
||||||
|
if FDeletedKeys[i].IndexType = TTableKey.PRIMARY then
|
||||||
IndexSQL := 'PRIMARY KEY'
|
IndexSQL := 'PRIMARY KEY'
|
||||||
else
|
else
|
||||||
IndexSQL := 'INDEX ' + Conn.QuoteIdent(FDeletedKeys[i]);
|
IndexSQL := 'INDEX ' + Conn.QuoteIdent(FDeletedKeys[i].OldName);
|
||||||
Specs.Add('DROP '+IndexSQL);
|
Specs.Add('DROP '+IndexSQL);
|
||||||
end;
|
end;
|
||||||
// Add changed or added indexes
|
// Add changed or added indexes
|
||||||
for i:=0 to FKeys.Count-1 do begin
|
for i:=0 to FKeys.Count-1 do begin
|
||||||
|
if not FKeys[i].InsideCreateCode then
|
||||||
|
Continue;
|
||||||
if FKeys[i].Modified and (not FKeys[i].Added) then begin
|
if FKeys[i].Modified and (not FKeys[i].Added) then begin
|
||||||
if FKeys[i].OldIndexType = TTableKey.PRIMARY then
|
if FKeys[i].OldIndexType = TTableKey.PRIMARY then
|
||||||
IndexSQL := 'PRIMARY KEY'
|
IndexSQL := 'PRIMARY KEY'
|
||||||
@ -820,7 +823,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
for i:=0 to FDeletedForeignKeys.Count-1 do begin
|
for i:=0 to FDeletedForeignKeys.Count-1 do begin
|
||||||
Specs.Add(DBObject.Connection.GetSQLSpecifity(spForeignKeyDrop, [Conn.QuoteIdent(FDeletedForeignKeys[i])]));
|
Specs.Add(Conn.GetSQLSpecifity(spForeignKeyDrop, [Conn.QuoteIdent(FDeletedForeignKeys[i])]));
|
||||||
end;
|
end;
|
||||||
for i:=0 to FForeignKeys.Count-1 do begin
|
for i:=0 to FForeignKeys.Count-1 do begin
|
||||||
if FForeignKeys[i].Added or FForeignKeys[i].Modified then
|
if FForeignKeys[i].Added or FForeignKeys[i].Modified then
|
||||||
@ -839,6 +842,33 @@ begin
|
|||||||
|
|
||||||
FinishSpecs;
|
FinishSpecs;
|
||||||
|
|
||||||
|
// Separate queries from here on
|
||||||
|
|
||||||
|
// Drop indexes, also changed indexes, which will be readded below
|
||||||
|
for i:=0 to FDeletedKeys.Count-1 do begin
|
||||||
|
if FDeletedKeys[i].InsideCreateCode then
|
||||||
|
Continue;
|
||||||
|
if FDeletedKeys[i].IndexType = TTableKey.PRIMARY then
|
||||||
|
IndexSQL := 'PRIMARY KEY'
|
||||||
|
else
|
||||||
|
IndexSQL := 'INDEX ' + Conn.QuoteIdent(FDeletedKeys[i].OldName);
|
||||||
|
AddQuery('DROP '+IndexSQL);
|
||||||
|
end;
|
||||||
|
// Add changed or added indexes
|
||||||
|
for i:=0 to FKeys.Count-1 do begin
|
||||||
|
if FKeys[i].InsideCreateCode then
|
||||||
|
Continue;
|
||||||
|
if FKeys[i].Modified and (not FKeys[i].Added) then begin
|
||||||
|
if FKeys[i].OldIndexType = TTableKey.PRIMARY then
|
||||||
|
IndexSQL := 'PRIMARY KEY'
|
||||||
|
else
|
||||||
|
IndexSQL := 'INDEX ' + Conn.QuoteIdent(FKeys[i].OldName);
|
||||||
|
AddQuery('DROP '+IndexSQL);
|
||||||
|
end;
|
||||||
|
if FKeys[i].Added or FKeys[i].Modified then
|
||||||
|
AddQuery(FKeys[i].SQLCode(DBObject.Name));
|
||||||
|
end;
|
||||||
|
|
||||||
Result := TSQLBatch.Create;
|
Result := TSQLBatch.Create;
|
||||||
Result.SQL := SQL;
|
Result.SQL := SQL;
|
||||||
|
|
||||||
@ -867,7 +897,7 @@ begin
|
|||||||
|
|
||||||
IndexCount := 0;
|
IndexCount := 0;
|
||||||
for i:=0 to FKeys.Count-1 do begin
|
for i:=0 to FKeys.Count-1 do begin
|
||||||
if not FKeys[0].InsideCreateCode then
|
if not FKeys[i].InsideCreateCode then
|
||||||
Continue;
|
Continue;
|
||||||
tmp := FKeys[i].SQLCode;
|
tmp := FKeys[i].SQLCode;
|
||||||
if tmp <> '' then begin
|
if tmp <> '' then begin
|
||||||
@ -1765,6 +1795,7 @@ procedure TfrmTableEditor.btnRemoveIndexClick(Sender: TObject);
|
|||||||
var
|
var
|
||||||
idx: Integer;
|
idx: Integer;
|
||||||
NewSelectNode: PVirtualNode;
|
NewSelectNode: PVirtualNode;
|
||||||
|
DeleteTblKey: TTableKey;
|
||||||
begin
|
begin
|
||||||
// Remove index or part
|
// Remove index or part
|
||||||
if treeIndexes.IsEditing then
|
if treeIndexes.IsEditing then
|
||||||
@ -1772,8 +1803,11 @@ begin
|
|||||||
case treeIndexes.GetNodeLevel(treeIndexes.FocusedNode) of
|
case treeIndexes.GetNodeLevel(treeIndexes.FocusedNode) of
|
||||||
0: begin
|
0: begin
|
||||||
idx := treeIndexes.FocusedNode.Index;
|
idx := treeIndexes.FocusedNode.Index;
|
||||||
if not FKeys[idx].Added then
|
if not FKeys[idx].Added then begin
|
||||||
FDeletedKeys.Add(FKeys[idx].OldName);
|
DeleteTblKey := TTableKey.Create(DBObject.Connection);
|
||||||
|
DeleteTblKey.Assign(FKeys[idx]);
|
||||||
|
FDeletedKeys.Add(DeleteTblKey);
|
||||||
|
end;
|
||||||
FKeys.Delete(idx);
|
FKeys.Delete(idx);
|
||||||
// Delete node although ReinitChildren would do the same, but the Repaint before
|
// Delete node although ReinitChildren would do the same, but the Repaint before
|
||||||
// creates AVs in certain cases. See issue #2557
|
// creates AVs in certain cases. See issue #2557
|
||||||
@ -1798,7 +1832,7 @@ end;
|
|||||||
|
|
||||||
procedure TfrmTableEditor.btnClearIndexesClick(Sender: TObject);
|
procedure TfrmTableEditor.btnClearIndexesClick(Sender: TObject);
|
||||||
var
|
var
|
||||||
TblKey: TTableKey;
|
TblKey, DeleteTblKey: TTableKey;
|
||||||
begin
|
begin
|
||||||
// Clear all indexes
|
// Clear all indexes
|
||||||
// Column data gets freed below - end any editor which could cause AV's
|
// Column data gets freed below - end any editor which could cause AV's
|
||||||
@ -1807,8 +1841,11 @@ begin
|
|||||||
// Trigger ValidateIndexControls
|
// Trigger ValidateIndexControls
|
||||||
SelectNode(treeIndexes, nil);
|
SelectNode(treeIndexes, nil);
|
||||||
for TblKey in FKeys do begin
|
for TblKey in FKeys do begin
|
||||||
if not TblKey.Added then
|
if not TblKey.Added then begin
|
||||||
FDeletedKeys.Add(TblKey.OldName);
|
DeleteTblKey := TTableKey.Create(DBObject.Connection);
|
||||||
|
DeleteTblKey.Assign(TblKey);
|
||||||
|
FDeletedKeys.Add(TblKey);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
FKeys.Clear;
|
FKeys.Clear;
|
||||||
Modification(Sender);
|
Modification(Sender);
|
||||||
|
Reference in New Issue
Block a user