Hi Pascal,
Lunchtime so I can answer your post 
FRefetchRows  is used as a boolean flag when TSqlitePassetDataset.InternalRefresh needs to refetch records from disk.
but since I already override TDataset.Refresh, setting  FRefetchRows := True, it doesn't need to be set again in TSqlitePassDataset.EmptyTable. 
Procedure TSqlitePassDataset.Refresh;
begin
  FRefetchRows := True;
  Inherited;
end;
{procedure InternalRefresh; virtual; abstract;
-------------------------------------------
Refresh the dataset.}
procedure TSqlitePassDataset.InternalRefresh;
begin
...
   {  Queries data using SQL sentence : Refetch the records from Sqlite database engine }
   Try
   if FRefetchRows then
      begin
      FRecordset.Open(FSQLSelectStmt.SQL, FSQLSelectStmt.FPrimaryKeyCount);
      MapFieldsToMemoryFieldBuffers;
      if Not FLookupFieldsDisplayedRecordsOnly
         then FillLookupFields(0, Pred(FRecordset.FRecordsCount));
      if Not FCalcDisplayedRecordsOnly
         then FillCalcFields(0, Pred(FRecordset.FRecordsCount));
      FRefetchRows := False;
      end;
...
Finally, I decided to change the behavior of EmptyTable :
When called directly from the current dataset, the data will be refreshed automatically
procedure TSqlitePassDataset.EmptyTable;
begin
  if DatasetType = dtTable then
     begin
     FDatabase.Engine.ExecSQL('DELETE FROM "' + DatasetName + '";');
     Refresh;
     end;
end;
Suggest : I could extend the syntax to include dtQuery ->  if DatasetType in [dtTable, dtQuery, dtSQLSelect] ?
When NOT called directly from the current dataset but from Database.TableDefs, the data will NOT be refreshed automatically (because you shouldn't be working on or displaying data from the table you want to empty...)
procedure TSqlitePassTableDefs.EmptyTable(Const TableName: String);
begin
 FDatabase.Engine.ExecSQL('DELETE FROM "' + TableName + '";');
end;
Regards