From 306d6d3ca9c9ad774d19135681a7f9805f77035f Mon Sep 17 00:00:00 2001 From: Unit 193 Date: Sun, 22 Feb 2015 14:06:29 -0500 Subject: Imported Upstream version 3.0.3 --- SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt | 25 + SQLiteStudio3/coreSQLiteStudio/TODO.txt | 3 +- .../coreSQLiteStudio/completionhelper.cpp | 26 +- SQLiteStudio3/coreSQLiteStudio/completionhelper.h | 1 + .../config_builder/cfgcategory.cpp | 10 + .../coreSQLiteStudio/config_builder/cfgcategory.h | 1 + .../coreSQLiteStudio/config_builder/cfgentry.cpp | 6 + .../coreSQLiteStudio/config_builder/cfgentry.h | 1 + .../coreSQLiteStudio/config_builder/cfgmain.cpp | 7 + .../coreSQLiteStudio/config_builder/cfgmain.h | 1 + .../coreSQLiteStudio/coreSQLiteStudio.pro | 27 +- .../coreSQLiteStudio/coresqlitestudio.qrc | 2 + SQLiteStudio3/coreSQLiteStudio/db/abstractdb2.h | 2 +- SQLiteStudio3/coreSQLiteStudio/db/db.h | 6 +- .../coreSQLiteStudio/db/queryexecutor.cpp | 47 +- SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h | 21 + .../queryexecutorsteps/queryexecutoraddrowids.cpp | 3 +- .../db/queryexecutorsteps/queryexecutorcolumns.cpp | 6 +- .../queryexecutordatasources.cpp | 2 +- SQLiteStudio3/coreSQLiteStudio/log.h | 2 +- .../coreSQLiteStudio/parser/sqlite2_parse.cpp | 536 ++++---- .../coreSQLiteStudio/parser/sqlite2_parse.y | 7 +- .../coreSQLiteStudio/parser/sqlite3_parse.cpp | 718 ++++++----- .../coreSQLiteStudio/parser/sqlite3_parse.y | 8 +- .../parser/statementtokenbuilder.cpp | 6 +- .../parser/statementtokenbuilder.h | 2 +- SQLiteStudio3/coreSQLiteStudio/rsa/BigInt.h | 3 +- SQLiteStudio3/coreSQLiteStudio/rsa/Key.h | 3 +- SQLiteStudio3/coreSQLiteStudio/rsa/KeyPair.h | 3 +- .../coreSQLiteStudio/rsa/PrimeGenerator.h | 3 +- SQLiteStudio3/coreSQLiteStudio/services/config.h | 2 + .../coreSQLiteStudio/services/impl/configimpl.cpp | 49 +- .../coreSQLiteStudio/services/impl/configimpl.h | 2 + .../services/impl/dbmanagerimpl.cpp | 36 +- .../services/impl/functionmanagerimpl.cpp | 8 +- SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp | 2 +- SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp | 76 +- SQLiteStudio3/coreSQLiteStudio/tablemodifier.h | 2 + SQLiteStudio3/coreSQLiteStudio/translations.cpp | 12 +- SQLiteStudio3/coreSQLiteStudio/translations.h | 13 +- .../translations/coreSQLiteStudio_de.qm | Bin 0 -> 23 bytes .../translations/coreSQLiteStudio_de.ts | 1278 +++++++++++++++++++ .../translations/coreSQLiteStudio_es.qm | Bin 0 -> 23 bytes .../translations/coreSQLiteStudio_es.ts | 1278 +++++++++++++++++++ .../translations/coreSQLiteStudio_fr.qm | Bin 0 -> 41796 bytes .../translations/coreSQLiteStudio_fr.ts | 1283 +++++++++++++++++++ .../translations/coreSQLiteStudio_pl.qm | Bin 41506 -> 41932 bytes .../translations/coreSQLiteStudio_pl.ts | 75 +- .../translations/coreSQLiteStudio_pt_BR.qm | Bin 0 -> 23 bytes .../translations/coreSQLiteStudio_pt_BR.ts | 1278 +++++++++++++++++++ .../translations/coreSQLiteStudio_ru.qm | Bin 0 -> 40771 bytes .../translations/coreSQLiteStudio_ru.ts | 1284 ++++++++++++++++++++ .../translations/coreSQLiteStudio_sk.qm | Bin 0 -> 27 bytes .../translations/coreSQLiteStudio_sk.ts | 1278 +++++++++++++++++++ .../translations/coreSQLiteStudio_zh_CN.qm | 1 + .../translations/coreSQLiteStudio_zh_CN.ts | 1278 +++++++++++++++++++ 56 files changed, 9952 insertions(+), 771 deletions(-) create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.qm create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.qm create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.qm create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.qm create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.qm create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts (limited to 'SQLiteStudio3/coreSQLiteStudio') diff --git a/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt b/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt index c890b69..fe7a977 100644 --- a/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt +++ b/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt @@ -1,3 +1,28 @@ +[3.0.3] + * [ADDED]: Added visual validation indicators to DbDialog, so user is informed why the "Ok" button is disabled at the moment. + * [ADDED]: Russian translation. + * [ADDED]: French translation. + * [ADDED]: #2770 Added SQLite 3 version used by application in the Environment tab of the About dialog. + * [CHANGE]: Language translations located in a separate directory have now higher precedense, than translations compiled in, so it's possible to test updated translations "on the fly". + * [BUGFIX]: Fixed support for "function(DISTINCT args)" in Enterprise formatter. + * [BUGFIX]: #2753 Fixed parsing TEMP and IF NOT EXISTS in CREATE TABLE statement. + * [BUGFIX]: #2755 Fixed error checking for recurrent expression with LIKE/GLOB operator in it. + * [BUGFIX]: Switched error message from simple method error to smart method error in QueryExecutor to avoid misleading messages. + * [BUGFIX]: #2760 Fixed marking "unique" in index dialog when opening existing unique index. + * [BUGFIX]: #2757 Fixed int64 rounding problem. + * [BUGFIX]: #2767 Fixed NOT NULL dialog in column dialog, so it doesn't convert to UNIQUE. + * [BUGFIX]: #2763 Fixed possibility of adding 2 same databases to the list. + * [BUGFIX]: Fixed copying values from Environment tab of the About dialog. + * [BUGFIX]: #2774 Fixed handling triggers (when modifying table) in foreign tables, triggers referencing table in its subqueries, etc. + * [BUGFIX]: Fixed executing SELECT in SQLite2 for columns that need wrapping. + * [BUGFIX]: Fixed editing data for tables transparently attached in the SQL query. + * [BUGFIX]: Fixed Shortcut titles translation in configuration dialog. + * [BUGFIX]: Fixed aggregate functions, so initial and final codes are executed, not only the per-step code. + * [BUGFIX]: #2781 Portable configuration directory can now be either in the running directory, or in applications directory. It's auto-detected. + * [BUGFIX]: Optimized loading huge data sets into data grid. It's faster and the progress bar acts more smoothly. + * [BUGFIX]: Shortcut for closing current window is now displayed in the context menu for taskbar. + * [BUGFIX]: "Skip first line" option in CSV import renamed to "First line represents CSV columns". Maybe this time it won't confused anyone. + [3.0.2] * [ADDED]: Full support for the interface translations. * [ADDED]: Polish translation. diff --git a/SQLiteStudio3/coreSQLiteStudio/TODO.txt b/SQLiteStudio3/coreSQLiteStudio/TODO.txt index 458d550..055898c 100644 --- a/SQLiteStudio3/coreSQLiteStudio/TODO.txt +++ b/SQLiteStudio3/coreSQLiteStudio/TODO.txt @@ -1,6 +1,5 @@ -* 3.0.1: - * Next versions: +- small useful features: generating template queries from context menu for table/view, from data view. - commiting DataView should be async - syntax checkers as services - per language - code assistants as services - per language diff --git a/SQLiteStudio3/coreSQLiteStudio/completionhelper.cpp b/SQLiteStudio3/coreSQLiteStudio/completionhelper.cpp index 99eb334..528df73 100644 --- a/SQLiteStudio3/coreSQLiteStudio/completionhelper.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/completionhelper.cpp @@ -1029,9 +1029,6 @@ void CompletionHelper::parseFullSql() { Dialect dialect = db->getDialect(); - Parser parser(dialect); - parser.setLemonDebug(enableLemonDebug); - QString sql = fullSql; // Selecting query at cursor position @@ -1046,11 +1043,30 @@ void CompletionHelper::parseFullSql() query += ";"; // Parsing query - if (parser.parse(query, true) && !parser.getQueries().isEmpty()) + Parser parser(dialect); + parser.setLemonDebug(enableLemonDebug); + if (tryToParse(&parser, query)) + return; + + // 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 += ");"; + + if (tryToParse(&parser, query)) + return; +} + +bool CompletionHelper::tryToParse(Parser* parser, const QString& query) +{ + if (parser->parse(query, true) && !parser->getQueries().isEmpty()) { - parsedQuery = parser.getQueries().first(); + parsedQuery = parser->getQueries().first(); originalParsedQuery = SqliteQueryPtr(dynamic_cast(parsedQuery->clone())); + return true; } + return false; } void CompletionHelper::sort(QList &resultsSoFar) diff --git a/SQLiteStudio3/coreSQLiteStudio/completionhelper.h b/SQLiteStudio3/coreSQLiteStudio/completionhelper.h index 2cb3c01..5c656c2 100644 --- a/SQLiteStudio3/coreSQLiteStudio/completionhelper.h +++ b/SQLiteStudio3/coreSQLiteStudio/completionhelper.h @@ -118,6 +118,7 @@ class API_EXPORT CompletionHelper : public QObject void filterDuplicates(QList &results); bool isFilterType(Token::Type type); void parseFullSql(); + bool tryToParse(Parser* parser, const QString& query); void sort(QList &results); void extractPreviousIdTokens(const TokenList& parsedTokens); void extractQueryAdditionalInfo(); diff --git a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.cpp b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.cpp index a79e08a..1a63776 100644 --- a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.cpp @@ -34,6 +34,16 @@ QHash &CfgCategory::getEntries() return childs; } +void CfgCategory::translateTitle() +{ + // This needs to be "QObject::tr" and not just "tr", because this guarantees proper message context for retranslating + // titles for objects initialized in global scope (as CfgCategories are). + title = QObject::tr(title.toUtf8().constData()); + for (CfgEntry* entry : childs) + entry->translateTitle(); + +} + void CfgCategory::reset() { for (CfgEntry* entry : childs) diff --git a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.h b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.h index 2a6ccaf..45197d6 100644 --- a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.h +++ b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgcategory.h @@ -23,6 +23,7 @@ class API_EXPORT CfgCategory : public QObject QString toString() const; operator QString() const; QHash& getEntries(); + void translateTitle(); void reset(); void savepoint(bool transaction = false); void restore(); diff --git a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgentry.cpp b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgentry.cpp index 6a5f6a4..9a91ea8 100644 --- a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgentry.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgentry.cpp @@ -99,6 +99,12 @@ QString CfgEntry::getTitle() const return title; } +void CfgEntry::translateTitle() +{ + // This needs to be "QObject::tr" and not just "tr". See CfgCategory::translateTitle() for details. + title = QObject::tr(title.toUtf8().constData()); +} + void CfgEntry::reset() { set(getDefultValue()); diff --git a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgentry.h b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgentry.h index 92b2a5f..4c1bbb0 100644 --- a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgentry.h +++ b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgentry.h @@ -29,6 +29,7 @@ class API_EXPORT CfgEntry : public QObject void defineDefaultValueFunction(DefaultValueProviderFunc func); QString getFullKey() const; QString getTitle() const; + void translateTitle(); void reset(); bool isPersistable() const; bool isPersisted() const; diff --git a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.cpp b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.cpp index 72fc0d0..480b4cc 100644 --- a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.cpp @@ -55,6 +55,13 @@ QHash &CfgMain::getCategories() return childs; } +void CfgMain::translateTitle() +{ + title = QObject::tr(title.toUtf8().constData()); + for (CfgCategory* ctg : childs) + ctg->translateTitle(); +} + void CfgMain::reset() { for (CfgCategory* ctg : childs) diff --git a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.h b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.h index bc9490d..d42f03b 100644 --- a/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.h +++ b/SQLiteStudio3/coreSQLiteStudio/config_builder/cfgmain.h @@ -22,6 +22,7 @@ class API_EXPORT CfgMain static QList getPersistableInstances(); QHash& getCategories(); + void translateTitle(); void reset(); void savepoint(bool transaction = false); void restore(); diff --git a/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro b/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro index e58e2a8..84cd818 100644 --- a/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro +++ b/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro @@ -19,7 +19,12 @@ TEMPLATE = lib win32 { LIBS += -lpsapi $$PWD/../../../lib/libquazip.a - DISTFILES += qt.conf + + 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: { @@ -45,7 +50,14 @@ portable { CONFIG += c++11 QMAKE_CXXFLAGS += -pedantic -TRANSLATIONS += translations/coreSQLiteStudio_pl.ts +TRANSLATIONS += 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 \ @@ -422,3 +434,14 @@ FORMS += \ RESOURCES += \ coresqlitestudio.qrc + + + + + + + + + + + diff --git a/SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc b/SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc index 6f2f925..3ad28a9 100644 --- a/SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc +++ b/SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc @@ -20,5 +20,7 @@ translations/coreSQLiteStudio_pl.qm + translations/coreSQLiteStudio_ru.qm + translations/coreSQLiteStudio_fr.qm diff --git a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb2.h b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb2.h index c521bfa..9b27dc3 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb2.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb2.h @@ -352,7 +352,7 @@ void AbstractDb2::storeResult(sqlite_func* func, const QVariant& result, bool case QVariant::UInt: case QVariant::LongLong: { - sqlite_set_result_int(func, result.toInt()); + sqlite_set_result_int(func, result.toLongLong()); break; } case QVariant::Double: diff --git a/SQLiteStudio3/coreSQLiteStudio/db/db.h b/SQLiteStudio3/coreSQLiteStudio/db/db.h index 7d10a05..e11a844 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/db.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/db.h @@ -501,7 +501,8 @@ class API_EXPORT Db : public QObject, public Interruptable * @brief Attaches given database to this database. * @param otherDb Other registered database object. * @param silent If true, no errors or warnings will be reported to the NotifyManager (they will still appear in logs). - * @return Name of the attached database (it's not the symbolic name of the other database, it's a name you would use in ATTACH 'name' statement). + * @return Name of the attached database (it's not the symbolic name of the other database, it's a name you would use in ATTACH 'name' statement), + * or null string if error occurred. * * This is convinent method to attach other registered databases to this database. It generates attached database name, so it doesn't conflict * with other - already attached - database names, attaches the database with that name and returns that name to you, so you can refer to it in queries. @@ -583,7 +584,8 @@ class API_EXPORT Db : public QObject, public Interruptable * @return Database type label. * * The database type label is used on UI to tell user what database it is (SQLite 3, SQLite 2, Encrypted SQLite 3, etc). - * This is defined by DbPlugin. + * This is usually the same as DbPlugin::getTitle(), but getTitle() is used in list of plugins in configuration dialog, + * while getTypeLabel() is used on databases list. */ virtual QString getTypeLabel() = 0; diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp index 97b3f1d..9fc49df 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp @@ -107,6 +107,8 @@ void QueryExecutor::executeChain() } } + requiredDbAttaches = context->dbNameToAttach.leftValues(); + // We're done. clearChain(); @@ -433,6 +435,7 @@ void QueryExecutor::simpleExecutionFinished(SqlQueryPtr results) context->executionTime = QDateTime::currentMSecsSinceEpoch() - simpleExecutionStartTime; context->rowsAffected = results->rowsAffected(); context->totalRowsReturned = 0; + requiredDbAttaches = context->dbNameToAttach.leftValues(); executionMutex.lock(); executionInProgress = false; @@ -538,6 +541,12 @@ bool QueryExecutor::handleRowCountingResults(quint32 asyncId, SqlQueryPtr result return true; } + +const QStringList& QueryExecutor::getRequiredDbAttaches() const +{ + return requiredDbAttaches; +} + bool QueryExecutor::getNoMetaColumns() const { return noMetaColumns; @@ -550,32 +559,24 @@ void QueryExecutor::setNoMetaColumns(bool value) void QueryExecutor::handleErrorsFromSmartAndSimpleMethods(SqlQueryPtr results) { - QString simpleText = results->getErrorText(); - - // Smart text may contain messages from steps before the actual execution, but they will have negative error code. - // Positive error code means that the error came directly from SQLite. - QString smartText = context->errorCodeFromSmartExecution > 0 ? context->errorMessageFromSmartExecution : QString(); - - if (simpleText.contains("no such") && smartText.contains("no such")) - { - // This happens if user refers to invalid column in attached database. - // Smart execution will tell "no such column: xxx", while simple method will tell: - // "no such table: attach.table". In that case we're more interested in smart method message. - // This also applies to views. - error(context->errorCodeFromSmartExecution, smartText); - return; - } - - if (simpleText.contains("no such") && smartText.contains("ambiguous")) + UNUSED(results); + // It turns out that currently smart execution error has more sense to be displayed to user than the simple execution error, + // so we're ignoring error from simple method, because it's usually misleading. + // The case when simple method error is more true than smart method error is very rare nowdays. + // Just rename attach names in the message. + QString msg = context->errorMessageFromSmartExecution; + QString match; + QString replaceName; + Dialect dialect = db->getDialect(); + for (const QString& attachName : context->dbNameToAttach.rightValues()) { - // This happens when smart execution raised "amigous column name" or something like that, - // but simple method failed to work because of transparent database attaching. We prefer smart method error. - error(context->errorCodeFromSmartExecution, smartText); - return; + match = attachName + "."; + replaceName = wrapObjIfNeeded(context->dbNameToAttach.valueByRight(attachName), dialect) + "."; + while (msg.contains(match)) + msg.replace(match, replaceName); } - // No special case, use simple method error - error(results->getErrorCode(), simpleText); + error(context->errorCodeFromSmartExecution, msg); } void QueryExecutor::releaseResultsAndCleanup() diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h index 72c7fed..c6d7701 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h @@ -344,9 +344,18 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable { /** * @brief Database name that the table with this row ID is in. + * + * It's the actual database name as SQLite sees it. That means it is a "main", or any attach name. */ QString database; + /** + * @brief Symbolic database name as listed in databases list. + * + * It can be empty if database was not explicitly passed in the query. + */ + QString dbName; + /** * @brief Table name that the row ID is for. */ @@ -1018,6 +1027,8 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable */ void releaseResultsAndCleanup(); + const QStringList& getRequiredDbAttaches() const; + private: /** * @brief Executes query. @@ -1279,6 +1290,16 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable */ bool noMetaColumns = false; + /** + * @brief List of required databases to attach. + * + * List of database names (symbolic names, as they appear on the list) that needs to be + * attached to access all columns returned by the most recent successful execution. + * + * This is set after every successful execution. + */ + QStringList requiredDbAttaches; + /** * @brief Chain of executor steps. * diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp index 55203e4..9307d13 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp @@ -60,7 +60,7 @@ QHash> QueryExecutorAddRowIds::addR } // Getting all tables we need to get ROWID for - SelectResolver resolver(db, select->tokens.detokenize()); + SelectResolver resolver(db, select->tokens.detokenize(), context->dbNameToAttach); resolver.resolveMultiCore = false; // multicore subselects result in not editable columns, skip them QSet tables = resolver.resolveTables(core); @@ -177,6 +177,7 @@ bool QueryExecutorAddRowIds::addResultColumns(SqliteSelect::Core* core, const Se { // Query executor result column description QueryExecutor::ResultRowIdColumnPtr queryExecutorResCol = QueryExecutor::ResultRowIdColumnPtr::create(); + queryExecutorResCol->dbName = table.originalDatabase; queryExecutorResCol->database = table.database; queryExecutorResCol->table = table.table; queryExecutorResCol->tableAlias = table.alias; diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp index bce1304..6acfb6f 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp @@ -289,10 +289,10 @@ QString QueryExecutorColumns::getAliasedColumnNameForSqlite2(const QueryExecutor if (context->dbNameToAttach.containsLeft(resCol->database, Qt::CaseInsensitive)) colNameParts << context->dbNameToAttach.valueByLeft(resCol->database, Qt::CaseInsensitive); else - colNameParts << resCol->database; + colNameParts << wrapObjIfNeeded(resCol->database, dialect); } - colNameParts << resCol->table; + colNameParts << wrapObjIfNeeded(resCol->table, dialect); } - colNameParts << resCol->column; + colNameParts << wrapObjIfNeeded(resCol->column, dialect); return colNameParts.join("."); } diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutordatasources.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutordatasources.cpp index 9a5c1c2..31cda9e 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutordatasources.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutordatasources.cpp @@ -14,7 +14,7 @@ bool QueryExecutorDataSources::exec() if (select->coreSelects.first()->valuesMode) return true; - SelectResolver resolver(db, select->tokens.detokenize()); + SelectResolver resolver(db, select->tokens.detokenize(), context->dbNameToAttach); resolver.resolveMultiCore = false; // multicore subselects result in not editable columns, skip them SqliteSelect::Core* core = select->coreSelects.first(); diff --git a/SQLiteStudio3/coreSQLiteStudio/log.h b/SQLiteStudio3/coreSQLiteStudio/log.h index f866c93..dddb513 100644 --- a/SQLiteStudio3/coreSQLiteStudio/log.h +++ b/SQLiteStudio3/coreSQLiteStudio/log.h @@ -2,7 +2,7 @@ #define LOG_H #include "db/db.h" -#include "guiSQLiteStudio_global.h" +#include "coreSQLiteStudio_global.h" #include #include #include diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp index 656444a..5b65904 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp @@ -165,7 +165,7 @@ typedef union { #define sqlite2_parseARG_FETCH ParserContext* parserContext = yypParser->parserContext #define sqlite2_parseARG_STORE yypParser->parserContext = parserContext #define YYNSTATE 584 -#define YYNRULE 353 +#define YYNRULE 352 #define YYFALLBACK 1 #define YY_NO_ACTION (YYNSTATE+YYNRULE+2) #define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) @@ -241,16 +241,16 @@ static const YYMINORTYPE yyzerominor = { 0 }; static const YYACTIONTYPE yy_action[] = { /* 0 */ 338, 191, 186, 242, 476, 511, 576, 193, 332, 16, /* 10 */ 511, 384, 189, 322, 239, 519, 518, 570, 337, 450, - /* 20 */ 15, 852, 125, 58, 575, 179, 852, 574, 63, 143, + /* 20 */ 15, 851, 125, 58, 575, 179, 851, 574, 63, 143, /* 30 */ 401, 581, 328, 26, 84, 569, 114, 322, 573, 519, - /* 40 */ 518, 852, 852, 35, 852, 852, 852, 852, 852, 852, - /* 50 */ 852, 852, 852, 852, 852, 852, 852, 852, 852, 32, - /* 60 */ 33, 852, 852, 852, 852, 320, 379, 34, 240, 238, + /* 40 */ 518, 851, 851, 35, 851, 851, 851, 851, 851, 851, + /* 50 */ 851, 851, 851, 851, 851, 851, 851, 851, 851, 32, + /* 60 */ 33, 851, 851, 851, 851, 320, 379, 34, 240, 238, /* 70 */ 121, 556, 291, 251, 57, 7, 217, 577, 265, 264, /* 80 */ 523, 179, 555, 336, 335, 338, 569, 549, 548, 550, /* 90 */ 271, 569, 10, 724, 199, 297, 203, 489, 459, 332, /* 100 */ 568, 567, 451, 253, 158, 523, 449, 444, 443, 337, - /* 110 */ 187, 871, 266, 187, 580, 517, 168, 328, 505, 343, + /* 110 */ 187, 870, 266, 187, 580, 517, 168, 328, 505, 343, /* 120 */ 143, 235, 490, 108, 101, 489, 523, 164, 35, 531, /* 130 */ 187, 13, 523, 252, 234, 547, 236, 119, 340, 232, /* 140 */ 339, 120, 216, 155, 32, 33, 481, 547, 322, 215, @@ -258,23 +258,23 @@ static const YYACTIONTYPE yy_action[] = { /* 160 */ 7, 714, 400, 321, 251, 523, 714, 563, 336, 335, /* 170 */ 500, 553, 549, 548, 550, 188, 465, 500, 401, 466, /* 180 */ 366, 365, 552, 364, 293, 435, 39, 39, 39, 38, - /* 190 */ 523, 562, 60, 255, 714, 569, 714, 714, 853, 570, - /* 200 */ 271, 714, 502, 853, 500, 714, 570, 714, 714, 714, + /* 190 */ 523, 562, 60, 255, 714, 569, 714, 714, 852, 570, + /* 200 */ 271, 714, 502, 852, 500, 714, 570, 714, 714, 714, /* 210 */ 714, 523, 569, 178, 531, 422, 13, 523, 44, 45, - /* 220 */ 330, 42, 42, 530, 530, 223, 853, 853, 43, 43, + /* 220 */ 330, 42, 42, 530, 530, 223, 852, 852, 43, 43, /* 230 */ 43, 43, 41, 41, 41, 41, 40, 40, 39, 39, /* 240 */ 39, 38, 199, 297, 203, 55, 236, 92, 340, 232, /* 250 */ 339, 120, 216, 500, 106, 570, 268, 19, 187, 215, /* 260 */ 500, 105, 553, 41, 41, 41, 41, 40, 40, 39, /* 270 */ 39, 39, 38, 552, 40, 40, 39, 39, 39, 38, - /* 280 */ 853, 3, 568, 567, 187, 853, 512, 500, 219, 568, + /* 280 */ 852, 3, 568, 567, 187, 852, 512, 500, 219, 568, /* 290 */ 567, 17, 496, 156, 322, 345, 519, 518, 569, 292, - /* 300 */ 44, 45, 330, 42, 42, 530, 530, 223, 853, 853, + /* 300 */ 44, 45, 330, 42, 42, 530, 530, 223, 852, 852, /* 310 */ 43, 43, 43, 43, 41, 41, 41, 41, 40, 40, - /* 320 */ 39, 39, 39, 38, 547, 533, 853, 100, 308, 306, - /* 330 */ 305, 853, 448, 447, 418, 418, 316, 245, 568, 567, - /* 340 */ 304, 938, 122, 344, 1, 582, 44, 45, 330, 42, - /* 350 */ 42, 530, 530, 223, 853, 853, 43, 43, 43, 43, + /* 320 */ 39, 39, 39, 38, 547, 533, 852, 100, 308, 306, + /* 330 */ 305, 852, 448, 447, 418, 418, 316, 245, 568, 567, + /* 340 */ 304, 937, 122, 344, 1, 582, 44, 45, 330, 42, + /* 350 */ 42, 530, 530, 223, 852, 852, 43, 43, 43, 43, /* 360 */ 41, 41, 41, 41, 40, 40, 39, 39, 39, 38, /* 370 */ 338, 442, 44, 45, 330, 42, 42, 530, 530, 223, /* 380 */ 524, 569, 43, 43, 43, 43, 41, 41, 41, 41, @@ -287,14 +287,14 @@ static const YYACTIONTYPE yy_action[] = { /* 450 */ 523, 524, 569, 336, 335, 285, 781, 549, 548, 550, /* 460 */ 43, 43, 43, 43, 41, 41, 41, 41, 40, 40, /* 470 */ 39, 39, 39, 38, 332, 523, 332, 425, 470, 774, - /* 480 */ 560, 774, 774, 851, 337, 426, 337, 455, 851, 613, + /* 480 */ 560, 774, 774, 850, 337, 426, 337, 455, 850, 613, /* 490 */ 774, 181, 774, 774, 774, 143, 523, 143, 30, 531, - /* 500 */ 614, 13, 523, 851, 851, 851, 851, 851, 851, 851, - /* 510 */ 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, - /* 520 */ 851, 851, 851, 851, 851, 851, 851, 853, 500, 460, - /* 530 */ 357, 320, 853, 318, 75, 570, 401, 570, 311, 251, + /* 500 */ 614, 13, 523, 850, 850, 850, 850, 850, 850, 850, + /* 510 */ 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, + /* 520 */ 850, 850, 850, 850, 850, 850, 850, 852, 500, 460, + /* 530 */ 357, 320, 852, 318, 75, 570, 401, 570, 311, 251, /* 540 */ 569, 251, 446, 445, 570, 358, 359, 44, 45, 330, - /* 550 */ 42, 42, 530, 530, 223, 853, 853, 43, 43, 43, + /* 550 */ 42, 42, 530, 530, 223, 852, 852, 43, 43, 43, /* 560 */ 43, 41, 41, 41, 41, 40, 40, 39, 39, 39, /* 570 */ 38, 338, 44, 45, 330, 42, 42, 530, 530, 223, /* 580 */ 615, 570, 43, 43, 43, 43, 41, 41, 41, 41, @@ -305,14 +305,14 @@ static const YYACTIONTYPE yy_action[] = { /* 630 */ 32, 33, 337, 356, 482, 355, 569, 85, 34, 759, /* 640 */ 532, 111, 70, 78, 487, 483, 7, 759, 90, 494, /* 650 */ 508, 523, 493, 160, 336, 335, 782, 528, 549, 548, - /* 660 */ 550, 532, 440, 434, 568, 567, 118, 54, 332, 920, + /* 660 */ 550, 532, 440, 434, 568, 567, 118, 54, 332, 919, /* 670 */ 214, 100, 308, 306, 305, 75, 523, 333, 337, 571, /* 680 */ 759, 529, 759, 759, 304, 48, 177, 522, 31, 143, /* 690 */ 29, 759, 568, 567, 759, 759, 159, 523, 568, 567, /* 700 */ 531, 464, 13, 523, 44, 45, 330, 42, 42, 530, /* 710 */ 530, 223, 568, 567, 43, 43, 43, 43, 41, 41, /* 720 */ 41, 41, 40, 40, 39, 39, 39, 38, 463, 570, - /* 730 */ 498, 920, 570, 323, 514, 570, 222, 44, 45, 330, + /* 730 */ 498, 919, 570, 323, 514, 570, 222, 44, 45, 330, /* 740 */ 42, 42, 530, 530, 223, 393, 392, 43, 43, 43, /* 750 */ 43, 41, 41, 41, 41, 40, 40, 39, 39, 39, /* 760 */ 38, 44, 45, 330, 42, 42, 530, 530, 223, 540, @@ -324,7 +324,7 @@ static const YYACTIONTYPE yy_action[] = { /* 820 */ 110, 570, 218, 44, 45, 330, 42, 42, 530, 530, /* 830 */ 223, 27, 468, 43, 43, 43, 43, 41, 41, 41, /* 840 */ 41, 40, 40, 39, 39, 39, 38, 486, 547, 44, - /* 850 */ 45, 330, 42, 42, 530, 530, 223, 860, 212, 43, + /* 850 */ 45, 330, 42, 42, 530, 530, 223, 859, 212, 43, /* 860 */ 43, 43, 43, 41, 41, 41, 41, 40, 40, 39, /* 870 */ 39, 39, 38, 44, 47, 330, 42, 42, 530, 530, /* 880 */ 223, 535, 284, 43, 43, 43, 43, 41, 41, 41, @@ -339,7 +339,7 @@ static const YYACTIONTYPE yy_action[] = { /* 970 */ 520, 569, 395, 547, 569, 569, 23, 328, 213, 254, /* 980 */ 358, 275, 547, 75, 182, 32, 33, 310, 35, 569, /* 990 */ 361, 66, 164, 34, 160, 396, 398, 317, 397, 293, - /* 1000 */ 570, 7, 863, 516, 32, 33, 523, 570, 538, 336, + /* 1000 */ 570, 7, 862, 516, 32, 33, 523, 570, 538, 336, /* 1010 */ 335, 522, 34, 549, 548, 550, 25, 4, 289, 338, /* 1020 */ 7, 471, 395, 547, 12, 523, 568, 567, 336, 335, /* 1030 */ 302, 523, 549, 548, 550, 75, 570, 404, 338, 276, @@ -347,7 +347,7 @@ static const YYACTIONTYPE yy_action[] = { /* 1050 */ 523, 328, 523, 570, 65, 531, 500, 13, 523, 101, /* 1060 */ 185, 184, 35, 570, 172, 171, 170, 197, 290, 503, /* 1070 */ 328, 523, 75, 570, 531, 301, 13, 523, 32, 33, - /* 1080 */ 380, 35, 10, 568, 567, 479, 34, 490, 540, 539, + /* 1080 */ 380, 35, 10, 568, 567, 479, 34, 489, 540, 539, /* 1090 */ 568, 567, 570, 325, 7, 211, 666, 32, 33, 523, /* 1100 */ 179, 423, 336, 335, 570, 34, 549, 548, 550, 80, /* 1110 */ 569, 570, 490, 7, 480, 489, 391, 570, 523, 568, @@ -356,7 +356,7 @@ static const YYACTIONTYPE yy_action[] = { /* 1140 */ 312, 391, 202, 523, 296, 523, 568, 567, 531, 198, /* 1150 */ 13, 523, 569, 413, 345, 328, 568, 567, 532, 569, /* 1160 */ 474, 570, 307, 570, 523, 495, 35, 531, 53, 13, - /* 1170 */ 523, 496, 861, 456, 473, 568, 567, 570, 413, 532, + /* 1170 */ 523, 496, 860, 456, 473, 568, 567, 570, 413, 532, /* 1180 */ 570, 485, 32, 33, 407, 439, 10, 568, 567, 500, /* 1190 */ 34, 489, 730, 570, 568, 567, 431, 403, 7, 52, /* 1200 */ 568, 567, 570, 523, 582, 234, 336, 335, 338, 407, @@ -367,7 +367,7 @@ static const YYACTIONTYPE yy_action[] = { /* 1250 */ 99, 35, 531, 124, 13, 523, 492, 368, 497, 148, /* 1260 */ 568, 567, 570, 568, 567, 82, 376, 32, 33, 350, /* 1270 */ 2, 570, 568, 567, 570, 34, 568, 567, 570, 73, - /* 1280 */ 179, 259, 570, 7, 863, 568, 567, 417, 523, 338, + /* 1280 */ 179, 259, 570, 7, 862, 568, 567, 417, 523, 338, /* 1290 */ 569, 336, 335, 22, 491, 549, 548, 550, 416, 69, /* 1300 */ 568, 567, 371, 522, 568, 567, 570, 415, 405, 568, /* 1310 */ 567, 261, 21, 523, 568, 567, 568, 567, 196, 368, @@ -411,8 +411,8 @@ static const YYACTIONTYPE yy_action[] = { /* 1690 */ 283, 402, 382, 117, 89, 87, 86, 116, 175, 280, /* 1700 */ 347, 349, 173, 233, 113, 126, 230, 509, 541, 470, /* 1710 */ 506, 537, 458, 282, 154, 410, 273, 190, 348, 438, - /* 1720 */ 467, 462, 329, 461, 578, 231, 62, 939, 37, 412, - /* 1730 */ 165, 433, 939, 939, 939, 327, 299, + /* 1720 */ 467, 462, 329, 461, 578, 231, 62, 938, 37, 412, + /* 1730 */ 165, 433, 938, 938, 938, 327, 299, }; static const YYCODETYPE yy_lookahead[] = { /* 0 */ 4, 8, 195, 10, 80, 25, 5, 14, 156, 202, @@ -664,61 +664,61 @@ static const short yy_reduce_ofst[] = { /* 250 */ 1242, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 589, 937, 937, 863, 904, 852, 852, 852, 937, 937, - /* 10 */ 730, 937, 852, 852, 852, 937, 852, 852, 852, 852, - /* 20 */ 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, - /* 30 */ 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, - /* 40 */ 852, 852, 852, 852, 852, 852, 852, 841, 724, 608, - /* 50 */ 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, - /* 60 */ 616, 720, 730, 937, 937, 937, 937, 790, 777, 768, - /* 70 */ 937, 800, 800, 783, 679, 937, 800, 756, 752, 937, - /* 80 */ 839, 937, 937, 731, 937, 839, 937, 937, 937, 937, - /* 90 */ 937, 791, 784, 778, 769, 937, 937, 937, 937, 937, - /* 100 */ 937, 937, 937, 937, 720, 720, 937, 720, 937, 937, - /* 110 */ 937, 840, 594, 937, 883, 937, 937, 937, 937, 937, - /* 120 */ 937, 605, 589, 937, 937, 937, 710, 736, 773, 761, - /* 130 */ 864, 857, 858, 856, 853, 853, 853, 853, 853, 844, - /* 140 */ 853, 853, 853, 853, 823, 816, 827, 815, 831, 826, - /* 150 */ 818, 817, 819, 937, 937, 937, 937, 723, 937, 937, - /* 160 */ 937, 820, 937, 789, 698, 937, 911, 693, 601, 618, - /* 170 */ 937, 937, 937, 937, 937, 937, 937, 772, 670, 756, - /* 180 */ 645, 738, 756, 859, 937, 937, 721, 708, 756, 935, - /* 190 */ 932, 935, 739, 683, 739, 739, 739, 681, 739, 683, - /* 200 */ 796, 739, 739, 683, 772, 739, 919, 916, 739, 739, - /* 210 */ 872, 681, 681, 681, 681, 662, 937, 872, 681, 739, - /* 220 */ 937, 739, 937, 853, 821, 752, 762, 748, 760, 757, - /* 230 */ 772, 937, 681, 681, 662, 681, 681, 665, 593, 593, + /* 0 */ 589, 936, 936, 862, 903, 851, 851, 851, 936, 936, + /* 10 */ 730, 936, 851, 851, 851, 936, 851, 851, 851, 851, + /* 20 */ 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, + /* 30 */ 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, + /* 40 */ 851, 851, 851, 851, 851, 851, 851, 841, 724, 608, + /* 50 */ 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + /* 60 */ 616, 720, 730, 936, 936, 936, 936, 790, 777, 768, + /* 70 */ 936, 800, 800, 783, 679, 936, 800, 756, 752, 936, + /* 80 */ 839, 936, 936, 731, 936, 839, 936, 936, 936, 936, + /* 90 */ 936, 791, 784, 778, 769, 936, 936, 936, 936, 936, + /* 100 */ 936, 936, 936, 936, 720, 720, 936, 720, 936, 936, + /* 110 */ 936, 840, 594, 936, 882, 936, 936, 936, 936, 936, + /* 120 */ 936, 605, 589, 936, 936, 936, 710, 736, 773, 761, + /* 130 */ 863, 856, 857, 855, 852, 852, 852, 852, 852, 852, + /* 140 */ 852, 852, 852, 852, 823, 816, 827, 815, 831, 826, + /* 150 */ 818, 817, 819, 936, 936, 936, 936, 723, 936, 936, + /* 160 */ 936, 820, 936, 789, 698, 936, 910, 693, 601, 618, + /* 170 */ 936, 936, 936, 936, 936, 936, 936, 772, 670, 756, + /* 180 */ 645, 738, 756, 858, 936, 936, 721, 708, 756, 934, + /* 190 */ 931, 934, 739, 683, 739, 739, 739, 681, 739, 683, + /* 200 */ 796, 739, 739, 683, 772, 739, 918, 915, 739, 739, + /* 210 */ 871, 681, 681, 681, 681, 662, 936, 871, 681, 739, + /* 220 */ 936, 739, 936, 852, 821, 752, 762, 748, 760, 757, + /* 230 */ 772, 936, 681, 681, 662, 681, 681, 665, 593, 593, /* 240 */ 593, 681, 593, 649, 649, 726, 830, 829, 828, 822, - /* 250 */ 629, 865, 937, 937, 937, 937, 937, 937, 937, 937, - /* 260 */ 937, 937, 937, 937, 937, 937, 937, 937, 937, 763, - /* 270 */ 937, 937, 937, 937, 937, 937, 937, 937, 937, 882, - /* 280 */ 937, 937, 937, 937, 937, 937, 915, 914, 937, 937, - /* 290 */ 937, 937, 937, 937, 937, 937, 937, 937, 903, 937, - /* 300 */ 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, - /* 310 */ 937, 937, 937, 937, 937, 937, 937, 937, 758, 937, - /* 320 */ 862, 843, 701, 851, 937, 937, 937, 937, 937, 842, - /* 330 */ 854, 810, 937, 749, 937, 809, 806, 808, 611, 937, - /* 340 */ 937, 937, 937, 937, 586, 590, 936, 934, 933, 931, - /* 350 */ 891, 890, 889, 887, 896, 895, 894, 893, 892, 888, - /* 360 */ 886, 885, 884, 881, 787, 775, 766, 697, 930, 928, - /* 370 */ 929, 880, 878, 879, 696, 695, 692, 691, 690, 870, - /* 380 */ 869, 867, 866, 868, 604, 907, 910, 909, 908, 913, - /* 390 */ 912, 905, 918, 917, 922, 926, 925, 924, 923, 921, - /* 400 */ 902, 795, 794, 792, 797, 788, 793, 780, 786, 785, - /* 410 */ 776, 779, 684, 771, 767, 770, 906, 694, 603, 741, + /* 250 */ 629, 864, 936, 936, 936, 936, 936, 936, 936, 936, + /* 260 */ 936, 936, 936, 936, 936, 936, 936, 936, 936, 763, + /* 270 */ 936, 936, 936, 936, 936, 936, 936, 936, 936, 881, + /* 280 */ 936, 936, 936, 936, 936, 936, 914, 913, 936, 936, + /* 290 */ 936, 936, 936, 936, 936, 936, 936, 936, 902, 936, + /* 300 */ 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + /* 310 */ 936, 936, 936, 936, 936, 936, 936, 936, 758, 936, + /* 320 */ 861, 843, 701, 850, 936, 936, 936, 936, 936, 842, + /* 330 */ 853, 810, 936, 749, 936, 809, 806, 808, 611, 936, + /* 340 */ 936, 936, 936, 936, 586, 590, 935, 933, 932, 930, + /* 350 */ 890, 889, 888, 886, 895, 894, 893, 892, 891, 887, + /* 360 */ 885, 884, 883, 880, 787, 775, 766, 697, 929, 927, + /* 370 */ 928, 879, 877, 878, 696, 695, 692, 691, 690, 869, + /* 380 */ 868, 866, 865, 867, 604, 906, 909, 908, 907, 912, + /* 390 */ 911, 904, 917, 916, 921, 925, 924, 923, 922, 920, + /* 400 */ 901, 795, 794, 792, 797, 788, 793, 780, 786, 785, + /* 410 */ 776, 779, 684, 771, 767, 770, 905, 694, 603, 741, /* 420 */ 602, 607, 668, 669, 677, 680, 675, 678, 674, 673, /* 430 */ 672, 676, 671, 667, 610, 609, 623, 621, 622, 620, /* 440 */ 619, 617, 639, 638, 635, 637, 634, 636, 633, 632, - /* 450 */ 631, 630, 628, 661, 647, 646, 875, 877, 876, 874, - /* 460 */ 873, 654, 653, 659, 658, 657, 656, 652, 655, 651, + /* 450 */ 631, 630, 628, 661, 647, 646, 874, 876, 875, 873, + /* 460 */ 872, 654, 653, 659, 658, 657, 656, 652, 655, 651, /* 470 */ 650, 648, 644, 814, 813, 807, 835, 707, 706, 715, /* 480 */ 713, 712, 711, 747, 746, 745, 744, 743, 742, 735, /* 490 */ 733, 729, 728, 734, 732, 727, 719, 717, 718, 716, /* 500 */ 612, 802, 799, 801, 798, 737, 725, 722, 709, 751, - /* 510 */ 753, 855, 845, 834, 846, 740, 832, 833, 704, 703, - /* 520 */ 702, 854, 851, 847, 927, 838, 850, 837, 836, 825, - /* 530 */ 824, 812, 848, 849, 811, 750, 765, 899, 898, 901, - /* 540 */ 900, 897, 764, 625, 624, 705, 700, 699, 805, 804, + /* 510 */ 753, 854, 844, 834, 845, 740, 832, 833, 704, 703, + /* 520 */ 702, 853, 850, 846, 926, 838, 849, 837, 836, 825, + /* 530 */ 824, 812, 847, 848, 811, 750, 765, 898, 897, 900, + /* 540 */ 899, 896, 764, 625, 624, 705, 700, 699, 805, 804, /* 550 */ 803, 643, 755, 754, 642, 664, 663, 660, 641, 640, /* 560 */ 627, 626, 606, 600, 599, 598, 597, 615, 614, 613, /* 570 */ 611, 596, 595, 689, 688, 687, 686, 685, 682, 592, @@ -1258,99 +1258,98 @@ static const char *const yyRuleName[] = { /* 257 */ "exprx ::= expr not_opt BETWEEN expr AND", /* 258 */ "exprx ::= CASE case_operand case_exprlist case_else", /* 259 */ "exprx ::= expr not_opt IN LP exprlist", - /* 260 */ "exprx ::= LP expr", - /* 261 */ "exprx ::= expr not_opt IN ID_DB", - /* 262 */ "exprx ::= expr not_opt IN nm DOT ID_TAB", - /* 263 */ "exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN", - /* 264 */ "exprx ::= nm DOT ID_TAB|ID_COL", - /* 265 */ "exprx ::= nm DOT nm DOT ID_COL", - /* 266 */ "exprx ::= RAISE LP raisetype COMMA ID_ERR_MSG RP", - /* 267 */ "expr ::= exprx", - /* 268 */ "expr ::=", - /* 269 */ "not_opt ::=", - /* 270 */ "not_opt ::= NOT", - /* 271 */ "likeop ::= LIKE|GLOB", - /* 272 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", - /* 273 */ "case_exprlist ::= WHEN expr THEN expr", - /* 274 */ "case_else ::= ELSE expr", - /* 275 */ "case_else ::=", - /* 276 */ "case_operand ::= exprx", - /* 277 */ "case_operand ::=", - /* 278 */ "exprlist ::= nexprlist", - /* 279 */ "exprlist ::=", - /* 280 */ "nexprlist ::= nexprlist COMMA expr", - /* 281 */ "nexprlist ::= exprx", - /* 282 */ "cmd ::= CREATE uniqueflag INDEX nm ON nm dbnm LP idxlist RP onconf", - /* 283 */ "cmd ::= CREATE uniqueflag INDEX nm dbnm ON ID_TAB", - /* 284 */ "cmd ::= CREATE uniqueflag INDEX nm DOT ID_IDX_NEW", - /* 285 */ "cmd ::= CREATE uniqueflag INDEX ID_DB|ID_IDX_NEW", - /* 286 */ "uniqueflag ::= UNIQUE", - /* 287 */ "uniqueflag ::=", - /* 288 */ "idxlist_opt ::=", - /* 289 */ "idxlist_opt ::= LP idxlist RP", - /* 290 */ "idxlist ::= idxlist COMMA idxlist_single", - /* 291 */ "idxlist ::= idxlist_single", - /* 292 */ "idxlist_single ::= nm sortorder", - /* 293 */ "idxlist_single ::= ID_COL", - /* 294 */ "cmd ::= DROP INDEX fullname", - /* 295 */ "cmd ::= DROP INDEX nm DOT ID_IDX", - /* 296 */ "cmd ::= DROP INDEX ID_DB|ID_IDX", - /* 297 */ "cmd ::= COPY orconf nm dbnm FROM nm USING DELIMITERS STRING", - /* 298 */ "cmd ::= COPY orconf nm dbnm FROM nm", - /* 299 */ "cmd ::= VACUUM", - /* 300 */ "cmd ::= VACUUM nm", - /* 301 */ "cmd ::= PRAGMA ids", - /* 302 */ "cmd ::= PRAGMA nm EQ nmnum", - /* 303 */ "cmd ::= PRAGMA nm LP nmnum RP", - /* 304 */ "cmd ::= PRAGMA nm EQ minus_num", - /* 305 */ "cmd ::= PRAGMA nm LP minus_num RP", - /* 306 */ "cmd ::= PRAGMA nm DOT ID_PRAGMA", - /* 307 */ "cmd ::= PRAGMA ID_DB|ID_PRAGMA", - /* 308 */ "nmnum ::= plus_num", - /* 309 */ "nmnum ::= nm", - /* 310 */ "nmnum ::= ON", - /* 311 */ "nmnum ::= DELETE", - /* 312 */ "nmnum ::= DEFAULT", - /* 313 */ "plus_num ::= PLUS number", - /* 314 */ "plus_num ::= number", - /* 315 */ "minus_num ::= MINUS number", - /* 316 */ "number ::= INTEGER", - /* 317 */ "number ::= FLOAT", - /* 318 */ "cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause BEGIN trigger_cmd_list END", - /* 319 */ "cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause", - /* 320 */ "cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause BEGIN trigger_cmd_list", - /* 321 */ "cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON ID_TAB|ID_DB", - /* 322 */ "cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm DOT ID_TAB", - /* 323 */ "cmd ::= CREATE temp TRIGGER ID_TRIG_NEW", - /* 324 */ "trigger_time ::= BEFORE", - /* 325 */ "trigger_time ::= AFTER", - /* 326 */ "trigger_time ::= INSTEAD OF", - /* 327 */ "trigger_time ::=", - /* 328 */ "trigger_event ::= DELETE", - /* 329 */ "trigger_event ::= INSERT", - /* 330 */ "trigger_event ::= UPDATE", - /* 331 */ "trigger_event ::= UPDATE OF inscollist", - /* 332 */ "foreach_clause ::=", - /* 333 */ "foreach_clause ::= FOR EACH ROW", - /* 334 */ "foreach_clause ::= FOR EACH STATEMENT", - /* 335 */ "when_clause ::=", - /* 336 */ "when_clause ::= WHEN expr", - /* 337 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 338 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 339 */ "trigger_cmd ::= update_stmt", - /* 340 */ "trigger_cmd ::= insert_stmt", - /* 341 */ "trigger_cmd ::= delete_stmt", - /* 342 */ "trigger_cmd ::= select_stmt", - /* 343 */ "raisetype ::= ROLLBACK|ABORT|FAIL", - /* 344 */ "cmd ::= DROP TRIGGER fullname", - /* 345 */ "cmd ::= DROP TRIGGER nm DOT ID_TRIG", - /* 346 */ "cmd ::= DROP TRIGGER ID_DB|ID_TRIG", - /* 347 */ "cmd ::= ATTACH database_kw_opt ids AS ids key_opt", - /* 348 */ "key_opt ::=", - /* 349 */ "key_opt ::= USING ids", - /* 350 */ "database_kw_opt ::= DATABASE", - /* 351 */ "database_kw_opt ::=", - /* 352 */ "cmd ::= DETACH database_kw_opt nm", + /* 260 */ "exprx ::= expr not_opt IN ID_DB", + /* 261 */ "exprx ::= expr not_opt IN nm DOT ID_TAB", + /* 262 */ "exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN", + /* 263 */ "exprx ::= nm DOT ID_TAB|ID_COL", + /* 264 */ "exprx ::= nm DOT nm DOT ID_COL", + /* 265 */ "exprx ::= RAISE LP raisetype COMMA ID_ERR_MSG RP", + /* 266 */ "expr ::= exprx", + /* 267 */ "expr ::=", + /* 268 */ "not_opt ::=", + /* 269 */ "not_opt ::= NOT", + /* 270 */ "likeop ::= LIKE|GLOB", + /* 271 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 272 */ "case_exprlist ::= WHEN expr THEN expr", + /* 273 */ "case_else ::= ELSE expr", + /* 274 */ "case_else ::=", + /* 275 */ "case_operand ::= exprx", + /* 276 */ "case_operand ::=", + /* 277 */ "exprlist ::= nexprlist", + /* 278 */ "exprlist ::=", + /* 279 */ "nexprlist ::= nexprlist COMMA expr", + /* 280 */ "nexprlist ::= exprx", + /* 281 */ "cmd ::= CREATE uniqueflag INDEX nm ON nm dbnm LP idxlist RP onconf", + /* 282 */ "cmd ::= CREATE uniqueflag INDEX nm dbnm ON ID_TAB", + /* 283 */ "cmd ::= CREATE uniqueflag INDEX nm DOT ID_IDX_NEW", + /* 284 */ "cmd ::= CREATE uniqueflag INDEX ID_DB|ID_IDX_NEW", + /* 285 */ "uniqueflag ::= UNIQUE", + /* 286 */ "uniqueflag ::=", + /* 287 */ "idxlist_opt ::=", + /* 288 */ "idxlist_opt ::= LP idxlist RP", + /* 289 */ "idxlist ::= idxlist COMMA idxlist_single", + /* 290 */ "idxlist ::= idxlist_single", + /* 291 */ "idxlist_single ::= nm sortorder", + /* 292 */ "idxlist_single ::= ID_COL", + /* 293 */ "cmd ::= DROP INDEX fullname", + /* 294 */ "cmd ::= DROP INDEX nm DOT ID_IDX", + /* 295 */ "cmd ::= DROP INDEX ID_DB|ID_IDX", + /* 296 */ "cmd ::= COPY orconf nm dbnm FROM nm USING DELIMITERS STRING", + /* 297 */ "cmd ::= COPY orconf nm dbnm FROM nm", + /* 298 */ "cmd ::= VACUUM", + /* 299 */ "cmd ::= VACUUM nm", + /* 300 */ "cmd ::= PRAGMA ids", + /* 301 */ "cmd ::= PRAGMA nm EQ nmnum", + /* 302 */ "cmd ::= PRAGMA nm LP nmnum RP", + /* 303 */ "cmd ::= PRAGMA nm EQ minus_num", + /* 304 */ "cmd ::= PRAGMA nm LP minus_num RP", + /* 305 */ "cmd ::= PRAGMA nm DOT ID_PRAGMA", + /* 306 */ "cmd ::= PRAGMA ID_DB|ID_PRAGMA", + /* 307 */ "nmnum ::= plus_num", + /* 308 */ "nmnum ::= nm", + /* 309 */ "nmnum ::= ON", + /* 310 */ "nmnum ::= DELETE", + /* 311 */ "nmnum ::= DEFAULT", + /* 312 */ "plus_num ::= PLUS number", + /* 313 */ "plus_num ::= number", + /* 314 */ "minus_num ::= MINUS number", + /* 315 */ "number ::= INTEGER", + /* 316 */ "number ::= FLOAT", + /* 317 */ "cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause BEGIN trigger_cmd_list END", + /* 318 */ "cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause", + /* 319 */ "cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause BEGIN trigger_cmd_list", + /* 320 */ "cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON ID_TAB|ID_DB", + /* 321 */ "cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm DOT ID_TAB", + /* 322 */ "cmd ::= CREATE temp TRIGGER ID_TRIG_NEW", + /* 323 */ "trigger_time ::= BEFORE", + /* 324 */ "trigger_time ::= AFTER", + /* 325 */ "trigger_time ::= INSTEAD OF", + /* 326 */ "trigger_time ::=", + /* 327 */ "trigger_event ::= DELETE", + /* 328 */ "trigger_event ::= INSERT", + /* 329 */ "trigger_event ::= UPDATE", + /* 330 */ "trigger_event ::= UPDATE OF inscollist", + /* 331 */ "foreach_clause ::=", + /* 332 */ "foreach_clause ::= FOR EACH ROW", + /* 333 */ "foreach_clause ::= FOR EACH STATEMENT", + /* 334 */ "when_clause ::=", + /* 335 */ "when_clause ::= WHEN expr", + /* 336 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 337 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 338 */ "trigger_cmd ::= update_stmt", + /* 339 */ "trigger_cmd ::= insert_stmt", + /* 340 */ "trigger_cmd ::= delete_stmt", + /* 341 */ "trigger_cmd ::= select_stmt", + /* 342 */ "raisetype ::= ROLLBACK|ABORT|FAIL", + /* 343 */ "cmd ::= DROP TRIGGER fullname", + /* 344 */ "cmd ::= DROP TRIGGER nm DOT ID_TRIG", + /* 345 */ "cmd ::= DROP TRIGGER ID_DB|ID_TRIG", + /* 346 */ "cmd ::= ATTACH database_kw_opt ids AS ids key_opt", + /* 347 */ "key_opt ::=", + /* 348 */ "key_opt ::= USING ids", + /* 349 */ "database_kw_opt ::= DATABASE", + /* 350 */ "database_kw_opt ::=", + /* 351 */ "cmd ::= DETACH database_kw_opt nm", }; #endif /* NDEBUG */ @@ -2220,7 +2219,6 @@ static const struct { { 221, 5 }, { 221, 4 }, { 221, 5 }, - { 221, 2 }, { 221, 4 }, { 221, 6 }, { 221, 1 }, @@ -2396,10 +2394,10 @@ static void yy_reduce( {yygotominor.yy91 = new ParserStubExplain(true, false);} break; case 7: /* cmdx ::= cmd */ - case 339: /* trigger_cmd ::= update_stmt */ yytestcase(yyruleno==339); - case 340: /* trigger_cmd ::= insert_stmt */ yytestcase(yyruleno==340); - case 341: /* trigger_cmd ::= delete_stmt */ yytestcase(yyruleno==341); - case 342: /* trigger_cmd ::= select_stmt */ yytestcase(yyruleno==342); + case 338: /* trigger_cmd ::= update_stmt */ yytestcase(yyruleno==338); + case 339: /* trigger_cmd ::= insert_stmt */ yytestcase(yyruleno==339); + case 340: /* trigger_cmd ::= delete_stmt */ yytestcase(yyruleno==340); + case 341: /* trigger_cmd ::= select_stmt */ yytestcase(yyruleno==341); {yygotominor.yy203 = yymsp[0].minor.yy203;} break; case 8: /* cmd ::= BEGIN trans_opt onconf */ @@ -2467,8 +2465,8 @@ static void yy_reduce( case 16: /* cmd ::= CREATE temp TABLE fullname LP columnlist conslist_opt RP */ { yygotominor.yy203 = new SqliteCreateTable( - *(yymsp[-6].minor.yy226), false, + *(yymsp[-6].minor.yy226), yymsp[-4].minor.yy120->name1, yymsp[-4].minor.yy120->name2, *(yymsp[-2].minor.yy42), @@ -2484,8 +2482,8 @@ static void yy_reduce( case 17: /* cmd ::= CREATE temp TABLE fullname AS select */ { yygotominor.yy203 = new SqliteCreateTable( - *(yymsp[-4].minor.yy226), false, + *(yymsp[-4].minor.yy226), yymsp[-2].minor.yy120->name1, yymsp[-2].minor.yy120->name2, yymsp[0].minor.yy153 @@ -2502,7 +2500,7 @@ static void yy_reduce( break; case 19: /* cmd ::= CREATE temp TABLE ID_DB|ID_TAB_NEW */ case 110: /* cmd ::= CREATE temp VIEW ID_VIEW_NEW */ yytestcase(yyruleno==110); - case 323: /* cmd ::= CREATE temp TRIGGER ID_TRIG_NEW */ yytestcase(yyruleno==323); + case 322: /* cmd ::= CREATE temp TRIGGER ID_TRIG_NEW */ yytestcase(yyruleno==322); { yy_destructor(yypParser,157,&yymsp[-2].minor); } break; @@ -2599,9 +2597,9 @@ static void yy_reduce( break; case 40: /* signed ::= plus_num */ case 41: /* signed ::= minus_num */ yytestcase(yyruleno==41); - case 308: /* nmnum ::= plus_num */ yytestcase(yyruleno==308); - case 313: /* plus_num ::= PLUS number */ yytestcase(yyruleno==313); - case 314: /* plus_num ::= number */ yytestcase(yyruleno==314); + case 307: /* nmnum ::= plus_num */ yytestcase(yyruleno==307); + case 312: /* plus_num ::= PLUS number */ yytestcase(yyruleno==312); + case 313: /* plus_num ::= number */ yytestcase(yyruleno==313); {yygotominor.yy69 = yymsp[0].minor.yy69;} break; case 42: /* carglist ::= carglist ccons */ @@ -2849,15 +2847,15 @@ static void yy_reduce( } break; case 85: /* tconscomma ::= COMMA */ - case 270: /* not_opt ::= NOT */ yytestcase(yyruleno==270); - case 286: /* uniqueflag ::= UNIQUE */ yytestcase(yyruleno==286); - case 350: /* database_kw_opt ::= DATABASE */ yytestcase(yyruleno==350); + case 269: /* not_opt ::= NOT */ yytestcase(yyruleno==269); + case 285: /* uniqueflag ::= UNIQUE */ yytestcase(yyruleno==285); + case 349: /* database_kw_opt ::= DATABASE */ yytestcase(yyruleno==349); {yygotominor.yy291 = new bool(true);} break; case 86: /* tconscomma ::= */ - case 269: /* not_opt ::= */ yytestcase(yyruleno==269); - case 287: /* uniqueflag ::= */ yytestcase(yyruleno==287); - case 351: /* database_kw_opt ::= */ yytestcase(yyruleno==351); + case 268: /* not_opt ::= */ yytestcase(yyruleno==268); + case 286: /* uniqueflag ::= */ yytestcase(yyruleno==286); + case 350: /* database_kw_opt ::= */ yytestcase(yyruleno==350); {yygotominor.yy291 = new bool(false);} break; case 87: /* tcons ::= CONSTRAINT nm */ @@ -2961,15 +2959,15 @@ static void yy_reduce( case 187: /* delete_stmt ::= DELETE FROM ID_DB|ID_TAB */ yytestcase(yyruleno==187); case 195: /* update_stmt ::= UPDATE orconf nm DOT ID_TAB */ yytestcase(yyruleno==195); case 196: /* update_stmt ::= UPDATE orconf ID_DB|ID_TAB */ yytestcase(yyruleno==196); - case 264: /* exprx ::= nm DOT ID_TAB|ID_COL */ yytestcase(yyruleno==264); - case 284: /* cmd ::= CREATE uniqueflag INDEX nm DOT ID_IDX_NEW */ yytestcase(yyruleno==284); - case 285: /* cmd ::= CREATE uniqueflag INDEX ID_DB|ID_IDX_NEW */ yytestcase(yyruleno==285); - case 295: /* cmd ::= DROP INDEX nm DOT ID_IDX */ yytestcase(yyruleno==295); - case 296: /* cmd ::= DROP INDEX ID_DB|ID_IDX */ yytestcase(yyruleno==296); - case 306: /* cmd ::= PRAGMA nm DOT ID_PRAGMA */ yytestcase(yyruleno==306); - case 307: /* cmd ::= PRAGMA ID_DB|ID_PRAGMA */ yytestcase(yyruleno==307); - case 345: /* cmd ::= DROP TRIGGER nm DOT ID_TRIG */ yytestcase(yyruleno==345); - case 346: /* cmd ::= DROP TRIGGER ID_DB|ID_TRIG */ yytestcase(yyruleno==346); + case 263: /* exprx ::= nm DOT ID_TAB|ID_COL */ yytestcase(yyruleno==263); + case 283: /* cmd ::= CREATE uniqueflag INDEX nm DOT ID_IDX_NEW */ yytestcase(yyruleno==283); + case 284: /* cmd ::= CREATE uniqueflag INDEX ID_DB|ID_IDX_NEW */ yytestcase(yyruleno==284); + case 294: /* cmd ::= DROP INDEX nm DOT ID_IDX */ yytestcase(yyruleno==294); + case 295: /* cmd ::= DROP INDEX ID_DB|ID_IDX */ yytestcase(yyruleno==295); + case 305: /* cmd ::= PRAGMA nm DOT ID_PRAGMA */ yytestcase(yyruleno==305); + case 306: /* cmd ::= PRAGMA ID_DB|ID_PRAGMA */ yytestcase(yyruleno==306); + case 344: /* cmd ::= DROP TRIGGER nm DOT ID_TRIG */ yytestcase(yyruleno==344); + case 345: /* cmd ::= DROP TRIGGER ID_DB|ID_TRIG */ yytestcase(yyruleno==345); { yy_destructor(yypParser,156,&yymsp[-2].minor); } break; @@ -3341,11 +3339,11 @@ static void yy_reduce( {yygotominor.yy389 = new SqliteSortOrder(SqliteSortOrder::null);} break; case 173: /* groupby_opt ::= */ - case 279: /* exprlist ::= */ yytestcase(yyruleno==279); + case 278: /* exprlist ::= */ yytestcase(yyruleno==278); {yygotominor.yy231 = new ParserExprList();} break; case 174: /* groupby_opt ::= GROUP BY nexprlist */ - case 278: /* exprlist ::= nexprlist */ yytestcase(yyruleno==278); + case 277: /* exprlist ::= nexprlist */ yytestcase(yyruleno==277); {yygotominor.yy231 = yymsp[0].minor.yy231;} break; case 175: /* groupby_opt ::= GROUP BY */ @@ -3356,18 +3354,18 @@ static void yy_reduce( break; case 176: /* having_opt ::= */ case 188: /* where_opt ::= */ yytestcase(yyruleno==188); - case 275: /* case_else ::= */ yytestcase(yyruleno==275); - case 277: /* case_operand ::= */ yytestcase(yyruleno==277); - case 335: /* when_clause ::= */ yytestcase(yyruleno==335); - case 348: /* key_opt ::= */ yytestcase(yyruleno==348); + case 274: /* case_else ::= */ yytestcase(yyruleno==274); + case 276: /* case_operand ::= */ yytestcase(yyruleno==276); + case 334: /* when_clause ::= */ yytestcase(yyruleno==334); + case 347: /* key_opt ::= */ yytestcase(yyruleno==347); {yygotominor.yy192 = nullptr;} break; case 177: /* having_opt ::= HAVING expr */ case 189: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==189); - case 267: /* expr ::= exprx */ yytestcase(yyruleno==267); - case 274: /* case_else ::= ELSE expr */ yytestcase(yyruleno==274); - case 276: /* case_operand ::= exprx */ yytestcase(yyruleno==276); - case 336: /* when_clause ::= WHEN expr */ yytestcase(yyruleno==336); + case 266: /* expr ::= exprx */ yytestcase(yyruleno==266); + case 273: /* case_else ::= ELSE expr */ yytestcase(yyruleno==273); + case 275: /* case_operand ::= exprx */ yytestcase(yyruleno==275); + case 335: /* when_clause ::= WHEN expr */ yytestcase(yyruleno==335); {yygotominor.yy192 = yymsp[0].minor.yy192;} break; case 178: /* limit_opt ::= */ @@ -3919,68 +3917,60 @@ static void yy_reduce( parserContext->minorErrorBeforeNextToken("Syntax error"); } break; - case 260: /* exprx ::= LP expr */ -{ - yygotominor.yy192 = new SqliteExpr(); - yygotominor.yy192->initSubExpr(yymsp[0].minor.yy192); - objectForTokens = yygotominor.yy192; - parserContext->minorErrorBeforeNextToken("Syntax error"); - } - break; - case 261: /* exprx ::= expr not_opt IN ID_DB */ + case 260: /* exprx ::= expr not_opt IN ID_DB */ { yy_destructor(yypParser,177,&yymsp[-3].minor); } break; - case 262: /* exprx ::= expr not_opt IN nm DOT ID_TAB */ - case 263: /* exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN */ yytestcase(yyruleno==263); + case 261: /* exprx ::= expr not_opt IN nm DOT ID_TAB */ + case 262: /* exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN */ yytestcase(yyruleno==262); { yy_destructor(yypParser,177,&yymsp[-5].minor); yy_destructor(yypParser,156,&yymsp[-2].minor); } break; - case 265: /* exprx ::= nm DOT nm DOT ID_COL */ - case 266: /* exprx ::= RAISE LP raisetype COMMA ID_ERR_MSG RP */ yytestcase(yyruleno==266); + case 264: /* exprx ::= nm DOT nm DOT ID_COL */ + case 265: /* exprx ::= RAISE LP raisetype COMMA ID_ERR_MSG RP */ yytestcase(yyruleno==265); { yy_destructor(yypParser,156,&yymsp[-4].minor); yy_destructor(yypParser,156,&yymsp[-2].minor); } break; - case 268: /* expr ::= */ + case 267: /* expr ::= */ { yygotominor.yy192 = new SqliteExpr(); objectForTokens = yygotominor.yy192; parserContext->minorErrorAfterLastToken("Syntax error"); } break; - case 271: /* likeop ::= LIKE|GLOB */ + case 270: /* likeop ::= LIKE|GLOB */ {yygotominor.yy41 = new SqliteExpr::LikeOp(SqliteExpr::likeOp(yymsp[0].minor.yy0->value));} break; - case 272: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ + case 271: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ { yymsp[-4].minor.yy231->append(yymsp[-2].minor.yy192); yymsp[-4].minor.yy231->append(yymsp[0].minor.yy192); yygotominor.yy231 = yymsp[-4].minor.yy231; } break; - case 273: /* case_exprlist ::= WHEN expr THEN expr */ + case 272: /* case_exprlist ::= WHEN expr THEN expr */ { yygotominor.yy231 = new ParserExprList(); yygotominor.yy231->append(yymsp[-2].minor.yy192); yygotominor.yy231->append(yymsp[0].minor.yy192); } break; - case 280: /* nexprlist ::= nexprlist COMMA expr */ + case 279: /* nexprlist ::= nexprlist COMMA expr */ { yymsp[-2].minor.yy231->append(yymsp[0].minor.yy192); yygotominor.yy231 = yymsp[-2].minor.yy231; DONT_INHERIT_TOKENS("nexprlist"); } break; - case 281: /* nexprlist ::= exprx */ + case 280: /* nexprlist ::= exprx */ { yygotominor.yy231 = new ParserExprList(); yygotominor.yy231->append(yymsp[0].minor.yy192); } break; - case 282: /* cmd ::= CREATE uniqueflag INDEX nm ON nm dbnm LP idxlist RP onconf */ + case 281: /* cmd ::= CREATE uniqueflag INDEX nm ON nm dbnm LP idxlist RP onconf */ { yygotominor.yy203 = new SqliteCreateIndex( *(yymsp[-9].minor.yy291), @@ -4000,31 +3990,31 @@ static void yy_reduce( objectForTokens = yygotominor.yy203; } break; - case 283: /* cmd ::= CREATE uniqueflag INDEX nm dbnm ON ID_TAB */ + case 282: /* cmd ::= CREATE uniqueflag INDEX nm dbnm ON ID_TAB */ { yy_destructor(yypParser,156,&yymsp[-3].minor); } break; - case 288: /* idxlist_opt ::= */ + case 287: /* idxlist_opt ::= */ {yygotominor.yy63 = new ParserIndexedColumnList();} break; - case 289: /* idxlist_opt ::= LP idxlist RP */ + case 288: /* idxlist_opt ::= LP idxlist RP */ {yygotominor.yy63 = yymsp[-1].minor.yy63;} break; - case 290: /* idxlist ::= idxlist COMMA idxlist_single */ + case 289: /* idxlist ::= idxlist COMMA idxlist_single */ { yymsp[-2].minor.yy63->append(yymsp[0].minor.yy428); yygotominor.yy63 = yymsp[-2].minor.yy63; DONT_INHERIT_TOKENS("idxlist"); } break; - case 291: /* idxlist ::= idxlist_single */ + case 290: /* idxlist ::= idxlist_single */ { yygotominor.yy63 = new ParserIndexedColumnList(); yygotominor.yy63->append(yymsp[0].minor.yy428); } break; - case 292: /* idxlist_single ::= nm sortorder */ - case 293: /* idxlist_single ::= ID_COL */ yytestcase(yyruleno==293); + case 291: /* idxlist_single ::= nm sortorder */ + case 292: /* idxlist_single ::= ID_COL */ yytestcase(yyruleno==292); { SqliteIndexedColumn* obj = new SqliteIndexedColumn( @@ -4038,14 +4028,14 @@ static void yy_reduce( objectForTokens = yygotominor.yy428; } break; - case 294: /* cmd ::= DROP INDEX fullname */ + case 293: /* cmd ::= DROP INDEX fullname */ { yygotominor.yy203 = new SqliteDropIndex(false, yymsp[0].minor.yy120->name1, yymsp[0].minor.yy120->name2); delete yymsp[0].minor.yy120; objectForTokens = yygotominor.yy203; } break; - case 297: /* cmd ::= COPY orconf nm dbnm FROM nm USING DELIMITERS STRING */ + case 296: /* cmd ::= COPY orconf nm dbnm FROM nm USING DELIMITERS STRING */ { yygotominor.yy203 = new SqliteCopy( *(yymsp[-7].minor.yy418), @@ -4061,7 +4051,7 @@ static void yy_reduce( objectForTokens = yygotominor.yy203; } break; - case 298: /* cmd ::= COPY orconf nm dbnm FROM nm */ + case 297: /* cmd ::= COPY orconf nm dbnm FROM nm */ { yygotominor.yy203 = new SqliteCopy( *(yymsp[-4].minor.yy418), @@ -4076,28 +4066,28 @@ static void yy_reduce( objectForTokens = yygotominor.yy203; } break; - case 299: /* cmd ::= VACUUM */ + case 298: /* cmd ::= VACUUM */ { yygotominor.yy203 = new SqliteVacuum(); objectForTokens = yygotominor.yy203; } break; - case 300: /* cmd ::= VACUUM nm */ + case 299: /* cmd ::= VACUUM nm */ { yygotominor.yy203 = new SqliteVacuum(*(yymsp[0].minor.yy319)); delete yymsp[0].minor.yy319; objectForTokens = yygotominor.yy203; } break; - case 301: /* cmd ::= PRAGMA ids */ + case 300: /* cmd ::= PRAGMA ids */ { yygotominor.yy203 = new SqlitePragma(*(yymsp[0].minor.yy319), QString::null); delete yymsp[0].minor.yy319; objectForTokens = yygotominor.yy203; } break; - case 302: /* cmd ::= PRAGMA nm EQ nmnum */ - case 304: /* cmd ::= PRAGMA nm EQ minus_num */ yytestcase(yyruleno==304); + case 301: /* cmd ::= PRAGMA nm EQ nmnum */ + case 303: /* cmd ::= PRAGMA nm EQ minus_num */ yytestcase(yyruleno==303); { yygotominor.yy203 = new SqlitePragma(*(yymsp[-2].minor.yy319), QString::null, *(yymsp[0].minor.yy69), true); delete yymsp[-2].minor.yy319; @@ -4105,8 +4095,8 @@ static void yy_reduce( objectForTokens = yygotominor.yy203; } break; - case 303: /* cmd ::= PRAGMA nm LP nmnum RP */ - case 305: /* cmd ::= PRAGMA nm LP minus_num RP */ yytestcase(yyruleno==305); + case 302: /* cmd ::= PRAGMA nm LP nmnum RP */ + case 304: /* cmd ::= PRAGMA nm LP minus_num RP */ yytestcase(yyruleno==304); { yygotominor.yy203 = new SqlitePragma(*(yymsp[-3].minor.yy319), QString::null, *(yymsp[-1].minor.yy69), false); delete yymsp[-3].minor.yy319; @@ -4114,18 +4104,18 @@ static void yy_reduce( objectForTokens = yygotominor.yy203; } break; - case 309: /* nmnum ::= nm */ + case 308: /* nmnum ::= nm */ { yygotominor.yy69 = new QVariant(*(yymsp[0].minor.yy319)); delete yymsp[0].minor.yy319; } break; - case 310: /* nmnum ::= ON */ - case 311: /* nmnum ::= DELETE */ yytestcase(yyruleno==311); - case 312: /* nmnum ::= DEFAULT */ yytestcase(yyruleno==312); + case 309: /* nmnum ::= ON */ + case 310: /* nmnum ::= DELETE */ yytestcase(yyruleno==310); + case 311: /* nmnum ::= DEFAULT */ yytestcase(yyruleno==311); {yygotominor.yy69 = new QVariant(yymsp[0].minor.yy0->value);} break; - case 315: /* minus_num ::= MINUS number */ + case 314: /* minus_num ::= MINUS number */ { if (yymsp[0].minor.yy69->type() == QVariant::Double) *(yymsp[0].minor.yy69) = -(yymsp[0].minor.yy69->toDouble()); @@ -4137,13 +4127,13 @@ static void yy_reduce( yygotominor.yy69 = yymsp[0].minor.yy69; } break; - case 316: /* number ::= INTEGER */ + case 315: /* number ::= INTEGER */ {yygotominor.yy69 = new QVariant(QVariant(yymsp[0].minor.yy0->value).toLongLong());} break; - case 317: /* number ::= FLOAT */ + case 316: /* number ::= FLOAT */ {yygotominor.yy69 = new QVariant(QVariant(yymsp[0].minor.yy0->value).toDouble());} break; - case 318: /* cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause BEGIN trigger_cmd_list END */ + case 317: /* cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause BEGIN trigger_cmd_list END */ { yygotominor.yy203 = new SqliteCreateTrigger( *(yymsp[-12].minor.yy226), @@ -4168,7 +4158,7 @@ static void yy_reduce( objectForTokens = yygotominor.yy203; } break; - case 319: /* cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause */ + case 318: /* cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause */ { QList CL; @@ -4195,7 +4185,7 @@ static void yy_reduce( parserContext->minorErrorAfterLastToken("Syntax error"); } break; - case 320: /* cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause BEGIN trigger_cmd_list */ + case 319: /* cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm dbnm foreach_clause when_clause BEGIN trigger_cmd_list */ { yygotominor.yy203 = new SqliteCreateTrigger( *(yymsp[-11].minor.yy226), @@ -4221,14 +4211,14 @@ static void yy_reduce( parserContext->minorErrorAfterLastToken("Syntax error"); } break; - case 321: /* cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON ID_TAB|ID_DB */ + case 320: /* cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON ID_TAB|ID_DB */ { yy_destructor(yypParser,157,&yymsp[-6].minor); yy_destructor(yypParser,156,&yymsp[-4].minor); yy_destructor(yypParser,232,&yymsp[-3].minor); yy_destructor(yypParser,233,&yymsp[-2].minor); } break; - case 322: /* cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm DOT ID_TAB */ + case 321: /* cmd ::= CREATE temp TRIGGER nm trigger_time trigger_event ON nm DOT ID_TAB */ { yy_destructor(yypParser,157,&yymsp[-8].minor); yy_destructor(yypParser,156,&yymsp[-6].minor); yy_destructor(yypParser,232,&yymsp[-5].minor); @@ -4236,76 +4226,76 @@ static void yy_reduce( yy_destructor(yypParser,156,&yymsp[-2].minor); } break; - case 324: /* trigger_time ::= BEFORE */ + case 323: /* trigger_time ::= BEFORE */ {yygotominor.yy372 = new SqliteCreateTrigger::Time(SqliteCreateTrigger::Time::BEFORE);} break; - case 325: /* trigger_time ::= AFTER */ + case 324: /* trigger_time ::= AFTER */ {yygotominor.yy372 = new SqliteCreateTrigger::Time(SqliteCreateTrigger::Time::AFTER);} break; - case 326: /* trigger_time ::= INSTEAD OF */ + case 325: /* trigger_time ::= INSTEAD OF */ {yygotominor.yy372 = new SqliteCreateTrigger::Time(SqliteCreateTrigger::Time::INSTEAD_OF);} break; - case 327: /* trigger_time ::= */ + case 326: /* trigger_time ::= */ {yygotominor.yy372 = new SqliteCreateTrigger::Time(SqliteCreateTrigger::Time::null);} break; - case 328: /* trigger_event ::= DELETE */ + case 327: /* trigger_event ::= DELETE */ { yygotominor.yy151 = new SqliteCreateTrigger::Event(SqliteCreateTrigger::Event::DELETE); objectForTokens = yygotominor.yy151; } break; - case 329: /* trigger_event ::= INSERT */ + case 328: /* trigger_event ::= INSERT */ { yygotominor.yy151 = new SqliteCreateTrigger::Event(SqliteCreateTrigger::Event::INSERT); objectForTokens = yygotominor.yy151; } break; - case 330: /* trigger_event ::= UPDATE */ + case 329: /* trigger_event ::= UPDATE */ { yygotominor.yy151 = new SqliteCreateTrigger::Event(SqliteCreateTrigger::Event::UPDATE); objectForTokens = yygotominor.yy151; } break; - case 331: /* trigger_event ::= UPDATE OF inscollist */ + case 330: /* trigger_event ::= UPDATE OF inscollist */ { yygotominor.yy151 = new SqliteCreateTrigger::Event(*(yymsp[0].minor.yy207)); delete yymsp[0].minor.yy207; objectForTokens = yygotominor.yy151; } break; - case 332: /* foreach_clause ::= */ + case 331: /* foreach_clause ::= */ {yygotominor.yy83 = new SqliteCreateTrigger::Scope(SqliteCreateTrigger::Scope::null);} break; - case 333: /* foreach_clause ::= FOR EACH ROW */ + case 332: /* foreach_clause ::= FOR EACH ROW */ {yygotominor.yy83 = new SqliteCreateTrigger::Scope(SqliteCreateTrigger::Scope::FOR_EACH_ROW);} break; - case 334: /* foreach_clause ::= FOR EACH STATEMENT */ + case 333: /* foreach_clause ::= FOR EACH STATEMENT */ {yygotominor.yy83 = new SqliteCreateTrigger::Scope(SqliteCreateTrigger::Scope::FOR_EACH_STATEMENT);} break; - case 337: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 336: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { yymsp[-2].minor.yy270->append(yymsp[-1].minor.yy203); yygotominor.yy270 = yymsp[-2].minor.yy270; DONT_INHERIT_TOKENS("trigger_cmd_list"); } break; - case 338: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 337: /* trigger_cmd_list ::= trigger_cmd SEMI */ { yygotominor.yy270 = new ParserQueryList(); yygotominor.yy270->append(yymsp[-1].minor.yy203); } break; - case 343: /* raisetype ::= ROLLBACK|ABORT|FAIL */ + case 342: /* raisetype ::= ROLLBACK|ABORT|FAIL */ {yygotominor.yy0 = yymsp[0].minor.yy0;} break; - case 344: /* cmd ::= DROP TRIGGER fullname */ + case 343: /* cmd ::= DROP TRIGGER fullname */ { yygotominor.yy203 = new SqliteDropTrigger(false, yymsp[0].minor.yy120->name1, yymsp[0].minor.yy120->name2); delete yymsp[0].minor.yy120; objectForTokens = yygotominor.yy203; } break; - case 347: /* cmd ::= ATTACH database_kw_opt ids AS ids key_opt */ + case 346: /* cmd ::= ATTACH database_kw_opt ids AS ids key_opt */ { SqliteExpr* e1 = new SqliteExpr(); SqliteExpr* e2 = new SqliteExpr(); @@ -4318,7 +4308,7 @@ static void yy_reduce( objectForTokens = yygotominor.yy203; } break; - case 349: /* key_opt ::= USING ids */ + case 348: /* key_opt ::= USING ids */ { SqliteExpr* e = new SqliteExpr(); e->initLiteral(*(yymsp[0].minor.yy319)); @@ -4326,7 +4316,7 @@ static void yy_reduce( yygotominor.yy192 = e; } break; - case 352: /* cmd ::= DETACH database_kw_opt nm */ + case 351: /* cmd ::= DETACH database_kw_opt nm */ { SqliteExpr* e = new SqliteExpr(); e->initLiteral(*(yymsp[0].minor.yy319)); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.y b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.y index 2fd9c0d..d6ee4f7 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.y +++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.y @@ -184,8 +184,8 @@ cmd(X) ::= CREATE temp(T) TABLE LP columnlist(CL) conslist_opt(CS) RP. { X = new SqliteCreateTable( - *(T), false, + *(T), N->name1, N->name2, *(CL), @@ -201,8 +201,8 @@ cmd(X) ::= CREATE temp(T) TABLE fullname(N) AS select(S). { X = new SqliteCreateTable( - *(T), false, + *(T), N->name1, N->name2, S @@ -1586,12 +1586,15 @@ exprx(X) ::= expr(E) not_opt(N) IN LP 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 diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp index 7e4f3c0..646c533 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp @@ -170,7 +170,7 @@ typedef union { #define sqlite3_parseARG_FETCH ParserContext* parserContext = yypParser->parserContext #define sqlite3_parseARG_STORE yypParser->parserContext = parserContext #define YYNSTATE 724 -#define YYNRULE 425 +#define YYNRULE 424 #define YYFALLBACK 1 #define YY_NO_ACTION (YYNSTATE+YYNRULE+2) #define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) @@ -246,22 +246,22 @@ static const YYMINORTYPE yyzerominor = { 0 }; static const YYACTIONTYPE yy_action[] = { /* 0 */ 431, 48, 48, 47, 47, 47, 46, 216, 716, 339, /* 10 */ 643, 425, 51, 51, 51, 51, 44, 49, 49, 49, - /* 20 */ 49, 48, 48, 47, 47, 47, 46, 216, 721, 1027, - /* 30 */ 1027, 643, 131, 580, 51, 51, 51, 51, 411, 49, + /* 20 */ 49, 48, 48, 47, 47, 47, 46, 216, 721, 1026, + /* 30 */ 1026, 643, 131, 580, 51, 51, 51, 51, 411, 49, /* 40 */ 49, 49, 49, 48, 48, 47, 47, 47, 46, 216, - /* 50 */ 579, 81, 58, 643, 157, 685, 301, 282, 1027, 1027, - /* 60 */ 41, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, - /* 70 */ 1027, 1027, 563, 1027, 1027, 1027, 1027, 38, 39, 1027, - /* 80 */ 1027, 1027, 1027, 1027, 40, 431, 528, 385, 716, 595, + /* 50 */ 579, 81, 58, 643, 157, 685, 301, 282, 1026, 1026, + /* 60 */ 41, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, + /* 70 */ 1026, 1026, 563, 1026, 1026, 1026, 1026, 38, 39, 1026, + /* 80 */ 1026, 1026, 1026, 1026, 40, 431, 528, 385, 716, 595, /* 90 */ 594, 280, 4, 377, 716, 630, 425, 642, 608, 422, /* 100 */ 12, 134, 687, 429, 562, 609, 483, 690, 331, 279, /* 110 */ 714, 713, 564, 565, 642, 689, 688, 687, 235, 506, /* 120 */ 60, 320, 610, 411, 47, 47, 47, 46, 216, 122, - /* 130 */ 243, 213, 247, 59, 1143, 1143, 486, 609, 607, 603, + /* 130 */ 243, 213, 247, 59, 1142, 1142, 486, 609, 607, 603, /* 140 */ 685, 306, 485, 584, 716, 41, 507, 509, 642, 508, /* 150 */ 676, 9, 642, 144, 95, 281, 379, 276, 378, 132, /* 160 */ 297, 716, 38, 39, 601, 200, 199, 7, 355, 40, - /* 170 */ 884, 307, 1135, 274, 249, 716, 17, 4, 884, 1135, + /* 170 */ 884, 307, 1134, 274, 249, 716, 17, 4, 884, 1134, /* 180 */ 56, 717, 642, 431, 422, 884, 329, 687, 429, 716, /* 190 */ 687, 643, 690, 687, 425, 690, 714, 713, 690, 642, /* 200 */ 689, 688, 687, 689, 688, 687, 689, 688, 687, 98, @@ -269,16 +269,16 @@ static const YYACTIONTYPE yy_action[] = { /* 220 */ 716, 411, 239, 884, 303, 582, 512, 581, 884, 884, /* 230 */ 884, 884, 884, 642, 643, 676, 9, 642, 685, 217, /* 240 */ 245, 673, 102, 41, 287, 300, 714, 713, 67, 302, - /* 250 */ 148, 307, 1134, 151, 306, 484, 81, 715, 97, 1134, + /* 250 */ 148, 307, 1133, 151, 306, 484, 81, 715, 97, 1133, /* 260 */ 38, 39, 551, 714, 713, 771, 130, 40, 946, 376, /* 270 */ 373, 372, 447, 46, 216, 4, 946, 714, 713, 334, /* 280 */ 642, 682, 422, 946, 606, 687, 429, 371, 448, 447, /* 290 */ 690, 714, 713, 304, 265, 146, 267, 642, 689, 688, /* 300 */ 687, 287, 68, 677, 691, 255, 362, 259, 359, 692, - /* 310 */ 1028, 1028, 682, 946, 715, 946, 946, 447, 698, 234, + /* 310 */ 1027, 1027, 682, 946, 715, 946, 946, 447, 698, 234, /* 320 */ 386, 715, 714, 713, 773, 651, 946, 946, 946, 946, /* 330 */ 110, 642, 317, 676, 9, 642, 222, 677, 299, 52, - /* 340 */ 53, 426, 289, 1028, 1028, 675, 675, 50, 50, 51, + /* 340 */ 53, 426, 289, 1027, 1027, 675, 675, 50, 50, 51, /* 350 */ 51, 51, 51, 716, 49, 49, 49, 49, 48, 48, /* 360 */ 47, 47, 47, 46, 216, 431, 428, 340, 716, 335, /* 370 */ 671, 670, 287, 283, 716, 138, 425, 209, 219, 430, @@ -293,27 +293,27 @@ static const YYACTIONTYPE yy_action[] = { /* 460 */ 92, 143, 642, 358, 422, 931, 674, 687, 429, 14, /* 470 */ 714, 713, 690, 131, 456, 551, 714, 713, 953, 642, /* 480 */ 689, 688, 687, 668, 667, 210, 593, 458, 384, 457, - /* 490 */ 576, 88, 1028, 1028, 13, 931, 672, 931, 931, 54, + /* 490 */ 576, 88, 1027, 1027, 13, 931, 672, 931, 931, 54, /* 500 */ 575, 678, 42, 368, 37, 401, 35, 381, 931, 1, /* 510 */ 931, 931, 641, 642, 634, 676, 9, 642, 661, 714, - /* 520 */ 713, 52, 53, 426, 289, 1028, 1028, 675, 675, 50, + /* 520 */ 713, 52, 53, 426, 289, 1027, 1027, 675, 675, 50, /* 530 */ 50, 51, 51, 51, 51, 660, 49, 49, 49, 49, /* 540 */ 48, 48, 47, 47, 47, 46, 216, 657, 648, 714, /* 550 */ 713, 496, 542, 569, 714, 713, 714, 713, 656, 691, /* 560 */ 543, 614, 320, 30, 692, 27, 716, 585, 274, 682, - /* 570 */ 160, 1028, 1028, 426, 289, 693, 613, 675, 675, 50, + /* 570 */ 160, 1027, 1027, 426, 289, 693, 613, 675, 675, 50, /* 580 */ 50, 51, 51, 51, 51, 398, 49, 49, 49, 49, - /* 590 */ 48, 48, 47, 47, 47, 46, 216, 1026, 1026, 81, - /* 600 */ 52, 53, 426, 289, 1028, 1028, 675, 675, 50, 50, + /* 590 */ 48, 48, 47, 47, 47, 46, 216, 1025, 1025, 81, + /* 600 */ 52, 53, 426, 289, 1027, 1027, 675, 675, 50, 50, /* 610 */ 51, 51, 51, 51, 496, 49, 49, 49, 49, 48, - /* 620 */ 48, 47, 47, 47, 46, 216, 1026, 1026, 1026, 1026, - /* 630 */ 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, - /* 640 */ 716, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, - /* 650 */ 1026, 1026, 1028, 1028, 357, 49, 49, 49, 49, 48, + /* 620 */ 48, 47, 47, 47, 46, 216, 1025, 1025, 1025, 1025, + /* 630 */ 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, + /* 640 */ 716, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, + /* 650 */ 1025, 1025, 1027, 1027, 357, 49, 49, 49, 49, 48, /* 660 */ 48, 47, 47, 47, 46, 216, 288, 552, 714, 713, /* 670 */ 495, 682, 298, 662, 346, 153, 538, 69, 694, 715, - /* 680 */ 715, 52, 53, 426, 289, 1028, 1028, 675, 675, 50, - /* 690 */ 50, 51, 51, 51, 51, 1095, 49, 49, 49, 49, + /* 680 */ 715, 52, 53, 426, 289, 1027, 1027, 675, 675, 50, + /* 690 */ 50, 51, 51, 51, 51, 1094, 49, 49, 49, 49, /* 700 */ 48, 48, 47, 47, 47, 46, 216, 52, 53, 426, /* 710 */ 289, 418, 511, 675, 675, 50, 50, 51, 51, 51, /* 720 */ 51, 159, 49, 49, 49, 49, 48, 48, 47, 47, @@ -321,12 +321,12 @@ static const YYACTIONTYPE yy_action[] = { /* 740 */ 215, 650, 714, 713, 81, 52, 53, 426, 289, 954, /* 750 */ 414, 675, 675, 50, 50, 51, 51, 51, 51, 397, /* 760 */ 49, 49, 49, 49, 48, 48, 47, 47, 47, 46, - /* 770 */ 216, 158, 1095, 21, 716, 627, 459, 716, 1080, 716, - /* 780 */ 647, 1046, 140, 89, 716, 1150, 154, 435, 2, 715, + /* 770 */ 216, 158, 1094, 21, 716, 627, 459, 716, 1079, 716, + /* 780 */ 647, 1045, 140, 89, 716, 1149, 154, 435, 2, 715, /* 790 */ 424, 671, 670, 396, 460, 461, 954, 52, 53, 426, /* 800 */ 289, 573, 716, 675, 675, 50, 50, 51, 51, 51, /* 810 */ 51, 321, 49, 49, 49, 49, 48, 48, 47, 47, - /* 820 */ 47, 46, 216, 431, 1109, 81, 206, 205, 204, 52, + /* 820 */ 47, 46, 216, 431, 1108, 81, 206, 205, 204, 52, /* 830 */ 53, 426, 289, 716, 425, 675, 675, 50, 50, 51, /* 840 */ 51, 51, 51, 344, 49, 49, 49, 49, 48, 48, /* 850 */ 47, 47, 47, 46, 216, 597, 715, 666, 600, 462, @@ -334,17 +334,17 @@ static const YYACTIONTYPE yy_action[] = { /* 870 */ 667, 609, 724, 434, 81, 656, 714, 713, 685, 714, /* 880 */ 713, 714, 713, 41, 528, 272, 714, 713, 610, 349, /* 890 */ 528, 450, 89, 677, 12, 633, 633, 338, 636, 609, - /* 900 */ 38, 39, 649, 609, 714, 713, 716, 40, 1143, 1143, + /* 900 */ 38, 39, 649, 609, 714, 713, 716, 40, 1142, 1142, /* 910 */ 716, 524, 682, 581, 716, 4, 610, 468, 60, 450, /* 920 */ 642, 208, 422, 506, 60, 687, 429, 677, 32, 109, /* 930 */ 690, 609, 500, 501, 352, 714, 713, 642, 689, 688, /* 940 */ 687, 428, 900, 900, 467, 466, 552, 465, 421, 383, - /* 950 */ 507, 509, 142, 508, 430, 440, 69, 1143, 1143, 715, + /* 950 */ 507, 509, 142, 508, 430, 440, 69, 1142, 1142, 715, /* 960 */ 444, 722, 686, 182, 646, 714, 713, 645, 231, 230, /* 970 */ 437, 642, 356, 676, 9, 642, 417, 444, 52, 53, /* 980 */ 426, 289, 91, 91, 675, 675, 50, 50, 51, 51, /* 990 */ 51, 51, 644, 49, 49, 49, 49, 48, 48, 47, - /* 1000 */ 47, 47, 46, 216, 1035, 444, 668, 667, 714, 713, + /* 1000 */ 47, 47, 46, 216, 1034, 444, 668, 667, 714, 713, /* 1010 */ 91, 453, 714, 713, 682, 641, 714, 713, 324, 202, /* 1020 */ 52, 53, 426, 289, 446, 680, 675, 675, 50, 50, /* 1030 */ 51, 51, 51, 51, 639, 49, 49, 49, 49, 48, @@ -367,10 +367,10 @@ static const YYACTIONTYPE yy_action[] = { /* 1200 */ 47, 47, 47, 46, 216, 532, 8, 517, 696, 87, /* 1210 */ 137, 52, 53, 426, 289, 22, 557, 675, 675, 50, /* 1220 */ 50, 51, 51, 51, 51, 135, 49, 49, 49, 49, - /* 1230 */ 48, 48, 47, 47, 47, 46, 216, 81, 1110, 91, + /* 1230 */ 48, 48, 47, 47, 47, 46, 216, 81, 1109, 91, /* 1240 */ 716, 91, 52, 53, 426, 289, 615, 722, 675, 675, /* 1250 */ 50, 50, 51, 51, 51, 51, 620, 49, 49, 49, - /* 1260 */ 49, 48, 48, 47, 47, 47, 46, 216, 604, 1108, + /* 1260 */ 49, 48, 48, 47, 47, 47, 46, 216, 604, 1107, /* 1270 */ 99, 504, 390, 491, 52, 53, 426, 289, 714, 713, /* 1280 */ 675, 675, 50, 50, 51, 51, 51, 51, 682, 49, /* 1290 */ 49, 49, 49, 48, 48, 47, 47, 47, 46, 216, @@ -395,7 +395,7 @@ static const YYACTIONTYPE yy_action[] = { /* 1480 */ 530, 714, 713, 651, 715, 714, 713, 38, 39, 64, /* 1490 */ 18, 399, 370, 431, 40, 129, 716, 366, 326, 534, /* 1500 */ 534, 63, 4, 270, 425, 714, 713, 642, 475, 422, - /* 1510 */ 316, 530, 714, 429, 716, 714, 713, 690, 279, 716, + /* 1510 */ 316, 530, 687, 429, 716, 714, 713, 690, 279, 716, /* 1520 */ 533, 716, 156, 624, 642, 689, 688, 687, 525, 716, /* 1530 */ 125, 411, 519, 714, 713, 514, 715, 714, 713, 3, /* 1540 */ 714, 713, 714, 713, 79, 525, 682, 85, 685, 519, @@ -408,9 +408,9 @@ static const YYACTIONTYPE yy_action[] = { /* 1610 */ 687, 438, 428, 411, 497, 62, 714, 713, 430, 119, /* 1620 */ 254, 714, 713, 714, 713, 430, 686, 181, 438, 704, /* 1630 */ 685, 714, 713, 686, 163, 41, 251, 629, 311, 161, - /* 1640 */ 138, 642, 715, 676, 9, 642, 455, 1036, 682, 531, + /* 1640 */ 138, 642, 715, 676, 9, 642, 455, 1035, 682, 531, /* 1650 */ 701, 702, 38, 39, 152, 641, 498, 469, 431, 40, - /* 1660 */ 499, 478, 699, 428, 715, 714, 713, 4, 1038, 425, + /* 1660 */ 499, 478, 699, 428, 715, 714, 713, 4, 1037, 425, /* 1670 */ 714, 713, 642, 416, 422, 715, 430, 687, 429, 641, /* 1680 */ 428, 350, 690, 619, 686, 172, 641, 494, 454, 642, /* 1690 */ 689, 688, 687, 430, 111, 428, 411, 286, 337, 714, @@ -794,59 +794,59 @@ static const short yy_reduce_ofst[] = { /* 310 */ 1573, 1506, 1462, 1462, 1462, 1540, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 729, 1038, 1143, 1143, 1027, 1027, 1027, 1143, 1027, 1027, - /* 10 */ 1027, 1027, 900, 1149, 1149, 1149, 1027, 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, 1015, 1149, 894, - /* 60 */ 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 774, - /* 70 */ 890, 900, 1149, 1149, 1149, 1149, 1149, 962, 949, 940, - /* 80 */ 1149, 1149, 1149, 972, 972, 955, 842, 972, 1149, 1149, - /* 90 */ 1149, 1149, 928, 928, 1028, 1149, 766, 1113, 1118, 1013, - /* 100 */ 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 901, 1149, - /* 110 */ 1013, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, - /* 120 */ 1149, 963, 956, 950, 941, 1149, 1149, 1149, 1149, 1149, - /* 130 */ 1149, 1149, 1149, 1149, 1149, 890, 890, 1149, 1149, 890, - /* 140 */ 1149, 1149, 1149, 1014, 1149, 1149, 763, 1149, 1149, 1149, - /* 150 */ 735, 1059, 1149, 1149, 729, 1143, 1143, 1143, 1143, 1143, - /* 160 */ 1143, 1136, 880, 935, 906, 945, 933, 937, 1039, 1032, - /* 170 */ 1033, 1031, 936, 1028, 1028, 1028, 1028, 1028, 1028, 1028, - /* 180 */ 1028, 1028, 1018, 1028, 1028, 1028, 1028, 1028, 988, 1000, - /* 190 */ 987, 995, 1004, 999, 996, 990, 989, 991, 1149, 1149, - /* 200 */ 1149, 992, 1149, 1149, 1149, 1149, 1149, 893, 1149, 1149, - /* 210 */ 864, 1149, 1087, 1149, 1149, 776, 1149, 878, 738, 944, - /* 220 */ 918, 918, 809, 833, 798, 928, 918, 908, 1034, 928, - /* 230 */ 1149, 1149, 993, 891, 878, 1127, 909, 909, 909, 1112, - /* 240 */ 1112, 909, 909, 855, 909, 855, 909, 855, 909, 855, + /* 0 */ 729, 1037, 1142, 1142, 1026, 1026, 1026, 1142, 1026, 1026, + /* 10 */ 1026, 1026, 900, 1148, 1148, 1148, 1026, 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, 1015, 1148, 894, + /* 60 */ 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 774, + /* 70 */ 890, 900, 1148, 1148, 1148, 1148, 1148, 962, 949, 940, + /* 80 */ 1148, 1148, 1148, 972, 972, 955, 842, 972, 1148, 1148, + /* 90 */ 1148, 1148, 928, 928, 1027, 1148, 766, 1112, 1117, 1013, + /* 100 */ 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 901, 1148, + /* 110 */ 1013, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, + /* 120 */ 1148, 963, 956, 950, 941, 1148, 1148, 1148, 1148, 1148, + /* 130 */ 1148, 1148, 1148, 1148, 1148, 890, 890, 1148, 1148, 890, + /* 140 */ 1148, 1148, 1148, 1014, 1148, 1148, 763, 1148, 1148, 1148, + /* 150 */ 735, 1058, 1148, 1148, 729, 1142, 1142, 1142, 1142, 1142, + /* 160 */ 1142, 1135, 880, 935, 906, 945, 933, 937, 1038, 1031, + /* 170 */ 1032, 1030, 936, 1027, 1027, 1027, 1027, 1027, 1027, 1027, + /* 180 */ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 988, 1000, + /* 190 */ 987, 995, 1004, 999, 996, 990, 989, 991, 1148, 1148, + /* 200 */ 1148, 992, 1148, 1148, 1148, 1148, 1148, 893, 1148, 1148, + /* 210 */ 864, 1148, 1086, 1148, 1148, 776, 1148, 878, 738, 944, + /* 220 */ 918, 918, 809, 833, 798, 928, 918, 908, 1033, 928, + /* 230 */ 1148, 1148, 993, 891, 878, 1126, 909, 909, 909, 1111, + /* 240 */ 1111, 909, 909, 855, 909, 855, 909, 855, 909, 855, /* 250 */ 909, 760, 944, 909, 760, 846, 968, 909, 909, 846, - /* 260 */ 944, 909, 1094, 1092, 909, 760, 909, 760, 909, 1047, - /* 270 */ 844, 844, 844, 844, 825, 1047, 844, 809, 844, 825, - /* 280 */ 844, 844, 1149, 909, 909, 1149, 1047, 1053, 1047, 1028, - /* 290 */ 994, 934, 922, 932, 929, 944, 1149, 757, 828, 760, - /* 300 */ 746, 746, 734, 734, 734, 734, 1140, 1140, 1136, 811, - /* 310 */ 811, 896, 1003, 1002, 1001, 785, 1040, 1149, 1149, 1149, - /* 320 */ 1149, 1149, 1149, 1061, 1149, 1149, 1149, 1149, 1149, 1149, - /* 330 */ 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 730, 1149, - /* 340 */ 1149, 1149, 1149, 1149, 1130, 1149, 1149, 1149, 1149, 1149, - /* 350 */ 1149, 1091, 1090, 1149, 1149, 1149, 1149, 1149, 1149, 1149, - /* 360 */ 1149, 1149, 1149, 1079, 1149, 1149, 1149, 1149, 1149, 1149, - /* 370 */ 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, - /* 380 */ 1149, 1149, 1149, 1149, 867, 869, 1149, 1149, 1149, 868, - /* 390 */ 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 930, - /* 400 */ 1149, 923, 1149, 1037, 1149, 1017, 1026, 1149, 1149, 1149, - /* 410 */ 1149, 1149, 1016, 1149, 1149, 1149, 1145, 1149, 1149, 1149, - /* 420 */ 1144, 1149, 1149, 1149, 1149, 1149, 1029, 980, 1149, 979, - /* 430 */ 978, 769, 1149, 744, 1149, 726, 731, 1129, 1126, 1128, - /* 440 */ 1123, 1124, 1122, 1125, 1121, 1119, 1120, 1117, 1115, 1114, - /* 450 */ 1116, 1111, 1107, 1067, 1065, 1063, 1072, 1071, 1070, 1069, - /* 460 */ 1068, 1064, 1062, 1066, 1060, 959, 947, 938, 862, 1106, - /* 470 */ 1104, 1105, 1058, 1056, 1057, 861, 860, 859, 854, 853, - /* 480 */ 852, 851, 1133, 1142, 1141, 1139, 1138, 1137, 1131, 1132, - /* 490 */ 1045, 1044, 1042, 1041, 1043, 762, 1083, 1086, 1085, 1084, - /* 500 */ 1089, 1088, 1081, 1093, 1098, 1097, 1102, 1101, 1100, 1099, - /* 510 */ 1096, 1078, 967, 966, 964, 969, 961, 960, 965, 952, - /* 520 */ 958, 957, 948, 951, 847, 943, 939, 942, 863, 1082, + /* 260 */ 944, 909, 1093, 1091, 909, 760, 909, 760, 909, 1046, + /* 270 */ 844, 844, 844, 844, 825, 1046, 844, 809, 844, 825, + /* 280 */ 844, 844, 1148, 909, 909, 1148, 1046, 1052, 1046, 1027, + /* 290 */ 994, 934, 922, 932, 929, 944, 1148, 757, 828, 760, + /* 300 */ 746, 746, 734, 734, 734, 734, 1139, 1139, 1135, 811, + /* 310 */ 811, 896, 1003, 1002, 1001, 785, 1039, 1148, 1148, 1148, + /* 320 */ 1148, 1148, 1148, 1060, 1148, 1148, 1148, 1148, 1148, 1148, + /* 330 */ 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 730, 1148, + /* 340 */ 1148, 1148, 1148, 1148, 1129, 1148, 1148, 1148, 1148, 1148, + /* 350 */ 1148, 1090, 1089, 1148, 1148, 1148, 1148, 1148, 1148, 1148, + /* 360 */ 1148, 1148, 1148, 1078, 1148, 1148, 1148, 1148, 1148, 1148, + /* 370 */ 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, + /* 380 */ 1148, 1148, 1148, 1148, 867, 869, 1148, 1148, 1148, 868, + /* 390 */ 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 930, + /* 400 */ 1148, 923, 1148, 1036, 1148, 1017, 1025, 1148, 1148, 1148, + /* 410 */ 1148, 1148, 1016, 1148, 1148, 1148, 1144, 1148, 1148, 1148, + /* 420 */ 1143, 1148, 1148, 1148, 1148, 1148, 1028, 980, 1148, 979, + /* 430 */ 978, 769, 1148, 744, 1148, 726, 731, 1128, 1125, 1127, + /* 440 */ 1122, 1123, 1121, 1124, 1120, 1118, 1119, 1116, 1114, 1113, + /* 450 */ 1115, 1110, 1106, 1066, 1064, 1062, 1071, 1070, 1069, 1068, + /* 460 */ 1067, 1063, 1061, 1065, 1059, 959, 947, 938, 862, 1105, + /* 470 */ 1103, 1104, 1057, 1055, 1056, 861, 860, 859, 854, 853, + /* 480 */ 852, 851, 1132, 1141, 1140, 1138, 1137, 1136, 1130, 1131, + /* 490 */ 1044, 1043, 1041, 1040, 1042, 762, 1082, 1085, 1084, 1083, + /* 500 */ 1088, 1087, 1080, 1092, 1097, 1096, 1101, 1100, 1099, 1098, + /* 510 */ 1095, 1077, 967, 966, 964, 969, 961, 960, 965, 952, + /* 520 */ 958, 957, 948, 951, 847, 943, 939, 942, 863, 1081, /* 530 */ 858, 857, 856, 761, 756, 911, 755, 754, 765, 831, /* 540 */ 832, 840, 843, 838, 841, 837, 836, 835, 839, 834, /* 550 */ 830, 768, 767, 775, 824, 802, 800, 799, 803, 816, @@ -857,12 +857,12 @@ static const YYACTIONTYPE yy_default[] = { /* 600 */ 883, 882, 881, 917, 916, 915, 914, 913, 912, 905, /* 610 */ 903, 899, 898, 904, 902, 920, 921, 919, 897, 889, /* 620 */ 887, 888, 886, 974, 971, 973, 970, 907, 895, 892, - /* 630 */ 879, 925, 924, 1030, 1019, 1008, 1020, 910, 1007, 1005, - /* 640 */ 1029, 1026, 1021, 1103, 1025, 1012, 1011, 1010, 1148, 1146, - /* 650 */ 1147, 1050, 1052, 1055, 1054, 1051, 927, 926, 1049, 1048, - /* 660 */ 1009, 984, 781, 779, 780, 1075, 1074, 1077, 1076, 1073, - /* 670 */ 783, 782, 778, 777, 998, 997, 982, 1022, 1023, 981, - /* 680 */ 1024, 983, 770, 873, 866, 976, 975, 808, 807, 806, + /* 630 */ 879, 925, 924, 1029, 1018, 1008, 1019, 910, 1007, 1005, + /* 640 */ 1028, 1025, 1020, 1102, 1024, 1012, 1011, 1010, 1147, 1145, + /* 650 */ 1146, 1049, 1051, 1054, 1053, 1050, 927, 926, 1048, 1047, + /* 660 */ 1009, 984, 781, 779, 780, 1074, 1073, 1076, 1075, 1072, + /* 670 */ 783, 782, 778, 777, 998, 997, 982, 1021, 1022, 981, + /* 680 */ 1023, 983, 770, 873, 866, 976, 975, 808, 807, 806, /* 690 */ 805, 877, 876, 787, 801, 786, 784, 764, 759, 758, /* 700 */ 753, 751, 748, 750, 747, 752, 749, 745, 743, 742, /* 710 */ 741, 740, 739, 773, 772, 771, 769, 737, 736, 733, @@ -1462,137 +1462,136 @@ static const char *const yyRuleName[] = { /* 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 ::= LP expr", - /* 295 */ "exprx ::= expr not_opt IN ID_DB", - /* 296 */ "exprx ::= expr not_opt IN nm DOT ID_TAB", - /* 297 */ "exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN", - /* 298 */ "exprx ::= nm DOT ID_TAB|ID_COL", - /* 299 */ "exprx ::= nm DOT nm DOT ID_COL", - /* 300 */ "exprx ::= expr COLLATE ID_COLLATE", - /* 301 */ "exprx ::= RAISE LP raisetype COMMA ID_ERR_MSG RP", - /* 302 */ "expr ::= exprx", - /* 303 */ "expr ::=", - /* 304 */ "not_opt ::=", - /* 305 */ "not_opt ::= NOT", - /* 306 */ "likeop ::= LIKE_KW|MATCH", - /* 307 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", - /* 308 */ "case_exprlist ::= WHEN expr THEN expr", - /* 309 */ "case_else ::= ELSE expr", - /* 310 */ "case_else ::=", - /* 311 */ "case_operand ::= exprx", - /* 312 */ "case_operand ::=", - /* 313 */ "exprlist ::= nexprlist", - /* 314 */ "exprlist ::=", - /* 315 */ "nexprlist ::= nexprlist COMMA expr", - /* 316 */ "nexprlist ::= exprx", - /* 317 */ "cmd ::= CREATE uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP where_opt", - /* 318 */ "cmd ::= CREATE uniqueflag INDEX ifnotexists nm dbnm ON ID_TAB", - /* 319 */ "cmd ::= CREATE uniqueflag INDEX ifnotexists nm DOT ID_IDX_NEW", - /* 320 */ "cmd ::= CREATE uniqueflag INDEX ifnotexists ID_DB|ID_IDX_NEW", - /* 321 */ "uniqueflag ::= UNIQUE", - /* 322 */ "uniqueflag ::=", - /* 323 */ "idxlist_opt ::=", - /* 324 */ "idxlist_opt ::= LP idxlist RP", - /* 325 */ "idxlist ::= idxlist COMMA idxlist_single", - /* 326 */ "idxlist ::= idxlist_single", - /* 327 */ "idxlist_single ::= nm collate sortorder", - /* 328 */ "idxlist_single ::= ID_COL", - /* 329 */ "collate ::=", - /* 330 */ "collate ::= COLLATE ids", - /* 331 */ "collate ::= COLLATE ID_COLLATE", - /* 332 */ "cmd ::= DROP INDEX ifexists fullname", - /* 333 */ "cmd ::= DROP INDEX ifexists nm DOT ID_IDX", - /* 334 */ "cmd ::= DROP INDEX ifexists ID_DB|ID_IDX", - /* 335 */ "cmd ::= VACUUM", - /* 336 */ "cmd ::= VACUUM nm", - /* 337 */ "cmd ::= PRAGMA nm dbnm", - /* 338 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", - /* 339 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", - /* 340 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", - /* 341 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", - /* 342 */ "cmd ::= PRAGMA nm DOT ID_PRAGMA", - /* 343 */ "cmd ::= PRAGMA ID_DB|ID_PRAGMA", - /* 344 */ "nmnum ::= plus_num", - /* 345 */ "nmnum ::= nm", - /* 346 */ "nmnum ::= ON", - /* 347 */ "nmnum ::= DELETE", - /* 348 */ "nmnum ::= DEFAULT", - /* 349 */ "plus_num ::= PLUS number", - /* 350 */ "plus_num ::= number", - /* 351 */ "minus_num ::= MINUS number", - /* 352 */ "number ::= INTEGER", - /* 353 */ "number ::= FLOAT", - /* 354 */ "cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause BEGIN trigger_cmd_list END", - /* 355 */ "cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause", - /* 356 */ "cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause BEGIN trigger_cmd_list", - /* 357 */ "cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON ID_TAB", - /* 358 */ "cmd ::= CREATE temp TRIGGER ifnotexists nm DOT ID_TRIG_NEW", - /* 359 */ "cmd ::= CREATE temp TRIGGER ifnotexists ID_DB|ID_TRIG_NEW", - /* 360 */ "trigger_time ::= BEFORE", - /* 361 */ "trigger_time ::= AFTER", - /* 362 */ "trigger_time ::= INSTEAD OF", - /* 363 */ "trigger_time ::=", - /* 364 */ "trigger_event ::= DELETE", - /* 365 */ "trigger_event ::= INSERT", - /* 366 */ "trigger_event ::= UPDATE", - /* 367 */ "trigger_event ::= UPDATE OF inscollist", - /* 368 */ "foreach_clause ::=", - /* 369 */ "foreach_clause ::= FOR EACH ROW", - /* 370 */ "when_clause ::=", - /* 371 */ "when_clause ::= WHEN expr", - /* 372 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 373 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 374 */ "trigger_cmd_list ::= SEMI", - /* 375 */ "trigger_cmd ::= update_stmt", - /* 376 */ "trigger_cmd ::= insert_stmt", - /* 377 */ "trigger_cmd ::= delete_stmt", - /* 378 */ "trigger_cmd ::= select_stmt", - /* 379 */ "raisetype ::= ROLLBACK|ABORT|FAIL", - /* 380 */ "cmd ::= DROP TRIGGER ifexists fullname", - /* 381 */ "cmd ::= DROP TRIGGER ifexists nm DOT ID_TRIG", - /* 382 */ "cmd ::= DROP TRIGGER ifexists ID_DB|ID_TRIG", - /* 383 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", - /* 384 */ "cmd ::= DETACH database_kw_opt expr", - /* 385 */ "key_opt ::=", - /* 386 */ "key_opt ::= KEY expr", - /* 387 */ "database_kw_opt ::= DATABASE", - /* 388 */ "database_kw_opt ::=", - /* 389 */ "cmd ::= REINDEX", - /* 390 */ "cmd ::= REINDEX nm dbnm", - /* 391 */ "cmd ::= REINDEX ID_COLLATE", - /* 392 */ "cmd ::= REINDEX nm DOT ID_TAB|ID_IDX", - /* 393 */ "cmd ::= REINDEX ID_DB|ID_IDX|ID_TAB", - /* 394 */ "cmd ::= ANALYZE", - /* 395 */ "cmd ::= ANALYZE nm dbnm", - /* 396 */ "cmd ::= ANALYZE nm DOT ID_TAB|ID_IDX", - /* 397 */ "cmd ::= ANALYZE ID_DB|ID_IDX|ID_TAB", - /* 398 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", - /* 399 */ "cmd ::= ALTER TABLE fullname ADD kwcolumn_opt column", - /* 400 */ "cmd ::= ALTER TABLE fullname RENAME TO ID_TAB_NEW", - /* 401 */ "cmd ::= ALTER TABLE nm DOT ID_TAB", - /* 402 */ "cmd ::= ALTER TABLE ID_DB|ID_TAB", - /* 403 */ "kwcolumn_opt ::=", - /* 404 */ "kwcolumn_opt ::= COLUMNKW", - /* 405 */ "cmd ::= create_vtab", - /* 406 */ "create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm dbnm USING nm", - /* 407 */ "create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm dbnm USING nm LP vtabarglist RP", - /* 408 */ "create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm DOT ID_TAB_NEW", - /* 409 */ "create_vtab ::= CREATE VIRTUAL TABLE ifnotexists ID_DB|ID_TAB_NEW", - /* 410 */ "vtabarglist ::= vtabarg", - /* 411 */ "vtabarglist ::= vtabarglist COMMA vtabarg", - /* 412 */ "vtabarg ::=", - /* 413 */ "vtabarg ::= vtabarg vtabargtoken", - /* 414 */ "vtabargtoken ::= ANY", - /* 415 */ "vtabargtoken ::= LP anylist RP", - /* 416 */ "anylist ::=", - /* 417 */ "anylist ::= anylist LP anylist RP", - /* 418 */ "anylist ::= anylist ANY", - /* 419 */ "with ::=", - /* 420 */ "with ::= WITH wqlist", - /* 421 */ "with ::= WITH RECURSIVE wqlist", - /* 422 */ "wqlist ::= nm idxlist_opt AS LP select RP", - /* 423 */ "wqlist ::= wqlist COMMA nm idxlist_opt AS LP select RP", - /* 424 */ "wqlist ::= ID_TAB_NEW", + /* 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 ::=", + /* 303 */ "not_opt ::=", + /* 304 */ "not_opt ::= NOT", + /* 305 */ "likeop ::= LIKE_KW|MATCH", + /* 306 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 307 */ "case_exprlist ::= WHEN expr THEN expr", + /* 308 */ "case_else ::= ELSE expr", + /* 309 */ "case_else ::=", + /* 310 */ "case_operand ::= exprx", + /* 311 */ "case_operand ::=", + /* 312 */ "exprlist ::= nexprlist", + /* 313 */ "exprlist ::=", + /* 314 */ "nexprlist ::= nexprlist COMMA expr", + /* 315 */ "nexprlist ::= exprx", + /* 316 */ "cmd ::= CREATE uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP where_opt", + /* 317 */ "cmd ::= CREATE uniqueflag INDEX ifnotexists nm dbnm ON ID_TAB", + /* 318 */ "cmd ::= CREATE uniqueflag INDEX ifnotexists nm DOT ID_IDX_NEW", + /* 319 */ "cmd ::= CREATE uniqueflag INDEX ifnotexists ID_DB|ID_IDX_NEW", + /* 320 */ "uniqueflag ::= UNIQUE", + /* 321 */ "uniqueflag ::=", + /* 322 */ "idxlist_opt ::=", + /* 323 */ "idxlist_opt ::= LP idxlist RP", + /* 324 */ "idxlist ::= idxlist COMMA idxlist_single", + /* 325 */ "idxlist ::= idxlist_single", + /* 326 */ "idxlist_single ::= nm collate sortorder", + /* 327 */ "idxlist_single ::= ID_COL", + /* 328 */ "collate ::=", + /* 329 */ "collate ::= COLLATE ids", + /* 330 */ "collate ::= COLLATE ID_COLLATE", + /* 331 */ "cmd ::= DROP INDEX ifexists fullname", + /* 332 */ "cmd ::= DROP INDEX ifexists nm DOT ID_IDX", + /* 333 */ "cmd ::= DROP INDEX ifexists ID_DB|ID_IDX", + /* 334 */ "cmd ::= VACUUM", + /* 335 */ "cmd ::= VACUUM nm", + /* 336 */ "cmd ::= PRAGMA nm dbnm", + /* 337 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 338 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 339 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 340 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 341 */ "cmd ::= PRAGMA nm DOT ID_PRAGMA", + /* 342 */ "cmd ::= PRAGMA ID_DB|ID_PRAGMA", + /* 343 */ "nmnum ::= plus_num", + /* 344 */ "nmnum ::= nm", + /* 345 */ "nmnum ::= ON", + /* 346 */ "nmnum ::= DELETE", + /* 347 */ "nmnum ::= DEFAULT", + /* 348 */ "plus_num ::= PLUS number", + /* 349 */ "plus_num ::= number", + /* 350 */ "minus_num ::= MINUS number", + /* 351 */ "number ::= INTEGER", + /* 352 */ "number ::= FLOAT", + /* 353 */ "cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause BEGIN trigger_cmd_list END", + /* 354 */ "cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause", + /* 355 */ "cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause BEGIN trigger_cmd_list", + /* 356 */ "cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON ID_TAB", + /* 357 */ "cmd ::= CREATE temp TRIGGER ifnotexists nm DOT ID_TRIG_NEW", + /* 358 */ "cmd ::= CREATE temp TRIGGER ifnotexists ID_DB|ID_TRIG_NEW", + /* 359 */ "trigger_time ::= BEFORE", + /* 360 */ "trigger_time ::= AFTER", + /* 361 */ "trigger_time ::= INSTEAD OF", + /* 362 */ "trigger_time ::=", + /* 363 */ "trigger_event ::= DELETE", + /* 364 */ "trigger_event ::= INSERT", + /* 365 */ "trigger_event ::= UPDATE", + /* 366 */ "trigger_event ::= UPDATE OF inscollist", + /* 367 */ "foreach_clause ::=", + /* 368 */ "foreach_clause ::= FOR EACH ROW", + /* 369 */ "when_clause ::=", + /* 370 */ "when_clause ::= WHEN expr", + /* 371 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 372 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 373 */ "trigger_cmd_list ::= SEMI", + /* 374 */ "trigger_cmd ::= update_stmt", + /* 375 */ "trigger_cmd ::= insert_stmt", + /* 376 */ "trigger_cmd ::= delete_stmt", + /* 377 */ "trigger_cmd ::= select_stmt", + /* 378 */ "raisetype ::= ROLLBACK|ABORT|FAIL", + /* 379 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 380 */ "cmd ::= DROP TRIGGER ifexists nm DOT ID_TRIG", + /* 381 */ "cmd ::= DROP TRIGGER ifexists ID_DB|ID_TRIG", + /* 382 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 383 */ "cmd ::= DETACH database_kw_opt expr", + /* 384 */ "key_opt ::=", + /* 385 */ "key_opt ::= KEY expr", + /* 386 */ "database_kw_opt ::= DATABASE", + /* 387 */ "database_kw_opt ::=", + /* 388 */ "cmd ::= REINDEX", + /* 389 */ "cmd ::= REINDEX nm dbnm", + /* 390 */ "cmd ::= REINDEX ID_COLLATE", + /* 391 */ "cmd ::= REINDEX nm DOT ID_TAB|ID_IDX", + /* 392 */ "cmd ::= REINDEX ID_DB|ID_IDX|ID_TAB", + /* 393 */ "cmd ::= ANALYZE", + /* 394 */ "cmd ::= ANALYZE nm dbnm", + /* 395 */ "cmd ::= ANALYZE nm DOT ID_TAB|ID_IDX", + /* 396 */ "cmd ::= ANALYZE ID_DB|ID_IDX|ID_TAB", + /* 397 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 398 */ "cmd ::= ALTER TABLE fullname ADD kwcolumn_opt column", + /* 399 */ "cmd ::= ALTER TABLE fullname RENAME TO ID_TAB_NEW", + /* 400 */ "cmd ::= ALTER TABLE nm DOT ID_TAB", + /* 401 */ "cmd ::= ALTER TABLE ID_DB|ID_TAB", + /* 402 */ "kwcolumn_opt ::=", + /* 403 */ "kwcolumn_opt ::= COLUMNKW", + /* 404 */ "cmd ::= create_vtab", + /* 405 */ "create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 406 */ "create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm dbnm USING nm LP vtabarglist RP", + /* 407 */ "create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm DOT ID_TAB_NEW", + /* 408 */ "create_vtab ::= CREATE VIRTUAL TABLE ifnotexists ID_DB|ID_TAB_NEW", + /* 409 */ "vtabarglist ::= vtabarg", + /* 410 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 411 */ "vtabarg ::=", + /* 412 */ "vtabarg ::= vtabarg vtabargtoken", + /* 413 */ "vtabargtoken ::= ANY", + /* 414 */ "vtabargtoken ::= LP anylist RP", + /* 415 */ "anylist ::=", + /* 416 */ "anylist ::= anylist LP anylist RP", + /* 417 */ "anylist ::= anylist ANY", + /* 418 */ "with ::=", + /* 419 */ "with ::= WITH wqlist", + /* 420 */ "with ::= WITH RECURSIVE wqlist", + /* 421 */ "wqlist ::= nm idxlist_opt AS LP select RP", + /* 422 */ "wqlist ::= wqlist COMMA nm idxlist_opt AS LP select RP", + /* 423 */ "wqlist ::= ID_TAB_NEW", }; #endif /* NDEBUG */ @@ -2520,7 +2519,6 @@ static const struct { { 251, 5 }, { 251, 4 }, { 251, 5 }, - { 251, 2 }, { 251, 4 }, { 251, 6 }, { 251, 1 }, @@ -2737,11 +2735,11 @@ static void yy_reduce( {yygotominor.yy225 = new ParserStubExplain(true, true);} break; case 8: /* cmdx ::= cmd */ - case 375: /* trigger_cmd ::= update_stmt */ yytestcase(yyruleno==375); - case 376: /* trigger_cmd ::= insert_stmt */ yytestcase(yyruleno==376); - case 377: /* trigger_cmd ::= delete_stmt */ yytestcase(yyruleno==377); - case 378: /* trigger_cmd ::= select_stmt */ yytestcase(yyruleno==378); - case 405: /* cmd ::= create_vtab */ yytestcase(yyruleno==405); + case 374: /* trigger_cmd ::= update_stmt */ yytestcase(yyruleno==374); + case 375: /* trigger_cmd ::= insert_stmt */ yytestcase(yyruleno==375); + case 376: /* trigger_cmd ::= delete_stmt */ yytestcase(yyruleno==376); + case 377: /* trigger_cmd ::= select_stmt */ yytestcase(yyruleno==377); + case 404: /* cmd ::= create_vtab */ yytestcase(yyruleno==404); {yygotominor.yy399 = yymsp[0].minor.yy399;} break; case 9: /* cmd ::= BEGIN transtype trans_opt */ @@ -2830,10 +2828,10 @@ static void yy_reduce( case 86: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==86); case 108: /* tconscomma ::= COMMA */ yytestcase(yyruleno==108); case 130: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==130); - case 305: /* not_opt ::= NOT */ yytestcase(yyruleno==305); - case 321: /* uniqueflag ::= UNIQUE */ yytestcase(yyruleno==321); - case 387: /* database_kw_opt ::= DATABASE */ yytestcase(yyruleno==387); - case 403: /* kwcolumn_opt ::= */ yytestcase(yyruleno==403); + case 304: /* not_opt ::= NOT */ yytestcase(yyruleno==304); + case 320: /* uniqueflag ::= UNIQUE */ yytestcase(yyruleno==320); + case 386: /* database_kw_opt ::= DATABASE */ yytestcase(yyruleno==386); + case 402: /* kwcolumn_opt ::= */ yytestcase(yyruleno==402); {yygotominor.yy237 = new bool(true);} break; case 22: /* savepoint_opt ::= */ @@ -2841,10 +2839,10 @@ static void yy_reduce( case 85: /* autoinc ::= */ yytestcase(yyruleno==85); case 109: /* tconscomma ::= */ yytestcase(yyruleno==109); case 131: /* ifexists ::= */ yytestcase(yyruleno==131); - case 304: /* not_opt ::= */ yytestcase(yyruleno==304); - case 322: /* uniqueflag ::= */ yytestcase(yyruleno==322); - case 388: /* database_kw_opt ::= */ yytestcase(yyruleno==388); - case 404: /* kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==404); + case 303: /* not_opt ::= */ yytestcase(yyruleno==303); + case 321: /* uniqueflag ::= */ yytestcase(yyruleno==321); + case 387: /* database_kw_opt ::= */ yytestcase(yyruleno==387); + case 403: /* kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==403); {yygotominor.yy237 = new bool(false);} break; case 23: /* cmd ::= SAVEPOINT nm */ @@ -2882,8 +2880,8 @@ static void yy_reduce( case 29: /* cmd ::= CREATE temp TABLE ifnotexists fullname LP columnlist conslist_opt RP table_options */ { yygotominor.yy399 = new SqliteCreateTable( - *(yymsp[-8].minor.yy376), *(yymsp[-6].minor.yy237), + *(yymsp[-8].minor.yy376), yymsp[-5].minor.yy66->name1, yymsp[-5].minor.yy66->name2, *(yymsp[-3].minor.yy118), @@ -2902,8 +2900,8 @@ static void yy_reduce( case 30: /* cmd ::= CREATE temp TABLE ifnotexists fullname AS select */ { yygotominor.yy399 = new SqliteCreateTable( - *(yymsp[-5].minor.yy376), *(yymsp[-3].minor.yy237), + *(yymsp[-5].minor.yy376), yymsp[-2].minor.yy66->name1, yymsp[-2].minor.yy66->name2, yymsp[0].minor.yy123 @@ -2916,22 +2914,22 @@ static void yy_reduce( break; case 31: /* cmd ::= CREATE temp TABLE ifnotexists nm DOT ID_TAB_NEW */ case 133: /* cmd ::= CREATE temp VIEW ifnotexists nm DOT ID_VIEW_NEW */ yytestcase(yyruleno==133); - case 358: /* cmd ::= CREATE temp TRIGGER ifnotexists nm DOT ID_TRIG_NEW */ yytestcase(yyruleno==358); + case 357: /* cmd ::= CREATE temp TRIGGER ifnotexists nm DOT ID_TRIG_NEW */ yytestcase(yyruleno==357); { yy_destructor(yypParser,179,&yymsp[-5].minor); yy_destructor(yypParser,177,&yymsp[-2].minor); } break; case 32: /* cmd ::= CREATE temp TABLE ifnotexists ID_DB|ID_TAB_NEW */ case 134: /* cmd ::= CREATE temp VIEW ifnotexists ID_DB|ID_VIEW_NEW */ yytestcase(yyruleno==134); - case 359: /* cmd ::= CREATE temp TRIGGER ifnotexists ID_DB|ID_TRIG_NEW */ yytestcase(yyruleno==359); + case 358: /* cmd ::= CREATE temp TRIGGER ifnotexists ID_DB|ID_TRIG_NEW */ yytestcase(yyruleno==358); { yy_destructor(yypParser,179,&yymsp[-3].minor); } break; case 33: /* table_options ::= */ case 185: /* dbnm ::= */ yytestcase(yyruleno==185); - case 329: /* collate ::= */ yytestcase(yyruleno==329); - case 412: /* vtabarg ::= */ yytestcase(yyruleno==412); - case 416: /* anylist ::= */ yytestcase(yyruleno==416); + case 328: /* collate ::= */ yytestcase(yyruleno==328); + case 411: /* vtabarg ::= */ yytestcase(yyruleno==411); + case 415: /* anylist ::= */ yytestcase(yyruleno==415); {yygotominor.yy211 = new QString();} break; case 34: /* table_options ::= WITHOUT nm */ @@ -2976,8 +2974,8 @@ static void yy_reduce( case 47: /* nm ::= id */ yytestcase(yyruleno==47); case 55: /* typename ::= ids */ yytestcase(yyruleno==55); case 186: /* dbnm ::= DOT nm */ yytestcase(yyruleno==186); - case 330: /* collate ::= COLLATE ids */ yytestcase(yyruleno==330); - case 331: /* collate ::= COLLATE ID_COLLATE */ yytestcase(yyruleno==331); + case 329: /* collate ::= COLLATE ids */ yytestcase(yyruleno==329); + case 330: /* collate ::= COLLATE ID_COLLATE */ yytestcase(yyruleno==330); {yygotominor.yy211 = yymsp[0].minor.yy211;} break; case 45: /* id ::= ID */ @@ -3037,9 +3035,9 @@ static void yy_reduce( break; case 58: /* signed ::= plus_num */ case 59: /* signed ::= minus_num */ yytestcase(yyruleno==59); - case 344: /* nmnum ::= plus_num */ yytestcase(yyruleno==344); - case 349: /* plus_num ::= PLUS number */ yytestcase(yyruleno==349); - case 350: /* plus_num ::= number */ yytestcase(yyruleno==350); + case 343: /* nmnum ::= plus_num */ yytestcase(yyruleno==343); + case 348: /* plus_num ::= PLUS number */ yytestcase(yyruleno==348); + case 349: /* plus_num ::= number */ yytestcase(yyruleno==349); {yygotominor.yy21 = yymsp[0].minor.yy21;} break; case 60: /* carglist ::= carglist ccons */ @@ -3204,9 +3202,9 @@ static void yy_reduce( } break; case 84: /* term ::= STRING|BLOB */ - case 346: /* nmnum ::= ON */ yytestcase(yyruleno==346); - case 347: /* nmnum ::= DELETE */ yytestcase(yyruleno==347); - case 348: /* nmnum ::= DEFAULT */ yytestcase(yyruleno==348); + case 345: /* nmnum ::= ON */ yytestcase(yyruleno==345); + case 346: /* nmnum ::= DELETE */ yytestcase(yyruleno==346); + case 347: /* nmnum ::= DEFAULT */ yytestcase(yyruleno==347); {yygotominor.yy21 = new QVariant(yymsp[0].minor.yy0->value);} break; case 87: /* refargs ::= */ @@ -3391,23 +3389,23 @@ 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 298: /* exprx ::= nm DOT ID_TAB|ID_COL */ yytestcase(yyruleno==298); - case 319: /* cmd ::= CREATE uniqueflag INDEX ifnotexists nm DOT ID_IDX_NEW */ yytestcase(yyruleno==319); - case 320: /* cmd ::= CREATE uniqueflag INDEX ifnotexists ID_DB|ID_IDX_NEW */ yytestcase(yyruleno==320); - case 333: /* cmd ::= DROP INDEX ifexists nm DOT ID_IDX */ yytestcase(yyruleno==333); - case 334: /* cmd ::= DROP INDEX ifexists ID_DB|ID_IDX */ yytestcase(yyruleno==334); - case 342: /* cmd ::= PRAGMA nm DOT ID_PRAGMA */ yytestcase(yyruleno==342); - case 343: /* cmd ::= PRAGMA ID_DB|ID_PRAGMA */ yytestcase(yyruleno==343); - case 381: /* cmd ::= DROP TRIGGER ifexists nm DOT ID_TRIG */ yytestcase(yyruleno==381); - case 382: /* cmd ::= DROP TRIGGER ifexists ID_DB|ID_TRIG */ yytestcase(yyruleno==382); - case 392: /* cmd ::= REINDEX nm DOT ID_TAB|ID_IDX */ yytestcase(yyruleno==392); - case 393: /* cmd ::= REINDEX ID_DB|ID_IDX|ID_TAB */ yytestcase(yyruleno==393); - case 396: /* cmd ::= ANALYZE nm DOT ID_TAB|ID_IDX */ yytestcase(yyruleno==396); - case 397: /* cmd ::= ANALYZE ID_DB|ID_IDX|ID_TAB */ yytestcase(yyruleno==397); - case 401: /* cmd ::= ALTER TABLE nm DOT ID_TAB */ yytestcase(yyruleno==401); - case 402: /* cmd ::= ALTER TABLE ID_DB|ID_TAB */ yytestcase(yyruleno==402); - case 408: /* create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm DOT ID_TAB_NEW */ yytestcase(yyruleno==408); - case 409: /* create_vtab ::= CREATE VIRTUAL TABLE ifnotexists ID_DB|ID_TAB_NEW */ yytestcase(yyruleno==409); + case 297: /* exprx ::= nm DOT ID_TAB|ID_COL */ yytestcase(yyruleno==297); + 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); + case 333: /* cmd ::= DROP INDEX ifexists ID_DB|ID_IDX */ yytestcase(yyruleno==333); + case 341: /* cmd ::= PRAGMA nm DOT ID_PRAGMA */ yytestcase(yyruleno==341); + case 342: /* cmd ::= PRAGMA ID_DB|ID_PRAGMA */ yytestcase(yyruleno==342); + case 380: /* cmd ::= DROP TRIGGER ifexists nm DOT ID_TRIG */ yytestcase(yyruleno==380); + case 381: /* cmd ::= DROP TRIGGER ifexists ID_DB|ID_TRIG */ yytestcase(yyruleno==381); + case 391: /* cmd ::= REINDEX nm DOT ID_TAB|ID_IDX */ yytestcase(yyruleno==391); + case 392: /* cmd ::= REINDEX ID_DB|ID_IDX|ID_TAB */ yytestcase(yyruleno==392); + case 395: /* cmd ::= ANALYZE nm DOT ID_TAB|ID_IDX */ yytestcase(yyruleno==395); + case 396: /* cmd ::= ANALYZE ID_DB|ID_IDX|ID_TAB */ yytestcase(yyruleno==396); + case 400: /* cmd ::= ALTER TABLE nm DOT ID_TAB */ yytestcase(yyruleno==400); + case 401: /* cmd ::= ALTER TABLE ID_DB|ID_TAB */ yytestcase(yyruleno==401); + case 407: /* create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm DOT ID_TAB_NEW */ yytestcase(yyruleno==407); + case 408: /* create_vtab ::= CREATE VIRTUAL TABLE ifnotexists ID_DB|ID_TAB_NEW */ yytestcase(yyruleno==408); { yy_destructor(yypParser,177,&yymsp[-2].minor); } break; @@ -3803,11 +3801,11 @@ static void yy_reduce( {yygotominor.yy226 = new SqliteSortOrder(SqliteSortOrder::null);} break; case 205: /* groupby_opt ::= */ - case 314: /* exprlist ::= */ yytestcase(yyruleno==314); + case 313: /* exprlist ::= */ yytestcase(yyruleno==313); {yygotominor.yy13 = new ParserExprList();} break; case 206: /* groupby_opt ::= GROUP BY nexprlist */ - case 313: /* exprlist ::= nexprlist */ yytestcase(yyruleno==313); + case 312: /* exprlist ::= nexprlist */ yytestcase(yyruleno==312); {yygotominor.yy13 = yymsp[0].minor.yy13;} break; case 207: /* groupby_opt ::= GROUP BY */ @@ -3818,19 +3816,19 @@ static void yy_reduce( break; case 208: /* having_opt ::= */ case 220: /* where_opt ::= */ yytestcase(yyruleno==220); - case 310: /* case_else ::= */ yytestcase(yyruleno==310); - case 312: /* case_operand ::= */ yytestcase(yyruleno==312); - case 370: /* when_clause ::= */ yytestcase(yyruleno==370); - case 385: /* key_opt ::= */ yytestcase(yyruleno==385); + case 309: /* case_else ::= */ yytestcase(yyruleno==309); + case 311: /* case_operand ::= */ yytestcase(yyruleno==311); + case 369: /* when_clause ::= */ yytestcase(yyruleno==369); + case 384: /* key_opt ::= */ yytestcase(yyruleno==384); {yygotominor.yy490 = nullptr;} break; case 209: /* having_opt ::= HAVING expr */ case 221: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==221); - case 302: /* expr ::= exprx */ yytestcase(yyruleno==302); - case 309: /* case_else ::= ELSE expr */ yytestcase(yyruleno==309); - case 311: /* case_operand ::= exprx */ yytestcase(yyruleno==311); - case 371: /* when_clause ::= WHEN expr */ yytestcase(yyruleno==371); - case 386: /* key_opt ::= KEY expr */ yytestcase(yyruleno==386); + case 301: /* expr ::= exprx */ yytestcase(yyruleno==301); + 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); + case 385: /* key_opt ::= KEY expr */ yytestcase(yyruleno==385); {yygotominor.yy490 = yymsp[0].minor.yy490;} break; case 210: /* limit_opt ::= */ @@ -4403,72 +4401,64 @@ static void yy_reduce( parserContext->minorErrorBeforeNextToken("Syntax error"); } break; - case 294: /* exprx ::= LP expr */ -{ - yygotominor.yy490 = new SqliteExpr(); - yygotominor.yy490->initSubExpr(yymsp[0].minor.yy490); - objectForTokens = yygotominor.yy490; - parserContext->minorErrorBeforeNextToken("Syntax error"); - } - break; - case 295: /* exprx ::= expr not_opt IN ID_DB */ + case 294: /* exprx ::= expr not_opt IN ID_DB */ { yy_destructor(yypParser,199,&yymsp[-3].minor); } break; - case 296: /* exprx ::= expr not_opt IN nm DOT ID_TAB */ - case 297: /* exprx ::= ID_DB|ID_TAB|ID_COL|ID_FN */ yytestcase(yyruleno==297); + 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 299: /* exprx ::= nm DOT nm DOT ID_COL */ + 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 300: /* exprx ::= expr COLLATE ID_COLLATE */ - case 301: /* exprx ::= RAISE LP raisetype COMMA ID_ERR_MSG RP */ yytestcase(yyruleno==301); + 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 303: /* expr ::= */ + case 302: /* expr ::= */ { yygotominor.yy490 = new SqliteExpr(); objectForTokens = yygotominor.yy490; parserContext->minorErrorAfterLastToken("Syntax error"); } break; - case 306: /* likeop ::= LIKE_KW|MATCH */ + case 305: /* likeop ::= LIKE_KW|MATCH */ {yygotominor.yy374 = new SqliteExpr::LikeOp(SqliteExpr::likeOp(yymsp[0].minor.yy0->value));} break; - case 307: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ + case 306: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ { yymsp[-4].minor.yy13->append(yymsp[-2].minor.yy490); yymsp[-4].minor.yy13->append(yymsp[0].minor.yy490); yygotominor.yy13 = yymsp[-4].minor.yy13; } break; - case 308: /* case_exprlist ::= WHEN expr THEN expr */ + case 307: /* case_exprlist ::= WHEN expr THEN expr */ { yygotominor.yy13 = new ParserExprList(); yygotominor.yy13->append(yymsp[-2].minor.yy490); yygotominor.yy13->append(yymsp[0].minor.yy490); } break; - case 315: /* nexprlist ::= nexprlist COMMA expr */ + case 314: /* nexprlist ::= nexprlist COMMA expr */ { yymsp[-2].minor.yy13->append(yymsp[0].minor.yy490); yygotominor.yy13 = yymsp[-2].minor.yy13; DONT_INHERIT_TOKENS("nexprlist"); } break; - case 316: /* nexprlist ::= exprx */ + case 315: /* nexprlist ::= exprx */ { yygotominor.yy13 = new ParserExprList(); yygotominor.yy13->append(yymsp[0].minor.yy490); } break; - case 317: /* cmd ::= CREATE uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP where_opt */ + case 316: /* cmd ::= CREATE uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP where_opt */ { yygotominor.yy399 = new SqliteCreateIndex( *(yymsp[-10].minor.yy237), @@ -4488,31 +4478,31 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 318: /* cmd ::= CREATE uniqueflag INDEX ifnotexists nm dbnm ON ID_TAB */ + case 317: /* cmd ::= CREATE uniqueflag INDEX ifnotexists nm dbnm ON ID_TAB */ { yy_destructor(yypParser,177,&yymsp[-3].minor); } break; - case 323: /* idxlist_opt ::= */ + case 322: /* idxlist_opt ::= */ {yygotominor.yy139 = new ParserIndexedColumnList();} break; - case 324: /* idxlist_opt ::= LP idxlist RP */ + case 323: /* idxlist_opt ::= LP idxlist RP */ {yygotominor.yy139 = yymsp[-1].minor.yy139;} break; - case 325: /* idxlist ::= idxlist COMMA idxlist_single */ + case 324: /* idxlist ::= idxlist COMMA idxlist_single */ { yymsp[-2].minor.yy139->append(yymsp[0].minor.yy90); yygotominor.yy139 = yymsp[-2].minor.yy139; DONT_INHERIT_TOKENS("idxlist"); } break; - case 326: /* idxlist ::= idxlist_single */ + case 325: /* idxlist ::= idxlist_single */ { yygotominor.yy139 = new ParserIndexedColumnList(); yygotominor.yy139->append(yymsp[0].minor.yy90); } break; - case 327: /* idxlist_single ::= nm collate sortorder */ - case 328: /* idxlist_single ::= ID_COL */ yytestcase(yyruleno==328); + case 326: /* idxlist_single ::= nm collate sortorder */ + case 327: /* idxlist_single ::= ID_COL */ yytestcase(yyruleno==327); { SqliteIndexedColumn* obj = new SqliteIndexedColumn( @@ -4527,7 +4517,7 @@ static void yy_reduce( objectForTokens = yygotominor.yy90; } break; - case 332: /* cmd ::= DROP INDEX ifexists fullname */ + case 331: /* cmd ::= DROP INDEX ifexists fullname */ { yygotominor.yy399 = new SqliteDropIndex(*(yymsp[-1].minor.yy237), yymsp[0].minor.yy66->name1, yymsp[0].minor.yy66->name2); delete yymsp[-1].minor.yy237; @@ -4535,20 +4525,20 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 335: /* cmd ::= VACUUM */ + case 334: /* cmd ::= VACUUM */ { yygotominor.yy399 = new SqliteVacuum(); objectForTokens = yygotominor.yy399; } break; - case 336: /* cmd ::= VACUUM nm */ + case 335: /* cmd ::= VACUUM nm */ { yygotominor.yy399 = new SqliteVacuum(*(yymsp[0].minor.yy211)); delete yymsp[0].minor.yy211; objectForTokens = yygotominor.yy399; } break; - case 337: /* cmd ::= PRAGMA nm dbnm */ + case 336: /* cmd ::= PRAGMA nm dbnm */ { yygotominor.yy399 = new SqlitePragma(*(yymsp[-1].minor.yy211), *(yymsp[0].minor.yy211)); delete yymsp[-1].minor.yy211; @@ -4556,8 +4546,8 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 338: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ - case 340: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ yytestcase(yyruleno==340); + case 337: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ + case 339: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ yytestcase(yyruleno==339); { yygotominor.yy399 = new SqlitePragma(*(yymsp[-3].minor.yy211), *(yymsp[-2].minor.yy211), *(yymsp[0].minor.yy21), true); delete yymsp[-3].minor.yy211; @@ -4566,8 +4556,8 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 339: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ - case 341: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ yytestcase(yyruleno==341); + case 338: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ + case 340: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ yytestcase(yyruleno==340); { yygotominor.yy399 = new SqlitePragma(*(yymsp[-4].minor.yy211), *(yymsp[-3].minor.yy211), *(yymsp[-1].minor.yy21), false); delete yymsp[-4].minor.yy211; @@ -4576,13 +4566,13 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 345: /* nmnum ::= nm */ + case 344: /* nmnum ::= nm */ { yygotominor.yy21 = new QVariant(*(yymsp[0].minor.yy211)); delete yymsp[0].minor.yy211; } break; - case 351: /* minus_num ::= MINUS number */ + case 350: /* minus_num ::= MINUS number */ { if (yymsp[0].minor.yy21->type() == QVariant::Double) *(yymsp[0].minor.yy21) = -(yymsp[0].minor.yy21->toDouble()); @@ -4594,13 +4584,13 @@ static void yy_reduce( yygotominor.yy21 = yymsp[0].minor.yy21; } break; - case 352: /* number ::= INTEGER */ + case 351: /* number ::= INTEGER */ {yygotominor.yy21 = new QVariant(QVariant(yymsp[0].minor.yy0->value).toLongLong());} break; - case 353: /* number ::= FLOAT */ + case 352: /* number ::= FLOAT */ {yygotominor.yy21 = new QVariant(QVariant(yymsp[0].minor.yy0->value).toDouble());} break; - case 354: /* cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause BEGIN trigger_cmd_list END */ + case 353: /* cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause BEGIN trigger_cmd_list END */ { yygotominor.yy399 = new SqliteCreateTrigger( *(yymsp[-13].minor.yy376), @@ -4626,7 +4616,7 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 355: /* cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause */ + case 354: /* cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause */ { QList CL; @@ -4654,7 +4644,7 @@ static void yy_reduce( parserContext->minorErrorAfterLastToken("Syntax error"); } break; - case 356: /* cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause BEGIN trigger_cmd_list */ + case 355: /* cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause BEGIN trigger_cmd_list */ { yygotominor.yy399 = new SqliteCreateTrigger( *(yymsp[-12].minor.yy376), @@ -4681,79 +4671,79 @@ static void yy_reduce( parserContext->minorErrorAfterLastToken("Syntax error"); } break; - case 357: /* cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON ID_TAB */ + case 356: /* cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON ID_TAB */ { yy_destructor(yypParser,179,&yymsp[-8].minor); yy_destructor(yypParser,177,&yymsp[-5].minor); yy_destructor(yypParser,262,&yymsp[-3].minor); yy_destructor(yypParser,263,&yymsp[-2].minor); } break; - case 360: /* trigger_time ::= BEFORE */ + case 359: /* trigger_time ::= BEFORE */ {yygotominor.yy152 = new SqliteCreateTrigger::Time(SqliteCreateTrigger::Time::BEFORE);} break; - case 361: /* trigger_time ::= AFTER */ + case 360: /* trigger_time ::= AFTER */ {yygotominor.yy152 = new SqliteCreateTrigger::Time(SqliteCreateTrigger::Time::AFTER);} break; - case 362: /* trigger_time ::= INSTEAD OF */ + case 361: /* trigger_time ::= INSTEAD OF */ {yygotominor.yy152 = new SqliteCreateTrigger::Time(SqliteCreateTrigger::Time::INSTEAD_OF);} break; - case 363: /* trigger_time ::= */ + case 362: /* trigger_time ::= */ {yygotominor.yy152 = new SqliteCreateTrigger::Time(SqliteCreateTrigger::Time::null);} break; - case 364: /* trigger_event ::= DELETE */ + case 363: /* trigger_event ::= DELETE */ { yygotominor.yy309 = new SqliteCreateTrigger::Event(SqliteCreateTrigger::Event::DELETE); objectForTokens = yygotominor.yy309; } break; - case 365: /* trigger_event ::= INSERT */ + case 364: /* trigger_event ::= INSERT */ { yygotominor.yy309 = new SqliteCreateTrigger::Event(SqliteCreateTrigger::Event::INSERT); objectForTokens = yygotominor.yy309; } break; - case 366: /* trigger_event ::= UPDATE */ + case 365: /* trigger_event ::= UPDATE */ { yygotominor.yy309 = new SqliteCreateTrigger::Event(SqliteCreateTrigger::Event::UPDATE); objectForTokens = yygotominor.yy309; } break; - case 367: /* trigger_event ::= UPDATE OF inscollist */ + case 366: /* trigger_event ::= UPDATE OF inscollist */ { yygotominor.yy309 = new SqliteCreateTrigger::Event(*(yymsp[0].minor.yy445)); delete yymsp[0].minor.yy445; objectForTokens = yygotominor.yy309; } break; - case 368: /* foreach_clause ::= */ + case 367: /* foreach_clause ::= */ {yygotominor.yy409 = new SqliteCreateTrigger::Scope(SqliteCreateTrigger::Scope::null);} break; - case 369: /* foreach_clause ::= FOR EACH ROW */ + case 368: /* foreach_clause ::= FOR EACH ROW */ {yygotominor.yy409 = new SqliteCreateTrigger::Scope(SqliteCreateTrigger::Scope::FOR_EACH_ROW);} break; - case 372: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 371: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { yymsp[-2].minor.yy214->append(yymsp[-1].minor.yy399); yygotominor.yy214 = yymsp[-2].minor.yy214; DONT_INHERIT_TOKENS("trigger_cmd_list"); } break; - case 373: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 372: /* trigger_cmd_list ::= trigger_cmd SEMI */ { yygotominor.yy214 = new ParserQueryList(); yygotominor.yy214->append(yymsp[-1].minor.yy399); } break; - case 374: /* trigger_cmd_list ::= SEMI */ + case 373: /* trigger_cmd_list ::= SEMI */ { yygotominor.yy214 = new ParserQueryList(); parserContext->minorErrorAfterLastToken("Syntax error"); } break; - case 379: /* raisetype ::= ROLLBACK|ABORT|FAIL */ + case 378: /* raisetype ::= ROLLBACK|ABORT|FAIL */ {yygotominor.yy0 = yymsp[0].minor.yy0;} break; - case 380: /* cmd ::= DROP TRIGGER ifexists fullname */ + case 379: /* cmd ::= DROP TRIGGER ifexists fullname */ { yygotominor.yy399 = new SqliteDropTrigger(*(yymsp[-1].minor.yy237), yymsp[0].minor.yy66->name1, yymsp[0].minor.yy66->name2); delete yymsp[-1].minor.yy237; @@ -4761,25 +4751,25 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 383: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + case 382: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ { yygotominor.yy399 = new SqliteAttach(*(yymsp[-4].minor.yy237), yymsp[-3].minor.yy490, yymsp[-1].minor.yy490, yymsp[0].minor.yy490); delete yymsp[-4].minor.yy237; objectForTokens = yygotominor.yy399; } break; - case 384: /* cmd ::= DETACH database_kw_opt expr */ + case 383: /* cmd ::= DETACH database_kw_opt expr */ { yygotominor.yy399 = new SqliteDetach(*(yymsp[-1].minor.yy237), yymsp[0].minor.yy490); delete yymsp[-1].minor.yy237; objectForTokens = yygotominor.yy399; } break; - case 389: /* cmd ::= REINDEX */ + case 388: /* cmd ::= REINDEX */ {yygotominor.yy399 = new SqliteReindex();} break; - case 390: /* cmd ::= REINDEX nm dbnm */ - case 391: /* cmd ::= REINDEX ID_COLLATE */ yytestcase(yyruleno==391); + case 389: /* cmd ::= REINDEX nm dbnm */ + case 390: /* cmd ::= REINDEX ID_COLLATE */ yytestcase(yyruleno==390); { yygotominor.yy399 = new SqliteReindex(*(yymsp[-1].minor.yy211), *(yymsp[0].minor.yy211)); delete yymsp[-1].minor.yy211; @@ -4787,13 +4777,13 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 394: /* cmd ::= ANALYZE */ + case 393: /* cmd ::= ANALYZE */ { yygotominor.yy399 = new SqliteAnalyze(); objectForTokens = yygotominor.yy399; } break; - case 395: /* cmd ::= ANALYZE nm dbnm */ + case 394: /* cmd ::= ANALYZE nm dbnm */ { yygotominor.yy399 = new SqliteAnalyze(*(yymsp[-1].minor.yy211), *(yymsp[0].minor.yy211)); delete yymsp[-1].minor.yy211; @@ -4801,7 +4791,7 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 398: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ + case 397: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ { yygotominor.yy399 = new SqliteAlterTable( yymsp[-3].minor.yy66->name1, @@ -4813,7 +4803,7 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 399: /* cmd ::= ALTER TABLE fullname ADD kwcolumn_opt column */ + case 398: /* cmd ::= ALTER TABLE fullname ADD kwcolumn_opt column */ { yygotominor.yy399 = new SqliteAlterTable( yymsp[-3].minor.yy66->name1, @@ -4826,11 +4816,11 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 400: /* cmd ::= ALTER TABLE fullname RENAME TO ID_TAB_NEW */ + case 399: /* cmd ::= ALTER TABLE fullname RENAME TO ID_TAB_NEW */ { yy_destructor(yypParser,181,&yymsp[-3].minor); } break; - case 406: /* create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + case 405: /* create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm dbnm USING nm */ { yygotominor.yy399 = new SqliteCreateVirtualTable( *(yymsp[-4].minor.yy237), @@ -4845,7 +4835,7 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 407: /* create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm dbnm USING nm LP vtabarglist RP */ + case 406: /* create_vtab ::= CREATE VIRTUAL TABLE ifnotexists nm dbnm USING nm LP vtabarglist RP */ { yygotominor.yy399 = new SqliteCreateVirtualTable( *(yymsp[-7].minor.yy237), @@ -4862,14 +4852,14 @@ static void yy_reduce( objectForTokens = yygotominor.yy399; } break; - case 410: /* vtabarglist ::= vtabarg */ + case 409: /* vtabarglist ::= vtabarg */ { yygotominor.yy445 = new ParserStringList(); yygotominor.yy445->append((yymsp[0].minor.yy211)->mid(1)); // mid(1) to skip the first whitespace added in vtabarg delete yymsp[0].minor.yy211; } break; - case 411: /* vtabarglist ::= vtabarglist COMMA vtabarg */ + case 410: /* vtabarglist ::= vtabarglist COMMA vtabarg */ { yymsp[-2].minor.yy445->append((yymsp[0].minor.yy211)->mid(1)); // mid(1) to skip the first whitespace added in vtabarg yygotominor.yy445 = yymsp[-2].minor.yy445; @@ -4877,19 +4867,19 @@ static void yy_reduce( DONT_INHERIT_TOKENS("vtabarglist"); } break; - case 413: /* vtabarg ::= vtabarg vtabargtoken */ + case 412: /* vtabarg ::= vtabarg vtabargtoken */ { yymsp[-1].minor.yy211->append(" "+ *(yymsp[0].minor.yy211)); yygotominor.yy211 = yymsp[-1].minor.yy211; delete yymsp[0].minor.yy211; } break; - case 414: /* vtabargtoken ::= ANY */ + case 413: /* vtabargtoken ::= ANY */ { yygotominor.yy211 = new QString(yymsp[0].minor.yy0->value); } break; - case 415: /* vtabargtoken ::= LP anylist RP */ + case 414: /* vtabargtoken ::= LP anylist RP */ { yygotominor.yy211 = new QString("("); yygotominor.yy211->append(*(yymsp[-1].minor.yy211)); @@ -4897,7 +4887,7 @@ static void yy_reduce( delete yymsp[-1].minor.yy211; } break; - case 417: /* anylist ::= anylist LP anylist RP */ + case 416: /* anylist ::= anylist LP anylist RP */ { yygotominor.yy211 = yymsp[-3].minor.yy211; yygotominor.yy211->append("("); @@ -4907,37 +4897,37 @@ static void yy_reduce( DONT_INHERIT_TOKENS("anylist"); } break; - case 418: /* anylist ::= anylist ANY */ + case 417: /* anylist ::= anylist ANY */ { yygotominor.yy211 = yymsp[-1].minor.yy211; yygotominor.yy211->append(yymsp[0].minor.yy0->value); DONT_INHERIT_TOKENS("anylist"); } break; - case 419: /* with ::= */ + case 418: /* with ::= */ {yygotominor.yy367 = nullptr;} break; - case 420: /* with ::= WITH wqlist */ + case 419: /* with ::= WITH wqlist */ { yygotominor.yy367 = yymsp[0].minor.yy367; objectForTokens = yygotominor.yy367; } break; - case 421: /* with ::= WITH RECURSIVE wqlist */ + case 420: /* with ::= WITH RECURSIVE wqlist */ { yygotominor.yy367 = yymsp[0].minor.yy367; yygotominor.yy367->recursive = true; objectForTokens = yygotominor.yy367; } break; - case 422: /* wqlist ::= nm idxlist_opt AS LP select RP */ + case 421: /* wqlist ::= nm idxlist_opt AS LP select RP */ { yygotominor.yy367 = SqliteWith::append(*(yymsp[-5].minor.yy211), *(yymsp[-4].minor.yy139), yymsp[-1].minor.yy123); delete yymsp[-5].minor.yy211; delete yymsp[-4].minor.yy139; } break; - case 423: /* wqlist ::= wqlist COMMA nm idxlist_opt AS LP select RP */ + case 422: /* wqlist ::= wqlist COMMA nm idxlist_opt AS LP select RP */ { yygotominor.yy367 = SqliteWith::append(yymsp[-7].minor.yy367, *(yymsp[-5].minor.yy211), *(yymsp[-4].minor.yy139), yymsp[-1].minor.yy123); delete yymsp[-5].minor.yy211; @@ -4945,7 +4935,7 @@ static void yy_reduce( DONT_INHERIT_TOKENS("wqlist"); } break; - case 424: /* wqlist ::= ID_TAB_NEW */ + case 423: /* wqlist ::= ID_TAB_NEW */ { parserContext->minorErrorBeforeNextToken("Syntax error"); yygotominor.yy367 = new SqliteWith(); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y index 65a4dd7..0353e2c 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y +++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y @@ -248,8 +248,8 @@ cmd(X) ::= CREATE temp(T) TABLE conslist_opt(CS) RP table_options(F). { X = new SqliteCreateTable( - *(T), *(E), + *(T), N->name1, N->name2, *(CL), @@ -268,8 +268,8 @@ cmd(X) ::= CREATE temp(T) TABLE ifnotexists(E) fullname(N) AS select(S). { X = new SqliteCreateTable( - *(T), *(E), + *(T), N->name1, N->name2, S @@ -1738,12 +1738,16 @@ exprx(X) ::= expr(E) not_opt(N) IN LP 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] {} diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.cpp index 4f248b0..ba2ea37 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.cpp @@ -77,7 +77,7 @@ StatementTokenBuilder& StatementTokenBuilder::withFloat(double value) return with(Token::FLOAT, QString::number(value)); } -StatementTokenBuilder& StatementTokenBuilder::withInteger(int value) +StatementTokenBuilder& StatementTokenBuilder::withInteger(qint64 value) { return with(Token::INTEGER, QString::number(value)); } @@ -168,10 +168,10 @@ StatementTokenBuilder& StatementTokenBuilder::withLiteralValue(const QVariant& v } } - value.toInt(&ok); + qint64 longVal = value.toLongLong(&ok); if (ok) { - withInteger(value.toInt()); + withInteger(longVal); return *this; } diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.h b/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.h index fcf23be..3d748ad 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.h +++ b/SQLiteStudio3/coreSQLiteStudio/parser/statementtokenbuilder.h @@ -138,7 +138,7 @@ class StatementTokenBuilder * @param value Value for the token. * @return Reference to the builder for the further building. */ - StatementTokenBuilder& withInteger(int value); + StatementTokenBuilder& withInteger(qint64 value); /** * @brief Adds bind parameter token. diff --git a/SQLiteStudio3/coreSQLiteStudio/rsa/BigInt.h b/SQLiteStudio3/coreSQLiteStudio/rsa/BigInt.h index c78dc11..6d59c7a 100644 --- a/SQLiteStudio3/coreSQLiteStudio/rsa/BigInt.h +++ b/SQLiteStudio3/coreSQLiteStudio/rsa/BigInt.h @@ -110,11 +110,12 @@ #ifndef BIGINT_H_ #define BIGINT_H_ +#include "coreSQLiteStudio_global.h" #include //ostream, istream #include //sqrt() #include //ToString(), BigInt(std::string) -class BigInt +class API_EXPORT BigInt { private: /* An array of digits stored right to left, diff --git a/SQLiteStudio3/coreSQLiteStudio/rsa/Key.h b/SQLiteStudio3/coreSQLiteStudio/rsa/Key.h index b193e2c..f1d2ee6 100644 --- a/SQLiteStudio3/coreSQLiteStudio/rsa/Key.h +++ b/SQLiteStudio3/coreSQLiteStudio/rsa/Key.h @@ -34,9 +34,10 @@ #define KEY_H_ #include "BigInt.h" +#include "coreSQLiteStudio_global.h" #include -class Key +class API_EXPORT Key { private: BigInt modulus; diff --git a/SQLiteStudio3/coreSQLiteStudio/rsa/KeyPair.h b/SQLiteStudio3/coreSQLiteStudio/rsa/KeyPair.h index 929ffe9..153195a 100644 --- a/SQLiteStudio3/coreSQLiteStudio/rsa/KeyPair.h +++ b/SQLiteStudio3/coreSQLiteStudio/rsa/KeyPair.h @@ -32,10 +32,11 @@ #ifndef KEYPAIR_H_ #define KEYPAIR_H_ +#include "coreSQLiteStudio_global.h" #include "Key.h" #include -class KeyPair +class API_EXPORT KeyPair { private: const Key privateKey; diff --git a/SQLiteStudio3/coreSQLiteStudio/rsa/PrimeGenerator.h b/SQLiteStudio3/coreSQLiteStudio/rsa/PrimeGenerator.h index 8a9dfac..64ee9f6 100644 --- a/SQLiteStudio3/coreSQLiteStudio/rsa/PrimeGenerator.h +++ b/SQLiteStudio3/coreSQLiteStudio/rsa/PrimeGenerator.h @@ -30,9 +30,10 @@ #ifndef PRIMEGENERATOR_H_ #define PRIMEGENERATOR_H_ +#include "coreSQLiteStudio_global.h" #include "BigInt.h" -class PrimeGenerator +class API_EXPORT PrimeGenerator { private: /* Generates a random "number" such as 1 <= "number" < "top". diff --git a/SQLiteStudio3/coreSQLiteStudio/services/config.h b/SQLiteStudio3/coreSQLiteStudio/services/config.h index 6e1fd95..c7bebf3 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/config.h +++ b/SQLiteStudio3/coreSQLiteStudio/services/config.h @@ -162,6 +162,8 @@ class API_EXPORT Config : public QObject virtual void commit() = 0; virtual void rollback() = 0; + virtual QString getSqlite3Version() const = 0; + signals: void massSaveBegins(); void massSaveCommited(); diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp index bbfec32..046993f 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include static_qstring(DB_FILE_NAME, "settings3"); @@ -28,6 +29,8 @@ void ConfigImpl::init() initDbFile(); initTables(); + sqlite3Version = db->exec("SELECT sqlite_version()")->getSingleCell().toString(); + connect(this, SIGNAL(sqlHistoryRefreshNeeded()), this, SLOT(refreshSqlHistory())); connect(this, SIGNAL(ddlHistoryRefreshNeeded()), this, SLOT(refreshDdlHistory())); } @@ -175,6 +178,11 @@ QString ConfigImpl::getLastErrorString() const return msg; } +QString ConfigImpl::getSqlite3Version() const +{ + return sqlite3Version; +} + QList ConfigImpl::dbList() { QList entries; @@ -467,23 +475,42 @@ QString ConfigImpl::getConfigPath() QString ConfigImpl::getPortableConfigPath() { + QStringList paths = QStringList({"./sqlitestudio-cfg", qApp->applicationDirPath() + "/sqlitestudio-cfg"}); + QSet pathSet; + QDir dir; + for (const QString& path : paths) + { + dir = QDir(path); + pathSet << dir.absolutePath(); + } + + QString potentialPath; QFileInfo file; - QDir dir("./sqlitestudio-cfg"); + for (const QString& path : pathSet) + { + dir = QDir(path); + file = QFileInfo(dir.absolutePath()); + if (!file.exists()) + { + if (potentialPath.isNull()) + potentialPath = dir.absolutePath(); - file = QFileInfo(dir.absolutePath()); - if (!file.exists()) - return dir.absolutePath(); + continue; + } - if (!file.isDir() || !file.isReadable() || !file.isWritable()) - return QString::null; + if (!file.isDir() || !file.isReadable() || !file.isWritable()) + continue; - foreach (file, dir.entryInfoList()) - { - if (!file.isReadable() || !file.isWritable()) - return QString::null; + foreach (file, dir.entryInfoList()) + { + if (!file.isReadable() || !file.isWritable()) + continue; + } + + return dir.absolutePath(); } - return dir.absolutePath(); + return potentialPath; } void ConfigImpl::initTables() diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h index 63d1e1f..3bdb7a5 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h +++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h @@ -36,6 +36,7 @@ class API_EXPORT ConfigImpl : public Config bool removeDb(const QString& name); bool isDbInConfig(const QString& name); QString getLastErrorString() const; + QString getSqlite3Version() const; /** * @brief Provides list of all registered databases. @@ -120,6 +121,7 @@ class API_EXPORT ConfigImpl : public Config SqlHistoryModel* sqlHistoryModel = nullptr; DdlHistoryModel* ddlHistoryModel = nullptr; QMutex sqlHistoryMutex; + QString sqlite3Version; public slots: void refreshDdlHistory(); diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.cpp b/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.cpp index 43fc953..70aa568 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include DbManagerImpl::DbManagerImpl(QObject *parent) : @@ -46,7 +47,13 @@ bool DbManagerImpl::addDb(const QString &name, const QString &path, const QHash< if (getByName(name)) { qWarning() << "Tried to add database with name that was already on the list:" << name; - return false; // db with this name exists + return false; + } + + if (getByPath(path)) + { + qWarning() << "Tried to add database with path that was already on the list:" << path; + return false; } QString errorMessage; @@ -74,24 +81,27 @@ bool DbManagerImpl::updateDb(Db* db, const QString &name, const QString &path, c return false; } + QDir pathDir(path); + QString normalizedPath = pathDir.absolutePath(); + listLock.lockForWrite(); nameToDb.remove(db->getName(), Qt::CaseInsensitive); pathToDb.remove(db->getPath()); - bool pathDifferent = db->getPath() != path; + bool pathDifferent = db->getPath() != normalizedPath; QString oldName = db->getName(); db->setName(name); - db->setPath(path); + db->setPath(normalizedPath); db->setConnectionOptions(options); bool result = false; if (permanent) { if (CFG->isDbInConfig(oldName)) - result = CFG->updateDb(oldName, name, path, options); + result = CFG->updateDb(oldName, name, normalizedPath, options); else - result = CFG->addDb(name, path, options); + result = CFG->addDb(name, normalizedPath, options); } else if (CFG->isDbInConfig(name)) // switched "permanent" off? result = CFG->removeDb(name); @@ -105,7 +115,7 @@ bool DbManagerImpl::updateDb(Db* db, const QString &name, const QString &path, c db = reloadedDb; nameToDb[name] = db; - pathToDb[path] = db; + pathToDb[normalizedPath] = db; listLock.unlock(); @@ -138,14 +148,17 @@ void DbManagerImpl::removeDbByName(const QString &name, Qt::CaseSensitivity cs) void DbManagerImpl::removeDbByPath(const QString &path) { + // Using QDir to normalize separator + QDir pathDir(path); + listLock.lockForRead(); - bool contains = pathToDb.contains(path); + bool contains = pathToDb.contains(pathDir.absolutePath()); listLock.unlock(); if (!contains) return; listLock.lockForWrite(); - Db* db = pathToDb[path]; + Db* db = pathToDb[pathDir.absolutePath()]; removeDbInternal(db); listLock.unlock(); @@ -230,7 +243,9 @@ Db* DbManagerImpl::getByName(const QString &name, Qt::CaseSensitivity cs) Db* DbManagerImpl::getByPath(const QString &path) { - return pathToDb.value(path); + // Using QDir to normalize separator + QDir pathDir(path); + return pathToDb.value(pathDir.absolutePath()); } Db* DbManagerImpl::createInMemDb() @@ -369,12 +384,13 @@ Db* DbManagerImpl::createDb(const QString &name, const QString &path, const QHas Db* db = nullptr; QStringList messages; QString message; + QDir pathDir(path); // Using QDir to normalize separator foreach (dbPlugin, dbPlugins) { if (options.contains("plugin") && options["plugin"] != dbPlugin->getName()) continue; - db = dbPlugin->getInstance(name, path, options, &message); + db = dbPlugin->getInstance(name, pathDir.absolutePath(), options, &message); if (!db) { messages << message; diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp b/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp index c94e4c2..da732bd 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp @@ -147,9 +147,9 @@ void FunctionManagerImpl::evaluateScriptAggregateInitial(ScriptFunction* func, D aggregateStorage["context"] = QVariant::fromValue(ctx); if (dbAwarePlugin) - dbAwarePlugin->evaluate(ctx, func->code, {}, db, false); + dbAwarePlugin->evaluate(ctx, func->initCode, {}, db, false); else - plugin->evaluate(ctx, func->code, {}); + plugin->evaluate(ctx, func->initCode, {}); if (plugin->hasError(ctx)) { @@ -203,9 +203,9 @@ QVariant FunctionManagerImpl::evaluateScriptAggregateFinal(ScriptFunction* func, QVariant result; if (dbAwarePlugin) - result = dbAwarePlugin->evaluate(ctx, func->code, {}, db, false); + result = dbAwarePlugin->evaluate(ctx, func->finalCode, {}, db, false); else - result = plugin->evaluate(ctx, func->code, {}); + result = plugin->evaluate(ctx, func->finalCode, {}); if (plugin->hasError(ctx)) { diff --git a/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp b/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp index 8ff4f0d..2d2bbd3 100644 --- a/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp @@ -39,7 +39,7 @@ DEFINE_SINGLETON(SQLiteStudio) -static const int sqlitestudioVersion = 30002; +static const int sqlitestudioVersion = 30003; SQLiteStudio::SQLiteStudio() { diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp index d064cb1..8dc36ee 100644 --- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp @@ -111,11 +111,13 @@ void TableModifier::handleFks(const QString& tempTableName) subModifier.usedTempTableNames = usedTempTableNames; subModifier.tableColMap = tableColMap; + subModifier.triggerNameToDdlMap = triggerNameToDdlMap; subModifier.existingColumns = existingColumns; subModifier.newName = newName; subModifier.subHandleFks(originalTable, tempTableName); sqls += subModifier.generateSqls(); modifiedTables << fkTable; + triggerNameToDdlMap = subModifier.triggerNameToDdlMap; modifiedTables += subModifier.getModifiedTables(); modifiedIndexes += subModifier.getModifiedIndexes(); @@ -390,10 +392,67 @@ void TableModifier::handleTriggers() void TableModifier::handleTrigger(SqliteCreateTriggerPtr trigger) { - handleName(originalTable, trigger->table); - if (trigger->event->type == SqliteCreateTrigger::Event::UPDATE_OF) - handleColumnNames(trigger->event->columnNames); + trigger->rebuildTokens(); + QString originalQueryString = trigger->detokenize(); + bool forThisTable = (originalTable.compare(trigger->table, Qt::CaseInsensitive) == 0); + bool alreadyProcessedOnce = modifiedTriggers.contains(trigger->trigger, Qt::CaseInsensitive); + + if (forThisTable) + { + // Those routines should run only for trigger targeted for originalTable. + handleName(originalTable, trigger->table); + if (trigger->event->type == SqliteCreateTrigger::Event::UPDATE_OF) + handleColumnNames(trigger->event->columnNames); + } + + if (alreadyProcessedOnce) + { + // The trigger was already modified by handling of some referencing table. + QString oldDdl = triggerNameToDdlMap[trigger->trigger]; + Parser parser(dialect); + trigger = parser.parse(oldDdl); + if (!trigger) + { + qCritical() << "Could not parse old (already processed once) trigger. Parser error:" << parser.getErrorString() << ", Old DDL: " << oldDdl; + warnings << QObject::tr("There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention.") + .arg(trigger->trigger); + return; + } + } + + handleTriggerQueries(trigger); + + trigger->rebuildTokens(); + QString newQueryString = trigger->detokenize(); + if (originalQueryString == newQueryString && !forThisTable) + return; // No query modification was made and trigger is not deleted by this table drop. + + if (trigger->event->type == SqliteCreateTrigger::Event::UPDATE_OF && trigger->event->columnNames.size() == 0) + { + warnings << QObject::tr("All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification.").arg(trigger->trigger); + return; + } + + if (alreadyProcessedOnce) + { + // We will add new sql to list, at the end, so it's executed after all tables were altered. + sqls.removeOne(triggerNameToDdlMap[trigger->trigger]); + } + + if (!forThisTable) + { + // If this is for other table, than trigger might be still existing, cause altering this table will not delete trigger. + sqls << QString("DROP TRIGGER IF EXISTS %1").arg(wrapObjIfNeeded(trigger->trigger, dialect)); + } + + sqls << newQueryString; + modifiedTriggers << trigger->trigger; + triggerNameToDdlMap[trigger->trigger] = newQueryString; +} + +void TableModifier::handleTriggerQueries(SqliteCreateTriggerPtr trigger) +{ SqliteQuery* newQuery = nullptr; QList newQueries; foreach (SqliteQuery* query, trigger->queries) @@ -406,17 +465,6 @@ void TableModifier::handleTrigger(SqliteCreateTriggerPtr trigger) errors << QObject::tr("Cannot not update trigger %1 according to table %2 modification.").arg(trigger->trigger, originalTable); } trigger->queries = newQueries; - - if (trigger->event->type == SqliteCreateTrigger::Event::UPDATE_OF && trigger->event->columnNames.size() == 0) - { - warnings << QObject::tr("All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification.").arg(trigger->trigger); - } - else - { - trigger->rebuildTokens(); - sqls << trigger->detokenize(); - modifiedTriggers << trigger->trigger; - } } void TableModifier::handleViews() diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h index 62af492..d3977ee 100644 --- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h +++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h @@ -42,6 +42,7 @@ class API_EXPORT TableModifier void handleIndex(SqliteCreateIndexPtr index); void handleTriggers(); void handleTrigger(SqliteCreateTriggerPtr trigger); + void handleTriggerQueries(SqliteCreateTriggerPtr trigger); void handleViews(); void handleView(SqliteCreateViewPtr view); SqliteQuery* handleTriggerQuery(SqliteQuery* query, const QString& trigName); @@ -105,6 +106,7 @@ class API_EXPORT TableModifier QString newName; QStringList existingColumns; QHash tableColMap; + QHash triggerNameToDdlMap; QStringList modifiedTables; QStringList modifiedIndexes; QStringList modifiedTriggers; diff --git a/SQLiteStudio3/coreSQLiteStudio/translations.cpp b/SQLiteStudio3/coreSQLiteStudio/translations.cpp index 56dc5f6..362d4fa 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/translations.cpp @@ -7,7 +7,7 @@ #include QHash SQLITESTUDIO_TRANSLATIONS; -QStringList SQLITESTUDIO_TRANSLATION_DIRS = QStringList({":/msg", ":/msg/translations", "msg", "translations"}); +QStringList SQLITESTUDIO_TRANSLATION_DIRS = QStringList({"msg", "translations", ":/msg", ":/msg/translations"}); void loadTranslation(const QString& baseName) { @@ -106,3 +106,13 @@ QMap getAvailableLanguages() return langs; } + +void setDefaultLanguage(const QString& lang) +{ + CFG_CORE.General.Language.set(lang); +} + +QString getConfigLanguageDefault() +{ + return CFG_CORE.General.Language.getDefultValue().toString(); +} diff --git a/SQLiteStudio3/coreSQLiteStudio/translations.h b/SQLiteStudio3/coreSQLiteStudio/translations.h index c130064..4ae6231 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations.h +++ b/SQLiteStudio3/coreSQLiteStudio/translations.h @@ -1,18 +1,21 @@ #ifndef TRANSLATIONS_H #define TRANSLATIONS_H +#include "coreSQLiteStudio_global.h" #include #include -void loadTranslations(const QStringList& baseNames); -void loadTranslation(const QString& baseName); -void unloadTranslation(const QString& baseName); +API_EXPORT void loadTranslations(const QStringList& baseNames); +API_EXPORT void loadTranslation(const QString& baseName); +API_EXPORT void unloadTranslation(const QString& baseName); +API_EXPORT void setDefaultLanguage(const QString& lang); +API_EXPORT QString getConfigLanguageDefault(); /** * @brief Provides list of translations as code names. * @return List of available translations in their code names (pl, pt, de, ...). */ -QStringList getAvailableTranslations(); +API_EXPORT QStringList getAvailableTranslations(); /** * @brief Provides list of languages and their code names. @@ -20,6 +23,6 @@ QStringList getAvailableTranslations(); * * As the result is a QMap, it comes sorted by a translated names of languages. */ -QMap getAvailableLanguages(); +API_EXPORT QMap getAvailableLanguages(); #endif // TRANSLATIONS_H diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.qm new file mode 100644 index 0000000..9dad8df Binary files /dev/null and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts new file mode 100644 index 0000000..7656d3b --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts @@ -0,0 +1,1278 @@ + + + + + AbstractDb + + + + Cannot execute query on closed database. + + + + + Error attaching database %1: %2 + + + + + BugReporter + + + Invalid login or password + + + + + ChainExecutor + + + The database for executing queries was not defined. + chain executor + + + + + The database for executing queries was not open. + chain executor + + + + + Could not start a database transaction. Details: %1 + chain executor + + + + + Interrupted + chain executor + + + + + Could not commit a database transaction. Details: %1 + chain executor + + + + + CompletionHelper + + + New row reference + + + + + Old row reference + + + + + New table name + + + + + New index name + + + + + New view name + + + + + New trigger name + + + + + Table or column alias + + + + + transaction name + + + + + New column name + + + + + Column data type + + + + + Constraint name + + + + + Error message + + + + + Collation name + + + + + Any word + + + + + Default database + + + + + Temporary objects database + + + + + DbManagerImpl + + + Could not add database %1: %2 + + + + + Database %1 could not be updated, because of an error: %2 + + + + + + Database file doesn't exist. + + + + + + + No supporting plugin loaded. + + + + + Database could not be initialized. + + + + + No suitable database driver plugin found. + + + + + DbObjectOrganizer + + + + Error while creating table in target database: %1 + + + + + Could not parse table. + + + + + 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. + + + + + Error while copying data for table %1: %2 + + + + + + + Error while copying data to table %1: %2 + + + + + Error while dropping source view %1: %2 +Tables, indexes, triggers and views copied to database %3 will remain. + + + + + Error while creating view in target database: %1 + + + + + Error while creating index in target database: %1 + + + + + Error while creating trigger in target database: %1 + + + + + DbVersionConverter + + + Target file exists, but could not be overwritten. + + + + + Could not find proper database plugin to create target database. + + + + + Error while converting database: %1 + + + + + DdlHistoryModel + + + Database name + ddl history header + + + + + Database file + ddl history header + + + + + Date of execution + ddl history header + + + + + Changes + ddl history header + + + + + ExportManager + + + Export plugin %1 doesn't support exporing query results. + + + + + Export plugin %1 doesn't support exporing tables. + + + + + Export plugin %1 doesn't support exporing databases. + + + + + Export format '%1' is not supported. Supported formats are: %2. + + + + + Export to the clipboard was successful. + + + + + Export to the file '%1' was successful. + + + + + Export was successful. + + + + + Could not export to file %1. File cannot be open for writting. + + + + + ExportWorker + + + Error while exporting query results: %1 + + + + + Error while counting data column width to export from query results: %1 + + + + + + Could not parse %1 in order to export it. It will be excluded from the export output. + + + + + Error while reading data to export from table %1: %2 + + + + + Error while counting data to export from table %1: %2 + + + + + Error while counting data column width to export from table %1: %2 + + + + + FunctionManagerImpl + + + Invalid number of arguments to function '%1'. Expected %2, but got %3. + + + + + No such function registered in SQLiteStudio: %1(%2) + + + + + Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded. + + + + + Invalid regular expression pattern: %1 + + + + + + Could not open file %1 for reading: %2 + + + + + Could not open file %1 for writting: %2 + + + + + Error while writting to file %1: %2 + + + + + Unsupported scripting language: %1 + + + + + GenericExportPlugin + + + Could not initialize text codec for exporting. Using default codec: %1 + + + + + ImportManager + + + Imported data to the table '%1' successfully. + + + + + ImportWorker + + + No columns provided by the import plugin. + + + + + Could not start transaction in order to import a data: %1 + + + + + Could not commit transaction for imported data: %1 + + + + + Table '%1' has less columns than there are columns in the data to be imported. Excessive data columns will be ignored. + + + + + Table '%1' has more columns than there are columns in the data to be imported. Some columns in the table will be left empty. + + + + + Could not create table to import to: %1 + + + + + + + Error while importing data: %1 + + + + + + Interrupted. + import process status update + + + + + PluginManagerImpl + + + Cannot load plugin %1, because it's in conflict with plugin %2. + + + + + Cannot load plugin %1, because its dependency was not loaded: %2. + + + + + Cannot load plugin %1. Error details: %2 + + + + + Cannot load plugin %1 (error while initializing plugin). + + + + + min: %1 + plugin dependency version + + + + + max: %1 + plugin dependency version + + + + + PopulateConstant + + + Constant + populate constant plugin name + + + + + PopulateConstantConfig + + + Constant value: + + + + + PopulateDictionary + + + Dictionary + dictionary populating plugin name + + + + + PopulateDictionaryConfig + + + Dictionary file + + + + + Pick dictionary file + + + + + Word separator + + + + + Whitespace + + + + + Line break + + + + + Method of using words + + + + + Ordered + + + + + Randomly + + + + + PopulateManager + + + Table '%1' populated successfully. + + + + + PopulateRandom + + + Random number + + + + + PopulateRandomConfig + + + Constant prefix + + + + + No prefix + + + + + Minimum value + + + + + Maximum value + + + + + Constant suffix + + + + + No suffix + + + + + PopulateRandomText + + + Random text + + + + + PopulateRandomTextConfig + + + Use characters from common sets: + + + + + Minimum length + + + + + Letters from a to z. + + + + + Alpha + + + + + Numbers from 0 to 9. + + + + + Numeric + + + + + A whitespace, a tab and a new line character. + + + + + Whitespace + + + + + Includes all above and all others. + + + + + Binary + + + + + Use characters from my custom set: + + + + + Maximum length + + + + + If you type some character multiple times, it's more likely to be used. + + + + + PopulateScript + + + Script + + + + + PopulateScriptConfig + + + Initialization code (optional) + + + + + Per step code + + + + + Language + + + + + Help + + + + + PopulateSequence + + + Sequence + + + + + PopulateSequenceConfig + + + Start value: + + + + + Step: + + + + + PopulateWorker + + + Could not start transaction in order to perform table populating. Error details: %1 + + + + + Error while populating table: %1 + + + + + Could not commit transaction after table populating. Error details: %1 + + + + + QObject + + + + Could not open database: %1 + + + + + + Result set expired or no row available. + + + + + Could not close database: %1 + + + + + + + + + + + SQLite %1 does not support '%2' statement. + + + + + SQLite %1 does not support '%2' statement, but the regular table can be created instead if you proceed. + + + + + Could not parse statement: %1 +Error details: %2 + + + + + + + + SQLite %1 does not support the '%2' clause. Cannot convert '%3' statement with that clause. + + + + + SQLite %1 does not support the '%2' clause in the '%3' statement. + + + + + SQLite %1 does not support current date or time clauses in expressions. + + + + + + + SQLite %1 does not support '%2' clause in expressions. + + + + + Could not attach database %1: %2 + + + + + + Incomplete query. + + + + + + Parser stack overflow + + + + + + Syntax error + + + + + Could not open dictionary file %1 for reading. + + + + + Dictionary file must exist and be readable. + + + + + Maximum value cannot be less than minimum value. + + + + + Maximum length cannot be less than minimum length. + + + + + Custom character set cannot be empty. + + + + + Could not find plugin to support scripting language: %1 + + + + + Error while executing populating initial code: %1 + + + + + Error while executing populating code: %1 + + + + + Select implementation language. + + + + + Implementation code cannot be empty. + + + + + Could not resolve data source for column: %1 + + + + + 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. + + + + + General purpose + plugin category name + + + + + Database support + plugin category name + + + + + Code formatter + plugin category name + + + + + Scripting languages + plugin category name + + + + + Exporting + plugin category name + + + + + Importing + plugin category name + + + + + Table populating + plugin category name + + + + + 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. + + + + + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. + + + + + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. + + + + + Cannot not update trigger %1 according to table %2 modification. + + + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. + + + + + + + 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. + + + + + Could not parse DDL of the view to be created. Details: %1 + + + + + Parsed query is not CREATE VIEW. It's: %1 + + + + + SQLiteStudio was unable to resolve columns returned by the new view, therefore it won't be able to tell which triggers might fail during the recreation process. + + + + + QueryExecutor + + + Execution interrupted. + + + + + Database is not open. + + + + + Only one query can be executed simultaneously. + + + + + + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 + + + + + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. + + + + + ScriptingQtDbProxy + + + No database available in current context, while called QtScript's %1 command. + + + + + Error from %1: %2 + + + + + SqlHistoryModel + + + Database + sql history header + + + + + Execution date + sql history header + + + + + Time spent + sql history header + + + + + Rows affected + sql history header + + + + + SQL + sql history header + + + + + UpdateManager + + + An error occurred while checking for updates: %1. + + + + + Could not check available updates, because server responded with invalid message format. It is safe to ignore this warning. + + + + + An error occurred while reading updates metadata: %1. + + + + + Could not download updates, because server responded with invalid message format. You can try again later or download and install updates manually. See <a href="%1">User Manual</a> for details. + + + + + Could not create temporary directory for downloading the update. Updating aborted. + + + + + There was no updates to download. Updating aborted. + + + + + Downloading: %1 + + + + + Could not determinate file name from update URL: %1. Updating aborted. + + + + + Failed to open file '%1' for writting: %2. Updating aborted. + + + + + Installing updates. + + + + + Could not copy current application directory into %1 directory. + + + + + Could not create directory %1. + + + + + Could not rename directory %1 to %2. +Details: %3 + + + + + Cannot not rename directory %1 to %2. +Details: %3 + + + + + Could not move directory %1 to %2 and also failed to restore original directory, so the original SQLiteStudio directory is now located at: %3 + + + + + Could not rename directory %1 to %2. Rolled back to the original SQLiteStudio version. + + + + + Could not unpack component %1 into %2 directory. + + + + + Could not find permissions elevator application to run update as a root. Looked for: %1 + + + + + Could not execute final updating steps as root: %1 + + + + + + + + Could not execute final updating steps as admin: %1 + + + + + Cannot create temporary directory for updater. + + + + + Cannot create updater script file. + + + + + Updating canceled. + + + + + Could not execute final updating steps as administrator. + + + + + Could not execute final updating steps as administrator. Updater startup timed out. + + + + + Could not execute final updating steps as administrator. Updater operation timed out. + + + + + Could not clean up temporary directory %1. You can delete it manually at any time. + + + + + Could not run new version for continuing update. + + + + + Package not in tar.gz format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot move it to directory: %2 + + + + + Package %1 cannot be installed, because cannot unpack it: %2 + + + + + Package not in zip format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot unzip it to directory %2: %3 + + + + + Package %1 cannot be installed, because cannot unzip it to directory: %2 + + + + + + Could not rename directory %1 to %2. + + + + + Could not delete directory %1. + + + + + Error executing update command: %1 +Error message: %2 + + + + + An error occurred while downloading updates: %1. Updating aborted. + + + + diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.qm new file mode 100644 index 0000000..9dad8df Binary files /dev/null and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts new file mode 100644 index 0000000..420d0bb --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts @@ -0,0 +1,1278 @@ + + + + + AbstractDb + + + + Cannot execute query on closed database. + + + + + Error attaching database %1: %2 + + + + + BugReporter + + + Invalid login or password + + + + + ChainExecutor + + + The database for executing queries was not defined. + chain executor + + + + + The database for executing queries was not open. + chain executor + + + + + Could not start a database transaction. Details: %1 + chain executor + + + + + Interrupted + chain executor + + + + + Could not commit a database transaction. Details: %1 + chain executor + + + + + CompletionHelper + + + New row reference + + + + + Old row reference + + + + + New table name + + + + + New index name + + + + + New view name + + + + + New trigger name + + + + + Table or column alias + + + + + transaction name + + + + + New column name + + + + + Column data type + + + + + Constraint name + + + + + Error message + + + + + Collation name + + + + + Any word + + + + + Default database + + + + + Temporary objects database + + + + + DbManagerImpl + + + Could not add database %1: %2 + + + + + Database %1 could not be updated, because of an error: %2 + + + + + + Database file doesn't exist. + + + + + + + No supporting plugin loaded. + + + + + Database could not be initialized. + + + + + No suitable database driver plugin found. + + + + + DbObjectOrganizer + + + + Error while creating table in target database: %1 + + + + + Could not parse table. + + + + + 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. + + + + + Error while copying data for table %1: %2 + + + + + + + Error while copying data to table %1: %2 + + + + + Error while dropping source view %1: %2 +Tables, indexes, triggers and views copied to database %3 will remain. + + + + + Error while creating view in target database: %1 + + + + + Error while creating index in target database: %1 + + + + + Error while creating trigger in target database: %1 + + + + + DbVersionConverter + + + Target file exists, but could not be overwritten. + + + + + Could not find proper database plugin to create target database. + + + + + Error while converting database: %1 + + + + + DdlHistoryModel + + + Database name + ddl history header + + + + + Database file + ddl history header + + + + + Date of execution + ddl history header + + + + + Changes + ddl history header + + + + + ExportManager + + + Export plugin %1 doesn't support exporing query results. + + + + + Export plugin %1 doesn't support exporing tables. + + + + + Export plugin %1 doesn't support exporing databases. + + + + + Export format '%1' is not supported. Supported formats are: %2. + + + + + Export to the clipboard was successful. + + + + + Export to the file '%1' was successful. + + + + + Export was successful. + + + + + Could not export to file %1. File cannot be open for writting. + + + + + ExportWorker + + + Error while exporting query results: %1 + + + + + Error while counting data column width to export from query results: %1 + + + + + + Could not parse %1 in order to export it. It will be excluded from the export output. + + + + + Error while reading data to export from table %1: %2 + + + + + Error while counting data to export from table %1: %2 + + + + + Error while counting data column width to export from table %1: %2 + + + + + FunctionManagerImpl + + + Invalid number of arguments to function '%1'. Expected %2, but got %3. + + + + + No such function registered in SQLiteStudio: %1(%2) + + + + + Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded. + + + + + Invalid regular expression pattern: %1 + + + + + + Could not open file %1 for reading: %2 + + + + + Could not open file %1 for writting: %2 + + + + + Error while writting to file %1: %2 + + + + + Unsupported scripting language: %1 + + + + + GenericExportPlugin + + + Could not initialize text codec for exporting. Using default codec: %1 + + + + + ImportManager + + + Imported data to the table '%1' successfully. + + + + + ImportWorker + + + No columns provided by the import plugin. + + + + + Could not start transaction in order to import a data: %1 + + + + + Could not commit transaction for imported data: %1 + + + + + Table '%1' has less columns than there are columns in the data to be imported. Excessive data columns will be ignored. + + + + + Table '%1' has more columns than there are columns in the data to be imported. Some columns in the table will be left empty. + + + + + Could not create table to import to: %1 + + + + + + + Error while importing data: %1 + + + + + + Interrupted. + import process status update + + + + + PluginManagerImpl + + + Cannot load plugin %1, because it's in conflict with plugin %2. + + + + + Cannot load plugin %1, because its dependency was not loaded: %2. + + + + + Cannot load plugin %1. Error details: %2 + + + + + Cannot load plugin %1 (error while initializing plugin). + + + + + min: %1 + plugin dependency version + + + + + max: %1 + plugin dependency version + + + + + PopulateConstant + + + Constant + populate constant plugin name + + + + + PopulateConstantConfig + + + Constant value: + + + + + PopulateDictionary + + + Dictionary + dictionary populating plugin name + + + + + PopulateDictionaryConfig + + + Dictionary file + + + + + Pick dictionary file + + + + + Word separator + + + + + Whitespace + + + + + Line break + + + + + Method of using words + + + + + Ordered + + + + + Randomly + + + + + PopulateManager + + + Table '%1' populated successfully. + + + + + PopulateRandom + + + Random number + + + + + PopulateRandomConfig + + + Constant prefix + + + + + No prefix + + + + + Minimum value + + + + + Maximum value + + + + + Constant suffix + + + + + No suffix + + + + + PopulateRandomText + + + Random text + + + + + PopulateRandomTextConfig + + + Use characters from common sets: + + + + + Minimum length + + + + + Letters from a to z. + + + + + Alpha + + + + + Numbers from 0 to 9. + + + + + Numeric + + + + + A whitespace, a tab and a new line character. + + + + + Whitespace + + + + + Includes all above and all others. + + + + + Binary + + + + + Use characters from my custom set: + + + + + Maximum length + + + + + If you type some character multiple times, it's more likely to be used. + + + + + PopulateScript + + + Script + + + + + PopulateScriptConfig + + + Initialization code (optional) + + + + + Per step code + + + + + Language + + + + + Help + + + + + PopulateSequence + + + Sequence + + + + + PopulateSequenceConfig + + + Start value: + + + + + Step: + + + + + PopulateWorker + + + Could not start transaction in order to perform table populating. Error details: %1 + + + + + Error while populating table: %1 + + + + + Could not commit transaction after table populating. Error details: %1 + + + + + QObject + + + + Could not open database: %1 + + + + + + Result set expired or no row available. + + + + + Could not close database: %1 + + + + + + + + + + + SQLite %1 does not support '%2' statement. + + + + + SQLite %1 does not support '%2' statement, but the regular table can be created instead if you proceed. + + + + + Could not parse statement: %1 +Error details: %2 + + + + + + + + SQLite %1 does not support the '%2' clause. Cannot convert '%3' statement with that clause. + + + + + SQLite %1 does not support the '%2' clause in the '%3' statement. + + + + + SQLite %1 does not support current date or time clauses in expressions. + + + + + + + SQLite %1 does not support '%2' clause in expressions. + + + + + Could not attach database %1: %2 + + + + + + Incomplete query. + + + + + + Parser stack overflow + + + + + + Syntax error + + + + + Could not open dictionary file %1 for reading. + + + + + Dictionary file must exist and be readable. + + + + + Maximum value cannot be less than minimum value. + + + + + Maximum length cannot be less than minimum length. + + + + + Custom character set cannot be empty. + + + + + Could not find plugin to support scripting language: %1 + + + + + Error while executing populating initial code: %1 + + + + + Error while executing populating code: %1 + + + + + Select implementation language. + + + + + Implementation code cannot be empty. + + + + + Could not resolve data source for column: %1 + + + + + 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. + + + + + General purpose + plugin category name + + + + + Database support + plugin category name + + + + + Code formatter + plugin category name + + + + + Scripting languages + plugin category name + + + + + Exporting + plugin category name + + + + + Importing + plugin category name + + + + + Table populating + plugin category name + + + + + 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. + + + + + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. + + + + + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. + + + + + Cannot not update trigger %1 according to table %2 modification. + + + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. + + + + + + + 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. + + + + + Could not parse DDL of the view to be created. Details: %1 + + + + + Parsed query is not CREATE VIEW. It's: %1 + + + + + SQLiteStudio was unable to resolve columns returned by the new view, therefore it won't be able to tell which triggers might fail during the recreation process. + + + + + QueryExecutor + + + Execution interrupted. + + + + + Database is not open. + + + + + Only one query can be executed simultaneously. + + + + + + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 + + + + + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. + + + + + ScriptingQtDbProxy + + + No database available in current context, while called QtScript's %1 command. + + + + + Error from %1: %2 + + + + + SqlHistoryModel + + + Database + sql history header + + + + + Execution date + sql history header + + + + + Time spent + sql history header + + + + + Rows affected + sql history header + + + + + SQL + sql history header + + + + + UpdateManager + + + An error occurred while checking for updates: %1. + + + + + Could not check available updates, because server responded with invalid message format. It is safe to ignore this warning. + + + + + An error occurred while reading updates metadata: %1. + + + + + Could not download updates, because server responded with invalid message format. You can try again later or download and install updates manually. See <a href="%1">User Manual</a> for details. + + + + + Could not create temporary directory for downloading the update. Updating aborted. + + + + + There was no updates to download. Updating aborted. + + + + + Downloading: %1 + + + + + Could not determinate file name from update URL: %1. Updating aborted. + + + + + Failed to open file '%1' for writting: %2. Updating aborted. + + + + + Installing updates. + + + + + Could not copy current application directory into %1 directory. + + + + + Could not create directory %1. + + + + + Could not rename directory %1 to %2. +Details: %3 + + + + + Cannot not rename directory %1 to %2. +Details: %3 + + + + + Could not move directory %1 to %2 and also failed to restore original directory, so the original SQLiteStudio directory is now located at: %3 + + + + + Could not rename directory %1 to %2. Rolled back to the original SQLiteStudio version. + + + + + Could not unpack component %1 into %2 directory. + + + + + Could not find permissions elevator application to run update as a root. Looked for: %1 + + + + + Could not execute final updating steps as root: %1 + + + + + + + + Could not execute final updating steps as admin: %1 + + + + + Cannot create temporary directory for updater. + + + + + Cannot create updater script file. + + + + + Updating canceled. + + + + + Could not execute final updating steps as administrator. + + + + + Could not execute final updating steps as administrator. Updater startup timed out. + + + + + Could not execute final updating steps as administrator. Updater operation timed out. + + + + + Could not clean up temporary directory %1. You can delete it manually at any time. + + + + + Could not run new version for continuing update. + + + + + Package not in tar.gz format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot move it to directory: %2 + + + + + Package %1 cannot be installed, because cannot unpack it: %2 + + + + + Package not in zip format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot unzip it to directory %2: %3 + + + + + Package %1 cannot be installed, because cannot unzip it to directory: %2 + + + + + + Could not rename directory %1 to %2. + + + + + Could not delete directory %1. + + + + + Error executing update command: %1 +Error message: %2 + + + + + An error occurred while downloading updates: %1. Updating aborted. + + + + diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm new file mode 100644 index 0000000..a0b0a53 Binary files /dev/null and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts new file mode 100644 index 0000000..46e3abc --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts @@ -0,0 +1,1283 @@ + + + + + AbstractDb + + + + Cannot execute query on closed database. + Impossible d'exécuter la requête sur une base de données fermée. + + + + Error attaching database %1: %2 + Erreur base de données attachée %1:%2 + + + + BugReporter + + + Invalid login or password + Identifiant ou mot de passe incorrect + + + + ChainExecutor + + + The database for executing queries was not defined. + chain executor + La base de données pour exécuter des requêtes n'était pas définie. + + + + The database for executing queries was not open. + chain executor + La base de données pour exécuter des requêtes n'est pas ouverte. + + + + Could not start a database transaction. Details: %1 + chain executor + Impossible d'initialiser une transaction de la base de données:%1 + + + + Interrupted + chain executor + Interruption + + + + Could not commit a database transaction. Details: %1 + chain executor + Impossible d'enregistrer la transaction de la base de données:%1 + + + + CompletionHelper + + + New row reference + Nouvelle référence de ligne + + + + Old row reference + Anncienne référence de ligne + + + + New table name + Nouveau nom de table + + + + New index name + Nouveau nom d'index + + + + New view name + Nouveau nom de vue + + + + New trigger name + Nouveau nom de déclencheur + + + + Table or column alias + Table ou alias colonne + + + + transaction name + Nom de transaction + + + + New column name + Nouveau nom de colonne + + + + Column data type + Type de données de la colonne + + + + Constraint name + Nom de la contrainte + + + + Error message + Message d'erreur + + + + Collation name + Nom de la collation + + + + Any word + N'importe quel mot + + + + Default database + Base de données par défaut + + + + Temporary objects database + Objets temporaires de base de données + + + + DbManagerImpl + + + Could not add database %1: %2 + Impossible d'ajouter une base de données %1: %2 + + + + Database %1 could not be updated, because of an error: %2 + La base de données %1 ne peut ëtre mise à jour à cause de l'erreur: %2 + + + + + Database file doesn't exist. + Le fichier de la base de données n'existe pas. + + + + + + No supporting plugin loaded. + Aucun plugin supporté chargé. + + + + Database could not be initialized. + La base de données ne peut être initialisée. + + + + No suitable database driver plugin found. + Aucun pilote de base de données approprié trouvé. + + + + DbObjectOrganizer + + + + Error while creating table in target database: %1 + Erreur lors de la creation de la table de la base de données: %1 + + + + Could not parse table. + Impossible d'analyser la table. + + + + 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. + La base de données %1 ne peut être attachée à la base de données %2, aussi les données de la table %3 seront copiées avec SQLiteStudio comme interpréteur. Cette méthode est lente pour des tables importantes, SVP soyer patient. + + + + Error while copying data for table %1: %2 + Erreur lors de la copie des données vers la table %1: %2 + + + + + + Error while copying data to table %1: %2 + Erreur lors de la copie des données de la table %1: %2 + + + + Error while dropping source view %1: %2 +Tables, indexes, triggers and views copied to database %3 will remain. + 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. + + + + Error while creating view in target database: %1 + Erreur lors de la création de la vue de la base de données:%1 + + + + Error while creating index in target database: %1 + Erreur lors de la création de l'index de la base de données:%1 + + + + Error while creating trigger in target database: %1 + Erreur lors de la création du déclencheur de la base de données:%1 + + + + DbVersionConverter + + + Target file exists, but could not be overwritten. + Le fichier cible existe, mais ne peut être remplacé. + + + + Could not find proper database plugin to create target database. + Impossible de trouver le plugin correct pour créer la base de données cible. + + + + Error while converting database: %1 + Erreur lors de la conversion de la base de données: %1 + + + + DdlHistoryModel + + + Database name + ddl history header + Nom de la base + + + + Database file + ddl history header + Fichier de la base + + + + Date of execution + ddl history header + Date d'exécution + + + + Changes + ddl history header + Modifications + + + + ExportManager + + + Export plugin %1 doesn't support exporing query results. + Plugin d'export %1 ne supporte pas l'exportation de la requête. + + + + Export plugin %1 doesn't support exporing tables. + Plugin d'export %1 ne supporte pas l'exportation de la table. + + + + Export plugin %1 doesn't support exporing databases. + Plugin d'export %1 ne supporte pas l'exportation de la base de données. + + + + Export format '%1' is not supported. Supported formats are: %2. + Format d'export %1 n'est pas supporté. Les formats supportés sont: %2. + + + + Export to the clipboard was successful. + Export vers le presse-papier avec succés. + + + + Export to the file '%1' was successful. + Export vers le fichier '%1' avec succès. + + + + Export was successful. + Export avec succès. + + + + Could not export to file %1. File cannot be open for writting. + Impossible d'exporter vers le fichier '%1'. Le fichier ne peut être ouvert en écriture. + + + + ExportWorker + + + Error while exporting query results: %1 + Erreur lors de l'exportation des résultats de la requête:%1 + + + + Error while counting data column width to export from query results: %1 + Erreur lors de la totalisation des données de colonne issu de la requête: %1 + + + + + Could not parse %1 in order to export it. It will be excluded from the export output. + Impossible d'analyser %1 afin de l'exporter. Celle-ci sera excluse de l'exportation. + + + + Error while reading data to export from table %1: %2 + Erreur lors de la lecture des données à exporter de la table %1: %2 + + + + Error while counting data to export from table %1: %2 + Erreur lors du comptage des données à exporter de la table %1: %2 + + + + Error while counting data column width to export from table %1: %2 + Erreur lors de la totalisation des données à exporter de la table %1: %2 + + + + FunctionManagerImpl + + + Invalid number of arguments to function '%1'. Expected %2, but got %3. + Nombre de paramètres invalide de la fonction%1. Attendu %2, obtenu %3. + + + + No such function registered in SQLiteStudio: %1(%2) + Fonction inconnue avec SQLiteStudio: %1(%2) + + + + Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded. + La fonction %1(%2) est référencée avec le langage %3, mais le plugin supportant ce langage n'est actuellement pas chargé. + + + + Invalid regular expression pattern: %1 + Expression invalide: %1 + + + + + Could not open file %1 for reading: %2 + Impossible d'ouvrir en lecture le ficher %1:%2 + + + + Could not open file %1 for writting: %2 + Impossible d'ouvrir en écriture le ficher %1:%2 + + + + Error while writting to file %1: %2 + Erreur lors de l'écriture du fichier %1:%2 + + + + Unsupported scripting language: %1 + Langage script non supporté: %1 + + + + GenericExportPlugin + + + Could not initialize text codec for exporting. Using default codec: %1 + Impossible d'initialiser le paramètre texte por l'export. Utulisation du paramètre par défaut: %1 + + + + ImportManager + + + Imported data to the table '%1' successfully. + Importation des données de la table '%1' réussie. + + + + ImportWorker + + + No columns provided by the import plugin. + Aucune colonne fournie par le plugin d'importation. + + + + Could not start transaction in order to import a data: %1 + Impossible d'initialiser la transaction d'import de données: %1 + + + + Could not commit transaction for imported data: %1 + Impossible d'enregistrer la transaction d'import de données: %1 + + + + Table '%1' has less columns than there are columns in the data to be imported. Excessive data columns will be ignored. + La table %1 a moins de colonnes que de données à importer. Les colonnes supplèmentaires seront ignorées. + + + + Table '%1' has more columns than there are columns in the data to be imported. Some columns in the table will be left empty. + La table %1 a plus de colonnes que de colonnes de données à importer. Certaines colonnes de la table seront vides. + + + + Could not create table to import to: %1 + Impossible de créer la table d'import: %1 + + + + + + Error while importing data: %1 + Erreur lors de l'import des données: %1 + + + + + Interrupted. + import process status update + Transaction interrompue. + + + + PluginManagerImpl + + + Cannot load plugin %1, because it's in conflict with plugin %2. + Chargement impossible du plugin %1 celui-ci est en conflit avec le plugin %2. + + + + Cannot load plugin %1, because its dependency was not loaded: %2. + Chargement impossible du plugin %1, les dépendances n'ont pa été chargées: %2. + + + + Cannot load plugin %1. Error details: %2 + Chargement impossible du plugin %1, Détails de l'erreur: %2 + + + + Cannot load plugin %1 (error while initializing plugin). + Chargement impossible du plugin %1 (erreur à initialisation du plugin). + + + + min: %1 + plugin dependency version + min %1 + + + + max: %1 + plugin dependency version + max %1 + + + + PopulateConstant + + + Constant + populate constant plugin name + Constante + + + + PopulateConstantConfig + + + Constant value: + Valeur constante: + + + + PopulateDictionary + + + Dictionary + dictionary populating plugin name + Dictionnaire + + + + PopulateDictionaryConfig + + + Dictionary file + Fichier du dictionnaire + + + + Pick dictionary file + Extrait du dictionnaire + + + + Word separator + Mot séparateur + + + + Whitespace + Espace + + + + Line break + Fin de ligne + + + + Method of using words + Méthode d'utilisation des mots + + + + Ordered + Trié + + + + Randomly + Aléatoire + + + + PopulateManager + + + Table '%1' populated successfully. + Table '%1' remplie avec succès. + + + + PopulateRandom + + + Random number + Nombre aléatoire + + + + PopulateRandomConfig + + + Constant prefix + Préfixe constant + + + + No prefix + Aucun préfixe + + + + Minimum value + Valeur minimale + + + + Maximum value + Valeur maximale + + + + Constant suffix + Suffixe constant + + + + No suffix + Aucun suffixe + + + + PopulateRandomText + + + Random text + Text aléatoire + + + + PopulateRandomTextConfig + + + Use characters from common sets: + Utilisez des caractères de la table standard: + + + + Minimum length + Longueur minimun + + + + Letters from a to z. + Caractères de a à z. + + + + Alpha + Caractère alpha + + + + Numbers from 0 to 9. + Carctères numériques de 0 à 9. + + + + Numeric + Numérique + + + + A whitespace, a tab and a new line character. + Espace, tabulation et retour chariot. + + + + Whitespace + Espace + + + + Includes all above and all others. + Inclus ci dessus et tous les autres. + + + + Binary + Binaire + + + + Use characters from my custom set: + Utilisez les catactères de ma table personalisée: + + + + Maximum length + Longueur maximum + + + + If you type some character multiple times, it's more likely to be used. + Si vous saisissez plusieurs fois le même caractère, la sécurité est faible. + + + + PopulateScript + + + Script + Script + + + + PopulateScriptConfig + + + Initialization code (optional) + Code d'initialisation (optionel) + + + + Per step code + Code par étape + + + + Language + Langage + + + + Help + Aide + + + + PopulateSequence + + + Sequence + Séquence + + + + PopulateSequenceConfig + + + Start value: + Valeur de départ: + + + + Step: + Incrément: + + + + PopulateWorker + + + Could not start transaction in order to perform table populating. Error details: %1 + Impossible d'initialiser la transaction pour remplir la table.Détails de l'erreur %1 + + + + Error while populating table: %1 + Erreur lors du remplissage de la table: %1 + + + + Could not commit transaction after table populating. Error details: %1 + Impossible d'enregistrer la transaction après le remplissage de la table. Erreur %1 + + + + QObject + + + + Could not open database: %1 + Impossible d'ouvrir la base de données: %1 + + + + + Result set expired or no row available. + Terminé ou aucune ligne valide. + + + + Could not close database: %1 + Impossible de clore la base de bonnées: %1 + + + + + + + + + + SQLite %1 does not support '%2' statement. + SQLite %1 ne supporte pas l'instruction '%2'. + + + + SQLite %1 does not support '%2' statement, but the regular table can be created instead if you proceed. + SQLite %1 ne supporte pas l'instruction '%2', mais la table normale peut être créée à la place si vous confirmez. + + + + Could not parse statement: %1 +Error details: %2 + Impossible d'analyser l'instruction: %1 +Détails erreur: %2 + + + + + + + SQLite %1 does not support the '%2' clause. Cannot convert '%3' statement with that clause. + SQLite %1 ne supporte pas la clause '%2'. Impossible de convertir l'instruction '%3' avec cette clause. + + + + SQLite %1 does not support the '%2' clause in the '%3' statement. + SQLite %1 ne supporte pas la clause '%2' de l'instruction '%3'. + + + + SQLite %1 does not support current date or time clauses in expressions. + SQLite %1 ne supporte pas la clause date ou l'heure actuelle dans l'expression. + + + + + + SQLite %1 does not support '%2' clause in expressions. + SQLite %1 ne supporte pas la clause '%2' dans l'expression. + + + + Could not attach database %1: %2 + Impossible d'attacher la base de données %1: %2 + + + + + Incomplete query. + Requête imcomplète. + + + + + Parser stack overflow + Analyse dépassement pile + + + + + Syntax error + Erreur de syntaxe + + + + Could not open dictionary file %1 for reading. + Impossible d'ouvrir en lecture le fichier dictionnaire %1. + + + + Dictionary file must exist and be readable. + Le fichier dictionnaire doit exister et être en lecture. + + + + Maximum value cannot be less than minimum value. + La valeur maximum ne peut être inférieure à la valeur minimum. + + + + Maximum length cannot be less than minimum length. + Longueur maximum ne peut être inférieure à la longueur minimum. + + + + Custom character set cannot be empty. + La table des caractères personalisés ne peut être vide. + + + + Could not find plugin to support scripting language: %1 + Impossible de trouver le plugin supportant le script: %1 + + + + Error while executing populating initial code: %1 + Erreur à l'initialisation du code de remplissage: %1 + + + + Error while executing populating code: %1 + Erreur à l'exécution du code de remplissage: %1 + + + + Select implementation language. + Sélectionnez l'application langage. + + + + Implementation code cannot be empty. + L'application de code ne peut être vide. + + + + Could not resolve data source for column: %1 + Impossible de résoudre la source de données pour la colonnes: %1 + + + + 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. + Impossible d'initialiser le fichier de configuration. Aucune modification et les requêtes seront perdues après redémarrage. Essayez d'initialiser le fichier avec cette localisation: %1. + + + + General purpose + plugin category name + Objectif général + + + + Database support + plugin category name + Support base de données + + + + Code formatter + plugin category name + Format code + + + + Scripting languages + plugin category name + Langages script + + + + Exporting + plugin category name + Export + + + + Importing + plugin category name + Import + + + + Table populating + plugin category name + Peuplement de la table + + + + 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. + 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'analyse DDL de la table %3. + + + + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. + Toutes les colonnes indéxées par l'indexe %1 sont faites. L'indexe ne sera pas recréé après la modification de la table. + + + + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. + + + + + Cannot not update trigger %1 according to table %2 modification. + Impossible de mettre à jour le déclencheur%1 selon la modification de la table %2. + + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + 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. + + + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. + Impossible de mettre à jour les modifications de la vue %1 issue de la table %2 +La vue restera telque. + + + + + + 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. + 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. + + + + Could not parse DDL of the view to be created. Details: %1 + Impossible d'analyser le DDL de création de vue. Détails: %1 + + + + Parsed query is not CREATE VIEW. It's: %1 + L'expression CREATE VIEW est fausse. C'est: %1 + + + + SQLiteStudio was unable to resolve columns returned by the new view, therefore it won't be able to tell which triggers might fail during the recreation process. + 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. + + + + QueryExecutor + + + Execution interrupted. + Exécution interrompue. + + + + Database is not open. + La base de données n'est ouverte. + + + + Only one query can be executed simultaneously. + Une seule requête peut être exécutée à la fois. + + + + + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 + 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 + + + + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. + SQLiteStudio ne peut extraire des métadonnées d'une requête. Les résultats ne peut être affichés. + + + + ScriptingQtDbProxy + + + No database available in current context, while called QtScript's %1 command. + Aucune base de données validedans le context actuel, plutôtutiliser la commande QtScript %1. + + + + Error from %1: %2 + Erreur de %1: %2 + + + + SqlHistoryModel + + + Database + sql history header + Base de données + + + + Execution date + sql history header + Date d'exécution + + + + Time spent + sql history header + Temps passé + + + + Rows affected + sql history header + Lignes affectées + + + + SQL + sql history header + SQL + + + + UpdateManager + + + An error occurred while checking for updates: %1. + Une erreur est apparue lors du contrôle pour la mise à jour:%1. + + + + + Could not check available updates, because server responded with invalid message format. It is safe to ignore this warning. + Impossible de vérifier la mise à jour, car le serveur a répondu avec un message invalide. Il est possible d'ignorer le warning. + + + + An error occurred while reading updates metadata: %1. + Erreur lors de la lecture de mise des méta données: %1. + + + + Could not download updates, because server responded with invalid message format. You can try again later or download and install updates manually. See <a href="%1">User Manual</a> for details. + Impossibles de télécharger les mises à jour, car le serveur répond avec un format de message invalide. Vous pover essayer plus tard ou télécharger et mettre à jour manuellement. Voir <a href="%1">User Manual</a> for details. + + + + Could not create temporary directory for downloading the update. Updating aborted. + Impossible de créer un répertoire temporaire pour télécharger la mise à jour. Mise à jour abandonnée. + + + + There was no updates to download. Updating aborted. + Il n'y a aucune mise à jour à télécharger. Mise à jour abandonnée. + + + + Downloading: %1 + Téléchargement: %1 + + + + Could not determinate file name from update URL: %1. Updating aborted. + Impossible de déterminer le fichier de mise à jour URL: %1.Mise à jour abandonnée. + + + + Failed to open file '%1' for writting: %2. Updating aborted. + Erreur à l'ouverture du fichier %1 pour l'écriture: %2. Mise à jour abandonnée. + + + + Installing updates. + Installation des mises jour. + + + + Could not copy current application directory into %1 directory. + Impossible de copier le répertoire de l'application courante dans %1. + + + + Could not create directory %1. + Impossible de créer le répertoire: %1. + + + + Could not rename directory %1 to %2. +Details: %3 + Impossible de renommer le répertoire %1 en %2. Détails: %3 + + + + Cannot not rename directory %1 to %2. +Details: %3 + Impossible de renommer le répertoire %1 en %2.Détails: %3 + + + + Could not move directory %1 to %2 and also failed to restore original directory, so the original SQLiteStudio directory is now located at: %3 + 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 + + + + Could not rename directory %1 to %2. Rolled back to the original SQLiteStudio version. + Impossible de renommer le répertoire %1 en %2, retour vers la version originale SQLiteStudio. + + + + Could not unpack component %1 into %2 directory. + Impossible d'extraire le composant %1 dans le répertoire %2. + + + + Could not find permissions elevator application to run update as a root. Looked for: %1 + Impossible d'élever les autorisations pour lancer la mise à jour en tantque root. Bloqué: %1 + + + + Could not execute final updating steps as root: %1 + Impossible de finaliser la mis à jour en tant que root: %1 + + + + + + + Could not execute final updating steps as admin: %1 + Impossible de finaliser la mis à jour en tant que admin: %1 + + + + Cannot create temporary directory for updater. + Impossible de créer un répertoire temporaire pour la mise à jour. + + + + Cannot create updater script file. + impossible de créer le fichier du scripte de mise à jour. + + + + Updating canceled. + Mise à jour suspendue. + + + + Could not execute final updating steps as administrator. + Impossible de finaliser la mis à jour en tant qu'administrateur. + + + + Could not execute final updating steps as administrator. Updater startup timed out. + Impossible de finaliser la mis à jour en tant qu'administrateur. Délai d'attente de lancement dépassé. + + + + Could not execute final updating steps as administrator. Updater operation timed out. + Impossible de finaliser la mis à jour en tant qu'administrateur. Délai d'attente d'opération dépassé. + + + + Could not clean up temporary directory %1. You can delete it manually at any time. + Impossible de nettoyer le répertoire temporaire %1. Vous pouver le supprimer manuellement plutard. + + + + Could not run new version for continuing update. + Impossible de lancer la nouvelle version afin de continuer la mise à jour. + + + + Package not in tar.gz format, cannot install: %1 + Installation impossible un paquet n'est pas au format tar.zg: %1 + + + + Package %1 cannot be installed, because cannot move it to directory: %2 + Le paquet %1 ne peut être installé, celui-ci ne pouvant déplacé dans le répertoire: %2 + + + + Package %1 cannot be installed, because cannot unpack it: %2 + Le paquet %1 ne peut être installé, celui-ci ne pouvant décompressé: %2 + + + + Package not in zip format, cannot install: %1 + Installation impossible, un paquet est manquant: %1 + + + + Package %1 cannot be installed, because cannot unzip it to directory %2: %3 + Le paquet %1 ne peut être installé, celui-ci ne pouvant décompressé dans le répertoire %2: %3 + + + + Package %1 cannot be installed, because cannot unzip it to directory: %2 + Le paquet %1 ne peut être installé, celui-ci ne pouvant décompressé dans le répertoire: %2 + + + + + Could not rename directory %1 to %2. + Impossible de renommer le répertoire %1 en %2. + + + + Could not delete directory %1. + Impossible de supprimer le répertoire %1. + + + + Error executing update command: %1 +Error message: %2 + Erreur d'exécution de la commande de mise à jour: %1 +Message d'erreur: %2 + + + + An error occurred while downloading updates: %1. Updating aborted. + Erreur lors du téléchargement de la mise à jour: %1. Mise à jour abandonnée. + + + diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm index 8011cf1..8d09cfa 100644 Binary files a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts index dc64023..9ca5ff5 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts @@ -5,12 +5,12 @@ AbstractDb - + Cannot execute query on closed database. Nie można wykonać zapytania na zamkniÄ™tej bazie danych. - + Error attaching database %1: %2 Błąd podczas dołączania bazy danych %1: %2 @@ -142,35 +142,35 @@ DbManagerImpl - + Could not add database %1: %2 Nie udaÅ‚o siÄ™ dodać bazÄ™ danych %1: %2 - + Database %1 could not be updated, because of an error: %2 Nie udaÅ‚o siÄ™ zaktualizować baza danych %1 z powodu błędu: %2 - - + + Database file doesn't exist. Plik bazy danych nie istnieje. - - - + + + No supporting plugin loaded. Nie zaÅ‚adowano obsÅ‚ugujÄ…cej wtyczki. - + Database could not be initialized. Nie udaÅ‚o siÄ™ zainicjalizować bazy danych. - + No suitable database driver plugin found. Nie znaleziono odpowiedniej wtyczki sterownika. @@ -830,14 +830,14 @@ Szczegóły błędu: %2 Niekompletne zapytanie. - - + + Parser stack overflow Przeciążenie stosu analizatora. - - + + Syntax error Błąd skÅ‚adni @@ -897,7 +897,7 @@ Szczegóły błędu: %2 Nie znaleziono źródÅ‚a danych dla kolumny: %1 - + 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. 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. @@ -944,36 +944,41 @@ Szczegóły błędu: %2 Zaludnianie tabel - + 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. Tabela %1 odwoÅ‚uje siÄ™ do tabeli %2, ale definicja klucza obcego nie zostanie zaktualizowane dla definicji nowej tabeli w zwiÄ…zku z problemami przy analizowaniu DDL tabeli %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. Wszystkie kolumny indeksowane przez indeks %1 już nie istniejÄ…. Indeks ten nie bÄ™dzie odtworzony po modyfikacji tabeli. - + + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. + WystÄ…piÅ‚ problem z poprawnym przetworzeniem wyzwalacza %1. Może on zostać zaktualizowany tylko częściowo i bÄ™dzie wymagaÅ‚ twojej uwagi. + + + Cannot not update trigger %1 according to table %2 modification. Nie można zaktualizować wyzwalacza %1 zgodnie z modyfikacjami tabeli %2. - + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. Wszystkie kolumny obsÅ‚ugiwane przez wyzwalacz %1 już nie istniejÄ…. Wyzwalacz ten nie bÄ™dzie odtworzony po modyfikacji tabeli. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. Nie można zaktualizować widoku %1 w zwiÄ…zku z modyfikacjami tabeli %2. Widok pozostanie nienaruszony. - - - + + + 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. Jest problem ze zaktualizowaniem zapytania %1 w wyzwalaczu %2. Jedeno z podzapytaÅ„ SELECT, które może odwoÅ‚ywać siÄ™ do tabeli %2 nie może być poprawnie zmodyfikowane. RÄ™czna aktualizacja tego wyzwalacza może być niezbÄ™dna. @@ -993,19 +998,19 @@ Widok pozostanie nienaruszony. SQLiteStudio nie byÅ‚o w stanie okreÅ›lić kolumn zwracanych przez nowy widok, w zwiÄ…zku z czym nie może okreÅ›lić które wyzwalacze mogÄ… siÄ™ nie powieść podczas procesu odtwarzania. - - + + Could not open database: %1 Nie udaÅ‚o siÄ™ otworzyć bazy danych: %1 - + Could not close database: %1 Nie udaÅ‚o siÄ™ zamknąć bazy danych: %1 - - + + Result set expired or no row available. Wyniki zapytania sÄ… nieaktualne, lub nie ma dostÄ™pnych wierszy. @@ -1020,28 +1025,28 @@ Widok pozostanie nienaruszony. QueryExecutor - + Execution interrupted. Wykonywanie przerwane. - + Database is not open. Baza danych nie jest otwarta. - + Only one query can be executed simultaneously. Tylko jedno zapytanie może być wykonywane w danym momencie. - - + + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 WystÄ…piÅ‚ błąd podczas wykonywania zapytania count(*), przez co stronicowanie danych bÄ™dzie wyłączone. Szczegóły błędy z bazy danych: %1 - + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. SQLiteStudio nie mogÅ‚o uzyskać metadanych z zapytania. Nie bÄ™dzie można edytować wyników zapytania. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.qm new file mode 100644 index 0000000..c02994c Binary files /dev/null and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts new file mode 100644 index 0000000..5c08361 --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts @@ -0,0 +1,1278 @@ + + + + + AbstractDb + + + + Cannot execute query on closed database. + + + + + Error attaching database %1: %2 + + + + + BugReporter + + + Invalid login or password + + + + + ChainExecutor + + + The database for executing queries was not defined. + chain executor + + + + + The database for executing queries was not open. + chain executor + + + + + Could not start a database transaction. Details: %1 + chain executor + + + + + Interrupted + chain executor + + + + + Could not commit a database transaction. Details: %1 + chain executor + + + + + CompletionHelper + + + New row reference + + + + + Old row reference + + + + + New table name + + + + + New index name + + + + + New view name + + + + + New trigger name + + + + + Table or column alias + + + + + transaction name + + + + + New column name + + + + + Column data type + + + + + Constraint name + + + + + Error message + + + + + Collation name + + + + + Any word + + + + + Default database + + + + + Temporary objects database + + + + + DbManagerImpl + + + Could not add database %1: %2 + + + + + Database %1 could not be updated, because of an error: %2 + + + + + + Database file doesn't exist. + + + + + + + No supporting plugin loaded. + + + + + Database could not be initialized. + + + + + No suitable database driver plugin found. + + + + + DbObjectOrganizer + + + + Error while creating table in target database: %1 + + + + + Could not parse table. + + + + + 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. + + + + + Error while copying data for table %1: %2 + + + + + + + Error while copying data to table %1: %2 + + + + + Error while dropping source view %1: %2 +Tables, indexes, triggers and views copied to database %3 will remain. + + + + + Error while creating view in target database: %1 + + + + + Error while creating index in target database: %1 + + + + + Error while creating trigger in target database: %1 + + + + + DbVersionConverter + + + Target file exists, but could not be overwritten. + + + + + Could not find proper database plugin to create target database. + + + + + Error while converting database: %1 + + + + + DdlHistoryModel + + + Database name + ddl history header + + + + + Database file + ddl history header + + + + + Date of execution + ddl history header + + + + + Changes + ddl history header + + + + + ExportManager + + + Export plugin %1 doesn't support exporing query results. + + + + + Export plugin %1 doesn't support exporing tables. + + + + + Export plugin %1 doesn't support exporing databases. + + + + + Export format '%1' is not supported. Supported formats are: %2. + + + + + Export to the clipboard was successful. + + + + + Export to the file '%1' was successful. + + + + + Export was successful. + + + + + Could not export to file %1. File cannot be open for writting. + + + + + ExportWorker + + + Error while exporting query results: %1 + + + + + Error while counting data column width to export from query results: %1 + + + + + + Could not parse %1 in order to export it. It will be excluded from the export output. + + + + + Error while reading data to export from table %1: %2 + + + + + Error while counting data to export from table %1: %2 + + + + + Error while counting data column width to export from table %1: %2 + + + + + FunctionManagerImpl + + + Invalid number of arguments to function '%1'. Expected %2, but got %3. + + + + + No such function registered in SQLiteStudio: %1(%2) + + + + + Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded. + + + + + Invalid regular expression pattern: %1 + + + + + + Could not open file %1 for reading: %2 + + + + + Could not open file %1 for writting: %2 + + + + + Error while writting to file %1: %2 + + + + + Unsupported scripting language: %1 + + + + + GenericExportPlugin + + + Could not initialize text codec for exporting. Using default codec: %1 + + + + + ImportManager + + + Imported data to the table '%1' successfully. + + + + + ImportWorker + + + No columns provided by the import plugin. + + + + + Could not start transaction in order to import a data: %1 + + + + + Could not commit transaction for imported data: %1 + + + + + Table '%1' has less columns than there are columns in the data to be imported. Excessive data columns will be ignored. + + + + + Table '%1' has more columns than there are columns in the data to be imported. Some columns in the table will be left empty. + + + + + Could not create table to import to: %1 + + + + + + + Error while importing data: %1 + + + + + + Interrupted. + import process status update + + + + + PluginManagerImpl + + + Cannot load plugin %1, because it's in conflict with plugin %2. + + + + + Cannot load plugin %1, because its dependency was not loaded: %2. + + + + + Cannot load plugin %1. Error details: %2 + + + + + Cannot load plugin %1 (error while initializing plugin). + + + + + min: %1 + plugin dependency version + + + + + max: %1 + plugin dependency version + + + + + PopulateConstant + + + Constant + populate constant plugin name + + + + + PopulateConstantConfig + + + Constant value: + + + + + PopulateDictionary + + + Dictionary + dictionary populating plugin name + + + + + PopulateDictionaryConfig + + + Dictionary file + + + + + Pick dictionary file + + + + + Word separator + + + + + Whitespace + + + + + Line break + + + + + Method of using words + + + + + Ordered + + + + + Randomly + + + + + PopulateManager + + + Table '%1' populated successfully. + + + + + PopulateRandom + + + Random number + + + + + PopulateRandomConfig + + + Constant prefix + + + + + No prefix + + + + + Minimum value + + + + + Maximum value + + + + + Constant suffix + + + + + No suffix + + + + + PopulateRandomText + + + Random text + + + + + PopulateRandomTextConfig + + + Use characters from common sets: + + + + + Minimum length + + + + + Letters from a to z. + + + + + Alpha + + + + + Numbers from 0 to 9. + + + + + Numeric + + + + + A whitespace, a tab and a new line character. + + + + + Whitespace + + + + + Includes all above and all others. + + + + + Binary + + + + + Use characters from my custom set: + + + + + Maximum length + + + + + If you type some character multiple times, it's more likely to be used. + + + + + PopulateScript + + + Script + + + + + PopulateScriptConfig + + + Initialization code (optional) + + + + + Per step code + + + + + Language + + + + + Help + + + + + PopulateSequence + + + Sequence + + + + + PopulateSequenceConfig + + + Start value: + + + + + Step: + + + + + PopulateWorker + + + Could not start transaction in order to perform table populating. Error details: %1 + + + + + Error while populating table: %1 + + + + + Could not commit transaction after table populating. Error details: %1 + + + + + QObject + + + + Could not open database: %1 + + + + + + Result set expired or no row available. + + + + + Could not close database: %1 + + + + + + + + + + + SQLite %1 does not support '%2' statement. + + + + + SQLite %1 does not support '%2' statement, but the regular table can be created instead if you proceed. + + + + + Could not parse statement: %1 +Error details: %2 + + + + + + + + SQLite %1 does not support the '%2' clause. Cannot convert '%3' statement with that clause. + + + + + SQLite %1 does not support the '%2' clause in the '%3' statement. + + + + + SQLite %1 does not support current date or time clauses in expressions. + + + + + + + SQLite %1 does not support '%2' clause in expressions. + + + + + Could not attach database %1: %2 + + + + + + Incomplete query. + + + + + + Parser stack overflow + + + + + + Syntax error + + + + + Could not open dictionary file %1 for reading. + + + + + Dictionary file must exist and be readable. + + + + + Maximum value cannot be less than minimum value. + + + + + Maximum length cannot be less than minimum length. + + + + + Custom character set cannot be empty. + + + + + Could not find plugin to support scripting language: %1 + + + + + Error while executing populating initial code: %1 + + + + + Error while executing populating code: %1 + + + + + Select implementation language. + + + + + Implementation code cannot be empty. + + + + + Could not resolve data source for column: %1 + + + + + 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. + + + + + General purpose + plugin category name + + + + + Database support + plugin category name + + + + + Code formatter + plugin category name + + + + + Scripting languages + plugin category name + + + + + Exporting + plugin category name + + + + + Importing + plugin category name + + + + + Table populating + plugin category name + + + + + 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. + + + + + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. + + + + + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. + + + + + Cannot not update trigger %1 according to table %2 modification. + + + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. + + + + + + + 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. + + + + + Could not parse DDL of the view to be created. Details: %1 + + + + + Parsed query is not CREATE VIEW. It's: %1 + + + + + SQLiteStudio was unable to resolve columns returned by the new view, therefore it won't be able to tell which triggers might fail during the recreation process. + + + + + QueryExecutor + + + Execution interrupted. + + + + + Database is not open. + + + + + Only one query can be executed simultaneously. + + + + + + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 + + + + + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. + + + + + ScriptingQtDbProxy + + + No database available in current context, while called QtScript's %1 command. + + + + + Error from %1: %2 + + + + + SqlHistoryModel + + + Database + sql history header + + + + + Execution date + sql history header + + + + + Time spent + sql history header + + + + + Rows affected + sql history header + + + + + SQL + sql history header + + + + + UpdateManager + + + An error occurred while checking for updates: %1. + + + + + Could not check available updates, because server responded with invalid message format. It is safe to ignore this warning. + + + + + An error occurred while reading updates metadata: %1. + + + + + Could not download updates, because server responded with invalid message format. You can try again later or download and install updates manually. See <a href="%1">User Manual</a> for details. + + + + + Could not create temporary directory for downloading the update. Updating aborted. + + + + + There was no updates to download. Updating aborted. + + + + + Downloading: %1 + + + + + Could not determinate file name from update URL: %1. Updating aborted. + + + + + Failed to open file '%1' for writting: %2. Updating aborted. + + + + + Installing updates. + + + + + Could not copy current application directory into %1 directory. + + + + + Could not create directory %1. + + + + + Could not rename directory %1 to %2. +Details: %3 + + + + + Cannot not rename directory %1 to %2. +Details: %3 + + + + + Could not move directory %1 to %2 and also failed to restore original directory, so the original SQLiteStudio directory is now located at: %3 + + + + + Could not rename directory %1 to %2. Rolled back to the original SQLiteStudio version. + + + + + Could not unpack component %1 into %2 directory. + + + + + Could not find permissions elevator application to run update as a root. Looked for: %1 + + + + + Could not execute final updating steps as root: %1 + + + + + + + + Could not execute final updating steps as admin: %1 + + + + + Cannot create temporary directory for updater. + + + + + Cannot create updater script file. + + + + + Updating canceled. + + + + + Could not execute final updating steps as administrator. + + + + + Could not execute final updating steps as administrator. Updater startup timed out. + + + + + Could not execute final updating steps as administrator. Updater operation timed out. + + + + + Could not clean up temporary directory %1. You can delete it manually at any time. + + + + + Could not run new version for continuing update. + + + + + Package not in tar.gz format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot move it to directory: %2 + + + + + Package %1 cannot be installed, because cannot unpack it: %2 + + + + + Package not in zip format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot unzip it to directory %2: %3 + + + + + Package %1 cannot be installed, because cannot unzip it to directory: %2 + + + + + + Could not rename directory %1 to %2. + + + + + Could not delete directory %1. + + + + + Error executing update command: %1 +Error message: %2 + + + + + An error occurred while downloading updates: %1. Updating aborted. + + + + diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm new file mode 100644 index 0000000..0b3d737 Binary files /dev/null and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts new file mode 100644 index 0000000..6890ba9 --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts @@ -0,0 +1,1284 @@ + + + + + AbstractDb + + + + Cannot execute query on closed database. + Ðевозможно выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ñ€Ð¸ закрытой базе данных. + + + + Error attaching database %1: %2 + Ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных %1: %2 + + + + BugReporter + + + Invalid login or password + Ðеправильный логин или пароль + + + + ChainExecutor + + + The database for executing queries was not defined. + chain executor + Ðе указана база данных Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов. + + + + The database for executing queries was not open. + chain executor + Ðе открыта база данных Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов. + + + + Could not start a database transaction. Details: %1 + chain executor + Ðевозможно начать транзакцию. ПодробноÑти: %1 + + + + Interrupted + chain executor + Прервано + + + + Could not commit a database transaction. Details: %1 + chain executor + Ðевозможно завершить транзакцию. ПодробноÑти: %1 + + + + CompletionHelper + + + New row reference + ÐÐ¾Ð²Ð°Ñ ÑÑылка на Ñтроку + + + + Old row reference + Ð¡Ñ‚Ð°Ñ€Ð°Ñ ÑÑылка на Ñтроку + + + + New table name + Ðовое Ð¸Ð¼Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ + + + + New index name + Ðовое Ð¸Ð¼Ñ Ð¸Ð½Ð´ÐµÐºÑа + + + + New view name + + + + + New trigger name + Ðовое Ð¸Ð¼Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° + + + + Table or column alias + ПÑевдоним таблицы или Ñтолбца + + + + transaction name + Ð¸Ð¼Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ + + + + New column name + Ðовое Ð¸Ð¼Ñ Ñтолбца + + + + Column data type + Тип данных Ñтолбца + + + + Constraint name + Ð˜Ð¼Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ + + + + Error message + Сообщение об ошибке + + + + Collation name + Ð˜Ð¼Ñ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ + + + + Any word + Любое Ñлово + + + + Default database + База данных по умолчанию + + + + Temporary objects database + База данных временных объектов + + + + DbManagerImpl + + + Could not add database %1: %2 + Ðе удалоÑÑŒ добавить базу данных %1: %2 + + + + Database %1 could not be updated, because of an error: %2 + Ðевозможно обновить базу данных %1 из-за ошибки: %2 + + + + + Database file doesn't exist. + Файл базы данных не ÑущеÑтвует. + + + + + + No supporting plugin loaded. + Unclear error string. Checking the source didn't help. + Модуль поддержки не загружен. + + + + Database could not be initialized. + Ðевозможно инициализировать базу данных. + + + + No suitable database driver plugin found. + Ðе найден подходÑщий драйвер базы данных. + + + + DbObjectOrganizer + + + + Error while creating table in target database: %1 + Ошибка при Ñоздании таблицы в целевой базе данных: %1 + + + + Could not parse table. + Ðевозможно проанализировать Ñтруктуру таблицы. + + + + 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. + Ðевозможно приÑоединить базу данных %1 к базе данных %2, поÑтому данные таблицы %3 будут Ñкопированы при поÑредничеÑтве SQLiteStudio. Этот метод может быть медленным Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… таблиц, так что наберитеÑÑŒ терпениÑ. + + + + Error while copying data for table %1: %2 + Ошибка при копировании данных из таблицы %1: %2 + + + + + + Error while copying data to table %1: %2 + Ошибка при копировании данных в таблицу %1: %2 + + + + Error while dropping source view %1: %2 +Tables, indexes, triggers and views copied to database %3 will remain. + Ошибка при удалении иÑходного предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ %1: %2 +Таблицы, индекÑÑ‹, триггеры и предÑтавлениÑ, Ñкопированные в базу данных %3, ÑохранÑÑ‚ÑÑ. + + + + Error while creating view in target database: %1 + Ошибка при Ñоздании предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² целевой базе данных: %1 + + + + Error while creating index in target database: %1 + Ошибка при Ñоздании индекÑа в целевой базе данных: %1 + + + + Error while creating trigger in target database: %1 + Ошибка при Ñоздании триггера в целевой базе данных: %1 + + + + DbVersionConverter + + + Target file exists, but could not be overwritten. + Целевой файл ÑущеÑтвует, но не может быть перезапиÑан. + + + + Could not find proper database plugin to create target database. + Ðевозможно найти подходÑщий модуль Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð¹ базы данных. + + + + Error while converting database: %1 + Ошибка при конвертации базы данных: %1 + + + + DdlHistoryModel + + + Database name + ddl history header + Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных + + + + Database file + ddl history header + Файл базы данных + + + + Date of execution + ddl history header + Дата Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ + + + + Changes + ddl history header + Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ + + + + ExportManager + + + Export plugin %1 doesn't support exporing query results. + Модуль ÑкÑпорта %1 не поддерживает ÑкÑпорт результатов запроÑа. + + + + Export plugin %1 doesn't support exporing tables. + Модуль ÑкÑпорта %1 не поддерживает ÑкÑпорт таблиц. + + + + Export plugin %1 doesn't support exporing databases. + Модуль ÑкÑпорта %1 не поддерживает ÑкÑпорт баз данных. + + + + Export format '%1' is not supported. Supported formats are: %2. + Формат ÑкÑпорта %1 не поддерживаетÑÑ. Поддерживаемые форматы: %2 + + + + Export to the clipboard was successful. + ЭкÑпорт в буфер обмена уÑпешно выполнен. + + + + Export to the file '%1' was successful. + ЭкÑпорт в файл %1 уÑпешно выполнен. + + + + Export was successful. + ЭкÑпорт уÑпешно выполнен. + + + + Could not export to file %1. File cannot be open for writting. + Ðевозможно выполнить ÑкÑпорт в файл %1. Ðе удалоÑÑŒ открыть файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи. + + + + ExportWorker + + + Error while exporting query results: %1 + Ошибка при ÑкÑпорте результатов запроÑа: %1 + + + + Error while counting data column width to export from query results: %1 + Ошибка при подÑчёте ширины Ñтолбца данных Ð´Ð»Ñ ÑкÑпорта результатов запроÑа: %1 + + + + + Could not parse %1 in order to export it. It will be excluded from the export output. + Ðевозможно проанализировать Ñтруктуру %1. Данный объект будет иÑключён при выполнении ÑкÑпорта. + + + + Error while reading data to export from table %1: %2 + Ошибка при Ñчитывании данных Ð´Ð»Ñ ÑкÑпорта из таблицы %1: %2 + + + + Error while counting data to export from table %1: %2 + Ошибка при подÑчёте количеÑтва данных Ð´Ð»Ñ ÑкÑпорта из таблицы %1: %2 + + + + Error while counting data column width to export from table %1: %2 + Ошибка при подÑчёте ширины Ñтолбца данных Ð´Ð»Ñ ÑкÑпорта из таблицы %1: %2 + + + + FunctionManagerImpl + + + Invalid number of arguments to function '%1'. Expected %2, but got %3. + Ðеверное количеÑтво аргументов Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ '%1'. Ожидаемое количеÑтво: %2, передано: %3. + + + + No such function registered in SQLiteStudio: %1(%2) + Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ зарегиÑтрирована в SQLiteStudio: %1(%2) + + + + Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded. + Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ %1(%2) зарегиÑтрирована Ð´Ð»Ñ Ñзыка %3, однако модуль поддержки Ñтого Ñзыка на данный момент не загружен. + + + + Invalid regular expression pattern: %1 + Ðеверный шаблон регулÑрного выражениÑ: %1 + + + + + Could not open file %1 for reading: %2 + Ðевозможно открыть файл %1 Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %2 + + + + Could not open file %1 for writting: %2 + Ðевозможно открыть файл %1 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи: %2 + + + + Error while writting to file %1: %2 + Ошибка при запиÑи в файл %1: %2 + + + + Unsupported scripting language: %1 + Ðеподдерживаемый Ñкриптовый Ñзык: %1 + + + + GenericExportPlugin + + + Could not initialize text codec for exporting. Using default codec: %1 + Ðевозможно инициализировать текÑтовый кодек Ð´Ð»Ñ ÑкÑпорта. ИÑпользуетÑÑ ÐºÐ¾Ð´ÐµÐº по умолчанию: %1 + + + + ImportManager + + + Imported data to the table '%1' successfully. + Импорт данных в таблицу '%1' выполнен уÑпешно. + + + + ImportWorker + + + No columns provided by the import plugin. + Модуль импорта не обнаружил ни одного Ñтолбца. + + + + Could not start transaction in order to import a data: %1 + Ðевозможно начать транзакцию Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° данных: %1 + + + + Could not commit transaction for imported data: %1 + Ðевозможно завершить транзакцию Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… данных: %1 + + + + Table '%1' has less columns than there are columns in the data to be imported. Excessive data columns will be ignored. + Ð’ таблице '%1' Ñтолбцов меньше, чем в импортируемых данных. Лишние Ñтолбцы будут проигнорированы. + + + + Table '%1' has more columns than there are columns in the data to be imported. Some columns in the table will be left empty. + Ð’ таблице '%1' Ñтолбцов больше, чем в импортируемых данных. ÐедоÑтающие Ñтолбцы будут оÑтавлены пуÑтыми. + + + + Could not create table to import to: %1 + Ðевозможно Ñоздать таблицу Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°: %1 + + + + + + Error while importing data: %1 + Ошибка при импорте данных: %1 + + + + + Interrupted. + import process status update + Прервано. + + + + PluginManagerImpl + + + Cannot load plugin %1, because it's in conflict with plugin %2. + Ðевозможно загрузить модуль %1, так как он конфликтует Ñ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ %2. + + + + Cannot load plugin %1, because its dependency was not loaded: %2. + Ðевозможно загрузить модуль %1, так как не загружен необходимый ему модуль: %2. + + + + Cannot load plugin %1. Error details: %2 + Ðевозможно загрузить модуль %1. ПодробноÑти ошибки: %2 + + + + Cannot load plugin %1 (error while initializing plugin). + Ðевозможно загрузить модуль %1 (ошибка при инициализации модулÑ). + + + + min: %1 + plugin dependency version + минимальнаÑ: %1 + + + + max: %1 + plugin dependency version + макÑимальнаÑ: %1 + + + + PopulateConstant + + + Constant + populate constant plugin name + КонÑтанта + + + + PopulateConstantConfig + + + Constant value: + Значение конÑтанты: + + + + PopulateDictionary + + + Dictionary + dictionary populating plugin name + Словарь + + + + PopulateDictionaryConfig + + + Dictionary file + Файл ÑÐ»Ð¾Ð²Ð°Ñ€Ñ + + + + Pick dictionary file + Выберите файл ÑÐ»Ð¾Ð²Ð°Ñ€Ñ + + + + Word separator + Разделитель Ñлов + + + + Whitespace + Пробел + + + + Line break + ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ñтроки + + + + Method of using words + СпоÑоб иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñлов + + + + Ordered + По порÑдку + + + + Randomly + Случайным образом + + + + PopulateManager + + + Table '%1' populated successfully. + Таблица '%1' уÑпешно заполнена. + + + + PopulateRandom + + + Random number + Случайное чиÑло + + + + PopulateRandomConfig + + + Constant prefix + ÐŸÑ€ÐµÑ„Ð¸ÐºÑ ÐºÐ¾Ð½Ñтанты + + + + No prefix + Без префикÑа + + + + Minimum value + Минимальное значение + + + + Maximum value + МакÑимальное значение + + + + Constant suffix + Ð¡ÑƒÑ„Ñ„Ð¸ÐºÑ ÐºÐ¾Ð½Ñтанты + + + + No suffix + Без ÑуффикÑа + + + + PopulateRandomText + + + Random text + Случайный текÑÑ‚ + + + + PopulateRandomTextConfig + + + Use characters from common sets: + ИÑпользовать Ñимволы из Ñтандартных наборов: + + + + Minimum length + ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° + + + + Letters from a to z. + Буквы от a до z. + + + + Alpha + Буквенный + + + + Numbers from 0 to 9. + Цифры от 0 до 9. + + + + Numeric + Цифровой + + + + A whitespace, a tab and a new line character. + Пробел, табулÑÑ†Ð¸Ñ Ð¸ Ñимвол переноÑа Ñтроки. + + + + Whitespace + Ðепечатаемые Ñимволы + + + + Includes all above and all others. + Включает вÑе вышеперечиÑленные и вÑе оÑтальные. + + + + Binary + Бинарный + + + + Use characters from my custom set: + ИÑпользовать Ñимволы из моего набора: + + + + Maximum length + МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° + + + + If you type some character multiple times, it's more likely to be used. + При указании одного Ñимвола неÑколько раз, вероÑтноÑть его иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°ÐµÑ‚ÑÑ. + + + + PopulateScript + + + Script + Скрипт + + + + PopulateScriptConfig + + + Initialization code (optional) + Инициализирующий код (необÑзательно) + + + + Per step code + Код Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ шага + + + + Language + Язык + + + + Help + Помощь + + + + PopulateSequence + + + Sequence + ПоÑледовательноÑть + + + + PopulateSequenceConfig + + + Start value: + Ðачальное значение: + + + + Step: + Шаг: + + + + PopulateWorker + + + Could not start transaction in order to perform table populating. Error details: %1 + Ðевозможно начать транзакцию Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹. ПодробноÑти ошибки: %1 + + + + Error while populating table: %1 + Ошибка при заполнении таблицы: %1 + + + + Could not commit transaction after table populating. Error details: %1 + Ðевозможно завершить транзакцию поÑле Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹. ПодробноÑти ошибки: %1 + + + + QObject + + + + Could not open database: %1 + Ðевозможно открыть базу данных: %1 + + + + + Result set expired or no row available. + Ð ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð¸Ñ€ÑƒÑŽÑ‰Ð°Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ° уÑтарела или ни одна Ñтрока не доÑтупна. + + + + Could not close database: %1 + Ðевозможно закрыть базу данных: %1 + + + + + + + + + + SQLite %1 does not support '%2' statement. + SQLite %1 не поддерживает конÑтрукцию '%2'. + + + + SQLite %1 does not support '%2' statement, but the regular table can be created instead if you proceed. + SQLite %1 не поддерживает конÑтрукцию '%2', однако можно Ñоздать обычную таблицу, еÑли вы продолжите. + + + + Could not parse statement: %1 +Error details: %2 + Ðевозможно проанализировать Ñтруктуру конÑтрукции: %1 ПодробноÑти ошибки: %2 + + + + + + + SQLite %1 does not support the '%2' clause. Cannot convert '%3' statement with that clause. + SQLite %1 не поддерживает оператор '%2'. Ðевозможно Ñконвертировать конÑтрукцию '%3' Ñ Ñтим оператором. + + + + SQLite %1 does not support the '%2' clause in the '%3' statement. + SQLite %1 не поддерживает оператор '%2' в конÑтрукции '%3'. + + + + SQLite %1 does not support current date or time clauses in expressions. + SQLite %1 не поддерживает операторы текущей даты и текущего времени в выражениÑÑ…. + + + + + + SQLite %1 does not support '%2' clause in expressions. + SQLite %1 не поддерживает оператор '%2' в выражениÑÑ…. + + + + Could not attach database %1: %2 + Ðе удалоÑÑŒ приÑоединить базу данных %1: %2 + + + + + Incomplete query. + Ðезавершённый запроÑ. + + + + + Parser stack overflow + Переполнение Ñтека анализатора + + + + + Syntax error + СинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° + + + + Could not open dictionary file %1 for reading. + Ðевозможно открыть файл ÑÐ»Ð¾Ð²Ð°Ñ€Ñ %1 Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ. + + + + Dictionary file must exist and be readable. + Файл ÑÐ»Ð¾Ð²Ð°Ñ€Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑущеÑтвовать и быть доÑтупным Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ. + + + + Maximum value cannot be less than minimum value. + МакÑимальное значение не может быть меньше минимального. + + + + Maximum length cannot be less than minimum length. + МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° не может быть меньше минимальной. + + + + Custom character set cannot be empty. + Произвольный набор Ñимволов не может быть пуÑтым. + + + + Could not find plugin to support scripting language: %1 + Ðевозможно найти модуль поддержки Ñкриптового Ñзыка: %1 + + + + Error while executing populating initial code: %1 + Ошибка при выполнении инициализирующего кода заполнениÑ: %1 + + + + Error while executing populating code: %1 + Ошибка при выполнении кода заполнениÑ: %1 + + + + Select implementation language. + Выберите Ñзык реализации. + + + + Implementation code cannot be empty. + ЗаполнÑющий код не может быть пуÑтым. + + + + Could not resolve data source for column: %1 + Ðевозможно определить иÑточник данных Ð´Ð»Ñ Ñтолбца: %1 + + + + 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. + Ðевозможно инициализировать файл конфигурации. Любые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ и иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов будут утерÑны поÑле перезапуÑка приложениÑ. Попытки инициализации файла предпринималиÑÑŒ в Ñледующих меÑтах: %1. + + + + General purpose + plugin category name + Общего Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ + + + + Database support + plugin category name + Поддержка баз данных + + + + Code formatter + plugin category name + Форматирование кода + + + + Scripting languages + plugin category name + Скриптовые Ñзыки + + + + Exporting + plugin category name + ЭкÑпорт + + + + Importing + plugin category name + Импорт + + + + Table populating + plugin category name + Заполнение таблиц + + + + 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. + Таблица %1 ÑÑылаетÑÑ Ð½Ð° таблицу %2, но опиÑание внешнего ключа не будет обновлено Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ таблицы из-за проблем Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð¾Ð¼ DDL таблицы %3. + + + + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. + Ð’Ñе Ñтолбцы, проиндекÑированные индекÑом %1, удалены. Ð˜Ð½Ð´ÐµÐºÑ Ð½Ðµ будет воÑÑоздан поÑле модификации таблицы. + + + + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. + + + + + Cannot not update trigger %1 according to table %2 modification. + Ðевозможно обновить триггер %1 в ÑоответÑтвии Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸ÐµÐ¹ таблицы %2. + + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + Ð’Ñе Ñтолбцы, затронутые в триггере %1, удалены. Триггер не будет воÑÑоздан поÑле модификации таблицы. + + + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. + Ðевозможно обновить предÑтавление %1 в ÑоответÑтвии Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñми таблицы %2. +ПредÑтавление оÑтанетÑÑ ÐºÐ°Ðº еÑть. + + + + + + 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. + Возникла проблема при обновлении конÑтрукции %1 внутри триггера %2. Одна из вложенных конÑтрукций SELECT, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ ÑÑылаетÑÑ Ð½Ð° таблицу %3, не может быть корректно модифицирована. Возможно необходима Ñ€ÑƒÑ‡Ð½Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ° триггера. + + + + Could not parse DDL of the view to be created. Details: %1 + Ðевозможно проанализировать DDL Ñоздаваемого предÑтавлениÑ. ПодробноÑти: %1 + + + + Parsed query is not CREATE VIEW. It's: %1 + Проанализированный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ ÑвлÑетÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñом CREATE VIEW. Тип запроÑа: %1 + + + + SQLiteStudio was unable to resolve columns returned by the new view, therefore it won't be able to tell which triggers might fail during the recreation process. + SQLiteStudio не удалоÑÑŒ определить Ñтолбцы, возвращаемые новым предÑтавлением, поÑтому невозможно указать, какие триггеры могут ÑломатьÑÑ Ð² процеÑÑе воÑÑозданиÑ. + + + + QueryExecutor + + + Execution interrupted. + Выполнение прервано. + + + + Database is not open. + База данных не открыта. + + + + Only one query can be executed simultaneously. + Одновременно может быть выполнен только один запроÑ. + + + + + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 + Возникла ошибка при выполнении запроÑа count(*), поÑтому разбивка данных по Ñтраницам отключена. Детали ошибки из базы данных: %1 + + + + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. + SQLiteStudio не удалоÑÑŒ извлечь метаданные из запроÑа. Результаты Ð½ÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ редактировать. + + + + ScriptingQtDbProxy + + + No database available in current context, while called QtScript's %1 command. + При вызове команды QtScript %1 в текущем контекÑте нет доÑтупных баз данных. + + + + Error from %1: %2 + Ошибка в команде %1: %2 + + + + SqlHistoryModel + + + Database + sql history header + База данных + + + + Execution date + sql history header + Дата Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ + + + + Time spent + sql history header + Затраченное Ð²Ñ€ÐµÐ¼Ñ + + + + Rows affected + sql history header + Затронуто Ñтрок + + + + SQL + sql history header + SQL + + + + UpdateManager + + + An error occurred while checking for updates: %1. + При проверке обновлений возникла ошибка: %1 + + + + Could not check available updates, because server responded with invalid message format. It is safe to ignore this warning. + Ðевозможно проверить наличие обновлений, так как ответ Ñервера имеет некорректный формат. Это предупреждение можно проигнорировать. + + + + An error occurred while reading updates metadata: %1. + При чтении метаданных об обновлениÑÑ… возникла ошибка: %1 + + + + Could not download updates, because server responded with invalid message format. You can try again later or download and install updates manually. See <a href="%1">User Manual</a> for details. + Ðевозможно загрузить обновлениÑ, так как ответ Ñервера имеет некорректный формат. Ð’Ñ‹ можете попробовать Ñнова позже или Ñкачать и уÑтановить Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ. ПодробноÑти Ñмотрите в <a href="%1">РуководÑтве пользователÑ</a>. + + + + Could not create temporary directory for downloading the update. Updating aborted. + Ðевозможно Ñоздать временный каталог Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ обновлениÑ. Обновление прервано. + + + + There was no updates to download. Updating aborted. + Ðет обновлений Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸. Обновление прервано. + + + + Downloading: %1 + Загрузка: %1 + + + + Could not determinate file name from update URL: %1. Updating aborted. + Ðевозможно определить Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° из URL обновлениÑ. Обновление прервано. + + + + Failed to open file '%1' for writting: %2. Updating aborted. + Ðе удалоÑÑŒ открыть файл %1 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи: %2. Обновление прервано. + + + + Installing updates. + УÑтановка обновлений. + + + + Could not copy current application directory into %1 directory. + Ðевозможно Ñкопировать текущий каталог Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² каталог %1. + + + + Could not create directory %1. + Ðевозможно Ñоздать каталог %1. + + + + Could not rename directory %1 to %2. +Details: %3 + Ðевозможно переименовать каталог %1 в %2. +ПодробноÑти: %3 + + + + Cannot not rename directory %1 to %2. +Details: %3 + Ðевозможно переименовать каталог %1 в %2. +ПодробноÑти: %3 + + + + Could not move directory %1 to %2 and also failed to restore original directory, so the original SQLiteStudio directory is now located at: %3 + Ðевозможно перемеÑтить каталог %1 в %2, а также не удалоÑÑŒ воÑÑтановить оригинальный каталог, поÑтому оригинальный каталог SQLiteStudio теперь раÑположен в: %3 + + + + Could not rename directory %1 to %2. Rolled back to the original SQLiteStudio version. + Ðевозможно переименовать каталог %1 в %2. ВоÑÑтановлена Ð¸Ð·Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ SQLiteStudio. + + + + Could not unpack component %1 into %2 directory. + Ðевозможно раÑпаковать компонент %1 в каталог %2. + + + + Could not find permissions elevator application to run update as a root. Looked for: %1 + Ðевозможно найти приложение Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÐ³Ð¸Ð¹ Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ root. Были иÑпробованы: %1 + + + + Could not execute final updating steps as root: %1 + Ðевозможно выполнить финальные шаги Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ root: %1 + + + + + + + Could not execute final updating steps as admin: %1 + Ðевозможно выполнить финальные шаги Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора: %1 + + + + Cannot create temporary directory for updater. + Ðевозможно Ñоздать временный каталог Ð´Ð»Ñ ÑƒÑтановщика обновлений. + + + + Cannot create updater script file. + Ðевозможно Ñоздать файл Ñкрипта обновлениÑ. + + + + Updating canceled. + Обновление отменено. + + + + Could not execute final updating steps as administrator. + Ðевозможно выполнить финальные шаги Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора. + + + + Could not execute final updating steps as administrator. Updater startup timed out. + Ðевозможно выполнить финальные шаги Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора. Превышен тайм-аут запуÑка программы обновлениÑ. + + + + Could not execute final updating steps as administrator. Updater operation timed out. + Ðевозможно выполнить финальные шаги Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора. Превышен тайм-аут операции программы обновлениÑ. + + + + Could not clean up temporary directory %1. You can delete it manually at any time. + Ðевозможно очиÑтить временный каталог %1. Ð’Ñ‹ можете удалить его вручную в любое времÑ. + + + + Could not run new version for continuing update. + Ðевозможно запуÑтить новую верÑию Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ. + + + + Package not in tar.gz format, cannot install: %1 + Пакет не в формате tar.gz, уÑтановка невозможна: %1 + + + + Package %1 cannot be installed, because cannot move it to directory: %2 + Пакет %1 не может быть уÑтановлен, так как невозможно перенеÑти его в каталог: %2 + + + + Package %1 cannot be installed, because cannot unpack it: %2 + Пакет %1 не может быть уÑтановлен, так как его невозможно раÑпаковать: %2 + + + + Package not in zip format, cannot install: %1 + Пакет не в формате zip, уÑтановка невозможна: %1 + + + + Package %1 cannot be installed, because cannot unzip it to directory %2: %3 + Пакет %1 не может быть уÑтановлен, так как его невозможно раÑпаковать в каталог %2: %3 + + + + Package %1 cannot be installed, because cannot unzip it to directory: %2 + Пакет %1 не может быть уÑтановлен, так как его невозможно раÑпаковать в каталог: %2 + + + + + Could not rename directory %1 to %2. + Ðевозможно переименовать каталог %1 в %2. + + + + Could not delete directory %1. + Ðевозможно удалить каталог %1. + + + + Error executing update command: %1 +Error message: %2 + Ошибка при выполнении команды обновлениÑ: %1 +Сообщение об ошибке: %2 + + + + An error occurred while downloading updates: %1. Updating aborted. + При загрузке обновлений произошла ошибка: %1. Обновление прервано. + + + diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.qm new file mode 100644 index 0000000..1776294 Binary files /dev/null and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts new file mode 100644 index 0000000..497b7fe --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts @@ -0,0 +1,1278 @@ + + + + + AbstractDb + + + + Cannot execute query on closed database. + + + + + Error attaching database %1: %2 + + + + + BugReporter + + + Invalid login or password + + + + + ChainExecutor + + + The database for executing queries was not defined. + chain executor + + + + + The database for executing queries was not open. + chain executor + + + + + Could not start a database transaction. Details: %1 + chain executor + + + + + Interrupted + chain executor + + + + + Could not commit a database transaction. Details: %1 + chain executor + + + + + CompletionHelper + + + New row reference + + + + + Old row reference + + + + + New table name + + + + + New index name + + + + + New view name + + + + + New trigger name + + + + + Table or column alias + + + + + transaction name + + + + + New column name + + + + + Column data type + + + + + Constraint name + + + + + Error message + + + + + Collation name + + + + + Any word + + + + + Default database + + + + + Temporary objects database + + + + + DbManagerImpl + + + Could not add database %1: %2 + + + + + Database %1 could not be updated, because of an error: %2 + + + + + + Database file doesn't exist. + + + + + + + No supporting plugin loaded. + + + + + Database could not be initialized. + + + + + No suitable database driver plugin found. + + + + + DbObjectOrganizer + + + + Error while creating table in target database: %1 + + + + + Could not parse table. + + + + + 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. + + + + + Error while copying data for table %1: %2 + + + + + + + Error while copying data to table %1: %2 + + + + + Error while dropping source view %1: %2 +Tables, indexes, triggers and views copied to database %3 will remain. + + + + + Error while creating view in target database: %1 + + + + + Error while creating index in target database: %1 + + + + + Error while creating trigger in target database: %1 + + + + + DbVersionConverter + + + Target file exists, but could not be overwritten. + + + + + Could not find proper database plugin to create target database. + + + + + Error while converting database: %1 + + + + + DdlHistoryModel + + + Database name + ddl history header + + + + + Database file + ddl history header + + + + + Date of execution + ddl history header + + + + + Changes + ddl history header + + + + + ExportManager + + + Export plugin %1 doesn't support exporing query results. + + + + + Export plugin %1 doesn't support exporing tables. + + + + + Export plugin %1 doesn't support exporing databases. + + + + + Export format '%1' is not supported. Supported formats are: %2. + + + + + Export to the clipboard was successful. + + + + + Export to the file '%1' was successful. + + + + + Export was successful. + + + + + Could not export to file %1. File cannot be open for writting. + + + + + ExportWorker + + + Error while exporting query results: %1 + + + + + Error while counting data column width to export from query results: %1 + + + + + + Could not parse %1 in order to export it. It will be excluded from the export output. + + + + + Error while reading data to export from table %1: %2 + + + + + Error while counting data to export from table %1: %2 + + + + + Error while counting data column width to export from table %1: %2 + + + + + FunctionManagerImpl + + + Invalid number of arguments to function '%1'. Expected %2, but got %3. + + + + + No such function registered in SQLiteStudio: %1(%2) + + + + + Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded. + + + + + Invalid regular expression pattern: %1 + + + + + + Could not open file %1 for reading: %2 + + + + + Could not open file %1 for writting: %2 + + + + + Error while writting to file %1: %2 + + + + + Unsupported scripting language: %1 + + + + + GenericExportPlugin + + + Could not initialize text codec for exporting. Using default codec: %1 + + + + + ImportManager + + + Imported data to the table '%1' successfully. + + + + + ImportWorker + + + No columns provided by the import plugin. + + + + + Could not start transaction in order to import a data: %1 + + + + + Could not commit transaction for imported data: %1 + + + + + Table '%1' has less columns than there are columns in the data to be imported. Excessive data columns will be ignored. + + + + + Table '%1' has more columns than there are columns in the data to be imported. Some columns in the table will be left empty. + + + + + Could not create table to import to: %1 + + + + + + + Error while importing data: %1 + + + + + + Interrupted. + import process status update + + + + + PluginManagerImpl + + + Cannot load plugin %1, because it's in conflict with plugin %2. + + + + + Cannot load plugin %1, because its dependency was not loaded: %2. + + + + + Cannot load plugin %1. Error details: %2 + + + + + Cannot load plugin %1 (error while initializing plugin). + + + + + min: %1 + plugin dependency version + + + + + max: %1 + plugin dependency version + + + + + PopulateConstant + + + Constant + populate constant plugin name + + + + + PopulateConstantConfig + + + Constant value: + + + + + PopulateDictionary + + + Dictionary + dictionary populating plugin name + + + + + PopulateDictionaryConfig + + + Dictionary file + + + + + Pick dictionary file + + + + + Word separator + + + + + Whitespace + + + + + Line break + + + + + Method of using words + + + + + Ordered + + + + + Randomly + + + + + PopulateManager + + + Table '%1' populated successfully. + + + + + PopulateRandom + + + Random number + + + + + PopulateRandomConfig + + + Constant prefix + + + + + No prefix + + + + + Minimum value + + + + + Maximum value + + + + + Constant suffix + + + + + No suffix + + + + + PopulateRandomText + + + Random text + + + + + PopulateRandomTextConfig + + + Use characters from common sets: + + + + + Minimum length + + + + + Letters from a to z. + + + + + Alpha + + + + + Numbers from 0 to 9. + + + + + Numeric + + + + + A whitespace, a tab and a new line character. + + + + + Whitespace + + + + + Includes all above and all others. + + + + + Binary + + + + + Use characters from my custom set: + + + + + Maximum length + + + + + If you type some character multiple times, it's more likely to be used. + + + + + PopulateScript + + + Script + + + + + PopulateScriptConfig + + + Initialization code (optional) + + + + + Per step code + + + + + Language + + + + + Help + + + + + PopulateSequence + + + Sequence + + + + + PopulateSequenceConfig + + + Start value: + + + + + Step: + + + + + PopulateWorker + + + Could not start transaction in order to perform table populating. Error details: %1 + + + + + Error while populating table: %1 + + + + + Could not commit transaction after table populating. Error details: %1 + + + + + QObject + + + + Could not open database: %1 + + + + + + Result set expired or no row available. + + + + + Could not close database: %1 + + + + + + + + + + + SQLite %1 does not support '%2' statement. + + + + + SQLite %1 does not support '%2' statement, but the regular table can be created instead if you proceed. + + + + + Could not parse statement: %1 +Error details: %2 + + + + + + + + SQLite %1 does not support the '%2' clause. Cannot convert '%3' statement with that clause. + + + + + SQLite %1 does not support the '%2' clause in the '%3' statement. + + + + + SQLite %1 does not support current date or time clauses in expressions. + + + + + + + SQLite %1 does not support '%2' clause in expressions. + + + + + Could not attach database %1: %2 + + + + + + Incomplete query. + + + + + + Parser stack overflow + + + + + + Syntax error + + + + + Could not open dictionary file %1 for reading. + + + + + Dictionary file must exist and be readable. + + + + + Maximum value cannot be less than minimum value. + + + + + Maximum length cannot be less than minimum length. + + + + + Custom character set cannot be empty. + + + + + Could not find plugin to support scripting language: %1 + + + + + Error while executing populating initial code: %1 + + + + + Error while executing populating code: %1 + + + + + Select implementation language. + + + + + Implementation code cannot be empty. + + + + + Could not resolve data source for column: %1 + + + + + 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. + + + + + General purpose + plugin category name + + + + + Database support + plugin category name + + + + + Code formatter + plugin category name + + + + + Scripting languages + plugin category name + + + + + Exporting + plugin category name + + + + + Importing + plugin category name + + + + + Table populating + plugin category name + + + + + 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. + + + + + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. + + + + + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. + + + + + Cannot not update trigger %1 according to table %2 modification. + + + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. + + + + + + + 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. + + + + + Could not parse DDL of the view to be created. Details: %1 + + + + + Parsed query is not CREATE VIEW. It's: %1 + + + + + SQLiteStudio was unable to resolve columns returned by the new view, therefore it won't be able to tell which triggers might fail during the recreation process. + + + + + QueryExecutor + + + Execution interrupted. + + + + + Database is not open. + + + + + Only one query can be executed simultaneously. + + + + + + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 + + + + + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. + + + + + ScriptingQtDbProxy + + + No database available in current context, while called QtScript's %1 command. + + + + + Error from %1: %2 + + + + + SqlHistoryModel + + + Database + sql history header + + + + + Execution date + sql history header + + + + + Time spent + sql history header + + + + + Rows affected + sql history header + + + + + SQL + sql history header + + + + + UpdateManager + + + An error occurred while checking for updates: %1. + + + + + Could not check available updates, because server responded with invalid message format. It is safe to ignore this warning. + + + + + An error occurred while reading updates metadata: %1. + + + + + Could not download updates, because server responded with invalid message format. You can try again later or download and install updates manually. See <a href="%1">User Manual</a> for details. + + + + + Could not create temporary directory for downloading the update. Updating aborted. + + + + + There was no updates to download. Updating aborted. + + + + + Downloading: %1 + + + + + Could not determinate file name from update URL: %1. Updating aborted. + + + + + Failed to open file '%1' for writting: %2. Updating aborted. + + + + + Installing updates. + + + + + Could not copy current application directory into %1 directory. + + + + + Could not create directory %1. + + + + + Could not rename directory %1 to %2. +Details: %3 + + + + + Cannot not rename directory %1 to %2. +Details: %3 + + + + + Could not move directory %1 to %2 and also failed to restore original directory, so the original SQLiteStudio directory is now located at: %3 + + + + + Could not rename directory %1 to %2. Rolled back to the original SQLiteStudio version. + + + + + Could not unpack component %1 into %2 directory. + + + + + Could not find permissions elevator application to run update as a root. Looked for: %1 + + + + + Could not execute final updating steps as root: %1 + + + + + + + + Could not execute final updating steps as admin: %1 + + + + + Cannot create temporary directory for updater. + + + + + Cannot create updater script file. + + + + + Updating canceled. + + + + + Could not execute final updating steps as administrator. + + + + + Could not execute final updating steps as administrator. Updater startup timed out. + + + + + Could not execute final updating steps as administrator. Updater operation timed out. + + + + + Could not clean up temporary directory %1. You can delete it manually at any time. + + + + + Could not run new version for continuing update. + + + + + Package not in tar.gz format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot move it to directory: %2 + + + + + Package %1 cannot be installed, because cannot unpack it: %2 + + + + + Package not in zip format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot unzip it to directory %2: %3 + + + + + Package %1 cannot be installed, because cannot unzip it to directory: %2 + + + + + + Could not rename directory %1 to %2. + + + + + Could not delete directory %1. + + + + + Error executing update command: %1 +Error message: %2 + + + + + An error occurred while downloading updates: %1. Updating aborted. + + + + diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.qm new file mode 100644 index 0000000..be651ee --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.qm @@ -0,0 +1 @@ +<¸dÊÍ!¿`¡½Ý \ No newline at end of file diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts new file mode 100644 index 0000000..0cfd10d --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts @@ -0,0 +1,1278 @@ + + + + + AbstractDb + + + + Cannot execute query on closed database. + + + + + Error attaching database %1: %2 + + + + + BugReporter + + + Invalid login or password + + + + + ChainExecutor + + + The database for executing queries was not defined. + chain executor + + + + + The database for executing queries was not open. + chain executor + + + + + Could not start a database transaction. Details: %1 + chain executor + + + + + Interrupted + chain executor + + + + + Could not commit a database transaction. Details: %1 + chain executor + + + + + CompletionHelper + + + New row reference + + + + + Old row reference + + + + + New table name + + + + + New index name + + + + + New view name + + + + + New trigger name + + + + + Table or column alias + + + + + transaction name + + + + + New column name + + + + + Column data type + + + + + Constraint name + + + + + Error message + + + + + Collation name + + + + + Any word + + + + + Default database + + + + + Temporary objects database + + + + + DbManagerImpl + + + Could not add database %1: %2 + + + + + Database %1 could not be updated, because of an error: %2 + + + + + + Database file doesn't exist. + + + + + + + No supporting plugin loaded. + + + + + Database could not be initialized. + + + + + No suitable database driver plugin found. + + + + + DbObjectOrganizer + + + + Error while creating table in target database: %1 + + + + + Could not parse table. + + + + + 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. + + + + + Error while copying data for table %1: %2 + + + + + + + Error while copying data to table %1: %2 + + + + + Error while dropping source view %1: %2 +Tables, indexes, triggers and views copied to database %3 will remain. + + + + + Error while creating view in target database: %1 + + + + + Error while creating index in target database: %1 + + + + + Error while creating trigger in target database: %1 + + + + + DbVersionConverter + + + Target file exists, but could not be overwritten. + + + + + Could not find proper database plugin to create target database. + + + + + Error while converting database: %1 + + + + + DdlHistoryModel + + + Database name + ddl history header + + + + + Database file + ddl history header + + + + + Date of execution + ddl history header + + + + + Changes + ddl history header + + + + + ExportManager + + + Export plugin %1 doesn't support exporing query results. + + + + + Export plugin %1 doesn't support exporing tables. + + + + + Export plugin %1 doesn't support exporing databases. + + + + + Export format '%1' is not supported. Supported formats are: %2. + + + + + Export to the clipboard was successful. + + + + + Export to the file '%1' was successful. + + + + + Export was successful. + + + + + Could not export to file %1. File cannot be open for writting. + + + + + ExportWorker + + + Error while exporting query results: %1 + + + + + Error while counting data column width to export from query results: %1 + + + + + + Could not parse %1 in order to export it. It will be excluded from the export output. + + + + + Error while reading data to export from table %1: %2 + + + + + Error while counting data to export from table %1: %2 + + + + + Error while counting data column width to export from table %1: %2 + + + + + FunctionManagerImpl + + + Invalid number of arguments to function '%1'. Expected %2, but got %3. + + + + + No such function registered in SQLiteStudio: %1(%2) + + + + + Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded. + + + + + Invalid regular expression pattern: %1 + + + + + + Could not open file %1 for reading: %2 + + + + + Could not open file %1 for writting: %2 + + + + + Error while writting to file %1: %2 + + + + + Unsupported scripting language: %1 + + + + + GenericExportPlugin + + + Could not initialize text codec for exporting. Using default codec: %1 + + + + + ImportManager + + + Imported data to the table '%1' successfully. + + + + + ImportWorker + + + No columns provided by the import plugin. + + + + + Could not start transaction in order to import a data: %1 + + + + + Could not commit transaction for imported data: %1 + + + + + Table '%1' has less columns than there are columns in the data to be imported. Excessive data columns will be ignored. + + + + + Table '%1' has more columns than there are columns in the data to be imported. Some columns in the table will be left empty. + + + + + Could not create table to import to: %1 + + + + + + + Error while importing data: %1 + + + + + + Interrupted. + import process status update + + + + + PluginManagerImpl + + + Cannot load plugin %1, because it's in conflict with plugin %2. + + + + + Cannot load plugin %1, because its dependency was not loaded: %2. + + + + + Cannot load plugin %1. Error details: %2 + + + + + Cannot load plugin %1 (error while initializing plugin). + + + + + min: %1 + plugin dependency version + + + + + max: %1 + plugin dependency version + + + + + PopulateConstant + + + Constant + populate constant plugin name + + + + + PopulateConstantConfig + + + Constant value: + + + + + PopulateDictionary + + + Dictionary + dictionary populating plugin name + + + + + PopulateDictionaryConfig + + + Dictionary file + + + + + Pick dictionary file + + + + + Word separator + + + + + Whitespace + + + + + Line break + + + + + Method of using words + + + + + Ordered + + + + + Randomly + + + + + PopulateManager + + + Table '%1' populated successfully. + + + + + PopulateRandom + + + Random number + + + + + PopulateRandomConfig + + + Constant prefix + + + + + No prefix + + + + + Minimum value + + + + + Maximum value + + + + + Constant suffix + + + + + No suffix + + + + + PopulateRandomText + + + Random text + + + + + PopulateRandomTextConfig + + + Use characters from common sets: + + + + + Minimum length + + + + + Letters from a to z. + + + + + Alpha + + + + + Numbers from 0 to 9. + + + + + Numeric + + + + + A whitespace, a tab and a new line character. + + + + + Whitespace + + + + + Includes all above and all others. + + + + + Binary + + + + + Use characters from my custom set: + + + + + Maximum length + + + + + If you type some character multiple times, it's more likely to be used. + + + + + PopulateScript + + + Script + + + + + PopulateScriptConfig + + + Initialization code (optional) + + + + + Per step code + + + + + Language + + + + + Help + + + + + PopulateSequence + + + Sequence + + + + + PopulateSequenceConfig + + + Start value: + + + + + Step: + + + + + PopulateWorker + + + Could not start transaction in order to perform table populating. Error details: %1 + + + + + Error while populating table: %1 + + + + + Could not commit transaction after table populating. Error details: %1 + + + + + QObject + + + + Could not open database: %1 + + + + + + Result set expired or no row available. + + + + + Could not close database: %1 + + + + + + + + + + + SQLite %1 does not support '%2' statement. + + + + + SQLite %1 does not support '%2' statement, but the regular table can be created instead if you proceed. + + + + + Could not parse statement: %1 +Error details: %2 + + + + + + + + SQLite %1 does not support the '%2' clause. Cannot convert '%3' statement with that clause. + + + + + SQLite %1 does not support the '%2' clause in the '%3' statement. + + + + + SQLite %1 does not support current date or time clauses in expressions. + + + + + + + SQLite %1 does not support '%2' clause in expressions. + + + + + Could not attach database %1: %2 + + + + + + Incomplete query. + + + + + + Parser stack overflow + + + + + + Syntax error + + + + + Could not open dictionary file %1 for reading. + + + + + Dictionary file must exist and be readable. + + + + + Maximum value cannot be less than minimum value. + + + + + Maximum length cannot be less than minimum length. + + + + + Custom character set cannot be empty. + + + + + Could not find plugin to support scripting language: %1 + + + + + Error while executing populating initial code: %1 + + + + + Error while executing populating code: %1 + + + + + Select implementation language. + + + + + Implementation code cannot be empty. + + + + + Could not resolve data source for column: %1 + + + + + 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. + + + + + General purpose + plugin category name + + + + + Database support + plugin category name + + + + + Code formatter + plugin category name + + + + + Scripting languages + plugin category name + + + + + Exporting + plugin category name + + + + + Importing + plugin category name + + + + + Table populating + plugin category name + + + + + 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. + + + + + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. + + + + + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. + + + + + Cannot not update trigger %1 according to table %2 modification. + + + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. + + + + + + + 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. + + + + + Could not parse DDL of the view to be created. Details: %1 + + + + + Parsed query is not CREATE VIEW. It's: %1 + + + + + SQLiteStudio was unable to resolve columns returned by the new view, therefore it won't be able to tell which triggers might fail during the recreation process. + + + + + QueryExecutor + + + Execution interrupted. + + + + + Database is not open. + + + + + Only one query can be executed simultaneously. + + + + + + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 + + + + + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. + + + + + ScriptingQtDbProxy + + + No database available in current context, while called QtScript's %1 command. + + + + + Error from %1: %2 + + + + + SqlHistoryModel + + + Database + sql history header + + + + + Execution date + sql history header + + + + + Time spent + sql history header + + + + + Rows affected + sql history header + + + + + SQL + sql history header + + + + + UpdateManager + + + An error occurred while checking for updates: %1. + + + + + Could not check available updates, because server responded with invalid message format. It is safe to ignore this warning. + + + + + An error occurred while reading updates metadata: %1. + + + + + Could not download updates, because server responded with invalid message format. You can try again later or download and install updates manually. See <a href="%1">User Manual</a> for details. + + + + + Could not create temporary directory for downloading the update. Updating aborted. + + + + + There was no updates to download. Updating aborted. + + + + + Downloading: %1 + + + + + Could not determinate file name from update URL: %1. Updating aborted. + + + + + Failed to open file '%1' for writting: %2. Updating aborted. + + + + + Installing updates. + + + + + Could not copy current application directory into %1 directory. + + + + + Could not create directory %1. + + + + + Could not rename directory %1 to %2. +Details: %3 + + + + + Cannot not rename directory %1 to %2. +Details: %3 + + + + + Could not move directory %1 to %2 and also failed to restore original directory, so the original SQLiteStudio directory is now located at: %3 + + + + + Could not rename directory %1 to %2. Rolled back to the original SQLiteStudio version. + + + + + Could not unpack component %1 into %2 directory. + + + + + Could not find permissions elevator application to run update as a root. Looked for: %1 + + + + + Could not execute final updating steps as root: %1 + + + + + + + + Could not execute final updating steps as admin: %1 + + + + + Cannot create temporary directory for updater. + + + + + Cannot create updater script file. + + + + + Updating canceled. + + + + + Could not execute final updating steps as administrator. + + + + + Could not execute final updating steps as administrator. Updater startup timed out. + + + + + Could not execute final updating steps as administrator. Updater operation timed out. + + + + + Could not clean up temporary directory %1. You can delete it manually at any time. + + + + + Could not run new version for continuing update. + + + + + Package not in tar.gz format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot move it to directory: %2 + + + + + Package %1 cannot be installed, because cannot unpack it: %2 + + + + + Package not in zip format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot unzip it to directory %2: %3 + + + + + Package %1 cannot be installed, because cannot unzip it to directory: %2 + + + + + + Could not rename directory %1 to %2. + + + + + Could not delete directory %1. + + + + + Error executing update command: %1 +Error message: %2 + + + + + An error occurred while downloading updates: %1. Updating aborted. + + + + -- cgit v1.2.3