aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2017-02-09 04:37:26 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2017-02-09 04:37:26 -0500
commitc9d6debf9015b7853c3e061bbc64a555d85e2fcd (patch)
tree53341bc57ae9fbad2beb5b6c08d97a68bee0ec8e /SQLiteStudio3/coreSQLiteStudio
parentd5caba2b1f36dc3b92fa705a06097d0597fa2ddd (diff)
parentd9aa870e5d509cc7309ab82dd102a937ab58613a (diff)
Merge tag 'upstream/3.1.1+dfsg1'
Upstream version 3.1.1+dfsg1 # gpg: Signature made Thu 09 Feb 2017 04:37:24 AM EST # gpg: using RSA key 5001E1B09AA3744B # gpg: issuer "unit193@ubuntu.com" # gpg: Good signature from "Unit 193 <unit193@ubuntu.com>" [unknown] # gpg: aka "Unit 193 <unit193@gmail.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 8DB3 E586 865D 2B4A 2B18 5A5C 5001 E1B0 9AA3 744B
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt74
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/Info.plist22
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/TODO.txt5
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/committable.cpp10
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/committable.h4
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/common/table.cpp30
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/common/table.h18
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/common/utils.cpp21
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/common/utils.h13
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/common/utils_sql.cpp147
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/common/utils_sql.h6
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/completionhelper.cpp4
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.cpp5
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.h1
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.cpp52
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.h6
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro938
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.qrc (renamed from SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc)4
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/csvformat.cpp23
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/csvformat.h6
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp60
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp2
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/chainexecutor.cpp16
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/chainexecutor.h19
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp126
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h67
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp31
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcellsize.cpp8
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp38
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h2
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutordatasources.cpp2
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorexecute.cpp10
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorreplaceviews.cpp1
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/dbversionconverter.cpp3
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/exportworker.cpp12
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/importworker.cpp24
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/log.cpp12
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/log.h1
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecolumntype.cpp4
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.cpp20
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.h2
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/lexer.cpp1
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/lexer_low_lev.cpp2
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp1549
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.h8
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y138
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.cpp4
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.h2
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/token.cpp10
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/parser/token.h1
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginsqlite3.cpp2
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginstdfilebase.cpp33
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginstdfilebase.h16
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/plugins/uiconfiguredplugin.h2
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/querygenerator.cpp7
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/schemaresolver.cpp76
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/schemaresolver.h2
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp72
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/selectresolver.h20
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/config.cpp11
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/config.h7
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp71
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h3
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp107
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.h4
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/importmanager.cpp7
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/importmanager.h3
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp6
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp4
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts101
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts101
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qmbin41104 -> 41388 bytes
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts407
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_it.ts101
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qmbin42248 -> 43087 bytes
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts101
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.qmbin23 -> 2939 bytes
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts129
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qmbin41441 -> 42098 bytes
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts107
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts101
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts101
82 files changed, 3127 insertions, 2139 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt b/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt
index a477b8c..c0c42cd 100644
--- a/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt
+++ b/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt
@@ -1,3 +1,57 @@
+[3.1.1]
+ * [ADDED]: WxSQLite3 plugin (with encryption support).
+ * [ADDED]: System.Data.SQLite plugin (ADO.NET, includes encryption support).
+ * [ADDED]: Support for "Row Value" introduced in SQLite 3.15.0.
+ * [ADDED]: New option in configuration dialog to decide whether you want to keep NULL values when entering empty strings in cells (new, more intuitive behavior), or overwrite NULLs with empty string values (as it used to be so far).
+ * [ADDED]: Editor window has now "Find" and "Replace" toolbar buttons for those functions (which were already there, available under shortcuts).
+ * [ADDED]: New built-in functions: import(), import_formats(), import_options() and charset(). All described on SQLiteStudio's wiki (at User Manual page).
+ * [ADDED]: #3106 ScriptingTcl has now "tcl_init" command to invoke full interpreter initialization, which creates [clock] commands and some others. It's not invoked automatically to avoid performane issues.
+ * [ADDED]: #3136 Added "--master-config" command line option to have a settings file (regular SQLiteStudio config file) that all running SQLiteStudio instances import settings from. More details in manual on wiki page.
+ * [ADDED]: #3127 Added 'select all' and 'deselect all' buttons in tigger's UPDATE OF columns dialog.
+ * [CHANGE]: #3135 Re-enabled possibility to close database list panel (and reopen it from the View menu entry).
+ * [CHANGE]: #2901 Automatically generated database name includes full file name, except for the file extension only (unlike before, when it took only a file name up to the first dot).
+ * [CHANGE]: #3140 The "generate name automatically" checkbox has been removed. Now the name is generated automatically by default, unless user starts to edit the name manually.
+ * [BUGFIX]: #3118 #3124 #2943 Fixed double precision numbers formatting.
+ * [BUGFIX]: DbAndroid plugin: Fixed 'adb' automatic detection under Linux.
+ * [BUGFIX]: #3126 #3092 Fixed problem with database versions in Android plugin.
+ * [BUGFIX]: #3155 Fixed crash when confiriming custom FK value with Enter key.
+ * [BUGFIX]: #3094 #3095 Fixed default FK value preselection when tabbing through cells.
+ * [BUGFIX]: #3154 Fixed crash when mass replacing token to another token containing initial token.
+ * [BUGFIX]: Fixed query generation for "UPDATE" and "DELETE" when invoking it from Database List context menu for the table.
+ * [BUGFIX]: Fixed Ctrl+click (Cmd+click on MacOSX) handling of object names that require name wrapping (such as names with spaces in it).
+ * [BUGFIX]: #3133 Fixed resolving tables with unusual (like cyrillic) characters in their names.
+ * [BUGFIX]: #3096 Restored data editing by Return key hit, that got broken in 3.1.0 for MacOSX.
+ * [BUGFIX]: #3122 Several tweaks to Android shell mode connection.
+ * [BUGFIX]: #3093 Fixed memory leak in Android plugin.
+ * [BUGFIX]: #3132 Fixed column resolving in a View that uses same alias for two different columns.
+ * [BUGFIX]: Fixed importing Windows and Macintosh end-line format CSV files (handling \r\n and \r properly).
+ * [BUGFIX]: #3134 Fixed recognizing CREATE TRIGGER statements properly when CASE-WHEN-END is used inside.
+ * [BUGFIX]: #3112 Fixed Foreign Key editing when the foreign table was modified (for example renamed) and the local column was already presented in the data view.
+ * [BUGFIX]: #3113 DEFAULT value is now automatically inserted only when committing NULL for NOT NULL column. Also new option is introduced to use DEFAULT always for NULL values, regardles of NOT NULL constraint.
+ * [BUGFIX]: Fixed refreshing database list view when changing labels display settings in configuration dialog.
+ * [BUGFIX]: Fixed FormView row navigation shortcuts.
+ * [BUGFIX]: #3097 Fixed alphabetical ordering when exporting entire database.
+ * [BUGFIX]: Fixed "UPDATE OF" column list formatting (indentation) in Enterprise Formater plugin.
+ * [BUGFIX]: Fixed SqlSimpleFormatter plugin to add ";" at the end of CREATE TABLE statements while exporting database schema to SQL format.
+ * [BUGFIX]: Data view fonts now apply to other tabs in the table window and view window.
+ * [BUGFIX]: #3005 Fixed performance issue with lots of big values loaded into the grid. Also fixed editing those values using the inline cell editor.
+ * [BUGFIX]: #2938 Fixed query executor to idenfity properly tables in named subselects, to the ROWID is handled correctly.
+ * [BUGFIX]: #3168 Fixed data filter field in data view, so it handles the single quote character.
+ * [BUGFIX]: #2942 Erasing table data context menu option now honors multiple table selection.
+ * [BUGFIX]: #2900 Optimized execution of thousands of queries at once in SQL editor window.
+ * [BUGFIX]: #2934 Table foreign key dialog can now refer to the same table. So far only column dialog constraint for FK could do it.
+ * [BUGFIX]: #3120 Performance of SQL editor window greatly increased when working with huge sets if queries (like thousands).
+ * [BUGFIX]: #3028 Fixed formatter for "NOT EXISTS" expression.
+ * [BUGFIX]: #2990 Fixed handling scientific numbers notation.
+ * [BUGFIX]: #2987 Fixed "go to referenced row" function when using multi word object names.
+ * [BUGFIX]: #3173 Fixed numerous typos in messages and names.
+ * [BUGFIX]: #3178 Fixed pagination for query simple execution method.
+ * [BUGFIX]: #3177 Fixed ORDER BY with column numbers, instead of names.
+ * [BUGFIX]: #3125 Fixed trigger UPDATE OF columns popup dialog positioning.
+ * [BUGFIX]: #3166 Fixed crash when trying to print data.
+ * [BUGFIX]: Fixed reading long values of not-editable result columns (like expressions or functions that return long values). They used to be truncated.
+ * [BUGFIX]: Compilation fixes.
+
[3.1.0]
* [ADDED]: SQLCipher plugin is now free, open source and distributed together with other standard plugins.
* [ADDED]: #2963 Indexed expressions for CREATE INDEX statements (introduced in SQLite 3.9) are now supported and can be edited in Index Dialog.
@@ -98,7 +152,7 @@
[3.0.5]
* [ADDED]: #2831 Ported 'Erase table data' feature (in table's context menu) from version 2.1.5.
- * [CHANGE]: Data view has now a 'cover' with progress bar when commiting more changes at once. This eliminates weird GUI freeze when commiting lots of new/deleted rows.
+ * [CHANGE]: Data view has now a 'cover' with progress bar when committing more changes at once. This eliminates weird GUI freeze when committing lots of new/deleted rows.
* [CHANGE]: Populate dialog has now progress bar when working.
* [CHANGE]: Enhanced SQL formatter to format CREATE TRIGGER statements in a bit more readable way.
* [BUGFIX]: #2838 Fixed outstanding bug causing database file to be deleted if a user tried "Test connection" on the database under Windows.
@@ -181,7 +235,7 @@
* [BUGFIX]: #2703 Fixed compilation errors on GCC 4.9.
* [BUGFIX]: #2707 Fixed crash when importing CSV file with empty value for last column.
* [BUGFIX]: Valid objects in SQL editor are now highlighted and are Ctrl+clickable (the feature was there, but was broken and it didn't work).
- * [BUGFIX]: Fixed invalid 'modified' status when focusing out NumberMultiEditor in FormView, resulting in uncommited change on FormView, even there was no change.
+ * [BUGFIX]: Fixed invalid 'modified' status when focusing out NumberMultiEditor in FormView, resulting in uncommitted change on FormView, even there was no change.
* [BUGFIX]: #2698 Fixed double precision numbers displaying in the Grid View.
* [BUGFIX]: #2696 Fixed handling foreign keys when the main table was not renamed, just columns changed.
* [BUGFIX]: #2713 Fixed foreign key actions in Foreign Key dialog, so they are no longer the same for ON UPDATE and ON DELETE, even they were configured differently.
@@ -221,7 +275,7 @@
* [ADDED]: Scripting languages are now provided by plugins. With this version there is support for QtScript (built in), SQL (built in) and Tcl (as a plugin).
* [ADDED]: Support for sorting data by multiple columns by right-clicking on the data grid header.
* [ADDED]: Support for "WITHOUT ROWID" tables and "WITH" clause in queries.
- * [ADDED]: If there are any uncommited changes (in data or schema), user will be asked for confirmation before closing application or MDI window.
+ * [ADDED]: If there are any uncommitted changes (in data or schema), user will be asked for confirmation before closing application or MDI window.
* [ADDED]: Printing (for data, schema and query) support.
* [ADDED]: Much, much more, it's just hard to put every single detail in the changelog. After all, the entire application was written from the very beginning.
* [CHANGE]: Table is now edited in the table window directly, not in any special dialog.
@@ -282,7 +336,7 @@
* [BUGFIX]: Fixed http://bugs.sqlitestudio.pl/?id=1743
* [BUGFIX]: Fixed http://bugs.sqlitestudio.pl/?id=1700
* [BUGFIX]: Fixed http://bugs.sqlitestudio.pl/?id=1763
- * [BUGFIX]: When editing a cell from query results and commiting changes, then all cells representing the same database cell will be updated with new value as well.
+ * [BUGFIX]: When editing a cell from query results and committing changes, then all cells representing the same database cell will be updated with new value as well.
* [BUGFIX]: Fonts initialization optimized. SQL editor widgets should open slightly faster, especially under Windows.
* [BUGFIX]: Transparent attach/detach mechanism fixed to avoid multiple attaches of the same database.
* [BUGFIX]: Fixed column edition dialog to not hide under Windows after being open with "double click".
@@ -580,7 +634,7 @@
* [CHANGE]: Datatypes in column edition dialog are now autocompleted while typing, so it's enough to type "t" to get "TEXT" type.
* [CHANGE]: Datatype list in column edition can now be fast navigated using keys, so if you drop down the list, you can press "i" to select "INT" type fast. (http://bugs.sqlitestudio.pl/?id=190)
* [BUGFIX]: Fixed bug related to "_toCommit".
- * [BUGFIX]: Fixed bug, when user was able to edit deleted but uncommited row (even the edition was ignored).
+ * [BUGFIX]: Fixed bug, when user was able to edit deleted but uncommitted row (even the edition was ignored).
* [BUGFIX]: Fixed insertion of numeric values in data view - they're now treated as numeric if column type says so (they used to be treated as string and CHECK constraint was not satisfied very often).
* [BUGFIX]: Fixed http://bugs.sqlitestudio.pl/?id=168
* [BUGFIX]: Fixed http://bugs.sqlitestudio.pl/?id=172
@@ -660,7 +714,7 @@
[2.0.6]
* [ADDED]: Context menu (with copy/cut/paste) in text fields.
- * [CHANGE]: Removed "autoCommit". Now all changes have to be commited.
+ * [CHANGE]: Removed "autoCommit". Now all changes have to be committed.
* [CHANGE]: Database add/edit dialog modified for Mac OS X. Now it uses two dialogs to pick file - native OSX dialogs!
* [BUGFIX]: Commit/Rollback buttons activates when editing starts by typing value.
* [BUGFIX]: Fixed: http://forum.sqlitestudio.pl/viewtopic.php?f=4&t=3972
@@ -944,11 +998,11 @@
* [BUGFIX]: Result grid editing for table name with whitespace fixed.
* [BUGFIX]: Fixed control-a shortcut for some edit fields.
* [BUGFIX]: Keyboard/mouse input focus grabbing for some of modal dialogs fixed.
- * [BUGFIX]: Handling of uncommited grid editions while closing MDI window.
+ * [BUGFIX]: Handling of uncommitted grid editions while closing MDI window.
* [BUGFIX]: Handling of NOT NULL constraint used and no DEFAULT specified in table column editing dialog in case when table already contains some data filled in.
* [BUGFIX]: Small grammar fixes in tips dialog.
* [BUGFIX]: Font handling rewritten. Should not cause problems anymore, but if it does, then fixing will be now much easier.
- * [BUGFIX]: Fixed 100% CPU usage for sequence: open 2 table windows, edit data cell in one window, then focus the other one window without commiting edition before.
+ * [BUGFIX]: Fixed 100% CPU usage for sequence: open 2 table windows, edit data cell in one window, then focus the other one window without committing edition before.
* [BUGFIX]: Fixed MDI window placement, so they won't appear at exactly same position while creating anymore.
* [BUGFIX]: Added DATETIME data type support.
* [BUGFIX]: DEFAULT values handled properly. Now you can use functions and other expressions, as well as literal values.
@@ -1052,7 +1106,7 @@
* [CHANGE]: There is a known bug that is not 100%-repeatable. It occurs sometimes when switching to FormView of table data. This change has added some additional logs to debug the bug.
* [BUGFIX]: A very obvious bug included in beta5 - adding database dialog didn't disappear when database is added correctly.
* [BUGFIX]: Fixed error while switching from standard BLOB editor to hexadecimal editor.
- * [BUGFIX]: Fixed commiting new rows from FormView of table data.
+ * [BUGFIX]: Fixed committing new rows from FormView of table data.
[1.0.0-beta5]
* [ADDED]: Databases tree refresh button on toolbar and in View menu.
@@ -1122,7 +1176,7 @@
* [BUGFIX]: ColorPicker handles incorrect colors passed to it and in that case it uses white color as default.
* [BUGFIX]: ColorPicker handles HTML color editing much better then before. Now it might be impossible to break it.
* [BUGFIX]: Better detection of operating system (fixed problems with Windows Vista and Windows 2000).
- * [BUGFIX]: Fixed adding new row to table data grid when there was an error while commiting previous row.
+ * [BUGFIX]: Fixed adding new row to table data grid when there was an error while committing previous row.
* [BUGFIX]: Shortcuts Ctrl+Left, Ctrl+Right, Ctrl+Shift+Left and Ctrl+Shift+Right are back!
* [BUGFIX]: Detection of 'language changed' in configuration dialog fixed (it used to detect change even there was no change).
* [BUGFIX]: Fixed active task changing while setting MDI windows in cascade layout, then pushing maximize button on some window other than the currently active.
diff --git a/SQLiteStudio3/coreSQLiteStudio/Info.plist b/SQLiteStudio3/coreSQLiteStudio/Info.plist
new file mode 100644
index 0000000..3ce6f15
--- /dev/null
+++ b/SQLiteStudio3/coreSQLiteStudio/Info.plist
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+ <key>CFBundleIconFile</key>
+ <string>sqlitestudio.icns</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleGetInfoString</key>
+ <string>SalSoft, %YEAR%</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleShortVersionString</key>
+ <string>%VERSION%</string>
+ <key>CFBundleExecutable</key>
+ <string>SQLiteStudio</string>
+ <key>CFBundleIdentifier</key>
+ <string>pl.com.salsoft.SQLiteStudio</string>
+</dict>
+</plist>
diff --git a/SQLiteStudio3/coreSQLiteStudio/TODO.txt b/SQLiteStudio3/coreSQLiteStudio/TODO.txt
index 4faac9d..9e0a77d 100644
--- a/SQLiteStudio3/coreSQLiteStudio/TODO.txt
+++ b/SQLiteStudio3/coreSQLiteStudio/TODO.txt
@@ -11,8 +11,6 @@ cannot reproduce:
- BLOB preview engine based on plugins
- ERD plugin
- DB compare plugin
-- Foreign Key value suggestions in GridView
-- Foreign Key previews in subframes
- executing query with bind params
- comments support in formatter
@@ -20,7 +18,7 @@ cannot reproduce:
- object names (columns, tables, etc) in dialogs should be validated against suffix/prefix whitespaces and if they appear, user should be asked for confirmation
- small useful features: generating template queries from context menu for table/view, from data view.
- code templates
-- commiting DataView should be async
+- committing DataView should be async
- syntax checkers as services - per language
- code assistants as services - per language
- specialized validation of expressions for DEFAULT constraint.
@@ -48,6 +46,7 @@ cannot reproduce:
- constraints tab in table window should have toolbar for adding/editing/deleting constraints
- add menu mnemonics support (underlined shortcut letters)
- per column filtering field when clicked on column header(?)
+- option to show current window's DB path in top window title
CLI:
- plugin management commands
diff --git a/SQLiteStudio3/coreSQLiteStudio/committable.cpp b/SQLiteStudio3/coreSQLiteStudio/committable.cpp
index 892437a..dd35244 100644
--- a/SQLiteStudio3/coreSQLiteStudio/committable.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/committable.cpp
@@ -27,15 +27,15 @@ bool Committable::canQuit()
return true;
}
- QList<Committable*> uncommitedInstances;
+ QList<Committable*> uncommittedInstances;
for (Committable* c : instances)
{
- if (c->isUncommited())
- uncommitedInstances << c;
+ if (c->isUncommitted())
+ uncommittedInstances << c;
}
- if (uncommitedInstances.size() == 0)
+ if (uncommittedInstances.size() == 0)
return true;
- return confirmFunc(uncommitedInstances);
+ return confirmFunc(uncommittedInstances);
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/committable.h b/SQLiteStudio3/coreSQLiteStudio/committable.h
index cf1d48b..daa0f92 100644
--- a/SQLiteStudio3/coreSQLiteStudio/committable.h
+++ b/SQLiteStudio3/coreSQLiteStudio/committable.h
@@ -13,8 +13,8 @@ class API_EXPORT Committable
Committable();
virtual ~Committable();
- virtual bool isUncommited() const = 0;
- virtual QString getQuitUncommitedConfirmMessage() const = 0;
+ virtual bool isUncommitted() const = 0;
+ virtual QString getQuitUncommittedConfirmMessage() const = 0;
static void init(ConfirmFunction confirmFunc);
static bool canQuit();
diff --git a/SQLiteStudio3/coreSQLiteStudio/common/table.cpp b/SQLiteStudio3/coreSQLiteStudio/common/table.cpp
index a9b0f16..20a9864 100644
--- a/SQLiteStudio3/coreSQLiteStudio/common/table.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/common/table.cpp
@@ -90,3 +90,33 @@ int qHash(AliasedTable table)
{
return qHash(table.getDatabase() + "." + table.getTable() + " " + table.getTableAlias());
}
+
+DbAndTable::DbAndTable() :
+ Table()
+{
+}
+
+DbAndTable::DbAndTable(Db *db, const QString &database, const QString &table) :
+ Table(database, table), db(db)
+{
+}
+
+DbAndTable::DbAndTable(const DbAndTable &other) :
+ Table(other), db(other.db)
+{
+}
+
+int DbAndTable::operator ==(const DbAndTable &other) const
+{
+ return other.database == this->database && other.table == this->table && other.db == this->db;
+}
+
+Db *DbAndTable::getDb() const
+{
+ return db;
+}
+
+void DbAndTable::setDb(Db *value)
+{
+ db = value;
+}
diff --git a/SQLiteStudio3/coreSQLiteStudio/common/table.h b/SQLiteStudio3/coreSQLiteStudio/common/table.h
index 5cc4570..5460148 100644
--- a/SQLiteStudio3/coreSQLiteStudio/common/table.h
+++ b/SQLiteStudio3/coreSQLiteStudio/common/table.h
@@ -4,6 +4,8 @@
#include "coreSQLiteStudio_global.h"
#include <QString>
+class Db;
+
class API_EXPORT Table
{
public:
@@ -25,6 +27,22 @@ class API_EXPORT Table
QString table;
};
+class API_EXPORT DbAndTable : public Table
+{
+public:
+ DbAndTable();
+ DbAndTable(Db* db, const QString& database, const QString& table);
+ DbAndTable(const DbAndTable& other);
+
+ int operator ==(const DbAndTable& other) const;
+
+ Db *getDb() const;
+ void setDb(Db *value);
+
+protected:
+ Db* db = nullptr;
+};
+
class API_EXPORT AliasedTable : public Table
{
public:
diff --git a/SQLiteStudio3/coreSQLiteStudio/common/utils.cpp b/SQLiteStudio3/coreSQLiteStudio/common/utils.cpp
index 6cf1892..e3d2e47 100644
--- a/SQLiteStudio3/coreSQLiteStudio/common/utils.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/common/utils.cpp
@@ -694,6 +694,9 @@ QString getOsString()
case QSysInfo::WV_WINDOWS8_1:
os += " 8.1";
break;
+ case QSysInfo::WV_WINDOWS10:
+ os += " 10";
+ break;
case QSysInfo::WV_32s:
case QSysInfo::WV_95:
case QSysInfo::WV_98:
@@ -707,6 +710,7 @@ QString getOsString()
case QSysInfo::WV_CE_5:
case QSysInfo::WV_CE_6:
case QSysInfo::WV_CE_based:
+ case QSysInfo::WV_None:
break;
}
#elif defined(Q_OS_LINUX)
@@ -742,6 +746,12 @@ QString getOsString()
case QSysInfo::MV_10_9:
os += " 10.9 Mavericks";
break;
+ case QSysInfo::MV_10_10:
+ os += " 10.10 Yosemite";
+ break;
+ case QSysInfo::MV_10_11:
+ os += " 10.11 El Capitan";
+ break;
case QSysInfo::MV_9:
case QSysInfo::MV_10_0:
case QSysInfo::MV_10_1:
@@ -755,6 +765,13 @@ QString getOsString()
case QSysInfo::MV_IOS_6_1:
case QSysInfo::MV_IOS_7_0:
case QSysInfo::MV_IOS_7_1:
+ case QSysInfo::MV_IOS_8_0:
+ case QSysInfo::MV_IOS_8_1:
+ case QSysInfo::MV_IOS_8_2:
+ case QSysInfo::MV_IOS_8_3:
+ case QSysInfo::MV_IOS_8_4:
+ case QSysInfo::MV_IOS_9_0:
+ case QSysInfo::MV_None:
case QSysInfo::MV_Unknown:
break;
}
@@ -899,9 +916,9 @@ QStringList concat(const QList<QStringList>& list)
return result;
}
-QString doubleToString(double val)
+QString doubleToString(const QVariant& val)
{
- return QString::number(val, 'g', 16);
+ return val.toString();
}
void sortWithReferenceList(QList<QString>& listToSort, const QList<QString>& referenceList, Qt::CaseSensitivity cs)
diff --git a/SQLiteStudio3/coreSQLiteStudio/common/utils.h b/SQLiteStudio3/coreSQLiteStudio/common/utils.h
index 934e70a..c56a4db 100644
--- a/SQLiteStudio3/coreSQLiteStudio/common/utils.h
+++ b/SQLiteStudio3/coreSQLiteStudio/common/utils.h
@@ -87,6 +87,17 @@ int indexOf(const QList<T>& list, std::function<bool(const T&)> predicate)
return -1;
}
+template <class T>
+T* findFirst(const QList<T*>& list, std::function<bool(T*)> predicate)
+{
+ for (T* item : list)
+ {
+ if (predicate(item))
+ return item;
+ }
+ return nullptr;
+}
+
/**
* @brief Returns only those elements from the list, which passed the filter.
* @tparam T type for which the filter will be applied for. It should match the type in the list and in the function argument.
@@ -231,7 +242,7 @@ API_EXPORT bool renameBetweenPartitions(const QString& src, const QString& dst);
API_EXPORT bool isWritableRecursively(const QString& dir);
API_EXPORT QString encryptRsa(const QString& input, const QString& modulus, const QString& exponent);
API_EXPORT QString decryptRsa(const QString& input, const QString& modulus, const QString& exponent);
-API_EXPORT QString doubleToString(double val);
+API_EXPORT QString doubleToString(const QVariant& val);
/**
* @brief Sorts string list using reference list for ordering.
diff --git a/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.cpp b/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.cpp
index 5c7e7e9..ad37ff0 100644
--- a/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.cpp
@@ -4,6 +4,7 @@
#include "parser/token.h"
#include "parser/lexer.h"
#include "parser/keywords.h"
+#include "log.h"
#include <QHash>
#include <QPair>
#include <QString>
@@ -368,11 +369,23 @@ QString removeComments(const QString& value)
return tokens.detokenize();
}
+void splitQueriesUpdateCaseWhenDepth(Token::Type type, const QString& value, int& caseWhenDepth)
+{
+ if (type != Token::KEYWORD)
+ return;
+
+ if (value == "CASE")
+ caseWhenDepth++;
+ else if (value == "END" && caseWhenDepth > 0)
+ caseWhenDepth--;
+}
+
QList<TokenList> splitQueries(const TokenList& tokenizedQuery, bool* complete)
{
QList<TokenList> queries;
TokenList currentQueryTokens;
QString value;
+ int caseWhenDepth = 0;
int createTriggerMeter = 0;
bool insideTrigger = false;
bool completeQuery = false;
@@ -384,16 +397,19 @@ QList<TokenList> splitQueries(const TokenList& tokenizedQuery, bool* complete)
if (insideTrigger)
{
- if (token->type == Token::KEYWORD && value == "END")
+ if (token->type == Token::KEYWORD && value == "END" && caseWhenDepth <= 0 && caseWhenDepth == 0)
{
insideTrigger = false;
completeQuery = true;
}
currentQueryTokens << token;
+ splitQueriesUpdateCaseWhenDepth(token->type, value, caseWhenDepth);
continue;
}
+ splitQueriesUpdateCaseWhenDepth(token->type, value, caseWhenDepth);
+
if (token->type == Token::KEYWORD)
{
if (value == "CREATE" || value == "TRIGGER" || value == "BEGIN")
@@ -407,6 +423,7 @@ QList<TokenList> splitQueries(const TokenList& tokenizedQuery, bool* complete)
else if (token->type == Token::OPERATOR && value == ";")
{
createTriggerMeter = 0;
+ caseWhenDepth = 0;
currentQueryTokens << token;
queries << currentQueryTokens;
currentQueryTokens.clear();
@@ -427,9 +444,114 @@ QList<TokenList> splitQueries(const TokenList& tokenizedQuery, bool* complete)
return queries;
}
-QStringList splitQueries(const QString& sql, Dialect dialect, bool keepEmptyQueries, bool* complete)
+QStringList quickSplitQueries(const QString& sql, bool keepEmptyQueries, bool removeComments)
+{
+ QChar c;
+ bool inString = false;
+ bool inMultiLineComment = false;
+ bool inSingleLineComment = false;
+ QStringList queries;
+ QString query;
+ QString trimmed;
+ for (int i = 0, total = sql.size(); i < total; ++i)
+ {
+ c = sql[i];
+
+ // String
+ if (inString)
+ {
+ query += c;
+ if (c == '\'')
+ {
+ inString = false;
+ }
+ continue;
+ }
+
+ // One-line comment
+ if (inSingleLineComment)
+ {
+ if (!removeComments)
+ query += c;
+
+ if (c == '\r' && (i + 1) < total && sql[i+1] == '\n')
+ {
+ if (!removeComments)
+ query += '\n';
+
+ i++;
+ inSingleLineComment = false;
+ }
+ else if (c == '\n' || c == '\r')
+ inSingleLineComment = false;
+
+ continue;
+ }
+
+ // Multi-line comment
+ if (inMultiLineComment)
+ {
+ if (!removeComments)
+ query += c;
+
+ if (c == '*' && (i + 1) < total && sql[i+1] == '/')
+ {
+ if (!removeComments)
+ query += '/';
+
+ i++;
+ inMultiLineComment = false;
+ }
+
+ continue;
+ }
+
+ // Everything rest
+ if (c == '\'')
+ {
+ query += c;
+ inString = true;
+ }
+ else if (c == '-' && (i + 1) < total && sql[i+1] == '-')
+ {
+ inSingleLineComment = true;
+ i++;
+ if (!removeComments)
+ query += "--";
+ }
+ else if (c == '/' && (i + 1) < total && sql[i+1] == '*')
+ {
+ inMultiLineComment = true;
+ i++;
+ if (!removeComments)
+ query += "/*";
+ }
+ else if (c == ';')
+ {
+ query += c;
+ if (keepEmptyQueries || (!(trimmed = query.trimmed()).isEmpty() && trimmed != ";"))
+ queries << query;
+
+ query.clear();
+ }
+ else
+ {
+ query += c;
+ }
+ }
+
+ if (!query.isNull() && (!(trimmed = query.trimmed()).isEmpty() && trimmed != ";"))
+ queries << query;
+
+ return queries;
+}
+
+QStringList splitQueries(const QString& sql, Dialect dialect, bool keepEmptyQueries, bool removeComments, bool* complete)
{
TokenList tokens = Lexer::tokenize(sql, dialect);
+ if (removeComments)
+ tokens = tokens.filterOut(Token::COMMENT);
+
QList<TokenList> tokenizedQueries = splitQueries(tokens, complete);
QString query;
@@ -437,7 +559,7 @@ QStringList splitQueries(const QString& sql, Dialect dialect, bool keepEmptyQuer
foreach (const TokenList& queryTokens, tokenizedQueries)
{
query = queryTokens.detokenize();
- if (keepEmptyQueries || !query.trimmed().isEmpty())
+ if (keepEmptyQueries || (!query.trimmed().isEmpty() && query.trimmed() != ";"))
queries << query;
}
@@ -452,7 +574,7 @@ QString getQueryWithPosition(const QStringList& queries, int position, int* star
if (startPos)
*startPos = 0;
- foreach (const QString& query, queries)
+ for (const QString& query : queries)
{
length = query.length();
if (position >= currentPos && position < currentPos+length)
@@ -479,9 +601,9 @@ QString getQueryWithPosition(const QStringList& queries, int position, int* star
return QString::null;
}
-QString getQueryWithPosition(const QString& queries, int position, Dialect dialect, int* startPos)
+QString getQueryWithPosition(const QString& queries, int position, int* startPos)
{
- QStringList queryList = splitQueries(queries, dialect);
+ QStringList queryList = quickSplitQueries(queries);
return getQueryWithPosition(queryList, position, startPos);
}
@@ -665,7 +787,7 @@ QStringList valueListToSqlList(const QVariantList& values, Dialect dialect)
argList << value.toString();
break;
case QVariant::Double:
- argList << doubleToString(value.toDouble());
+ argList << doubleToString(value);
break;
case QVariant::Bool:
argList << QString::number(value.toInt());
@@ -694,3 +816,14 @@ QStringList wrapStrings(const QStringList& strList)
return list;
}
+
+QString trimQueryEnd(const QString &query)
+{
+ QString q = query.trimmed();
+ while (q.endsWith(";"))
+ {
+ q.chop(1);
+ q = q.trimmed();
+ }
+ return q;
+}
diff --git a/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.h b/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.h
index ceccea0..1da3108 100644
--- a/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.h
+++ b/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.h
@@ -67,9 +67,10 @@ API_EXPORT bool isSystemTable(const QString& name);
API_EXPORT bool isSystemIndex(const QString& name, Dialect dialect);
API_EXPORT QString removeComments(const QString& value);
API_EXPORT QList<TokenList> splitQueries(const TokenList& tokenizedQueries, bool* complete = nullptr);
-API_EXPORT QStringList splitQueries(const QString& sql, Dialect dialect, bool keepEmptyQueries = true, bool* complete = nullptr);
+API_EXPORT QStringList splitQueries(const QString& sql, Dialect dialect, bool keepEmptyQueries = true, bool removeComments = false, bool* complete = nullptr);
+API_EXPORT QStringList quickSplitQueries(const QString& sql, bool keepEmptyQueries = true, bool removeComments = false);
API_EXPORT QString getQueryWithPosition(const QStringList& queries, int position, int* startPos = nullptr);
-API_EXPORT QString getQueryWithPosition(const QString& queries, int position, Dialect dialect, int* startPos = nullptr);
+API_EXPORT QString getQueryWithPosition(const QString& queries, int position, int* startPos = nullptr);
API_EXPORT QList<QueryWithParamNames> getQueriesWithParamNames(const QString& query, Dialect dialect);
API_EXPORT QList<QueryWithParamCount> getQueriesWithParamCount(const QString& query, Dialect dialect);
API_EXPORT QueryWithParamNames getQueryWithParamNames(const QString& query, Dialect dialect);
@@ -79,6 +80,7 @@ API_EXPORT QString commentAllSqlLines(const QString& sql);
API_EXPORT QString getBindTokenName(const TokenPtr& token);
API_EXPORT QueryAccessMode getQueryAccessMode(const QString& query, Dialect dialect, bool* isSelect = nullptr);
API_EXPORT QStringList valueListToSqlList(const QList<QVariant>& values, Dialect dialect);
+API_EXPORT QString trimQueryEnd(const QString& query);
#endif // UTILS_SQL_H
diff --git a/SQLiteStudio3/coreSQLiteStudio/completionhelper.cpp b/SQLiteStudio3/coreSQLiteStudio/completionhelper.cpp
index 528df73..aae4a60 100644
--- a/SQLiteStudio3/coreSQLiteStudio/completionhelper.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/completionhelper.cpp
@@ -1032,7 +1032,7 @@ void CompletionHelper::parseFullSql()
QString sql = fullSql;
// Selecting query at cursor position
- QString query = getQueryWithPosition(sql, cursorPosition, dialect);
+ QString query = getQueryWithPosition(sql, cursorPosition);
// Token list of the query. Also useful, not only parsed query.
queryTokens = Lexer::tokenize(query, dialect);
@@ -1051,7 +1051,7 @@ void CompletionHelper::parseFullSql()
// Second try - handling open parenthesis for expr (which could not be handled by the grammar, because of bug #2755)
parser.setLemonDebug(false); // avoid spamming with lemon debug
QString truncatedSql = sql.left(cursorPosition);
- query = getQueryWithPosition(truncatedSql, cursorPosition, dialect);
+ query = getQueryWithPosition(truncatedSql, cursorPosition);
query += ");";
if (tryToParse(&parser, query))
diff --git a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.cpp b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.cpp
index 1a63776..a5c661e 100644
--- a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.cpp
@@ -24,6 +24,11 @@ CfgCategory::CfgCategory(const QString &name, const QString &title) :
lastCreatedCfgMain->childs[name] = this;
}
+CfgEntry *CfgCategory::getEntryByName(const QString& name)
+{
+ return childs[name];
+}
+
QString CfgCategory::toString() const
{
return name;
diff --git a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.h b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.h
index 45197d6..4b4aaac 100644
--- a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.h
+++ b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.h
@@ -20,6 +20,7 @@ class API_EXPORT CfgCategory : public QObject
CfgCategory(const CfgCategory& other);
CfgCategory(const QString& name, const QString& title);
+ CfgEntry* getEntryByName(const QString &name);
QString toString() const;
operator QString() const;
QHash<QString,CfgEntry*>& getEntries();
diff --git a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.cpp b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.cpp
index 480b4cc..fb7d199 100644
--- a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.cpp
@@ -1,6 +1,7 @@
#include "cfgmain.h"
#include "config_builder/cfgcategory.h"
#include "config_builder/cfgentry.h"
+#include "common/global.h"
CfgMain* lastCreatedCfgMain = nullptr;
QList<CfgMain*>* CfgMain::instances = nullptr;
@@ -50,6 +51,36 @@ QList<CfgMain*> CfgMain::getPersistableInstances()
return list;
}
+CfgCategory* CfgMain::getCategoryByName(const QString &name)
+{
+ for (CfgMain* cfg : getInstances())
+ {
+ if (!cfg->childs.contains(name))
+ continue;
+
+ return cfg->childs[name];
+ }
+ return nullptr;
+}
+
+CfgEntry *CfgMain::getEntryByName(const QString &categoryName, const QString &name)
+{
+ CfgCategory* cat = getCategoryByName(categoryName);
+ if (!cat)
+ return nullptr;
+
+ return cat->getEntryByName(name);
+}
+
+CfgEntry *CfgMain::getEntryByPath(const QString &path)
+{
+ QStringList sp = path.split(".");
+ if (sp.size() != 2)
+ return nullptr;
+
+ return getEntryByName(sp[0], sp[1]);
+}
+
QHash<QString, CfgCategory *> &CfgMain::getCategories()
{
return childs;
@@ -101,6 +132,27 @@ void CfgMain::rollback()
restore();
}
+QStringList CfgMain::getPaths() const
+{
+ static_qstring(tpl, "%1.%2");
+ QStringList paths;
+ for (CfgCategory* cat : childs.values())
+ {
+ for (const QString& entry : cat->getEntries().keys())
+ paths << tpl.arg(cat->toString(), entry);
+ }
+ return paths;
+}
+
+QList<CfgEntry *> CfgMain::getEntries() const
+{
+ QList<CfgEntry*> entries;
+ for (CfgCategory* cat : childs.values())
+ entries += cat->getEntries().values();
+
+ return entries;
+}
+
bool CfgMain::isPersistable() const
{
return persistable;
diff --git a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.h b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.h
index d42f03b..ea11c6d 100644
--- a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.h
+++ b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.h
@@ -8,6 +8,7 @@
#include <QString>
class CfgCategory;
+class CfgEntry;
class API_EXPORT CfgMain
{
@@ -20,6 +21,9 @@ class API_EXPORT CfgMain
static void staticInit();
static QList<CfgMain*> getInstances();
static QList<CfgMain*> getPersistableInstances();
+ static CfgCategory* getCategoryByName(const QString& name);
+ static CfgEntry* getEntryByName(const QString& categoryName, const QString& name);
+ static CfgEntry* getEntryByPath(const QString& path);
QHash<QString,CfgCategory*>& getCategories();
void translateTitle();
@@ -30,6 +34,8 @@ class API_EXPORT CfgMain
void begin();
void commit();
void rollback();
+ QStringList getPaths() const;
+ QList<CfgEntry*> getEntries() const;
bool isPersistable() const;
QString getName() const;
diff --git a/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro b/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro
index 59da902..8c3c21a 100644
--- a/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro
+++ b/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro
@@ -1,465 +1,473 @@
-#-------------------------------------------------
-#
-# Project created by QtCreator 2013-02-28T23:00:28
-#
-#-------------------------------------------------
-
-include($$PWD/../dirs.pri)
-include($$PWD/../utils.pri)
-
-OBJECTS_DIR = $$OBJECTS_DIR/coreSQLiteStudio
-MOC_DIR = $$MOC_DIR/coreSQLiteStudio
-UI_DIR = $$UI_DIR/coreSQLiteStudio
-
-QT -= gui
-QT += script network
-
-TARGET = coreSQLiteStudio
-TEMPLATE = lib
-
-win32 {
- LIBS += -lpsapi $$PWD/../../../lib/libquazip.a
- LIBS += -limagehlp
-
- THE_FILE = $$PWD/qt.conf
- THE_DEST = $${DESTDIR}
- THE_FILE ~= s,/,\\,g
- THE_DEST ~= s,/,\\,g
- QMAKE_POST_LINK += $$QMAKE_COPY $$THE_FILE $$THE_DEST $$escape_expand(\\n\\t)
-}
-
-linux: {
- DEFINES += SYS_PLUGINS_DIR=$$LIBDIR/sqlitestudio
- portable: {
- DESTDIR = $$DESTDIR/lib
- }
-}
-
-macx: {
- out_file = $$DESTDIR/lib $$TARGET .dylib
- QMAKE_POST_LINK += install_name_tool -change libsqlite3.dylib @loader_path/../Frameworks/libsqlite3.dylib $$join(out_file)
-}
-
-LIBS += -lsqlite3
-
-DEFINES += CORESQLITESTUDIO_LIBRARY
-
-portable {
- DEFINES += PORTABLE_CONFIG
-}
-
-CONFIG += c++11
-QMAKE_CXXFLAGS += -pedantic
-
-TRANSLATIONS += translations/coreSQLiteStudio_it.ts \
- translations/coreSQLiteStudio_zh_CN.ts \
- translations/coreSQLiteStudio_sk.ts \
- translations/coreSQLiteStudio_de.ts \
- translations/coreSQLiteStudio_ru.ts \
- translations/coreSQLiteStudio_pt_BR.ts \
- translations/coreSQLiteStudio_fr.ts \
- translations/coreSQLiteStudio_es.ts \
- translations/coreSQLiteStudio_pl.ts
-
-SOURCES += sqlitestudio.cpp \
- returncode.cpp \
- services/config.cpp \
- common/nulldevice.cpp \
- parser/lexer_low_lev.cpp \
- common/utils.cpp \
- parser/keywords.cpp \
- common/utils_sql.cpp \
- parser/token.cpp \
- parser/lexer.cpp \
- parser/sqlite3_parse.cpp \
- parser/parsercontext.cpp \
- parser/parser.cpp \
- parser/sqlite2_parse.cpp \
- parser/ast/sqlitestatement.cpp \
- parser/ast/sqlitequery.cpp \
- parser/ast/sqlitealtertable.cpp \
- parser/ast/sqliteanalyze.cpp \
- parser/ast/sqlitebegintrans.cpp \
- parser/ast/sqlitecommittrans.cpp \
- parser/ast/sqlitecreateindex.cpp \
- parser/ast/sqlitecreatetable.cpp \
- parser/ast/sqlitecreatetrigger.cpp \
- parser/ast/sqlitecreateview.cpp \
- parser/ast/sqlitecreatevirtualtable.cpp \
- parser/ast/sqlitedelete.cpp \
- parser/ast/sqlitedetach.cpp \
- parser/ast/sqlitedroptable.cpp \
- parser/ast/sqlitedroptrigger.cpp \
- parser/ast/sqlitedropindex.cpp \
- parser/ast/sqlitedropview.cpp \
- parser/ast/sqliteinsert.cpp \
- parser/ast/sqlitepragma.cpp \
- parser/ast/sqlitereindex.cpp \
- parser/ast/sqlitesavepoint.cpp \
- parser/ast/sqliterelease.cpp \
- parser/ast/sqliterollback.cpp \
- parser/ast/sqliteselect.cpp \
- parser/ast/sqliteupdate.cpp \
- parser/ast/sqlitevacuum.cpp \
- parser/ast/sqlitecopy.cpp \
- parser/ast/sqliteemptyquery.cpp \
- parser/parser_helper_stubs.cpp \
- parser/ast/sqliteexpr.cpp \
- parser/ast/sqliteforeignkey.cpp \
- parser/ast/sqliteindexedcolumn.cpp \
- parser/ast/sqlitecolumntype.cpp \
- parser/ast/sqliteconflictalgo.cpp \
- parser/ast/sqlitesortorder.cpp \
- parser/ast/sqliteraise.cpp \
- parser/ast/sqliteorderby.cpp \
- parser/ast/sqlitelimit.cpp \
- parser/ast/sqliteattach.cpp \
- parser/parsererror.cpp \
- selectresolver.cpp \
- schemaresolver.cpp \
- parser/ast/sqlitequerytype.cpp \
- db/db.cpp \
- services/dbmanager.cpp \
- db/sqlresultsrow.cpp \
- db/asyncqueryrunner.cpp \
- completionhelper.cpp \
- completioncomparer.cpp \
- db/queryexecutor.cpp \
- qio.cpp \
- plugins/pluginsymbolresolver.cpp \
- db/sqlerrorresults.cpp \
- db/queryexecutorsteps/queryexecutorstep.cpp \
- db/queryexecutorsteps/queryexecutorcountresults.cpp \
- db/queryexecutorsteps/queryexecutorparsequery.cpp \
- db/queryexecutorsteps/queryexecutorexecute.cpp \
- db/queryexecutorsteps/queryexecutorattaches.cpp \
- db/queryexecutorsteps/queryexecutoraddrowids.cpp \
- db/queryexecutorsteps/queryexecutorlimit.cpp \
- db/queryexecutorsteps/queryexecutorcolumns.cpp \
- db/queryexecutorsteps/queryexecutorcellsize.cpp \
- db/queryexecutorsteps/queryexecutororder.cpp \
- db/sqlerrorcodes.cpp \
- common/readwritelocker.cpp \
- db/queryexecutorsteps/queryexecutorwrapdistinctresults.cpp \
- csvformat.cpp \
- csvserializer.cpp \
- db/queryexecutorsteps/queryexecutordatasources.cpp \
- expectedtoken.cpp \
- sqlhistorymodel.cpp \
- db/queryexecutorsteps/queryexecutorexplainmode.cpp \
- services/notifymanager.cpp \
- parser/statementtokenbuilder.cpp \
- parser/ast/sqlitedeferrable.cpp \
- tablemodifier.cpp \
- db/chainexecutor.cpp \
- db/queryexecutorsteps/queryexecutorreplaceviews.cpp \
- services/codeformatter.cpp \
- viewmodifier.cpp \
- log.cpp \
- plugins/plugintype.cpp \
- plugins/genericplugin.cpp \
- common/memoryusage.cpp \
- ddlhistorymodel.cpp \
- datatype.cpp \
- common/table.cpp \
- common/column.cpp \
- dbattacher.cpp \
- services/functionmanager.cpp \
- plugins/scriptingqt.cpp \
- services/impl/configimpl.cpp \
- services/impl/dbmanagerimpl.cpp \
- db/abstractdb.cpp \
- services/impl/functionmanagerimpl.cpp \
- services/impl/pluginmanagerimpl.cpp \
- impl/dbattacherimpl.cpp \
- db/dbsqlite3.cpp \
- plugins/dbpluginsqlite3.cpp \
- parser/ast/sqlitewith.cpp \
- services/impl/collationmanagerimpl.cpp \
- services/exportmanager.cpp \
- exportworker.cpp \
- plugins/scriptingsql.cpp \
- db/queryexecutorsteps/queryexecutordetectschemaalter.cpp \
- querymodel.cpp \
- plugins/genericexportplugin.cpp \
- dbobjectorganizer.cpp \
- db/attachguard.cpp \
- db/invaliddb.cpp \
- dbversionconverter.cpp \
- diff/diff_match_patch.cpp \
- db/sqlquery.cpp \
- db/queryexecutorsteps/queryexecutorvaluesmode.cpp \
- services/importmanager.cpp \
- importworker.cpp \
- services/populatemanager.cpp \
- pluginservicebase.cpp \
- populateworker.cpp \
- plugins/populatesequence.cpp \
- plugins/populaterandom.cpp \
- plugins/populaterandomtext.cpp \
- plugins/populateconstant.cpp \
- plugins/populatedictionary.cpp \
- plugins/populatescript.cpp \
- plugins/builtinplugin.cpp \
- plugins/scriptingqtdbproxy.cpp \
- plugins/sqlformatterplugin.cpp \
- services/bugreporter.cpp \
- services/updatemanager.cpp \
- config_builder/cfgmain.cpp \
- config_builder/cfgcategory.cpp \
- config_builder/cfgentry.cpp \
- config_builder/cfglazyinitializer.cpp \
- committable.cpp \
- services/extralicensemanager.cpp \
- tsvserializer.cpp \
- rsa/BigInt.cpp \
- rsa/Key.cpp \
- rsa/KeyPair.cpp \
- rsa/PrimeGenerator.cpp \
- rsa/RSA.cpp \
- translations.cpp \
- common/signalwait.cpp \
- common/blockingsocket.cpp \
- common/threadwitheventloop.cpp \
- common/private/blockingsocketprivate.cpp \
- querygenerator.cpp \
- common/bistrhash.cpp
-
-HEADERS += sqlitestudio.h\
- coreSQLiteStudio_global.h \
- returncode.h \
- services/config.h \
- common/nulldevice.h \
- parser/lexer_low_lev.h \
- common/utils.h \
- parser/keywords.h \
- parser/token.h \
- common/utils_sql.h \
- parser/lexer.h \
- parser/sqlite3_parse.h \
- parser/parsercontext.h \
- parser/parser.h \
- parser/sqlite2_parse.h \
- parser/ast/sqlitestatement.h \
- parser/ast/sqlitequery.h \
- parser/ast/sqlitealtertable.h \
- parser/ast/sqliteanalyze.h \
- parser/ast/sqlitebegintrans.h \
- parser/ast/sqlitecommittrans.h \
- parser/ast/sqlitecreateindex.h \
- parser/ast/sqlitecreatetable.h \
- parser/ast/sqlitecreatetrigger.h \
- parser/ast/sqlitecreateview.h \
- parser/ast/sqlitecreatevirtualtable.h \
- parser/ast/sqlitedelete.h \
- parser/ast/sqlitedetach.h \
- parser/ast/sqlitedroptable.h \
- parser/ast/sqlitedroptrigger.h \
- parser/ast/sqlitedropindex.h \
- parser/ast/sqlitedropview.h \
- parser/ast/sqliteinsert.h \
- parser/ast/sqlitepragma.h \
- parser/ast/sqlitereindex.h \
- parser/ast/sqlitesavepoint.h \
- parser/ast/sqliterelease.h \
- parser/ast/sqliterollback.h \
- parser/ast/sqliteselect.h \
- parser/ast/sqliteupdate.h \
- parser/ast/sqlitevacuum.h \
- parser/ast/sqlitecopy.h \
- parser/ast/sqlitequerytype.h \
- parser/ast/sqliteemptyquery.h \
- parser/parser_helper_stubs.h \
- parser/ast/sqliteconflictalgo.h \
- parser/ast/sqliteexpr.h \
- parser/ast/sqliteforeignkey.h \
- parser/ast/sqliteindexedcolumn.h \
- parser/ast/sqlitecolumntype.h \
- parser/ast/sqlitesortorder.h \
- parser/ast/sqlitedeferrable.h \
- parser/ast/sqliteraise.h \
- parser/ast/sqliteorderby.h \
- parser/ast/sqlitelimit.h \
- parser/ast/sqliteattach.h \
- parser/parsererror.h \
- common/objectpool.h \
- selectresolver.h \
- schemaresolver.h \
- dialect.h \
- db/db.h \
- services/dbmanager.h \
- db/sqlresultsrow.h \
- db/asyncqueryrunner.h \
- completionhelper.h \
- expectedtoken.h \
- completioncomparer.h \
- plugins/dbplugin.h \
- services/pluginmanager.h \
- db/queryexecutor.h \
- qio.h \
- db/dbpluginoption.h \
- common/global.h \
- parser/ast/sqlitetablerelatedddl.h \
- plugins/pluginsymbolresolver.h \
- db/sqlerrorresults.h \
- db/sqlerrorcodes.h \
- db/queryexecutorsteps/queryexecutorstep.h \
- db/queryexecutorsteps/queryexecutorcountresults.h \
- db/queryexecutorsteps/queryexecutorparsequery.h \
- db/queryexecutorsteps/queryexecutorexecute.h \
- db/queryexecutorsteps/queryexecutorattaches.h \
- db/queryexecutorsteps/queryexecutoraddrowids.h \
- db/queryexecutorsteps/queryexecutorlimit.h \
- db/queryexecutorsteps/queryexecutorcolumns.h \
- db/queryexecutorsteps/queryexecutorcellsize.h \
- common/unused.h \
- db/queryexecutorsteps/queryexecutororder.h \
- common/readwritelocker.h \
- db/queryexecutorsteps/queryexecutorwrapdistinctresults.h \
- csvformat.h \
- csvserializer.h \
- db/queryexecutorsteps/queryexecutordatasources.h \
- sqlhistorymodel.h \
- db/queryexecutorsteps/queryexecutorexplainmode.h \
- services/notifymanager.h \
- parser/statementtokenbuilder.h \
- tablemodifier.h \
- db/chainexecutor.h \
- db/queryexecutorsteps/queryexecutorreplaceviews.h \
- plugins/sqlformatterplugin.h \
- services/codeformatter.h \
- viewmodifier.h \
- log.h \
- plugins/plugintype.h \
- plugins/plugin.h \
- plugins/genericplugin.h \
- common/memoryusage.h \
- ddlhistorymodel.h \
- datatype.h \
- plugins/generalpurposeplugin.h \
- common/table.h \
- common/column.h \
- common/bihash.h \
- common/strhash.h \
- dbattacher.h \
- common/bistrhash.h \
- services/functionmanager.h \
- common/sortedhash.h \
- plugins/scriptingplugin.h \
- plugins/scriptingqt.h \
- services/impl/configimpl.h \
- services/impl/dbmanagerimpl.h \
- db/abstractdb.h \
- services/impl/functionmanagerimpl.h \
- services/impl/pluginmanagerimpl.h \
- impl/dbattacherimpl.h \
- db/abstractdb3.h \
- db/dbsqlite3.h \
- plugins/dbpluginsqlite3.h \
- db/abstractdb2.h \
- parser/ast/sqlitewith.h \
- services/collationmanager.h \
- services/impl/collationmanagerimpl.h \
- plugins/exportplugin.h \
- config_builder.h \
- services/exportmanager.h \
- exportworker.h \
- plugins/scriptingsql.h \
- db/queryexecutorsteps/queryexecutordetectschemaalter.h \
- querymodel.h \
- plugins/genericexportplugin.h \
- dbobjectorganizer.h \
- db/attachguard.h \
- interruptable.h \
- db/invaliddb.h \
- dbversionconverter.h \
- diff/diff_match_patch.h \
- db/sqlquery.h \
- dbobjecttype.h \
- db/queryexecutorsteps/queryexecutorvaluesmode.h \
- plugins/importplugin.h \
- services/importmanager.h \
- importworker.h \
- plugins/populateplugin.h \
- services/populatemanager.h \
- pluginservicebase.h \
- populateworker.h \
- plugins/populatesequence.h \
- plugins/populaterandom.h \
- plugins/populaterandomtext.h \
- plugins/populateconstant.h \
- plugins/populatedictionary.h \
- plugins/populatescript.h \
- plugins/builtinplugin.h \
- plugins/scriptingqtdbproxy.h \
- plugins/codeformatterplugin.h \
- services/bugreporter.h \
- services/updatemanager.h \
- config_builder/cfgmain.h \
- config_builder/cfgcategory.h \
- config_builder/cfgentry.h \
- config_builder/cfglazyinitializer.h \
- plugins/confignotifiableplugin.h \
- committable.h \
- plugins/uiconfiguredplugin.h \
- services/extralicensemanager.h \
- db/stdsqlite3driver.h \
- tsvserializer.h \
- rsa/BigInt.h \
- rsa/Key.h \
- rsa/KeyPair.h \
- rsa/PrimeGenerator.h \
- rsa/RSA.h \
- translations.h \
- common/signalwait.h \
- common/blockingsocket.h \
- common/threadwitheventloop.h \
- common/private/blockingsocketprivate.h \
- common/expiringcache.h \
- parser/ast/sqliteddlwithdbcontext.h \
- parser/ast/sqliteextendedindexedcolumn.h \
- querygenerator.h \
- common/sortedset.h
-
-unix: {
- target.path = $$LIBDIR
- INSTALLS += target
-}
-
-OTHER_FILES += \
- parser/lempar.c \
- parser/sqlite3_parse.y \
- parser/sqlite2_parse.y \
- parser/run_lemon.sh \
- TODO.txt \
- licenses/fugue_icons.txt \
- licenses/qhexedit.txt \
- licenses/sqlitestudio_license.txt \
- licenses/lgpl.txt \
- licenses/diff_match.txt \
- licenses/gpl.txt \
- ChangeLog.txt \
- qt.conf
-
-FORMS += \
- plugins/populatesequence.ui \
- plugins/populaterandom.ui \
- plugins/populaterandomtext.ui \
- plugins/populateconstant.ui \
- plugins/populatedictionary.ui \
- plugins/populatescript.ui
-
-RESOURCES += \
- coresqlitestudio.qrc
-
-
-
-
-
-
-
-
-
-
-
-
+#-------------------------------------------------
+#
+# Project created by QtCreator 2013-02-28T23:00:28
+#
+#-------------------------------------------------
+
+include($$PWD/../dirs.pri)
+include($$PWD/../utils.pri)
+
+OBJECTS_DIR = $$OBJECTS_DIR/coreSQLiteStudio
+MOC_DIR = $$MOC_DIR/coreSQLiteStudio
+UI_DIR = $$UI_DIR/coreSQLiteStudio
+
+QT -= gui
+QT += script network
+
+TARGET = coreSQLiteStudio
+TEMPLATE = lib
+
+win32 {
+ LIBS += -lpsapi $$PWD/../../../lib/libquazip.a
+ LIBS += -limagehlp
+
+ THE_FILE = $$PWD/qt.conf
+ THE_DEST = $${DESTDIR}
+ THE_FILE ~= s,/,\\,g
+ THE_DEST ~= s,/,\\,g
+ QMAKE_POST_LINK += $$QMAKE_COPY $$THE_FILE $$THE_DEST $$escape_expand(\\n\\t)
+}
+
+linux: {
+ DEFINES += SYS_PLUGINS_DIR=$$LIBDIR/sqlitestudio
+ portable: {
+ DESTDIR = $$DESTDIR/lib
+ }
+}
+
+macx: {
+ out_file = $$DESTDIR/lib $$TARGET .dylib
+ QMAKE_POST_LINK += install_name_tool -change libsqlite3.dylib @loader_path/../Frameworks/libsqlite3.dylib $$join(out_file)
+ QMAKE_POST_LINK += ; $$QMAKE_MKDIR $$DESTDIR/SQLiteStudio.app
+ QMAKE_POST_LINK += ; $$QMAKE_MKDIR $$DESTDIR/SQLiteStudio.app/Contents
+ QMAKE_POST_LINK += ; $$QMAKE_COPY $$PWD/Info.plist $$DESTDIR/SQLiteStudio.app/Contents
+}
+
+LIBS += -lsqlite3
+
+DEFINES += CORESQLITESTUDIO_LIBRARY
+
+portable {
+ DEFINES += PORTABLE_CONFIG
+}
+
+CONFIG += c++11
+QMAKE_CXXFLAGS += -pedantic
+
+TRANSLATIONS += translations/coreSQLiteStudio_de.ts \
+ translations/coreSQLiteStudio_it.ts \
+ translations/coreSQLiteStudio_zh_CN.ts \
+ translations/coreSQLiteStudio_sk.ts \
+ translations/coreSQLiteStudio_ru.ts \
+ translations/coreSQLiteStudio_pt_BR.ts \
+ translations/coreSQLiteStudio_fr.ts \
+ translations/coreSQLiteStudio_es.ts \
+ translations/coreSQLiteStudio_pl.ts
+
+SOURCES += sqlitestudio.cpp \
+ returncode.cpp \
+ services/config.cpp \
+ common/nulldevice.cpp \
+ parser/lexer_low_lev.cpp \
+ common/utils.cpp \
+ parser/keywords.cpp \
+ common/utils_sql.cpp \
+ parser/token.cpp \
+ parser/lexer.cpp \
+ parser/sqlite3_parse.cpp \
+ parser/parsercontext.cpp \
+ parser/parser.cpp \
+ parser/sqlite2_parse.cpp \
+ parser/ast/sqlitestatement.cpp \
+ parser/ast/sqlitequery.cpp \
+ parser/ast/sqlitealtertable.cpp \
+ parser/ast/sqliteanalyze.cpp \
+ parser/ast/sqlitebegintrans.cpp \
+ parser/ast/sqlitecommittrans.cpp \
+ parser/ast/sqlitecreateindex.cpp \
+ parser/ast/sqlitecreatetable.cpp \
+ parser/ast/sqlitecreatetrigger.cpp \
+ parser/ast/sqlitecreateview.cpp \
+ parser/ast/sqlitecreatevirtualtable.cpp \
+ parser/ast/sqlitedelete.cpp \
+ parser/ast/sqlitedetach.cpp \
+ parser/ast/sqlitedroptable.cpp \
+ parser/ast/sqlitedroptrigger.cpp \
+ parser/ast/sqlitedropindex.cpp \
+ parser/ast/sqlitedropview.cpp \
+ parser/ast/sqliteinsert.cpp \
+ parser/ast/sqlitepragma.cpp \
+ parser/ast/sqlitereindex.cpp \
+ parser/ast/sqlitesavepoint.cpp \
+ parser/ast/sqliterelease.cpp \
+ parser/ast/sqliterollback.cpp \
+ parser/ast/sqliteselect.cpp \
+ parser/ast/sqliteupdate.cpp \
+ parser/ast/sqlitevacuum.cpp \
+ parser/ast/sqlitecopy.cpp \
+ parser/ast/sqliteemptyquery.cpp \
+ parser/parser_helper_stubs.cpp \
+ parser/ast/sqliteexpr.cpp \
+ parser/ast/sqliteforeignkey.cpp \
+ parser/ast/sqliteindexedcolumn.cpp \
+ parser/ast/sqlitecolumntype.cpp \
+ parser/ast/sqliteconflictalgo.cpp \
+ parser/ast/sqlitesortorder.cpp \
+ parser/ast/sqliteraise.cpp \
+ parser/ast/sqliteorderby.cpp \
+ parser/ast/sqlitelimit.cpp \
+ parser/ast/sqliteattach.cpp \
+ parser/parsererror.cpp \
+ selectresolver.cpp \
+ schemaresolver.cpp \
+ parser/ast/sqlitequerytype.cpp \
+ db/db.cpp \
+ services/dbmanager.cpp \
+ db/sqlresultsrow.cpp \
+ db/asyncqueryrunner.cpp \
+ completionhelper.cpp \
+ completioncomparer.cpp \
+ db/queryexecutor.cpp \
+ qio.cpp \
+ plugins/pluginsymbolresolver.cpp \
+ db/sqlerrorresults.cpp \
+ db/queryexecutorsteps/queryexecutorstep.cpp \
+ db/queryexecutorsteps/queryexecutorcountresults.cpp \
+ db/queryexecutorsteps/queryexecutorparsequery.cpp \
+ db/queryexecutorsteps/queryexecutorexecute.cpp \
+ db/queryexecutorsteps/queryexecutorattaches.cpp \
+ db/queryexecutorsteps/queryexecutoraddrowids.cpp \
+ db/queryexecutorsteps/queryexecutorlimit.cpp \
+ db/queryexecutorsteps/queryexecutorcolumns.cpp \
+ db/queryexecutorsteps/queryexecutorcellsize.cpp \
+ db/queryexecutorsteps/queryexecutororder.cpp \
+ db/sqlerrorcodes.cpp \
+ common/readwritelocker.cpp \
+ db/queryexecutorsteps/queryexecutorwrapdistinctresults.cpp \
+ csvformat.cpp \
+ csvserializer.cpp \
+ db/queryexecutorsteps/queryexecutordatasources.cpp \
+ expectedtoken.cpp \
+ sqlhistorymodel.cpp \
+ db/queryexecutorsteps/queryexecutorexplainmode.cpp \
+ services/notifymanager.cpp \
+ parser/statementtokenbuilder.cpp \
+ parser/ast/sqlitedeferrable.cpp \
+ tablemodifier.cpp \
+ db/chainexecutor.cpp \
+ db/queryexecutorsteps/queryexecutorreplaceviews.cpp \
+ services/codeformatter.cpp \
+ viewmodifier.cpp \
+ log.cpp \
+ plugins/plugintype.cpp \
+ plugins/genericplugin.cpp \
+ common/memoryusage.cpp \
+ ddlhistorymodel.cpp \
+ datatype.cpp \
+ common/table.cpp \
+ common/column.cpp \
+ dbattacher.cpp \
+ services/functionmanager.cpp \
+ plugins/scriptingqt.cpp \
+ services/impl/configimpl.cpp \
+ services/impl/dbmanagerimpl.cpp \
+ db/abstractdb.cpp \
+ services/impl/functionmanagerimpl.cpp \
+ services/impl/pluginmanagerimpl.cpp \
+ impl/dbattacherimpl.cpp \
+ db/dbsqlite3.cpp \
+ plugins/dbpluginsqlite3.cpp \
+ parser/ast/sqlitewith.cpp \
+ services/impl/collationmanagerimpl.cpp \
+ services/exportmanager.cpp \
+ exportworker.cpp \
+ plugins/scriptingsql.cpp \
+ db/queryexecutorsteps/queryexecutordetectschemaalter.cpp \
+ querymodel.cpp \
+ plugins/genericexportplugin.cpp \
+ dbobjectorganizer.cpp \
+ db/attachguard.cpp \
+ db/invaliddb.cpp \
+ dbversionconverter.cpp \
+ diff/diff_match_patch.cpp \
+ db/sqlquery.cpp \
+ db/queryexecutorsteps/queryexecutorvaluesmode.cpp \
+ services/importmanager.cpp \
+ importworker.cpp \
+ services/populatemanager.cpp \
+ pluginservicebase.cpp \
+ populateworker.cpp \
+ plugins/populatesequence.cpp \
+ plugins/populaterandom.cpp \
+ plugins/populaterandomtext.cpp \
+ plugins/populateconstant.cpp \
+ plugins/populatedictionary.cpp \
+ plugins/populatescript.cpp \
+ plugins/builtinplugin.cpp \
+ plugins/scriptingqtdbproxy.cpp \
+ plugins/sqlformatterplugin.cpp \
+ services/bugreporter.cpp \
+ services/updatemanager.cpp \
+ config_builder/cfgmain.cpp \
+ config_builder/cfgcategory.cpp \
+ config_builder/cfgentry.cpp \
+ config_builder/cfglazyinitializer.cpp \
+ committable.cpp \
+ services/extralicensemanager.cpp \
+ tsvserializer.cpp \
+ rsa/BigInt.cpp \
+ rsa/Key.cpp \
+ rsa/KeyPair.cpp \
+ rsa/PrimeGenerator.cpp \
+ rsa/RSA.cpp \
+ translations.cpp \
+ common/signalwait.cpp \
+ common/blockingsocket.cpp \
+ common/threadwitheventloop.cpp \
+ common/private/blockingsocketprivate.cpp \
+ querygenerator.cpp \
+ common/bistrhash.cpp \
+ plugins/dbpluginstdfilebase.cpp
+
+HEADERS += sqlitestudio.h\
+ coreSQLiteStudio_global.h \
+ returncode.h \
+ services/config.h \
+ common/nulldevice.h \
+ parser/lexer_low_lev.h \
+ common/utils.h \
+ parser/keywords.h \
+ parser/token.h \
+ common/utils_sql.h \
+ parser/lexer.h \
+ parser/sqlite3_parse.h \
+ parser/parsercontext.h \
+ parser/parser.h \
+ parser/sqlite2_parse.h \
+ parser/ast/sqlitestatement.h \
+ parser/ast/sqlitequery.h \
+ parser/ast/sqlitealtertable.h \
+ parser/ast/sqliteanalyze.h \
+ parser/ast/sqlitebegintrans.h \
+ parser/ast/sqlitecommittrans.h \
+ parser/ast/sqlitecreateindex.h \
+ parser/ast/sqlitecreatetable.h \
+ parser/ast/sqlitecreatetrigger.h \
+ parser/ast/sqlitecreateview.h \
+ parser/ast/sqlitecreatevirtualtable.h \
+ parser/ast/sqlitedelete.h \
+ parser/ast/sqlitedetach.h \
+ parser/ast/sqlitedroptable.h \
+ parser/ast/sqlitedroptrigger.h \
+ parser/ast/sqlitedropindex.h \
+ parser/ast/sqlitedropview.h \
+ parser/ast/sqliteinsert.h \
+ parser/ast/sqlitepragma.h \
+ parser/ast/sqlitereindex.h \
+ parser/ast/sqlitesavepoint.h \
+ parser/ast/sqliterelease.h \
+ parser/ast/sqliterollback.h \
+ parser/ast/sqliteselect.h \
+ parser/ast/sqliteupdate.h \
+ parser/ast/sqlitevacuum.h \
+ parser/ast/sqlitecopy.h \
+ parser/ast/sqlitequerytype.h \
+ parser/ast/sqliteemptyquery.h \
+ parser/parser_helper_stubs.h \
+ parser/ast/sqliteconflictalgo.h \
+ parser/ast/sqliteexpr.h \
+ parser/ast/sqliteforeignkey.h \
+ parser/ast/sqliteindexedcolumn.h \
+ parser/ast/sqlitecolumntype.h \
+ parser/ast/sqlitesortorder.h \
+ parser/ast/sqlitedeferrable.h \
+ parser/ast/sqliteraise.h \
+ parser/ast/sqliteorderby.h \
+ parser/ast/sqlitelimit.h \
+ parser/ast/sqliteattach.h \
+ parser/parsererror.h \
+ common/objectpool.h \
+ selectresolver.h \
+ schemaresolver.h \
+ dialect.h \
+ db/db.h \
+ services/dbmanager.h \
+ db/sqlresultsrow.h \
+ db/asyncqueryrunner.h \
+ completionhelper.h \
+ expectedtoken.h \
+ completioncomparer.h \
+ plugins/dbplugin.h \
+ services/pluginmanager.h \
+ db/queryexecutor.h \
+ qio.h \
+ db/dbpluginoption.h \
+ common/global.h \
+ parser/ast/sqlitetablerelatedddl.h \
+ plugins/pluginsymbolresolver.h \
+ db/sqlerrorresults.h \
+ db/sqlerrorcodes.h \
+ db/queryexecutorsteps/queryexecutorstep.h \
+ db/queryexecutorsteps/queryexecutorcountresults.h \
+ db/queryexecutorsteps/queryexecutorparsequery.h \
+ db/queryexecutorsteps/queryexecutorexecute.h \
+ db/queryexecutorsteps/queryexecutorattaches.h \
+ db/queryexecutorsteps/queryexecutoraddrowids.h \
+ db/queryexecutorsteps/queryexecutorlimit.h \
+ db/queryexecutorsteps/queryexecutorcolumns.h \
+ db/queryexecutorsteps/queryexecutorcellsize.h \
+ common/unused.h \
+ db/queryexecutorsteps/queryexecutororder.h \
+ common/readwritelocker.h \
+ db/queryexecutorsteps/queryexecutorwrapdistinctresults.h \
+ csvformat.h \
+ csvserializer.h \
+ db/queryexecutorsteps/queryexecutordatasources.h \
+ sqlhistorymodel.h \
+ db/queryexecutorsteps/queryexecutorexplainmode.h \
+ services/notifymanager.h \
+ parser/statementtokenbuilder.h \
+ tablemodifier.h \
+ db/chainexecutor.h \
+ db/queryexecutorsteps/queryexecutorreplaceviews.h \
+ plugins/sqlformatterplugin.h \
+ services/codeformatter.h \
+ viewmodifier.h \
+ log.h \
+ plugins/plugintype.h \
+ plugins/plugin.h \
+ plugins/genericplugin.h \
+ common/memoryusage.h \
+ ddlhistorymodel.h \
+ datatype.h \
+ plugins/generalpurposeplugin.h \
+ common/table.h \
+ common/column.h \
+ common/bihash.h \
+ common/strhash.h \
+ dbattacher.h \
+ common/bistrhash.h \
+ services/functionmanager.h \
+ common/sortedhash.h \
+ plugins/scriptingplugin.h \
+ plugins/scriptingqt.h \
+ services/impl/configimpl.h \
+ services/impl/dbmanagerimpl.h \
+ db/abstractdb.h \
+ services/impl/functionmanagerimpl.h \
+ services/impl/pluginmanagerimpl.h \
+ impl/dbattacherimpl.h \
+ db/abstractdb3.h \
+ db/dbsqlite3.h \
+ plugins/dbpluginsqlite3.h \
+ db/abstractdb2.h \
+ parser/ast/sqlitewith.h \
+ services/collationmanager.h \
+ services/impl/collationmanagerimpl.h \
+ plugins/exportplugin.h \
+ config_builder.h \
+ services/exportmanager.h \
+ exportworker.h \
+ plugins/scriptingsql.h \
+ db/queryexecutorsteps/queryexecutordetectschemaalter.h \
+ querymodel.h \
+ plugins/genericexportplugin.h \
+ dbobjectorganizer.h \
+ db/attachguard.h \
+ interruptable.h \
+ db/invaliddb.h \
+ dbversionconverter.h \
+ diff/diff_match_patch.h \
+ db/sqlquery.h \
+ dbobjecttype.h \
+ db/queryexecutorsteps/queryexecutorvaluesmode.h \
+ plugins/importplugin.h \
+ services/importmanager.h \
+ importworker.h \
+ plugins/populateplugin.h \
+ services/populatemanager.h \
+ pluginservicebase.h \
+ populateworker.h \
+ plugins/populatesequence.h \
+ plugins/populaterandom.h \
+ plugins/populaterandomtext.h \
+ plugins/populateconstant.h \
+ plugins/populatedictionary.h \
+ plugins/populatescript.h \
+ plugins/builtinplugin.h \
+ plugins/scriptingqtdbproxy.h \
+ plugins/codeformatterplugin.h \
+ services/bugreporter.h \
+ services/updatemanager.h \
+ config_builder/cfgmain.h \
+ config_builder/cfgcategory.h \
+ config_builder/cfgentry.h \
+ config_builder/cfglazyinitializer.h \
+ plugins/confignotifiableplugin.h \
+ committable.h \
+ plugins/uiconfiguredplugin.h \
+ services/extralicensemanager.h \
+ db/stdsqlite3driver.h \
+ tsvserializer.h \
+ rsa/BigInt.h \
+ rsa/Key.h \
+ rsa/KeyPair.h \
+ rsa/PrimeGenerator.h \
+ rsa/RSA.h \
+ translations.h \
+ common/signalwait.h \
+ common/blockingsocket.h \
+ common/threadwitheventloop.h \
+ common/private/blockingsocketprivate.h \
+ common/expiringcache.h \
+ parser/ast/sqliteddlwithdbcontext.h \
+ parser/ast/sqliteextendedindexedcolumn.h \
+ querygenerator.h \
+ common/sortedset.h \
+ plugins/dbpluginstdfilebase.h
+
+unix: {
+ target.path = $$LIBDIR
+ INSTALLS += target
+}
+
+OTHER_FILES += \
+ parser/lempar.c \
+ parser/sqlite3_parse.y \
+ parser/sqlite2_parse.y \
+ parser/run_lemon.sh \
+ TODO.txt \
+ licenses/fugue_icons.txt \
+ licenses/qhexedit.txt \
+ licenses/sqlitestudio_license.txt \
+ licenses/lgpl.txt \
+ licenses/diff_match.txt \
+ licenses/gpl.txt \
+ ChangeLog.txt \
+ qt.conf \
+ Info.plist
+
+FORMS += \
+ plugins/populatesequence.ui \
+ plugins/populaterandom.ui \
+ plugins/populaterandomtext.ui \
+ plugins/populateconstant.ui \
+ plugins/populatedictionary.ui \
+ plugins/populatescript.ui
+
+RESOURCES += \
+ coreSQLiteStudio.qrc
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc b/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.qrc
index 7b814ec..d58efc1 100644
--- a/SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc
+++ b/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.qrc
@@ -24,5 +24,9 @@
<file>translations/coreSQLiteStudio_fr.qm</file>
<file>translations/coreSQLiteStudio_sk.qm</file>
<file>translations/coreSQLiteStudio_zh_CN.qm</file>
+ <file>translations/coreSQLiteStudio_de.qm</file>
</qresource>
</RCC>
+
+
+
diff --git a/SQLiteStudio3/coreSQLiteStudio/csvformat.cpp b/SQLiteStudio3/coreSQLiteStudio/csvformat.cpp
index f5daa60..151fffd 100644
--- a/SQLiteStudio3/coreSQLiteStudio/csvformat.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/csvformat.cpp
@@ -1,7 +1,7 @@
#include "csvformat.h"
#include <QtGlobal>
-const CsvFormat CsvFormat::DEFAULT = {",", "\n"};
+const CsvFormat CsvFormat::DEFAULT = {{","}, {"\r\n", "\n", "\r"}};
CsvFormat::CsvFormat()
{
@@ -12,6 +12,27 @@ CsvFormat::CsvFormat(const QString& columnSeparator, const QString& rowSeparator
{
}
+CsvFormat::CsvFormat(const QStringList &columnSeparators, const QStringList &rowSeparators)
+{
+ if (rowSeparators.size() > 1)
+ {
+ this->rowSeparators = rowSeparators;
+ multipleRowSeparators = true;
+ strictRowSeparator = true;
+ }
+ else if (rowSeparators.size() > 0)
+ this->rowSeparator = rowSeparators.first();
+
+ if (columnSeparators.size() > 1)
+ {
+ this->columnSeparators = columnSeparators;
+ multipleColumnSeparators = true;
+ strictColumnSeparator = true;
+ }
+ else if (columnSeparators.size() > 0)
+ this->columnSeparator = columnSeparators.first();
+}
+
CsvFormat::CsvFormat(const QString& columnSeparator, const QString& rowSeparator, bool strictRowSeparator, bool strictColumnSeparator) :
columnSeparator(columnSeparator), rowSeparator(rowSeparator), strictColumnSeparator(strictColumnSeparator), strictRowSeparator(strictRowSeparator)
{
diff --git a/SQLiteStudio3/coreSQLiteStudio/csvformat.h b/SQLiteStudio3/coreSQLiteStudio/csvformat.h
index 5ce00ad..3e8dda2 100644
--- a/SQLiteStudio3/coreSQLiteStudio/csvformat.h
+++ b/SQLiteStudio3/coreSQLiteStudio/csvformat.h
@@ -3,17 +3,23 @@
#include "coreSQLiteStudio_global.h"
#include <QString>
+#include <QStringList>
struct API_EXPORT CsvFormat
{
CsvFormat();
CsvFormat(const QString& columnSeparator, const QString& rowSeparator);
+ CsvFormat(const QStringList& columnSeparators, const QStringList& rowSeparators);
CsvFormat(const QString& columnSeparator, const QString& rowSeparator, bool strictRowSeparator, bool strictColumnSeparator);
QString columnSeparator;
QString rowSeparator;
+ QStringList columnSeparators;
+ QStringList rowSeparators;
bool strictColumnSeparator = false;
bool strictRowSeparator = false;
+ bool multipleRowSeparators = false;
+ bool multipleColumnSeparators = false;
static const CsvFormat DEFAULT;
};
diff --git a/SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp b/SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp
index 15bf4e8..ce568e9 100644
--- a/SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp
@@ -10,20 +10,34 @@ bool isCsvColumnSeparator(QTextStream& data, const C& theChar, const CsvFormat&
return format.columnSeparator.contains(theChar);
// Strict checking (characters in defined order make a separator)
+ QStringList separators;
+ if (format.multipleColumnSeparators)
+ separators = format.columnSeparators;
+ else
+ separators << format.columnSeparator;
+
qint64 origPos = data.pos();
- data.seek(origPos - 1);
- C nextChar;
- for (const QChar& c : format.columnSeparator)
+ bool match = true;
+ for (const QString sep : separators)
{
- data >> nextChar;
- if (c != nextChar)
+ match = true;
+ data.seek(origPos - 1);
+ C nextChar;
+ for (const QChar& c : sep)
{
- data.seek(origPos);
- return false;
+ data >> nextChar;
+ if (c != nextChar)
+ {
+ data.seek(origPos);
+ match = false;
+ break;
+ }
}
+ if (match)
+ break;
}
- return true;
+ return match;
}
template <class C>
@@ -33,20 +47,34 @@ bool isCsvRowSeparator(QTextStream& data, const C& theChar, const CsvFormat& for
return format.rowSeparator.contains(theChar);
// Strict checking (characters in defined order make a separator)
+ QStringList separators;
+ if (format.multipleRowSeparators)
+ separators = format.rowSeparators;
+ else
+ separators << format.rowSeparator;
+
qint64 origPos = data.pos();
- data.seek(origPos - 1);
- C nextChar;
- for (const QChar& c : format.rowSeparator)
+ bool match = true;
+ for (const QString sep : separators)
{
- data >> nextChar;
- if (data.atEnd() || c != nextChar)
+ match = true;
+ data.seek(origPos - 1);
+ C nextChar;
+ for (const QChar& c : sep)
{
- data.seek(origPos);
- return false;
+ data >> nextChar;
+ if (data.atEnd() || c != nextChar)
+ {
+ data.seek(origPos);
+ match = false;
+ break;
+ }
}
+ if (match)
+ break;
}
- return true;
+ return match;
}
template <class T, class C>
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp
index 8c08a51..cd9b972 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp
@@ -761,7 +761,7 @@ bool AbstractDb::commit()
SqlQueryPtr results = exec("COMMIT;", Flag::NO_LOCK);
if (results->isError())
{
- qCritical() << "Error while commiting a transaction: " << results->getErrorCode() << results->getErrorText();
+ qCritical() << "Error while committing a transaction: " << results->getErrorCode() << results->getErrorText();
return false;
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/chainexecutor.cpp b/SQLiteStudio3/coreSQLiteStudio/db/chainexecutor.cpp
index a35856b..1f553ea 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/chainexecutor.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/db/chainexecutor.cpp
@@ -2,6 +2,7 @@
#include "sqlerrorcodes.h"
#include "db/sqlquery.h"
#include <QDebug>
+#include <QDateTime>
ChainExecutor::ChainExecutor(QObject *parent) :
QObject(parent)
@@ -32,12 +33,14 @@ void ChainExecutor::exec()
{
if (!db)
{
+ emit finished(SqlQueryPtr());
emit failure(SqlErrorCode::DB_NOT_DEFINED, tr("The database for executing queries was not defined.", "chain executor"));
return;
}
if (!db->isOpen())
{
+ emit finished(SqlQueryPtr());
emit failure(SqlErrorCode::DB_NOT_OPEN, tr("The database for executing queries was not open.", "chain executor"));
return;
}
@@ -47,6 +50,7 @@ void ChainExecutor::exec()
SqlQueryPtr result = db->exec("PRAGMA foreign_keys = 0;");
if (result->isError())
{
+ emit finished(SqlQueryPtr());
emit failure(db->getErrorCode(), tr("Could not disable foreign keys in the database. Details: %1", "chain executor").arg(db->getErrorText()));
return;
}
@@ -54,6 +58,7 @@ void ChainExecutor::exec()
if (transaction && !db->begin())
{
+ emit finished(SqlQueryPtr());
emit failure(db->getErrorCode(), tr("Could not start a database transaction. Details: %1", "chain executor").arg(db->getErrorText()));
return;
}
@@ -75,7 +80,7 @@ void ChainExecutor::executeCurrentSql()
{
if (currentSqlIndex >= sqls.size())
{
- executionSuccessful();
+ executionSuccessful(lastExecutionResults);
return;
}
@@ -135,10 +140,11 @@ void ChainExecutor::executionFailure(int errorCode, const QString& errorText)
restoreFk();
successfulExecution = false;
executionErrors << ExecutionError(errorCode, errorText);
+ emit finished(lastExecutionResults);
emit failure(errorCode, errorText);
}
-void ChainExecutor::executionSuccessful()
+void ChainExecutor::executionSuccessful(SqlQueryPtr results)
{
if (transaction && !db->commit())
{
@@ -148,7 +154,8 @@ void ChainExecutor::executionSuccessful()
restoreFk();
successfulExecution = true;
- emit success();
+ emit finished(results);
+ emit success(results);
}
void ChainExecutor::executeSync()
@@ -163,11 +170,12 @@ void ChainExecutor::executeSync()
currentSqlIndex++;
}
- executionSuccessful();
+ executionSuccessful(results);
}
bool ChainExecutor::handleResults(SqlQueryPtr results)
{
+ lastExecutionResults = results;
if (results->isError())
{
if (interrupted || currentSqlIndex >= mandatoryQueries.size() || mandatoryQueries[currentSqlIndex])
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/chainexecutor.h b/SQLiteStudio3/coreSQLiteStudio/db/chainexecutor.h
index 0afbdb8..90c56f6 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/chainexecutor.h
+++ b/SQLiteStudio3/coreSQLiteStudio/db/chainexecutor.h
@@ -229,7 +229,7 @@ class API_EXPORT ChainExecutor : public QObject
*
* Commits transaction (in case of transactional execution) and emits success().
*/
- void executionSuccessful();
+ void executionSuccessful(SqlQueryPtr results);
/**
* @brief Executes all queries synchronously.
@@ -328,6 +328,8 @@ class API_EXPORT ChainExecutor : public QObject
bool disableForeignKeys = false;
bool disableObjectDropsDetection = false;
+ SqlQueryPtr lastExecutionResults;
+
public slots:
/**
* @brief Interrupts query execution.
@@ -353,10 +355,23 @@ class API_EXPORT ChainExecutor : public QObject
signals:
/**
* @brief Emitted when all mandatory queries were successfully executed.
+ * @param results Execution results from last query execution.
*
* See setMandatoryQueries() for details on mandatory queries.
*/
- void success();
+ void success(SqlQueryPtr results);
+
+ /**
+ * @brief Emitted when chain execution is finished, regardless of result.
+ * @param results Execution results from last query execution (may be null).
+ *
+ * In slot for this signal always check getSuccessfulExecution(),
+ * because execution could failed, despite results providing no error.
+ * It may happen for example if execution was interrupted,
+ * or executor could not pass through execution preparation phase
+ * (in which case results will be null).
+ */
+ void finished(SqlQueryPtr results);
/**
* @brief Emitted when major error occurred while executing a query.
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp
index d2e7072..4a1c2f6 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp
@@ -20,6 +20,7 @@
#include "queryexecutorsteps/queryexecutordetectschemaalter.h"
#include "queryexecutorsteps/queryexecutorvaluesmode.h"
#include "common/unused.h"
+#include "chainexecutor.h"
#include "log.h"
#include <QMutexLocker>
#include <QDateTime>
@@ -36,6 +37,8 @@ QueryExecutor::QueryExecutor(Db* db, const QString& query, QObject *parent) :
QObject(parent)
{
context = new Context();
+ simpleExecutor = new ChainExecutor(this);
+ simpleExecutor->setTransaction(false);
originalQuery = query;
setDb(db);
setAutoDelete(false);
@@ -43,6 +46,8 @@ QueryExecutor::QueryExecutor(Db* db, const QString& query, QObject *parent) :
connect(this, SIGNAL(executionFailed(int,QString)), this, SLOT(cleanupAfterExecFailed(int,QString)));
connect(DBLIST, SIGNAL(dbAboutToBeUnloaded(Db*, DbPlugin*)), this, SLOT(cleanupBeforeDbDestroy(Db*)));
connect(DBLIST, SIGNAL(dbRemoved(Db*)), this, SLOT(cleanupBeforeDbDestroy(Db*)));
+ connect(simpleExecutor, SIGNAL(finished(SqlQueryPtr)), this, SLOT(simpleExecutionFinished(SqlQueryPtr)));
+
}
QueryExecutor::~QueryExecutor()
@@ -205,12 +210,26 @@ void QueryExecutor::run()
void QueryExecutor::execInternal()
{
+ queriesForSimpleExecution.clear();
if (forceSimpleMode)
{
executeSimpleMethod();
return;
}
+ if (queryCountLimitForSmartMode > -1)
+ {
+ queriesForSimpleExecution = quickSplitQueries(originalQuery, false, true);
+ int queryCount = queriesForSimpleExecution.size();
+ if (queryCount > queryCountLimitForSmartMode)
+ {
+ qDebug() << "Number of queries" << queryCount << "exceeds maximum number allowed for smart execution method" <<
+ queryCountLimitForSmartMode << ". Simple method will be used to retain efficiency.";
+ executeSimpleMethod();
+ return;
+ }
+ }
+
simpleExecution = false;
interrupted = false;
@@ -280,6 +299,14 @@ bool QueryExecutor::countResults()
return true;
}
+void QueryExecutor::dbAsyncExecFinished(quint32 asyncId, SqlQueryPtr results)
+{
+ if (handleRowCountingResults(asyncId, results))
+ return;
+
+ // If this was raised by any other asyncExec, handle it here.
+}
+
qint64 QueryExecutor::getLastExecutionTime() const
{
return context->executionTime;
@@ -391,45 +418,26 @@ void QueryExecutor::exec(const QString& query)
exec();
}
-void QueryExecutor::dbAsyncExecFinished(quint32 asyncId, SqlQueryPtr results)
-{
- if (handleRowCountingResults(asyncId, results))
- return;
-
- if (!simpleExecution)
- return;
-
- if (this->asyncId == 0)
- return;
-
- if (this->asyncId != asyncId)
- return;
-
- this->asyncId = 0;
-
- simpleExecutionFinished(results);
-}
-
void QueryExecutor::executeSimpleMethod()
{
simpleExecution = true;
context->editionForbiddenReasons << EditionForbiddenReason::SMART_EXECUTION_FAILED;
- simpleExecutionStartTime = QDateTime::currentMSecsSinceEpoch();
+ if (queriesForSimpleExecution.isEmpty())
+ queriesForSimpleExecution = quickSplitQueries(originalQuery, false, true);
- if (asyncMode)
- {
- asyncId = db->asyncExec(originalQuery, context->queryParameters, Db::Flag::PRELOAD);
- }
- else
- {
- SqlQueryPtr results = db->exec(originalQuery, context->queryParameters, Db::Flag::PRELOAD);
- simpleExecutionFinished(results);
- }
+ QStringList queriesWithPagination = applyLimitForSimpleMethod(queriesForSimpleExecution);
+
+ simpleExecutor->setQueries(queriesWithPagination);
+ simpleExecutor->setDb(db);
+ simpleExecutor->setAsync(false); // this is already in a thread
+
+ simpleExecutionStartTime = QDateTime::currentMSecsSinceEpoch();
+ simpleExecutor->exec();
}
void QueryExecutor::simpleExecutionFinished(SqlQueryPtr results)
{
- if (results->isError())
+ if (results.isNull() || results->isError() || !simpleExecutor->getSuccessfulExecution())
{
executionMutex.lock();
executionInProgress = false;
@@ -437,9 +445,10 @@ void QueryExecutor::simpleExecutionFinished(SqlQueryPtr results)
handleErrorsFromSmartAndSimpleMethods(results);
return;
}
+ context->executionTime = QDateTime::currentMSecsSinceEpoch() - simpleExecutionStartTime;
if (simpleExecIsSelect())
- context->countingQuery = "SELECT count(*) AS cnt FROM ("+originalQuery+");";
+ context->countingQuery = "SELECT count(*) AS cnt FROM ("+trimQueryEnd(queriesForSimpleExecution.last())+");";
else
context->rowsCountingRequired = true;
@@ -452,7 +461,6 @@ void QueryExecutor::simpleExecutionFinished(SqlQueryPtr results)
context->resultColumns << resCol;
}
- context->executionTime = QDateTime::currentMSecsSinceEpoch() - simpleExecutionStartTime;
context->rowsAffected = results->rowsAffected();
context->totalRowsReturned = 0;
context->executionResults = results;
@@ -467,7 +475,7 @@ void QueryExecutor::simpleExecutionFinished(SqlQueryPtr results)
context->resultsHandler = nullptr;
}
- if (!forceSimpleMode)
+ if (!forceSimpleMode && queriesForSimpleExecution.size() <= queryCountLimitForSmartMode)
notifyWarn(tr("SQLiteStudio was unable to extract metadata from the query. Results won't be editable."));
emit executionFinished(results);
@@ -475,7 +483,7 @@ void QueryExecutor::simpleExecutionFinished(SqlQueryPtr results)
bool QueryExecutor::simpleExecIsSelect()
{
- TokenList tokens = Lexer::tokenize(originalQuery, db->getDialect());
+ TokenList tokens = Lexer::tokenize(queriesForSimpleExecution.last(), db->getDialect());
tokens.trim();
// First check if it's explicit "SELECT" or "VALUES" (the latter one added in SQLite 3.8.4).
@@ -563,6 +571,34 @@ bool QueryExecutor::handleRowCountingResults(quint32 asyncId, SqlQueryPtr result
return true;
}
+
+QStringList QueryExecutor::applyLimitForSimpleMethod(const QStringList &queries)
+{
+ static_qstring(tpl, "SELECT * FROM (%1) LIMIT %2 OFFSET %3");
+ QStringList result = queries;
+
+ QString lastQuery = queries.last();
+
+ bool isSelect = false;
+ getQueryAccessMode(lastQuery, db->getDialect(), &isSelect);
+ if (isSelect)
+ {
+ result.removeLast();
+ result << tpl.arg(trimQueryEnd(lastQuery), QString::number(resultsPerPage), QString::number(page * resultsPerPage));
+ }
+ return result;
+}
+
+int QueryExecutor::getQueryCountLimitForSmartMode() const
+{
+ return queryCountLimitForSmartMode;
+}
+
+void QueryExecutor::setQueryCountLimitForSmartMode(int value)
+{
+ queryCountLimitForSmartMode = value;
+}
+
bool QueryExecutor::getForceSimpleMode() const
{
return forceSimpleMode;
@@ -602,13 +638,25 @@ void QueryExecutor::handleErrorsFromSmartAndSimpleMethods(SqlQueryPtr results)
// therefore we need to check code from smart execution, before deciding which one to use).
// Just rename attach names in the message.
bool useSmartError = context->errorCodeFromSmartExecution != 0;
- QString msg = useSmartError ? context->errorMessageFromSmartExecution : results->getErrorText();
- int code = useSmartError ? context->errorCodeFromSmartExecution : results->getErrorCode();
- QString match;
- QString replaceName;
- Dialect dialect = db->getDialect();
+ QString msg;
+ int code;
+
+ if (!useSmartError && (results.isNull() || !results->isError()) && !simpleExecutor->getErrors().isEmpty())
+ {
+ code = simpleExecutor->getErrors().first().first;
+ msg = simpleExecutor->getErrors().first().second;
+ }
+ else
+ {
+ msg = useSmartError ? context->errorMessageFromSmartExecution : results->getErrorText();
+ code = useSmartError ? context->errorCodeFromSmartExecution : results->getErrorCode();
+ }
+
if (useSmartError)
{
+ QString match;
+ QString replaceName;
+ Dialect dialect = db->getDialect();
for (const QString& attachName : context->dbNameToAttach.rightValues())
{
match = attachName + ".";
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h
index eddbe8c..4830e36 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h
+++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h
@@ -18,6 +18,7 @@ class Parser;
class SqliteQuery;
class QueryExecutorStep;
class DbPlugin;
+class ChainExecutor;
/**
* @brief Advanced SQL query execution handler.
@@ -1034,6 +1035,9 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable
bool isInterrupted() const;
+ int getQueryCountLimitForSmartMode() const;
+ void setQueryCountLimitForSmartMode(int value);
+
private:
/**
* @brief Executes query.
@@ -1088,17 +1092,6 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable
void executeSimpleMethod();
/**
- * @brief Handles results of simple execution.
- * @param results Results object returned from Db.
- *
- * Checks results for errors and extracts basic meta information,
- * such as rows affected, total result rows and time of execution.
- *
- * In case of success emits executionFinished(), in case of error emits executionFailed().
- */
- void simpleExecutionFinished(SqlQueryPtr results);
-
- /**
* @brief Tests whether the original query is a SELECT statement.
* @return true if the query is SELECT, or false otherwise.
*
@@ -1130,6 +1123,8 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable
*/
bool handleRowCountingResults(quint32 asyncId, SqlQueryPtr results);
+ QStringList applyLimitForSimpleMethod(const QStringList &queries);
+
/**
* @brief Query executor context object.
*
@@ -1173,6 +1168,8 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable
*/
QString originalQuery;
+ QStringList queriesForSimpleExecution;
+
/**
* @brief Predefined number of results per page.
*
@@ -1245,18 +1242,20 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable
int dataLengthLimit = -1;
/**
- * @brief Exact moment when query execution started.
+ * @brief Limit of queries, after which simple mode is used.
*
- * Expressed in number of milliseconds since 1970-01-01 00:00:00.
+ * Up to the defined limit the smart execution will be used (unless #forceSimpleMode was set).
+ * After exceeding this limit, the simple mode will be used.
+ * Set to negative number to disable this limit.
*/
- qint64 simpleExecutionStartTime;
+ int queryCountLimitForSmartMode = -1;
/**
- * @brief Asynchronous ID of query execution.
+ * @brief Exact moment when query execution started.
*
- * Asynchronous ID returned from Db::asyncExec() for the query execution.
+ * Expressed in number of milliseconds since 1970-01-01 00:00:00.
*/
- quint32 asyncId = 0;
+ qint64 simpleExecutionStartTime;
/**
* @brief Asynchronous ID of counting query execution.
@@ -1329,6 +1328,7 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable
Db::QueryResultsHandler resultsHandler = nullptr;
bool forceSimpleMode = false;
+ ChainExecutor* simpleExecutor = nullptr;
signals:
/**
@@ -1381,17 +1381,6 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable
private slots:
/**
- * @brief Handles asynchronous database execution results.
- * @param asyncId Asynchronous ID of the execution.
- * @param results Results from the execution.
- *
- * QueryExecutor checks whether the \p asyncId belongs to the counting query execution,
- * or the simple execution.
- * Dispatches query results to a proper handler method.
- */
- void dbAsyncExecFinished(quint32 asyncId, SqlQueryPtr results);
-
- /**
* @brief Calledn when an executor step has failed with its job.
*
* An executor step reported an error. "Smart execution" failed and now the executor will try
@@ -1416,6 +1405,28 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable
* be unloaded soon and we won't be able to call results destructor.
*/
void cleanupBeforeDbDestroy(Db* dbToBeUnloaded);
+
+ /**
+ * @brief Handles results of simple execution.
+ * @param results Results object returned from Db.
+ *
+ * Checks results for errors and extracts basic meta information,
+ * such as rows affected, total result rows and time of execution.
+ *
+ * In case of success emits executionFinished(), in case of error emits executionFailed().
+ */
+ void simpleExecutionFinished(SqlQueryPtr results);
+
+ /**
+ * @brief Handles asynchronous database execution results.
+ * @param asyncId Asynchronous ID of the execution.
+ * @param results Results from the execution.
+ *
+ * QueryExecutor checks whether the \p asyncId belongs to the counting query execution,
+ * or the simple execution.
+ * Dispatches query results to a proper handler method.
+ */
+ void dbAsyncExecFinished(quint32 asyncId, SqlQueryPtr results);
};
int qHash(QueryExecutor::EditionForbiddenReason reason);
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp
index 8cc344c..d417072 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp
@@ -31,8 +31,10 @@ bool QueryExecutorAddRowIds::exec()
}
// ...and putting it into parsed query, then update processed query
+// qDebug() << "before addrowid: " << context->processedQuery;
select->rebuildTokens();
updateQueries();
+// qDebug() << "after addrowid: " << context->processedQuery;
return true;
}
@@ -148,17 +150,30 @@ QHash<QString,QString> QueryExecutorAddRowIds::getNextColNames(const SelectResol
bool QueryExecutorAddRowIds::addResultColumns(SqliteSelect::Core* core, const SelectResolver::Table& table,
QHash<SelectResolver::Table,QHash<QString,QString>>& rowIdColsMap, bool isTopSelect)
{
+ SelectResolver::Table keyTable = table;
+ if (!rowIdColsMap.contains(table))
+ {
+ for (const SelectResolver::Table& rowIdColsMapTable : rowIdColsMap.keys())
+ {
+ if (!table.oldTableAliases.contains(rowIdColsMapTable.tableAlias, Qt::CaseInsensitive))
+ continue;
+
+ keyTable = rowIdColsMapTable;
+ }
+ }
+
+ // Find ROWID column from inner SELECT, or create new column for the table.
QHash<QString, QString> executorToRealColumns;
bool aliasOnlyAsSelectColumn = false;
- if (rowIdColsMap.contains(table))
+ if (rowIdColsMap.contains(keyTable))
{
- executorToRealColumns = rowIdColsMap[table]; // we already have resCol names from subselect
+ executorToRealColumns = rowIdColsMap[keyTable]; // we already have resCol names from subselect
aliasOnlyAsSelectColumn = true;
}
else
{
- executorToRealColumns = getNextColNames(table);
- rowIdColsMap[table] = executorToRealColumns;
+ executorToRealColumns = getNextColNames(keyTable);
+ rowIdColsMap[keyTable] = executorToRealColumns;
}
if (executorToRealColumns.size() == 0)
@@ -182,7 +197,7 @@ bool QueryExecutorAddRowIds::addResultColumns(SqliteSelect::Core* core, const Se
queryExecutorResCol->dbName = table.originalDatabase;
queryExecutorResCol->database = table.database;
queryExecutorResCol->table = table.table;
- queryExecutorResCol->tableAlias = table.alias;
+ queryExecutorResCol->tableAlias = table.tableAlias;
queryExecutorResCol->queryExecutorAliasToColumn = executorToRealColumns;
context->rowIdColumns << queryExecutorResCol;
}
@@ -207,9 +222,9 @@ bool QueryExecutorAddRowIds::addResultColumns(SqliteSelect::Core* core, const Se
else
{
resCol->expr->initId(realColumn);
- if (!table.alias.isNull())
+ if (!table.tableAlias.isNull())
{
- resCol->expr->table = table.alias;
+ resCol->expr->table = table.tableAlias;
}
else
{
@@ -222,6 +237,6 @@ bool QueryExecutorAddRowIds::addResultColumns(SqliteSelect::Core* core, const Se
resCol->asKw = true;
resCol->alias = queryExecutorColumn;
- core->resultColumns.insert(0, resCol);
+ core->resultColumns << resCol;
return true;
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcellsize.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcellsize.cpp
index 934a20d..54bd35a 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcellsize.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcellsize.cpp
@@ -31,21 +31,21 @@ bool QueryExecutorCellSize::applyDataLimit(SqliteSelect* select, SqliteSelect::C
bool first = true;
TokenList tokens;
- foreach (const QueryExecutor::ResultRowIdColumnPtr& col, context->rowIdColumns)
+ foreach (const QueryExecutor::ResultColumnPtr& col, context->resultColumns)
{
if (!first)
tokens += getSeparatorTokens();
- tokens += getNoLimitTokens(col);
+ tokens += getLimitTokens(col);
first = false;
}
- foreach (const QueryExecutor::ResultColumnPtr& col, context->resultColumns)
+ foreach (const QueryExecutor::ResultRowIdColumnPtr& col, context->rowIdColumns)
{
if (!first)
tokens += getSeparatorTokens();
- tokens += getLimitTokens(col);
+ tokens += getNoLimitTokens(col);
first = false;
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp
index 344f2e5..30a4f5d 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp
@@ -48,6 +48,7 @@ bool QueryExecutorColumns::exec()
SqliteSelect::Core::ResultColumn* resultColumnForSelect = nullptr;
bool rowIdColumn = false;
int i = 0;
+ QSet<QString> usedAliases;
for (const SelectResolver::Column& col : columns)
{
// Convert column to QueryExecutor result column
@@ -58,7 +59,7 @@ bool QueryExecutorColumns::exec()
if (rowIdColumn && col.alias.contains(":"))
continue; // duplicate ROWID column provided by SelectResolver. See isRowIdColumn() for details.
- resultColumnForSelect = getResultColumnForSelect(resultColumn, col);
+ resultColumnForSelect = getResultColumnForSelect(resultColumn, col, usedAliases);
if (!resultColumnForSelect)
return false;
@@ -126,7 +127,7 @@ QueryExecutor::ResultColumnPtr QueryExecutorColumns::getResultColumn(const Selec
return resultColumn;
}
-SqliteSelect::Core::ResultColumn* QueryExecutorColumns::getResultColumnForSelect(const QueryExecutor::ResultColumnPtr& resultColumn, const SelectResolver::Column& col)
+SqliteSelect::Core::ResultColumn* QueryExecutorColumns::getResultColumnForSelect(const QueryExecutor::ResultColumnPtr& resultColumn, const SelectResolver::Column& col, QSet<QString> &usedAliases)
{
SqliteSelect::Core::ResultColumn* selectResultColumn = new SqliteSelect::Core::ResultColumn();
@@ -177,6 +178,15 @@ SqliteSelect::Core::ResultColumn* QueryExecutorColumns::getResultColumnForSelect
else
selectResultColumn->alias = resultColumn->queryExecutorAlias;
+ // If this alias was already used we need to use sequential alias
+ static_qstring(aliasTpl, "%1:%2");
+ int nextAliasCounter = 1;
+ QString aliasBase = selectResultColumn->alias;
+ while (usedAliases.contains(selectResultColumn->alias))
+ selectResultColumn->alias = aliasTpl.arg(aliasBase, QString::number(nextAliasCounter++));
+
+ usedAliases += selectResultColumn->alias;
+
return selectResultColumn;
}
@@ -206,18 +216,6 @@ void QueryExecutorColumns::wrapWithAliasedColumns(SqliteSelect* select)
bool first = true;
TokenList outerColumns;
- for (const QueryExecutor::ResultRowIdColumnPtr& rowIdColumn : context->rowIdColumns)
- {
- for (const QString& alias : rowIdColumn->queryExecutorAliasToColumn.keys())
- {
- if (!first)
- outerColumns += sepTokens;
-
- outerColumns << TokenPtr::create(Token::OTHER, alias);
- first = false;
- }
- }
-
QStringList columnNamesUsed;
QString baseColName;
QString colName;
@@ -251,6 +249,18 @@ void QueryExecutorColumns::wrapWithAliasedColumns(SqliteSelect* select)
first = false;
}
+ for (const QueryExecutor::ResultRowIdColumnPtr& rowIdColumn : context->rowIdColumns)
+ {
+ for (const QString& alias : rowIdColumn->queryExecutorAliasToColumn.keys())
+ {
+ if (!first)
+ outerColumns += sepTokens;
+
+ outerColumns << TokenPtr::create(Token::OTHER, alias);
+ first = false;
+ }
+ }
+
//QString t = outerColumns.detokenize(); // keeping it for debug purposes
select->tokens = wrapSelect(select->tokens, outerColumns);
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h
index e23b9f6..8e1ebd2 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h
+++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h
@@ -50,7 +50,7 @@ class QueryExecutorColumns : public QueryExecutorStep
* @param rowIdColumn Indicates if this is a call for ROWID column added by QueryExecutorRowId step.
* @return Result column object ready for rebuilding tokens and detokenizing.
*/
- SqliteSelect::Core::ResultColumn* getResultColumnForSelect(const QueryExecutor::ResultColumnPtr& resultColumn, const SelectResolver::Column& col);
+ SqliteSelect::Core::ResultColumn* getResultColumnForSelect(const QueryExecutor::ResultColumnPtr& resultColumn, const SelectResolver::Column& col, QSet<QString>& usedAliases);
/**
* @brief Translates attach name into database name.
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutordatasources.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutordatasources.cpp
index 31cda9e..4a422d3 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutordatasources.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutordatasources.cpp
@@ -24,7 +24,7 @@ bool QueryExecutorDataSources::exec()
QueryExecutor::SourceTablePtr table = QueryExecutor::SourceTablePtr::create();
table->database = resolvedTable.database;
table->table = resolvedTable.table;
- table->alias = resolvedTable.alias;
+ table->alias = resolvedTable.tableAlias;
context->sourceTables << table;
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorexecute.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorexecute.cpp
index 3036796..aaa8014 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorexecute.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorexecute.cpp
@@ -3,13 +3,14 @@
#include "db/queryexecutor.h"
#include "parser/ast/sqlitequery.h"
#include "parser/lexer.h"
+#include "log.h"
#include "parser/ast/sqlitecreatetable.h"
#include "datatype.h"
+#include "schemaresolver.h"
+#include "common/table.h"
#include <QDateTime>
#include <QDebug>
#include <QStack>
-#include <schemaresolver.h>
-#include <common/table.h>
bool QueryExecutorExecute::exec()
{
@@ -58,8 +59,9 @@ bool QueryExecutorExecute::executeQueries()
if (isBeginTransaction(query->queryType))
rowsAffectedBeforeTransaction.push(context->rowsAffected);
-// qDebug() << "Executing query:" << queryStr;
+ //qDebug() << getLogDateTime() << "Executing query:" << queryStr;
results->execute();
+ //qDebug() << getLogDateTime() << "Done.";
if (results->isError())
{
@@ -155,7 +157,7 @@ void QueryExecutorExecute::setupSqlite2ColumnDataTypes(SqlQueryPtr results)
sqlite2Helper->clearBinaryTypes();
SqliteCreateTable::Column* column = nullptr;
- int idx = -1 + context->rowIdColumns.size();
+ int idx = -1;
for (QueryExecutor::ResultColumnPtr resCol : context->resultColumns)
{
idx++;
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorreplaceviews.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorreplaceviews.cpp
index 1f2e736..affe45c 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorreplaceviews.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorreplaceviews.cpp
@@ -91,6 +91,7 @@ void QueryExecutorReplaceViews::replaceViews(SqliteSelect* select)
}
src->select = view->select;
+ src->alias = view->view;
src->database = QString::null;
src->table = QString::null;
diff --git a/SQLiteStudio3/coreSQLiteStudio/dbversionconverter.cpp b/SQLiteStudio3/coreSQLiteStudio/dbversionconverter.cpp
index 9e4c664..96f73d7 100644
--- a/SQLiteStudio3/coreSQLiteStudio/dbversionconverter.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/dbversionconverter.cpp
@@ -755,6 +755,9 @@ bool DbVersionConverter::modifySingleExprForVersion2(SqliteExpr* expr)
case SqliteExpr::Mode::CTIME:
errors << QObject::tr("SQLite %1 does not support current date or time clauses in expressions.").arg("2");
return false;
+ case SqliteExpr::Mode::ROW_VALUE:
+ errors << QObject::tr("SQLite %1 does not support row value clauses in expressions.").arg("2");
+ return false;
case SqliteExpr::Mode::IN:
case SqliteExpr::Mode::SUB_SELECT:
{
diff --git a/SQLiteStudio3/coreSQLiteStudio/exportworker.cpp b/SQLiteStudio3/coreSQLiteStudio/exportworker.cpp
index 6427138..bc34bd0 100644
--- a/SQLiteStudio3/coreSQLiteStudio/exportworker.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/exportworker.cpp
@@ -204,7 +204,8 @@ QHash<ExportManager::ExportProviderFlag, QVariant> ExportWorker::getProviderData
else
{
QList<int> colWidths;
- for (const QVariant& value : results->next()->valueList())
+ SqlResultsRowPtr row = results->next();
+ for (const QVariant& value : row->valueList())
colWidths << value.toInt();
providerData[ExportManager::DATA_LENGTHS] = QVariant::fromValue(colWidths);
@@ -242,15 +243,6 @@ bool ExportWorker::exportDatabase()
return false;
}
- QList<ExportManager::ExportObject::Type> order = {
- ExportManager::ExportObject::TABLE, ExportManager::ExportObject::INDEX, ExportManager::ExportObject::TRIGGER, ExportManager::ExportObject::VIEW
- };
-
- qSort(dbObjects.begin(), dbObjects.end(), [=](const ExportManager::ExportObjectPtr& dbObj1, const ExportManager::ExportObjectPtr& dbObj2) -> bool
- {
- return order.indexOf(dbObj1->type) < order.indexOf(dbObj2->type);
- });
-
if (!plugin->beforeExportTables())
{
logExportFail("beforeExportTables()");
diff --git a/SQLiteStudio3/coreSQLiteStudio/importworker.cpp b/SQLiteStudio3/coreSQLiteStudio/importworker.cpp
index a8ca8f7..ea6c40d 100644
--- a/SQLiteStudio3/coreSQLiteStudio/importworker.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/importworker.cpp
@@ -25,7 +25,7 @@ void ImportWorker::run()
return;
}
- if (!db->begin())
+ if (!config->skipTransaction && !db->begin())
{
error(tr("Could not start transaction in order to import a data: %1").arg(db->getErrorText()));
return;
@@ -33,20 +33,26 @@ void ImportWorker::run()
if (!prepareTable())
{
- db->rollback();
+ if (!config->skipTransaction)
+ db->rollback();
+
return;
}
if (!importData())
{
- db->rollback();
+ if (!config->skipTransaction)
+ db->rollback();
+
return;
}
- if (!db->commit())
+ if (!config->skipTransaction && !db->commit())
{
error(tr("Could not commit transaction for imported data: %1").arg(db->getErrorText()));
- db->rollback();
+ if (!config->skipTransaction)
+ db->rollback();
+
return;
}
@@ -111,7 +117,8 @@ bool ImportWorker::prepareTable()
colDefs << (wrapObjIfNeeded(columnsFromPlugin[i], dialect) + " " + columnTypesFromPlugin[i]).trimmed();
static const QString ddl = QStringLiteral("CREATE TABLE %1 (%2)");
- SqlQueryPtr result = db->exec(ddl.arg(wrapObjIfNeeded(table, dialect), colDefs.join(", ")));
+ Db::Flags flags = config->skipTransaction ? Db::Flag::NO_LOCK : Db::Flag::NONE;
+ SqlQueryPtr result = db->exec(ddl.arg(wrapObjIfNeeded(table, dialect), colDefs.join(", ")), flags);
if (result->isError())
{
error(tr("Could not create table to import to: %1").arg(result->getErrorText()));
@@ -153,6 +160,11 @@ bool ImportWorker::importData()
// Assign argument values
query->setArgs(row.mid(0, colCount));
+
+ // No transactions = already in transaction, skip locking
+ if (config->skipTransaction)
+ query->setFlags(Db::Flag::NO_LOCK);
+
if (!query->execute())
{
if (config->ignoreErrors)
diff --git a/SQLiteStudio3/coreSQLiteStudio/log.cpp b/SQLiteStudio3/coreSQLiteStudio/log.cpp
index d45f1aa..60a22b2 100644
--- a/SQLiteStudio3/coreSQLiteStudio/log.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/log.cpp
@@ -1,6 +1,7 @@
#include "log.h"
#include "db/queryexecutorsteps/queryexecutorstep.h"
#include <QTime>
+#include <QDateTime>
#include <QDebug>
static bool SQL_DEBUG = false;
@@ -17,6 +18,11 @@ void setSqlLoggingFilter(const QString& filter)
SQL_DEBUG_FILTER = filter;
}
+QString getLogDateTime()
+{
+ return QDateTime::currentDateTime().toString("[HH:mm:ss.zzz]");
+}
+
void logSql(Db* db, const QString& str, const QHash<QString,QVariant>& args, Db::Flags flags)
{
if (!SQL_DEBUG)
@@ -44,7 +50,7 @@ void logSql(Db* db, const QString& str, const QList<QVariant>& args, Db::Flags f
qDebug() << QString("SQL %1> %2").arg(db->getName()).arg(str) << "(flags:" << Db::flagsToString(flags) << ")";
int i = 0;
- foreach (const QVariant& arg, args)
+ for (const QVariant& arg : args)
qDebug() << " SQL arg>" << i++ << "=" << arg;
}
@@ -58,7 +64,7 @@ void logExecutorStep(QueryExecutorStep* step)
if (!EXECUTOR_DEBUG)
return;
- qDebug() << "Executing step:" << step->metaObject()->className() << step->objectName();
+ qDebug() << getLogDateTime() << "Executing step:" << step->metaObject()->className() << step->objectName();
}
@@ -67,5 +73,5 @@ void logExecutorAfterStep(const QString& str)
if (!EXECUTOR_DEBUG)
return;
- qDebug() << str;
+ qDebug() << getLogDateTime() << str;
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/log.h b/SQLiteStudio3/coreSQLiteStudio/log.h
index 1cf8dc5..0167509 100644
--- a/SQLiteStudio3/coreSQLiteStudio/log.h
+++ b/SQLiteStudio3/coreSQLiteStudio/log.h
@@ -10,6 +10,7 @@
class QueryExecutorStep;
+API_EXPORT QString getLogDateTime();
API_EXPORT void logSql(Db* db, const QString& str, const QHash<QString,QVariant>& args, Db::Flags flags);
API_EXPORT void logSql(Db* db, const QString& str, const QList<QVariant>& args, Db::Flags flags);
API_EXPORT void logExecutorStep(QueryExecutorStep* step);
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecolumntype.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecolumntype.cpp
index cc773bb..2c48119 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecolumntype.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecolumntype.cpp
@@ -60,7 +60,7 @@ TokenList SqliteColumnType::rebuildTokensFromContents()
else if (scale.userType() == QVariant::LongLong)
builder.withInteger(scale.toLongLong());
else if (scale.userType() == QVariant::Double)
- builder.withFloat(scale.toDouble());
+ builder.withFloat(scale);
else
builder.withOther(scale.toString());
@@ -72,7 +72,7 @@ TokenList SqliteColumnType::rebuildTokensFromContents()
else if (precision.userType() == QVariant::LongLong)
builder.withInteger(precision.toLongLong());
else if (precision.userType() == QVariant::Double)
- builder.withFloat(precision.toDouble());
+ builder.withFloat(precision);
else
builder.withOther(precision.toString());
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.cpp
index 3009b4b..5dc830b 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.cpp
@@ -124,6 +124,21 @@ void SqliteExpr::initSubExpr(SqliteExpr *expr)
expr->setParent(this);
}
+void SqliteExpr::initRowValue(const QList<SqliteExpr*> &exprList)
+{
+ if (exprList.size() == 1)
+ {
+ initSubExpr(exprList.first());
+ return;
+ }
+
+ mode = SqliteExpr::Mode::ROW_VALUE;
+ this->exprList = exprList;
+
+ for (SqliteExpr* expr : exprList)
+ expr->setParent(this);
+}
+
void SqliteExpr::initBindParam(const QString& value)
{
mode = SqliteExpr::Mode::BIND_PARAM;
@@ -158,7 +173,7 @@ void SqliteExpr::initFunction(const QString& fnName, int distinct, const QList<S
else if (distinct == 2)
allKw = true;
- foreach (SqliteExpr* expr, exprList)
+ for (SqliteExpr* expr : exprList)
expr->setParent(this);
}
@@ -496,6 +511,9 @@ TokenList SqliteExpr::rebuildTokensFromContents()
case SqliteExpr::Mode::IN:
builder.withTokens(rebuildIn());
break;
+ case SqliteExpr::Mode::ROW_VALUE:
+ builder.withParLeft().withStatementList(exprList).withParRight();
+ break;
case SqliteExpr::Mode::EXISTS:
builder.withKeyword("EXISTS").withParLeft().withStatement(select).withParRight();
break;
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.h b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.h
index f57004f..4d5bb03 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.h
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.h
@@ -24,6 +24,7 @@ class API_EXPORT SqliteExpr : public SqliteStatement
BINARY_OP,
FUNCTION,
SUB_EXPR,
+ ROW_VALUE,
CAST,
COLLATE, // in Sqlite2 exists only in expr of sortlist
LIKE,
@@ -69,6 +70,7 @@ class API_EXPORT SqliteExpr : public SqliteStatement
void initNull();
void initCTime(const QString& name);
void initSubExpr(SqliteExpr* expr);
+ void initRowValue(const QList<SqliteExpr*>& exprList);
void initId(const QString& db, const QString& table, const QString& column);
void initId(const QString& table, const QString& column);
void initId(const QString& column);
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/lexer.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/lexer.cpp
index 6be7528..77036f7 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/lexer.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/lexer.cpp
@@ -1,5 +1,6 @@
#include "lexer.h"
#include "keywords.h"
+#include "log.h"
#include "lexer_low_lev.h"
#include "sqlite2_parse.h"
#include "sqlite3_parse.h"
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/lexer_low_lev.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/lexer_low_lev.cpp
index 894afd1..0f9aa91 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/lexer_low_lev.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/lexer_low_lev.cpp
@@ -315,7 +315,7 @@ int lexerGetToken(const QString& z, TokenPtr token, int sqliteVersion, bool tole
)
{
i += 2;
- while ( charAt(z, i+2).isDigit() )
+ while ( charAt(z, i).isDigit() )
i++;
token->lemonType = v3 ? TK3_FLOAT : TK2_FLOAT;
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp
index 43cc4a0..3884655 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp
@@ -243,602 +243,600 @@ static const YYMINORTYPE yyzerominor = { 0 };
** shifting non-terminals after a reduce.
** yy_default[] Default action for each state.
*/
-#define YY_ACTTAB_COUNT (2285)
+#define YY_ACTTAB_COUNT (2271)
static const YYACTIONTYPE yy_action[] = {
- /* 0 */ 432, 49, 49, 48, 48, 48, 47, 216, 717, 340,
- /* 10 */ 644, 426, 52, 52, 52, 52, 45, 50, 50, 50,
- /* 20 */ 50, 49, 49, 48, 48, 48, 47, 216, 722, 1027,
- /* 30 */ 1027, 644, 131, 581, 52, 52, 52, 52, 412, 50,
- /* 40 */ 50, 50, 50, 49, 49, 48, 48, 48, 47, 216,
- /* 50 */ 580, 81, 59, 644, 157, 686, 302, 283, 1027, 1027,
- /* 60 */ 42, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
- /* 70 */ 1027, 1027, 564, 1027, 1027, 1027, 1027, 39, 40, 1027,
- /* 80 */ 1027, 1027, 1027, 1027, 41, 432, 529, 386, 717, 596,
- /* 90 */ 595, 281, 4, 378, 717, 631, 426, 643, 609, 423,
- /* 100 */ 13, 134, 688, 430, 563, 610, 484, 691, 332, 280,
- /* 110 */ 715, 714, 565, 566, 643, 690, 689, 688, 235, 507,
- /* 120 */ 61, 321, 611, 412, 48, 48, 48, 47, 216, 122,
- /* 130 */ 243, 213, 247, 60, 1143, 1143, 487, 610, 608, 604,
- /* 140 */ 686, 307, 486, 585, 717, 42, 508, 510, 643, 509,
- /* 150 */ 677, 9, 643, 144, 95, 282, 380, 277, 379, 132,
- /* 160 */ 298, 717, 39, 40, 602, 200, 199, 7, 356, 41,
- /* 170 */ 885, 308, 1135, 275, 249, 717, 18, 4, 885, 1135,
- /* 180 */ 57, 718, 643, 432, 423, 885, 330, 688, 430, 717,
- /* 190 */ 688, 644, 691, 688, 426, 691, 715, 714, 691, 643,
- /* 200 */ 690, 689, 688, 690, 689, 688, 690, 689, 688, 98,
- /* 210 */ 683, 240, 644, 218, 411, 885, 487, 885, 885, 484,
- /* 220 */ 717, 412, 239, 885, 304, 583, 513, 582, 885, 885,
- /* 230 */ 885, 885, 885, 643, 644, 677, 9, 643, 686, 217,
- /* 240 */ 245, 674, 102, 42, 288, 301, 715, 714, 67, 303,
- /* 250 */ 148, 308, 1134, 151, 307, 485, 81, 716, 97, 1134,
- /* 260 */ 39, 40, 552, 715, 714, 772, 130, 41, 947, 377,
- /* 270 */ 374, 373, 448, 47, 216, 4, 947, 715, 714, 335,
- /* 280 */ 643, 683, 423, 947, 607, 688, 430, 372, 449, 448,
- /* 290 */ 691, 715, 714, 305, 265, 146, 268, 643, 690, 689,
- /* 300 */ 688, 288, 68, 678, 692, 255, 363, 259, 360, 693,
- /* 310 */ 1028, 1028, 683, 947, 716, 947, 947, 448, 699, 234,
- /* 320 */ 387, 716, 715, 714, 774, 652, 947, 947, 947, 947,
- /* 330 */ 110, 643, 318, 677, 9, 643, 222, 678, 300, 53,
- /* 340 */ 54, 427, 290, 1028, 1028, 676, 676, 51, 51, 52,
- /* 350 */ 52, 52, 52, 717, 50, 50, 50, 50, 49, 49,
- /* 360 */ 48, 48, 48, 47, 216, 432, 429, 341, 717, 336,
- /* 370 */ 672, 671, 288, 284, 717, 138, 426, 209, 219, 431,
- /* 380 */ 269, 396, 652, 683, 337, 716, 716, 687, 187, 53,
- /* 390 */ 54, 427, 290, 716, 453, 676, 676, 51, 51, 52,
- /* 400 */ 52, 52, 52, 412, 50, 50, 50, 50, 49, 49,
- /* 410 */ 48, 48, 48, 47, 216, 91, 954, 717, 620, 713,
- /* 420 */ 686, 404, 383, 130, 711, 42, 377, 374, 373, 712,
- /* 430 */ 233, 954, 395, 312, 210, 594, 667, 385, 429, 17,
- /* 440 */ 317, 660, 39, 40, 372, 231, 230, 717, 89, 41,
- /* 450 */ 932, 431, 717, 659, 717, 715, 714, 4, 932, 687,
- /* 460 */ 92, 143, 643, 359, 423, 932, 675, 688, 430, 15,
- /* 470 */ 715, 714, 691, 131, 457, 552, 715, 714, 954, 643,
- /* 480 */ 690, 689, 688, 669, 668, 210, 594, 459, 385, 458,
- /* 490 */ 577, 88, 1028, 1028, 14, 932, 673, 932, 932, 55,
- /* 500 */ 576, 679, 43, 369, 38, 402, 36, 382, 932, 1,
- /* 510 */ 932, 932, 642, 643, 635, 677, 9, 643, 662, 715,
- /* 520 */ 714, 53, 54, 427, 290, 1028, 1028, 676, 676, 51,
- /* 530 */ 51, 52, 52, 52, 52, 661, 50, 50, 50, 50,
- /* 540 */ 49, 49, 48, 48, 48, 47, 216, 658, 649, 715,
- /* 550 */ 714, 497, 543, 570, 715, 714, 715, 714, 657, 692,
- /* 560 */ 544, 615, 321, 31, 693, 28, 717, 586, 275, 683,
- /* 570 */ 160, 1028, 1028, 427, 290, 694, 614, 676, 676, 51,
- /* 580 */ 51, 52, 52, 52, 52, 399, 50, 50, 50, 50,
- /* 590 */ 49, 49, 48, 48, 48, 47, 216, 1026, 1026, 81,
- /* 600 */ 53, 54, 427, 290, 1028, 1028, 676, 676, 51, 51,
- /* 610 */ 52, 52, 52, 52, 497, 50, 50, 50, 50, 49,
- /* 620 */ 49, 48, 48, 48, 47, 216, 1026, 1026, 1026, 1026,
- /* 630 */ 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
- /* 640 */ 717, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
- /* 650 */ 1026, 1026, 1028, 1028, 358, 50, 50, 50, 50, 49,
- /* 660 */ 49, 48, 48, 48, 47, 216, 289, 553, 715, 714,
- /* 670 */ 496, 683, 299, 663, 347, 153, 539, 69, 695, 716,
- /* 680 */ 716, 53, 54, 427, 290, 1028, 1028, 676, 676, 51,
- /* 690 */ 51, 52, 52, 52, 52, 1095, 50, 50, 50, 50,
- /* 700 */ 49, 49, 48, 48, 48, 47, 216, 53, 54, 427,
- /* 710 */ 290, 419, 512, 676, 676, 51, 51, 52, 52, 52,
- /* 720 */ 52, 159, 50, 50, 50, 50, 49, 49, 48, 48,
- /* 730 */ 48, 47, 216, 491, 955, 316, 483, 483, 664, 554,
- /* 740 */ 215, 651, 715, 714, 81, 53, 54, 427, 290, 955,
- /* 750 */ 415, 676, 676, 51, 51, 52, 52, 52, 52, 398,
- /* 760 */ 50, 50, 50, 50, 49, 49, 48, 48, 48, 47,
- /* 770 */ 216, 158, 1095, 22, 717, 628, 460, 717, 1080, 717,
- /* 780 */ 648, 1046, 140, 89, 717, 1150, 154, 436, 2, 716,
- /* 790 */ 425, 672, 671, 397, 461, 462, 955, 53, 54, 427,
- /* 800 */ 290, 574, 717, 676, 676, 51, 51, 52, 52, 52,
- /* 810 */ 52, 322, 50, 50, 50, 50, 49, 49, 48, 48,
- /* 820 */ 48, 47, 216, 432, 1109, 81, 206, 205, 204, 53,
- /* 830 */ 54, 427, 290, 717, 426, 676, 676, 51, 51, 52,
- /* 840 */ 52, 52, 52, 345, 50, 50, 50, 50, 49, 49,
- /* 850 */ 48, 48, 48, 47, 216, 598, 716, 667, 601, 463,
- /* 860 */ 667, 412, 32, 717, 658, 90, 13, 895, 721, 669,
- /* 870 */ 668, 610, 725, 435, 81, 657, 715, 714, 686, 715,
- /* 880 */ 714, 715, 714, 42, 529, 273, 715, 714, 611, 350,
- /* 890 */ 529, 451, 89, 678, 13, 634, 634, 339, 637, 610,
- /* 900 */ 39, 40, 650, 610, 715, 714, 717, 41, 1143, 1143,
- /* 910 */ 717, 525, 683, 582, 717, 4, 611, 469, 61, 451,
- /* 920 */ 643, 208, 423, 507, 61, 688, 430, 678, 33, 109,
- /* 930 */ 691, 610, 501, 502, 353, 715, 714, 643, 690, 689,
- /* 940 */ 688, 429, 901, 901, 468, 467, 553, 466, 422, 384,
- /* 950 */ 508, 510, 142, 509, 431, 441, 69, 1143, 1143, 716,
- /* 960 */ 445, 723, 687, 182, 647, 715, 714, 646, 231, 230,
- /* 970 */ 438, 643, 357, 677, 9, 643, 418, 445, 53, 54,
- /* 980 */ 427, 290, 91, 91, 676, 676, 51, 51, 52, 52,
- /* 990 */ 52, 52, 645, 50, 50, 50, 50, 49, 49, 48,
- /* 1000 */ 48, 48, 47, 216, 1035, 445, 669, 668, 715, 714,
- /* 1010 */ 91, 454, 715, 714, 683, 642, 715, 714, 325, 202,
- /* 1020 */ 53, 54, 427, 290, 447, 681, 676, 676, 51, 51,
- /* 1030 */ 52, 52, 52, 52, 640, 50, 50, 50, 50, 49,
- /* 1040 */ 49, 48, 48, 48, 47, 216, 606, 53, 54, 427,
- /* 1050 */ 290, 717, 447, 676, 676, 51, 51, 52, 52, 52,
- /* 1060 */ 52, 460, 50, 50, 50, 50, 49, 49, 48, 48,
- /* 1070 */ 48, 47, 216, 454, 716, 37, 664, 424, 215, 461,
- /* 1080 */ 342, 370, 593, 53, 54, 427, 290, 639, 89, 676,
- /* 1090 */ 676, 51, 51, 52, 52, 52, 52, 32, 50, 50,
- /* 1100 */ 50, 50, 49, 49, 48, 48, 48, 47, 216, 414,
- /* 1110 */ 724, 2, 12, 53, 54, 427, 290, 34, 589, 676,
- /* 1120 */ 676, 51, 51, 52, 52, 52, 52, 625, 50, 50,
- /* 1130 */ 50, 50, 49, 49, 48, 48, 48, 47, 216, 516,
- /* 1140 */ 716, 538, 30, 91, 343, 667, 140, 136, 572, 53,
- /* 1150 */ 54, 427, 290, 715, 714, 676, 676, 51, 51, 52,
- /* 1160 */ 52, 52, 52, 549, 50, 50, 50, 50, 49, 49,
- /* 1170 */ 48, 48, 48, 47, 216, 91, 717, 234, 387, 53,
- /* 1180 */ 54, 427, 290, 339, 272, 676, 676, 51, 51, 52,
- /* 1190 */ 52, 52, 52, 334, 50, 50, 50, 50, 49, 49,
- /* 1200 */ 48, 48, 48, 47, 216, 533, 8, 518, 697, 87,
- /* 1210 */ 137, 53, 54, 427, 290, 23, 558, 676, 676, 51,
- /* 1220 */ 51, 52, 52, 52, 52, 135, 50, 50, 50, 50,
- /* 1230 */ 49, 49, 48, 48, 48, 47, 216, 81, 1110, 91,
- /* 1240 */ 717, 91, 53, 54, 427, 290, 616, 723, 676, 676,
- /* 1250 */ 51, 51, 52, 52, 52, 52, 605, 50, 50, 50,
- /* 1260 */ 50, 49, 49, 48, 48, 48, 47, 216, 99, 1108,
- /* 1270 */ 391, 505, 389, 492, 53, 54, 427, 290, 715, 714,
- /* 1280 */ 676, 676, 51, 51, 52, 52, 52, 52, 621, 50,
- /* 1290 */ 50, 50, 50, 49, 49, 48, 48, 48, 47, 216,
- /* 1300 */ 683, 53, 58, 427, 290, 683, 600, 676, 676, 51,
- /* 1310 */ 51, 52, 52, 52, 52, 429, 50, 50, 50, 50,
- /* 1320 */ 49, 49, 48, 48, 48, 47, 216, 432, 431, 717,
- /* 1330 */ 5, 621, 226, 633, 492, 632, 687, 187, 426, 54,
- /* 1340 */ 427, 290, 715, 714, 676, 676, 51, 51, 52, 52,
- /* 1350 */ 52, 52, 717, 50, 50, 50, 50, 49, 49, 48,
- /* 1360 */ 48, 48, 47, 216, 553, 412, 288, 599, 287, 717,
- /* 1370 */ 404, 388, 429, 698, 69, 613, 252, 716, 429, 716,
- /* 1380 */ 405, 716, 686, 30, 209, 431, 209, 42, 626, 317,
- /* 1390 */ 489, 431, 597, 687, 187, 429, 223, 309, 540, 687,
- /* 1400 */ 187, 329, 683, 717, 39, 40, 11, 683, 431, 287,
- /* 1410 */ 432, 41, 621, 654, 91, 592, 687, 92, 556, 4,
- /* 1420 */ 571, 426, 716, 625, 643, 537, 423, 404, 406, 688,
- /* 1430 */ 430, 715, 714, 333, 691, 717, 716, 429, 717, 591,
- /* 1440 */ 717, 643, 690, 689, 688, 107, 317, 652, 412, 531,
- /* 1450 */ 431, 590, 317, 717, 715, 714, 612, 830, 687, 187,
- /* 1460 */ 429, 225, 326, 717, 541, 686, 526, 417, 20, 642,
- /* 1470 */ 42, 715, 714, 431, 683, 643, 717, 677, 9, 643,
- /* 1480 */ 531, 687, 187, 526, 562, 717, 621, 39, 40, 327,
- /* 1490 */ 376, 65, 64, 432, 41, 274, 19, 266, 371, 535,
- /* 1500 */ 535, 267, 4, 271, 426, 715, 714, 643, 421, 423,
- /* 1510 */ 716, 407, 688, 430, 286, 400, 717, 691, 717, 280,
- /* 1520 */ 717, 63, 129, 429, 643, 690, 689, 688, 367, 717,
- /* 1530 */ 603, 412, 520, 534, 317, 515, 431, 715, 714, 156,
- /* 1540 */ 715, 714, 715, 714, 687, 192, 717, 209, 686, 520,
- /* 1550 */ 480, 465, 515, 42, 717, 715, 714, 3, 643, 717,
- /* 1560 */ 677, 9, 643, 717, 716, 715, 714, 480, 138, 125,
- /* 1570 */ 39, 40, 85, 476, 79, 432, 683, 41, 715, 714,
- /* 1580 */ 27, 429, 473, 511, 717, 4, 426, 715, 714, 517,
- /* 1590 */ 643, 532, 423, 408, 431, 688, 430, 642, 26, 719,
- /* 1600 */ 691, 717, 687, 181, 77, 476, 506, 643, 690, 689,
- /* 1610 */ 688, 620, 716, 412, 354, 470, 706, 439, 715, 714,
- /* 1620 */ 715, 714, 715, 714, 261, 288, 717, 473, 221, 504,
- /* 1630 */ 686, 715, 714, 704, 439, 42, 717, 716, 716, 568,
- /* 1640 */ 83, 643, 140, 677, 9, 643, 498, 1036, 715, 714,
- /* 1650 */ 702, 284, 39, 40, 254, 642, 715, 714, 432, 41,
- /* 1660 */ 328, 715, 714, 429, 716, 715, 714, 4, 1038, 426,
- /* 1670 */ 119, 10, 643, 503, 423, 707, 431, 688, 430, 470,
- /* 1680 */ 429, 161, 691, 251, 687, 163, 715, 714, 716, 643,
- /* 1690 */ 690, 689, 688, 431, 717, 429, 412, 152, 479, 456,
- /* 1700 */ 455, 687, 172, 715, 714, 72, 652, 705, 431, 429,
- /* 1710 */ 630, 312, 111, 686, 530, 338, 687, 190, 42, 437,
- /* 1720 */ 716, 622, 431, 643, 96, 677, 9, 643, 715, 714,
- /* 1730 */ 687, 188, 209, 717, 207, 39, 40, 642, 715, 714,
- /* 1740 */ 432, 224, 41, 617, 86, 429, 703, 717, 203, 429,
- /* 1750 */ 4, 426, 320, 720, 642, 643, 150, 423, 431, 716,
- /* 1760 */ 688, 430, 431, 700, 429, 691, 687, 196, 475, 642,
- /* 1770 */ 687, 195, 643, 690, 689, 688, 716, 431, 412, 717,
- /* 1780 */ 319, 710, 717, 642, 522, 687, 197, 709, 708, 258,
- /* 1790 */ 499, 429, 434, 220, 500, 686, 715, 714, 625, 16,
- /* 1800 */ 42, 717, 716, 257, 431, 717, 643, 256, 677, 9,
- /* 1810 */ 643, 716, 687, 201, 717, 351, 716, 39, 40, 642,
- /* 1820 */ 149, 248, 432, 642, 41, 482, 147, 246, 433, 442,
- /* 1830 */ 368, 478, 4, 426, 716, 715, 714, 643, 642, 423,
- /* 1840 */ 716, 717, 715, 430, 82, 701, 429, 691, 685, 715,
- /* 1850 */ 714, 145, 495, 234, 643, 690, 689, 688, 429, 431,
- /* 1860 */ 412, 559, 244, 284, 352, 642, 474, 687, 232, 18,
- /* 1870 */ 242, 431, 401, 429, 471, 716, 716, 686, 295, 687,
- /* 1880 */ 291, 715, 714, 716, 715, 714, 431, 294, 643, 696,
- /* 1890 */ 677, 9, 643, 542, 687, 191, 528, 293, 680, 39,
- /* 1900 */ 40, 717, 716, 715, 714, 429, 41, 715, 714, 429,
- /* 1910 */ 490, 716, 292, 29, 4, 493, 715, 714, 431, 643,
- /* 1920 */ 642, 423, 431, 227, 688, 430, 687, 194, 429, 691,
- /* 1930 */ 687, 193, 642, 429, 477, 429, 643, 690, 689, 688,
- /* 1940 */ 429, 431, 717, 715, 714, 429, 431, 642, 431, 687,
- /* 1950 */ 185, 717, 403, 431, 687, 189, 687, 315, 431, 717,
- /* 1960 */ 216, 687, 314, 429, 409, 684, 687, 313, 717, 429,
- /* 1970 */ 643, 56, 677, 9, 643, 44, 431, 716, 717, 642,
- /* 1980 */ 638, 627, 431, 642, 687, 184, 623, 420, 236, 653,
- /* 1990 */ 687, 171, 323, 716, 716, 641, 229, 66, 214, 716,
- /* 2000 */ 429, 716, 642, 715, 714, 618, 35, 642, 228, 642,
- /* 2010 */ 429, 133, 394, 431, 642, 524, 276, 429, 716, 642,
- /* 2020 */ 429, 687, 170, 431, 716, 716, 636, 569, 416, 716,
- /* 2030 */ 431, 687, 183, 431, 429, 550, 429, 642, 687, 169,
- /* 2040 */ 716, 687, 186, 642, 715, 714, 429, 431, 716, 431,
- /* 2050 */ 141, 429, 108, 715, 714, 687, 168, 687, 167, 431,
- /* 2060 */ 139, 715, 714, 270, 431, 519, 429, 687, 93, 390,
- /* 2070 */ 715, 714, 687, 166, 642, 717, 716, 429, 584, 431,
- /* 2080 */ 715, 714, 481, 429, 642, 717, 381, 687, 164, 717,
- /* 2090 */ 431, 642, 444, 579, 642, 578, 431, 387, 687, 174,
- /* 2100 */ 429, 263, 429, 472, 687, 173, 429, 331, 642, 278,
- /* 2110 */ 642, 574, 575, 431, 716, 431, 429, 361, 464, 431,
- /* 2120 */ 642, 687, 175, 687, 178, 642, 429, 687, 94, 431,
- /* 2130 */ 716, 429, 573, 429, 555, 548, 348, 687, 177, 431,
- /* 2140 */ 642, 547, 546, 545, 431, 429, 431, 687, 176, 716,
- /* 2150 */ 393, 642, 687, 180, 687, 179, 443, 642, 431, 536,
- /* 2160 */ 428, 128, 285, 431, 311, 310, 687, 165, 80, 716,
- /* 2170 */ 264, 687, 70, 716, 642, 716, 642, 715, 714, 366,
- /* 2180 */ 642, 649, 253, 716, 106, 250, 127, 715, 714, 241,
- /* 2190 */ 642, 715, 714, 237, 126, 716, 238, 262, 716, 355,
- /* 2200 */ 642, 212, 716, 25, 124, 642, 716, 642, 527, 716,
- /* 2210 */ 364, 78, 105, 123, 121, 155, 84, 514, 104, 642,
- /* 2220 */ 120, 349, 494, 624, 642, 346, 103, 118, 76, 344,
- /* 2230 */ 117, 75, 116, 115, 74, 73, 114, 521, 324, 113,
- /* 2240 */ 24, 452, 450, 21, 101, 100, 112, 446, 62, 440,
- /* 2250 */ 162, 296, 670, 666, 656, 413, 279, 619, 570, 198,
- /* 2260 */ 629, 375, 523, 260, 362, 306, 6, 71, 682, 665,
- /* 2270 */ 655, 557, 211, 297, 410, 567, 365, 46, 551, 561,
- /* 2280 */ 560, 488, 588, 81, 587,
+ /* 0 */ 432, 565, 566, 717, 50, 50, 49, 49, 49, 48,
+ /* 10 */ 215, 420, 53, 53, 53, 53, 28, 51, 51, 51,
+ /* 20 */ 51, 50, 50, 49, 49, 49, 48, 215, 717, 1026,
+ /* 30 */ 1026, 336, 666, 665, 53, 53, 53, 53, 425, 51,
+ /* 40 */ 51, 51, 51, 50, 50, 49, 49, 49, 48, 215,
+ /* 50 */ 722, 81, 205, 204, 203, 672, 592, 592, 1026, 1026,
+ /* 60 */ 41, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+ /* 70 */ 1026, 1026, 639, 1026, 1026, 1026, 1026, 38, 39, 1026,
+ /* 80 */ 1026, 1026, 1026, 1026, 40, 432, 529, 285, 717, 56,
+ /* 90 */ 108, 684, 3, 717, 668, 301, 420, 678, 661, 417,
+ /* 100 */ 716, 67, 688, 430, 552, 715, 714, 691, 130, 331,
+ /* 110 */ 60, 377, 374, 373, 678, 690, 689, 688, 674, 507,
+ /* 120 */ 61, 216, 717, 425, 49, 49, 49, 48, 215, 372,
+ /* 130 */ 715, 714, 212, 131, 1143, 1143, 242, 629, 246, 674,
+ /* 140 */ 672, 421, 685, 48, 215, 41, 508, 510, 678, 509,
+ /* 150 */ 9, 678, 33, 669, 144, 95, 281, 380, 276, 379,
+ /* 160 */ 132, 674, 38, 39, 609, 229, 228, 7, 356, 40,
+ /* 170 */ 885, 717, 403, 717, 274, 484, 685, 3, 885, 529,
+ /* 180 */ 248, 610, 678, 68, 417, 885, 411, 688, 430, 209,
+ /* 190 */ 715, 714, 691, 684, 457, 715, 714, 717, 209, 678,
+ /* 200 */ 690, 689, 688, 663, 662, 432, 453, 459, 460, 458,
+ /* 210 */ 306, 486, 507, 61, 717, 885, 420, 885, 885, 492,
+ /* 220 */ 725, 716, 320, 885, 715, 714, 461, 462, 885, 885,
+ /* 230 */ 885, 885, 885, 678, 297, 9, 678, 772, 669, 508,
+ /* 240 */ 510, 687, 509, 425, 717, 339, 244, 51, 51, 51,
+ /* 250 */ 51, 50, 50, 49, 49, 49, 48, 215, 543, 570,
+ /* 260 */ 672, 357, 713, 283, 688, 41, 544, 711, 448, 691,
+ /* 270 */ 445, 577, 712, 715, 714, 715, 714, 690, 689, 688,
+ /* 280 */ 492, 576, 38, 39, 449, 448, 512, 445, 487, 40,
+ /* 290 */ 947, 463, 661, 389, 497, 603, 602, 3, 947, 715,
+ /* 300 */ 714, 230, 678, 684, 417, 947, 13, 688, 430, 723,
+ /* 310 */ 17, 617, 691, 448, 513, 445, 715, 714, 81, 678,
+ /* 320 */ 690, 689, 688, 307, 1135, 679, 460, 654, 618, 360,
+ /* 330 */ 774, 1135, 1028, 1028, 89, 947, 1, 947, 947, 716,
+ /* 340 */ 110, 595, 716, 617, 461, 342, 715, 714, 947, 947,
+ /* 350 */ 947, 947, 1080, 678, 692, 9, 678, 497, 669, 693,
+ /* 360 */ 717, 54, 55, 427, 295, 1028, 1028, 681, 681, 52,
+ /* 370 */ 52, 53, 53, 53, 53, 717, 51, 51, 51, 51,
+ /* 380 */ 50, 50, 49, 49, 49, 48, 215, 432, 496, 382,
+ /* 390 */ 717, 553, 347, 254, 363, 258, 298, 139, 420, 218,
+ /* 400 */ 539, 69, 286, 287, 716, 684, 143, 231, 390, 343,
+ /* 410 */ 661, 54, 55, 427, 295, 716, 716, 681, 681, 52,
+ /* 420 */ 52, 53, 53, 53, 53, 425, 51, 51, 51, 51,
+ /* 430 */ 50, 50, 49, 49, 49, 48, 215, 684, 954, 608,
+ /* 440 */ 628, 692, 672, 663, 662, 585, 693, 41, 429, 207,
+ /* 450 */ 601, 491, 388, 954, 130, 652, 499, 377, 374, 373,
+ /* 460 */ 500, 431, 715, 714, 38, 39, 651, 199, 198, 673,
+ /* 470 */ 186, 40, 932, 699, 685, 372, 717, 715, 714, 3,
+ /* 480 */ 932, 351, 57, 653, 678, 616, 417, 932, 135, 688,
+ /* 490 */ 430, 59, 688, 157, 691, 717, 680, 691, 340, 1046,
+ /* 500 */ 954, 678, 690, 689, 688, 690, 689, 688, 685, 419,
+ /* 510 */ 666, 665, 724, 2, 1028, 1028, 636, 932, 208, 932,
+ /* 520 */ 932, 43, 386, 141, 294, 615, 611, 264, 284, 267,
+ /* 530 */ 932, 139, 932, 932, 122, 678, 400, 9, 678, 684,
+ /* 540 */ 669, 716, 142, 54, 55, 427, 295, 1028, 1028, 681,
+ /* 550 */ 681, 52, 52, 53, 53, 53, 53, 339, 51, 51,
+ /* 560 */ 51, 51, 50, 50, 49, 49, 49, 48, 215, 652,
+ /* 570 */ 91, 299, 483, 483, 628, 717, 661, 717, 715, 714,
+ /* 580 */ 651, 18, 717, 605, 717, 37, 677, 399, 311, 717,
+ /* 590 */ 34, 535, 535, 1028, 1028, 427, 295, 715, 714, 681,
+ /* 600 */ 681, 52, 52, 53, 53, 53, 53, 234, 51, 51,
+ /* 610 */ 51, 51, 50, 50, 49, 49, 49, 48, 215, 1027,
+ /* 620 */ 1027, 723, 54, 55, 427, 295, 1028, 1028, 681, 681,
+ /* 630 */ 52, 52, 53, 53, 53, 53, 42, 51, 51, 51,
+ /* 640 */ 51, 50, 50, 49, 49, 49, 48, 215, 1027, 1027,
+ /* 650 */ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ /* 660 */ 1027, 1027, 717, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ /* 670 */ 1027, 1027, 1027, 1027, 1028, 1028, 718, 715, 714, 715,
+ /* 680 */ 714, 454, 324, 201, 715, 714, 715, 714, 321, 695,
+ /* 690 */ 315, 715, 714, 658, 554, 214, 676, 46, 568, 32,
+ /* 700 */ 81, 88, 675, 54, 55, 427, 295, 1028, 1028, 681,
+ /* 710 */ 681, 52, 52, 53, 53, 53, 53, 1095, 51, 51,
+ /* 720 */ 51, 51, 50, 50, 49, 49, 49, 48, 215, 54,
+ /* 730 */ 55, 427, 295, 667, 423, 681, 681, 52, 52, 53,
+ /* 740 */ 53, 53, 53, 454, 51, 51, 51, 51, 50, 50,
+ /* 750 */ 49, 49, 49, 48, 215, 358, 955, 656, 643, 1150,
+ /* 760 */ 154, 436, 2, 487, 715, 714, 350, 54, 55, 427,
+ /* 770 */ 295, 955, 484, 681, 681, 52, 52, 53, 53, 53,
+ /* 780 */ 53, 160, 51, 51, 51, 51, 50, 50, 49, 49,
+ /* 790 */ 49, 48, 215, 600, 1095, 22, 717, 280, 307, 1134,
+ /* 800 */ 34, 717, 501, 502, 353, 629, 1134, 306, 485, 697,
+ /* 810 */ 268, 717, 229, 228, 337, 279, 717, 558, 955, 54,
+ /* 820 */ 55, 427, 295, 716, 717, 681, 681, 52, 52, 53,
+ /* 830 */ 53, 53, 53, 655, 51, 51, 51, 51, 50, 50,
+ /* 840 */ 49, 49, 49, 48, 215, 432, 1109, 81, 717, 225,
+ /* 850 */ 663, 662, 54, 55, 427, 295, 420, 153, 681, 681,
+ /* 860 */ 52, 52, 53, 53, 53, 53, 641, 51, 51, 51,
+ /* 870 */ 51, 50, 50, 49, 49, 49, 48, 215, 586, 89,
+ /* 880 */ 717, 231, 390, 425, 15, 717, 694, 413, 13, 895,
+ /* 890 */ 721, 207, 601, 617, 388, 435, 81, 574, 715, 714,
+ /* 900 */ 672, 272, 553, 715, 714, 41, 529, 537, 89, 14,
+ /* 910 */ 618, 698, 69, 715, 714, 716, 13, 209, 715, 714,
+ /* 920 */ 359, 617, 38, 39, 159, 617, 715, 714, 645, 40,
+ /* 930 */ 1143, 1143, 717, 345, 222, 674, 540, 3, 618, 469,
+ /* 940 */ 61, 285, 678, 625, 417, 473, 716, 688, 430, 45,
+ /* 950 */ 715, 714, 691, 617, 716, 416, 674, 402, 581, 678,
+ /* 960 */ 690, 689, 688, 429, 901, 901, 468, 467, 284, 466,
+ /* 970 */ 629, 81, 706, 633, 495, 580, 431, 526, 674, 1143,
+ /* 980 */ 1143, 716, 715, 714, 673, 92, 716, 715, 714, 91,
+ /* 990 */ 473, 401, 438, 678, 526, 9, 678, 370, 669, 409,
+ /* 1000 */ 54, 55, 427, 295, 89, 505, 681, 681, 52, 52,
+ /* 1010 */ 53, 53, 53, 53, 620, 51, 51, 51, 51, 50,
+ /* 1020 */ 50, 49, 49, 49, 48, 215, 717, 638, 311, 717,
+ /* 1030 */ 406, 658, 418, 214, 715, 714, 90, 642, 131, 334,
+ /* 1040 */ 415, 644, 54, 55, 427, 295, 451, 640, 681, 681,
+ /* 1050 */ 52, 52, 53, 53, 53, 53, 158, 51, 51, 51,
+ /* 1060 */ 51, 50, 50, 49, 49, 49, 48, 215, 369, 54,
+ /* 1070 */ 55, 427, 295, 12, 451, 681, 681, 52, 52, 53,
+ /* 1080 */ 53, 53, 53, 633, 51, 51, 51, 51, 50, 50,
+ /* 1090 */ 49, 49, 49, 48, 215, 36, 716, 8, 209, 54,
+ /* 1100 */ 55, 427, 295, 34, 589, 681, 681, 52, 52, 53,
+ /* 1110 */ 53, 53, 53, 704, 51, 51, 51, 51, 50, 50,
+ /* 1120 */ 49, 49, 49, 48, 215, 87, 138, 320, 715, 714,
+ /* 1130 */ 412, 715, 714, 274, 572, 54, 55, 427, 295, 30,
+ /* 1140 */ 624, 681, 681, 52, 52, 53, 53, 53, 53, 326,
+ /* 1150 */ 51, 51, 51, 51, 50, 50, 49, 49, 49, 48,
+ /* 1160 */ 215, 408, 717, 137, 91, 54, 55, 427, 295, 614,
+ /* 1170 */ 271, 681, 681, 52, 52, 53, 53, 53, 53, 465,
+ /* 1180 */ 51, 51, 51, 51, 50, 50, 49, 49, 49, 48,
+ /* 1190 */ 215, 136, 716, 538, 612, 91, 99, 54, 55, 427,
+ /* 1200 */ 295, 23, 607, 681, 681, 52, 52, 53, 53, 53,
+ /* 1210 */ 53, 395, 51, 51, 51, 51, 50, 50, 49, 49,
+ /* 1220 */ 49, 48, 215, 533, 1110, 516, 717, 91, 54, 55,
+ /* 1230 */ 427, 295, 141, 393, 681, 681, 52, 52, 53, 53,
+ /* 1240 */ 53, 53, 5, 51, 51, 51, 51, 50, 50, 49,
+ /* 1250 */ 49, 49, 48, 215, 717, 1108, 606, 91, 717, 476,
+ /* 1260 */ 54, 55, 427, 295, 715, 714, 681, 681, 52, 52,
+ /* 1270 */ 53, 53, 53, 53, 684, 51, 51, 51, 51, 50,
+ /* 1280 */ 50, 49, 49, 49, 48, 215, 684, 54, 58, 427,
+ /* 1290 */ 295, 476, 717, 681, 681, 52, 52, 53, 53, 53,
+ /* 1300 */ 53, 633, 51, 51, 51, 51, 50, 50, 49, 49,
+ /* 1310 */ 49, 48, 215, 432, 716, 251, 518, 604, 1035, 11,
+ /* 1320 */ 107, 629, 36, 531, 420, 55, 427, 295, 715, 714,
+ /* 1330 */ 681, 681, 52, 52, 53, 53, 53, 53, 224, 51,
+ /* 1340 */ 51, 51, 51, 50, 50, 49, 49, 49, 48, 215,
+ /* 1350 */ 91, 425, 717, 583, 531, 582, 715, 714, 429, 20,
+ /* 1360 */ 715, 714, 429, 684, 429, 619, 384, 352, 672, 562,
+ /* 1370 */ 387, 431, 623, 41, 489, 431, 684, 431, 657, 673,
+ /* 1380 */ 186, 308, 717, 673, 186, 673, 186, 622, 684, 470,
+ /* 1390 */ 38, 39, 599, 597, 715, 714, 432, 40, 719, 683,
+ /* 1400 */ 91, 830, 634, 596, 91, 3, 571, 420, 541, 591,
+ /* 1410 */ 678, 716, 417, 391, 385, 688, 430, 332, 707, 333,
+ /* 1420 */ 691, 525, 429, 582, 717, 65, 429, 678, 690, 689,
+ /* 1430 */ 688, 716, 316, 717, 425, 431, 316, 564, 316, 431,
+ /* 1440 */ 717, 590, 376, 673, 186, 64, 429, 673, 186, 429,
+ /* 1450 */ 273, 672, 19, 470, 715, 714, 41, 371, 378, 431,
+ /* 1460 */ 684, 678, 431, 9, 678, 684, 669, 673, 186, 563,
+ /* 1470 */ 673, 92, 717, 38, 39, 63, 648, 391, 383, 432,
+ /* 1480 */ 40, 391, 392, 129, 715, 714, 717, 279, 3, 270,
+ /* 1490 */ 420, 367, 613, 678, 705, 417, 316, 534, 688, 430,
+ /* 1500 */ 316, 404, 4, 691, 717, 553, 717, 716, 156, 284,
+ /* 1510 */ 678, 690, 689, 688, 441, 69, 325, 425, 716, 630,
+ /* 1520 */ 316, 717, 716, 642, 125, 79, 715, 714, 703, 27,
+ /* 1530 */ 26, 85, 517, 77, 672, 715, 714, 520, 447, 41,
+ /* 1540 */ 717, 716, 715, 714, 678, 549, 9, 678, 717, 669,
+ /* 1550 */ 511, 329, 700, 506, 520, 354, 38, 39, 504, 702,
+ /* 1560 */ 83, 432, 684, 40, 265, 716, 447, 286, 266, 226,
+ /* 1570 */ 141, 3, 420, 556, 715, 714, 678, 716, 417, 696,
+ /* 1580 */ 716, 688, 430, 515, 686, 422, 691, 717, 715, 714,
+ /* 1590 */ 498, 429, 716, 678, 690, 689, 688, 716, 716, 425,
+ /* 1600 */ 515, 480, 335, 439, 431, 253, 715, 714, 715, 714,
+ /* 1610 */ 119, 479, 673, 194, 250, 260, 672, 717, 480, 220,
+ /* 1620 */ 439, 41, 717, 715, 714, 10, 152, 678, 716, 9,
+ /* 1630 */ 678, 161, 669, 1036, 286, 594, 456, 455, 38, 39,
+ /* 1640 */ 72, 111, 715, 714, 432, 40, 635, 716, 646, 429,
+ /* 1650 */ 715, 714, 338, 3, 1038, 420, 437, 209, 678, 716,
+ /* 1660 */ 417, 202, 431, 688, 430, 642, 429, 96, 691, 221,
+ /* 1670 */ 673, 181, 631, 717, 223, 678, 690, 689, 688, 431,
+ /* 1680 */ 717, 429, 425, 206, 86, 716, 717, 673, 185, 715,
+ /* 1690 */ 714, 319, 626, 257, 431, 429, 522, 219, 720, 672,
+ /* 1700 */ 530, 559, 673, 189, 41, 716, 716, 318, 431, 678,
+ /* 1710 */ 710, 9, 678, 717, 669, 646, 673, 187, 490, 715,
+ /* 1720 */ 714, 38, 39, 642, 715, 714, 432, 150, 40, 134,
+ /* 1730 */ 709, 542, 429, 717, 149, 429, 3, 420, 708, 286,
+ /* 1740 */ 642, 678, 716, 417, 434, 431, 688, 430, 431, 286,
+ /* 1750 */ 429, 691, 716, 673, 195, 642, 673, 193, 678, 690,
+ /* 1760 */ 689, 688, 716, 431, 425, 398, 256, 621, 368, 642,
+ /* 1770 */ 255, 673, 196, 147, 328, 715, 714, 429, 716, 716,
+ /* 1780 */ 716, 672, 715, 714, 327, 82, 41, 433, 715, 714,
+ /* 1790 */ 431, 16, 678, 701, 9, 678, 598, 669, 673, 200,
+ /* 1800 */ 503, 532, 145, 38, 39, 215, 642, 232, 432, 642,
+ /* 1810 */ 40, 47, 671, 247, 31, 715, 714, 482, 3, 420,
+ /* 1820 */ 646, 275, 475, 678, 642, 417, 716, 528, 715, 430,
+ /* 1830 */ 646, 569, 429, 691, 716, 715, 714, 550, 231, 291,
+ /* 1840 */ 678, 690, 689, 688, 716, 431, 425, 524, 245, 18,
+ /* 1850 */ 716, 642, 478, 673, 233, 98, 290, 239, 243, 217,
+ /* 1860 */ 429, 716, 474, 672, 717, 241, 35, 405, 238, 471,
+ /* 1870 */ 303, 716, 289, 431, 678, 288, 9, 678, 716, 669,
+ /* 1880 */ 235, 673, 296, 670, 322, 38, 39, 414, 102, 44,
+ /* 1890 */ 717, 300, 40, 716, 407, 302, 148, 66, 227, 151,
+ /* 1900 */ 3, 213, 81, 269, 97, 678, 642, 417, 410, 140,
+ /* 1910 */ 688, 430, 717, 262, 429, 691, 716, 361, 109, 348,
+ /* 1920 */ 394, 390, 678, 690, 689, 688, 716, 431, 584, 429,
+ /* 1930 */ 716, 429, 716, 429, 642, 673, 192, 593, 133, 304,
+ /* 1940 */ 717, 146, 431, 381, 431, 579, 431, 429, 277, 429,
+ /* 1950 */ 673, 184, 673, 172, 673, 163, 678, 578, 9, 678,
+ /* 1960 */ 431, 669, 431, 330, 429, 575, 715, 714, 673, 171,
+ /* 1970 */ 673, 183, 717, 574, 717, 573, 429, 431, 317, 310,
+ /* 1980 */ 548, 555, 443, 547, 546, 673, 188, 429, 642, 431,
+ /* 1990 */ 545, 309, 715, 714, 536, 716, 128, 673, 314, 428,
+ /* 2000 */ 431, 80, 127, 642, 519, 642, 429, 642, 673, 313,
+ /* 2010 */ 366, 429, 716, 341, 715, 714, 717, 106, 429, 431,
+ /* 2020 */ 211, 642, 261, 642, 431, 472, 493, 673, 312, 126,
+ /* 2030 */ 717, 431, 673, 170, 355, 429, 282, 25, 642, 673,
+ /* 2040 */ 93, 429, 715, 714, 124, 527, 429, 263, 431, 716,
+ /* 2050 */ 642, 429, 252, 78, 431, 105, 673, 169, 249, 431,
+ /* 2060 */ 716, 642, 673, 168, 431, 716, 429, 673, 166, 429,
+ /* 2070 */ 84, 716, 673, 165, 715, 714, 715, 714, 717, 431,
+ /* 2080 */ 642, 717, 431, 429, 123, 642, 444, 673, 182, 429,
+ /* 2090 */ 673, 164, 642, 240, 236, 364, 431, 717, 121, 464,
+ /* 2100 */ 429, 717, 431, 477, 673, 190, 716, 716, 717, 642,
+ /* 2110 */ 673, 191, 442, 431, 429, 642, 155, 429, 715, 714,
+ /* 2120 */ 642, 673, 174, 717, 429, 642, 514, 431, 429, 237,
+ /* 2130 */ 431, 429, 715, 714, 429, 673, 173, 431, 673, 175,
+ /* 2140 */ 642, 431, 716, 642, 431, 673, 178, 431, 429, 673,
+ /* 2150 */ 94, 349, 673, 177, 429, 673, 176, 642, 104, 120,
+ /* 2160 */ 494, 431, 103, 642, 429, 346, 118, 431, 344, 673,
+ /* 2170 */ 180, 117, 76, 75, 642, 673, 179, 431, 647, 116,
+ /* 2180 */ 715, 714, 74, 715, 714, 673, 167, 115, 642, 73,
+ /* 2190 */ 114, 642, 481, 643, 323, 113, 397, 24, 642, 715,
+ /* 2200 */ 714, 452, 642, 715, 714, 642, 21, 450, 642, 431,
+ /* 2210 */ 715, 714, 101, 100, 446, 112, 62, 673, 70, 440,
+ /* 2220 */ 162, 292, 642, 664, 552, 715, 714, 570, 642, 632,
+ /* 2230 */ 426, 650, 637, 627, 278, 197, 375, 660, 642, 259,
+ /* 2240 */ 362, 523, 6, 305, 682, 659, 649, 557, 210, 521,
+ /* 2250 */ 29, 365, 424, 293, 71, 567, 561, 560, 488, 588,
+ /* 2260 */ 587, 81, 551, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
+ /* 2270 */ 642,
};
static const YYCODETYPE yy_lookahead[] = {
- /* 0 */ 4, 81, 82, 83, 84, 85, 86, 87, 4, 58,
- /* 10 */ 5, 15, 72, 73, 74, 75, 76, 77, 78, 79,
- /* 20 */ 80, 81, 82, 83, 84, 85, 86, 87, 89, 33,
- /* 30 */ 34, 26, 34, 28, 72, 73, 74, 75, 42, 77,
+ /* 0 */ 4, 110, 111, 4, 81, 82, 83, 84, 85, 86,
+ /* 10 */ 87, 15, 72, 73, 74, 75, 76, 77, 78, 79,
+ /* 20 */ 80, 81, 82, 83, 84, 85, 86, 87, 4, 33,
+ /* 30 */ 34, 194, 195, 196, 72, 73, 74, 75, 42, 77,
/* 40 */ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
- /* 50 */ 45, 55, 96, 48, 98, 59, 93, 104, 62, 63,
+ /* 50 */ 89, 55, 124, 125, 126, 59, 33, 34, 62, 63,
/* 60 */ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
- /* 70 */ 74, 75, 14, 77, 78, 79, 80, 81, 82, 83,
- /* 80 */ 84, 85, 86, 87, 88, 4, 185, 134, 4, 136,
- /* 90 */ 137, 111, 96, 35, 4, 104, 15, 101, 104, 103,
- /* 100 */ 96, 107, 106, 107, 46, 101, 61, 111, 64, 129,
- /* 110 */ 106, 107, 110, 111, 118, 119, 120, 121, 167, 218,
- /* 120 */ 219, 123, 118, 42, 83, 84, 85, 86, 87, 104,
- /* 130 */ 51, 87, 53, 142, 138, 139, 61, 133, 144, 145,
- /* 140 */ 59, 96, 97, 59, 4, 64, 245, 246, 152, 248,
- /* 150 */ 154, 155, 156, 109, 110, 111, 112, 113, 114, 115,
- /* 160 */ 97, 4, 81, 82, 83, 81, 82, 266, 267, 88,
- /* 170 */ 89, 96, 97, 129, 95, 4, 151, 96, 97, 104,
- /* 180 */ 96, 91, 101, 4, 103, 104, 128, 106, 107, 4,
- /* 190 */ 106, 5, 111, 106, 15, 111, 106, 107, 111, 118,
- /* 200 */ 119, 120, 121, 119, 120, 121, 119, 120, 121, 8,
- /* 210 */ 4, 10, 26, 12, 28, 134, 61, 136, 137, 61,
- /* 220 */ 4, 42, 21, 142, 23, 214, 45, 216, 147, 148,
- /* 230 */ 149, 150, 151, 152, 48, 154, 155, 156, 59, 96,
- /* 240 */ 161, 97, 41, 64, 177, 44, 106, 107, 104, 48,
- /* 250 */ 49, 96, 97, 52, 96, 97, 55, 190, 57, 104,
- /* 260 */ 81, 82, 105, 106, 107, 99, 109, 88, 89, 112,
- /* 270 */ 113, 114, 101, 86, 87, 96, 97, 106, 107, 212,
- /* 280 */ 101, 4, 103, 104, 144, 106, 107, 130, 117, 118,
- /* 290 */ 111, 106, 107, 92, 51, 94, 53, 118, 119, 120,
- /* 300 */ 121, 177, 96, 118, 135, 124, 125, 126, 177, 140,
- /* 310 */ 33, 34, 106, 134, 190, 136, 137, 146, 102, 138,
- /* 320 */ 139, 190, 106, 107, 99, 258, 147, 148, 149, 150,
- /* 330 */ 99, 152, 131, 154, 155, 156, 212, 152, 95, 62,
- /* 340 */ 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
- /* 350 */ 73, 74, 75, 4, 77, 78, 79, 80, 81, 82,
- /* 360 */ 83, 84, 85, 86, 87, 4, 177, 166, 4, 194,
- /* 370 */ 195, 196, 177, 177, 4, 98, 15, 252, 247, 190,
- /* 380 */ 177, 185, 258, 106, 181, 190, 190, 198, 199, 62,
- /* 390 */ 63, 64, 65, 190, 269, 68, 69, 70, 71, 72,
- /* 400 */ 73, 74, 75, 42, 77, 78, 79, 80, 81, 82,
- /* 410 */ 83, 84, 85, 86, 87, 219, 89, 4, 141, 19,
- /* 420 */ 59, 232, 233, 109, 24, 64, 112, 113, 114, 29,
- /* 430 */ 225, 104, 236, 237, 220, 221, 261, 223, 177, 234,
- /* 440 */ 251, 97, 81, 82, 130, 81, 82, 4, 104, 88,
- /* 450 */ 89, 190, 4, 258, 4, 106, 107, 96, 97, 198,
- /* 460 */ 199, 99, 101, 249, 103, 104, 111, 106, 107, 71,
- /* 470 */ 106, 107, 111, 34, 110, 105, 106, 107, 151, 118,
- /* 480 */ 119, 120, 121, 119, 120, 220, 221, 123, 223, 125,
- /* 490 */ 19, 43, 33, 34, 96, 134, 97, 136, 137, 40,
- /* 500 */ 29, 152, 96, 64, 158, 244, 160, 83, 147, 96,
- /* 510 */ 149, 150, 251, 152, 101, 154, 155, 156, 97, 106,
- /* 520 */ 107, 62, 63, 64, 65, 66, 67, 68, 69, 70,
- /* 530 */ 71, 72, 73, 74, 75, 97, 77, 78, 79, 80,
- /* 540 */ 81, 82, 83, 84, 85, 86, 87, 9, 100, 106,
- /* 550 */ 107, 101, 205, 206, 106, 107, 106, 107, 20, 135,
- /* 560 */ 213, 118, 123, 104, 140, 123, 4, 190, 129, 4,
- /* 570 */ 96, 33, 34, 64, 65, 198, 133, 68, 69, 70,
- /* 580 */ 71, 72, 73, 74, 75, 143, 77, 78, 79, 80,
- /* 590 */ 81, 82, 83, 84, 85, 86, 87, 33, 34, 55,
- /* 600 */ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
- /* 610 */ 72, 73, 74, 75, 164, 77, 78, 79, 80, 81,
- /* 620 */ 82, 83, 84, 85, 86, 87, 62, 63, 64, 65,
- /* 630 */ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
- /* 640 */ 4, 77, 78, 79, 80, 81, 82, 83, 84, 85,
- /* 650 */ 86, 87, 33, 34, 110, 77, 78, 79, 80, 81,
- /* 660 */ 82, 83, 84, 85, 86, 87, 177, 177, 106, 107,
- /* 670 */ 50, 106, 182, 108, 54, 104, 186, 187, 116, 190,
- /* 680 */ 190, 62, 63, 64, 65, 66, 67, 68, 69, 70,
- /* 690 */ 71, 72, 73, 74, 75, 12, 77, 78, 79, 80,
- /* 700 */ 81, 82, 83, 84, 85, 86, 87, 62, 63, 64,
- /* 710 */ 65, 98, 23, 68, 69, 70, 71, 72, 73, 74,
- /* 720 */ 75, 96, 77, 78, 79, 80, 81, 82, 83, 84,
- /* 730 */ 85, 86, 87, 113, 89, 188, 100, 101, 191, 192,
- /* 740 */ 193, 97, 106, 107, 55, 62, 63, 64, 65, 104,
- /* 750 */ 98, 68, 69, 70, 71, 72, 73, 74, 75, 30,
- /* 760 */ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
- /* 770 */ 87, 96, 89, 38, 4, 97, 177, 4, 89, 4,
- /* 780 */ 23, 161, 104, 104, 4, 170, 171, 172, 173, 190,
- /* 790 */ 194, 195, 196, 64, 195, 196, 151, 62, 63, 64,
- /* 800 */ 65, 122, 4, 68, 69, 70, 71, 72, 73, 74,
- /* 810 */ 75, 179, 77, 78, 79, 80, 81, 82, 83, 84,
- /* 820 */ 85, 86, 87, 4, 89, 55, 124, 125, 126, 62,
- /* 830 */ 63, 64, 65, 4, 15, 68, 69, 70, 71, 72,
- /* 840 */ 73, 74, 75, 177, 77, 78, 79, 80, 81, 82,
- /* 850 */ 83, 84, 85, 86, 87, 97, 190, 261, 83, 260,
- /* 860 */ 261, 42, 104, 4, 9, 98, 96, 97, 169, 119,
- /* 870 */ 120, 101, 0, 174, 55, 20, 106, 107, 59, 106,
- /* 880 */ 107, 106, 107, 64, 185, 97, 106, 107, 118, 257,
- /* 890 */ 185, 118, 104, 118, 96, 33, 34, 25, 118, 101,
- /* 900 */ 81, 82, 97, 133, 106, 107, 4, 88, 138, 139,
- /* 910 */ 4, 214, 4, 216, 4, 96, 118, 218, 219, 146,
- /* 920 */ 101, 96, 103, 218, 219, 106, 107, 152, 66, 67,
- /* 930 */ 111, 133, 124, 125, 126, 106, 107, 118, 119, 120,
- /* 940 */ 121, 177, 144, 145, 245, 246, 177, 248, 185, 185,
- /* 950 */ 245, 246, 104, 248, 190, 186, 187, 138, 139, 190,
- /* 960 */ 101, 89, 198, 199, 97, 106, 107, 97, 81, 82,
- /* 970 */ 271, 152, 267, 154, 155, 156, 185, 118, 62, 63,
- /* 980 */ 64, 65, 219, 219, 68, 69, 70, 71, 72, 73,
- /* 990 */ 74, 75, 97, 77, 78, 79, 80, 81, 82, 83,
- /* 1000 */ 84, 85, 86, 87, 158, 146, 119, 120, 106, 107,
- /* 1010 */ 219, 101, 106, 107, 106, 251, 106, 107, 272, 273,
- /* 1020 */ 62, 63, 64, 65, 118, 117, 68, 69, 70, 71,
- /* 1030 */ 72, 73, 74, 75, 97, 77, 78, 79, 80, 81,
- /* 1040 */ 82, 83, 84, 85, 86, 87, 144, 62, 63, 64,
- /* 1050 */ 65, 4, 146, 68, 69, 70, 71, 72, 73, 74,
- /* 1060 */ 75, 177, 77, 78, 79, 80, 81, 82, 83, 84,
- /* 1070 */ 85, 86, 87, 163, 190, 159, 191, 192, 193, 195,
- /* 1080 */ 196, 97, 97, 62, 63, 64, 65, 97, 104, 68,
- /* 1090 */ 69, 70, 71, 72, 73, 74, 75, 104, 77, 78,
- /* 1100 */ 79, 80, 81, 82, 83, 84, 85, 86, 87, 185,
- /* 1110 */ 172, 173, 13, 62, 63, 64, 65, 159, 97, 68,
- /* 1120 */ 69, 70, 71, 72, 73, 74, 75, 177, 77, 78,
- /* 1130 */ 79, 80, 81, 82, 83, 84, 85, 86, 87, 97,
- /* 1140 */ 190, 185, 104, 219, 260, 261, 104, 97, 97, 62,
- /* 1150 */ 63, 64, 65, 106, 107, 68, 69, 70, 71, 72,
- /* 1160 */ 73, 74, 75, 116, 77, 78, 79, 80, 81, 82,
- /* 1170 */ 83, 84, 85, 86, 87, 219, 4, 138, 139, 62,
- /* 1180 */ 63, 64, 65, 25, 97, 68, 69, 70, 71, 72,
- /* 1190 */ 73, 74, 75, 243, 77, 78, 79, 80, 81, 82,
- /* 1200 */ 83, 84, 85, 86, 87, 185, 13, 185, 197, 96,
- /* 1210 */ 13, 62, 63, 64, 65, 98, 205, 68, 69, 70,
- /* 1220 */ 71, 72, 73, 74, 75, 97, 77, 78, 79, 80,
- /* 1230 */ 81, 82, 83, 84, 85, 86, 87, 55, 89, 219,
- /* 1240 */ 4, 219, 62, 63, 64, 65, 30, 89, 68, 69,
- /* 1250 */ 70, 71, 72, 73, 74, 75, 144, 77, 78, 79,
- /* 1260 */ 80, 81, 82, 83, 84, 85, 86, 87, 99, 89,
- /* 1270 */ 99, 89, 104, 101, 62, 63, 64, 65, 106, 107,
- /* 1280 */ 68, 69, 70, 71, 72, 73, 74, 75, 191, 77,
- /* 1290 */ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
- /* 1300 */ 4, 62, 63, 64, 65, 4, 83, 68, 69, 70,
- /* 1310 */ 71, 72, 73, 74, 75, 177, 77, 78, 79, 80,
- /* 1320 */ 81, 82, 83, 84, 85, 86, 87, 4, 190, 4,
- /* 1330 */ 96, 191, 235, 201, 162, 201, 198, 199, 15, 63,
- /* 1340 */ 64, 65, 106, 107, 68, 69, 70, 71, 72, 73,
- /* 1350 */ 74, 75, 4, 77, 78, 79, 80, 81, 82, 83,
- /* 1360 */ 84, 85, 86, 87, 177, 42, 177, 97, 177, 4,
- /* 1370 */ 232, 233, 177, 186, 187, 235, 97, 190, 177, 190,
- /* 1380 */ 185, 190, 59, 104, 252, 190, 252, 64, 152, 251,
- /* 1390 */ 97, 190, 135, 198, 199, 177, 209, 104, 211, 198,
- /* 1400 */ 199, 212, 106, 4, 81, 82, 96, 106, 190, 177,
- /* 1410 */ 4, 88, 191, 117, 219, 97, 198, 199, 117, 96,
- /* 1420 */ 97, 15, 190, 177, 101, 100, 103, 232, 233, 106,
- /* 1430 */ 107, 106, 107, 232, 111, 4, 190, 177, 4, 97,
- /* 1440 */ 4, 118, 119, 120, 121, 17, 251, 258, 42, 101,
- /* 1450 */ 190, 97, 251, 4, 106, 107, 235, 97, 198, 199,
- /* 1460 */ 177, 38, 244, 4, 104, 59, 101, 276, 96, 251,
- /* 1470 */ 64, 106, 107, 190, 4, 152, 4, 154, 155, 156,
- /* 1480 */ 132, 198, 199, 118, 6, 4, 191, 81, 82, 243,
- /* 1490 */ 38, 96, 96, 4, 88, 97, 96, 177, 38, 100,
- /* 1500 */ 101, 181, 96, 97, 15, 106, 107, 101, 276, 103,
- /* 1510 */ 190, 251, 106, 107, 254, 232, 4, 111, 4, 129,
- /* 1520 */ 4, 96, 115, 177, 118, 119, 120, 121, 64, 4,
- /* 1530 */ 235, 42, 101, 103, 251, 101, 190, 106, 107, 98,
- /* 1540 */ 106, 107, 106, 107, 198, 199, 4, 252, 59, 118,
- /* 1550 */ 101, 177, 118, 64, 4, 106, 107, 12, 152, 4,
- /* 1560 */ 154, 155, 156, 4, 190, 106, 107, 118, 98, 123,
- /* 1570 */ 81, 82, 128, 101, 142, 4, 106, 88, 106, 107,
- /* 1580 */ 71, 177, 101, 89, 4, 96, 15, 106, 107, 139,
- /* 1590 */ 101, 132, 103, 157, 190, 106, 107, 251, 71, 177,
- /* 1600 */ 111, 4, 198, 199, 153, 133, 89, 118, 119, 120,
- /* 1610 */ 121, 141, 190, 42, 22, 101, 91, 101, 106, 107,
- /* 1620 */ 106, 107, 106, 107, 177, 177, 4, 146, 181, 47,
- /* 1630 */ 59, 106, 107, 91, 118, 64, 4, 190, 190, 127,
- /* 1640 */ 39, 152, 104, 154, 155, 156, 39, 158, 106, 107,
- /* 1650 */ 91, 177, 81, 82, 161, 251, 106, 107, 4, 88,
- /* 1660 */ 212, 106, 107, 177, 190, 106, 107, 96, 97, 15,
- /* 1670 */ 123, 96, 101, 118, 103, 177, 190, 106, 107, 165,
- /* 1680 */ 177, 96, 111, 95, 198, 199, 106, 107, 190, 118,
- /* 1690 */ 119, 120, 121, 190, 4, 177, 42, 143, 103, 97,
- /* 1700 */ 97, 198, 199, 106, 107, 95, 258, 177, 190, 177,
- /* 1710 */ 236, 237, 93, 59, 164, 37, 198, 199, 64, 36,
- /* 1720 */ 190, 141, 190, 152, 189, 154, 155, 156, 106, 107,
- /* 1730 */ 198, 199, 252, 4, 238, 81, 82, 251, 106, 107,
- /* 1740 */ 4, 204, 88, 146, 204, 177, 177, 4, 273, 177,
- /* 1750 */ 96, 15, 275, 176, 251, 101, 90, 103, 190, 190,
- /* 1760 */ 106, 107, 190, 177, 177, 111, 198, 199, 146, 251,
- /* 1770 */ 198, 199, 118, 119, 120, 121, 190, 190, 42, 4,
- /* 1780 */ 275, 176, 4, 251, 152, 198, 199, 176, 49, 177,
- /* 1790 */ 7, 177, 176, 181, 11, 59, 106, 107, 177, 104,
- /* 1800 */ 64, 4, 190, 177, 190, 4, 152, 181, 154, 155,
- /* 1810 */ 156, 190, 198, 199, 4, 32, 190, 81, 82, 251,
- /* 1820 */ 178, 177, 4, 251, 88, 181, 178, 177, 183, 100,
- /* 1830 */ 60, 181, 96, 15, 190, 106, 107, 101, 251, 103,
- /* 1840 */ 190, 4, 106, 107, 180, 184, 177, 111, 221, 106,
- /* 1850 */ 107, 56, 162, 138, 118, 119, 120, 121, 177, 190,
- /* 1860 */ 42, 118, 177, 177, 243, 251, 181, 198, 199, 151,
- /* 1870 */ 177, 190, 148, 177, 181, 190, 190, 59, 227, 198,
- /* 1880 */ 199, 106, 107, 190, 106, 107, 190, 228, 152, 177,
- /* 1890 */ 154, 155, 156, 118, 198, 199, 118, 229, 177, 81,
- /* 1900 */ 82, 4, 190, 106, 107, 177, 88, 106, 107, 177,
- /* 1910 */ 100, 190, 230, 149, 96, 118, 106, 107, 190, 101,
- /* 1920 */ 251, 103, 190, 237, 106, 107, 198, 199, 177, 111,
- /* 1930 */ 198, 199, 251, 177, 133, 177, 118, 119, 120, 121,
- /* 1940 */ 177, 190, 4, 106, 107, 177, 190, 251, 190, 198,
- /* 1950 */ 199, 4, 147, 190, 198, 199, 198, 199, 190, 4,
- /* 1960 */ 87, 198, 199, 177, 177, 231, 198, 199, 4, 177,
- /* 1970 */ 152, 150, 154, 155, 156, 252, 190, 190, 4, 251,
- /* 1980 */ 177, 177, 190, 251, 198, 199, 177, 203, 177, 152,
- /* 1990 */ 198, 199, 181, 190, 190, 64, 259, 96, 87, 190,
- /* 2000 */ 177, 190, 251, 106, 107, 177, 158, 251, 255, 251,
- /* 2010 */ 177, 177, 177, 190, 251, 118, 177, 177, 190, 251,
- /* 2020 */ 177, 198, 199, 190, 190, 190, 241, 177, 203, 190,
- /* 2030 */ 190, 198, 199, 190, 177, 177, 177, 251, 198, 199,
- /* 2040 */ 190, 198, 199, 251, 106, 107, 177, 190, 190, 190,
- /* 2050 */ 99, 177, 99, 106, 107, 198, 199, 198, 199, 190,
- /* 2060 */ 241, 106, 107, 177, 190, 118, 177, 198, 199, 223,
- /* 2070 */ 106, 107, 198, 199, 251, 4, 190, 177, 200, 190,
- /* 2080 */ 106, 107, 118, 177, 251, 4, 123, 198, 199, 4,
- /* 2090 */ 190, 251, 118, 200, 251, 208, 190, 139, 198, 199,
- /* 2100 */ 177, 177, 177, 165, 198, 199, 177, 31, 251, 200,
- /* 2110 */ 251, 122, 202, 190, 190, 190, 177, 177, 163, 190,
- /* 2120 */ 251, 198, 199, 198, 199, 251, 177, 198, 199, 190,
- /* 2130 */ 190, 177, 200, 177, 208, 200, 177, 198, 199, 190,
- /* 2140 */ 251, 200, 200, 200, 190, 177, 190, 198, 199, 190,
- /* 2150 */ 177, 251, 198, 199, 198, 199, 177, 251, 190, 241,
- /* 2160 */ 177, 99, 177, 190, 203, 203, 198, 199, 180, 190,
- /* 2170 */ 177, 198, 199, 190, 251, 190, 251, 106, 107, 203,
- /* 2180 */ 251, 100, 177, 190, 180, 177, 99, 106, 107, 177,
- /* 2190 */ 251, 106, 107, 177, 99, 190, 177, 264, 190, 27,
- /* 2200 */ 251, 241, 190, 158, 99, 251, 190, 251, 227, 190,
- /* 2210 */ 265, 215, 62, 99, 99, 250, 96, 215, 180, 251,
- /* 2220 */ 99, 241, 227, 152, 251, 241, 180, 99, 217, 60,
- /* 2230 */ 99, 217, 99, 99, 217, 217, 99, 152, 241, 99,
- /* 2240 */ 268, 18, 241, 268, 99, 99, 99, 241, 270, 16,
- /* 2250 */ 224, 226, 261, 261, 201, 256, 201, 242, 206, 210,
- /* 2260 */ 240, 202, 227, 242, 242, 175, 224, 239, 191, 191,
- /* 2270 */ 191, 191, 262, 222, 216, 207, 263, 253, 211, 207,
- /* 2280 */ 207, 274, 198, 55, 198,
+ /* 70 */ 74, 75, 104, 77, 78, 79, 80, 81, 82, 83,
+ /* 80 */ 84, 85, 86, 87, 88, 4, 185, 177, 4, 66,
+ /* 90 */ 67, 4, 96, 4, 97, 93, 15, 101, 261, 103,
+ /* 100 */ 190, 104, 106, 107, 105, 106, 107, 111, 109, 64,
+ /* 110 */ 142, 112, 113, 114, 118, 119, 120, 121, 5, 218,
+ /* 120 */ 219, 96, 4, 42, 83, 84, 85, 86, 87, 130,
+ /* 130 */ 106, 107, 87, 34, 138, 139, 51, 191, 53, 26,
+ /* 140 */ 59, 28, 118, 86, 87, 64, 245, 246, 152, 248,
+ /* 150 */ 154, 155, 123, 157, 109, 110, 111, 112, 113, 114,
+ /* 160 */ 115, 48, 81, 82, 83, 81, 82, 266, 267, 88,
+ /* 170 */ 89, 4, 143, 4, 129, 61, 152, 96, 97, 185,
+ /* 180 */ 95, 235, 101, 96, 103, 104, 276, 106, 107, 252,
+ /* 190 */ 106, 107, 111, 106, 110, 106, 107, 4, 252, 118,
+ /* 200 */ 119, 120, 121, 119, 120, 4, 269, 123, 177, 125,
+ /* 210 */ 96, 97, 218, 219, 4, 134, 15, 136, 137, 101,
+ /* 220 */ 0, 190, 123, 142, 106, 107, 195, 196, 147, 148,
+ /* 230 */ 149, 150, 151, 152, 97, 154, 155, 99, 157, 245,
+ /* 240 */ 246, 152, 248, 42, 4, 25, 161, 77, 78, 79,
+ /* 250 */ 80, 81, 82, 83, 84, 85, 86, 87, 205, 206,
+ /* 260 */ 59, 267, 19, 104, 106, 64, 213, 24, 101, 111,
+ /* 270 */ 101, 19, 29, 106, 107, 106, 107, 119, 120, 121,
+ /* 280 */ 162, 29, 81, 82, 117, 118, 23, 118, 61, 88,
+ /* 290 */ 89, 260, 261, 134, 101, 136, 137, 96, 97, 106,
+ /* 300 */ 107, 225, 101, 4, 103, 104, 96, 106, 107, 89,
+ /* 310 */ 234, 101, 111, 146, 45, 146, 106, 107, 55, 118,
+ /* 320 */ 119, 120, 121, 96, 97, 23, 177, 97, 118, 177,
+ /* 330 */ 99, 104, 33, 34, 104, 134, 96, 136, 137, 190,
+ /* 340 */ 99, 101, 190, 133, 195, 196, 106, 107, 147, 148,
+ /* 350 */ 149, 150, 89, 152, 135, 154, 155, 164, 157, 140,
+ /* 360 */ 4, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ /* 370 */ 71, 72, 73, 74, 75, 4, 77, 78, 79, 80,
+ /* 380 */ 81, 82, 83, 84, 85, 86, 87, 4, 50, 83,
+ /* 390 */ 4, 177, 54, 124, 125, 126, 182, 98, 15, 247,
+ /* 400 */ 186, 187, 177, 177, 190, 106, 99, 138, 139, 260,
+ /* 410 */ 261, 62, 63, 64, 65, 190, 190, 68, 69, 70,
+ /* 420 */ 71, 72, 73, 74, 75, 42, 77, 78, 79, 80,
+ /* 430 */ 81, 82, 83, 84, 85, 86, 87, 4, 89, 83,
+ /* 440 */ 141, 135, 59, 119, 120, 59, 140, 64, 177, 220,
+ /* 450 */ 221, 113, 223, 104, 109, 9, 7, 112, 113, 114,
+ /* 460 */ 11, 190, 106, 107, 81, 82, 20, 81, 82, 198,
+ /* 470 */ 199, 88, 89, 102, 118, 130, 4, 106, 107, 96,
+ /* 480 */ 97, 32, 96, 258, 101, 104, 103, 104, 107, 106,
+ /* 490 */ 107, 96, 106, 98, 111, 4, 111, 111, 58, 161,
+ /* 500 */ 151, 118, 119, 120, 121, 119, 120, 121, 152, 194,
+ /* 510 */ 195, 196, 172, 173, 33, 34, 97, 134, 96, 136,
+ /* 520 */ 137, 40, 251, 104, 253, 144, 145, 51, 177, 53,
+ /* 530 */ 147, 98, 149, 150, 104, 152, 185, 154, 155, 106,
+ /* 540 */ 157, 190, 104, 62, 63, 64, 65, 66, 67, 68,
+ /* 550 */ 69, 70, 71, 72, 73, 74, 75, 25, 77, 78,
+ /* 560 */ 79, 80, 81, 82, 83, 84, 85, 86, 87, 9,
+ /* 570 */ 219, 95, 100, 101, 141, 4, 261, 4, 106, 107,
+ /* 580 */ 20, 151, 4, 97, 4, 104, 97, 236, 237, 4,
+ /* 590 */ 104, 100, 101, 33, 34, 64, 65, 106, 107, 68,
+ /* 600 */ 69, 70, 71, 72, 73, 74, 75, 167, 77, 78,
+ /* 610 */ 79, 80, 81, 82, 83, 84, 85, 86, 87, 33,
+ /* 620 */ 34, 89, 62, 63, 64, 65, 66, 67, 68, 69,
+ /* 630 */ 70, 71, 72, 73, 74, 75, 96, 77, 78, 79,
+ /* 640 */ 80, 81, 82, 83, 84, 85, 86, 87, 62, 63,
+ /* 650 */ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
+ /* 660 */ 74, 75, 4, 77, 78, 79, 80, 81, 82, 83,
+ /* 670 */ 84, 85, 86, 87, 33, 34, 91, 106, 107, 106,
+ /* 680 */ 107, 101, 272, 273, 106, 107, 106, 107, 179, 116,
+ /* 690 */ 188, 106, 107, 191, 192, 193, 97, 158, 127, 160,
+ /* 700 */ 55, 43, 97, 62, 63, 64, 65, 66, 67, 68,
+ /* 710 */ 69, 70, 71, 72, 73, 74, 75, 12, 77, 78,
+ /* 720 */ 79, 80, 81, 82, 83, 84, 85, 86, 87, 62,
+ /* 730 */ 63, 64, 65, 97, 156, 68, 69, 70, 71, 72,
+ /* 740 */ 73, 74, 75, 163, 77, 78, 79, 80, 81, 82,
+ /* 750 */ 83, 84, 85, 86, 87, 110, 89, 97, 100, 170,
+ /* 760 */ 171, 172, 173, 61, 106, 107, 257, 62, 63, 64,
+ /* 770 */ 65, 104, 61, 68, 69, 70, 71, 72, 73, 74,
+ /* 780 */ 75, 96, 77, 78, 79, 80, 81, 82, 83, 84,
+ /* 790 */ 85, 86, 87, 97, 89, 38, 4, 111, 96, 97,
+ /* 800 */ 104, 4, 124, 125, 126, 191, 104, 96, 97, 197,
+ /* 810 */ 177, 4, 81, 82, 181, 129, 4, 205, 151, 62,
+ /* 820 */ 63, 64, 65, 190, 4, 68, 69, 70, 71, 72,
+ /* 830 */ 73, 74, 75, 97, 77, 78, 79, 80, 81, 82,
+ /* 840 */ 83, 84, 85, 86, 87, 4, 89, 55, 4, 235,
+ /* 850 */ 119, 120, 62, 63, 64, 65, 15, 104, 68, 69,
+ /* 860 */ 70, 71, 72, 73, 74, 75, 201, 77, 78, 79,
+ /* 870 */ 80, 81, 82, 83, 84, 85, 86, 87, 190, 104,
+ /* 880 */ 4, 138, 139, 42, 71, 4, 198, 98, 96, 97,
+ /* 890 */ 169, 220, 221, 101, 223, 174, 55, 122, 106, 107,
+ /* 900 */ 59, 97, 177, 106, 107, 64, 185, 100, 104, 96,
+ /* 910 */ 118, 186, 187, 106, 107, 190, 96, 252, 106, 107,
+ /* 920 */ 249, 101, 81, 82, 96, 133, 106, 107, 97, 88,
+ /* 930 */ 138, 139, 4, 177, 209, 5, 211, 96, 118, 218,
+ /* 940 */ 219, 177, 101, 146, 103, 101, 190, 106, 107, 159,
+ /* 950 */ 106, 107, 111, 133, 190, 185, 26, 30, 28, 118,
+ /* 960 */ 119, 120, 121, 177, 144, 145, 245, 246, 177, 248,
+ /* 970 */ 191, 55, 91, 177, 162, 45, 190, 101, 48, 138,
+ /* 980 */ 139, 190, 106, 107, 198, 199, 190, 106, 107, 219,
+ /* 990 */ 146, 64, 271, 152, 118, 154, 155, 97, 157, 98,
+ /* 1000 */ 62, 63, 64, 65, 104, 89, 68, 69, 70, 71,
+ /* 1010 */ 72, 73, 74, 75, 235, 77, 78, 79, 80, 81,
+ /* 1020 */ 82, 83, 84, 85, 86, 87, 4, 236, 237, 4,
+ /* 1030 */ 244, 191, 192, 193, 106, 107, 98, 251, 34, 243,
+ /* 1040 */ 276, 97, 62, 63, 64, 65, 118, 201, 68, 69,
+ /* 1050 */ 70, 71, 72, 73, 74, 75, 96, 77, 78, 79,
+ /* 1060 */ 80, 81, 82, 83, 84, 85, 86, 87, 64, 62,
+ /* 1070 */ 63, 64, 65, 13, 146, 68, 69, 70, 71, 72,
+ /* 1080 */ 73, 74, 75, 177, 77, 78, 79, 80, 81, 82,
+ /* 1090 */ 83, 84, 85, 86, 87, 104, 190, 13, 252, 62,
+ /* 1100 */ 63, 64, 65, 104, 97, 68, 69, 70, 71, 72,
+ /* 1110 */ 73, 74, 75, 91, 77, 78, 79, 80, 81, 82,
+ /* 1120 */ 83, 84, 85, 86, 87, 96, 13, 123, 106, 107,
+ /* 1130 */ 185, 106, 107, 129, 97, 62, 63, 64, 65, 159,
+ /* 1140 */ 30, 68, 69, 70, 71, 72, 73, 74, 75, 243,
+ /* 1150 */ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+ /* 1160 */ 87, 185, 4, 97, 219, 62, 63, 64, 65, 144,
+ /* 1170 */ 97, 68, 69, 70, 71, 72, 73, 74, 75, 177,
+ /* 1180 */ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+ /* 1190 */ 87, 97, 190, 185, 144, 219, 99, 62, 63, 64,
+ /* 1200 */ 65, 98, 83, 68, 69, 70, 71, 72, 73, 74,
+ /* 1210 */ 75, 99, 77, 78, 79, 80, 81, 82, 83, 84,
+ /* 1220 */ 85, 86, 87, 185, 89, 97, 4, 219, 62, 63,
+ /* 1230 */ 64, 65, 104, 104, 68, 69, 70, 71, 72, 73,
+ /* 1240 */ 74, 75, 96, 77, 78, 79, 80, 81, 82, 83,
+ /* 1250 */ 84, 85, 86, 87, 4, 89, 97, 219, 4, 101,
+ /* 1260 */ 62, 63, 64, 65, 106, 107, 68, 69, 70, 71,
+ /* 1270 */ 72, 73, 74, 75, 4, 77, 78, 79, 80, 81,
+ /* 1280 */ 82, 83, 84, 85, 86, 87, 4, 62, 63, 64,
+ /* 1290 */ 65, 133, 4, 68, 69, 70, 71, 72, 73, 74,
+ /* 1300 */ 75, 177, 77, 78, 79, 80, 81, 82, 83, 84,
+ /* 1310 */ 85, 86, 87, 4, 190, 97, 185, 135, 158, 96,
+ /* 1320 */ 17, 191, 104, 101, 15, 63, 64, 65, 106, 107,
+ /* 1330 */ 68, 69, 70, 71, 72, 73, 74, 75, 38, 77,
+ /* 1340 */ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
+ /* 1350 */ 219, 42, 4, 214, 132, 216, 106, 107, 177, 96,
+ /* 1360 */ 106, 107, 177, 4, 177, 235, 185, 243, 59, 6,
+ /* 1370 */ 185, 190, 118, 64, 97, 190, 106, 190, 108, 198,
+ /* 1380 */ 199, 104, 4, 198, 199, 198, 199, 133, 106, 101,
+ /* 1390 */ 81, 82, 97, 97, 106, 107, 4, 88, 177, 117,
+ /* 1400 */ 219, 97, 152, 97, 219, 96, 97, 15, 104, 97,
+ /* 1410 */ 101, 190, 103, 232, 233, 106, 107, 232, 177, 232,
+ /* 1420 */ 111, 214, 177, 216, 4, 96, 177, 118, 119, 120,
+ /* 1430 */ 121, 190, 251, 4, 42, 190, 251, 14, 251, 190,
+ /* 1440 */ 4, 97, 38, 198, 199, 96, 177, 198, 199, 177,
+ /* 1450 */ 97, 59, 96, 165, 106, 107, 64, 38, 35, 190,
+ /* 1460 */ 4, 152, 190, 154, 155, 106, 157, 198, 199, 46,
+ /* 1470 */ 198, 199, 4, 81, 82, 96, 117, 232, 233, 4,
+ /* 1480 */ 88, 232, 233, 115, 106, 107, 4, 129, 96, 97,
+ /* 1490 */ 15, 64, 144, 101, 177, 103, 251, 103, 106, 107,
+ /* 1500 */ 251, 232, 12, 111, 4, 177, 4, 190, 98, 177,
+ /* 1510 */ 118, 119, 120, 121, 186, 187, 244, 42, 190, 141,
+ /* 1520 */ 251, 4, 190, 251, 123, 142, 106, 107, 177, 71,
+ /* 1530 */ 71, 128, 139, 153, 59, 106, 107, 101, 118, 64,
+ /* 1540 */ 4, 190, 106, 107, 152, 116, 154, 155, 4, 157,
+ /* 1550 */ 89, 128, 177, 89, 118, 22, 81, 82, 47, 91,
+ /* 1560 */ 39, 4, 106, 88, 177, 190, 146, 177, 181, 237,
+ /* 1570 */ 104, 96, 15, 117, 106, 107, 101, 190, 103, 177,
+ /* 1580 */ 190, 106, 107, 101, 177, 177, 111, 4, 106, 107,
+ /* 1590 */ 39, 177, 190, 118, 119, 120, 121, 190, 190, 42,
+ /* 1600 */ 118, 101, 212, 101, 190, 161, 106, 107, 106, 107,
+ /* 1610 */ 123, 103, 198, 199, 95, 177, 59, 4, 118, 181,
+ /* 1620 */ 118, 64, 4, 106, 107, 96, 143, 152, 190, 154,
+ /* 1630 */ 155, 96, 157, 158, 177, 118, 97, 97, 81, 82,
+ /* 1640 */ 95, 93, 106, 107, 4, 88, 177, 190, 258, 177,
+ /* 1650 */ 106, 107, 37, 96, 97, 15, 36, 252, 101, 190,
+ /* 1660 */ 103, 273, 190, 106, 107, 251, 177, 189, 111, 212,
+ /* 1670 */ 198, 199, 177, 4, 204, 118, 119, 120, 121, 190,
+ /* 1680 */ 4, 177, 42, 238, 204, 190, 4, 198, 199, 106,
+ /* 1690 */ 107, 275, 177, 177, 190, 177, 152, 181, 176, 59,
+ /* 1700 */ 164, 118, 198, 199, 64, 190, 190, 275, 190, 152,
+ /* 1710 */ 176, 154, 155, 4, 157, 258, 198, 199, 100, 106,
+ /* 1720 */ 107, 81, 82, 251, 106, 107, 4, 90, 88, 177,
+ /* 1730 */ 176, 118, 177, 4, 178, 177, 96, 15, 49, 177,
+ /* 1740 */ 251, 101, 190, 103, 176, 190, 106, 107, 190, 177,
+ /* 1750 */ 177, 111, 190, 198, 199, 251, 198, 199, 118, 119,
+ /* 1760 */ 120, 121, 190, 190, 42, 177, 177, 177, 60, 251,
+ /* 1770 */ 181, 198, 199, 178, 212, 106, 107, 177, 190, 190,
+ /* 1780 */ 190, 59, 106, 107, 212, 180, 64, 183, 106, 107,
+ /* 1790 */ 190, 104, 152, 184, 154, 155, 64, 157, 198, 199,
+ /* 1800 */ 118, 132, 56, 81, 82, 87, 251, 254, 4, 251,
+ /* 1810 */ 88, 252, 221, 177, 158, 106, 107, 181, 96, 15,
+ /* 1820 */ 258, 177, 146, 101, 251, 103, 190, 118, 106, 107,
+ /* 1830 */ 258, 177, 177, 111, 190, 106, 107, 177, 138, 227,
+ /* 1840 */ 118, 119, 120, 121, 190, 190, 42, 118, 177, 151,
+ /* 1850 */ 190, 251, 181, 198, 199, 8, 228, 10, 177, 12,
+ /* 1860 */ 177, 190, 181, 59, 4, 177, 149, 148, 21, 181,
+ /* 1870 */ 23, 190, 229, 190, 152, 230, 154, 155, 190, 157,
+ /* 1880 */ 177, 198, 199, 231, 181, 81, 82, 203, 41, 150,
+ /* 1890 */ 4, 44, 88, 190, 147, 48, 49, 96, 259, 52,
+ /* 1900 */ 96, 87, 55, 177, 57, 101, 251, 103, 203, 241,
+ /* 1910 */ 106, 107, 4, 177, 177, 111, 190, 177, 99, 177,
+ /* 1920 */ 223, 139, 118, 119, 120, 121, 190, 190, 200, 177,
+ /* 1930 */ 190, 177, 190, 177, 251, 198, 199, 241, 99, 92,
+ /* 1940 */ 4, 94, 190, 123, 190, 200, 190, 177, 200, 177,
+ /* 1950 */ 198, 199, 198, 199, 198, 199, 152, 208, 154, 155,
+ /* 1960 */ 190, 157, 190, 31, 177, 202, 106, 107, 198, 199,
+ /* 1970 */ 198, 199, 4, 122, 4, 200, 177, 190, 131, 203,
+ /* 1980 */ 200, 208, 177, 200, 200, 198, 199, 177, 251, 190,
+ /* 1990 */ 200, 203, 106, 107, 241, 190, 99, 198, 199, 177,
+ /* 2000 */ 190, 180, 99, 251, 118, 251, 177, 251, 198, 199,
+ /* 2010 */ 203, 177, 190, 166, 106, 107, 4, 180, 177, 190,
+ /* 2020 */ 241, 251, 264, 251, 190, 165, 118, 198, 199, 99,
+ /* 2030 */ 4, 190, 198, 199, 27, 177, 177, 158, 251, 198,
+ /* 2040 */ 199, 177, 106, 107, 99, 227, 177, 177, 190, 190,
+ /* 2050 */ 251, 177, 177, 215, 190, 62, 198, 199, 177, 190,
+ /* 2060 */ 190, 251, 198, 199, 190, 190, 177, 198, 199, 177,
+ /* 2070 */ 96, 190, 198, 199, 106, 107, 106, 107, 4, 190,
+ /* 2080 */ 251, 4, 190, 177, 99, 251, 118, 198, 199, 177,
+ /* 2090 */ 198, 199, 251, 177, 177, 265, 190, 4, 99, 163,
+ /* 2100 */ 177, 4, 190, 133, 198, 199, 190, 190, 4, 251,
+ /* 2110 */ 198, 199, 100, 190, 177, 251, 250, 177, 106, 107,
+ /* 2120 */ 251, 198, 199, 4, 177, 251, 215, 190, 177, 177,
+ /* 2130 */ 190, 177, 106, 107, 177, 198, 199, 190, 198, 199,
+ /* 2140 */ 251, 190, 190, 251, 190, 198, 199, 190, 177, 198,
+ /* 2150 */ 199, 241, 198, 199, 177, 198, 199, 251, 180, 99,
+ /* 2160 */ 227, 190, 180, 251, 177, 241, 99, 190, 60, 198,
+ /* 2170 */ 199, 99, 217, 217, 251, 198, 199, 190, 152, 99,
+ /* 2180 */ 106, 107, 217, 106, 107, 198, 199, 99, 251, 217,
+ /* 2190 */ 99, 251, 118, 100, 241, 99, 177, 268, 251, 106,
+ /* 2200 */ 107, 18, 251, 106, 107, 251, 268, 241, 251, 190,
+ /* 2210 */ 106, 107, 99, 99, 241, 99, 270, 198, 199, 16,
+ /* 2220 */ 224, 226, 251, 261, 105, 106, 107, 206, 251, 152,
+ /* 2230 */ 255, 201, 240, 242, 201, 210, 202, 261, 251, 242,
+ /* 2240 */ 242, 227, 224, 175, 191, 191, 191, 191, 262, 152,
+ /* 2250 */ 256, 263, 216, 222, 239, 207, 207, 207, 274, 198,
+ /* 2260 */ 198, 55, 211, 277, 277, 277, 277, 277, 277, 277,
+ /* 2270 */ 251,
};
-#define YY_SHIFT_USE_DFLT (-81)
+#define YY_SHIFT_USE_DFLT (-110)
#define YY_SHIFT_COUNT (435)
-#define YY_SHIFT_MIN (-80)
-#define YY_SHIFT_MAX (2233)
+#define YY_SHIFT_MIN (-109)
+#define YY_SHIFT_MAX (2206)
static const short yy_shift_ofst[] = {
- /* 0 */ 1158, -4, 201, 1182, 819, 1571, 1571, 689, 361, 1489,
- /* 10 */ 1654, 1654, 1654, 770, 364, 364, 157, 81, 179, 1406,
- /* 20 */ 1323, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654,
- /* 30 */ 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654,
- /* 40 */ 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654,
- /* 50 */ 1654, 1654, 1654, 1654, 1654, 1654, 1736, 1654, 1818, 370,
- /* 60 */ 798, 181, 370, 1837, 1837, 1837, 1837, 887, 887, 565,
- /* 70 */ 277, 4, 1516, 1514, 1481, 1472, 1449, 1434, 1431, 1365,
- /* 80 */ 1348, 448, 1399, 2071, 2071, 2085, 439, 2071, 2081, 1837,
- /* 90 */ 565, 1039, 538, 538, 735, 84, 44, 171, 859, 775,
- /* 100 */ 906, 773, 910, 636, 1172, 5, 450, 5, 443, 413,
- /* 110 */ 185, 1729, 1974, 1955, 1938, 1622, 1801, 1964, 1810, 1797,
- /* 120 */ 1690, 1947, 1632, 1897, 1778, 1555, 1550, 1459, 1325, 1775,
- /* 130 */ 1047, 1512, 1743, 902, 140, 1470, 1470, 1597, 1580, 1470,
- /* 140 */ 1236, 780, 1436, 349, 562, 216, 620, 1559, 1542, 1525,
- /* 150 */ 90, 829, 829, 829, 872, 544, 2228, 2228, 2228, 2228,
- /* 160 */ 2228, -81, -81, 459, 619, 619, 619, 619, 619, 619,
- /* 170 */ 619, 619, 619, 645, 327, 683, 1180, 1149, 1117, 1087,
- /* 180 */ 1051, 1021, 985, 958, 916, 767, 1239, 1212, 1276, 509,
- /* 190 */ 509, -60, -38, -38, -38, -38, 578, -80, 314, 87,
- /* 200 */ 87, 41, 155, 75, 58, 58, 58, -6, 186, 862,
- /* 210 */ -47, 808, 1783, 1301, 1296, 206, 908, 424, 400, 25,
- /* 220 */ 729, 729, 679, 1360, -2, 855, 729, 442, 346, 855,
- /* 230 */ 750, 750, 187, -9, 169, 2233, 2147, 2146, 2145, 2223,
- /* 240 */ 2223, 2140, 2137, 2169, 2134, 2169, 2133, 2169, 2131, 2169,
- /* 250 */ 2128, 1770, 1718, 2121, 1770, 2150, 2120, 2115, 2114, 2150,
- /* 260 */ 1718, 2105, 2045, 2172, 2095, 1770, 2087, 1901, 1770, 2062,
- /* 270 */ 1901, 1963, 1963, 1963, 1963, 2076, 1901, 1963, 1989, 1963,
- /* 280 */ 2076, 1963, 1963, 1958, 1953, 1951, 1848, 1901, 1911, 1901,
- /* 290 */ 1931, 1873, 1821, 1805, 1764, 1724, 1718, 1715, 1795, 1695,
- /* 300 */ 1770, 1739, 1739, 1666, 1666, 1666, 1666, -81, -81, -81,
- /* 310 */ -81, -81, -81, -81, -81, -81, -81, 564, 79, 158,
- /* 320 */ 45, 702, 243, -49, 398, 1293, 1279, 1042, 984, 788,
- /* 330 */ 2, 471, -20, 758, 678, 344, 144, -44, 1683, 1678,
- /* 340 */ 1619, 1610, 1603, 1602, 1595, 1585, 1554, 1588, 1575, 1547,
- /* 350 */ 1493, 1607, 1538, 1601, 1582, 1592, 1517, 1494, 1450, 1451,
- /* 360 */ 1527, 1509, 1444, 1432, 1545, 1446, 1441, 1430, 1464, 1390,
- /* 370 */ 1407, 1425, 1460, 1400, 1396, 1398, 1395, 1452, 1478, 1372,
- /* 380 */ 1423, 1428, 1354, 1342, 1318, 1168, 1257, 1310, 1270, 1234,
- /* 390 */ 1168, 1223, 1171, 1169, 1112, 1128, 1050, 1216, 1197, 1113,
- /* 400 */ 993, 1193, 1038, 1099, 993, 990, 937, 846, 895, 870,
- /* 410 */ 848, 867, 825, 757, 805, 675, 652, 571, 644, 625,
- /* 420 */ 613, 571, 438, 474, 421, 399, 406, 355, 362, 231,
- /* 430 */ 225, 166, 143, 63, -37, -61,
+ /* 0 */ 532, -4, 1847, 841, 916, 1557, 1557, 263, 383, 1475,
+ /* 10 */ 1722, 1640, 1640, 792, 84, 84, -1, 81, 201, 1392,
+ /* 20 */ 1309, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640,
+ /* 30 */ 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640,
+ /* 40 */ 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640,
+ /* 50 */ 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1804, 2119,
+ /* 60 */ 820, 269, 2119, 2026, 2026, 2026, 2026, 731, 731, 1270,
+ /* 70 */ 299, 210, 1502, 1288, 844, 1158, 1500, 1482, 1436, 876,
+ /* 80 */ 1222, 658, 491, 2077, 2077, 2097, 1004, 2077, 2093, 2026,
+ /* 90 */ 1270, 743, 560, 560, 757, 386, 45, 167, 169, 356,
+ /* 100 */ 1420, 928, 580, 472, 118, 930, 193, 930, 240, 1254,
+ /* 110 */ 24, 2012, 1968, 1936, 1860, 1676, 1970, 2074, 1618, 1908,
+ /* 120 */ 812, 1886, 1544, 1729, 1709, 1682, 1536, 1669, 807, 1613,
+ /* 130 */ 1429, 571, 1583, 1517, 1348, 1025, 433, 433, 797, 1378,
+ /* 140 */ 433, 1250, 578, 89, 573, 371, 338, 1468, 1022, 881,
+ /* 150 */ 585, 2104, 2104, 2104, 220, 645, 2206, 2206, 2206, 2206,
+ /* 160 */ 2206, -110, -110, 481, 641, 641, 641, 641, 641, 641,
+ /* 170 */ 641, 641, 641, 667, 349, 705, 1166, 1135, 1103, 1073,
+ /* 180 */ 1037, 1007, 980, 938, 790, 1225, 1198, 1262, 531, 531,
+ /* 190 */ -60, -38, -38, -38, -38, 170, -77, 345, 158, 158,
+ /* 200 */ 41, 702, 227, 1423, 1423, 1423, 381, 159, 113, 23,
+ /* 210 */ 678, 449, 1456, 1359, 87, 1282, 306, 243, 430, 927,
+ /* 220 */ 927, 775, 1304, 99, 446, 927, 29, 446, 324, 324,
+ /* 230 */ -32, 219, 539, 57, 2203, 2116, 2114, 2113, 2183, 2183,
+ /* 240 */ 2096, 2091, 2108, 2088, 2108, 2080, 2108, 2072, 2108, 2067,
+ /* 250 */ 1708, 1698, 2060, 1708, 1993, 1974, 1999, 1985, 1993, 1698,
+ /* 260 */ 1945, 1879, 2007, 1930, 1708, 1903, 1801, 1708, 1897, 1801,
+ /* 270 */ 1820, 1820, 1820, 1820, 1932, 1801, 1820, 1851, 1820, 1932,
+ /* 280 */ 1820, 1820, 1839, 1782, 1819, 1801, 1814, 1801, 1739, 1747,
+ /* 290 */ 1717, 1719, 1698, 1700, 1656, 1732, 1718, 1746, 1687, 1708,
+ /* 300 */ 1689, 1689, 1637, 1637, 1637, 1637, -110, -110, -110, -110,
+ /* 310 */ -110, -110, -110, -110, -110, -110, 586, 85, 711, 114,
+ /* 320 */ -72, 476, 440, 813, 1277, 1218, 1128, 900, 804, -109,
+ /* 330 */ 252, 686, 696, 486, 419, 230, -3, 395, 1620, 1615,
+ /* 340 */ 1548, 1545, 1540, 1539, 1508, 1535, 1483, 1519, 1529, 1487,
+ /* 350 */ 1444, 1551, 1466, 1521, 1511, 1533, 1464, 1461, 1393, 1380,
+ /* 360 */ 1459, 1458, 1403, 1383, 1490, 1401, 1410, 1394, 1427, 1358,
+ /* 370 */ 1368, 1379, 1419, 1356, 1349, 1353, 1329, 1404, 1363, 1263,
+ /* 380 */ 1300, 1303, 1344, 1312, 1306, 1296, 1160, 1295, 1129, 1182,
+ /* 390 */ 1223, 999, 1159, 1146, 1129, 1119, 1112, 1097, 1050, 1094,
+ /* 400 */ 1066, 1110, 1113, 1029, 999, 1084, 991, 1060, 944, 960,
+ /* 410 */ 901, 753, 831, 828, 789, 753, 736, 685, 660, 636,
+ /* 420 */ 540, 605, 599, 489, 438, 422, 302, 385, 307, 241,
+ /* 430 */ 231, 138, 25, 137, 2, -39,
};
-#define YY_REDUCE_USE_DFLT (-100)
-#define YY_REDUCE_COUNT (316)
-#define YY_REDUCE_MIN (-99)
-#define YY_REDUCE_MAX (2090)
+#define YY_REDUCE_USE_DFLT (-164)
+#define YY_REDUCE_COUNT (315)
+#define YY_REDUCE_MIN (-163)
+#define YY_REDUCE_MAX (2068)
static const short yy_reduce_ofst[] = {
- /* 0 */ 615, 1195, 699, -99, 764, 1138, 189, 705, 1283, 1260,
- /* 10 */ 1218, 1201, 261, 196, 884, 599, 1187, 1973, 1968, 1956,
- /* 20 */ 1954, 1949, 1939, 1929, 1925, 1923, 1906, 1900, 1889, 1874,
- /* 30 */ 1869, 1859, 1857, 1843, 1840, 1833, 1823, 1792, 1786, 1768,
- /* 40 */ 1763, 1758, 1756, 1751, 1732, 1728, 1696, 1681, 1669, 1614,
- /* 50 */ 1587, 1572, 1568, 1532, 1518, 1503, 1486, 1404, 1346, 490,
- /* 60 */ 1474, 214, 769, 1448, 1189, 124, 67, 596, 175, 547,
- /* 70 */ 1295, 1686, 1811, 1693, 1685, 1650, 1644, 1626, 1612, 1447,
- /* 80 */ 1320, 1232, 203, 1621, 1246, 131, 347, 950, 1191, 195,
- /* 90 */ 885, 265, 1134, 1132, 125, 377, 1011, 2019, 2016, 1983,
- /* 100 */ 1803, 1803, 2012, 2008, 2005, 697, 1993, 11, 1803, 1985,
- /* 110 */ 1983, 1979, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1959,
- /* 120 */ 1803, 1803, 1940, 1803, 1803, 1924, 1803, 1803, 1803, 1886,
- /* 130 */ 1858, 1850, 1839, 1835, 1834, 1221, 1140, 1828, 1809, 1097,
- /* 140 */ 1804, 1803, 1787, 1721, 1712, 1586, 632, 1569, 1530, 1498,
- /* 150 */ 1422, 1374, 666, 489, 938, 1022, 1020, 956, 924, 791,
- /* 160 */ 763, 746, 205, 1480, 1480, 1480, 1480, 1480, 1480, 1480,
- /* 170 */ 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480,
- /* 180 */ 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480,
- /* 190 */ 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 2067, 2086,
- /* 200 */ 2084, 1480, 2007, 2007, 2073, 2072, 2068, 2028, 2058, 2024,
- /* 210 */ 2051, 2013, 2010, 2080, 2079, 2078, 2077, 2042, 2090, 2035,
- /* 220 */ 2022, 2021, 2059, 2049, 2052, 2055, 2015, 2020, 1999, 2053,
- /* 230 */ 1992, 1991, 1480, 2025, 2026, 1978, 1918, 2006, 2001, 1975,
- /* 240 */ 1972, 1997, 1918, 2018, 1918, 2017, 1918, 2014, 1918, 2011,
- /* 250 */ 1984, 2046, 1995, 1980, 2038, 2002, 1965, 1918, 1918, 1996,
- /* 260 */ 1981, 1918, 1945, 1933, 1960, 2004, 1918, 1976, 1988, 1918,
- /* 270 */ 1962, 1943, 1942, 1941, 1935, 1926, 1961, 1932, 1910, 1909,
- /* 280 */ 1887, 1893, 1878, 1846, 1819, 1785, 1753, 1825, 1737, 1784,
- /* 290 */ 1723, 1480, 1734, 1682, 1668, 1659, 1651, 1627, 1661, 1645,
- /* 300 */ 1664, 1648, 1642, 1616, 1611, 1605, 1577, 1505, 1477, 1475,
- /* 310 */ 1540, 1537, 1496, 1480, 1480, 1480, 1535,
+ /* 0 */ 589, 1181, 721, 1185, -99, 1249, 1245, -6, 1269, 271,
+ /* 10 */ 1272, 1187, 786, 351, 149, 31, 725, 2019, 1987, 1977,
+ /* 20 */ 1971, 1957, 1954, 1951, 1947, 1940, 1937, 1923, 1912, 1906,
+ /* 30 */ 1892, 1889, 1874, 1869, 1864, 1858, 1841, 1834, 1829, 1810,
+ /* 40 */ 1799, 1787, 1772, 1770, 1756, 1754, 1752, 1737, 1683, 1655,
+ /* 50 */ 1600, 1573, 1558, 1555, 1518, 1504, 1489, 1472, 1414, 214,
+ /* 60 */ 791, 671, 1328, 1572, 1562, 1457, 1390, 315, -163, 502,
+ /* 70 */ -54, 1332, 1703, 1688, 1681, 1671, 1636, 1589, 1516, 1438,
+ /* 80 */ 1387, 764, 633, 1124, 906, 152, 53, 796, -90, 225,
+ /* 90 */ 840, 229, 846, 665, -63, 688, 612, 1952, 1917, 1822,
+ /* 100 */ 1590, 1590, 1916, 1881, 1875, 1207, 1870, 1139, 1859, 1590,
+ /* 110 */ 1822, 1805, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1742,
+ /* 120 */ 1590, 1590, 1740, 1590, 1590, 1736, 1590, 1590, 1590, 1726,
+ /* 130 */ 1660, 1654, 1644, 1590, 1588, 1552, 1130, 779, 1515, 1495,
+ /* 140 */ 614, 1469, 1408, 1407, 1402, 1375, 509, 1351, 1317, 1241,
+ /* 150 */ 1221, 1002, 756, 226, 340, 1131, 1038, 1008, 976, 945,
+ /* 160 */ 770, 410, 76, 1405, 1405, 1405, 1405, 1405, 1405, 1405,
+ /* 170 */ 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405,
+ /* 180 */ 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405,
+ /* 190 */ 1405, 1405, 1405, 1405, 1405, 1405, 1405, 2051, 2062, 2061,
+ /* 200 */ 1405, 1984, 1984, 2050, 2049, 2048, 2015, 2031, 2036, 1994,
+ /* 210 */ 1988, 1986, 2056, 2055, 2054, 2053, 2018, 2068, 2014, 1998,
+ /* 220 */ 1997, 2034, 2025, 2021, 2033, 1991, 1992, 2030, 1976, 1962,
+ /* 230 */ 1995, 1996, 1975, 1405, 1946, 1753, 1973, 1966, 1938, 1929,
+ /* 240 */ 1953, 1753, 1972, 1753, 1965, 1753, 1956, 1753, 1955, 1924,
+ /* 250 */ 1982, 1933, 1910, 1978, 1911, 1866, 1753, 1753, 1838, 1818,
+ /* 260 */ 1753, 1830, 1758, 1779, 1837, 1753, 1807, 1821, 1753, 1788,
+ /* 270 */ 1790, 1784, 1783, 1780, 1773, 1776, 1775, 1763, 1748, 1749,
+ /* 280 */ 1745, 1728, 1696, 1697, 1668, 1705, 1639, 1684, 1652, 1645,
+ /* 290 */ 1643, 1628, 1612, 1591, 1553, 1559, 1405, 1609, 1604, 1605,
+ /* 300 */ 1595, 1556, 1568, 1554, 1534, 1522, 1432, 1416, 1388, 1480,
+ /* 310 */ 1470, 1445, 1405, 1405, 1405, 1478,
};
static const YYACTIONTYPE yy_default[] = {
- /* 0 */ 730, 1038, 1143, 1143, 1027, 1027, 1027, 1143, 1027, 1027,
- /* 10 */ 1027, 1027, 1027, 901, 1149, 1149, 1149, 1027, 1027, 1027,
- /* 20 */ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
- /* 30 */ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
- /* 40 */ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
- /* 50 */ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1016, 1149,
+ /* 0 */ 730, 1038, 1143, 1026, 1143, 1026, 1026, 1143, 1026, 1026,
+ /* 10 */ 1026, 1026, 1026, 901, 1149, 1149, 1149, 1026, 1026, 1026,
+ /* 20 */ 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+ /* 30 */ 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+ /* 40 */ 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+ /* 50 */ 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 978, 1149,
/* 60 */ 895, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 775,
/* 70 */ 891, 901, 1149, 1149, 1149, 1149, 1149, 963, 950, 941,
/* 80 */ 1149, 1149, 1149, 973, 973, 956, 843, 973, 1149, 1149,
- /* 90 */ 1149, 1149, 929, 929, 1028, 1149, 767, 1113, 1118, 1014,
- /* 100 */ 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 902, 1149,
- /* 110 */ 1014, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
+ /* 90 */ 1149, 1149, 929, 929, 1028, 1149, 767, 1113, 1118, 976,
+ /* 100 */ 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 902,
+ /* 110 */ 976, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
/* 120 */ 1149, 964, 957, 951, 942, 1149, 1149, 1149, 1149, 1149,
- /* 130 */ 1149, 1149, 1149, 1149, 1149, 891, 891, 1149, 1149, 891,
- /* 140 */ 1149, 1149, 1149, 1015, 1149, 1149, 764, 1149, 1149, 1149,
+ /* 130 */ 1149, 1149, 1149, 1149, 1149, 1149, 891, 891, 1149, 1149,
+ /* 140 */ 891, 1149, 1149, 977, 1149, 1149, 764, 1149, 1149, 1149,
/* 150 */ 736, 1059, 1149, 1149, 730, 1143, 1143, 1143, 1143, 1143,
- /* 160 */ 1143, 1136, 881, 936, 907, 946, 934, 938, 1039, 1032,
- /* 170 */ 1033, 1031, 937, 1028, 1028, 1028, 1028, 1028, 1028, 1028,
- /* 180 */ 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 989, 1001,
- /* 190 */ 988, 996, 1005, 1000, 997, 991, 990, 992, 1149, 1149,
- /* 200 */ 1149, 993, 1149, 1149, 1149, 1149, 1149, 894, 1149, 1149,
- /* 210 */ 865, 1149, 1087, 1149, 1149, 777, 1149, 879, 739, 945,
- /* 220 */ 919, 919, 810, 834, 799, 929, 919, 909, 1034, 929,
- /* 230 */ 1149, 1149, 994, 892, 879, 1127, 910, 910, 910, 1112,
- /* 240 */ 1112, 910, 910, 856, 910, 856, 910, 856, 910, 856,
- /* 250 */ 910, 761, 945, 910, 761, 847, 969, 910, 910, 847,
- /* 260 */ 945, 910, 1094, 1092, 910, 761, 910, 1047, 761, 910,
- /* 270 */ 1047, 845, 845, 845, 845, 826, 1047, 845, 810, 845,
- /* 280 */ 826, 845, 845, 1149, 910, 910, 1149, 1047, 1053, 1047,
- /* 290 */ 1028, 995, 935, 923, 933, 930, 945, 1149, 758, 829,
- /* 300 */ 761, 747, 747, 735, 735, 735, 735, 1140, 1140, 1136,
- /* 310 */ 812, 812, 897, 1004, 1003, 1002, 786, 1040, 1149, 1149,
- /* 320 */ 1149, 1149, 1149, 1149, 1061, 1149, 1149, 1149, 1149, 1149,
+ /* 160 */ 1143, 1136, 881, 936, 1032, 1033, 907, 946, 1039, 934,
+ /* 170 */ 938, 937, 1031, 1028, 1028, 1028, 1028, 1028, 1028, 1028,
+ /* 180 */ 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1001, 1013, 1000,
+ /* 190 */ 1008, 1009, 1012, 1003, 1017, 1002, 1004, 1149, 1149, 1149,
+ /* 200 */ 1005, 1149, 1149, 1149, 1149, 1149, 894, 865, 1149, 1149,
+ /* 210 */ 1149, 1087, 1149, 1149, 777, 1149, 879, 739, 945, 919,
+ /* 220 */ 919, 810, 834, 799, 929, 919, 909, 929, 1149, 1149,
+ /* 230 */ 892, 879, 1034, 1006, 1127, 910, 910, 910, 1112, 1112,
+ /* 240 */ 910, 910, 856, 910, 856, 910, 856, 910, 856, 910,
+ /* 250 */ 761, 945, 910, 761, 847, 969, 910, 910, 847, 945,
+ /* 260 */ 910, 1094, 1092, 910, 761, 910, 1047, 761, 910, 1047,
+ /* 270 */ 845, 845, 845, 845, 826, 1047, 845, 810, 845, 826,
+ /* 280 */ 845, 845, 910, 1149, 910, 1047, 1053, 1047, 935, 923,
+ /* 290 */ 933, 930, 945, 1149, 1149, 1028, 1007, 758, 829, 761,
+ /* 300 */ 747, 747, 735, 735, 735, 735, 1140, 1140, 1136, 812,
+ /* 310 */ 812, 897, 1016, 1015, 1014, 786, 1040, 1149, 1149, 1149,
+ /* 320 */ 1149, 1149, 1149, 1061, 1149, 1149, 1149, 1149, 1149, 1149,
/* 330 */ 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 731,
/* 340 */ 1149, 1149, 1149, 1149, 1149, 1130, 1149, 1149, 1149, 1149,
/* 350 */ 1149, 1149, 1091, 1090, 1149, 1149, 1149, 1149, 1149, 1149,
/* 360 */ 1149, 1149, 1149, 1149, 1079, 1149, 1149, 1149, 1149, 1149,
/* 370 */ 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
- /* 380 */ 1149, 1149, 1149, 1149, 1149, 868, 870, 1149, 1149, 1149,
- /* 390 */ 869, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
- /* 400 */ 931, 1149, 924, 1149, 1037, 1149, 1018, 1026, 1149, 1149,
- /* 410 */ 1149, 1149, 1149, 1017, 1149, 1149, 1149, 1145, 1149, 1149,
- /* 420 */ 1149, 1144, 1149, 1149, 1149, 1149, 1149, 1029, 981, 1149,
- /* 430 */ 980, 979, 770, 1149, 745, 1149, 727, 732, 1129, 1126,
+ /* 380 */ 1149, 1149, 1149, 1149, 1149, 980, 1027, 1149, 868, 870,
+ /* 390 */ 1149, 1037, 1149, 1149, 869, 1149, 1149, 1149, 1149, 1149,
+ /* 400 */ 1149, 1149, 1149, 1149, 931, 1149, 924, 1149, 1149, 1149,
+ /* 410 */ 1149, 1145, 1149, 1149, 1149, 1144, 1149, 1149, 1149, 1149,
+ /* 420 */ 1149, 1149, 1149, 1149, 1149, 1149, 979, 1029, 993, 1149,
+ /* 430 */ 992, 991, 770, 1149, 745, 1149, 727, 732, 1129, 1126,
/* 440 */ 1128, 1123, 1124, 1122, 1125, 1121, 1119, 1120, 1117, 1115,
/* 450 */ 1114, 1116, 1111, 1107, 1067, 1065, 1063, 1072, 1071, 1070,
/* 460 */ 1069, 1068, 1064, 1062, 1066, 1060, 960, 948, 939, 863,
@@ -854,16 +852,16 @@ static const YYACTIONTYPE yy_default[] = {
/* 560 */ 817, 816, 823, 822, 821, 820, 819, 815, 818, 814,
/* 570 */ 813, 805, 798, 797, 811, 796, 828, 827, 824, 795,
/* 580 */ 851, 850, 849, 846, 794, 793, 792, 791, 790, 789,
- /* 590 */ 987, 986, 1007, 978, 866, 873, 872, 871, 875, 876,
- /* 600 */ 886, 884, 883, 882, 918, 917, 916, 915, 914, 913,
- /* 610 */ 906, 904, 900, 899, 905, 903, 921, 922, 920, 898,
- /* 620 */ 890, 888, 889, 887, 975, 972, 974, 971, 908, 896,
- /* 630 */ 893, 880, 926, 925, 1030, 1019, 1009, 1020, 911, 1008,
- /* 640 */ 1006, 1029, 1026, 1021, 1103, 1025, 1013, 1012, 1011, 1148,
- /* 650 */ 1146, 1147, 1050, 1052, 1055, 1054, 1051, 928, 927, 1049,
- /* 660 */ 1048, 1010, 985, 782, 780, 781, 1075, 1074, 1077, 1076,
- /* 670 */ 1073, 784, 783, 779, 778, 999, 998, 983, 1022, 1023,
- /* 680 */ 982, 1024, 984, 771, 874, 867, 977, 976, 809, 808,
+ /* 590 */ 999, 998, 1030, 1021, 982, 981, 1020, 1018, 1029, 1019,
+ /* 600 */ 990, 866, 873, 872, 871, 875, 876, 886, 884, 883,
+ /* 610 */ 882, 918, 917, 916, 915, 914, 913, 906, 904, 900,
+ /* 620 */ 899, 911, 905, 903, 921, 922, 920, 898, 890, 888,
+ /* 630 */ 889, 887, 975, 972, 974, 971, 908, 896, 893, 880,
+ /* 640 */ 926, 925, 1027, 1148, 1146, 1147, 1050, 1052, 1055, 1054,
+ /* 650 */ 1051, 928, 927, 1049, 1048, 1022, 997, 782, 780, 781,
+ /* 660 */ 1075, 1074, 1077, 1076, 1073, 784, 783, 779, 778, 995,
+ /* 670 */ 874, 867, 989, 988, 1103, 1024, 1025, 987, 983, 1023,
+ /* 680 */ 1011, 1010, 996, 986, 771, 984, 994, 985, 809, 808,
/* 690 */ 807, 806, 878, 877, 788, 802, 787, 785, 765, 760,
/* 700 */ 759, 754, 752, 749, 751, 748, 753, 750, 746, 744,
/* 710 */ 743, 742, 741, 740, 774, 773, 772, 770, 738, 737,
@@ -1130,8 +1128,8 @@ static const char *const yyTokenName[] = {
"DISTINCT", "ID_ALIAS", "FROM", "USING",
"JOIN", "ID_JOIN_OPTS", "ID_IDX", "ORDER",
"GROUP", "HAVING", "LIMIT", "WHERE",
- "ID_COL", "INTO", "VARIABLE", "CASE",
- "ID_FN", "ID_ERR_MSG", "WHEN", "THEN",
+ "ID_COL", "INTO", "CASE", "ID_FN",
+ "ID_ERR_MSG", "VARIABLE", "WHEN", "THEN",
"ELSE", "INDEX", "ID_IDX_NEW", "ID_PRAGMA",
"ID_TRIG_NEW", "ID_TRIG", "ALTER", "ADD",
"error", "cmd", "input", "cmdlist",
@@ -1155,8 +1153,8 @@ static const char *const yyTokenName[] = {
"joinconstr_opt", "dbnm", "indexed_opt", "inscollist",
"sortlist", "delete_stmt", "update_stmt", "setlist",
"insert_stmt", "insert_cmd", "inscollist_opt", "exprx",
- "not_opt", "likeop", "case_operand", "case_exprlist",
- "case_else", "uniqueflag", "idxlist_single", "collate",
+ "not_opt", "case_operand", "case_exprlist", "case_else",
+ "likeop", "uniqueflag", "idxlist_single", "collate",
"nmnum", "number", "trigger_time", "trigger_event",
"foreach_clause", "when_clause", "trigger_cmd_list", "trigger_cmd",
"database_kw_opt", "key_opt", "kwcolumn_opt", "create_vtab",
@@ -1420,58 +1418,58 @@ static const char *const yyRuleName[] = {
/* 248 */ "inscollist ::=",
/* 249 */ "inscollist ::= inscollist COMMA ID_COL",
/* 250 */ "inscollist ::= ID_COL",
- /* 251 */ "exprx ::= term",
- /* 252 */ "exprx ::= CTIME_KW",
- /* 253 */ "exprx ::= LP expr RP",
- /* 254 */ "exprx ::= id",
- /* 255 */ "exprx ::= JOIN_KW",
- /* 256 */ "exprx ::= nm DOT nm",
- /* 257 */ "exprx ::= nm DOT nm DOT nm",
- /* 258 */ "exprx ::= VARIABLE",
- /* 259 */ "exprx ::= expr COLLATE ids",
- /* 260 */ "exprx ::= CAST LP expr AS typetoken RP",
- /* 261 */ "exprx ::= ID LP distinct exprlist RP",
- /* 262 */ "exprx ::= ID LP STAR RP",
- /* 263 */ "exprx ::= expr AND expr",
- /* 264 */ "exprx ::= expr OR expr",
- /* 265 */ "exprx ::= expr LT|GT|GE|LE expr",
- /* 266 */ "exprx ::= expr EQ|NE expr",
- /* 267 */ "exprx ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
- /* 268 */ "exprx ::= expr PLUS|MINUS expr",
- /* 269 */ "exprx ::= expr STAR|SLASH|REM expr",
- /* 270 */ "exprx ::= expr CONCAT expr",
- /* 271 */ "exprx ::= expr not_opt likeop expr",
- /* 272 */ "exprx ::= expr not_opt likeop expr ESCAPE expr",
- /* 273 */ "exprx ::= expr ISNULL|NOTNULL",
- /* 274 */ "exprx ::= expr NOT NULL",
- /* 275 */ "exprx ::= expr IS not_opt expr",
- /* 276 */ "exprx ::= NOT expr",
- /* 277 */ "exprx ::= BITNOT expr",
- /* 278 */ "exprx ::= MINUS expr",
- /* 279 */ "exprx ::= PLUS expr",
- /* 280 */ "exprx ::= expr not_opt BETWEEN expr AND expr",
- /* 281 */ "exprx ::= expr not_opt IN LP exprlist RP",
- /* 282 */ "exprx ::= LP select RP",
- /* 283 */ "exprx ::= expr not_opt IN LP select RP",
- /* 284 */ "exprx ::= expr not_opt IN nm dbnm",
- /* 285 */ "exprx ::= EXISTS LP select RP",
- /* 286 */ "exprx ::= CASE case_operand case_exprlist case_else END",
- /* 287 */ "exprx ::= RAISE LP IGNORE RP",
- /* 288 */ "exprx ::= RAISE LP raisetype COMMA nm RP",
- /* 289 */ "exprx ::= nm DOT",
- /* 290 */ "exprx ::= nm DOT nm DOT",
- /* 291 */ "exprx ::= expr not_opt BETWEEN expr AND",
- /* 292 */ "exprx ::= CASE case_operand case_exprlist case_else",
- /* 293 */ "exprx ::= expr not_opt IN LP exprlist",
- /* 294 */ "exprx ::= expr not_opt IN ID_DB",
- /* 295 */ "exprx ::= expr not_opt IN nm DOT ID_TAB",
- /* 296 */ "exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN",
- /* 297 */ "exprx ::= nm DOT ID_TAB|ID_COL",
- /* 298 */ "exprx ::= nm DOT nm DOT ID_COL",
- /* 299 */ "exprx ::= expr COLLATE ID_COLLATE",
- /* 300 */ "exprx ::= RAISE LP raisetype COMMA ID_ERR_MSG RP",
- /* 301 */ "expr ::= exprx",
- /* 302 */ "expr ::=",
+ /* 251 */ "exprx ::= nm DOT",
+ /* 252 */ "exprx ::= nm DOT nm DOT",
+ /* 253 */ "exprx ::= expr not_opt BETWEEN expr AND",
+ /* 254 */ "exprx ::= CASE case_operand case_exprlist case_else",
+ /* 255 */ "exprx ::= expr not_opt IN LP exprlist",
+ /* 256 */ "exprx ::= expr not_opt IN ID_DB",
+ /* 257 */ "exprx ::= expr not_opt IN nm DOT ID_TAB",
+ /* 258 */ "exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN",
+ /* 259 */ "exprx ::= nm DOT ID_TAB|ID_COL",
+ /* 260 */ "exprx ::= nm DOT nm DOT ID_COL",
+ /* 261 */ "exprx ::= expr COLLATE ID_COLLATE",
+ /* 262 */ "exprx ::= RAISE LP raisetype COMMA ID_ERR_MSG RP",
+ /* 263 */ "exprx ::= term",
+ /* 264 */ "exprx ::= CTIME_KW",
+ /* 265 */ "exprx ::= LP nexprlist RP",
+ /* 266 */ "exprx ::= id",
+ /* 267 */ "exprx ::= JOIN_KW",
+ /* 268 */ "exprx ::= nm DOT nm",
+ /* 269 */ "exprx ::= nm DOT nm DOT nm",
+ /* 270 */ "exprx ::= VARIABLE",
+ /* 271 */ "exprx ::= expr COLLATE ids",
+ /* 272 */ "exprx ::= CAST LP expr AS typetoken RP",
+ /* 273 */ "exprx ::= ID LP distinct exprlist RP",
+ /* 274 */ "exprx ::= ID LP STAR RP",
+ /* 275 */ "exprx ::= expr AND expr",
+ /* 276 */ "exprx ::= expr OR expr",
+ /* 277 */ "exprx ::= expr LT|GT|GE|LE expr",
+ /* 278 */ "exprx ::= expr EQ|NE expr",
+ /* 279 */ "exprx ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
+ /* 280 */ "exprx ::= expr PLUS|MINUS expr",
+ /* 281 */ "exprx ::= expr STAR|SLASH|REM expr",
+ /* 282 */ "exprx ::= expr CONCAT expr",
+ /* 283 */ "exprx ::= expr not_opt likeop expr",
+ /* 284 */ "exprx ::= expr not_opt likeop expr ESCAPE expr",
+ /* 285 */ "exprx ::= expr ISNULL|NOTNULL",
+ /* 286 */ "exprx ::= expr NOT NULL",
+ /* 287 */ "exprx ::= expr IS not_opt expr",
+ /* 288 */ "exprx ::= NOT expr",
+ /* 289 */ "exprx ::= BITNOT expr",
+ /* 290 */ "exprx ::= MINUS expr",
+ /* 291 */ "exprx ::= PLUS expr",
+ /* 292 */ "exprx ::= expr not_opt BETWEEN expr AND expr",
+ /* 293 */ "exprx ::= expr not_opt IN LP exprlist RP",
+ /* 294 */ "exprx ::= LP select RP",
+ /* 295 */ "exprx ::= expr not_opt IN LP select RP",
+ /* 296 */ "exprx ::= expr not_opt IN nm dbnm",
+ /* 297 */ "exprx ::= EXISTS LP select RP",
+ /* 298 */ "exprx ::= CASE case_operand case_exprlist case_else END",
+ /* 299 */ "exprx ::= RAISE LP IGNORE RP",
+ /* 300 */ "exprx ::= RAISE LP raisetype COMMA nm RP",
+ /* 301 */ "expr ::=",
+ /* 302 */ "expr ::= exprx",
/* 303 */ "not_opt ::=",
/* 304 */ "not_opt ::= NOT",
/* 305 */ "likeop ::= LIKE_KW|MATCH",
@@ -1788,8 +1786,8 @@ delete (yypminor->yy4);
case 227: /* where_opt */
case 229: /* having_opt */
case 251: /* exprx */
- case 254: /* case_operand */
- case 256: /* case_else */
+ case 253: /* case_operand */
+ case 255: /* case_else */
{
delete (yypminor->yy490);
}
@@ -1879,7 +1877,7 @@ delete (yypminor->yy373);
case 228: /* groupby_opt */
case 232: /* nexprlist */
case 233: /* exprlist */
- case 255: /* case_exprlist */
+ case 254: /* case_exprlist */
{
delete (yypminor->yy13);
}
@@ -1942,7 +1940,7 @@ delete (yypminor->yy381);
delete (yypminor->yy250);
}
break;
- case 253: /* likeop */
+ case 256: /* likeop */
{
delete (yypminor->yy374);
}
@@ -2477,6 +2475,18 @@ static const struct {
{ 243, 0 },
{ 243, 3 },
{ 243, 1 },
+ { 251, 2 },
+ { 251, 4 },
+ { 251, 5 },
+ { 251, 4 },
+ { 251, 5 },
+ { 251, 4 },
+ { 251, 6 },
+ { 251, 1 },
+ { 251, 3 },
+ { 251, 5 },
+ { 251, 3 },
+ { 251, 6 },
{ 251, 1 },
{ 251, 1 },
{ 251, 3 },
@@ -2515,29 +2525,17 @@ static const struct {
{ 251, 5 },
{ 251, 4 },
{ 251, 6 },
- { 251, 2 },
- { 251, 4 },
- { 251, 5 },
- { 251, 4 },
- { 251, 5 },
- { 251, 4 },
- { 251, 6 },
- { 251, 1 },
- { 251, 3 },
- { 251, 5 },
- { 251, 3 },
- { 251, 6 },
- { 199, 1 },
{ 199, 0 },
+ { 199, 1 },
{ 252, 0 },
{ 252, 1 },
+ { 256, 1 },
+ { 254, 5 },
+ { 254, 4 },
+ { 255, 2 },
+ { 255, 0 },
{ 253, 1 },
- { 255, 5 },
- { 255, 4 },
- { 256, 2 },
- { 256, 0 },
- { 254, 1 },
- { 254, 0 },
+ { 253, 0 },
{ 233, 1 },
{ 233, 0 },
{ 232, 3 },
@@ -3382,7 +3380,7 @@ static void yy_reduce(
case 179: /* singlesrc ::= ID_DB|ID_TAB */ yytestcase(yyruleno==179);
case 180: /* singlesrc ::= nm DOT ID_VIEW */ yytestcase(yyruleno==180);
case 181: /* singlesrc ::= ID_DB|ID_VIEW */ yytestcase(yyruleno==181);
- case 297: /* exprx ::= nm DOT ID_TAB|ID_COL */ yytestcase(yyruleno==297);
+ case 259: /* exprx ::= nm DOT ID_TAB|ID_COL */ yytestcase(yyruleno==259);
case 318: /* cmd ::= CREATE uniqueflag INDEX ifnotexists nm DOT ID_IDX_NEW */ yytestcase(yyruleno==318);
case 319: /* cmd ::= CREATE uniqueflag INDEX ifnotexists ID_DB|ID_IDX_NEW */ yytestcase(yyruleno==319);
case 332: /* cmd ::= DROP INDEX ifexists nm DOT ID_IDX */ yytestcase(yyruleno==332);
@@ -3818,7 +3816,7 @@ static void yy_reduce(
break;
case 209: /* having_opt ::= HAVING expr */
case 221: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==221);
- case 301: /* expr ::= exprx */ yytestcase(yyruleno==301);
+ case 302: /* expr ::= exprx */ yytestcase(yyruleno==302);
case 308: /* case_else ::= ELSE expr */ yytestcase(yyruleno==308);
case 310: /* case_operand ::= exprx */ yytestcase(yyruleno==310);
case 370: /* when_clause ::= WHEN expr */ yytestcase(yyruleno==370);
@@ -4112,7 +4110,76 @@ static void yy_reduce(
{ yy_destructor(yypParser,243,&yymsp[-2].minor);
}
break;
- case 251: /* exprx ::= term */
+ case 251: /* exprx ::= nm DOT */
+{
+ yygotominor.yy490 = new SqliteExpr();
+ yygotominor.yy490->initId(*(yymsp[-1].minor.yy211), QString::null, QString::null);
+ delete yymsp[-1].minor.yy211;
+ objectForTokens = yygotominor.yy490;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: nm.>");
+ }
+ break;
+ case 252: /* exprx ::= nm DOT nm DOT */
+{
+ yygotominor.yy490 = new SqliteExpr();
+ yygotominor.yy490->initId(*(yymsp[-3].minor.yy211), *(yymsp[-1].minor.yy211), QString::null);
+ delete yymsp[-3].minor.yy211;
+ delete yymsp[-1].minor.yy211;
+ objectForTokens = yygotominor.yy490;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: nm.nm.>");
+ }
+ break;
+ case 253: /* exprx ::= expr not_opt BETWEEN expr AND */
+{
+ yygotominor.yy490 = new SqliteExpr();
+ delete yymsp[-3].minor.yy237;
+ delete yymsp[-4].minor.yy490;
+ delete yymsp[-1].minor.yy490;
+ objectForTokens = yygotominor.yy490;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: expr not_opt BETWEEN expr AND>");
+ }
+ break;
+ case 254: /* exprx ::= CASE case_operand case_exprlist case_else */
+{
+ yygotominor.yy490 = new SqliteExpr();
+ delete yymsp[-1].minor.yy13;
+ delete yymsp[-2].minor.yy490;
+ delete yymsp[0].minor.yy490;
+ objectForTokens = yygotominor.yy490;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: CASE operand exprlist else>");
+ }
+ break;
+ case 255: /* exprx ::= expr not_opt IN LP exprlist */
+{
+ yygotominor.yy490 = new SqliteExpr();
+ delete yymsp[-3].minor.yy237;
+ delete yymsp[0].minor.yy13;
+ delete yymsp[-4].minor.yy490;
+ objectForTokens = yygotominor.yy490;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: expr not_opt IN LP exprlist>");
+ }
+ break;
+ case 256: /* exprx ::= expr not_opt IN ID_DB */
+{ yy_destructor(yypParser,199,&yymsp[-3].minor);
+}
+ break;
+ case 257: /* exprx ::= expr not_opt IN nm DOT ID_TAB */
+ case 258: /* exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN */ yytestcase(yyruleno==258);
+{ yy_destructor(yypParser,199,&yymsp[-5].minor);
+ yy_destructor(yypParser,177,&yymsp[-2].minor);
+}
+ break;
+ case 260: /* exprx ::= nm DOT nm DOT ID_COL */
+{ yy_destructor(yypParser,177,&yymsp[-4].minor);
+ yy_destructor(yypParser,177,&yymsp[-2].minor);
+}
+ break;
+ case 261: /* exprx ::= expr COLLATE ID_COLLATE */
+ case 262: /* exprx ::= RAISE LP raisetype COMMA ID_ERR_MSG RP */ yytestcase(yyruleno==262);
+{ yy_destructor(yypParser,199,&yymsp[-2].minor);
+}
+ break;
+ case 263: /* exprx ::= term */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initLiteral(*(yymsp[0].minor.yy21));
@@ -4120,21 +4187,22 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 252: /* exprx ::= CTIME_KW */
+ case 264: /* exprx ::= CTIME_KW */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initCTime(yymsp[0].minor.yy0->value);
objectForTokens = yygotominor.yy490;
}
break;
- case 253: /* exprx ::= LP expr RP */
+ case 265: /* exprx ::= LP nexprlist RP */
{
yygotominor.yy490 = new SqliteExpr();
- yygotominor.yy490->initSubExpr(yymsp[-1].minor.yy490);
+ yygotominor.yy490->initRowValue(*(yymsp[-1].minor.yy13));
+ delete yymsp[-1].minor.yy13;
objectForTokens = yygotominor.yy490;
}
break;
- case 254: /* exprx ::= id */
+ case 266: /* exprx ::= id */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initId(*(yymsp[0].minor.yy211));
@@ -4142,14 +4210,14 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 255: /* exprx ::= JOIN_KW */
+ case 267: /* exprx ::= JOIN_KW */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initId(yymsp[0].minor.yy0->value);
objectForTokens = yygotominor.yy490;
}
break;
- case 256: /* exprx ::= nm DOT nm */
+ case 268: /* exprx ::= nm DOT nm */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initId(*(yymsp[-2].minor.yy211), *(yymsp[0].minor.yy211));
@@ -4158,7 +4226,7 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 257: /* exprx ::= nm DOT nm DOT nm */
+ case 269: /* exprx ::= nm DOT nm DOT nm */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initId(*(yymsp[-4].minor.yy211), *(yymsp[-2].minor.yy211), *(yymsp[0].minor.yy211));
@@ -4168,14 +4236,14 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 258: /* exprx ::= VARIABLE */
+ case 270: /* exprx ::= VARIABLE */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initBindParam(yymsp[0].minor.yy0->value);
objectForTokens = yygotominor.yy490;
}
break;
- case 259: /* exprx ::= expr COLLATE ids */
+ case 271: /* exprx ::= expr COLLATE ids */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initCollate(yymsp[-2].minor.yy490, *(yymsp[0].minor.yy211));
@@ -4183,14 +4251,14 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 260: /* exprx ::= CAST LP expr AS typetoken RP */
+ case 272: /* exprx ::= CAST LP expr AS typetoken RP */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initCast(yymsp[-3].minor.yy490, yymsp[-1].minor.yy299);
objectForTokens = yygotominor.yy490;
}
break;
- case 261: /* exprx ::= ID LP distinct exprlist RP */
+ case 273: /* exprx ::= ID LP distinct exprlist RP */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initFunction(yymsp[-4].minor.yy0->value, *(yymsp[-2].minor.yy376), *(yymsp[-1].minor.yy13));
@@ -4199,28 +4267,28 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 262: /* exprx ::= ID LP STAR RP */
+ case 274: /* exprx ::= ID LP STAR RP */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initFunction(yymsp[-3].minor.yy0->value, true);
objectForTokens = yygotominor.yy490;
}
break;
- case 263: /* exprx ::= expr AND expr */
- case 264: /* exprx ::= expr OR expr */ yytestcase(yyruleno==264);
- case 265: /* exprx ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==265);
- case 266: /* exprx ::= expr EQ|NE expr */ yytestcase(yyruleno==266);
- case 267: /* exprx ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==267);
- case 268: /* exprx ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==268);
- case 269: /* exprx ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==269);
- case 270: /* exprx ::= expr CONCAT expr */ yytestcase(yyruleno==270);
+ case 275: /* exprx ::= expr AND expr */
+ case 276: /* exprx ::= expr OR expr */ yytestcase(yyruleno==276);
+ case 277: /* exprx ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==277);
+ case 278: /* exprx ::= expr EQ|NE expr */ yytestcase(yyruleno==278);
+ case 279: /* exprx ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==279);
+ case 280: /* exprx ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==280);
+ case 281: /* exprx ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==281);
+ case 282: /* exprx ::= expr CONCAT expr */ yytestcase(yyruleno==282);
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initBinOp(yymsp[-2].minor.yy490, yymsp[-1].minor.yy0->value, yymsp[0].minor.yy490);
objectForTokens = yygotominor.yy490;
}
break;
- case 271: /* exprx ::= expr not_opt likeop expr */
+ case 283: /* exprx ::= expr not_opt likeop expr */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initLike(yymsp[-3].minor.yy490, *(yymsp[-2].minor.yy237), *(yymsp[-1].minor.yy374), yymsp[0].minor.yy490);
@@ -4229,7 +4297,7 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 272: /* exprx ::= expr not_opt likeop expr ESCAPE expr */
+ case 284: /* exprx ::= expr not_opt likeop expr ESCAPE expr */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initLike(yymsp[-5].minor.yy490, *(yymsp[-4].minor.yy237), *(yymsp[-3].minor.yy374), yymsp[-2].minor.yy490, yymsp[0].minor.yy490);
@@ -4238,21 +4306,21 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 273: /* exprx ::= expr ISNULL|NOTNULL */
+ case 285: /* exprx ::= expr ISNULL|NOTNULL */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initNull(yymsp[-1].minor.yy490, yymsp[0].minor.yy0->value);
objectForTokens = yygotominor.yy490;
}
break;
- case 274: /* exprx ::= expr NOT NULL */
+ case 286: /* exprx ::= expr NOT NULL */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initNull(yymsp[-2].minor.yy490, "NOT NULL");
objectForTokens = yygotominor.yy490;
}
break;
- case 275: /* exprx ::= expr IS not_opt expr */
+ case 287: /* exprx ::= expr IS not_opt expr */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initIs(yymsp[-3].minor.yy490, *(yymsp[-1].minor.yy237), yymsp[0].minor.yy490);
@@ -4260,21 +4328,21 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 276: /* exprx ::= NOT expr */
+ case 288: /* exprx ::= NOT expr */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initUnaryOp(yymsp[0].minor.yy490, yymsp[-1].minor.yy0->value);
}
break;
- case 277: /* exprx ::= BITNOT expr */
- case 279: /* exprx ::= PLUS expr */ yytestcase(yyruleno==279);
+ case 289: /* exprx ::= BITNOT expr */
+ case 291: /* exprx ::= PLUS expr */ yytestcase(yyruleno==291);
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initUnaryOp(yymsp[0].minor.yy490, yymsp[-1].minor.yy0->value);
objectForTokens = yygotominor.yy490;
}
break;
- case 278: /* exprx ::= MINUS expr */
+ case 290: /* exprx ::= MINUS expr */
{
yygotominor.yy490 = new SqliteExpr();
if (yymsp[0].minor.yy490->mode == SqliteExpr::Mode::LITERAL_VALUE &&
@@ -4291,7 +4359,7 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 280: /* exprx ::= expr not_opt BETWEEN expr AND expr */
+ case 292: /* exprx ::= expr not_opt BETWEEN expr AND expr */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initBetween(yymsp[-5].minor.yy490, *(yymsp[-4].minor.yy237), yymsp[-2].minor.yy490, yymsp[0].minor.yy490);
@@ -4299,7 +4367,7 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 281: /* exprx ::= expr not_opt IN LP exprlist RP */
+ case 293: /* exprx ::= expr not_opt IN LP exprlist RP */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initIn(yymsp[-5].minor.yy490, *(yymsp[-4].minor.yy237), *(yymsp[-1].minor.yy13));
@@ -4308,14 +4376,14 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 282: /* exprx ::= LP select RP */
+ case 294: /* exprx ::= LP select RP */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initSubSelect(yymsp[-1].minor.yy123);
objectForTokens = yygotominor.yy490;
}
break;
- case 283: /* exprx ::= expr not_opt IN LP select RP */
+ case 295: /* exprx ::= expr not_opt IN LP select RP */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initIn(yymsp[-5].minor.yy490, *(yymsp[-4].minor.yy237), yymsp[-1].minor.yy123);
@@ -4323,7 +4391,7 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 284: /* exprx ::= expr not_opt IN nm dbnm */
+ case 296: /* exprx ::= expr not_opt IN nm dbnm */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initIn(yymsp[-4].minor.yy490, *(yymsp[-3].minor.yy237), *(yymsp[-1].minor.yy211), *(yymsp[0].minor.yy211));
@@ -4332,14 +4400,14 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 285: /* exprx ::= EXISTS LP select RP */
+ case 297: /* exprx ::= EXISTS LP select RP */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initExists(yymsp[-1].minor.yy123);
objectForTokens = yygotominor.yy490;
}
break;
- case 286: /* exprx ::= CASE case_operand case_exprlist case_else END */
+ case 298: /* exprx ::= CASE case_operand case_exprlist case_else END */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initCase(yymsp[-3].minor.yy490, *(yymsp[-2].minor.yy13), yymsp[-1].minor.yy490);
@@ -4347,14 +4415,14 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 287: /* exprx ::= RAISE LP IGNORE RP */
+ case 299: /* exprx ::= RAISE LP IGNORE RP */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initRaise(yymsp[-1].minor.yy0->value);
objectForTokens = yygotominor.yy490;
}
break;
- case 288: /* exprx ::= RAISE LP raisetype COMMA nm RP */
+ case 300: /* exprx ::= RAISE LP raisetype COMMA nm RP */
{
yygotominor.yy490 = new SqliteExpr();
yygotominor.yy490->initRaise(yymsp[-3].minor.yy0->value, *(yymsp[-1].minor.yy211));
@@ -4362,80 +4430,11 @@ static void yy_reduce(
objectForTokens = yygotominor.yy490;
}
break;
- case 289: /* exprx ::= nm DOT */
+ case 301: /* expr ::= */
{
yygotominor.yy490 = new SqliteExpr();
- yygotominor.yy490->initId(*(yymsp[-1].minor.yy211), QString::null, QString::null);
- delete yymsp[-1].minor.yy211;
objectForTokens = yygotominor.yy490;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
- break;
- case 290: /* exprx ::= nm DOT nm DOT */
-{
- yygotominor.yy490 = new SqliteExpr();
- yygotominor.yy490->initId(*(yymsp[-3].minor.yy211), *(yymsp[-1].minor.yy211), QString::null);
- delete yymsp[-3].minor.yy211;
- delete yymsp[-1].minor.yy211;
- objectForTokens = yygotominor.yy490;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
- break;
- case 291: /* exprx ::= expr not_opt BETWEEN expr AND */
-{
- yygotominor.yy490 = new SqliteExpr();
- delete yymsp[-3].minor.yy237;
- delete yymsp[-4].minor.yy490;
- delete yymsp[-1].minor.yy490;
- objectForTokens = yygotominor.yy490;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
- break;
- case 292: /* exprx ::= CASE case_operand case_exprlist case_else */
-{
- yygotominor.yy490 = new SqliteExpr();
- delete yymsp[-1].minor.yy13;
- delete yymsp[-2].minor.yy490;
- delete yymsp[0].minor.yy490;
- objectForTokens = yygotominor.yy490;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
- break;
- case 293: /* exprx ::= expr not_opt IN LP exprlist */
-{
- yygotominor.yy490 = new SqliteExpr();
- delete yymsp[-3].minor.yy237;
- delete yymsp[0].minor.yy13;
- delete yymsp[-4].minor.yy490;
- objectForTokens = yygotominor.yy490;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
- break;
- case 294: /* exprx ::= expr not_opt IN ID_DB */
-{ yy_destructor(yypParser,199,&yymsp[-3].minor);
-}
- break;
- case 295: /* exprx ::= expr not_opt IN nm DOT ID_TAB */
- case 296: /* exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN */ yytestcase(yyruleno==296);
-{ yy_destructor(yypParser,199,&yymsp[-5].minor);
- yy_destructor(yypParser,177,&yymsp[-2].minor);
-}
- break;
- case 298: /* exprx ::= nm DOT nm DOT ID_COL */
-{ yy_destructor(yypParser,177,&yymsp[-4].minor);
- yy_destructor(yypParser,177,&yymsp[-2].minor);
-}
- break;
- case 299: /* exprx ::= expr COLLATE ID_COLLATE */
- case 300: /* exprx ::= RAISE LP raisetype COMMA ID_ERR_MSG RP */ yytestcase(yyruleno==300);
-{ yy_destructor(yypParser,199,&yymsp[-2].minor);
-}
- break;
- case 302: /* expr ::= */
-{
- yygotominor.yy490 = new SqliteExpr();
- objectForTokens = yygotominor.yy490;
- parserContext->minorErrorAfterLastToken("Syntax error");
+ parserContext->minorErrorAfterLastToken("Syntax error <expr>");
}
break;
case 305: /* likeop ::= LIKE_KW|MATCH */
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.h b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.h
index d18c81c..92a40ca 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.h
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.h
@@ -151,10 +151,10 @@
#define TK3_WHERE 151
#define TK3_ID_COL 152
#define TK3_INTO 153
-#define TK3_VARIABLE 154
-#define TK3_CASE 155
-#define TK3_ID_FN 156
-#define TK3_ID_ERR_MSG 157
+#define TK3_CASE 154
+#define TK3_ID_FN 155
+#define TK3_ID_ERR_MSG 156
+#define TK3_VARIABLE 157
#define TK3_WHEN 158
#define TK3_THEN 159
#define TK3_ELSE 160
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y
index 932e965..0dc9154 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y
@@ -1455,6 +1455,70 @@ inscollist ::= ID_COL. {}
%type exprx {SqliteExpr*}
%destructor exprx {delete $$;}
+
+exprx(X) ::= nm(N1) DOT. {
+ X = new SqliteExpr();
+ X->initId(*(N1), QString::null, QString::null);
+ delete N1;
+ objectForTokens = X;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: nm.>");
+ }
+exprx(X) ::= nm(N1) DOT nm(N2) DOT. {
+ X = new SqliteExpr();
+ X->initId(*(N1), *(N2), QString::null);
+ delete N1;
+ delete N2;
+ objectForTokens = X;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: nm.nm.>");
+ }
+exprx(X) ::= expr(E1) not_opt(N) BETWEEN
+ expr(E2) AND. {
+ X = new SqliteExpr();
+ delete N;
+ delete E1;
+ delete E2;
+ objectForTokens = X;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: expr not_opt BETWEEN expr AND>");
+ }
+exprx(X) ::= CASE case_operand(O)
+ case_exprlist(L)
+ case_else(E). {
+ X = new SqliteExpr();
+ delete L;
+ delete O;
+ delete E;
+ objectForTokens = X;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: CASE operand exprlist else>");
+ }
+exprx(X) ::= expr(E) not_opt(N) IN LP
+ exprlist(L). [IN] {
+ X = new SqliteExpr();
+ delete N;
+ delete L;
+ delete E;
+ objectForTokens = X;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: expr not_opt IN LP exprlist>");
+ }
+/*
+This introduces premature reduce for LP-expr and causes bug #2755
+exprx(X) ::= LP expr(E). {
+ X = new SqliteExpr();
+ X->initSubExpr(E);
+ objectForTokens = X;
+ parserContext->minorErrorBeforeNextToken("Syntax error <exprx: LP expr>");
+ }
+*/
+exprx ::= expr not_opt IN ID_DB. [IN] {}
+exprx ::= expr not_opt IN nm DOT
+ ID_TAB. [IN] {}
+exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN. {}
+exprx ::= nm DOT ID_TAB|ID_COL. {}
+exprx ::= nm DOT nm DOT ID_COL. {}
+exprx ::= expr COLLATE ID_COLLATE. {}
+exprx ::= RAISE LP raisetype COMMA
+ ID_ERR_MSG RP. {}
+
+
exprx(X) ::= term(T). {
X = new SqliteExpr();
X->initLiteral(*(T));
@@ -1466,11 +1530,19 @@ exprx(X) ::= CTIME_KW(K). {
X->initCTime(K->value);
objectForTokens = X;
}
+exprx(X) ::= LP nexprlist(L) RP. {
+ X = new SqliteExpr();
+ X->initRowValue(*(L));
+ delete L;
+ objectForTokens = X;
+ }
+/*
exprx(X) ::= LP expr(E) RP. {
X = new SqliteExpr();
X->initSubExpr(E);
objectForTokens = X;
}
+*/
exprx(X) ::= id(N). {
X = new SqliteExpr();
X->initId(*(N));
@@ -1697,77 +1769,15 @@ exprx(X) ::= RAISE LP raisetype(R) COMMA
delete N;
objectForTokens = X;
}
-exprx(X) ::= nm(N1) DOT. {
- X = new SqliteExpr();
- X->initId(*(N1), QString::null, QString::null);
- delete N1;
- objectForTokens = X;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
-exprx(X) ::= nm(N1) DOT nm(N2) DOT. {
- X = new SqliteExpr();
- X->initId(*(N1), *(N2), QString::null);
- delete N1;
- delete N2;
- objectForTokens = X;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
-exprx(X) ::= expr(E1) not_opt(N) BETWEEN
- expr(E2) AND. {
- X = new SqliteExpr();
- delete N;
- delete E1;
- delete E2;
- objectForTokens = X;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
-exprx(X) ::= CASE case_operand(O)
- case_exprlist(L)
- case_else(E). {
- X = new SqliteExpr();
- delete L;
- delete O;
- delete E;
- objectForTokens = X;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
-exprx(X) ::= expr(E) not_opt(N) IN LP
- exprlist(L). [IN] {
- X = new SqliteExpr();
- delete N;
- delete L;
- delete E;
- objectForTokens = X;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
-/*
-This introduces premature reduce for LP-expr and causes bug #2755
-exprx(X) ::= LP expr(E). {
- X = new SqliteExpr();
- X->initSubExpr(E);
- objectForTokens = X;
- parserContext->minorErrorBeforeNextToken("Syntax error");
- }
-*/
-
-exprx ::= expr not_opt IN ID_DB. [IN] {}
-exprx ::= expr not_opt IN nm DOT
- ID_TAB. [IN] {}
-exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN. {}
-exprx ::= nm DOT ID_TAB|ID_COL. {}
-exprx ::= nm DOT nm DOT ID_COL. {}
-exprx ::= expr COLLATE ID_COLLATE. {}
-exprx ::= RAISE LP raisetype COMMA
- ID_ERR_MSG RP. {}
%type expr {SqliteExpr*}
%destructor expr {delete $$;}
-expr(X) ::= exprx(E). {X = E;}
expr(X) ::= . {
X = new SqliteExpr();
objectForTokens = X;
- parserContext->minorErrorAfterLastToken("Syntax error");
+ parserContext->minorErrorAfterLastToken("Syntax error <expr>");
}
+expr(X) ::= exprx(E). {X = E;}
%type not_opt {bool*}
%destructor not_opt {delete $$;}
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.cpp
index a97b765..a0a0e3a 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.cpp
@@ -72,7 +72,7 @@ StatementTokenBuilder& StatementTokenBuilder::withComment(const QString& value)
return with(Token::COMMENT, value);
}
-StatementTokenBuilder& StatementTokenBuilder::withFloat(double value)
+StatementTokenBuilder& StatementTokenBuilder::withFloat(const QVariant& value)
{
return with(Token::FLOAT, doubleToString(value));
}
@@ -163,7 +163,7 @@ StatementTokenBuilder& StatementTokenBuilder::withLiteralValue(const QVariant& v
value.toDouble(&ok);
if (ok)
{
- withFloat(value.toDouble());
+ withFloat(value);
return *this;
}
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.h b/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.h
index 3d748ad..14856e7 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.h
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.h
@@ -131,7 +131,7 @@ class StatementTokenBuilder
* @param value Value for the token.
* @return Reference to the builder for the further building.
*/
- StatementTokenBuilder& withFloat(double value);
+ StatementTokenBuilder& withFloat(const QVariant &value);
/**
* @brief Add integer numer token.
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/token.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/token.cpp
index f2102c3..5396edd 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/token.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/token.cpp
@@ -490,6 +490,16 @@ TokenList TokenList::filter(Token::Type type) const
return filtered;
}
+TokenList TokenList::filterOut(Token::Type type) const
+{
+ TokenList filtered;
+ foreach (TokenPtr token, *this)
+ if (token->type != type)
+ filtered << token;
+
+ return filtered;
+}
+
TokenList TokenList::filterWhiteSpaces(bool includeComments) const
{
TokenList filtered;
diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/token.h b/SQLiteStudio3/coreSQLiteStudio/parser/token.h
index aecc7ec..aeb505c 100644
--- a/SQLiteStudio3/coreSQLiteStudio/parser/token.h
+++ b/SQLiteStudio3/coreSQLiteStudio/parser/token.h
@@ -626,6 +626,7 @@ class API_EXPORT TokenList : public QList<TokenPtr>
* @return List of tokens from this list matching given \p type.
*/
TokenList filter(Token::Type type) const;
+ TokenList filterOut(Token::Type type) const;
/**
* @brief Creates list of tokens from this list, letting through only tokens that are not a whitespace.
diff --git a/SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginsqlite3.cpp b/SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginsqlite3.cpp
index 0f16098..7228752 100644
--- a/SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginsqlite3.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginsqlite3.cpp
@@ -38,7 +38,7 @@ QList<DbPluginOption> DbPluginSqlite3::getOptionsList() const
QString DbPluginSqlite3::generateDbName(const QVariant& baseValue)
{
QFileInfo file(baseValue.toString());
- return file.baseName();
+ return file.completeBaseName();
}
bool DbPluginSqlite3::checkIfDbServedByPlugin(Db* db) const
diff --git a/SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginstdfilebase.cpp b/SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginstdfilebase.cpp
new file mode 100644
index 0000000..b890c26
--- /dev/null
+++ b/SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginstdfilebase.cpp
@@ -0,0 +1,33 @@
+#include "dbpluginstdfilebase.h"
+#include "common/unused.h"
+#include "db/sqlquery.h"
+#include <QFileInfo>
+
+Db *DbPluginStdFileBase::getInstance(const QString &name, const QString &path, const QHash<QString, QVariant> &options, QString *errorMessage)
+{
+ UNUSED(errorMessage);
+
+ Db* db = newInstance(name, path, options);
+
+ if (!db->openForProbing())
+ {
+ delete db;
+ return nullptr;
+ }
+
+ SqlQueryPtr results = db->exec("SELECT * FROM sqlite_master");
+ if (results->isError())
+ {
+ delete db;
+ return nullptr;
+ }
+
+ db->closeQuiet();
+ return db;
+}
+
+QString DbPluginStdFileBase::generateDbName(const QVariant &baseValue)
+{
+ QFileInfo file(baseValue.toString());
+ return file.completeBaseName();
+}
diff --git a/SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginstdfilebase.h b/SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginstdfilebase.h
new file mode 100644
index 0000000..6ea1c47
--- /dev/null
+++ b/SQLiteStudio3/coreSQLiteStudio/plugins/dbpluginstdfilebase.h
@@ -0,0 +1,16 @@
+#ifndef DBPLUGINSTDFILEBASE_H
+#define DBPLUGINSTDFILEBASE_H
+
+#include "dbplugin.h"
+
+class API_EXPORT DbPluginStdFileBase : public DbPlugin
+{
+ public:
+ Db *getInstance(const QString &name, const QString &path, const QHash<QString, QVariant> &options, QString *errorMessage);
+ QString generateDbName(const QVariant &baseValue);
+
+ protected:
+ virtual Db *newInstance(const QString &name, const QString &path, const QHash<QString, QVariant> &options) = 0;
+};
+
+#endif // DBPLUGINSTDFILEBASE_H
diff --git a/SQLiteStudio3/coreSQLiteStudio/plugins/uiconfiguredplugin.h b/SQLiteStudio3/coreSQLiteStudio/plugins/uiconfiguredplugin.h
index c9af8e0..1426117 100644
--- a/SQLiteStudio3/coreSQLiteStudio/plugins/uiconfiguredplugin.h
+++ b/SQLiteStudio3/coreSQLiteStudio/plugins/uiconfiguredplugin.h
@@ -39,7 +39,7 @@ class API_EXPORT UiConfiguredPlugin
*
* This is called just after the config dialog was open and all its contents are already initialized.
* This is a good moment to connect to plugin's CfgMain configuration object to listen for changes,
- * so all uncommited (yet) configuration changes can be reflected by this plugin.
+ * so all uncommitted (yet) configuration changes can be reflected by this plugin.
*/
virtual void configDialogOpen() = 0;
diff --git a/SQLiteStudio3/coreSQLiteStudio/querygenerator.cpp b/SQLiteStudio3/coreSQLiteStudio/querygenerator.cpp
index 4e2d9b6..c10e8f7 100644
--- a/SQLiteStudio3/coreSQLiteStudio/querygenerator.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/querygenerator.cpp
@@ -87,7 +87,10 @@ QString QueryGenerator::generateUpdateOfTable(Db* db, const QString& database, c
// If no values were given, we simply use column names as values everywhere
if (values.isEmpty())
- return tplWithWhere.arg(target, commonColumnStr, commonColumnStr);
+ {
+ QString conditionStr = commonUpdateCols.join(" AND ");
+ return tplWithWhere.arg(target, commonColumnStr, conditionStr);
+ }
// If values were given, then they will be used in WHERE clause
QStringList valueCols = values.keys();
@@ -126,7 +129,7 @@ QString QueryGenerator::generateDeleteFromTable(Db* db, const QString& database,
conditionCols << conditionColTpl.arg(wrapObjIfNeeded(col, dialect), wrapString(col));
// Put it to comma spearated string
- QString conditionStr = conditionCols.join(", ");
+ QString conditionStr = conditionCols.join(" AND ");
return tplWithWhere.arg(target, conditionStr);
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/schemaresolver.cpp b/SQLiteStudio3/coreSQLiteStudio/schemaresolver.cpp
index 0044c3e..48fe541 100644
--- a/SQLiteStudio3/coreSQLiteStudio/schemaresolver.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/schemaresolver.cpp
@@ -1,5 +1,6 @@
#include "schemaresolver.h"
#include "db/db.h"
+#include "db/sqlresultsrow.h"
#include "parser/parsererror.h"
#include "parser/ast/sqlitecreatetable.h"
#include "parser/ast/sqlitecreateindex.h"
@@ -303,6 +304,67 @@ QString SchemaResolver::getObjectDdl(const QString &database, const QString &nam
return cache.object(key, true)->toString();
// Get the DDL
+ QString resStr = getObjectDdlWithSimpleName(dbName, lowerName, targetTable, type);
+ if (resStr.isNull())
+ resStr = getObjectDdlWithDifficultName(dbName, lowerName, targetTable, type);
+
+ // If the DDL doesn't have semicolon at the end (usually the case), add it.
+ if (!resStr.trimmed().endsWith(";"))
+ resStr += ";";
+
+ if (useCache)
+ cache.insert(key, new QVariant(resStr));
+
+ // Return the DDL
+ return resStr;
+}
+
+QString SchemaResolver::getObjectDdlWithDifficultName(const QString &dbName, const QString &lowerName, QString targetTable, SchemaResolver::ObjectType type)
+{
+ //
+ // Slower, but works with Russian names, etc, because "string lower" is done only at Qt level, not at SQLite level.
+ //
+ QString typeStr = objectTypeToString(type);
+ SqlQueryPtr queryResults;
+ if (type != ANY)
+ {
+ queryResults = db->exec(QString(
+ "SELECT name, sql FROM %1.%4 WHERE type = '%3';").arg(dbName, typeStr, targetTable),
+ dbFlags
+ );
+
+ }
+ else
+ {
+ queryResults = db->exec(QString(
+ "SELECT name, sql FROM %1.%3;").arg(dbName, targetTable),
+ dbFlags
+ );
+ }
+
+ // Validate query results
+ if (queryResults->isError())
+ {
+ qDebug() << "Could not get object's DDL:" << dbName << "." << lowerName << ", details:" << queryResults->getErrorText();
+ return QString::null;
+ }
+
+ // The DDL string
+ SqlResultsRowPtr row;
+ while (queryResults->hasNext())
+ {
+ row = queryResults->next();
+ if (row->value("name").toString().toLower() != lowerName)
+ continue;
+
+ return row->value("sql").toString();
+ }
+ return QString();
+}
+
+QString SchemaResolver::getObjectDdlWithSimpleName(const QString &dbName, const QString &lowerName, QString targetTable, SchemaResolver::ObjectType type)
+{
+ QString typeStr = objectTypeToString(type);
QVariant results;
SqlQueryPtr queryResults;
if (type != ANY)
@@ -324,23 +386,13 @@ QString SchemaResolver::getObjectDdl(const QString &database, const QString &nam
// Validate query results
if (queryResults->isError())
{
- qDebug() << "Could not get object's DDL:" << dbName << "." << name << ", details:" << queryResults->getErrorText();
+ qDebug() << "Could not get object's DDL:" << dbName << "." << lowerName << ", details:" << queryResults->getErrorText();
return QString::null;
}
// The DDL string
results = queryResults->getSingleCell();
- QString resStr = results.toString();
-
- // If the DDL doesn't have semicolon at the end (usually the case), add it.
- if (!resStr.trimmed().endsWith(";"))
- resStr += ";";
-
- if (useCache)
- cache.insert(key, new QVariant(resStr));
-
- // Return the DDL
- return resStr;
+ return results.toString();
}
QStringList SchemaResolver::getColumnsFromDdlUsingPragma(const QString& ddl)
diff --git a/SQLiteStudio3/coreSQLiteStudio/schemaresolver.h b/SQLiteStudio3/coreSQLiteStudio/schemaresolver.h
index 336b0f2..676d0f5 100644
--- a/SQLiteStudio3/coreSQLiteStudio/schemaresolver.h
+++ b/SQLiteStudio3/coreSQLiteStudio/schemaresolver.h
@@ -200,6 +200,8 @@ class API_EXPORT SchemaResolver
bool isFilteredOut(const QString& value, const QString& type);
void filterSystemIndexes(QStringList& indexes);
QList<SqliteCreateTriggerPtr> getParsedTriggersForTableOrView(const QString& database, const QString& tableOrView, bool includeContentReferences, bool table);
+ QString getObjectDdlWithDifficultName(const QString& dbName, const QString& lowerName, QString targetTable, ObjectType type);
+ QString getObjectDdlWithSimpleName(const QString& dbName, const QString& lowerName, QString targetTable, ObjectType type);
template <class T>
StrHash<QSharedPointer<T>> getAllParsedObjectsForType(const QString& database, const QString& type);
diff --git a/SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp b/SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp
index 02489ee..1b7e33d 100644
--- a/SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp
@@ -250,17 +250,36 @@ void SelectResolver::markGroupedColumns()
void SelectResolver::fixColumnNames()
{
QSet<QString> existingDisplayNames;
+ QSet<QString> existingAliasNames;
QString originalName;
+ QString originalAlias;
+ QString alias;
int i;
QMutableListIterator<Column> it(currentCoreResults);
while (it.hasNext())
{
+ // Display name
originalName = it.next().displayName;
for (i = 1; existingDisplayNames.contains(it.value().displayName); i++)
it.value().displayName = originalName + ":" + QString::number(i);
existingDisplayNames << it.value().displayName;
+
+ // Alias
+ // Handled both alias duplicates and name duplicates.
+ // If name is duplicated, also create alias for it.
+ // This is important, because in case of duplicated name/alias, the result column is actually
+ // made unique with sequenced number - not only for display, but also for data origin.
+ alias = it.value().alias.isNull() ? it.value().column : it.value().alias;
+ originalAlias = alias;
+ for (i = 1; existingAliasNames.contains(alias); i++)
+ alias = originalAlias + ":" + QString::number(i);
+
+ if (alias != originalAlias)
+ it.value().alias = alias;
+
+ existingAliasNames << alias;
}
}
@@ -630,7 +649,7 @@ QStringList SelectResolver::getTableColumns(const QString &database, const QStri
Table dbTable;
dbTable.database = database;
dbTable.table = table;
- dbTable.alias = alias;
+ dbTable.tableAlias = alias;
if (tableColumnsCache.contains(dbTable))
return tableColumnsCache.value(dbTable);
@@ -650,7 +669,8 @@ void SelectResolver::applySubSelectAlias(QList<SelectResolver::Column>& columns,
{
while (it.hasNext())
{
- it.next().tableAlias = alias;
+ it.next().pushTableAlias();
+ it.value().tableAlias = alias;
it.value().flags &= ~FROM_ANONYMOUS_SELECT; // remove anonymous flag
}
}
@@ -695,44 +715,64 @@ bool SelectResolver::parseOriginalQuery()
return true;
}
+SelectResolver::Table::Table()
+{
+}
+
+SelectResolver::Table::Table(const SelectResolver::Table &other) :
+ database(other.database), originalDatabase(other.originalDatabase), table(other.table),
+ tableAlias(other.tableAlias), oldTableAliases(other.oldTableAliases), flags(other.flags)
+{
+}
+
int SelectResolver::Table::operator ==(const SelectResolver::Table &other)
{
- return table == other.table && database == other.database && alias == other.alias;
+ return ::operator==(*this, other);
+}
+
+void SelectResolver::Table::pushTableAlias()
+{
+ if (!tableAlias.isNull())
+ oldTableAliases += tableAlias;
}
int operator==(const SelectResolver::Table& t1, const SelectResolver::Table& t2)
{
- return t1.table == t2.table && t1.database == t2.database && t1.alias == t2.alias;
+ return t1.table.compare(t2.table, Qt::CaseInsensitive) == 0 &&
+ t1.database.compare(t2.database, Qt::CaseInsensitive) == 0 &&
+ t1.tableAlias.compare(t2.tableAlias, Qt::CaseInsensitive) == 0 &&
+ t1.oldTableAliases.size() == t2.oldTableAliases.size() &&
+ t1.oldTableAliases.join(",").compare(t2.oldTableAliases.join(","), Qt::CaseInsensitive) == 0;
}
uint qHash(const SelectResolver::Table& table)
{
- return qHash(table.database + "." + table.table + "." + table.alias);
+ return qHash(table.database.toLower() + "." + table.table.toLower() + "/" + table.tableAlias.toLower() + "/" +
+ table.oldTableAliases.join(","));
}
int SelectResolver::Column::operator ==(const SelectResolver::Column &other)
{
- return table == other.table && database == other.database && column == other.column && tableAlias == other.tableAlias;
+ return ::operator==(*this, other);
}
SelectResolver::Table SelectResolver::Column::getTable() const
{
- Table resTable;
- resTable.table = table;
- resTable.database = database;
- resTable.originalDatabase = originalDatabase;
- resTable.alias = tableAlias;
- resTable.flags = flags;
- return resTable;
+ return Table(*this);
}
int operator ==(const SelectResolver::Column &c1, const SelectResolver::Column &c2)
{
- return c1.table == c2.table && c1.database == c2.database && c1.column == c2.column && c1.tableAlias == c2.tableAlias;
+ return c1.column.compare(c2.column, Qt::CaseInsensitive) == 0 &&
+ c1.table.compare(c2.table, Qt::CaseInsensitive) == 0 &&
+ c1.database.compare(c2.database, Qt::CaseInsensitive) == 0 &&
+ c1.tableAlias.compare(c2.tableAlias, Qt::CaseInsensitive) == 0 &&
+ c1.oldTableAliases.size() == c2.oldTableAliases.size() &&
+ c1.oldTableAliases.join(",").compare(c2.oldTableAliases.join(","), Qt::CaseInsensitive) == 0;
}
-
uint qHash(const SelectResolver::Column &column)
{
- return qHash(column.database + "." + column.table + "." + column.column + "/" + column.tableAlias);
+ return qHash(column.database.toLower() + "." + column.table.toLower() + "." + column.column.toLower() + "/" +
+ column.tableAlias.toLower() + "/" + column.oldTableAliases.join(","));
}
diff --git a/SQLiteStudio3/coreSQLiteStudio/selectresolver.h b/SQLiteStudio3/coreSQLiteStudio/selectresolver.h
index 1edfcb9..7640fc6 100644
--- a/SQLiteStudio3/coreSQLiteStudio/selectresolver.h
+++ b/SQLiteStudio3/coreSQLiteStudio/selectresolver.h
@@ -8,6 +8,7 @@
#include <QString>
#include <QHash>
#include <QStringList>
+#include <QStack>
class Db;
class SchemaResolver;
@@ -64,6 +65,9 @@ class API_EXPORT SelectResolver
*/
struct API_EXPORT Table
{
+ Table();
+ Table(const Table& other);
+
/**
* @brief Database name.
*
@@ -72,16 +76,18 @@ class API_EXPORT SelectResolver
QString database;
QString originalDatabase;
QString table;
- QString alias;
+ QString tableAlias;
+ QStringList oldTableAliases;
int flags = 0;
int operator==(const Table& other);
+ void pushTableAlias();
};
/**
* @brief Result column resolved by the resolver.
*/
- struct API_EXPORT Column
+ struct API_EXPORT Column : public Table
{
enum Type
{
@@ -92,22 +98,12 @@ class API_EXPORT SelectResolver
Type type;
/**
- * @brief Database name.
- *
- * Either sqlite name, like "main", or "temp", or an attach name.
- */
- QString database;
- QString originalDatabase;
- QString table;
-
- /**
* @brief Column name or expression.
*
* If a column is of OTHER type, then column member contains detokenized column expression.
*/
QString column;
QString alias;
- QString tableAlias;
QString displayName;
bool aliasDefinedInSubQuery = false;
int flags = 0;
diff --git a/SQLiteStudio3/coreSQLiteStudio/services/config.cpp b/SQLiteStudio3/coreSQLiteStudio/services/config.cpp
index 1fef317..60a80d5 100644
--- a/SQLiteStudio3/coreSQLiteStudio/services/config.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/services/config.cpp
@@ -3,7 +3,18 @@
CFG_DEFINE(Core)
static const QString DB_FILE_NAME = QStringLiteral("settings3");
+static QString MASTER_CONFIG_FILE = QString();
Config::~Config()
{
}
+
+void Config::setMasterConfigFile(const QString &path)
+{
+ MASTER_CONFIG_FILE = path;
+}
+
+QString Config::getMasterConfigFile()
+{
+ return MASTER_CONFIG_FILE;
+}
diff --git a/SQLiteStudio3/coreSQLiteStudio/services/config.h b/SQLiteStudio3/coreSQLiteStudio/services/config.h
index c7bebf3..1e4c410 100644
--- a/SQLiteStudio3/coreSQLiteStudio/services/config.h
+++ b/SQLiteStudio3/coreSQLiteStudio/services/config.h
@@ -14,7 +14,7 @@
#include <QSharedPointer>
#include <QDateTime>
-const int SQLITESTUDIO_CONFIG_VERSION = 1;
+const int SQLITESTUDIO_CONFIG_VERSION = 2;
CFG_CATEGORIES(Core,
CFG_CATEGORY(General,
@@ -104,6 +104,9 @@ class API_EXPORT Config : public QObject
typedef QSharedPointer<ReportHistoryEntry> ReportHistoryEntryPtr;
+ static void setMasterConfigFile(const QString& path);
+ static QString getMasterConfigFile();
+
virtual void init() = 0;
virtual void cleanUp() = 0;
virtual const QString& getConfigDir() const = 0;
@@ -166,7 +169,7 @@ class API_EXPORT Config : public QObject
signals:
void massSaveBegins();
- void massSaveCommited();
+ void massSaveCommitted();
void sqlHistoryRefreshNeeded();
void ddlHistoryRefreshNeeded();
void reportsHistoryRefreshNeeded();
diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp
index 5aed863..cf8b115 100644
--- a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp
@@ -28,6 +28,8 @@ void ConfigImpl::init()
{
initDbFile();
initTables();
+ updateConfigDb();
+ mergeMasterConfig();
sqlite3Version = db->exec("SELECT sqlite_version()")->getSingleCell().toString();
@@ -72,7 +74,7 @@ void ConfigImpl::commitMassSave()
return;
db->exec("COMMIT;");
- emit massSaveCommited();
+ emit massSaveCommitted();
massSaving = false;
}
@@ -791,6 +793,73 @@ void ConfigImpl::asyncClearReportHistory()
emit reportsHistoryRefreshNeeded();
}
+void ConfigImpl::mergeMasterConfig()
+{
+ QString masterConfigFile = Config::getMasterConfigFile();
+ if (masterConfigFile.isEmpty())
+ return;
+
+ qInfo() << "Updating settings from master configuration file: " << masterConfigFile;
+
+ Db* masterDb = new DbSqlite3("SQLiteStudio master settings", masterConfigFile, {{DB_PURE_INIT, true}});
+ if (!masterDb->open())
+ {
+ safe_delete(masterDb);
+ qWarning() << "Could not open master config database:" << masterConfigFile;
+ return;
+ }
+
+ SqlQueryPtr results = masterDb->exec("SELECT [group], key, value FROM settings");
+ if (results->isError())
+ {
+ qWarning() << "Could not query master config database:" << masterConfigFile << ", error details:" << results->getErrorText();
+ safe_delete(masterDb);
+ return;
+ }
+
+ static_qstring(insertSql, "INSERT OR IGNORE INTO settings ([group], key, value) VALUES (?, ?, ?)");
+ db->begin();
+ SqlResultsRowPtr row;
+ while (results->hasNext())
+ {
+ row = results->next();
+ if (row->value("group") == "General" && row->value("key") == "Session")
+ continue; // Don't copy session
+
+ db->exec(insertSql, row->valueList());
+ }
+ db->commit();
+
+ masterDb->close();
+ safe_delete(masterDb);
+}
+
+void ConfigImpl::updateConfigDb()
+{
+ SqlQueryPtr result = db->exec("SELECT version FROM version LIMIT 1");
+ int dbVersion = result->getSingleCell().toInt();
+ if (dbVersion >= SQLITESTUDIO_CONFIG_VERSION)
+ return;
+
+ db->begin();
+ switch (dbVersion)
+ {
+ case 1:
+ {
+ // 1->2
+ db->exec("UPDATE settings SET [key] = 'DataUncommittedError' WHERE [key] = 'DataUncommitedError'");
+ db->exec("UPDATE settings SET [key] = 'DataUncommitted' WHERE [key] = 'DataUncommited'");
+ }
+ // Add cases here for next versions,
+ // without a "break" instruction,
+ // in order to update from certain
+ // version to latest at once.
+ }
+
+ db->exec("UPDATE version SET version = ?", {SQLITESTUDIO_CONFIG_VERSION});
+ db->commit();
+}
+
void ConfigImpl::refreshSqlHistory()
{
if (sqlHistoryModel)
diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h
index bd31f0b..08bcec7 100644
--- a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h
+++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h
@@ -111,6 +111,9 @@ class API_EXPORT ConfigImpl : public Config
void asyncDeleteReport(int id);
void asyncClearReportHistory();
+ void mergeMasterConfig();
+ void updateConfigDb();
+
static Config* instance;
static qint64 sqlHistoryId;
diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp b/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp
index da732bd..826b34b 100644
--- a/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp
@@ -9,12 +9,14 @@
#include "services/dbmanager.h"
#include "db/queryexecutor.h"
#include "db/sqlquery.h"
+#include "services/importmanager.h"
#include <QVariantList>
#include <QHash>
#include <QDebug>
#include <QRegularExpression>
#include <QFile>
#include <QUrl>
+#include <plugins/importplugin.h>
FunctionManagerImpl::FunctionManagerImpl()
{
@@ -269,6 +271,10 @@ void FunctionManagerImpl::initNativeFunctions()
registerNativeFunction("sha3_256", {"data"}, FunctionManagerImpl::nativeSha3_256);
registerNativeFunction("sha3_384", {"data"}, FunctionManagerImpl::nativeSha3_384);
registerNativeFunction("sha3_512", {"data"}, FunctionManagerImpl::nativeSha3_512);
+ registerNativeFunction("import", {"file", "format", "table", "charset", "options"}, FunctionManagerImpl::nativeImport);
+ registerNativeFunction("import_formats", {}, FunctionManagerImpl::nativeImportFormats);
+ registerNativeFunction("import_options", {"format"}, FunctionManagerImpl::nativeImportOptions);
+ registerNativeFunction("charsets", {}, FunctionManagerImpl::nativeCharsets);
}
void FunctionManagerImpl::refreshFunctionsByKey()
@@ -654,6 +660,107 @@ QVariant FunctionManagerImpl::nativeSha3_512(const QList<QVariant>& args, Db* db
return nativeCryptographicFunction(args, db, ok, QCryptographicHash::Sha3_512);
}
+QVariant FunctionManagerImpl::nativeImport(const QList<QVariant> &args, Db *db, bool &ok)
+{
+ if (args.size() < 3)
+ {
+ ok = false;
+ return 0;
+ }
+
+ ImportManager::StandardImportConfig stdConfig;
+ stdConfig.inputFileName = args[0].toString();
+ stdConfig.ignoreErrors = true;
+ stdConfig.skipTransaction = true;
+ if (args.size() > 3)
+ stdConfig.codec = args[3].toString();
+
+ if (args.size() > 4)
+ {
+ // Parsing plugin options
+ int idx;
+ QString option;
+ QString value;
+ CfgEntry* cfg;
+ QStringList lines = args[4].toString().split(QRegExp("[\r\n]+"));
+ for (const QString& line : lines)
+ {
+ idx = line.indexOf("=");
+ if (idx == -1)
+ {
+ qDebug() << "Invalid options entry for import() function call:" << line;
+ continue;
+ }
+ option = line.left(idx).trimmed();
+ cfg = CfgMain::getEntryByPath(option);
+ if (!cfg)
+ {
+ qDebug() << "Invalid option name for import() function call:" << option;
+ continue;
+ }
+ value = line.mid(idx + 1);
+ cfg->set(value);
+ }
+ }
+
+ QString format = args[1].toString();
+ QString table = args[2].toString();
+
+ IMPORT_MANAGER->configure(format, stdConfig);
+ IMPORT_MANAGER->importToTable(db, table, false);
+ return 1;
+}
+
+QVariant FunctionManagerImpl::nativeImportFormats(const QList<QVariant> &args, Db *db, bool &ok)
+{
+ UNUSED(args);
+ UNUSED(db);
+ UNUSED(ok);
+ QStringList formats;
+ QList<ImportPlugin*> importPlugins = PLUGINS->getLoadedPlugins<ImportPlugin>();
+ for (ImportPlugin* plugin : importPlugins)
+ formats << plugin->getDataSourceTypeName();
+
+ return formats.join(" ");
+}
+
+QVariant FunctionManagerImpl::nativeImportOptions(const QList<QVariant> &args, Db *db, bool &ok)
+{
+ UNUSED(db);
+ if (args.size() != 1)
+ {
+ qDebug() << "Missing 'type' parameter to import_options() function call.";
+ ok = false;
+ return QVariant();
+ }
+
+ QString type = args[0].toString();
+
+ QList<ImportPlugin*> importPlugins = PLUGINS->getLoadedPlugins<ImportPlugin>();
+ ImportPlugin* thePlugin = findFirst<ImportPlugin>(importPlugins, [type](ImportPlugin* plugin) -> bool {return plugin->getDataSourceTypeName() == type;});
+ if (!thePlugin)
+ {
+ ok = false;
+ qDebug() << "No import plugin handling format (in call to import_options()):" << type;
+ return QVariant();
+ }
+
+ static_qstring(tpl, "%1=%2");
+ QStringList opts;
+ for (CfgEntry* entry : thePlugin->getConfig()->getEntries())
+ opts << tpl.arg(entry->getFullKey(), entry->get().toString());
+
+ return opts.join("\n");
+}
+
+QVariant FunctionManagerImpl::nativeCharsets(const QList<QVariant> &args, Db *db, bool &ok)
+{
+ UNUSED(args);
+ UNUSED(db);
+ UNUSED(ok);
+ return textCodecNames().join(" ");
+}
+
QStringList FunctionManagerImpl::getArgMarkers(int argCount)
{
QStringList argMarkers;
diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.h b/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.h
index d8734e6..0e5e103 100644
--- a/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.h
+++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.h
@@ -83,6 +83,10 @@ class API_EXPORT FunctionManagerImpl : public FunctionManager
static QVariant nativeSha3_256(const QList<QVariant>& args, Db* db, bool& ok);
static QVariant nativeSha3_384(const QList<QVariant>& args, Db* db, bool& ok);
static QVariant nativeSha3_512(const QList<QVariant>& args, Db* db, bool& ok);
+ static QVariant nativeImport(const QList<QVariant>& args, Db* db, bool& ok);
+ static QVariant nativeImportFormats(const QList<QVariant>& args, Db* db, bool& ok);
+ static QVariant nativeImportOptions(const QList<QVariant>& args, Db* db, bool& ok);
+ static QVariant nativeCharsets(const QList<QVariant>& args, Db* db, bool& ok);
QList<ScriptFunction*> functions;
QHash<Key,ScriptFunction*> functionsByKey;
diff --git a/SQLiteStudio3/coreSQLiteStudio/services/importmanager.cpp b/SQLiteStudio3/coreSQLiteStudio/services/importmanager.cpp
index 53803e5..b9aa947 100644
--- a/SQLiteStudio3/coreSQLiteStudio/services/importmanager.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/services/importmanager.cpp
@@ -38,7 +38,7 @@ void ImportManager::configure(const QString& dataSourceType, const ImportManager
importConfig = config;
}
-void ImportManager::importToTable(Db* db, const QString& table)
+void ImportManager::importToTable(Db* db, const QString& table, bool async)
{
this->db = db;
this->table = table;
@@ -71,7 +71,10 @@ void ImportManager::importToTable(Db* db, const QString& table)
connect(worker, SIGNAL(createdTable(Db*,QString)), this, SLOT(handleTableCreated(Db*,QString)));
connect(this, SIGNAL(orderWorkerToInterrupt()), worker, SLOT(interrupt()));
- QThreadPool::globalInstance()->start(worker);
+ if (async)
+ QThreadPool::globalInstance()->start(worker);
+ else
+ worker->run();
}
void ImportManager::interrupt()
diff --git a/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h b/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h
index 2401e78..5c6a73e 100644
--- a/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h
+++ b/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h
@@ -38,6 +38,7 @@ class API_EXPORT ImportManager : public PluginServiceBase
QString inputFileName;
bool ignoreErrors = false;
+ bool skipTransaction = false;
};
enum StandardConfigFlag
@@ -54,7 +55,7 @@ class API_EXPORT ImportManager : public PluginServiceBase
ImportPlugin* getPluginForDataSourceType(const QString& dataSourceType) const;
void configure(const QString& dataSourceType, const StandardImportConfig& config);
- void importToTable(Db* db, const QString& table);
+ void importToTable(Db* db, const QString& table, bool async = true);
static bool isAnyPluginAvailable();
diff --git a/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp b/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp
index efb5bb4..1e7863b 100644
--- a/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp
@@ -39,7 +39,7 @@
DEFINE_SINGLETON(SQLiteStudio)
-static const int sqlitestudioVersion = 30100;
+static const int sqlitestudioVersion = 30101;
SQLiteStudio::SQLiteStudio()
{
@@ -260,7 +260,7 @@ void SQLiteStudio::init(const QStringList& cmdListArguments, bool guiAvailable)
QThreadPool::globalInstance()->setMaxThreadCount(10);
- Q_INIT_RESOURCE(coresqlitestudio);
+ Q_INIT_RESOURCE(coreSQLiteStudio);
CfgLazyInitializer::init();
@@ -369,7 +369,7 @@ void SQLiteStudio::cleanUp()
safe_delete(env);
NotifyManager::destroy();
}
- Q_CLEANUP_RESOURCE(coresqlitestudio);
+ Q_CLEANUP_RESOURCE(coreSQLiteStudio);
}
void SQLiteStudio::updateCodeFormatter()
diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
index a0f6262..9c14f63 100644
--- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
@@ -620,10 +620,10 @@ bool TableModifier::isTableAliasUsedForColumn(const TokenPtr &token, const StrHa
}
SelectResolver::Table table = resolvedTables.value(token->value, Qt::CaseInsensitive);
- if (table.alias.isNull())
+ if (table.tableAlias.isNull())
return false;
- if (table.alias.compare(token->value), Qt::CaseInsensitive != 0)
+ if (table.tableAlias.compare(token->value), Qt::CaseInsensitive != 0)
return false;
// If the table token is mentioned in FROM clause, it's not a subject for aliased usage, cuase it defines alias, not uses it.
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts
index 0c60582..7467fa1 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="de_DE">
+<TS version="2.1" language="de_DE">
<context>
<name>AbstractDb</name>
<message>
@@ -26,37 +26,37 @@
<context>
<name>ChainExecutor</name>
<message>
- <location filename="../db/chainexecutor.cpp" line="35"/>
+ <location filename="../db/chainexecutor.cpp" line="37"/>
<source>The database for executing queries was not defined.</source>
<comment>chain executor</comment>
<translation>Es wurde keine Datenbank zur Ausführung von Abfragen festgelegt.</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="41"/>
+ <location filename="../db/chainexecutor.cpp" line="44"/>
<source>The database for executing queries was not open.</source>
<comment>chain executor</comment>
<translation>Die Datenbank ist zur Ausführung von Abfragen nicht geöffnet worden.</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="50"/>
+ <location filename="../db/chainexecutor.cpp" line="54"/>
<source>Could not disable foreign keys in the database. Details: %1</source>
<comment>chain executor</comment>
<translation>Fremdschlüssel konnten nicht deaktiviert werden für die Datenbank. Details: %1</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="57"/>
+ <location filename="../db/chainexecutor.cpp" line="62"/>
<source>Could not start a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation>Es kann keine Datenbanktransaktion gestartet werden. Details: %1</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="84"/>
+ <location filename="../db/chainexecutor.cpp" line="89"/>
<source>Interrupted</source>
<comment>chain executor</comment>
<translation>Abgebrochen</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="145"/>
+ <location filename="../db/chainexecutor.cpp" line="151"/>
<source>Could not commit a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation>Die Datenbanktransaktion kann nicht &apos;committet&apos; werden. Details: %1</translation>
@@ -245,17 +245,17 @@ Tabellen, Indizes, Trigger und Views die in Datenbank %3 kopiert wurden, werden
<context>
<name>DbVersionConverter</name>
<message>
- <location filename="../dbversionconverter.cpp" line="913"/>
+ <location filename="../dbversionconverter.cpp" line="916"/>
<source>Target file exists, but could not be overwritten.</source>
<translation>Die Zieldatei existiert zwar, konnte aber nicht überschrieben werden.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="932"/>
+ <location filename="../dbversionconverter.cpp" line="935"/>
<source>Could not find proper database plugin to create target database.</source>
<translation>Es konnte kein geeignetes Datenbankplugin gefunden werden, um die Zieldatenbank zu erzeugen.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="1166"/>
+ <location filename="../dbversionconverter.cpp" line="1169"/>
<source>Error while converting database: %1</source>
<translation>Fehler beim Konvertieren der Datenbank: %1</translation>
</message>
@@ -343,23 +343,23 @@ Tabellen, Indizes, Trigger und Views die in Datenbank %3 kopiert wurden, werden
<translation>Fehler beim Ermitteln der Spaltenbreite für den Export der Abfrageergebnisse: %1</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="354"/>
- <location filename="../exportworker.cpp" line="412"/>
+ <location filename="../exportworker.cpp" line="346"/>
+ <location filename="../exportworker.cpp" line="404"/>
<source>Could not parse %1 in order to export it. It will be excluded from the export output.</source>
<translation>%1 konnte zum Exportieren nicht korrekt verarbeitet werden. Diese Daten werden nicht exportiert.</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="616"/>
+ <location filename="../exportworker.cpp" line="608"/>
<source>Error while reading data to export from table %1: %2</source>
<translation>Fehler beim Lesen der zu exportierenden Daten aus der Tabelle %1: %2</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="624"/>
+ <location filename="../exportworker.cpp" line="616"/>
<source>Error while counting data to export from table %1: %2</source>
<translation>Fehler beim Ermitteln der zu exportierenden Daten aus der Tabelle %1: %2</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="640"/>
+ <location filename="../exportworker.cpp" line="632"/>
<source>Error while counting data column width to export from table %1: %2</source>
<translation>Fehler beim Ermitteln der Spaltenbreite für den Export aus Tabelle %1: %2</translation>
</message>
@@ -367,44 +367,44 @@ Tabellen, Indizes, Trigger und Views die in Datenbank %3 kopiert wurden, werden
<context>
<name>FunctionManagerImpl</name>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="232"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="234"/>
<source>Invalid number of arguments to function &apos;%1&apos;. Expected %2, but got %3.</source>
<translation>Falsche Anzahl an Parametern für Funktion &apos;%1&apos;. Erwartet wurden %2, angegeben wurden jedoch %3.</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="341"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
<source>No such function registered in SQLiteStudio: %1(%2)</source>
<translation>Diese Funktion ist in SQLiteStudio nicht verfügbar: %1(%2)</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="353"/>
<source>Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded.</source>
<translatorcomment>Auch hier ist sicherlich eine Überarbeitung nötig, wenn der Kontext der Meldung bekannt ist.</translatorcomment>
<translation>Die Funktion %1(%2) wurde für die Sprache %3 erstellt, jedoch ist das Plugin, welches diese Sprache unterstützt, derzeit nicht geladen.</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="365"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="371"/>
<source>Invalid regular expression pattern: %1</source>
<translation>Ungültiges Muster für die regulären Ausdrücke: %1</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="384"/>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="417"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="390"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="423"/>
<source>Could not open file %1 for reading: %2</source>
<translation>Datei %1 kann nicht für Lesezugriffe geöffnet werden: %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="439"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="445"/>
<source>Could not open file %1 for writting: %2</source>
<translation>Datei %1 kann nicht für Schreibzugriffe geöffnet werden: %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="459"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="465"/>
<source>Error while writting to file %1: %2</source>
<translation>Fehler beim Schreiben in Datei %1: %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="477"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="483"/>
<source>Unsupported scripting language: %1</source>
<translation>Nicht unterstützte Skriptsprache: %1</translation>
</message>
@@ -420,7 +420,7 @@ Tabellen, Indizes, Trigger und Views die in Datenbank %3 kopiert wurden, werden
<context>
<name>ImportManager</name>
<message>
- <location filename="../services/importmanager.cpp" line="93"/>
+ <location filename="../services/importmanager.cpp" line="96"/>
<source>Imported data to the table &apos;%1&apos; successfully.</source>
<translation>Die Daten wurden erfolgreich in Tabelle %1 importiert.</translation>
</message>
@@ -438,41 +438,41 @@ Tabellen, Indizes, Trigger und Views die in Datenbank %3 kopiert wurden, werden
<translation>Es kann keine Transaktion zum Import der Daten gestartet werden: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="48"/>
+ <location filename="../importworker.cpp" line="52"/>
<source>Could not commit transaction for imported data: %1</source>
<translation>Die Transaktion für die importierten Daten kann nicht &apos;committet&apos; werden: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="94"/>
+ <location filename="../importworker.cpp" line="100"/>
<source>Table &apos;%1&apos; has less columns than there are columns in the data to be imported. Excessive data columns will be ignored.</source>
<translation>Die Tabelle %1 hat weniger Spalten als die zu importierenden Daten liefern. Überschüssige Spalten werden daher ignoriert.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="99"/>
+ <location filename="../importworker.cpp" line="105"/>
<source>Table &apos;%1&apos; has more columns than there are columns in the data to be imported. Some columns in the table will be left empty.</source>
<translation>Die Tabelle %1 hat mehr Spalten als die zu importierenden Daten liefern. Einige Tabellenspalten werden deshalb leer bleiben.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="117"/>
+ <location filename="../importworker.cpp" line="124"/>
<source>Could not create table to import to: %1</source>
<translation>Die Tabelle, in die importiert werden soll, kann nicht erstellt werden: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="168"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="180"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Error while importing data: %1</source>
<translation>Fehler beim Import der Daten: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Interrupted.</source>
<comment>import process status update</comment>
<translation>Abgebrochen.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="163"/>
+ <location filename="../importworker.cpp" line="175"/>
<source>Could not import data row number %1. The row was ignored. Problem details: %2</source>
<translation>Datenzeile %1 konnte nicht importiert werden. Die Zeile wurde ignoriert. Problembeschreibung: %2</translation>
</message>
@@ -839,9 +839,14 @@ Problembeschreibung: %2</translation>
<translation>SQLite %1 unterstützt keine current date&apos; oder &apos;time&apos; Klauseln in Ausdrücken.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="767"/>
+ <location filename="../dbversionconverter.cpp" line="759"/>
+ <source>SQLite %1 does not support row value clauses in expressions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../dbversionconverter.cpp" line="770"/>
- <location filename="../dbversionconverter.cpp" line="781"/>
+ <location filename="../dbversionconverter.cpp" line="773"/>
+ <location filename="../dbversionconverter.cpp" line="784"/>
<source>SQLite %1 does not support &apos;%2&apos; clause in expressions.</source>
<translation>SQLite %1 unterstützt keine &apos;%2&apos; Klausel Ausdrücken.</translation>
</message>
@@ -859,13 +864,13 @@ Problembeschreibung: %2</translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="1904"/>
- <location filename="../parser/sqlite3_parse.cpp" line="2171"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="2169"/>
<source>Parser stack overflow</source>
<translation>Stacküberlauf bei Verarbeitung</translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="4465"/>
- <location filename="../parser/sqlite3_parse.cpp" line="5089"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="5088"/>
<source>Syntax error</source>
<translation>Syntaxfehler</translation>
</message>
@@ -920,17 +925,17 @@ Problembeschreibung: %2</translation>
<translation>Der Implementationscode darf nicht leer sein.</translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="333"/>
+ <location filename="../selectresolver.cpp" line="352"/>
<source>Could not resolve data source for column: %1</source>
<translation>Die Datenquelle für Spalte %1 kann nicht aufgelöst werden.</translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="405"/>
+ <location filename="../selectresolver.cpp" line="424"/>
<source>Could not resolve table for column &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/configimpl.cpp" line="612"/>
+ <location filename="../services/impl/configimpl.cpp" line="614"/>
<source>Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1.</source>
<translatorcomment>Ich hoffe, dass ich &quot;to initialize&quot; hier richtig mit &quot;erstellt&quot; übersetzt habe.</translatorcomment>
<translation>Die Konfigurationsdatei kann nicht erstellt werden. Alle Änderungen an der Konfiguration sowie die Abfragehistorie sind nach einem Programmneustart verloren. Es wurde versucht die Konfigurationsdatei in folgendem Verzeichnis zu erstellen: %1</translation>
@@ -1034,29 +1039,29 @@ The view will remain as it is.</source>
<context>
<name>QueryExecutor</name>
<message>
- <location filename="../db/queryexecutor.cpp" line="137"/>
+ <location filename="../db/queryexecutor.cpp" line="142"/>
<source>Execution interrupted.</source>
<translation>Ausführung abgebrochen.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="178"/>
+ <location filename="../db/queryexecutor.cpp" line="183"/>
<source>Database is not open.</source>
<translation>Die Datenbank ist nicht geöffnet.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="186"/>
+ <location filename="../db/queryexecutor.cpp" line="191"/>
<source>Only one query can be executed simultaneously.</source>
<translation>Es kann nur eine Abfrage gleichzeitig ausgeführt werden.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="275"/>
- <location filename="../db/queryexecutor.cpp" line="560"/>
+ <location filename="../db/queryexecutor.cpp" line="294"/>
+ <location filename="../db/queryexecutor.cpp" line="568"/>
<source>An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1</source>
<translatorcomment>Hier muss ggf. noch das &apos;data paging&apos; korrekt übersetzt werden.</translatorcomment>
<translation>Beim Ausführen der count(*) Abfrage ist ein Fehler aufgetreten, daher wird das data paging abgeschaltet. Problemdetails der Datenbank: %1</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="471"/>
+ <location filename="../db/queryexecutor.cpp" line="479"/>
<source>SQLiteStudio was unable to extract metadata from the query. Results won&apos;t be editable.</source>
<translation>SQLiteStudio konnte keine Metadaten aus der Abfrage extrahieren. Die Ergebnismenge kann daher nicht editiert werden.</translation>
</message>
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts
index 6cab7b8..007c39b 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="es_ES">
+<TS version="2.1" language="es_ES">
<context>
<name>AbstractDb</name>
<message>
@@ -26,37 +26,37 @@
<context>
<name>ChainExecutor</name>
<message>
- <location filename="../db/chainexecutor.cpp" line="35"/>
+ <location filename="../db/chainexecutor.cpp" line="37"/>
<source>The database for executing queries was not defined.</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="41"/>
+ <location filename="../db/chainexecutor.cpp" line="44"/>
<source>The database for executing queries was not open.</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="50"/>
+ <location filename="../db/chainexecutor.cpp" line="54"/>
<source>Could not disable foreign keys in the database. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="57"/>
+ <location filename="../db/chainexecutor.cpp" line="62"/>
<source>Could not start a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="84"/>
+ <location filename="../db/chainexecutor.cpp" line="89"/>
<source>Interrupted</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="145"/>
+ <location filename="../db/chainexecutor.cpp" line="151"/>
<source>Could not commit a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
@@ -243,17 +243,17 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>DbVersionConverter</name>
<message>
- <location filename="../dbversionconverter.cpp" line="913"/>
+ <location filename="../dbversionconverter.cpp" line="916"/>
<source>Target file exists, but could not be overwritten.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="932"/>
+ <location filename="../dbversionconverter.cpp" line="935"/>
<source>Could not find proper database plugin to create target database.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="1166"/>
+ <location filename="../dbversionconverter.cpp" line="1169"/>
<source>Error while converting database: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -341,23 +341,23 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="354"/>
- <location filename="../exportworker.cpp" line="412"/>
+ <location filename="../exportworker.cpp" line="346"/>
+ <location filename="../exportworker.cpp" line="404"/>
<source>Could not parse %1 in order to export it. It will be excluded from the export output.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="616"/>
+ <location filename="../exportworker.cpp" line="608"/>
<source>Error while reading data to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="624"/>
+ <location filename="../exportworker.cpp" line="616"/>
<source>Error while counting data to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="640"/>
+ <location filename="../exportworker.cpp" line="632"/>
<source>Error while counting data column width to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -365,43 +365,43 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>FunctionManagerImpl</name>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="232"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="234"/>
<source>Invalid number of arguments to function &apos;%1&apos;. Expected %2, but got %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="341"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
<source>No such function registered in SQLiteStudio: %1(%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="353"/>
<source>Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="365"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="371"/>
<source>Invalid regular expression pattern: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="384"/>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="417"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="390"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="423"/>
<source>Could not open file %1 for reading: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="439"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="445"/>
<source>Could not open file %1 for writting: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="459"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="465"/>
<source>Error while writting to file %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="477"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="483"/>
<source>Unsupported scripting language: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -417,7 +417,7 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>ImportManager</name>
<message>
- <location filename="../services/importmanager.cpp" line="93"/>
+ <location filename="../services/importmanager.cpp" line="96"/>
<source>Imported data to the table &apos;%1&apos; successfully.</source>
<translation type="unfinished"></translation>
</message>
@@ -435,41 +435,41 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="48"/>
+ <location filename="../importworker.cpp" line="52"/>
<source>Could not commit transaction for imported data: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="94"/>
+ <location filename="../importworker.cpp" line="100"/>
<source>Table &apos;%1&apos; has less columns than there are columns in the data to be imported. Excessive data columns will be ignored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="99"/>
+ <location filename="../importworker.cpp" line="105"/>
<source>Table &apos;%1&apos; has more columns than there are columns in the data to be imported. Some columns in the table will be left empty.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="117"/>
+ <location filename="../importworker.cpp" line="124"/>
<source>Could not create table to import to: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="168"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="180"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Error while importing data: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Interrupted.</source>
<comment>import process status update</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="163"/>
+ <location filename="../importworker.cpp" line="175"/>
<source>Could not import data row number %1. The row was ignored. Problem details: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -833,9 +833,14 @@ Error details: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="767"/>
+ <location filename="../dbversionconverter.cpp" line="759"/>
+ <source>SQLite %1 does not support row value clauses in expressions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../dbversionconverter.cpp" line="770"/>
- <location filename="../dbversionconverter.cpp" line="781"/>
+ <location filename="../dbversionconverter.cpp" line="773"/>
+ <location filename="../dbversionconverter.cpp" line="784"/>
<source>SQLite %1 does not support &apos;%2&apos; clause in expressions.</source>
<translation type="unfinished"></translation>
</message>
@@ -852,13 +857,13 @@ Error details: %2</source>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="1904"/>
- <location filename="../parser/sqlite3_parse.cpp" line="2171"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="2169"/>
<source>Parser stack overflow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="4465"/>
- <location filename="../parser/sqlite3_parse.cpp" line="5089"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="5088"/>
<source>Syntax error</source>
<translation type="unfinished"></translation>
</message>
@@ -913,17 +918,17 @@ Error details: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="333"/>
+ <location filename="../selectresolver.cpp" line="352"/>
<source>Could not resolve data source for column: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="405"/>
+ <location filename="../selectresolver.cpp" line="424"/>
<source>Could not resolve table for column &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/configimpl.cpp" line="612"/>
+ <location filename="../services/impl/configimpl.cpp" line="614"/>
<source>Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1026,28 +1031,28 @@ The view will remain as it is.</source>
<context>
<name>QueryExecutor</name>
<message>
- <location filename="../db/queryexecutor.cpp" line="137"/>
+ <location filename="../db/queryexecutor.cpp" line="142"/>
<source>Execution interrupted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="178"/>
+ <location filename="../db/queryexecutor.cpp" line="183"/>
<source>Database is not open.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="186"/>
+ <location filename="../db/queryexecutor.cpp" line="191"/>
<source>Only one query can be executed simultaneously.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="275"/>
- <location filename="../db/queryexecutor.cpp" line="560"/>
+ <location filename="../db/queryexecutor.cpp" line="294"/>
+ <location filename="../db/queryexecutor.cpp" line="568"/>
<source>An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="471"/>
+ <location filename="../db/queryexecutor.cpp" line="479"/>
<source>SQLiteStudio was unable to extract metadata from the query. Results won&apos;t be editable.</source>
<translation type="unfinished"></translation>
</message>
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm
index 668a42a..fccc28a 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm
Binary files differ
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts
index 6f86594..bac1096 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts
@@ -7,12 +7,12 @@
<location filename="../db/abstractdb.cpp" line="306"/>
<location filename="../db/abstractdb.cpp" line="323"/>
<source>Cannot execute query on closed database.</source>
- <translation>Impossible d&rsquo;exécuter la requête sur une base de données fermée.</translation>
+ <translation>Impossible d’exécuter la requête sur une base de données fermée.</translation>
</message>
<message>
<location filename="../db/abstractdb.cpp" line="603"/>
<source>Error attaching database %1: %2</source>
- <translation>Erreur base de données attachée %1:%2</translation>
+ <translation>Erreur base de données attachée %1 : %2</translation>
</message>
</context>
<context>
@@ -26,34 +26,40 @@
<context>
<name>ChainExecutor</name>
<message>
- <location filename="../db/chainexecutor.cpp" line="35"/>
+ <location filename="../db/chainexecutor.cpp" line="37"/>
<source>The database for executing queries was not defined.</source>
<comment>chain executor</comment>
- <translation>La base de données pour exécuter des requêtes n&rsquo;était pas définie.</translation>
+ <translation>La base de données pour exécuter des requêtes n’était pas définie.</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="41"/>
+ <location filename="../db/chainexecutor.cpp" line="44"/>
<source>The database for executing queries was not open.</source>
<comment>chain executor</comment>
- <translation>La base de données pour exécuter des requêtes n&rsquo;est pas ouverte.</translation>
+ <translation>La base de données pour exécuter des requêtes n’est pas ouverte.</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="47"/>
+ <location filename="../db/chainexecutor.cpp" line="54"/>
+ <source>Could not disable foreign keys in the database. Details: %1</source>
+ <comment>chain executor</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../db/chainexecutor.cpp" line="62"/>
<source>Could not start a database transaction. Details: %1</source>
<comment>chain executor</comment>
- <translation>Impossible d&rsquo;initialiser une transaction de la base de données:%1</translation>
+ <translation>Impossible d’initialiser une transaction de la base de données : %1</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="74"/>
+ <location filename="../db/chainexecutor.cpp" line="89"/>
<source>Interrupted</source>
<comment>chain executor</comment>
<translation>Interruption</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="134"/>
+ <location filename="../db/chainexecutor.cpp" line="151"/>
<source>Could not commit a database transaction. Details: %1</source>
<comment>chain executor</comment>
- <translation>Impossible d&rsquo;enregistrer la transaction de la base de données:%1</translation>
+ <translation>Impossible d’enregistrer la transaction de la base de données : %1</translation>
</message>
</context>
<context>
@@ -76,7 +82,7 @@
<message>
<location filename="../completionhelper.cpp" line="211"/>
<source>New index name</source>
- <translation>Nouveau nom d&rsquo;index</translation>
+ <translation>Nouveau nom d’index</translation>
</message>
<message>
<location filename="../completionhelper.cpp" line="214"/>
@@ -116,7 +122,7 @@
<message>
<location filename="../completionhelper.cpp" line="245"/>
<source>Error message</source>
- <translation>Message d&rsquo;erreur</translation>
+ <translation>Message d’erreur</translation>
</message>
<message>
<location filename="../completionhelper.cpp" line="289"/>
@@ -126,7 +132,7 @@
<message>
<location filename="../completionhelper.cpp" line="304"/>
<source>Any word</source>
- <translation>N&rsquo;importe quel mot</translation>
+ <translation>N’importe quel mot</translation>
</message>
<message>
<location filename="../completionhelper.cpp" line="485"/>
@@ -144,33 +150,33 @@
<message>
<location filename="../services/impl/dbmanagerimpl.cpp" line="63"/>
<source>Could not add database %1: %2</source>
- <translation>Impossible d&rsquo;ajouter une base de données %1: %2</translation>
+ <translation>Impossible d’ajouter une base de données %1 : %2</translation>
</message>
<message>
<location filename="../services/impl/dbmanagerimpl.cpp" line="138"/>
<source>Database %1 could not be updated, because of an error: %2</source>
- <translation>La base de données %1 ne peut ëtre mise à jour à cause de l&rsquo;erreur: %2</translation>
+ <translation>La base de données %1 ne peut ëtre mise à jour à cause de l’erreur : %2</translation>
</message>
<message>
- <location filename="../services/impl/dbmanagerimpl.cpp" line="312"/>
- <location filename="../services/impl/dbmanagerimpl.cpp" line="341"/>
+ <location filename="../services/impl/dbmanagerimpl.cpp" line="350"/>
+ <location filename="../services/impl/dbmanagerimpl.cpp" line="379"/>
<source>Database file doesn&apos;t exist.</source>
- <translation>Le fichier de la base de données n&rsquo;existe pas.</translation>
+ <translation>Le fichier de la base de données n’existe pas.</translation>
</message>
<message>
- <location filename="../services/impl/dbmanagerimpl.cpp" line="314"/>
- <location filename="../services/impl/dbmanagerimpl.cpp" line="343"/>
- <location filename="../services/impl/dbmanagerimpl.cpp" line="565"/>
+ <location filename="../services/impl/dbmanagerimpl.cpp" line="352"/>
+ <location filename="../services/impl/dbmanagerimpl.cpp" line="381"/>
+ <location filename="../services/impl/dbmanagerimpl.cpp" line="604"/>
<source>No supporting plugin loaded.</source>
<translation>Aucun plugin supporté chargé.</translation>
</message>
<message>
- <location filename="../services/impl/dbmanagerimpl.cpp" line="484"/>
+ <location filename="../services/impl/dbmanagerimpl.cpp" line="522"/>
<source>Database could not be initialized.</source>
<translation>La base de données ne peut être initialisée.</translation>
</message>
<message>
- <location filename="../services/impl/dbmanagerimpl.cpp" line="494"/>
+ <location filename="../services/impl/dbmanagerimpl.cpp" line="532"/>
<source>No suitable database driver plugin found.</source>
<translation>Aucun pilote de base de données approprié trouvé.</translation>
</message>
@@ -181,12 +187,12 @@
<location filename="../dbobjectorganizer.cpp" line="380"/>
<location filename="../dbobjectorganizer.cpp" line="412"/>
<source>Error while creating table in target database: %1</source>
- <translation>Erreur lors de la creation de la table de la base de données: %1</translation>
+ <translation>Erreur lors de la creation de la table de la base de données : %1</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="380"/>
<source>Could not parse table.</source>
- <translation>Impossible d&rsquo;analyser la table.</translation>
+ <translation>Impossible d’analyser la table.</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="426"/>
@@ -196,54 +202,61 @@
<message>
<location filename="../dbobjectorganizer.cpp" line="447"/>
<source>Error while copying data for table %1: %2</source>
- <translation>Erreur lors de la copie des données vers la table %1: %2</translation>
+ <translation>Erreur lors de la copie des données vers la table %1 : %2</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="466"/>
<location filename="../dbobjectorganizer.cpp" line="473"/>
<location filename="../dbobjectorganizer.cpp" line="496"/>
<source>Error while copying data to table %1: %2</source>
- <translation>Erreur lors de la copie des données de la table %1: %2</translation>
+ <translation>Erreur lors de la copie des données de la table %1 : %2</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="535"/>
<source>Error while dropping source view %1: %2
Tables, indexes, triggers and views copied to database %3 will remain.</source>
- <translation>Erreur à la création de la vue %1: %2
+ <translation>Erreur à la création de la vue %1 : %2
Tables, index, déclencheurs et vues copiés de la base de données %3 seront maintenus.</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="542"/>
<source>Error while creating view in target database: %1</source>
- <translation>Erreur lors de la création de la vue de la base de données:%1</translation>
+ <translation>Erreur lors de la création de la vue de la base de données : %1</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="547"/>
<source>Error while creating index in target database: %1</source>
- <translation>Erreur lors de la création de l&rsquo;index de la base de données:%1</translation>
+ <translation>Erreur lors de la création de l’index de la base de données : %1</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="552"/>
<source>Error while creating trigger in target database: %1</source>
- <translation>Erreur lors de la création du déclencheur de la base de données:%1</translation>
+ <translation>Erreur lors de la création du déclencheur de la base de données : %1</translation>
+ </message>
+ <message>
+ <location filename="../dbobjectorganizer.cpp" line="773"/>
+ <location filename="../dbobjectorganizer.cpp" line="780"/>
+ <location filename="../dbobjectorganizer.cpp" line="789"/>
+ <source>Could not parse object &apos;%1&apos; in order to move or copy it.</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DbVersionConverter</name>
<message>
- <location filename="../dbversionconverter.cpp" line="923"/>
+ <location filename="../dbversionconverter.cpp" line="916"/>
<source>Target file exists, but could not be overwritten.</source>
<translation>Le fichier cible existe, mais ne peut être remplacé.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="942"/>
+ <location filename="../dbversionconverter.cpp" line="935"/>
<source>Could not find proper database plugin to create target database.</source>
<translation>Impossible de trouver le plugin correct pour créer la base de données cible.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="1176"/>
+ <location filename="../dbversionconverter.cpp" line="1169"/>
<source>Error while converting database: %1</source>
- <translation>Erreur lors de la conversion de la base de données: %1</translation>
+ <translation>Erreur lors de la conversion de la base de données : %1</translation>
</message>
</context>
<context>
@@ -264,7 +277,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<location filename="../ddlhistorymodel.cpp" line="69"/>
<source>Date of execution</source>
<comment>ddl history header</comment>
- <translation>Date d&rsquo;exécution</translation>
+ <translation>Date d’exécution</translation>
</message>
<message>
<location filename="../ddlhistorymodel.cpp" line="71"/>
@@ -278,22 +291,22 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../services/exportmanager.cpp" line="72"/>
<source>Export plugin %1 doesn&apos;t support exporing query results.</source>
- <translation>Plugin d&rsquo;export %1 ne supporte pas l&rsquo;exportation de la requête.</translation>
+ <translation>Plugin d’export %1 ne supporte pas l’exportation de la requête.</translation>
</message>
<message>
<location filename="../services/exportmanager.cpp" line="98"/>
<source>Export plugin %1 doesn&apos;t support exporing tables.</source>
- <translation>Plugin d&rsquo;export %1 ne supporte pas l&rsquo;exportation de la table.</translation>
+ <translation>Plugin d’export %1 ne supporte pas l’exportation de la table.</translation>
</message>
<message>
<location filename="../services/exportmanager.cpp" line="122"/>
<source>Export plugin %1 doesn&apos;t support exporing databases.</source>
- <translation>Plugin d&rsquo;export %1 ne supporte pas l&rsquo;exportation de la base de données.</translation>
+ <translation>Plugin d’export %1 ne supporte pas l’exportation de la base de données.</translation>
</message>
<message>
<location filename="../services/exportmanager.cpp" line="155"/>
<source>Export format &apos;%1&apos; is not supported. Supported formats are: %2.</source>
- <translation>Format d&rsquo;export «&nbsp;%1&nbsp;» n&rsquo;est pas supporté. Les formats supportés sont: %2.</translation>
+ <translation>Format d’export « %1 » n’est pas supporté. Les formats supportés sont : %2.</translation>
</message>
<message>
<location filename="../services/exportmanager.cpp" line="218"/>
@@ -303,7 +316,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../services/exportmanager.cpp" line="222"/>
<source>Export to the file &apos;%1&apos; was successful.</source>
- <translation>Export vers le fichier &rsquo;%1&rsquo; avec succès.</translation>
+ <translation>Export vers le fichier « %1 » avec succès.</translation>
</message>
<message>
<location filename="../services/exportmanager.cpp" line="224"/>
@@ -313,85 +326,85 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../services/exportmanager.cpp" line="266"/>
<source>Could not export to file %1. File cannot be open for writting.</source>
- <translation>Impossible d&rsquo;exporter vers le fichier %1. Le fichier ne peut être ouvert en écriture.</translation>
+ <translation>Impossible d’exporter vers le fichier %1. Le fichier ne peut être ouvert en écriture.</translation>
</message>
</context>
<context>
<name>ExportWorker</name>
<message>
- <location filename="../exportworker.cpp" line="121"/>
+ <location filename="../exportworker.cpp" line="122"/>
<source>Error while exporting query results: %1</source>
- <translation>Erreur lors de l&rsquo;exportation des résultats de la requête:%1</translation>
+ <translation>Erreur lors de l’exportation des résultats de la requête : %1</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="201"/>
+ <location filename="../exportworker.cpp" line="202"/>
<source>Error while counting data column width to export from query results: %1</source>
- <translation>Erreur lors de la totalisation des données de colonne issu de la requête: %1</translation>
+ <translation>Erreur lors de la totalisation des données de colonne issu de la requête : %1</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="353"/>
- <location filename="../exportworker.cpp" line="411"/>
+ <location filename="../exportworker.cpp" line="346"/>
+ <location filename="../exportworker.cpp" line="404"/>
<source>Could not parse %1 in order to export it. It will be excluded from the export output.</source>
- <translation>Impossible d&rsquo;analyser %1 afin de l&rsquo;exporter. Celle-ci sera excluse de l&rsquo;exportation.</translation>
+ <translation>Impossible d’analyser %1 afin de l’exporter. Celle-ci sera excluse de l’exportation.</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="612"/>
+ <location filename="../exportworker.cpp" line="608"/>
<source>Error while reading data to export from table %1: %2</source>
- <translation>Erreur lors de la lecture des données à exporter de la table %1: %2</translation>
+ <translation>Erreur lors de la lecture des données à exporter de la table %1 : %2</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="620"/>
+ <location filename="../exportworker.cpp" line="616"/>
<source>Error while counting data to export from table %1: %2</source>
- <translation>Erreur lors du comptage des données à exporter de la table %1: %2</translation>
+ <translation>Erreur lors du comptage des données à exporter de la table %1 : %2</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="636"/>
+ <location filename="../exportworker.cpp" line="632"/>
<source>Error while counting data column width to export from table %1: %2</source>
- <translation>Erreur lors de la totalisation des données à exporter de la table %1: %2</translation>
+ <translation>Erreur lors de la totalisation des données à exporter de la table %1 : %2</translation>
</message>
</context>
<context>
<name>FunctionManagerImpl</name>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="232"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="234"/>
<source>Invalid number of arguments to function &apos;%1&apos;. Expected %2, but got %3.</source>
- <translation>Nombre de paramètres invalide de la fonction %1. Attendu %2, obtenu %3.</translation>
+ <translation>Nombre de paramètres invalide de la fonction « %1 ». Attendu %2, obtenu %3.</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="341"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
<source>No such function registered in SQLiteStudio: %1(%2)</source>
- <translation>Fonction inconnue avec SQLiteStudio: %1(%2)</translation>
+ <translation>Fonction inconnue avec SQLiteStudio : %1(%2)</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="353"/>
<source>Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded.</source>
- <translation>La fonction %1(%2) est référencée avec le langage %3, mais le plugin supportant ce langage n&rsquo;est actuellement pas chargé.</translation>
+ <translation>La fonction %1(%2) est référencée avec le langage %3, mais le plugin supportant ce langage n’est actuellement pas chargé.</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="365"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="371"/>
<source>Invalid regular expression pattern: %1</source>
- <translation>Expression invalide: %1</translation>
+ <translation>Expression invalide : %1</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="384"/>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="417"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="390"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="423"/>
<source>Could not open file %1 for reading: %2</source>
- <translation>Impossible d&rsquo;ouvrir en lecture le ficher %1:%2</translation>
+ <translation>Impossible d’ouvrir en lecture le ficher %1 : %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="439"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="445"/>
<source>Could not open file %1 for writting: %2</source>
- <translation>Impossible d&rsquo;ouvrir en écriture le ficher %1:%2</translation>
+ <translation>Impossible d’ouvrir en écriture le ficher %1 : %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="459"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="465"/>
<source>Error while writting to file %1: %2</source>
- <translation>Erreur lors de l&rsquo;écriture du fichier %1:%2</translation>
+ <translation>Erreur lors de l’écriture du fichier %1 : %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="477"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="483"/>
<source>Unsupported scripting language: %1</source>
- <translation>Langage script non supporté: %1</translation>
+ <translation>Langage script non supporté : %1</translation>
</message>
</context>
<context>
@@ -399,15 +412,15 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../plugins/genericexportplugin.cpp" line="20"/>
<source>Could not initialize text codec for exporting. Using default codec: %1</source>
- <translation>Impossible d&rsquo;initialiser le paramètre texte por l&rsquo;export. Utulisation du paramètre par défaut: %1</translation>
+ <translation>Impossible d’initialiser le paramètre texte por l’export. Utulisation du paramètre par défaut : %1</translation>
</message>
</context>
<context>
<name>ImportManager</name>
<message>
- <location filename="../services/importmanager.cpp" line="93"/>
+ <location filename="../services/importmanager.cpp" line="96"/>
<source>Imported data to the table &apos;%1&apos; successfully.</source>
- <translation>Importation des données de la table «&nbsp;%1&nbsp;» réussie.</translation>
+ <translation>Importation des données de la table « %1 » réussie.</translation>
</message>
</context>
<context>
@@ -415,49 +428,49 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../importworker.cpp" line="24"/>
<source>No columns provided by the import plugin.</source>
- <translation>Aucune colonne fournie par le plugin d&rsquo;importation.</translation>
+ <translation>Aucune colonne fournie par le plugin d’importation.</translation>
</message>
<message>
<location filename="../importworker.cpp" line="30"/>
<source>Could not start transaction in order to import a data: %1</source>
- <translation>Impossible d&rsquo;initialiser la transaction d&rsquo;import de données: %1</translation>
+ <translation>Impossible d’initialiser la transaction d’import de données : %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="48"/>
+ <location filename="../importworker.cpp" line="52"/>
<source>Could not commit transaction for imported data: %1</source>
- <translation>Impossible d&rsquo;enregistrer la transaction d&rsquo;import de données: %1</translation>
+ <translation>Impossible d’enregistrer la transaction d’import de données : %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="94"/>
+ <location filename="../importworker.cpp" line="100"/>
<source>Table &apos;%1&apos; has less columns than there are columns in the data to be imported. Excessive data columns will be ignored.</source>
- <translation>La table «&nbsp;%1&nbsp;» a moins de colonnes que de données à importer. Les colonnes supplèmentaires seront ignorées.</translation>
+ <translation>La table « %1 » a moins de colonnes que de données à importer. Les colonnes supplèmentaires seront ignorées.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="99"/>
+ <location filename="../importworker.cpp" line="105"/>
<source>Table &apos;%1&apos; has more columns than there are columns in the data to be imported. Some columns in the table will be left empty.</source>
- <translation>La table «&nbsp;%1&nbsp;» a plus de colonnes que de colonnes de données à importer. Certaines colonnes de la table seront vides.</translation>
+ <translation>La table « %1 » a plus de colonnes que de colonnes de données à importer. Certaines colonnes de la table seront vides.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="117"/>
+ <location filename="../importworker.cpp" line="124"/>
<source>Could not create table to import to: %1</source>
- <translation>Impossible de créer la table d&rsquo;import: %1</translation>
+ <translation>Impossible de créer la table d’import : %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="163"/>
- <location filename="../importworker.cpp" line="170"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="180"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Error while importing data: %1</source>
- <translation>Erreur lors de l&rsquo;import des données: %1</translation>
+ <translation>Erreur lors de l’import des données : %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="170"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Interrupted.</source>
<comment>import process status update</comment>
<translation>Transaction interrompue.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="158"/>
+ <location filename="../importworker.cpp" line="175"/>
<source>Could not import data row number %1. The row was ignored. Problem details: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -472,12 +485,12 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../services/impl/pluginmanagerimpl.cpp" line="554"/>
<source>Cannot load plugin %1, because its dependency was not loaded: %2.</source>
- <translation>Chargement impossible du plugin %1, les dépendances n&rsquo;ont pa été chargées: %2.</translation>
+ <translation>Chargement impossible du plugin %1, les dépendances n’ont pa été chargées : %2.</translation>
</message>
<message>
<location filename="../services/impl/pluginmanagerimpl.cpp" line="563"/>
<source>Cannot load plugin %1. Error details: %2</source>
- <translation>Chargement impossible du plugin %1, Détails de l&rsquo;erreur: %2</translation>
+ <translation>Chargement impossible du plugin %1, Détails de l’erreur : %2</translation>
</message>
<message>
<location filename="../services/impl/pluginmanagerimpl.cpp" line="579"/>
@@ -485,16 +498,16 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<translation>Chargement impossible du plugin %1 (erreur à initialisation du plugin).</translation>
</message>
<message>
- <location filename="../services/impl/pluginmanagerimpl.cpp" line="732"/>
+ <location filename="../services/impl/pluginmanagerimpl.cpp" line="731"/>
<source>min: %1</source>
<comment>plugin dependency version</comment>
- <translation>min %1</translation>
+ <translation>min : %1</translation>
</message>
<message>
- <location filename="../services/impl/pluginmanagerimpl.cpp" line="733"/>
+ <location filename="../services/impl/pluginmanagerimpl.cpp" line="732"/>
<source>max: %1</source>
<comment>plugin dependency version</comment>
- <translation>max %1</translation>
+ <translation>max : %1</translation>
</message>
</context>
<context>
@@ -511,7 +524,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../plugins/populateconstant.ui" line="20"/>
<source>Constant value:</source>
- <translation>Valeur constante:</translation>
+ <translation>Valeur constante :</translation>
</message>
</context>
<context>
@@ -553,7 +566,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../plugins/populatedictionary.ui" line="74"/>
<source>Method of using words</source>
- <translation>Méthode d&rsquo;utilisation des mots</translation>
+ <translation>Méthode d’utilisation des mots</translation>
</message>
<message>
<location filename="../plugins/populatedictionary.ui" line="80"/>
@@ -571,7 +584,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../services/populatemanager.cpp" line="89"/>
<source>Table &apos;%1&apos; populated successfully.</source>
- <translation>Table «&nbsp;%1&nbsp;» remplie avec succès.</translation>
+ <translation>Table « %1 » remplie avec succès.</translation>
</message>
</context>
<context>
@@ -628,7 +641,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../plugins/populaterandomtext.ui" line="20"/>
<source>Use characters from common sets:</source>
- <translation>Utilisez des caractères de la table standard:</translation>
+ <translation>Utilisez des caractères de la table standard :</translation>
</message>
<message>
<location filename="../plugins/populaterandomtext.ui" line="36"/>
@@ -668,7 +681,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../plugins/populaterandomtext.ui" line="103"/>
<source>Includes all above and all others.</source>
- <translation>Inclus ci dessus et tous les autres.</translation>
+ <translation>Inclus ci-dessus et tous les autres.</translation>
</message>
<message>
<location filename="../plugins/populaterandomtext.ui" line="106"/>
@@ -678,7 +691,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../plugins/populaterandomtext.ui" line="119"/>
<source>Use characters from my custom set:</source>
- <translation>Utilisez les catactères de ma table personalisée:</translation>
+ <translation>Utilisez les catactères de ma table personalisée :</translation>
</message>
<message>
<location filename="../plugins/populaterandomtext.ui" line="132"/>
@@ -704,7 +717,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../plugins/populatescript.ui" line="26"/>
<source>Initialization code (optional)</source>
- <translation>Code d&rsquo;initialisation (optionel)</translation>
+ <translation>Code d’initialisation (optionel)</translation>
</message>
<message>
<location filename="../plugins/populatescript.ui" line="45"/>
@@ -735,12 +748,12 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../plugins/populatesequence.ui" line="33"/>
<source>Start value:</source>
- <translation>Valeur de départ:</translation>
+ <translation>Valeur de départ :</translation>
</message>
<message>
<location filename="../plugins/populatesequence.ui" line="56"/>
<source>Step:</source>
- <translation>Incrément:</translation>
+ <translation>Incrément :</translation>
</message>
</context>
<context>
@@ -748,17 +761,17 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../populateworker.cpp" line="23"/>
<source>Could not start transaction in order to perform table populating. Error details: %1</source>
- <translation>Impossible d&rsquo;initialiser la transaction pour remplir la table.Détails de l&rsquo;erreur %1</translation>
+ <translation>Impossible d’initialiser la transaction pour remplir la table.Détails de l’erreur %1</translation>
</message>
<message>
<location filename="../populateworker.cpp" line="63"/>
<source>Error while populating table: %1</source>
- <translation>Erreur lors du remplissage de la table: %1</translation>
+ <translation>Erreur lors du remplissage de la table : %1</translation>
</message>
<message>
<location filename="../populateworker.cpp" line="74"/>
<source>Could not commit transaction after table populating. Error details: %1</source>
- <translation>Impossible d&rsquo;enregistrer la transaction après le remplissage de la table. Erreur %1</translation>
+ <translation>Impossible d’enregistrer la transaction après le remplissage de la table. Erreur %1</translation>
</message>
</context>
<context>
@@ -767,7 +780,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<location filename="../db/abstractdb2.h" line="199"/>
<location filename="../db/abstractdb3.h" line="356"/>
<source>Could not open database: %1</source>
- <translation>Impossible d&rsquo;ouvrir la base de données: %1</translation>
+ <translation>Impossible d’ouvrir la base de données : %1</translation>
</message>
<message>
<location filename="../db/abstractdb2.h" line="805"/>
@@ -778,7 +791,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<message>
<location filename="../db/abstractdb3.h" line="376"/>
<source>Could not close database: %1</source>
- <translation>Impossible de clore la base de bonnées: %1</translation>
+ <translation>Impossible de clore la base de bonnées : %1</translation>
</message>
<message>
<location filename="../dbversionconverter.cpp" line="137"/>
@@ -789,18 +802,18 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma
<location filename="../dbversionconverter.cpp" line="253"/>
<location filename="../dbversionconverter.cpp" line="331"/>
<source>SQLite %1 does not support &apos;%2&apos; statement.</source>
- <translation>SQLite %1 ne supporte pas l&rsquo;instruction «&nbsp;%2&nbsp;».</translation>
+ <translation>SQLite %1 ne supporte pas l’instruction « %2 ».</translation>
</message>
<message>
<location filename="../dbversionconverter.cpp" line="201"/>
<source>SQLite %1 does not support &apos;%2&apos; statement, but the regular table can be created instead if you proceed.</source>
- <translation>SQLite %1 ne supporte pas l&rsquo;instruction «&nbsp;%2&nbsp;», mais la table normale peut être créée à la place si vous confirmez.</translation>
+ <translation>SQLite %1 ne supporte pas l’instruction « %2 », mais la table normale peut être créée à la place si vous confirmez.</translation>
</message>
<message>
<location filename="../dbversionconverter.cpp" line="424"/>
<source>Could not parse statement: %1
Error details: %2</source>
- <translation>Impossible d&rsquo;analyser l&rsquo;instruction: %1
+ <translation>Impossible d’analyser l’instruction : %1
Détails erreur: %2</translation>
</message>
<message>
@@ -809,29 +822,34 @@ Détails erreur: %2</translation>
<location filename="../dbversionconverter.cpp" line="482"/>
<location filename="../dbversionconverter.cpp" line="515"/>
<source>SQLite %1 does not support the &apos;%2&apos; clause. Cannot convert &apos;%3&apos; statement with that clause.</source>
- <translation>SQLite %1 ne supporte pas la clause «&nbsp;%2&nbsp;». Impossible de convertir l&rsquo;instruction «&nbsp;%3&nbsp;» avec cette clause.</translation>
+ <translation>SQLite %1 ne supporte pas la clause « %2 ». Impossible de convertir l’instruction « %3 » avec cette clause.</translation>
</message>
<message>
<location filename="../dbversionconverter.cpp" line="488"/>
<source>SQLite %1 does not support the &apos;%2&apos; clause in the &apos;%3&apos; statement.</source>
- <translation>SQLite %1 ne supporte pas la clause «&nbsp;%2&nbsp;» de l&rsquo;instruction «&nbsp;%3&nbsp;».</translation>
+ <translation>SQLite %1 ne supporte pas la clause « %2 » de l’instruction « %3 ».</translation>
</message>
<message>
<location filename="../dbversionconverter.cpp" line="756"/>
<source>SQLite %1 does not support current date or time clauses in expressions.</source>
- <translation>SQLite %1 ne supporte pas la clause date ou l&rsquo;heure actuelle dans l&rsquo;expression.</translation>
+ <translation>SQLite %1 ne supporte pas la clause date ou l’heure actuelle dans l’expression.</translation>
+ </message>
+ <message>
+ <location filename="../dbversionconverter.cpp" line="759"/>
+ <source>SQLite %1 does not support row value clauses in expressions.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="767"/>
<location filename="../dbversionconverter.cpp" line="770"/>
- <location filename="../dbversionconverter.cpp" line="781"/>
+ <location filename="../dbversionconverter.cpp" line="773"/>
+ <location filename="../dbversionconverter.cpp" line="784"/>
<source>SQLite %1 does not support &apos;%2&apos; clause in expressions.</source>
- <translation>SQLite %1 ne supporte pas la clause «&nbsp;%2&nbsp;» dans l&rsquo;expression.</translation>
+ <translation>SQLite %1 ne supporte pas la clause « %2 » dans l’expression.</translation>
</message>
<message>
- <location filename="../impl/dbattacherimpl.cpp" line="109"/>
+ <location filename="../impl/dbattacherimpl.cpp" line="115"/>
<source>Could not attach database %1: %2</source>
- <translation>Impossible d&rsquo;attacher la base de données %1: %2</translation>
+ <translation>Impossible d’attacher la base de données %1 : %2</translation>
</message>
<message>
<location filename="../parser/parsercontext.cpp" line="108"/>
@@ -841,20 +859,20 @@ Détails erreur: %2</translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="1904"/>
- <location filename="../parser/sqlite3_parse.cpp" line="2167"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="2169"/>
<source>Parser stack overflow</source>
<translation>Analyse dépassement pile</translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="4465"/>
- <location filename="../parser/sqlite3_parse.cpp" line="5084"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="5088"/>
<source>Syntax error</source>
<translation>Erreur de syntaxe</translation>
</message>
<message>
<location filename="../plugins/populatedictionary.cpp" line="30"/>
<source>Could not open dictionary file %1 for reading.</source>
- <translation>Impossible d&rsquo;ouvrir en lecture le fichier dictionnaire %1.</translation>
+ <translation>Impossible d’ouvrir en lecture le fichier dictionnaire %1.</translation>
</message>
<message>
<location filename="../plugins/populatedictionary.cpp" line="91"/>
@@ -879,39 +897,44 @@ Détails erreur: %2</translation>
<message>
<location filename="../plugins/populatescript.cpp" line="40"/>
<source>Could not find plugin to support scripting language: %1</source>
- <translation>Impossible de trouver le plugin supportant le script: %1</translation>
+ <translation>Impossible de trouver le plugin supportant le script : %1</translation>
</message>
<message>
<location filename="../plugins/populatescript.cpp" line="58"/>
<source>Error while executing populating initial code: %1</source>
- <translation>Erreur à l&rsquo;initialisation du code de remplissage: %1</translation>
+ <translation>Erreur à l’initialisation du code de remplissage : %1</translation>
</message>
<message>
<location filename="../plugins/populatescript.cpp" line="80"/>
<source>Error while executing populating code: %1</source>
- <translation>Erreur à l&rsquo;exécution du code de remplissage: %1</translation>
+ <translation>Erreur à l’exécution du code de remplissage : %1</translation>
</message>
<message>
<location filename="../plugins/populatescript.cpp" line="112"/>
<source>Select implementation language.</source>
- <translation>Sélectionnez l&rsquo;application langage.</translation>
+ <translation>Sélectionnez l’application langage.</translation>
</message>
<message>
<location filename="../plugins/populatescript.cpp" line="113"/>
<source>Implementation code cannot be empty.</source>
- <translation>L&rsquo;application de code ne peut être vide.</translation>
+ <translation>L’application de code ne peut être vide.</translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="317"/>
+ <location filename="../selectresolver.cpp" line="352"/>
<source>Could not resolve data source for column: %1</source>
- <translation>Impossible de résoudre la source de données pour la colonnes: %1</translation>
+ <translation>Impossible de résoudre la source de données pour la colonnes : %1</translation>
+ </message>
+ <message>
+ <location filename="../selectresolver.cpp" line="424"/>
+ <source>Could not resolve table for column &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/configimpl.cpp" line="612"/>
+ <location filename="../services/impl/configimpl.cpp" line="614"/>
<source>Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1.</source>
- <translation>Impossible d&rsquo;initialiser le fichier de configuration.
+ <translation>Impossible d’initialiser le fichier de configuration.
Aucune modification et les requêtes seront perdues après redémarrage.
- Essayez d&rsquo;initialiser le fichier avec cette localisation: %1.</translation>
+ Essayez d’initialiser le fichier avec cette localisation : %1.</translation>
</message>
<message>
<location filename="../sqlitestudio.cpp" line="291"/>
@@ -956,39 +979,39 @@ Détails erreur: %2</translation>
<translation>Peuplement de la table</translation>
</message>
<message>
- <location filename="../tablemodifier.cpp" line="107"/>
+ <location filename="../tablemodifier.cpp" line="115"/>
<source>Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3.</source>
- <translation>La table %1 référence la table %2, mais la clé étrangère ne pourra être mise à jour pour la nouvelle table à cause de problèmes lors de l&rsquo;analyse DDL de la table %3.</translation>
+ <translation>La table %1 référence la table %2, mais la clef étrangère ne pourra être mise à jour pour la nouvelle table à cause de problèmes lors de l’analyse DDL de la table %3.</translation>
</message>
<message>
- <location filename="../tablemodifier.cpp" line="379"/>
+ <location filename="../tablemodifier.cpp" line="389"/>
<source>All columns indexed by the index %1 are gone. The index will not be recreated after table modification.</source>
- <translation>Toutes les colonnes indéxées par l&rsquo;indexe %1 sont faites. L&rsquo;indexe ne sera pas recréé après la modification de la table.</translation>
+ <translation>Toutes les colonnes indéxées par l’index %1 sont traitées. L’index ne sera pas recréé après la modification de la table.</translation>
</message>
<message>
- <location filename="../tablemodifier.cpp" line="418"/>
+ <location filename="../tablemodifier.cpp" line="428"/>
<source>There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../tablemodifier.cpp" line="465"/>
+ <location filename="../tablemodifier.cpp" line="475"/>
<source>Cannot not update trigger %1 according to table %2 modification.</source>
- <translation>Impossible de mettre à jour le déclencheur%1 selon la modification de la table %2.</translation>
+ <translation>Impossible de mettre à jour le déclencheur %1 selon la modification de la table %2.</translation>
</message>
<message>
- <location filename="../tablemodifier.cpp" line="645"/>
- <location filename="../tablemodifier.cpp" line="669"/>
- <location filename="../tablemodifier.cpp" line="688"/>
+ <location filename="../tablemodifier.cpp" line="655"/>
+ <location filename="../tablemodifier.cpp" line="679"/>
+ <location filename="../tablemodifier.cpp" line="698"/>
<source>There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../tablemodifier.cpp" line="433"/>
+ <location filename="../tablemodifier.cpp" line="443"/>
<source>All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification.</source>
<translation>Toutes les colonnes couvertes par le déclencheur %1 sont faites. Le déclencheur ne sera pas recréé après la modification de la table.</translation>
</message>
<message>
- <location filename="../tablemodifier.cpp" line="483"/>
+ <location filename="../tablemodifier.cpp" line="493"/>
<source>Cannot not update view %1 according to table %2 modifications.
The view will remain as it is.</source>
<translation>Impossible de mettre à jour les modifications de la vue %1 issue de la table %2
@@ -996,51 +1019,51 @@ La vue restera telque.</translation>
</message>
<message>
<source>There is a problem with updating an %1 statement within %2 trigger. One of the SELECT substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary.</source>
- <translation type="obsolete">Il y a un problème à la mise à jour l&rsquo;instruction %1 avec le déclencheur %2. Une partie de l&rsquo;instruction SELECT référençant la table %3 ne ppermet pas sa modification. La mise à jour manuelle du déclencheur est nécessaire.</translation>
+ <translation type="obsolete">Il y a un problème à la mise à jour l’instruction %1 avec le déclencheur %2. Une partie de l’instruction SELECT référençant la table %3 ne ppermet pas sa modification. La mise à jour manuelle du déclencheur est nécessaire.</translation>
</message>
<message>
<location filename="../viewmodifier.cpp" line="25"/>
<source>Could not parse DDL of the view to be created. Details: %1</source>
- <translation>Impossible d&rsquo;analyser le DDL de création de vue. Détails: %1</translation>
+ <translation>Impossible d’analyser le DDL de création de vue. Détails : %1</translation>
</message>
<message>
<location filename="../viewmodifier.cpp" line="34"/>
<source>Parsed query is not CREATE VIEW. It&apos;s: %1</source>
- <translation>L&rsquo;expression CREATE VIEW est fausse. C&rsquo;est: %1</translation>
+ <translation>L’expression CREATE VIEW est fausse. C’est : %1</translation>
</message>
<message>
<location filename="../viewmodifier.cpp" line="82"/>
<source>SQLiteStudio was unable to resolve columns returned by the new view, therefore it won&apos;t be able to tell which triggers might fail during the recreation process.</source>
- <translation>SQLiteStudio ne peut résoudre les colonnes résultant de la nouvelle vue, d&rsquo;où le déclencheur en cause ne pourra être indiqué pendant le process.</translation>
+ <translation>SQLiteStudio ne peut résoudre les colonnes résultant de la nouvelle vue, d’où le déclencheur en cause ne pourra être indiqué pendant le process.</translation>
</message>
</context>
<context>
<name>QueryExecutor</name>
<message>
- <location filename="../db/queryexecutor.cpp" line="133"/>
+ <location filename="../db/queryexecutor.cpp" line="142"/>
<source>Execution interrupted.</source>
<translation>Exécution interrompue.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="174"/>
+ <location filename="../db/queryexecutor.cpp" line="183"/>
<source>Database is not open.</source>
- <translation>La base de données n&rsquo;est ouverte.</translation>
+ <translation>La base de données n’est ouverte.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="182"/>
+ <location filename="../db/queryexecutor.cpp" line="191"/>
<source>Only one query can be executed simultaneously.</source>
<translation>Une seule requête peut être exécutée à la fois.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="264"/>
- <location filename="../db/queryexecutor.cpp" line="548"/>
+ <location filename="../db/queryexecutor.cpp" line="294"/>
+ <location filename="../db/queryexecutor.cpp" line="568"/>
<source>An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1</source>
- <translation>Une erreur s&rsquo;est produite à l&rsquo;exécution de la requête count(*), la recherche des données est arrêtée. Erreur de la base de données:%1</translation>
+ <translation>Une erreur s’est produite à l’exécution de la requête count(*), la recherche des données est arrêtée. Erreur de la base de données : %1</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="459"/>
+ <location filename="../db/queryexecutor.cpp" line="479"/>
<source>SQLiteStudio was unable to extract metadata from the query. Results won&apos;t be editable.</source>
- <translation>SQLiteStudio ne peut extraire des métadonnées d&rsquo;une requête. Les résultats ne peut être affichés.</translation>
+ <translation>SQLiteStudio ne peut extraire des métadonnées d’une requête. Les résultats ne peut être affichés.</translation>
</message>
</context>
<context>
@@ -1053,7 +1076,7 @@ La vue restera telque.</translation>
<message>
<location filename="../plugins/scriptingqtdbproxy.cpp" line="65"/>
<source>Error from %1: %2</source>
- <translation>Erreur de %1: %2</translation>
+ <translation>Erreur de %1 : %2</translation>
</message>
</context>
<context>
@@ -1068,7 +1091,7 @@ La vue restera telque.</translation>
<location filename="../sqlhistorymodel.cpp" line="32"/>
<source>Execution date</source>
<comment>sql history header</comment>
- <translation>Date d&rsquo;exécution</translation>
+ <translation>Date d’exécution</translation>
</message>
<message>
<location filename="../sqlhistorymodel.cpp" line="34"/>
@@ -1094,18 +1117,18 @@ La vue restera telque.</translation>
<message>
<location filename="../services/updatemanager.cpp" line="131"/>
<source>An error occurred while checking for updates: %1.</source>
- <translation>Une erreur est apparue lors du contrôle pour la mise à jour:%1.
+ <translation>Une erreur est apparue lors du contrôle pour la mise à jour : %1.
</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="144"/>
<source>Could not check available updates, because server responded with invalid message format. It is safe to ignore this warning.</source>
- <translation>Impossible de vérifier la mise à jour, car le serveur a répondu avec un message invalide. Il est possible d&rsquo;ignorer le warning.</translation>
+ <translation>Impossible de vérifier la mise à jour, car le serveur a répondu avec un message invalide. Il est possible d’ignorer le warning.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="175"/>
<source>An error occurred while reading updates metadata: %1.</source>
- <translation>Erreur lors de la lecture de mise des méta données: %1.</translation>
+ <translation>Erreur lors de la lecture de mise des méta données : %1.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="188"/>
@@ -1120,22 +1143,22 @@ La vue restera telque.</translation>
<message>
<location filename="../services/updatemanager.cpp" line="206"/>
<source>There was no updates to download. Updating aborted.</source>
- <translation>Il n&rsquo;y a aucune mise à jour à télécharger. Mise à jour abandonnée.</translation>
+ <translation>Il n’y a aucune mise à jour à télécharger. Mise à jour abandonnée.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="241"/>
<source>Downloading: %1</source>
- <translation>Téléchargement: %1</translation>
+ <translation>Téléchargement : %1</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="247"/>
<source>Could not determinate file name from update URL: %1. Updating aborted.</source>
- <translation>Impossible de déterminer le fichier de mise à jour URL: %1.Mise à jour abandonnée.</translation>
+ <translation>Impossible de déterminer le fichier de mise à jour URL : %1.Mise à jour abandonnée.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="255"/>
<source>Failed to open file &apos;%1&apos; for writting: %2. Updating aborted.</source>
- <translation>Erreur à l&rsquo;ouverture du fichier «&nbsp;%1&nbsp;» pour l&rsquo;écriture: %2. Mise à jour abandonnée.</translation>
+ <translation>Erreur à l’ouverture du fichier « %1 » pour l’écriture : %2. Mise à jour abandonnée.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="276"/>
@@ -1145,29 +1168,29 @@ La vue restera telque.</translation>
<message>
<location filename="../services/updatemanager.cpp" line="287"/>
<source>Could not copy current application directory into %1 directory.</source>
- <translation>Impossible de copier le répertoire de l&rsquo;application courante dans %1.</translation>
+ <translation>Impossible de copier le répertoire de l’application courante dans %1.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="340"/>
<source>Could not create directory %1.</source>
- <translation>Impossible de créer le répertoire: %1.</translation>
+ <translation>Impossible de créer le répertoire : %1.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="348"/>
<source>Could not rename directory %1 to %2.
Details: %3</source>
- <translation>Impossible de renommer le répertoire %1 en %2. Détails: %3</translation>
+ <translation>Impossible de renommer le répertoire %1 en %2. Détails : %3</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="352"/>
<source>Cannot not rename directory %1 to %2.
Details: %3</source>
- <translation>Impossible de renommer le répertoire %1 en %2.Détails: %3</translation>
+ <translation>Impossible de renommer le répertoire %1 en %2.Détails : %3</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="360"/>
<source>Could not move directory %1 to %2 and also failed to restore original directory, so the original SQLiteStudio directory is now located at: %3</source>
- <translation>Impossible de déplacer le répertoire %1 vers %2 d&rsquo;où l&rsquo;impossibilité de restaurer le répertoire original. SQLiteStudio est maintenant localisé: %3</translation>
+ <translation>Impossible de déplacer le répertoire %1 vers %2 d’où l’impossibilité de restaurer le répertoire original. SQLiteStudio est maintenant localisé : %3</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="365"/>
@@ -1177,17 +1200,17 @@ Details: %3</source>
<message>
<location filename="../services/updatemanager.cpp" line="444"/>
<source>Could not unpack component %1 into %2 directory.</source>
- <translation>Impossible d&rsquo;extraire le composant %1 dans le répertoire %2.</translation>
+ <translation>Impossible d’extraire le composant %1 dans le répertoire %2.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="555"/>
<source>Could not find permissions elevator application to run update as a root. Looked for: %1</source>
- <translation>Impossible d&rsquo;élever les autorisations pour lancer la mise à jour en tantque root. Bloqué: %1</translation>
+ <translation>Impossible d’élever les autorisations pour lancer la mise à jour en tantque root. Bloqué : %1</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="562"/>
<source>Could not execute final updating steps as root: %1</source>
- <translation>Impossible de finaliser la mis à jour en tant que root: %1</translation>
+ <translation>Impossible de finaliser la mis à jour en tant que root : %1</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="591"/>
@@ -1195,7 +1218,7 @@ Details: %3</source>
<location filename="../services/updatemanager.cpp" line="613"/>
<location filename="../services/updatemanager.cpp" line="623"/>
<source>Could not execute final updating steps as admin: %1</source>
- <translation>Impossible de finaliser la mis à jour en tant que admin: %1</translation>
+ <translation>Impossible de finaliser la mis à jour en tant que admin : %1</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="591"/>
@@ -1215,17 +1238,17 @@ Details: %3</source>
<message>
<location filename="../services/updatemanager.cpp" line="661"/>
<source>Could not execute final updating steps as administrator.</source>
- <translation>Impossible de finaliser la mis à jour en tant qu&rsquo;administrateur.</translation>
+ <translation>Impossible de finaliser la mis à jour en tant qu’administrateur.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="673"/>
<source>Could not execute final updating steps as administrator. Updater startup timed out.</source>
- <translation>Impossible de finaliser la mis à jour en tant qu&rsquo;administrateur. Délai d&rsquo;attente de lancement dépassé.</translation>
+ <translation>Impossible de finaliser la mis à jour en tant qu’administrateur. Délai d’attente de lancement dépassé.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="679"/>
<source>Could not execute final updating steps as administrator. Updater operation timed out.</source>
- <translation>Impossible de finaliser la mis à jour en tant qu&rsquo;administrateur. Délai d&rsquo;attente d&rsquo;opération dépassé.</translation>
+ <translation>Impossible de finaliser la mis à jour en tant qu’administrateur. Délai d’attente d’opération dépassé.</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="696"/>
@@ -1240,32 +1263,32 @@ Details: %3</source>
<message>
<location filename="../services/updatemanager.cpp" line="817"/>
<source>Package not in tar.gz format, cannot install: %1</source>
- <translation>Installation impossible un paquet n&rsquo;est pas au format tar.zg: %1</translation>
+ <translation>Installation impossible un paquet n’est pas au format tar.zg : %1</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="824"/>
<source>Package %1 cannot be installed, because cannot move it to directory: %2</source>
- <translation>Le paquet %1 ne peut être installé, celui-ci ne pouvant déplacé dans le répertoire: %2</translation>
+ <translation>Le paquet %1 ne peut être installé, celui-ci ne pouvant déplacé dans le répertoire : %2</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="833"/>
<source>Package %1 cannot be installed, because cannot unpack it: %2</source>
- <translation>Le paquet %1 ne peut être installé, celui-ci ne pouvant décompressé: %2</translation>
+ <translation>Le paquet %1 ne peut être installé, celui-ci ne pouvant décompressé : %2</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="852"/>
<source>Package not in zip format, cannot install: %1</source>
- <translation>Installation impossible, un paquet est manquant: %1</translation>
+ <translation>Installation impossible, un paquet est manquant : %1</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="859"/>
<source>Package %1 cannot be installed, because cannot unzip it to directory %2: %3</source>
- <translation>Le paquet %1 ne peut être installé, celui-ci ne pouvant décompressé dans le répertoire %2: %3</translation>
+ <translation>Le paquet %1 ne peut être installé, celui-ci ne pouvant décompressé dans le répertoire %2 : %3</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="873"/>
<source>Package %1 cannot be installed, because cannot unzip it to directory: %2</source>
- <translation>Le paquet %1 ne peut être installé, celui-ci ne pouvant décompressé dans le répertoire: %2</translation>
+ <translation>Le paquet %1 ne peut être installé, celui-ci ne pouvant décompressé dans le répertoire : %2</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="923"/>
@@ -1282,13 +1305,13 @@ Details: %3</source>
<location filename="../services/updatemanager.cpp" line="961"/>
<source>Error executing update command: %1
Error message: %2</source>
- <translation>Erreur d&rsquo;exécution de la commande de mise à jour: %1
-Message d&rsquo;erreur: %2</translation>
+ <translation>Erreur d’exécution de la commande de mise à jour : %1
+Message d’erreur : %2</translation>
</message>
<message>
<location filename="../services/updatemanager.cpp" line="1028"/>
<source>An error occurred while downloading updates: %1. Updating aborted.</source>
- <translation>Erreur lors du téléchargement de la mise à jour: %1. Mise à jour abandonnée.</translation>
+ <translation>Erreur lors du téléchargement de la mise à jour : %1. Mise à jour abandonnée.</translation>
</message>
</context>
</TS>
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_it.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_it.ts
index 9b031de..beed03d 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_it.ts
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_it.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="it_IT">
+<TS version="2.1" language="it_IT">
<context>
<name>AbstractDb</name>
<message>
@@ -26,37 +26,37 @@
<context>
<name>ChainExecutor</name>
<message>
- <location filename="../db/chainexecutor.cpp" line="35"/>
+ <location filename="../db/chainexecutor.cpp" line="37"/>
<source>The database for executing queries was not defined.</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="41"/>
+ <location filename="../db/chainexecutor.cpp" line="44"/>
<source>The database for executing queries was not open.</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="50"/>
+ <location filename="../db/chainexecutor.cpp" line="54"/>
<source>Could not disable foreign keys in the database. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="57"/>
+ <location filename="../db/chainexecutor.cpp" line="62"/>
<source>Could not start a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="84"/>
+ <location filename="../db/chainexecutor.cpp" line="89"/>
<source>Interrupted</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="145"/>
+ <location filename="../db/chainexecutor.cpp" line="151"/>
<source>Could not commit a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
@@ -243,17 +243,17 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>DbVersionConverter</name>
<message>
- <location filename="../dbversionconverter.cpp" line="913"/>
+ <location filename="../dbversionconverter.cpp" line="916"/>
<source>Target file exists, but could not be overwritten.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="932"/>
+ <location filename="../dbversionconverter.cpp" line="935"/>
<source>Could not find proper database plugin to create target database.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="1166"/>
+ <location filename="../dbversionconverter.cpp" line="1169"/>
<source>Error while converting database: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -341,23 +341,23 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="354"/>
- <location filename="../exportworker.cpp" line="412"/>
+ <location filename="../exportworker.cpp" line="346"/>
+ <location filename="../exportworker.cpp" line="404"/>
<source>Could not parse %1 in order to export it. It will be excluded from the export output.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="616"/>
+ <location filename="../exportworker.cpp" line="608"/>
<source>Error while reading data to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="624"/>
+ <location filename="../exportworker.cpp" line="616"/>
<source>Error while counting data to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="640"/>
+ <location filename="../exportworker.cpp" line="632"/>
<source>Error while counting data column width to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -365,43 +365,43 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>FunctionManagerImpl</name>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="232"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="234"/>
<source>Invalid number of arguments to function &apos;%1&apos;. Expected %2, but got %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="341"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
<source>No such function registered in SQLiteStudio: %1(%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="353"/>
<source>Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="365"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="371"/>
<source>Invalid regular expression pattern: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="384"/>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="417"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="390"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="423"/>
<source>Could not open file %1 for reading: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="439"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="445"/>
<source>Could not open file %1 for writting: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="459"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="465"/>
<source>Error while writting to file %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="477"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="483"/>
<source>Unsupported scripting language: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -417,7 +417,7 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>ImportManager</name>
<message>
- <location filename="../services/importmanager.cpp" line="93"/>
+ <location filename="../services/importmanager.cpp" line="96"/>
<source>Imported data to the table &apos;%1&apos; successfully.</source>
<translation type="unfinished"></translation>
</message>
@@ -435,41 +435,41 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="48"/>
+ <location filename="../importworker.cpp" line="52"/>
<source>Could not commit transaction for imported data: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="94"/>
+ <location filename="../importworker.cpp" line="100"/>
<source>Table &apos;%1&apos; has less columns than there are columns in the data to be imported. Excessive data columns will be ignored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="99"/>
+ <location filename="../importworker.cpp" line="105"/>
<source>Table &apos;%1&apos; has more columns than there are columns in the data to be imported. Some columns in the table will be left empty.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="117"/>
+ <location filename="../importworker.cpp" line="124"/>
<source>Could not create table to import to: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="168"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="180"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Error while importing data: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Interrupted.</source>
<comment>import process status update</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="163"/>
+ <location filename="../importworker.cpp" line="175"/>
<source>Could not import data row number %1. The row was ignored. Problem details: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -833,9 +833,14 @@ Error details: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="767"/>
+ <location filename="../dbversionconverter.cpp" line="759"/>
+ <source>SQLite %1 does not support row value clauses in expressions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../dbversionconverter.cpp" line="770"/>
- <location filename="../dbversionconverter.cpp" line="781"/>
+ <location filename="../dbversionconverter.cpp" line="773"/>
+ <location filename="../dbversionconverter.cpp" line="784"/>
<source>SQLite %1 does not support &apos;%2&apos; clause in expressions.</source>
<translation type="unfinished"></translation>
</message>
@@ -852,13 +857,13 @@ Error details: %2</source>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="1904"/>
- <location filename="../parser/sqlite3_parse.cpp" line="2171"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="2169"/>
<source>Parser stack overflow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="4465"/>
- <location filename="../parser/sqlite3_parse.cpp" line="5089"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="5088"/>
<source>Syntax error</source>
<translation type="unfinished"></translation>
</message>
@@ -913,17 +918,17 @@ Error details: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="333"/>
+ <location filename="../selectresolver.cpp" line="352"/>
<source>Could not resolve data source for column: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="405"/>
+ <location filename="../selectresolver.cpp" line="424"/>
<source>Could not resolve table for column &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/configimpl.cpp" line="612"/>
+ <location filename="../services/impl/configimpl.cpp" line="614"/>
<source>Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1026,28 +1031,28 @@ The view will remain as it is.</source>
<context>
<name>QueryExecutor</name>
<message>
- <location filename="../db/queryexecutor.cpp" line="137"/>
+ <location filename="../db/queryexecutor.cpp" line="142"/>
<source>Execution interrupted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="178"/>
+ <location filename="../db/queryexecutor.cpp" line="183"/>
<source>Database is not open.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="186"/>
+ <location filename="../db/queryexecutor.cpp" line="191"/>
<source>Only one query can be executed simultaneously.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="275"/>
- <location filename="../db/queryexecutor.cpp" line="560"/>
+ <location filename="../db/queryexecutor.cpp" line="294"/>
+ <location filename="../db/queryexecutor.cpp" line="568"/>
<source>An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="471"/>
+ <location filename="../db/queryexecutor.cpp" line="479"/>
<source>SQLiteStudio was unable to extract metadata from the query. Results won&apos;t be editable.</source>
<translation type="unfinished"></translation>
</message>
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm
index 6859097..76565a1 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm
Binary files differ
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts
index c3e000c..843aebe 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="pl_PL">
+<TS version="2.1" language="pl_PL">
<context>
<name>AbstractDb</name>
<message>
@@ -26,37 +26,37 @@
<context>
<name>ChainExecutor</name>
<message>
- <location filename="../db/chainexecutor.cpp" line="35"/>
+ <location filename="../db/chainexecutor.cpp" line="37"/>
<source>The database for executing queries was not defined.</source>
<comment>chain executor</comment>
<translation>Nie zdefiniowano bazy danych do wykonywania zapytań.</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="41"/>
+ <location filename="../db/chainexecutor.cpp" line="44"/>
<source>The database for executing queries was not open.</source>
<comment>chain executor</comment>
<translation>Baza danych do wykonywania zapytań nie jest otwarta.</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="50"/>
+ <location filename="../db/chainexecutor.cpp" line="54"/>
<source>Could not disable foreign keys in the database. Details: %1</source>
<comment>chain executor</comment>
<translation>Nie udało się wyłączyć kluczy obcych w bazie. Szczegóły: %1</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="57"/>
+ <location filename="../db/chainexecutor.cpp" line="62"/>
<source>Could not start a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation>Nie udało się rozpocząć transakcji bazy danych. Szczegóły: %1</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="84"/>
+ <location filename="../db/chainexecutor.cpp" line="89"/>
<source>Interrupted</source>
<comment>chain executor</comment>
<translation>Przerwane</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="145"/>
+ <location filename="../db/chainexecutor.cpp" line="151"/>
<source>Could not commit a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation>Nie udało się zatwierdzić transakcji bazy danych. Szczegóły: %1</translation>
@@ -244,17 +244,17 @@ Tabele, indeksy, wyzwalacze i widoki skopiowane do bazy danych %3 pozostaną na
<context>
<name>DbVersionConverter</name>
<message>
- <location filename="../dbversionconverter.cpp" line="913"/>
+ <location filename="../dbversionconverter.cpp" line="916"/>
<source>Target file exists, but could not be overwritten.</source>
<translation>Plik docelowy istnieje, ale nie może być nadpisany.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="932"/>
+ <location filename="../dbversionconverter.cpp" line="935"/>
<source>Could not find proper database plugin to create target database.</source>
<translation>Nie znaleziono odpowiedniej wtyczki bazy danych, aby utworzyć docelową bazę danych.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="1166"/>
+ <location filename="../dbversionconverter.cpp" line="1169"/>
<source>Error while converting database: %1</source>
<translation>Błąd podczas konwersji bazy danych: %1</translation>
</message>
@@ -350,23 +350,23 @@ Tabele, indeksy, wyzwalacze i widoki skopiowane do bazy danych %3 pozostaną na
<translation>Błąd podczas liczenia szerokości kolumn danych do eksportu wyników zapytania: %1</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="354"/>
- <location filename="../exportworker.cpp" line="412"/>
+ <location filename="../exportworker.cpp" line="346"/>
+ <location filename="../exportworker.cpp" line="404"/>
<source>Could not parse %1 in order to export it. It will be excluded from the export output.</source>
<translation>Nie udało się przeanalizować %1 w celu wyeksportowania. Element ten zostanie pominięty w wynikach eksportu.</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="616"/>
+ <location filename="../exportworker.cpp" line="608"/>
<source>Error while reading data to export from table %1: %2</source>
<translation>Błąd podczas odczytu danych do eksportu z tabeli %1: %2</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="624"/>
+ <location filename="../exportworker.cpp" line="616"/>
<source>Error while counting data to export from table %1: %2</source>
<translation>Błąd podczas liczenia danych do eksportu z tabeli %1: %2</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="640"/>
+ <location filename="../exportworker.cpp" line="632"/>
<source>Error while counting data column width to export from table %1: %2</source>
<translation>Błąd podczas obliczania szerokości kolumn danych do eksportu z tabeli %1: %2</translation>
</message>
@@ -374,43 +374,43 @@ Tabele, indeksy, wyzwalacze i widoki skopiowane do bazy danych %3 pozostaną na
<context>
<name>FunctionManagerImpl</name>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="232"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="234"/>
<source>Invalid number of arguments to function &apos;%1&apos;. Expected %2, but got %3.</source>
<translation>Niepoprawna liczba argumentów do funkcji &apos;%1&apos;. Oczekiwano %2, a jest %3.</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="341"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
<source>No such function registered in SQLiteStudio: %1(%2)</source>
<translation>Nie znaleziono funkcji zarejestrowanej w SQLiteStudio: %1 (%2)</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="353"/>
<source>Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded.</source>
<translation>Funkcja %1 (%2) została zarejestrowana dla języka %3, ale wtyczka obsługująca ten język nie jest aktualnie załadowana.</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="365"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="371"/>
<source>Invalid regular expression pattern: %1</source>
<translation>Niepoprawne wyrażenie regularne: %1</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="384"/>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="417"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="390"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="423"/>
<source>Could not open file %1 for reading: %2</source>
<translation>Nie udało się otworzyć pliku %1 do odczytu: %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="439"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="445"/>
<source>Could not open file %1 for writting: %2</source>
<translation>Nie udało się otworzyć pliku %2 do zapisu: %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="459"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="465"/>
<source>Error while writting to file %1: %2</source>
<translation>Błąd podczas zapisu do pliku %1: %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="477"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="483"/>
<source>Unsupported scripting language: %1</source>
<translation>Nieobsługiwany język skryptowy: %1</translation>
</message>
@@ -426,7 +426,7 @@ Tabele, indeksy, wyzwalacze i widoki skopiowane do bazy danych %3 pozostaną na
<context>
<name>ImportManager</name>
<message>
- <location filename="../services/importmanager.cpp" line="93"/>
+ <location filename="../services/importmanager.cpp" line="96"/>
<source>Imported data to the table &apos;%1&apos; successfully.</source>
<translation>Pomyślnie zaimportowano dane do tabeli &apos;%1&apos;.</translation>
</message>
@@ -444,41 +444,41 @@ Tabele, indeksy, wyzwalacze i widoki skopiowane do bazy danych %3 pozostaną na
<translation>Nie udało się wystartować transakcji w celu zaimportowania danych: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="48"/>
+ <location filename="../importworker.cpp" line="52"/>
<source>Could not commit transaction for imported data: %1</source>
<translation>Nie udało się zatwierdzić transakcji w celu zaimportowania danych: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="94"/>
+ <location filename="../importworker.cpp" line="100"/>
<source>Table &apos;%1&apos; has less columns than there are columns in the data to be imported. Excessive data columns will be ignored.</source>
<translation>Tabela &apos;%1&apos; ma mniej kolumn, niż jest kolumn w danych do importu. Nadmiarowe kolumny zostaną zignorowane.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="99"/>
+ <location filename="../importworker.cpp" line="105"/>
<source>Table &apos;%1&apos; has more columns than there are columns in the data to be imported. Some columns in the table will be left empty.</source>
<translation>Tabela &apos;%1&apos; ma więcej kolumn, niż jest kolumn w danych do importu. Część kolumn w tabeli będzie pozostawiona pusta.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="117"/>
+ <location filename="../importworker.cpp" line="124"/>
<source>Could not create table to import to: %1</source>
<translation>Nie udało się stworzyć tabeli do zaimportowania: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="168"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="180"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Error while importing data: %1</source>
<translation>Błąd podczas importowania danych: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Interrupted.</source>
<comment>import process status update</comment>
<translation>Przerwano.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="163"/>
+ <location filename="../importworker.cpp" line="175"/>
<source>Could not import data row number %1. The row was ignored. Problem details: %2</source>
<translation>Nie udało się zaimportować wiersza danych numer %1. Wiersz ten został zignorowany. Szczegóły problemu: %2</translation>
</message>
@@ -830,9 +830,14 @@ Szczegóły błędu: %2</translation>
<translation>SQLite %1 nie obsługuje aktualnej daty lub klauzul czasowu w wyrażeniach.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="767"/>
+ <location filename="../dbversionconverter.cpp" line="759"/>
+ <source>SQLite %1 does not support row value clauses in expressions.</source>
+ <translation>SQLite %1 nie obsługuje klauzuli wartości wierszowej w wyrażeniach.</translation>
+ </message>
+ <message>
<location filename="../dbversionconverter.cpp" line="770"/>
- <location filename="../dbversionconverter.cpp" line="781"/>
+ <location filename="../dbversionconverter.cpp" line="773"/>
+ <location filename="../dbversionconverter.cpp" line="784"/>
<source>SQLite %1 does not support &apos;%2&apos; clause in expressions.</source>
<translation>SQLite %1 nie obsługuje klauzuli &apos;%2&apos; w wyrażeniach.</translation>
</message>
@@ -849,13 +854,13 @@ Szczegóły błędu: %2</translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="1904"/>
- <location filename="../parser/sqlite3_parse.cpp" line="2171"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="2169"/>
<source>Parser stack overflow</source>
<translation>Przeciążenie stosu analizatora.</translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="4465"/>
- <location filename="../parser/sqlite3_parse.cpp" line="5089"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="5088"/>
<source>Syntax error</source>
<translation>Błąd składni</translation>
</message>
@@ -910,17 +915,17 @@ Szczegóły błędu: %2</translation>
<translation>Kod implementacji nie może być pusty.</translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="333"/>
+ <location filename="../selectresolver.cpp" line="352"/>
<source>Could not resolve data source for column: %1</source>
<translation>Nie znaleziono źródła danych dla kolumny: %1</translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="405"/>
+ <location filename="../selectresolver.cpp" line="424"/>
<source>Could not resolve table for column &apos;%1&apos;.</source>
<translation>Nie można ustalić tabeli lub kolumny &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../services/impl/configimpl.cpp" line="612"/>
+ <location filename="../services/impl/configimpl.cpp" line="614"/>
<source>Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1.</source>
<translation>Nie udało się zainicjalizować pliku konfiguracyjnego. Jakiekolwiek zmiany w konfiguracji i historia zapytań będą utracone po zrestartowaniu aplikacji. Próbowano zainicjalizować plik konfiguracyjny w następujących lokalizacjach: %1.</translation>
</message>
@@ -1052,28 +1057,28 @@ Widok pozostanie nienaruszony.</translation>
<context>
<name>QueryExecutor</name>
<message>
- <location filename="../db/queryexecutor.cpp" line="137"/>
+ <location filename="../db/queryexecutor.cpp" line="142"/>
<source>Execution interrupted.</source>
<translation>Wykonywanie przerwane.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="178"/>
+ <location filename="../db/queryexecutor.cpp" line="183"/>
<source>Database is not open.</source>
<translation>Baza danych nie jest otwarta.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="186"/>
+ <location filename="../db/queryexecutor.cpp" line="191"/>
<source>Only one query can be executed simultaneously.</source>
<translation>Tylko jedno zapytanie może być wykonywane w danym momencie.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="275"/>
- <location filename="../db/queryexecutor.cpp" line="560"/>
+ <location filename="../db/queryexecutor.cpp" line="294"/>
+ <location filename="../db/queryexecutor.cpp" line="568"/>
<source>An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1</source>
<translation>Wystąpił błąd podczas wykonywania zapytania count(*), przez co stronicowanie danych będzie wyłączone. Szczegóły błędy z bazy danych: %1</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="471"/>
+ <location filename="../db/queryexecutor.cpp" line="479"/>
<source>SQLiteStudio was unable to extract metadata from the query. Results won&apos;t be editable.</source>
<translation>SQLiteStudio nie mogło uzyskać metadanych z zapytania. Nie będzie można edytować wyników zapytania.</translation>
</message>
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.qm
index c02994c..8d72a0b 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.qm
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.qm
Binary files differ
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts
index 8637f5e..82a5283 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="pt_BR">
+<TS version="2.1" language="pt_BR">
<context>
<name>AbstractDb</name>
<message>
<location filename="../db/abstractdb.cpp" line="306"/>
<location filename="../db/abstractdb.cpp" line="323"/>
<source>Cannot execute query on closed database.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Não é possível executar query em banco de dados fechado.</translation>
</message>
<message>
<location filename="../db/abstractdb.cpp" line="603"/>
<source>Error attaching database %1: %2</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished"> </translation>
</message>
</context>
<context>
@@ -20,46 +20,46 @@
<message>
<location filename="../services/bugreporter.cpp" line="46"/>
<source>Invalid login or password</source>
- <translation type="unfinished"></translation>
+ <translation>login ou senha inválido</translation>
</message>
</context>
<context>
<name>ChainExecutor</name>
<message>
- <location filename="../db/chainexecutor.cpp" line="35"/>
+ <location filename="../db/chainexecutor.cpp" line="37"/>
<source>The database for executing queries was not defined.</source>
<comment>chain executor</comment>
- <translation type="unfinished"></translation>
+ <translation>Não foi especificado banco de dados para execução das consultas. </translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="41"/>
+ <location filename="../db/chainexecutor.cpp" line="44"/>
<source>The database for executing queries was not open.</source>
<comment>chain executor</comment>
- <translation type="unfinished"></translation>
+ <translation>O banco de dados para execução das consultas não foi aberto.</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="50"/>
+ <location filename="../db/chainexecutor.cpp" line="54"/>
<source>Could not disable foreign keys in the database. Details: %1</source>
<comment>chain executor</comment>
- <translation type="unfinished"></translation>
+ <translation>Não foi possível desativar as chaves estrangeiras do banco de dados. Detalhes: %1</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="57"/>
+ <location filename="../db/chainexecutor.cpp" line="62"/>
<source>Could not start a database transaction. Details: %1</source>
<comment>chain executor</comment>
- <translation type="unfinished"></translation>
+ <translation>Não foi possível iniciar a transação do banco de dados. Detalhes: %1</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="84"/>
+ <location filename="../db/chainexecutor.cpp" line="89"/>
<source>Interrupted</source>
<comment>chain executor</comment>
- <translation type="unfinished"></translation>
+ <translation>Interrompido</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="145"/>
+ <location filename="../db/chainexecutor.cpp" line="151"/>
<source>Could not commit a database transaction. Details: %1</source>
<comment>chain executor</comment>
- <translation type="unfinished"></translation>
+ <translation>Não foi possível efetuar commit no banco de dados. Detalhes: %1</translation>
</message>
</context>
<context>
@@ -187,29 +187,29 @@
<location filename="../dbobjectorganizer.cpp" line="380"/>
<location filename="../dbobjectorganizer.cpp" line="412"/>
<source>Error while creating table in target database: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Erro ao criar tabela no banco de dados: %1</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="380"/>
<source>Could not parse table.</source>
- <translation type="unfinished"></translation>
+ <translation>Não foi possível analisar a tabela.</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="426"/>
<source>Database %1 could not be attached to database %2, so the data of table %3 will be copied with SQLiteStudio as a mediator. This method can be slow for huge tables, so please be patient.</source>
- <translation type="unfinished"></translation>
+ <translation>Banco de dados %1 não pôde ser ligado ao banco de dados %2, de modo que os dados da tabela %3 vão ser copiados com o SQLiteStudio como um mediador. Este metodo pode ser lento para grande tabelas, por favor seja paciente. </translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="447"/>
<source>Error while copying data for table %1: %2</source>
- <translation type="unfinished"></translation>
+ <translation>Erro ao copiar data para tabela %1:%2</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="466"/>
<location filename="../dbobjectorganizer.cpp" line="473"/>
<location filename="../dbobjectorganizer.cpp" line="496"/>
<source>Error while copying data to table %1: %2</source>
- <translation type="unfinished"></translation>
+ <translation>Erro ao copiar data para tabela %1:%2</translation>
</message>
<message>
<location filename="../dbobjectorganizer.cpp" line="535"/>
@@ -243,17 +243,17 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>DbVersionConverter</name>
<message>
- <location filename="../dbversionconverter.cpp" line="913"/>
+ <location filename="../dbversionconverter.cpp" line="916"/>
<source>Target file exists, but could not be overwritten.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="932"/>
+ <location filename="../dbversionconverter.cpp" line="935"/>
<source>Could not find proper database plugin to create target database.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="1166"/>
+ <location filename="../dbversionconverter.cpp" line="1169"/>
<source>Error while converting database: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -341,23 +341,23 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="354"/>
- <location filename="../exportworker.cpp" line="412"/>
+ <location filename="../exportworker.cpp" line="346"/>
+ <location filename="../exportworker.cpp" line="404"/>
<source>Could not parse %1 in order to export it. It will be excluded from the export output.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="616"/>
+ <location filename="../exportworker.cpp" line="608"/>
<source>Error while reading data to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="624"/>
+ <location filename="../exportworker.cpp" line="616"/>
<source>Error while counting data to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="640"/>
+ <location filename="../exportworker.cpp" line="632"/>
<source>Error while counting data column width to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -365,43 +365,43 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>FunctionManagerImpl</name>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="232"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="234"/>
<source>Invalid number of arguments to function &apos;%1&apos;. Expected %2, but got %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="341"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
<source>No such function registered in SQLiteStudio: %1(%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="353"/>
<source>Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="365"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="371"/>
<source>Invalid regular expression pattern: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="384"/>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="417"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="390"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="423"/>
<source>Could not open file %1 for reading: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="439"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="445"/>
<source>Could not open file %1 for writting: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="459"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="465"/>
<source>Error while writting to file %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="477"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="483"/>
<source>Unsupported scripting language: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -417,7 +417,7 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>ImportManager</name>
<message>
- <location filename="../services/importmanager.cpp" line="93"/>
+ <location filename="../services/importmanager.cpp" line="96"/>
<source>Imported data to the table &apos;%1&apos; successfully.</source>
<translation type="unfinished"></translation>
</message>
@@ -435,41 +435,41 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="48"/>
+ <location filename="../importworker.cpp" line="52"/>
<source>Could not commit transaction for imported data: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="94"/>
+ <location filename="../importworker.cpp" line="100"/>
<source>Table &apos;%1&apos; has less columns than there are columns in the data to be imported. Excessive data columns will be ignored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="99"/>
+ <location filename="../importworker.cpp" line="105"/>
<source>Table &apos;%1&apos; has more columns than there are columns in the data to be imported. Some columns in the table will be left empty.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="117"/>
+ <location filename="../importworker.cpp" line="124"/>
<source>Could not create table to import to: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="168"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="180"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Error while importing data: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Interrupted.</source>
<comment>import process status update</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="163"/>
+ <location filename="../importworker.cpp" line="175"/>
<source>Could not import data row number %1. The row was ignored. Problem details: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -833,9 +833,14 @@ Error details: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="767"/>
+ <location filename="../dbversionconverter.cpp" line="759"/>
+ <source>SQLite %1 does not support row value clauses in expressions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../dbversionconverter.cpp" line="770"/>
- <location filename="../dbversionconverter.cpp" line="781"/>
+ <location filename="../dbversionconverter.cpp" line="773"/>
+ <location filename="../dbversionconverter.cpp" line="784"/>
<source>SQLite %1 does not support &apos;%2&apos; clause in expressions.</source>
<translation type="unfinished"></translation>
</message>
@@ -852,13 +857,13 @@ Error details: %2</source>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="1904"/>
- <location filename="../parser/sqlite3_parse.cpp" line="2171"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="2169"/>
<source>Parser stack overflow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="4465"/>
- <location filename="../parser/sqlite3_parse.cpp" line="5089"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="5088"/>
<source>Syntax error</source>
<translation type="unfinished"></translation>
</message>
@@ -913,17 +918,17 @@ Error details: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="333"/>
+ <location filename="../selectresolver.cpp" line="352"/>
<source>Could not resolve data source for column: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="405"/>
+ <location filename="../selectresolver.cpp" line="424"/>
<source>Could not resolve table for column &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/configimpl.cpp" line="612"/>
+ <location filename="../services/impl/configimpl.cpp" line="614"/>
<source>Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1026,28 +1031,28 @@ The view will remain as it is.</source>
<context>
<name>QueryExecutor</name>
<message>
- <location filename="../db/queryexecutor.cpp" line="137"/>
+ <location filename="../db/queryexecutor.cpp" line="142"/>
<source>Execution interrupted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="178"/>
+ <location filename="../db/queryexecutor.cpp" line="183"/>
<source>Database is not open.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="186"/>
+ <location filename="../db/queryexecutor.cpp" line="191"/>
<source>Only one query can be executed simultaneously.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="275"/>
- <location filename="../db/queryexecutor.cpp" line="560"/>
+ <location filename="../db/queryexecutor.cpp" line="294"/>
+ <location filename="../db/queryexecutor.cpp" line="568"/>
<source>An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="471"/>
+ <location filename="../db/queryexecutor.cpp" line="479"/>
<source>SQLiteStudio was unable to extract metadata from the query. Results won&apos;t be editable.</source>
<translation type="unfinished"></translation>
</message>
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm
index 24f5549..c638942 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm
Binary files differ
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts
index 7e8bb9d..4716a1d 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="ru_RU">
+<TS version="2.1" language="ru_RU">
<context>
<name>AbstractDb</name>
<message>
@@ -26,37 +26,37 @@
<context>
<name>ChainExecutor</name>
<message>
- <location filename="../db/chainexecutor.cpp" line="35"/>
+ <location filename="../db/chainexecutor.cpp" line="37"/>
<source>The database for executing queries was not defined.</source>
<comment>chain executor</comment>
<translation>Не указана база данных для выполнения запросов.</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="41"/>
+ <location filename="../db/chainexecutor.cpp" line="44"/>
<source>The database for executing queries was not open.</source>
<comment>chain executor</comment>
<translation>Не открыта база данных для выполнения запросов.</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="50"/>
+ <location filename="../db/chainexecutor.cpp" line="54"/>
<source>Could not disable foreign keys in the database. Details: %1</source>
<comment>chain executor</comment>
- <translation type="unfinished"></translation>
+ <translation>Невозможно отключить внешние ключи в базе данных. Подробности: %1</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="57"/>
+ <location filename="../db/chainexecutor.cpp" line="62"/>
<source>Could not start a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation>Невозможно начать транзакцию. Подробности: %1</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="84"/>
+ <location filename="../db/chainexecutor.cpp" line="89"/>
<source>Interrupted</source>
<comment>chain executor</comment>
<translation>Прервано</translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="145"/>
+ <location filename="../db/chainexecutor.cpp" line="151"/>
<source>Could not commit a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation>Невозможно завершить транзакцию. Подробности: %1</translation>
@@ -239,23 +239,23 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<location filename="../dbobjectorganizer.cpp" line="780"/>
<location filename="../dbobjectorganizer.cpp" line="789"/>
<source>Could not parse object &apos;%1&apos; in order to move or copy it.</source>
- <translation type="unfinished"></translation>
+ <translation>Невозможно проанализировать объект &apos;%1&apos; для его перемещения либо копирования.</translation>
</message>
</context>
<context>
<name>DbVersionConverter</name>
<message>
- <location filename="../dbversionconverter.cpp" line="913"/>
+ <location filename="../dbversionconverter.cpp" line="916"/>
<source>Target file exists, but could not be overwritten.</source>
<translation>Целевой файл существует, но не может быть перезаписан.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="932"/>
+ <location filename="../dbversionconverter.cpp" line="935"/>
<source>Could not find proper database plugin to create target database.</source>
<translation>Невозможно найти подходящий модуль для создания целевой базы данных.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="1166"/>
+ <location filename="../dbversionconverter.cpp" line="1169"/>
<source>Error while converting database: %1</source>
<translation>Ошибка при конвертации базы данных: %1</translation>
</message>
@@ -343,23 +343,23 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation>Ошибка при подсчёте ширины столбца данных для экспорта результатов запроса: %1</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="354"/>
- <location filename="../exportworker.cpp" line="412"/>
+ <location filename="../exportworker.cpp" line="346"/>
+ <location filename="../exportworker.cpp" line="404"/>
<source>Could not parse %1 in order to export it. It will be excluded from the export output.</source>
<translation>Невозможно проанализировать структуру %1. Данный объект будет исключён при выполнении экспорта.</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="616"/>
+ <location filename="../exportworker.cpp" line="608"/>
<source>Error while reading data to export from table %1: %2</source>
<translation>Ошибка при считывании данных для экспорта из таблицы %1: %2</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="624"/>
+ <location filename="../exportworker.cpp" line="616"/>
<source>Error while counting data to export from table %1: %2</source>
<translation>Ошибка при подсчёте количества данных для экспорта из таблицы %1: %2</translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="640"/>
+ <location filename="../exportworker.cpp" line="632"/>
<source>Error while counting data column width to export from table %1: %2</source>
<translation>Ошибка при подсчёте ширины столбца данных для экспорта из таблицы %1: %2</translation>
</message>
@@ -367,43 +367,43 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>FunctionManagerImpl</name>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="232"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="234"/>
<source>Invalid number of arguments to function &apos;%1&apos;. Expected %2, but got %3.</source>
<translation>Неверное количество аргументов для функции &apos;%1&apos;. Ожидаемое количество: %2, передано: %3.</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="341"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
<source>No such function registered in SQLiteStudio: %1(%2)</source>
<translation>Функция не зарегистрирована в SQLiteStudio: %1(%2)</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="353"/>
<source>Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded.</source>
<translation>Функция %1(%2) зарегистрирована для языка %3, однако модуль поддержки этого языка на данный момент не загружен.</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="365"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="371"/>
<source>Invalid regular expression pattern: %1</source>
<translation>Неверный шаблон регулярного выражения: %1</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="384"/>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="417"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="390"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="423"/>
<source>Could not open file %1 for reading: %2</source>
<translation>Невозможно открыть файл %1 для чтения: %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="439"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="445"/>
<source>Could not open file %1 for writting: %2</source>
<translation>Невозможно открыть файл %1 для записи: %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="459"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="465"/>
<source>Error while writting to file %1: %2</source>
<translation>Ошибка при записи в файл %1: %2</translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="477"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="483"/>
<source>Unsupported scripting language: %1</source>
<translation>Неподдерживаемый скриптовый язык: %1</translation>
</message>
@@ -419,7 +419,7 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>ImportManager</name>
<message>
- <location filename="../services/importmanager.cpp" line="93"/>
+ <location filename="../services/importmanager.cpp" line="96"/>
<source>Imported data to the table &apos;%1&apos; successfully.</source>
<translation>Импорт данных в таблицу &apos;%1&apos; выполнен успешно.</translation>
</message>
@@ -437,41 +437,41 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation>Невозможно начать транзакцию для импорта данных: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="48"/>
+ <location filename="../importworker.cpp" line="52"/>
<source>Could not commit transaction for imported data: %1</source>
<translation>Невозможно завершить транзакцию для импортированных данных: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="94"/>
+ <location filename="../importworker.cpp" line="100"/>
<source>Table &apos;%1&apos; has less columns than there are columns in the data to be imported. Excessive data columns will be ignored.</source>
<translation>В таблице &apos;%1&apos; столбцов меньше, чем в импортируемых данных. Лишние столбцы будут проигнорированы.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="99"/>
+ <location filename="../importworker.cpp" line="105"/>
<source>Table &apos;%1&apos; has more columns than there are columns in the data to be imported. Some columns in the table will be left empty.</source>
<translation>В таблице &apos;%1&apos; столбцов больше, чем в импортируемых данных. Недостающие столбцы будут оставлены пустыми.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="117"/>
+ <location filename="../importworker.cpp" line="124"/>
<source>Could not create table to import to: %1</source>
<translation>Невозможно создать таблицу для импорта: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="168"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="180"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Error while importing data: %1</source>
<translation>Ошибка при импорте данных: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Interrupted.</source>
<comment>import process status update</comment>
<translation>Прервано.</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="163"/>
+ <location filename="../importworker.cpp" line="175"/>
<source>Could not import data row number %1. The row was ignored. Problem details: %2</source>
<translation>Невозможно импортировать строку данных № %1. Строка пропущена. Подробности проблемы: %2</translation>
</message>
@@ -835,9 +835,14 @@ Error details: %2</source>
<translation>SQLite %1 не поддерживает операторы текущей даты и текущего времени в выражениях.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="767"/>
+ <location filename="../dbversionconverter.cpp" line="759"/>
+ <source>SQLite %1 does not support row value clauses in expressions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../dbversionconverter.cpp" line="770"/>
- <location filename="../dbversionconverter.cpp" line="781"/>
+ <location filename="../dbversionconverter.cpp" line="773"/>
+ <location filename="../dbversionconverter.cpp" line="784"/>
<source>SQLite %1 does not support &apos;%2&apos; clause in expressions.</source>
<translation>SQLite %1 не поддерживает оператор &apos;%2&apos; в выражениях.</translation>
</message>
@@ -854,13 +859,13 @@ Error details: %2</source>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="1904"/>
- <location filename="../parser/sqlite3_parse.cpp" line="2171"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="2169"/>
<source>Parser stack overflow</source>
<translation>Переполнение стека анализатора</translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="4465"/>
- <location filename="../parser/sqlite3_parse.cpp" line="5089"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="5088"/>
<source>Syntax error</source>
<translation>Синтаксическая ошибка</translation>
</message>
@@ -915,17 +920,17 @@ Error details: %2</source>
<translation>Заполняющий код не может быть пустым.</translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="333"/>
+ <location filename="../selectresolver.cpp" line="352"/>
<source>Could not resolve data source for column: %1</source>
<translation>Невозможно определить источник данных для столбца: %1</translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="405"/>
+ <location filename="../selectresolver.cpp" line="424"/>
<source>Could not resolve table for column &apos;%1&apos;.</source>
- <translation type="unfinished"></translation>
+ <translation>Невозможно определить таблицу для столбца &apos;%1&apos;.</translation>
</message>
<message>
- <location filename="../services/impl/configimpl.cpp" line="612"/>
+ <location filename="../services/impl/configimpl.cpp" line="614"/>
<source>Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1.</source>
<translation>Невозможно инициализировать файл конфигурации. Любые изменения конфигурации и история запросов будут утеряны после перезапуска приложения. Попытки инициализации файла предпринимались в следующих местах: %1.</translation>
</message>
@@ -1033,28 +1038,28 @@ The view will remain as it is.</source>
<context>
<name>QueryExecutor</name>
<message>
- <location filename="../db/queryexecutor.cpp" line="137"/>
+ <location filename="../db/queryexecutor.cpp" line="142"/>
<source>Execution interrupted.</source>
<translation>Выполнение прервано.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="178"/>
+ <location filename="../db/queryexecutor.cpp" line="183"/>
<source>Database is not open.</source>
<translation>База данных не открыта.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="186"/>
+ <location filename="../db/queryexecutor.cpp" line="191"/>
<source>Only one query can be executed simultaneously.</source>
<translation>Одновременно может быть выполнен только один запрос.</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="275"/>
- <location filename="../db/queryexecutor.cpp" line="560"/>
+ <location filename="../db/queryexecutor.cpp" line="294"/>
+ <location filename="../db/queryexecutor.cpp" line="568"/>
<source>An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1</source>
<translation>Возникла ошибка при выполнении запроса count(*), поэтому разбивка данных по страницам отключена. Детали ошибки из базы данных: %1</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="471"/>
+ <location filename="../db/queryexecutor.cpp" line="479"/>
<source>SQLiteStudio was unable to extract metadata from the query. Results won&apos;t be editable.</source>
<translation>SQLiteStudio не удалось извлечь метаданные из запроса. Результаты нельзя будет редактировать.</translation>
</message>
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts
index 4a617e4..3298d89 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="sk_SK">
+<TS version="2.1" language="sk_SK">
<context>
<name>AbstractDb</name>
<message>
@@ -26,37 +26,37 @@
<context>
<name>ChainExecutor</name>
<message>
- <location filename="../db/chainexecutor.cpp" line="35"/>
+ <location filename="../db/chainexecutor.cpp" line="37"/>
<source>The database for executing queries was not defined.</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="41"/>
+ <location filename="../db/chainexecutor.cpp" line="44"/>
<source>The database for executing queries was not open.</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="50"/>
+ <location filename="../db/chainexecutor.cpp" line="54"/>
<source>Could not disable foreign keys in the database. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="57"/>
+ <location filename="../db/chainexecutor.cpp" line="62"/>
<source>Could not start a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="84"/>
+ <location filename="../db/chainexecutor.cpp" line="89"/>
<source>Interrupted</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="145"/>
+ <location filename="../db/chainexecutor.cpp" line="151"/>
<source>Could not commit a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
@@ -243,17 +243,17 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>DbVersionConverter</name>
<message>
- <location filename="../dbversionconverter.cpp" line="913"/>
+ <location filename="../dbversionconverter.cpp" line="916"/>
<source>Target file exists, but could not be overwritten.</source>
<translation>Cieľový súbor existuje ale nemôže byť prepísaný.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="932"/>
+ <location filename="../dbversionconverter.cpp" line="935"/>
<source>Could not find proper database plugin to create target database.</source>
<translation>Nieje možné nájsť správny databázový plugin pre vytvorenie cieľovej databázy.</translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="1166"/>
+ <location filename="../dbversionconverter.cpp" line="1169"/>
<source>Error while converting database: %1</source>
<translation>Vyskytla sa chyba počas konvertovania databázy: %1</translation>
</message>
@@ -341,23 +341,23 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="354"/>
- <location filename="../exportworker.cpp" line="412"/>
+ <location filename="../exportworker.cpp" line="346"/>
+ <location filename="../exportworker.cpp" line="404"/>
<source>Could not parse %1 in order to export it. It will be excluded from the export output.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="616"/>
+ <location filename="../exportworker.cpp" line="608"/>
<source>Error while reading data to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="624"/>
+ <location filename="../exportworker.cpp" line="616"/>
<source>Error while counting data to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="640"/>
+ <location filename="../exportworker.cpp" line="632"/>
<source>Error while counting data column width to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -365,43 +365,43 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>FunctionManagerImpl</name>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="232"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="234"/>
<source>Invalid number of arguments to function &apos;%1&apos;. Expected %2, but got %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="341"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
<source>No such function registered in SQLiteStudio: %1(%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="353"/>
<source>Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="365"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="371"/>
<source>Invalid regular expression pattern: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="384"/>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="417"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="390"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="423"/>
<source>Could not open file %1 for reading: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="439"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="445"/>
<source>Could not open file %1 for writting: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="459"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="465"/>
<source>Error while writting to file %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="477"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="483"/>
<source>Unsupported scripting language: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -417,7 +417,7 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>ImportManager</name>
<message>
- <location filename="../services/importmanager.cpp" line="93"/>
+ <location filename="../services/importmanager.cpp" line="96"/>
<source>Imported data to the table &apos;%1&apos; successfully.</source>
<translation type="unfinished"></translation>
</message>
@@ -435,41 +435,41 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="48"/>
+ <location filename="../importworker.cpp" line="52"/>
<source>Could not commit transaction for imported data: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="94"/>
+ <location filename="../importworker.cpp" line="100"/>
<source>Table &apos;%1&apos; has less columns than there are columns in the data to be imported. Excessive data columns will be ignored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="99"/>
+ <location filename="../importworker.cpp" line="105"/>
<source>Table &apos;%1&apos; has more columns than there are columns in the data to be imported. Some columns in the table will be left empty.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="117"/>
+ <location filename="../importworker.cpp" line="124"/>
<source>Could not create table to import to: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="168"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="180"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Error while importing data: %1</source>
<translation>Vyskytla sa chyba počas importu dát: %1</translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Interrupted.</source>
<comment>import process status update</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="163"/>
+ <location filename="../importworker.cpp" line="175"/>
<source>Could not import data row number %1. The row was ignored. Problem details: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -833,9 +833,14 @@ Error details: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="767"/>
+ <location filename="../dbversionconverter.cpp" line="759"/>
+ <source>SQLite %1 does not support row value clauses in expressions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../dbversionconverter.cpp" line="770"/>
- <location filename="../dbversionconverter.cpp" line="781"/>
+ <location filename="../dbversionconverter.cpp" line="773"/>
+ <location filename="../dbversionconverter.cpp" line="784"/>
<source>SQLite %1 does not support &apos;%2&apos; clause in expressions.</source>
<translation type="unfinished"></translation>
</message>
@@ -852,13 +857,13 @@ Error details: %2</source>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="1904"/>
- <location filename="../parser/sqlite3_parse.cpp" line="2171"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="2169"/>
<source>Parser stack overflow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="4465"/>
- <location filename="../parser/sqlite3_parse.cpp" line="5089"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="5088"/>
<source>Syntax error</source>
<translation>Chyba syntaxe</translation>
</message>
@@ -913,17 +918,17 @@ Error details: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="333"/>
+ <location filename="../selectresolver.cpp" line="352"/>
<source>Could not resolve data source for column: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="405"/>
+ <location filename="../selectresolver.cpp" line="424"/>
<source>Could not resolve table for column &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/configimpl.cpp" line="612"/>
+ <location filename="../services/impl/configimpl.cpp" line="614"/>
<source>Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1026,28 +1031,28 @@ The view will remain as it is.</source>
<context>
<name>QueryExecutor</name>
<message>
- <location filename="../db/queryexecutor.cpp" line="137"/>
+ <location filename="../db/queryexecutor.cpp" line="142"/>
<source>Execution interrupted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="178"/>
+ <location filename="../db/queryexecutor.cpp" line="183"/>
<source>Database is not open.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="186"/>
+ <location filename="../db/queryexecutor.cpp" line="191"/>
<source>Only one query can be executed simultaneously.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="275"/>
- <location filename="../db/queryexecutor.cpp" line="560"/>
+ <location filename="../db/queryexecutor.cpp" line="294"/>
+ <location filename="../db/queryexecutor.cpp" line="568"/>
<source>An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1</source>
<translation>Vyskytla sa chyba počas vykonávania dotazu count(*), dôsledkom čoho bolo zablokované stránkovanie. Detail chyby: %1</translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="471"/>
+ <location filename="../db/queryexecutor.cpp" line="479"/>
<source>SQLiteStudio was unable to extract metadata from the query. Results won&apos;t be editable.</source>
<translation type="unfinished"></translation>
</message>
diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts
index 3410fa0..b9c43f2 100644
--- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts
+++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="zh_CN">
+<TS version="2.1" language="zh_CN">
<context>
<name>AbstractDb</name>
<message>
@@ -26,37 +26,37 @@
<context>
<name>ChainExecutor</name>
<message>
- <location filename="../db/chainexecutor.cpp" line="35"/>
+ <location filename="../db/chainexecutor.cpp" line="37"/>
<source>The database for executing queries was not defined.</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="41"/>
+ <location filename="../db/chainexecutor.cpp" line="44"/>
<source>The database for executing queries was not open.</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="50"/>
+ <location filename="../db/chainexecutor.cpp" line="54"/>
<source>Could not disable foreign keys in the database. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="57"/>
+ <location filename="../db/chainexecutor.cpp" line="62"/>
<source>Could not start a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="84"/>
+ <location filename="../db/chainexecutor.cpp" line="89"/>
<source>Interrupted</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/chainexecutor.cpp" line="145"/>
+ <location filename="../db/chainexecutor.cpp" line="151"/>
<source>Could not commit a database transaction. Details: %1</source>
<comment>chain executor</comment>
<translation type="unfinished"></translation>
@@ -243,17 +243,17 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>DbVersionConverter</name>
<message>
- <location filename="../dbversionconverter.cpp" line="913"/>
+ <location filename="../dbversionconverter.cpp" line="916"/>
<source>Target file exists, but could not be overwritten.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="932"/>
+ <location filename="../dbversionconverter.cpp" line="935"/>
<source>Could not find proper database plugin to create target database.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="1166"/>
+ <location filename="../dbversionconverter.cpp" line="1169"/>
<source>Error while converting database: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -341,23 +341,23 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="354"/>
- <location filename="../exportworker.cpp" line="412"/>
+ <location filename="../exportworker.cpp" line="346"/>
+ <location filename="../exportworker.cpp" line="404"/>
<source>Could not parse %1 in order to export it. It will be excluded from the export output.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="616"/>
+ <location filename="../exportworker.cpp" line="608"/>
<source>Error while reading data to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="624"/>
+ <location filename="../exportworker.cpp" line="616"/>
<source>Error while counting data to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../exportworker.cpp" line="640"/>
+ <location filename="../exportworker.cpp" line="632"/>
<source>Error while counting data column width to export from table %1: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -365,43 +365,43 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>FunctionManagerImpl</name>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="232"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="234"/>
<source>Invalid number of arguments to function &apos;%1&apos;. Expected %2, but got %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="341"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
<source>No such function registered in SQLiteStudio: %1(%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="347"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="353"/>
<source>Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="365"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="371"/>
<source>Invalid regular expression pattern: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="384"/>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="417"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="390"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="423"/>
<source>Could not open file %1 for reading: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="439"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="445"/>
<source>Could not open file %1 for writting: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="459"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="465"/>
<source>Error while writting to file %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/functionmanagerimpl.cpp" line="477"/>
+ <location filename="../services/impl/functionmanagerimpl.cpp" line="483"/>
<source>Unsupported scripting language: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -417,7 +417,7 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<context>
<name>ImportManager</name>
<message>
- <location filename="../services/importmanager.cpp" line="93"/>
+ <location filename="../services/importmanager.cpp" line="96"/>
<source>Imported data to the table &apos;%1&apos; successfully.</source>
<translation type="unfinished"></translation>
</message>
@@ -435,41 +435,41 @@ Tables, indexes, triggers and views copied to database %3 will remain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="48"/>
+ <location filename="../importworker.cpp" line="52"/>
<source>Could not commit transaction for imported data: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="94"/>
+ <location filename="../importworker.cpp" line="100"/>
<source>Table &apos;%1&apos; has less columns than there are columns in the data to be imported. Excessive data columns will be ignored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="99"/>
+ <location filename="../importworker.cpp" line="105"/>
<source>Table &apos;%1&apos; has more columns than there are columns in the data to be imported. Some columns in the table will be left empty.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="117"/>
+ <location filename="../importworker.cpp" line="124"/>
<source>Could not create table to import to: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="168"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="180"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Error while importing data: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="126"/>
- <location filename="../importworker.cpp" line="175"/>
+ <location filename="../importworker.cpp" line="133"/>
+ <location filename="../importworker.cpp" line="187"/>
<source>Interrupted.</source>
<comment>import process status update</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../importworker.cpp" line="163"/>
+ <location filename="../importworker.cpp" line="175"/>
<source>Could not import data row number %1. The row was ignored. Problem details: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -833,9 +833,14 @@ Error details: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../dbversionconverter.cpp" line="767"/>
+ <location filename="../dbversionconverter.cpp" line="759"/>
+ <source>SQLite %1 does not support row value clauses in expressions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../dbversionconverter.cpp" line="770"/>
- <location filename="../dbversionconverter.cpp" line="781"/>
+ <location filename="../dbversionconverter.cpp" line="773"/>
+ <location filename="../dbversionconverter.cpp" line="784"/>
<source>SQLite %1 does not support &apos;%2&apos; clause in expressions.</source>
<translation type="unfinished"></translation>
</message>
@@ -852,13 +857,13 @@ Error details: %2</source>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="1904"/>
- <location filename="../parser/sqlite3_parse.cpp" line="2171"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="2169"/>
<source>Parser stack overflow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../parser/sqlite2_parse.cpp" line="4465"/>
- <location filename="../parser/sqlite3_parse.cpp" line="5089"/>
+ <location filename="../parser/sqlite3_parse.cpp" line="5088"/>
<source>Syntax error</source>
<translation type="unfinished"></translation>
</message>
@@ -913,17 +918,17 @@ Error details: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="333"/>
+ <location filename="../selectresolver.cpp" line="352"/>
<source>Could not resolve data source for column: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../selectresolver.cpp" line="405"/>
+ <location filename="../selectresolver.cpp" line="424"/>
<source>Could not resolve table for column &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../services/impl/configimpl.cpp" line="612"/>
+ <location filename="../services/impl/configimpl.cpp" line="614"/>
<source>Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1026,28 +1031,28 @@ The view will remain as it is.</source>
<context>
<name>QueryExecutor</name>
<message>
- <location filename="../db/queryexecutor.cpp" line="137"/>
+ <location filename="../db/queryexecutor.cpp" line="142"/>
<source>Execution interrupted.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="178"/>
+ <location filename="../db/queryexecutor.cpp" line="183"/>
<source>Database is not open.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="186"/>
+ <location filename="../db/queryexecutor.cpp" line="191"/>
<source>Only one query can be executed simultaneously.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="275"/>
- <location filename="../db/queryexecutor.cpp" line="560"/>
+ <location filename="../db/queryexecutor.cpp" line="294"/>
+ <location filename="../db/queryexecutor.cpp" line="568"/>
<source>An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../db/queryexecutor.cpp" line="471"/>
+ <location filename="../db/queryexecutor.cpp" line="479"/>
<source>SQLiteStudio was unable to extract metadata from the query. Results won&apos;t be editable.</source>
<translation type="unfinished"></translation>
</message>