@@ -14,7 +14,8 @@ DbStructureModel::DbStructureModel(DBBrowserDB& db, QObject* parent)
1414 m_db(db),
1515 browsablesRootItem(nullptr ),
1616 m_dropQualifiedNames(false ),
17- m_dropEnquotedNames(false )
17+ m_dropEnquotedNames(false ),
18+ m_dropSelectQuery(true )
1819{
1920 // Create root item and use its columns to store the header strings
2021 QStringList header;
@@ -211,6 +212,11 @@ QMimeData* DbStructureModel::mimeData(const QModelIndexList& indices) const
211212 // We store the SQL data and the names data separately
212213 QByteArray sqlData, namesData;
213214
215+ // For dropping SELECT queries, these variables take account of
216+ // whether all objects are of the same type and belong to the same table.
217+ QString objectTypeSet;
218+ QString tableSet;
219+
214220 // Loop through selected indices
215221 for (const QModelIndex& index : indices)
216222 {
@@ -220,14 +226,36 @@ QMimeData* DbStructureModel::mimeData(const QModelIndexList& indices) const
220226 // Only export data for valid indices and only once per row (SQL column or Name column).
221227 if (index.isValid ()) {
222228 QString objectType = data (index.sibling (index.row (), ColumnObjectType), Qt::DisplayRole).toString ();
229+ if (objectTypeSet.isEmpty () || objectTypeSet == objectType) {
230+ objectTypeSet = objectType;
231+ } else {
232+ objectTypeSet = " *" ;
233+ }
223234
224235 // For names, export a (qualified) (escaped) identifier of the item for statement composition in SQL editor.
225- if (objectType == " field" )
236+ if (objectType == " field" ) {
226237 namesData.append (getNameForDropping (item->text (ColumnSchema), item->parent ()->text (ColumnName), item->text (ColumnName)).toUtf8 ());
227- else if (objectType == " database" )
238+ QString table = getNameForDropping (item->text (ColumnSchema), item->parent ()->text (ColumnName), " " );
239+ if (tableSet.isEmpty () || tableSet == table) {
240+ tableSet = table;
241+ } else {
242+ tableSet = " *" ;
243+ }
244+ } else if (objectType == " table" ) {
245+ QString table = getNameForDropping (item->text (ColumnSchema), item->text (ColumnName), " " );
246+ namesData.append (table.toUtf8 ());
247+ if (tableSet.isEmpty () || tableSet == table) {
248+ tableSet = table;
249+ } else {
250+ tableSet = " *" ;
251+ }
252+ } else if (objectType == " database" ) {
253+ tableSet = " " ;
228254 namesData.append (getNameForDropping (item->text (ColumnName), " " , " " ).toUtf8 ());
229- else if (!objectType.isEmpty ())
255+ } else if (!objectType.isEmpty ()) {
256+ tableSet = " " ;
230257 namesData.append (getNameForDropping (item->text (ColumnSchema), item->text (ColumnName), " " ).toUtf8 ());
258+ }
231259
232260 if (objectType != " field" && index.column () == ColumnSQL)
233261 {
@@ -271,6 +299,16 @@ QMimeData* DbStructureModel::mimeData(const QModelIndexList& indices) const
271299 else if (namesData.endsWith (" ." ))
272300 namesData.chop (1 );
273301
302+ if (tableSet.endsWith (" ." ))
303+ tableSet.chop (1 );
304+
305+ if (m_dropSelectQuery && !tableSet.isEmpty () && tableSet != " *" && !objectTypeSet.isEmpty ()) {
306+ if (objectTypeSet == " field" ) {
307+ namesData = (" SELECT " + QString::fromUtf8 (namesData) + " FROM " + tableSet + " ;" ).toUtf8 ();
308+ } else if (objectTypeSet == " table" ) {
309+ namesData = (" SELECT * FROM " + tableSet + " ;" ).toUtf8 ();
310+ }
311+ }
274312 mime->setData (" text/plain" , namesData);
275313 } else
276314 mime->setData (" text/plain" , sqlData);
0 commit comments