From 47312b04c0878e0c308794cde08e92c03d4be29e Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 4 Jul 2019 12:53:10 +0200 Subject: [PATCH 01/53] QtSupport: Fix header guard for ui files First fix to generate header guards was creating collision with other header guards. So we now do not generate header guards anymore but prepend "#pragma once". Change-Id: I153a874f676188ef47e02e333691e8998f5a6558 Fixes: QTCREATORBUG-22624 Reviewed-by: Christian Kandeler --- src/plugins/qtsupport/uicgenerator.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/qtsupport/uicgenerator.cpp b/src/plugins/qtsupport/uicgenerator.cpp index 9d868932783..abf8790016f 100644 --- a/src/plugins/qtsupport/uicgenerator.cpp +++ b/src/plugins/qtsupport/uicgenerator.cpp @@ -67,7 +67,7 @@ Utils::FilePath UicGenerator::command() const QStringList UicGenerator::arguments() const { - return {source().toString()}; + return {"-p", source().toString()}; } FileNameToContentsHash UicGenerator::handleProcessFinished(QProcess *process) @@ -81,7 +81,9 @@ FileNameToContentsHash UicGenerator::handleProcessFinished(QProcess *process) return result; // As far as I can discover in the UIC sources, it writes out local 8-bit encoding. The // conversion below is to normalize both the encoding, and the line terminators. - result[targetList.first()] = QString::fromLocal8Bit(process->readAllStandardOutput()).toUtf8(); + QByteArray content = QString::fromLocal8Bit(process->readAllStandardOutput()).toUtf8(); + content.prepend("#pragma once\n"); + result[targetList.first()] = content; return result; } From 8c95d44b1749fc368c0798a422571b8816137399 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 4 Jul 2019 17:45:46 +0200 Subject: [PATCH 02/53] Fix pri file Change-Id: I277340dbec962e59f090d393967453d058a933a2 Reviewed-by: Marco Bubke --- .../source/clangrefactoringbackend-source.pri | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri b/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri index 9c51093632d..dd4e51028d2 100644 --- a/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri +++ b/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri @@ -44,7 +44,6 @@ HEADERS += \ $$PWD/refactoringserver.h \ $$PWD/macropreprocessorcallbacks.h \ $$PWD/sourcelocationsutils.h \ - $$PWD/findcursorusr.h \ $$PWD/clangquery.h \ $$PWD/clangtool.h \ $$PWD/sourcerangeextractor.h \ From 29a5ea808258b4deeb4439c0847c4bd9fcd90c60 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 4 Jul 2019 16:06:26 +0200 Subject: [PATCH 03/53] Utils: Fix a case fall through warning Change-Id: I0b27228c888324dd68403580e2001fc3a5820ec2 Reviewed-by: Christian Kandeler --- src/libs/utils/tooltip/tooltip.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/utils/tooltip/tooltip.cpp b/src/libs/utils/tooltip/tooltip.cpp index b4735c25eec..27cbc83720d 100644 --- a/src/libs/utils/tooltip/tooltip.cpp +++ b/src/libs/utils/tooltip/tooltip.cpp @@ -356,6 +356,7 @@ bool ToolTip::eventFilter(QObject *o, QEvent *event) !m_rect.contains(static_cast(event)->pos())) { hideTipWithDelay(); } + break; default: break; } From 8d84e2f2e163bceec8870893d7de55d14174f333 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 4 Jul 2019 15:12:55 +0200 Subject: [PATCH 04/53] CrashHandler: Allow enabling per executable ...by specifying the executable names in QTC_USE_CRASH_HANDLER. Examples: # enable for all supported executables QTC_USE_CRASH_HANDLER=1 QTC_USE_CRASH_HANDLER=yes QTC_USE_CRASH_HANDLER=all # enable for specific executables QTC_USE_CRASH_HANDLER=qtcreator,clangbackend Change-Id: Ie6f1ad001cea077b8b90b89356f597a4c11378b9 Reviewed-by: Christian Kandeler --- src/tools/qtcreatorcrashhandler/crashhandlersetup.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/tools/qtcreatorcrashhandler/crashhandlersetup.cpp b/src/tools/qtcreatorcrashhandler/crashhandlersetup.cpp index 6f1baff4c77..fd24e6b543a 100644 --- a/src/tools/qtcreatorcrashhandler/crashhandlersetup.cpp +++ b/src/tools/qtcreatorcrashhandler/crashhandlersetup.cpp @@ -34,6 +34,7 @@ #ifdef BUILD_CRASH_HANDLER #include +#include #include #include @@ -95,8 +96,14 @@ CrashHandlerSetup::CrashHandlerSetup(const QString &appName, const QString &executableDirPath) { #ifdef BUILD_CRASH_HANDLER - if (qEnvironmentVariableIsEmpty("QTC_USE_CRASH_HANDLER")) + const QString value = qEnvironmentVariable("QTC_USE_CRASH_HANDLER"); + if (value.trimmed().isEmpty()) return; + if (!QStringList{"1", "all", "yes"}.contains(value)) { + const QString binaryName = QFileInfo(QCoreApplication::applicationFilePath()).fileName(); + if (!value.split(",", QString::SkipEmptyParts).contains(binaryName)) + return; + } appNameC = qstrdup(qPrintable(appName)); From 6e4d0a70e9cd28639aecb69f4bb025af3633bec4 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 4 Jul 2019 16:02:09 +0200 Subject: [PATCH 05/53] Utils: Move reuse.h out of sight It caused a deprecation warning in each user. The warning itself is not gone but appears less often now. Change-Id: I03a995897635a182fa254fa574ccbfbfc7515f1a Reviewed-by: Christian Kandeler --- src/libs/utils/CMakeLists.txt | 1 - src/libs/utils/tooltip/reuse.h | 55 ------------------------------ src/libs/utils/tooltip/tips.cpp | 24 ++++++++++++- src/libs/utils/tooltip/tips.h | 3 ++ src/libs/utils/tooltip/tooltip.cpp | 10 +++--- src/libs/utils/utils-lib.pri | 1 - src/libs/utils/utils.qbs | 1 - 7 files changed, 30 insertions(+), 65 deletions(-) delete mode 100644 src/libs/utils/tooltip/reuse.h diff --git a/src/libs/utils/CMakeLists.txt b/src/libs/utils/CMakeLists.txt index 00307728a68..5863c35d1ff 100644 --- a/src/libs/utils/CMakeLists.txt +++ b/src/libs/utils/CMakeLists.txt @@ -144,7 +144,6 @@ add_qtc_library(Utils textutils.cpp textutils.h theme/theme.cpp theme/theme.h theme/theme_p.h tooltip/effects.h - tooltip/reuse.h tooltip/tips.cpp tooltip/tips.h tooltip/tooltip.cpp tooltip/tooltip.h touchbar/touchbar.h diff --git a/src/libs/utils/tooltip/reuse.h b/src/libs/utils/tooltip/reuse.h deleted file mode 100644 index ee2fca72de4..00000000000 --- a/src/libs/utils/tooltip/reuse.h +++ /dev/null @@ -1,55 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include - -#include -#include -#include -#include -#include - -namespace Utils { -namespace Internal { - -inline int screenNumber(const QPoint &pos, QWidget *w) -{ - if (QApplication::desktop()->isVirtualDesktop()) - return QApplication::desktop()->screenNumber(pos); - else - return QApplication::desktop()->screenNumber(w); -} - -inline QRect screenGeometry(const QPoint &pos, QWidget *w) -{ - if (HostOsInfo::isMacHost()) - return QApplication::desktop()->availableGeometry(screenNumber(pos, w)); - return QApplication::desktop()->screenGeometry(screenNumber(pos, w)); -} - -} // namespace Internal -} // namespace Utils diff --git a/src/libs/utils/tooltip/tips.cpp b/src/libs/utils/tooltip/tips.cpp index d882bdb1d88..f6927efef52 100644 --- a/src/libs/utils/tooltip/tips.cpp +++ b/src/libs/utils/tooltip/tips.cpp @@ -25,8 +25,8 @@ #include "tips.h" #include "tooltip.h" -#include "reuse.h" +#include #include #include @@ -43,6 +43,12 @@ #include #include +#include +#include +#include +#include +#include + #include namespace Utils { @@ -287,5 +293,21 @@ bool WidgetTip::equals(int typeId, const QVariant &other, const QVariant &otherC && other.value() == m_widget; } + +int screenNumber(const QPoint &pos, QWidget *w) +{ + if (QApplication::desktop()->isVirtualDesktop()) + return QApplication::desktop()->screenNumber(pos); + else + return QApplication::desktop()->screenNumber(w); +} + +QRect screenGeometry(const QPoint &pos, QWidget *w) +{ + if (HostOsInfo::isMacHost()) + return QApplication::desktop()->availableGeometry(screenNumber(pos, w)); + return QApplication::desktop()->screenGeometry(screenNumber(pos, w)); +} + } // namespace Internal } // namespace Utils diff --git a/src/libs/utils/tooltip/tips.h b/src/libs/utils/tooltip/tips.h index 22415075ab8..68aec099d9c 100644 --- a/src/libs/utils/tooltip/tips.h +++ b/src/libs/utils/tooltip/tips.h @@ -36,6 +36,9 @@ namespace Utils { namespace Internal { +int screenNumber(const QPoint &pos, QWidget *w); +QRect screenGeometry(const QPoint &pos, QWidget *w); + class TipLabel : public QLabel { public: diff --git a/src/libs/utils/tooltip/tooltip.cpp b/src/libs/utils/tooltip/tooltip.cpp index 27cbc83720d..3dfb6d9b863 100644 --- a/src/libs/utils/tooltip/tooltip.cpp +++ b/src/libs/utils/tooltip/tooltip.cpp @@ -26,21 +26,19 @@ #include "tooltip.h" #include "tips.h" #include "effects.h" -#include "reuse.h" #include #include #include -#include +#include #include -#include +#include +#include #include +#include #include #include -#include - -#include using namespace Utils; using namespace Internal; diff --git a/src/libs/utils/utils-lib.pri b/src/libs/utils/utils-lib.pri index c7fef47c97f..a4697e06225 100644 --- a/src/libs/utils/utils-lib.pri +++ b/src/libs/utils/utils-lib.pri @@ -214,7 +214,6 @@ HEADERS += \ $$PWD/elidinglabel.h \ $$PWD/tooltip/tooltip.h \ $$PWD/tooltip/tips.h \ - $$PWD/tooltip/reuse.h \ $$PWD/tooltip/effects.h \ $$PWD/unixutils.h \ $$PWD/ansiescapecodehandler.h \ diff --git a/src/libs/utils/utils.qbs b/src/libs/utils/utils.qbs index 694045e2900..10368cd5397 100644 --- a/src/libs/utils/utils.qbs +++ b/src/libs/utils/utils.qbs @@ -293,7 +293,6 @@ Project { prefix: "tooltip/" files: [ "effects.h", - "reuse.h", "tips.cpp", "tips.h", "tooltip.cpp", From c77cef57063f5ae712777b792c1a1ed046b055b3 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 4 Jul 2019 19:00:20 +0200 Subject: [PATCH 06/53] Avoid more deprecation warnings Change-Id: Icc7bb7a4ccf7fc9f89f6f668c194ccd440e5231c Reviewed-by: Christian Stenger --- src/plugins/autotest/testcodeparser.cpp | 4 ++-- src/plugins/clangformat/clangformatutils.cpp | 4 ++-- src/plugins/cmakeprojectmanager/tealeafreader.cpp | 2 +- src/plugins/debugger/qml/qmlengine.cpp | 2 +- src/plugins/genericprojectmanager/genericproject.cpp | 2 +- .../customwidgetwizard/plugingenerator.cpp | 5 +++-- src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp | 2 +- src/plugins/qmakeprojectmanager/qmakeproject.cpp | 4 ++-- 8 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp index c944073dc70..9b8942b76b8 100644 --- a/src/plugins/autotest/testcodeparser.cpp +++ b/src/plugins/autotest/testcodeparser.cpp @@ -110,7 +110,7 @@ void TestCodeParser::setState(State state) m_partialUpdatePostponed = false; qCDebug(LOG) << "calling scanForTests with postponed files (setState)"; if (!m_reparseTimer.isActive()) - scanForTests(m_postponedFiles.toList()); + scanForTests(Utils::toList(m_postponedFiles)); } } } @@ -469,7 +469,7 @@ void TestCodeParser::onPartialParsingFinished() m_partialUpdatePostponed = false; qCDebug(LOG) << "calling scanForTests with postponed files (onPartialParsingFinished)"; if (!m_reparseTimer.isActive()) - scanForTests(m_postponedFiles.toList()); + scanForTests(Utils::toList(m_postponedFiles)); } else { m_dirty |= m_codeModelParsing; if (m_dirty) { diff --git a/src/plugins/clangformat/clangformatutils.cpp b/src/plugins/clangformat/clangformatutils.cpp index 14d59a757cc..59c2b592d78 100644 --- a/src/plugins/clangformat/clangformatutils.cpp +++ b/src/plugins/clangformat/clangformatutils.cpp @@ -197,13 +197,13 @@ static QString configForFile(Utils::FilePath fileName, bool checkForSettings) { QDir overrideDir; if (!checkForSettings || useProjectOverriddenSettings()) { - overrideDir = projectPath().toString(); + overrideDir.setPath(projectPath().toString()); if (!overrideDir.isEmpty() && overrideDir.exists(Constants::SETTINGS_FILE_NAME)) return overrideDir.filePath(Constants::SETTINGS_FILE_NAME); } if (!checkForSettings || useGlobalOverriddenSettings()) { - overrideDir = globalPath().toString(); + overrideDir.setPath(globalPath().toString()); if (!overrideDir.isEmpty() && overrideDir.exists(Constants::SETTINGS_FILE_NAME)) return overrideDir.filePath(Constants::SETTINGS_FILE_NAME); } diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.cpp b/src/plugins/cmakeprojectmanager/tealeafreader.cpp index 89b0e36d16f..d33f461aaf1 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.cpp +++ b/src/plugins/cmakeprojectmanager/tealeafreader.cpp @@ -299,7 +299,7 @@ void TeaLeafReader::generateProjectTree(CMakeProjectNode *root, const QList allIncludePaths = allIncludePathSet.toList(); + const QList allIncludePaths = Utils::toList(allIncludePathSet); const QList missingHeaders = Utils::filtered(allFiles, [&allIncludePaths](const FileNode *fn) -> bool { diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 255052936e0..a04c110fce3 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -320,7 +320,7 @@ QmlEngine::~QmlEngine() if (textEditPtr) documentsToClose << textEditPtr.data()->document(); } - EditorManager::closeDocuments(documentsToClose.toList()); + EditorManager::closeDocuments(Utils::toList(documentsToClose)); delete d; } diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index faeb2cf7028..89051f2a4a0 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -289,7 +289,7 @@ bool GenericProject::addFiles(const QStringList &filePaths) for (const QString &filePath : filePaths) insertSorted(&newList, baseDir.relativeFilePath(filePath)); - const QSet includes = m_projectIncludePaths.toSet(); + const QSet includes = Utils::toSet(m_projectIncludePaths); QSet toAdd; for (const QString &filePath : filePaths) { diff --git a/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp b/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp index b93595bba17..c43abfa35d1 100644 --- a/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp +++ b/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -293,8 +294,8 @@ QList PluginGenerator::generatePlugin(const GenerationPara sm.insert(QLatin1String("PLUGIN_HEADERS"), pluginHeaders); sm.insert(QLatin1String("PLUGIN_SOURCES"), pluginSources); sm.insert(QLatin1String("PLUGIN_RESOURCES"), options.resourceFile); - sm.insert(QLatin1String("WIDGET_LIBS"), QStringList(widgetLibraries.toList()).join(blank)); - sm.insert(QLatin1String("INCLUSIONS"), QStringList(widgetProjects.toList()).join(QLatin1Char('\n'))); + sm.insert(QLatin1String("WIDGET_LIBS"), QStringList(Utils::toList(widgetLibraries)).join(blank)); + sm.insert(QLatin1String("INCLUSIONS"), QStringList(Utils::toList(widgetProjects)).join(QLatin1Char('\n'))); const QString proFileContents = processTemplate(p.templatePath + QLatin1String("/tpl_plugin.pro"), sm, errorMessage); if (proFileContents.isEmpty()) return QList(); diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index 9ce44864302..39206d971f2 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -1637,7 +1637,7 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult) }); } const QStringList directoriesToAdd = Utils::filtered( - result->directoriesWithWildcards.toList(), + Utils::toList(result->directoriesWithWildcards), [this](const QString &path) { return !m_wildcardWatcher->watchesDirectory(path); }); diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 93247155ddc..e6dc5bb2d08 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -826,7 +826,7 @@ void CentralizedFolderWatcher::watchFolders(const QList &folders, Qmake // we add the recursive directories we find QSet tmp = recursiveDirs(folder); if (!tmp.isEmpty()) - m_watcher.addPaths(tmp.toList()); + m_watcher.addPaths(Utils::toList(tmp)); m_recursiveWatchedFolders += tmp; } } @@ -922,7 +922,7 @@ void CentralizedFolderWatcher::delayedFolderChanged(const QString &folder) // If a subdirectory was added, watch it too QSet tmp = recursiveDirs(folderWithSlash); if (!tmp.isEmpty()) { - QSet alreadyAdded = m_watcher.directories().toSet(); + QSet alreadyAdded = Utils::toSet(m_watcher.directories()); tmp.subtract(alreadyAdded); if (!tmp.isEmpty()) m_watcher.addPaths(Utils::toList(tmp)); From a6d3101207901172ddab3593dbd500d89d799128 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 4 Jul 2019 10:30:09 +0200 Subject: [PATCH 07/53] Debugger: Robustify QmlInspectorAgent::onResult Task-number: QTCREATORBUG-22654 Change-Id: I4bf0a17581ff3fcdc1a0b6dd9eb21fd2cf9b756c Reviewed-by: Ulf Hermann --- src/plugins/debugger/qml/qmlinspectoragent.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/debugger/qml/qmlinspectoragent.cpp b/src/plugins/debugger/qml/qmlinspectoragent.cpp index 86d429749e9..d874432af4a 100644 --- a/src/plugins/debugger/qml/qmlinspectoragent.cpp +++ b/src/plugins/debugger/qml/qmlinspectoragent.cpp @@ -260,7 +260,8 @@ void QmlInspectorAgent::onResult(quint32 queryId, const QVariant &value, } else { int index = m_rootContextQueryIds.indexOf(queryId); if (index < 0) { - m_qmlEngine->expressionEvaluated(queryId, value); + if (QTC_GUARD(m_qmlEngine)) + m_qmlEngine->expressionEvaluated(queryId, value); } else { Q_ASSERT(index < m_engines.length()); const int engineId = m_engines.at(index).debugId(); From 288ff9a8543ff26f126ea1a98436b33d5d12511c Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 5 Jul 2019 11:50:58 +0200 Subject: [PATCH 08/53] ClangRefactor: Avoid warnings ... about unused code by removing it. Change-Id: I827db7880d5fca8a736b34fa58608328645bf80f Reviewed-by: Nikolai Kosjar --- .../source/indexdataconsumer.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp b/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp index 1fa60434619..cb9723b7436 100644 --- a/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp +++ b/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp @@ -103,20 +103,6 @@ SymbolKindAndTags symbolKindAndTags(const clang::Decl *declaration) return visitor.Visit(declaration); } -bool isDeclaration(clang::index::SymbolRoleSet symbolRoles) -{ - using namespace clang::index; - - return symbolRoles & (uint(SymbolRole::Declaration) | uint(SymbolRole::Definition)); -} - -bool isReference(clang::index::SymbolRoleSet symbolRoles) -{ - using namespace clang::index; - - return symbolRoles & (uint(SymbolRole::Reference) | uint(SymbolRole::Call)); -} - } // namespace bool IndexDataConsumer::skipSymbol(clang::FileID fileId, clang::index::SymbolRoleSet symbolRoles) From 801ad1e8695ed02d412391882f7078ffaf6d2366 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 5 Jul 2019 12:14:08 +0200 Subject: [PATCH 09/53] ClangCodeModel: Avoid warnings on deprecated use of QTime Change-Id: Ia1d07367ad85b78201ed7553d9cfb02c1bd31ae0 Reviewed-by: Nikolai Kosjar --- .../clangcodemodel/test/clangcodecompletion_test.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp index 05fa0cace5b..8d3f1b54a08 100644 --- a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp +++ b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp @@ -226,7 +226,7 @@ bool OpenEditorAtCursorPosition::waitUntilProjectPartChanged(const QString &newP bool OpenEditorAtCursorPosition::waitUntil(const std::function &condition, int timeout) { - QTime time; + QElapsedTimer time; time.start(); forever { @@ -432,7 +432,7 @@ bool MonitorGeneratedUiFile::waitUntilGenerated(int timeout) const if (m_isGenerated) return true; - QTime time; + QElapsedTimer time; time.start(); forever { @@ -472,10 +472,10 @@ public: { QTC_ASSERT(writeFile(m_filePath, m_fileContents), return false); - QTime totalTime; + QElapsedTimer totalTime; totalTime.start(); - QTime writeFileAgainTime; + QElapsedTimer writeFileAgainTime; writeFileAgainTime.start(); forever { From 0764a9808bd8db7fa9b8b612cdead605dd1976d2 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 4 Jul 2019 18:45:58 +0200 Subject: [PATCH 10/53] ProjectExplorer: Remove one deprecated use of QTime Change-Id: I910b2180937519fd56378375bea2589548aa4edf Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/waitforstopdialog.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/waitforstopdialog.h b/src/plugins/projectexplorer/waitforstopdialog.h index 47c960dba8d..2a1d0e32137 100644 --- a/src/plugins/projectexplorer/waitforstopdialog.h +++ b/src/plugins/projectexplorer/waitforstopdialog.h @@ -27,7 +27,7 @@ #include #include -#include +#include #include "runcontrol.h" @@ -51,7 +51,7 @@ private: QList m_runControls; QLabel *m_progressLabel; - QTime m_timer; + QElapsedTimer m_timer; }; } // namespace Internal From 37000cde8fd059eb7d71054a72a432e847f86b31 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 5 Jul 2019 12:02:41 +0200 Subject: [PATCH 11/53] Todo: Avoid deprecation warnings Change-Id: I8698d02c7b09e72a25d7ef18fb4cd040767b1a1c Reviewed-by: Christian Stenger --- src/plugins/todo/optionsdialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/todo/optionsdialog.cpp b/src/plugins/todo/optionsdialog.cpp index c6bd7c89f53..dcffcf4f3e8 100644 --- a/src/plugins/todo/optionsdialog.cpp +++ b/src/plugins/todo/optionsdialog.cpp @@ -116,7 +116,7 @@ void OptionsDialog::editKeyword(QListWidgetItem *item) Keyword keyword; keyword.name = item->text(); keyword.iconType = static_cast(item->data(Qt::UserRole).toInt()); - keyword.color = item->textColor(); + keyword.color = item->foreground().color(); QSet keywordNamesButThis = keywordNames(); keywordNamesButThis.remove(keyword.name); @@ -127,7 +127,7 @@ void OptionsDialog::editKeyword(QListWidgetItem *item) item->setIcon(icon(keyword.iconType)); item->setText(keyword.name); item->setData(Qt::UserRole, static_cast(keyword.iconType)); - item->setTextColor(keyword.color); + item->setForeground(keyword.color); } } From ef102389a216d668b73e36f58342fd13217279c9 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 5 Jul 2019 11:53:01 +0200 Subject: [PATCH 12/53] Autotest: Avoid a deprecation warning Change-Id: I547f57957098d2e7674928a1055708e49afc04b6 Reviewed-by: Christian Stenger --- src/plugins/autotest/testcodeparser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp index 9b8942b76b8..755d0e57dea 100644 --- a/src/plugins/autotest/testcodeparser.cpp +++ b/src/plugins/autotest/testcodeparser.cpp @@ -491,7 +491,7 @@ void TestCodeParser::onPartialParsingFinished() void TestCodeParser::parsePostponedFiles() { m_reparseTimerTimedOut = true; - scanForTests(m_postponedFiles.toList()); + scanForTests(Utils::toList(m_postponedFiles)); } void TestCodeParser::releaseParserInternals() From 9703f2e948183aa83c5dbd614bcb087ff134aa42 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 5 Jul 2019 09:56:23 +0200 Subject: [PATCH 13/53] CppTools: Avoid some deprecation warnings Change-Id: I0726bbcf9fd3992312e5980bd176ce85903f27a9 Reviewed-by: Nikolai Kosjar --- src/plugins/cpptools/cpptoolstestcase.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/cpptools/cpptoolstestcase.cpp b/src/plugins/cpptools/cpptoolstestcase.cpp index 5ed334b2e84..22e2567b44f 100644 --- a/src/plugins/cpptools/cpptoolstestcase.cpp +++ b/src/plugins/cpptools/cpptoolstestcase.cpp @@ -146,7 +146,7 @@ static bool waitForProcessedEditorDocument_internal(CppEditorDocumentHandle *edi { QTC_ASSERT(editorDocument, return false); - QTime timer; + QElapsedTimer timer; timer.start(); forever { @@ -208,7 +208,7 @@ CPlusPlus::Document::Ptr TestCase::waitForFileInGlobalSnapshot(const QString &fi QList TestCase::waitForFilesInGlobalSnapshot(const QStringList &filePaths, int timeOutInMs) { - QTime t; + QElapsedTimer t; t.start(); QList result; @@ -231,7 +231,7 @@ bool TestCase::waitUntilCppModelManagerIsAwareOf(Project *project, int timeOutIn if (!project) return false; - QTime t; + QElapsedTimer t; t.start(); CppModelManager *modelManager = CppModelManager::instance(); @@ -275,7 +275,7 @@ ProjectOpenerAndCloser::~ProjectOpenerAndCloser() foreach (Project *project, m_openProjects) ProjectExplorerPlugin::unloadProject(project); - QTime t; + QElapsedTimer t; t.start(); while (!hasGcFinished && t.elapsed() <= 30000) QCoreApplication::processEvents(); From 49525c578cbc3b42bd753cf0197dd4f440be47f8 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 26 Jun 2019 15:10:07 +0200 Subject: [PATCH 14/53] Unify disabling build of llvm related plugins or test on Windows If libclang's build mode mismatches the current build mode of Qt Creator some plugins are automatically disabled. Do the same for the unittest and unify the way to do this. Change-Id: Ib4cd6494ed63cb89ed8d99b3c0ba23a19572fc9b Reviewed-by: Marco Bubke --- src/plugins/clangformat/clangformat.pro | 5 --- .../clangrefactoring/clangrefactoring.pro | 5 --- src/shared/clang/clang_installation.pri | 36 ++++++++++++------- tests/unit/unittest/unittest.pro | 2 ++ 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/plugins/clangformat/clangformat.pro b/src/plugins/clangformat/clangformat.pro index e1ccdb98dc1..4d751db2ba4 100644 --- a/src/plugins/clangformat/clangformat.pro +++ b/src/plugins/clangformat/clangformat.pro @@ -6,11 +6,6 @@ include(../../shared/clang/clang_defines.pri) requires(!isEmpty(CLANGFORMAT_LIBS)) -win32 { - LLVM_BUILDMODE = $$system($$llvm_config --build-mode, lines) - CONFIG(debug, debug|release):requires(equals(LLVM_BUILDMODE, "Debug")) -} - LIBS += $$CLANGFORMAT_LIBS INCLUDEPATH += $$LLVM_INCLUDEPATH diff --git a/src/plugins/clangrefactoring/clangrefactoring.pro b/src/plugins/clangrefactoring/clangrefactoring.pro index b5dc2a9956e..d23e9a9a442 100644 --- a/src/plugins/clangrefactoring/clangrefactoring.pro +++ b/src/plugins/clangrefactoring/clangrefactoring.pro @@ -6,11 +6,6 @@ include(../../shared/clang/clang_defines.pri) requires(!isEmpty(LIBTOOLING_LIBS)) -win32 { - LLVM_BUILDMODE = $$system($$llvm_config --build-mode, lines) - CONFIG(debug, debug|release):requires(equals(LLVM_BUILDMODE, "Debug")) -} - HEADERS += \ clangrefactoringplugin.h \ baseclangquerytexteditorwidget.h \ diff --git a/src/shared/clang/clang_installation.pri b/src/shared/clang/clang_installation.pri index 980ad4bff68..df3ce19db20 100644 --- a/src/shared/clang/clang_installation.pri +++ b/src/shared/clang/clang_installation.pri @@ -195,14 +195,24 @@ isEmpty(LLVM_VERSION) { LLVM_STATIC_LIBS = $$split(LLVM_STATIC_LIBS_STRING, " ") - CLANGFORMAT_MAIN_HEADER = $$LLVM_INCLUDEPATH/clang/Format/Format.h - exists($$CLANGFORMAT_MAIN_HEADER) { - CLANGFORMAT_LIBS=-lclangFormat -lclangToolingInclusions -lclangToolingCore -lclangRewrite -lclangLex -lclangBasic - ALL_CLANG_LIBS=-lclangFormat -lclangToolingInclusions -lclangTooling -lclangToolingCore \ - -lclangRewrite -lclangIndex -lclangFrontend -lclangParse -lclangSerialization \ - -lclangSema -lclangEdit -lclangAnalysis -lclangDriver -lclangDynamicASTMatchers \ - -lclangASTMatchers -lclangAST -lclangLex -lclangBasic - win32:CLANGFORMAT_LIBS += -lversion + win32 { + LLVM_BUILDMODE = $$system($$llvm_config --build-mode, lines) + CONFIG(debug, debug|release):!equals(LLVM_BUILDMODE, "Debug") { + message("Mismatching build config (Debug vs Release) setting QTC_CLANG_BUILDMODE_MISMATCH") + QTC_CLANG_BUILDMODE_MISMATCH=1 + } + } + + isEmpty(QTC_CLANG_BUILDMODE_MISMATCH)|!equals(QTC_CLANG_BUILDMODE_MISMATCH, 1) { + CLANGFORMAT_MAIN_HEADER = $$LLVM_INCLUDEPATH/clang/Format/Format.h + exists($$CLANGFORMAT_MAIN_HEADER) { + CLANGFORMAT_LIBS=-lclangFormat -lclangToolingInclusions -lclangToolingCore -lclangRewrite -lclangLex -lclangBasic + ALL_CLANG_LIBS=-lclangFormat -lclangToolingInclusions -lclangTooling -lclangToolingCore \ + -lclangRewrite -lclangIndex -lclangFrontend -lclangParse -lclangSerialization \ + -lclangSema -lclangEdit -lclangAnalysis -lclangDriver -lclangDynamicASTMatchers \ + -lclangASTMatchers -lclangAST -lclangLex -lclangBasic + win32:CLANGFORMAT_LIBS += -lversion + } } win32:ALL_CLANG_LIBS += -lversion @@ -225,10 +235,12 @@ isEmpty(LLVM_VERSION) { !contains(QMAKE_DEFAULT_LIBDIRS, $$LLVM_LIBDIR): LIBCLANG_LIBS = -L$${LLVM_LIBDIR} LIBCLANG_LIBS += $${CLANG_LIB} - QTC_DISABLE_CLANG_REFACTORING=$$(QTC_DISABLE_CLANG_REFACTORING) - isEmpty(QTC_DISABLE_CLANG_REFACTORING) { - !contains(QMAKE_DEFAULT_LIBDIRS, $$LLVM_LIBDIR): LIBTOOLING_LIBS = -L$${LLVM_LIBDIR} - LIBTOOLING_LIBS += $$CLANGTOOLING_LIBS $$LLVM_STATIC_LIBS + isEmpty(QTC_CLANG_BUILDMODE_MISMATCH)|!equals(QTC_CLANG_BUILDMODE_MISMATCH, 1) { + QTC_DISABLE_CLANG_REFACTORING=$$(QTC_DISABLE_CLANG_REFACTORING) + isEmpty(QTC_DISABLE_CLANG_REFACTORING) { + !contains(QMAKE_DEFAULT_LIBDIRS, $$LLVM_LIBDIR): LIBTOOLING_LIBS = -L$${LLVM_LIBDIR} + LIBTOOLING_LIBS += $$CLANGTOOLING_LIBS $$LLVM_STATIC_LIBS + } } !isEmpty(CLANGFORMAT_LIBS) { diff --git a/tests/unit/unittest/unittest.pro b/tests/unit/unittest/unittest.pro index 6565c47a092..c64d22925b6 100644 --- a/tests/unit/unittest/unittest.pro +++ b/tests/unit/unittest/unittest.pro @@ -9,6 +9,8 @@ include(clang_dependency.pri) include(creator_dependency.pri) include(benchmark_dependency.pri) +requires(isEmpty(QTC_CLANG_BUILDMODE_MISMATCH)) + OBJECTS_DIR = $$OUT_PWD/obj # workaround for qmake bug in object_parallel_to_source !msvc:force_debug_info:QMAKE_CXXFLAGS += -fno-omit-frame-pointer From 1d010e2686db6d553623b16c45013e14dd2a6541 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 5 Jul 2019 09:18:20 +0200 Subject: [PATCH 15/53] Clang: Remove unused member Change-Id: Ib9af2f32bc69c34570d5276f03b660111ec3fe1b Reviewed-by: Christian Stenger --- src/libs/clangsupport/requestcompletionsmessage.cpp | 1 - src/libs/clangsupport/requestcompletionsmessage.h | 1 - tests/unit/unittest/gtest-creator-printing.cpp | 1 - 3 files changed, 3 deletions(-) diff --git a/src/libs/clangsupport/requestcompletionsmessage.cpp b/src/libs/clangsupport/requestcompletionsmessage.cpp index bb2fdcb9825..156768d0ae2 100644 --- a/src/libs/clangsupport/requestcompletionsmessage.cpp +++ b/src/libs/clangsupport/requestcompletionsmessage.cpp @@ -38,7 +38,6 @@ QDebug operator<<(QDebug debug, const RequestCompletionsMessage &message) debug.nospace() << message.filePath << ", "; debug.nospace() << message.line << ", "; debug.nospace() << message.column << ", "; - debug.nospace() << message.projectPartId << ", "; debug.nospace() << message.ticketNumber; debug.nospace() << message.funcNameStartLine << ", "; debug.nospace() << message.funcNameStartColumn << ", "; diff --git a/src/libs/clangsupport/requestcompletionsmessage.h b/src/libs/clangsupport/requestcompletionsmessage.h index 3319549fecf..fa9bd9aebb9 100644 --- a/src/libs/clangsupport/requestcompletionsmessage.h +++ b/src/libs/clangsupport/requestcompletionsmessage.h @@ -88,7 +88,6 @@ public: public: Utf8String filePath; - Utf8String projectPartId; static CLANGSUPPORT_EXPORT quint64 ticketCounter; quint64 ticketNumber = 0; quint32 line = 0; diff --git a/tests/unit/unittest/gtest-creator-printing.cpp b/tests/unit/unittest/gtest-creator-printing.cpp index 737120abb25..773a6321424 100644 --- a/tests/unit/unittest/gtest-creator-printing.cpp +++ b/tests/unit/unittest/gtest-creator-printing.cpp @@ -402,7 +402,6 @@ std::ostream &operator<<(std::ostream &os, const RequestCompletionsMessage &mess << message.filePath << ", " << message.line << ", " << message.column << ", " - << message.projectPartId << ", " << message.ticketNumber << ", " << message.funcNameStartLine << ", " << message.funcNameStartColumn From 9ae2794114b73f7260730166461ee76b44c9fca6 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 5 Jul 2019 13:43:54 +0200 Subject: [PATCH 16/53] Remove more deprecation warnings Change-Id: Ie50e41737a4bf7bea41f550df7cc765267e8a144 Reviewed-by: Christian Stenger --- src/plugins/clangcodemodel/test/clangbatchfileprocessor.cpp | 5 +++-- src/plugins/classview/classviewnavigationwidget.cpp | 3 ++- src/plugins/classview/classviewparser.cpp | 3 ++- src/plugins/debugger/breakhandler.cpp | 4 ++-- src/plugins/debugger/debuggermainwindow.cpp | 2 +- src/plugins/designer/formeditorw.cpp | 5 +++-- src/plugins/modeleditor/packageviewcontroller.cpp | 4 +++- src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp | 6 +++--- src/plugins/todo/cpptodoitemsscanner.cpp | 4 ++-- 9 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/plugins/clangcodemodel/test/clangbatchfileprocessor.cpp b/src/plugins/clangcodemodel/test/clangbatchfileprocessor.cpp index 79cc8ff81ab..c3ca95c6a0f 100644 --- a/src/plugins/clangcodemodel/test/clangbatchfileprocessor.cpp +++ b/src/plugins/clangcodemodel/test/clangbatchfileprocessor.cpp @@ -50,6 +50,7 @@ #include #include +#include #include #include #include @@ -302,7 +303,7 @@ WaitForUpdatedCodeWarnings::WaitForUpdatedCodeWarnings(ClangEditorDocumentProces bool WaitForUpdatedCodeWarnings::wait(int timeOutInMs) const { - QTime time; + QElapsedTimer time; time.start(); forever { @@ -580,7 +581,7 @@ bool ProcessEventsCommand::run() { qCDebug(debug) << "line" << context().lineNumber << "ProcessEventsCommand" << m_durationInMs; - QTime time; + QElapsedTimer time; time.start(); forever { diff --git a/src/plugins/classview/classviewnavigationwidget.cpp b/src/plugins/classview/classviewnavigationwidget.cpp index 3b7bcc68814..b2fd94427af 100644 --- a/src/plugins/classview/classviewnavigationwidget.cpp +++ b/src/plugins/classview/classviewnavigationwidget.cpp @@ -40,6 +40,7 @@ #include #include #include +#include enum { debug = false }; @@ -267,7 +268,7 @@ void NavigationWidget::onDataUpdate(QSharedPointer result) if (result.isNull()) return; - QTime timer; + QElapsedTimer timer; if (debug) timer.start(); // update is received. root item must be updated - and received information diff --git a/src/plugins/classview/classviewparser.cpp b/src/plugins/classview/classviewparser.cpp index 0ba865c7f2a..13f258b9ebc 100644 --- a/src/plugins/classview/classviewparser.cpp +++ b/src/plugins/classview/classviewparser.cpp @@ -53,6 +53,7 @@ #include #include #include +#include enum { debug = false }; @@ -274,7 +275,7 @@ ParserTreeItem::ConstPtr Parser::findItemByRoot(const QStandardItem *item, bool ParserTreeItem::ConstPtr Parser::parse() { - QTime time; + QElapsedTimer time; if (debug) time.start(); diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index ec8c062b04e..9ac8b0bfb49 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -1006,7 +1006,7 @@ Breakpoints BreakHandler::findBreakpointsByIndex(const QList &list) if (Breakpoint bp = findBreakpointByIndex(index)) items.insert(bp); } - return items.toList(); + return Utils::toList(items); } SubBreakpoints BreakHandler::findSubBreakpointsByIndex(const QList &list) const @@ -1016,7 +1016,7 @@ SubBreakpoints BreakHandler::findSubBreakpointsByIndex(const QList if (SubBreakpoint sbp = findSubBreakpointByIndex(index)) items.insert(sbp); } - return items.toList(); + return Utils::toList(items); } diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index 561c9e6e954..fc6e74b866e 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -442,7 +442,7 @@ void DebuggerMainWindow::restorePersistentSettings() theMainWindow->setAutoHideTitleBars(settings->value(AUTOHIDE_TITLEBARS_KEY, true).toBool()); theMainWindow->showCentralWidget(settings->value(SHOW_CENTRALWIDGET_KEY, true).toBool()); theMainWindow->d->m_persistentChangedDocks - = QSet::fromList(settings->value(CHANGED_DOCK_KEY).toStringList()); + = Utils::toSet(settings->value(CHANGED_DOCK_KEY).toStringList()); settings->endGroup(); qCDebug(perspectivesLog) << "LOADED DOCKS:" << theMainWindow->d->m_persistentChangedDocks; diff --git a/src/plugins/designer/formeditorw.cpp b/src/plugins/designer/formeditorw.cpp index d2114c4441a..09e89beed0f 100644 --- a/src/plugins/designer/formeditorw.cpp +++ b/src/plugins/designer/formeditorw.cpp @@ -77,6 +77,7 @@ #include #include #include +#include #include @@ -351,9 +352,9 @@ void FormEditorData::setupViewActions() void FormEditorData::fullInit() { QTC_ASSERT(m_initStage == FormEditorW::RegisterPlugins, return); - QTime *initTime = 0; + QElapsedTimer *initTime = 0; if (Designer::Constants::Internal::debug) { - initTime = new QTime; + initTime = new QElapsedTimer; initTime->start(); } diff --git a/src/plugins/modeleditor/packageviewcontroller.cpp b/src/plugins/modeleditor/packageviewcontroller.cpp index 37c665d4f05..8b45a2443ca 100644 --- a/src/plugins/modeleditor/packageviewcontroller.cpp +++ b/src/plugins/modeleditor/packageviewcontroller.cpp @@ -31,6 +31,8 @@ #include "qmt/model/mdependency.h" #include "qmt/model_controller/modelcontroller.h" +#include + #include namespace ModelEditor { @@ -151,7 +153,7 @@ void PackageViewController::createAncestorDependencies(qmt::MObject *object1, qm bool PackageViewController::haveMatchingStereotypes(const qmt::MObject *object1, const qmt::MObject *object2) { - return !(object1->stereotypes().toSet() & object2->stereotypes().toSet()).isEmpty(); + return !(Utils::toSet(object1->stereotypes()) & Utils::toSet(object2->stereotypes())).isEmpty(); } diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index 39206d971f2..1fffb8d2093 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -385,8 +385,8 @@ void QmakePriFile::watchFolders(const QSet &folders) QSet toWatch = folderStrings; toWatch.subtract(m_watchedFolders); - m_project->unwatchFolders(toUnwatch.toList(), this); - m_project->watchFolders(toWatch.toList(), this); + m_project->unwatchFolders(Utils::toList(toUnwatch), this); + m_project->watchFolders(Utils::toList(toWatch), this); m_watchedFolders = folderStrings; } @@ -1312,7 +1312,7 @@ QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input) result->includedFiles.children.insert(subDirName, subDir); } - result->exactSubdirs = subDirs.toSet(); + result->exactSubdirs = Utils::toSet(subDirs); } // Convert ProFileReader::includeFiles to IncludedPriFile structure diff --git a/src/plugins/todo/cpptodoitemsscanner.cpp b/src/plugins/todo/cpptodoitemsscanner.cpp index 938f7922fc3..2c6f8f0e1c4 100644 --- a/src/plugins/todo/cpptodoitemsscanner.cpp +++ b/src/plugins/todo/cpptodoitemsscanner.cpp @@ -59,8 +59,8 @@ void CppTodoItemsScanner::scannerParamsChanged() QSet filesToBeUpdated; foreach (const CppTools::ProjectInfo &info, modelManager->projectInfos()) - filesToBeUpdated.unite(Utils::transform(info.project().data()->files(ProjectExplorer::Project::SourceFiles), - &Utils::FilePath::toString).toSet()); + filesToBeUpdated.unite(Utils::transform(info.project().data()->files(ProjectExplorer::Project::SourceFiles), + &Utils::FilePath::toString)); modelManager->updateSourceFiles(filesToBeUpdated); } From 68027ec41b2f33274602f321a1ab7fd81cc4acaa Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 4 Jul 2019 18:05:17 +0200 Subject: [PATCH 17/53] QmlJS: Avoid deprecation warnings Change-Id: Ifeaf0599f0507a0a10dd9683081a48d3232b414a Reviewed-by: Christian Stenger --- src/libs/qmljs/qmljssimplereader.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libs/qmljs/qmljssimplereader.cpp b/src/libs/qmljs/qmljssimplereader.cpp index 247e92d58ac..f97770ade92 100644 --- a/src/libs/qmljs/qmljssimplereader.cpp +++ b/src/libs/qmljs/qmljssimplereader.cpp @@ -92,7 +92,7 @@ SimpleReaderNode::Ptr SimpleReaderNode::create(const QString &name, WeakPtr pare Ptr newNode(new SimpleReaderNode(name, parent)); newNode->m_weakThis = newNode; if (parent) - parent.data()->m_children.append(newNode); + parent.toStrongRef().data()->m_children.append(newNode); return newNode; } @@ -323,21 +323,21 @@ void SimpleReader::elementEnd() { Q_ASSERT(m_currentNode); - qCDebug(simpleReaderLog) << "elementEnd()" << m_currentNode.data()->name(); + qCDebug(simpleReaderLog) << "elementEnd()" << m_currentNode.toStrongRef().data()->name(); - m_currentNode = m_currentNode.data()->parent(); + m_currentNode = m_currentNode.toStrongRef().data()->parent(); } void SimpleReader::propertyDefinition(const QString &name, const QVariant &value) { Q_ASSERT(m_currentNode); - qCDebug(simpleReaderLog) << "propertyDefinition()" << m_currentNode.data()->name() << name << value; + qCDebug(simpleReaderLog) << "propertyDefinition()" << m_currentNode.toStrongRef().data()->name() << name << value; - if (m_currentNode.data()->propertyNames().contains(name)) + if (m_currentNode.toStrongRef().data()->propertyNames().contains(name)) addError(tr("Property is defined twice."), currentSourceLocation()); - m_currentNode.data()->setProperty(name, value); + m_currentNode.toStrongRef().data()->setProperty(name, value); } } // namespace QmlJS From 6fc7d158dfc17517db743bab21d2315a02109e63 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 24 Jun 2019 15:36:20 +0200 Subject: [PATCH 18/53] RemoteLinux: Add missing check for stat failure Task-number: QTCREATORBUG-22603 Change-Id: I5f5daefb039e48eb1983cf111859709233ca489a Reviewed-by: Tom Hall Reviewed-by: hjk --- .../remotelinux/genericdirectuploadservice.cpp | 11 ++++++----- src/plugins/remotelinux/genericdirectuploadservice.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/plugins/remotelinux/genericdirectuploadservice.cpp b/src/plugins/remotelinux/genericdirectuploadservice.cpp index 84779d373eb..5cf35e6e242 100644 --- a/src/plugins/remotelinux/genericdirectuploadservice.cpp +++ b/src/plugins/remotelinux/genericdirectuploadservice.cpp @@ -132,11 +132,12 @@ void GenericDirectUploadService::doDeploy() } QDateTime GenericDirectUploadService::timestampFromStat(const DeployableFile &file, - SshRemoteProcess *statProc) + SshRemoteProcess *statProc, + const QString &errorMsg) { QString errorDetails; - if (statProc->exitStatus() != QProcess::NormalExit) - errorDetails = statProc->errorString(); + if (!errorMsg.isEmpty()) + errorDetails = errorMsg; else if (statProc->exitCode() != 0) errorDetails = QString::fromUtf8(statProc->readAllStandardError()); if (!errorDetails.isEmpty()) { @@ -242,11 +243,11 @@ void GenericDirectUploadService::queryFiles() SshRemoteProcess * const statProc = connection()->createRemoteProcess(statCmd).release(); statProc->setParent(this); connect(statProc, &SshRemoteProcess::done, this, - [this, statProc, state = d->state] { + [this, statProc, state = d->state](const QString &errorMsg) { QTC_ASSERT(d->state == state, return); const DeployableFile file = d->getFileForProcess(statProc); QTC_ASSERT(file.isValid(), return); - const QDateTime timestamp = timestampFromStat(file, statProc); + const QDateTime timestamp = timestampFromStat(file, statProc, errorMsg); statProc->deleteLater(); switch (state) { case PreChecking: diff --git a/src/plugins/remotelinux/genericdirectuploadservice.h b/src/plugins/remotelinux/genericdirectuploadservice.h index c41f8f99cca..9f8f6b70f78 100644 --- a/src/plugins/remotelinux/genericdirectuploadservice.h +++ b/src/plugins/remotelinux/genericdirectuploadservice.h @@ -62,7 +62,7 @@ public: private: QDateTime timestampFromStat(const ProjectExplorer::DeployableFile &file, - QSsh::SshRemoteProcess *statProc); + QSsh::SshRemoteProcess *statProc, const QString &errorMsg); void checkForStateChangeOnRemoteProcFinished(); QList collectFilesToUpload( From 79fd852f70f285009a881ae9bea7b424d42c2879 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 5 Jul 2019 14:26:43 +0200 Subject: [PATCH 19/53] Cmake: Fix deprecation warning ... and use the result of the expression, which was previously computed but not used. Change-Id: Ic995d2842e71bf57ea404494e3586205a0c154e9 Reviewed-by: Christian Kandeler --- src/plugins/cmakeprojectmanager/cmaketool.cpp | 3 +-- src/plugins/qtsupport/gettingstartedwelcomepage.cpp | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index ac0ac0999e9..8ba4fbcbba1 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -341,8 +341,7 @@ static QStringList parseDefinition(const QString &definition) void CMakeTool::parseFunctionDetailsOutput(const QString &output) { - QSet functionSet; - functionSet.fromList(m_introspection->m_functions); + const QSet functionSet = Utils::toSet(m_introspection->m_functions); bool expectDefinition = false; QString currentDefinition; diff --git a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp index fdc594866eb..0b34c9b8097 100644 --- a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp +++ b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -608,7 +609,7 @@ private: const QColor foregroundColor2 = themeColor(Theme::Welcome_ForegroundSecondaryColor); // blacker. mutable QPersistentModelIndex m_previousIndex; - mutable QTime m_startTime; + mutable QElapsedTimer m_startTime; mutable QRect m_currentArea; mutable QPointer m_currentWidget; mutable QVector> m_currentTagRects; From 72c359f355eba0dcb82e61c02acc6d1a30dafa87 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 5 Jul 2019 14:49:45 +0200 Subject: [PATCH 20/53] Update qbs submodule MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To HEAD of 1.14 branch. Change-Id: Ic0edd8ef8dd92d483b816ea49268b312296d94c5 Reviewed-by: Jörg Bornemann --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index e0ac40e53c5..27b78ea67f8 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit e0ac40e53c5fc16b675ea2ac63fb5f3a6cab3dee +Subproject commit 27b78ea67f82fca051666599603273c12ecb403b From 6d60c7c1a94dc2d847e53e66e7f35ca40617c862 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Fri, 5 Jul 2019 16:25:48 +0200 Subject: [PATCH 21/53] QmlDesigner: Fix RealSpinBox interaction * Fix RealSpinBox drag behavior * Fix RealSpinBox wheel behavior with step sizes * Fix DoubleSpinBox hide cursor on drag Task-number: QDS-650 Change-Id: I5ddbf4815aba88e134c8e806e91521083dda543c Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/DoubleSpinBox.qml | 3 + .../imports/StudioControls/RealSpinBox.qml | 19 +++++-- .../StudioControls/RealSpinBoxInput.qml | 55 ++++++++++++++++--- .../imports/StudioTheme/Values.qml | 1 + 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml index fbe5031b403..eb2f43e5af1 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml @@ -49,6 +49,9 @@ Item { StudioControls.RealSpinBox { id: spinBox + onDragStarted: hideCursor(); + onDragEnded: restoreCursor(); + property bool hasSlider: spinBox.sliderIndicatorVisible width: wrapper.width diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml index 68ad7f6aa6d..3c1faec2d8c 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml @@ -40,13 +40,21 @@ T.SpinBox { property int decimals: 0 - property real minStepSize: 1 - property real maxStepSize: 10 + property real minStepSize: { + var tmpMinStepSize = Number((mySpinBox.realStepSize * 0.1).toFixed(mySpinBox.decimals)) + return (tmpMinStepSize) ? tmpMinStepSize : mySpinBox.realStepSize + } + property real maxStepSize: { + var tmpMaxStepSize = Number((mySpinBox.realStepSize * 10.0).toFixed(mySpinBox.decimals)) + return (tmpMaxStepSize < mySpinBox.realTo) ? tmpMaxStepSize : mySpinBox.realStepSize + } property bool edit: spinBoxInput.activeFocus property bool hover: false // This property is used to indicate the global hover state property bool drag: false + property real realDragRange: realTo - realFrom + property alias actionIndicatorVisible: actionIndicator.visible property real __actionIndicatorWidth: StudioTheme.Values.squareComponentWidth property real __actionIndicatorHeight: StudioTheme.Values.height @@ -246,11 +254,10 @@ T.SpinBox { onRealValueChanged: { spinBoxInput.text = mySpinBox.textFromValue(mySpinBox.realValue, mySpinBox.locale) - mySpinBox.value = 0 // Without setting value back to 0, it can occur that one of + mySpinBox.value = 0 // Without setting value back to 0, it can happen that one of // the indicator will be disabled due to range logic. } onRealValueModified: myTimer.restart() - onFocusChanged: mySpinBox.setValueFromInput() onDisplayTextChanged: spinBoxInput.text = mySpinBox.displayText onActiveFocusChanged: { @@ -269,7 +276,7 @@ T.SpinBox { // Store current step size var currStepSize = mySpinBox.realStepSize - // Set stepSize according to used modifier key + // Set realStepSize according to used modifier key if (event.modifiers & Qt.ControlModifier) mySpinBox.realStepSize = mySpinBox.minStepSize @@ -281,7 +288,7 @@ T.SpinBox { else mySpinBox.realDecrease() - // Reset step size + // Reset realStepSize mySpinBox.realStepSize = currStepSize } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml index 91f4d667e18..7de0eb735e7 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml @@ -76,28 +76,56 @@ TextInput { acceptedDevices: PointerDevice.Mouse enabled: true - property real initialValue: 0 + property real initialValue: myControl.realValue + property real multiplier: 1.0 onActiveChanged: { if (dragHandler.active) { dragHandler.initialValue = myControl.realValue - mouseArea.cursorShape = Qt.ClosedHandCursor + mouseArea.cursorShape = Qt.ClosedHandCursor // TODO myControl.drag = true myControl.dragStarted() + // Force focus on the non visible component to receive key events + dragModifierWorkaround.forceActiveFocus() } else { - mouseArea.cursorShape = Qt.PointingHandCursor + mouseArea.cursorShape = Qt.PointingHandCursor // TODO myControl.drag = false myControl.dragEnded() + // Avoid active focus on the component after dragging + dragModifierWorkaround.focus = false + textInput.focus = false + myControl.focus = false } } - onTranslationChanged: { + onTranslationChanged: calcValue() + onMultiplierChanged: calcValue() + + function calcValue() { + var tmp = myControl.realDragRange / StudioTheme.Values.dragLength var currValue = myControl.realValue - myControl.setRealValue(dragHandler.initialValue + (translation.x * myControl.realStepSize)) + myControl.setRealValue(dragHandler.initialValue + (tmp * dragHandler.translation.x * dragHandler.multiplier)) if (currValue !== myControl.realValue) myControl.realValueModified() } } + Item { + id: dragModifierWorkaround + Keys.onPressed: { + event.accepted = true + + if (event.modifiers & Qt.ControlModifier) + dragHandler.multiplier = 0.1 + + if (event.modifiers & Qt.ShiftModifier) + dragHandler.multiplier = 10.0 + } + Keys.onReleased: { + event.accepted = true + dragHandler.multiplier = 1.0 + } + } + TapHandler { id: tapHandler acceptedDevices: PointerDevice.Mouse @@ -110,6 +138,9 @@ TextInput { MouseArea { id: mouseArea + + property real stepSize: myControl.realStepSize + anchors.fill: parent enabled: true hoverEnabled: true @@ -123,12 +154,22 @@ TextInput { if (!myControl.__wheelEnabled) return + // Set stepSize according to used modifier key + if (wheel.modifiers & Qt.ControlModifier) + mouseArea.stepSize = myControl.minStepSize + + if (wheel.modifiers & Qt.ShiftModifier) + mouseArea.stepSize = myControl.maxStepSize + var currValue = myControl.realValue myControl.valueFromText(textInput.text, myControl.locale) - myControl.setRealValue(myControl.realValue + (wheel.angleDelta.y / 120.0 * myControl.realStepSize)) + myControl.setRealValue(myControl.realValue + (wheel.angleDelta.y / 120.0 * mouseArea.stepSize)) if (currValue !== myControl.realValue) myControl.realValueModified() + + // Reset stepSize + mouseArea.stepSize = myControl.realStepSize } } @@ -166,7 +207,7 @@ TextInput { }, State { name: "edit" - when: textInput.edit + when: textInput.edit && !myControl.drag PropertyChanges { target: textInputArea color: StudioTheme.Values.themeFocusEdit diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml index d02d75446ce..67438bc14b2 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml @@ -49,6 +49,7 @@ QtObject { property real sliderControlSize: 12 property real sliderControlSizeMulti: values.sliderControlSize * values.scaleFactor + property int dragLength: 400 // px property real spinControlIconSize: 8 property real spinControlIconSizeMulti: values.spinControlIconSize * values.scaleFactor From 89fb3d25a05a2d4bd739079cb98525b68f133648 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 3 Jul 2019 13:25:59 +0200 Subject: [PATCH 22/53] Doc: Update info on Qt for Python app wizards Move the section higher up in "Creating projects" and add a screenshot of the wizard. Change-Id: Ifc48026162ff58d58ef22673d3113cb185d1c887 Reviewed-by: Cristian Maureira-Fredes --- .../qtcreator-python-wizard-app-window.png | Bin 0 -> 16652 bytes .../creator-projects-creating.qdoc | 4 +-- doc/src/python/creator-python-project.qdocinc | 27 +++++++++++------- 3 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 doc/images/qtcreator-python-wizard-app-window.png diff --git a/doc/images/qtcreator-python-wizard-app-window.png b/doc/images/qtcreator-python-wizard-app-window.png new file mode 100644 index 0000000000000000000000000000000000000000..30e5230645bfbb54b8d0504175ce8bd5c1e269b8 GIT binary patch literal 16652 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 literal 0 HcmV?d00001 diff --git a/doc/src/projects/creator-only/creator-projects-creating.qdoc b/doc/src/projects/creator-only/creator-projects-creating.qdoc index 37b3224cd6e..ab35b3dd6a5 100644 --- a/doc/src/projects/creator-only/creator-projects-creating.qdoc +++ b/doc/src/projects/creator-only/creator-projects-creating.qdoc @@ -256,6 +256,8 @@ For more information about creating Qt Quick projects, see \l {Creating Qt Quick Projects}. + \include creator-python-project.qdocinc python project wizards + \section1 Adding Files to Projects You can use wizards also to add individual files to your projects. @@ -408,8 +410,6 @@ The above functions are also available in the context menu in the \uicontrol Projects view. - \include creator-python-project.qdocinc python project wizards - \section2 Creating OpenGL Fragment and Vertex Shaders Qt provides support for integration with OpenGL implementations on all diff --git a/doc/src/python/creator-python-project.qdocinc b/doc/src/python/creator-python-project.qdocinc index fdb58155a6a..c74af5359d6 100644 --- a/doc/src/python/creator-python-project.qdocinc +++ b/doc/src/python/creator-python-project.qdocinc @@ -42,22 +42,28 @@ use \c {.pyqtc} files, but we recommend that you choose \c{.pyproject} files for new projects. - The Window wizard adds the following imports to the \c {main.py} - file to provide access to the QApplication and QMainWindow classes - in the Qt Widgets module: + The \uicontrol {Qt for Python - Window} wizard enables you to create a + Python source file for a new class that you can add to a Python project. + Specify the class name, base class, and and source file for the class. + + \image qtcreator-python-wizard-app-window.png + + The Window wizard adds the imports to the source file to provide + access to the QApplication and the base class you selected in the Qt + Widgets module: \badcode import sys - from PySide2.QtWidgets import QApplication, QMainWindow + from PySide2.QtWidgets import QApplication, QWidget \endcode - The Window wizard also adds a \c MainWindow class that inherits from - QMainWindow: + The Window wizard also adds a main class with the specified name that + inherits from the specified base class: \badcode - class MainWindow(QMainWindow): + class MyWidget(QWidget): def __init__(self): - QMainWindow.__init__(self) + QWidget.__init__(self) \endcode Next, the Window wizard adds a main function, where it creates a @@ -68,13 +74,12 @@ \badcode if __name__ == "__main__": app = QApplication([]) - ... \endcode Next, the Window wizard instantiates the \c MainWindow class and shows it: \badcode - window = MainWindow() + window = MyWidget() window.show() ... \endcode @@ -86,7 +91,7 @@ sys.exit(app.exec_()) \endcode - The Empty wizard adds similar code to the \c {main.py} file, but it does + The Empty wizard adds similar code to the source file, but it does not add any classes, so you need to add and instantiate them yourself. For examples of creating Qt for Python applications, see From 918710737d7b531983c4e33753905de486dd42b7 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Fri, 28 Jun 2019 16:22:44 +0200 Subject: [PATCH 23/53] QmlDebug: Destroy connection before signaling failure or retrying Having the old local server still open can lead to some client connecting after we have already signaled a failure, thus "undoing" the failure. This leads to some interesting UI glitches. Fixes: QTCREATORBUG-22641 Change-Id: I135ad59fce5c9eb696221a212f54460126e4830f Reviewed-by: Christian Stenger Reviewed-by: Christian Kandeler --- src/libs/qmldebug/qmldebugconnectionmanager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/qmldebug/qmldebugconnectionmanager.cpp b/src/libs/qmldebug/qmldebugconnectionmanager.cpp index 02d9297cace..217260d8d2b 100644 --- a/src/libs/qmldebug/qmldebugconnectionmanager.cpp +++ b/src/libs/qmldebug/qmldebugconnectionmanager.cpp @@ -130,6 +130,7 @@ void QmlDebugConnectionManager::startLocalServer() if (!m_connection || ++(m_numRetries) >= m_maximumRetries) { stopConnectionTimer(); + destroyConnection(); emit connectionFailed(); } }); @@ -145,10 +146,10 @@ void QmlDebugConnectionManager::startLocalServer() void QmlDebugConnectionManager::retryConnect() { + destroyConnection(); if (m_server.scheme() == Utils::urlSocketScheme()) { startLocalServer(); } else if (m_server.scheme() == Utils::urlTcpScheme()) { - destroyConnection(); connectToTcpServer(); } else { emit connectionFailed(); From 6e6dc32ad0eb05920193456d266d2c3c8cd80b5c Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sat, 6 Jul 2019 22:07:10 +0300 Subject: [PATCH 24/53] CMake: Fix build This amends commit 376aae271132b39664d381f00bdcd45856acbd73 Change-Id: I63e94c7e720f4f18fcf0f47b6e7af7e471c84df5 Reviewed-by: Alessandro Portale --- src/libs/clangsupport/CMakeLists.txt | 2 -- src/tools/clangrefactoringbackend/source/CMakeLists.txt | 5 ----- src/tools/qml2puppet/CMakeLists.txt | 1 + tests/unit/unittest/CMakeLists.txt | 1 - 4 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/libs/clangsupport/CMakeLists.txt b/src/libs/clangsupport/CMakeLists.txt index 0366d74f8c1..b3c20f30620 100644 --- a/src/libs/clangsupport/CMakeLists.txt +++ b/src/libs/clangsupport/CMakeLists.txt @@ -113,7 +113,6 @@ add_qtc_library(ClangSupport requestcompletionsmessage.cpp requestcompletionsmessage.h requestfollowsymbolmessage.cpp requestfollowsymbolmessage.h requestreferencesmessage.cpp requestreferencesmessage.h - requestsourcelocationforrenamingmessage.cpp requestsourcelocationforrenamingmessage.h requestsourcerangesanddiagnosticsforquerymessage.cpp requestsourcerangesanddiagnosticsforquerymessage.h requestsourcerangesforquerymessage.cpp requestsourcerangesforquerymessage.h requesttooltipmessage.cpp requesttooltipmessage.h @@ -121,7 +120,6 @@ add_qtc_library(ClangSupport sourcelocationcontainer.cpp sourcelocationcontainer.h sourcelocationcontainerv2.cpp sourcelocationcontainerv2.h sourcelocationscontainer.cpp sourcelocationscontainer.h - sourcelocationsforrenamingmessage.cpp sourcelocationsforrenamingmessage.h sourcerangecontainer.cpp sourcerangecontainer.h sourcerangecontainerv2.cpp sourcerangecontainerv2.h sourcerangesanddiagnosticsforquerymessage.cpp sourcerangesanddiagnosticsforquerymessage.h diff --git a/src/tools/clangrefactoringbackend/source/CMakeLists.txt b/src/tools/clangrefactoringbackend/source/CMakeLists.txt index 6c149bf9cd5..05c7c8a3ce7 100644 --- a/src/tools/clangrefactoringbackend/source/CMakeLists.txt +++ b/src/tools/clangrefactoringbackend/source/CMakeLists.txt @@ -19,9 +19,6 @@ add_qtc_library(clangrefactoringbackend_lib STATIC collectmacrossourcefilecallbacks.cpp collectmacrossourcefilecallbacks.h collectsymbolsaction.cpp collectsymbolsaction.h filestatuspreprocessorcallbacks.cpp filestatuspreprocessorcallbacks.h - findcursorusr.h - findlocationsofusrs.h - findusrforcursoraction.cpp findusrforcursoraction.h indexdataconsumer.cpp indexdataconsumer.h locationsourcefilecallbacks.cpp locationsourcefilecallbacks.h macropreprocessorcallbacks.cpp macropreprocessorcallbacks.h @@ -35,14 +32,12 @@ add_qtc_library(clangrefactoringbackend_lib STATIC sourcerangefilter.cpp sourcerangefilter.h sourcesmanager.h symbolentry.h - symbolfinder.cpp symbolfinder.h symbolindexer.cpp symbolindexer.h symbolindexertask.h symbolindexertaskqueue.h symbolindexertaskqueueinterface.h symbolindexing.cpp symbolindexing.h symbolindexinginterface.h - symbollocationfinderaction.cpp symbollocationfinderaction.h symbolscollector.cpp symbolscollector.h symbolscollectorinterface.h symbolstorage.h diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 8eda7bf132f..6ee231bb20e 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -17,6 +17,7 @@ add_qtc_executable(qml2puppet extend_qtc_executable(qml2puppet SOURCES_PREFIX "${SRCDIR}/commands" + INCLUDES "${CMAKE_SOURCE_DIR}/src/libs" SOURCES changeauxiliarycommand.cpp changeauxiliarycommand.h changebindingscommand.cpp changebindingscommand.h diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt index 16ef5a9d9f3..d0895c534f2 100644 --- a/tests/unit/unittest/CMakeLists.txt +++ b/tests/unit/unittest/CMakeLists.txt @@ -262,7 +262,6 @@ if (TARGET clangTooling) sourcerangeextractor-test.cpp symbolindexing-test.cpp symbolscollector-test.cpp - symbolfinder-test.cpp testclangtool.cpp testclangtool.h usedmacrocollector-test.cpp builddependencycollector-test.cpp From 69d8b7f739b2104f4b776e6bfecc81cdacf01f33 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 5 Jul 2019 12:17:17 +0200 Subject: [PATCH 25/53] Clang: Fix tidy checks generateClangTidyChecks.py generated funny output as it was not considering new major categories. Fixes: QTCREATORBUG-22450 Change-Id: Ibd6d0cc7539c9fb846caacbe936770d0c960f04f Reviewed-by: Christian Stenger --- scripts/generateClangTidyChecks.py | 4 +- .../cpptools/cpptools_clangtidychecks.h | 37 +++++++++++++------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/scripts/generateClangTidyChecks.py b/scripts/generateClangTidyChecks.py index 627489521e6..75a55329aa6 100755 --- a/scripts/generateClangTidyChecks.py +++ b/scripts/generateClangTidyChecks.py @@ -150,9 +150,9 @@ def main(): process = subprocess.Popen([arguments.tidypath, '-checks=*', '-list-checks'], stdout=subprocess.PIPE) lines = process.stdout.read().splitlines() lines.pop(0) # 'Enabled checks:' - major_checks = ['android-', 'boost-', 'bugprone-', 'cert-', 'clang-analyzer-', + major_checks = ['abseil-', 'android-', 'boost-', 'bugprone-', 'cert-', 'clang-analyzer-', 'cppcoreguidelines-', 'fuchsia-', 'google-', 'hicpp-', 'llvm-', 'misc-', 'modernize-', - 'mpi-', 'objc-', 'performance-', 'readability-'] + 'mpi-', 'objc-', 'performance-', 'portability-', 'readability-', 'zircon-'] current_major = 0 major_groups = {} for line in lines: diff --git a/src/plugins/cpptools/cpptools_clangtidychecks.h b/src/plugins/cpptools/cpptools_clangtidychecks.h index 813e9b9ed55..7178b3aa922 100644 --- a/src/plugins/cpptools/cpptools_clangtidychecks.h +++ b/src/plugins/cpptools/cpptools_clangtidychecks.h @@ -48,10 +48,10 @@ static const TidyNode CLANG_TIDY_CHECKS_ROOT "", { { - "android-", + "abseil-", { { - "uration-", + "duration-", { "comparison", "division", @@ -65,18 +65,23 @@ static const TidyNode CLANG_TIDY_CHECKS_ROOT "subtraction" } }, - "aster-strsplit-delimiter", + "faster-strsplit-delimiter", { - "o-", + "no-", { "internal-dependencies", "namespace" } }, - "edundant-strcat-calls", - "tr-cat-append", - "tring-find-startswith", - "pgrade-duration-conversions", + "redundant-strcat-calls", + "str-cat-append", + "string-find-startswith", + "upgrade-duration-conversions" + } + }, + { + "android-", + { { "cloexec-", { @@ -715,7 +720,12 @@ static const TidyNode CLANG_TIDY_CHECKS_ROOT "copy-initialization", "value-param" } - }, + } + } + }, + { + "portability-", + { "simd-intrinsics" } }, @@ -773,8 +783,13 @@ static const TidyNode CLANG_TIDY_CHECKS_ROOT }, "string-compare", "uniqueptr-delete-release", - "uppercase-literal-suffix", - "rary-objects" + "uppercase-literal-suffix" + } + }, + { + "zircon-", + { + "temporary-objects" } } } From 615a9343be3ebb7f1c5f06c2f524a8c9f2a56a75 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 9 Jul 2019 09:42:21 +0200 Subject: [PATCH 26/53] Doc: Fix navigation Change-Id: I75ffc7c7444e05ab9d869da71a0ea837ce71f067 Reviewed-by: Leena Miettinen --- doc/src/qtquick/creator-only/qtquick-creating.qdoc | 2 +- doc/src/qtquick/qtquick-designer.qdoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/qtquick/creator-only/qtquick-creating.qdoc b/doc/src/qtquick/creator-only/qtquick-creating.qdoc index 011f57a5c18..560d3a7671c 100644 --- a/doc/src/qtquick/creator-only/qtquick-creating.qdoc +++ b/doc/src/qtquick/creator-only/qtquick-creating.qdoc @@ -34,7 +34,7 @@ \contentspage index.html \previouspage creator-visual-editor.html \page quick-projects.html - \nextpage creator-quick-ui-forms.html + \nextpage creator-using-qt-quick-designer.html \title Creating Qt Quick Projects diff --git a/doc/src/qtquick/qtquick-designer.qdoc b/doc/src/qtquick/qtquick-designer.qdoc index df38bf01651..c1d2cb3fa12 100644 --- a/doc/src/qtquick/qtquick-designer.qdoc +++ b/doc/src/qtquick/qtquick-designer.qdoc @@ -36,7 +36,7 @@ \previouspage creator-modes.html \nextpage {Tutorials} \else - \previouspage creator-quick-ui-forms.html + \previouspage quick-projects.html \nextpage quick-components.html \endif From 79f7605a0a14c8cb0cb8c1a14be83f72e6b7362e Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 8 Jul 2019 10:53:30 +0200 Subject: [PATCH 27/53] Debugger: fix cdb dumper test for namespaced Qt Change-Id: I5cbf1db4cffb19ee63ab80dcd6e2a8659cd44389 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/cdbbridge.py | 8 ++++++++ tests/auto/debugger/tst_dumpers.cpp | 26 +++++++++++++------------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index 1e59452ffd7..097494cc90a 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -453,6 +453,14 @@ class Dumper(DumperBase): self.put('],partial="%d"' % (len(self.partialVariable) > 0)) self.put(',timings=%s' % self.timings) + + if self.forceQtNamespace: + self.qtNamespaceToReport = self.qtNamespace() + + if self.qtNamespaceToReport: + self.output += ',qtnamespace="%s"' % self.qtNamespaceToReport + self.qtNamespaceToReport = None + self.reportResult(self.output, args) def report(self, stuff): diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 59977507592..d8dfac056f9 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -1654,6 +1654,7 @@ void tst_Dumpers::dumper() localsBeginPos = output.indexOf(locals, localsBeginPos); } while (localsBeginPos != -1); actual.fromString(contents); + context.nameSpace = actual["result"]["qtnamespace"].data(); actual = actual["result"]["data"]; } @@ -1991,7 +1992,7 @@ void tst_Dumpers::dumper_data() "FooFlags f1(a);\n" "FooFlags f2(a | b);\n") + CoreProfile() - + Check("f1", "a (1)", TypeDef("QFlags", "FooFlags")) % CdbEngine + + Check("f1", "a (1)", TypeDef("@QFlags", "FooFlags")) % CdbEngine + Check("f1", "a (0x0001)", "FooFlags") % NoCdbEngine + Check("f2", "(a | b) (0x0003)", "FooFlags") % GdbEngine; @@ -2079,9 +2080,9 @@ void tst_Dumpers::dumper_data() "QFileInfo fi(\"C:\\\\Program Files\\\\tt\");\n" "QString s = fi.absoluteFilePath();\n") + CoreProfile() - + Check("fi", "\"C:/Program Files/tt\"", "QFileInfo") - + Check("file", "\"C:\\Program Files\\t\"", "QFile") - + Check("s", "\"C:/Program Files/tt\"", "QString"); + + Check("fi", "\"C:/Program Files/tt\"", "@QFileInfo") + + Check("file", "\"C:\\Program Files\\t\"", "@QFile") + + Check("s", "\"C:/Program Files/tt\"", "@QString"); #else << Data("#include \n" "#include \n", @@ -2195,7 +2196,7 @@ void tst_Dumpers::dumper_data() + Check("h7.2.key", "\".\"", "@QString") + CheckType("h7.2.value", "@QPointer<@QObject>") - + Check("h8", "<3 items>", TypeDef("QHash", "Hash")) + + Check("h8", "<3 items>", TypeDef("@QHash", "Hash")) + Check("h8.0", "[0] 22", FloatValue("22"), "") + Check("it1.key", "22", "int") + Check("it1.value", FloatValue("22"), "float") @@ -2499,8 +2500,8 @@ void tst_Dumpers::dumper_data() + Check("r.0", "[0]", "3", "int") + Check("r.1", "[1]", "2", "int") + Check("r.2", "[2]", "1", "int") - + Check("rend", "", TypeDef("std::reverse_iterator::iterator>", "Reverse")) - + Check("rit", "", TypeDef("std::reverse_iterator::iterator>", "Reverse")); + + Check("rend", "", TypeDef("std::reverse_iterator<@QList::iterator>", "Reverse")) + + Check("rit", "", TypeDef("std::reverse_iterator<@QList::iterator>", "Reverse")); QTest::newRow("QLocale") @@ -2595,7 +2596,7 @@ void tst_Dumpers::dumper_data() + Check("m2.0", "[0] 11", FloatValue("31.0"), "") + Check("m2.1", "[1] 22", FloatValue("32.0"), "") - + Check("m3", "<2 items>", TypeDef("QMap", "T")) + + Check("m3", "<2 items>", TypeDef("@QMap", "T")) + Check("m4", "<1 items>", "@QMap<@QString, float>") + Check("m4.0.key", "\"22.0\"", "@QString") @@ -3181,8 +3182,8 @@ void tst_Dumpers::dumper_data() + CoreProfile() - + Check("ptr0", "(null)", "@QPointer") - + Check("ptr1", "", "@QPointer"); + + Check("ptr0", "(null)", "@QPointer<@QTimer>") + + Check("ptr1", "", "@QPointer<@QTimer>"); QTest::newRow("QScopedPointer") @@ -3696,7 +3697,7 @@ void tst_Dumpers::dumper_data() //+ Check("v1", "\"Some string\"", "@QVariant (QString)") + CheckType("v1", "@QVariant (QString)") - + Check("my", "<2 items>", TypeDef("QMap", "MyType")) + + Check("my", "<2 items>", TypeDef("@QMap", "MyType")) + Check("my.0.key", "1", "unsigned int") + Check("my.0.value", "<1 items>", "@QStringList") + Check("my.0.value.0", "[0]", "\"Hello\"", "@QString") @@ -3704,7 +3705,6 @@ void tst_Dumpers::dumper_data() + Check("my.1.value", "<1 items>", "@QStringList") + Check("my.1.value.0", "[0]", "\"World\"", "@QString") //+ CheckType("v2", "@QVariant (MyType)") - + Check("my", "<2 items>", TypeDef("QMap", "MyType")) + Check("v2.data.0.key", "1", "unsigned int") % NoCdbEngine + Check("v2.data.0.value", "<1 items>", "@QStringList") % NoCdbEngine + Check("v2.data.0.value.0", "[0]", "\"Hello\"", "@QString") % NoCdbEngine @@ -4072,7 +4072,7 @@ void tst_Dumpers::dumper_data() + Check("v2.1", "[1]", "", "Foo") + Check("v2.1.a", "2", "int") - + Check("v3", "<2 items>", TypeDef("QVector", "FooVector")) + + Check("v3", "<2 items>", TypeDef("@QVector", "FooVector")) + Check("v3.0", "[0]", "", "Foo") + Check("v3.0.a", "1", "int") + Check("v3.1", "[1]", "", "Foo") From 2f39838170924486ac4e93b3797ca2122ca5a78d Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 24 Jun 2019 17:08:46 +0200 Subject: [PATCH 28/53] RemoteLinux: Limit the number of concurrent stat calls Otherwise we might exceed the system's process limit. Fixes: QTCREATORBUG-22603 Change-Id: I73c23aa1d5bc7bbf05ae36dd546d1fac2534274b Reviewed-by: Christian Stenger --- .../genericdirectuploadservice.cpp | 79 +++++++++++-------- .../remotelinux/genericdirectuploadservice.h | 1 + 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/src/plugins/remotelinux/genericdirectuploadservice.cpp b/src/plugins/remotelinux/genericdirectuploadservice.cpp index 5cf35e6e242..04612f229a7 100644 --- a/src/plugins/remotelinux/genericdirectuploadservice.cpp +++ b/src/plugins/remotelinux/genericdirectuploadservice.cpp @@ -33,12 +33,13 @@ #include #include +#include #include #include -#include -#include -#include #include +#include +#include +#include using namespace ProjectExplorer; using namespace QSsh; @@ -48,6 +49,8 @@ namespace Internal { enum State { Inactive, PreChecking, Uploading, PostProcessing }; +const int MaxConcurrentStatCalls = 10; + class GenericDirectUploadServicePrivate { public: @@ -63,6 +66,7 @@ public: bool incremental = false; bool ignoreMissingFiles = false; QHash remoteProcs; + QQueue filesToStat; State state = Inactive; QList filesToUpload; SftpTransferPtr uploader; @@ -169,6 +173,8 @@ QDateTime GenericDirectUploadService::timestampFromStat(const DeployableFile &fi void GenericDirectUploadService::checkForStateChangeOnRemoteProcFinished() { + if (d->remoteProcs.size() < MaxConcurrentStatCalls && !d->filesToStat.isEmpty()) + runStat(d->filesToStat.dequeue()); if (!d->remoteProcs.isEmpty()) return; if (d->state == PreChecking) { @@ -189,6 +195,39 @@ void GenericDirectUploadService::stopDeployment() handleDeploymentDone(); } +void GenericDirectUploadService::runStat(const DeployableFile &file) +{ + // We'd like to use --format=%Y, but it's not supported by busybox. + const QString statCmd = "stat -t " + Utils::QtcProcess::quoteArgUnix(file.remoteFilePath()); + SshRemoteProcess * const statProc = connection()->createRemoteProcess(statCmd).release(); + statProc->setParent(this); + connect(statProc, &SshRemoteProcess::done, this, + [this, statProc, state = d->state](const QString &errorMsg) { + QTC_ASSERT(d->state == state, return); + const DeployableFile file = d->getFileForProcess(statProc); + QTC_ASSERT(file.isValid(), return); + const QDateTime timestamp = timestampFromStat(file, statProc, errorMsg); + statProc->deleteLater(); + switch (state) { + case PreChecking: + if (!timestamp.isValid() || hasRemoteFileChanged(file, timestamp)) + d->filesToUpload.append(file); + break; + case PostProcessing: + if (timestamp.isValid()) + saveDeploymentTimeStamp(file, timestamp); + break; + case Inactive: + case Uploading: + QTC_CHECK(false); + break; + } + checkForStateChangeOnRemoteProcFinished(); + }); + d->remoteProcs.insert(statProc, file); + statProc->start(); +} + QList GenericDirectUploadService::collectFilesToUpload( const DeployableFile &deployable) const { @@ -213,6 +252,7 @@ QList GenericDirectUploadService::collectFilesToUpload( void GenericDirectUploadService::setFinished() { d->state = Inactive; + d->filesToStat.clear(); for (auto it = d->remoteProcs.begin(); it != d->remoteProcs.end(); ++it) { it.key()->disconnect(); it.key()->terminate(); @@ -238,35 +278,10 @@ void GenericDirectUploadService::queryFiles() d->filesToUpload.append(file); continue; } - // We'd like to use --format=%Y, but it's not supported by busybox. - const QString statCmd = "stat -t " + Utils::QtcProcess::quoteArgUnix(file.remoteFilePath()); - SshRemoteProcess * const statProc = connection()->createRemoteProcess(statCmd).release(); - statProc->setParent(this); - connect(statProc, &SshRemoteProcess::done, this, - [this, statProc, state = d->state](const QString &errorMsg) { - QTC_ASSERT(d->state == state, return); - const DeployableFile file = d->getFileForProcess(statProc); - QTC_ASSERT(file.isValid(), return); - const QDateTime timestamp = timestampFromStat(file, statProc, errorMsg); - statProc->deleteLater(); - switch (state) { - case PreChecking: - if (!timestamp.isValid() || hasRemoteFileChanged(file, timestamp)) - d->filesToUpload.append(file); - break; - case PostProcessing: - if (timestamp.isValid()) - saveDeploymentTimeStamp(file, timestamp); - break; - case Inactive: - case Uploading: - QTC_CHECK(false); - break; - } - checkForStateChangeOnRemoteProcFinished(); - }); - d->remoteProcs.insert(statProc, file); - statProc->start(); + if (d->remoteProcs.size() >= MaxConcurrentStatCalls) + d->filesToStat << file; + else + runStat(file); } checkForStateChangeOnRemoteProcFinished(); } diff --git a/src/plugins/remotelinux/genericdirectuploadservice.h b/src/plugins/remotelinux/genericdirectuploadservice.h index 9f8f6b70f78..eb07a01523e 100644 --- a/src/plugins/remotelinux/genericdirectuploadservice.h +++ b/src/plugins/remotelinux/genericdirectuploadservice.h @@ -61,6 +61,7 @@ public: void stopDeployment() override; private: + void runStat(const ProjectExplorer::DeployableFile &file); QDateTime timestampFromStat(const ProjectExplorer::DeployableFile &file, QSsh::SshRemoteProcess *statProc, const QString &errorMsg); void checkForStateChangeOnRemoteProcFinished(); From b21d0485d04c0ae24526a534b40abd5d549c8595 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 5 Jul 2019 14:52:55 +0200 Subject: [PATCH 29/53] qbs build: Suppress GCC 9 warnings also in qbs submodule Amends 7b2d41a972. Change-Id: I3500b57fa2424f522ffe16e5413a7593601215c0 Reviewed-by: Christian Stenger --- qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs b/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs index 4a0d6cab1d0..f44aa86af47 100644 --- a/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs +++ b/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs @@ -3,8 +3,15 @@ import qbs.FileInfo Module { Depends { name: "qtc" } + Depends { name: "cpp" } - property bool priority: 1 // TODO: Remove declaration after 1.11 is out. + Properties { + condition: qbs.toolchain.contains("gcc") && !qbs.toolchain.contains("clang") + && Utilities.versionCompare(cpp.compilerVersion, "9") >= 0 + cpp.cxxFlags: ["-Wno-deprecated-copy", "-Wno-init-list-lifetime"] + } + + priority: 1 property bool enableUnitTests: false property bool enableProjectFileUpdates: true From 2e3c5c870fe4c73c1859bcfc6dd92e712bfd72dc Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 9 Jul 2019 09:32:43 +0200 Subject: [PATCH 30/53] Doc: Describe changing properties of multiple items at once In Qt Quick Designer, you can select multiple items on the canvas or in the Navigator and edit their common properties simultaneously. Change-Id: I6e1e7740bdbfcaee401f7915c0d215cb555e9015 Reviewed-by: Brook Cronin Reviewed-by: Tim Jenssen --- doc/src/qtquick/qtquick-properties.qdoc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/src/qtquick/qtquick-properties.qdoc b/doc/src/qtquick/qtquick-properties.qdoc index 5f6759b9c45..09191e70417 100644 --- a/doc/src/qtquick/qtquick-properties.qdoc +++ b/doc/src/qtquick/qtquick-properties.qdoc @@ -50,6 +50,16 @@ then select \uicontrol Reset to remove the property values before trying again. + To modify the common properties of multiple items simultaneously, select + them in the \uicontrol Navigator or on the canvas: + + \list + \li On Windows, press and hold \key Ctrl and \key Shift, and then click + the items to select them. + \li On \macos, press \key Shift to select a range of items or \key Cmd + to select multiple single items. + \endlist + To return an item to its implicit position after moving it, select the \inlineimage qtcreator-reset-position-icon.png (\uicontrol {Reset Position}) button on the toolbar. To return it to its From afc53cd54d90e9aa8eac72c9cb6be144baf2b96b Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 9 Jul 2019 13:22:36 +0200 Subject: [PATCH 31/53] Doc: Describe additional reset types in Git Branches view In addition to a hard reset, users can now choose a soft or mixed one. Change-Id: I11d27e335cb3c0f34ae9a6ddf81b7b8ae1948629 Reviewed-by: Orgad Shaneh --- doc/src/vcs/creator-vcs-git.qdoc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/src/vcs/creator-vcs-git.qdoc b/doc/src/vcs/creator-vcs-git.qdoc index 34dde382be4..8705df4939e 100644 --- a/doc/src/vcs/creator-vcs-git.qdoc +++ b/doc/src/vcs/creator-vcs-git.qdoc @@ -263,7 +263,10 @@ \li Show the changes in a branch. \row \li \uicontrol Reset - \li Hard reset the active branch to the selected branch. + \li Reset the active branch to the selected branch. You + can choose between a \uicontrol Hard, \uicontrol Mixed, + and \uicontrol Soft reset. For more information, see + \l{Resetting Local Repository}. \row \li \uicontrol Merge \li Join the development histories in two branches together. From cd8b064d7674af3660cbda51836bf09aa1c9325f Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 5 Jul 2019 11:59:59 +0200 Subject: [PATCH 32/53] QmlDesigner: Fix potential crashes Change-Id: Ieb3211090d16150943fd4d2dd15a4a63ecdae078 Reviewed-by: Tim Jenssen --- .../components/componentcore/layoutingridlayout.cpp | 6 ++++++ .../qmldesigner/designercore/model/qmlobjectnode.cpp | 7 ++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp index ba520a1ca33..a1629c0b5bc 100644 --- a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp +++ b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp @@ -179,6 +179,8 @@ void LayoutInGridLayout::doIt() initializeCells(); markUsedCells(); + QTC_ASSERT(m_parentNode.isValid(), return); + if (QmlItemNode::isValidQmlItemNode(m_selectionContext.firstSelectedModelNode())) { const QmlItemNode qmlItemNode = QmlItemNode(m_selectionContext.firstSelectedModelNode()); @@ -256,6 +258,10 @@ void LayoutInGridLayout::collectItemNodes() m_qmlItemNodes.append(itemNode); } } + + if (m_qmlItemNodes.isEmpty()) + return; + m_parentNode = m_qmlItemNodes.constFirst().instanceParentItem(); } diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 53e29b7157e..cc44f9c4488 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -625,9 +625,10 @@ bool QmlObjectNode::hasInstanceParent() const bool QmlObjectNode::hasInstanceParentItem() const { - return nodeInstance().parentId() >= 0 - && nodeInstanceView()->hasInstanceForId(nodeInstance().parentId()) - && QmlItemNode::isItemOrWindow(view()->modelNodeForInternalId(nodeInstance().parentId())); + return isValid() + && nodeInstance().parentId() >= 0 + && nodeInstanceView()->hasInstanceForId(nodeInstance().parentId()) + && QmlItemNode::isItemOrWindow(view()->modelNodeForInternalId(nodeInstance().parentId())); } From cc2b8923dc41b1f525829888fc90be08d43fbdff Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Tue, 2 Jul 2019 16:45:12 +0200 Subject: [PATCH 33/53] update image paths in dev package script Change-Id: I169709e0f7746fdd9b44cf095c2c5249f03658f4 Reviewed-by: Leena Miettinen Reviewed-by: Thomas Hartmann --- scripts/createDevPackage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/createDevPackage.py b/scripts/createDevPackage.py index 7b9b0fc655e..66ddf40f346 100755 --- a/scripts/createDevPackage.py +++ b/scripts/createDevPackage.py @@ -77,7 +77,8 @@ source_include_patterns = [ r"^src/plugins/help/images/.*$", r"^src/plugins/projectexplorer/images/.*$", r"^src/plugins/qmldesigner/components/componentcore/images/.*$", - r"^src/plugins/qmldesigner/qmldesignerextension/timelineeditor/images/.*$", + r"^src/plugins/qmldesigner/components/timelineeditor/images/.*$", + r"^src/plugins/qmldesigner/qmlpreviewplugin/images/.*$", r"^src/plugins/texteditor/images/.*$" # also some single files r"^src/plugins/qmldesigner/components/formeditor/.*\.png$", From 5121c009f6163ff1f6d83e4416bb49e0abe7eaf8 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 5 Jul 2019 11:26:49 +0200 Subject: [PATCH 34/53] Clang: Fix use-after-free ...introduced with commit d52ac9a7084df220a5349468703c11cc1c0794c4 Clang: Fix unresolved #includes for ui_*.h headers ClangCodeModelServer::onJobFinished might take over ownership of the jobs object. This should be reflected in the JobFinishedCallback as otherwise we will continue in Jobs::onJobFinished() right into a use- after-free. Change-Id: I4b5cbdf781a8e66f45a743c451b4484bf922f720 Reviewed-by: Marco Bubke Reviewed-by: Cristian Adam --- .../clangbackend/source/clangcodemodelserver.cpp | 12 ++++++++---- src/tools/clangbackend/source/clangcodemodelserver.h | 4 ++-- src/tools/clangbackend/source/clangjobs.cpp | 3 ++- src/tools/clangbackend/source/clangjobs.h | 2 +- .../clangsupportivetranslationunitinitializer.cpp | 1 + 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/tools/clangbackend/source/clangcodemodelserver.cpp b/src/tools/clangbackend/source/clangcodemodelserver.cpp index e82766cf5ee..d521fee1c81 100644 --- a/src/tools/clangbackend/source/clangcodemodelserver.cpp +++ b/src/tools/clangbackend/source/clangcodemodelserver.cpp @@ -103,7 +103,7 @@ void ClangCodeModelServer::documentsOpened(const ClangBackEnd::DocumentsOpenedMe document.setDirtyIfDependencyIsMet(document.filePath()); DocumentProcessor processor = documentProcessors().create(document); processor.jobs().setJobFinishedCallback([this](const Jobs::RunningJob &a, IAsyncJob *b) { - onJobFinished(a, b); + return onJobFinished(a, b); }); } const std::vector resetDocuments_ = resetDocuments(toReset); @@ -401,12 +401,14 @@ void ClangCodeModelServer::processSuspendResumeJobs(const std::vector } } -void ClangCodeModelServer::onJobFinished(const Jobs::RunningJob &jobRecord, IAsyncJob *job) +bool ClangCodeModelServer::onJobFinished(const Jobs::RunningJob &jobRecord, IAsyncJob *job) { if (jobRecord.jobRequest.type == JobRequest::Type::UpdateAnnotations) { const auto updateJob = static_cast(job); - resetDocumentsWithUnresolvedIncludes({updateJob->pinnedDocument()}); + return resetDocumentsWithUnresolvedIncludes({updateJob->pinnedDocument()}); } + + return false; } void ClangCodeModelServer::categorizeFileContainers(const QVector &fileContainers, @@ -476,7 +478,7 @@ static bool isDocumentWithUnresolvedIncludesFixable(const Document &document, return false; } -void ClangCodeModelServer::resetDocumentsWithUnresolvedIncludes( +int ClangCodeModelServer::resetDocumentsWithUnresolvedIncludes( const std::vector &documents) { DocumentResetInfos toReset; @@ -489,6 +491,8 @@ void ClangCodeModelServer::resetDocumentsWithUnresolvedIncludes( } resetDocuments(toReset); + + return toReset.size(); } void ClangCodeModelServer::setUpdateAnnotationsTimeOutInMsForTestsOnly(int value) diff --git a/src/tools/clangbackend/source/clangcodemodelserver.h b/src/tools/clangbackend/source/clangcodemodelserver.h index 14fefadcf25..471c27bd8d5 100644 --- a/src/tools/clangbackend/source/clangcodemodelserver.h +++ b/src/tools/clangbackend/source/clangcodemodelserver.h @@ -83,13 +83,13 @@ private: void processTimerForVisibleButNotCurrentDocuments(); void processSuspendResumeJobs(const std::vector &documents); - void onJobFinished(const Jobs::RunningJob &jobRecord, IAsyncJob *job); + bool onJobFinished(const Jobs::RunningJob &jobRecord, IAsyncJob *job); void categorizeFileContainers(const QVector &fileContainers, QVector &toCreate, DocumentResetInfos &toReset) const; std::vector resetDocuments(const DocumentResetInfos &infos); - void resetDocumentsWithUnresolvedIncludes(const std::vector &documents); + int resetDocumentsWithUnresolvedIncludes(const std::vector &documents); void addAndRunUpdateJobs(std::vector documents); diff --git a/src/tools/clangbackend/source/clangjobs.cpp b/src/tools/clangbackend/source/clangjobs.cpp index 572bb9bde3d..f1df7dcd492 100644 --- a/src/tools/clangbackend/source/clangjobs.cpp +++ b/src/tools/clangbackend/source/clangjobs.cpp @@ -170,7 +170,8 @@ void Jobs::onJobFinished(IAsyncJob *asyncJob) if (m_jobFinishedCallback) { const RunningJob runningJob = m_running.value(asyncJob); - m_jobFinishedCallback(runningJob, asyncJob); + if (m_jobFinishedCallback(runningJob, asyncJob)) + return; } m_running.remove(asyncJob); diff --git a/src/tools/clangbackend/source/clangjobs.h b/src/tools/clangbackend/source/clangjobs.h index 3b4966a8e1b..3d8af16fe41 100644 --- a/src/tools/clangbackend/source/clangjobs.h +++ b/src/tools/clangbackend/source/clangjobs.h @@ -50,7 +50,7 @@ public: }; using RunningJobs = QHash; - using JobFinishedCallback = std::function; + using JobFinishedCallback = std::function; public: Jobs(Documents &documents, diff --git a/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp b/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp index 07d50a14116..a34b7bb1143 100644 --- a/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp +++ b/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp @@ -60,6 +60,7 @@ void SupportiveTranslationUnitInitializer::startInitializing() m_jobs.setJobFinishedCallback([this](const Jobs::RunningJob &runningJob, IAsyncJob *) { checkIfParseJobFinished(runningJob); + return false; }); addJob(JobRequest::Type::ParseSupportiveTranslationUnit); m_jobs.process(); From f858eaa9e8268396d425f201ffcd95566ffea0b5 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Wed, 26 Jun 2019 19:00:40 +0200 Subject: [PATCH 35/53] Squish: Update tst_CSUP02 Change-Id: I56fd0375b973141fae4e53352997d0752bfbfcb0 Reviewed-by: Christian Stenger --- tests/system/suite_CSUP/tst_CSUP02/test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/system/suite_CSUP/tst_CSUP02/test.py b/tests/system/suite_CSUP/tst_CSUP02/test.py index 881a7e709e3..44ea2595e45 100644 --- a/tests/system/suite_CSUP/tst_CSUP02/test.py +++ b/tests/system/suite_CSUP/tst_CSUP02/test.py @@ -57,6 +57,9 @@ def main(): type(editorWidget, "") type(editorWidget, "") delayedType(editorWidget, "class") + if useClang: + snooze(4) + type(editorWidget, "") listView = waitForObject(":popupFrame_Proposal_QListView") shownProposals = dumpItems(listView.model()) usedProposal = "class derived from QObject" From 44e3e1a43c93c29a4566cfece3d88b7ba61525a4 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 9 Jul 2019 14:54:05 +0200 Subject: [PATCH 36/53] ClangTools: Sanitize ClangToolsUnitTests This fixes the currently failing tests ClangToolsUnitTests::testProject(simple.qbs) ClangToolsUnitTests::testProject(simple.pro) which produce more diagnostics now due to the upgrade to clang 8. Sanitize the test by specifying exactly the tidy/clazy checks we are interested in. This should avoid maintenance on clang upgraded (pulling in new checks that will fail the test). While at it, fix writing the settings for the tests, which worked by accident so far. Change-Id: If8bf5076ad7141faa93eced611334ac609f0cf92 Reviewed-by: Cristian Adam Reviewed-by: Christian Stenger --- .../clangtools/clangtoolsunittests.cpp | 88 +++++++++++-------- src/plugins/clangtools/clangtoolsunittests.h | 9 +- 2 files changed, 58 insertions(+), 39 deletions(-) diff --git a/src/plugins/clangtools/clangtoolsunittests.cpp b/src/plugins/clangtools/clangtoolsunittests.cpp index ff1e7ab77cf..99b35dae31d 100644 --- a/src/plugins/clangtools/clangtoolsunittests.cpp +++ b/src/plugins/clangtools/clangtoolsunittests.cpp @@ -25,8 +25,9 @@ #include "clangtoolsunittests.h" -#include "clangtoolsdiagnostic.h" #include "clangtidyclazytool.h" +#include "clangtoolsdiagnostic.h" +#include "clangtoolssettings.h" #include "clangtoolsutils.h" #include @@ -50,6 +51,8 @@ using namespace ProjectExplorer; using namespace Utils; +Q_DECLARE_METATYPE(CppTools::ClangDiagnosticConfig) + namespace ClangTools { namespace Internal { @@ -75,16 +78,17 @@ void ClangToolsUnitTests::cleanupTestCase() delete m_tmpDir; } -static CppTools::ClangDiagnosticConfig createTidyClazyConfig() +static CppTools::ClangDiagnosticConfig configFor(const QString &tidyChecks, + const QString &clazyChecks) { CppTools::ClangDiagnosticConfig config; - config.setId("Test.ClangTidy"); + config.setId("Test.MyTestConfig"); config.setDisplayName("Test"); config.setIsReadOnly(true); config.setClangOptions(QStringList{QStringLiteral("-Wno-everything")}); config.setClangTidyMode(CppTools::ClangDiagnosticConfig::TidyMode::ChecksPrefixList); - config.setClangTidyChecks("modernize-*, misc-*"); - config.setClazyChecks("level2"); + config.setClangTidyChecks(tidyChecks); + config.setClazyChecks(clazyChecks); return config; } @@ -92,6 +96,7 @@ void ClangToolsUnitTests::testProject() { QFETCH(QString, projectFilePath); QFETCH(int, expectedDiagCount); + QFETCH(CppTools::ClangDiagnosticConfig, diagnosticConfig); if (projectFilePath.contains("mingw")) { const ToolChain * const toolchain = ToolChainKitAspect::toolChain(KitManager::kits().constFirst(), @@ -106,23 +111,25 @@ void ClangToolsUnitTests::testProject() ClangTool *tool = ClangTidyClazyTool::instance(); // Change configs - QSharedPointer settings = CppTools::codeModelSettings(); - const CppTools::ClangDiagnosticConfigs originalConfigs = settings->clangCustomDiagnosticConfigs(); - const Core::Id originalId = settings->clangDiagnosticConfigId(); + QSharedPointer cppToolsSettings = CppTools::codeModelSettings(); + ClangToolsSettings *clangToolsSettings = ClangToolsSettings::instance(); + const CppTools::ClangDiagnosticConfigs originalConfigs = cppToolsSettings + ->clangCustomDiagnosticConfigs(); + const Core::Id originalId = clangToolsSettings->diagnosticConfigId(); CppTools::ClangDiagnosticConfigs modifiedConfigs = originalConfigs; - - const CppTools::ClangDiagnosticConfig clangTidyConfig = createTidyClazyConfig(); - modifiedConfigs.push_back(clangTidyConfig); + modifiedConfigs.push_back(diagnosticConfig); ExecuteOnDestruction executeOnDestruction([=]() { // Restore configs - settings->setClangCustomDiagnosticConfigs(originalConfigs); - settings->setClangDiagnosticConfigId(originalId); + cppToolsSettings->setClangCustomDiagnosticConfigs(originalConfigs); + clangToolsSettings->setDiagnosticConfigId(originalId); + clangToolsSettings->writeSettings(); }); - settings->setClangCustomDiagnosticConfigs(modifiedConfigs); - settings->setClangDiagnosticConfigId(clangTidyConfig.id()); + cppToolsSettings->setClangCustomDiagnosticConfigs(modifiedConfigs); + clangToolsSettings->setDiagnosticConfigId(diagnosticConfig.id()); + clangToolsSettings->writeSettings(); tool->startTool(false); QSignalSpy waiter(tool, SIGNAL(finished(bool))); @@ -137,43 +144,50 @@ void ClangToolsUnitTests::testProject_data() { QTest::addColumn("projectFilePath"); QTest::addColumn("expectedDiagCount"); + QTest::addColumn("diagnosticConfig"); - // For the simple project, we expect the following warning: - // warning: use nullptr [modernize-use-nullptr] - addTestRow("simple/simple.qbs", 1); - addTestRow("simple/simple.pro", 1); + // Test simple C++ project. + CppTools::ClangDiagnosticConfig config = configFor("modernize-use-nullptr", QString()); + addTestRow("simple/simple.qbs", 1, config); + addTestRow("simple/simple.pro", 1, config); - addTestRow("simple-library/simple-library.qbs", 0); - addTestRow("simple-library/simple-library.pro", 0); + // Test simple Qt project. + config = configFor("readability-static-accessed-through-instance", QString()); + addTestRow("qt-widgets-app/qt-widgets-app.qbs", 1, config); + addTestRow("qt-widgets-app/qt-widgets-app.pro", 1, config); - addTestRow("stdc++11-includes/stdc++11-includes.qbs", 0); - addTestRow("stdc++11-includes/stdc++11-includes.pro", 0); + // Test that libraries can be analyzed. + config = configFor(QString(), QString()); + addTestRow("simple-library/simple-library.qbs", 0, config); + addTestRow("simple-library/simple-library.pro", 0, config); - // For qt-widgets-app, we expect the following warning for "a.exec()", - // "a" being the QApplication object: - // warning: static member accessed through instance - // [readability-static-accessed-through-instance] - addTestRow("qt-widgets-app/qt-widgets-app.qbs", 1); - addTestRow("qt-widgets-app/qt-widgets-app.pro", 1); + // Test that standard headers can be parsed. + addTestRow("stdc++11-includes/stdc++11-includes.qbs", 0, config); + addTestRow("stdc++11-includes/stdc++11-includes.pro", 0, config); - addTestRow("qt-essential-includes/qt-essential-includes.qbs", 0); - addTestRow("qt-essential-includes/qt-essential-includes.pro", 0); + // Test that qt essential headers can be parsed. + addTestRow("qt-essential-includes/qt-essential-includes.qbs", 0, config); + addTestRow("qt-essential-includes/qt-essential-includes.pro", 0, config); - addTestRow("mingw-includes/mingw-includes.qbs", 0); - addTestRow("mingw-includes/mingw-includes.pro", 0); + // Test that mingw includes can be parsed. + addTestRow("mingw-includes/mingw-includes.qbs", 0, config); + addTestRow("mingw-includes/mingw-includes.pro", 0, config); + // Test that tidy and clazy diagnostics are emitted for the same project. addTestRow("clangtidy_clazy/clangtidy_clazy.pro", - 4 /* ClangTidy: modernize-*,misc-* */ - + 2 /* Clazy: level1 */); + 1 /*tidy*/ + 1 /*clazy*/, + configFor("misc-unconventional-assign-operator", "base-class-event")); } void ClangToolsUnitTests::addTestRow(const QByteArray &relativeFilePath, - int expectedDiagCount) + int expectedDiagCount, + const CppTools::ClangDiagnosticConfig &diagnosticConfig) { const QString absoluteFilePath = m_tmpDir->absolutePath(relativeFilePath); const QString fileName = QFileInfo(absoluteFilePath).fileName(); - QTest::newRow(fileName.toUtf8().constData()) << absoluteFilePath << expectedDiagCount; + QTest::newRow(fileName.toUtf8().constData()) + << absoluteFilePath << expectedDiagCount << diagnosticConfig; } } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolsunittests.h b/src/plugins/clangtools/clangtoolsunittests.h index 4ea2ebd9085..c54a85bf193 100644 --- a/src/plugins/clangtools/clangtoolsunittests.h +++ b/src/plugins/clangtools/clangtoolsunittests.h @@ -27,7 +27,10 @@ #include -namespace CppTools { namespace Tests { class TemporaryCopiedDir; } } +namespace CppTools { +class ClangDiagnosticConfig; +namespace Tests { class TemporaryCopiedDir; } +} // namespace CppTools namespace ClangTools { namespace Internal { @@ -46,7 +49,9 @@ private slots: void testProject_data(); private: - void addTestRow(const QByteArray &relativeFilePath, int expectedDiagCount); + void addTestRow(const QByteArray &relativeFilePath, + int expectedDiagCount, + const CppTools::ClangDiagnosticConfig &diagnosticConfig); private: CppTools::Tests::TemporaryCopiedDir *m_tmpDir = nullptr; From 0d9e8d3e9de107f3ed10f961860a71659a22fb69 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 10 Jul 2019 09:30:30 +0200 Subject: [PATCH 37/53] Unittest: Fix compile due to ambiguity for older gcc Change-Id: I4eb2ce1cd0892a50702eacb1b0d6bdf844718c20 Reviewed-by: Nikolai Kosjar --- tests/unit/unittest/pchmanagerclient-test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/unittest/pchmanagerclient-test.cpp b/tests/unit/unittest/pchmanagerclient-test.cpp index 18a61d70388..20f16d8e42f 100644 --- a/tests/unit/unittest/pchmanagerclient-test.cpp +++ b/tests/unit/unittest/pchmanagerclient-test.cpp @@ -65,9 +65,9 @@ protected: filePathCache, mockProjectPartsStorage}; ClangBackEnd::ProjectPartId projectPartId{1}; - PrecompiledHeadersUpdatedMessage message{{projectPartId}}; + PrecompiledHeadersUpdatedMessage message{projectPartId}; ClangBackEnd::ProjectPartId projectPartId2{2}; - PrecompiledHeadersUpdatedMessage message2{{projectPartId2}}; + PrecompiledHeadersUpdatedMessage message2{projectPartId2}; }; TEST_F(PchManagerClient, NotifierAttached) From 2aa067f28e973df757b65830ba6c278ebc03e6e6 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 5 Jul 2019 09:37:34 +0200 Subject: [PATCH 38/53] Clang: Fix adding snippets after opening brace The regression was introduced by commit 82d6d20acb04ec970ee609e46e4f7d9543b416f4 Clang: Do not show completions after comma in initializer list This fixes ClangCodeCompletionTest::testCompleteGlobals(). Change-Id: Ic126f1e3eaed158196268e3682ff32bc02deb7b9 Reviewed-by: Cristian Adam Reviewed-by: Christian Stenger --- .../clangcompletioncontextanalyzer.cpp | 1 + .../clangcompletioncontextanalyzer-test.cpp | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp index a2c32a537ad..7217b905b07 100644 --- a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp +++ b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp @@ -168,6 +168,7 @@ void ClangCompletionContextAnalyzer::handleFunctionCall(int afterOperatorPositio } else { const int functionNameStart = startOfFunctionCall(afterOperatorPosition); if (functionNameStart >= 0) { + m_addSnippets = functionNameStart == afterOperatorPosition; // Always pass the position right after '(' to libclang because // positions after the comma might be problematic if a preceding // argument is invalid code. diff --git a/tests/unit/unittest/clangcompletioncontextanalyzer-test.cpp b/tests/unit/unittest/clangcompletioncontextanalyzer-test.cpp index fb49a4c640b..324e9b3a7ea 100644 --- a/tests/unit/unittest/clangcompletioncontextanalyzer-test.cpp +++ b/tests/unit/unittest/clangcompletioncontextanalyzer-test.cpp @@ -564,4 +564,25 @@ TEST_F(ClangCompletionContextAnalyzer, QualifiedFunctionNameStartPosition) ASSERT_THAT(functionNameStartPosition, 1); } +TEST_F(ClangCompletionContextAnalyzer, SnippetsAfterOpeningBrace) +{ + auto analyzer = runAnalyzer("{@"); + + ASSERT_TRUE(analyzer.addSnippets()); } + +TEST_F(ClangCompletionContextAnalyzer, NoSnippetsAfterFunctionCallLike_OpeningBrace) +{ + auto analyzer = runAnalyzer("foo{@"); + + ASSERT_FALSE(analyzer.addSnippets()); +} + +TEST_F(ClangCompletionContextAnalyzer, NoSnippetsAfterFunctionCallLike_OpeningParen) +{ + auto analyzer = runAnalyzer("foo(@"); + + ASSERT_FALSE(analyzer.addSnippets()); +} + +} // namespace From b6346369eb9c4b10ea6ca7735b58cd1c6cf73074 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 9 Jul 2019 12:42:07 +0200 Subject: [PATCH 39/53] ClangTools: Fix showing diagnostics outside the project root dir Accept diagnostics from files that are known to the project (Project::files()) instead of checking whether they are below the project root directory (Project::projectDirectory()). Fixes: QTCREATORBUG-22213 Change-Id: I2f96374d6de3f53b1bd42be875dfe44b25a55fb1 Reviewed-by: Christian Stenger --- src/plugins/clangtools/clangtidyclazytool.cpp | 4 ++-- src/plugins/clangtools/clangtidyclazytool.h | 2 +- src/plugins/clangtools/clangtool.h | 2 +- src/plugins/clangtools/clangtoolruncontrol.cpp | 12 +++--------- src/plugins/clangtools/clangtoolruncontrol.h | 1 + src/plugins/clangtools/clangtoolslogfilereader.cpp | 12 ++++++------ src/plugins/clangtools/clangtoolslogfilereader.h | 2 +- 7 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/plugins/clangtools/clangtidyclazytool.cpp b/src/plugins/clangtools/clangtidyclazytool.cpp index f07fdcd3f73..ec743c97949 100644 --- a/src/plugins/clangtools/clangtidyclazytool.cpp +++ b/src/plugins/clangtools/clangtidyclazytool.cpp @@ -464,11 +464,11 @@ void ClangTidyClazyTool::handleStateUpdate() } QList ClangTidyClazyTool::read(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet &projectFiles, const QString &logFilePath, QString *errorMessage) const { - return readSerializedDiagnostics(filePath, projectRootDir, logFilePath, errorMessage); + return readSerializedDiagnostics(filePath, projectFiles, logFilePath, errorMessage); } void ClangTidyClazyTool::onNewDiagnosticsAvailable(const QList &diagnostics) diff --git a/src/plugins/clangtools/clangtidyclazytool.h b/src/plugins/clangtools/clangtidyclazytool.h index c0765dc6a9e..17832905389 100644 --- a/src/plugins/clangtools/clangtidyclazytool.h +++ b/src/plugins/clangtools/clangtidyclazytool.h @@ -54,7 +54,7 @@ public: void startTool(bool askUserForFileSelection) final; QList read(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet &projectFiles, const QString &logFilePath, QString *errorMessage) const final; diff --git a/src/plugins/clangtools/clangtool.h b/src/plugins/clangtools/clangtool.h index 0f322feb47b..1d94719759c 100644 --- a/src/plugins/clangtools/clangtool.h +++ b/src/plugins/clangtools/clangtool.h @@ -50,7 +50,7 @@ public: virtual void startTool(bool askUserForFileSelection) = 0; virtual QList read(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet &projectFiles, const QString &logFilePath, QString *errorMessage) const = 0; diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index cc8dd249714..64672934172 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -288,6 +288,7 @@ void ClangToolRunControl::start() } m_projectInfo = CppTools::CppModelManager::instance()->projectInfo(m_target->project()); + m_projectFiles = Utils::toSet(m_target->project()->files(Project::AllFiles)); // Some projects provides CompilerCallData once a build is finished, if (m_projectInfo.configurationOrFilesChanged(m_projectInfoBeforeBuild)) { @@ -360,6 +361,7 @@ void ClangToolRunControl::stop() QObject::disconnect(runner, nullptr, this, nullptr); delete runner; } + m_projectFiles.clear(); m_runners.clear(); m_unitsToProcess.clear(); m_progress.reportFinished(); @@ -390,22 +392,14 @@ void ClangToolRunControl::analyzeNextFile() Utils::StdOutFormat); } -static Utils::FilePath cleanPath(const Utils::FilePath &filePath) -{ - return Utils::FilePath::fromString(QDir::cleanPath(filePath.toString())); -} - void ClangToolRunControl::onRunnerFinishedWithSuccess(const QString &filePath) { const QString logFilePath = qobject_cast(sender())->logFilePath(); qCDebug(LOG) << "onRunnerFinishedWithSuccess:" << logFilePath; - QTC_ASSERT(m_projectInfo.project(), return); - const Utils::FilePath projectRootDir = cleanPath(m_projectInfo.project()->projectDirectory()); - QString errorMessage; const QList diagnostics = tool()->read(filePath, - projectRootDir, + m_projectFiles, logFilePath, &errorMessage); QFile::remove(logFilePath); // Clean-up. diff --git a/src/plugins/clangtools/clangtoolruncontrol.h b/src/plugins/clangtools/clangtoolruncontrol.h index 92ecb5e2b23..2027d9513b1 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.h +++ b/src/plugins/clangtools/clangtoolruncontrol.h @@ -104,6 +104,7 @@ private: QFutureInterface m_progress; AnalyzeUnits m_unitsToProcess; + QSet m_projectFiles; QSet m_runners; int m_initialFilesToProcessSize = 0; int m_filesAnalyzed = 0; diff --git a/src/plugins/clangtools/clangtoolslogfilereader.cpp b/src/plugins/clangtools/clangtoolslogfilereader.cpp index 63751181ee8..76c38f44bec 100644 --- a/src/plugins/clangtools/clangtoolslogfilereader.cpp +++ b/src/plugins/clangtools/clangtoolslogfilereader.cpp @@ -122,7 +122,7 @@ static ExplainingStep buildFixIt(const CXDiagnostic cxDiagnostic, unsigned index } static Diagnostic buildDiagnostic(const CXDiagnostic cxDiagnostic, - const Utils::FilePath &projectRootDir, + const QSet &projectFiles, const QString &nativeFilePath) { Diagnostic diagnostic; @@ -136,7 +136,7 @@ static Diagnostic buildDiagnostic(const CXDiagnostic cxDiagnostic, diagnostic.location = diagLocationFromSourceLocation(cxLocation); const auto diagnosticFilePath = Utils::FilePath::fromString(diagnostic.location.filePath); - if (!diagnosticFilePath.isChildOf(projectRootDir)) + if (!projectFiles.contains(diagnosticFilePath)) return diagnostic; // TODO: Introduce CppTools::ProjectFile::isGenerated to filter these out properly @@ -183,7 +183,7 @@ static Diagnostic buildDiagnostic(const CXDiagnostic cxDiagnostic, } static QList readSerializedDiagnostics_helper(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet &projectFiles, const QString &logFilePath) { QList list; @@ -206,7 +206,7 @@ static QList readSerializedDiagnostics_helper(const QString &filePat Utils::ExecuteOnDestruction cleanUpDiagnostic([&]() { clang_disposeDiagnostic(cxDiagnostic); }); - const Diagnostic diagnostic = buildDiagnostic(cxDiagnostic, projectRootDir, nativeFilePath); + const Diagnostic diagnostic = buildDiagnostic(cxDiagnostic, projectFiles, nativeFilePath); if (!diagnostic.isValid()) continue; @@ -232,14 +232,14 @@ static bool checkFilePath(const QString &filePath, QString *errorMessage) } QList readSerializedDiagnostics(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet &projectFiles, const QString &logFilePath, QString *errorMessage) { if (!checkFilePath(logFilePath, errorMessage)) return QList(); - return readSerializedDiagnostics_helper(filePath, projectRootDir, logFilePath); + return readSerializedDiagnostics_helper(filePath, projectFiles, logFilePath); } } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolslogfilereader.h b/src/plugins/clangtools/clangtoolslogfilereader.h index c95ce645ae9..de37c362b58 100644 --- a/src/plugins/clangtools/clangtoolslogfilereader.h +++ b/src/plugins/clangtools/clangtoolslogfilereader.h @@ -35,7 +35,7 @@ namespace ClangTools { namespace Internal { QList readSerializedDiagnostics(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet &projectFiles, const QString &logFilePath, QString *errorMessage); From ff8360921bef9fbb2bdae9b66b21596a6babee3f Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 10 Jul 2019 09:45:08 +0200 Subject: [PATCH 40/53] Doc: Update info on zooming in output panes Zooming is also available in the General Messages and Version Control output panes. Change-Id: I306c9be485640d298d1223f04bf5e7db26dd403c Reviewed-by: Orgad Shaneh --- doc/src/howto/creator-ui.qdoc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/src/howto/creator-ui.qdoc b/doc/src/howto/creator-ui.qdoc index 314abee8740..adc38a0cf3b 100644 --- a/doc/src/howto/creator-ui.qdoc +++ b/doc/src/howto/creator-ui.qdoc @@ -371,8 +371,12 @@ To search within the \uicontrol{Application Output} and \uicontrol{Compile Output} panes, press \key {Ctrl+F} when the pane is active. Enter search criteria in the \uicontrol Find field and click the left and right arrows to search down and - up in the pane. In these panes, you can also use the zoom buttons to increase and - decrease the text size of the output. + up in the pane. + + To increase or decrease the output text size, select \inlineimage plus.png + (\uicontrol {Zoom In}) or \inlineimage minus.png + (\uicontrol {Zoom Out}), or press \key Ctrl++ or \key Ctrl+-. Zooming is + not supported in all output panes. To filter the output, enter a string in the \uicontrol Filter field. Filtering is not supported in all output panes. From fc7d505bee4c906bcff006952c86a8696f46495d Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 10 Jul 2019 15:13:31 +0200 Subject: [PATCH 41/53] Doc: Update info on Clang diagnostics Update screenshots. Task-number: QTCREATORBUG-22701 Change-Id: I5c597aba9a99551e18a98bb019ea1f858a8ba8cc Reviewed-by: Nikolai Kosjar --- ...reator-clang-code-model-build-settings.png | Bin 10377 -> 3970 bytes .../qtcreator-clang-code-model-options.png | Bin 22674 -> 7834 bytes doc/images/qtcreator-clang-tidy.png | Bin 30511 -> 9482 bytes doc/images/qtcreator-clang-tools-options.png | Bin 14187 -> 5355 bytes doc/images/qtcreator-clang-tools.png | Bin 247291 -> 16541 bytes doc/images/qtcreator-clazy.png | Bin 65735 -> 23155 bytes .../qtcreator-diagnostics-configuration.png | Bin 61641 -> 12349 bytes doc/images/qtcreator-files-to-analyze.png | Bin 22600 -> 9716 bytes .../creator-clang-static-analyzer.qdoc | 10 +++++----- 9 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/images/qtcreator-clang-code-model-build-settings.png b/doc/images/qtcreator-clang-code-model-build-settings.png index 05fa864b7c344dbbc0705330db84e5867faa7fdd..2aa3e5dc1942d8feaae46a6ef84f56a52ec8c2c0 100644 GIT binary patch literal 3970 zcmeAS@N?(olHy`uVBq!ia0y~yVAf(_U|7h(%)r1P-?6)xfq`jafKP}k0|SGKs+yX* zhMKy!ntGO+m$#Z%mYP?)TILdU4NVPAEiG*w9bH`=T|He8(9_j}0DUmX(>E~G59rd* zTV?Jw_V)G;4h{~EPEJlv&d$!RuC8uwZtm{x9v&W^ z>KdNv-k$1No}QkbUS6JFS)N|)o|)~QnM*v|mw2}C_ww@c_V)Ji@$vQb_4D%!(AN*p z&kN`}5NKc!Xpk2e*cI4yAjr@#$S^3#Fh2<7vY?=#?x6f-LEQ&}jg2EBBV%LZGBPqV z)ipBJy))IbGQBi1y}UEM+B4giWVY|mT(Tr{$^OhGxAOG$^9&5~0=x3M4&*IcmbdIy zzM)~hkx_n7cYgPQ{AJ7Xm)$B@eyg;sth&0ov9YnuOQS8dy)DzbEwjCC$^Nz_x7zkE zY1_ZQZU3##&aSRNgRTPyx(?jx4l?WxGU{G-tNXx#?gO{_`ub+hnl*d&>^XDh%%4Ah zai+%NOz*|*-izC_7Pq%AUXrzV$&$rO_AlPQfARiXi*GGid~5&WTep_w87#{;T$XRN zEI(*jW7o2#?qywp%euRl9XPP;z^!GsmMyz=VA-u(D^{#nxpL*Yb?Y{6+_-Jqw*Bqi z`=?FYza(q_lJ@;emh9i(zJLFc{UC5_|E(qaZ|&cI>(+s;fCF8D2f7*$bO#++whZLt z1KkG>^neULaNxkLWe08@IB@IM;r;EmmSo*pmUnAe{;lN&xAwQ++P?&3z=5t?2fA+^ z=(%-djuZrxgT>lVn=TeohN-dLc+z`(P{)5S5Q;?~=_+|@Czk_{hKHgqcmEGo^6 z@f1IDV(Eq1xtH}qoIP(BXsQHd1uB1U3!8Oq(FCpxoo$ymmNeaR($wfW;ypbnDtpz0 zhK0)nGEF_tum3oEX7S9sIlFGA9Nv6#-+O1jwDU7(zFl*Fw{daV=gMi!49O34;+Pmh z7#&2B2oz2Tqefupsatm*UURZ>UUFO3!*56E!GD$vt$|PHsPBp`|M7wUbMM&&cO^nI z%VM`Xi!KU!;VwEOYt@OQ+6R&Lc7Y1RPNW%ION>HZ4{TGn9`y7AW2gYUIiO8?%+tPNo8@)WJqHka;rkh|w*ba<(S<3+vdRX5(Au~GD>x!!tJ z>F!Hzle>otR$Jbkzgu*bgW*c0k5)IPEIZZqe6nBUX1?1FQ|n|8R3-5(t)*X?*D1?T}6w1 zbx#I`ZCx?b|5ejX_o~+yK6UCk_NQmGY6U!5b?3ut<-6W#b#>BqZ~k9bW`+b#_Siq!b*jiJ zhmZFejm`7IXWW<)@%Q}RlL?H^RtHTtTz%v1qO{HTbEXB=ZOwQln|L>RZu#>C_fOvB z3SBTGbI(A=$M33BLkt$XD=?|s_O zTz2?=3g@?qXKNl!$>s1%-}c$wCuDxqG+V{zd$Q8+>&NbNpXZ+zt{Sc#(x?=y%D*Ub z|3sz+t!q}kwGUV8-kz?^7?Ap8TAECKJ5xZ=sx<-k7yWrr>C-3_`c#KO;$X}6uM9c| z7#Kns0$5Q91Si33wUP2X3Hy)Sm8lC|LS`DK7yk8qytMA)obHOug(e}L`m1)P{kfvk z_4$%h=88!XwP#%-<~~^3DipZ1&S}+^#avU)tT9SgGFZ*9Y5~`RuC=FDX{#O53Td1a z^fc>a;+KVM4}`wI*Q(W^wM|R=>Et6{ouh?1bEDUs7h7F@z3>$>V!=kBiiUG}xGJj45I_4?iG-<8FmEI4Y+8oHn)BvP(F{Oi^u zt*h?2{ft!S-?r7`=cIGYAHT|n?A>4d?d9Cf{-(#6pKZ6lYdc>)~hhB377lq>nN%r8#?W1(&l?N1ckM#uf3QbIoDbG>GrxC+daiYEVWMu zuzGn+jW~SaSj3x$zO~ZHyz2S&x@8}Ot+jreoqJVdd97fPP$)y_7AmguKxA2~~F zmOr27cilEDaN|u|v*2xC`Om)DdGk;B#HmYHFsUv*wZl==K{SLhWMk;cnTCQ{0jypw zQ-ADf6*fqHX!CCix0lP*&q>A8uk=h;Elz$84)I4Z0<#^YxO^Hf1+t>YVgM_{u_dRL zUXO}7^_pdc(W#%=_KAhM>xCDb%2@TIb$!jXDuxEF#VbCYeE#pt%8MbLC92JjTTX25 zX0lOsSQz^A*+KaVexgc&ACa!xOpH+IQex=F8?$T!8zRwB4 zae}cLp$v9xq3iyf+`iZIXqf7yuS;H+S(Iiqb;{gZ-WQuCbn&w9lGlw>F8^`5{#8HA z_*Iaf$S zJG^V2OwOcB4r@!+{NI~3OZtHJ43SW~zsK$CPx@$GW6D{uZTI2MR|~qox&OQO>WZg@ zmhl!3LCt&15ABOwzhlu~zhd_%83qfdY%SG@Rhbuh`9(o?$%3$59enqm>mFF*eYw_R z^_189vW-{GKJ~El>z!Xg!56x#?y)aTzWea&rzJj)29eww@?~qT_-MV{>~+cTb4S(r zX`cc``;;bjUFw*$#5ugDOXsP6-E()}x|UP3|IBt%zwGfc;hV-&{oL^VhxK;rgl<{T zJoBpW)0Bd{Hrr#ec&jw;+uwMS+w@0y)qy7~ir$^)m%B3glt<{5-Mhsb+~0G5f1*{= zUsbeX`)}TU`Jjihw;h-86W63T)4JUpcjeDh-|&g+M44AGP2REg z|0_r1l_`O)eWkz7Mqdkx&8nQd?fiP%lv9B>RV^NFyBF6Gxl#UVbk_!NeV(;d!q-pSJO6IG8|->F-9dDQN$4E+`MWO#x!%{gmzT8jX6gS`;&BJH zG880N6~)fpxi)6q_V1+!&nAVQzkTiZ#`|wyxo@qTe$Q)VWbSL(uczY!mxh{8oqX`? zl9$m-c&Y-o3j`fBS(+EId2PFAul;{04>axTENx9abOX)Z~(#j1ZS=B+u>`l@ih zOTZtUjQX&P`xJCn7>B(4d+&Cqd)@WjWqV)GyBB)*xAFB_)rF@!Up-z|owZhGX^cSV z90U7RkDvN}oII;bSnK@CQ)iSaKa|vk9{(7;u1Yg9B)0Tv{r_#7A6~7p4Dyw_YF@fc zeE+s{0+M~dHZ3pz=@`G3y#`zWZ|f<5mA}(Aa>u_ZxqE+B_@SPAb0U5}y}Ua_dCJUn z>nfJDtkUU^4*7cTWBb~@udAe&+Wc-_^_cz9X8)O=ROhmPxhiI9cFaAw(r(q1{V$f= z=w9#iIlN@qq!ZpxEln-E)@8rmkS?HqF?>Sc)hC?XpKPjvr+O~VTGzVOIW*-;XsvGA ziQZ3}{p518CvK8@{)>Orz5ABGzxdgH(|=>9F!hUeqTBz{TBofmF7-Y#_&ekNKcC-! zdKR1uS^81%dxOmCD>9q>+$YAysk@f1SlX~^$yttrA79-4z4y)XhyNcoPu&-{yx+&W zBwc>4L2uTCg+|K17l$3y$Pd}MIJnn~H_Z0U?N!{n+zLLp?+=}Cq4!n)rHs>*m#zZCvxAnAEUbWm3SogZUc6N#5)Z~K;H$5*4{o-Hqy=6-1VhNx8 zX{v`7aIXB)t zjaJ$$Uu)&OaX-W7ZC}fO&kSRh-E(bG_=L=>-ixKaJiE##o{)8gSL=-YJ(c7M3-^ib z{;^WlXkMhzp*G>E3$?`me@TrOHLm)9AQ=#^kvt~5hUgEg+bMX=@ zN2#j?(eqcHy2SM`EVJB6_WsMAuG?N6*U~cEeLU^dwtov}+M3V)zhv5+f_i1uQm5X3 zY44AuTm8?JI`}0m^AO*xjURUkC%-L~k$3ddnV30m?Pp2T1zvTI%EhNII8R=B>WI+H zXZNK-73xE?(nKcATKP$K132&21ss2_s}r-F`?>GL{o$G~RwPCVvwW@GxYIj}>&T>? z8$T~^(`uD5^~qkdV4p(Rj`z$x21_$82Z$71F<2`pc}2yXNnxiTth9mAi1LS8A_qMF a@e8dyESsWHJ&S>Xfx*+&&t;ucLK6U>^o-*G literal 10377 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 M)78&qol`;+0Q&keO#lD@ diff --git a/doc/images/qtcreator-clang-code-model-options.png b/doc/images/qtcreator-clang-code-model-options.png index 1a42643d07a5c34d2d9994ab9bf6d6aee6b4384e..d29e59397d045de38afde26b996fe090c54937e1 100644 GIT binary patch literal 7834 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 RQqWi^gQu&X%Q~loCIGy&LvH{8 literal 22674 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 literal 30511 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 G5}E+EnTXo} diff --git a/doc/images/qtcreator-clang-tools-options.png b/doc/images/qtcreator-clang-tools-options.png index 9a6cdc36d16e9eb194026187e6d8d111b2b0d50c..6cf866f13fa317324d14b15129d221786c56ebc7 100644 GIT binary patch literal 5355 zcmeAS@N?(olHy`uVBq!ia0y~yVCrIEU|7Jx#K6G7vhUU+1_qH$o-U3d6}R5b_05-d zpVjc$o~K79vdqZ%p2w!g3|%tT+k`A9&7(2AUrJW$c6mq0tF}rD zeziQ4=Mrlo?aaJo<@2+06JABSO{o6Tj?=Y6|pHP8Ee(M-N@di?n? zm!RpQ3qz|HFXvvIE*p03fQjeZBRkZeY+WUAXCCLPJ4@DVIaB%S=8Dye9!>bRWh%(9 z@bh-^&oZ;P=Ge>6o9p`2;{H&cwW~sxWYU`s(y1Kdvi|M%Qm{UZta=ly;tB?xo^2 z2a8_Ctjvl0>nFaKd%c&}9Q8OceOp_%^Qq7FM5(KuT^}WS{#o?p&G`bS+I~#j*^s$x zM(~x-|2w)ZEzOOm7#rs@Bu{2eo%YSWpnlesbS~?N^I;BI&sNS!JezJi_k!1qKJTkB z-=@C0^?CB-0Nd5`Jj+t|ok@5Tx>fJv>;L~&d6!kYPrrQ6)AQQB@aJV)tNh--dJ$_D=bdR54+O^oyIbICp;DRAJ)R zW~_bmR?ztf<3g3>y@t!IW-oD0`A}8$;@5I>CEW`r)6TC-sqR(mHhnD>+H{+9bHuY! zf9orcn*(g8+a}LzT-ty7#n%6)Ce8I&>)Nwz+LzB&A+^uEQ>)L^F1-DC*%bD*TiGuf zA7IkWOW&N(ADkTjOh5EwME>1n^S;Vvzdbu|Z}J4&#k(vj1Lr5@EjqSu;=Xk+t=2!> z`p$E2sNu?7n`%GxzGu7E8QV)=<}ALnIqP+V?e#A`UvKQn$$z=Ou6%ph(Y+HkSVc<-`*7vU!S%A)Y~`jS|`*t z&SMk{K0m+q+s$JZeSTM$FIeRGr>3H6%SOW!@0q0C0_RLxo_>2tKl>}^$fK)wWz3DZ zrgHU1(564B3-cz%shr`==Uu&jqL%cJ8ttp+VlJDkub+HCdQ#MG(=*G>(_Qa;e|7NW z&Tj{}(<3ADLvL~#?=d~|-*9>6mpeIyw|h#`s{H&X+)>T=ys34wep5?|4liH_g8<3*?r~yr|0u}U!VIHXJPU2 zefNQ#Mf;}i`!8$DT;g&*>r+i-QQo5GZN{s-lV|RmcBJ_Er89?OdiHMKVO`!;TPSSH zTvGh4X61tC-V;BS#J@L6oN;tYex>f+U*~dD;}@heeA(ks_3j}{w?U_rE%So(FFo5i zgl(A})_>Kp7ytizox;Ww0XLR*{E|sCU*tFY>jPtFBa<*MB(3zI*p>p|_$8 z3=OFd*0S@Yov$q zxq_5Gtm?ZP)Ajj<$*f)%kl_wH<|)5#**PabeZ5+dZSSTf83FUv>tfHII2{g_o-nWW znvBcNCgZhgo6b&RTX`Y-^N!Yq=?n}F&#KNX-@P+K^rFM*(33li&bJjiN`su%^7>}P z9la~rE3d46{>#R7W9Uyt28Ij8qQ}-I&U8t&y%n>p?5oTa_o@9L&m8)?=i%Rk(6g6H zKJF;{SvBFlyIBvYG-6=r{mKLLo$X?fZ^1qT`xa!&0hup*wr(x`{_buy0|SGBY`O5Y z>(`fG{rv6Qx4G8k_q-$685kNoJyW&9rdGb+QYCg$IgNp#K}=OQZ*JImBVl(?Sm?fr zymPB*-b*i#j3Y<{Y&+9}I z{8qntL!NAcTu2|NyLd~j0^`pz4|$SzWx8F)8qgBnZEx=`gx`1z|Q;5 zD-E2!#4I^;%kbe-bF0-Gp4LdtQzh3Bde&cqpyVuUl>&}@O6ZG@9S&#Aa^OqleeYWaYP-JTI8l$$gv= zEdA*mfBO{gT(%o$S9f>^&-r!Z?xWMea}<|Ep3d#|ove52oOFm%z9~b)(JPz({QcPf zU&;8H{=OfF=324q=3Rfiv(E6&?j5mRDNpvF$(=Ge;&rO4ZfozVQ#o6h;zeHMMu+Nz z>6#Yq)aJc+Z}pkUKP|79SS{S{$9l$vfgvKo_H^s>{D0rJ#|y1l`B}ntxzdce^P2NM z=dF0|X0-0&=G)r}Y_A_#Dt>;oU+t>TD!-l2p1VGE$y-0?OAHL%Ytw(;zJ1^SYmV>S zIVb}7i!rR8NTgA8E)%n#`Z01;cD{TLc zx7l&NF>d~0bGH8Y+;i$(--J}!ugKZE&eEi=N$ZgL#5pewzt{&h`_5{gbKQ8mE$@X0Ki)5MV7Cj!d85l;OjH# z>m=8huXb(L*irg%T5h{h^JcNv9n%j-JhDAEU(WqvVNJ^U*BkQou5)Ac3;WFy-I^ct zWX?;q&97=3CjI{Yet+fXXYbV}DZOkg%3AS!^W#4ac71LaBfqIgJ_`Eu{P5<@HC)sB zYRlw|Geh?5Ut=SCy*P2f9p_Hj&3Y${RxSyg_t~UK?S3d{q2a5W*W;gWonD-xdX-B) z>S^_@1!;Ho|GU5b=#=Z3KNkv@2KmLb3GZHi^KtZ~XDhetsyyYm@_D{*S!R@A~+y@214$ zDeQ0FnjGHh`XH6#e2LlL{LqP7{dd#8@O(Dia{cVrs(ZI@-{w)Yoo1e_FaP>`>$%B$ zcFa8M@ku0q-jDq@{dzZ7toBto(|V;?XIsXDEJIJft?4=quV3bFn-lZwWZH%-rP;pq zZ$lq-tz2h+GkV`uw(VT;r(FzbFT>m%96-Df3-?%mMTUJ>{a3eP){~q`Y_pfG6o34bEC2cG z1Do5eOv2BHE_RFDYOQiMVFsgtplrv~{eQnj{|uKipA=kdo4-u`=*NY5d!}C5x$Czb z*U81kPfWk~pHDPCw`RY<<<6sR3!krI zwEZxll^5*5MnAm1$8!3gptXz|4_UgF&)Oo#JTi@TWc@p3p{Vi)((aVsiC84(S z*0Jk_pZ}S)cJcf>VW)~hCw$TxyF|LW82dCTVA{=SSucVNn|(AT*cLAYv)fnTQEE7ZpBx< zQ$eflg{JM=FCTNZ%Iu_6mCEsS*Y!VRqQAw(EfJg|%~!?tWzD^kn_fXR>D&MBO?ZAY zz;kg;h?P;8dB4@_=NC^D{}2Ck;ngzd*U5gNUYqlIwYO`2TIRX0dQFc1YtuAU=ihB> z3aiSZ)^(j+Wc+;hyc@4)#onG2WouvcWrg0oRkaV-p6)Dsqg#6Q^zVHy_ot`-SjY6_ zti~?A6(1kExBAt`*0by~|Mt@N5m)>2^@~^8t=8P|>PO+>i>YDruAF=LxQD^f(zm_iHa& z+n(P!+v@(Ovi=`p$zOi&ZLgYlT5OVQ3 zynXw&-~Qi@+Yh}Pgw*zb=c%=P#F%jN>6UHVw(Z*W>tVZm-LIF+cgwmuO=eK_;S{s| zKG#m>Bf|w=OV3}YPMwT^RTybLG36=8@FfP?n5$m z@6NbOFfv>)HYxplH9Pyd`aj{{a#ucmd3ky6+_|qgODq@|s@guD*z@g}^?Se1>Q(;| zWImlXPI@uneHlBbIsK78)OY=JYet*OPbyEQUj#L*5Bq%iV{p)GifY~$9)^Z_iFH+V z@gE-?Z2s>zf!%8EO=AX!_^&k;Rx^UDfm8qY16 z9$b*^H1C;B@1`Yd?2@^)RZl*;_Vl(!y=nH^y!4>txG9m9HF`!ypJzXf;{5jd@hA23 z+ULV!Y~R;v#?{p%|36(|d!H+zzFr>W@TK#NeMN6+Et!2wwa&6W;M9$)#Yf*%PPk!T z7#`*v<@c>AEI%fAmPoq)_M+EX-GS+%w^}m|ce!nUQW_d?^VF-ZH&w@<=C62u=Ikes z#}=gbFXh(Ub!qFR*I(BxJ3lo@K2wNQYPPlJ&O`3X>74g0j6MGRzhwOR+w`2RX4>~x zov5+0`!C^RYyWRO_u?HBPM;4tl*Uk9UHw9mAz|j%7$2qO*Ei3z=(~Gr^$joE-zhh{ z=KU4E%jMbrjQ`5!U)e_0eyo4~{QO*BI>F@&55tB#RdTyd-}+j0?RwwZIp<81t0$wb|w#pq`Y0Kgcs+n~3PT?x^}#|01m- V`oz~0{R|8Y44$rjF6*2UngB=reHZ`$ literal 14187 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 T(Y8tMJ;-yOu6{1-oD!M<)c^H% literal 247291 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Ð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 Qfq{X+)78&qol`;+0QmZY>Hq)$ diff --git a/doc/images/qtcreator-clazy.png b/doc/images/qtcreator-clazy.png index 9252740fb5d61d4e17db70b4e35caafeefb64bb4..955357ed1e3f89e0f8915e297348e4b5aa004a09 100644 GIT binary patch literal 23155 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 literal 65735 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 IIVCg!0F^h3v;Y7A diff --git a/doc/images/qtcreator-diagnostics-configuration.png b/doc/images/qtcreator-diagnostics-configuration.png index 36471994e7d5501b812e8502eb540db239696645..ca123f4df0a68e7af142406102b8c404c90707ea 100644 GIT binary patch literal 12349 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 JtaD0e0s!0Lz#ISo literal 61641 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 UYm#8ez`(%Z>FVdQ&MBb@00#Fy*Z=?k literal 22600 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 diff --git a/doc/src/analyze/creator-clang-static-analyzer.qdoc b/doc/src/analyze/creator-clang-static-analyzer.qdoc index ff8eeed5762..c4468ef0389 100644 --- a/doc/src/analyze/creator-clang-static-analyzer.qdoc +++ b/doc/src/analyze/creator-clang-static-analyzer.qdoc @@ -103,12 +103,12 @@ \image qtcreator-clang-tools.png "Clang-Tidy and Clazy view" - Select the link in the \uicontrol Location column to move to the location - where the issue appears in the code editor. + Double-click an issue to move to the location where the issue appears in + the code editor. - In the \uicontrol {Fixit Status} column, select issues that you want to - apply refactoring actions to, and then select \uicontrol {Apply Fixits}. - The status of the issues is updated in the \uicontrol {Fixit Status} column. + If a fixit exists for an issue, you can select the check box next to the + issue to schedule it for fixing. You can see the status of the issue by + hovering the mouse pointer over the icon next to the check box. \section1 Configuring Clang Tools From b16b8db48b934a87c3a16371eed010bfb4feb9ef Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 10 Jul 2019 10:51:54 +0200 Subject: [PATCH 42/53] Sqlite: Use newest version Change-Id: Ic3951b9b38d5bc8cfa658e9cce0d6effaaa329c1 Reviewed-by: Tim Jenssen --- src/libs/3rdparty/sqlite/sqlite3.c | 14363 ++++++++++++++---------- src/libs/3rdparty/sqlite/sqlite3.h | 134 +- src/libs/3rdparty/sqlite/sqlite3ext.h | 6 + 3 files changed, 8457 insertions(+), 6046 deletions(-) diff --git a/src/libs/3rdparty/sqlite/sqlite3.c b/src/libs/3rdparty/sqlite/sqlite3.c index d015df2c315..440429527d6 100644 --- a/src/libs/3rdparty/sqlite/sqlite3.c +++ b/src/libs/3rdparty/sqlite/sqlite3.c @@ -1,6 +1,6 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.26.0. By combining all the individual C code files into this +** version 3.28.0. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -1162,9 +1162,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.26.0" -#define SQLITE_VERSION_NUMBER 3026000 -#define SQLITE_SOURCE_ID "2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9" +#define SQLITE_VERSION "3.28.0" +#define SQLITE_VERSION_NUMBER 3028000 +#define SQLITE_SOURCE_ID "2019-04-16 19:49:53 884b4b7e502b4e991677b53971277adfaf0a04a284f8e483e2553d0f83156b50" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -1228,6 +1228,9 @@ SQLITE_API int sqlite3_libversion_number(void); #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS SQLITE_API int sqlite3_compileoption_used(const char *zOptName); SQLITE_API const char *sqlite3_compileoption_get(int N); +#else +# define sqlite3_compileoption_used(X) 0 +# define sqlite3_compileoption_get(X) ((void*)0) #endif /* @@ -1862,6 +1865,15 @@ struct sqlite3_io_methods { ** file space based on this hint in order to help writes to the database ** file run faster. ** +**

  • [[SQLITE_FCNTL_SIZE_LIMIT]] +** The [SQLITE_FCNTL_SIZE_LIMIT] opcode is used by in-memory VFS that +** implements [sqlite3_deserialize()] to set an upper bound on the size +** of the in-memory database. The argument is a pointer to a [sqlite3_int64]. +** If the integer pointed to is negative, then it is filled in with the +** current limit. Otherwise the limit is set to the larger of the value +** of the integer pointed to and the current database size. The integer +** pointed to is set to the new limit. +** **
  • [[SQLITE_FCNTL_CHUNK_SIZE]] ** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS ** extends and truncates the database file in chunks of a size specified @@ -2170,6 +2182,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 +#define SQLITE_FCNTL_SIZE_LIMIT 36 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE @@ -3011,6 +3024,17 @@ struct sqlite3_mem_methods { ** negative value for this option restores the default behaviour. ** This option is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. +** +** [[SQLITE_CONFIG_MEMDB_MAXSIZE]] +**
    SQLITE_CONFIG_MEMDB_MAXSIZE +**
    The SQLITE_CONFIG_MEMDB_MAXSIZE option accepts a single parameter +** [sqlite3_int64] parameter which is the default maximum size for an in-memory +** database created using [sqlite3_deserialize()]. This default maximum +** size can be adjusted up or down for individual databases using the +** [SQLITE_FCNTL_SIZE_LIMIT] [sqlite3_file_control|file-control]. If this +** configuration setting is never used, then the default maximum is determined +** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that +** compile-time option is not set, then the default maximum is 1073741824. ** */ #define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ @@ -3041,6 +3065,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ #define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ #define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ +#define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */ /* ** CAPI3REF: Database Connection Configuration Options @@ -3103,8 +3128,8 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] **
    SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
    -**
    ^This option is used to enable or disable the two-argument -** version of the [fts3_tokenizer()] function which is part of the +**
    ^This option is used to enable or disable the +** [fts3_tokenizer()] function which is part of the ** [FTS3] full-text search engine extension. ** There should be two additional arguments. ** The first argument is an integer which is 0 to disable fts3_tokenizer() or @@ -3216,6 +3241,17 @@ struct sqlite3_mem_methods { **
  • Direct writes to [shadow tables]. ** **
  • +** +** [[SQLITE_DBCONFIG_WRITABLE_SCHEMA]]
    SQLITE_DBCONFIG_WRITABLE_SCHEMA
    +**
    The SQLITE_DBCONFIG_WRITABLE_SCHEMA option activates or deactivates the +** "writable_schema" flag. This has the same effect and is logically equivalent +** to setting [PRAGMA writable_schema=ON] or [PRAGMA writable_schema=OFF]. +** The first argument to this setting is an integer which is 0 to disable +** the writable_schema, positive to enable writable_schema, or negative to +** leave the setting unchanged. The second parameter is a pointer to an +** integer into which is written 0 or 1 to indicate whether the writable_schema +** is enabled or disabled following this call. +**
    ** */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ @@ -3229,7 +3265,8 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */ #define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */ #define SQLITE_DBCONFIG_DEFENSIVE 1010 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1010 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1011 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes @@ -3386,7 +3423,7 @@ SQLITE_API int sqlite3_changes(sqlite3*); ** not. ^Changes to a view that are intercepted by INSTEAD OF triggers ** are not counted. ** -** This the [sqlite3_total_changes(D)] interface only reports the number +** The [sqlite3_total_changes(D)] interface only reports the number ** of rows that changed due to SQL statement run against database ** connection D. Any changes by other database connections are ignored. ** To detect changes against a database file from other database @@ -4030,9 +4067,9 @@ SQLITE_API int sqlite3_set_authorizer( ** time is in units of nanoseconds, however the current implementation ** is only capable of millisecond resolution so the six least significant ** digits in the time are meaningless. Future versions of SQLite -** might provide greater resolution on the profiler callback. The -** sqlite3_profile() function is considered experimental and is -** subject to change in future versions of SQLite. +** might provide greater resolution on the profiler callback. Invoking +** either [sqlite3_trace()] or [sqlite3_trace_v2()] will cancel the +** profile callback. */ SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); @@ -4446,6 +4483,8 @@ SQLITE_API int sqlite3_open_v2( ** is not a database file pathname pointer that SQLite passed into the xOpen ** VFS method, then the behavior of this routine is undefined and probably ** undesirable. +** +** See the [URI filename] documentation for additional information. */ SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); @@ -4668,18 +4707,23 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** deplete the limited store of lookaside memory. Future versions of ** SQLite may act on this hint differently. ** -** [[SQLITE_PREPARE_NORMALIZE]] ^(
    SQLITE_PREPARE_NORMALIZE
    -**
    The SQLITE_PREPARE_NORMALIZE flag indicates that a normalized -** representation of the SQL statement should be calculated and then -** associated with the prepared statement, which can be obtained via -** the [sqlite3_normalized_sql()] interface.)^ The semantics used to -** normalize a SQL statement are unspecified and subject to change. -** At a minimum, literal values will be replaced with suitable -** placeholders. +** [[SQLITE_PREPARE_NORMALIZE]]
    SQLITE_PREPARE_NORMALIZE
    +**
    The SQLITE_PREPARE_NORMALIZE flag is a no-op. This flag used +** to be required for any prepared statement that wanted to use the +** [sqlite3_normalized_sql()] interface. However, the +** [sqlite3_normalized_sql()] interface is now available to all +** prepared statements, regardless of whether or not they use this +** flag. +** +** [[SQLITE_PREPARE_NO_VTAB]]
    SQLITE_PREPARE_NO_VTAB
    +**
    The SQLITE_PREPARE_NO_VTAB flag causes the SQL compiler +** to return an error (error code SQLITE_ERROR) if the statement uses +** any virtual tables. ** */ #define SQLITE_PREPARE_PERSISTENT 0x01 #define SQLITE_PREPARE_NORMALIZE 0x02 +#define SQLITE_PREPARE_NO_VTAB 0x04 /* ** CAPI3REF: Compiling An SQL Statement @@ -4904,6 +4948,18 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); */ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); +/* +** CAPI3REF: Query The EXPLAIN Setting For A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_isexplain(S) interface returns 1 if the +** prepared statement S is an EXPLAIN statement, or 2 if the +** statement S is an EXPLAIN QUERY PLAN. +** ^The sqlite3_stmt_isexplain(S) interface returns 0 if S is +** an ordinary statement or a NULL pointer. +*/ +SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); + /* ** CAPI3REF: Determine If A Prepared Statement Has Been Reset ** METHOD: sqlite3_stmt @@ -5043,7 +5099,9 @@ typedef struct sqlite3_context sqlite3_context; ** ^The fifth argument to the BLOB and string binding interfaces ** is a destructor used to dispose of the BLOB or ** string after SQLite has finished with it. ^The destructor is called -** to dispose of the BLOB or string even if the call to bind API fails. +** to dispose of the BLOB or string even if the call to the bind API fails, +** except the destructor is not called if the third parameter is a NULL +** pointer or the fourth parameter is negative. ** ^If the fifth argument is ** the special value [SQLITE_STATIC], then SQLite assumes that the ** information is in static, unmanaged space and does not need to be freed. @@ -5960,6 +6018,8 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** sqlite3_value_nochange   ** →  True if the column is unchanged in an UPDATE ** against a virtual table. +** sqlite3_value_frombind   +** →  True if value originated from a [bound parameter] ** ** ** Details: @@ -6021,6 +6081,11 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** than within an [xUpdate] method call for an UPDATE statement, then ** the return value is arbitrary and meaningless. ** +** ^The sqlite3_value_frombind(X) interface returns non-zero if the +** value X originated from one of the [sqlite3_bind_int|sqlite3_bind()] +** interfaces. ^If X comes from an SQL literal value, or a table column, +** and expression, then sqlite3_value_frombind(X) returns zero. +** ** Please pay particular attention to the fact that the pointer returned ** from [sqlite3_value_blob()], [sqlite3_value_text()], or ** [sqlite3_value_text16()] can be invalidated by a subsequent call to @@ -6066,6 +6131,7 @@ SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); SQLITE_API int sqlite3_value_type(sqlite3_value*); SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); SQLITE_API int sqlite3_value_nochange(sqlite3_value*); +SQLITE_API int sqlite3_value_frombind(sqlite3_value*); /* ** CAPI3REF: Finding The Subtype Of SQL Values @@ -6801,7 +6867,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); ** associated with database N of connection D. ^The main database file ** has the name "main". If there is no attached database N on the database ** connection D, or if database N is a temporary or in-memory database, then -** a NULL pointer is returned. +** this function will return either a NULL pointer or an empty string. ** ** ^The filename returned by this function is the output of the ** xFullPathname method of the [VFS]. ^In other words, the filename @@ -11035,7 +11101,7 @@ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); ** sqlite3changeset_next() is called on the iterator or until the ** conflict-handler function returns. If pnCol is not NULL, then *pnCol is ** set to the number of columns in the table affected by the change. If -** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change ** is an indirect change, or false (0) otherwise. See the documentation for ** [sqlite3session_indirect()] for a description of direct and indirect ** changes. Finally, if pOp is not NULL, then *pOp is set to one of @@ -11902,7 +11968,7 @@ SQLITE_API int sqlite3rebaser_configure( ** in size. This function allocates and populates a buffer with a copy ** of the changeset rebased rebased according to the configuration of the ** rebaser object passed as the first argument. If successful, (*ppOut) -** is set to point to the new buffer containing the rebased changset and +** is set to point to the new buffer containing the rebased changeset and ** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the ** responsibility of the caller to eventually free the new buffer using ** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut) @@ -12269,12 +12335,8 @@ struct Fts5PhraseIter { ** ** Usually, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. The exception is if the table was created -** with the offsets=0 option specified. In this case *piOff is always -** set to -1. -** -** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) -** if an error occurs. +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -12315,7 +12377,7 @@ struct Fts5PhraseIter { ** Save the pointer passed as the second argument as the extension functions ** "auxiliary data". The pointer may then be retrieved by the current or any ** future invocation of the same fts5 extension function made as part of -** of the same MATCH query using the xGetAuxdata() API. +** the same MATCH query using the xGetAuxdata() API. ** ** Each extension function is allocated a single auxiliary data slot for ** each FTS query (MATCH expression). If the extension function is invoked @@ -12330,7 +12392,7 @@ struct Fts5PhraseIter { ** The xDelete callback, if one is specified, is also invoked on the ** auxiliary data pointer after the FTS5 query has finished. ** -** If an error (e.g. an OOM condition) occurs within this function, an +** If an error (e.g. an OOM condition) occurs within this function, ** the auxiliary data is set to NULL and an error code returned. If the ** xDelete parameter was not NULL, it is invoked on the auxiliary data ** pointer before returning. @@ -12563,11 +12625,11 @@ struct Fts5ExtensionApi { ** the tokenizer substitutes "first" for "1st" and the query works ** as expected. ** -**
  • By adding multiple synonyms for a single term to the FTS index. -** In this case, when tokenizing query text, the tokenizer may -** provide multiple synonyms for a single term within the document. -** FTS5 then queries the index for each synonym individually. For -** example, faced with the query: +**
  • By querying the index for all synonyms of each query term +** separately. In this case, when tokenizing query text, the +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each +** synonym individually. For example, faced with the query: ** ** ** ... MATCH 'first place' @@ -12591,7 +12653,7 @@ struct Fts5ExtensionApi { ** "place". ** ** This way, even if the tokenizer does not provide synonyms -** when tokenizing query text (it should not - to do would be +** when tokenizing query text (it should not - to do so would be ** inefficient), it doesn't matter if the user queries for ** 'first + place' or '1st + place', as there are entries in the ** FTS index corresponding to both forms of the first token. @@ -13356,7 +13418,7 @@ struct Hash { unsigned int count; /* Number of entries in this table */ HashElem *first; /* The first element of the array */ struct _ht { /* the hash table */ - int count; /* Number of entries with this hash */ + unsigned int count; /* Number of entries with this hash */ HashElem *chain; /* Pointer to first entry with this hash */ } *ht; }; @@ -13497,99 +13559,94 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #define TK_PRECEDING 85 #define TK_RANGE 86 #define TK_UNBOUNDED 87 -#define TK_REINDEX 88 -#define TK_RENAME 89 -#define TK_CTIME_KW 90 -#define TK_ANY 91 -#define TK_BITAND 92 -#define TK_BITOR 93 -#define TK_LSHIFT 94 -#define TK_RSHIFT 95 -#define TK_PLUS 96 -#define TK_MINUS 97 -#define TK_STAR 98 -#define TK_SLASH 99 -#define TK_REM 100 -#define TK_CONCAT 101 -#define TK_COLLATE 102 -#define TK_BITNOT 103 -#define TK_ON 104 -#define TK_INDEXED 105 -#define TK_STRING 106 -#define TK_JOIN_KW 107 -#define TK_CONSTRAINT 108 -#define TK_DEFAULT 109 -#define TK_NULL 110 -#define TK_PRIMARY 111 -#define TK_UNIQUE 112 -#define TK_CHECK 113 -#define TK_REFERENCES 114 -#define TK_AUTOINCR 115 -#define TK_INSERT 116 -#define TK_DELETE 117 -#define TK_UPDATE 118 -#define TK_SET 119 -#define TK_DEFERRABLE 120 -#define TK_FOREIGN 121 -#define TK_DROP 122 -#define TK_UNION 123 -#define TK_ALL 124 -#define TK_EXCEPT 125 -#define TK_INTERSECT 126 -#define TK_SELECT 127 -#define TK_VALUES 128 -#define TK_DISTINCT 129 -#define TK_DOT 130 -#define TK_FROM 131 -#define TK_JOIN 132 -#define TK_USING 133 -#define TK_ORDER 134 -#define TK_GROUP 135 -#define TK_HAVING 136 -#define TK_LIMIT 137 -#define TK_WHERE 138 -#define TK_INTO 139 -#define TK_NOTHING 140 -#define TK_FLOAT 141 -#define TK_BLOB 142 -#define TK_INTEGER 143 -#define TK_VARIABLE 144 -#define TK_CASE 145 -#define TK_WHEN 146 -#define TK_THEN 147 -#define TK_ELSE 148 -#define TK_INDEX 149 -#define TK_ALTER 150 -#define TK_ADD 151 -#define TK_WINDOW 152 -#define TK_OVER 153 -#define TK_FILTER 154 -#define TK_TRUEFALSE 155 -#define TK_ISNOT 156 -#define TK_FUNCTION 157 -#define TK_COLUMN 158 -#define TK_AGG_FUNCTION 159 -#define TK_AGG_COLUMN 160 -#define TK_UMINUS 161 -#define TK_UPLUS 162 -#define TK_TRUTH 163 -#define TK_REGISTER 164 -#define TK_VECTOR 165 -#define TK_SELECT_COLUMN 166 -#define TK_IF_NULL_ROW 167 -#define TK_ASTERISK 168 -#define TK_SPAN 169 -#define TK_END_OF_FILE 170 -#define TK_UNCLOSED_STRING 171 -#define TK_SPACE 172 -#define TK_ILLEGAL 173 - -/* The token codes above must all fit in 8 bits */ -#define TKFLG_MASK 0xff - -/* Flags that can be added to a token code when it is not -** being stored in a u8: */ -#define TKFLG_DONTFOLD 0x100 /* Omit constant folding optimizations */ +#define TK_EXCLUDE 88 +#define TK_GROUPS 89 +#define TK_OTHERS 90 +#define TK_TIES 91 +#define TK_REINDEX 92 +#define TK_RENAME 93 +#define TK_CTIME_KW 94 +#define TK_ANY 95 +#define TK_BITAND 96 +#define TK_BITOR 97 +#define TK_LSHIFT 98 +#define TK_RSHIFT 99 +#define TK_PLUS 100 +#define TK_MINUS 101 +#define TK_STAR 102 +#define TK_SLASH 103 +#define TK_REM 104 +#define TK_CONCAT 105 +#define TK_COLLATE 106 +#define TK_BITNOT 107 +#define TK_ON 108 +#define TK_INDEXED 109 +#define TK_STRING 110 +#define TK_JOIN_KW 111 +#define TK_CONSTRAINT 112 +#define TK_DEFAULT 113 +#define TK_NULL 114 +#define TK_PRIMARY 115 +#define TK_UNIQUE 116 +#define TK_CHECK 117 +#define TK_REFERENCES 118 +#define TK_AUTOINCR 119 +#define TK_INSERT 120 +#define TK_DELETE 121 +#define TK_UPDATE 122 +#define TK_SET 123 +#define TK_DEFERRABLE 124 +#define TK_FOREIGN 125 +#define TK_DROP 126 +#define TK_UNION 127 +#define TK_ALL 128 +#define TK_EXCEPT 129 +#define TK_INTERSECT 130 +#define TK_SELECT 131 +#define TK_VALUES 132 +#define TK_DISTINCT 133 +#define TK_DOT 134 +#define TK_FROM 135 +#define TK_JOIN 136 +#define TK_USING 137 +#define TK_ORDER 138 +#define TK_GROUP 139 +#define TK_HAVING 140 +#define TK_LIMIT 141 +#define TK_WHERE 142 +#define TK_INTO 143 +#define TK_NOTHING 144 +#define TK_FLOAT 145 +#define TK_BLOB 146 +#define TK_INTEGER 147 +#define TK_VARIABLE 148 +#define TK_CASE 149 +#define TK_WHEN 150 +#define TK_THEN 151 +#define TK_ELSE 152 +#define TK_INDEX 153 +#define TK_ALTER 154 +#define TK_ADD 155 +#define TK_WINDOW 156 +#define TK_OVER 157 +#define TK_FILTER 158 +#define TK_TRUEFALSE 159 +#define TK_ISNOT 160 +#define TK_FUNCTION 161 +#define TK_COLUMN 162 +#define TK_AGG_FUNCTION 163 +#define TK_AGG_COLUMN 164 +#define TK_UMINUS 165 +#define TK_UPLUS 166 +#define TK_TRUTH 167 +#define TK_REGISTER 168 +#define TK_VECTOR 169 +#define TK_SELECT_COLUMN 170 +#define TK_IF_NULL_ROW 171 +#define TK_ASTERISK 172 +#define TK_SPAN 173 +#define TK_SPACE 174 +#define TK_ILLEGAL 175 /************** End of parse.h ***********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -14521,9 +14578,6 @@ struct BtreePayload { SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const BtreePayload *pPayload, int flags, int seekResult); SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); -#ifndef SQLITE_OMIT_WINDOWFUNC -SQLITE_PRIVATE void sqlite3BtreeSkipNext(BtCursor*); -#endif SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int flags); SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); @@ -14535,6 +14589,7 @@ SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor*); SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*); SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*); +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor*); SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); @@ -14774,12 +14829,11 @@ typedef struct VdbeOpList VdbeOpList; #endif /* -** The following macro converts a relative address in the p2 field -** of a VdbeOp structure into a negative number so that -** sqlite3VdbeAddOpList() knows that the address is relative. Calling -** the macro again restores the address. +** The following macro converts a label returned by sqlite3VdbeMakeLabel() +** into an index into the Parse.aLabel[] array that contains the resolved +** address of that label. */ -#define ADDR(X) (-1-(X)) +#define ADDR(X) (~(X)) /* ** The makefile scans the vdbe.c source file and creates the "opcodes.h" @@ -14881,25 +14935,25 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Offset 89 /* synopsis: r[P3] = sqlite_offset(P1) */ #define OP_Column 90 /* synopsis: r[P3]=PX */ #define OP_Affinity 91 /* synopsis: affinity(r[P1@P2]) */ -#define OP_BitAnd 92 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ -#define OP_BitOr 93 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ -#define OP_ShiftLeft 94 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ -#define OP_Add 96 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ -#define OP_Subtract 97 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ -#define OP_Multiply 98 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ -#define OP_Divide 99 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ -#define OP_Remainder 100 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ -#define OP_Concat 101 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ -#define OP_MakeRecord 102 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ -#define OP_BitNot 103 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ -#define OP_Count 104 /* synopsis: r[P2]=count() */ -#define OP_ReadCookie 105 -#define OP_String8 106 /* same as TK_STRING, synopsis: r[P2]='P4' */ -#define OP_SetCookie 107 -#define OP_ReopenIdx 108 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenRead 109 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenWrite 110 /* synopsis: root=P2 iDb=P3 */ +#define OP_MakeRecord 92 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 93 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 94 +#define OP_SetCookie 95 +#define OP_BitAnd 96 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ +#define OP_BitOr 97 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ +#define OP_ShiftLeft 98 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ +#define OP_Add 100 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ +#define OP_Subtract 101 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ +#define OP_Multiply 102 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ +#define OP_Divide 103 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ +#define OP_Remainder 104 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ +#define OP_Concat 105 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ +#define OP_ReopenIdx 106 /* synopsis: root=P2 iDb=P3 */ +#define OP_BitNot 107 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ +#define OP_OpenRead 108 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenWrite 109 /* synopsis: root=P2 iDb=P3 */ +#define OP_String8 110 /* same as TK_STRING, synopsis: r[P2]='P4' */ #define OP_OpenDup 111 #define OP_OpenAutoindex 112 /* synopsis: nColumn=P2 */ #define OP_OpenEphemeral 113 /* synopsis: nColumn=P2 */ @@ -14912,57 +14966,56 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Sequence 120 /* synopsis: r[P2]=cursor[P1].ctr++ */ #define OP_NewRowid 121 /* synopsis: r[P2]=rowid */ #define OP_Insert 122 /* synopsis: intkey=r[P3] data=r[P2] */ -#define OP_InsertInt 123 /* synopsis: intkey=P3 data=r[P2] */ -#define OP_Delete 124 -#define OP_ResetCount 125 -#define OP_SorterCompare 126 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ -#define OP_SorterData 127 /* synopsis: r[P2]=data */ -#define OP_RowData 128 /* synopsis: r[P2]=data */ -#define OP_Rowid 129 /* synopsis: r[P2]=rowid */ -#define OP_NullRow 130 -#define OP_SeekEnd 131 -#define OP_SorterInsert 132 /* synopsis: key=r[P2] */ -#define OP_IdxInsert 133 /* synopsis: key=r[P2] */ -#define OP_IdxDelete 134 /* synopsis: key=r[P2@P3] */ -#define OP_DeferredSeek 135 /* synopsis: Move P3 to P1.rowid if needed */ -#define OP_IdxRowid 136 /* synopsis: r[P2]=rowid */ -#define OP_Destroy 137 -#define OP_Clear 138 -#define OP_ResetSorter 139 -#define OP_CreateBtree 140 /* synopsis: r[P2]=root iDb=P1 flags=P3 */ -#define OP_Real 141 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ -#define OP_SqlExec 142 -#define OP_ParseSchema 143 -#define OP_LoadAnalysis 144 -#define OP_DropTable 145 -#define OP_DropIndex 146 -#define OP_DropTrigger 147 -#define OP_IntegrityCk 148 -#define OP_RowSetAdd 149 /* synopsis: rowset(P1)=r[P2] */ -#define OP_Param 150 -#define OP_FkCounter 151 /* synopsis: fkctr[P1]+=P2 */ -#define OP_MemMax 152 /* synopsis: r[P1]=max(r[P1],r[P2]) */ -#define OP_OffsetLimit 153 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ -#define OP_AggInverse 154 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ -#define OP_AggStep 155 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggStep1 156 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggValue 157 /* synopsis: r[P3]=value N=P2 */ -#define OP_AggFinal 158 /* synopsis: accum=r[P1] N=P2 */ -#define OP_Expire 159 -#define OP_TableLock 160 /* synopsis: iDb=P1 root=P2 write=P3 */ -#define OP_VBegin 161 -#define OP_VCreate 162 -#define OP_VDestroy 163 -#define OP_VOpen 164 -#define OP_VColumn 165 /* synopsis: r[P3]=vcolumn(P2) */ -#define OP_VRename 166 -#define OP_Pagecount 167 -#define OP_MaxPgcnt 168 -#define OP_Trace 169 -#define OP_CursorHint 170 -#define OP_Noop 171 -#define OP_Explain 172 -#define OP_Abortable 173 +#define OP_Delete 123 +#define OP_ResetCount 124 +#define OP_SorterCompare 125 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ +#define OP_SorterData 126 /* synopsis: r[P2]=data */ +#define OP_RowData 127 /* synopsis: r[P2]=data */ +#define OP_Rowid 128 /* synopsis: r[P2]=rowid */ +#define OP_NullRow 129 +#define OP_SeekEnd 130 +#define OP_SorterInsert 131 /* synopsis: key=r[P2] */ +#define OP_IdxInsert 132 /* synopsis: key=r[P2] */ +#define OP_IdxDelete 133 /* synopsis: key=r[P2@P3] */ +#define OP_DeferredSeek 134 /* synopsis: Move P3 to P1.rowid if needed */ +#define OP_IdxRowid 135 /* synopsis: r[P2]=rowid */ +#define OP_Destroy 136 +#define OP_Clear 137 +#define OP_ResetSorter 138 +#define OP_CreateBtree 139 /* synopsis: r[P2]=root iDb=P1 flags=P3 */ +#define OP_SqlExec 140 +#define OP_ParseSchema 141 +#define OP_LoadAnalysis 142 +#define OP_DropTable 143 +#define OP_DropIndex 144 +#define OP_Real 145 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ +#define OP_DropTrigger 146 +#define OP_IntegrityCk 147 +#define OP_RowSetAdd 148 /* synopsis: rowset(P1)=r[P2] */ +#define OP_Param 149 +#define OP_FkCounter 150 /* synopsis: fkctr[P1]+=P2 */ +#define OP_MemMax 151 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_OffsetLimit 152 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ +#define OP_AggInverse 153 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ +#define OP_AggStep 154 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggStep1 155 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggValue 156 /* synopsis: r[P3]=value N=P2 */ +#define OP_AggFinal 157 /* synopsis: accum=r[P1] N=P2 */ +#define OP_Expire 158 +#define OP_TableLock 159 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 160 +#define OP_VCreate 161 +#define OP_VDestroy 162 +#define OP_VOpen 163 +#define OP_VColumn 164 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 165 +#define OP_Pagecount 166 +#define OP_MaxPgcnt 167 +#define OP_Trace 168 +#define OP_CursorHint 169 +#define OP_Noop 170 +#define OP_Explain 171 +#define OP_Abortable 172 /* Properties such as "out2" or "jump" that are specified in ** comments following the "case" for each opcode in the vdbe.c @@ -14986,17 +15039,17 @@ typedef struct VdbeOpList VdbeOpList; /* 64 */ 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10, 0x10,\ /* 72 */ 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10,\ /* 80 */ 0x10, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00,\ -/* 88 */ 0x12, 0x20, 0x00, 0x00, 0x26, 0x26, 0x26, 0x26,\ -/* 96 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x00, 0x12,\ -/* 104 */ 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 88 */ 0x12, 0x20, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\ +/* 96 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,\ +/* 104 */ 0x26, 0x26, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00,\ /* 112 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ /* 120 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 128 */ 0x00, 0x10, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,\ -/* 136 */ 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\ -/* 144 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00,\ -/* 152 */ 0x04, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\ -/* 168 */ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,} +/* 128 */ 0x10, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x10,\ +/* 136 */ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\ +/* 144 */ 0x00, 0x10, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04,\ +/* 152 */ 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,\ +/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00,} /* The sqlite3P2Values() routine is able to run faster if it knows ** the value of the largest JUMP opcode. The smaller the maximum @@ -15055,6 +15108,12 @@ SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse*); # define ExplainQueryPlan(P) # define ExplainQueryPlanPop(P) # define ExplainQueryPlanParent(P) 0 +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ +#endif +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_EXPLAIN) +SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char*,const char*); +#else +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ #endif SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8); @@ -15070,7 +15129,7 @@ SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); -SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse*); SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); @@ -15091,6 +15150,10 @@ SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, u8); +#ifdef SQLITE_ENABLE_NORMALIZE +SQLITE_PRIVATE void sqlite3VdbeAddDblquoteStr(sqlite3*,Vdbe*,const char*); +SQLITE_PRIVATE int sqlite3VdbeUsesDoubleQuotedString(Vdbe*,const char*); +#endif SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe*, int, u8); @@ -16216,10 +16279,13 @@ SQLITE_PRIVATE void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); /* This is an extra SQLITE_TRACE macro that indicates "legacy" tracing ** in the style of sqlite3_trace() */ -#define SQLITE_TRACE_LEGACY 0x80 +#define SQLITE_TRACE_LEGACY 0x40 /* Use the legacy xTrace */ +#define SQLITE_TRACE_XPROFILE 0x80 /* Use the legacy xProfile */ #else -#define SQLITE_TRACE_LEGACY 0 +#define SQLITE_TRACE_LEGACY 0 +#define SQLITE_TRACE_XPROFILE 0 #endif /* SQLITE_OMIT_DEPRECATED */ +#define SQLITE_TRACE_NONLEGACY_MASK 0x0f /* Normal flags */ /* @@ -16278,14 +16344,17 @@ struct sqlite3 { void **aExtension; /* Array of shared library handles */ int (*xTrace)(u32,void*,void*,void*); /* Trace function */ void *pTraceArg; /* Argument to the trace function */ +#ifndef SQLITE_OMIT_DEPRECATED void (*xProfile)(void*,const char*,u64); /* Profiling function */ void *pProfileArg; /* Argument to profile function */ +#endif void *pCommitArg; /* Argument to xCommitCallback() */ int (*xCommitCallback)(void*); /* Invoked at every commit. */ void *pRollbackArg; /* Argument to xRollbackCallback() */ void (*xRollbackCallback)(void*); /* Invoked at every commit. */ void *pUpdateArg; void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); + Parse *pParse; /* Current parse */ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK void *pPreUpdateArg; /* First argument to xPreUpdateCallback */ void (*xPreUpdateCallback)( /* Registered using sqlite3_preupdate_hook() */ @@ -16410,6 +16479,7 @@ struct sqlite3 { #define SQLITE_VdbeTrace HI(0x0004) /* True to trace VDBE execution */ #define SQLITE_VdbeAddopTrace HI(0x0008) /* Trace sqlite3VdbeAddOp() calls */ #define SQLITE_VdbeEQP HI(0x0010) /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_ParserTrace HI(0x0020) /* PRAGMA parser_trace=ON */ #endif /* @@ -16418,7 +16488,8 @@ struct sqlite3 { #define DBFLAG_SchemaChange 0x0001 /* Uncommitted Hash table changes */ #define DBFLAG_PreferBuiltin 0x0002 /* Preference to built-in funcs */ #define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */ -#define DBFLAG_SchemaKnownOk 0x0008 /* Schema is known to be valid */ +#define DBFLAG_VacuumInto 0x0008 /* Currently running VACUUM INTO */ +#define DBFLAG_SchemaKnownOk 0x0010 /* Schema is known to be valid */ /* ** Bits of the sqlite3.dbOptFlags field that are used by the @@ -16426,7 +16497,7 @@ struct sqlite3 { ** selectively disable various optimizations. */ #define SQLITE_QueryFlattener 0x0001 /* Query flattening */ - /* 0x0002 available for reuse */ +#define SQLITE_WindowFunc 0x0002 /* Use xInverse for window functions */ #define SQLITE_GroupByOrder 0x0004 /* GROUPBY cover of ORDERBY */ #define SQLITE_FactorOutConst 0x0008 /* Constant factoring */ #define SQLITE_DistinctOpt 0x0010 /* DISTINCT using indexes */ @@ -16544,7 +16615,6 @@ struct FuncDestructor { #define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */ #define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ -#define SQLITE_FUNC_WINDOW_SIZE 0x20000 /* Requires partition size as arg. */ #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ /* @@ -16812,9 +16882,6 @@ struct VTable { struct Table { char *zName; /* Name of the table or view */ Column *aCol; /* Information about each column */ -#ifdef SQLITE_ENABLE_NORMALIZE - Hash *pColHash; /* All columns indexed by name */ -#endif Index *pIndex; /* List of SQL indexes on this table. */ Select *pSelect; /* NULL for tables. Points to definition if a view. */ FKey *pFKey; /* Linked list of all foreign keys in this table */ @@ -17101,7 +17168,7 @@ struct Index { u16 nKeyCol; /* Number of columns forming the key */ u16 nColumn; /* Number of columns stored in the index */ u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ - unsigned idxType:2; /* 1==UNIQUE, 2==PRIMARY KEY, 0==CREATE INDEX */ + unsigned idxType:2; /* 0:Normal 1:UNIQUE, 2:PRIMARY KEY, 3:IPK */ unsigned bUnordered:1; /* Use this index for == or IN queries only */ unsigned uniqNotNull:1; /* True if UNIQUE and NOT NULL for all columns */ unsigned isResized:1; /* True if resizeIndexObject() has been called */ @@ -17126,6 +17193,7 @@ struct Index { #define SQLITE_IDXTYPE_APPDEF 0 /* Created using CREATE INDEX */ #define SQLITE_IDXTYPE_UNIQUE 1 /* Implements a UNIQUE constraint */ #define SQLITE_IDXTYPE_PRIMARYKEY 2 /* Is the PRIMARY KEY for the table */ +#define SQLITE_IDXTYPE_IPK 3 /* INTEGER PRIMARY KEY index */ /* Return true if index X is a PRIMARY KEY index */ #define IsPrimaryKeyIndex(X) ((X)->idxType==SQLITE_IDXTYPE_PRIMARYKEY) @@ -17343,17 +17411,25 @@ struct Expr { Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL ** for a column of an index on an expression */ Window *pWin; /* TK_FUNCTION: Window definition for the func */ + struct { /* TK_IN, TK_SELECT, and TK_EXISTS */ + int iAddr; /* Subroutine entry address */ + int regReturn; /* Register used to hold return address */ + } sub; } y; }; /* ** The following are the meanings of bits in the Expr.flags field. +** Value restrictions: +** +** EP_Agg == NC_HasAgg == SF_HasAgg +** EP_Win == NC_HasWin */ #define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ -#define EP_Agg 0x000002 /* Contains one or more aggregate functions */ +#define EP_Distinct 0x000002 /* Aggregate function with DISTINCT keyword */ #define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ #define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */ -#define EP_Distinct 0x000010 /* Aggregate function with DISTINCT keyword */ +#define EP_Agg 0x000010 /* Contains one or more aggregate functions */ #define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ #define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ #define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ @@ -17364,7 +17440,7 @@ struct Expr { #define EP_Skip 0x001000 /* COLLATE, AS, or UNLIKELY */ #define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ #define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ -#define EP_Static 0x008000 /* Held in memory not obtained from malloc() */ +#define EP_Win 0x008000 /* Contains window functions */ #define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ #define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */ #define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ @@ -17374,6 +17450,9 @@ struct Expr { #define EP_Alias 0x400000 /* Is an alias for a result set column */ #define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ #define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ +#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ +#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ +#define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ /* ** The EP_Propagate mask is a set of properties that automatically propagate @@ -17613,8 +17692,9 @@ struct NameContext { ** Allowed values for the NameContext, ncFlags field. ** ** Value constraints (all checked via assert()): -** NC_HasAgg == SF_HasAgg +** NC_HasAgg == SF_HasAgg == EP_Agg ** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX +** NC_HasWin == EP_Win ** */ #define NC_AllowAgg 0x0001 /* Aggregate functions are allowed here */ @@ -17630,6 +17710,7 @@ struct NameContext { #define NC_MinMaxAgg 0x1000 /* min/max aggregates seen. See note above */ #define NC_Complex 0x2000 /* True if a function or subquery seen */ #define NC_AllowWin 0x4000 /* Window functions are allowed here */ +#define NC_HasWin 0x8000 /* One or more window functions seen */ /* ** An instance of the following object describes a single ON CONFLICT @@ -17917,16 +17998,17 @@ struct Parse { u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ u8 okConstFactor; /* OK to factor out constants */ u8 disableLookaside; /* Number of times lookaside has been disabled */ + u8 disableVtab; /* Disable all virtual tables for this parse */ int nRangeReg; /* Size of the temporary register block */ int iRangeReg; /* First register in temporary register block */ int nErr; /* Number of errors seen */ int nTab; /* Number of previously allocated VDBE cursors */ int nMem; /* Number of memory cells used so far */ - int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */ int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */ int iSelfTab; /* Table associated with an index on expr, or negative ** of the base register during check-constraint eval */ - int nLabel; /* Number of labels used */ + int nLabel; /* The *negative* of the number of labels used */ + int nLabelAlloc; /* Number of slots in aLabel */ int *aLabel; /* Space to hold the labels */ ExprList *pConstExpr;/* Constant expressions */ Token constraintName;/* Name of the constraint currently being parsed */ @@ -17943,6 +18025,7 @@ struct Parse { AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ Parse *pToplevel; /* Parse structure for main program (or NULL) */ Table *pTriggerTab; /* Table triggers are being coded for */ + Parse *pParentParse; /* Parent parser if this parser is nested */ int addrCrTab; /* Address of OP_CreateBtree opcode on CREATE TABLE */ u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u32 oldmask; /* Mask of old.* columns referenced */ @@ -17986,7 +18069,9 @@ struct Parse { Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ const char *zTail; /* All SQL text past the last semicolon parsed */ Table *pNewTable; /* A table being constructed by CREATE TABLE */ - Index *pNewIndex; /* An index being constructed by CREATE INDEX */ + Index *pNewIndex; /* An index being constructed by CREATE INDEX. + ** Also used to hold redundant UNIQUE constraints + ** during a RENAME COLUMN */ Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -18214,6 +18299,7 @@ typedef struct { int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */ int rc; /* Result code stored here */ u32 mInitFlags; /* Flags controlling error messages */ + u32 nInitRow; /* Number of rows processed */ } InitData; /* @@ -18274,6 +18360,9 @@ struct Sqlite3Config { void (*xVdbeBranch)(void*,unsigned iSrcLine,u8 eThis,u8 eMx); /* Callback */ void *pVdbeBranchArg; /* 1st argument */ #endif +#ifdef SQLITE_ENABLE_DESERIALIZE + sqlite3_int64 mxMemdbSize; /* Default max memdb size */ +#endif #ifndef SQLITE_UNTESTABLE int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif @@ -18377,7 +18466,7 @@ struct TreeView { #endif /* SQLITE_DEBUG */ /* -** This object is used in varioius ways, all related to window functions +** This object is used in various ways, all related to window functions ** ** (1) A single instance of this structure is attached to the ** the Expr.pWin field for each window function in an expression tree. @@ -18392,15 +18481,18 @@ struct TreeView { ** object on a linked list attached to Select.pWinDefn. ** ** The uses (1) and (2) are really the same Window object that just happens -** to be accessible in two different ways. Use (3) is are separate objects. +** to be accessible in two different ways. Use case (3) are separate objects. */ struct Window { char *zName; /* Name of window (may be NULL) */ + char *zBase; /* Name of base window for chaining (may be NULL) */ ExprList *pPartition; /* PARTITION BY clause */ ExprList *pOrderBy; /* ORDER BY clause */ - u8 eType; /* TK_RANGE or TK_ROWS */ + u8 eFrmType; /* TK_RANGE, TK_GROUPS, TK_ROWS, or 0 */ u8 eStart; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */ u8 eEnd; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */ + u8 bImplicitFrame; /* True if frame was implicitly specified */ + u8 eExclude; /* TK_NO, TK_CURRENT, TK_TIES, TK_GROUP, or 0 */ Expr *pStart; /* Expression for " PRECEDING" */ Expr *pEnd; /* Expression for " FOLLOWING" */ Window *pNextWin; /* Next window function belonging to this SELECT */ @@ -18411,17 +18503,19 @@ struct Window { int regResult; int csrApp; /* Function cursor (used by min/max) */ int regApp; /* Function register (also used by min/max) */ - int regPart; /* First in a set of registers holding PARTITION BY - ** and ORDER BY values for the window */ + int regPart; /* Array of registers for PARTITION BY values */ Expr *pOwner; /* Expression object this window is attached to */ int nBufferCol; /* Number of columns in buffer table */ int iArgCol; /* Offset of first argument for this function */ + int regOne; /* Register containing constant value 1 */ + int regStartRowid; + int regEndRowid; }; #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3*, Window*); SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p); -SQLITE_PRIVATE Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*); +SQLITE_PRIVATE Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); SQLITE_PRIVATE void sqlite3WindowAttach(Parse*, Expr*, Window*); SQLITE_PRIVATE int sqlite3WindowCompare(Parse*, Window*, Window*); SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse*, Window*); @@ -18432,6 +18526,8 @@ SQLITE_PRIVATE void sqlite3WindowUpdate(Parse*, Window*, Window*, FuncDef*); SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p); SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p); SQLITE_PRIVATE void sqlite3WindowFunctions(void); +SQLITE_PRIVATE void sqlite3WindowChain(Parse*, Window*, Window*); +SQLITE_PRIVATE Window *sqlite3WindowAssemble(Parse*, Window*, ExprList*, ExprList*, Token*); #else # define sqlite3WindowDelete(a,b) # define sqlite3WindowFunctions() @@ -18661,7 +18757,9 @@ SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView*, const Window*, u8); SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*); SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...); +SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3*,int); SQLITE_PRIVATE void sqlite3Dequote(char*); +SQLITE_PRIVATE void sqlite3DequoteExpr(Expr*); SQLITE_PRIVATE void sqlite3TokenInit(Token*,char*); SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int); SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*, char **); @@ -18690,6 +18788,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*); SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList*); +SQLITE_PRIVATE int sqlite3IndexHasDuplicateRootPage(Index*); SQLITE_PRIVATE int sqlite3Init(sqlite3*, char**); SQLITE_PRIVATE int sqlite3InitCallback(void*, int, char**, char**); SQLITE_PRIVATE int sqlite3InitOne(sqlite3*, int, char**, u32); @@ -18723,6 +18822,11 @@ SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*); SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); +#ifdef SQLITE_HAS_CODEC +SQLITE_PRIVATE int sqlite3CodecQueryParameters(sqlite3*,const char*,const char*); +#else +# define sqlite3CodecQueryParameters(A,B,C) 0 +#endif SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3*,const char*); #ifdef SQLITE_UNTESTABLE @@ -18775,8 +18879,8 @@ SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upser SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse*, IdList*, Token*); SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*); -SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(sqlite3*, SrcList*, int, int); -SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(sqlite3*, SrcList*, Token*, Token*); +SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); +SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, Token*, Select*, Expr*, IdList*); SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); @@ -18843,8 +18947,8 @@ SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,struct SrcList_ite SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*); SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); -SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*); -SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*, int); +SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*,Expr*); +SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*, int, sqlite3_value*); SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, Token*); SQLITE_PRIVATE int sqlite3ExprCompare(Parse*,Expr*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*, Expr*, int); @@ -18882,9 +18986,6 @@ SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr*, int*); SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr*); SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); SQLITE_PRIVATE int sqlite3IsRowid(const char*); -#ifdef SQLITE_ENABLE_NORMALIZE -SQLITE_PRIVATE int sqlite3IsRowidN(const char*, int); -#endif SQLITE_PRIVATE void sqlite3GenerateRowDelete( Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8,int); SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int); @@ -18911,9 +19012,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3*,ExprList*,int); SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3*,SrcList*,int); SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3*,IdList*); SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,Select*,int); -#ifdef SQLITE_ENABLE_NORMALIZE -SQLITE_PRIVATE FuncDef *sqlite3FunctionSearchN(int,const char*,int); -#endif +SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch(int,const char*); SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(FuncDef*,int); SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void); @@ -19118,19 +19217,17 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void); SQLITE_PRIVATE void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); SQLITE_PRIVATE void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*); SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *, int *); -#ifdef SQLITE_ENABLE_NORMALIZE -SQLITE_PRIVATE int sqlite3GetTokenNormalized(const unsigned char *, int *, int *); -#endif SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...); SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*, int); -SQLITE_PRIVATE int sqlite3CodeSubselect(Parse*, Expr *, int, int); +SQLITE_PRIVATE void sqlite3CodeRhsOfIN(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3CodeSubselect(Parse*, Expr*); SQLITE_PRIVATE void sqlite3SelectPrep(Parse*, Select*, NameContext*); SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); SQLITE_PRIVATE int sqlite3MatchSpanName(const char*, const char*, const char*, const char*); SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*); SQLITE_PRIVATE int sqlite3ResolveExprListNames(NameContext*, ExprList*); SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); -SQLITE_PRIVATE void sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); +SQLITE_PRIVATE int sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int); SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *); @@ -19279,7 +19376,7 @@ SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); SQLITE_PRIVATE void sqlite3ParserReset(Parse*); #ifdef SQLITE_ENABLE_NORMALIZE -SQLITE_PRIVATE void sqlite3Normalize(Vdbe*, const char*, int, u8); +SQLITE_PRIVATE char *sqlite3Normalize(Vdbe*, const char*); #endif SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*); SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); @@ -19375,7 +19472,7 @@ SQLITE_PRIVATE void sqlite3EndBenignMalloc(void); #define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ #define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ #define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ -SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*); +SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*, int*); SQLITE_PRIVATE int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *); @@ -19691,6 +19788,13 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { #endif +/* The default maximum size of an in-memory database created using +** sqlite3_deserialize() +*/ +#ifndef SQLITE_MEMDB_DEFAULT_MAXSIZE +# define SQLITE_MEMDB_DEFAULT_MAXSIZE 1073741824 +#endif + /* ** The following singleton contains the global configuration for ** the SQLite library. @@ -19738,13 +19842,16 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xVdbeBranch */ 0, /* pVbeBranchArg */ #endif +#ifdef SQLITE_ENABLE_DESERIALIZE + SQLITE_MEMDB_DEFAULT_MAXSIZE, /* mxMemdbSize */ +#endif #ifndef SQLITE_UNTESTABLE 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ 0, /* bInternalFunctions */ 0x7ffffffe, /* iOnceResetThreshold */ - SQLITE_DEFAULT_SORTERREF_SIZE /* szSorterRef */ + SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ }; /* @@ -20074,11 +20181,11 @@ struct sqlite3_value { #define MEM_Real 0x0008 /* Value is a real number */ #define MEM_Blob 0x0010 /* Value is a BLOB */ #define MEM_AffMask 0x001f /* Mask of affinity bits */ -/* Available 0x0020 */ +#define MEM_FromBind 0x0020 /* Value originates from sqlite3_bind() */ /* Available 0x0040 */ #define MEM_Undefined 0x0080 /* Value is undefined */ #define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */ -#define MEM_TypeMask 0xc1ff /* Mask of type bits */ +#define MEM_TypeMask 0xc1df /* Mask of type bits */ /* Whenever Mem contains a valid string or blob representation, one of @@ -20110,6 +20217,12 @@ struct sqlite3_value { #define MemSetTypeFlag(p, f) \ ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f) +/* +** True if Mem X is a NULL-nochng type. +*/ +#define MemNullNochng(X) \ + ((X)->flags==(MEM_Null|MEM_Zero) && (X)->n==0 && (X)->u.nZero==0) + /* ** Return true if a memory cell is not marked as invalid. This macro ** is for use inside assert() statements only. @@ -20163,6 +20276,9 @@ struct sqlite3_context { */ typedef unsigned bft; /* Bit Field Type */ +/* The ScanStatus object holds a single value for the +** sqlite3_stmt_scanstatus() interface. +*/ typedef struct ScanStatus ScanStatus; struct ScanStatus { int addrExplain; /* OP_Explain for loop */ @@ -20173,6 +20289,19 @@ struct ScanStatus { char *zName; /* Name of table or index */ }; +/* The DblquoteStr object holds the text of a double-quoted +** string for a prepared statement. A linked list of these objects +** is constructed during statement parsing and is held on Vdbe.pDblStr. +** When computing a normalized SQL statement for an SQL statement, that +** list is consulted for each double-quoted identifier to see if the +** identifier should really be a string literal. +*/ +typedef struct DblquoteStr DblquoteStr; +struct DblquoteStr { + DblquoteStr *pNextStr; /* Next string literal in the list */ + char z[8]; /* Dequoted value for the string */ +}; + /* ** An instance of the virtual machine. This structure contains the complete ** state of the virtual machine. @@ -20192,28 +20321,29 @@ struct Vdbe { int pc; /* The program counter */ int rc; /* Value to return */ int nChange; /* Number of db changes made since last reset */ - int iStatement; /* Statement number (or 0 if has not opened stmt) */ + int iStatement; /* Statement number (or 0 if has no opened stmt) */ i64 iCurrentTime; /* Value of julianday('now') for this statement */ i64 nFkConstraint; /* Number of imm. FK constraints this VM */ i64 nStmtDefCons; /* Number of def. constraints when stmt started */ i64 nStmtDefImmCons; /* Number of def. imm constraints when stmt started */ + Mem *aMem; /* The memory locations */ + Mem **apArg; /* Arguments to currently executing user function */ + VdbeCursor **apCsr; /* One element of this array for each open cursor */ + Mem *aVar; /* Values for the OP_Variable opcode. */ /* When allocating a new Vdbe object, all of the fields below should be ** initialized to zero or NULL */ Op *aOp; /* Space to hold the virtual machine's program */ - Mem *aMem; /* The memory locations */ - Mem **apArg; /* Arguments to currently executing user function */ + int nOp; /* Number of instructions in the program */ + int nOpAlloc; /* Slots allocated for aOp[] */ Mem *aColName; /* Column names to return */ Mem *pResultSet; /* Pointer to an array of results */ char *zErrMsg; /* Error message written here */ - VdbeCursor **apCsr; /* One element of this array for each open cursor */ - Mem *aVar; /* Values for the OP_Variable opcode. */ VList *pVList; /* Name of variables */ #ifndef SQLITE_OMIT_TRACE i64 startTime; /* Time when query started - used for profiling */ #endif - int nOp; /* Number of instructions in the program */ #ifdef SQLITE_DEBUG int rcApp; /* errcode set by sqlite3_result_error_code() */ u32 nWrite; /* Number of write operations that have occurred */ @@ -20236,6 +20366,7 @@ struct Vdbe { char *zSql; /* Text of the SQL statement that generated this */ #ifdef SQLITE_ENABLE_NORMALIZE char *zNormSql; /* Normalization of the associated SQL statement */ + DblquoteStr *pDblStr; /* List of double-quoted string literals */ #endif void *pFree; /* Free this when deleting the vdbe */ VdbeFrame *pFrame; /* Parent frame */ @@ -27041,6 +27172,9 @@ SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){ db->u1.isInterrupted = 1; } db->lookaside.bDisable++; + if( db->pParse ){ + db->pParse->rc = SQLITE_NOMEM_BKPT; + } } } @@ -27234,7 +27368,8 @@ static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ static void setStrAccumError(StrAccum *p, u8 eError){ assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG ); p->accError = eError; - p->nAlloc = 0; + if( p->mxAlloc ) sqlite3_str_reset(p); + if( eError==SQLITE_TOOBIG ) sqlite3ErrorToParser(p->db, eError); } /* @@ -27253,6 +27388,28 @@ static char *getTextArg(PrintfArguments *p){ return (char*)sqlite3_value_text(p->apArg[p->nUsed++]); } +/* +** Allocate memory for a temporary buffer needed for printf rendering. +** +** If the requested size of the temp buffer is larger than the size +** of the output buffer in pAccum, then cause an SQLITE_TOOBIG error. +** Do the size check before the memory allocation to prevent rogue +** SQL from requesting large allocations using the precision or width +** field of the printf() function. +*/ +static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ + char *z; + if( pAccum->accError ) return 0; + if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){ + setStrAccumError(pAccum, SQLITE_TOOBIG); + return 0; + } + z = sqlite3DbMallocRaw(pAccum->db, n); + if( z==0 ){ + setStrAccumError(pAccum, SQLITE_NOMEM); + } + return z; +} /* ** On machines with a small stack size, you can redefine the @@ -27335,6 +27492,9 @@ SQLITE_API void sqlite3_str_vappendf( flag_leftjustify = flag_prefix = cThousand = flag_alternateform = flag_altform2 = flag_zeropad = 0; done = 0; + width = 0; + flag_long = 0; + precision = -1; do{ switch( c ){ case '-': flag_leftjustify = 1; break; @@ -27345,80 +27505,93 @@ SQLITE_API void sqlite3_str_vappendf( case '0': flag_zeropad = 1; break; case ',': cThousand = ','; break; default: done = 1; break; + case 'l': { + flag_long = 1; + c = *++fmt; + if( c=='l' ){ + c = *++fmt; + flag_long = 2; + } + done = 1; + break; + } + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': { + unsigned wx = c - '0'; + while( (c = *++fmt)>='0' && c<='9' ){ + wx = wx*10 + c - '0'; + } + testcase( wx>0x7fffffff ); + width = wx & 0x7fffffff; +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( c!='.' && c!='l' ){ + done = 1; + }else{ + fmt--; + } + break; + } + case '*': { + if( bArgList ){ + width = (int)getIntArg(pArgList); + }else{ + width = va_arg(ap,int); + } + if( width<0 ){ + flag_leftjustify = 1; + width = width >= -2147483647 ? -width : 0; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( (c = fmt[1])!='.' && c!='l' ){ + c = *++fmt; + done = 1; + } + break; + } + case '.': { + c = *++fmt; + if( c=='*' ){ + if( bArgList ){ + precision = (int)getIntArg(pArgList); + }else{ + precision = va_arg(ap,int); + } + if( precision<0 ){ + precision = precision >= -2147483647 ? -precision : -1; + } + c = *++fmt; + }else{ + unsigned px = 0; + while( c>='0' && c<='9' ){ + px = px*10 + c - '0'; + c = *++fmt; + } + testcase( px>0x7fffffff ); + precision = px & 0x7fffffff; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ + precision = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( c=='l' ){ + --fmt; + }else{ + done = 1; + } + break; + } } }while( !done && (c=(*++fmt))!=0 ); - /* Get the field width */ - if( c=='*' ){ - if( bArgList ){ - width = (int)getIntArg(pArgList); - }else{ - width = va_arg(ap,int); - } - if( width<0 ){ - flag_leftjustify = 1; - width = width >= -2147483647 ? -width : 0; - } - c = *++fmt; - }else{ - unsigned wx = 0; - while( c>='0' && c<='9' ){ - wx = wx*10 + c - '0'; - c = *++fmt; - } - testcase( wx>0x7fffffff ); - width = wx & 0x7fffffff; - } - assert( width>=0 ); -#ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ - width = SQLITE_PRINTF_PRECISION_LIMIT; - } -#endif - /* Get the precision */ - if( c=='.' ){ - c = *++fmt; - if( c=='*' ){ - if( bArgList ){ - precision = (int)getIntArg(pArgList); - }else{ - precision = va_arg(ap,int); - } - c = *++fmt; - if( precision<0 ){ - precision = precision >= -2147483647 ? -precision : -1; - } - }else{ - unsigned px = 0; - while( c>='0' && c<='9' ){ - px = px*10 + c - '0'; - c = *++fmt; - } - testcase( px>0x7fffffff ); - precision = px & 0x7fffffff; - } - }else{ - precision = -1; - } - assert( precision>=(-1) ); -#ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ - precision = SQLITE_PRINTF_PRECISION_LIMIT; - } -#endif - - - /* Get the conversion type modifier */ - if( c=='l' ){ - flag_long = 1; - c = *++fmt; - if( c=='l' ){ - flag_long = 2; - c = *++fmt; - } - }else{ - flag_long = 0; - } /* Fetch the info entry for the field */ infop = &fmtinfo[0]; xtype = etINVALID; @@ -27503,12 +27676,11 @@ SQLITE_API void sqlite3_str_vappendf( nOut = etBUFSIZE; zOut = buf; }else{ - u64 n = (u64)precision + 10 + precision/3; - zOut = zExtra = sqlite3Malloc( n ); - if( zOut==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; - } + u64 n; + n = (u64)precision + 10; + if( cThousand ) n += precision/3; + zOut = zExtra = printfTempBuf(pAccum, n); + if( zOut==0 ) return; nOut = (int)n; } bufpt = &zOut[nOut-1]; @@ -27627,12 +27799,12 @@ SQLITE_API void sqlite3_str_vappendf( }else{ e2 = exp; } - if( MAX(e2,0)+(i64)precision+(i64)width > etBUFSIZE - 15 ){ - bufpt = zExtra - = sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 ); - if( bufpt==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; + { + i64 szBufNeeded; /* Size of a temporary buffer needed */ + szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+15; + if( szBufNeeded > etBUFSIZE ){ + bufpt = zExtra = printfTempBuf(pAccum, szBufNeeded); + if( bufpt==0 ) return; } } zOut = bufpt; @@ -27856,11 +28028,8 @@ SQLITE_API void sqlite3_str_vappendf( needQuote = !isnull && xtype==etSQLESCAPE2; n += i + 3; if( n>etBUFSIZE ){ - bufpt = zExtra = sqlite3Malloc( n ); - if( bufpt==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; - } + bufpt = zExtra = printfTempBuf(pAccum, n); + if( bufpt==0 ) return; }else{ bufpt = buf; } @@ -27950,9 +28119,8 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ return 0; } if( p->mxAlloc==0 ){ - N = p->nAlloc - p->nChar - 1; setStrAccumError(p, SQLITE_TOOBIG); - return N; + return p->nAlloc - p->nChar - 1; }else{ char *zOld = isMalloced(p) ? p->zText : 0; i64 szNew = p->nChar; @@ -28024,7 +28192,7 @@ SQLITE_API void sqlite3_str_append(sqlite3_str *p, const char *z, int N){ assert( z!=0 || N==0 ); assert( p->zText!=0 || p->nChar==0 || p->accError ); assert( N>=0 ); - assert( p->accError==0 || p->nAlloc==0 ); + assert( p->accError==0 || p->nAlloc==0 || p->mxAlloc==0 ); if( p->nChar+N >= p->nAlloc ){ enlargeAndAppend(p,z,N); }else if( N ){ @@ -28486,7 +28654,8 @@ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc) sqlite3_str_appendf(&x, " %s", pItem->zName); } if( pItem->pTab ){ - sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName); + sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p", + pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab); } if( pItem->zAlias ){ sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); @@ -28656,24 +28825,62 @@ SQLITE_PRIVATE void sqlite3TreeViewBound( ** Generate a human-readable explanation for a Window object */ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){ + int nElement = 0; + if( pWin->pFilter ){ + sqlite3TreeViewItem(pView, "FILTER", 1); + sqlite3TreeViewExpr(pView, pWin->pFilter, 0); + sqlite3TreeViewPop(pView); + } pView = sqlite3TreeViewPush(pView, more); if( pWin->zName ){ - sqlite3TreeViewLine(pView, "OVER %s", pWin->zName); + sqlite3TreeViewLine(pView, "OVER %s (%p)", pWin->zName, pWin); }else{ - sqlite3TreeViewLine(pView, "OVER"); + sqlite3TreeViewLine(pView, "OVER (%p)", pWin); + } + if( pWin->zBase ) nElement++; + if( pWin->pOrderBy ) nElement++; + if( pWin->eFrmType ) nElement++; + if( pWin->eExclude ) nElement++; + if( pWin->zBase ){ + sqlite3TreeViewPush(pView, (--nElement)>0); + sqlite3TreeViewLine(pView, "window: %s", pWin->zBase); + sqlite3TreeViewPop(pView); } if( pWin->pPartition ){ - sqlite3TreeViewExprList(pView, pWin->pPartition, 1, "PARTITION-BY"); + sqlite3TreeViewExprList(pView, pWin->pPartition, nElement>0,"PARTITION-BY"); } if( pWin->pOrderBy ){ - sqlite3TreeViewExprList(pView, pWin->pOrderBy, 1, "ORDER-BY"); + sqlite3TreeViewExprList(pView, pWin->pOrderBy, (--nElement)>0, "ORDER-BY"); } - if( pWin->eType ){ - sqlite3TreeViewItem(pView, pWin->eType==TK_RANGE ? "RANGE" : "ROWS", 0); + if( pWin->eFrmType ){ + char zBuf[30]; + const char *zFrmType = "ROWS"; + if( pWin->eFrmType==TK_RANGE ) zFrmType = "RANGE"; + if( pWin->eFrmType==TK_GROUPS ) zFrmType = "GROUPS"; + sqlite3_snprintf(sizeof(zBuf),zBuf,"%s%s",zFrmType, + pWin->bImplicitFrame ? " (implied)" : ""); + sqlite3TreeViewItem(pView, zBuf, (--nElement)>0); sqlite3TreeViewBound(pView, pWin->eStart, pWin->pStart, 1); sqlite3TreeViewBound(pView, pWin->eEnd, pWin->pEnd, 0); sqlite3TreeViewPop(pView); } + if( pWin->eExclude ){ + char zBuf[30]; + const char *zExclude; + switch( pWin->eExclude ){ + case TK_NO: zExclude = "NO OTHERS"; break; + case TK_CURRENT: zExclude = "CURRENT ROW"; break; + case TK_GROUP: zExclude = "GROUP"; break; + case TK_TIES: zExclude = "TIES"; break; + default: + sqlite3_snprintf(sizeof(zBuf),zBuf,"invalid(%d)", pWin->eExclude); + zExclude = zBuf; + break; + } + sqlite3TreeViewPush(pView, 0); + sqlite3TreeViewLine(pView, "EXCLUDE %s", zExclude); + sqlite3TreeViewPop(pView); + } sqlite3TreeViewPop(pView); } #endif /* SQLITE_OMIT_WINDOWFUNC */ @@ -29653,11 +29860,11 @@ SQLITE_PRIVATE u32 sqlite3Utf8Read( ** encoding, or if *pMem does not contain a string value. */ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ - int len; /* Maximum length of output string in bytes */ - unsigned char *zOut; /* Output buffer */ - unsigned char *zIn; /* Input iterator */ - unsigned char *zTerm; /* End of input */ - unsigned char *z; /* Output iterator */ + sqlite3_int64 len; /* Maximum length of output string in bytes */ + unsigned char *zOut; /* Output buffer */ + unsigned char *zIn; /* Input iterator */ + unsigned char *zTerm; /* End of input */ + unsigned char *z; /* Output iterator */ unsigned int c; assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); @@ -29706,14 +29913,14 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired ** nul-terminator. */ pMem->n &= ~1; - len = pMem->n * 2 + 1; + len = 2 * (sqlite3_int64)pMem->n + 1; }else{ /* When converting from UTF-8 to UTF-16 the maximum growth is caused ** when a 1-byte UTF-8 character is translated into a 2-byte UTF-16 ** character. Two bytes are required in the output buffer for the ** nul-terminator. */ - len = pMem->n * 2 + 2; + len = 2 * (sqlite3_int64)pMem->n + 2; } /* Set zIn to point at the start of the input buffer and zTerm to point 1 @@ -30020,15 +30227,23 @@ SQLITE_PRIVATE void sqlite3Coverage(int x){ #endif /* -** Give a callback to the test harness that can be used to simulate faults -** in places where it is difficult or expensive to do so purely by means -** of inputs. +** Calls to sqlite3FaultSim() are used to simulate a failure during testing, +** or to bypass normal error detection during testing in order to let +** execute proceed futher downstream. ** -** The intent of the integer argument is to let the fault simulator know -** which of multiple sqlite3FaultSim() calls has been hit. +** In deployment, sqlite3FaultSim() *always* return SQLITE_OK (0). The +** sqlite3FaultSim() function only returns non-zero during testing. ** -** Return whatever integer value the test callback returns, or return -** SQLITE_OK if no test callback is installed. +** During testing, if the test harness has set a fault-sim callback using +** a call to sqlite3_test_control(SQLITE_TESTCTRL_FAULT_INSTALL), then +** each call to sqlite3FaultSim() is relayed to that application-supplied +** callback and the integer return value form the application-supplied +** callback is returned by sqlite3FaultSim(). +** +** The integer argument to sqlite3FaultSim() is a code to identify which +** sqlite3FaultSim() instance is being invoked. Each call to sqlite3FaultSim() +** should have a unique code. To prevent legacy testing applications from +** breaking, the codes should not be changed or reused. */ #ifndef SQLITE_UNTESTABLE SQLITE_PRIVATE int sqlite3FaultSim(int iTest){ @@ -30213,6 +30428,19 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ } } +/* +** If database connection db is currently parsing SQL, then transfer +** error code errCode to that parser if the parser has not already +** encountered some other kind of error. +*/ +SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3 *db, int errCode){ + Parse *pParse; + if( db==0 || (pParse = db->pParse)==0 ) return errCode; + pParse->rc = errCode; + pParse->nErr++; + return errCode; +} + /* ** Convert an SQL-style quoted string into a normal string by removing ** the quote characters. The conversion is done in-place. If the @@ -30226,7 +30454,7 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ ** dequoted string, exclusive of the zero terminator, if dequoting does ** occur. ** -** 2002-Feb-14: This routine is extended to remove MS-Access style +** 2002-02-14: This routine is extended to remove MS-Access style ** brackets from around identifiers. For example: "[a-b-c]" becomes ** "a-b-c". */ @@ -30252,6 +30480,11 @@ SQLITE_PRIVATE void sqlite3Dequote(char *z){ } z[j] = 0; } +SQLITE_PRIVATE void sqlite3DequoteExpr(Expr *p){ + assert( sqlite3Isquote(p->u.zToken[0]) ); + p->flags |= p->u.zToken[0]=='"' ? EP_Quoted|EP_DblQuoted : EP_Quoted; + sqlite3Dequote(p->u.zToken); +} /* ** Generate a Token object from a string @@ -31559,7 +31792,7 @@ SQLITE_PRIVATE VList *sqlite3VListAdd( assert( pIn==0 || pIn[0]>=3 ); /* Verify ok to add new elements */ if( pIn==0 || pIn[1]+nInt > pIn[0] ){ /* Enlarge the allocation */ - int nAlloc = (pIn ? pIn[0]*2 : 10) + nInt; + sqlite3_int64 nAlloc = (pIn ? 2*(sqlite3_int64)pIn[0] : 10) + nInt; VList *pOut = sqlite3DbRealloc(db, pIn, nAlloc*sizeof(int)); if( pOut==0 ) return pIn; if( pIn==0 ) pOut[1] = 2; @@ -31679,20 +31912,6 @@ static unsigned int strHash(const char *z){ } return h; } -#ifdef SQLITE_ENABLE_NORMALIZE -static unsigned int strHashN(const char *z, int n){ - unsigned int h = 0; - int i; - for(i=0; iht ){ /*OPTIMIZATION-IF-TRUE*/ - struct _ht *pEntry; - h = strHashN(pKey, nKey) % pH->htsize; - pEntry = &pH->ht[h]; - elem = pEntry->chain; - count = pEntry->count; - }else{ - h = 0; - elem = pH->first; - count = pH->count; - } - if( pHash ) *pHash = h; - while( count-- ){ - assert( elem!=0 ); - if( sqlite3StrNICmp(elem->pKey,pKey,nKey)==0 ){ - return elem; - } - elem = elem->next; - } - return &nullElement; -} -#endif /* SQLITE_ENABLE_NORMALIZE */ /* Remove a single entry from the hash table given a pointer to that ** element and a hash on the element's key. @@ -31861,8 +32046,8 @@ static void removeElementGivenHash( if( pEntry->chain==elem ){ pEntry->chain = elem->next; } + assert( pEntry->count>0 ); pEntry->count--; - assert( pEntry->count>=0 ); } sqlite3_free( elem ); pH->count--; @@ -31882,14 +32067,6 @@ SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const char *pKey){ assert( pKey!=0 ); return findElementWithHash(pH, pKey, 0)->data; } -#ifdef SQLITE_ENABLE_NORMALIZE -SQLITE_PRIVATE void *sqlite3HashFindN(const Hash *pH, const char *pKey, int nKey){ - assert( pH!=0 ); - assert( pKey!=0 ); - assert( nKey>=0 ); - return findElementWithHashN(pH, pKey, nKey, 0)->data; -} -#endif /* SQLITE_ENABLE_NORMALIZE */ /* Insert an element into the hash table pH. The key is pKey ** and the data is "data". @@ -32045,25 +32222,25 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 89 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), /* 90 */ "Column" OpHelp("r[P3]=PX"), /* 91 */ "Affinity" OpHelp("affinity(r[P1@P2])"), - /* 92 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), - /* 93 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), - /* 94 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), - /* 96 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), - /* 97 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), - /* 98 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), - /* 99 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), - /* 100 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), - /* 101 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), - /* 102 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), - /* 103 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), - /* 104 */ "Count" OpHelp("r[P2]=count()"), - /* 105 */ "ReadCookie" OpHelp(""), - /* 106 */ "String8" OpHelp("r[P2]='P4'"), - /* 107 */ "SetCookie" OpHelp(""), - /* 108 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), - /* 109 */ "OpenRead" OpHelp("root=P2 iDb=P3"), - /* 110 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), + /* 92 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 93 */ "Count" OpHelp("r[P2]=count()"), + /* 94 */ "ReadCookie" OpHelp(""), + /* 95 */ "SetCookie" OpHelp(""), + /* 96 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), + /* 97 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), + /* 98 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), + /* 100 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), + /* 101 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), + /* 102 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), + /* 103 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), + /* 104 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), + /* 105 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), + /* 106 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), + /* 107 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), + /* 108 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 109 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), + /* 110 */ "String8" OpHelp("r[P2]='P4'"), /* 111 */ "OpenDup" OpHelp(""), /* 112 */ "OpenAutoindex" OpHelp("nColumn=P2"), /* 113 */ "OpenEphemeral" OpHelp("nColumn=P2"), @@ -32076,57 +32253,56 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 120 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), /* 121 */ "NewRowid" OpHelp("r[P2]=rowid"), /* 122 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), - /* 123 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), - /* 124 */ "Delete" OpHelp(""), - /* 125 */ "ResetCount" OpHelp(""), - /* 126 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), - /* 127 */ "SorterData" OpHelp("r[P2]=data"), - /* 128 */ "RowData" OpHelp("r[P2]=data"), - /* 129 */ "Rowid" OpHelp("r[P2]=rowid"), - /* 130 */ "NullRow" OpHelp(""), - /* 131 */ "SeekEnd" OpHelp(""), - /* 132 */ "SorterInsert" OpHelp("key=r[P2]"), - /* 133 */ "IdxInsert" OpHelp("key=r[P2]"), - /* 134 */ "IdxDelete" OpHelp("key=r[P2@P3]"), - /* 135 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"), - /* 136 */ "IdxRowid" OpHelp("r[P2]=rowid"), - /* 137 */ "Destroy" OpHelp(""), - /* 138 */ "Clear" OpHelp(""), - /* 139 */ "ResetSorter" OpHelp(""), - /* 140 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"), - /* 141 */ "Real" OpHelp("r[P2]=P4"), - /* 142 */ "SqlExec" OpHelp(""), - /* 143 */ "ParseSchema" OpHelp(""), - /* 144 */ "LoadAnalysis" OpHelp(""), - /* 145 */ "DropTable" OpHelp(""), - /* 146 */ "DropIndex" OpHelp(""), - /* 147 */ "DropTrigger" OpHelp(""), - /* 148 */ "IntegrityCk" OpHelp(""), - /* 149 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), - /* 150 */ "Param" OpHelp(""), - /* 151 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), - /* 152 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), - /* 153 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), - /* 154 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), - /* 155 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 156 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 157 */ "AggValue" OpHelp("r[P3]=value N=P2"), - /* 158 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), - /* 159 */ "Expire" OpHelp(""), - /* 160 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), - /* 161 */ "VBegin" OpHelp(""), - /* 162 */ "VCreate" OpHelp(""), - /* 163 */ "VDestroy" OpHelp(""), - /* 164 */ "VOpen" OpHelp(""), - /* 165 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), - /* 166 */ "VRename" OpHelp(""), - /* 167 */ "Pagecount" OpHelp(""), - /* 168 */ "MaxPgcnt" OpHelp(""), - /* 169 */ "Trace" OpHelp(""), - /* 170 */ "CursorHint" OpHelp(""), - /* 171 */ "Noop" OpHelp(""), - /* 172 */ "Explain" OpHelp(""), - /* 173 */ "Abortable" OpHelp(""), + /* 123 */ "Delete" OpHelp(""), + /* 124 */ "ResetCount" OpHelp(""), + /* 125 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), + /* 126 */ "SorterData" OpHelp("r[P2]=data"), + /* 127 */ "RowData" OpHelp("r[P2]=data"), + /* 128 */ "Rowid" OpHelp("r[P2]=rowid"), + /* 129 */ "NullRow" OpHelp(""), + /* 130 */ "SeekEnd" OpHelp(""), + /* 131 */ "SorterInsert" OpHelp("key=r[P2]"), + /* 132 */ "IdxInsert" OpHelp("key=r[P2]"), + /* 133 */ "IdxDelete" OpHelp("key=r[P2@P3]"), + /* 134 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"), + /* 135 */ "IdxRowid" OpHelp("r[P2]=rowid"), + /* 136 */ "Destroy" OpHelp(""), + /* 137 */ "Clear" OpHelp(""), + /* 138 */ "ResetSorter" OpHelp(""), + /* 139 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"), + /* 140 */ "SqlExec" OpHelp(""), + /* 141 */ "ParseSchema" OpHelp(""), + /* 142 */ "LoadAnalysis" OpHelp(""), + /* 143 */ "DropTable" OpHelp(""), + /* 144 */ "DropIndex" OpHelp(""), + /* 145 */ "Real" OpHelp("r[P2]=P4"), + /* 146 */ "DropTrigger" OpHelp(""), + /* 147 */ "IntegrityCk" OpHelp(""), + /* 148 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 149 */ "Param" OpHelp(""), + /* 150 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 151 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 152 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), + /* 153 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), + /* 154 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 155 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 156 */ "AggValue" OpHelp("r[P3]=value N=P2"), + /* 157 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 158 */ "Expire" OpHelp(""), + /* 159 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 160 */ "VBegin" OpHelp(""), + /* 161 */ "VCreate" OpHelp(""), + /* 162 */ "VDestroy" OpHelp(""), + /* 163 */ "VOpen" OpHelp(""), + /* 164 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 165 */ "VRename" OpHelp(""), + /* 166 */ "Pagecount" OpHelp(""), + /* 167 */ "MaxPgcnt" OpHelp(""), + /* 168 */ "Trace" OpHelp(""), + /* 169 */ "CursorHint" OpHelp(""), + /* 170 */ "Noop" OpHelp(""), + /* 171 */ "Explain" OpHelp(""), + /* 172 */ "Abortable" OpHelp(""), }; return azName[i]; } @@ -46577,7 +46753,8 @@ typedef struct MemFile MemFile; struct MemFile { sqlite3_file base; /* IO methods */ sqlite3_int64 sz; /* Size of the file */ - sqlite3_int64 szMax; /* Space allocated to aData */ + sqlite3_int64 szAlloc; /* Space allocated to aData */ + sqlite3_int64 szMax; /* Maximum allowed size of the file */ unsigned char *aData; /* content of the file */ int nMmap; /* Number of memory mapped pages */ unsigned mFlags; /* Flags */ @@ -46703,10 +46880,15 @@ static int memdbEnlarge(MemFile *p, sqlite3_int64 newSz){ if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){ return SQLITE_FULL; } + if( newSz>p->szMax ){ + return SQLITE_FULL; + } + newSz *= 2; + if( newSz>p->szMax ) newSz = p->szMax; pNew = sqlite3_realloc64(p->aData, newSz); if( pNew==0 ) return SQLITE_NOMEM; p->aData = pNew; - p->szMax = newSz; + p->szAlloc = newSz; return SQLITE_OK; } @@ -46720,10 +46902,11 @@ static int memdbWrite( sqlite_int64 iOfst ){ MemFile *p = (MemFile *)pFile; + if( NEVER(p->mFlags & SQLITE_DESERIALIZE_READONLY) ) return SQLITE_READONLY; if( iOfst+iAmt>p->sz ){ int rc; - if( iOfst+iAmt>p->szMax - && (rc = memdbEnlarge(p, (iOfst+iAmt)*2))!=SQLITE_OK + if( iOfst+iAmt>p->szAlloc + && (rc = memdbEnlarge(p, iOfst+iAmt))!=SQLITE_OK ){ return rc; } @@ -46769,6 +46952,11 @@ static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ */ static int memdbLock(sqlite3_file *pFile, int eLock){ MemFile *p = (MemFile *)pFile; + if( eLock>SQLITE_LOCK_SHARED + && (p->mFlags & SQLITE_DESERIALIZE_READONLY)!=0 + ){ + return SQLITE_READONLY; + } p->eLock = eLock; return SQLITE_OK; } @@ -46793,6 +46981,19 @@ static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){ *(char**)pArg = sqlite3_mprintf("memdb(%p,%lld)", p->aData, p->sz); rc = SQLITE_OK; } + if( op==SQLITE_FCNTL_SIZE_LIMIT ){ + sqlite3_int64 iLimit = *(sqlite3_int64*)pArg; + if( iLimitsz ){ + if( iLimit<0 ){ + iLimit = p->szMax; + }else{ + iLimit = p->sz; + } + } + p->szMax = iLimit; + *(sqlite3_int64*)pArg = iLimit; + rc = SQLITE_OK; + } return rc; } @@ -46823,8 +47024,12 @@ static int memdbFetch( void **pp ){ MemFile *p = (MemFile *)pFile; - p->nMmap++; - *pp = (void*)(p->aData + iOfst); + if( iOfst+iAmt>p->sz ){ + *pp = 0; + }else{ + p->nMmap++; + *pp = (void*)(p->aData + iOfst); + } return SQLITE_OK; } @@ -46854,6 +47059,7 @@ static int memdbOpen( assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */ *pOutFlags = flags | SQLITE_OPEN_MEMORY; p->base.pMethods = &memdb_io_methods; + p->szMax = sqlite3GlobalConfig.mxMemdbSize; return SQLITE_OK; } @@ -47103,7 +47309,11 @@ SQLITE_API int sqlite3_deserialize( }else{ p->aData = pData; p->sz = szDb; + p->szAlloc = szBuf; p->szMax = szBuf; + if( p->szMaxszMax = sqlite3GlobalConfig.mxMemdbSize; + } p->mFlags = mFlags; rc = SQLITE_OK; } @@ -48524,16 +48734,27 @@ typedef struct PGroup PGroup; ** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of ** PgHdr1.pCache->szPage bytes is allocated directly before this structure ** in memory. +** +** Note: Variables isBulkLocal and isAnchor were once type "u8". That works, +** but causes a 2-byte gap in the structure for most architectures (since +** pointers must be either 4 or 8-byte aligned). As this structure is located +** in memory directly after the associated page data, if the database is +** corrupt, code at the b-tree layer may overread the page buffer and +** read part of this structure before the corruption is detected. This +** can cause a valgrind error if the unitialized gap is accessed. Using u16 +** ensures there is no such gap, and therefore no bytes of unitialized memory +** in the structure. */ struct PgHdr1 { sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */ unsigned int iKey; /* Key value (page number) */ - u8 isBulkLocal; /* This page from bulk local storage */ - u8 isAnchor; /* This is the PGroup.lru element */ + u16 isBulkLocal; /* This page from bulk local storage */ + u16 isAnchor; /* This is the PGroup.lru element */ PgHdr1 *pNext; /* Next in hash table chain */ PCache1 *pCache; /* Cache that currently owns this page */ PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */ + /* NB: pLruPrev is only valid if pLruNext!=0 */ }; /* @@ -48599,6 +48820,7 @@ struct PCache1 { unsigned int nMax; /* Configured "cache_size" value */ unsigned int n90pct; /* nMax*9/10 */ unsigned int iMaxKey; /* Largest key seen since xTruncate() */ + unsigned int nPurgeableDummy; /* pnPurgeable points here when not used*/ /* Hash table of all pages. The following variables may only be accessed ** when the accessor is holding the PGroup mutex. @@ -48733,6 +48955,7 @@ static int pcache1InitBulk(PCache1 *pCache){ pX->isBulkLocal = 1; pX->isAnchor = 0; pX->pNext = pCache->pFree; + pX->pLruPrev = 0; /* Initializing this saves a valgrind error */ pCache->pFree = pX; zBulk += pCache->szAlloc; }while( --nBulk ); @@ -48908,6 +49131,7 @@ static void pcache1FreePage(PgHdr1 *p){ ** exists, this function falls back to sqlite3Malloc(). */ SQLITE_PRIVATE void *sqlite3PageMalloc(int sz){ + assert( sz<=65536+8 ); /* These allocations are never very large */ return pcache1Alloc(sz); } @@ -49002,7 +49226,8 @@ static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ pPage->pLruPrev->pLruNext = pPage->pLruNext; pPage->pLruNext->pLruPrev = pPage->pLruPrev; pPage->pLruNext = 0; - pPage->pLruPrev = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev as it is never accessed if pLruNext is 0 */ assert( pPage->isAnchor==0 ); assert( pPage->pCache->pGroup->lru.isAnchor==1 ); pPage->pCache->nRecyclable--; @@ -49212,8 +49437,7 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; pCache->pnPurgeable = &pGroup->nPurgeable; }else{ - static unsigned int dummyCurrentPage; - pCache->pnPurgeable = &dummyCurrentPage; + pCache->pnPurgeable = &pCache->nPurgeableDummy; } pcache1LeaveMutex(pGroup); if( pCache->nHash==0 ){ @@ -49340,8 +49564,9 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( pPage->iKey = iKey; pPage->pNext = pCache->apHash[h]; pPage->pCache = pCache; - pPage->pLruPrev = 0; pPage->pLruNext = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev since it is not accessed when pLruNext==0 */ *(void **)pPage->page.pExtra = 0; pCache->apHash[h] = pPage; if( iKey>pCache->iMaxKey ){ @@ -49501,7 +49726,7 @@ static void pcache1Unpin( /* It is an error to call this function if the page is already ** part of the PGroup LRU list. */ - assert( pPage->pLruPrev==0 && pPage->pLruNext==0 ); + assert( pPage->pLruNext==0 ); assert( PAGE_IS_PINNED(pPage) ); if( reuseUnlikely || pGroup->nPurgeable>pGroup->nMaxPage ){ @@ -51190,6 +51415,9 @@ static const unsigned char aJournalMagic[] = { SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ if( pPager->fd->pMethods==0 ) return 0; if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; +#ifdef SQLITE_HAS_CODEC + if( pPager->xCodec!=0 ) return 0; +#endif #ifndef SQLITE_OMIT_WAL if( pPager->pWal ){ u32 iRead = 0; @@ -54139,8 +54367,14 @@ SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nR rc = sqlite3OsFileSize(pPager->fd, &nByte); } if( rc==SQLITE_OK ){ - pNew = (char *)sqlite3PageMalloc(pageSize); - if( !pNew ) rc = SQLITE_NOMEM_BKPT; + /* 8 bytes of zeroed overrun space is sufficient so that the b-tree + * cell header parser will never run off the end of the allocation */ + pNew = (char *)sqlite3PageMalloc(pageSize+8); + if( !pNew ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + memset(pNew+pageSize, 0, 8); + } } if( rc==SQLITE_OK ){ @@ -54192,7 +54426,10 @@ SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){ pPager->mxPgno = mxPage; } assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */ - assert( pPager->mxPgno>=pPager->dbSize ); /* OP_MaxPgcnt enforces this */ + /* assert( pPager->mxPgno>=pPager->dbSize ); */ + /* OP_MaxPgcnt ensures that the parameter passed to this function is not + ** less than the total number of valid pages in the database. But this + ** may be less than Pager.dbSize, and so the assert() above is not valid */ return pPager->mxPgno; } @@ -57518,8 +57755,12 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i */ pPg->flags &= ~PGHDR_NEED_SYNC; pPgOld = sqlite3PagerLookup(pPager, pgno); - assert( !pPgOld || pPgOld->nRef==1 ); + assert( !pPgOld || pPgOld->nRef==1 || CORRUPT_DB ); if( pPgOld ){ + if( pPgOld->nRef>1 ){ + sqlite3PagerUnrefNotNull(pPgOld); + return SQLITE_CORRUPT_BKPT; + } pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); if( pPager->tempFile ){ /* Do not discard pages from an in-memory database since we might @@ -58047,7 +58288,7 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pS */ SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager){ assert( pPager->pWal ); - return sqlite3WalSnapshotUnlock(pPager->pWal); + sqlite3WalSnapshotUnlock(pPager->pWal); } #endif /* SQLITE_ENABLE_SNAPSHOT */ @@ -58648,7 +58889,7 @@ static SQLITE_NOINLINE int walIndexPageRealloc( /* Enlarge the pWal->apWiData[] array if required */ if( pWal->nWiData<=iPage ){ - int nByte = sizeof(u32*)*(iPage+1); + sqlite3_int64 nByte = sizeof(u32*)*(iPage+1); volatile u32 **apNew; apNew = (volatile u32 **)sqlite3_realloc64((void *)pWal->apWiData, nByte); if( !apNew ){ @@ -58752,6 +58993,7 @@ static void walChecksumBytes( assert( nByte>=8 ); assert( (nByte&0x00000007)==0 ); + assert( nByte<=65536 ); if( nativeCksum ){ do { @@ -59059,6 +59301,7 @@ static void walCleanupHash(Wal *pWal){ int iLimit = 0; /* Zero values greater than this */ int nByte; /* Number of bytes to zero in aPgno[] */ int i; /* Used to iterate through aHash[] */ + int rc; /* Return code form walHashGet() */ assert( pWal->writeLock ); testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE-1 ); @@ -59069,11 +59312,12 @@ static void walCleanupHash(Wal *pWal){ /* Obtain pointers to the hash-table and page-number array containing ** the entry that corresponds to frame pWal->hdr.mxFrame. It is guaranteed - ** that the page said hash-table and array reside on is already mapped. + ** that the page said hash-table and array reside on is already mapped.(1) */ assert( pWal->nWiData>walFramePage(pWal->hdr.mxFrame) ); assert( pWal->apWiData[walFramePage(pWal->hdr.mxFrame)] ); - walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &sLoc); + rc = walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &sLoc); + if( NEVER(rc) ) return; /* Defense-in-depth, in case (1) above is wrong */ /* Zero all hash-table entries that correspond to frame numbers greater ** than pWal->hdr.mxFrame. @@ -59687,7 +59931,7 @@ static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ WalIterator *p; /* Return value */ int nSegment; /* Number of segments to merge */ u32 iLast; /* Last frame in log */ - int nByte; /* Number of bytes to allocate */ + sqlite3_int64 nByte; /* Number of bytes to allocate */ int i; /* Iterator variable */ ht_slot *aTmp; /* Temp space used by merge-sort */ int rc = SQLITE_OK; /* Return Code */ @@ -62223,7 +62467,7 @@ struct MemPage { u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ u16 cellOffset; /* Index in aData of first cell pointer */ - u16 nFree; /* Number of free bytes on the page */ + int nFree; /* Number of free bytes on the page. -1 for unknown */ u16 nCell; /* Number of cells on this page, local and ovfl */ u16 maskPage; /* Mask for page offset */ u16 aiOvfl[4]; /* Insert the i-th overflow cell before the aiOvfl-th @@ -62431,9 +62675,16 @@ struct CellInfo { ** found at self->pBt->mutex. ** ** skipNext meaning: -** eState==SKIPNEXT && skipNext>0: Next sqlite3BtreeNext() is no-op. -** eState==SKIPNEXT && skipNext<0: Next sqlite3BtreePrevious() is no-op. -** eState==FAULT: Cursor fault with skipNext as error code. +** The meaning of skipNext depends on the value of eState: +** +** eState Meaning of skipNext +** VALID skipNext is meaningless and is ignored +** INVALID skipNext is meaningless and is ignored +** SKIPNEXT sqlite3BtreeNext() is a no-op if skipNext>0 and +** sqlite3BtreePrevious() is no-op if skipNext<0. +** REQUIRESEEK restoreCursorPosition() restores the cursor to +** eState=SKIPNEXT if skipNext!=0 +** FAULT skipNext holds the cursor fault error code. */ struct BtCursor { u8 eState; /* One of the CURSOR_XXX constants (see below) */ @@ -63597,13 +63848,19 @@ static int saveCursorKey(BtCursor *pCur){ /* Only the rowid is required for a table btree */ pCur->nKey = sqlite3BtreeIntegerKey(pCur); }else{ - /* For an index btree, save the complete key content */ + /* For an index btree, save the complete key content. It is possible + ** that the current key is corrupt. In that case, it is possible that + ** the sqlite3VdbeRecordUnpack() function may overread the buffer by + ** up to the size of 1 varint plus 1 8-byte value when the cursor + ** position is restored. Hence the 17 bytes of padding allocated + ** below. */ void *pKey; pCur->nKey = sqlite3BtreePayloadSize(pCur); - pKey = sqlite3Malloc( pCur->nKey ); + pKey = sqlite3Malloc( pCur->nKey + 9 + 8 ); if( pKey ){ rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey); if( rc==SQLITE_OK ){ + memset(((u8*)pKey)+pCur->nKey, 0, 9+8); pCur->pKey = pKey; }else{ sqlite3_free(pKey); @@ -63735,11 +63992,12 @@ static int btreeMoveto( UnpackedRecord *pIdxKey; /* Unpacked index key */ if( pKey ){ + KeyInfo *pKeyInfo = pCur->pKeyInfo; assert( nKey==(i64)(int)nKey ); - pIdxKey = sqlite3VdbeAllocUnpackedRecord(pCur->pKeyInfo); + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; - sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, pIdxKey); - if( pIdxKey->nField==0 ){ + sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey); + if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){ rc = SQLITE_CORRUPT_BKPT; goto moveto_done; } @@ -63763,19 +64021,23 @@ moveto_done: */ static int btreeRestoreCursorPosition(BtCursor *pCur){ int rc; - int skipNext; + int skipNext = 0; assert( cursorOwnsBtShared(pCur) ); assert( pCur->eState>=CURSOR_REQUIRESEEK ); if( pCur->eState==CURSOR_FAULT ){ return pCur->skipNext; } pCur->eState = CURSOR_INVALID; - rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &skipNext); + if( sqlite3FaultSim(410) ){ + rc = SQLITE_IOERR; + }else{ + rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &skipNext); + } if( rc==SQLITE_OK ){ sqlite3_free(pCur->pKey); pCur->pKey = 0; assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); - pCur->skipNext |= skipNext; + if( skipNext ) pCur->skipNext = skipNext; if( pCur->skipNext && pCur->eState==CURSOR_VALID ){ pCur->eState = CURSOR_SKIPNEXT; } @@ -63845,7 +64107,6 @@ SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow) if( pCur->eState!=CURSOR_VALID ){ *pDifferentRow = 1; }else{ - assert( pCur->skipNext==0 ); *pDifferentRow = 0; } return SQLITE_OK; @@ -63929,6 +64190,13 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ *pRC = rc; return; } + if( ((char*)sqlite3PagerGetExtra(pDbPage))[0]!=0 ){ + /* The first byte of the extra data is the MemPage.isInit byte. + ** If that byte is set, it means this page is also being used + ** as a btree page. */ + *pRC = SQLITE_CORRUPT_BKPT; + goto ptrmap_exit; + } offset = PTRMAP_PTROFFSET(iPtrmap, key); if( offset<0 ){ *pRC = SQLITE_CORRUPT_BKPT; @@ -63991,7 +64259,7 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ #else /* if defined SQLITE_OMIT_AUTOVACUUM */ #define ptrmapPut(w,x,y,z,rc) #define ptrmapGet(w,x,y,z) SQLITE_OK - #define ptrmapPutOvflPtr(x, y, rc) + #define ptrmapPutOvflPtr(x, y, z, rc) #endif /* @@ -64284,17 +64552,24 @@ static u16 cellSize(MemPage *pPage, int iCell){ #ifndef SQLITE_OMIT_AUTOVACUUM /* -** If the cell pCell, part of page pPage contains a pointer -** to an overflow page, insert an entry into the pointer-map -** for the overflow page. +** The cell pCell is currently part of page pSrc but will ultimately be part +** of pPage. (pSrc and pPager are often the same.) If pCell contains a +** pointer to an overflow page, insert an entry into the pointer-map for +** the overflow page that will be valid after pCell has been moved to pPage. */ -static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){ +static void ptrmapPutOvflPtr(MemPage *pPage, MemPage *pSrc, u8 *pCell,int *pRC){ CellInfo info; if( *pRC ) return; assert( pCell!=0 ); pPage->xParseCell(pPage, pCell, &info); if( info.nLocalaDataEnd, pCell, pCell+info.nLocal) ){ + testcase( pSrc!=pPage ); + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + ovfl = get4byte(&pCell[info.nSize-4]); ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); } } @@ -64338,7 +64613,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ hdr = pPage->hdrOffset; cellOffset = pPage->cellOffset; nCell = pPage->nCell; - assert( nCell==get2byte(&data[hdr+3]) ); + assert( nCell==get2byte(&data[hdr+3]) || CORRUPT_DB ); iCellFirst = cellOffset + 2*nCell; usableSize = pPage->pBt->usableSize; @@ -64349,19 +64624,10 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ ** reconstruct the entire page. */ if( (int)data[hdr+7]<=nMaxFrag ){ int iFree = get2byte(&data[hdr+1]); + if( iFree>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); if( iFree ){ int iFree2 = get2byte(&data[iFree]); - - /* pageFindSlot() has already verified that free blocks are sorted - ** in order of offset within the page, and that no block extends - ** past the end of the page. Provided the two free slots do not - ** overlap, this guarantees that the memmove() calls below will not - ** overwrite the usableSize byte buffer, even if the database page - ** is corrupt. */ - assert( iFree2==0 || iFree2>iFree ); - assert( iFree+get2byte(&data[iFree+2]) <= usableSize ); - assert( iFree2==0 || iFree2+get2byte(&data[iFree2+2]) <= usableSize ); - + if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); if( 0==iFree2 || (data[iFree2]==0 && data[iFree2+1]==0) ){ u8 *pEnd = &data[cellOffset + nCell*2]; u8 *pAddr; @@ -64372,12 +64638,15 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ return SQLITE_CORRUPT_PAGE(pPage); } if( iFree2 ){ - assert( iFree+sz<=iFree2 ); /* Verified by pageFindSlot() */ + if( iFree+sz>iFree2 ) return SQLITE_CORRUPT_PAGE(pPage); sz2 = get2byte(&data[iFree2+2]); - assert( iFree+sz+sz2+iFree2-(iFree+sz) <= usableSize ); + if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); sz += sz2; + }else if( iFree+sz>usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); } + cbrk = top+sz; assert( cbrk+(iFree-top) <= usableSize ); memmove(&data[cbrk], &data[top], iFree-top); @@ -64428,6 +64697,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ data[hdr+7] = 0; defragment_out: + assert( pPage->nFree>=0 ); if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){ return SQLITE_CORRUPT_PAGE(pPage); } @@ -64455,16 +64725,16 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ ** causes the fragmentation count to exceed 60. */ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ - const int hdr = pPg->hdrOffset; - u8 * const aData = pPg->aData; - int iAddr = hdr + 1; - int pc = get2byte(&aData[iAddr]); - int x; - int usableSize = pPg->pBt->usableSize; - int size; /* Size of the free slot */ + const int hdr = pPg->hdrOffset; /* Offset to page header */ + u8 * const aData = pPg->aData; /* Page data */ + int iAddr = hdr + 1; /* Address of ptr to pc */ + int pc = get2byte(&aData[iAddr]); /* Address of a free slot */ + int x; /* Excess size of the slot */ + int maxPC = pPg->pBt->usableSize - nByte; /* Max address for a usable slot */ + int size; /* Size of the free slot */ assert( pc>0 ); - while( pc<=usableSize-4 ){ + while( pc<=maxPC ){ /* EVIDENCE-OF: R-22710-53328 The third and fourth bytes of each ** freeblock form a big-endian integer which is the size of the freeblock ** in bytes, including the 4-byte header. */ @@ -64472,10 +64742,7 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ if( (x = size - nByte)>=0 ){ testcase( x==4 ); testcase( x==3 ); - if( size+pc > usableSize ){ - *pRc = SQLITE_CORRUPT_PAGE(pPg); - return 0; - }else if( x<4 ){ + if( x<4 ){ /* EVIDENCE-OF: R-11498-58022 In a well-formed b-tree page, the total ** number of bytes in fragments may not exceed 60. */ if( aData[hdr+7]>57 ) return 0; @@ -64484,21 +64751,31 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ ** fragmented bytes within the page. */ memcpy(&aData[iAddr], &aData[pc], 2); aData[hdr+7] += (u8)x; + }else if( x+pc > maxPC ){ + /* This slot extends off the end of the usable part of the page */ + *pRc = SQLITE_CORRUPT_PAGE(pPg); + return 0; }else{ /* The slot remains on the free-list. Reduce its size to account - ** for the portion used by the new allocation. */ + ** for the portion used by the new allocation. */ put2byte(&aData[pc+2], x); } return &aData[pc + x]; } iAddr = pc; pc = get2byte(&aData[pc]); - if( pcmaxPC+nByte-4 ){ + /* The free slot chain extends off the end of the page */ *pRc = SQLITE_CORRUPT_PAGE(pPg); } - return 0; } @@ -64548,9 +64825,9 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ } } - /* If there is enough space between gap and top for one more cell pointer - ** array entry offset, and if the freelist is not empty, then search the - ** freelist looking for a free slot big enough to satisfy the request. + /* If there is enough space between gap and top for one more cell pointer, + ** and if the freelist is not empty, then search the + ** freelist looking for a slot big enough to satisfy the request. */ testcase( gap+2==top ); testcase( gap+1==top ); @@ -64572,6 +64849,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ testcase( gap+2+nByte==top ); if( gap+2+nByte>top ){ assert( pPage->nCell>0 || CORRUPT_DB ); + assert( pPage->nFree>=0 ); rc = defragmentPage(pPage, MIN(4, pPage->nFree - (2+nByte))); if( rc ) return rc; top = get2byteNotZero(&data[hdr+5]); @@ -64580,7 +64858,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ /* Allocate memory from the gap in between the cell pointer array - ** and the cell content area. The btreeInitPage() call has already + ** and the cell content area. The btreeComputeFreeSpace() call has already ** validated the freelist. Given that the freelist is valid, there ** is no way that the allocation can extend off the end of the page. ** The assert() below verifies the previous sentence. @@ -64599,7 +64877,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** ** Adjacent freeblocks are coalesced. ** -** Note that even though the freeblock list was checked by btreeInitPage(), +** Even though the freeblock list was checked by btreeComputeFreeSpace(), ** that routine will not detect overlap between cells or freeblocks. Nor ** does it detect cells or freeblocks that encrouch into the reserved bytes ** at the end of the page. So do additional corruption checks inside this @@ -64761,21 +65039,14 @@ static int decodeFlags(MemPage *pPage, int flagByte){ } /* -** Initialize the auxiliary information for a disk block. -** -** Return SQLITE_OK on success. If we see that the page does -** not contain a well-formed database page, then return -** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not -** guarantee that the page is well-formed. It only shows that -** we failed to detect any corruption. +** Compute the amount of freespace on the page. In other words, fill +** in the pPage->nFree field. */ -static int btreeInitPage(MemPage *pPage){ +static int btreeComputeFreeSpace(MemPage *pPage){ int pc; /* Address of a freeblock within pPage->aData[] */ u8 hdr; /* Offset to beginning of page header */ u8 *data; /* Equal to pPage->aData */ - BtShared *pBt; /* The main btree structure */ int usableSize; /* Amount of usable space on each page */ - u16 cellOffset; /* Offset from start of page to first cell pointer */ int nFree; /* Number of unused bytes on the page */ int top; /* First byte of the cell content area */ int iCellFirst; /* First allowable cell or freeblock offset */ @@ -64787,71 +65058,18 @@ static int btreeInitPage(MemPage *pPage){ assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); - assert( pPage->isInit==0 ); + assert( pPage->isInit==1 ); + assert( pPage->nFree<0 ); - pBt = pPage->pBt; + usableSize = pPage->pBt->usableSize; hdr = pPage->hdrOffset; data = pPage->aData; - /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating - ** the b-tree page type. */ - if( decodeFlags(pPage, data[hdr]) ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); - pPage->maskPage = (u16)(pBt->pageSize - 1); - pPage->nOverflow = 0; - usableSize = pBt->usableSize; - pPage->cellOffset = cellOffset = hdr + 8 + pPage->childPtrSize; - pPage->aDataEnd = &data[usableSize]; - pPage->aCellIdx = &data[cellOffset]; - pPage->aDataOfst = &data[pPage->childPtrSize]; /* EVIDENCE-OF: R-58015-48175 The two-byte integer at offset 5 designates ** the start of the cell content area. A zero value for this integer is ** interpreted as 65536. */ top = get2byteNotZero(&data[hdr+5]); - /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the - ** number of cells on the page. */ - pPage->nCell = get2byte(&data[hdr+3]); - if( pPage->nCell>MX_CELL(pBt) ){ - /* To many cells for a single page. The page must be corrupt */ - return SQLITE_CORRUPT_PAGE(pPage); - } - testcase( pPage->nCell==MX_CELL(pBt) ); - /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only - ** possible for a root page of a table that contains no rows) then the - ** offset to the cell content area will equal the page size minus the - ** bytes of reserved space. */ - assert( pPage->nCell>0 || top==usableSize || CORRUPT_DB ); - - /* A malformed database page might cause us to read past the end - ** of page when parsing a cell. - ** - ** The following block of code checks early to see if a cell extends - ** past the end of a page boundary and causes SQLITE_CORRUPT to be - ** returned if it does. - */ - iCellFirst = cellOffset + 2*pPage->nCell; + iCellFirst = hdr + 8 + pPage->childPtrSize + 2*pPage->nCell; iCellLast = usableSize - 4; - if( pBt->db->flags & SQLITE_CellSizeCk ){ - int i; /* Index into the cell pointer array */ - int sz; /* Size of a cell */ - - if( !pPage->leaf ) iCellLast--; - for(i=0; inCell; i++){ - pc = get2byteAligned(&data[cellOffset+i*2]); - testcase( pc==iCellFirst ); - testcase( pc==iCellLast ); - if( pciCellLast ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - sz = pPage->xCellSize(pPage, &data[pc]); - testcase( pc+sz==usableSize ); - if( pc+sz>usableSize ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - } - if( !pPage->leaf ) iCellLast++; - } /* Compute the total free space on the page ** EVIDENCE-OF: R-23588-34450 The two-byte integer at offset 1 gives the @@ -64899,7 +65117,100 @@ static int btreeInitPage(MemPage *pPage){ return SQLITE_CORRUPT_PAGE(pPage); } pPage->nFree = (u16)(nFree - iCellFirst); + return SQLITE_OK; +} + +/* +** Do additional sanity check after btreeInitPage() if +** PRAGMA cell_size_check=ON +*/ +static SQLITE_NOINLINE int btreeCellSizeCheck(MemPage *pPage){ + int iCellFirst; /* First allowable cell or freeblock offset */ + int iCellLast; /* Last possible cell or freeblock offset */ + int i; /* Index into the cell pointer array */ + int sz; /* Size of a cell */ + int pc; /* Address of a freeblock within pPage->aData[] */ + u8 *data; /* Equal to pPage->aData */ + int usableSize; /* Maximum usable space on the page */ + int cellOffset; /* Start of cell content area */ + + iCellFirst = pPage->cellOffset + 2*pPage->nCell; + usableSize = pPage->pBt->usableSize; + iCellLast = usableSize - 4; + data = pPage->aData; + cellOffset = pPage->cellOffset; + if( !pPage->leaf ) iCellLast--; + for(i=0; inCell; i++){ + pc = get2byteAligned(&data[cellOffset+i*2]); + testcase( pc==iCellFirst ); + testcase( pc==iCellLast ); + if( pciCellLast ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + sz = pPage->xCellSize(pPage, &data[pc]); + testcase( pc+sz==usableSize ); + if( pc+sz>usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + return SQLITE_OK; +} + +/* +** Initialize the auxiliary information for a disk block. +** +** Return SQLITE_OK on success. If we see that the page does +** not contain a well-formed database page, then return +** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not +** guarantee that the page is well-formed. It only shows that +** we failed to detect any corruption. +*/ +static int btreeInitPage(MemPage *pPage){ + u8 *data; /* Equal to pPage->aData */ + BtShared *pBt; /* The main btree structure */ + + assert( pPage->pBt!=0 ); + assert( pPage->pBt->db!=0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); + assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); + assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); + assert( pPage->isInit==0 ); + + pBt = pPage->pBt; + data = pPage->aData + pPage->hdrOffset; + /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating + ** the b-tree page type. */ + if( decodeFlags(pPage, data[0]) ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + pPage->maskPage = (u16)(pBt->pageSize - 1); + pPage->nOverflow = 0; + pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize; + pPage->aCellIdx = data + pPage->childPtrSize + 8; + pPage->aDataEnd = pPage->aData + pBt->usableSize; + pPage->aDataOfst = pPage->aData + pPage->childPtrSize; + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + pPage->nCell = get2byte(&data[3]); + if( pPage->nCell>MX_CELL(pBt) ){ + /* To many cells for a single page. The page must be corrupt */ + return SQLITE_CORRUPT_PAGE(pPage); + } + testcase( pPage->nCell==MX_CELL(pBt) ); + /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only + ** possible for a root page of a table that contains no rows) then the + ** offset to the cell content area will equal the page size minus the + ** bytes of reserved space. */ + assert( pPage->nCell>0 + || get2byteNotZero(&data[5])==(int)pBt->usableSize + || CORRUPT_DB ); + pPage->nFree = -1; /* Indicate that this value is yet uncomputed */ pPage->isInit = 1; + if( pBt->db->flags & SQLITE_CellSizeCk ){ + return btreeCellSizeCheck(pPage); + } return SQLITE_OK; } @@ -65042,19 +65353,18 @@ static int getAndInitPage( if( pgno>btreePagecount(pBt) ){ rc = SQLITE_CORRUPT_BKPT; - goto getAndInitPage_error; + goto getAndInitPage_error1; } rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, bReadOnly); if( rc ){ - goto getAndInitPage_error; + goto getAndInitPage_error1; } *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); if( (*ppPage)->isInit==0 ){ btreePageFromDbPage(pDbPage, pgno, pBt); rc = btreeInitPage(*ppPage); if( rc!=SQLITE_OK ){ - releasePage(*ppPage); - goto getAndInitPage_error; + goto getAndInitPage_error2; } } assert( (*ppPage)->pgno==pgno ); @@ -65064,12 +65374,13 @@ static int getAndInitPage( ** compatible with the root page. */ if( pCur && ((*ppPage)->nCell<1 || (*ppPage)->intKey!=pCur->curIntKey) ){ rc = SQLITE_CORRUPT_PGNO(pgno); - releasePage(*ppPage); - goto getAndInitPage_error; + goto getAndInitPage_error2; } return SQLITE_OK; -getAndInitPage_error: +getAndInitPage_error2: + releasePage(*ppPage); +getAndInitPage_error1: if( pCur ){ pCur->iPage--; pCur->pPage = pCur->apPage[pCur->iPage]; @@ -65929,9 +66240,9 @@ static int newDatabase(BtShared*); static int lockBtree(BtShared *pBt){ int rc; /* Result code from subfunctions */ MemPage *pPage1; /* Page 1 of the database file */ - int nPage; /* Number of pages in the database */ - int nPageFile = 0; /* Number of pages in the database file */ - int nPageHeader; /* Number of pages in the database according to hdr */ + u32 nPage; /* Number of pages in the database */ + u32 nPageFile = 0; /* Number of pages in the database file */ + u32 nPageHeader; /* Number of pages in the database according to hdr */ assert( sqlite3_mutex_held(pBt->mutex) ); assert( pBt->pPage1==0 ); @@ -65944,7 +66255,7 @@ static int lockBtree(BtShared *pBt){ ** a valid database file. */ nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData); - sqlite3PagerPagecount(pBt->pPager, &nPageFile); + sqlite3PagerPagecount(pBt->pPager, (int*)&nPageFile); if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ nPage = nPageFile; } @@ -66025,6 +66336,7 @@ static int lockBtree(BtShared *pBt){ ){ goto page1_init_failed; } + pBt->btsFlags |= BTS_PAGESIZE_FIXED; assert( (pageSize & 7)==0 ); /* EVIDENCE-OF: R-59310-51205 The "reserved space" size in the 1-byte ** integer at offset 20 is the number of bytes of space at the end of @@ -66415,7 +66727,7 @@ static int setChildPtrmaps(MemPage *pPage){ for(i=0; ileaf ){ Pgno childPgno = get4byte(pCell); @@ -67341,6 +67653,7 @@ SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){ sqlite3_free(pCur->aOverflow); sqlite3_free(pCur->pKey); sqlite3BtreeLeave(pBtree); + pCur->pBtree = 0; } return SQLITE_OK; } @@ -67439,6 +67752,25 @@ SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor *pCur){ return pCur->info.nPayload; } +/* +** Return an upper bound on the size of any record for the table +** that the cursor is pointing into. +** +** This is an optimization. Everything will still work if this +** routine always returns 2147483647 (which is the largest record +** that SQLite can handle) or more. But returning a smaller value might +** prevent large memory allocations when trying to interpret a +** corrupt datrabase. +** +** The current implementation merely returns the size of the underlying +** database file. +*/ +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + return pCur->pBt->pageSize * (sqlite3_int64)pCur->pBt->nPage; +} + /* ** Given the page number of an overflow page in the database (parameter ** ovfl), this function finds the page number of the next page in the @@ -68129,23 +68461,6 @@ SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ return rc; } -/* -** This function is a no-op if cursor pCur does not point to a valid row. -** Otherwise, if pCur is valid, configure it so that the next call to -** sqlite3BtreeNext() is a no-op. -*/ -#ifndef SQLITE_OMIT_WINDOWFUNC -SQLITE_PRIVATE void sqlite3BtreeSkipNext(BtCursor *pCur){ - /* We believe that the cursor must always be in the valid state when - ** this routine is called, but the proof is difficult, so we add an - ** ALWaYS() test just in case we are wrong. */ - if( ALWAYS(pCur->eState==CURSOR_VALID) ){ - pCur->eState = CURSOR_SKIPNEXT; - pCur->skipNext = 1; - } -} -#endif /* SQLITE_OMIT_WINDOWFUNC */ - /* Move the cursor to the last entry in the table. Return SQLITE_OK ** on success. Set *pRes to 0 if the cursor actually points to something ** or set *pRes to 1 if the table is empty. @@ -68253,7 +68568,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( ** try to get there using sqlite3BtreeNext() rather than a full ** binary search. This is an optimization only. The correct answer ** is still obtained without this case, only a little more slowely */ - if( pCur->info.nKey+1==intKey && !pCur->skipNext ){ + if( pCur->info.nKey+1==intKey ){ *pRes = 0; rc = sqlite3BtreeNext(pCur, 0); if( rc==SQLITE_OK ){ @@ -68395,7 +68710,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ testcase( nCell==2 ); /* Minimum legal index key size */ - if( nCell<2 ){ + if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){ rc = SQLITE_CORRUPT_PAGE(pPage); goto moveto_finish; } @@ -68411,7 +68726,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( sqlite3_free(pCellKey); goto moveto_finish; } - c = xRecordCompare(nCell, pCellKey, pIdxKey); + c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey); sqlite3_free(pCellKey); } assert( @@ -68527,7 +68842,6 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ MemPage *pPage; assert( cursorOwnsBtShared(pCur) ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); if( pCur->eState!=CURSOR_VALID ){ assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); rc = restoreCursorPosition(pCur); @@ -68537,14 +68851,9 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ if( CURSOR_INVALID==pCur->eState ){ return SQLITE_DONE; } - if( pCur->skipNext ){ - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + if( pCur->eState==CURSOR_SKIPNEXT ){ pCur->eState = CURSOR_VALID; - if( pCur->skipNext>0 ){ - pCur->skipNext = 0; - return SQLITE_OK; - } - pCur->skipNext = 0; + if( pCur->skipNext>0 ) return SQLITE_OK; } } @@ -68599,7 +68908,6 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int flags){ UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ assert( cursorOwnsBtShared(pCur) ); assert( flags==0 || flags==1 ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); if( pCur->eState!=CURSOR_VALID ) return btreeNext(pCur); @@ -68640,7 +68948,6 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ MemPage *pPage; assert( cursorOwnsBtShared(pCur) ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); assert( (pCur->curFlags & (BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey))==0 ); assert( pCur->info.nSize==0 ); if( pCur->eState!=CURSOR_VALID ){ @@ -68651,14 +68958,9 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ if( CURSOR_INVALID==pCur->eState ){ return SQLITE_DONE; } - if( pCur->skipNext ){ - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + if( CURSOR_SKIPNEXT==pCur->eState ){ pCur->eState = CURSOR_VALID; - if( pCur->skipNext<0 ){ - pCur->skipNext = 0; - return SQLITE_OK; - } - pCur->skipNext = 0; + if( pCur->skipNext<0 ) return SQLITE_OK; } } @@ -68693,7 +68995,6 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int flags){ assert( cursorOwnsBtShared(pCur) ); assert( flags==0 || flags==1 ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey); pCur->info.nSize = 0; @@ -69029,7 +69330,7 @@ static int allocateBtreePage( TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); } - assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + assert( CORRUPT_DB || *pPgno!=PENDING_BYTE_PAGE(pBt) ); end_allocate_page: releasePage(pTrunk); @@ -69057,13 +69358,15 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ MemPage *pPage1 = pBt->pPage1; /* Local reference to page 1 */ MemPage *pPage; /* Page being freed. May be NULL. */ int rc; /* Return Code */ - int nFree; /* Initial number of pages on free-list */ + u32 nFree; /* Initial number of pages on free-list */ assert( sqlite3_mutex_held(pBt->mutex) ); assert( CORRUPT_DB || iPage>1 ); assert( !pMemPage || pMemPage->pgno==iPage ); - if( iPage<2 ) return SQLITE_CORRUPT_BKPT; + if( iPage<2 || iPage>pBt->nPage ){ + return SQLITE_CORRUPT_BKPT; + } if( pMemPage ){ pPage = pMemPage; sqlite3PagerRef(pPage->pDbPage); @@ -69474,6 +69777,7 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ assert( CORRUPT_DB || sz==cellSize(pPage, idx) ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->nFree>=0 ); data = pPage->aData; ptr = &pPage->aCellIdx[2*idx]; pc = get2byte(ptr); @@ -69544,6 +69848,7 @@ static void insertCell( ** might be less than 8 (leaf-size + pointer) on the interior node. Hence ** the term after the || in the following assert(). */ assert( sz==pPage->xCellSize(pPage, pCell) || (sz==8 && iChild>0) ); + assert( pPage->nFree>=0 ); if( pPage->nOverflow || sz+2>pPage->nFree ){ if( pTemp ){ memcpy(pTemp, pCell, sz); @@ -69584,9 +69889,16 @@ static void insertCell( assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); assert( idx+sz <= (int)pPage->pBt->usableSize ); pPage->nFree -= (u16)(2 + sz); - memcpy(&data[idx], pCell, sz); if( iChild ){ + /* In a corrupt database where an entry in the cell index section of + ** a btree page has a value of 3 or less, the pCell value might point + ** as many as 4 bytes in front of the start of the aData buffer for + ** the source page. Make sure this does not cause problems by not + ** reading the first 4 bytes */ + memcpy(&data[idx+4], pCell+4, sz-4); put4byte(&data[idx], iChild); + }else{ + memcpy(&data[idx], pCell, sz); } pIns = pPage->aCellIdx + i*2; memmove(pIns+2, pIns, 2*(pPage->nCell - i)); @@ -69594,21 +69906,100 @@ static void insertCell( pPage->nCell++; /* increment the cell count */ if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; - assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell ); + assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB ); #ifndef SQLITE_OMIT_AUTOVACUUM if( pPage->pBt->autoVacuum ){ /* The cell may contain a pointer to an overflow page. If so, write ** the entry for the overflow page into the pointer map. */ - ptrmapPutOvflPtr(pPage, pCell, pRC); + ptrmapPutOvflPtr(pPage, pPage, pCell, pRC); } #endif } } +/* +** The following parameters determine how many adjacent pages get involved +** in a balancing operation. NN is the number of neighbors on either side +** of the page that participate in the balancing operation. NB is the +** total number of pages that participate, including the target page and +** NN neighbors on either side. +** +** The minimum value of NN is 1 (of course). Increasing NN above 1 +** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance +** in exchange for a larger degradation in INSERT and UPDATE performance. +** The value of NN appears to give the best results overall. +** +** (Later:) The description above makes it seem as if these values are +** tunable - as if you could change them and recompile and it would all work. +** But that is unlikely. NB has been 3 since the inception of SQLite and +** we have never tested any other value. +*/ +#define NN 1 /* Number of neighbors on either side of pPage */ +#define NB 3 /* (NN*2+1): Total pages involved in the balance */ + /* ** A CellArray object contains a cache of pointers and sizes for a ** consecutive sequence of cells that might be held on multiple pages. +** +** The cells in this array are the divider cell or cells from the pParent +** page plus up to three child pages. There are a total of nCell cells. +** +** pRef is a pointer to one of the pages that contributes cells. This is +** used to access information such as MemPage.intKey and MemPage.pBt->pageSize +** which should be common to all pages that contribute cells to this array. +** +** apCell[] and szCell[] hold, respectively, pointers to the start of each +** cell and the size of each cell. Some of the apCell[] pointers might refer +** to overflow cells. In other words, some apCel[] pointers might not point +** to content area of the pages. +** +** A szCell[] of zero means the size of that cell has not yet been computed. +** +** The cells come from as many as four different pages: +** +** ----------- +** | Parent | +** ----------- +** / | \ +** / | \ +** --------- --------- --------- +** |Child-1| |Child-2| |Child-3| +** --------- --------- --------- +** +** The order of cells is in the array is for an index btree is: +** +** 1. All cells from Child-1 in order +** 2. The first divider cell from Parent +** 3. All cells from Child-2 in order +** 4. The second divider cell from Parent +** 5. All cells from Child-3 in order +** +** For a table-btree (with rowids) the items 2 and 4 are empty because +** content exists only in leaves and there are no divider cells. +** +** For an index btree, the apEnd[] array holds pointer to the end of page +** for Child-1, the Parent, Child-2, the Parent (again), and Child-3, +** respectively. The ixNx[] array holds the number of cells contained in +** each of these 5 stages, and all stages to the left. Hence: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 plus 1 for first divider. +** ixNx[2] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. +** ixNx[3] = Number of cells in Child-1 and Child-2 + both divider cells +** ixNx[4] = Total number of cells. +** +** For a table-btree, the concept is similar, except only apEnd[0]..apEnd[2] +** are used and they point to the leaf pages only, and the ixNx value are: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 and Child-2. +** ixNx[2] = Total number of cells. +** +** Sometimes when deleting, a child page can have zero cells. In those +** cases, ixNx[] entries with higher indexes, and the corresponding apEnd[] +** entries, shift down. The end result is that each ixNx[] entry should +** be larger than the previous */ typedef struct CellArray CellArray; struct CellArray { @@ -69616,6 +70007,8 @@ struct CellArray { MemPage *pRef; /* Reference page */ u8 **apCell; /* All cells begin balanced */ u16 *szCell; /* Local size of all cells in apCell[] */ + u8 *apEnd[NB*2]; /* MemPage.aDataEnd values */ + int ixNx[NB*2]; /* Index of at which we move to the next apEnd[] */ }; /* @@ -69666,36 +70059,59 @@ static u16 cachedCellSize(CellArray *p, int N){ ** responsibility of the caller to set it correctly. */ static int rebuildPage( - MemPage *pPg, /* Edit this page */ + CellArray *pCArray, /* Content to be added to page pPg */ + int iFirst, /* First cell in pCArray to use */ int nCell, /* Final number of cells on page */ - u8 **apCell, /* Array of cells */ - u16 *szCell /* Array of cell sizes */ + MemPage *pPg /* The page to be reconstructed */ ){ const int hdr = pPg->hdrOffset; /* Offset of header on pPg */ u8 * const aData = pPg->aData; /* Pointer to data for pPg */ const int usableSize = pPg->pBt->usableSize; u8 * const pEnd = &aData[usableSize]; - int i; + int i = iFirst; /* Which cell to copy from pCArray*/ + u32 j; /* Start of cell content area */ + int iEnd = i+nCell; /* Loop terminator */ u8 *pCellptr = pPg->aCellIdx; u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); u8 *pData; + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pSrcEnd; /* Current pCArray->apEnd[k] value */ - i = get2byte(&aData[hdr+5]); - memcpy(&pTmp[i], &aData[i], usableSize - i); + assert( i(u32)usableSize) ){ j = 0; } + memcpy(&pTmp[j], &aData[j], usableSize - j); + + for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kapEnd[k]; pData = pEnd; - for(i=0; iapCell[i]; + u16 sz = pCArray->szCell[i]; + assert( sz>0 ); if( SQLITE_WITHIN(pCell,aData,pEnd) ){ + if( ((uptr)(pCell+sz))>(uptr)pEnd ) return SQLITE_CORRUPT_BKPT; pCell = &pTmp[pCell - aData]; + }else if( (uptr)(pCell+sz)>(uptr)pSrcEnd + && (uptr)(pCell)<(uptr)pSrcEnd + ){ + return SQLITE_CORRUPT_BKPT; } - pData -= szCell[i]; + + pData -= sz; put2byte(pCellptr, (pData - aData)); pCellptr += 2; if( pData < pCellptr ) return SQLITE_CORRUPT_BKPT; - memcpy(pData, pCell, szCell[i]); - assert( szCell[i]==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); - testcase( szCell[i]!=pPg->xCellSize(pPg,pCell) ); + memcpy(pData, pCell, sz); + assert( sz==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); + testcase( sz!=pPg->xCellSize(pPg,pCell) ); + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pSrcEnd = pCArray->apEnd[k]; + } } /* The pPg->nFree field is now set incorrectly. The caller will fix it. */ @@ -69710,12 +70126,11 @@ static int rebuildPage( } /* -** Array apCell[] contains nCell pointers to b-tree cells. Array szCell -** contains the size in bytes of each such cell. This function attempts to -** add the cells stored in the array to page pPg. If it cannot (because -** the page needs to be defragmented before the cells will fit), non-zero -** is returned. Otherwise, if the cells are added successfully, zero is -** returned. +** The pCArray objects contains pointers to b-tree cells and the cell sizes. +** This function attempts to add the cells stored in the array to page pPg. +** If it cannot (because the page needs to be defragmented before the cells +** will fit), non-zero is returned. Otherwise, if the cells are added +** successfully, zero is returned. ** ** Argument pCellptr points to the first entry in the cell-pointer array ** (part of page pPg) to populate. After cell apCell[0] is written to the @@ -69737,18 +70152,23 @@ static int rebuildPage( static int pageInsertArray( MemPage *pPg, /* Page to add cells to */ u8 *pBegin, /* End of cell-pointer array */ - u8 **ppData, /* IN/OUT: Page content -area pointer */ + u8 **ppData, /* IN/OUT: Page content-area pointer */ u8 *pCellptr, /* Pointer to cell-pointer area */ int iFirst, /* Index of first cell to add */ int nCell, /* Number of cells to add to pPg */ CellArray *pCArray /* Array of cells */ ){ - int i; - u8 *aData = pPg->aData; - u8 *pData = *ppData; - int iEnd = iFirst + nCell; + int i = iFirst; /* Loop counter - cell index to insert */ + u8 *aData = pPg->aData; /* Complete page */ + u8 *pData = *ppData; /* Content area. A subset of aData[] */ + int iEnd = iFirst + nCell; /* End of loop. One past last cell to ins */ + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pEnd; /* Maximum extent of cell data */ assert( CORRUPT_DB || pPg->hdrOffset==0 ); /* Never called on page 1 */ - for(i=iFirst; iixNx[k]<=i && ALWAYS(kapEnd[k]; + while( 1 /*Exit by break*/ ){ int sz, rc; u8 *pSlot; sz = cachedCellSize(pCArray, i); @@ -69763,20 +70183,33 @@ static int pageInsertArray( assert( (pSlot+sz)<=pCArray->apCell[i] || pSlot>=(pCArray->apCell[i]+sz) || CORRUPT_DB ); + if( (uptr)(pCArray->apCell[i]+sz)>(uptr)pEnd + && (uptr)(pCArray->apCell[i])<(uptr)pEnd + ){ + assert( CORRUPT_DB ); + (void)SQLITE_CORRUPT_BKPT; + return 1; + } memmove(pSlot, pCArray->apCell[i], sz); put2byte(pCellptr, (pSlot - aData)); pCellptr += 2; + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pEnd = pCArray->apEnd[k]; + } } *ppData = pData; return 0; } /* -** Array apCell[] contains nCell pointers to b-tree cells. Array szCell -** contains the size in bytes of each such cell. This function adds the -** space associated with each cell in the array that is currently stored -** within the body of pPg to the pPg free-list. The cell-pointers and other -** fields of the page are not updated. +** The pCArray object contains pointers to b-tree cells and their sizes. +** +** This function adds the space associated with each cell in the array +** that is currently stored within the body of pPg to the pPg free-list. +** The cell-pointers and other fields of the page are not updated. ** ** This function returns the total number of cells added to the free-list. */ @@ -69826,9 +70259,9 @@ static int pageFreeArray( } /* -** apCell[] and szCell[] contains pointers to and sizes of all cells in the -** pages being balanced. The current page, pPg, has pPg->nCell cells starting -** with apCell[iOld]. After balancing, this page should hold nNew cells +** pCArray contains pointers to and sizes of all cells in the page being +** balanced. The current page, pPg, has pPg->nCell cells starting with +** pCArray->apCell[iOld]. After balancing, this page should hold nNew cells ** starting at apCell[iNew]. ** ** This routine makes the necessary adjustments to pPg so that it contains @@ -69860,13 +70293,17 @@ static int editPage( #endif /* Remove cells from the start and end of the page */ + assert( nCell>=0 ); if( iOldnCell ) return SQLITE_CORRUPT_BKPT; memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); nCell -= nShift; } if( iNewEnd < iOldEnd ){ - nCell -= pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + int nTail = pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + assert( nCell>=nTail ); + nCell -= nTail; } pData = &aData[get2byteNotZero(&aData[hdr+5])]; @@ -69876,6 +70313,7 @@ static int editPage( if( iNew=0 ); pCellptr = pPg->aCellIdx; memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); if( pageInsertArray( @@ -69890,7 +70328,9 @@ static int editPage( int iCell = (iOld + pPg->aiOvfl[i]) - iNew; if( iCell>=0 && iCellaCellIdx[iCell * 2]; - memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); + if( nCell>iCell ){ + memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); + } nCell++; if( pageInsertArray( pPg, pBegin, &pData, pCellptr, @@ -69900,6 +70340,7 @@ static int editPage( } /* Append cells to the end of the page */ + assert( nCell>=0 ); pCellptr = &pPg->aCellIdx[nCell*2]; if( pageInsertArray( pPg, pBegin, &pData, pCellptr, @@ -69928,24 +70369,9 @@ static int editPage( editpage_fail: /* Unable to edit this page. Rebuild it from scratch instead. */ populateCellCache(pCArray, iNew, nNew); - return rebuildPage(pPg, nNew, &pCArray->apCell[iNew], &pCArray->szCell[iNew]); + return rebuildPage(pCArray, iNew, nNew, pPg); } -/* -** The following parameters determine how many adjacent pages get involved -** in a balancing operation. NN is the number of neighbors on either side -** of the page that participate in the balancing operation. NB is the -** total number of pages that participate, including the target page and -** NN neighbors on either side. -** -** The minimum value of NN is 1 (of course). Increasing NN above 1 -** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance -** in exchange for a larger degradation in INSERT and UPDATE performance. -** The value of NN appears to give the best results overall. -*/ -#define NN 1 /* Number of neighbors on either side of pPage */ -#define NB (NN*2+1) /* Total pages involved in the balance */ - #ifndef SQLITE_OMIT_QUICKBALANCE /* @@ -69980,9 +70406,10 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); assert( pPage->nOverflow==1 ); - - /* This error condition is now caught prior to reaching this function */ - if( NEVER(pPage->nCell==0) ) return SQLITE_CORRUPT_BKPT; + + if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT; /* dbfuzz001.test */ + assert( pPage->nFree>=0 ); + assert( pParent->nFree>=0 ); /* Allocate a new page. This page will become the right-sibling of ** pPage. Make the parent page writable, so that the new divider cell @@ -69996,12 +70423,22 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ u8 *pCell = pPage->apOvfl[0]; u16 szCell = pPage->xCellSize(pPage, pCell); u8 *pStop; + CellArray b; assert( sqlite3PagerIswriteable(pNew->pDbPage) ); - assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); + assert( CORRUPT_DB || pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF); - rc = rebuildPage(pNew, 1, &pCell, &szCell); - if( NEVER(rc) ) return rc; + b.nCell = 1; + b.pRef = pPage; + b.apCell = &pCell; + b.szCell = &szCell; + b.apEnd[0] = pPage->aDataEnd; + b.ixNx[0] = 2; + rc = rebuildPage(&b, 0, 1, pNew); + if( NEVER(rc) ){ + releasePage(pNew); + return rc; + } pNew->nFree = pBt->usableSize - pNew->cellOffset - 2 - szCell; /* If this is an auto-vacuum database, update the pointer map @@ -70016,7 +70453,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ if( ISAUTOVACUUM ){ ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc); if( szCell>pNew->minLocal ){ - ptrmapPutOvflPtr(pNew, pCell, &rc); + ptrmapPutOvflPtr(pNew, pNew, pCell, &rc); } } @@ -70142,6 +70579,7 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ */ pTo->isInit = 0; rc = btreeInitPage(pTo); + if( rc==SQLITE_OK ) rc = btreeComputeFreeSpace(pTo); if( rc!=SQLITE_OK ){ *pRC = rc; return; @@ -70239,10 +70677,6 @@ static int balance_nonroot( assert( sqlite3_mutex_held(pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); -#if 0 - TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno)); -#endif - /* At this point pParent may have at most one overflow cell. And if ** this overflow cell is present, it must be the cell with ** index iParentIdx. This scenario comes about when this function @@ -70254,6 +70688,7 @@ static int balance_nonroot( if( !aOvflSpace ){ return SQLITE_NOMEM_BKPT; } + assert( pParent->nFree>=0 ); /* Find the sibling pages to balance. Also locate the cells in pParent ** that divide the siblings. An attempt is made to find NN siblings on @@ -70293,7 +70728,13 @@ static int balance_nonroot( memset(apOld, 0, (i+1)*sizeof(MemPage*)); goto balance_cleanup; } - nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow; + if( apOld[i]->nFree<0 ){ + rc = btreeComputeFreeSpace(apOld[i]); + if( rc ){ + memset(apOld, 0, (i)*sizeof(MemPage*)); + goto balance_cleanup; + } + } if( (i--)==0 ) break; if( pParent->nOverflow && i+nxDiv==pParent->aiOvfl[0] ){ @@ -70337,6 +70778,7 @@ static int balance_nonroot( /* Make nMaxCells a multiple of 4 in order to preserve 8-byte ** alignment */ + nMaxCells = nOld*(MX_CELL(pBt) + ArraySize(pParent->apOvfl)); nMaxCells = (nMaxCells + 3)&~3; /* @@ -70347,7 +70789,7 @@ static int balance_nonroot( + nMaxCells*sizeof(u16) /* b.szCell */ + pBt->pageSize; /* aSpace1 */ - assert( szScratch<=6*(int)pBt->pageSize ); + assert( szScratch<=7*(int)pBt->pageSize ); b.apCell = sqlite3StackAllocRaw(0, szScratch ); if( b.apCell==0 ){ rc = SQLITE_NOMEM_BKPT; @@ -70483,8 +70925,19 @@ static int balance_nonroot( ** */ usableSpace = pBt->usableSize - 12 + leafCorrection; - for(i=0; iaDataEnd; + b.ixNx[k] = cntOld[i]; + if( k && b.ixNx[k]==b.ixNx[k-1] ){ + k--; /* Omit b.ixNx[] entry for child pages with no cells */ + } + if( !leafData ){ + k++; + b.apEnd[k] = pParent->aDataEnd; + b.ixNx[k] = cntOld[i]+1; + } + assert( p->nFree>=0 ); szNew[i] = usableSpace - p->nFree; for(j=0; jnOverflow; j++){ szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); @@ -70708,19 +71161,19 @@ static int balance_nonroot( ** populated, not here. */ if( ISAUTOVACUUM ){ - MemPage *pNew = apNew[0]; - u8 *aOld = pNew->aData; + MemPage *pOld; + MemPage *pNew = pOld = apNew[0]; int cntOldNext = pNew->nCell + pNew->nOverflow; - int usableSize = pBt->usableSize; int iNew = 0; int iOld = 0; for(i=0; inCell + pOld->nOverflow + !leafData; - aOld = pOld->aData; } if( i==cntNew[iNew] ){ pNew = apNew[++iNew]; @@ -70735,13 +71188,13 @@ static int balance_nonroot( ** overflow cell), we can skip updating the pointer map entries. */ if( iOld>=nNew || pNew->pgno!=aPgno[iOld] - || !SQLITE_WITHIN(pCell,aOld,&aOld[usableSize]) + || !SQLITE_WITHIN(pCell,pOld->aData,pOld->aDataEnd) ){ if( !leafCorrection ){ ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); } if( cachedCellSize(&b,i)>pNew->minLocal ){ - ptrmapPutOvflPtr(pNew, pCell, &rc); + ptrmapPutOvflPtr(pNew, pOld, pCell, &rc); } if( rc ) goto balance_cleanup; } @@ -70886,7 +71339,8 @@ static int balance_nonroot( rc = defragmentPage(apNew[0], -1); testcase( rc!=SQLITE_OK ); assert( apNew[0]->nFree == - (get2byte(&apNew[0]->aData[5])-apNew[0]->cellOffset-apNew[0]->nCell*2) + (get2byteNotZero(&apNew[0]->aData[5]) - apNew[0]->cellOffset + - apNew[0]->nCell*2) || rc!=SQLITE_OK ); copyNodeContent(apNew[0], pParent, &rc); @@ -70985,7 +71439,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ } assert( sqlite3PagerIswriteable(pChild->pDbPage) ); assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); - assert( pChild->nCell==pRoot->nCell ); + assert( pChild->nCell==pRoot->nCell || CORRUPT_DB ); TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno)); @@ -71027,6 +71481,7 @@ static int balance(BtCursor *pCur){ int iPage = pCur->iPage; MemPage *pPage = pCur->pPage; + if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; if( iPage==0 ){ if( pPage->nOverflow ){ /* The root page of the b-tree is overfull. In this case call the @@ -71055,6 +71510,9 @@ static int balance(BtCursor *pCur){ int const iIdx = pCur->aiIdx[iPage-1]; rc = sqlite3PagerWrite(pParent->pDbPage); + if( rc==SQLITE_OK && pParent->nFree<0 ){ + rc = btreeComputeFreeSpace(pParent); + } if( rc==SQLITE_OK ){ #ifndef SQLITE_OMIT_QUICKBALANCE if( pPage->intKeyLeaf @@ -71165,7 +71623,11 @@ static int btreeOverwriteContent( if( memcmp(pDest, ((u8*)pX->pData) + iOffset, iAmt)!=0 ){ int rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ) return rc; - memcpy(pDest, ((u8*)pX->pData) + iOffset, iAmt); + /* In a corrupt database, it is possible for the source and destination + ** buffers to overlap. This is harmless since the database is already + ** corrupt but it does cause valgrind and ASAN warnings. So use + ** memmove(). */ + memmove(pDest, ((u8*)pX->pData) + iOffset, iAmt); } } return SQLITE_OK; @@ -71397,6 +71859,10 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( pPage = pCur->pPage; assert( pPage->intKey || pX->nKey>=0 ); assert( pPage->leaf || !pPage->intKey ); + if( pPage->nFree<0 ){ + rc = btreeComputeFreeSpace(pPage); + if( rc ) return rc; + } TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, @@ -71539,14 +72005,18 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ assert( pCur->curFlags & BTCF_WriteFlag ); assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); assert( !hasReadConflicts(p, pCur->pgnoRoot) ); - assert( pCur->ixpPage->nCell ); - assert( pCur->eState==CURSOR_VALID ); assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 ); + if( pCur->eState==CURSOR_REQUIRESEEK ){ + rc = btreeRestoreCursorPosition(pCur); + if( rc ) return rc; + } + assert( pCur->eState==CURSOR_VALID ); iCellDepth = pCur->iPage; iCellIdx = pCur->ix; pPage = pCur->pPage; pCell = findCell(pPage, iCellIdx); + if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ) return SQLITE_CORRUPT; /* If the bPreserve flag is set to true, then the cursor position must ** be preserved following this delete operation. If the current delete @@ -71560,6 +72030,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ if( bPreserve ){ if( !pPage->leaf || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) + || pPage->nCell==1 /* See dbfuzz001.test for a test case */ ){ /* A b-tree rebalance will be required after deleting this entry. ** Save the cursor key. */ @@ -71616,6 +72087,10 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ Pgno n; unsigned char *pTmp; + if( pLeaf->nFree<0 ){ + rc = btreeComputeFreeSpace(pLeaf); + if( rc ) return rc; + } if( iCellDepthiPage-1 ){ n = pCur->apPage[iCellDepth+1]->pgno; }else{ @@ -71974,6 +72449,9 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ assert( sqlite3BtreeHoldsMutex(p) ); assert( p->inTrans==TRANS_WRITE ); assert( iTable>=2 ); + if( iTable>btreePagecount(pBt) ){ + return SQLITE_CORRUPT_BKPT; + } rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0); if( rc ) return rc; @@ -72322,10 +72800,10 @@ static void checkList( IntegrityCk *pCheck, /* Integrity checking context */ int isFreeList, /* True for a freelist. False for overflow page list */ int iPage, /* Page number for first page in the list */ - int N /* Expected number of pages in the list */ + u32 N /* Expected number of pages in the list */ ){ int i; - int expected = N; + u32 expected = N; int nErrAtStart = pCheck->nErr; while( iPage!=0 && pCheck->mxErr ){ DbPage *pOvflPage; @@ -72338,18 +72816,18 @@ static void checkList( } pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); if( isFreeList ){ - int n = get4byte(&pOvflData[4]); + u32 n = (u32)get4byte(&pOvflData[4]); #ifndef SQLITE_OMIT_AUTOVACUUM if( pCheck->pBt->autoVacuum ){ checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0); } #endif - if( n>(int)pCheck->pBt->usableSize/4-2 ){ + if( n>pCheck->pBt->usableSize/4-2 ){ checkAppendMsg(pCheck, "freelist leaf count too big on page %d", iPage); N--; }else{ - for(i=0; ipBt->autoVacuum ){ @@ -72507,6 +72985,11 @@ static int checkTreePage( "btreeInitPage() returns error code %d", rc); goto end_of_check; } + if( (rc = btreeComputeFreeSpace(pPage))!=0 ){ + assert( rc==SQLITE_CORRUPT ); + checkAppendMsg(pCheck, "free space corruption", rc); + goto end_of_check; + } data = pPage->aData; hdr = pPage->hdrOffset; @@ -72579,7 +73062,7 @@ static int checkTreePage( /* Check the content overflow list */ if( info.nPayload>info.nLocal ){ - int nPage; /* Number of pages on the overflow chain */ + u32 nPage; /* Number of pages on the overflow chain */ Pgno pgnoOvfl; /* First page of the overflow chain */ assert( pc + info.nSize - 4 <= usableSize ); nPage = (info.nPayload - info.nLocal + usableSize - 5)/(usableSize - 4); @@ -72639,9 +73122,9 @@ static int checkTreePage( i = get2byte(&data[hdr+1]); while( i>0 ){ int size, j; - assert( (u32)i<=usableSize-4 ); /* Enforced by btreeInitPage() */ + assert( (u32)i<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ size = get2byte(&data[i+2]); - assert( (u32)(i+size)<=usableSize ); /* Enforced by btreeInitPage() */ + assert( (u32)(i+size)<=usableSize ); /* due to btreeComputeFreeSpace() */ btreeHeapInsert(heap, (((u32)i)<<16)|(i+size-1)); /* EVIDENCE-OF: R-58208-19414 The first 2 bytes of a freeblock are a ** big-endian integer which is the offset in the b-tree page of the next @@ -72650,8 +73133,8 @@ static int checkTreePage( j = get2byte(&data[i]); /* EVIDENCE-OF: R-06866-39125 Freeblocks are always connected in order of ** increasing offset. */ - assert( j==0 || j>i+size ); /* Enforced by btreeInitPage() */ - assert( (u32)j<=usableSize-4 ); /* Enforced by btreeInitPage() */ + assert( j==0 || j>i+size ); /* Enforced by btreeComputeFreeSpace() */ + assert( (u32)j<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ i = j; } /* Analyze the min-heap looking for overlap between cells and/or @@ -72726,7 +73209,7 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( Pgno i; IntegrityCk sCheck; BtShared *pBt = p->pBt; - int savedDbFlags = pBt->db->flags; + u64 savedDbFlags = pBt->db->flags; char zErr[100]; VVA_ONLY( int nRef ); @@ -72793,7 +73276,7 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( } #endif testcase( pBt->db->flags & SQLITE_CellSizeCk ); - pBt->db->flags &= ~SQLITE_CellSizeCk; + pBt->db->flags &= ~(u64)SQLITE_CellSizeCk; for(i=0; (int)iflags&MEM_Static)!=0 ? 1 : 0) <= 1 ); /* No other bits set */ - assert( (p->flags & ~(MEM_Null|MEM_Term|MEM_Subtype + assert( (p->flags & ~(MEM_Null|MEM_Term|MEM_Subtype|MEM_FromBind |MEM_Dyn|MEM_Ephem|MEM_Static))==0 ); }else{ /* A pure NULL might have other flags, such as MEM_Static, MEM_Dyn, @@ -74116,8 +74599,7 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ } /* -** Make sure pMem->z points to a writable allocation of at least -** min(n,32) bytes. +** Make sure pMem->z points to a writable allocation of at least n bytes. ** ** If the bPreserve argument is true, then copy of the content of ** pMem->z into the new allocation. pMem must be either a string or @@ -74136,7 +74618,6 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPre assert( pMem->szMalloc==0 || pMem->szMalloc==sqlite3DbMallocSize(pMem->db, pMem->zMalloc) ); - if( n<32 ) n = 32; if( pMem->szMalloc>0 && bPreserve && pMem->z==pMem->zMalloc ){ pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); bPreserve = 0; @@ -74181,7 +74662,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPre ** if unable to complete the resizing. */ SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ - assert( szNew>0 ); + assert( CORRUPT_DB || szNew>0 ); assert( (pMem->flags & MEM_Dyn)==0 || pMem->szMalloc==0 ); if( pMem->szMallocflags & MEM_Zero ); - assert( pMem->flags&MEM_Blob ); + assert( (pMem->flags&MEM_Blob)!=0 || MemNullNochng(pMem) ); + testcase( sqlite3_value_nochange(pMem) ); assert( !sqlite3VdbeMemIsRowSet(pMem) ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); /* Set nByte to the number of bytes required to store the expanded blob. */ nByte = pMem->n + pMem->u.nZero; if( nByte<=0 ){ + if( (pMem->flags & MEM_Blob)==0 ) return SQLITE_OK; nByte = 1; } if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){ @@ -74985,7 +75468,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( assert( enc!=0 ); if( enc==SQLITE_UTF8 ){ nByte = 0x7fffffff & (int)strlen(z); - if( nByte>iLimit ) nByte = iLimit+1; }else{ for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} } @@ -74997,29 +75479,30 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( ** management (one of MEM_Dyn or MEM_Static). */ if( xDel==SQLITE_TRANSIENT ){ - int nAlloc = nByte; + u32 nAlloc = nByte; if( flags&MEM_Term ){ nAlloc += (enc==SQLITE_UTF8?1:2); } if( nByte>iLimit ){ - return SQLITE_TOOBIG; + return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); } testcase( nAlloc==0 ); testcase( nAlloc==31 ); testcase( nAlloc==32 ); - if( sqlite3VdbeMemClearAndResize(pMem, MAX(nAlloc,32)) ){ + if( sqlite3VdbeMemClearAndResize(pMem, (int)MAX(nAlloc,32)) ){ return SQLITE_NOMEM_BKPT; } memcpy(pMem->z, z, nAlloc); - }else if( xDel==SQLITE_DYNAMIC ){ - sqlite3VdbeMemRelease(pMem); - pMem->zMalloc = pMem->z = (char *)z; - pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); }else{ sqlite3VdbeMemRelease(pMem); pMem->z = (char *)z; - pMem->xDel = xDel; - flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn); + if( xDel==SQLITE_DYNAMIC ){ + pMem->zMalloc = pMem->z; + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); + }else{ + pMem->xDel = xDel; + flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn); + } } pMem->n = nByte; @@ -75062,6 +75545,9 @@ static SQLITE_NOINLINE int vdbeMemFromBtreeResize( ){ int rc; pMem->flags = MEM_Null; + if( sqlite3BtreeMaxRecordSize(pCur)z); if( rc==SQLITE_OK ){ @@ -75468,9 +75954,11 @@ static int valueFromExpr( } #endif else if( op==TK_TRUEFALSE ){ - pVal = valueNew(db, pCtx); - pVal->flags = MEM_Int; - pVal->u.i = pExpr->u.zToken[4]==0; + pVal = valueNew(db, pCtx); + if( pVal ){ + pVal->flags = MEM_Int; + pVal->u.i = pExpr->u.zToken[4]==0; + } } *ppVal = pVal; @@ -75863,7 +76351,7 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ pParse->pVdbe = p; assert( pParse->aLabel==0 ); assert( pParse->nLabel==0 ); - assert( pParse->nOpAlloc==0 ); + assert( p->nOpAlloc==0 ); assert( pParse->szOpAlloc==0 ); sqlite3VdbeAddOp2(p, OP_Init, 0, 1); return p; @@ -75891,15 +76379,45 @@ SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, u8 prepFlag } assert( p->zSql==0 ); p->zSql = sqlite3DbStrNDup(p->db, z, n); -#ifdef SQLITE_ENABLE_NORMALIZE - assert( p->zNormSql==0 ); - if( p->zSql && (prepFlags & SQLITE_PREPARE_NORMALIZE)!=0 ){ - sqlite3Normalize(p, p->zSql, n, prepFlags); - assert( p->zNormSql!=0 || p->db->mallocFailed ); - } -#endif } +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Add a new element to the Vdbe->pDblStr list. +*/ +SQLITE_PRIVATE void sqlite3VdbeAddDblquoteStr(sqlite3 *db, Vdbe *p, const char *z){ + if( p ){ + int n = sqlite3Strlen30(z); + DblquoteStr *pStr = sqlite3DbMallocRawNN(db, + sizeof(*pStr)+n+1-sizeof(pStr->z)); + if( pStr ){ + pStr->pNextStr = p->pDblStr; + p->pDblStr = pStr; + memcpy(pStr->z, z, n+1); + } + } +} +#endif + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** zId of length nId is a double-quoted identifier. Check to see if +** that identifier is really used as a string literal. +*/ +SQLITE_PRIVATE int sqlite3VdbeUsesDoubleQuotedString( + Vdbe *pVdbe, /* The prepared statement */ + const char *zId /* The double-quoted identifier, already dequoted */ +){ + DblquoteStr *pStr; + assert( zId!=0 ); + if( pVdbe->pDblStr==0 ) return 0; + for(pStr=pVdbe->pDblStr; pStr; pStr=pStr->pNextStr){ + if( strcmp(zId, pStr->z)==0 ) return 1; + } + return 0; +} +#endif + /* ** Swap all content between two VDBE structures. */ @@ -75919,7 +76437,7 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ zTmp = pA->zSql; pA->zSql = pB->zSql; pB->zSql = zTmp; -#ifdef SQLITE_ENABLE_NORMALIZE +#if 0 zTmp = pA->zNormSql; pA->zNormSql = pB->zNormSql; pB->zNormSql = zTmp; @@ -75936,7 +76454,7 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ ** to 1024/sizeof(Op). ** ** If an out-of-memory error occurs while resizing the array, return -** SQLITE_NOMEM. In this case Vdbe.aOp and Parse.nOpAlloc remain +** SQLITE_NOMEM. In this case Vdbe.aOp and Vdbe.nOpAlloc remain ** unchanged (this is so that any opcodes already allocated can be ** correctly deallocated along with the rest of the Vdbe). */ @@ -75952,9 +76470,11 @@ static int growOpArray(Vdbe *v, int nOp){ ** operation (without SQLITE_TEST_REALLOC_STRESS) is to double the current ** size of the op array or add 1KB of space, whichever is smaller. */ #ifdef SQLITE_TEST_REALLOC_STRESS - int nNew = (p->nOpAlloc>=512 ? p->nOpAlloc*2 : p->nOpAlloc+nOp); + sqlite3_int64 nNew = (v->nOpAlloc>=512 ? 2*(sqlite3_int64)v->nOpAlloc + : (sqlite3_int64)v->nOpAlloc+nOp); #else - int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op))); + sqlite3_int64 nNew = (v->nOpAlloc ? 2*(sqlite3_int64)v->nOpAlloc + : (sqlite3_int64)(1024/sizeof(Op))); UNUSED_PARAMETER(nOp); #endif @@ -75965,11 +76485,11 @@ static int growOpArray(Vdbe *v, int nOp){ } assert( nOp<=(1024/sizeof(Op)) ); - assert( nNew>=(p->nOpAlloc+nOp) ); + assert( nNew>=(v->nOpAlloc+nOp) ); pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); if( pNew ){ p->szOpAlloc = sqlite3DbMallocSize(p->db, pNew); - p->nOpAlloc = p->szOpAlloc/sizeof(Op); + v->nOpAlloc = p->szOpAlloc/sizeof(Op); v->aOp = pNew; } return (pNew ? SQLITE_OK : SQLITE_NOMEM_BKPT); @@ -76003,9 +76523,9 @@ static void test_addop_breakpoint(void){ ** operand. */ static SQLITE_NOINLINE int growOp3(Vdbe *p, int op, int p1, int p2, int p3){ - assert( p->pParse->nOpAlloc<=p->nOp ); + assert( p->nOpAlloc<=p->nOp ); if( growOpArray(p, 1) ) return 1; - assert( p->pParse->nOpAlloc>p->nOp ); + assert( p->nOpAlloc>p->nOp ); return sqlite3VdbeAddOp3(p, op, p1, p2, p3); } SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ @@ -76015,7 +76535,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ i = p->nOp; assert( p->magic==VDBE_MAGIC_INIT ); assert( op>=0 && op<0xff ); - if( p->pParse->nOpAlloc<=i ){ + if( p->nOpAlloc<=i ){ return growOp3(p, op, p1, p2, p3); } p->nOp++; @@ -76147,13 +76667,29 @@ SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse *pParse){ } /* -** Add a new OP_Explain opcode. +** Set a debugger breakpoint on the following routine in order to +** monitor the EXPLAIN QUERY PLAN code generation. +*/ +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ + (void)z1; + (void)z2; +} +#endif + +/* +** Add a new OP_ opcode. ** ** If the bPush flag is true, then make this opcode the parent for ** subsequent Explains until sqlite3VdbeExplainPop() is called. */ SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ - if( pParse->explain==2 ){ +#ifndef SQLITE_DEBUG + /* Always include the OP_Explain opcodes if SQLITE_DEBUG is defined. + ** But omit them (for performance) during production builds */ + if( pParse->explain==2 ) +#endif + { char *zMsg; Vdbe *v; va_list ap; @@ -76165,7 +76701,10 @@ SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt iThis = v->nOp; sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0, zMsg, P4_DYNAMIC); - if( bPush) pParse->addrExplain = iThis; + sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetOp(v,-1)->p4.z); + if( bPush){ + pParse->addrExplain = iThis; + } } } @@ -76173,6 +76712,7 @@ SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt ** Pop the EXPLAIN QUERY PLAN stack one level. */ SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse *pParse){ + sqlite3ExplainBreakpoint("POP", 0); pParse->addrExplain = sqlite3VdbeExplainParent(pParse); } #endif /* SQLITE_OMIT_EXPLAIN */ @@ -76237,21 +76777,22 @@ SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ ** The VDBE knows that a P2 value is a label because labels are ** always negative and P2 values are suppose to be non-negative. ** Hence, a negative P2 value is a label that has yet to be resolved. +** (Later:) This is only true for opcodes that have the OPFLG_JUMP +** property. ** -** Zero is returned if a malloc() fails. +** Variable usage notes: +** +** Parse.aLabel[x] Stores the address that the x-th label resolves +** into. For testing (SQLITE_DEBUG), unresolved +** labels stores -1, but that is not required. +** Parse.nLabelAlloc Number of slots allocated to Parse.aLabel[] +** Parse.nLabel The *negative* of the number of labels that have +** been issued. The negative is stored because +** that gives a performance improvement over storing +** the equivalent positive value. */ -SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *v){ - Parse *p = v->pParse; - int i = p->nLabel++; - assert( v->magic==VDBE_MAGIC_INIT ); - if( (i & (i-1))==0 ){ - p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, - (i*2+1)*sizeof(p->aLabel[0])); - } - if( p->aLabel ){ - p->aLabel[i] = -1; - } - return ADDR(i); +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse *pParse){ + return --pParse->nLabel; } /* @@ -76259,18 +76800,35 @@ SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *v){ ** be inserted. The parameter "x" must have been obtained from ** a prior call to sqlite3VdbeMakeLabel(). */ +static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){ + int nNewSize = 10 - p->nLabel; + p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, + nNewSize*sizeof(p->aLabel[0])); + if( p->aLabel==0 ){ + p->nLabelAlloc = 0; + }else{ +#ifdef SQLITE_DEBUG + int i; + for(i=p->nLabelAlloc; iaLabel[i] = -1; +#endif + p->nLabelAlloc = nNewSize; + p->aLabel[j] = v->nOp; + } +} SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ Parse *p = v->pParse; int j = ADDR(x); assert( v->magic==VDBE_MAGIC_INIT ); - assert( jnLabel ); + assert( j<-p->nLabel ); assert( j>=0 ); - if( p->aLabel ){ #ifdef SQLITE_DEBUG - if( p->db->flags & SQLITE_VdbeAddopTrace ){ - printf("RESOLVE LABEL %d to %d\n", x, v->nOp); - } + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + printf("RESOLVE LABEL %d to %d\n", x, v->nOp); + } #endif + if( p->nLabelAlloc + p->nLabel < 0 ){ + resizeResolveLabel(p,v,j); + }else{ assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */ p->aLabel[j] = v->nOp; } @@ -76395,8 +76953,10 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ while( (pOp = opIterNext(&sIter))!=0 ){ int opcode = pOp->opcode; if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename + || opcode==OP_VDestroy + || (opcode==OP_Function0 && pOp->p4.pFunc->funcFlags&SQLITE_FUNC_INTERNAL) || ((opcode==OP_Halt || opcode==OP_HaltIfNull) - && ((pOp->p1&0xff)==SQLITE_CONSTRAINT && pOp->p2==OE_Abort)) + && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) ){ hasAbort = 1; break; @@ -76545,7 +77105,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ ** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to ** have non-negative values for P2. */ assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ); - assert( ADDR(pOp->p2)nLabel ); + assert( ADDR(pOp->p2)<-pParse->nLabel ); pOp->p2 = aLabel[ADDR(pOp->p2)]; } break; @@ -76584,7 +77144,7 @@ SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){ */ #if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N){ - assert( p->nOp + N <= p->pParse->nOpAlloc ); + assert( p->nOp + N <= p->nOpAlloc ); } #endif @@ -76656,7 +77216,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( VdbeOp *pOut, *pFirst; assert( nOp>0 ); assert( p->magic==VDBE_MAGIC_INIT ); - if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p, nOp) ){ + if( p->nOp + nOp > p->nOpAlloc && growOpArray(p, nOp) ){ return 0; } pFirst = pOut = &p->aOp[p->nOp]; @@ -76702,7 +77262,7 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus( LogEst nEst, /* Estimated number of output rows */ const char *zName /* Name of table or index being scanned */ ){ - int nByte = (p->nScan+1) * sizeof(ScanStatus); + sqlite3_int64 nByte = (p->nScan+1) * sizeof(ScanStatus); ScanStatus *aNew; aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte); if( aNew ){ @@ -77823,9 +78383,9 @@ SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){ ** of a ReusableSpace object by the allocSpace() routine below. */ struct ReusableSpace { - u8 *pSpace; /* Available memory */ - int nFree; /* Bytes of available memory */ - int nNeeded; /* Total bytes that could not be allocated */ + u8 *pSpace; /* Available memory */ + sqlite3_int64 nFree; /* Bytes of available memory */ + sqlite3_int64 nNeeded; /* Total bytes that could not be allocated */ }; /* Try to allocate nByte bytes of 8-byte aligned bulk memory for pBuf @@ -77845,7 +78405,7 @@ struct ReusableSpace { static void *allocSpace( struct ReusableSpace *p, /* Bulk memory available for allocation */ void *pBuf, /* Pointer to a prior allocation */ - int nByte /* Bytes of memory needed */ + sqlite3_int64 nByte /* Bytes of memory needed */ ){ assert( EIGHT_BYTE_ALIGNMENT(p->pSpace) ); if( pBuf==0 ){ @@ -77978,19 +78538,27 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( ** the leftover memory at the end of the opcode array. This can significantly ** reduce the amount of memory held by a prepared statement. */ - do { - x.nNeeded = 0; - p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); - p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); - p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); - p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); + x.nNeeded = 0; + p->aMem = allocSpace(&x, 0, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, 0, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, 0, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, 0, nCursor*sizeof(VdbeCursor*)); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); + p->anExec = allocSpace(&x, 0, p->nOp*sizeof(i64)); #endif - if( x.nNeeded==0 ) break; + if( x.nNeeded ){ x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded); x.nFree = x.nNeeded; - }while( !db->mallocFailed ); + if( !db->mallocFailed ){ + p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); +#endif + } + } p->pVList = pParse->pVList; pParse->pVList = 0; @@ -78682,7 +79250,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ }else{ db->nDeferredCons = 0; db->nDeferredImmCons = 0; - db->flags &= ~SQLITE_DeferFKs; + db->flags &= ~(u64)SQLITE_DeferFKs; sqlite3CommitInternalChanges(db); } }else{ @@ -78997,6 +79565,13 @@ SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ sqlite3DbFree(db, p->zSql); #ifdef SQLITE_ENABLE_NORMALIZE sqlite3DbFree(db, p->zNormSql); + { + DblquoteStr *pThis, *pNext; + for(pThis=p->pDblStr; pThis; pThis=pNext){ + pNext = pThis->pNextStr; + sqlite3DbFree(db, pThis); + } + } #endif #ifdef SQLITE_ENABLE_STMT_SCANSTATUS { @@ -79537,7 +80112,7 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( UnpackedRecord *p /* Populate this structure before returning. */ ){ const unsigned char *aKey = (const unsigned char *)pKey; - int d; + u32 d; u32 idx; /* Offset in aKey[] to read from */ u16 u; /* Unsigned loop counter */ u32 szHdr; @@ -79548,7 +80123,7 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( idx = getVarint32(aKey, szHdr); d = szHdr; u = 0; - while( idx=p->nField ) break; } + if( d>(u32)nKey && u ){ + assert( CORRUPT_DB ); + /* In a corrupt record entry, the last pMem might have been set up using + ** uninitialized memory. Overwrite its value with NULL, to prevent + ** warnings from MSAN. */ + sqlite3VdbeMemSetNull(pMem-1); + } assert( u<=pKeyInfo->nKeyField + 1 ); p->nField = u; } @@ -79626,8 +80208,8 @@ static int vdbeRecordCompareDebug( ** Use that approximation to avoid the more expensive call to ** sqlite3VdbeSerialTypeLen() in the common case. */ - if( d1+serial_type1+2>(u32)nKey1 - && d1+sqlite3VdbeSerialTypeLen(serial_type1)>(u32)nKey1 + if( d1+(u64)serial_type1+2>(u64)nKey1 + && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)>(u64)nKey1 ){ break; } @@ -79638,7 +80220,8 @@ static int vdbeRecordCompareDebug( /* Do the comparison */ - rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], pKeyInfo->aColl[i]); + rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], + pKeyInfo->nAllField>i ? pKeyInfo->aColl[i] : 0); if( rc!=0 ){ assert( mem1.szMalloc==0 ); /* See comment below */ if( pKeyInfo->aSortOrder[i] ){ @@ -79994,12 +80577,12 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( }else{ idx1 = getVarint32(aKey1, szHdr1); d1 = szHdr1; - if( d1>(unsigned)nKey1 ){ - pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; - return 0; /* Corruption */ - } i = 0; } + if( d1>(unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField @@ -80069,10 +80652,12 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( mem1.n = (serial_type - 12) / 2; testcase( (d1+mem1.n)==(unsigned)nKey1 ); testcase( (d1+mem1.n+1)==(unsigned)nKey1 ); - if( (d1+mem1.n) > (unsigned)nKey1 ){ + if( (d1+mem1.n) > (unsigned)nKey1 + || (pKeyInfo = pPKey2->pKeyInfo)->nAllField<=i + ){ pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; return 0; /* Corruption */ - }else if( (pKeyInfo = pPKey2->pKeyInfo)->aColl[i] ){ + }else if( pKeyInfo->aColl[i] ){ mem1.enc = pKeyInfo->enc; mem1.db = pKeyInfo->db; mem1.flags = MEM_Str; @@ -80772,14 +81357,16 @@ static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ sqlite3_int64 iNow; sqlite3_int64 iElapse; assert( p->startTime>0 ); - assert( db->xProfile!=0 || (db->mTrace & SQLITE_TRACE_PROFILE)!=0 ); + assert( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 ); assert( db->init.busy==0 ); assert( p->zSql!=0 ); sqlite3OsCurrentTimeInt64(db->pVfs, &iNow); iElapse = (iNow - p->startTime)*1000000; +#ifndef SQLITE_OMIT_DEPRECATED if( db->xProfile ){ db->xProfile(db->pProfileArg, p->zSql, iElapse); } +#endif if( db->mTrace & SQLITE_TRACE_PROFILE ){ db->xTrace(SQLITE_TRACE_PROFILE, db->pTraceArg, p, (void*)&iElapse); } @@ -80983,6 +81570,11 @@ SQLITE_API int sqlite3_value_nochange(sqlite3_value *pVal){ return (pVal->flags&(MEM_Null|MEM_Zero))==(MEM_Null|MEM_Zero); } +/* Return true if a parameter value originated from an sqlite3_bind() */ +SQLITE_API int sqlite3_value_frombind(sqlite3_value *pVal){ + return (pVal->flags&MEM_FromBind)!=0; +} + /* Make a copy of an sqlite3_value object */ SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ @@ -81293,7 +81885,7 @@ static int sqlite3Step(Vdbe *p){ return SQLITE_NOMEM_BKPT; } - if( p->pc<=0 && p->expired ){ + if( p->pc<0 && p->expired ){ p->rc = SQLITE_SCHEMA; rc = SQLITE_ERROR; goto end_of_step; @@ -81312,7 +81904,7 @@ static int sqlite3Step(Vdbe *p){ ); #ifndef SQLITE_OMIT_TRACE - if( (db->xProfile || (db->mTrace & SQLITE_TRACE_PROFILE)!=0) + if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 && !db->init.busy && p->zSql ){ sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); }else{ @@ -81339,16 +81931,18 @@ static int sqlite3Step(Vdbe *p){ db->nVdbeExec--; } + if( rc!=SQLITE_ROW ){ #ifndef SQLITE_OMIT_TRACE - /* If the statement completed successfully, invoke the profile callback */ - if( rc!=SQLITE_ROW ) checkProfileCallback(db, p); + /* If the statement completed successfully, invoke the profile callback */ + checkProfileCallback(db, p); #endif - if( rc==SQLITE_DONE && db->autoCommit ){ - assert( p->rc==SQLITE_OK ); - p->rc = doWalCallbacks(db); - if( p->rc!=SQLITE_OK ){ - rc = SQLITE_ERROR; + if( rc==SQLITE_DONE && db->autoCommit ){ + assert( p->rc==SQLITE_OK ); + p->rc = doWalCallbacks(db); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + } } } @@ -81368,9 +81962,9 @@ end_of_step: || (rc&0xff)==SQLITE_BUSY || rc==SQLITE_MISUSE ); assert( (p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE) || p->rc==p->rcApp ); - if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 - && rc!=SQLITE_ROW - && rc!=SQLITE_DONE + if( rc!=SQLITE_ROW + && rc!=SQLITE_DONE + && (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ /* If this statement was prepared using saved SQL and an ** error has occurred, then return the error code in p->rc to the @@ -81826,10 +82420,10 @@ SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ ** or a constant) then useTypes 2, 3, and 4 return NULL. */ static const void *columnName( - sqlite3_stmt *pStmt, - int N, - const void *(*xFunc)(Mem*), - int useType + sqlite3_stmt *pStmt, /* The statement */ + int N, /* Which column to get the name for */ + int useUtf16, /* True to return the name as UTF16 */ + int useType /* What type of name */ ){ const void *ret; Vdbe *p; @@ -81850,8 +82444,15 @@ static const void *columnName( N += useType*n; sqlite3_mutex_enter(db->mutex); assert( db->mallocFailed==0 ); - ret = xFunc(&p->aColName[N]); - /* A malloc may have failed inside of the xFunc() call. If this +#ifndef SQLITE_OMIT_UTF16 + if( useUtf16 ){ + ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]); + }else +#endif + { + ret = sqlite3_value_text((sqlite3_value*)&p->aColName[N]); + } + /* A malloc may have failed inside of the _text() call. If this ** is the case, clear the mallocFailed flag and return NULL. */ if( db->mallocFailed ){ @@ -81868,13 +82469,11 @@ static const void *columnName( ** statement pStmt. */ SQLITE_API const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME); + return columnName(pStmt, N, 0, COLNAME_NAME); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME); + return columnName(pStmt, N, 1, COLNAME_NAME); } #endif @@ -81893,13 +82492,11 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ ** of the result set of SQL statement pStmt. */ SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE); + return columnName(pStmt, N, 0, COLNAME_DECLTYPE); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE); + return columnName(pStmt, N, 1, COLNAME_DECLTYPE); } #endif /* SQLITE_OMIT_UTF16 */ #endif /* SQLITE_OMIT_DECLTYPE */ @@ -81911,13 +82508,11 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ ** anything else which is not an unambiguous reference to a database column. */ SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE); + return columnName(pStmt, N, 0, COLNAME_DATABASE); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE); + return columnName(pStmt, N, 1, COLNAME_DATABASE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -81927,13 +82522,11 @@ SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N ** anything else which is not an unambiguous reference to a database column. */ SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE); + return columnName(pStmt, N, 0, COLNAME_TABLE); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE); + return columnName(pStmt, N, 1, COLNAME_TABLE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -81943,13 +82536,11 @@ SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ ** anything else which is not an unambiguous reference to a database column. */ SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN); + return columnName(pStmt, N, 0, COLNAME_COLUMN); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN); + return columnName(pStmt, N, 1, COLNAME_COLUMN); } #endif /* SQLITE_OMIT_UTF16 */ #endif /* SQLITE_ENABLE_COLUMN_METADATA */ @@ -81992,7 +82583,7 @@ static int vdbeUnbind(Vdbe *p, int i){ pVar = &p->aVar[i]; sqlite3VdbeMemRelease(pVar); pVar->flags = MEM_Null; - sqlite3Error(p->db, SQLITE_OK); + p->db->errCode = SQLITE_OK; /* If the bit corresponding to this variable in Vdbe.expmask is set, then ** binding a new value to this variable invalidates the current query plan. @@ -82317,6 +82908,14 @@ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){ return pStmt ? ((Vdbe*)pStmt)->readOnly : 1; } +/* +** Return 1 if the statement is an EXPLAIN and return 2 if the +** statement is an EXPLAIN QUERY PLAN +*/ +SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->explain : 0; +} + /* ** Return true if the prepared statement is in need of being reset. */ @@ -82418,7 +83017,13 @@ SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ */ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt){ Vdbe *p = (Vdbe *)pStmt; - return p ? p->zNormSql : 0; + if( p==0 ) return 0; + if( p->zNormSql==0 && ALWAYS(p->zSql!=0) ){ + sqlite3_mutex_enter(p->db->mutex); + p->zNormSql = sqlite3Normalize(p, p->zSql); + sqlite3_mutex_leave(p->db->mutex); + } + return p->zNormSql; } #endif /* SQLITE_ENABLE_NORMALIZE */ @@ -83000,12 +83605,20 @@ SQLITE_API int sqlite3_found_count = 0; ** feature is used for test suite validation only and does not appear an ** production builds. ** -** M is an integer between 2 and 4. 2 indicates a ordinary two-way -** branch (I=0 means fall through and I=1 means taken). 3 indicates -** a 3-way branch where the third way is when one of the operands is -** NULL. 4 indicates the OP_Jump instruction which has three destinations -** depending on whether the first operand is less than, equal to, or greater -** than the second. +** M is the type of branch. I is the direction taken for this instance of +** the branch. +** +** M: 2 - two-way branch (I=0: fall-thru 1: jump ) +** 3 - two-way + NULL (I=0: fall-thru 1: jump 2: NULL ) +** 4 - OP_Jump (I=0: jump p1 1: jump p2 2: jump p3) +** +** In other words, if M is 2, then I is either 0 (for fall-through) or +** 1 (for when the branch is taken). If M is 3, the I is 0 for an +** ordinary fall-through, I is 1 if the branch was taken, and I is 2 +** if the result of comparison is NULL. For M=3, I=2 the jump may or +** may not be taken, depending on the SQLITE_JUMPIFNULL flags in p5. +** When M is 4, that means that an OP_Jump is being run. I is 0, 1, or 2 +** depending on if the operands are less than, equal, or greater than. ** ** iSrcLine is the source code line (from the __LINE__ macro) that ** generated the VDBE instruction combined with flag bits. The source @@ -83016,9 +83629,9 @@ SQLITE_API int sqlite3_found_count = 0; ** alternate branch are never taken. If a branch is never taken then ** flags should be 0x06 since only the fall-through approach is allowed. ** -** Bit 0x04 of the flags indicates an OP_Jump opcode that is only +** Bit 0x08 of the flags indicates an OP_Jump opcode that is only ** interested in equal or not-equal. In other words, I==0 and I==2 -** should be treated the same. +** should be treated as equivalent ** ** Since only a line number is retained, not the filename, this macro ** only works for amalgamation builds. But that is ok, since these macros @@ -83042,6 +83655,18 @@ SQLITE_API int sqlite3_found_count = 0; mNever = iSrcLine >> 24; assert( (I & mNever)==0 ); if( sqlite3GlobalConfig.xVdbeBranch==0 ) return; /*NO_TEST*/ + /* Invoke the branch coverage callback with three arguments: + ** iSrcLine - the line number of the VdbeCoverage() macro, with + ** flags removed. + ** I - Mask of bits 0x07 indicating which cases are are + ** fulfilled by this instance of the jump. 0x01 means + ** fall-thru, 0x02 means taken, 0x04 means NULL. Any + ** impossible cases (ex: if the comparison is never NULL) + ** are filled in automatically so that the coverage + ** measurement logic does not flag those impossible cases + ** as missed coverage. + ** M - Type of jump. Same as M argument above + */ I |= mNever; if( M==2 ) I |= 0x04; if( M==4 ){ @@ -83118,6 +83743,11 @@ static VdbeCursor *allocateCursor( assert( iCur>=0 && iCurnCursor ); if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ + /* Before calling sqlite3VdbeFreeCursor(), ensure the isEphemeral flag + ** is clear. Otherwise, if this is an ephemeral cursor created by + ** OP_OpenDup, the cursor will not be closed and will still be part + ** of a BtShared.pCursor list. */ + p->apCsr[iCur]->isEphemeral = 0; sqlite3VdbeFreeCursor(p, p->apCsr[iCur]); p->apCsr[iCur] = 0; } @@ -83258,6 +83888,7 @@ SQLITE_PRIVATE void sqlite3ValueApplyAffinity( static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ assert( (pMem->flags & (MEM_Int|MEM_Real))==0 ); assert( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ); + ExpandBlob(pMem); if( sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc)==0 ){ return 0; } @@ -83583,6 +84214,15 @@ SQLITE_PRIVATE int sqlite3VdbeExec( assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */ sqlite3VdbeEnter(p); +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( db->xProgress ){ + u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; + assert( 0 < db->nProgressOps ); + nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); + }else{ + nProgressLimit = 0xffffffff; + } +#endif if( p->rc==SQLITE_NOMEM ){ /* This happens if a malloc() inside a call to sqlite3_column_text() or ** sqlite3_column_text16() failed. */ @@ -83596,15 +84236,6 @@ SQLITE_PRIVATE int sqlite3VdbeExec( db->busyHandler.nBusy = 0; if( db->u1.isInterrupted ) goto abort_due_to_interrupt; sqlite3VdbeIOTraceSql(p); -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - if( db->xProgress ){ - u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; - assert( 0 < db->nProgressOps ); - nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); - }else{ - nProgressLimit = 0xffffffff; - } -#endif #ifdef SQLITE_DEBUG sqlite3BeginBenignMalloc(); if( p->pc==0 @@ -83780,10 +84411,11 @@ check_for_interrupt: ** If the progress callback returns non-zero, exit the virtual machine with ** a return code SQLITE_ABORT. */ - if( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ assert( db->nProgressOps!=0 ); - nProgressLimit = nVmStep + db->nProgressOps - (nVmStep%db->nProgressOps); + nProgressLimit += db->nProgressOps; if( db->xProgress(db->pProgressArg) ){ + nProgressLimit = 0xffffffff; rc = SQLITE_INTERRUPT; goto abort_due_to_error; } @@ -84062,6 +84694,7 @@ case OP_String8: { /* same as TK_STRING, out2 */ if( encoding!=SQLITE_UTF8 ){ rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC); assert( rc==SQLITE_OK || rc==SQLITE_TOOBIG ); + if( rc ) goto too_big; if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem; assert( pOut->szMalloc>0 && pOut->zMalloc==pOut->z ); assert( VdbeMemDynamic(pOut)==0 ); @@ -84074,7 +84707,6 @@ case OP_String8: { /* same as TK_STRING, out2 */ pOp->p4.z = pOut->z; pOp->p1 = pOut->n; } - testcase( rc==SQLITE_TOOBIG ); #endif if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; @@ -84196,7 +84828,10 @@ case OP_Variable: { /* out2 */ goto too_big; } pOut = &aMem[pOp->p2]; - sqlite3VdbeMemShallowCopy(pOut, pVar, MEM_Static); + if( VdbeMemDynamic(pOut) ) sqlite3VdbeMemSetNull(pOut); + memcpy(pOut, pVar, MEMCELLSIZE); + pOut->flags &= ~(MEM_Dyn|MEM_Ephem); + pOut->flags |= MEM_Static|MEM_FromBind; UPDATE_MAX_BLOBSIZE(pOut); break; } @@ -84329,18 +84964,6 @@ case OP_ResultRow: { assert( pOp->p1>0 ); assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - /* Run the progress counter just before returning. - */ - if( db->xProgress!=0 - && nVmStep>=nProgressLimit - && db->xProgress(db->pProgressArg)!=0 - ){ - rc = SQLITE_INTERRUPT; - goto abort_due_to_error; - } -#endif - /* If this statement has violated immediate foreign key constraints, do ** not return the number of rows modified. And do not RELEASE the statement ** transaction. It needs to be rolled back. */ @@ -84545,8 +85168,8 @@ fp_math: break; } default: { - iA = (i64)rA; - iB = (i64)rB; + iA = sqlite3VdbeIntValue(pIn1); + iB = sqlite3VdbeIntValue(pIn2); if( iA==0 ) goto arithmetic_result_is_null; if( iA==-1 ) iA = 1; rB = (double)(iB % iA); @@ -84706,8 +85329,8 @@ case OP_MustBeInt: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; if( (pIn1->flags & MEM_Int)==0 ){ applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding); - VdbeBranchTaken((pIn1->flags&MEM_Int)==0, 2); if( (pIn1->flags & MEM_Int)==0 ){ + VdbeBranchTaken(1, 2); if( pOp->p2==0 ){ rc = SQLITE_MISMATCH; goto abort_due_to_error; @@ -84716,6 +85339,7 @@ case OP_MustBeInt: { /* jump, in1 */ } } } + VdbeBranchTaken(0, 2); MemSetTypeFlag(pIn1, MEM_Int); break; } @@ -84890,15 +85514,15 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ ** OP_Eq or OP_Ne) then take the jump or not depending on whether ** or not both operands are null. */ - assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne ); assert( (flags1 & MEM_Cleared)==0 ); - assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 ); + assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 || CORRUPT_DB ); + testcase( (pOp->p5 & SQLITE_JUMPIFNULL)!=0 ); if( (flags1&flags3&MEM_Null)!=0 && (flags3&MEM_Cleared)==0 ){ res = 0; /* Operands are equal */ }else{ - res = 1; /* Operands are not equal */ + res = ((flags3 & MEM_Null) ? -1 : +1); /* Operands are not equal */ } }else{ /* SQLITE_NULLEQ is clear and at least one operand is NULL, @@ -85016,7 +85640,7 @@ compare_op: pOut->u.i = res2; REGISTER_TRACE(pOp->p2, pOut); }else{ - VdbeBranchTaken(res!=0, (pOp->p5 & SQLITE_NULLEQ)?2:3); + VdbeBranchTaken(res2!=0, (pOp->p5 & SQLITE_NULLEQ)?2:3); if( res2 ){ goto jump_to_p2; } @@ -85566,15 +86190,15 @@ case OP_Column: { zEndHdr = zData + aOffset[0]; testcase( zHdr>=zEndHdr ); do{ - if( (t = zHdr[0])<0x80 ){ + if( (pC->aType[i] = t = zHdr[0])<0x80 ){ zHdr++; offset64 += sqlite3VdbeOneByteSerialTypeLen(t); }else{ zHdr += sqlite3GetVarint32(zHdr, &t); + pC->aType[i] = t; offset64 += sqlite3VdbeSerialTypeLen(t); } - pC->aType[i++] = t; - aOffset[i] = (u32)(offset64 & 0xffffffff); + aOffset[++i] = (u32)(offset64 & 0xffffffff); }while( i<=p2 && zHdrisEphemeral = 1; pCx->pKeyInfo = pOrig->pKeyInfo; pCx->isTable = pOrig->isTable; - rc = sqlite3BtreeCursor(pOrig->pBtx, MASTER_ROOT, BTREE_WRCSR, + pCx->pgnoRoot = pOrig->pgnoRoot; + pCx->isOrdered = pOrig->isOrdered; + rc = sqlite3BtreeCursor(pOrig->pBtx, pCx->pgnoRoot, BTREE_WRCSR, pCx->pKeyInfo, pCx->uc.pCursor); /* The sqlite3BtreeCursor() routine can only fail for the first cursor ** opened for a database. Since there is already an open cursor when this @@ -86594,6 +87220,9 @@ case OP_OpenDup: { ** the main database is read-only. The ephemeral ** table is deleted automatically when the cursor is closed. ** +** If the cursor P1 is already opened on an ephemeral table, the table +** is cleared (all content is erased). +** ** P2 is the number of columns in the ephemeral table. ** The cursor points to a BTree table if P4==0 and to a BTree index ** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure @@ -86625,41 +87254,50 @@ case OP_OpenEphemeral: { SQLITE_OPEN_TRANSIENT_DB; assert( pOp->p1>=0 ); assert( pOp->p2>=0 ); - pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); - if( pCx==0 ) goto no_mem; - pCx->nullRow = 1; - pCx->isEphemeral = 1; - rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, - BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); - if( rc==SQLITE_OK ){ - rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0); - } - if( rc==SQLITE_OK ){ - /* If a transient index is required, create it by calling - ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before - ** opening it. If a transient table is required, just use the - ** automatically created table with root-page 1 (an BLOB_INTKEY table). - */ - if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ - int pgno; - assert( pOp->p4type==P4_KEYINFO ); - rc = sqlite3BtreeCreateTable(pCx->pBtx, &pgno, BTREE_BLOBKEY | pOp->p5); - if( rc==SQLITE_OK ){ - assert( pgno==MASTER_ROOT+1 ); - assert( pKeyInfo->db==db ); - assert( pKeyInfo->enc==ENC(db) ); - rc = sqlite3BtreeCursor(pCx->pBtx, pgno, BTREE_WRCSR, - pKeyInfo, pCx->uc.pCursor); - } - pCx->isTable = 0; - }else{ - rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, - 0, pCx->uc.pCursor); - pCx->isTable = 1; + pCx = p->apCsr[pOp->p1]; + if( pCx ){ + /* If the ephermeral table is already open, erase all existing content + ** so that the table is empty again, rather than creating a new table. */ + rc = sqlite3BtreeClearTable(pCx->pBtx, pCx->pgnoRoot, 0); + }else{ + pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); + if( pCx==0 ) goto no_mem; + pCx->nullRow = 1; + pCx->isEphemeral = 1; + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, + BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, + vfsFlags); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0); } + if( rc==SQLITE_OK ){ + /* If a transient index is required, create it by calling + ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before + ** opening it. If a transient table is required, just use the + ** automatically created table with root-page 1 (an BLOB_INTKEY table). + */ + if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ + assert( pOp->p4type==P4_KEYINFO ); + rc = sqlite3BtreeCreateTable(pCx->pBtx, (int*)&pCx->pgnoRoot, + BTREE_BLOBKEY | pOp->p5); + if( rc==SQLITE_OK ){ + assert( pCx->pgnoRoot==MASTER_ROOT+1 ); + assert( pKeyInfo->db==db ); + assert( pKeyInfo->enc==ENC(db) ); + rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR, + pKeyInfo, pCx->uc.pCursor); + } + pCx->isTable = 0; + }else{ + pCx->pgnoRoot = MASTER_ROOT; + rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, + 0, pCx->uc.pCursor); + pCx->isTable = 1; + } + } + pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); } if( rc ) goto abort_due_to_error; - pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); break; } @@ -87309,7 +87947,7 @@ case OP_NotExists: /* jump, in3 */ pC = p->apCsr[pOp->p1]; assert( pC!=0 ); #ifdef SQLITE_DEBUG - pC->seekOp = OP_SeekRowid; + if( pOp->opcode==OP_SeekRowid ) pC->seekOp = OP_SeekRowid; #endif assert( pC->isTable ); assert( pC->eCurType==CURTYPE_BTREE ); @@ -87527,14 +88165,7 @@ case OP_NewRowid: { /* out2 */ ** This instruction only works on tables. The equivalent instruction ** for indices is OP_IdxInsert. */ -/* Opcode: InsertInt P1 P2 P3 P4 P5 -** Synopsis: intkey=P3 data=r[P2] -** -** This works exactly like OP_Insert except that the key is the -** integer value P3, not the value of the integer stored in register P3. -*/ -case OP_Insert: -case OP_InsertInt: { +case OP_Insert: { Mem *pData; /* MEM cell holding data for the record to be inserted */ Mem *pKey; /* MEM cell holding key for the record */ VdbeCursor *pC; /* Cursor to table into which insert is written */ @@ -87555,16 +88186,11 @@ case OP_InsertInt: { REGISTER_TRACE(pOp->p2, pData); sqlite3VdbeIncrWriteCounter(p, pC); - if( pOp->opcode==OP_Insert ){ - pKey = &aMem[pOp->p3]; - assert( pKey->flags & MEM_Int ); - assert( memIsValid(pKey) ); - REGISTER_TRACE(pOp->p3, pKey); - x.nKey = pKey->u.i; - }else{ - assert( pOp->opcode==OP_InsertInt ); - x.nKey = pOp->p3; - } + pKey = &aMem[pOp->p3]; + assert( pKey->flags & MEM_Int ); + assert( memIsValid(pKey) ); + REGISTER_TRACE(pOp->p3, pKey); + x.nKey = pKey->u.i; if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ assert( pC->iDb>=0 ); @@ -88084,7 +88710,7 @@ case OP_Sort: { /* jump */ p->aCounter[SQLITE_STMTSTATUS_SORT]++; /* Fall through into OP_Rewind */ } -/* Opcode: Rewind P1 P2 * * P5 +/* Opcode: Rewind P1 P2 * * * ** ** The next use of the Rowid or Column or Next instruction for P1 ** will refer to the first entry in the database table or index. @@ -88092,10 +88718,6 @@ case OP_Sort: { /* jump */ ** If the table or index is not empty, fall through to the following ** instruction. ** -** If P5 is non-zero and the table is not empty, then the "skip-next" -** flag is set on the cursor so that the next OP_Next instruction -** executed on it is a no-op. -** ** This opcode leaves the cursor configured to move in forward order, ** from the beginning toward the end. In other words, the cursor is ** configured to use Next, not Prev. @@ -88106,6 +88728,7 @@ case OP_Rewind: { /* jump */ int res; assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5==0 ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( isSorter(pC)==(pOp->opcode==OP_SorterSort) ); @@ -88120,9 +88743,6 @@ case OP_Rewind: { /* jump */ pCrsr = pC->uc.pCursor; assert( pCrsr ); rc = sqlite3BtreeFirst(pCrsr, &res); -#ifndef SQLITE_OMIT_WINDOWFUNC - if( pOp->p5 ) sqlite3BtreeSkipNext(pCrsr); -#endif pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; } @@ -88217,7 +88837,7 @@ case OP_Next: /* jump */ assert( pOp->opcode!=OP_Next || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found - || pC->seekOp==OP_NullRow); + || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid); assert( pOp->opcode!=OP_Prev || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE || pC->seekOp==OP_Last @@ -88747,9 +89367,16 @@ case OP_ParseSchema: { assert( db->init.busy==0 ); db->init.busy = 1; initData.rc = SQLITE_OK; + initData.nInitRow = 0; assert( !db->mallocFailed ); rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); if( rc==SQLITE_OK ) rc = initData.rc; + if( rc==SQLITE_OK && initData.nInitRow==0 ){ + /* The OP_ParseSchema opcode with a non-NULL P4 argument should parse + ** at least one SQL statement. Any less than that indicates that + ** the sqlite_master table is corrupt. */ + rc = SQLITE_CORRUPT_BKPT; + } sqlite3DbFreeNN(db, zSql); db->init.busy = 0; } @@ -89112,10 +89739,20 @@ case OP_Program: { /* jump */ p->nOp = pProgram->nOp; #ifdef SQLITE_ENABLE_STMT_SCANSTATUS p->anExec = 0; +#endif +#ifdef SQLITE_DEBUG + /* Verify that second and subsequent executions of the same trigger do not + ** try to reuse register values from the first use. */ + { + int i; + for(i=0; inMem; i++){ + aMem[i].pScopyFrom = 0; /* Prevent false-positive AboutToChange() errs */ + aMem[i].flags |= MEM_Undefined; /* Cause a fault if this reg is reused */ + } + } #endif pOp = &aOp[-1]; - - break; + goto check_for_interrupt; } /* Opcode: Param P1 P2 * * * @@ -89487,6 +90124,7 @@ case OP_AggFinal: { assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); #ifndef SQLITE_OMIT_WINDOWFUNC if( pOp->p3 ){ + memAboutToChange(p, &aMem[pOp->p3]); rc = sqlite3VdbeMemAggValue(pMem, &aMem[pOp->p3], pOp->p4.pFunc); pMem = &aMem[pOp->p3]; }else @@ -89651,14 +90289,19 @@ case OP_JournalMode: { /* out2 */ #endif /* SQLITE_OMIT_PRAGMA */ #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) -/* Opcode: Vacuum P1 * * * * +/* Opcode: Vacuum P1 P2 * * * ** ** Vacuum the entire database P1. P1 is 0 for "main", and 2 or more ** for an attached database. The "temp" database may not be vacuumed. +** +** If P2 is not zero, then it is a register holding a string which is +** the file into which the result of vacuum should be written. When +** P2 is zero, the vacuum overwrites the original database. */ case OP_Vacuum: { assert( p->readOnly==0 ); - rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1); + rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1, + pOp->p2 ? &aMem[pOp->p2] : 0); if( rc ) goto abort_due_to_error; break; } @@ -89810,6 +90453,7 @@ case OP_VDestroy: { db->nVDestroy++; rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z); db->nVDestroy--; + assert( p->errorAction==OE_Abort && p->usesStmtJournal ); if( rc ) goto abort_due_to_error; break; } @@ -90053,7 +90697,7 @@ case OP_VRename: { rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); if( rc ) goto abort_due_to_error; rc = pVtab->pModule->xRename(pVtab, pName->z); - if( isLegacy==0 ) db->flags &= ~SQLITE_LegacyAlter; + if( isLegacy==0 ) db->flags &= ~(u64)SQLITE_LegacyAlter; sqlite3VtabImportErrmsg(p, pVtab); p->expired = 0; if( rc ) goto abort_due_to_error; @@ -90518,7 +91162,16 @@ abort_due_to_error: ** release the mutexes on btrees that were acquired at the ** top. */ vdbe_return: - testcase( nVmStep>0 ); +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + nProgressLimit += db->nProgressOps; + if( db->xProgress(db->pProgressArg) ){ + nProgressLimit = 0xffffffff; + rc = SQLITE_INTERRUPT; + goto abort_due_to_error; + } + } +#endif p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep; sqlite3VdbeLeave(p); assert( rc!=SQLITE_OK || nExtraDelete==0 @@ -91605,7 +92258,7 @@ static int vdbePmaReadBlob( /* Extend the p->aAlloc[] allocation if required. */ if( p->nAllocnAlloc*2); + sqlite3_int64 nNew = MAX(128, 2*(sqlite3_int64)p->nAlloc); while( nByte>nNew ) nNew = nNew*2; aNew = sqlite3Realloc(p->aAlloc, nNew); if( !aNew ) return SQLITE_NOMEM_BKPT; @@ -92896,15 +93549,19 @@ SQLITE_PRIVATE int sqlite3VdbeSorterWrite( if( nMin>pSorter->nMemory ){ u8 *aNew; - int iListOff = (u8*)pSorter->list.pList - pSorter->list.aMemory; - int nNew = pSorter->nMemory * 2; + sqlite3_int64 nNew = 2 * (sqlite3_int64)pSorter->nMemory; + int iListOff = -1; + if( pSorter->list.pList ){ + iListOff = (u8*)pSorter->list.pList - pSorter->list.aMemory; + } while( nNew < nMin ) nNew = nNew*2; if( nNew > pSorter->mxPmaSize ) nNew = pSorter->mxPmaSize; if( nNew < nMin ) nNew = nMin; - aNew = sqlite3Realloc(pSorter->list.aMemory, nNew); if( !aNew ) return SQLITE_NOMEM_BKPT; - pSorter->list.pList = (SorterRecord*)&aNew[iListOff]; + if( iListOff>=0 ){ + pSorter->list.pList = (SorterRecord*)&aNew[iListOff]; + } pSorter->list.aMemory = aNew; pSorter->nMemory = nNew; } @@ -94280,6 +94937,22 @@ SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){ /* #include */ +#if !defined(SQLITE_OMIT_WINDOWFUNC) +/* +** Walk all expressions linked into the list of Window objects passed +** as the second argument. +*/ +static int walkWindowList(Walker *pWalker, Window *pList){ + Window *pWin; + for(pWin=pList; pWin; pWin=pWin->pNextWin){ + if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; + if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; + } + return WRC_Continue; +} +#endif + /* ** Walk an expression tree. Invoke the callback once for each node ** of the expression, while descending. (In other words, the callback @@ -94319,10 +94992,7 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ } #ifndef SQLITE_OMIT_WINDOWFUNC if( ExprHasProperty(pExpr, EP_WinFunc) ){ - Window *pWin = pExpr->y.pWin; - if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; - if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; - if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; + if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; } #endif } @@ -94362,6 +95032,16 @@ SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; +#if !defined(SQLITE_OMIT_WINDOWFUNC) && !defined(SQLITE_OMIT_ALTERTABLE) + { + Parse *pParse = pWalker->pParse; + if( pParse && IN_RENAME_OBJECT ){ + int rc = walkWindowList(pWalker, p->pWinDefn); + assert( rc==WRC_Continue ); + return rc; + } + } +#endif return WRC_Continue; } @@ -94513,7 +95193,6 @@ static void resolveAlias( if( pExpr->op==TK_COLLATE ){ pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); } - ExprSetProperty(pDup, EP_Alias); /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This ** prevents ExprDelete() from deleting the Expr structure itself, @@ -94869,6 +95548,10 @@ static int lookupName( sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); return WRC_Abort; } + if( (pNC->ncFlags&NC_AllowWin)==0 && ExprHasProperty(pOrig, EP_Win) ){ + sqlite3ErrorMsg(pParse, "misuse of aliased window function %s",zAs); + return WRC_Abort; + } if( sqlite3ExprVectorSize(pOrig)!=1 ){ sqlite3ErrorMsg(pParse, "row value misused"); return WRC_Abort; @@ -94907,6 +95590,25 @@ static int lookupName( if( cnt==0 && zTab==0 ){ assert( pExpr->op==TK_ID ); if( ExprHasProperty(pExpr,EP_DblQuoted) ){ + /* If a double-quoted identifier does not match any known column name, + ** then treat it as a string. + ** + ** This hack was added in the early days of SQLite in a misguided attempt + ** to be compatible with MySQL 3.x, which used double-quotes for strings. + ** I now sorely regret putting in this hack. The effect of this hack is + ** that misspelled identifier names are silently converted into strings + ** rather than causing an error, to the frustration of countless + ** programmers. To all those frustrated programmers, my apologies. + ** + ** Someday, I hope to get rid of this hack. Unfortunately there is + ** a huge amount of legacy SQL that uses it. So for now, we just + ** issue a warning. + */ + sqlite3_log(SQLITE_WARNING, + "double-quoted string literal: \"%w\"", zCol); +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3VdbeAddDblquoteStr(db, pParse->pVdbe, zCol); +#endif pExpr->op = TK_STRING; pExpr->y.pTab = 0; return WRC_Prune; @@ -95140,6 +95842,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ const char *zId; /* The function name. */ FuncDef *pDef; /* Information about the function */ u8 enc = ENC(pParse->db); /* The database encoding */ + int savedAllowFlags = (pNC->ncFlags & (NC_AllowAgg | NC_AllowWin)); assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); zId = pExpr->u.zToken; @@ -95261,8 +95964,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pNC->nErr++; } if( is_agg ){ + /* Window functions may not be arguments of aggregate functions. + ** Or arguments of other window functions. But aggregate functions + ** may be arguments for window functions. */ #ifndef SQLITE_OMIT_WINDOWFUNC - pNC->ncFlags &= ~(pExpr->y.pWin ? NC_AllowWin : NC_AllowAgg); + pNC->ncFlags &= ~(NC_AllowWin | (!pExpr->y.pWin ? NC_AllowAgg : 0)); #else pNC->ncFlags &= ~NC_AllowAgg; #endif @@ -95273,17 +95979,17 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #ifndef SQLITE_OMIT_WINDOWFUNC if( pExpr->y.pWin ){ Select *pSel = pNC->pWinSelect; + sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef); sqlite3WalkExprList(pWalker, pExpr->y.pWin->pPartition); sqlite3WalkExprList(pWalker, pExpr->y.pWin->pOrderBy); sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); - sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef); if( 0==pSel->pWin || 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->y.pWin) ){ pExpr->y.pWin->pNextWin = pSel->pWin; pSel->pWin = pExpr->y.pWin; } - pNC->ncFlags |= NC_AllowWin; + pNC->ncFlags |= NC_HasWin; }else #endif /* SQLITE_OMIT_WINDOWFUNC */ { @@ -95301,8 +96007,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX); } - pNC->ncFlags |= NC_AllowAgg; } + pNC->ncFlags |= savedAllowFlags; } /* FIX ME: Compute pExpr->affinity based on the expected return ** type of the function @@ -95553,32 +96259,53 @@ static int resolveCompoundOrderBy( }else{ iCol = resolveAsName(pParse, pEList, pE); if( iCol==0 ){ - pDup = sqlite3ExprDup(db, pE, 0); + /* Now test if expression pE matches one of the values returned + ** by pSelect. In the usual case this is done by duplicating the + ** expression, resolving any symbols in it, and then comparing + ** it against each expression returned by the SELECT statement. + ** Once the comparisons are finished, the duplicate expression + ** is deleted. + ** + ** Or, if this is running as part of an ALTER TABLE operation, + ** resolve the symbols in the actual expression, not a duplicate. + ** And, if one of the comparisons is successful, leave the expression + ** as is instead of transforming it to an integer as in the usual + ** case. This allows the code in alter.c to modify column + ** refererences within the ORDER BY expression as required. */ + if( IN_RENAME_OBJECT ){ + pDup = pE; + }else{ + pDup = sqlite3ExprDup(db, pE, 0); + } if( !db->mallocFailed ){ assert(pDup); iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); } - sqlite3ExprDelete(db, pDup); + if( !IN_RENAME_OBJECT ){ + sqlite3ExprDelete(db, pDup); + } } } if( iCol>0 ){ /* Convert the ORDER BY term into an integer column number iCol, ** taking care to preserve the COLLATE clause if it exists */ - Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); - if( pNew==0 ) return 1; - pNew->flags |= EP_IntValue; - pNew->u.iValue = iCol; - if( pItem->pExpr==pE ){ - pItem->pExpr = pNew; - }else{ - Expr *pParent = pItem->pExpr; - assert( pParent->op==TK_COLLATE ); - while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; - assert( pParent->pLeft==pE ); - pParent->pLeft = pNew; + if( !IN_RENAME_OBJECT ){ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return 1; + pNew->flags |= EP_IntValue; + pNew->u.iValue = iCol; + if( pItem->pExpr==pE ){ + pItem->pExpr = pNew; + }else{ + Expr *pParent = pItem->pExpr; + assert( pParent->op==TK_COLLATE ); + while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; + assert( pParent->pLeft==pE ); + pParent->pLeft = pNew; + } + sqlite3ExprDelete(db, pE); + pItem->u.x.iOrderByCol = (u16)iCol; } - sqlite3ExprDelete(db, pE); - pItem->u.x.iOrderByCol = (u16)iCol; pItem->done = 1; }else{ moreToDo = 1; @@ -95637,6 +96364,38 @@ SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy( return 0; } +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Walker callback for resolveRemoveWindows(). +*/ +static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window **pp; + for(pp=&pWalker->u.pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ + if( *pp==pExpr->y.pWin ){ + *pp = (*pp)->pNextWin; + break; + } + } + } + return WRC_Continue; +} + +/* +** Remove any Window objects owned by the expression pExpr from the +** Select.pWin list of Select object pSelect. +*/ +static void resolveRemoveWindows(Select *pSelect, Expr *pExpr){ + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.xExprCallback = resolveRemoveWindowsCb; + sWalker.u.pSelect = pSelect; + sqlite3WalkExpr(&sWalker, pExpr); +} +#else +# define resolveRemoveWindows(x,y) +#endif + /* ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. ** The Name context of the SELECT statement is pNC. zType is either @@ -95703,19 +96462,10 @@ static int resolveOrderGroupBy( } for(j=0; jpEList->nExpr; j++){ if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ -#ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(pE, EP_WinFunc) ){ - /* Since this window function is being changed into a reference - ** to the same window function the result set, remove the instance - ** of this window function from the Select.pWin list. */ - Window **pp; - for(pp=&pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ - if( *pp==pE->y.pWin ){ - *pp = (*pp)->pNextWin; - } - } - } -#endif + /* Since this expresion is being changed into a reference + ** to an identical expression in the result set, remove all Window + ** objects belonging to the expression from the Select.pWin list. */ + resolveRemoveWindows(pSelect, pE); pItem->u.x.iOrderByCol = j+1; } } @@ -95795,7 +96545,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ */ for(i=0; ipSrc->nSrc; i++){ struct SrcList_item *pItem = &p->pSrc->a[i]; - if( pItem->pSelect ){ + if( pItem->pSelect && (pItem->pSelect->selFlags & SF_Resolved)==0 ){ NameContext *pNC; /* Used to iterate name contexts */ int nRef = 0; /* Refcount for pOuterNC and outer contexts */ const char *zSavedContext = pParse->zAuthContext; @@ -95927,6 +96677,19 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( IN_RENAME_OBJECT ){ + Window *pWin; + for(pWin=p->pWinDefn; pWin; pWin=pWin->pNextWin){ + if( sqlite3ResolveExprListNames(&sNC, pWin->pOrderBy) + || sqlite3ResolveExprListNames(&sNC, pWin->pPartition) + ){ + return WRC_Abort; + } + } + } +#endif + /* If this is part of a compound SELECT, check that it has the right ** number of expressions in the select list. */ if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ @@ -96006,8 +96769,8 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames( Walker w; if( pExpr==0 ) return SQLITE_OK; - savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg); - pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg); + savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); w.pParse = pNC->pParse; w.xExprCallback = resolveExprStep; w.xSelectCallback = resolveSelectStep; @@ -96023,9 +96786,11 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames( #if SQLITE_MAX_EXPR_DEPTH>0 w.pParse->nHeight -= pExpr->nHeight; #endif - if( pNC->ncFlags & NC_HasAgg ){ - ExprSetProperty(pExpr, EP_Agg); - } + assert( EP_Agg==NC_HasAgg ); + assert( EP_Win==NC_HasWin ); + testcase( pNC->ncFlags & NC_HasAgg ); + testcase( pNC->ncFlags & NC_HasWin ); + ExprSetProperty(pExpr, pNC->ncFlags & (NC_HasAgg|NC_HasWin) ); pNC->ncFlags |= savedHasAgg; return pNC->nErr>0 || w.pParse->nErr>0; } @@ -96077,38 +96842,47 @@ SQLITE_PRIVATE void sqlite3ResolveSelectNames( } /* -** Resolve names in expressions that can only reference a single table: +** Resolve names in expressions that can only reference a single table +** or which cannot reference any tables at all. Examples: ** -** * CHECK constraints -** * WHERE clauses on partial indices +** (1) CHECK constraints +** (2) WHERE clauses on partial indices +** (3) Expressions in indexes on expressions +** (4) Expression arguments to VACUUM INTO. ** -** The Expr.iTable value for Expr.op==TK_COLUMN nodes of the expression -** is set to -1 and the Expr.iColumn value is set to the column number. +** In all cases except (4), the Expr.iTable value for Expr.op==TK_COLUMN +** nodes of the expression is set to -1 and the Expr.iColumn value is +** set to the column number. In case (4), TK_COLUMN nodes cause an error. ** ** Any errors cause an error message to be set in pParse. */ -SQLITE_PRIVATE void sqlite3ResolveSelfReference( +SQLITE_PRIVATE int sqlite3ResolveSelfReference( Parse *pParse, /* Parsing context */ - Table *pTab, /* The table being referenced */ - int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr */ + Table *pTab, /* The table being referenced, or NULL */ + int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr, or 0 */ Expr *pExpr, /* Expression to resolve. May be NULL. */ ExprList *pList /* Expression list to resolve. May be NULL. */ ){ SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ NameContext sNC; /* Name context for pParse->pNewTable */ + int rc; - assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr ); + assert( type==0 || pTab!=0 ); + assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr || pTab==0 ); memset(&sNC, 0, sizeof(sNC)); memset(&sSrc, 0, sizeof(sSrc)); - sSrc.nSrc = 1; - sSrc.a[0].zName = pTab->zName; - sSrc.a[0].pTab = pTab; - sSrc.a[0].iCursor = -1; + if( pTab ){ + sSrc.nSrc = 1; + sSrc.a[0].zName = pTab->zName; + sSrc.a[0].pTab = pTab; + sSrc.a[0].iCursor = -1; + } sNC.pParse = pParse; sNC.pSrcList = &sSrc; sNC.ncFlags = type; - if( sqlite3ResolveExprNames(&sNC, pExpr) ) return; - if( pList ) sqlite3ResolveExprListNames(&sNC, pList); + if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; + if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList); + return rc; } /************** End of resolve.c *********************************************/ @@ -96256,8 +97030,8 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ while( p ){ int op = p->op; if( p->flags & EP_Generic ) break; - if( (op==TK_AGG_COLUMN || op==TK_COLUMN - || op==TK_REGISTER || op==TK_TRIGGER) + if( op==TK_REGISTER ) op = p->op2; + if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER) && p->y.pTab!=0 ){ /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally @@ -96273,7 +97047,7 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ p = p->pLeft; continue; } - if( op==TK_COLLATE || (op==TK_REGISTER && p->op2==TK_COLLATE) ){ + if( op==TK_COLLATE ){ pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); break; } @@ -96580,6 +97354,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprForVectorField( }else{ if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; pRet = sqlite3ExprDup(pParse->db, pVector, 0); + sqlite3RenameTokenRemap(pParse, pRet, pVector); } return pRet; } @@ -96596,7 +97371,7 @@ static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ int reg = 0; #ifndef SQLITE_OMIT_SUBQUERY if( pExpr->op==TK_SELECT ){ - reg = sqlite3CodeSubselect(pParse, pExpr, 0, 0); + reg = sqlite3CodeSubselect(pParse, pExpr); } #endif return reg; @@ -96668,7 +97443,7 @@ static void codeVectorCompare( int regLeft = 0; int regRight = 0; u8 opx = op; - int addrDone = sqlite3VdbeMakeLabel(v); + int addrDone = sqlite3VdbeMakeLabel(pParse); if( nLeft!=sqlite3ExprVectorSize(pRight) ){ sqlite3ErrorMsg(pParse, "row value misused"); @@ -96895,8 +97670,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprAlloc( if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n); pNew->u.zToken[pToken->n] = 0; if( dequote && sqlite3Isquote(pNew->u.zToken[0]) ){ - if( pNew->u.zToken[0]=='"' ) pNew->flags |= EP_DblQuoted; - sqlite3Dequote(pNew->u.zToken); + sqlite3DequoteExpr(pNew); } } } @@ -96965,14 +97739,14 @@ SQLITE_PRIVATE Expr *sqlite3PExpr( Expr *pRight /* Right operand */ ){ Expr *p; - if( op==TK_AND && pParse->nErr==0 ){ + if( op==TK_AND && pParse->nErr==0 && !IN_RENAME_OBJECT ){ /* Take advantage of short-circuit false optimization for AND */ p = sqlite3ExprAnd(pParse->db, pLeft, pRight); }else{ p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)); if( p ){ memset(p, 0, sizeof(Expr)); - p->op = op & TKFLG_MASK; + p->op = op & 0xff; p->iAgg = -1; } sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); @@ -97214,6 +97988,16 @@ static int exprStructSize(Expr *p){ return EXPR_FULLSIZE; } +/* +** Copy the complete content of an Expr node, taking care not to read +** past the end of the structure for a reduced-size version of the source +** Expr. +*/ +static void exprNodeCopy(Expr *pDest, Expr *pSrc){ + memset(pDest, 0, sizeof(Expr)); + memcpy(pDest, pSrc, exprStructSize(pSrc)); +} + /* ** The dupedExpr*Size() routines each return the number of bytes required ** to store a copy of an expression or expression tree. They differ in @@ -97427,7 +98211,7 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ static With *withDup(sqlite3 *db, With *p){ With *pRet = 0; if( p ){ - int nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1); + sqlite3_int64 nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1); pRet = sqlite3DbMallocZero(db, nByte); if( pRet ){ int i; @@ -97445,6 +98229,36 @@ static With *withDup(sqlite3 *db, With *p){ # define withDup(x,y) 0 #endif +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** The gatherSelectWindows() procedure and its helper routine +** gatherSelectWindowsCallback() are used to scan all the expressions +** an a newly duplicated SELECT statement and gather all of the Window +** objects found there, assembling them onto the linked list at Select->pWin. +*/ +static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_FUNCTION && pExpr->y.pWin!=0 ){ + assert( ExprHasProperty(pExpr, EP_WinFunc) ); + pExpr->y.pWin->pNextWin = pWalker->u.pSelect->pWin; + pWalker->u.pSelect->pWin = pExpr->y.pWin; + } + return WRC_Continue; +} +static int gatherSelectWindowsSelectCallback(Walker *pWalker, Select *p){ + return p==pWalker->u.pSelect ? WRC_Continue : WRC_Prune; +} +static void gatherSelectWindows(Select *p){ + Walker w; + w.xExprCallback = gatherSelectWindowsCallback; + w.xSelectCallback = gatherSelectWindowsSelectCallback; + w.xSelectCallback2 = 0; + w.pParse = 0; + w.u.pSelect = p; + sqlite3WalkSelect(&w, p); +} +#endif + + /* ** The following group of routines make deep copies of expressions, ** expression lists, ID lists, and select statements. The copies can @@ -97612,6 +98426,7 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ #ifndef SQLITE_OMIT_WINDOWFUNC pNew->pWin = 0; pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); + if( p->pWin ) gatherSelectWindows(pNew); #endif pNew->selId = p->selId; *pp = pNew; @@ -97661,7 +98476,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppend( }else if( (pList->nExpr & (pList->nExpr-1))==0 ){ ExprList *pNew; pNew = sqlite3DbRealloc(db, pList, - sizeof(*pList)+(2*pList->nExpr - 1)*sizeof(pList->a[0])); + sizeof(*pList)+(2*(sqlite3_int64)pList->nExpr-1)*sizeof(pList->a[0])); if( pNew==0 ){ goto no_mem; } @@ -97744,6 +98559,9 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( } vector_append_error: + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, pExpr); + } sqlite3ExprDelete(db, pExpr); sqlite3IdListDelete(db, pColumns); return pList; @@ -97887,8 +98705,9 @@ SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){ */ SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){ assert( pExpr->op==TK_ID || pExpr->op==TK_STRING ); - if( sqlite3StrICmp(pExpr->u.zToken, "true")==0 - || sqlite3StrICmp(pExpr->u.zToken, "false")==0 + if( !ExprHasProperty(pExpr, EP_Quoted) + && (sqlite3StrICmp(pExpr->u.zToken, "true")==0 + || sqlite3StrICmp(pExpr->u.zToken, "false")==0) ){ pExpr->op = TK_TRUEFALSE; return 1; @@ -98197,7 +99016,9 @@ SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){ */ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ u8 op; - while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + p = p->pLeft; + } op = p->op; if( op==TK_REGISTER ) op = p->op2; switch( op ){ @@ -98264,14 +99085,6 @@ SQLITE_PRIVATE int sqlite3IsRowid(const char *z){ if( sqlite3StrICmp(z, "OID")==0 ) return 1; return 0; } -#ifdef SQLITE_ENABLE_NORMALIZE -SQLITE_PRIVATE int sqlite3IsRowidN(const char *z, int n){ - if( sqlite3StrNICmp(z, "_ROWID_", n)==0 ) return 1; - if( sqlite3StrNICmp(z, "ROWID", n)==0 ) return 1; - if( sqlite3StrNICmp(z, "OID", n)==0 ) return 1; - return 0; -} -#endif /* ** pX is the RHS of an IN operator. If pX is a SELECT statement @@ -98441,7 +99254,8 @@ SQLITE_PRIVATE int sqlite3FindInIndex( Expr *pX, /* The right-hand side (RHS) of the IN operator */ u32 inFlags, /* IN_INDEX_LOOP, _MEMBERSHIP, and/or _NOOP_OK */ int *prRhsHasNull, /* Register holding NULL status. See notes */ - int *aiMap /* Mapping from Index fields to RHS fields */ + int *aiMap, /* Mapping from Index fields to RHS fields */ + int *piTab /* OUT: index to use */ ){ Select *p; /* SELECT to the right of IN operator */ int eType = 0; /* Type of RHS table. IN_INDEX_* */ @@ -98536,6 +99350,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex( Bitmask colUsed; /* Columns of the index used */ Bitmask mCol; /* Mask for the current column */ if( pIdx->nColumnpPartIdxWhere!=0 ) continue; /* Maximum nColumn is BMS-2, not BMS-1, so that we can compute ** BITMASK(nExpr) without overflowing */ testcase( pIdx->nColumn==BMS-2 ); @@ -98626,16 +99441,15 @@ SQLITE_PRIVATE int sqlite3FindInIndex( eType = IN_INDEX_EPH; if( inFlags & IN_INDEX_LOOP ){ pParse->nQueryLoop = 0; - if( pX->pLeft->iColumn<0 && !ExprHasProperty(pX, EP_xIsSelect) ){ - eType = IN_INDEX_ROWID; - } }else if( prRhsHasNull ){ *prRhsHasNull = rMayHaveNull = ++pParse->nMem; } - sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID); + assert( pX->op==TK_IN ); + sqlite3CodeRhsOfIN(pParse, pX, iTab); + if( rMayHaveNull ){ + sqlite3SetHasNullFlag(v, iTab, rMayHaveNull); + } pParse->nQueryLoop = savedNQueryLoop; - }else{ - pX->iTable = iTab; } if( aiMap && eType!=IN_INDEX_INDEX_ASC && eType!=IN_INDEX_INDEX_DESC ){ @@ -98643,6 +99457,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex( n = sqlite3ExprVectorSize(pX->pLeft); for(i=0; iiTable, +** however the cursor number returned might not be the same, as it might +** have been duplicated using OP_OpenDup. ** -** If parameter isRowid is non-zero, then expression pExpr is guaranteed -** to be of the form " IN (?, ?, ?)", where is a reference -** to some integer key column of a table B-Tree. In this case, use an -** intkey B-Tree to store the set of IN(...) values instead of the usual -** (slower) variable length keys B-Tree. +** If the LHS expression ("x" in the examples) is a column value, or +** the SELECT statement returns a column value, then the affinity of that +** column is used to build the index keys. If both 'x' and the +** SELECT... statement are columns, then numeric affinity is used +** if either column has NUMERIC or INTEGER affinity. If neither +** 'x' nor the SELECT... statement are columns, then numeric affinity +** is used. +*/ +SQLITE_PRIVATE void sqlite3CodeRhsOfIN( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The IN operator */ + int iTab /* Use this cursor number */ +){ + int addrOnce = 0; /* Address of the OP_Once instruction at top */ + int addr; /* Address of OP_OpenEphemeral instruction */ + Expr *pLeft; /* the LHS of the IN operator */ + KeyInfo *pKeyInfo = 0; /* Key information */ + int nVal; /* Size of vector pLeft */ + Vdbe *v; /* The prepared statement under construction */ + + v = pParse->pVdbe; + assert( v!=0 ); + + /* The evaluation of the IN must be repeated every time it + ** is encountered if any of the following is true: + ** + ** * The right-hand side is a correlated subquery + ** * The right-hand side is an expression list containing variables + ** * We are inside a trigger + ** + ** If all of the above are false, then we can compute the RHS just once + ** and reuse it many names. + */ + if( !ExprHasProperty(pExpr, EP_VarSelect) && pParse->iSelfTab==0 ){ + /* Reuse of the RHS is allowed */ + /* If this routine has already been coded, but the previous code + ** might not have been invoked yet, so invoke it now as a subroutine. + */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d", + pExpr->x.pSelect->selId)); + } + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); + sqlite3VdbeJumpHere(v, addrOnce); + return; + } + + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); + + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + + /* Check to see if this is a vector IN operator */ + pLeft = pExpr->pLeft; + nVal = sqlite3ExprVectorSize(pLeft); + + /* Construct the ephemeral table that will contain the content of + ** RHS of the IN operator. + */ + pExpr->iTable = iTab; + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); + }else{ + VdbeComment((v, "RHS of IN operator")); + } +#endif + pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + /* Case 1: expr IN (SELECT ...) + ** + ** Generate code to write the results of the select into the temporary + ** table allocated and opened above. + */ + Select *pSelect = pExpr->x.pSelect; + ExprList *pEList = pSelect->pEList; + + ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSelect->selId + )); + /* If the LHS and RHS of the IN operator do not match, that + ** error will have been caught long before we reach this point. */ + if( ALWAYS(pEList->nExpr==nVal) ){ + SelectDest dest; + int i; + sqlite3SelectDestInit(&dest, SRT_Set, iTab); + dest.zAffSdst = exprINAffinity(pParse, pExpr); + pSelect->iLimit = 0; + testcase( pSelect->selFlags & SF_Distinct ); + testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ + if( sqlite3Select(pParse, pSelect, &dest) ){ + sqlite3DbFree(pParse->db, dest.zAffSdst); + sqlite3KeyInfoUnref(pKeyInfo); + return; + } + sqlite3DbFree(pParse->db, dest.zAffSdst); + assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ + assert( pEList!=0 ); + assert( pEList->nExpr>0 ); + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( + pParse, p, pEList->a[i].pExpr + ); + } + } + }else if( ALWAYS(pExpr->x.pList!=0) ){ + /* Case 2: expr IN (exprlist) + ** + ** For each expression, build an index key from the evaluation and + ** store it in the temporary table. If is a column, then use + ** that columns affinity when building index keys. If is not + ** a column, use numeric affinity. + */ + char affinity; /* Affinity of the LHS of the IN */ + int i; + ExprList *pList = pExpr->x.pList; + struct ExprList_item *pItem; + int r1, r2, r3; + affinity = sqlite3ExprAffinity(pLeft); + if( !affinity ){ + affinity = SQLITE_AFF_BLOB; + } + if( pKeyInfo ){ + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + } + + /* Loop through each expression in . */ + r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3GetTempReg(pParse); + for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ + Expr *pE2 = pItem->pExpr; + + /* If the expression is not constant then we will need to + ** disable the test that was generated above that makes sure + ** this code only executes once. Because for a non-constant + ** expression we need to rerun this code each time. + */ + if( addrOnce && !sqlite3ExprIsConstant(pE2) ){ + sqlite3VdbeChangeToNoop(v, addrOnce); + addrOnce = 0; + } + + /* Evaluate the expression and insert it into the temp table */ + r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); + sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); + } + sqlite3ReleaseTempReg(pParse, r1); + sqlite3ReleaseTempReg(pParse, r2); + } + if( pKeyInfo ){ + sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); + } + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + } +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +/* +** Generate code for scalar subqueries used as a subquery expression +** or EXISTS operator: ** -** If rMayHaveNull is non-zero, that means that the operation is an IN -** (not a SELECT or EXISTS) and that the RHS might contains NULLs. -** All this routine does is initialize the register given by rMayHaveNull -** to NULL. Calling routines will take care of changing this register -** value to non-NULL if the RHS is NULL-free. +** (SELECT a FROM b) -- subquery +** EXISTS (SELECT a FROM b) -- EXISTS subquery ** -** For a SELECT or EXISTS operator, return the register that holds the -** result. For a multi-column SELECT, the result is stored in a contiguous -** array of registers and the return value is the register of the left-most -** result column. Return 0 for IN operators or if an error occurs. +** The pExpr parameter is the SELECT or EXISTS operator to be coded. +** +** The register that holds the result. For a multi-column SELECT, +** the result is stored in a contiguous array of registers and the +** return value is the register of the left-most result column. +** Return 0 if an error occurs. */ #ifndef SQLITE_OMIT_SUBQUERY -SQLITE_PRIVATE int sqlite3CodeSubselect( - Parse *pParse, /* Parsing context */ - Expr *pExpr, /* The IN, SELECT, or EXISTS operator */ - int rHasNullFlag, /* Register that records whether NULLs exist in RHS */ - int isRowid /* If true, LHS of IN operator is a rowid */ -){ - int jmpIfDynamic = -1; /* One-time test address */ - int rReg = 0; /* Register storing resulting */ - Vdbe *v = sqlite3GetVdbe(pParse); - if( NEVER(v==0) ) return 0; +SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ + int addrOnce = 0; /* Address of OP_Once at top of subroutine */ + int rReg = 0; /* Register storing resulting */ + Select *pSel; /* SELECT statement to encode */ + SelectDest dest; /* How to deal with SELECT result */ + int nReg; /* Registers to allocate */ + Expr *pLimit; /* New limit expression */ - /* The evaluation of the IN/EXISTS/SELECT must be repeated every time it + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + testcase( pExpr->op==TK_EXISTS ); + testcase( pExpr->op==TK_SELECT ); + assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); + assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + pSel = pExpr->x.pSelect; + + /* The evaluation of the EXISTS/SELECT must be repeated every time it ** is encountered if any of the following is true: ** ** * The right-hand side is a correlated subquery @@ -98768,208 +99764,70 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( ** save the results, and reuse the same result on subsequent invocations. */ if( !ExprHasProperty(pExpr, EP_VarSelect) ){ - jmpIfDynamic = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); - } - - switch( pExpr->op ){ - case TK_IN: { - int addr; /* Address of OP_OpenEphemeral instruction */ - Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */ - KeyInfo *pKeyInfo = 0; /* Key information */ - int nVal; /* Size of vector pLeft */ - - nVal = sqlite3ExprVectorSize(pLeft); - assert( !isRowid || nVal==1 ); - - /* Whether this is an 'x IN(SELECT...)' or an 'x IN()' - ** expression it is handled the same way. An ephemeral table is - ** filled with index keys representing the results from the - ** SELECT or the . - ** - ** If the 'x' expression is a column value, or the SELECT... - ** statement returns a column value, then the affinity of that - ** column is used to build the index keys. If both 'x' and the - ** SELECT... statement are columns, then numeric affinity is used - ** if either column has NUMERIC or INTEGER affinity. If neither - ** 'x' nor the SELECT... statement are columns, then numeric affinity - ** is used. - */ - pExpr->iTable = pParse->nTab++; - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, - pExpr->iTable, (isRowid?0:nVal)); - pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, nVal, 1); - - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - /* Case 1: expr IN (SELECT ...) - ** - ** Generate code to write the results of the select into the temporary - ** table allocated and opened above. - */ - Select *pSelect = pExpr->x.pSelect; - ExprList *pEList = pSelect->pEList; - - ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY", - jmpIfDynamic>=0?"":"CORRELATED " - )); - assert( !isRowid ); - /* If the LHS and RHS of the IN operator do not match, that - ** error will have been caught long before we reach this point. */ - if( ALWAYS(pEList->nExpr==nVal) ){ - SelectDest dest; - int i; - sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable); - dest.zAffSdst = exprINAffinity(pParse, pExpr); - pSelect->iLimit = 0; - testcase( pSelect->selFlags & SF_Distinct ); - testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ - if( sqlite3Select(pParse, pSelect, &dest) ){ - sqlite3DbFree(pParse->db, dest.zAffSdst); - sqlite3KeyInfoUnref(pKeyInfo); - return 0; - } - sqlite3DbFree(pParse->db, dest.zAffSdst); - assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ - assert( pEList!=0 ); - assert( pEList->nExpr>0 ); - assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); - for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( - pParse, p, pEList->a[i].pExpr - ); - } - } - }else if( ALWAYS(pExpr->x.pList!=0) ){ - /* Case 2: expr IN (exprlist) - ** - ** For each expression, build an index key from the evaluation and - ** store it in the temporary table. If is a column, then use - ** that columns affinity when building index keys. If is not - ** a column, use numeric affinity. - */ - char affinity; /* Affinity of the LHS of the IN */ - int i; - ExprList *pList = pExpr->x.pList; - struct ExprList_item *pItem; - int r1, r2, r3; - affinity = sqlite3ExprAffinity(pLeft); - if( !affinity ){ - affinity = SQLITE_AFF_BLOB; - } - if( pKeyInfo ){ - assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); - pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); - } - - /* Loop through each expression in . */ - r1 = sqlite3GetTempReg(pParse); - r2 = sqlite3GetTempReg(pParse); - if( isRowid ) sqlite3VdbeAddOp4(v, OP_Blob, 0, r2, 0, "", P4_STATIC); - for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ - Expr *pE2 = pItem->pExpr; - int iValToIns; - - /* If the expression is not constant then we will need to - ** disable the test that was generated above that makes sure - ** this code only executes once. Because for a non-constant - ** expression we need to rerun this code each time. - */ - if( jmpIfDynamic>=0 && !sqlite3ExprIsConstant(pE2) ){ - sqlite3VdbeChangeToNoop(v, jmpIfDynamic); - jmpIfDynamic = -1; - } - - /* Evaluate the expression and insert it into the temp table */ - if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ - sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns); - }else{ - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); - if( isRowid ){ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, - sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3); - }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pExpr->iTable, r2, r3, 1); - } - } - } - sqlite3ReleaseTempReg(pParse, r1); - sqlite3ReleaseTempReg(pParse, r2); - } - if( pKeyInfo ){ - sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); - } - break; + /* If this routine has already been coded, then invoke it as a + ** subroutine. */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId)); + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + return pExpr->iTable; } - case TK_EXISTS: - case TK_SELECT: - default: { - /* Case 3: (SELECT ... FROM ...) - ** or: EXISTS(SELECT ... FROM ...) - ** - ** For a SELECT, generate code to put the values for all columns of - ** the first row into an array of registers and return the index of - ** the first register. - ** - ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) - ** into a register and return that register number. - ** - ** In both cases, the query is augmented with "LIMIT 1". Any - ** preexisting limit is discarded in place of the new LIMIT 1. - */ - Select *pSel; /* SELECT statement to encode */ - SelectDest dest; /* How to deal with SELECT result */ - int nReg; /* Registers to allocate */ - Expr *pLimit; /* New limit expression */ + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); - testcase( pExpr->op==TK_EXISTS ); - testcase( pExpr->op==TK_SELECT ); - assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); - assert( ExprHasProperty(pExpr, EP_xIsSelect) ); - - pSel = pExpr->x.pSelect; - ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY", - jmpIfDynamic>=0?"":"CORRELATED ")); - nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; - sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); - pParse->nMem += nReg; - if( pExpr->op==TK_SELECT ){ - dest.eDest = SRT_Mem; - dest.iSdst = dest.iSDParm; - dest.nSdst = nReg; - sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); - VdbeComment((v, "Init subquery result")); - }else{ - dest.eDest = SRT_Exists; - sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); - VdbeComment((v, "Init EXISTS result")); - } - pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[1], 0); - if( pSel->pLimit ){ - sqlite3ExprDelete(pParse->db, pSel->pLimit->pLeft); - pSel->pLimit->pLeft = pLimit; - }else{ - pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); - } - pSel->iLimit = 0; - if( sqlite3Select(pParse, pSel, &dest) ){ - return 0; - } - rReg = dest.iSDParm; - ExprSetVVAProperty(pExpr, EP_NoReduce); - break; - } + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } - - if( rHasNullFlag ){ - sqlite3SetHasNullFlag(v, pExpr->iTable, rHasNullFlag); + + /* For a SELECT, generate code to put the values for all columns of + ** the first row into an array of registers and return the index of + ** the first register. + ** + ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) + ** into a register and return that register number. + ** + ** In both cases, the query is augmented with "LIMIT 1". Any + ** preexisting limit is discarded in place of the new LIMIT 1. + */ + ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSel->selId)); + nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; + sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); + pParse->nMem += nReg; + if( pExpr->op==TK_SELECT ){ + dest.eDest = SRT_Mem; + dest.iSdst = dest.iSDParm; + dest.nSdst = nReg; + sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); + VdbeComment((v, "Init subquery result")); + }else{ + dest.eDest = SRT_Exists; + sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); + VdbeComment((v, "Init EXISTS result")); } + pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[1], 0); + if( pSel->pLimit ){ + sqlite3ExprDelete(pParse->db, pSel->pLimit->pLeft); + pSel->pLimit->pLeft = pLimit; + }else{ + pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); + } + pSel->iLimit = 0; + if( sqlite3Select(pParse, pSel, &dest) ){ + return 0; + } + pExpr->iTable = rReg = dest.iSDParm; + ExprSetVVAProperty(pExpr, EP_NoReduce); + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); - if( jmpIfDynamic>=0 ){ - sqlite3VdbeJumpHere(v, jmpIfDynamic); + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); } return rReg; @@ -99046,6 +99904,7 @@ static void sqlite3ExprCodeIN( int addrTruthOp; /* Address of opcode that determines the IN is true */ int destNotNull; /* Jump here if a comparison is not true in step 6 */ int addrTop; /* Top of the step-6 loop */ + int iTab = 0; /* Index to use */ pLeft = pExpr->pLeft; if( sqlite3ExprCheckIN(pParse, pExpr) ) return; @@ -99057,7 +99916,7 @@ static void sqlite3ExprCodeIN( if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error; /* Attempt to compute the RHS. After this step, if anything other than - ** IN_INDEX_NOOP is returned, the table opened ith cursor pExpr->iTable + ** IN_INDEX_NOOP is returned, the table opened with cursor iTab ** contains the values that make up the RHS. If IN_INDEX_NOOP is returned, ** the RHS has not yet been coded. */ v = pParse->pVdbe; @@ -99065,7 +99924,8 @@ static void sqlite3ExprCodeIN( VdbeNoopComment((v, "begin IN expr")); eType = sqlite3FindInIndex(pParse, pExpr, IN_INDEX_MEMBERSHIP | IN_INDEX_NOOP_OK, - destIfFalse==destIfNull ? 0 : &rRhsHasNull, aiMap); + destIfFalse==destIfNull ? 0 : &rRhsHasNull, + aiMap, &iTab); assert( pParse->nErr || nVector==1 || eType==IN_INDEX_EPH || eType==IN_INDEX_INDEX_ASC || eType==IN_INDEX_INDEX_DESC @@ -99111,7 +99971,7 @@ static void sqlite3ExprCodeIN( if( eType==IN_INDEX_NOOP ){ ExprList *pList = pExpr->x.pList; CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); - int labelOk = sqlite3VdbeMakeLabel(v); + int labelOk = sqlite3VdbeMakeLabel(pParse); int r2, regToFree; int regCkNull = 0; int ii; @@ -99155,7 +100015,7 @@ static void sqlite3ExprCodeIN( if( destIfNull==destIfFalse ){ destStep2 = destIfFalse; }else{ - destStep2 = destStep6 = sqlite3VdbeMakeLabel(v); + destStep2 = destStep6 = sqlite3VdbeMakeLabel(pParse); } for(i=0; ipLeft, i); @@ -99173,19 +100033,19 @@ static void sqlite3ExprCodeIN( /* In this case, the RHS is the ROWID of table b-tree and so we also ** know that the RHS is non-NULL. Hence, we combine steps 3 and 4 ** into a single opcode. */ - sqlite3VdbeAddOp3(v, OP_SeekRowid, pExpr->iTable, destIfFalse, rLhs); + sqlite3VdbeAddOp3(v, OP_SeekRowid, iTab, destIfFalse, rLhs); VdbeCoverage(v); addrTruthOp = sqlite3VdbeAddOp0(v, OP_Goto); /* Return True */ }else{ sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); if( destIfFalse==destIfNull ){ /* Combine Step 3 and Step 5 into a single opcode */ - sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, + sqlite3VdbeAddOp4Int(v, OP_NotFound, iTab, destIfFalse, rLhs, nVector); VdbeCoverage(v); goto sqlite3ExprCodeIN_finished; } /* Ordinary Step 3, for the case where FALSE and NULL are distinct */ - addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, + addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, iTab, 0, rLhs, nVector); VdbeCoverage(v); } @@ -99210,10 +100070,10 @@ static void sqlite3ExprCodeIN( ** of the RHS. */ if( destStep6 ) sqlite3VdbeResolveLabel(v, destStep6); - addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, destIfFalse); VdbeCoverage(v); if( nVector>1 ){ - destNotNull = sqlite3VdbeMakeLabel(v); + destNotNull = sqlite3VdbeMakeLabel(pParse); }else{ /* For nVector==1, combine steps 6 and 7 by immediately returning ** FALSE if the first comparison is not NULL */ @@ -99225,7 +100085,7 @@ static void sqlite3ExprCodeIN( int r3 = sqlite3GetTempReg(pParse); p = sqlite3VectorFieldSubexpr(pLeft, i); pColl = sqlite3ExprCollSeq(pParse, p); - sqlite3VdbeAddOp3(v, OP_Column, pExpr->iTable, i, r3); + sqlite3VdbeAddOp3(v, OP_Column, iTab, i, r3); sqlite3VdbeAddOp4(v, OP_Ne, rLhs+i, destNotNull, r3, (void*)pColl, P4_COLLSEQ); VdbeCoverage(v); @@ -99234,7 +100094,7 @@ static void sqlite3ExprCodeIN( sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); if( nVector>1 ){ sqlite3VdbeResolveLabel(v, destNotNull); - sqlite3VdbeAddOp2(v, OP_Next, pExpr->iTable, addrTop+1); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addrTop+1); VdbeCoverage(v); /* Step 7: If we reach this point, we know that the result must @@ -99433,7 +100293,7 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ #if SQLITE_OMIT_SUBQUERY iResult = 0; #else - iResult = sqlite3CodeSubselect(pParse, p, 0, 0); + iResult = sqlite3CodeSubselect(pParse, p); #endif }else{ int i; @@ -99778,7 +100638,7 @@ expr_code_doover: ** arguments past the first non-NULL argument. */ if( pDef->funcFlags & SQLITE_FUNC_COALESCE ){ - int endCoalesce = sqlite3VdbeMakeLabel(v); + int endCoalesce = sqlite3VdbeMakeLabel(pParse); assert( nFarg>=2 ); sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); for(i=1; ix.pSelect->pEList->nExpr)!=1 ){ sqlite3SubselectError(pParse, nCol, 1); }else{ - return sqlite3CodeSubselect(pParse, pExpr, 0, 0); + return sqlite3CodeSubselect(pParse, pExpr); } break; } case TK_SELECT_COLUMN: { int n; if( pExpr->pLeft->iTable==0 ){ - pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft, 0, 0); + pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); } assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT ); if( pExpr->iTable @@ -99926,8 +100786,8 @@ expr_code_doover: return pExpr->pLeft->iTable + pExpr->iColumn; } case TK_IN: { - int destIfFalse = sqlite3VdbeMakeLabel(v); - int destIfNull = sqlite3VdbeMakeLabel(v); + int destIfFalse = sqlite3VdbeMakeLabel(pParse); + int destIfNull = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_Null, 0, target); sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); sqlite3VdbeAddOp2(v, OP_Integer, 1, target); @@ -100067,9 +100927,9 @@ expr_code_doover: pEList = pExpr->x.pList; aListelem = pEList->a; nExpr = pEList->nExpr; - endLabel = sqlite3VdbeMakeLabel(v); + endLabel = sqlite3VdbeMakeLabel(pParse); if( (pX = pExpr->pLeft)!=0 ){ - tempX = *pX; + exprNodeCopy(&tempX, pX); testcase( pX->op==TK_COLUMN ); exprToRegister(&tempX, exprCodeVector(pParse, &tempX, ®Free1)); testcase( regFree1==0 ); @@ -100090,7 +100950,7 @@ expr_code_doover: }else{ pTest = aListelem[i].pExpr; } - nextCase = sqlite3VdbeMakeLabel(v); + nextCase = sqlite3VdbeMakeLabel(pParse); testcase( pTest->op==TK_COLUMN ); sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); @@ -100390,13 +101250,12 @@ static void exprCodeBetween( Expr exprX; /* The x subexpression */ int regFree1 = 0; /* Temporary use register */ - memset(&compLeft, 0, sizeof(Expr)); memset(&compRight, 0, sizeof(Expr)); memset(&exprAnd, 0, sizeof(Expr)); assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - exprX = *pExpr->pLeft; + exprNodeCopy(&exprX, pExpr->pLeft); exprAnd.op = TK_AND; exprAnd.pLeft = &compLeft; exprAnd.pRight = &compRight; @@ -100459,7 +101318,7 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int op = pExpr->op; switch( op ){ case TK_AND: { - int d2 = sqlite3VdbeMakeLabel(v); + int d2 = sqlite3VdbeMakeLabel(pParse); testcase( jumpIfNull==0 ); sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL); sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); @@ -100545,7 +101404,7 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int } #ifndef SQLITE_OMIT_SUBQUERY case TK_IN: { - int destIfFalse = sqlite3VdbeMakeLabel(v); + int destIfFalse = sqlite3VdbeMakeLabel(pParse); int destIfNull = jumpIfNull ? dest : destIfFalse; sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); sqlite3VdbeGoto(v, dest); @@ -100632,7 +101491,7 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int break; } case TK_OR: { - int d2 = sqlite3VdbeMakeLabel(v); + int d2 = sqlite3VdbeMakeLabel(pParse); testcase( jumpIfNull==0 ); sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL); sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); @@ -100716,7 +101575,7 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int if( jumpIfNull ){ sqlite3ExprCodeIN(pParse, pExpr, dest, dest); }else{ - int destIfNull = sqlite3VdbeMakeLabel(v); + int destIfNull = sqlite3VdbeMakeLabel(pParse); sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); sqlite3VdbeResolveLabel(v, destIfNull); } @@ -100837,7 +101696,7 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa } return 2; } - if( pA->op!=pB->op ){ + if( pA->op!=pB->op || pA->op==TK_RAISE ){ if( pA->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA->pLeft,pB,iTab)<2 ){ return 1; } @@ -100863,21 +101722,25 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa if( sqlite3WindowCompare(pParse,pA->y.pWin,pB->y.pWin)!=0 ) return 2; } #endif + }else if( pA->op==TK_NULL ){ + return 0; }else if( pA->op==TK_COLLATE ){ if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; - }else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ + }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ return 2; } } if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; - if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ + if( (combinedFlags & EP_TokenOnly)==0 ){ if( combinedFlags & EP_xIsSelect ) return 2; if( (combinedFlags & EP_FixedCol)==0 && sqlite3ExprCompare(pParse, pA->pLeft, pB->pLeft, iTab) ) return 2; if( sqlite3ExprCompare(pParse, pA->pRight, pB->pRight, iTab) ) return 2; if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; - assert( (combinedFlags & EP_Reduced)==0 ); - if( pA->op!=TK_STRING && pA->op!=TK_TRUEFALSE ){ + if( pA->op!=TK_STRING + && pA->op!=TK_TRUEFALSE + && (combinedFlags & EP_Reduced)==0 + ){ if( pA->iColumn!=pB->iColumn ) return 2; if( pA->iTable!=pB->iTable && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; @@ -100986,6 +101849,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ case TK_ISNOT: case TK_NOT: case TK_ISNULL: + case TK_NOTNULL: case TK_IS: case TK_OR: case TK_CASE: @@ -100994,6 +101858,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_ISNOT ); testcase( pExpr->op==TK_NOT ); testcase( pExpr->op==TK_ISNULL ); + testcase( pExpr->op==TK_NOTNULL ); testcase( pExpr->op==TK_IS ); testcase( pExpr->op==TK_OR ); testcase( pExpr->op==TK_CASE ); @@ -101056,6 +101921,17 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ */ SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ Walker w; + p = sqlite3ExprSkipCollate(p); + while( p ){ + if( p->op==TK_NOTNULL ){ + p = p->pLeft; + }else if( p->op==TK_AND ){ + if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; + p = p->pRight; + }else{ + break; + } + } w.xExprCallback = impliesNotNullRow; w.xSelectCallback = 0; w.xSelectCallback2 = 0; @@ -101367,6 +102243,7 @@ SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ w.xSelectCallback2 = analyzeAggregatesInSelectEnd; w.walkerDepth = 0; w.u.pNC = pNC; + w.pParse = 0; assert( pNC->pSrcList!=0 ); sqlite3WalkExpr(&w, pExpr); } @@ -101498,9 +102375,16 @@ SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ ** ** Or, if zName is not a system table, zero is returned. */ -static int isSystemTable(Parse *pParse, const char *zName){ - if( 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ - sqlite3ErrorMsg(pParse, "table %s may not be altered", zName); +static int isAlterableTable(Parse *pParse, Table *pTab){ + if( 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) +#ifndef SQLITE_OMIT_VIRTUALTABLE + || ( (pTab->tabFlags & TF_Shadow) + && (pParse->db->flags & SQLITE_Defensive) + && pParse->db->nVdbeExec==0 + ) +#endif + ){ + sqlite3ErrorMsg(pParse, "table %s may not be altered", pTab->zName); return 1; } return 0; @@ -101596,7 +102480,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( /* Make sure it is not a system table being altered, or a reserved name ** that the table is being renamed to. */ - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ goto exit_rename_table; } if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto @@ -101629,15 +102513,15 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( } #endif - /* Begin a transaction for database iDb. - ** Then modify the schema cookie (since the ALTER TABLE modifies the - ** schema). Open a statement transaction if the table is a virtual - ** table. - */ + /* Begin a transaction for database iDb. Then modify the schema cookie + ** (since the ALTER TABLE modifies the schema). Call sqlite3MayAbort(), + ** as the scalar functions (e.g. sqlite_rename_table()) invoked by the + ** nested SQL may raise an exception. */ v = sqlite3GetVdbe(pParse); if( v==0 ){ goto exit_rename_table; } + sqlite3MayAbort(pParse); /* figure out how many UTF-8 characters are in zName */ zTabName = pTab->zName; @@ -101706,7 +102590,6 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( int i = ++pParse->nMem; sqlite3VdbeLoadString(v, i, zName); sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB); - sqlite3MayAbort(pParse); } #endif @@ -101894,7 +102777,7 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); goto exit_begin_add_column; } - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ goto exit_begin_add_column; } @@ -101996,7 +102879,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( if( !pTab ) goto exit_rename_column; /* Cannot alter a system table */ - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ) goto exit_rename_column; + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ) goto exit_rename_column; if( SQLITE_OK!=isRealTable(pParse, pTab) ) goto exit_rename_column; /* Which schema holds the table to be altered */ @@ -102027,6 +102910,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( ** uses the sqlite_rename_column() SQL function to compute the new ** CREATE statement text for the sqlite_master table. */ + sqlite3MayAbort(pParse); zNew = sqlite3NameFromToken(db, pNew); if( !zNew ) goto exit_rename_column; assert( pNew->n>0 ); @@ -102250,14 +103134,31 @@ static void renameTokenFind(Parse *pParse, struct RenameCtx *pCtx, void *pPtr){ } } +/* +** Iterate through the Select objects that are part of WITH clauses attached +** to select statement pSelect. +*/ +static void renameWalkWith(Walker *pWalker, Select *pSelect){ + if( pSelect->pWith ){ + int i; + for(i=0; ipWith->nCte; i++){ + Select *p = pSelect->pWith->a[i].pSelect; + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pWalker->pParse; + sqlite3SelectPrep(sNC.pParse, p, &sNC); + sqlite3WalkSelect(pWalker, p); + } + } +} + /* ** This is a Walker select callback. It does nothing. It is only required ** because without a dummy callback, sqlite3WalkExpr() and similar do not ** descend into sub-select statements. */ static int renameColumnSelectCb(Walker *pWalker, Select *p){ - UNUSED_PARAMETER(pWalker); - UNUSED_PARAMETER(p); + renameWalkWith(pWalker, p); return WRC_Continue; } @@ -102407,7 +103308,6 @@ static int renameParseSql( rc = sqlite3RunParser(p, zSql, &zErr); assert( p->zErrMsg==0 ); assert( rc!=SQLITE_OK || zErr==0 ); - assert( (0!=p->pNewTable) + (0!=p->pNewIndex) + (0!=p->pNewTrigger)<2 ); p->zErrMsg = zErr; if( db->mallocFailed ) rc = SQLITE_NOMEM; if( rc==SQLITE_OK @@ -102590,6 +103490,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ } sNC.ncFlags = 0; } + sNC.pSrcList = 0; } } } @@ -102627,11 +103528,15 @@ static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){ */ static void renameParseCleanup(Parse *pParse){ sqlite3 *db = pParse->db; + Index *pIdx; if( pParse->pVdbe ){ sqlite3VdbeFinalize(pParse->pVdbe); } sqlite3DeleteTable(db, pParse->pNewTable); - if( pParse->pNewIndex ) sqlite3FreeIndex(db, pParse->pNewIndex); + while( (pIdx = pParse->pNewIndex)!=0 ){ + pParse->pNewIndex = pIdx->pNext; + sqlite3FreeIndex(db, pIdx); + } sqlite3DeleteTrigger(db, pParse->pNewTrigger); sqlite3DbFree(db, pParse->zErrMsg); renameTokenFree(db, pParse->pRename); @@ -102742,6 +103647,9 @@ static void renameColumnFunc( for(pIdx=sParse.pNewTable->pIndex; pIdx; pIdx=pIdx->pNext){ sqlite3WalkExprList(&sWalker, pIdx->aColExpr); } + for(pIdx=sParse.pNewIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3WalkExprList(&sWalker, pIdx->aColExpr); + } } for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){ @@ -102828,12 +103736,17 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ int i; RenameCtx *p = pWalker->u.pRename; SrcList *pSrc = pSelect->pSrc; + if( pSrc==0 ){ + assert( pWalker->pParse->db->mallocFailed ); + return WRC_Abort; + } for(i=0; inSrc; i++){ struct SrcList_item *pItem = &pSrc->a[i]; if( pItem->pTab==p->pTab ){ renameTokenFind(pWalker->pParse, p, pItem->zName); } } + renameWalkWith(pWalker, pSelect); return WRC_Continue; } @@ -104235,7 +105148,7 @@ static void analyzeOneTable( addrNextRow = sqlite3VdbeCurrentAddr(v); if( nColTest>0 ){ - int endDistinctTest = sqlite3VdbeMakeLabel(v); + int endDistinctTest = sqlite3VdbeMakeLabel(pParse); int *aGotoChng; /* Array of jump instruction addresses */ aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest); if( aGotoChng==0 ) continue; @@ -105173,8 +106086,8 @@ static void attachFunc( assert( pVfs ); flags |= SQLITE_OPEN_MAIN_DB; rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags); - sqlite3_free( zPath ); db->nDb++; + pNew->zDbSName = sqlite3DbStrDup(db, zName); } db->noSharedCache = 0; if( rc==SQLITE_CONSTRAINT ){ @@ -105202,7 +106115,6 @@ static void attachFunc( sqlite3BtreeLeave(pNew->pBt); } pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; - if( !REOPEN_AS_MEMDB(db) ) pNew->zDbSName = sqlite3DbStrDup(db, zName); if( rc==SQLITE_OK && pNew->zDbSName==0 ){ rc = SQLITE_NOMEM_BKPT; } @@ -105230,15 +106142,19 @@ static void attachFunc( break; case SQLITE_NULL: - /* No key specified. Use the key from the main database */ - sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); - if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ - rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + /* No key specified. Use the key from URI filename, or if none, + ** use the key from the main database. */ + if( sqlite3CodecQueryParameters(db, zName, zPath)==0 ){ + sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); + if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ + rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + } } break; } } #endif + sqlite3_free( zPath ); /* If the file was opened successfully, read the schema for the new database. ** If this fails, or if opening the file failed, then close the file and @@ -105249,12 +106165,14 @@ static void attachFunc( sqlite3BtreeEnterAll(db); db->init.iDb = 0; db->mDbFlags &= ~(DBFLAG_SchemaKnownOk); - rc = sqlite3Init(db, &zErrDyn); + if( !REOPEN_AS_MEMDB(db) ){ + rc = sqlite3Init(db, &zErrDyn); + } sqlite3BtreeLeaveAll(db); assert( zErrDyn==0 || rc!=SQLITE_OK ); } #ifdef SQLITE_USER_AUTHENTICATION - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && !REOPEN_AS_MEMDB(db) ){ u8 newAuth = 0; rc = sqlite3UserAuthCheckLogin(db, zName, &newAuth); if( newAuthauth.authLevel ){ @@ -106150,7 +107068,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ if( v && pParse->nErr==0 && !db->mallocFailed ){ /* A minimum of one cursor is required if autoincrement is used * See ticket [a696379c1f08866] */ - if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1; + assert( pParse->pAinc==0 || pParse->nTab>0 ); sqlite3VdbeMakeReady(v, pParse); pParse->rc = SQLITE_DONE; }else{ @@ -106183,7 +107101,12 @@ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ zSql = sqlite3VMPrintf(db, zFormat, ap); va_end(ap); if( zSql==0 ){ - return; /* A malloc must have failed */ + /* This can result either from an OOM or because the formatted string + ** exceeds SQLITE_LIMIT_LENGTH. In the latter case, we need to set + ** an error */ + if( !db->mallocFailed ) pParse->rc = SQLITE_TOOBIG; + pParse->nErr++; + return; } pParse->nested++; memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ); @@ -106277,26 +107200,32 @@ SQLITE_PRIVATE Table *sqlite3LocateTable( p = sqlite3FindTable(db, zName, zDbase); if( p==0 ){ - const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; #ifndef SQLITE_OMIT_VIRTUALTABLE /* If zName is the not the name of a table in the schema created using ** CREATE, then check to see if it is the name of an virtual table that ** can be an eponymous virtual table. */ - Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); - if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ - pMod = sqlite3PragmaVtabRegister(db, zName); - } - if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ - return pMod->pEpoTab; + if( pParse->disableVtab==0 ){ + Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); + if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ + pMod = sqlite3PragmaVtabRegister(db, zName); + } + if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ + return pMod->pEpoTab; + } } #endif - if( (flags & LOCATE_NOERR)==0 ){ - if( zDbase ){ - sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); - }else{ - sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); - } - pParse->checkSchema = 1; + if( flags & LOCATE_NOERR ) return 0; + pParse->checkSchema = 1; + }else if( IsVirtual(p) && pParse->disableVtab ){ + p = 0; + } + + if( p==0 ){ + const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; + if( zDbase ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); } } @@ -106559,12 +107488,6 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ /* Delete the Table structure itself. */ -#ifdef SQLITE_ENABLE_NORMALIZE - if( pTable->pColHash ){ - sqlite3HashClear(pTable->pColHash); - sqlite3_free(pTable->pColHash); - } -#endif sqlite3DeleteColumnNames(db, pTable); sqlite3DbFree(db, pTable->zName); sqlite3DbFree(db, pTable->zColAff); @@ -107323,7 +108246,8 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( && sortOrder!=SQLITE_SO_DESC ){ if( IN_RENAME_OBJECT && pList ){ - sqlite3RenameTokenRemap(pParse, &pTab->iPKey, pList->a[0].pExpr); + Expr *pCExpr = sqlite3ExprSkipCollate(pList->a[0].pExpr); + sqlite3RenameTokenRemap(pParse, &pTab->iPKey, pCExpr); } pTab->iPKey = iCol; pTab->keyConf = (u8)onError; @@ -107744,6 +108668,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ pTab->iPKey = -1; }else{ pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); /* ** Remove all redundant columns from the PRIMARY KEY. For example, change @@ -107913,6 +108838,11 @@ SQLITE_PRIVATE void sqlite3EndTable( if( p->tnum==1 ) p->tabFlags |= TF_Readonly; } + assert( (p->tabFlags & TF_HasPrimaryKey)==0 + || p->iPKey>=0 || sqlite3PrimaryKeyIndex(p)!=0 ); + assert( (p->tabFlags & TF_HasPrimaryKey)!=0 + || (p->iPKey<0 && sqlite3PrimaryKeyIndex(p)==0) ); + /* Special processing for WITHOUT ROWID Tables */ if( tabOpts & TF_WithoutRowid ){ if( (p->tabFlags & TF_Autoincrement) ){ @@ -108561,6 +109491,7 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in */ if( IsVirtual(pTab) ){ sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0); + sqlite3MayAbort(pParse); } sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0); sqlite3ChangeCookie(pParse, iDb); @@ -109065,13 +109996,13 @@ SQLITE_PRIVATE void sqlite3CreateIndex( assert( pParse->nErr==0 ); if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 && db->init.busy==0 + && pTblName!=0 #if SQLITE_USER_AUTHENTICATION && sqlite3UserAuthTable(pTab->zName)==0 #endif #ifdef SQLITE_ALLOW_SQLITE_MASTER_INDEX && sqlite3StrICmp(&pTab->zName[7],"master")!=0 #endif - && sqlite3StrNICmp(&pTab->zName[7],"altertab_",9)!=0 ){ sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName); goto exit_create_index; @@ -109175,6 +110106,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( sqlite3ExprListSetSortOrder(pList, sortOrder); }else{ sqlite3ExprListCheckLength(pParse, pList, "index"); + if( pParse->nErr ) goto exit_create_index; } /* Figure out how many bytes of space are required to store explicitly @@ -109193,6 +110125,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( */ nName = sqlite3Strlen30(zName); nExtraCol = pPk ? pPk->nKeyCol : 1; + assert( pList->nExpr + nExtraCol <= 32767 /* Fits in i16 */ ); pIndex = sqlite3AllocateIndexObject(db, pList->nExpr + nExtraCol, nName + nExtra + 1, &zExtra); if( db->mallocFailed ){ @@ -109389,6 +110322,11 @@ SQLITE_PRIVATE void sqlite3CreateIndex( } } if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType; + if( IN_RENAME_OBJECT ){ + pIndex->pNext = pParse->pNewIndex; + pParse->pNewIndex = pIndex; + pIndex = 0; + } goto exit_create_index; } } @@ -109404,6 +110342,14 @@ SQLITE_PRIVATE void sqlite3CreateIndex( Index *p; assert( !IN_SPECIAL_PARSE ); assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); + if( pTblName!=0 ){ + pIndex->tnum = db->init.newTnum; + if( sqlite3IndexHasDuplicateRootPage(pIndex) ){ + sqlite3ErrorMsg(pParse, "invalid rootpage"); + pParse->rc = SQLITE_CORRUPT_BKPT; + goto exit_create_index; + } + } p = sqlite3HashInsert(&pIndex->pSchema->idxHash, pIndex->zName, pIndex); if( p ){ @@ -109412,9 +110358,6 @@ SQLITE_PRIVATE void sqlite3CreateIndex( goto exit_create_index; } db->mDbFlags |= DBFLAG_SchemaChange; - if( pTblName!=0 ){ - pIndex->tnum = db->init.newTnum; - } } /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the @@ -109666,9 +110609,9 @@ SQLITE_PRIVATE void *sqlite3ArrayAllocate( int *pIdx /* Write the index of a new slot here */ ){ char *z; - int n = *pnEntry; + sqlite3_int64 n = *pIdx = *pnEntry; if( (n & (n-1))==0 ){ - int sz = (n==0) ? 1 : 2*n; + sqlite3_int64 sz = (n==0) ? 1 : 2*n; void *pNew = sqlite3DbRealloc(db, pArray, sz*szEntry); if( pNew==0 ){ *pIdx = -1; @@ -109678,7 +110621,6 @@ SQLITE_PRIVATE void *sqlite3ArrayAllocate( } z = (char*)pArray; memset(&z[n * szEntry], 0, szEntry); - *pIdx = n; ++*pnEntry; return pArray; } @@ -109740,6 +110682,18 @@ SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ return -1; } +/* +** Maximum size of a SrcList object. +** The SrcList object is used to represent the FROM clause of a +** SELECT statement, and the query planner cannot deal with more +** than 64 tables in a join. So any value larger than 64 here +** is sufficient for most uses. Smaller values, like say 10, are +** appropriate for small and memory-limited applications. +*/ +#ifndef SQLITE_MAX_SRCLIST +# define SQLITE_MAX_SRCLIST 200 +#endif + /* ** Expand the space allocated for the given SrcList object by ** creating nExtra new slots beginning at iStart. iStart is zero based. @@ -109756,11 +110710,12 @@ SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ ** the iStart value would be 0. The result then would ** be: nil, nil, nil, A, B. ** -** If a memory allocation fails the SrcList is unchanged. The -** db->mallocFailed flag will be set to true. +** If a memory allocation fails or the SrcList becomes too large, leave +** the original SrcList unchanged, return NULL, and leave an error message +** in pParse. */ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( - sqlite3 *db, /* Database connection to notify of OOM errors */ + Parse *pParse, /* Parsing context into which errors are reported */ SrcList *pSrc, /* The SrcList to be enlarged */ int nExtra, /* Number of new slots to add to pSrc->a[] */ int iStart /* Index in pSrc->a[] of first new slot */ @@ -109776,17 +110731,23 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( /* Allocate additional space if needed */ if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ SrcList *pNew; - int nAlloc = pSrc->nSrc*2+nExtra; - int nGot; + sqlite3_int64 nAlloc = 2*(sqlite3_int64)pSrc->nSrc+nExtra; + sqlite3 *db = pParse->db; + + if( pSrc->nSrc+nExtra>=SQLITE_MAX_SRCLIST ){ + sqlite3ErrorMsg(pParse, "too many FROM clause terms, max: %d", + SQLITE_MAX_SRCLIST); + return 0; + } + if( nAlloc>SQLITE_MAX_SRCLIST ) nAlloc = SQLITE_MAX_SRCLIST; pNew = sqlite3DbRealloc(db, pSrc, sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); if( pNew==0 ){ assert( db->mallocFailed ); - return pSrc; + return 0; } pSrc = pNew; - nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1; - pSrc->nAlloc = nGot; + pSrc->nAlloc = nAlloc; } /* Move existing slots that come after the newly inserted slots @@ -109811,7 +110772,8 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( ** Append a new table name to the given SrcList. Create a new SrcList if ** need be. A new entry is created in the SrcList even if pTable is NULL. ** -** A SrcList is returned, or NULL if there is an OOM error. The returned +** A SrcList is returned, or NULL if there is an OOM error or if the +** SrcList grows to large. The returned ** SrcList might be the same as the SrcList that was input or it might be ** a new one. If an OOM error does occurs, then the prior value of pList ** that is input to this routine is automatically freed. @@ -109842,27 +110804,32 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( ** before being added to the SrcList. */ SQLITE_PRIVATE SrcList *sqlite3SrcListAppend( - sqlite3 *db, /* Connection to notify of malloc failures */ + Parse *pParse, /* Parsing context, in which errors are reported */ SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */ Token *pTable, /* Table to append */ Token *pDatabase /* Database of the table */ ){ struct SrcList_item *pItem; + sqlite3 *db; assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */ - assert( db!=0 ); + assert( pParse!=0 ); + assert( pParse->db!=0 ); + db = pParse->db; if( pList==0 ){ - pList = sqlite3DbMallocRawNN(db, sizeof(SrcList) ); + pList = sqlite3DbMallocRawNN(pParse->db, sizeof(SrcList) ); if( pList==0 ) return 0; pList->nAlloc = 1; pList->nSrc = 1; memset(&pList->a[0], 0, sizeof(pList->a[0])); pList->a[0].iCursor = -1; }else{ - pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc); - } - if( db->mallocFailed ){ - sqlite3SrcListDelete(db, pList); - return 0; + SrcList *pNew = sqlite3SrcListEnlarge(pParse, pList, 1, pList->nSrc); + if( pNew==0 ){ + sqlite3SrcListDelete(db, pList); + return 0; + }else{ + pList = pNew; + } } pItem = &pList->a[pList->nSrc-1]; if( pDatabase && pDatabase->z==0 ){ @@ -109951,7 +110918,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( ); goto append_from_error; } - p = sqlite3SrcListAppend(db, p, pTable, pDatabase); + p = sqlite3SrcListAppend(pParse, p, pTable, pDatabase); if( p==0 ){ goto append_from_error; } @@ -110271,7 +111238,8 @@ SQLITE_PRIVATE void sqlite3UniqueConstraint( StrAccum errMsg; Table *pTab = pIdx->pTable; - sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, 200); + sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, + pParse->db->aLimit[SQLITE_LIMIT_LENGTH]); if( pIdx->aColExpr ){ sqlite3_str_appendf(&errMsg, "index '%q'", pIdx->zName); }else{ @@ -110340,13 +111308,15 @@ static int collationMatch(const char *zColl, Index *pIndex){ */ #ifndef SQLITE_OMIT_REINDEX static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ - Index *pIndex; /* An index associated with pTab */ + if( !IsVirtual(pTab) ){ + Index *pIndex; /* An index associated with pTab */ - for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ - if( zColl==0 || collationMatch(zColl, pIndex) ){ - int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3RefillIndex(pParse, pIndex, -1); + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( zColl==0 || collationMatch(zColl, pIndex) ){ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + } } } } @@ -110518,7 +111488,7 @@ SQLITE_PRIVATE With *sqlite3WithAdd( } if( pWith ){ - int nByte = sizeof(*pWith) + (sizeof(pWith->a[1]) * pWith->nCte); + sqlite3_int64 nByte = sizeof(*pWith) + (sizeof(pWith->a[1]) * pWith->nCte); pNew = sqlite3DbRealloc(db, pWith, nByte); }else{ pNew = sqlite3DbMallocZero(db, sizeof(*pWith)); @@ -110845,7 +111815,7 @@ static int matchQuality( ** Search a FuncDefHash for a function with the given name. Return ** a pointer to the matching FuncDef if found, or 0 if there is no match. */ -static FuncDef *functionSearch( +SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch( int h, /* Hash of the name */ const char *zFunc /* Name of function */ ){ @@ -110857,21 +111827,6 @@ static FuncDef *functionSearch( } return 0; } -#ifdef SQLITE_ENABLE_NORMALIZE -SQLITE_PRIVATE FuncDef *sqlite3FunctionSearchN( - int h, /* Hash of the name */ - const char *zFunc, /* Name of function */ - int nFunc /* Length of the name */ -){ - FuncDef *p; - for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){ - if( sqlite3StrNICmp(p->zName, zFunc, nFunc)==0 ){ - return p; - } - } - return 0; -} -#endif /* SQLITE_ENABLE_NORMALIZE */ /* ** Insert a new FuncDef into a FuncDefHash hash table. @@ -110887,7 +111842,7 @@ SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs( int nName = sqlite3Strlen30(zName); int h = SQLITE_FUNC_HASH(zName[0], nName); assert( zName[0]>='a' && zName[0]<='z' ); - pOther = functionSearch(h, zName); + pOther = sqlite3FunctionSearch(h, zName); if( pOther ){ assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] ); aDef[i].pNext = pOther->pNext; @@ -110965,7 +111920,7 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){ bestScore = 0; h = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zName[0]], nName); - p = functionSearch(h, zName); + p = sqlite3FunctionSearch(h, zName); while( p ){ int score = matchQuality(p, nArg, enc); if( score>bestScore ){ @@ -111185,7 +112140,7 @@ SQLITE_PRIVATE void sqlite3MaterializeView( sqlite3 *db = pParse->db; int iDb = sqlite3SchemaToIndex(db, pView->pSchema); pWhere = sqlite3ExprDup(db, pWhere, 0); - pFrom = sqlite3SrcListAppend(db, 0, 0, 0); + pFrom = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pFrom ){ assert( pFrom->nSrc==1 ); pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); @@ -111585,7 +112540,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( /* If this DELETE cannot use the ONEPASS strategy, this is the ** end of the WHERE loop */ if( eOnePass!=ONEPASS_OFF ){ - addrBypass = sqlite3VdbeMakeLabel(v); + addrBypass = sqlite3VdbeMakeLabel(pParse); }else{ sqlite3WhereEnd(pWInfo); } @@ -111774,7 +112729,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( /* Seek cursor iCur to the row to delete. If this row no longer exists ** (this can happen if a trigger program has already deleted it), do ** not attempt to delete it or fire any DELETE triggers. */ - iLabel = sqlite3VdbeMakeLabel(v); + iLabel = sqlite3VdbeMakeLabel(pParse); opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound; if( eMode==ONEPASS_OFF ){ sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); @@ -111980,7 +112935,7 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey( if( piPartIdxLabel ){ if( pIdx->pPartIdxWhere ){ - *piPartIdxLabel = sqlite3VdbeMakeLabel(v); + *piPartIdxLabel = sqlite3VdbeMakeLabel(pParse); pParse->iSelfTab = iDataCur + 1; sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, SQLITE_JUMPIFNULL); @@ -112236,6 +113191,7 @@ static void instrFunc( int typeHaystack, typeNeedle; int N = 1; int isText; + unsigned char firstChar; UNUSED_PARAMETER(argc); typeHaystack = sqlite3_value_type(argv[0]); @@ -112254,7 +113210,10 @@ static void instrFunc( isText = 1; } if( zNeedle==0 || (nHaystack && zHaystack==0) ) return; - while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ + firstChar = zNeedle[0]; + while( nNeedle<=nHaystack + && (zHaystack[0]!=firstChar || memcmp(zHaystack, zNeedle, nNeedle)!=0) + ){ N++; do{ nHaystack--; @@ -112545,11 +113504,11 @@ static void randomBlob( int argc, sqlite3_value **argv ){ - int n; + sqlite3_int64 n; unsigned char *p; assert( argc==1 ); UNUSED_PARAMETER(argc); - n = sqlite3_value_int(argv[0]); + n = sqlite3_value_int64(argv[0]); if( n<1 ){ n = 1; } @@ -113837,6 +114796,10 @@ static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){ if( ALWAYS(pDef) ){ pDef->funcFlags |= flagVal; } + pDef = sqlite3FindFunction(db, zName, 3, SQLITE_UTF8, 0); + if( pDef ){ + pDef->funcFlags |= flagVal; + } } /* @@ -114385,7 +115348,7 @@ static void fkLookupParent( int i; /* Iterator variable */ Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */ int iCur = pParse->nTab - 1; /* Cursor number to use */ - int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */ + int iOk = sqlite3VdbeMakeLabel(pParse); /* jump here if parent key found */ sqlite3VdbeVerifyAbortable(v, (!pFKey->isDeferred @@ -114658,8 +115621,11 @@ static void fkScanChildren( ** NOT( $current_a==a AND $current_b==b AND ... ) ** ** The first form is used for rowid tables. The second form is used - ** for WITHOUT ROWID tables. In the second form, the primary key is - ** (a,b,...) + ** for WITHOUT ROWID tables. In the second form, the *parent* key is + ** (a,b,...). Either the parent or primary key could be used to + ** uniquely identify the current row, but the parent key is more convenient + ** as the required values have already been loaded into registers + ** by the caller. */ if( pTab==pFKey->pFrom && nIncr>0 ){ Expr *pNe; /* Expression (pLeft != pRight) */ @@ -114671,14 +115637,13 @@ static void fkScanChildren( pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight); }else{ Expr *pEq, *pAll = 0; - Index *pPk = sqlite3PrimaryKeyIndex(pTab); assert( pIdx!=0 ); - for(i=0; inKeyCol; i++){ + for(i=0; inKeyCol; i++){ i16 iCol = pIdx->aiColumn[i]; assert( iCol>=0 ); pLeft = exprTableRegister(pParse, pTab, regData, iCol); - pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, iCol); - pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); + pRight = sqlite3Expr(db, TK_ID, pTab->aCol[iCol].zName); + pEq = sqlite3PExpr(pParse, TK_IS, pLeft, pRight); pAll = sqlite3ExprAnd(db, pAll, pEq); } pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0); @@ -114783,7 +115748,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break; } if( !p ) return; - iSkip = sqlite3VdbeMakeLabel(v); + iSkip = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v); } @@ -115068,7 +116033,7 @@ SQLITE_PRIVATE void sqlite3FkCheck( /* Create a SrcList structure containing the child table. We need the ** child table as a SrcList for sqlite3WhereBegin() */ - pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ struct SrcList_item *pItem = pSrc->a; pItem->pTab = pFKey->pFrom; @@ -115345,7 +116310,7 @@ static Trigger *fkActionTrigger( } pSelect = sqlite3SelectNew(pParse, sqlite3ExprListAppend(pParse, 0, pRaise), - sqlite3SrcListAppend(db, 0, &tFrom, 0), + sqlite3SrcListAppend(pParse, 0, &tFrom, 0), pWhere, 0, 0, 0, 0, 0 ); @@ -115807,6 +116772,7 @@ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){ aOp[7].p2 = memId+2; aOp[7].p1 = memId; aOp[10].p2 = memId; + if( pParse->nTab==0 ) pParse->nTab = 1; } } @@ -116313,6 +117279,11 @@ SQLITE_PRIVATE void sqlite3Insert( } #ifndef SQLITE_OMIT_UPSERT if( pUpsert ){ + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "UPSERT not implemented for virtual table \"%s\"", + pTab->zName); + goto insert_cleanup; + } pTabList->a[0].iCursor = iDataCur; pUpsert->pUpsertSrc = pTabList; pUpsert->regData = regData; @@ -116353,7 +117324,7 @@ SQLITE_PRIVATE void sqlite3Insert( /* Run the BEFORE and INSTEAD OF triggers, if there are any */ - endOfLoop = sqlite3VdbeMakeLabel(v); + endOfLoop = sqlite3VdbeMakeLabel(pParse); if( tmask & TRIGGER_BEFORE ){ int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1); @@ -116435,16 +117406,12 @@ SQLITE_PRIVATE void sqlite3Insert( }else if( pSelect ){ sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); }else{ - VdbeOp *pOp; - sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); - pOp = sqlite3VdbeGetOp(v, -1); - assert( pOp!=0 ); - if( pOp->opcode==OP_Null && !IsVirtual(pTab) ){ + Expr *pIpk = pList->a[ipkColumn].pExpr; + if( pIpk->op==TK_NULL && !IsVirtual(pTab) ){ + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); appendFlag = 1; - pOp->opcode = OP_NewRowid; - pOp->p1 = iDataCur; - pOp->p2 = regRowid; - pOp->p3 = regAutoinc; + }else{ + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); } } /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid @@ -116839,7 +117806,20 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( } assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail || onError==OE_Ignore || onError==OE_Replace ); + addr1 = 0; switch( onError ){ + case OE_Replace: { + assert( onError==OE_Replace ); + addr1 = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); + VdbeCoverage(v); + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); + sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); + VdbeCoverage(v); + onError = OE_Abort; + /* Fall through into the OE_Abort case to generate code that runs + ** if both the input and the default value are NULL */ + } case OE_Abort: sqlite3MayAbort(pParse); /* Fall through */ @@ -116852,19 +117832,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); VdbeCoverage(v); - break; - } - case OE_Ignore: { - sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); - VdbeCoverage(v); + if( addr1 ) sqlite3VdbeResolveLabel(v, addr1); break; } default: { - assert( onError==OE_Replace ); - addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); - VdbeCoverage(v); - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); - sqlite3VdbeJumpHere(v, addr1); + assert( onError==OE_Ignore ); + sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); + VdbeCoverage(v); break; } } @@ -116887,7 +117861,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** updated so there is no point it verifying the check constraint */ continue; } - allOk = sqlite3VdbeMakeLabel(v); + allOk = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeVerifyAbortable(v, onError); sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL); if( onError==OE_Ignore ){ @@ -116954,7 +117928,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** exist in the table. */ if( pkChng && pPk==0 ){ - int addrRowidOk = sqlite3VdbeMakeLabel(v); + int addrRowidOk = sqlite3VdbeMakeLabel(pParse); /* Figure out what action to take in case of a rowid collision */ onError = pTab->keyConf; @@ -117104,7 +118078,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( VdbeComment((v, "Skip upsert subroutine")); sqlite3VdbeJumpHere(v, upsertJump); }else{ - addrUniqueOk = sqlite3VdbeMakeLabel(v); + addrUniqueOk = sqlite3VdbeMakeLabel(pParse); } if( bAffinityDone==0 && (pUpIdx==0 || pUpIdx==pIdx) ){ sqlite3TableAffinity(v, pTab, regNewData+1); @@ -117148,7 +118122,9 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); VdbeComment((v, "for %s", pIdx->zName)); #ifdef SQLITE_ENABLE_NULL_TRIM - if( pIdx->idxType==2 ) sqlite3SetMakeRecordP5(v, pIdx->pTable); + if( pIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ + sqlite3SetMakeRecordP5(v, pIdx->pTable); + } #endif /* In an UPDATE operation, if this index is the PRIMARY KEY index @@ -117187,7 +118163,11 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** (3) There are no secondary indexes on the table ** (4) No delete triggers need to be fired if there is a conflict ** (5) No FK constraint counters need to be updated if a conflict occurs. - */ + ** + ** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row + ** must be explicitly deleted in order to ensure any pre-update hook + ** is invoked. */ +#ifndef SQLITE_ENABLE_PREUPDATE_HOOK if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ && pPk==pIdx /* Condition 2 */ && onError==OE_Replace /* Condition 1 */ @@ -117199,6 +118179,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( sqlite3VdbeResolveLabel(v, addrUniqueOk); continue; } +#endif /* ifndef SQLITE_ENABLE_PREUPDATE_HOOK */ /* Check to see if the new index entry will be unique */ sqlite3VdbeVerifyAbortable(v, onError); @@ -117312,7 +118293,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( /* If the IPK constraint is a REPLACE, run it last */ if( ipkTop ){ - sqlite3VdbeGoto(v, ipkTop+1); + sqlite3VdbeGoto(v, ipkTop); VdbeComment((v, "Do IPK REPLACE")); sqlite3VdbeJumpHere(v, ipkBottom); } @@ -117393,10 +118374,13 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( pik_flags |= (update_flags & OPFLAG_SAVEPOSITION); #ifdef SQLITE_ENABLE_PREUPDATE_HOOK if( update_flags==0 ){ - sqlite3VdbeAddOp4(v, OP_InsertInt, - iIdxCur+i, aRegIdx[i], 0, (char*)pTab, P4_TABLE + int r = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Integer, 0, r); + sqlite3VdbeAddOp4(v, OP_Insert, + iIdxCur+i, aRegIdx[i], r, (char*)pTab, P4_TABLE ); sqlite3VdbeChangeP5(v, OPFLAG_ISNOOP); + sqlite3ReleaseTempReg(pParse, r); } #endif } @@ -117682,7 +118666,8 @@ static int xferOptimization( if( pSrc==0 ){ return 0; /* FROM clause does not contain a real table */ } - if( pSrc==pDest ){ + if( pSrc->tnum==pDest->tnum && pSrc->pSchema==pDest->pSchema ){ + testcase( pSrc!=pDest ); /* Possible due to bad sqlite_master.rootpage */ return 0; /* tab1 and tab2 may not be the same table */ } if( HasRowid(pDest)!=HasRowid(pSrc) ){ @@ -117743,6 +118728,13 @@ static int xferOptimization( if( pSrcIdx==0 ){ return 0; /* pDestIdx has no corresponding index in pSrc */ } + if( pSrcIdx->tnum==pDestIdx->tnum && pSrc->pSchema==pDest->pSchema + && sqlite3FaultSim(411)==SQLITE_OK ){ + /* The sqlite3FaultSim() call allows this corruption test to be + ** bypassed during testing, in order to exercise other corruption tests + ** further downstream. */ + return 0; /* Corrupt schema - two indexes on the same btree */ + } } #ifndef SQLITE_OMIT_CHECK if( pDest->pCheck && sqlite3ExprListCompare(pSrc->pCheck,pDest->pCheck,-1) ){ @@ -117820,7 +118812,7 @@ static int xferOptimization( sqlite3RowidConstraint(pParse, onError, pDest); sqlite3VdbeJumpHere(v, addr2); autoIncStep(pParse, regAutoinc, regRowid); - }else if( pDest->pIndex==0 ){ + }else if( pDest->pIndex==0 && !(db->mDbFlags & DBFLAG_VacuumInto) ){ addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); }else{ addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); @@ -117883,7 +118875,7 @@ static int xferOptimization( sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); } } - if( !HasRowid(pSrc) && pDestIdx->idxType==2 ){ + if( !HasRowid(pSrc) && pDestIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ idxInsFlags |= OPFLAG_NCHANGE; } sqlite3VdbeAddOp2(v, OP_IdxInsert, iDest, regData); @@ -117958,7 +118950,7 @@ SQLITE_API int sqlite3_exec( sqlite3_mutex_enter(db->mutex); sqlite3Error(db, SQLITE_OK); while( rc==SQLITE_OK && zSql[0] ){ - int nCol; + int nCol = 0; char **azVals = 0; pStmt = 0; @@ -117972,9 +118964,7 @@ SQLITE_API int sqlite3_exec( zSql = zLeftover; continue; } - callbackIsInit = 0; - nCol = sqlite3_column_count(pStmt); while( 1 ){ int i; @@ -117985,6 +118975,7 @@ SQLITE_API int sqlite3_exec( (SQLITE_DONE==rc && !callbackIsInit && db->flags&SQLITE_NullCallback)) ){ if( !callbackIsInit ){ + nCol = sqlite3_column_count(pStmt); azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*)); if( azCols==0 ){ goto exec_out; @@ -118396,6 +119387,9 @@ struct sqlite3_api_routines { void(*xDestroy)(void*)); /* Version 3.26.0 and later */ const char *(*normalized_sql)(sqlite3_stmt*); + /* Version 3.28.0 and later */ + int (*stmt_isexplain)(sqlite3_stmt*); + int (*value_frombind)(sqlite3_value*); }; /* @@ -118685,6 +119679,9 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_create_window_function sqlite3_api->create_window_function /* Version 3.26.0 and later */ #define sqlite3_normalized_sql sqlite3_api->normalized_sql +/* Version 3.28.0 and later */ +#define sqlite3_stmt_isexplain sqlite3_api->isexplain +#define sqlite3_value_frombind sqlite3_api->frombind #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) @@ -119144,10 +120141,13 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_create_window_function, /* Version 3.26.0 and later */ #ifdef SQLITE_ENABLE_NORMALIZE - sqlite3_normalized_sql + sqlite3_normalized_sql, #else - 0 + 0, #endif + /* Version 3.28.0 and later */ + sqlite3_stmt_isexplain, + sqlite3_value_frombind }; /* @@ -119339,7 +120339,7 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ if( onoff ){ db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc; }else{ - db->flags &= ~(SQLITE_LoadExtension|SQLITE_LoadExtFunc); + db->flags &= ~(u64)(SQLITE_LoadExtension|SQLITE_LoadExtFunc); } sqlite3_mutex_leave(db->mutex); return SQLITE_OK; @@ -119598,8 +120598,7 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ #define PragTyp_HEXKEY 41 #define PragTyp_KEY 42 #define PragTyp_LOCK_STATUS 43 -#define PragTyp_PARSER_TRACE 44 -#define PragTyp_STATS 45 +#define PragTyp_STATS 44 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -120010,12 +121009,14 @@ static const PragmaName aPragmaName[] = { /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif -#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_PARSER_TRACE) +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) {/* zName: */ "parser_trace", - /* ePragTyp: */ PragTyp_PARSER_TRACE, - /* ePragFlg: */ 0, + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ SQLITE_ParserTrace }, +#endif #endif #if defined(SQLITE_INTROSPECTION_PRAGMAS) {/* zName: */ "pragma_list", @@ -121006,7 +122007,7 @@ SQLITE_PRIVATE void sqlite3Pragma( if( sqlite3GetBoolean(zRight, size!=0) ){ db->flags |= SQLITE_CacheSpill; }else{ - db->flags &= ~SQLITE_CacheSpill; + db->flags &= ~(u64)SQLITE_CacheSpill; } setAllPagerFlags(db); } @@ -121566,7 +122567,7 @@ SQLITE_PRIVATE void sqlite3Pragma( x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols); assert( x==0 ); } - addrOk = sqlite3VdbeMakeLabel(v); + addrOk = sqlite3VdbeMakeLabel(pParse); /* Generate code to read the child key values into registers ** regRow..regRow+n. If any of the child key values are NULL, this @@ -121611,19 +122612,6 @@ SQLITE_PRIVATE void sqlite3Pragma( #endif /* !defined(SQLITE_OMIT_TRIGGER) */ #endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ -#ifndef NDEBUG - case PragTyp_PARSER_TRACE: { - if( zRight ){ - if( sqlite3GetBoolean(zRight, 0) ){ - sqlite3ParserTrace(stdout, "parser: "); - }else{ - sqlite3ParserTrace(0, 0); - } - } - } - break; -#endif - /* Reinstall the LIKE and GLOB functions. The variant of LIKE ** used will be case sensitive or not depending on the RHS. */ @@ -121786,8 +122774,8 @@ SQLITE_PRIVATE void sqlite3Pragma( if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0); if( db->mallocFailed==0 ){ - int addrCkFault = sqlite3VdbeMakeLabel(v); - int addrCkOk = sqlite3VdbeMakeLabel(v); + int addrCkFault = sqlite3VdbeMakeLabel(pParse); + int addrCkOk = sqlite3VdbeMakeLabel(pParse); char *zErr; int k; pParse->iSelfTab = iDataCur + 1; @@ -121810,7 +122798,7 @@ SQLITE_PRIVATE void sqlite3Pragma( /* Validate index entries for the current row */ for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int jmp2, jmp3, jmp4, jmp5; - int ckUniq = sqlite3VdbeMakeLabel(v); + int ckUniq = sqlite3VdbeMakeLabel(pParse); if( pPk==pIdx ) continue; r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, pPrior, r1); @@ -121831,7 +122819,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** current key. The entry is unique if (1) any column is NULL ** or (2) the next entry has a different key */ if( IsUniqueIndex(pIdx) ){ - int uniqOk = sqlite3VdbeMakeLabel(v); + int uniqOk = sqlite3VdbeMakeLabel(pParse); int jmp6; int kk; for(kk=0; kknKeyCol; kk++){ @@ -122745,6 +123733,19 @@ static void corruptSchema( } } +/* +** Check to see if any sibling index (another index on the same table) +** of pIndex has the same root page number, and if it does, return true. +** This would indicate a corrupt schema. +*/ +SQLITE_PRIVATE int sqlite3IndexHasDuplicateRootPage(Index *pIndex){ + Index *p; + for(p=pIndex->pTable->pIndex; p; p=p->pNext){ + if( p->tnum==pIndex->tnum && p!=pIndex ) return 1; + } + return 0; +} + /* ** This is the callback routine for the code that initializes the ** database. See sqlite3Init() below for additional information. @@ -122766,6 +123767,7 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char UNUSED_PARAMETER2(NotUsed, argc); assert( sqlite3_mutex_held(db->mutex) ); DbClearProperty(db, iDb, DB_Empty); + pData->nInitRow++; if( db->mallocFailed ){ corruptSchema(pData, argv[0], 0); return 1; @@ -122819,15 +123821,12 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char */ Index *pIndex; pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zDbSName); - if( pIndex==0 ){ - /* This can occur if there exists an index on a TEMP table which - ** has the same name as another index on a permanent index. Since - ** the permanent table is hidden by the TEMP table, we can also - ** safely ignore the index on the permanent table. - */ - /* Do Nothing */; - }else if( sqlite3GetInt32(argv[1], &pIndex->tnum)==0 ){ - corruptSchema(pData, argv[0], "invalid rootpage"); + if( pIndex==0 + || sqlite3GetInt32(argv[1],&pIndex->tnum)==0 + || pIndex->tnum<2 + || sqlite3IndexHasDuplicateRootPage(pIndex) + ){ + corruptSchema(pData, argv[0], pIndex?"invalid rootpage":"orphan index"); } } return 0; @@ -122877,6 +123876,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl initData.rc = SQLITE_OK; initData.pzErrMsg = pzErrMsg; initData.mInitFlags = mFlags; + initData.nInitRow = 0; sqlite3InitCallback(&initData, 3, (char **)azArg, 0); if( initData.rc ){ rc = initData.rc; @@ -122994,7 +123994,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl ** indices that the user might have created. */ if( iDb==0 && meta[BTREE_FILE_FORMAT-1]>=4 ){ - db->flags &= ~SQLITE_LegacyFileFmt; + db->flags &= ~(u64)SQLITE_LegacyFileFmt; } /* Read the schema information out of the schema tables @@ -123246,6 +124246,7 @@ static int sqlite3Prepare( sParse.disableLookaside++; db->lookaside.bDisable++; } + sParse.disableVtab = (prepFlags & SQLITE_PREPARE_NO_VTAB)!=0; /* Check to verify that it is possible to get a read lock on all ** database schemas. The inability to get a read lock indicates that @@ -123410,293 +124411,6 @@ static int sqlite3LockAndPrepare( return rc; } -#ifdef SQLITE_ENABLE_NORMALIZE -/* -** Checks if the specified token is a table, column, or function name, -** based on the databases associated with the statement being prepared. -** If the function fails, zero is returned and pRc is filled with the -** error code. -*/ -static int shouldTreatAsIdentifier( - sqlite3 *db, /* Database handle. */ - const char *zToken, /* Pointer to start of token to be checked */ - int nToken, /* Length of token to be checked */ - int *pRc /* Pointer to error code upon failure */ -){ - int bFound = 0; /* Non-zero if token is an identifier name. */ - int i, j; /* Database and column loop indexes. */ - Schema *pSchema; /* Schema for current database. */ - Hash *pHash; /* Hash table of tables for current database. */ - HashElem *e; /* Hash element for hash table iteration. */ - Table *pTab; /* Database table for columns being checked. */ - - if( sqlite3IsRowidN(zToken, nToken) ){ - return 1; - } - if( nToken>0 ){ - int hash = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zToken[0]], nToken); - if( sqlite3FunctionSearchN(hash, zToken, nToken) ) return 1; - } - assert( db!=0 ); - sqlite3_mutex_enter(db->mutex); - sqlite3BtreeEnterAll(db); - for(i=0; inDb; i++){ - pHash = &db->aFunc; - if( sqlite3HashFindN(pHash, zToken, nToken) ){ - bFound = 1; - break; - } - pSchema = db->aDb[i].pSchema; - if( pSchema==0 ) continue; - pHash = &pSchema->tblHash; - if( sqlite3HashFindN(pHash, zToken, nToken) ){ - bFound = 1; - break; - } - for(e=sqliteHashFirst(pHash); e; e=sqliteHashNext(e)){ - pTab = sqliteHashData(e); - if( pTab==0 ) continue; - pHash = pTab->pColHash; - if( pHash==0 ){ - pTab->pColHash = pHash = sqlite3_malloc(sizeof(Hash)); - if( pHash ){ - sqlite3HashInit(pHash); - for(j=0; jnCol; j++){ - Column *pCol = &pTab->aCol[j]; - sqlite3HashInsert(pHash, pCol->zName, pCol); - } - }else{ - *pRc = SQLITE_NOMEM_BKPT; - bFound = 0; - goto done; - } - } - if( pHash && sqlite3HashFindN(pHash, zToken, nToken) ){ - bFound = 1; - goto done; - } - } - } -done: - sqlite3BtreeLeaveAll(db); - sqlite3_mutex_leave(db->mutex); - return bFound; -} - -/* -** Attempt to estimate the final output buffer size needed for the fully -** normalized version of the specified SQL string. This should take into -** account any potential expansion that could occur (e.g. via IN clauses -** being expanded, etc). This size returned is the total number of bytes -** including the NUL terminator. -*/ -static int estimateNormalizedSize( - const char *zSql, /* The original SQL string */ - int nSql, /* Length of original SQL string */ - u8 prepFlags /* The flags passed to sqlite3_prepare_v3() */ -){ - int nOut = nSql + 4; - const char *z = zSql; - while( nOut0 ){ - zOut[j++] = '"'; - continue; - }else if( k==nToken-1 ){ - zOut[j++] = '"'; - continue; - } - } - if( bKeyword ){ - zOut[j++] = sqlite3Toupper(zSql[iIn+k]); - }else{ - zOut[j++] = sqlite3Tolower(zSql[iIn+k]); - } - } - *piOut = j; -} - -/* -** Perform normalization of the SQL contained in the prepared statement and -** store the result in the zNormSql field. The schema for the associated -** databases are consulted while performing the normalization in order to -** determine if a token appears to be an identifier. All identifiers are -** left intact in the normalized SQL and all literals are replaced with a -** single '?'. -*/ -SQLITE_PRIVATE void sqlite3Normalize( - Vdbe *pVdbe, /* VM being reprepared */ - const char *zSql, /* The original SQL string */ - int nSql, /* Size of the input string in bytes */ - u8 prepFlags /* The flags passed to sqlite3_prepare_v3() */ -){ - sqlite3 *db; /* Database handle. */ - char *z; /* The output string */ - int nZ; /* Size of the output string in bytes */ - int i; /* Next character to read from zSql[] */ - int j; /* Next character to fill in on z[] */ - int tokenType = 0; /* Type of the next token */ - int prevTokenType = 0; /* Type of the previous token, except spaces */ - int n; /* Size of the next token */ - int nParen = 0; /* Nesting level of parenthesis */ - Hash inHash; /* Table of parenthesis levels to output index. */ - - db = sqlite3VdbeDb(pVdbe); - assert( db!=0 ); - assert( pVdbe->zNormSql==0 ); - if( zSql==0 ) return; - nZ = estimateNormalizedSize(zSql, nSql, prepFlags); - z = sqlite3DbMallocRawNN(db, nZ); - if( z==0 ) return; - sqlite3HashInit(&inHash); - for(i=j=0; i0 ){ - sqlite3HashInsert(&inHash, zSql+nParen, 0); - assert( jj+6=0 ); - assert( nZ-1-j=0 ); - /* Fall through */ - } - case TK_MINUS: - case TK_SEMI: - case TK_PLUS: - case TK_STAR: - case TK_SLASH: - case TK_REM: - case TK_EQ: - case TK_LE: - case TK_NE: - case TK_LSHIFT: - case TK_LT: - case TK_RSHIFT: - case TK_GT: - case TK_GE: - case TK_BITOR: - case TK_CONCAT: - case TK_COMMA: - case TK_BITAND: - case TK_BITNOT: - case TK_DOT: - case TK_IN: - case TK_IS: - case TK_NOT: - case TK_NULL: - case TK_ID: { - if( tokenType==TK_NULL ){ - if( prevTokenType==TK_IS || prevTokenType==TK_NOT ){ - /* NULL is a keyword in this case, not a literal value */ - }else{ - /* Here the NULL is a literal value */ - z[j++] = '?'; - break; - } - } - if( j>0 && sqlite3IsIdChar(z[j-1]) && sqlite3IsIdChar(zSql[i]) ){ - z[j++] = ' '; - } - if( tokenType==TK_ID ){ - int i2 = i, n2 = n, rc = SQLITE_OK; - if( nParen>0 ){ - assert( nParen0 && z[j-1]==' ' ){ j--; } - if( j>0 && z[j-1]!=';' ){ z[j++] = ';'; } - z[j] = 0; - assert( jzNormSql = z; - sqlite3HashClear(&inHash); -} -#endif /* SQLITE_ENABLE_NORMALIZE */ /* ** Rerun the compilation of a statement after a schema change. @@ -124538,7 +125252,7 @@ static void pushOntoSorter( } assert( pSelect->iOffset==0 || pSelect->iLimit!=0 ); iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit; - pSort->labelDone = sqlite3VdbeMakeLabel(v); + pSort->labelDone = sqlite3VdbeMakeLabel(pParse); sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData, SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0)); if( bSeq ){ @@ -124577,7 +125291,7 @@ static void pushOntoSorter( pKI->nAllField-pKI->nKeyField-1); addrJmp = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); - pSort->labelBkOut = sqlite3VdbeMakeLabel(v); + pSort->labelBkOut = sqlite3VdbeMakeLabel(pParse); pSort->regReturn = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor); @@ -125324,7 +126038,7 @@ static void generateSortTail( ){ Vdbe *v = pParse->pVdbe; /* The prepared statement */ int addrBreak = pSort->labelDone; /* Jump here to exit loop */ - int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */ + int addrContinue = sqlite3VdbeMakeLabel(pParse);/* Jump here for next cycle */ int addr; /* Top of output loop. Jump for Next. */ int addrOnce = 0; int iTab; @@ -125364,7 +126078,12 @@ static void generateSortTail( regRow = pDest->iSdst; }else{ regRowid = sqlite3GetTempReg(pParse); - regRow = sqlite3GetTempRange(pParse, nColumn); + if( eDest==SRT_EphemTab || eDest==SRT_Table ){ + regRow = sqlite3GetTempReg(pParse); + nColumn = 0; + }else{ + regRow = sqlite3GetTempRange(pParse, nColumn); + } } nKey = pOrderBy->nExpr - pSort->nOBSat; if( pSort->sortFlags & SORTFLAG_UseSorter ){ @@ -125444,6 +126163,7 @@ static void generateSortTail( switch( eDest ){ case SRT_Table: case SRT_EphemTab: { + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq, regRow); sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid); sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); @@ -125984,15 +126704,15 @@ SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation( SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ Table *pTab; sqlite3 *db = pParse->db; - int savedFlags; + u64 savedFlags; savedFlags = db->flags; - db->flags &= ~SQLITE_FullColNames; + db->flags &= ~(u64)SQLITE_FullColNames; db->flags |= SQLITE_ShortColNames; sqlite3SelectPrep(pParse, pSelect, 0); + db->flags = savedFlags; if( pParse->nErr ) return 0; while( pSelect->pPrior ) pSelect = pSelect->pPrior; - db->flags = savedFlags; pTab = sqlite3DbMallocZero(db, sizeof(Table) ); if( pTab==0 ){ return 0; @@ -126236,7 +126956,7 @@ static void generateWithRecursiveQuery( if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return; /* Process the LIMIT and OFFSET clauses, if they exist */ - addrBreak = sqlite3VdbeMakeLabel(v); + addrBreak = sqlite3VdbeMakeLabel(pParse); p->nSelectRow = 320; /* 4 billion rows */ computeLimitRegisters(pParse, p, addrBreak); pLimit = p->pLimit; @@ -126306,7 +127026,7 @@ static void generateWithRecursiveQuery( sqlite3VdbeAddOp1(v, OP_Delete, iQueue); /* Output the single row in Current */ - addrCont = sqlite3VdbeMakeLabel(v); + addrCont = sqlite3VdbeMakeLabel(pParse); codeOffset(v, regOffset, addrCont); selectInnerLoop(pParse, p, iCurrent, 0, 0, pDest, addrCont, addrBreak); @@ -126614,8 +127334,8 @@ static int multiSelect( if( dest.eDest!=priorOp ){ int iCont, iBreak, iStart; assert( p->pEList ); - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v); iStart = sqlite3VdbeCurrentAddr(v); @@ -126683,8 +127403,8 @@ static int multiSelect( ** tables. */ assert( p->pEList ); - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); r1 = sqlite3GetTempReg(pParse); @@ -126814,7 +127534,7 @@ static int generateOutputSubroutine( int addr; addr = sqlite3VdbeCurrentAddr(v); - iContinue = sqlite3VdbeMakeLabel(v); + iContinue = sqlite3VdbeMakeLabel(pParse); /* Suppress duplicates for UNION, EXCEPT, and INTERSECT */ @@ -127051,8 +127771,8 @@ static int multiSelectOrderBy( db = pParse->db; v = pParse->pVdbe; assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */ - labelEnd = sqlite3VdbeMakeLabel(v); - labelCmpr = sqlite3VdbeMakeLabel(v); + labelEnd = sqlite3VdbeMakeLabel(pParse); + labelCmpr = sqlite3VdbeMakeLabel(pParse); /* Patch up the ORDER BY clause @@ -127368,6 +128088,7 @@ static Expr *substExpr( ifNullRow.iTable = pSubst->iNewTable; pCopy = &ifNullRow; } + testcase( ExprHasProperty(pCopy, EP_Subquery) ); pNew = sqlite3ExprDup(db, pCopy, 0); if( pNew && pSubst->isLeftJoin ){ ExprSetProperty(pNew, EP_CanBeNull); @@ -127860,11 +128581,9 @@ static int flattenSubquery( jointype = pSubitem->fg.jointype; }else{ assert( pParent!=p ); /* 2nd and subsequent times through the loop */ - pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); - if( pSrc==0 ){ - assert( db->mallocFailed ); - break; - } + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; } /* The subquery uses a single slot of the FROM clause of the outer @@ -127883,10 +128602,9 @@ static int flattenSubquery( ** for the two elements in the FROM clause of the subquery. */ if( nSubSrc>1 ){ - pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1); - if( db->mallocFailed ){ - break; - } + pSrc = sqlite3SrcListEnlarge(pParse, pSrc, nSubSrc-1,iFrom+1); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; } /* Transfer the FROM clause terms from the subquery into the @@ -127932,7 +128650,8 @@ static int flattenSubquery( pParent->pOrderBy = pOrderBy; pSub->pOrderBy = 0; } - pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); + pWhere = pSub->pWhere; + pSub->pWhere = 0; if( isLeftJoin>0 ){ setJoinExpr(pWhere, iNewParent); } @@ -129208,7 +129927,7 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ ** ** If regAcc is non-zero and there are no min() or max() aggregates ** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator -** registers i register regAcc contains 0. The caller will take care +** registers if register regAcc contains 0. The caller will take care ** of setting and clearing regAcc. */ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ @@ -129235,7 +129954,7 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ regAgg = 0; } if( pF->iDistinct>=0 ){ - addrNext = sqlite3VdbeMakeLabel(v); + addrNext = sqlite3VdbeMakeLabel(pParse); testcase( nArg==0 ); /* Error condition */ testcase( nArg>1 ); /* Also an error */ codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg); @@ -129371,14 +130090,19 @@ static struct SrcList_item *isSelfJoinView( ){ struct SrcList_item *pItem; for(pItem = pTabList->a; pItempSelect==0 ) continue; if( pItem->fg.viaCoroutine ) continue; if( pItem->zName==0 ) continue; if( sqlite3_stricmp(pItem->zDatabase, pThis->zDatabase)!=0 ) continue; if( sqlite3_stricmp(pItem->zName, pThis->zName)!=0 ) continue; - if( sqlite3ExprCompare(0, - pThis->pSelect->pWhere, pItem->pSelect->pWhere, -1) - ){ + pS1 = pItem->pSelect; + if( pThis->pSelect->selId!=pS1->selId ){ + /* The query flattener left two different CTE tables with identical + ** names in the same FROM clause. */ + continue; + } + if( sqlite3ExprCompare(0, pThis->pSelect->pWhere, pS1->pWhere, -1) ){ /* The view was modified by some other optimization such as ** pushDownWhereTerms() */ continue; @@ -129640,6 +130364,7 @@ SQLITE_PRIVATE int sqlite3Select( } if( flattenSubquery(pParse, p, i, isAgg) ){ + if( pParse->nErr ) goto select_end; /* This subquery can be absorbed into its parent. */ i = -1; } @@ -129735,22 +130460,12 @@ SQLITE_PRIVATE int sqlite3Select( pSub = pItem->pSelect; if( pSub==0 ) continue; - /* Sometimes the code for a subquery will be generated more than - ** once, if the subquery is part of the WHERE clause in a LEFT JOIN, - ** for example. In that case, do not regenerate the code to manifest - ** a view or the co-routine to implement a view. The first instance - ** is sufficient, though the subroutine to manifest the view does need - ** to be invoked again. */ - if( pItem->addrFillSub ){ - if( pItem->fg.viaCoroutine==0 ){ - /* The subroutine that manifests the view might be a one-time routine, - ** or it might need to be rerun on each iteration because it - ** encodes a correlated subquery. */ - testcase( sqlite3VdbeGetOp(v, pItem->addrFillSub)->opcode==OP_Once ); - sqlite3VdbeAddOp2(v, OP_Gosub, pItem->regReturn, pItem->addrFillSub); - } - continue; - } + /* The code for a subquery should only be generated once, though it is + ** technically harmless for it to be generated multiple times. The + ** following assert() will detect if something changes to cause + ** the same subquery to be coded multiple times, as a signal to the + ** developers to try to optimize the situation. */ + assert( pItem->addrFillSub==0 ); /* Increment Parse.nHeight by the height of the largest expression ** tree referred to by this, the parent select. The child select @@ -129938,7 +130653,7 @@ SQLITE_PRIVATE int sqlite3Select( /* Set the limiter. */ - iEnd = sqlite3VdbeMakeLabel(v); + iEnd = sqlite3VdbeMakeLabel(pParse); if( (p->selFlags & SF_FixedLimit)==0 ){ p->nSelectRow = 320; /* 4 billion rows */ } @@ -130005,9 +130720,9 @@ SQLITE_PRIVATE int sqlite3Select( assert( p->pEList==pEList ); #ifndef SQLITE_OMIT_WINDOWFUNC if( pWin ){ - int addrGosub = sqlite3VdbeMakeLabel(v); - int iCont = sqlite3VdbeMakeLabel(v); - int iBreak = sqlite3VdbeMakeLabel(v); + int addrGosub = sqlite3VdbeMakeLabel(pParse); + int iCont = sqlite3VdbeMakeLabel(pParse); + int iBreak = sqlite3VdbeMakeLabel(pParse); int regGosub = ++pParse->nMem; sqlite3WindowCodeStep(pParse, p, pWInfo, regGosub, addrGosub); @@ -130082,7 +130797,7 @@ SQLITE_PRIVATE int sqlite3Select( } /* Create a label to jump to when we want to abort the query */ - addrEnd = sqlite3VdbeMakeLabel(v); + addrEnd = sqlite3VdbeMakeLabel(pParse); /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the @@ -130171,9 +130886,9 @@ SQLITE_PRIVATE int sqlite3Select( iUseFlag = ++pParse->nMem; iAbortFlag = ++pParse->nMem; regOutputRow = ++pParse->nMem; - addrOutputRow = sqlite3VdbeMakeLabel(v); + addrOutputRow = sqlite3VdbeMakeLabel(pParse); regReset = ++pParse->nMem; - addrReset = sqlite3VdbeMakeLabel(v); + addrReset = sqlite3VdbeMakeLabel(pParse); iAMem = pParse->nMem + 1; pParse->nMem += pGroupBy->nExpr; iBMem = pParse->nMem + 1; @@ -131460,7 +132175,7 @@ static SrcList *targetSrcList( int iDb; /* Index of the database to use */ SrcList *pSrc; /* SrcList to be returned */ - pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ assert( pSrc->nSrc>0 ); pSrc->a[pSrc->nSrc-1].zName = sqlite3DbStrDup(db, pStep->zTarget); @@ -131645,6 +132360,7 @@ static TriggerPrg *codeRowTrigger( pSubParse->zAuthContext = pTrigger->zName; pSubParse->eTriggerOp = pTrigger->op; pSubParse->nQueryLoop = pParse->nQueryLoop; + pSubParse->disableVtab = pParse->disableVtab; v = sqlite3GetVdbe(pSubParse); if( v ){ @@ -131672,7 +132388,7 @@ static TriggerPrg *codeRowTrigger( if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) && db->mallocFailed==0 ){ - iEndTrigger = sqlite3VdbeMakeLabel(v); + iEndTrigger = sqlite3VdbeMakeLabel(pSubParse); sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); } sqlite3ExprDelete(db, pWhen); @@ -132271,6 +132987,7 @@ SQLITE_PRIVATE void sqlite3Update( ** being updated. Fill in aRegIdx[] with a register number that will hold ** the key for accessing each index. */ + if( onError==OE_Replace ) bReplace = 1; for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int reg; if( chngKey || hasFK>1 || pIdx==pPk @@ -132284,9 +133001,7 @@ SQLITE_PRIVATE void sqlite3Update( if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){ reg = ++pParse->nMem; pParse->nMem += pIdx->nColumn; - if( (onError==OE_Replace) - || (onError==OE_Default && pIdx->onError==OE_Replace) - ){ + if( onError==OE_Default && pIdx->onError==OE_Replace ){ bReplace = 1; } break; @@ -132358,7 +133073,7 @@ SQLITE_PRIVATE void sqlite3Update( #endif /* Jump to labelBreak to abandon further processing of this UPDATE */ - labelContinue = labelBreak = sqlite3VdbeMakeLabel(v); + labelContinue = labelBreak = sqlite3VdbeMakeLabel(pParse); /* Not an UPSERT. Normal processing. Begin by ** initialize the count of updated rows */ @@ -132493,13 +133208,13 @@ SQLITE_PRIVATE void sqlite3Update( VdbeCoverage(v); } if( eOnePass!=ONEPASS_SINGLE ){ - labelContinue = sqlite3VdbeMakeLabel(v); + labelContinue = sqlite3VdbeMakeLabel(pParse); } sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); VdbeCoverageIf(v, pPk==0); VdbeCoverageIf(v, pPk!=0); }else if( pPk ){ - labelContinue = sqlite3VdbeMakeLabel(v); + labelContinue = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); @@ -133267,16 +133982,16 @@ static int execSqlF(sqlite3 *db, char **pzErrMsg, const char *zSql, ...){ ** transient would cause the database file to appear to be deleted ** following reboot. */ -SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm){ +SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm, Expr *pInto){ Vdbe *v = sqlite3GetVdbe(pParse); int iDb = 0; - if( v==0 ) return; + if( v==0 ) goto build_vacuum_end; if( pNm ){ #ifndef SQLITE_BUG_COMPATIBLE_20160819 /* Default behavior: Report an error if the argument to VACUUM is ** not recognized */ iDb = sqlite3TwoPartName(pParse, pNm, pNm, &pNm); - if( iDb<0 ) return; + if( iDb<0 ) goto build_vacuum_end; #else /* When SQLITE_BUG_COMPATIBLE_20160819 is defined, unrecognized arguments ** to VACUUM are silently ignored. This is a back-out of a bug fix that @@ -133288,37 +134003,63 @@ SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm){ #endif } if( iDb!=1 ){ - sqlite3VdbeAddOp1(v, OP_Vacuum, iDb); + int iIntoReg = 0; + if( pInto && sqlite3ResolveSelfReference(pParse,0,0,pInto,0)==0 ){ + iIntoReg = ++pParse->nMem; + sqlite3ExprCode(pParse, pInto, iIntoReg); + } + sqlite3VdbeAddOp2(v, OP_Vacuum, iDb, iIntoReg); sqlite3VdbeUsesBtree(v, iDb); } +build_vacuum_end: + sqlite3ExprDelete(pParse->db, pInto); return; } /* ** This routine implements the OP_Vacuum opcode of the VDBE. */ -SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( + char **pzErrMsg, /* Write error message here */ + sqlite3 *db, /* Database connection */ + int iDb, /* Which attached DB to vacuum */ + sqlite3_value *pOut /* Write results here, if not NULL. VACUUM INTO */ +){ int rc = SQLITE_OK; /* Return code from service routines */ Btree *pMain; /* The database being vacuumed */ Btree *pTemp; /* The temporary database we vacuum into */ - u16 saved_mDbFlags; /* Saved value of db->mDbFlags */ - u32 saved_flags; /* Saved value of db->flags */ + u32 saved_mDbFlags; /* Saved value of db->mDbFlags */ + u64 saved_flags; /* Saved value of db->flags */ int saved_nChange; /* Saved value of db->nChange */ int saved_nTotalChange; /* Saved value of db->nTotalChange */ + u32 saved_openFlags; /* Saved value of db->openFlags */ u8 saved_mTrace; /* Saved trace settings */ Db *pDb = 0; /* Database to detach at end of vacuum */ int isMemDb; /* True if vacuuming a :memory: database */ int nRes; /* Bytes of reserved space at the end of each page */ int nDb; /* Number of attached databases */ const char *zDbMain; /* Schema name of database to vacuum */ + const char *zOut; /* Name of output file */ if( !db->autoCommit ){ sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction"); - return SQLITE_ERROR; + return SQLITE_ERROR; /* IMP: R-12218-18073 */ } if( db->nVdbeActive>1 ){ sqlite3SetString(pzErrMsg, db,"cannot VACUUM - SQL statements in progress"); - return SQLITE_ERROR; + return SQLITE_ERROR; /* IMP: R-15610-35227 */ + } + saved_openFlags = db->openFlags; + if( pOut ){ + if( sqlite3_value_type(pOut)!=SQLITE_TEXT ){ + sqlite3SetString(pzErrMsg, db, "non-text filename"); + return SQLITE_ERROR; + } + zOut = (const char*)sqlite3_value_text(pOut); + db->openFlags &= ~SQLITE_OPEN_READONLY; + db->openFlags |= SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE; + }else{ + zOut = ""; } /* Save the current value of the database flags so that it can be @@ -133331,7 +134072,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ saved_mTrace = db->mTrace; db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks; db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; - db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder + db->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_Defensive | SQLITE_CountRows); db->mTrace = 0; @@ -133354,19 +134095,23 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ ** to write the journal header file. */ nDb = db->nDb; - rc = execSql(db, pzErrMsg, "ATTACH''AS vacuum_db"); + rc = execSqlF(db, pzErrMsg, "ATTACH %Q AS vacuum_db", zOut); + db->openFlags = saved_openFlags; if( rc!=SQLITE_OK ) goto end_of_vacuum; assert( (db->nDb-1)==nDb ); pDb = &db->aDb[nDb]; assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); pTemp = pDb->pBt; - - /* The call to execSql() to attach the temp database has left the file - ** locked (as there was more than one active statement when the transaction - ** to read the schema was concluded. Unlock it here so that this doesn't - ** cause problems for the call to BtreeSetPageSize() below. */ - sqlite3BtreeCommit(pTemp); - + if( pOut ){ + sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp)); + i64 sz = 0; + if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){ + rc = SQLITE_ERROR; + sqlite3SetString(pzErrMsg, db, "output file already exists"); + goto end_of_vacuum; + } + db->mDbFlags |= DBFLAG_VacuumInto; + } nRes = sqlite3BtreeGetOptimalReserve(pMain); /* A VACUUM cannot change the pagesize of an encrypted database. */ @@ -133390,7 +134135,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ */ rc = execSql(db, pzErrMsg, "BEGIN"); if( rc!=SQLITE_OK ) goto end_of_vacuum; - rc = sqlite3BtreeBeginTrans(pMain, 2, 0); + rc = sqlite3BtreeBeginTrans(pMain, pOut==0 ? 2 : 0, 0); if( rc!=SQLITE_OK ) goto end_of_vacuum; /* Do not attempt to change the page size for a WAL database */ @@ -133485,7 +134230,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ }; assert( 1==sqlite3BtreeIsInTrans(pTemp) ); - assert( 1==sqlite3BtreeIsInTrans(pMain) ); + assert( pOut!=0 || 1==sqlite3BtreeIsInTrans(pMain) ); /* Copy Btree meta values */ for(i=0; iflags */ @@ -133848,9 +134599,13 @@ SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){ ** string will be freed automatically when the table is ** deleted. */ -static void addModuleArgument(sqlite3 *db, Table *pTable, char *zArg){ - int nBytes = sizeof(char *)*(2+pTable->nModuleArg); +static void addModuleArgument(Parse *pParse, Table *pTable, char *zArg){ + sqlite3_int64 nBytes = sizeof(char *)*(2+pTable->nModuleArg); char **azModuleArg; + sqlite3 *db = pParse->db; + if( pTable->nModuleArg+3>=db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns on %s", pTable->zName); + } azModuleArg = sqlite3DbRealloc(db, pTable->azModuleArg, nBytes); if( azModuleArg==0 ){ sqlite3DbFree(db, zArg); @@ -133885,9 +134640,9 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse( db = pParse->db; assert( pTable->nModuleArg==0 ); - addModuleArgument(db, pTable, sqlite3NameFromToken(db, pModuleName)); - addModuleArgument(db, pTable, 0); - addModuleArgument(db, pTable, sqlite3DbStrDup(db, pTable->zName)); + addModuleArgument(pParse, pTable, sqlite3NameFromToken(db, pModuleName)); + addModuleArgument(pParse, pTable, 0); + addModuleArgument(pParse, pTable, sqlite3DbStrDup(db, pTable->zName)); assert( (pParse->sNameToken.z==pName2->z && pName2->z!=0) || (pParse->sNameToken.z==pName1->z && pName2->z==0) ); @@ -133920,7 +134675,7 @@ static void addArgumentToVtab(Parse *pParse){ const char *z = (const char*)pParse->sArg.z; int n = pParse->sArg.n; sqlite3 *db = pParse->db; - addModuleArgument(db, pParse->pNewTable, sqlite3DbStrNDup(db, z, n)); + addModuleArgument(pParse, pParse->pNewTable, sqlite3DbStrNDup(db, z, n)); } } @@ -134209,7 +134964,8 @@ static int growVTrans(sqlite3 *db){ /* Grow the sqlite3.aVTrans array if required */ if( (db->nVTrans%ARRAY_INCR)==0 ){ VTable **aVTrans; - int nBytes = sizeof(sqlite3_vtab *) * (db->nVTrans + ARRAY_INCR); + sqlite3_int64 nBytes = sizeof(sqlite3_vtab*)* + ((sqlite3_int64)db->nVTrans + ARRAY_INCR); aVTrans = sqlite3DbRealloc(db, (void *)db->aVTrans, nBytes); if( !aVTrans ){ return SQLITE_NOMEM_BKPT; @@ -134547,6 +135303,7 @@ SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ const sqlite3_module *pMod = pVTab->pMod->pModule; if( pVTab->pVtab && pMod->iVersion>=2 ){ int (*xMethod)(sqlite3_vtab *, int); + sqlite3VtabLock(pVTab); switch( op ){ case SAVEPOINT_BEGIN: xMethod = pMod->xSavepoint; @@ -134562,6 +135319,7 @@ SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ if( xMethod && pVTab->iSavepoint>iSavepoint ){ rc = xMethod(pVTab->pVtab, iSavepoint); } + sqlite3VtabUnlock(pVTab); } } } @@ -134703,9 +135461,9 @@ SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ pTab->pSchema = db->aDb[0].pSchema; assert( pTab->nModuleArg==0 ); pTab->iPKey = -1; - addModuleArgument(db, pTab, sqlite3DbStrDup(db, pTab->zName)); - addModuleArgument(db, pTab, 0); - addModuleArgument(db, pTab, sqlite3DbStrDup(db, pTab->zName)); + addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); + addModuleArgument(pParse, pTab, 0); + addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); rc = vtabCallConstructor(db, pTab, pMod, pModule->xConnect, &zErr); if( rc ){ sqlite3ErrorMsg(pParse, "%s", zErr); @@ -135323,8 +136081,11 @@ SQLITE_PRIVATE void sqlite3WhereAddScanStatus( # define sqlite3WhereAddScanStatus(a, b, c, d) ((void)d) #endif SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ WhereInfo *pWInfo, /* Complete information about the WHERE clause */ int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ Bitmask notReady /* Which tables are currently available */ ); @@ -135594,6 +136355,7 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( } #endif zMsg = sqlite3StrAccumFinish(&str); + sqlite3ExplainBreakpoint("",zMsg); ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), pParse->addrExplain, 0, zMsg,P4_DYNAMIC); } @@ -135919,16 +136681,17 @@ static int codeEqualityTerm( if( pLoop->aLTerm[i]->pExpr==pX ) nEq++; } + iTab = 0; if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){ - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); }else{ sqlite3 *db = pParse->db; pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); if( !db->mallocFailed ){ aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap); - pTerm->pExpr->iTable = pX->iTable; + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); + pTerm->pExpr->iTable = iTab; } sqlite3ExprDelete(db, pX); pX = pTerm->pExpr; @@ -135938,7 +136701,6 @@ static int codeEqualityTerm( testcase( bRev ); bRev = !bRev; } - iTab = pX->iTable; sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); VdbeCoverageIf(v, bRev); VdbeCoverageIf(v, !bRev); @@ -135946,7 +136708,7 @@ static int codeEqualityTerm( pLoop->wsFlags |= WHERE_IN_ABLE; if( pLevel->u.in.nIn==0 ){ - pLevel->addrNxt = sqlite3VdbeMakeLabel(v); + pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); } i = pLevel->u.in.nIn; @@ -135962,7 +136724,6 @@ static int codeEqualityTerm( if( pLoop->aLTerm[i]->pExpr==pX ){ int iOut = iReg + i - iEq; if( eType==IN_INDEX_ROWID ){ - testcase( nEq>1 ); /* Happens with a UNIQUE index on ROWID */ pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); }else{ int iCol = aiMap ? aiMap[iMap++] : 0; @@ -136457,7 +137218,9 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ #ifndef SQLITE_OMIT_SUBQUERY if( (p->flags & EP_xIsSelect) ){ Vdbe *v = pParse->pVdbe; - int iSelect = sqlite3CodeSubselect(pParse, p, 0, 0); + int iSelect; + assert( p->op==TK_SELECT ); + iSelect = sqlite3CodeSubselect(pParse, p); sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg-1); }else #endif @@ -136538,27 +137301,54 @@ static void whereIndexExprTrans( } } +/* +** The pTruth expression is always true because it is the WHERE clause +** a partial index that is driving a query loop. Look through all of the +** WHERE clause terms on the query, and if any of those terms must be +** true because pTruth is true, then mark those WHERE clause terms as +** coded. +*/ +static void whereApplyPartialIndexConstraints( + Expr *pTruth, + int iTabCur, + WhereClause *pWC +){ + int i; + WhereTerm *pTerm; + while( pTruth->op==TK_AND ){ + whereApplyPartialIndexConstraints(pTruth->pLeft, iTabCur, pWC); + pTruth = pTruth->pRight; + } + for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + Expr *pExpr; + if( pTerm->wtFlags & TERM_CODED ) continue; + pExpr = pTerm->pExpr; + if( sqlite3ExprCompare(0, pExpr, pTruth, iTabCur)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } + } +} + /* ** Generate code for the start of the iLevel-th loop in the WHERE clause ** implementation described by pWInfo. */ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ WhereInfo *pWInfo, /* Complete information about the WHERE clause */ int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ Bitmask notReady /* Which tables are currently available */ ){ int j, k; /* Loop counters */ int iCur; /* The VDBE cursor for the table */ int addrNxt; /* Where to jump to continue with the next IN case */ - int omitTable; /* True if we use the index only */ int bRev; /* True if we need to scan in reverse order */ - WhereLevel *pLevel; /* The where level to be coded */ WhereLoop *pLoop; /* The WhereLoop object being coded */ WhereClause *pWC; /* Decomposition of the entire WHERE clause */ WhereTerm *pTerm; /* A WHERE clause term */ - Parse *pParse; /* Parsing context */ sqlite3 *db; /* Database connection */ - Vdbe *v; /* The prepared stmt under constructions */ struct SrcList_item *pTabItem; /* FROM clause term being coded */ int addrBrk; /* Jump here to break out of the loop */ int addrHalt; /* addrBrk for the outermost loop */ @@ -136568,18 +137358,13 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( Index *pIdx = 0; /* Index used by loop (if any) */ int iLoop; /* Iteration of constraint generator loop */ - pParse = pWInfo->pParse; - v = pParse->pVdbe; pWC = &pWInfo->sWC; db = pParse->db; - pLevel = &pWInfo->a[iLevel]; pLoop = pLevel->pWLoop; pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; iCur = pTabItem->iCursor; pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); bRev = (pWInfo->revMask>>iLevel)&1; - omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 - && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); /* Create labels for the "break" and "continue" instructions @@ -136592,8 +137377,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** there are no IN operators in the constraints, the "addrNxt" label ** is the same as "addrBrk". */ - addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v); - addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v); + addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); + addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(pParse); /* If this is the right table of a LEFT OUTER JOIN, allocate and ** initialize a memory cell that records if this table matches any @@ -136720,7 +137505,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pTerm = pLoop->aLTerm[0]; assert( pTerm!=0 ); assert( pTerm->pExpr!=0 ); - assert( omitTable==0 ); testcase( pTerm->wtFlags & TERM_VIRTUAL ); iReleaseReg = ++pParse->nMem; iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); @@ -136729,6 +137513,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); pLevel->op = OP_Noop; + if( (pTerm->prereqAll & pLevel->notReady)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } }else if( (pLoop->wsFlags & WHERE_IPK)!=0 && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 ){ @@ -136739,7 +137526,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( int memEndValue = 0; WhereTerm *pStart, *pEnd; - assert( omitTable==0 ); j = 0; pStart = pEnd = 0; if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; @@ -136903,6 +137689,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( char *zEndAff = 0; /* Affinity for end of range constraint */ u8 bSeekPastNull = 0; /* True to seek past initial nulls */ u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ + int omitTable; /* True if we use the index only */ + pIdx = pLoop->u.btree.pIndex; iIdxCur = pLevel->iIdxCur; @@ -137104,6 +137892,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } /* Seek the table cursor, if required */ + omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; if( omitTable ){ /* pIdx is a covering index. No need to access the main table. */ }else if( HasRowid(pIdx->pTable) ){ @@ -137138,11 +137928,24 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** the cursor. In this case it is important to do the full evaluation, ** as the result of the expression may not be NULL, even if all table ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a + ** + ** Also, do not do this when processing one index an a multi-index + ** OR clause, since the transformation will become invalid once we + ** move forward to the next index. + ** https://sqlite.org/src/info/4e8e4857d32d401f */ - if( pLevel->iLeftJoin==0 ){ + if( pLevel->iLeftJoin==0 && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); } + /* If a partial index is driving the loop, try to eliminate WHERE clause + ** terms from the query that must be true due to the WHERE clause of + ** the partial index + */ + if( pIdx->pPartIdxWhere ){ + whereApplyPartialIndexConstraints(pIdx->pPartIdxWhere, iCur, pWC); + } + /* Record the instruction used to terminate the loop. */ if( pLoop->wsFlags & WHERE_ONEROW ){ pLevel->op = OP_Noop; @@ -137214,7 +138017,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ int regRowset = 0; /* Register for RowSet object */ int regRowid = 0; /* Register holding rowid */ - int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */ + int iLoopBody = sqlite3VdbeMakeLabel(pParse);/* Start of loop body */ int iRetInit; /* Address of regReturn init */ int untestedTerms = 0; /* Some terms not completely tested */ int ii; /* Loop counter */ @@ -137306,7 +138109,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pAndExpr = sqlite3ExprAnd(db, pAndExpr, pExpr); } if( pAndExpr ){ - pAndExpr = sqlite3PExpr(pParse, TK_AND|TKFLG_DONTFOLD, 0, pAndExpr); + /* The extra 0x10000 bit on the opcode is masked off and does not + ** become part of the new Expr.op. However, it does make the + ** op==TK_AND comparison inside of sqlite3PExpr() false, and this + ** prevents sqlite3PExpr() from implementing AND short-circuit + ** optimization, which we do not want here. */ + pAndExpr = sqlite3PExpr(pParse, TK_AND|0x10000, 0, pAndExpr); } } @@ -137330,6 +138138,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pOrExpr = pAndExpr; } /* Loop through table entries that match term pOrTerm. */ + ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1)); WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, wctrlFlags, iCovCur); @@ -137433,6 +138242,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* Finish the loop through table entries that match term pOrTerm. */ sqlite3WhereEnd(pSubWInfo); + ExplainQueryPlanPop(pParse); } } } @@ -137534,8 +138344,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( u32 x = pLevel->iLikeRepCntr; if( x>0 ){ skipLikeAddr = sqlite3VdbeAddOp1(v, (x&1)?OP_IfNot:OP_If,(int)(x>>1)); + VdbeCoverageIf(v, (x&1)==1); + VdbeCoverageIf(v, (x&1)==0); } - VdbeCoverage(v); #endif } #ifdef WHERETRACE_ENABLED /* 0xffff */ @@ -138394,6 +139205,7 @@ static void exprAnalyzeOrTerm( ** and column is found but leave okToChngToIN false if not found. */ for(j=0; j<2 && !okToChngToIN; j++){ + Expr *pLeft = 0; pOrTerm = pOrWc->a; for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){ assert( pOrTerm->eOperator & WO_EQ ); @@ -138417,6 +139229,7 @@ static void exprAnalyzeOrTerm( } iColumn = pOrTerm->u.leftColumn; iCursor = pOrTerm->leftCursor; + pLeft = pOrTerm->pExpr->pLeft; break; } if( i<0 ){ @@ -138436,7 +139249,9 @@ static void exprAnalyzeOrTerm( assert( pOrTerm->eOperator & WO_EQ ); if( pOrTerm->leftCursor!=iCursor ){ pOrTerm->wtFlags &= ~TERM_OR_OK; - }else if( pOrTerm->u.leftColumn!=iColumn ){ + }else if( pOrTerm->u.leftColumn!=iColumn || (iColumn==XN_EXPR + && sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1) + )){ okToChngToIN = 0; }else{ int affLeft, affRight; @@ -139133,6 +139948,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ }else if( p->x.pList ){ mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList); } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->op==TK_FUNCTION && p->y.pWin ){ + mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pPartition); + mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pOrderBy); + } +#endif return mask; } SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){ @@ -139524,6 +140345,17 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ return 0; } +/* +** This is whereScanInit() for the case of an index on an expression. +** It is factored out into a separate tail-recursion subroutine so that +** the normal whereScanInit() routine, which is a high-runner, does not +** need to push registers onto the stack as part of its prologue. +*/ +static SQLITE_NOINLINE WhereTerm *whereScanInitIndexExpr(WhereScan *pScan){ + pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr); + return whereScanNext(pScan); +} + /* ** Initialize a WHERE clause scanner object. Return a pointer to the ** first match. Return NULL if there are no matches. @@ -139556,12 +140388,19 @@ static WhereTerm *whereScanInit( pScan->pIdxExpr = 0; pScan->idxaff = 0; pScan->zCollName = 0; + pScan->opMask = opMask; + pScan->k = 0; + pScan->aiCur[0] = iCur; + pScan->nEquiv = 1; + pScan->iEquiv = 1; if( pIdx ){ int j = iColumn; iColumn = pIdx->aiColumn[j]; if( iColumn==XN_EXPR ){ pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; pScan->zCollName = pIdx->azColl[j]; + pScan->aiColumn[0] = XN_EXPR; + return whereScanInitIndexExpr(pScan); }else if( iColumn==pIdx->pTable->iPKey ){ iColumn = XN_ROWID; }else if( iColumn>=0 ){ @@ -139571,12 +140410,7 @@ static WhereTerm *whereScanInit( }else if( iColumn==XN_EXPR ){ return 0; } - pScan->opMask = opMask; - pScan->k = 0; - pScan->aiCur[0] = iCur; pScan->aiColumn[0] = iColumn; - pScan->nEquiv = 1; - pScan->iEquiv = 1; return whereScanNext(pScan); } @@ -140051,7 +140885,7 @@ static void constructAutomaticIndex( addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); } if( pPartial ){ - iContinue = sqlite3VdbeMakeLabel(v); + iContinue = sqlite3VdbeMakeLabel(pParse); sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL); pLoop->wsFlags |= WHERE_PARTIALIDX; } @@ -140068,6 +140902,7 @@ static void constructAutomaticIndex( translateColumnToCopy(pParse, addrTop, pLevel->iTabCur, pTabItem->regResult, 1); sqlite3VdbeGoto(v, addrTop); + pTabItem->fg.viaCoroutine = 0; }else{ sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); } @@ -141423,7 +142258,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ rc = whereLoopXfer(db, p, pTemplate); if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ Index *pIndex = p->u.btree.pIndex; - if( pIndex && pIndex->tnum==0 ){ + if( pIndex && pIndex->idxType==SQLITE_IDXTYPE_IPK ){ p->u.btree.pIndex = 0; } } @@ -141590,8 +142425,8 @@ static int whereRangeVectorLen( ** terms only. If it is modified, this value is restored before this ** function returns. ** -** If pProbe->tnum==0, that means pIndex is a fake index used for the -** INTEGER PRIMARY KEY. +** If pProbe->idxType==SQLITE_IDXTYPE_IPK, that means pIndex is +** a fake index used for the INTEGER PRIMARY KEY. */ static int whereLoopAddBtreeIndex( WhereLoopBuilder *pBuilder, /* The WhereLoop factory */ @@ -142091,6 +142926,7 @@ static int whereLoopAddBtree( sPk.onError = OE_Replace; sPk.pTable = pTab; sPk.szIdxRow = pTab->szTabRow; + sPk.idxType = SQLITE_IDXTYPE_IPK; aiRowEstPk[0] = pTab->nRowLogEst; aiRowEstPk[1] = 0; pFirst = pSrc->pTab->pIndex; @@ -142181,7 +143017,7 @@ static int whereLoopAddBtree( b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ assert( (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || b==0 ); - if( pProbe->tnum<=0 ){ + if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){ /* Integer primary key index */ pNew->wsFlags = WHERE_IPK; @@ -142534,11 +143370,11 @@ static int whereLoopAddVirtual( rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn); /* If the call to xBestIndex() with all terms enabled produced a plan - ** that does not require any source tables (IOW: a plan with mBest==0), - ** then there is no point in making any further calls to xBestIndex() - ** since they will all return the same result (if the xBestIndex() - ** implementation is sane). */ - if( rc==SQLITE_OK && (mBest = (pNew->prereq & ~mPrereq))!=0 ){ + ** that does not require any source tables (IOW: a plan with mBest==0) + ** and does not use an IN(...) operator, then there is no point in making + ** any further calls to xBestIndex() since they will all return the same + ** result (if the xBestIndex() implementation is sane). */ + if( rc==SQLITE_OK && ((mBest = (pNew->prereq & ~mPrereq))!=0 || bIn) ){ int seenZero = 0; /* True if a plan with no prereqs seen */ int seenZeroNoIN = 0; /* Plan with no prereqs and no IN(...) seen */ Bitmask mPrev = 0; @@ -143857,7 +144693,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( pWInfo->pResultSet = pResultSet; pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1; pWInfo->nLevel = nTabList; - pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(v); + pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(pParse); pWInfo->wctrlFlags = wctrlFlags; pWInfo->iLimit = iAuxArg; pWInfo->savedNQueryLoop = pParse->nQueryLoop; @@ -144131,9 +144967,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ int wsFlags = pWInfo->a[0].pWLoop->wsFlags; int bOnerow = (wsFlags & WHERE_ONEROW)!=0; + assert( !(wsFlags & WHERE_VIRTUALTABLE) || IsVirtual(pTabList->a[0].pTab) ); if( bOnerow || ( 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) - && 0==(wsFlags & WHERE_VIRTUALTABLE) + && !IsVirtual(pTabList->a[0].pTab) && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) )){ pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; @@ -144288,7 +145125,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( pParse, pTabList, pLevel, wctrlFlags ); pLevel->addrBody = sqlite3VdbeCurrentAddr(v); - notReady = sqlite3WhereCodeOneLoopStart(pWInfo, ii, notReady); + notReady = sqlite3WhereCodeOneLoopStart(pParse,v,pWInfo,ii,pLevel,notReady); pWInfo->iContinue = pLevel->addrCont; if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_OR_SUBCLAUSE)==0 ){ sqlite3WhereAddScanStatus(v, pTabList, pLevel, addrExplain); @@ -144473,6 +145310,29 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ continue; } +#ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE + /* Close all of the cursors that were opened by sqlite3WhereBegin. + ** Except, do not close cursors that will be reused by the OR optimization + ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors + ** created for the ONEPASS optimization. + */ + if( (pTab->tabFlags & TF_Ephemeral)==0 + && pTab->pSelect==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + ){ + int ws = pLoop->wsFlags; + if( pWInfo->eOnePass==ONEPASS_OFF && (ws & WHERE_IDX_ONLY)==0 ){ + sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); + } + if( (ws & WHERE_INDEXED)!=0 + && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 + && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] + ){ + sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); + } + } +#endif + /* If this scan uses an index, make VDBE code substitutions to read data ** from the index instead of from the table where possible. In some cases ** this optimization prevents the table from ever being read, which can @@ -144747,6 +145607,96 @@ static void dense_rankValueFunc(sqlite3_context *pCtx){ } } +/* +** Implementation of built-in window function nth_value(). This +** implementation is used in "slow mode" only - when the EXCLUDE clause +** is not set to the default value "NO OTHERS". +*/ +struct NthValueCtx { + i64 nStep; + sqlite3_value *pValue; +}; +static void nth_valueStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + i64 iVal; + switch( sqlite3_value_numeric_type(apArg[1]) ){ + case SQLITE_INTEGER: + iVal = sqlite3_value_int64(apArg[1]); + break; + case SQLITE_FLOAT: { + double fVal = sqlite3_value_double(apArg[1]); + if( ((i64)fVal)!=fVal ) goto error_out; + iVal = (i64)fVal; + break; + } + default: + goto error_out; + } + if( iVal<=0 ) goto error_out; + + p->nStep++; + if( iVal==p->nStep ){ + p->pValue = sqlite3_value_dup(apArg[0]); + if( !p->pValue ){ + sqlite3_result_error_nomem(pCtx); + } + } + } + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); + return; + + error_out: + sqlite3_result_error( + pCtx, "second argument to nth_value must be a positive integer", -1 + ); +} +static void nth_valueFinalizeFunc(sqlite3_context *pCtx){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, 0); + if( p && p->pValue ){ + sqlite3_result_value(pCtx, p->pValue); + sqlite3_value_free(p->pValue); + p->pValue = 0; + } +} +#define nth_valueInvFunc noopStepFunc +#define nth_valueValueFunc noopValueFunc + +static void first_valueStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->pValue==0 ){ + p->pValue = sqlite3_value_dup(apArg[0]); + if( !p->pValue ){ + sqlite3_result_error_nomem(pCtx); + } + } + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); +} +static void first_valueFinalizeFunc(sqlite3_context *pCtx){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->pValue ){ + sqlite3_result_value(pCtx, p->pValue); + sqlite3_value_free(p->pValue); + p->pValue = 0; + } +} +#define first_valueInvFunc noopStepFunc +#define first_valueValueFunc noopValueFunc + /* ** Implementation of built-in window function rank(). Assumes that ** the window frame has been set to: @@ -144782,7 +145732,7 @@ static void rankValueFunc(sqlite3_context *pCtx){ ** Implementation of built-in window function percent_rank(). Assumes that ** the window frame has been set to: ** -** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +** GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING */ static void percent_rankStepFunc( sqlite3_context *pCtx, @@ -144790,38 +145740,44 @@ static void percent_rankStepFunc( sqlite3_value **apArg ){ struct CallCount *p; - UNUSED_PARAMETER(nArg); assert( nArg==1 ); - + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); if( p ){ - if( p->nTotal==0 ){ - p->nTotal = sqlite3_value_int64(apArg[0]); - } - p->nStep++; - if( p->nValue==0 ){ - p->nValue = p->nStep; - } + p->nTotal++; } } +static void percent_rankInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->nStep++; +} static void percent_rankValueFunc(sqlite3_context *pCtx){ struct CallCount *p; p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); if( p ){ + p->nValue = p->nStep; if( p->nTotal>1 ){ - double r = (double)(p->nValue-1) / (double)(p->nTotal-1); + double r = (double)p->nValue / (double)(p->nTotal-1); sqlite3_result_double(pCtx, r); }else{ sqlite3_result_double(pCtx, 0.0); } - p->nValue = 0; } } +#define percent_rankFinalizeFunc percent_rankValueFunc /* ** Implementation of built-in window function cume_dist(). Assumes that ** the window frame has been set to: ** -** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +** GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING */ static void cume_distStepFunc( sqlite3_context *pCtx, @@ -144829,24 +145785,33 @@ static void cume_distStepFunc( sqlite3_value **apArg ){ struct CallCount *p; - assert( nArg==1 ); UNUSED_PARAMETER(nArg); - + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); if( p ){ - if( p->nTotal==0 ){ - p->nTotal = sqlite3_value_int64(apArg[0]); - } - p->nStep++; + p->nTotal++; } } +static void cume_distInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->nStep++; +} static void cume_distValueFunc(sqlite3_context *pCtx){ struct CallCount *p; - p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); - if( p && p->nTotal ){ + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, 0); + if( p ){ double r = (double)(p->nStep) / (double)(p->nTotal); sqlite3_result_double(pCtx, r); } } +#define cume_distFinalizeFunc cume_distValueFunc /* ** Context object for ntile() window function. @@ -144861,7 +145826,7 @@ struct NtileCtx { ** Implementation of ntile(). This assumes that the window frame has ** been coerced to: ** -** ROWS UNBOUNDED PRECEDING AND CURRENT ROW +** ROWS CURRENT ROW AND UNBOUNDED FOLLOWING */ static void ntileStepFunc( sqlite3_context *pCtx, @@ -144869,32 +145834,42 @@ static void ntileStepFunc( sqlite3_value **apArg ){ struct NtileCtx *p; - assert( nArg==2 ); UNUSED_PARAMETER(nArg); + assert( nArg==1 ); UNUSED_PARAMETER(nArg); p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); if( p ){ if( p->nTotal==0 ){ p->nParam = sqlite3_value_int64(apArg[0]); - p->nTotal = sqlite3_value_int64(apArg[1]); if( p->nParam<=0 ){ sqlite3_result_error( pCtx, "argument of ntile must be a positive integer", -1 ); } } - p->iRow++; + p->nTotal++; } } +static void ntileInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NtileCtx *p; + assert( nArg==1 ); UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); + p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->iRow++; +} static void ntileValueFunc(sqlite3_context *pCtx){ struct NtileCtx *p; p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); if( p && p->nParam>0 ){ int nSize = (p->nTotal / p->nParam); if( nSize==0 ){ - sqlite3_result_int64(pCtx, p->iRow); + sqlite3_result_int64(pCtx, p->iRow+1); }else{ i64 nLarge = p->nTotal - p->nParam*nSize; i64 iSmall = nLarge*(nSize+1); - i64 iRow = p->iRow-1; + i64 iRow = p->iRow; assert( (nLarge*(nSize+1) + (p->nParam-nLarge)*nSize)==p->nTotal ); @@ -144906,6 +145881,7 @@ static void ntileValueFunc(sqlite3_context *pCtx){ } } } +#define ntileFinalizeFunc ntileValueFunc /* ** Context object for last_value() window function. @@ -144955,7 +145931,7 @@ static void last_valueInvFunc( } static void last_valueValueFunc(sqlite3_context *pCtx){ struct LastValueCtx *p; - p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, 0); if( p && p->pVal ){ sqlite3_result_value(pCtx, p->pVal); } @@ -145045,12 +146021,12 @@ SQLITE_PRIVATE void sqlite3WindowFunctions(void){ WINDOWFUNCX(row_number, 0, 0), WINDOWFUNCX(dense_rank, 0, 0), WINDOWFUNCX(rank, 0, 0), - WINDOWFUNCX(percent_rank, 0, SQLITE_FUNC_WINDOW_SIZE), - WINDOWFUNCX(cume_dist, 0, SQLITE_FUNC_WINDOW_SIZE), - WINDOWFUNCX(ntile, 1, SQLITE_FUNC_WINDOW_SIZE), + WINDOWFUNCALL(percent_rank, 0, 0), + WINDOWFUNCALL(cume_dist, 0, 0), + WINDOWFUNCALL(ntile, 1, 0), WINDOWFUNCALL(last_value, 1, 0), - WINDOWFUNCNOOP(nth_value, 2, 0), - WINDOWFUNCNOOP(first_value, 1, 0), + WINDOWFUNCALL(nth_value, 2, 0), + WINDOWFUNCALL(first_value, 1, 0), WINDOWFUNCNOOP(lead, 1, 0), WINDOWFUNCNOOP(lead, 2, 0), WINDOWFUNCNOOP(lead, 3, 0), @@ -145061,6 +146037,17 @@ SQLITE_PRIVATE void sqlite3WindowFunctions(void){ sqlite3InsertBuiltinFuncs(aWindowFuncs, ArraySize(aWindowFuncs)); } +static Window *windowFind(Parse *pParse, Window *pList, const char *zName){ + Window *p; + for(p=pList; p; p=p->pNextWin){ + if( sqlite3StrICmp(p->zName, zName)==0 ) break; + } + if( p==0 ){ + sqlite3ErrorMsg(pParse, "no such window: %s", zName); + } + return p; +} + /* ** This function is called immediately after resolving the function name ** for a window function within a SELECT statement. Argument pList is a @@ -145084,48 +146071,66 @@ SQLITE_PRIVATE void sqlite3WindowUpdate( Window *pWin, /* Window frame to update */ FuncDef *pFunc /* Window function definition */ ){ - if( pWin->zName && pWin->eType==0 ){ - Window *p; - for(p=pList; p; p=p->pNextWin){ - if( sqlite3StrICmp(p->zName, pWin->zName)==0 ) break; - } - if( p==0 ){ - sqlite3ErrorMsg(pParse, "no such window: %s", pWin->zName); - return; - } + if( pWin->zName && pWin->eFrmType==0 ){ + Window *p = windowFind(pParse, pList, pWin->zName); + if( p==0 ) return; pWin->pPartition = sqlite3ExprListDup(pParse->db, p->pPartition, 0); pWin->pOrderBy = sqlite3ExprListDup(pParse->db, p->pOrderBy, 0); pWin->pStart = sqlite3ExprDup(pParse->db, p->pStart, 0); pWin->pEnd = sqlite3ExprDup(pParse->db, p->pEnd, 0); pWin->eStart = p->eStart; pWin->eEnd = p->eEnd; - pWin->eType = p->eType; + pWin->eFrmType = p->eFrmType; + pWin->eExclude = p->eExclude; + }else{ + sqlite3WindowChain(pParse, pWin, pList); } + if( (pWin->eFrmType==TK_RANGE) + && (pWin->pStart || pWin->pEnd) + && (pWin->pOrderBy==0 || pWin->pOrderBy->nExpr!=1) + ){ + sqlite3ErrorMsg(pParse, + "RANGE with offset PRECEDING/FOLLOWING requires one ORDER BY expression" + ); + }else if( pFunc->funcFlags & SQLITE_FUNC_WINDOW ){ sqlite3 *db = pParse->db; if( pWin->pFilter ){ sqlite3ErrorMsg(pParse, "FILTER clause may only be used with aggregate window functions" ); - }else - if( pFunc->zName==row_numberName || pFunc->zName==ntileName ){ - sqlite3ExprDelete(db, pWin->pStart); - sqlite3ExprDelete(db, pWin->pEnd); - pWin->pStart = pWin->pEnd = 0; - pWin->eType = TK_ROWS; - pWin->eStart = TK_UNBOUNDED; - pWin->eEnd = TK_CURRENT; - }else - - if( pFunc->zName==dense_rankName || pFunc->zName==rankName - || pFunc->zName==percent_rankName || pFunc->zName==cume_distName - ){ - sqlite3ExprDelete(db, pWin->pStart); - sqlite3ExprDelete(db, pWin->pEnd); - pWin->pStart = pWin->pEnd = 0; - pWin->eType = TK_RANGE; - pWin->eStart = TK_UNBOUNDED; - pWin->eEnd = TK_CURRENT; + }else{ + struct WindowUpdate { + const char *zFunc; + int eFrmType; + int eStart; + int eEnd; + } aUp[] = { + { row_numberName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, + { dense_rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, + { rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, + { percent_rankName, TK_GROUPS, TK_CURRENT, TK_UNBOUNDED }, + { cume_distName, TK_GROUPS, TK_FOLLOWING, TK_UNBOUNDED }, + { ntileName, TK_ROWS, TK_CURRENT, TK_UNBOUNDED }, + { leadName, TK_ROWS, TK_UNBOUNDED, TK_UNBOUNDED }, + { lagName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, + }; + int i; + for(i=0; izName==aUp[i].zFunc ){ + sqlite3ExprDelete(db, pWin->pStart); + sqlite3ExprDelete(db, pWin->pEnd); + pWin->pEnd = pWin->pStart = 0; + pWin->eFrmType = aUp[i].eFrmType; + pWin->eStart = aUp[i].eStart; + pWin->eEnd = aUp[i].eEnd; + pWin->eExclude = 0; + if( pWin->eStart==TK_FOLLOWING ){ + pWin->pStart = sqlite3Expr(db, TK_INTEGER, "1"); + } + break; + } + } } } pWin->pFunc = pFunc; @@ -145330,6 +146335,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ ** The OpenEphemeral instruction is coded later, after it is known how ** many columns the table will have. */ pMWin->iEphCsr = pParse->nTab++; + pParse->nTab += 3; selectWindowRewriteEList(pParse, pMWin, pSrc, p->pEList, &pSublist); selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, &pSublist); @@ -145372,8 +146378,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ pSub = sqlite3SelectNew( pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0 ); - p->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); - assert( p->pSrc || db->mallocFailed ); + p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); @@ -145386,6 +146391,9 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ } sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, pSublist->nExpr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+1, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+2, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+3, pMWin->iEphCsr); }else{ sqlite3SelectDelete(db, pSub); } @@ -145406,6 +146414,7 @@ SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3 *db, Window *p){ sqlite3ExprDelete(db, p->pEnd); sqlite3ExprDelete(db, p->pStart); sqlite3DbFree(db, p->zName); + sqlite3DbFree(db, p->zBase); sqlite3DbFree(db, p); } } @@ -145430,6 +146439,7 @@ SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p){ */ static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ if( 0==sqlite3ExprIsConstant(pExpr) ){ + if( IN_RENAME_OBJECT ) sqlite3RenameExprUnmap(pParse, pExpr); sqlite3ExprDelete(pParse->db, pExpr); pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0); } @@ -145441,16 +146451,18 @@ static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ */ SQLITE_PRIVATE Window *sqlite3WindowAlloc( Parse *pParse, /* Parsing context */ - int eType, /* Frame type. TK_RANGE or TK_ROWS */ + int eType, /* Frame type. TK_RANGE, TK_ROWS, TK_GROUPS, or 0 */ int eStart, /* Start type: CURRENT, PRECEDING, FOLLOWING, UNBOUNDED */ Expr *pStart, /* Start window size if TK_PRECEDING or FOLLOWING */ int eEnd, /* End type: CURRENT, FOLLOWING, TK_UNBOUNDED, PRECEDING */ - Expr *pEnd /* End window size if TK_FOLLOWING or PRECEDING */ + Expr *pEnd, /* End window size if TK_FOLLOWING or PRECEDING */ + u8 eExclude /* EXCLUDE clause */ ){ Window *pWin = 0; + int bImplicitFrame = 0; /* Parser assures the following: */ - assert( eType==TK_RANGE || eType==TK_ROWS ); + assert( eType==0 || eType==TK_RANGE || eType==TK_ROWS || eType==TK_GROUPS ); assert( eStart==TK_CURRENT || eStart==TK_PRECEDING || eStart==TK_UNBOUNDED || eStart==TK_FOLLOWING ); assert( eEnd==TK_CURRENT || eEnd==TK_FOLLOWING @@ -145458,13 +146470,9 @@ SQLITE_PRIVATE Window *sqlite3WindowAlloc( assert( (eStart==TK_PRECEDING || eStart==TK_FOLLOWING)==(pStart!=0) ); assert( (eEnd==TK_FOLLOWING || eEnd==TK_PRECEDING)==(pEnd!=0) ); - - /* If a frame is declared "RANGE" (not "ROWS"), then it may not use - ** either " PRECEDING" or " FOLLOWING". - */ - if( eType==TK_RANGE && (pStart!=0 || pEnd!=0) ){ - sqlite3ErrorMsg(pParse, "RANGE must use only UNBOUNDED or CURRENT ROW"); - goto windowAllocErr; + if( eType==0 ){ + bImplicitFrame = 1; + eType = TK_RANGE; } /* Additionally, the @@ -145484,15 +146492,20 @@ SQLITE_PRIVATE Window *sqlite3WindowAlloc( if( (eStart==TK_CURRENT && eEnd==TK_PRECEDING) || (eStart==TK_FOLLOWING && (eEnd==TK_PRECEDING || eEnd==TK_CURRENT)) ){ - sqlite3ErrorMsg(pParse, "unsupported frame delimiter for ROWS"); + sqlite3ErrorMsg(pParse, "unsupported frame specification"); goto windowAllocErr; } pWin = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); if( pWin==0 ) goto windowAllocErr; - pWin->eType = eType; + pWin->eFrmType = eType; pWin->eStart = eStart; pWin->eEnd = eEnd; + if( eExclude==0 && OptimizationDisabled(pParse->db, SQLITE_WindowFunc) ){ + eExclude = TK_NO; + } + pWin->eExclude = eExclude; + pWin->bImplicitFrame = bImplicitFrame; pWin->pEnd = sqlite3WindowOffsetExpr(pParse, pEnd); pWin->pStart = sqlite3WindowOffsetExpr(pParse, pStart); return pWin; @@ -145503,6 +146516,69 @@ windowAllocErr: return 0; } +/* +** Attach PARTITION and ORDER BY clauses pPartition and pOrderBy to window +** pWin. Also, if parameter pBase is not NULL, set pWin->zBase to the +** equivalent nul-terminated string. +*/ +SQLITE_PRIVATE Window *sqlite3WindowAssemble( + Parse *pParse, + Window *pWin, + ExprList *pPartition, + ExprList *pOrderBy, + Token *pBase +){ + if( pWin ){ + pWin->pPartition = pPartition; + pWin->pOrderBy = pOrderBy; + if( pBase ){ + pWin->zBase = sqlite3DbStrNDup(pParse->db, pBase->z, pBase->n); + } + }else{ + sqlite3ExprListDelete(pParse->db, pPartition); + sqlite3ExprListDelete(pParse->db, pOrderBy); + } + return pWin; +} + +/* +** Window *pWin has just been created from a WINDOW clause. Tokne pBase +** is the base window. Earlier windows from the same WINDOW clause are +** stored in the linked list starting at pWin->pNextWin. This function +** either updates *pWin according to the base specification, or else +** leaves an error in pParse. +*/ +SQLITE_PRIVATE void sqlite3WindowChain(Parse *pParse, Window *pWin, Window *pList){ + if( pWin->zBase ){ + sqlite3 *db = pParse->db; + Window *pExist = windowFind(pParse, pList, pWin->zBase); + if( pExist ){ + const char *zErr = 0; + /* Check for errors */ + if( pWin->pPartition ){ + zErr = "PARTITION clause"; + }else if( pExist->pOrderBy && pWin->pOrderBy ){ + zErr = "ORDER BY clause"; + }else if( pExist->bImplicitFrame==0 ){ + zErr = "frame specification"; + } + if( zErr ){ + sqlite3ErrorMsg(pParse, + "cannot override %s of window: %s", zErr, pWin->zBase + ); + }else{ + pWin->pPartition = sqlite3ExprListDup(db, pExist->pPartition, 0); + if( pExist->pOrderBy ){ + assert( pWin->pOrderBy==0 ); + pWin->pOrderBy = sqlite3ExprListDup(db, pExist->pOrderBy, 0); + } + sqlite3DbFree(db, pWin->zBase); + pWin->zBase = 0; + } + } + } +} + /* ** Attach window object pWin to expression p. */ @@ -145531,9 +146607,10 @@ SQLITE_PRIVATE void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ ** Identical window objects can be processed in a single scan. */ SQLITE_PRIVATE int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2){ - if( p1->eType!=p2->eType ) return 1; + if( p1->eFrmType!=p2->eFrmType ) return 1; if( p1->eStart!=p2->eStart ) return 1; if( p1->eEnd!=p2->eEnd ) return 1; + if( p1->eExclude!=p2->eExclude ) return 1; if( sqlite3ExprCompare(pParse, p1->pStart, p2->pStart, -1) ) return 1; if( sqlite3ExprCompare(pParse, p1->pEnd, p2->pEnd, -1) ) return 1; if( sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1) ) return 1; @@ -145550,12 +146627,27 @@ SQLITE_PRIVATE int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2){ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ Window *pWin; Vdbe *v = sqlite3GetVdbe(pParse); - int nPart = (pMWin->pPartition ? pMWin->pPartition->nExpr : 0); - nPart += (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); - if( nPart ){ + + /* Allocate registers to use for PARTITION BY values, if any. Initialize + ** said registers to NULL. */ + if( pMWin->pPartition ){ + int nExpr = pMWin->pPartition->nExpr; pMWin->regPart = pParse->nMem+1; - pParse->nMem += nPart; - sqlite3VdbeAddOp3(v, OP_Null, 0, pMWin->regPart, pMWin->regPart+nPart-1); + pParse->nMem += nExpr; + sqlite3VdbeAddOp3(v, OP_Null, 0, pMWin->regPart, pMWin->regPart+nExpr-1); + } + + pMWin->regOne = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regOne); + + if( pMWin->eExclude ){ + pMWin->regStartRowid = ++pParse->nMem; + pMWin->regEndRowid = ++pParse->nMem; + pMWin->csrApp = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regStartRowid); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regEndRowid); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->csrApp, pMWin->iEphCsr); + return; } for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ @@ -145584,20 +146676,24 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ else if( p->zName==nth_valueName || p->zName==first_valueName ){ /* Allocate two registers at pWin->regApp. These will be used to ** store the start and end index of the current frame. */ - assert( pMWin->iEphCsr ); pWin->regApp = pParse->nMem+1; pWin->csrApp = pParse->nTab++; pParse->nMem += 2; sqlite3VdbeAddOp2(v, OP_OpenDup, pWin->csrApp, pMWin->iEphCsr); } else if( p->zName==leadName || p->zName==lagName ){ - assert( pMWin->iEphCsr ); pWin->csrApp = pParse->nTab++; sqlite3VdbeAddOp2(v, OP_OpenDup, pWin->csrApp, pMWin->iEphCsr); } } } +#define WINDOW_STARTING_INT 0 +#define WINDOW_ENDING_INT 1 +#define WINDOW_NTH_VALUE_INT 2 +#define WINDOW_STARTING_NUM 3 +#define WINDOW_ENDING_NUM 4 + /* ** A "PRECEDING " (eCond==0) or "FOLLOWING " (eCond==1) or the ** value of the second argument to nth_value() (eCond==2) has just been @@ -145605,25 +146701,43 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ ** code to check that the value is a non-negative integer and throws an ** exception if it is not. */ -static void windowCheckIntValue(Parse *pParse, int reg, int eCond){ +static void windowCheckValue(Parse *pParse, int reg, int eCond){ static const char *azErr[] = { "frame starting offset must be a non-negative integer", "frame ending offset must be a non-negative integer", - "second argument to nth_value must be a positive integer" + "second argument to nth_value must be a positive integer", + "frame starting offset must be a non-negative number", + "frame ending offset must be a non-negative number", }; - static int aOp[] = { OP_Ge, OP_Ge, OP_Gt }; + static int aOp[] = { OP_Ge, OP_Ge, OP_Gt, OP_Ge, OP_Ge }; Vdbe *v = sqlite3GetVdbe(pParse); int regZero = sqlite3GetTempReg(pParse); - assert( eCond==0 || eCond==1 || eCond==2 ); + assert( eCond>=0 && eCond=WINDOW_STARTING_NUM ){ + int regString = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4(v, OP_String8, 0, regString, 0, "", P4_STATIC); + sqlite3VdbeAddOp3(v, OP_Ge, regString, sqlite3VdbeCurrentAddr(v)+2, reg); + sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC|SQLITE_JUMPIFNULL); + VdbeCoverage(v); + assert( eCond==3 || eCond==4 ); + VdbeCoverageIf(v, eCond==3); + VdbeCoverageIf(v, eCond==4); + }else{ + sqlite3VdbeAddOp2(v, OP_MustBeInt, reg, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + assert( eCond==0 || eCond==1 || eCond==2 ); + VdbeCoverageIf(v, eCond==0); + VdbeCoverageIf(v, eCond==1); + VdbeCoverageIf(v, eCond==2); + } sqlite3VdbeAddOp3(v, aOp[eCond], regZero, sqlite3VdbeCurrentAddr(v)+2, reg); - VdbeCoverageNeverNullIf(v, eCond==0); - VdbeCoverageNeverNullIf(v, eCond==1); + VdbeCoverageNeverNullIf(v, eCond==0); /* NULL case captured by */ + VdbeCoverageNeverNullIf(v, eCond==1); /* the OP_MustBeInt */ VdbeCoverageNeverNullIf(v, eCond==2); + VdbeCoverageNeverNullIf(v, eCond==3); /* NULL case caught by */ + VdbeCoverageNeverNullIf(v, eCond==4); /* the OP_Ge */ + sqlite3MayAbort(pParse); sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort); sqlite3VdbeAppendP4(v, (void*)azErr[eCond], P4_STATIC); sqlite3ReleaseTempReg(pParse, regZero); @@ -145662,37 +146776,28 @@ static void windowAggStep( Window *pMWin, /* Linked list of window functions */ int csr, /* Read arguments from this cursor */ int bInverse, /* True to invoke xInverse instead of xStep */ - int reg, /* Array of registers */ - int regPartSize /* Register containing size of partition */ + int reg /* Array of registers */ ){ Vdbe *v = sqlite3GetVdbe(pParse); Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - int flags = pWin->pFunc->funcFlags; + FuncDef *pFunc = pWin->pFunc; int regArg; int nArg = windowArgCount(pWin); + int i; - if( csr>=0 ){ - int i; - for(i=0; izName!=nth_valueName ){ sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+i, reg+i); + }else{ + sqlite3VdbeAddOp3(v, OP_Column, pMWin->iEphCsr, pWin->iArgCol+i, reg+i); } - regArg = reg; - if( flags & SQLITE_FUNC_WINDOW_SIZE ){ - if( nArg==0 ){ - regArg = regPartSize; - }else{ - sqlite3VdbeAddOp2(v, OP_SCopy, regPartSize, reg+nArg); - } - nArg++; - } - }else{ - assert( !(flags & SQLITE_FUNC_WINDOW_SIZE) ); - regArg = reg + pWin->iArgCol; } + regArg = reg; - if( (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) - && pWin->eStart!=TK_UNBOUNDED + if( pMWin->regStartRowid==0 + && (pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->eStart!=TK_UNBOUNDED) ){ int addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regArg); VdbeCoverage(v); @@ -145709,34 +146814,24 @@ static void windowAggStep( } sqlite3VdbeJumpHere(v, addrIsNull); }else if( pWin->regApp ){ - assert( pWin->pFunc->zName==nth_valueName - || pWin->pFunc->zName==first_valueName + assert( pFunc->zName==nth_valueName + || pFunc->zName==first_valueName ); assert( bInverse==0 || bInverse==1 ); sqlite3VdbeAddOp2(v, OP_AddImm, pWin->regApp+1-bInverse, 1); - }else if( pWin->pFunc->zName==leadName - || pWin->pFunc->zName==lagName - ){ - /* no-op */ - }else{ + }else if( pFunc->xSFunc!=noopStepFunc ){ int addrIf = 0; if( pWin->pFilter ){ int regTmp; assert( nArg==0 || nArg==pWin->pOwner->x.pList->nExpr ); assert( nArg || pWin->pOwner->x.pList==0 ); - if( csr>0 ){ - regTmp = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+nArg,regTmp); - }else{ - regTmp = regArg + nArg; - } + regTmp = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+nArg,regTmp); addrIf = sqlite3VdbeAddOp3(v, OP_IfNot, regTmp, 0, 1); VdbeCoverage(v); - if( csr>0 ){ - sqlite3ReleaseTempReg(pParse, regTmp); - } + sqlite3ReleaseTempReg(pParse, regTmp); } - if( pWin->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ CollSeq *pColl; assert( nArg>0 ); pColl = sqlite3ExprNNCollSeq(pParse, pWin->pOwner->x.pList->a[0].pExpr); @@ -145744,45 +146839,96 @@ static void windowAggStep( } sqlite3VdbeAddOp3(v, bInverse? OP_AggInverse : OP_AggStep, bInverse, regArg, pWin->regAccum); - sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); + sqlite3VdbeAppendP4(v, pFunc, P4_FUNCDEF); sqlite3VdbeChangeP5(v, (u8)nArg); if( addrIf ) sqlite3VdbeJumpHere(v, addrIf); } } } +typedef struct WindowCodeArg WindowCodeArg; +typedef struct WindowCsrAndReg WindowCsrAndReg; +struct WindowCsrAndReg { + int csr; + int reg; +}; + +struct WindowCodeArg { + Parse *pParse; + Window *pMWin; + Vdbe *pVdbe; + int regGosub; + int addrGosub; + int regArg; + int eDelete; + + WindowCsrAndReg start; + WindowCsrAndReg current; + WindowCsrAndReg end; +}; + /* -** Generate VM code to invoke either xValue() (bFinal==0) or xFinalize() -** (bFinal==1) for each window function in the linked list starting at +** Values that may be passed as the second argument to windowCodeOp(). +*/ +#define WINDOW_RETURN_ROW 1 +#define WINDOW_AGGINVERSE 2 +#define WINDOW_AGGSTEP 3 + +/* +** Generate VM code to read the window frames peer values from cursor csr into +** an array of registers starting at reg. +*/ +static void windowReadPeerValues( + WindowCodeArg *p, + int csr, + int reg +){ + Window *pMWin = p->pMWin; + ExprList *pOrderBy = pMWin->pOrderBy; + if( pOrderBy ){ + Vdbe *v = sqlite3GetVdbe(p->pParse); + ExprList *pPart = pMWin->pPartition; + int iColOff = pMWin->nBufferCol + (pPart ? pPart->nExpr : 0); + int i; + for(i=0; inExpr; i++){ + sqlite3VdbeAddOp3(v, OP_Column, csr, iColOff+i, reg+i); + } + } +} + +/* +** Generate VM code to invoke either xValue() (bFin==0) or xFinalize() +** (bFin==1) for each window function in the linked list starting at ** pMWin. Or, for built-in window-functions that do not use the standard ** API, generate the equivalent VM code. */ -static void windowAggFinal(Parse *pParse, Window *pMWin, int bFinal){ +static void windowAggFinal(WindowCodeArg *p, int bFin){ + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; Vdbe *v = sqlite3GetVdbe(pParse); Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - if( (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) - && pWin->eStart!=TK_UNBOUNDED + if( pMWin->regStartRowid==0 + && (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->eStart!=TK_UNBOUNDED) ){ sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); sqlite3VdbeAddOp1(v, OP_Last, pWin->csrApp); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Column, pWin->csrApp, 0, pWin->regResult); sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); - if( bFinal ){ - sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp); - } }else if( pWin->regApp ){ + assert( pMWin->regStartRowid==0 ); }else{ - if( bFinal ){ - sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, windowArgCount(pWin)); + int nArg = windowArgCount(pWin); + if( bFin ){ + sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, nArg); sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); sqlite3VdbeAddOp2(v, OP_Copy, pWin->regAccum, pWin->regResult); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); }else{ - sqlite3VdbeAddOp3(v, OP_AggValue, pWin->regAccum, windowArgCount(pWin), - pWin->regResult); + sqlite3VdbeAddOp3(v, OP_AggValue,pWin->regAccum,nArg,pWin->regResult); sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); } } @@ -145790,66 +146936,97 @@ static void windowAggFinal(Parse *pParse, Window *pMWin, int bFinal){ } /* -** This function generates VM code to invoke the sub-routine at address -** lblFlushPart once for each partition with the entire partition cached in -** the Window.iEphCsr temp table. +** Generate code to calculate the current values of all window functions in the +** p->pMWin list by doing a full scan of the current window frame. Store the +** results in the Window.regResult registers, ready to return the upper +** layer. */ -static void windowPartitionCache( - Parse *pParse, - Select *p, /* The rewritten SELECT statement */ - WhereInfo *pWInfo, /* WhereInfo to call WhereEnd() on */ - int regFlushPart, /* Register to use with Gosub lblFlushPart */ - int lblFlushPart, /* Subroutine to Gosub to */ - int *pRegSize /* OUT: Register containing partition size */ -){ - Window *pMWin = p->pWin; - Vdbe *v = sqlite3GetVdbe(pParse); - int iSubCsr = p->pSrc->a[0].iCursor; - int nSub = p->pSrc->a[0].pTab->nCol; - int k; +static void windowFullScan(WindowCodeArg *p){ + Window *pWin; + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; + Vdbe *v = p->pVdbe; - int reg = pParse->nMem+1; - int regRecord = reg+nSub; - int regRowid = regRecord+1; + int regCRowid = 0; /* Current rowid value */ + int regCPeer = 0; /* Current peer values */ + int regRowid = 0; /* AggStep rowid value */ + int regPeer = 0; /* AggStep peer values */ - *pRegSize = regRowid; - pParse->nMem += nSub + 2; + int nPeer; + int lblNext; + int lblBrk; + int addrNext; + int csr = pMWin->csrApp; - /* Load the column values for the row returned by the sub-select - ** into an array of registers starting at reg. */ - for(k=0; kpOrderBy ? pMWin->pOrderBy->nExpr : 0); + + lblNext = sqlite3VdbeMakeLabel(pParse); + lblBrk = sqlite3VdbeMakeLabel(pParse); + + regCRowid = sqlite3GetTempReg(pParse); + regRowid = sqlite3GetTempReg(pParse); + if( nPeer ){ + regCPeer = sqlite3GetTempRange(pParse, nPeer); + regPeer = sqlite3GetTempRange(pParse, nPeer); } - sqlite3VdbeAddOp3(v, OP_MakeRecord, reg, nSub, regRecord); - /* Check if this is the start of a new partition. If so, call the - ** flush_partition sub-routine. */ - if( pMWin->pPartition ){ + sqlite3VdbeAddOp2(v, OP_Rowid, pMWin->iEphCsr, regCRowid); + windowReadPeerValues(p, pMWin->iEphCsr, regCPeer); + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); + } + + sqlite3VdbeAddOp3(v, OP_SeekGE, csr, lblBrk, pMWin->regStartRowid); + VdbeCoverage(v); + addrNext = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Rowid, csr, regRowid); + sqlite3VdbeAddOp3(v, OP_Gt, pMWin->regEndRowid, lblBrk, regRowid); + VdbeCoverageNeverNull(v); + + if( pMWin->eExclude==TK_CURRENT ){ + sqlite3VdbeAddOp3(v, OP_Eq, regCRowid, lblNext, regRowid); + VdbeCoverageNeverNull(v); + }else if( pMWin->eExclude!=TK_NO ){ int addr; - ExprList *pPart = pMWin->pPartition; - int nPart = pPart->nExpr; - int regNewPart = reg + pMWin->nBufferCol; - KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); + int addrEq = 0; + KeyInfo *pKeyInfo = 0; - addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPart, pMWin->regPart,nPart); - sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); - sqlite3VdbeAddOp3(v, OP_Jump, addr+2, addr+4, addr+2); - VdbeCoverageEqNe(v); - sqlite3VdbeAddOp3(v, OP_Copy, regNewPart, pMWin->regPart, nPart-1); - sqlite3VdbeAddOp2(v, OP_Gosub, regFlushPart, lblFlushPart); - VdbeComment((v, "call flush_partition")); + if( pMWin->pOrderBy ){ + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pMWin->pOrderBy, 0, 0); + } + if( pMWin->eExclude==TK_TIES ){ + addrEq = sqlite3VdbeAddOp3(v, OP_Eq, regCRowid, 0, regRowid); + VdbeCoverageNeverNull(v); + } + if( pKeyInfo ){ + windowReadPeerValues(p, csr, regPeer); + sqlite3VdbeAddOp3(v, OP_Compare, regPeer, regCPeer, nPeer); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + addr = sqlite3VdbeCurrentAddr(v)+1; + sqlite3VdbeAddOp3(v, OP_Jump, addr, lblNext, addr); + VdbeCoverageEqNe(v); + }else{ + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblNext); + } + if( addrEq ) sqlite3VdbeJumpHere(v, addrEq); } - /* Buffer the current row in the ephemeral table. */ - sqlite3VdbeAddOp2(v, OP_NewRowid, pMWin->iEphCsr, regRowid); - sqlite3VdbeAddOp3(v, OP_Insert, pMWin->iEphCsr, regRecord, regRowid); + windowAggStep(pParse, pMWin, csr, 0, p->regArg); - /* End of the input loop */ - sqlite3WhereEnd(pWInfo); + sqlite3VdbeResolveLabel(v, lblNext); + sqlite3VdbeAddOp2(v, OP_Next, csr, addrNext); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrNext-1); + sqlite3VdbeJumpHere(v, addrNext+1); + sqlite3ReleaseTempReg(pParse, regRowid); + sqlite3ReleaseTempReg(pParse, regCRowid); + if( nPeer ){ + sqlite3ReleaseTempRange(pParse, regPeer, nPeer); + sqlite3ReleaseTempRange(pParse, regCPeer, nPeer); + } - /* Invoke "flush_partition" to deal with the final (or only) partition */ - sqlite3VdbeAddOp2(v, OP_Gosub, regFlushPart, lblFlushPart); - VdbeComment((v, "call flush_partition")); + windowAggFinal(p, 1); } /* @@ -145865,110 +147042,74 @@ static void windowPartitionCache( ** lag() ** lead() */ -static void windowReturnOneRow( - Parse *pParse, - Window *pMWin, - int regGosub, - int addrGosub -){ - Vdbe *v = sqlite3GetVdbe(pParse); - Window *pWin; - for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; - if( pFunc->zName==nth_valueName - || pFunc->zName==first_valueName - ){ - int csr = pWin->csrApp; - int lbl = sqlite3VdbeMakeLabel(v); - int tmpReg = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); +static void windowReturnOneRow(WindowCodeArg *p){ + Window *pMWin = p->pMWin; + Vdbe *v = p->pVdbe; - if( pFunc->zName==nth_valueName ){ - sqlite3VdbeAddOp3(v, OP_Column, pMWin->iEphCsr, pWin->iArgCol+1,tmpReg); - windowCheckIntValue(pParse, tmpReg, 2); - }else{ - sqlite3VdbeAddOp2(v, OP_Integer, 1, tmpReg); - } - sqlite3VdbeAddOp3(v, OP_Add, tmpReg, pWin->regApp, tmpReg); - sqlite3VdbeAddOp3(v, OP_Gt, pWin->regApp+1, lbl, tmpReg); - VdbeCoverageNeverNull(v); - sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, 0, tmpReg); - VdbeCoverageNeverTaken(v); - sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); - sqlite3VdbeResolveLabel(v, lbl); - sqlite3ReleaseTempReg(pParse, tmpReg); - } - else if( pFunc->zName==leadName || pFunc->zName==lagName ){ - int nArg = pWin->pOwner->x.pList->nExpr; - int iEph = pMWin->iEphCsr; - int csr = pWin->csrApp; - int lbl = sqlite3VdbeMakeLabel(v); - int tmpReg = sqlite3GetTempReg(pParse); + if( pMWin->regStartRowid ){ + windowFullScan(p); + }else{ + Parse *pParse = p->pParse; + Window *pWin; - if( nArg<3 ){ + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pFunc; + if( pFunc->zName==nth_valueName + || pFunc->zName==first_valueName + ){ + int csr = pWin->csrApp; + int lbl = sqlite3VdbeMakeLabel(pParse); + int tmpReg = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); - }else{ - sqlite3VdbeAddOp3(v, OP_Column, iEph, pWin->iArgCol+2, pWin->regResult); + + if( pFunc->zName==nth_valueName ){ + sqlite3VdbeAddOp3(v, OP_Column,pMWin->iEphCsr,pWin->iArgCol+1,tmpReg); + windowCheckValue(pParse, tmpReg, 2); + }else{ + sqlite3VdbeAddOp2(v, OP_Integer, 1, tmpReg); + } + sqlite3VdbeAddOp3(v, OP_Add, tmpReg, pWin->regApp, tmpReg); + sqlite3VdbeAddOp3(v, OP_Gt, pWin->regApp+1, lbl, tmpReg); + VdbeCoverageNeverNull(v); + sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, 0, tmpReg); + VdbeCoverageNeverTaken(v); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); + sqlite3VdbeResolveLabel(v, lbl); + sqlite3ReleaseTempReg(pParse, tmpReg); } - sqlite3VdbeAddOp2(v, OP_Rowid, iEph, tmpReg); - if( nArg<2 ){ - int val = (pFunc->zName==leadName ? 1 : -1); - sqlite3VdbeAddOp2(v, OP_AddImm, tmpReg, val); - }else{ - int op = (pFunc->zName==leadName ? OP_Add : OP_Subtract); - int tmpReg2 = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp3(v, OP_Column, iEph, pWin->iArgCol+1, tmpReg2); - sqlite3VdbeAddOp3(v, op, tmpReg2, tmpReg, tmpReg); - sqlite3ReleaseTempReg(pParse, tmpReg2); + else if( pFunc->zName==leadName || pFunc->zName==lagName ){ + int nArg = pWin->pOwner->x.pList->nExpr; + int csr = pWin->csrApp; + int lbl = sqlite3VdbeMakeLabel(pParse); + int tmpReg = sqlite3GetTempReg(pParse); + int iEph = pMWin->iEphCsr; + + if( nArg<3 ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); + }else{ + sqlite3VdbeAddOp3(v, OP_Column, iEph,pWin->iArgCol+2,pWin->regResult); + } + sqlite3VdbeAddOp2(v, OP_Rowid, iEph, tmpReg); + if( nArg<2 ){ + int val = (pFunc->zName==leadName ? 1 : -1); + sqlite3VdbeAddOp2(v, OP_AddImm, tmpReg, val); + }else{ + int op = (pFunc->zName==leadName ? OP_Add : OP_Subtract); + int tmpReg2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_Column, iEph, pWin->iArgCol+1, tmpReg2); + sqlite3VdbeAddOp3(v, op, tmpReg2, tmpReg, tmpReg); + sqlite3ReleaseTempReg(pParse, tmpReg2); + } + + sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, lbl, tmpReg); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); + sqlite3VdbeResolveLabel(v, lbl); + sqlite3ReleaseTempReg(pParse, tmpReg); } - - sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, lbl, tmpReg); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); - sqlite3VdbeResolveLabel(v, lbl); - sqlite3ReleaseTempReg(pParse, tmpReg); } } - sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub); -} - -/* -** Invoke the code generated by windowReturnOneRow() and, optionally, the -** xInverse() function for each window function, for one or more rows -** from the Window.iEphCsr temp table. This routine generates VM code -** similar to: -** -** while( regCtr>0 ){ -** regCtr--; -** windowReturnOneRow() -** if( bInverse ){ -** AggInverse -** } -** Next (Window.iEphCsr) -** } -*/ -static void windowReturnRows( - Parse *pParse, - Window *pMWin, /* List of window functions */ - int regCtr, /* Register containing number of rows */ - int regGosub, /* Register for Gosub addrGosub */ - int addrGosub, /* Address of sub-routine for ReturnOneRow */ - int regInvArg, /* Array of registers for xInverse args */ - int regInvSize /* Register containing size of partition */ -){ - int addr; - Vdbe *v = sqlite3GetVdbe(pParse); - windowAggFinal(pParse, pMWin, 0); - addr = sqlite3VdbeAddOp3(v, OP_IfPos, regCtr, sqlite3VdbeCurrentAddr(v)+2 ,1); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, 0); - windowReturnOneRow(pParse, pMWin, regGosub, addrGosub); - if( regInvArg ){ - windowAggStep(pParse, pMWin, pMWin->iEphCsr, 1, regInvArg, regInvSize); - } - sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, addr); - VdbeCoverage(v); - sqlite3VdbeJumpHere(v, addr+1); /* The OP_Goto */ + sqlite3VdbeAddOp2(v, OP_Gosub, p->regGosub, p->addrGosub); } /* @@ -145986,17 +147127,17 @@ static int windowInitAccum(Parse *pParse, Window *pMWin){ FuncDef *pFunc = pWin->pFunc; sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); nArg = MAX(nArg, windowArgCount(pWin)); - if( pFunc->zName==nth_valueName - || pFunc->zName==first_valueName - ){ - sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp); - sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); - } + if( pMWin->regStartRowid==0 ){ + if( pFunc->zName==nth_valueName || pFunc->zName==first_valueName ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + } - if( (pFunc->funcFlags & SQLITE_FUNC_MINMAX) && pWin->csrApp ){ - assert( pWin->eStart!=TK_UNBOUNDED ); - sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp); - sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + if( (pFunc->funcFlags & SQLITE_FUNC_MINMAX) && pWin->csrApp ){ + assert( pWin->eStart!=TK_UNBOUNDED ); + sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + } } } regArg = pParse->nMem+1; @@ -146004,672 +147145,248 @@ static int windowInitAccum(Parse *pParse, Window *pMWin){ return regArg; } - -/* -** This function does the work of sqlite3WindowCodeStep() for all "ROWS" -** window frame types except for "BETWEEN UNBOUNDED PRECEDING AND CURRENT -** ROW". Pseudo-code for each follows. -** -** ROWS BETWEEN PRECEDING AND FOLLOWING -** -** ... -** if( new partition ){ -** Gosub flush_partition -** } -** Insert (record in eph-table) -** sqlite3WhereEnd() -** Gosub flush_partition -** -** flush_partition: -** Once { -** OpenDup (iEphCsr -> csrStart) -** OpenDup (iEphCsr -> csrEnd) -** } -** regStart = // PRECEDING expression -** regEnd = // FOLLOWING expression -** if( regStart<0 || regEnd<0 ){ error! } -** Rewind (csr,csrStart,csrEnd) // if EOF goto flush_partition_done -** Next(csrEnd) // if EOF skip Aggstep -** Aggstep (csrEnd) -** if( (regEnd--)<=0 ){ -** AggFinal (xValue) -** Gosub addrGosub -** Next(csr) // if EOF goto flush_partition_done -** if( (regStart--)<=0 ){ -** AggInverse (csrStart) -** Next(csrStart) -** } -** } -** flush_partition_done: -** ResetSorter (csr) -** Return -** -** ROWS BETWEEN PRECEDING AND CURRENT ROW -** ROWS BETWEEN CURRENT ROW AND FOLLOWING -** ROWS BETWEEN UNBOUNDED PRECEDING AND FOLLOWING -** -** These are similar to the above. For "CURRENT ROW", intialize the -** register to 0. For "UNBOUNDED PRECEDING" to infinity. -** -** ROWS BETWEEN PRECEDING AND UNBOUNDED FOLLOWING -** ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING -** -** Rewind (csr,csrStart,csrEnd) // if EOF goto flush_partition_done -** while( 1 ){ -** Next(csrEnd) // Exit while(1) at EOF -** Aggstep (csrEnd) -** } -** while( 1 ){ -** AggFinal (xValue) -** Gosub addrGosub -** Next(csr) // if EOF goto flush_partition_done -** if( (regStart--)<=0 ){ -** AggInverse (csrStart) -** Next(csrStart) -** } -** } -** -** For the "CURRENT ROW AND UNBOUNDED FOLLOWING" case, the final if() -** condition is always true (as if regStart were initialized to 0). -** -** RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING -** -** This is the only RANGE case handled by this routine. It modifies the -** second while( 1 ) loop in "ROWS BETWEEN CURRENT ... UNBOUNDED..." to -** be: -** -** while( 1 ){ -** AggFinal (xValue) -** while( 1 ){ -** regPeer++ -** Gosub addrGosub -** Next(csr) // if EOF goto flush_partition_done -** if( new peer ) break; -** } -** while( (regPeer--)>0 ){ -** AggInverse (csrStart) -** Next(csrStart) -** } -** } -** -** ROWS BETWEEN FOLLOWING AND FOLLOWING -** -** regEnd = regEnd - regStart -** Rewind (csr,csrStart,csrEnd) // if EOF goto flush_partition_done -** Aggstep (csrEnd) -** Next(csrEnd) // if EOF fall-through -** if( (regEnd--)<=0 ){ -** if( (regStart--)<=0 ){ -** AggFinal (xValue) -** Gosub addrGosub -** Next(csr) // if EOF goto flush_partition_done -** } -** AggInverse (csrStart) -** Next (csrStart) -** } -** -** ROWS BETWEEN PRECEDING AND PRECEDING -** -** Replace the bit after "Rewind" in the above with: -** -** if( (regEnd--)<=0 ){ -** AggStep (csrEnd) -** Next (csrEnd) -** } -** AggFinal (xValue) -** Gosub addrGosub -** Next(csr) // if EOF goto flush_partition_done -** if( (regStart--)<=0 ){ -** AggInverse (csr2) -** Next (csr2) -** } -** +/* +** Return true if the current frame should be cached in the ephemeral table, +** even if there are no xInverse() calls required. */ -static void windowCodeRowExprStep( - Parse *pParse, - Select *p, - WhereInfo *pWInfo, - int regGosub, - int addrGosub -){ - Window *pMWin = p->pWin; - Vdbe *v = sqlite3GetVdbe(pParse); - int regFlushPart; /* Register for "Gosub flush_partition" */ - int lblFlushPart; /* Label for "Gosub flush_partition" */ - int lblFlushDone; /* Label for "Gosub flush_partition_done" */ - - int regArg; - int addr; - int csrStart = pParse->nTab++; - int csrEnd = pParse->nTab++; - int regStart; /* Value of PRECEDING */ - int regEnd; /* Value of FOLLOWING */ - int addrGoto; - int addrTop; - int addrIfPos1 = 0; - int addrIfPos2 = 0; - int regSize = 0; - - assert( pMWin->eStart==TK_PRECEDING - || pMWin->eStart==TK_CURRENT - || pMWin->eStart==TK_FOLLOWING - || pMWin->eStart==TK_UNBOUNDED - ); - assert( pMWin->eEnd==TK_FOLLOWING - || pMWin->eEnd==TK_CURRENT - || pMWin->eEnd==TK_UNBOUNDED - || pMWin->eEnd==TK_PRECEDING - ); - - /* Allocate register and label for the "flush_partition" sub-routine. */ - regFlushPart = ++pParse->nMem; - lblFlushPart = sqlite3VdbeMakeLabel(v); - lblFlushDone = sqlite3VdbeMakeLabel(v); - - regStart = ++pParse->nMem; - regEnd = ++pParse->nMem; - - windowPartitionCache(pParse, p, pWInfo, regFlushPart, lblFlushPart, ®Size); - - addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); - - /* Start of "flush_partition" */ - sqlite3VdbeResolveLabel(v, lblFlushPart); - sqlite3VdbeAddOp2(v, OP_Once, 0, sqlite3VdbeCurrentAddr(v)+3); - VdbeCoverage(v); - VdbeComment((v, "Flush_partition subroutine")); - sqlite3VdbeAddOp2(v, OP_OpenDup, csrStart, pMWin->iEphCsr); - sqlite3VdbeAddOp2(v, OP_OpenDup, csrEnd, pMWin->iEphCsr); - - /* If either regStart or regEnd are not non-negative integers, throw - ** an exception. */ - if( pMWin->pStart ){ - sqlite3ExprCode(pParse, pMWin->pStart, regStart); - windowCheckIntValue(pParse, regStart, 0); - } - if( pMWin->pEnd ){ - sqlite3ExprCode(pParse, pMWin->pEnd, regEnd); - windowCheckIntValue(pParse, regEnd, 1); - } - - /* If this is "ROWS FOLLOWING AND ROWS FOLLOWING", do: - ** - ** if( regEndpEnd && pMWin->eStart==TK_FOLLOWING ){ - assert( pMWin->pStart!=0 ); - assert( pMWin->eEnd==TK_FOLLOWING ); - sqlite3VdbeAddOp3(v, OP_Ge, regStart, sqlite3VdbeCurrentAddr(v)+2, regEnd); - VdbeCoverageNeverNull(v); - sqlite3VdbeAddOp2(v, OP_Copy, regSize, regStart); - sqlite3VdbeAddOp3(v, OP_Subtract, regStart, regEnd, regEnd); - } - - if( pMWin->pStart && pMWin->eEnd==TK_PRECEDING ){ - assert( pMWin->pEnd!=0 ); - assert( pMWin->eStart==TK_PRECEDING ); - sqlite3VdbeAddOp3(v, OP_Le, regStart, sqlite3VdbeCurrentAddr(v)+3, regEnd); - VdbeCoverageNeverNull(v); - sqlite3VdbeAddOp2(v, OP_Copy, regSize, regStart); - sqlite3VdbeAddOp2(v, OP_Copy, regSize, regEnd); - } - - /* Initialize the accumulator register for each window function to NULL */ - regArg = windowInitAccum(pParse, pMWin); - - sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr, lblFlushDone); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Rewind, csrStart, lblFlushDone); - VdbeCoverageNeverTaken(v); - sqlite3VdbeChangeP5(v, 1); - sqlite3VdbeAddOp2(v, OP_Rewind, csrEnd, lblFlushDone); - VdbeCoverageNeverTaken(v); - sqlite3VdbeChangeP5(v, 1); - - /* Invoke AggStep function for each window function using the row that - ** csrEnd currently points to. Or, if csrEnd is already at EOF, - ** do nothing. */ - addrTop = sqlite3VdbeCurrentAddr(v); - if( pMWin->eEnd==TK_PRECEDING ){ - addrIfPos1 = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0 , 1); - VdbeCoverage(v); - } - sqlite3VdbeAddOp2(v, OP_Next, csrEnd, sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - addr = sqlite3VdbeAddOp0(v, OP_Goto); - windowAggStep(pParse, pMWin, csrEnd, 0, regArg, regSize); - if( pMWin->eEnd==TK_UNBOUNDED ){ - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop); - sqlite3VdbeJumpHere(v, addr); - addrTop = sqlite3VdbeCurrentAddr(v); - }else{ - sqlite3VdbeJumpHere(v, addr); - if( pMWin->eEnd==TK_PRECEDING ){ - sqlite3VdbeJumpHere(v, addrIfPos1); +static int windowCacheFrame(Window *pMWin){ + Window *pWin; + if( pMWin->regStartRowid ) return 1; + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pFunc; + if( (pFunc->zName==nth_valueName) + || (pFunc->zName==first_valueName) + || (pFunc->zName==leadName) + || (pFunc->zName==lagName) + ){ + return 1; } } - - if( pMWin->eEnd==TK_FOLLOWING ){ - addrIfPos1 = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0 , 1); - VdbeCoverage(v); - } - if( pMWin->eStart==TK_FOLLOWING ){ - addrIfPos2 = sqlite3VdbeAddOp3(v, OP_IfPos, regStart, 0 , 1); - VdbeCoverage(v); - } - windowAggFinal(pParse, pMWin, 0); - windowReturnOneRow(pParse, pMWin, regGosub, addrGosub); - sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, lblFlushDone); - if( pMWin->eStart==TK_FOLLOWING ){ - sqlite3VdbeJumpHere(v, addrIfPos2); - } - - if( pMWin->eStart==TK_CURRENT - || pMWin->eStart==TK_PRECEDING - || pMWin->eStart==TK_FOLLOWING - ){ - int lblSkipInverse = sqlite3VdbeMakeLabel(v);; - if( pMWin->eStart==TK_PRECEDING ){ - sqlite3VdbeAddOp3(v, OP_IfPos, regStart, lblSkipInverse, 1); - VdbeCoverage(v); - } - if( pMWin->eStart==TK_FOLLOWING ){ - sqlite3VdbeAddOp2(v, OP_Next, csrStart, sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, lblSkipInverse); - }else{ - sqlite3VdbeAddOp2(v, OP_Next, csrStart, sqlite3VdbeCurrentAddr(v)+1); - VdbeCoverageAlwaysTaken(v); - } - windowAggStep(pParse, pMWin, csrStart, 1, regArg, regSize); - sqlite3VdbeResolveLabel(v, lblSkipInverse); - } - if( pMWin->eEnd==TK_FOLLOWING ){ - sqlite3VdbeJumpHere(v, addrIfPos1); - } - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop); - - /* flush_partition_done: */ - sqlite3VdbeResolveLabel(v, lblFlushDone); - sqlite3VdbeAddOp1(v, OP_ResetSorter, pMWin->iEphCsr); - sqlite3VdbeAddOp1(v, OP_Return, regFlushPart); - VdbeComment((v, "end flush_partition subroutine")); - - /* Jump to here to skip over flush_partition */ - sqlite3VdbeJumpHere(v, addrGoto); + return 0; } /* -** This function does the work of sqlite3WindowCodeStep() for cases that -** would normally be handled by windowCodeDefaultStep() when there are -** one or more built-in window-functions that require the entire partition -** to be cached in a temp table before any rows can be returned. Additionally. -** "RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING" is always handled by -** this function. +** regOld and regNew are each the first register in an array of size +** pOrderBy->nExpr. This function generates code to compare the two +** arrays of registers using the collation sequences and other comparison +** parameters specified by pOrderBy. ** -** Pseudo-code corresponding to the VM code generated by this function -** for each type of window follows. -** -** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -** -** flush_partition: -** Once { -** OpenDup (iEphCsr -> csrLead) -** } -** Integer ctr 0 -** foreach row (csrLead){ -** if( new peer ){ -** AggFinal (xValue) -** for(i=0; i csrLead) -** } -** foreach row (csrLead) { -** AggStep (csrLead) -** } -** foreach row (iEphCsr) { -** Gosub addrGosub -** } -** -** RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING -** -** flush_partition: -** Once { -** OpenDup (iEphCsr -> csrLead) -** } -** foreach row (csrLead){ -** AggStep (csrLead) -** } -** Rewind (csrLead) -** Integer ctr 0 -** foreach row (csrLead){ -** if( new peer ){ -** AggFinal (xValue) -** for(i=0; ipWin; Vdbe *v = sqlite3GetVdbe(pParse); - int k; - int addr; - ExprList *pPart = pMWin->pPartition; - ExprList *pOrderBy = pMWin->pOrderBy; - int nPeer = pOrderBy ? pOrderBy->nExpr : 0; - int regNewPeer; - - int addrGoto; /* Address of Goto used to jump flush_par.. */ - int addrNext; /* Jump here for next iteration of loop */ - int regFlushPart; - int lblFlushPart; - int csrLead; - int regCtr; - int regArg; /* Register array to martial function args */ - int regSize; - int lblEmpty; - int bReverse = pMWin->pOrderBy && pMWin->eStart==TK_CURRENT - && pMWin->eEnd==TK_UNBOUNDED; - - assert( (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_CURRENT) - || (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_UNBOUNDED) - || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_CURRENT) - || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED) - ); - - lblEmpty = sqlite3VdbeMakeLabel(v); - regNewPeer = pParse->nMem+1; - pParse->nMem += nPeer; - - /* Allocate register and label for the "flush_partition" sub-routine. */ - regFlushPart = ++pParse->nMem; - lblFlushPart = sqlite3VdbeMakeLabel(v); - - csrLead = pParse->nTab++; - regCtr = ++pParse->nMem; - - windowPartitionCache(pParse, p, pWInfo, regFlushPart, lblFlushPart, ®Size); - addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); - - /* Start of "flush_partition" */ - sqlite3VdbeResolveLabel(v, lblFlushPart); - sqlite3VdbeAddOp2(v, OP_Once, 0, sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_OpenDup, csrLead, pMWin->iEphCsr); - - /* Initialize the accumulator register for each window function to NULL */ - regArg = windowInitAccum(pParse, pMWin); - - sqlite3VdbeAddOp2(v, OP_Integer, 0, regCtr); - sqlite3VdbeAddOp2(v, OP_Rewind, csrLead, lblEmpty); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr, lblEmpty); - VdbeCoverageNeverTaken(v); - - if( bReverse ){ - int addr2 = sqlite3VdbeCurrentAddr(v); - windowAggStep(pParse, pMWin, csrLead, 0, regArg, regSize); - sqlite3VdbeAddOp2(v, OP_Next, csrLead, addr2); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Rewind, csrLead, lblEmpty); - VdbeCoverageNeverTaken(v); - } - addrNext = sqlite3VdbeCurrentAddr(v); - - if( pOrderBy && (pMWin->eEnd==TK_CURRENT || pMWin->eStart==TK_CURRENT) ){ - int bCurrent = (pMWin->eStart==TK_CURRENT); - int addrJump = 0; /* Address of OP_Jump below */ - if( pMWin->eType==TK_RANGE ){ - int iOff = pMWin->nBufferCol + (pPart ? pPart->nExpr : 0); - int regPeer = pMWin->regPart + (pPart ? pPart->nExpr : 0); - KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); - for(k=0; knExpr; + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); + sqlite3VdbeAddOp3(v, OP_Compare, regOld, regNew, nVal); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, + sqlite3VdbeCurrentAddr(v)+1, addr, sqlite3VdbeCurrentAddr(v)+1 ); - if( addrJump ) sqlite3VdbeJumpHere(v, addrJump); + VdbeCoverageEqNe(v); + sqlite3VdbeAddOp3(v, OP_Copy, regNew, regOld, nVal-1); + }else{ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); } - - if( bReverse==0 ){ - windowAggStep(pParse, pMWin, csrLead, 0, regArg, regSize); - } - sqlite3VdbeAddOp2(v, OP_AddImm, regCtr, 1); - sqlite3VdbeAddOp2(v, OP_Next, csrLead, addrNext); - VdbeCoverage(v); - - windowReturnRows(pParse, pMWin, regCtr, regGosub, addrGosub, 0, 0); - - sqlite3VdbeResolveLabel(v, lblEmpty); - sqlite3VdbeAddOp1(v, OP_ResetSorter, pMWin->iEphCsr); - sqlite3VdbeAddOp1(v, OP_Return, regFlushPart); - - /* Jump to here to skip over flush_partition */ - sqlite3VdbeJumpHere(v, addrGoto); } +/* +** This function is called as part of generating VM programs for RANGE +** offset PRECEDING/FOLLOWING frame boundaries. Assuming "ASC" order for +** the ORDER BY term in the window, it generates code equivalent to: +** +** if( csr1.peerVal + regVal >= csr2.peerVal ) goto lbl; +** +** A special type of arithmetic is used such that if csr.peerVal is not +** a numeric type (real or integer), then the result of the addition is +** a copy of csr1.peerVal. +*/ +static void windowCodeRangeTest( + WindowCodeArg *p, + int op, /* OP_Ge or OP_Gt */ + int csr1, + int regVal, + int csr2, + int lbl +){ + Parse *pParse = p->pParse; + Vdbe *v = sqlite3GetVdbe(pParse); + int reg1 = sqlite3GetTempReg(pParse); + int reg2 = sqlite3GetTempReg(pParse); + int arith = OP_Add; + int addrGe; + + int regString = ++pParse->nMem; + + assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); + assert( p->pMWin->pOrderBy && p->pMWin->pOrderBy->nExpr==1 ); + if( p->pMWin->pOrderBy->a[0].sortOrder ){ + switch( op ){ + case OP_Ge: op = OP_Le; break; + case OP_Gt: op = OP_Lt; break; + default: assert( op==OP_Le ); op = OP_Ge; break; + } + arith = OP_Subtract; + } + + windowReadPeerValues(p, csr1, reg1); + windowReadPeerValues(p, csr2, reg2); + + /* Check if the peer value for csr1 value is a text or blob by comparing + ** it to the smallest possible string - ''. If it is, jump over the + ** OP_Add or OP_Subtract operation and proceed directly to the comparison. */ + sqlite3VdbeAddOp4(v, OP_String8, 0, regString, 0, "", P4_STATIC); + addrGe = sqlite3VdbeAddOp3(v, OP_Ge, regString, 0, reg1); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, arith, regVal, reg1, reg1); + sqlite3VdbeJumpHere(v, addrGe); + sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); + assert( op==OP_Ge || op==OP_Gt || op==OP_Lt || op==OP_Le ); + testcase(op==OP_Ge); VdbeCoverageIf(v, op==OP_Ge); + testcase(op==OP_Lt); VdbeCoverageIf(v, op==OP_Lt); + testcase(op==OP_Le); VdbeCoverageIf(v, op==OP_Le); + testcase(op==OP_Gt); VdbeCoverageIf(v, op==OP_Gt); + + sqlite3ReleaseTempReg(pParse, reg1); + sqlite3ReleaseTempReg(pParse, reg2); +} /* -** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -** -** ... -** if( new partition ){ -** AggFinal (xFinalize) -** Gosub addrGosub -** ResetSorter eph-table -** } -** else if( new peer ){ -** AggFinal (xValue) -** Gosub addrGosub -** ResetSorter eph-table -** } -** AggStep -** Insert (record into eph-table) -** sqlite3WhereEnd() -** AggFinal (xFinalize) -** Gosub addrGosub -** -** RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING -** -** As above, except take no action for a "new peer". Invoke -** the sub-routine once only for each partition. -** -** RANGE BETWEEN CURRENT ROW AND CURRENT ROW -** -** As above, except that the "new peer" condition is handled in the -** same way as "new partition" (so there is no "else if" block). -** -** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -** -** As above, except assume every row is a "new peer". +** Helper function for sqlite3WindowCodeStep(). Each call to this function +** generates VM code for a single RETURN_ROW, AGGSTEP or AGGINVERSE +** operation. Refer to the header comment for sqlite3WindowCodeStep() for +** details. */ -static void windowCodeDefaultStep( - Parse *pParse, - Select *p, - WhereInfo *pWInfo, - int regGosub, - int addrGosub +static int windowCodeOp( + WindowCodeArg *p, /* Context object */ + int op, /* WINDOW_RETURN_ROW, AGGSTEP or AGGINVERSE */ + int regCountdown, /* Register for OP_IfPos countdown */ + int jumpOnEof /* Jump here if stepped cursor reaches EOF */ ){ - Window *pMWin = p->pWin; - Vdbe *v = sqlite3GetVdbe(pParse); - int k; - int iSubCsr = p->pSrc->a[0].iCursor; - int nSub = p->pSrc->a[0].pTab->nCol; - int reg = pParse->nMem+1; - int regRecord = reg+nSub; - int regRowid = regRecord+1; - int addr; - ExprList *pPart = pMWin->pPartition; - ExprList *pOrderBy = pMWin->pOrderBy; + int csr, reg; + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; + int ret = 0; + Vdbe *v = p->pVdbe; + int addrIf = 0; + int addrContinue = 0; + int addrGoto = 0; + int bPeer = (pMWin->eFrmType!=TK_ROWS); - assert( pMWin->eType==TK_RANGE - || (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_CURRENT) - ); + int lblDone = sqlite3VdbeMakeLabel(pParse); + int addrNextRange = 0; - assert( (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_CURRENT) - || (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_UNBOUNDED) - || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_CURRENT) - || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED && !pOrderBy) - ); - - if( pMWin->eEnd==TK_UNBOUNDED ){ - pOrderBy = 0; + /* Special case - WINDOW_AGGINVERSE is always a no-op if the frame + ** starts with UNBOUNDED PRECEDING. */ + if( op==WINDOW_AGGINVERSE && pMWin->eStart==TK_UNBOUNDED ){ + assert( regCountdown==0 && jumpOnEof==0 ); + return 0; } - pParse->nMem += nSub + 2; - - /* Load the individual column values of the row returned by - ** the sub-select into an array of registers. */ - for(k=0; knExpr : 0); - int addrGoto = 0; - int addrJump = 0; - int nPeer = (pOrderBy ? pOrderBy->nExpr : 0); - - if( pPart ){ - int regNewPart = reg + pMWin->nBufferCol; - KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); - addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPart, pMWin->regPart,nPart); - sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); - addrJump = sqlite3VdbeAddOp3(v, OP_Jump, addr+2, 0, addr+2); - VdbeCoverageEqNe(v); - windowAggFinal(pParse, pMWin, 1); - if( pOrderBy ){ - addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); - } - } - - if( pOrderBy ){ - int regNewPeer = reg + pMWin->nBufferCol + nPart; - int regPeer = pMWin->regPart + nPart; - - if( addrJump ) sqlite3VdbeJumpHere(v, addrJump); - if( pMWin->eType==TK_RANGE ){ - KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); - addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPeer, regPeer, nPeer); - sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); - addrJump = sqlite3VdbeAddOp3(v, OP_Jump, addr+2, 0, addr+2); - VdbeCoverage(v); + if( regCountdown>0 ){ + if( pMWin->eFrmType==TK_RANGE ){ + addrNextRange = sqlite3VdbeCurrentAddr(v); + assert( op==WINDOW_AGGINVERSE || op==WINDOW_AGGSTEP ); + if( op==WINDOW_AGGINVERSE ){ + if( pMWin->eStart==TK_FOLLOWING ){ + windowCodeRangeTest( + p, OP_Le, p->current.csr, regCountdown, p->start.csr, lblDone + ); + }else{ + windowCodeRangeTest( + p, OP_Ge, p->start.csr, regCountdown, p->current.csr, lblDone + ); + } }else{ - addrJump = 0; + windowCodeRangeTest( + p, OP_Gt, p->end.csr, regCountdown, p->current.csr, lblDone + ); } - windowAggFinal(pParse, pMWin, pMWin->eStart==TK_CURRENT); - if( addrGoto ) sqlite3VdbeJumpHere(v, addrGoto); + }else{ + addrIf = sqlite3VdbeAddOp3(v, OP_IfPos, regCountdown, 0, 1); + VdbeCoverage(v); } - - sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr,sqlite3VdbeCurrentAddr(v)+3); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub); - sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)-1); - VdbeCoverage(v); - - sqlite3VdbeAddOp1(v, OP_ResetSorter, pMWin->iEphCsr); - sqlite3VdbeAddOp3( - v, OP_Copy, reg+pMWin->nBufferCol, pMWin->regPart, nPart+nPeer-1 - ); - - if( addrJump ) sqlite3VdbeJumpHere(v, addrJump); } - /* Invoke step function for window functions */ - windowAggStep(pParse, pMWin, -1, 0, reg, 0); + if( op==WINDOW_RETURN_ROW && pMWin->regStartRowid==0 ){ + windowAggFinal(p, 0); + } + addrContinue = sqlite3VdbeCurrentAddr(v); + switch( op ){ + case WINDOW_RETURN_ROW: + csr = p->current.csr; + reg = p->current.reg; + windowReturnOneRow(p); + break; - /* Buffer the current row in the ephemeral table. */ - if( pMWin->nBufferCol>0 ){ - sqlite3VdbeAddOp3(v, OP_MakeRecord, reg, pMWin->nBufferCol, regRecord); + case WINDOW_AGGINVERSE: + csr = p->start.csr; + reg = p->start.reg; + if( pMWin->regStartRowid ){ + assert( pMWin->regEndRowid ); + sqlite3VdbeAddOp2(v, OP_AddImm, pMWin->regStartRowid, 1); + }else{ + windowAggStep(pParse, pMWin, csr, 1, p->regArg); + } + break; + + default: + assert( op==WINDOW_AGGSTEP ); + csr = p->end.csr; + reg = p->end.reg; + if( pMWin->regStartRowid ){ + assert( pMWin->regEndRowid ); + sqlite3VdbeAddOp2(v, OP_AddImm, pMWin->regEndRowid, 1); + }else{ + windowAggStep(pParse, pMWin, csr, 0, p->regArg); + } + break; + } + + if( op==p->eDelete ){ + sqlite3VdbeAddOp1(v, OP_Delete, csr); + sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION); + } + + if( jumpOnEof ){ + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + ret = sqlite3VdbeAddOp0(v, OP_Goto); }else{ - sqlite3VdbeAddOp2(v, OP_Blob, 0, regRecord); - sqlite3VdbeAppendP4(v, (void*)"", 0); + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+1+bPeer); + VdbeCoverage(v); + if( bPeer ){ + addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); + } } - sqlite3VdbeAddOp2(v, OP_NewRowid, pMWin->iEphCsr, regRowid); - sqlite3VdbeAddOp3(v, OP_Insert, pMWin->iEphCsr, regRecord, regRowid); - /* End the database scan loop. */ - sqlite3WhereEnd(pWInfo); + if( bPeer ){ + int nReg = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); + int regTmp = (nReg ? sqlite3GetTempRange(pParse, nReg) : 0); + windowReadPeerValues(p, csr, regTmp); + windowIfNewPeer(pParse, pMWin->pOrderBy, regTmp, reg, addrContinue); + sqlite3ReleaseTempRange(pParse, regTmp, nReg); + } - windowAggFinal(pParse, pMWin, 1); - sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr,sqlite3VdbeCurrentAddr(v)+3); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub); - sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)-1); - VdbeCoverage(v); + if( addrNextRange ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrNextRange); + } + sqlite3VdbeResolveLabel(v, lblDone); + if( addrGoto ) sqlite3VdbeJumpHere(v, addrGoto); + if( addrIf ) sqlite3VdbeJumpHere(v, addrIf); + return ret; } + /* ** Allocate and return a duplicate of the Window object indicated by the ** third argument. Set the Window.pOwner field of the new object to @@ -146682,11 +147399,13 @@ SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ if( pNew ){ pNew->zName = sqlite3DbStrDup(db, p->zName); pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); + pNew->pFunc = p->pFunc; pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); - pNew->eType = p->eType; + pNew->eFrmType = p->eFrmType; pNew->eEnd = p->eEnd; pNew->eStart = p->eStart; + pNew->eExclude = p->eExclude; pNew->pStart = sqlite3ExprDup(db, p->pStart, 0); pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0); pNew->pOwner = pOwner; @@ -146713,12 +147432,360 @@ SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p){ return pRet; } +/* +** Return true if it can be determined at compile time that expression +** pExpr evaluates to a value that, when cast to an integer, is greater +** than zero. False otherwise. +** +** If an OOM error occurs, this function sets the Parse.db.mallocFailed +** flag and returns zero. +*/ +static int windowExprGtZero(Parse *pParse, Expr *pExpr){ + int ret = 0; + sqlite3 *db = pParse->db; + sqlite3_value *pVal = 0; + sqlite3ValueFromExpr(db, pExpr, db->enc, SQLITE_AFF_NUMERIC, &pVal); + if( pVal && sqlite3_value_int(pVal)>0 ){ + ret = 1; + } + sqlite3ValueFree(pVal); + return ret; +} + /* ** sqlite3WhereBegin() has already been called for the SELECT statement ** passed as the second argument when this function is invoked. It generates -** code to populate the Window.regResult register for each window function and -** invoke the sub-routine at instruction addrGosub once for each row. -** This function calls sqlite3WhereEnd() before returning. +** code to populate the Window.regResult register for each window function +** and invoke the sub-routine at instruction addrGosub once for each row. +** sqlite3WhereEnd() is always called before returning. +** +** This function handles several different types of window frames, which +** require slightly different processing. The following pseudo code is +** used to implement window frames of the form: +** +** ROWS BETWEEN PRECEDING AND FOLLOWING +** +** Other window frame types use variants of the following: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** +** if( first row of partition ){ +** // Rewind three cursors, all open on the eph table. +** Rewind(csrEnd); +** Rewind(csrStart); +** Rewind(csrCurrent); +** +** regEnd = // FOLLOWING expression +** regStart = // PRECEDING expression +** }else{ +** // First time this branch is taken, the eph table contains two +** // rows. The first row in the partition, which all three cursors +** // currently point to, and the following row. +** AGGSTEP +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** RETURN ROW +** if( csrCurrent is EOF ) break; +** if( (regStart--)<=0 ){ +** AggInverse(csrStart) +** Next(csrStart) +** } +** } +** +** The pseudo-code above uses the following shorthand: +** +** AGGSTEP: invoke the aggregate xStep() function for each window function +** with arguments read from the current row of cursor csrEnd, then +** step cursor csrEnd forward one row (i.e. sqlite3BtreeNext()). +** +** RETURN_ROW: return a row to the caller based on the contents of the +** current row of csrCurrent and the current state of all +** aggregates. Then step cursor csrCurrent forward one row. +** +** AGGINVERSE: invoke the aggregate xInverse() function for each window +** functions with arguments read from the current row of cursor +** csrStart. Then step csrStart forward one row. +** +** There are two other ROWS window frames that are handled significantly +** differently from the above - "BETWEEN PRECEDING AND PRECEDING" +** and "BETWEEN FOLLOWING AND FOLLOWING". These are special +** cases because they change the order in which the three cursors (csrStart, +** csrCurrent and csrEnd) iterate through the ephemeral table. Cases that +** use UNBOUNDED or CURRENT ROW are much simpler variations on one of these +** three. +** +** ROWS BETWEEN PRECEDING AND PRECEDING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** if( (regEnd--)<=0 ){ +** AGGSTEP +** } +** RETURN_ROW +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** flush: +** if( (regEnd--)<=0 ){ +** AGGSTEP +** } +** RETURN_ROW +** +** +** ROWS BETWEEN FOLLOWING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = regEnd - +** }else{ +** AGGSTEP +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** } +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** if( eof ) break; +** } +** if( (regStart--)<=0 ){ +** AGGINVERSE +** if( eof ) break +** } +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** For the most part, the patterns above are adapted to support UNBOUNDED by +** assuming that it is equivalent to "infinity PRECEDING/FOLLOWING" and +** CURRENT ROW by assuming that it is equivilent to "0 PRECEDING/FOLLOWING". +** This is optimized of course - branches that will never be taken and +** conditions that are always true are omitted from the VM code. The only +** exceptional case is: +** +** ROWS BETWEEN FOLLOWING AND UNBOUNDED FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regStart = +** }else{ +** AGGSTEP +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** if( (regStart--)<=0 ){ +** AGGINVERSE +** if( eof ) break +** } +** RETURN_ROW +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** Also requiring special handling are the cases: +** +** ROWS BETWEEN PRECEDING AND PRECEDING +** ROWS BETWEEN FOLLOWING AND FOLLOWING +** +** when (expr1 < expr2). This is detected at runtime, not by this function. +** To handle this case, the pseudo-code programs depicted above are modified +** slightly to be: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** if( regEnd < regStart ){ +** RETURN_ROW +** delete eph table contents +** continue +** } +** ... +** +** The new "continue" statement in the above jumps to the next iteration +** of the outer loop - the one started by sqlite3WhereBegin(). +** +** The various GROUPS cases are implemented using the same patterns as +** ROWS. The VM code is modified slightly so that: +** +** 1. The else branch in the main loop is only taken if the row just +** added to the ephemeral table is the start of a new group. In +** other words, it becomes: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else if( new group ){ +** ... +** } +** } +** +** 2. Instead of processing a single row, each RETURN_ROW, AGGSTEP or +** AGGINVERSE step processes the current row of the relevant cursor and +** all subsequent rows belonging to the same group. +** +** RANGE window frames are a little different again. As for GROUPS, the +** main loop runs once per group only. And RETURN_ROW, AGGSTEP and AGGINVERSE +** deal in groups instead of rows. As for ROWS and GROUPS, there are three +** basic cases: +** +** RANGE BETWEEN PRECEDING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** AGGSTEP +** while( (csrCurrent.key + regEnd) < csrEnd.key ){ +** RETURN_ROW +** while( csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** RETURN ROW +** if( csrCurrent is EOF ) break; +** while( csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** } +** } +** +** In the above notation, "csr.key" means the current value of the ORDER BY +** expression (there is only ever 1 for a RANGE that uses an FOLLOWING +** or PRECEDING AND PRECEDING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** if( (csrEnd.key + regEnd) <= csrCurrent.key ){ +** AGGSTEP +** } +** while( (csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** } +** } +** flush: +** while( (csrEnd.key + regEnd) <= csrCurrent.key ){ +** AGGSTEP +** } +** while( (csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** +** RANGE BETWEEN FOLLOWING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** AGGSTEP +** while( (csrCurrent.key + regEnd) < csrEnd.key ){ +** while( (csrCurrent.key + regStart) > csrStart.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** while( (csrCurrent.key + regStart) > csrStart.key ){ +** AGGINVERSE +** if( eof ) break "while( 1 )" loop. +** } +** RETURN_ROW +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** The text above leaves out many details. Refer to the code and comments +** below for a more complete picture. */ SQLITE_PRIVATE void sqlite3WindowCodeStep( Parse *pParse, /* Parse context */ @@ -146728,75 +147795,321 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( int addrGosub /* OP_Gosub here to return each row */ ){ Window *pMWin = p->pWin; + ExprList *pOrderBy = pMWin->pOrderBy; + Vdbe *v = sqlite3GetVdbe(pParse); + int csrWrite; /* Cursor used to write to eph. table */ + int csrInput = p->pSrc->a[0].iCursor; /* Cursor of sub-select */ + int nInput = p->pSrc->a[0].pTab->nCol; /* Number of cols returned by sub */ + int iInput; /* To iterate through sub cols */ + int addrNe; /* Address of OP_Ne */ + int addrGosubFlush = 0; /* Address of OP_Gosub to flush: */ + int addrInteger = 0; /* Address of OP_Integer */ + int addrEmpty; /* Address of OP_Rewind in flush: */ + int regStart = 0; /* Value of PRECEDING */ + int regEnd = 0; /* Value of FOLLOWING */ + int regNew; /* Array of registers holding new input row */ + int regRecord; /* regNew array in record form */ + int regRowid; /* Rowid for regRecord in eph table */ + int regNewPeer = 0; /* Peer values for new row (part of regNew) */ + int regPeer = 0; /* Peer values for current row */ + int regFlushPart = 0; /* Register for "Gosub flush_partition" */ + WindowCodeArg s; /* Context object for sub-routines */ + int lblWhereEnd; /* Label just before sqlite3WhereEnd() code */ - /* There are three different functions that may be used to do the work - ** of this one, depending on the window frame and the specific built-in - ** window functions used (if any). - ** - ** windowCodeRowExprStep() handles all "ROWS" window frames, except for: - ** - ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ** - ** The exception is because windowCodeRowExprStep() implements all window - ** frame types by caching the entire partition in a temp table, and - ** "ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW" is easy enough to - ** implement without such a cache. - ** - ** windowCodeCacheStep() is used for: - ** - ** RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING - ** - ** It is also used for anything not handled by windowCodeRowExprStep() - ** that invokes a built-in window function that requires the entire - ** partition to be cached in a temp table before any rows are returned - ** (e.g. nth_value() or percent_rank()). - ** - ** Finally, assuming there is no built-in window function that requires - ** the partition to be cached, windowCodeDefaultStep() is used for: - ** - ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ** RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ** RANGE BETWEEN CURRENT ROW AND CURRENT ROW - ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ** - ** windowCodeDefaultStep() is the only one of the three functions that - ** does not cache each partition in a temp table before beginning to - ** return rows. - */ - if( pMWin->eType==TK_ROWS - && (pMWin->eStart!=TK_UNBOUNDED||pMWin->eEnd!=TK_CURRENT||!pMWin->pOrderBy) - ){ - VdbeModuleComment((pParse->pVdbe, "Begin RowExprStep()")); - windowCodeRowExprStep(pParse, p, pWInfo, regGosub, addrGosub); - }else{ - Window *pWin; - int bCache = 0; /* True to use CacheStep() */ + assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_CURRENT + || pMWin->eStart==TK_FOLLOWING || pMWin->eStart==TK_UNBOUNDED + ); + assert( pMWin->eEnd==TK_FOLLOWING || pMWin->eEnd==TK_CURRENT + || pMWin->eEnd==TK_UNBOUNDED || pMWin->eEnd==TK_PRECEDING + ); + assert( pMWin->eExclude==0 || pMWin->eExclude==TK_CURRENT + || pMWin->eExclude==TK_GROUP || pMWin->eExclude==TK_TIES + || pMWin->eExclude==TK_NO + ); - if( pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED ){ - bCache = 1; - }else{ - for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; - if( (pFunc->funcFlags & SQLITE_FUNC_WINDOW_SIZE) - || (pFunc->zName==nth_valueName) - || (pFunc->zName==first_valueName) - || (pFunc->zName==leadName) - || (pFunc->zName==lagName) - ){ - bCache = 1; - break; + lblWhereEnd = sqlite3VdbeMakeLabel(pParse); + + /* Fill in the context object */ + memset(&s, 0, sizeof(WindowCodeArg)); + s.pParse = pParse; + s.pMWin = pMWin; + s.pVdbe = v; + s.regGosub = regGosub; + s.addrGosub = addrGosub; + s.current.csr = pMWin->iEphCsr; + csrWrite = s.current.csr+1; + s.start.csr = s.current.csr+2; + s.end.csr = s.current.csr+3; + + /* Figure out when rows may be deleted from the ephemeral table. There + ** are four options - they may never be deleted (eDelete==0), they may + ** be deleted as soon as they are no longer part of the window frame + ** (eDelete==WINDOW_AGGINVERSE), they may be deleted as after the row + ** has been returned to the caller (WINDOW_RETURN_ROW), or they may + ** be deleted after they enter the frame (WINDOW_AGGSTEP). */ + switch( pMWin->eStart ){ + case TK_FOLLOWING: + if( pMWin->eFrmType!=TK_RANGE + && windowExprGtZero(pParse, pMWin->pStart) + ){ + s.eDelete = WINDOW_RETURN_ROW; + } + break; + case TK_UNBOUNDED: + if( windowCacheFrame(pMWin)==0 ){ + if( pMWin->eEnd==TK_PRECEDING ){ + if( pMWin->eFrmType!=TK_RANGE + && windowExprGtZero(pParse, pMWin->pEnd) + ){ + s.eDelete = WINDOW_AGGSTEP; + } + }else{ + s.eDelete = WINDOW_RETURN_ROW; } } - } + break; + default: + s.eDelete = WINDOW_AGGINVERSE; + break; + } - /* Otherwise, call windowCodeDefaultStep(). */ - if( bCache ){ - VdbeModuleComment((pParse->pVdbe, "Begin CacheStep()")); - windowCodeCacheStep(pParse, p, pWInfo, regGosub, addrGosub); - }else{ - VdbeModuleComment((pParse->pVdbe, "Begin DefaultStep()")); - windowCodeDefaultStep(pParse, p, pWInfo, regGosub, addrGosub); + /* Allocate registers for the array of values from the sub-query, the + ** samve values in record form, and the rowid used to insert said record + ** into the ephemeral table. */ + regNew = pParse->nMem+1; + pParse->nMem += nInput; + regRecord = ++pParse->nMem; + regRowid = ++pParse->nMem; + + /* If the window frame contains an " PRECEDING" or " FOLLOWING" + ** clause, allocate registers to store the results of evaluating each + ** . */ + if( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING ){ + regStart = ++pParse->nMem; + } + if( pMWin->eEnd==TK_PRECEDING || pMWin->eEnd==TK_FOLLOWING ){ + regEnd = ++pParse->nMem; + } + + /* If this is not a "ROWS BETWEEN ..." frame, then allocate arrays of + ** registers to store copies of the ORDER BY expressions (peer values) + ** for the main loop, and for each cursor (start, current and end). */ + if( pMWin->eFrmType!=TK_ROWS ){ + int nPeer = (pOrderBy ? pOrderBy->nExpr : 0); + regNewPeer = regNew + pMWin->nBufferCol; + if( pMWin->pPartition ) regNewPeer += pMWin->pPartition->nExpr; + regPeer = pParse->nMem+1; pParse->nMem += nPeer; + s.start.reg = pParse->nMem+1; pParse->nMem += nPeer; + s.current.reg = pParse->nMem+1; pParse->nMem += nPeer; + s.end.reg = pParse->nMem+1; pParse->nMem += nPeer; + } + + /* Load the column values for the row returned by the sub-select + ** into an array of registers starting at regNew. Assemble them into + ** a record in register regRecord. */ + for(iInput=0; iInputpPartition ){ + int addr; + ExprList *pPart = pMWin->pPartition; + int nPart = pPart->nExpr; + int regNewPart = regNew + pMWin->nBufferCol; + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); + + regFlushPart = ++pParse->nMem; + addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPart, pMWin->regPart, nPart); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, addr+2, addr+4, addr+2); + VdbeCoverageEqNe(v); + addrGosubFlush = sqlite3VdbeAddOp1(v, OP_Gosub, regFlushPart); + VdbeComment((v, "call flush_partition")); + sqlite3VdbeAddOp3(v, OP_Copy, regNewPart, pMWin->regPart, nPart-1); + } + + /* Insert the new row into the ephemeral table */ + sqlite3VdbeAddOp2(v, OP_NewRowid, csrWrite, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, csrWrite, regRecord, regRowid); + addrNe = sqlite3VdbeAddOp3(v, OP_Ne, pMWin->regOne, 0, regRowid); + VdbeCoverageNeverNull(v); + + /* This block is run for the first row of each partition */ + s.regArg = windowInitAccum(pParse, pMWin); + + if( regStart ){ + sqlite3ExprCode(pParse, pMWin->pStart, regStart); + windowCheckValue(pParse, regStart, 0 + (pMWin->eFrmType==TK_RANGE ? 3 : 0)); + } + if( regEnd ){ + sqlite3ExprCode(pParse, pMWin->pEnd, regEnd); + windowCheckValue(pParse, regEnd, 1 + (pMWin->eFrmType==TK_RANGE ? 3 : 0)); + } + + if( pMWin->eStart==pMWin->eEnd && regStart ){ + int op = ((pMWin->eStart==TK_FOLLOWING) ? OP_Ge : OP_Le); + int addrGe = sqlite3VdbeAddOp3(v, op, regStart, 0, regEnd); + VdbeCoverageNeverNullIf(v, op==OP_Ge); /* NeverNull because bound */ + VdbeCoverageNeverNullIf(v, op==OP_Le); /* values previously checked */ + windowAggFinal(&s, 0); + sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1); + VdbeCoverageNeverTaken(v); + windowReturnOneRow(&s); + sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr); + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd); + sqlite3VdbeJumpHere(v, addrGe); + } + if( pMWin->eStart==TK_FOLLOWING && pMWin->eFrmType!=TK_RANGE && regEnd ){ + assert( pMWin->eEnd==TK_FOLLOWING ); + sqlite3VdbeAddOp3(v, OP_Subtract, regStart, regEnd, regStart); + } + + if( pMWin->eStart!=TK_UNBOUNDED ){ + sqlite3VdbeAddOp2(v, OP_Rewind, s.start.csr, 1); + VdbeCoverageNeverTaken(v); + } + sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1); + VdbeCoverageNeverTaken(v); + sqlite3VdbeAddOp2(v, OP_Rewind, s.end.csr, 1); + VdbeCoverageNeverTaken(v); + if( regPeer && pOrderBy ){ + sqlite3VdbeAddOp3(v, OP_Copy, regNewPeer, regPeer, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.start.reg, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.current.reg, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.end.reg, pOrderBy->nExpr-1); + } + + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd); + + sqlite3VdbeJumpHere(v, addrNe); + + /* Beginning of the block executed for the second and subsequent rows. */ + if( regPeer ){ + windowIfNewPeer(pParse, pOrderBy, regNewPeer, regPeer, lblWhereEnd); + } + if( pMWin->eStart==TK_FOLLOWING ){ + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eEnd!=TK_UNBOUNDED ){ + if( pMWin->eFrmType==TK_RANGE ){ + int lbl = sqlite3VdbeMakeLabel(pParse); + int addrNext = sqlite3VdbeCurrentAddr(v); + windowCodeRangeTest(&s, OP_Ge, s.current.csr, regEnd, s.end.csr, lbl); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrNext); + sqlite3VdbeResolveLabel(v, lbl); + }else{ + windowCodeOp(&s, WINDOW_RETURN_ROW, regEnd, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + } } + }else + if( pMWin->eEnd==TK_PRECEDING ){ + int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE); + windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0); + if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + if( !bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + }else{ + int addr = 0; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eEnd!=TK_UNBOUNDED ){ + if( pMWin->eFrmType==TK_RANGE ){ + int lbl = 0; + addr = sqlite3VdbeCurrentAddr(v); + if( regEnd ){ + lbl = sqlite3VdbeMakeLabel(pParse); + windowCodeRangeTest(&s, OP_Ge, s.current.csr, regEnd, s.end.csr, lbl); + } + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + if( regEnd ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); + sqlite3VdbeResolveLabel(v, lbl); + } + }else{ + if( regEnd ){ + addr = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0, 1); + VdbeCoverage(v); + } + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + if( regEnd ) sqlite3VdbeJumpHere(v, addr); + } + } + } + + /* End of the main input loop */ + sqlite3VdbeResolveLabel(v, lblWhereEnd); + sqlite3WhereEnd(pWInfo); + + /* Fall through */ + if( pMWin->pPartition ){ + addrInteger = sqlite3VdbeAddOp2(v, OP_Integer, 0, regFlushPart); + sqlite3VdbeJumpHere(v, addrGosubFlush); + } + + addrEmpty = sqlite3VdbeAddOp1(v, OP_Rewind, csrWrite); + VdbeCoverage(v); + if( pMWin->eEnd==TK_PRECEDING ){ + int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE); + windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0); + if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + }else if( pMWin->eStart==TK_FOLLOWING ){ + int addrStart; + int addrBreak1; + int addrBreak2; + int addrBreak3; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eFrmType==TK_RANGE ){ + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 1); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + }else + if( pMWin->eEnd==TK_UNBOUNDED ){ + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, regStart, 1); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, 0, 1); + }else{ + assert( pMWin->eEnd==TK_FOLLOWING ); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, regEnd, 1); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 1); + } + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak2); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak3 = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak1); + sqlite3VdbeJumpHere(v, addrBreak3); + }else{ + int addrBreak; + int addrStart; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak); + } + sqlite3VdbeJumpHere(v, addrEmpty); + + sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr); + if( pMWin->pPartition ){ + if( pMWin->regStartRowid ){ + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regStartRowid); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regEndRowid); + } + sqlite3VdbeChangeP1(v, addrInteger, sqlite3VdbeCurrentAddr(v)); + sqlite3VdbeAddOp1(v, OP_Return, regFlushPart); } } @@ -146939,8 +148252,7 @@ static void disableLookaside(Parse *pParse){ memcpy(p->u.zToken, t.z, t.n); p->u.zToken[t.n] = 0; if( sqlite3Isquote(p->u.zToken[0]) ){ - if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted; - sqlite3Dequote(p->u.zToken); + sqlite3DequoteExpr(p); } #if SQLITE_MAX_EXPR_DEPTH>0 p->nHeight = 1; @@ -146986,6 +148298,10 @@ static void disableLookaside(Parse *pParse){ sqlite3ExprListSetName(pParse, p, pIdToken, 1); return p; } + +#if TK_SPAN>255 +# error too many tokens in the grammar +#endif /**************** End of %include directives **********************************/ /* These constants specify the various numeric values for terminal symbols ** in a format understandable to "makeheaders". This section is blank unless @@ -147049,27 +148365,28 @@ static void disableLookaside(Parse *pParse){ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned short int -#define YYNOCODE 277 +#define YYNOCODE 301 #define YYACTIONTYPE unsigned short int -#define YYWILDCARD 91 +#define YYWILDCARD 95 #define sqlite3ParserTOKENTYPE Token typedef union { int yyinit; sqlite3ParserTOKENTYPE yy0; - Expr* yy18; - struct TrigEvent yy34; - IdList* yy48; - int yy70; - struct {int value; int mask;} yy111; - struct FrameBound yy119; - SrcList* yy135; - TriggerStep* yy207; - Window* yy327; - Upsert* yy340; - const char* yy392; - ExprList* yy420; - With* yy449; - Select* yy489; + With* yy59; + IdList* yy62; + struct TrigEvent yy90; + Upsert* yy136; + struct FrameBound yy201; + u8 yy238; + const char* yy294; + Window* yy295; + struct {int value; int mask;} yy355; + ExprList* yy434; + TriggerStep* yy455; + Select* yy457; + SrcList* yy483; + int yy494; + Expr* yy524; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -147085,17 +148402,17 @@ typedef union { #define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse; #define sqlite3ParserCTX_STORE yypParser->pParse=pParse; #define YYFALLBACK 1 -#define YYNSTATE 521 -#define YYNRULE 367 -#define YYNTOKEN 155 -#define YY_MAX_SHIFT 520 -#define YY_MIN_SHIFTREDUCE 756 -#define YY_MAX_SHIFTREDUCE 1122 -#define YY_ERROR_ACTION 1123 -#define YY_ACCEPT_ACTION 1124 -#define YY_NO_ACTION 1125 -#define YY_MIN_REDUCE 1126 -#define YY_MAX_REDUCE 1492 +#define YYNSTATE 541 +#define YYNRULE 375 +#define YYNTOKEN 176 +#define YY_MAX_SHIFT 540 +#define YY_MIN_SHIFTREDUCE 784 +#define YY_MAX_SHIFTREDUCE 1158 +#define YY_ERROR_ACTION 1159 +#define YY_ACCEPT_ACTION 1160 +#define YY_NO_ACTION 1161 +#define YY_MIN_REDUCE 1162 +#define YY_MAX_REDUCE 1536 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -147162,568 +148479,603 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2009) +#define YY_ACTTAB_COUNT (2142) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 368, 105, 102, 197, 105, 102, 197, 515, 1124, 1, - /* 10 */ 1, 520, 2, 1128, 515, 1192, 1171, 1456, 275, 370, - /* 20 */ 127, 1389, 1197, 1197, 1192, 1166, 178, 1205, 64, 64, - /* 30 */ 477, 887, 322, 428, 348, 37, 37, 808, 362, 888, - /* 40 */ 509, 509, 509, 112, 113, 103, 1100, 1100, 953, 956, - /* 50 */ 946, 946, 110, 110, 111, 111, 111, 111, 365, 252, - /* 60 */ 252, 515, 252, 252, 497, 515, 309, 515, 459, 515, - /* 70 */ 1079, 491, 512, 478, 6, 512, 809, 134, 498, 228, - /* 80 */ 194, 428, 37, 37, 515, 208, 64, 64, 64, 64, - /* 90 */ 13, 13, 109, 109, 109, 109, 108, 108, 107, 107, - /* 100 */ 107, 106, 401, 258, 381, 13, 13, 398, 397, 428, - /* 110 */ 252, 252, 370, 476, 405, 1104, 1079, 1080, 1081, 386, - /* 120 */ 1106, 390, 497, 512, 497, 1423, 1419, 304, 1105, 307, - /* 130 */ 1256, 496, 370, 499, 16, 16, 112, 113, 103, 1100, - /* 140 */ 1100, 953, 956, 946, 946, 110, 110, 111, 111, 111, - /* 150 */ 111, 262, 1107, 495, 1107, 401, 112, 113, 103, 1100, - /* 160 */ 1100, 953, 956, 946, 946, 110, 110, 111, 111, 111, - /* 170 */ 111, 129, 1425, 343, 1420, 339, 1059, 492, 1057, 263, - /* 180 */ 73, 105, 102, 197, 994, 109, 109, 109, 109, 108, - /* 190 */ 108, 107, 107, 107, 106, 401, 370, 111, 111, 111, - /* 200 */ 111, 104, 492, 89, 1432, 109, 109, 109, 109, 108, - /* 210 */ 108, 107, 107, 107, 106, 401, 111, 111, 111, 111, - /* 220 */ 112, 113, 103, 1100, 1100, 953, 956, 946, 946, 110, - /* 230 */ 110, 111, 111, 111, 111, 109, 109, 109, 109, 108, - /* 240 */ 108, 107, 107, 107, 106, 401, 114, 108, 108, 107, - /* 250 */ 107, 107, 106, 401, 109, 109, 109, 109, 108, 108, - /* 260 */ 107, 107, 107, 106, 401, 152, 399, 399, 399, 109, - /* 270 */ 109, 109, 109, 108, 108, 107, 107, 107, 106, 401, - /* 280 */ 178, 493, 1412, 434, 1037, 1486, 1079, 515, 1486, 370, - /* 290 */ 421, 297, 357, 412, 74, 1079, 109, 109, 109, 109, - /* 300 */ 108, 108, 107, 107, 107, 106, 401, 1413, 37, 37, - /* 310 */ 1431, 274, 506, 112, 113, 103, 1100, 1100, 953, 956, - /* 320 */ 946, 946, 110, 110, 111, 111, 111, 111, 1436, 520, - /* 330 */ 2, 1128, 1079, 1080, 1081, 430, 275, 1079, 127, 366, - /* 340 */ 933, 1079, 1080, 1081, 220, 1205, 913, 458, 455, 454, - /* 350 */ 392, 167, 515, 1035, 152, 445, 924, 453, 152, 874, - /* 360 */ 923, 289, 109, 109, 109, 109, 108, 108, 107, 107, - /* 370 */ 107, 106, 401, 13, 13, 261, 853, 252, 252, 227, - /* 380 */ 106, 401, 370, 1079, 1080, 1081, 311, 388, 1079, 296, - /* 390 */ 512, 923, 923, 925, 231, 323, 1255, 1388, 1423, 490, - /* 400 */ 274, 506, 12, 208, 274, 506, 112, 113, 103, 1100, - /* 410 */ 1100, 953, 956, 946, 946, 110, 110, 111, 111, 111, - /* 420 */ 111, 1440, 286, 1128, 288, 1079, 1097, 247, 275, 1098, - /* 430 */ 127, 387, 405, 389, 1079, 1080, 1081, 1205, 159, 238, - /* 440 */ 255, 321, 461, 316, 460, 225, 790, 105, 102, 197, - /* 450 */ 513, 314, 842, 842, 445, 109, 109, 109, 109, 108, - /* 460 */ 108, 107, 107, 107, 106, 401, 515, 514, 515, 252, - /* 470 */ 252, 1079, 1080, 1081, 435, 370, 1098, 933, 1460, 794, - /* 480 */ 274, 506, 512, 105, 102, 197, 336, 63, 63, 64, - /* 490 */ 64, 27, 790, 924, 287, 208, 1354, 923, 515, 112, - /* 500 */ 113, 103, 1100, 1100, 953, 956, 946, 946, 110, 110, - /* 510 */ 111, 111, 111, 111, 107, 107, 107, 106, 401, 49, - /* 520 */ 49, 515, 28, 1079, 405, 497, 421, 297, 923, 923, - /* 530 */ 925, 186, 468, 1079, 467, 999, 999, 442, 515, 1079, - /* 540 */ 334, 515, 45, 45, 1083, 342, 173, 168, 109, 109, - /* 550 */ 109, 109, 108, 108, 107, 107, 107, 106, 401, 13, - /* 560 */ 13, 205, 13, 13, 252, 252, 1195, 1195, 370, 1079, - /* 570 */ 1080, 1081, 787, 265, 5, 359, 494, 512, 469, 1079, - /* 580 */ 1080, 1081, 398, 397, 1079, 1079, 1080, 1081, 3, 282, - /* 590 */ 1079, 1083, 112, 113, 103, 1100, 1100, 953, 956, 946, - /* 600 */ 946, 110, 110, 111, 111, 111, 111, 252, 252, 1015, - /* 610 */ 220, 1079, 873, 458, 455, 454, 943, 943, 954, 957, - /* 620 */ 512, 252, 252, 453, 1016, 1079, 445, 1107, 1209, 1107, - /* 630 */ 1079, 1080, 1081, 515, 512, 426, 1079, 1080, 1081, 1017, - /* 640 */ 512, 109, 109, 109, 109, 108, 108, 107, 107, 107, - /* 650 */ 106, 401, 1052, 515, 50, 50, 515, 1079, 1080, 1081, - /* 660 */ 828, 370, 1051, 379, 411, 1064, 1358, 207, 408, 773, - /* 670 */ 829, 1079, 1080, 1081, 64, 64, 322, 64, 64, 1302, - /* 680 */ 947, 411, 410, 1358, 1360, 112, 113, 103, 1100, 1100, - /* 690 */ 953, 956, 946, 946, 110, 110, 111, 111, 111, 111, - /* 700 */ 294, 482, 515, 1037, 1487, 515, 434, 1487, 354, 1120, - /* 710 */ 483, 996, 913, 485, 466, 996, 132, 178, 33, 450, - /* 720 */ 1203, 136, 406, 64, 64, 479, 64, 64, 419, 369, - /* 730 */ 283, 1146, 252, 252, 109, 109, 109, 109, 108, 108, - /* 740 */ 107, 107, 107, 106, 401, 512, 224, 440, 411, 266, - /* 750 */ 1358, 266, 252, 252, 370, 296, 416, 284, 934, 396, - /* 760 */ 976, 470, 400, 252, 252, 512, 9, 473, 231, 500, - /* 770 */ 354, 1036, 1035, 1488, 355, 374, 512, 1121, 112, 113, - /* 780 */ 103, 1100, 1100, 953, 956, 946, 946, 110, 110, 111, - /* 790 */ 111, 111, 111, 252, 252, 1015, 515, 1347, 295, 252, - /* 800 */ 252, 252, 252, 1098, 375, 249, 512, 445, 872, 322, - /* 810 */ 1016, 480, 512, 195, 512, 434, 273, 15, 15, 515, - /* 820 */ 314, 515, 95, 515, 93, 1017, 367, 109, 109, 109, - /* 830 */ 109, 108, 108, 107, 107, 107, 106, 401, 515, 1121, - /* 840 */ 39, 39, 51, 51, 52, 52, 503, 370, 515, 1204, - /* 850 */ 1098, 918, 439, 341, 133, 436, 223, 222, 221, 53, - /* 860 */ 53, 322, 1400, 761, 762, 763, 515, 370, 88, 54, - /* 870 */ 54, 112, 113, 103, 1100, 1100, 953, 956, 946, 946, - /* 880 */ 110, 110, 111, 111, 111, 111, 407, 55, 55, 196, - /* 890 */ 515, 112, 113, 103, 1100, 1100, 953, 956, 946, 946, - /* 900 */ 110, 110, 111, 111, 111, 111, 135, 264, 1149, 376, - /* 910 */ 515, 40, 40, 515, 872, 515, 993, 515, 993, 116, - /* 920 */ 109, 109, 109, 109, 108, 108, 107, 107, 107, 106, - /* 930 */ 401, 41, 41, 515, 43, 43, 44, 44, 56, 56, - /* 940 */ 109, 109, 109, 109, 108, 108, 107, 107, 107, 106, - /* 950 */ 401, 515, 379, 515, 57, 57, 515, 799, 515, 379, - /* 960 */ 515, 445, 200, 515, 323, 515, 1397, 515, 1459, 515, - /* 970 */ 1287, 817, 58, 58, 14, 14, 515, 59, 59, 118, - /* 980 */ 118, 60, 60, 515, 46, 46, 61, 61, 62, 62, - /* 990 */ 47, 47, 515, 190, 189, 91, 515, 140, 140, 515, - /* 1000 */ 394, 515, 277, 1200, 141, 141, 515, 1115, 515, 992, - /* 1010 */ 515, 992, 515, 69, 69, 370, 278, 48, 48, 259, - /* 1020 */ 65, 65, 119, 119, 246, 246, 260, 66, 66, 120, - /* 1030 */ 120, 121, 121, 117, 117, 370, 515, 512, 383, 112, - /* 1040 */ 113, 103, 1100, 1100, 953, 956, 946, 946, 110, 110, - /* 1050 */ 111, 111, 111, 111, 515, 872, 515, 139, 139, 112, - /* 1060 */ 113, 103, 1100, 1100, 953, 956, 946, 946, 110, 110, - /* 1070 */ 111, 111, 111, 111, 1287, 138, 138, 125, 125, 515, - /* 1080 */ 12, 515, 281, 1287, 515, 445, 131, 1287, 109, 109, - /* 1090 */ 109, 109, 108, 108, 107, 107, 107, 106, 401, 515, - /* 1100 */ 124, 124, 122, 122, 515, 123, 123, 515, 109, 109, - /* 1110 */ 109, 109, 108, 108, 107, 107, 107, 106, 401, 515, - /* 1120 */ 68, 68, 463, 783, 515, 70, 70, 302, 67, 67, - /* 1130 */ 1032, 253, 253, 356, 1287, 191, 196, 1433, 465, 1301, - /* 1140 */ 38, 38, 384, 94, 512, 42, 42, 177, 848, 274, - /* 1150 */ 506, 385, 420, 847, 1356, 441, 508, 376, 377, 153, - /* 1160 */ 423, 872, 432, 370, 224, 251, 194, 887, 182, 293, - /* 1170 */ 783, 848, 88, 254, 466, 888, 847, 915, 807, 806, - /* 1180 */ 230, 1241, 910, 370, 17, 413, 797, 112, 113, 103, - /* 1190 */ 1100, 1100, 953, 956, 946, 946, 110, 110, 111, 111, - /* 1200 */ 111, 111, 395, 814, 815, 1175, 983, 112, 101, 103, - /* 1210 */ 1100, 1100, 953, 956, 946, 946, 110, 110, 111, 111, - /* 1220 */ 111, 111, 375, 422, 427, 429, 298, 230, 230, 88, - /* 1230 */ 1240, 451, 312, 797, 226, 88, 109, 109, 109, 109, - /* 1240 */ 108, 108, 107, 107, 107, 106, 401, 86, 433, 979, - /* 1250 */ 927, 881, 226, 983, 230, 415, 109, 109, 109, 109, - /* 1260 */ 108, 108, 107, 107, 107, 106, 401, 320, 845, 781, - /* 1270 */ 846, 100, 130, 100, 1403, 290, 370, 319, 1377, 1376, - /* 1280 */ 437, 1449, 299, 1237, 303, 306, 308, 310, 1188, 1174, - /* 1290 */ 1173, 1172, 315, 324, 325, 1228, 370, 927, 1249, 271, - /* 1300 */ 1286, 113, 103, 1100, 1100, 953, 956, 946, 946, 110, - /* 1310 */ 110, 111, 111, 111, 111, 1224, 1235, 502, 501, 1292, - /* 1320 */ 1221, 1155, 103, 1100, 1100, 953, 956, 946, 946, 110, - /* 1330 */ 110, 111, 111, 111, 111, 1148, 1137, 1136, 1138, 1443, - /* 1340 */ 446, 244, 184, 98, 507, 188, 4, 353, 327, 109, - /* 1350 */ 109, 109, 109, 108, 108, 107, 107, 107, 106, 401, - /* 1360 */ 510, 329, 331, 199, 414, 456, 292, 285, 318, 109, - /* 1370 */ 109, 109, 109, 108, 108, 107, 107, 107, 106, 401, - /* 1380 */ 11, 1271, 1279, 402, 361, 192, 1171, 1351, 431, 505, - /* 1390 */ 346, 1350, 333, 98, 507, 504, 4, 187, 1446, 1115, - /* 1400 */ 233, 1396, 155, 1394, 1112, 152, 72, 75, 378, 425, - /* 1410 */ 510, 165, 149, 157, 933, 1276, 86, 30, 1268, 417, - /* 1420 */ 96, 96, 8, 160, 161, 162, 163, 97, 418, 402, - /* 1430 */ 517, 516, 449, 402, 923, 210, 358, 424, 1282, 438, - /* 1440 */ 169, 214, 360, 1345, 80, 504, 31, 444, 1365, 301, - /* 1450 */ 245, 274, 506, 216, 174, 305, 488, 447, 217, 462, - /* 1460 */ 1139, 487, 218, 363, 933, 923, 923, 925, 926, 24, - /* 1470 */ 96, 96, 1191, 1190, 1189, 391, 1182, 97, 1163, 402, - /* 1480 */ 517, 516, 799, 364, 923, 1162, 317, 1161, 98, 507, - /* 1490 */ 1181, 4, 1458, 472, 393, 269, 270, 475, 481, 1232, - /* 1500 */ 85, 1233, 326, 328, 232, 510, 495, 1231, 330, 98, - /* 1510 */ 507, 1230, 4, 486, 335, 923, 923, 925, 926, 24, - /* 1520 */ 1435, 1068, 404, 181, 336, 256, 510, 115, 402, 332, - /* 1530 */ 352, 352, 351, 241, 349, 1214, 1414, 770, 338, 10, - /* 1540 */ 504, 340, 272, 92, 1331, 1213, 87, 183, 484, 402, - /* 1550 */ 201, 488, 280, 239, 344, 345, 489, 1145, 29, 933, - /* 1560 */ 279, 504, 1074, 518, 240, 96, 96, 242, 243, 519, - /* 1570 */ 1134, 1129, 97, 154, 402, 517, 516, 372, 373, 923, - /* 1580 */ 933, 142, 143, 128, 1381, 267, 96, 96, 852, 757, - /* 1590 */ 203, 144, 403, 97, 1382, 402, 517, 516, 204, 1380, - /* 1600 */ 923, 146, 1379, 1159, 1158, 71, 1156, 276, 202, 185, - /* 1610 */ 923, 923, 925, 926, 24, 198, 257, 126, 991, 989, - /* 1620 */ 907, 98, 507, 156, 4, 145, 158, 206, 831, 209, - /* 1630 */ 291, 923, 923, 925, 926, 24, 1005, 911, 510, 164, - /* 1640 */ 147, 380, 371, 382, 166, 76, 77, 274, 506, 148, - /* 1650 */ 78, 79, 1008, 211, 212, 1004, 137, 213, 18, 300, - /* 1660 */ 230, 402, 997, 1109, 443, 215, 32, 170, 171, 772, - /* 1670 */ 409, 448, 319, 504, 219, 172, 452, 81, 19, 457, - /* 1680 */ 313, 20, 82, 268, 488, 150, 810, 179, 83, 487, - /* 1690 */ 464, 151, 933, 180, 959, 84, 1040, 34, 96, 96, - /* 1700 */ 471, 1041, 35, 474, 193, 97, 248, 402, 517, 516, - /* 1710 */ 1068, 404, 923, 250, 256, 880, 229, 175, 875, 352, - /* 1720 */ 352, 351, 241, 349, 100, 21, 770, 22, 1054, 1056, - /* 1730 */ 7, 98, 507, 1045, 4, 337, 1058, 23, 974, 201, - /* 1740 */ 176, 280, 88, 923, 923, 925, 926, 24, 510, 279, - /* 1750 */ 960, 958, 962, 1014, 963, 1013, 235, 234, 25, 36, - /* 1760 */ 99, 90, 507, 928, 4, 511, 350, 782, 26, 841, - /* 1770 */ 236, 402, 347, 1069, 237, 1125, 1125, 1451, 510, 203, - /* 1780 */ 1450, 1125, 1125, 504, 1125, 1125, 1125, 204, 1125, 1125, - /* 1790 */ 146, 1125, 1125, 1125, 1125, 1125, 1125, 202, 1125, 1125, - /* 1800 */ 1125, 402, 933, 1125, 1125, 1125, 1125, 1125, 96, 96, - /* 1810 */ 1125, 1125, 1125, 504, 1125, 97, 1125, 402, 517, 516, - /* 1820 */ 1125, 1125, 923, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1830 */ 1125, 371, 933, 1125, 1125, 1125, 274, 506, 96, 96, - /* 1840 */ 1125, 1125, 1125, 1125, 1125, 97, 1125, 402, 517, 516, - /* 1850 */ 1125, 1125, 923, 923, 923, 925, 926, 24, 1125, 409, - /* 1860 */ 1125, 1125, 1125, 256, 1125, 1125, 1125, 1125, 352, 352, - /* 1870 */ 351, 241, 349, 1125, 1125, 770, 1125, 1125, 1125, 1125, - /* 1880 */ 1125, 1125, 1125, 923, 923, 925, 926, 24, 201, 1125, - /* 1890 */ 280, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 279, 1125, - /* 1900 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1910 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1920 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 203, 1125, - /* 1930 */ 1125, 1125, 1125, 1125, 1125, 1125, 204, 1125, 1125, 146, - /* 1940 */ 1125, 1125, 1125, 1125, 1125, 1125, 202, 1125, 1125, 1125, - /* 1950 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1960 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1970 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 1980 */ 371, 1125, 1125, 1125, 1125, 274, 506, 1125, 1125, 1125, - /* 1990 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, - /* 2000 */ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 409, + /* 0 */ 535, 1323, 112, 109, 209, 112, 109, 209, 1160, 1, + /* 10 */ 1, 540, 2, 1164, 535, 1292, 1228, 1207, 289, 384, + /* 20 */ 134, 42, 42, 1427, 382, 1228, 9, 1241, 242, 492, + /* 30 */ 1291, 915, 373, 379, 1026, 70, 70, 427, 1026, 916, + /* 40 */ 529, 529, 529, 119, 120, 110, 1136, 1136, 981, 984, + /* 50 */ 974, 974, 117, 117, 118, 118, 118, 118, 380, 264, + /* 60 */ 264, 264, 264, 1134, 264, 264, 112, 109, 209, 397, + /* 70 */ 454, 517, 532, 491, 532, 1233, 1233, 532, 239, 206, + /* 80 */ 493, 112, 109, 209, 464, 219, 118, 118, 118, 118, + /* 90 */ 111, 393, 440, 444, 16, 16, 116, 116, 116, 116, + /* 100 */ 115, 115, 114, 114, 114, 113, 415, 971, 971, 982, + /* 110 */ 985, 235, 1463, 351, 1134, 419, 384, 116, 116, 116, + /* 120 */ 116, 115, 115, 114, 114, 114, 113, 415, 116, 116, + /* 130 */ 116, 116, 115, 115, 114, 114, 114, 113, 415, 961, + /* 140 */ 119, 120, 110, 1136, 1136, 981, 984, 974, 974, 117, + /* 150 */ 117, 118, 118, 118, 118, 952, 415, 941, 298, 951, + /* 160 */ 941, 1480, 540, 2, 1164, 1115, 535, 1458, 160, 289, + /* 170 */ 6, 134, 1504, 389, 406, 975, 338, 1024, 1241, 337, + /* 180 */ 1089, 1476, 1089, 118, 118, 118, 118, 42, 42, 329, + /* 190 */ 951, 951, 953, 116, 116, 116, 116, 115, 115, 114, + /* 200 */ 114, 114, 113, 415, 311, 430, 299, 311, 881, 160, + /* 210 */ 264, 264, 401, 384, 324, 1115, 1116, 1117, 288, 526, + /* 220 */ 96, 159, 1441, 532, 141, 116, 116, 116, 116, 115, + /* 230 */ 115, 114, 114, 114, 113, 415, 219, 119, 120, 110, + /* 240 */ 1136, 1136, 981, 984, 974, 974, 117, 117, 118, 118, + /* 250 */ 118, 118, 115, 115, 114, 114, 114, 113, 415, 288, + /* 260 */ 526, 403, 533, 121, 870, 870, 419, 250, 267, 336, + /* 270 */ 475, 331, 474, 236, 160, 319, 1084, 322, 1465, 329, + /* 280 */ 350, 12, 535, 384, 502, 1115, 1084, 435, 312, 1084, + /* 290 */ 116, 116, 116, 116, 115, 115, 114, 114, 114, 113, + /* 300 */ 415, 535, 836, 42, 42, 138, 426, 119, 120, 110, + /* 310 */ 1136, 1136, 981, 984, 974, 974, 117, 117, 118, 118, + /* 320 */ 118, 118, 70, 70, 288, 526, 412, 411, 480, 1457, + /* 330 */ 335, 79, 6, 473, 1140, 1115, 1116, 1117, 501, 1142, + /* 340 */ 334, 837, 811, 1484, 512, 1164, 534, 1141, 123, 187, + /* 350 */ 289, 384, 134, 448, 434, 1115, 80, 349, 498, 1241, + /* 360 */ 116, 116, 116, 116, 115, 115, 114, 114, 114, 113, + /* 370 */ 415, 1143, 1115, 1143, 459, 119, 120, 110, 1136, 1136, + /* 380 */ 981, 984, 974, 974, 117, 117, 118, 118, 118, 118, + /* 390 */ 404, 264, 264, 811, 1463, 506, 368, 1156, 535, 114, + /* 400 */ 114, 114, 113, 415, 532, 1115, 1116, 1117, 231, 518, + /* 410 */ 1500, 472, 469, 468, 175, 497, 422, 219, 1202, 70, + /* 420 */ 70, 467, 1115, 1116, 1117, 176, 201, 200, 116, 116, + /* 430 */ 116, 116, 115, 115, 114, 114, 114, 113, 415, 535, + /* 440 */ 1115, 264, 264, 435, 312, 1115, 273, 419, 384, 513, + /* 450 */ 1450, 1115, 326, 1084, 532, 517, 82, 1084, 167, 388, + /* 460 */ 69, 69, 1115, 1084, 519, 509, 1084, 1084, 12, 1157, + /* 470 */ 1084, 420, 119, 120, 110, 1136, 1136, 981, 984, 974, + /* 480 */ 974, 117, 117, 118, 118, 118, 118, 258, 258, 535, + /* 490 */ 1115, 1116, 1117, 1045, 535, 1115, 1116, 1117, 1323, 535, + /* 500 */ 532, 1115, 1116, 1117, 296, 483, 1211, 818, 1046, 448, + /* 510 */ 70, 70, 1115, 1116, 1117, 50, 50, 448, 356, 500, + /* 520 */ 70, 70, 207, 1047, 32, 116, 116, 116, 116, 115, + /* 530 */ 115, 114, 114, 114, 113, 415, 453, 264, 264, 1115, + /* 540 */ 450, 449, 961, 508, 856, 384, 517, 5, 900, 822, + /* 550 */ 532, 484, 181, 1115, 857, 516, 517, 818, 952, 507, + /* 560 */ 3, 1115, 951, 1231, 1231, 482, 398, 1115, 1095, 119, + /* 570 */ 120, 110, 1136, 1136, 981, 984, 974, 974, 117, 117, + /* 580 */ 118, 118, 118, 118, 1115, 535, 238, 1115, 1391, 1115, + /* 590 */ 1116, 1117, 159, 951, 951, 953, 231, 1115, 259, 472, + /* 600 */ 469, 468, 310, 1115, 1116, 1117, 13, 13, 297, 467, + /* 610 */ 276, 1115, 1116, 1117, 412, 411, 1095, 1115, 1116, 1117, + /* 620 */ 395, 355, 116, 116, 116, 116, 115, 115, 114, 114, + /* 630 */ 114, 113, 415, 208, 1115, 1116, 1117, 1115, 1116, 1117, + /* 640 */ 264, 264, 384, 337, 902, 393, 815, 1115, 1116, 1117, + /* 650 */ 413, 413, 413, 532, 112, 109, 209, 309, 900, 1143, + /* 660 */ 535, 1143, 535, 393, 901, 1210, 119, 120, 110, 1136, + /* 670 */ 1136, 981, 984, 974, 974, 117, 117, 118, 118, 118, + /* 680 */ 118, 13, 13, 13, 13, 265, 265, 535, 143, 264, + /* 690 */ 264, 288, 526, 535, 1119, 400, 535, 402, 532, 510, + /* 700 */ 1457, 512, 532, 6, 113, 415, 1067, 1530, 70, 70, + /* 710 */ 1530, 535, 271, 535, 70, 70, 535, 13, 13, 116, + /* 720 */ 116, 116, 116, 115, 115, 114, 114, 114, 113, 415, + /* 730 */ 272, 277, 13, 13, 13, 13, 535, 13, 13, 384, + /* 740 */ 535, 304, 425, 1100, 284, 1119, 184, 801, 185, 338, + /* 750 */ 285, 514, 1532, 369, 1239, 1438, 1182, 70, 70, 425, + /* 760 */ 424, 70, 70, 119, 120, 110, 1136, 1136, 981, 984, + /* 770 */ 974, 974, 117, 117, 118, 118, 118, 118, 190, 1065, + /* 780 */ 1067, 1531, 442, 107, 1531, 408, 264, 264, 264, 264, + /* 790 */ 383, 1396, 261, 410, 95, 900, 485, 414, 421, 532, + /* 800 */ 1045, 532, 301, 1133, 303, 488, 433, 1451, 1396, 1398, + /* 810 */ 278, 535, 278, 520, 1435, 1046, 116, 116, 116, 116, + /* 820 */ 115, 115, 114, 114, 114, 113, 415, 425, 264, 264, + /* 830 */ 1047, 190, 54, 54, 535, 291, 384, 264, 264, 362, + /* 840 */ 962, 532, 1004, 376, 1084, 264, 264, 1029, 1029, 456, + /* 850 */ 532, 523, 270, 1065, 1084, 55, 55, 1084, 532, 442, + /* 860 */ 119, 120, 110, 1136, 1136, 981, 984, 974, 974, 117, + /* 870 */ 117, 118, 118, 118, 118, 535, 1396, 190, 302, 1383, + /* 880 */ 208, 535, 789, 790, 791, 535, 515, 535, 1323, 371, + /* 890 */ 337, 234, 233, 232, 459, 515, 15, 15, 459, 477, + /* 900 */ 459, 459, 44, 44, 136, 900, 56, 56, 57, 57, + /* 910 */ 1185, 390, 197, 116, 116, 116, 116, 115, 115, 114, + /* 920 */ 114, 114, 113, 415, 535, 876, 535, 442, 535, 274, + /* 930 */ 875, 1323, 357, 384, 353, 140, 1426, 946, 1455, 1323, + /* 940 */ 1390, 6, 1240, 1236, 292, 58, 58, 59, 59, 60, + /* 950 */ 60, 535, 1456, 384, 535, 6, 399, 119, 120, 110, + /* 960 */ 1136, 1136, 981, 984, 974, 974, 117, 117, 118, 118, + /* 970 */ 118, 118, 61, 61, 535, 45, 45, 119, 120, 110, + /* 980 */ 1136, 1136, 981, 984, 974, 974, 117, 117, 118, 118, + /* 990 */ 118, 118, 1477, 479, 202, 46, 46, 275, 95, 455, + /* 1000 */ 535, 212, 535, 337, 535, 1454, 535, 409, 6, 242, + /* 1010 */ 116, 116, 116, 116, 115, 115, 114, 114, 114, 113, + /* 1020 */ 415, 48, 48, 49, 49, 62, 62, 63, 63, 535, + /* 1030 */ 116, 116, 116, 116, 115, 115, 114, 114, 114, 113, + /* 1040 */ 415, 535, 459, 535, 1134, 535, 1151, 535, 142, 535, + /* 1050 */ 64, 64, 535, 1338, 535, 494, 535, 446, 535, 1264, + /* 1060 */ 535, 1337, 14, 14, 65, 65, 125, 125, 66, 66, + /* 1070 */ 51, 51, 535, 67, 67, 68, 68, 52, 52, 147, + /* 1080 */ 147, 148, 148, 1453, 317, 98, 6, 535, 1245, 481, + /* 1090 */ 535, 827, 535, 75, 75, 1134, 102, 481, 100, 535, + /* 1100 */ 532, 535, 368, 1066, 1503, 384, 535, 845, 53, 53, + /* 1110 */ 93, 71, 71, 126, 126, 295, 528, 390, 288, 526, + /* 1120 */ 72, 72, 127, 127, 139, 384, 38, 128, 128, 119, + /* 1130 */ 120, 110, 1136, 1136, 981, 984, 974, 974, 117, 117, + /* 1140 */ 118, 118, 118, 118, 535, 495, 535, 447, 535, 119, + /* 1150 */ 120, 110, 1136, 1136, 981, 984, 974, 974, 117, 117, + /* 1160 */ 118, 118, 118, 118, 235, 124, 124, 146, 146, 145, + /* 1170 */ 145, 287, 535, 1277, 535, 1157, 535, 391, 161, 263, + /* 1180 */ 206, 381, 116, 116, 116, 116, 115, 115, 114, 114, + /* 1190 */ 114, 113, 415, 132, 132, 131, 131, 129, 129, 535, + /* 1200 */ 30, 535, 116, 116, 116, 116, 115, 115, 114, 114, + /* 1210 */ 114, 113, 415, 535, 216, 1062, 1276, 535, 370, 535, + /* 1220 */ 130, 130, 74, 74, 535, 915, 389, 876, 17, 437, + /* 1230 */ 429, 31, 875, 916, 76, 76, 266, 101, 73, 73, + /* 1240 */ 43, 43, 835, 834, 308, 47, 47, 95, 825, 943, + /* 1250 */ 441, 938, 241, 241, 305, 443, 313, 384, 241, 95, + /* 1260 */ 842, 843, 193, 465, 1209, 327, 237, 436, 95, 1011, + /* 1270 */ 1007, 909, 873, 237, 241, 107, 1023, 384, 1023, 955, + /* 1280 */ 1415, 119, 120, 110, 1136, 1136, 981, 984, 974, 974, + /* 1290 */ 117, 117, 118, 118, 118, 118, 1022, 809, 1022, 825, + /* 1300 */ 137, 119, 108, 110, 1136, 1136, 981, 984, 974, 974, + /* 1310 */ 117, 117, 118, 118, 118, 118, 874, 1414, 451, 107, + /* 1320 */ 1011, 314, 1273, 318, 218, 321, 323, 325, 1224, 1208, + /* 1330 */ 955, 330, 339, 340, 116, 116, 116, 116, 115, 115, + /* 1340 */ 114, 114, 114, 113, 415, 1285, 1322, 1260, 1493, 1470, + /* 1350 */ 1271, 283, 521, 1328, 116, 116, 116, 116, 115, 115, + /* 1360 */ 114, 114, 114, 113, 415, 1191, 1184, 1173, 1172, 1174, + /* 1370 */ 522, 1487, 211, 460, 384, 256, 199, 367, 1257, 342, + /* 1380 */ 195, 470, 307, 344, 11, 333, 525, 445, 1307, 1315, + /* 1390 */ 375, 203, 1207, 1151, 384, 346, 1387, 188, 360, 120, + /* 1400 */ 110, 1136, 1136, 981, 984, 974, 974, 117, 117, 118, + /* 1410 */ 118, 118, 118, 1386, 428, 1490, 245, 300, 348, 1148, + /* 1420 */ 110, 1136, 1136, 981, 984, 974, 974, 117, 117, 118, + /* 1430 */ 118, 118, 118, 189, 198, 1434, 1432, 78, 81, 163, + /* 1440 */ 82, 392, 439, 1392, 173, 105, 527, 35, 4, 157, + /* 1450 */ 1312, 116, 116, 116, 116, 115, 115, 114, 114, 114, + /* 1460 */ 113, 415, 530, 165, 93, 1304, 431, 432, 168, 463, + /* 1470 */ 221, 116, 116, 116, 116, 115, 115, 114, 114, 114, + /* 1480 */ 113, 415, 169, 452, 170, 416, 171, 374, 372, 438, + /* 1490 */ 36, 1318, 177, 225, 1381, 87, 458, 524, 1403, 316, + /* 1500 */ 257, 105, 527, 227, 4, 182, 461, 160, 320, 228, + /* 1510 */ 377, 1175, 476, 229, 1227, 1226, 405, 1225, 530, 1218, + /* 1520 */ 961, 378, 1199, 1198, 827, 332, 103, 103, 1197, 407, + /* 1530 */ 8, 1217, 1502, 104, 487, 416, 537, 536, 281, 282, + /* 1540 */ 951, 416, 490, 1268, 496, 92, 341, 243, 1269, 343, + /* 1550 */ 244, 1267, 122, 524, 345, 1461, 515, 288, 526, 10, + /* 1560 */ 354, 1266, 1460, 352, 504, 1250, 99, 1367, 94, 503, + /* 1570 */ 499, 951, 951, 953, 954, 27, 961, 347, 1249, 194, + /* 1580 */ 251, 358, 103, 103, 359, 1181, 34, 538, 1110, 104, + /* 1590 */ 255, 416, 537, 536, 286, 252, 951, 254, 539, 149, + /* 1600 */ 1170, 1419, 1165, 1420, 1418, 150, 1417, 135, 279, 785, + /* 1610 */ 151, 417, 1195, 196, 290, 210, 386, 1194, 269, 387, + /* 1620 */ 162, 1021, 133, 77, 1192, 1019, 935, 951, 951, 953, + /* 1630 */ 954, 27, 1479, 1104, 418, 164, 153, 268, 217, 166, + /* 1640 */ 859, 306, 366, 366, 365, 253, 363, 220, 1035, 798, + /* 1650 */ 172, 939, 105, 527, 155, 4, 394, 174, 396, 156, + /* 1660 */ 83, 1038, 213, 84, 294, 85, 86, 223, 222, 530, + /* 1670 */ 1034, 144, 293, 18, 224, 315, 241, 1027, 1145, 178, + /* 1680 */ 457, 226, 179, 37, 800, 334, 462, 230, 328, 466, + /* 1690 */ 180, 471, 416, 88, 19, 20, 89, 280, 838, 158, + /* 1700 */ 191, 90, 215, 478, 524, 1097, 204, 192, 987, 91, + /* 1710 */ 152, 1070, 39, 154, 1071, 504, 486, 40, 489, 205, + /* 1720 */ 505, 260, 105, 527, 214, 4, 908, 961, 262, 183, + /* 1730 */ 240, 21, 903, 103, 103, 107, 22, 1086, 23, 530, + /* 1740 */ 104, 1088, 416, 537, 536, 24, 1093, 951, 25, 1074, + /* 1750 */ 1090, 1094, 7, 33, 511, 186, 26, 1002, 385, 95, + /* 1760 */ 988, 986, 416, 288, 526, 990, 1044, 246, 1043, 247, + /* 1770 */ 991, 28, 41, 106, 524, 956, 810, 29, 951, 951, + /* 1780 */ 953, 954, 27, 531, 361, 504, 423, 248, 869, 249, + /* 1790 */ 503, 1495, 364, 1105, 1161, 1494, 1161, 961, 1161, 1161, + /* 1800 */ 1161, 1161, 1161, 103, 103, 1161, 1161, 1161, 1161, 1161, + /* 1810 */ 104, 1161, 416, 537, 536, 1104, 418, 951, 1161, 268, + /* 1820 */ 1161, 1161, 1161, 1161, 366, 366, 365, 253, 363, 1161, + /* 1830 */ 1161, 798, 1161, 1161, 1161, 1161, 105, 527, 1161, 4, + /* 1840 */ 1161, 1161, 1161, 1161, 213, 1161, 294, 1161, 951, 951, + /* 1850 */ 953, 954, 27, 530, 293, 1161, 1161, 1161, 1161, 1161, + /* 1860 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, + /* 1870 */ 1161, 1161, 1161, 1161, 1161, 1161, 416, 1161, 1161, 1161, + /* 1880 */ 1161, 1161, 1161, 1161, 215, 1161, 1161, 1161, 524, 1161, + /* 1890 */ 1161, 1161, 152, 1161, 1161, 154, 105, 527, 1161, 4, + /* 1900 */ 1161, 1161, 1161, 1161, 1161, 1161, 214, 1161, 1161, 1161, + /* 1910 */ 1161, 961, 1161, 530, 1161, 1161, 1161, 103, 103, 880, + /* 1920 */ 1161, 1161, 1161, 1161, 104, 1161, 416, 537, 536, 1161, + /* 1930 */ 1161, 951, 1161, 1161, 1161, 1161, 416, 1161, 1161, 1161, + /* 1940 */ 385, 1161, 1161, 1161, 1161, 288, 526, 1161, 524, 1161, + /* 1950 */ 1161, 1161, 1161, 1161, 1161, 1161, 97, 527, 1161, 4, + /* 1960 */ 1161, 1161, 951, 951, 953, 954, 27, 1161, 423, 1161, + /* 1970 */ 1161, 961, 1161, 530, 1161, 1161, 1161, 103, 103, 1161, + /* 1980 */ 1161, 1161, 1161, 1161, 104, 1161, 416, 537, 536, 1161, + /* 1990 */ 1161, 951, 268, 1161, 1161, 1161, 416, 366, 366, 365, + /* 2000 */ 253, 363, 1161, 1161, 798, 1161, 1161, 1161, 524, 1161, + /* 2010 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 213, 1161, 294, + /* 2020 */ 1161, 1161, 951, 951, 953, 954, 27, 293, 1161, 1161, + /* 2030 */ 1161, 961, 1161, 1161, 1161, 1161, 1161, 103, 103, 1161, + /* 2040 */ 1161, 1161, 1161, 1161, 104, 1161, 416, 537, 536, 1161, + /* 2050 */ 1161, 951, 1161, 1161, 1161, 1161, 1161, 215, 1161, 1161, + /* 2060 */ 1161, 1161, 1161, 1161, 1161, 152, 1161, 1161, 154, 1161, + /* 2070 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 214, + /* 2080 */ 1161, 1161, 951, 951, 953, 954, 27, 1161, 1161, 1161, + /* 2090 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, + /* 2100 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, + /* 2110 */ 1161, 1161, 1161, 385, 1161, 1161, 1161, 1161, 288, 526, + /* 2120 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, + /* 2130 */ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, + /* 2140 */ 1161, 423, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 184, 238, 239, 240, 238, 239, 240, 163, 155, 156, - /* 10 */ 157, 158, 159, 160, 163, 191, 192, 183, 165, 19, - /* 20 */ 167, 258, 202, 203, 200, 191, 163, 174, 184, 185, - /* 30 */ 174, 31, 163, 163, 171, 184, 185, 35, 175, 39, - /* 40 */ 179, 180, 181, 43, 44, 45, 46, 47, 48, 49, - /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 184, 206, - /* 60 */ 207, 163, 206, 207, 220, 163, 16, 163, 66, 163, - /* 70 */ 59, 270, 219, 229, 273, 219, 74, 208, 174, 223, - /* 80 */ 224, 163, 184, 185, 163, 232, 184, 185, 184, 185, - /* 90 */ 184, 185, 92, 93, 94, 95, 96, 97, 98, 99, - /* 100 */ 100, 101, 102, 233, 198, 184, 185, 96, 97, 163, - /* 110 */ 206, 207, 19, 163, 261, 104, 105, 106, 107, 198, - /* 120 */ 109, 119, 220, 219, 220, 274, 275, 77, 117, 79, - /* 130 */ 187, 229, 19, 229, 184, 185, 43, 44, 45, 46, - /* 140 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 150 */ 57, 233, 141, 134, 143, 102, 43, 44, 45, 46, - /* 160 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 170 */ 57, 152, 274, 216, 276, 218, 83, 163, 85, 233, - /* 180 */ 67, 238, 239, 240, 11, 92, 93, 94, 95, 96, - /* 190 */ 97, 98, 99, 100, 101, 102, 19, 54, 55, 56, - /* 200 */ 57, 58, 163, 26, 163, 92, 93, 94, 95, 96, - /* 210 */ 97, 98, 99, 100, 101, 102, 54, 55, 56, 57, - /* 220 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - /* 230 */ 53, 54, 55, 56, 57, 92, 93, 94, 95, 96, - /* 240 */ 97, 98, 99, 100, 101, 102, 69, 96, 97, 98, - /* 250 */ 99, 100, 101, 102, 92, 93, 94, 95, 96, 97, - /* 260 */ 98, 99, 100, 101, 102, 81, 179, 180, 181, 92, - /* 270 */ 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - /* 280 */ 163, 267, 268, 163, 22, 23, 59, 163, 26, 19, - /* 290 */ 117, 118, 175, 109, 24, 59, 92, 93, 94, 95, - /* 300 */ 96, 97, 98, 99, 100, 101, 102, 268, 184, 185, - /* 310 */ 269, 127, 128, 43, 44, 45, 46, 47, 48, 49, - /* 320 */ 50, 51, 52, 53, 54, 55, 56, 57, 157, 158, - /* 330 */ 159, 160, 105, 106, 107, 163, 165, 59, 167, 184, - /* 340 */ 90, 105, 106, 107, 108, 174, 73, 111, 112, 113, - /* 350 */ 19, 22, 163, 91, 81, 163, 106, 121, 81, 132, - /* 360 */ 110, 16, 92, 93, 94, 95, 96, 97, 98, 99, - /* 370 */ 100, 101, 102, 184, 185, 255, 98, 206, 207, 26, - /* 380 */ 101, 102, 19, 105, 106, 107, 23, 198, 59, 116, - /* 390 */ 219, 141, 142, 143, 24, 163, 187, 205, 274, 275, - /* 400 */ 127, 128, 182, 232, 127, 128, 43, 44, 45, 46, - /* 410 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 420 */ 57, 158, 77, 160, 79, 59, 26, 182, 165, 59, - /* 430 */ 167, 199, 261, 102, 105, 106, 107, 174, 72, 108, - /* 440 */ 109, 110, 111, 112, 113, 114, 59, 238, 239, 240, - /* 450 */ 123, 120, 125, 126, 163, 92, 93, 94, 95, 96, - /* 460 */ 97, 98, 99, 100, 101, 102, 163, 163, 163, 206, - /* 470 */ 207, 105, 106, 107, 254, 19, 106, 90, 197, 23, - /* 480 */ 127, 128, 219, 238, 239, 240, 22, 184, 185, 184, - /* 490 */ 185, 22, 105, 106, 149, 232, 205, 110, 163, 43, - /* 500 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 510 */ 54, 55, 56, 57, 98, 99, 100, 101, 102, 184, - /* 520 */ 185, 163, 53, 59, 261, 220, 117, 118, 141, 142, - /* 530 */ 143, 131, 174, 59, 229, 116, 117, 118, 163, 59, - /* 540 */ 163, 163, 184, 185, 59, 242, 72, 22, 92, 93, - /* 550 */ 94, 95, 96, 97, 98, 99, 100, 101, 102, 184, - /* 560 */ 185, 24, 184, 185, 206, 207, 202, 203, 19, 105, - /* 570 */ 106, 107, 23, 198, 22, 174, 198, 219, 220, 105, - /* 580 */ 106, 107, 96, 97, 59, 105, 106, 107, 22, 174, - /* 590 */ 59, 106, 43, 44, 45, 46, 47, 48, 49, 50, - /* 600 */ 51, 52, 53, 54, 55, 56, 57, 206, 207, 12, - /* 610 */ 108, 59, 132, 111, 112, 113, 46, 47, 48, 49, - /* 620 */ 219, 206, 207, 121, 27, 59, 163, 141, 207, 143, - /* 630 */ 105, 106, 107, 163, 219, 234, 105, 106, 107, 42, - /* 640 */ 219, 92, 93, 94, 95, 96, 97, 98, 99, 100, - /* 650 */ 101, 102, 76, 163, 184, 185, 163, 105, 106, 107, - /* 660 */ 63, 19, 86, 163, 163, 23, 163, 130, 205, 21, - /* 670 */ 73, 105, 106, 107, 184, 185, 163, 184, 185, 237, - /* 680 */ 110, 180, 181, 180, 181, 43, 44, 45, 46, 47, - /* 690 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 700 */ 174, 163, 163, 22, 23, 163, 163, 26, 22, 23, - /* 710 */ 220, 29, 73, 220, 272, 33, 22, 163, 24, 19, - /* 720 */ 174, 208, 259, 184, 185, 19, 184, 185, 80, 175, - /* 730 */ 230, 174, 206, 207, 92, 93, 94, 95, 96, 97, - /* 740 */ 98, 99, 100, 101, 102, 219, 46, 65, 247, 195, - /* 750 */ 247, 197, 206, 207, 19, 116, 117, 118, 23, 220, - /* 760 */ 112, 174, 220, 206, 207, 219, 22, 174, 24, 174, - /* 770 */ 22, 23, 91, 264, 265, 168, 219, 91, 43, 44, - /* 780 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - /* 790 */ 55, 56, 57, 206, 207, 12, 163, 149, 255, 206, - /* 800 */ 207, 206, 207, 59, 104, 23, 219, 163, 26, 163, - /* 810 */ 27, 105, 219, 163, 219, 163, 211, 184, 185, 163, - /* 820 */ 120, 163, 146, 163, 148, 42, 221, 92, 93, 94, - /* 830 */ 95, 96, 97, 98, 99, 100, 101, 102, 163, 91, - /* 840 */ 184, 185, 184, 185, 184, 185, 63, 19, 163, 205, - /* 850 */ 106, 23, 245, 163, 208, 248, 116, 117, 118, 184, - /* 860 */ 185, 163, 163, 7, 8, 9, 163, 19, 26, 184, - /* 870 */ 185, 43, 44, 45, 46, 47, 48, 49, 50, 51, - /* 880 */ 52, 53, 54, 55, 56, 57, 163, 184, 185, 107, - /* 890 */ 163, 43, 44, 45, 46, 47, 48, 49, 50, 51, - /* 900 */ 52, 53, 54, 55, 56, 57, 208, 255, 177, 178, - /* 910 */ 163, 184, 185, 163, 132, 163, 141, 163, 143, 22, - /* 920 */ 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - /* 930 */ 102, 184, 185, 163, 184, 185, 184, 185, 184, 185, - /* 940 */ 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - /* 950 */ 102, 163, 163, 163, 184, 185, 163, 115, 163, 163, - /* 960 */ 163, 163, 15, 163, 163, 163, 163, 163, 23, 163, - /* 970 */ 163, 26, 184, 185, 184, 185, 163, 184, 185, 184, - /* 980 */ 185, 184, 185, 163, 184, 185, 184, 185, 184, 185, - /* 990 */ 184, 185, 163, 96, 97, 147, 163, 184, 185, 163, - /* 1000 */ 199, 163, 163, 205, 184, 185, 163, 60, 163, 141, - /* 1010 */ 163, 143, 163, 184, 185, 19, 163, 184, 185, 230, - /* 1020 */ 184, 185, 184, 185, 206, 207, 230, 184, 185, 184, - /* 1030 */ 185, 184, 185, 184, 185, 19, 163, 219, 231, 43, - /* 1040 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 1050 */ 54, 55, 56, 57, 163, 26, 163, 184, 185, 43, - /* 1060 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 1070 */ 54, 55, 56, 57, 163, 184, 185, 184, 185, 163, - /* 1080 */ 182, 163, 163, 163, 163, 163, 22, 163, 92, 93, - /* 1090 */ 94, 95, 96, 97, 98, 99, 100, 101, 102, 163, - /* 1100 */ 184, 185, 184, 185, 163, 184, 185, 163, 92, 93, - /* 1110 */ 94, 95, 96, 97, 98, 99, 100, 101, 102, 163, - /* 1120 */ 184, 185, 98, 59, 163, 184, 185, 205, 184, 185, - /* 1130 */ 23, 206, 207, 26, 163, 26, 107, 153, 154, 237, - /* 1140 */ 184, 185, 231, 147, 219, 184, 185, 249, 124, 127, - /* 1150 */ 128, 231, 254, 129, 163, 231, 177, 178, 262, 263, - /* 1160 */ 118, 132, 19, 19, 46, 223, 224, 31, 24, 23, - /* 1170 */ 106, 124, 26, 22, 272, 39, 129, 23, 109, 110, - /* 1180 */ 26, 163, 140, 19, 22, 234, 59, 43, 44, 45, - /* 1190 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - /* 1200 */ 56, 57, 231, 7, 8, 193, 59, 43, 44, 45, - /* 1210 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - /* 1220 */ 56, 57, 104, 61, 23, 23, 23, 26, 26, 26, - /* 1230 */ 163, 23, 23, 106, 26, 26, 92, 93, 94, 95, - /* 1240 */ 96, 97, 98, 99, 100, 101, 102, 138, 105, 23, - /* 1250 */ 59, 23, 26, 106, 26, 163, 92, 93, 94, 95, - /* 1260 */ 96, 97, 98, 99, 100, 101, 102, 110, 23, 23, - /* 1270 */ 23, 26, 26, 26, 163, 163, 19, 120, 163, 163, - /* 1280 */ 163, 130, 163, 163, 163, 163, 163, 163, 163, 193, - /* 1290 */ 193, 163, 163, 163, 163, 225, 19, 106, 163, 222, - /* 1300 */ 163, 44, 45, 46, 47, 48, 49, 50, 51, 52, - /* 1310 */ 53, 54, 55, 56, 57, 163, 163, 203, 163, 163, - /* 1320 */ 222, 163, 45, 46, 47, 48, 49, 50, 51, 52, - /* 1330 */ 53, 54, 55, 56, 57, 163, 163, 163, 163, 163, - /* 1340 */ 251, 250, 209, 19, 20, 182, 22, 161, 222, 92, - /* 1350 */ 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - /* 1360 */ 36, 222, 222, 260, 226, 188, 256, 226, 187, 92, - /* 1370 */ 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - /* 1380 */ 210, 213, 213, 59, 213, 196, 192, 187, 256, 244, - /* 1390 */ 212, 187, 226, 19, 20, 71, 22, 210, 166, 60, - /* 1400 */ 130, 170, 260, 170, 38, 81, 257, 257, 170, 104, - /* 1410 */ 36, 22, 43, 201, 90, 236, 138, 235, 213, 18, - /* 1420 */ 96, 97, 48, 204, 204, 204, 204, 103, 170, 105, - /* 1430 */ 106, 107, 18, 59, 110, 169, 213, 213, 201, 170, - /* 1440 */ 201, 169, 236, 213, 146, 71, 235, 62, 253, 252, - /* 1450 */ 170, 127, 128, 169, 22, 170, 82, 189, 169, 104, - /* 1460 */ 170, 87, 169, 189, 90, 141, 142, 143, 144, 145, - /* 1470 */ 96, 97, 186, 186, 186, 64, 194, 103, 186, 105, - /* 1480 */ 106, 107, 115, 189, 110, 188, 186, 186, 19, 20, - /* 1490 */ 194, 22, 186, 189, 102, 246, 246, 189, 133, 228, - /* 1500 */ 104, 228, 227, 227, 170, 36, 134, 228, 227, 19, - /* 1510 */ 20, 228, 22, 84, 271, 141, 142, 143, 144, 145, - /* 1520 */ 0, 1, 2, 216, 22, 5, 36, 137, 59, 227, - /* 1530 */ 10, 11, 12, 13, 14, 217, 269, 17, 216, 22, - /* 1540 */ 71, 170, 243, 146, 241, 217, 136, 215, 135, 59, - /* 1550 */ 30, 82, 32, 25, 214, 213, 87, 173, 26, 90, - /* 1560 */ 40, 71, 13, 172, 164, 96, 97, 164, 6, 162, - /* 1570 */ 162, 162, 103, 263, 105, 106, 107, 266, 266, 110, - /* 1580 */ 90, 176, 176, 190, 182, 190, 96, 97, 98, 4, - /* 1590 */ 70, 176, 3, 103, 182, 105, 106, 107, 78, 182, - /* 1600 */ 110, 81, 182, 182, 182, 182, 182, 151, 88, 22, - /* 1610 */ 141, 142, 143, 144, 145, 15, 89, 16, 23, 23, - /* 1620 */ 128, 19, 20, 139, 22, 119, 131, 24, 20, 133, - /* 1630 */ 16, 141, 142, 143, 144, 145, 1, 140, 36, 131, - /* 1640 */ 119, 61, 122, 37, 139, 53, 53, 127, 128, 119, - /* 1650 */ 53, 53, 105, 34, 130, 1, 5, 104, 22, 149, - /* 1660 */ 26, 59, 68, 75, 41, 130, 24, 68, 104, 20, - /* 1670 */ 150, 19, 120, 71, 114, 22, 67, 22, 22, 67, - /* 1680 */ 23, 22, 22, 67, 82, 37, 28, 23, 138, 87, - /* 1690 */ 22, 153, 90, 23, 23, 26, 23, 22, 96, 97, - /* 1700 */ 24, 23, 22, 24, 130, 103, 23, 105, 106, 107, - /* 1710 */ 1, 2, 110, 23, 5, 105, 34, 22, 132, 10, - /* 1720 */ 11, 12, 13, 14, 26, 34, 17, 34, 85, 83, - /* 1730 */ 44, 19, 20, 23, 22, 24, 75, 34, 23, 30, - /* 1740 */ 26, 32, 26, 141, 142, 143, 144, 145, 36, 40, - /* 1750 */ 23, 23, 23, 23, 11, 23, 22, 26, 22, 22, - /* 1760 */ 22, 19, 20, 23, 22, 26, 15, 23, 22, 124, - /* 1770 */ 130, 59, 23, 1, 130, 277, 277, 130, 36, 70, - /* 1780 */ 130, 277, 277, 71, 277, 277, 277, 78, 277, 277, - /* 1790 */ 81, 277, 277, 277, 277, 277, 277, 88, 277, 277, - /* 1800 */ 277, 59, 90, 277, 277, 277, 277, 277, 96, 97, - /* 1810 */ 277, 277, 277, 71, 277, 103, 277, 105, 106, 107, - /* 1820 */ 277, 277, 110, 277, 277, 277, 277, 277, 277, 277, - /* 1830 */ 277, 122, 90, 277, 277, 277, 127, 128, 96, 97, - /* 1840 */ 277, 277, 277, 277, 277, 103, 277, 105, 106, 107, - /* 1850 */ 277, 277, 110, 141, 142, 143, 144, 145, 277, 150, - /* 1860 */ 277, 277, 277, 5, 277, 277, 277, 277, 10, 11, - /* 1870 */ 12, 13, 14, 277, 277, 17, 277, 277, 277, 277, - /* 1880 */ 277, 277, 277, 141, 142, 143, 144, 145, 30, 277, - /* 1890 */ 32, 277, 277, 277, 277, 277, 277, 277, 40, 277, - /* 1900 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 1910 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 1920 */ 277, 277, 277, 277, 277, 277, 277, 277, 70, 277, - /* 1930 */ 277, 277, 277, 277, 277, 277, 78, 277, 277, 81, - /* 1940 */ 277, 277, 277, 277, 277, 277, 88, 277, 277, 277, - /* 1950 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 1960 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 1970 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 1980 */ 122, 277, 277, 277, 277, 127, 128, 277, 277, 277, - /* 1990 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - /* 2000 */ 277, 277, 277, 277, 277, 277, 277, 277, 150, 277, - /* 2010 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, + /* 0 */ 184, 184, 259, 260, 261, 259, 260, 261, 176, 177, + /* 10 */ 178, 179, 180, 181, 184, 208, 212, 213, 186, 19, + /* 20 */ 188, 205, 206, 280, 205, 221, 22, 195, 24, 195, + /* 30 */ 208, 31, 195, 205, 29, 205, 206, 255, 33, 39, + /* 40 */ 200, 201, 202, 43, 44, 45, 46, 47, 48, 49, + /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 205, 227, + /* 60 */ 228, 227, 228, 59, 227, 228, 259, 260, 261, 252, + /* 70 */ 65, 241, 240, 184, 240, 223, 224, 240, 244, 245, + /* 80 */ 250, 259, 260, 261, 19, 253, 54, 55, 56, 57, + /* 90 */ 58, 184, 255, 184, 205, 206, 96, 97, 98, 99, + /* 100 */ 100, 101, 102, 103, 104, 105, 106, 46, 47, 48, + /* 110 */ 49, 46, 296, 297, 110, 283, 19, 96, 97, 98, + /* 120 */ 99, 100, 101, 102, 103, 104, 105, 106, 96, 97, + /* 130 */ 98, 99, 100, 101, 102, 103, 104, 105, 106, 94, + /* 140 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 150 */ 53, 54, 55, 56, 57, 110, 106, 73, 251, 114, + /* 160 */ 73, 178, 179, 180, 181, 59, 184, 292, 81, 186, + /* 170 */ 295, 188, 218, 108, 19, 114, 184, 11, 195, 184, + /* 180 */ 83, 184, 85, 54, 55, 56, 57, 205, 206, 124, + /* 190 */ 145, 146, 147, 96, 97, 98, 99, 100, 101, 102, + /* 200 */ 103, 104, 105, 106, 120, 121, 122, 120, 102, 81, + /* 210 */ 227, 228, 220, 19, 16, 109, 110, 111, 131, 132, + /* 220 */ 26, 184, 184, 240, 229, 96, 97, 98, 99, 100, + /* 230 */ 101, 102, 103, 104, 105, 106, 253, 43, 44, 45, + /* 240 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + /* 250 */ 56, 57, 100, 101, 102, 103, 104, 105, 106, 131, + /* 260 */ 132, 106, 127, 69, 129, 130, 283, 112, 113, 114, + /* 270 */ 115, 116, 117, 118, 81, 77, 76, 79, 296, 124, + /* 280 */ 298, 203, 184, 19, 84, 59, 86, 121, 122, 89, + /* 290 */ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + /* 300 */ 106, 184, 35, 205, 206, 22, 113, 43, 44, 45, + /* 310 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + /* 320 */ 56, 57, 205, 206, 131, 132, 100, 101, 291, 292, + /* 330 */ 114, 67, 295, 66, 108, 109, 110, 111, 138, 113, + /* 340 */ 124, 74, 59, 179, 184, 181, 184, 121, 22, 271, + /* 350 */ 186, 19, 188, 184, 276, 59, 24, 184, 241, 195, + /* 360 */ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + /* 370 */ 106, 145, 59, 147, 184, 43, 44, 45, 46, 47, + /* 380 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 390 */ 123, 227, 228, 110, 296, 297, 22, 23, 184, 102, + /* 400 */ 103, 104, 105, 106, 240, 109, 110, 111, 112, 195, + /* 410 */ 204, 115, 116, 117, 22, 184, 226, 253, 212, 205, + /* 420 */ 206, 125, 109, 110, 111, 22, 100, 101, 96, 97, + /* 430 */ 98, 99, 100, 101, 102, 103, 104, 105, 106, 184, + /* 440 */ 59, 227, 228, 121, 122, 59, 277, 283, 19, 289, + /* 450 */ 290, 59, 23, 76, 240, 241, 143, 76, 72, 189, + /* 460 */ 205, 206, 59, 86, 250, 84, 89, 86, 203, 95, + /* 470 */ 89, 281, 43, 44, 45, 46, 47, 48, 49, 50, + /* 480 */ 51, 52, 53, 54, 55, 56, 57, 227, 228, 184, + /* 490 */ 109, 110, 111, 12, 184, 109, 110, 111, 184, 184, + /* 500 */ 240, 109, 110, 111, 184, 195, 214, 59, 27, 184, + /* 510 */ 205, 206, 109, 110, 111, 205, 206, 184, 263, 138, + /* 520 */ 205, 206, 184, 42, 22, 96, 97, 98, 99, 100, + /* 530 */ 101, 102, 103, 104, 105, 106, 266, 227, 228, 59, + /* 540 */ 270, 276, 94, 66, 63, 19, 241, 22, 26, 23, + /* 550 */ 240, 241, 72, 59, 73, 250, 241, 109, 110, 82, + /* 560 */ 22, 59, 114, 223, 224, 250, 252, 59, 91, 43, + /* 570 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + /* 580 */ 54, 55, 56, 57, 59, 184, 26, 59, 268, 109, + /* 590 */ 110, 111, 184, 145, 146, 147, 112, 59, 203, 115, + /* 600 */ 116, 117, 277, 109, 110, 111, 205, 206, 195, 125, + /* 610 */ 277, 109, 110, 111, 100, 101, 139, 109, 110, 111, + /* 620 */ 219, 184, 96, 97, 98, 99, 100, 101, 102, 103, + /* 630 */ 104, 105, 106, 111, 109, 110, 111, 109, 110, 111, + /* 640 */ 227, 228, 19, 184, 136, 184, 23, 109, 110, 111, + /* 650 */ 200, 201, 202, 240, 259, 260, 261, 195, 136, 145, + /* 660 */ 184, 147, 184, 184, 136, 214, 43, 44, 45, 46, + /* 670 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 680 */ 57, 205, 206, 205, 206, 227, 228, 184, 229, 227, + /* 690 */ 228, 131, 132, 184, 59, 219, 184, 219, 240, 291, + /* 700 */ 292, 184, 240, 295, 105, 106, 22, 23, 205, 206, + /* 710 */ 26, 184, 251, 184, 205, 206, 184, 205, 206, 96, + /* 720 */ 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + /* 730 */ 251, 219, 205, 206, 205, 206, 184, 205, 206, 19, + /* 740 */ 184, 16, 184, 23, 241, 110, 219, 21, 219, 184, + /* 750 */ 241, 219, 286, 287, 195, 184, 195, 205, 206, 201, + /* 760 */ 202, 205, 206, 43, 44, 45, 46, 47, 48, 49, + /* 770 */ 50, 51, 52, 53, 54, 55, 56, 57, 184, 95, + /* 780 */ 22, 23, 184, 26, 26, 220, 227, 228, 227, 228, + /* 790 */ 196, 184, 23, 241, 26, 26, 195, 241, 184, 240, + /* 800 */ 12, 240, 77, 26, 79, 195, 80, 290, 201, 202, + /* 810 */ 216, 184, 218, 195, 184, 27, 96, 97, 98, 99, + /* 820 */ 100, 101, 102, 103, 104, 105, 106, 269, 227, 228, + /* 830 */ 42, 184, 205, 206, 184, 184, 19, 227, 228, 192, + /* 840 */ 23, 240, 116, 196, 76, 227, 228, 120, 121, 122, + /* 850 */ 240, 63, 254, 95, 86, 205, 206, 89, 240, 184, + /* 860 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 870 */ 53, 54, 55, 56, 57, 184, 269, 184, 153, 153, + /* 880 */ 111, 184, 7, 8, 9, 184, 138, 184, 184, 196, + /* 890 */ 184, 120, 121, 122, 184, 138, 205, 206, 184, 102, + /* 900 */ 184, 184, 205, 206, 156, 136, 205, 206, 205, 206, + /* 910 */ 198, 199, 135, 96, 97, 98, 99, 100, 101, 102, + /* 920 */ 103, 104, 105, 106, 184, 128, 184, 184, 184, 254, + /* 930 */ 133, 184, 237, 19, 239, 229, 226, 23, 292, 184, + /* 940 */ 226, 295, 226, 226, 184, 205, 206, 205, 206, 205, + /* 950 */ 206, 184, 292, 19, 184, 295, 252, 43, 44, 45, + /* 960 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + /* 970 */ 56, 57, 205, 206, 184, 205, 206, 43, 44, 45, + /* 980 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + /* 990 */ 56, 57, 157, 158, 26, 205, 206, 254, 26, 252, + /* 1000 */ 184, 15, 184, 184, 184, 292, 184, 252, 295, 24, + /* 1010 */ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + /* 1020 */ 106, 205, 206, 205, 206, 205, 206, 205, 206, 184, + /* 1030 */ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + /* 1040 */ 106, 184, 184, 184, 59, 184, 60, 184, 229, 184, + /* 1050 */ 205, 206, 184, 258, 184, 19, 184, 19, 184, 246, + /* 1060 */ 184, 258, 205, 206, 205, 206, 205, 206, 205, 206, + /* 1070 */ 205, 206, 184, 205, 206, 205, 206, 205, 206, 205, + /* 1080 */ 206, 205, 206, 292, 226, 151, 295, 184, 228, 294, + /* 1090 */ 184, 119, 184, 205, 206, 110, 150, 294, 152, 184, + /* 1100 */ 240, 184, 22, 23, 23, 19, 184, 26, 205, 206, + /* 1110 */ 142, 205, 206, 205, 206, 184, 198, 199, 131, 132, + /* 1120 */ 205, 206, 205, 206, 22, 19, 24, 205, 206, 43, + /* 1130 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + /* 1140 */ 54, 55, 56, 57, 184, 109, 184, 109, 184, 43, + /* 1150 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + /* 1160 */ 54, 55, 56, 57, 46, 205, 206, 205, 206, 205, + /* 1170 */ 206, 232, 184, 184, 184, 95, 184, 284, 285, 244, + /* 1180 */ 245, 242, 96, 97, 98, 99, 100, 101, 102, 103, + /* 1190 */ 104, 105, 106, 205, 206, 205, 206, 205, 206, 184, + /* 1200 */ 22, 184, 96, 97, 98, 99, 100, 101, 102, 103, + /* 1210 */ 104, 105, 106, 184, 24, 23, 184, 184, 26, 184, + /* 1220 */ 205, 206, 205, 206, 184, 31, 108, 128, 22, 122, + /* 1230 */ 184, 53, 133, 39, 205, 206, 22, 151, 205, 206, + /* 1240 */ 205, 206, 113, 114, 23, 205, 206, 26, 59, 23, + /* 1250 */ 23, 144, 26, 26, 184, 23, 23, 19, 26, 26, + /* 1260 */ 7, 8, 24, 23, 214, 23, 26, 61, 26, 59, + /* 1270 */ 23, 23, 23, 26, 26, 26, 145, 19, 147, 59, + /* 1280 */ 184, 43, 44, 45, 46, 47, 48, 49, 50, 51, + /* 1290 */ 52, 53, 54, 55, 56, 57, 145, 23, 147, 110, + /* 1300 */ 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, + /* 1310 */ 52, 53, 54, 55, 56, 57, 23, 184, 184, 26, + /* 1320 */ 110, 184, 184, 184, 134, 184, 184, 184, 184, 184, + /* 1330 */ 110, 184, 184, 184, 96, 97, 98, 99, 100, 101, + /* 1340 */ 102, 103, 104, 105, 106, 184, 184, 184, 134, 300, + /* 1350 */ 184, 243, 184, 184, 96, 97, 98, 99, 100, 101, + /* 1360 */ 102, 103, 104, 105, 106, 184, 184, 184, 184, 184, + /* 1370 */ 224, 184, 282, 273, 19, 272, 203, 182, 243, 243, + /* 1380 */ 230, 209, 278, 243, 231, 208, 265, 278, 234, 234, + /* 1390 */ 234, 217, 213, 60, 19, 243, 208, 237, 233, 44, + /* 1400 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + /* 1410 */ 55, 56, 57, 208, 247, 187, 134, 247, 247, 38, + /* 1420 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + /* 1430 */ 55, 56, 57, 237, 231, 191, 191, 279, 279, 282, + /* 1440 */ 143, 191, 108, 268, 22, 19, 20, 256, 22, 43, + /* 1450 */ 257, 96, 97, 98, 99, 100, 101, 102, 103, 104, + /* 1460 */ 105, 106, 36, 222, 142, 234, 18, 191, 225, 18, + /* 1470 */ 190, 96, 97, 98, 99, 100, 101, 102, 103, 104, + /* 1480 */ 105, 106, 225, 191, 225, 59, 225, 257, 234, 234, + /* 1490 */ 256, 222, 222, 190, 234, 150, 62, 71, 275, 274, + /* 1500 */ 191, 19, 20, 190, 22, 22, 210, 81, 191, 190, + /* 1510 */ 210, 191, 108, 190, 207, 207, 64, 207, 36, 215, + /* 1520 */ 94, 210, 207, 209, 119, 207, 100, 101, 207, 106, + /* 1530 */ 48, 215, 207, 107, 210, 109, 110, 111, 267, 267, + /* 1540 */ 114, 59, 210, 249, 137, 108, 248, 191, 249, 248, + /* 1550 */ 88, 249, 141, 71, 248, 299, 138, 131, 132, 22, + /* 1560 */ 191, 249, 299, 237, 82, 238, 150, 262, 140, 87, + /* 1570 */ 139, 145, 146, 147, 148, 149, 94, 248, 238, 236, + /* 1580 */ 25, 235, 100, 101, 234, 194, 26, 193, 13, 107, + /* 1590 */ 6, 109, 110, 111, 264, 185, 114, 185, 183, 197, + /* 1600 */ 183, 203, 183, 203, 203, 197, 203, 211, 211, 4, + /* 1610 */ 197, 3, 203, 22, 155, 15, 288, 203, 93, 288, + /* 1620 */ 285, 23, 16, 203, 203, 23, 132, 145, 146, 147, + /* 1630 */ 148, 149, 0, 1, 2, 143, 123, 5, 24, 135, + /* 1640 */ 20, 16, 10, 11, 12, 13, 14, 137, 1, 17, + /* 1650 */ 135, 144, 19, 20, 123, 22, 61, 143, 37, 123, + /* 1660 */ 53, 109, 30, 53, 32, 53, 53, 134, 34, 36, + /* 1670 */ 1, 5, 40, 22, 108, 153, 26, 68, 75, 68, + /* 1680 */ 41, 134, 108, 24, 20, 124, 19, 118, 23, 67, + /* 1690 */ 22, 67, 59, 22, 22, 22, 22, 67, 28, 37, + /* 1700 */ 23, 142, 70, 22, 71, 23, 157, 23, 23, 26, + /* 1710 */ 78, 23, 22, 81, 23, 82, 24, 22, 24, 134, + /* 1720 */ 87, 23, 19, 20, 92, 22, 109, 94, 23, 22, + /* 1730 */ 34, 34, 136, 100, 101, 26, 34, 85, 34, 36, + /* 1740 */ 107, 83, 109, 110, 111, 34, 90, 114, 34, 23, + /* 1750 */ 75, 75, 44, 22, 24, 26, 34, 23, 126, 26, + /* 1760 */ 23, 23, 59, 131, 132, 23, 23, 26, 23, 22, + /* 1770 */ 11, 22, 22, 22, 71, 23, 23, 22, 145, 146, + /* 1780 */ 147, 148, 149, 26, 23, 82, 154, 134, 128, 134, + /* 1790 */ 87, 134, 15, 1, 301, 134, 301, 94, 301, 301, + /* 1800 */ 301, 301, 301, 100, 101, 301, 301, 301, 301, 301, + /* 1810 */ 107, 301, 109, 110, 111, 1, 2, 114, 301, 5, + /* 1820 */ 301, 301, 301, 301, 10, 11, 12, 13, 14, 301, + /* 1830 */ 301, 17, 301, 301, 301, 301, 19, 20, 301, 22, + /* 1840 */ 301, 301, 301, 301, 30, 301, 32, 301, 145, 146, + /* 1850 */ 147, 148, 149, 36, 40, 301, 301, 301, 301, 301, + /* 1860 */ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + /* 1870 */ 301, 301, 301, 301, 301, 301, 59, 301, 301, 301, + /* 1880 */ 301, 301, 301, 301, 70, 301, 301, 301, 71, 301, + /* 1890 */ 301, 301, 78, 301, 301, 81, 19, 20, 301, 22, + /* 1900 */ 301, 301, 301, 301, 301, 301, 92, 301, 301, 301, + /* 1910 */ 301, 94, 301, 36, 301, 301, 301, 100, 101, 102, + /* 1920 */ 301, 301, 301, 301, 107, 301, 109, 110, 111, 301, + /* 1930 */ 301, 114, 301, 301, 301, 301, 59, 301, 301, 301, + /* 1940 */ 126, 301, 301, 301, 301, 131, 132, 301, 71, 301, + /* 1950 */ 301, 301, 301, 301, 301, 301, 19, 20, 301, 22, + /* 1960 */ 301, 301, 145, 146, 147, 148, 149, 301, 154, 301, + /* 1970 */ 301, 94, 301, 36, 301, 301, 301, 100, 101, 301, + /* 1980 */ 301, 301, 301, 301, 107, 301, 109, 110, 111, 301, + /* 1990 */ 301, 114, 5, 301, 301, 301, 59, 10, 11, 12, + /* 2000 */ 13, 14, 301, 301, 17, 301, 301, 301, 71, 301, + /* 2010 */ 301, 301, 301, 301, 301, 301, 301, 30, 301, 32, + /* 2020 */ 301, 301, 145, 146, 147, 148, 149, 40, 301, 301, + /* 2030 */ 301, 94, 301, 301, 301, 301, 301, 100, 101, 301, + /* 2040 */ 301, 301, 301, 301, 107, 301, 109, 110, 111, 301, + /* 2050 */ 301, 114, 301, 301, 301, 301, 301, 70, 301, 301, + /* 2060 */ 301, 301, 301, 301, 301, 78, 301, 301, 81, 301, + /* 2070 */ 301, 301, 301, 301, 301, 301, 301, 301, 301, 92, + /* 2080 */ 301, 301, 145, 146, 147, 148, 149, 301, 301, 301, + /* 2090 */ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + /* 2100 */ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + /* 2110 */ 301, 301, 301, 126, 301, 301, 301, 301, 131, 132, + /* 2120 */ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + /* 2130 */ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + /* 2140 */ 301, 154, 301, 301, 301, 301, 301, 301, 301, 301, + /* 2150 */ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + /* 2160 */ 301, 301, 301, 301, 301, 301, 301, 301, 301, }; -#define YY_SHIFT_COUNT (520) +#define YY_SHIFT_COUNT (540) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (1858) +#define YY_SHIFT_MAX (1987) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 1709, 1520, 1858, 1324, 1324, 277, 1374, 1469, 1602, 1712, - /* 10 */ 1712, 1712, 273, 0, 0, 113, 1016, 1712, 1712, 1712, - /* 20 */ 1712, 1712, 1712, 1712, 1712, 1712, 1712, 11, 11, 236, - /* 30 */ 184, 277, 277, 277, 277, 277, 277, 93, 177, 270, - /* 40 */ 363, 456, 549, 642, 735, 828, 848, 996, 1144, 1016, - /* 50 */ 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, - /* 60 */ 1016, 1016, 1016, 1016, 1016, 1016, 1164, 1016, 1257, 1277, - /* 70 */ 1277, 1490, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - /* 80 */ 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - /* 90 */ 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - /* 100 */ 1712, 1712, 1712, 1742, 1712, 1712, 1712, 1712, 1712, 1712, - /* 110 */ 1712, 1712, 1712, 1712, 1712, 1712, 1712, 143, 162, 162, - /* 120 */ 162, 162, 162, 204, 151, 416, 531, 648, 700, 531, - /* 130 */ 486, 486, 531, 353, 353, 353, 353, 409, 279, 53, - /* 140 */ 2009, 2009, 331, 331, 331, 329, 366, 329, 329, 597, - /* 150 */ 597, 464, 474, 262, 681, 531, 531, 531, 531, 531, - /* 160 */ 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, - /* 170 */ 531, 531, 531, 531, 531, 531, 531, 173, 485, 984, - /* 180 */ 984, 576, 485, 19, 1022, 2009, 2009, 2009, 387, 250, - /* 190 */ 250, 525, 502, 278, 552, 227, 480, 566, 531, 531, - /* 200 */ 531, 531, 531, 531, 531, 531, 531, 531, 639, 531, - /* 210 */ 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, - /* 220 */ 531, 2, 2, 2, 531, 531, 531, 531, 782, 531, - /* 230 */ 531, 531, 744, 531, 531, 783, 531, 531, 531, 531, - /* 240 */ 531, 531, 531, 531, 419, 682, 327, 370, 370, 370, - /* 250 */ 370, 1029, 327, 327, 1024, 897, 856, 947, 1109, 706, - /* 260 */ 706, 1143, 1109, 1109, 1143, 842, 945, 1118, 1136, 1136, - /* 270 */ 1136, 706, 676, 400, 1047, 694, 1339, 1270, 1270, 1366, - /* 280 */ 1366, 1270, 1305, 1389, 1369, 1278, 1401, 1401, 1401, 1401, - /* 290 */ 1270, 1414, 1278, 1278, 1305, 1389, 1369, 1369, 1278, 1270, - /* 300 */ 1414, 1298, 1385, 1270, 1414, 1432, 1270, 1414, 1270, 1414, - /* 310 */ 1432, 1355, 1355, 1355, 1411, 1432, 1355, 1367, 1355, 1411, - /* 320 */ 1355, 1355, 1432, 1392, 1392, 1432, 1365, 1396, 1365, 1396, - /* 330 */ 1365, 1396, 1365, 1396, 1270, 1372, 1429, 1502, 1390, 1372, - /* 340 */ 1517, 1270, 1397, 1390, 1410, 1413, 1278, 1528, 1532, 1549, - /* 350 */ 1549, 1562, 1562, 1562, 2009, 2009, 2009, 2009, 2009, 2009, - /* 360 */ 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, - /* 370 */ 570, 345, 686, 748, 50, 740, 1064, 1107, 469, 537, - /* 380 */ 1042, 1146, 1162, 1154, 1201, 1202, 1203, 1208, 1209, 1127, - /* 390 */ 1069, 1196, 1157, 1147, 1226, 1228, 1245, 775, 868, 1246, - /* 400 */ 1247, 1191, 1151, 1585, 1589, 1587, 1456, 1600, 1527, 1601, - /* 410 */ 1595, 1596, 1492, 1484, 1506, 1603, 1495, 1608, 1496, 1614, - /* 420 */ 1635, 1508, 1497, 1521, 1580, 1606, 1505, 1592, 1593, 1597, - /* 430 */ 1598, 1530, 1547, 1619, 1524, 1654, 1651, 1636, 1553, 1510, - /* 440 */ 1594, 1634, 1599, 1588, 1623, 1535, 1564, 1642, 1649, 1652, - /* 450 */ 1552, 1560, 1653, 1609, 1655, 1656, 1657, 1659, 1612, 1658, - /* 460 */ 1660, 1616, 1648, 1664, 1550, 1668, 1538, 1670, 1671, 1669, - /* 470 */ 1673, 1675, 1676, 1678, 1680, 1679, 1574, 1683, 1690, 1610, - /* 480 */ 1682, 1695, 1586, 1698, 1691, 1698, 1693, 1643, 1661, 1646, - /* 490 */ 1686, 1710, 1711, 1714, 1716, 1703, 1715, 1698, 1727, 1728, - /* 500 */ 1729, 1730, 1731, 1732, 1734, 1743, 1736, 1737, 1740, 1744, - /* 510 */ 1738, 1746, 1739, 1645, 1640, 1644, 1647, 1650, 1749, 1751, - /* 520 */ 1772, + /* 0 */ 1814, 1632, 1987, 1426, 1426, 128, 1482, 1633, 1703, 1877, + /* 10 */ 1877, 1877, 87, 0, 0, 264, 1106, 1877, 1877, 1877, + /* 20 */ 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, + /* 30 */ 226, 226, 381, 381, 296, 193, 128, 128, 128, 128, + /* 40 */ 128, 128, 97, 194, 332, 429, 526, 623, 720, 817, + /* 50 */ 914, 934, 1086, 1238, 1106, 1106, 1106, 1106, 1106, 1106, + /* 60 */ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + /* 70 */ 1106, 1106, 1258, 1106, 1355, 1375, 1375, 1817, 1877, 1877, + /* 80 */ 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, + /* 90 */ 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, + /* 100 */ 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, + /* 110 */ 1937, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, + /* 120 */ 1877, 1877, 1877, 1877, 32, 129, 129, 129, 129, 129, + /* 130 */ 21, 152, 297, 494, 726, 65, 494, 514, 514, 494, + /* 140 */ 560, 560, 560, 560, 322, 599, 50, 2142, 2142, 155, + /* 150 */ 155, 155, 313, 392, 386, 392, 392, 481, 481, 200, + /* 160 */ 480, 684, 758, 494, 494, 494, 494, 494, 494, 494, + /* 170 */ 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, + /* 180 */ 494, 494, 494, 494, 768, 768, 494, 166, 377, 377, + /* 190 */ 635, 835, 835, 635, 748, 987, 2142, 2142, 2142, 448, + /* 200 */ 45, 45, 403, 484, 502, 106, 525, 508, 528, 538, + /* 210 */ 494, 494, 494, 494, 494, 494, 494, 494, 494, 84, + /* 220 */ 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, + /* 230 */ 494, 494, 267, 267, 267, 494, 494, 494, 494, 769, + /* 240 */ 494, 494, 494, 4, 477, 494, 494, 788, 494, 494, + /* 250 */ 494, 494, 494, 494, 494, 494, 727, 5, 135, 985, + /* 260 */ 985, 985, 985, 522, 135, 135, 797, 326, 875, 986, + /* 270 */ 968, 1036, 1036, 1038, 968, 968, 1038, 972, 1081, 1118, + /* 280 */ 1194, 1194, 1194, 1036, 757, 757, 946, 777, 1099, 1102, + /* 290 */ 1333, 1282, 1282, 1381, 1381, 1282, 1297, 1334, 1422, 1406, + /* 300 */ 1322, 1448, 1448, 1448, 1448, 1282, 1451, 1322, 1322, 1334, + /* 310 */ 1422, 1406, 1406, 1322, 1282, 1451, 1345, 1434, 1282, 1451, + /* 320 */ 1483, 1282, 1451, 1282, 1451, 1483, 1404, 1404, 1404, 1452, + /* 330 */ 1483, 1404, 1405, 1404, 1452, 1404, 1404, 1483, 1423, 1423, + /* 340 */ 1483, 1407, 1437, 1407, 1437, 1407, 1437, 1407, 1437, 1282, + /* 350 */ 1462, 1462, 1411, 1418, 1537, 1282, 1416, 1411, 1428, 1431, + /* 360 */ 1322, 1555, 1560, 1575, 1575, 1584, 1584, 1584, 2142, 2142, + /* 370 */ 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, + /* 380 */ 2142, 2142, 2142, 2142, 61, 725, 374, 1080, 198, 771, + /* 390 */ 283, 1192, 1178, 1190, 1107, 1221, 1206, 1226, 1227, 1232, + /* 400 */ 1233, 1240, 1242, 1189, 1129, 1253, 216, 1210, 1247, 1248, + /* 410 */ 1249, 1131, 1151, 1274, 1293, 1220, 1214, 1605, 1608, 1591, + /* 420 */ 1459, 1600, 1525, 1606, 1598, 1602, 1494, 1492, 1513, 1614, + /* 430 */ 1504, 1620, 1510, 1625, 1647, 1515, 1507, 1531, 1595, 1621, + /* 440 */ 1514, 1607, 1610, 1612, 1613, 1536, 1552, 1634, 1533, 1669, + /* 450 */ 1666, 1651, 1566, 1522, 1609, 1650, 1611, 1603, 1639, 1547, + /* 460 */ 1574, 1659, 1664, 1667, 1561, 1569, 1668, 1622, 1671, 1672, + /* 470 */ 1665, 1673, 1624, 1670, 1674, 1630, 1662, 1677, 1559, 1681, + /* 480 */ 1682, 1549, 1684, 1685, 1683, 1688, 1690, 1692, 1691, 1695, + /* 490 */ 1694, 1585, 1698, 1705, 1617, 1696, 1707, 1596, 1709, 1697, + /* 500 */ 1702, 1704, 1711, 1652, 1675, 1658, 1708, 1676, 1656, 1714, + /* 510 */ 1726, 1731, 1730, 1729, 1733, 1722, 1734, 1709, 1737, 1738, + /* 520 */ 1742, 1743, 1741, 1745, 1747, 1759, 1749, 1750, 1752, 1753, + /* 530 */ 1751, 1755, 1757, 1660, 1653, 1655, 1657, 1661, 1761, 1777, + /* 540 */ 1792, }; -#define YY_REDUCE_COUNT (369) -#define YY_REDUCE_MIN (-237) -#define YY_REDUCE_MAX (1424) +#define YY_REDUCE_COUNT (383) +#define YY_REDUCE_MIN (-257) +#define YY_REDUCE_MAX (1421) static const short yy_reduce_ofst[] = { - /* 0 */ -147, 171, 263, -96, 358, -144, -149, -102, 124, -156, - /* 10 */ -98, 305, 401, -57, 209, -237, 245, -94, -79, 189, - /* 20 */ 375, 490, 493, 378, 303, 539, 542, 501, 503, 554, - /* 30 */ 415, 526, 546, 557, 587, 593, 595, -234, -234, -234, - /* 40 */ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, - /* 50 */ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, - /* 60 */ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, - /* 70 */ -234, -50, 335, 470, 633, 656, 658, 660, 675, 685, - /* 80 */ 703, 727, 747, 750, 752, 754, 770, 788, 790, 793, - /* 90 */ 795, 797, 800, 802, 804, 806, 813, 820, 829, 833, - /* 100 */ 836, 838, 843, 845, 847, 849, 873, 891, 893, 916, - /* 110 */ 918, 921, 936, 941, 944, 956, 961, -234, -234, -234, - /* 120 */ -234, -234, -234, -234, -234, -234, 463, 607, -176, 14, - /* 130 */ -139, 87, -137, 818, 925, 818, 925, 898, -234, -234, - /* 140 */ -234, -234, -166, -166, -166, -130, -131, -82, -54, -180, - /* 150 */ 364, 41, 513, 509, 509, 117, 500, 789, 796, 646, - /* 160 */ 192, 291, 644, 798, 120, 807, 543, 911, 920, 652, - /* 170 */ 924, 922, 232, 698, 801, 971, 39, 220, 731, 442, - /* 180 */ 902, -199, 979, -43, 421, 896, 942, 605, -184, -126, - /* 190 */ 155, 172, 281, 304, 377, 538, 650, 690, 699, 723, - /* 200 */ 803, 839, 853, 919, 991, 1018, 1067, 1092, 951, 1111, - /* 210 */ 1112, 1115, 1116, 1117, 1119, 1120, 1121, 1122, 1123, 1124, - /* 220 */ 1125, 1012, 1096, 1097, 1128, 1129, 1130, 1131, 1070, 1135, - /* 230 */ 1137, 1152, 1077, 1153, 1155, 1114, 1156, 304, 1158, 1172, - /* 240 */ 1173, 1174, 1175, 1176, 1089, 1091, 1133, 1098, 1126, 1139, - /* 250 */ 1140, 1070, 1133, 1133, 1170, 1163, 1186, 1103, 1168, 1138, - /* 260 */ 1141, 1110, 1169, 1171, 1132, 1177, 1189, 1194, 1181, 1200, - /* 270 */ 1204, 1166, 1145, 1178, 1187, 1232, 1142, 1231, 1233, 1149, - /* 280 */ 1150, 1238, 1179, 1182, 1212, 1205, 1219, 1220, 1221, 1222, - /* 290 */ 1258, 1266, 1223, 1224, 1206, 1211, 1237, 1239, 1230, 1269, - /* 300 */ 1272, 1195, 1197, 1280, 1284, 1268, 1285, 1289, 1290, 1293, - /* 310 */ 1274, 1286, 1287, 1288, 1282, 1294, 1292, 1297, 1300, 1296, - /* 320 */ 1301, 1306, 1304, 1249, 1250, 1308, 1271, 1275, 1273, 1276, - /* 330 */ 1279, 1281, 1283, 1302, 1334, 1307, 1243, 1267, 1318, 1322, - /* 340 */ 1303, 1371, 1299, 1328, 1332, 1340, 1342, 1384, 1391, 1400, - /* 350 */ 1403, 1407, 1408, 1409, 1311, 1312, 1310, 1405, 1402, 1412, - /* 360 */ 1417, 1420, 1406, 1393, 1395, 1421, 1422, 1423, 1424, 1415, + /* 0 */ -168, -17, 164, 214, 310, -166, -184, -18, 98, -170, + /* 10 */ 305, 315, -163, -193, -178, -257, 395, 401, 476, 478, + /* 20 */ 512, 117, 527, 529, 503, 509, 532, 255, 552, 556, + /* 30 */ 558, 607, 37, 408, 594, 413, 462, 559, 561, 601, + /* 40 */ 610, 618, -254, -254, -254, -254, -254, -254, -254, -254, + /* 50 */ -254, -254, -254, -254, -254, -254, -254, -254, -254, -254, + /* 60 */ -254, -254, -254, -254, -254, -254, -254, -254, -254, -254, + /* 70 */ -254, -254, -254, -254, -254, -254, -254, -111, 627, 650, + /* 80 */ 691, 697, 701, 703, 740, 742, 744, 767, 770, 790, + /* 90 */ 816, 818, 820, 822, 845, 857, 859, 861, 863, 865, + /* 100 */ 868, 870, 872, 874, 876, 888, 903, 906, 908, 915, + /* 110 */ 917, 922, 960, 962, 964, 988, 990, 992, 1015, 1017, + /* 120 */ 1029, 1033, 1035, 1040, -254, -254, -254, -254, -254, -254, + /* 130 */ -254, -254, -254, 190, 270, -196, 160, -160, 450, 647, + /* 140 */ 260, 458, 260, 458, 78, -254, -254, -254, -254, 206, + /* 150 */ 206, 206, 320, 598, -5, 675, 743, -148, 340, -125, + /* 160 */ 459, 466, 466, 693, -93, 461, 479, 706, 710, 714, + /* 170 */ 716, 717, 169, -183, 325, 314, 704, 333, 747, 858, + /* 180 */ -8, 819, 565, 755, 646, 660, 517, 265, 713, 791, + /* 190 */ 712, 795, 803, 918, 695, 860, 893, 935, 939, -181, + /* 200 */ -172, -147, -91, -46, -3, 162, 173, 231, 338, 437, + /* 210 */ 571, 614, 630, 651, 760, 931, 989, 1032, 1046, -218, + /* 220 */ 38, 1070, 1096, 1133, 1134, 1137, 1138, 1139, 1141, 1142, + /* 230 */ 1143, 1144, 292, 451, 1050, 1145, 1147, 1148, 1149, 813, + /* 240 */ 1161, 1162, 1163, 1108, 1049, 1166, 1168, 1146, 1169, 162, + /* 250 */ 1181, 1182, 1183, 1184, 1185, 1187, 1100, 1103, 1150, 1135, + /* 260 */ 1136, 1140, 1152, 813, 1150, 1150, 1153, 1173, 1195, 1090, + /* 270 */ 1154, 1167, 1170, 1104, 1155, 1156, 1109, 1172, 1174, 1179, + /* 280 */ 1177, 1188, 1205, 1171, 1160, 1196, 1121, 1165, 1203, 1228, + /* 290 */ 1157, 1244, 1245, 1158, 1159, 1250, 1175, 1193, 1191, 1241, + /* 300 */ 1231, 1243, 1257, 1259, 1261, 1276, 1280, 1254, 1255, 1230, + /* 310 */ 1234, 1269, 1270, 1260, 1292, 1303, 1223, 1225, 1309, 1313, + /* 320 */ 1296, 1317, 1319, 1320, 1323, 1300, 1307, 1308, 1310, 1304, + /* 330 */ 1311, 1315, 1314, 1318, 1316, 1321, 1325, 1324, 1271, 1272, + /* 340 */ 1332, 1294, 1298, 1299, 1301, 1302, 1306, 1312, 1329, 1356, + /* 350 */ 1256, 1263, 1327, 1326, 1305, 1369, 1330, 1340, 1343, 1346, + /* 360 */ 1350, 1391, 1394, 1410, 1412, 1415, 1417, 1419, 1328, 1331, + /* 370 */ 1335, 1402, 1398, 1400, 1401, 1403, 1408, 1396, 1397, 1409, + /* 380 */ 1414, 1420, 1421, 1413, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1492, 1492, 1492, 1340, 1123, 1229, 1123, 1123, 1123, 1340, - /* 10 */ 1340, 1340, 1123, 1259, 1259, 1391, 1154, 1123, 1123, 1123, - /* 20 */ 1123, 1123, 1123, 1123, 1339, 1123, 1123, 1123, 1123, 1123, - /* 30 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1265, 1123, - /* 40 */ 1123, 1123, 1123, 1123, 1341, 1342, 1123, 1123, 1123, 1390, - /* 50 */ 1392, 1275, 1274, 1273, 1272, 1373, 1246, 1270, 1263, 1267, - /* 60 */ 1335, 1336, 1334, 1338, 1342, 1341, 1123, 1266, 1306, 1320, - /* 70 */ 1305, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 80 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 90 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 100 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 110 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1314, 1319, 1325, - /* 120 */ 1318, 1315, 1308, 1307, 1309, 1310, 1123, 1144, 1193, 1123, - /* 130 */ 1123, 1123, 1123, 1409, 1408, 1123, 1123, 1154, 1311, 1312, - /* 140 */ 1322, 1321, 1398, 1448, 1447, 1123, 1123, 1123, 1123, 1123, - /* 150 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 160 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 170 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1154, 1150, 1300, - /* 180 */ 1299, 1418, 1150, 1253, 1123, 1404, 1229, 1220, 1123, 1123, - /* 190 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 200 */ 1123, 1395, 1393, 1123, 1355, 1123, 1123, 1123, 1123, 1123, - /* 210 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 220 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 230 */ 1123, 1123, 1225, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 240 */ 1123, 1123, 1123, 1442, 1123, 1368, 1207, 1225, 1225, 1225, - /* 250 */ 1225, 1227, 1208, 1206, 1219, 1154, 1130, 1484, 1269, 1248, - /* 260 */ 1248, 1481, 1269, 1269, 1481, 1168, 1462, 1165, 1259, 1259, - /* 270 */ 1259, 1248, 1337, 1226, 1219, 1123, 1484, 1234, 1234, 1483, - /* 280 */ 1483, 1234, 1278, 1284, 1196, 1269, 1202, 1202, 1202, 1202, - /* 290 */ 1234, 1141, 1269, 1269, 1278, 1284, 1196, 1196, 1269, 1234, - /* 300 */ 1141, 1372, 1478, 1234, 1141, 1348, 1234, 1141, 1234, 1141, - /* 310 */ 1348, 1194, 1194, 1194, 1183, 1348, 1194, 1168, 1194, 1183, - /* 320 */ 1194, 1194, 1348, 1352, 1352, 1348, 1252, 1247, 1252, 1247, - /* 330 */ 1252, 1247, 1252, 1247, 1234, 1253, 1417, 1123, 1264, 1253, - /* 340 */ 1343, 1234, 1123, 1264, 1262, 1260, 1269, 1147, 1186, 1445, - /* 350 */ 1445, 1441, 1441, 1441, 1489, 1489, 1404, 1457, 1154, 1154, - /* 360 */ 1154, 1154, 1457, 1170, 1170, 1154, 1154, 1154, 1154, 1457, - /* 370 */ 1123, 1123, 1123, 1123, 1123, 1123, 1452, 1123, 1357, 1238, - /* 380 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 390 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 400 */ 1123, 1123, 1289, 1123, 1126, 1401, 1123, 1123, 1399, 1123, - /* 410 */ 1123, 1123, 1123, 1123, 1123, 1239, 1123, 1123, 1123, 1123, - /* 420 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 430 */ 1123, 1123, 1123, 1123, 1480, 1123, 1123, 1123, 1123, 1123, - /* 440 */ 1123, 1371, 1370, 1123, 1123, 1236, 1123, 1123, 1123, 1123, - /* 450 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 460 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 470 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 480 */ 1123, 1123, 1123, 1261, 1123, 1416, 1123, 1123, 1123, 1123, - /* 490 */ 1123, 1123, 1123, 1430, 1254, 1123, 1123, 1471, 1123, 1123, - /* 500 */ 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, - /* 510 */ 1123, 1123, 1466, 1210, 1291, 1123, 1290, 1294, 1123, 1135, - /* 520 */ 1123, + /* 0 */ 1536, 1536, 1536, 1376, 1159, 1265, 1159, 1159, 1159, 1376, + /* 10 */ 1376, 1376, 1159, 1295, 1295, 1429, 1190, 1159, 1159, 1159, + /* 20 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1375, 1159, 1159, + /* 30 */ 1159, 1159, 1459, 1459, 1159, 1159, 1159, 1159, 1159, 1159, + /* 40 */ 1159, 1159, 1159, 1301, 1159, 1159, 1159, 1159, 1159, 1377, + /* 50 */ 1378, 1159, 1159, 1159, 1428, 1430, 1393, 1311, 1310, 1309, + /* 60 */ 1308, 1411, 1282, 1306, 1299, 1303, 1371, 1372, 1370, 1374, + /* 70 */ 1378, 1377, 1159, 1302, 1342, 1356, 1341, 1159, 1159, 1159, + /* 80 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 90 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 100 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 110 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 120 */ 1159, 1159, 1159, 1159, 1350, 1355, 1361, 1354, 1351, 1344, + /* 130 */ 1343, 1345, 1346, 1159, 1180, 1229, 1159, 1159, 1159, 1159, + /* 140 */ 1447, 1446, 1159, 1159, 1190, 1347, 1348, 1358, 1357, 1436, + /* 150 */ 1492, 1491, 1394, 1159, 1159, 1159, 1159, 1159, 1159, 1459, + /* 160 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 170 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 180 */ 1159, 1159, 1159, 1159, 1459, 1459, 1159, 1190, 1459, 1459, + /* 190 */ 1186, 1336, 1335, 1186, 1289, 1159, 1442, 1265, 1256, 1159, + /* 200 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 210 */ 1159, 1159, 1159, 1433, 1431, 1159, 1159, 1159, 1159, 1159, + /* 220 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 230 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 240 */ 1159, 1159, 1159, 1261, 1159, 1159, 1159, 1159, 1159, 1159, + /* 250 */ 1159, 1159, 1159, 1159, 1159, 1486, 1159, 1406, 1243, 1261, + /* 260 */ 1261, 1261, 1261, 1263, 1244, 1242, 1255, 1190, 1166, 1528, + /* 270 */ 1305, 1284, 1284, 1525, 1305, 1305, 1525, 1204, 1506, 1201, + /* 280 */ 1295, 1295, 1295, 1284, 1289, 1289, 1373, 1262, 1255, 1159, + /* 290 */ 1528, 1270, 1270, 1527, 1527, 1270, 1394, 1314, 1320, 1232, + /* 300 */ 1305, 1238, 1238, 1238, 1238, 1270, 1177, 1305, 1305, 1314, + /* 310 */ 1320, 1232, 1232, 1305, 1270, 1177, 1410, 1522, 1270, 1177, + /* 320 */ 1384, 1270, 1177, 1270, 1177, 1384, 1230, 1230, 1230, 1219, + /* 330 */ 1384, 1230, 1204, 1230, 1219, 1230, 1230, 1384, 1388, 1388, + /* 340 */ 1384, 1288, 1283, 1288, 1283, 1288, 1283, 1288, 1283, 1270, + /* 350 */ 1469, 1469, 1300, 1289, 1379, 1270, 1159, 1300, 1298, 1296, + /* 360 */ 1305, 1183, 1222, 1489, 1489, 1485, 1485, 1485, 1533, 1533, + /* 370 */ 1442, 1501, 1190, 1190, 1190, 1190, 1501, 1206, 1206, 1190, + /* 380 */ 1190, 1190, 1190, 1501, 1159, 1159, 1159, 1159, 1159, 1159, + /* 390 */ 1496, 1159, 1395, 1274, 1159, 1159, 1159, 1159, 1159, 1159, + /* 400 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 410 */ 1159, 1159, 1159, 1159, 1159, 1159, 1325, 1159, 1162, 1439, + /* 420 */ 1159, 1159, 1437, 1159, 1159, 1159, 1159, 1159, 1159, 1275, + /* 430 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 440 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1524, 1159, + /* 450 */ 1159, 1159, 1159, 1159, 1159, 1409, 1408, 1159, 1159, 1272, + /* 460 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 470 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 480 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 490 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1297, 1159, + /* 500 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 510 */ 1159, 1159, 1159, 1474, 1290, 1159, 1159, 1515, 1159, 1159, + /* 520 */ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + /* 530 */ 1159, 1159, 1510, 1246, 1327, 1159, 1326, 1330, 1159, 1171, + /* 540 */ 1159, }; /********** End of lemon-generated parsing tables *****************************/ @@ -147831,6 +149183,10 @@ static const YYCODETYPE yyFallback[] = { 59, /* PRECEDING => ID */ 59, /* RANGE => ID */ 59, /* UNBOUNDED => ID */ + 59, /* EXCLUDE => ID */ + 59, /* GROUPS => ID */ + 59, /* OTHERS => ID */ + 59, /* TIES => ID */ 59, /* REINDEX => ID */ 59, /* RENAME => ID */ 59, /* CTIME_KW => ID */ @@ -148009,195 +149365,219 @@ static const char *const yyTokenName[] = { /* 85 */ "PRECEDING", /* 86 */ "RANGE", /* 87 */ "UNBOUNDED", - /* 88 */ "REINDEX", - /* 89 */ "RENAME", - /* 90 */ "CTIME_KW", - /* 91 */ "ANY", - /* 92 */ "BITAND", - /* 93 */ "BITOR", - /* 94 */ "LSHIFT", - /* 95 */ "RSHIFT", - /* 96 */ "PLUS", - /* 97 */ "MINUS", - /* 98 */ "STAR", - /* 99 */ "SLASH", - /* 100 */ "REM", - /* 101 */ "CONCAT", - /* 102 */ "COLLATE", - /* 103 */ "BITNOT", - /* 104 */ "ON", - /* 105 */ "INDEXED", - /* 106 */ "STRING", - /* 107 */ "JOIN_KW", - /* 108 */ "CONSTRAINT", - /* 109 */ "DEFAULT", - /* 110 */ "NULL", - /* 111 */ "PRIMARY", - /* 112 */ "UNIQUE", - /* 113 */ "CHECK", - /* 114 */ "REFERENCES", - /* 115 */ "AUTOINCR", - /* 116 */ "INSERT", - /* 117 */ "DELETE", - /* 118 */ "UPDATE", - /* 119 */ "SET", - /* 120 */ "DEFERRABLE", - /* 121 */ "FOREIGN", - /* 122 */ "DROP", - /* 123 */ "UNION", - /* 124 */ "ALL", - /* 125 */ "EXCEPT", - /* 126 */ "INTERSECT", - /* 127 */ "SELECT", - /* 128 */ "VALUES", - /* 129 */ "DISTINCT", - /* 130 */ "DOT", - /* 131 */ "FROM", - /* 132 */ "JOIN", - /* 133 */ "USING", - /* 134 */ "ORDER", - /* 135 */ "GROUP", - /* 136 */ "HAVING", - /* 137 */ "LIMIT", - /* 138 */ "WHERE", - /* 139 */ "INTO", - /* 140 */ "NOTHING", - /* 141 */ "FLOAT", - /* 142 */ "BLOB", - /* 143 */ "INTEGER", - /* 144 */ "VARIABLE", - /* 145 */ "CASE", - /* 146 */ "WHEN", - /* 147 */ "THEN", - /* 148 */ "ELSE", - /* 149 */ "INDEX", - /* 150 */ "ALTER", - /* 151 */ "ADD", - /* 152 */ "WINDOW", - /* 153 */ "OVER", - /* 154 */ "FILTER", - /* 155 */ "input", - /* 156 */ "cmdlist", - /* 157 */ "ecmd", - /* 158 */ "cmdx", - /* 159 */ "explain", - /* 160 */ "cmd", - /* 161 */ "transtype", - /* 162 */ "trans_opt", - /* 163 */ "nm", - /* 164 */ "savepoint_opt", - /* 165 */ "create_table", - /* 166 */ "create_table_args", - /* 167 */ "createkw", - /* 168 */ "temp", - /* 169 */ "ifnotexists", - /* 170 */ "dbnm", - /* 171 */ "columnlist", - /* 172 */ "conslist_opt", - /* 173 */ "table_options", - /* 174 */ "select", - /* 175 */ "columnname", - /* 176 */ "carglist", - /* 177 */ "typetoken", - /* 178 */ "typename", - /* 179 */ "signed", - /* 180 */ "plus_num", - /* 181 */ "minus_num", - /* 182 */ "scanpt", - /* 183 */ "ccons", - /* 184 */ "term", - /* 185 */ "expr", - /* 186 */ "onconf", - /* 187 */ "sortorder", - /* 188 */ "autoinc", - /* 189 */ "eidlist_opt", - /* 190 */ "refargs", - /* 191 */ "defer_subclause", - /* 192 */ "refarg", - /* 193 */ "refact", - /* 194 */ "init_deferred_pred_opt", - /* 195 */ "conslist", - /* 196 */ "tconscomma", - /* 197 */ "tcons", - /* 198 */ "sortlist", - /* 199 */ "eidlist", - /* 200 */ "defer_subclause_opt", - /* 201 */ "orconf", - /* 202 */ "resolvetype", - /* 203 */ "raisetype", - /* 204 */ "ifexists", - /* 205 */ "fullname", - /* 206 */ "selectnowith", - /* 207 */ "oneselect", - /* 208 */ "wqlist", - /* 209 */ "multiselect_op", - /* 210 */ "distinct", - /* 211 */ "selcollist", - /* 212 */ "from", - /* 213 */ "where_opt", - /* 214 */ "groupby_opt", - /* 215 */ "having_opt", - /* 216 */ "orderby_opt", - /* 217 */ "limit_opt", - /* 218 */ "window_clause", - /* 219 */ "values", - /* 220 */ "nexprlist", - /* 221 */ "sclp", - /* 222 */ "as", - /* 223 */ "seltablist", - /* 224 */ "stl_prefix", - /* 225 */ "joinop", - /* 226 */ "indexed_opt", - /* 227 */ "on_opt", - /* 228 */ "using_opt", - /* 229 */ "exprlist", - /* 230 */ "xfullname", - /* 231 */ "idlist", - /* 232 */ "with", - /* 233 */ "setlist", - /* 234 */ "insert_cmd", - /* 235 */ "idlist_opt", - /* 236 */ "upsert", - /* 237 */ "over_clause", - /* 238 */ "likeop", - /* 239 */ "between_op", - /* 240 */ "in_op", - /* 241 */ "paren_exprlist", - /* 242 */ "case_operand", - /* 243 */ "case_exprlist", - /* 244 */ "case_else", - /* 245 */ "uniqueflag", - /* 246 */ "collate", - /* 247 */ "nmnum", - /* 248 */ "trigger_decl", - /* 249 */ "trigger_cmd_list", - /* 250 */ "trigger_time", - /* 251 */ "trigger_event", - /* 252 */ "foreach_clause", - /* 253 */ "when_clause", - /* 254 */ "trigger_cmd", - /* 255 */ "trnm", - /* 256 */ "tridxby", - /* 257 */ "database_kw_opt", - /* 258 */ "key_opt", - /* 259 */ "add_column_fullname", - /* 260 */ "kwcolumn_opt", - /* 261 */ "create_vtab", - /* 262 */ "vtabarglist", - /* 263 */ "vtabarg", - /* 264 */ "vtabargtoken", - /* 265 */ "lp", - /* 266 */ "anylist", - /* 267 */ "windowdefn_list", - /* 268 */ "windowdefn", - /* 269 */ "window", - /* 270 */ "frame_opt", - /* 271 */ "part_opt", - /* 272 */ "filter_opt", - /* 273 */ "range_or_rows", - /* 274 */ "frame_bound", - /* 275 */ "frame_bound_s", - /* 276 */ "frame_bound_e", + /* 88 */ "EXCLUDE", + /* 89 */ "GROUPS", + /* 90 */ "OTHERS", + /* 91 */ "TIES", + /* 92 */ "REINDEX", + /* 93 */ "RENAME", + /* 94 */ "CTIME_KW", + /* 95 */ "ANY", + /* 96 */ "BITAND", + /* 97 */ "BITOR", + /* 98 */ "LSHIFT", + /* 99 */ "RSHIFT", + /* 100 */ "PLUS", + /* 101 */ "MINUS", + /* 102 */ "STAR", + /* 103 */ "SLASH", + /* 104 */ "REM", + /* 105 */ "CONCAT", + /* 106 */ "COLLATE", + /* 107 */ "BITNOT", + /* 108 */ "ON", + /* 109 */ "INDEXED", + /* 110 */ "STRING", + /* 111 */ "JOIN_KW", + /* 112 */ "CONSTRAINT", + /* 113 */ "DEFAULT", + /* 114 */ "NULL", + /* 115 */ "PRIMARY", + /* 116 */ "UNIQUE", + /* 117 */ "CHECK", + /* 118 */ "REFERENCES", + /* 119 */ "AUTOINCR", + /* 120 */ "INSERT", + /* 121 */ "DELETE", + /* 122 */ "UPDATE", + /* 123 */ "SET", + /* 124 */ "DEFERRABLE", + /* 125 */ "FOREIGN", + /* 126 */ "DROP", + /* 127 */ "UNION", + /* 128 */ "ALL", + /* 129 */ "EXCEPT", + /* 130 */ "INTERSECT", + /* 131 */ "SELECT", + /* 132 */ "VALUES", + /* 133 */ "DISTINCT", + /* 134 */ "DOT", + /* 135 */ "FROM", + /* 136 */ "JOIN", + /* 137 */ "USING", + /* 138 */ "ORDER", + /* 139 */ "GROUP", + /* 140 */ "HAVING", + /* 141 */ "LIMIT", + /* 142 */ "WHERE", + /* 143 */ "INTO", + /* 144 */ "NOTHING", + /* 145 */ "FLOAT", + /* 146 */ "BLOB", + /* 147 */ "INTEGER", + /* 148 */ "VARIABLE", + /* 149 */ "CASE", + /* 150 */ "WHEN", + /* 151 */ "THEN", + /* 152 */ "ELSE", + /* 153 */ "INDEX", + /* 154 */ "ALTER", + /* 155 */ "ADD", + /* 156 */ "WINDOW", + /* 157 */ "OVER", + /* 158 */ "FILTER", + /* 159 */ "TRUEFALSE", + /* 160 */ "ISNOT", + /* 161 */ "FUNCTION", + /* 162 */ "COLUMN", + /* 163 */ "AGG_FUNCTION", + /* 164 */ "AGG_COLUMN", + /* 165 */ "UMINUS", + /* 166 */ "UPLUS", + /* 167 */ "TRUTH", + /* 168 */ "REGISTER", + /* 169 */ "VECTOR", + /* 170 */ "SELECT_COLUMN", + /* 171 */ "IF_NULL_ROW", + /* 172 */ "ASTERISK", + /* 173 */ "SPAN", + /* 174 */ "SPACE", + /* 175 */ "ILLEGAL", + /* 176 */ "input", + /* 177 */ "cmdlist", + /* 178 */ "ecmd", + /* 179 */ "cmdx", + /* 180 */ "explain", + /* 181 */ "cmd", + /* 182 */ "transtype", + /* 183 */ "trans_opt", + /* 184 */ "nm", + /* 185 */ "savepoint_opt", + /* 186 */ "create_table", + /* 187 */ "create_table_args", + /* 188 */ "createkw", + /* 189 */ "temp", + /* 190 */ "ifnotexists", + /* 191 */ "dbnm", + /* 192 */ "columnlist", + /* 193 */ "conslist_opt", + /* 194 */ "table_options", + /* 195 */ "select", + /* 196 */ "columnname", + /* 197 */ "carglist", + /* 198 */ "typetoken", + /* 199 */ "typename", + /* 200 */ "signed", + /* 201 */ "plus_num", + /* 202 */ "minus_num", + /* 203 */ "scanpt", + /* 204 */ "ccons", + /* 205 */ "term", + /* 206 */ "expr", + /* 207 */ "onconf", + /* 208 */ "sortorder", + /* 209 */ "autoinc", + /* 210 */ "eidlist_opt", + /* 211 */ "refargs", + /* 212 */ "defer_subclause", + /* 213 */ "refarg", + /* 214 */ "refact", + /* 215 */ "init_deferred_pred_opt", + /* 216 */ "conslist", + /* 217 */ "tconscomma", + /* 218 */ "tcons", + /* 219 */ "sortlist", + /* 220 */ "eidlist", + /* 221 */ "defer_subclause_opt", + /* 222 */ "orconf", + /* 223 */ "resolvetype", + /* 224 */ "raisetype", + /* 225 */ "ifexists", + /* 226 */ "fullname", + /* 227 */ "selectnowith", + /* 228 */ "oneselect", + /* 229 */ "wqlist", + /* 230 */ "multiselect_op", + /* 231 */ "distinct", + /* 232 */ "selcollist", + /* 233 */ "from", + /* 234 */ "where_opt", + /* 235 */ "groupby_opt", + /* 236 */ "having_opt", + /* 237 */ "orderby_opt", + /* 238 */ "limit_opt", + /* 239 */ "window_clause", + /* 240 */ "values", + /* 241 */ "nexprlist", + /* 242 */ "sclp", + /* 243 */ "as", + /* 244 */ "seltablist", + /* 245 */ "stl_prefix", + /* 246 */ "joinop", + /* 247 */ "indexed_opt", + /* 248 */ "on_opt", + /* 249 */ "using_opt", + /* 250 */ "exprlist", + /* 251 */ "xfullname", + /* 252 */ "idlist", + /* 253 */ "with", + /* 254 */ "setlist", + /* 255 */ "insert_cmd", + /* 256 */ "idlist_opt", + /* 257 */ "upsert", + /* 258 */ "over_clause", + /* 259 */ "likeop", + /* 260 */ "between_op", + /* 261 */ "in_op", + /* 262 */ "paren_exprlist", + /* 263 */ "case_operand", + /* 264 */ "case_exprlist", + /* 265 */ "case_else", + /* 266 */ "uniqueflag", + /* 267 */ "collate", + /* 268 */ "vinto", + /* 269 */ "nmnum", + /* 270 */ "trigger_decl", + /* 271 */ "trigger_cmd_list", + /* 272 */ "trigger_time", + /* 273 */ "trigger_event", + /* 274 */ "foreach_clause", + /* 275 */ "when_clause", + /* 276 */ "trigger_cmd", + /* 277 */ "trnm", + /* 278 */ "tridxby", + /* 279 */ "database_kw_opt", + /* 280 */ "key_opt", + /* 281 */ "add_column_fullname", + /* 282 */ "kwcolumn_opt", + /* 283 */ "create_vtab", + /* 284 */ "vtabarglist", + /* 285 */ "vtabarg", + /* 286 */ "vtabargtoken", + /* 287 */ "lp", + /* 288 */ "anylist", + /* 289 */ "windowdefn_list", + /* 290 */ "windowdefn", + /* 291 */ "window", + /* 292 */ "frame_opt", + /* 293 */ "part_opt", + /* 294 */ "filter_opt", + /* 295 */ "range_or_rows", + /* 296 */ "frame_bound", + /* 297 */ "frame_bound_s", + /* 298 */ "frame_bound_e", + /* 299 */ "frame_exclude_opt", + /* 300 */ "frame_exclude", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -148434,144 +149814,152 @@ static const char *const yyRuleName[] = { /* 226 */ "collate ::=", /* 227 */ "collate ::= COLLATE ID|STRING", /* 228 */ "cmd ::= DROP INDEX ifexists fullname", - /* 229 */ "cmd ::= VACUUM", - /* 230 */ "cmd ::= VACUUM nm", - /* 231 */ "cmd ::= PRAGMA nm dbnm", - /* 232 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", - /* 233 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", - /* 234 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", - /* 235 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", - /* 236 */ "plus_num ::= PLUS INTEGER|FLOAT", - /* 237 */ "minus_num ::= MINUS INTEGER|FLOAT", - /* 238 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", - /* 239 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", - /* 240 */ "trigger_time ::= BEFORE|AFTER", - /* 241 */ "trigger_time ::= INSTEAD OF", - /* 242 */ "trigger_time ::=", - /* 243 */ "trigger_event ::= DELETE|INSERT", - /* 244 */ "trigger_event ::= UPDATE", - /* 245 */ "trigger_event ::= UPDATE OF idlist", - /* 246 */ "when_clause ::=", - /* 247 */ "when_clause ::= WHEN expr", - /* 248 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 249 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 250 */ "trnm ::= nm DOT nm", - /* 251 */ "tridxby ::= INDEXED BY nm", - /* 252 */ "tridxby ::= NOT INDEXED", - /* 253 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt", - /* 254 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", - /* 255 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", - /* 256 */ "trigger_cmd ::= scanpt select scanpt", - /* 257 */ "expr ::= RAISE LP IGNORE RP", - /* 258 */ "expr ::= RAISE LP raisetype COMMA nm RP", - /* 259 */ "raisetype ::= ROLLBACK", - /* 260 */ "raisetype ::= ABORT", - /* 261 */ "raisetype ::= FAIL", - /* 262 */ "cmd ::= DROP TRIGGER ifexists fullname", - /* 263 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", - /* 264 */ "cmd ::= DETACH database_kw_opt expr", - /* 265 */ "key_opt ::=", - /* 266 */ "key_opt ::= KEY expr", - /* 267 */ "cmd ::= REINDEX", - /* 268 */ "cmd ::= REINDEX nm dbnm", - /* 269 */ "cmd ::= ANALYZE", - /* 270 */ "cmd ::= ANALYZE nm dbnm", - /* 271 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", - /* 272 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", - /* 273 */ "add_column_fullname ::= fullname", - /* 274 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", - /* 275 */ "cmd ::= create_vtab", - /* 276 */ "cmd ::= create_vtab LP vtabarglist RP", - /* 277 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", - /* 278 */ "vtabarg ::=", - /* 279 */ "vtabargtoken ::= ANY", - /* 280 */ "vtabargtoken ::= lp anylist RP", - /* 281 */ "lp ::= LP", - /* 282 */ "with ::= WITH wqlist", - /* 283 */ "with ::= WITH RECURSIVE wqlist", - /* 284 */ "wqlist ::= nm eidlist_opt AS LP select RP", - /* 285 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", - /* 286 */ "windowdefn_list ::= windowdefn", - /* 287 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", - /* 288 */ "windowdefn ::= nm AS window", - /* 289 */ "window ::= LP part_opt orderby_opt frame_opt RP", - /* 290 */ "part_opt ::= PARTITION BY nexprlist", - /* 291 */ "part_opt ::=", - /* 292 */ "frame_opt ::=", - /* 293 */ "frame_opt ::= range_or_rows frame_bound_s", - /* 294 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e", - /* 295 */ "range_or_rows ::= RANGE", - /* 296 */ "range_or_rows ::= ROWS", - /* 297 */ "frame_bound_s ::= frame_bound", - /* 298 */ "frame_bound_s ::= UNBOUNDED PRECEDING", - /* 299 */ "frame_bound_e ::= frame_bound", - /* 300 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", - /* 301 */ "frame_bound ::= expr PRECEDING", - /* 302 */ "frame_bound ::= CURRENT ROW", - /* 303 */ "frame_bound ::= expr FOLLOWING", - /* 304 */ "window_clause ::= WINDOW windowdefn_list", - /* 305 */ "over_clause ::= filter_opt OVER window", - /* 306 */ "over_clause ::= filter_opt OVER nm", - /* 307 */ "filter_opt ::=", - /* 308 */ "filter_opt ::= FILTER LP WHERE expr RP", - /* 309 */ "input ::= cmdlist", - /* 310 */ "cmdlist ::= cmdlist ecmd", - /* 311 */ "cmdlist ::= ecmd", - /* 312 */ "ecmd ::= SEMI", - /* 313 */ "ecmd ::= cmdx SEMI", - /* 314 */ "ecmd ::= explain cmdx", - /* 315 */ "trans_opt ::=", - /* 316 */ "trans_opt ::= TRANSACTION", - /* 317 */ "trans_opt ::= TRANSACTION nm", - /* 318 */ "savepoint_opt ::= SAVEPOINT", - /* 319 */ "savepoint_opt ::=", - /* 320 */ "cmd ::= create_table create_table_args", - /* 321 */ "columnlist ::= columnlist COMMA columnname carglist", - /* 322 */ "columnlist ::= columnname carglist", - /* 323 */ "nm ::= ID|INDEXED", - /* 324 */ "nm ::= STRING", - /* 325 */ "nm ::= JOIN_KW", - /* 326 */ "typetoken ::= typename", - /* 327 */ "typename ::= ID|STRING", - /* 328 */ "signed ::= plus_num", - /* 329 */ "signed ::= minus_num", - /* 330 */ "carglist ::= carglist ccons", - /* 331 */ "carglist ::=", - /* 332 */ "ccons ::= NULL onconf", - /* 333 */ "conslist_opt ::= COMMA conslist", - /* 334 */ "conslist ::= conslist tconscomma tcons", - /* 335 */ "conslist ::= tcons", - /* 336 */ "tconscomma ::=", - /* 337 */ "defer_subclause_opt ::= defer_subclause", - /* 338 */ "resolvetype ::= raisetype", - /* 339 */ "selectnowith ::= oneselect", - /* 340 */ "oneselect ::= values", - /* 341 */ "sclp ::= selcollist COMMA", - /* 342 */ "as ::= ID|STRING", - /* 343 */ "expr ::= term", - /* 344 */ "likeop ::= LIKE_KW|MATCH", - /* 345 */ "exprlist ::= nexprlist", - /* 346 */ "nmnum ::= plus_num", - /* 347 */ "nmnum ::= nm", - /* 348 */ "nmnum ::= ON", - /* 349 */ "nmnum ::= DELETE", - /* 350 */ "nmnum ::= DEFAULT", - /* 351 */ "plus_num ::= INTEGER|FLOAT", - /* 352 */ "foreach_clause ::=", - /* 353 */ "foreach_clause ::= FOR EACH ROW", - /* 354 */ "trnm ::= nm", - /* 355 */ "tridxby ::=", - /* 356 */ "database_kw_opt ::= DATABASE", - /* 357 */ "database_kw_opt ::=", - /* 358 */ "kwcolumn_opt ::=", - /* 359 */ "kwcolumn_opt ::= COLUMNKW", - /* 360 */ "vtabarglist ::= vtabarg", - /* 361 */ "vtabarglist ::= vtabarglist COMMA vtabarg", - /* 362 */ "vtabarg ::= vtabarg vtabargtoken", - /* 363 */ "anylist ::=", - /* 364 */ "anylist ::= anylist LP anylist RP", - /* 365 */ "anylist ::= anylist ANY", - /* 366 */ "with ::=", + /* 229 */ "cmd ::= VACUUM vinto", + /* 230 */ "cmd ::= VACUUM nm vinto", + /* 231 */ "vinto ::= INTO expr", + /* 232 */ "vinto ::=", + /* 233 */ "cmd ::= PRAGMA nm dbnm", + /* 234 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 235 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 236 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 237 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 238 */ "plus_num ::= PLUS INTEGER|FLOAT", + /* 239 */ "minus_num ::= MINUS INTEGER|FLOAT", + /* 240 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 241 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 242 */ "trigger_time ::= BEFORE|AFTER", + /* 243 */ "trigger_time ::= INSTEAD OF", + /* 244 */ "trigger_time ::=", + /* 245 */ "trigger_event ::= DELETE|INSERT", + /* 246 */ "trigger_event ::= UPDATE", + /* 247 */ "trigger_event ::= UPDATE OF idlist", + /* 248 */ "when_clause ::=", + /* 249 */ "when_clause ::= WHEN expr", + /* 250 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 251 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 252 */ "trnm ::= nm DOT nm", + /* 253 */ "tridxby ::= INDEXED BY nm", + /* 254 */ "tridxby ::= NOT INDEXED", + /* 255 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt", + /* 256 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", + /* 257 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", + /* 258 */ "trigger_cmd ::= scanpt select scanpt", + /* 259 */ "expr ::= RAISE LP IGNORE RP", + /* 260 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 261 */ "raisetype ::= ROLLBACK", + /* 262 */ "raisetype ::= ABORT", + /* 263 */ "raisetype ::= FAIL", + /* 264 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 265 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 266 */ "cmd ::= DETACH database_kw_opt expr", + /* 267 */ "key_opt ::=", + /* 268 */ "key_opt ::= KEY expr", + /* 269 */ "cmd ::= REINDEX", + /* 270 */ "cmd ::= REINDEX nm dbnm", + /* 271 */ "cmd ::= ANALYZE", + /* 272 */ "cmd ::= ANALYZE nm dbnm", + /* 273 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 274 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", + /* 275 */ "add_column_fullname ::= fullname", + /* 276 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", + /* 277 */ "cmd ::= create_vtab", + /* 278 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 279 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 280 */ "vtabarg ::=", + /* 281 */ "vtabargtoken ::= ANY", + /* 282 */ "vtabargtoken ::= lp anylist RP", + /* 283 */ "lp ::= LP", + /* 284 */ "with ::= WITH wqlist", + /* 285 */ "with ::= WITH RECURSIVE wqlist", + /* 286 */ "wqlist ::= nm eidlist_opt AS LP select RP", + /* 287 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", + /* 288 */ "windowdefn_list ::= windowdefn", + /* 289 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", + /* 290 */ "windowdefn ::= nm AS LP window RP", + /* 291 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", + /* 292 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", + /* 293 */ "window ::= ORDER BY sortlist frame_opt", + /* 294 */ "window ::= nm ORDER BY sortlist frame_opt", + /* 295 */ "window ::= frame_opt", + /* 296 */ "window ::= nm frame_opt", + /* 297 */ "frame_opt ::=", + /* 298 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", + /* 299 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", + /* 300 */ "range_or_rows ::= RANGE|ROWS|GROUPS", + /* 301 */ "frame_bound_s ::= frame_bound", + /* 302 */ "frame_bound_s ::= UNBOUNDED PRECEDING", + /* 303 */ "frame_bound_e ::= frame_bound", + /* 304 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", + /* 305 */ "frame_bound ::= expr PRECEDING|FOLLOWING", + /* 306 */ "frame_bound ::= CURRENT ROW", + /* 307 */ "frame_exclude_opt ::=", + /* 308 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", + /* 309 */ "frame_exclude ::= NO OTHERS", + /* 310 */ "frame_exclude ::= CURRENT ROW", + /* 311 */ "frame_exclude ::= GROUP|TIES", + /* 312 */ "window_clause ::= WINDOW windowdefn_list", + /* 313 */ "over_clause ::= filter_opt OVER LP window RP", + /* 314 */ "over_clause ::= filter_opt OVER nm", + /* 315 */ "filter_opt ::=", + /* 316 */ "filter_opt ::= FILTER LP WHERE expr RP", + /* 317 */ "input ::= cmdlist", + /* 318 */ "cmdlist ::= cmdlist ecmd", + /* 319 */ "cmdlist ::= ecmd", + /* 320 */ "ecmd ::= SEMI", + /* 321 */ "ecmd ::= cmdx SEMI", + /* 322 */ "ecmd ::= explain cmdx", + /* 323 */ "trans_opt ::=", + /* 324 */ "trans_opt ::= TRANSACTION", + /* 325 */ "trans_opt ::= TRANSACTION nm", + /* 326 */ "savepoint_opt ::= SAVEPOINT", + /* 327 */ "savepoint_opt ::=", + /* 328 */ "cmd ::= create_table create_table_args", + /* 329 */ "columnlist ::= columnlist COMMA columnname carglist", + /* 330 */ "columnlist ::= columnname carglist", + /* 331 */ "nm ::= ID|INDEXED", + /* 332 */ "nm ::= STRING", + /* 333 */ "nm ::= JOIN_KW", + /* 334 */ "typetoken ::= typename", + /* 335 */ "typename ::= ID|STRING", + /* 336 */ "signed ::= plus_num", + /* 337 */ "signed ::= minus_num", + /* 338 */ "carglist ::= carglist ccons", + /* 339 */ "carglist ::=", + /* 340 */ "ccons ::= NULL onconf", + /* 341 */ "conslist_opt ::= COMMA conslist", + /* 342 */ "conslist ::= conslist tconscomma tcons", + /* 343 */ "conslist ::= tcons", + /* 344 */ "tconscomma ::=", + /* 345 */ "defer_subclause_opt ::= defer_subclause", + /* 346 */ "resolvetype ::= raisetype", + /* 347 */ "selectnowith ::= oneselect", + /* 348 */ "oneselect ::= values", + /* 349 */ "sclp ::= selcollist COMMA", + /* 350 */ "as ::= ID|STRING", + /* 351 */ "expr ::= term", + /* 352 */ "likeop ::= LIKE_KW|MATCH", + /* 353 */ "exprlist ::= nexprlist", + /* 354 */ "nmnum ::= plus_num", + /* 355 */ "nmnum ::= nm", + /* 356 */ "nmnum ::= ON", + /* 357 */ "nmnum ::= DELETE", + /* 358 */ "nmnum ::= DEFAULT", + /* 359 */ "plus_num ::= INTEGER|FLOAT", + /* 360 */ "foreach_clause ::=", + /* 361 */ "foreach_clause ::= FOR EACH ROW", + /* 362 */ "trnm ::= nm", + /* 363 */ "tridxby ::=", + /* 364 */ "database_kw_opt ::= DATABASE", + /* 365 */ "database_kw_opt ::=", + /* 366 */ "kwcolumn_opt ::=", + /* 367 */ "kwcolumn_opt ::= COLUMNKW", + /* 368 */ "vtabarglist ::= vtabarg", + /* 369 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 370 */ "vtabarg ::= vtabarg vtabargtoken", + /* 371 */ "anylist ::=", + /* 372 */ "anylist ::= anylist LP anylist RP", + /* 373 */ "anylist ::= anylist ANY", + /* 374 */ "with ::=", }; #endif /* NDEBUG */ @@ -148697,96 +150085,97 @@ static void yy_destructor( ** inside the C code. */ /********* Begin destructor definitions ***************************************/ - case 174: /* select */ - case 206: /* selectnowith */ - case 207: /* oneselect */ - case 219: /* values */ + case 195: /* select */ + case 227: /* selectnowith */ + case 228: /* oneselect */ + case 240: /* values */ { -sqlite3SelectDelete(pParse->db, (yypminor->yy489)); +sqlite3SelectDelete(pParse->db, (yypminor->yy457)); } break; - case 184: /* term */ - case 185: /* expr */ - case 213: /* where_opt */ - case 215: /* having_opt */ - case 227: /* on_opt */ - case 242: /* case_operand */ - case 244: /* case_else */ - case 253: /* when_clause */ - case 258: /* key_opt */ - case 272: /* filter_opt */ + case 205: /* term */ + case 206: /* expr */ + case 234: /* where_opt */ + case 236: /* having_opt */ + case 248: /* on_opt */ + case 263: /* case_operand */ + case 265: /* case_else */ + case 268: /* vinto */ + case 275: /* when_clause */ + case 280: /* key_opt */ + case 294: /* filter_opt */ { -sqlite3ExprDelete(pParse->db, (yypminor->yy18)); +sqlite3ExprDelete(pParse->db, (yypminor->yy524)); } break; - case 189: /* eidlist_opt */ - case 198: /* sortlist */ - case 199: /* eidlist */ - case 211: /* selcollist */ - case 214: /* groupby_opt */ - case 216: /* orderby_opt */ - case 220: /* nexprlist */ - case 221: /* sclp */ - case 229: /* exprlist */ - case 233: /* setlist */ - case 241: /* paren_exprlist */ - case 243: /* case_exprlist */ - case 271: /* part_opt */ + case 210: /* eidlist_opt */ + case 219: /* sortlist */ + case 220: /* eidlist */ + case 232: /* selcollist */ + case 235: /* groupby_opt */ + case 237: /* orderby_opt */ + case 241: /* nexprlist */ + case 242: /* sclp */ + case 250: /* exprlist */ + case 254: /* setlist */ + case 262: /* paren_exprlist */ + case 264: /* case_exprlist */ + case 293: /* part_opt */ { -sqlite3ExprListDelete(pParse->db, (yypminor->yy420)); +sqlite3ExprListDelete(pParse->db, (yypminor->yy434)); } break; - case 205: /* fullname */ - case 212: /* from */ - case 223: /* seltablist */ - case 224: /* stl_prefix */ - case 230: /* xfullname */ + case 226: /* fullname */ + case 233: /* from */ + case 244: /* seltablist */ + case 245: /* stl_prefix */ + case 251: /* xfullname */ { -sqlite3SrcListDelete(pParse->db, (yypminor->yy135)); +sqlite3SrcListDelete(pParse->db, (yypminor->yy483)); } break; - case 208: /* wqlist */ + case 229: /* wqlist */ { -sqlite3WithDelete(pParse->db, (yypminor->yy449)); +sqlite3WithDelete(pParse->db, (yypminor->yy59)); } break; - case 218: /* window_clause */ - case 267: /* windowdefn_list */ + case 239: /* window_clause */ + case 289: /* windowdefn_list */ { -sqlite3WindowListDelete(pParse->db, (yypminor->yy327)); +sqlite3WindowListDelete(pParse->db, (yypminor->yy295)); } break; - case 228: /* using_opt */ - case 231: /* idlist */ - case 235: /* idlist_opt */ + case 249: /* using_opt */ + case 252: /* idlist */ + case 256: /* idlist_opt */ { -sqlite3IdListDelete(pParse->db, (yypminor->yy48)); +sqlite3IdListDelete(pParse->db, (yypminor->yy62)); } break; - case 237: /* over_clause */ - case 268: /* windowdefn */ - case 269: /* window */ - case 270: /* frame_opt */ + case 258: /* over_clause */ + case 290: /* windowdefn */ + case 291: /* window */ + case 292: /* frame_opt */ { -sqlite3WindowDelete(pParse->db, (yypminor->yy327)); +sqlite3WindowDelete(pParse->db, (yypminor->yy295)); } break; - case 249: /* trigger_cmd_list */ - case 254: /* trigger_cmd */ + case 271: /* trigger_cmd_list */ + case 276: /* trigger_cmd */ { -sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy207)); +sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy455)); } break; - case 251: /* trigger_event */ + case 273: /* trigger_event */ { -sqlite3IdListDelete(pParse->db, (yypminor->yy34).b); +sqlite3IdListDelete(pParse->db, (yypminor->yy90).b); } break; - case 274: /* frame_bound */ - case 275: /* frame_bound_s */ - case 276: /* frame_bound_e */ + case 296: /* frame_bound */ + case 297: /* frame_bound_s */ + case 298: /* frame_bound_e */ { -sqlite3ExprDelete(pParse->db, (yypminor->yy119).pExpr); +sqlite3ExprDelete(pParse->db, (yypminor->yy201).pExpr); } break; /********* End destructor definitions *****************************************/ @@ -149078,380 +150467,764 @@ static void yy_shift( yyTraceShift(yypParser, yyNewState, "Shift"); } -/* The following table contains information about every rule that -** is used during the reduce. -*/ -static const struct { - YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ - signed char nrhs; /* Negative of the number of RHS symbols in the rule */ -} yyRuleInfo[] = { - { 159, -1 }, /* (0) explain ::= EXPLAIN */ - { 159, -3 }, /* (1) explain ::= EXPLAIN QUERY PLAN */ - { 158, -1 }, /* (2) cmdx ::= cmd */ - { 160, -3 }, /* (3) cmd ::= BEGIN transtype trans_opt */ - { 161, 0 }, /* (4) transtype ::= */ - { 161, -1 }, /* (5) transtype ::= DEFERRED */ - { 161, -1 }, /* (6) transtype ::= IMMEDIATE */ - { 161, -1 }, /* (7) transtype ::= EXCLUSIVE */ - { 160, -2 }, /* (8) cmd ::= COMMIT|END trans_opt */ - { 160, -2 }, /* (9) cmd ::= ROLLBACK trans_opt */ - { 160, -2 }, /* (10) cmd ::= SAVEPOINT nm */ - { 160, -3 }, /* (11) cmd ::= RELEASE savepoint_opt nm */ - { 160, -5 }, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ - { 165, -6 }, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ - { 167, -1 }, /* (14) createkw ::= CREATE */ - { 169, 0 }, /* (15) ifnotexists ::= */ - { 169, -3 }, /* (16) ifnotexists ::= IF NOT EXISTS */ - { 168, -1 }, /* (17) temp ::= TEMP */ - { 168, 0 }, /* (18) temp ::= */ - { 166, -5 }, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */ - { 166, -2 }, /* (20) create_table_args ::= AS select */ - { 173, 0 }, /* (21) table_options ::= */ - { 173, -2 }, /* (22) table_options ::= WITHOUT nm */ - { 175, -2 }, /* (23) columnname ::= nm typetoken */ - { 177, 0 }, /* (24) typetoken ::= */ - { 177, -4 }, /* (25) typetoken ::= typename LP signed RP */ - { 177, -6 }, /* (26) typetoken ::= typename LP signed COMMA signed RP */ - { 178, -2 }, /* (27) typename ::= typename ID|STRING */ - { 182, 0 }, /* (28) scanpt ::= */ - { 183, -2 }, /* (29) ccons ::= CONSTRAINT nm */ - { 183, -4 }, /* (30) ccons ::= DEFAULT scanpt term scanpt */ - { 183, -4 }, /* (31) ccons ::= DEFAULT LP expr RP */ - { 183, -4 }, /* (32) ccons ::= DEFAULT PLUS term scanpt */ - { 183, -4 }, /* (33) ccons ::= DEFAULT MINUS term scanpt */ - { 183, -3 }, /* (34) ccons ::= DEFAULT scanpt ID|INDEXED */ - { 183, -3 }, /* (35) ccons ::= NOT NULL onconf */ - { 183, -5 }, /* (36) ccons ::= PRIMARY KEY sortorder onconf autoinc */ - { 183, -2 }, /* (37) ccons ::= UNIQUE onconf */ - { 183, -4 }, /* (38) ccons ::= CHECK LP expr RP */ - { 183, -4 }, /* (39) ccons ::= REFERENCES nm eidlist_opt refargs */ - { 183, -1 }, /* (40) ccons ::= defer_subclause */ - { 183, -2 }, /* (41) ccons ::= COLLATE ID|STRING */ - { 188, 0 }, /* (42) autoinc ::= */ - { 188, -1 }, /* (43) autoinc ::= AUTOINCR */ - { 190, 0 }, /* (44) refargs ::= */ - { 190, -2 }, /* (45) refargs ::= refargs refarg */ - { 192, -2 }, /* (46) refarg ::= MATCH nm */ - { 192, -3 }, /* (47) refarg ::= ON INSERT refact */ - { 192, -3 }, /* (48) refarg ::= ON DELETE refact */ - { 192, -3 }, /* (49) refarg ::= ON UPDATE refact */ - { 193, -2 }, /* (50) refact ::= SET NULL */ - { 193, -2 }, /* (51) refact ::= SET DEFAULT */ - { 193, -1 }, /* (52) refact ::= CASCADE */ - { 193, -1 }, /* (53) refact ::= RESTRICT */ - { 193, -2 }, /* (54) refact ::= NO ACTION */ - { 191, -3 }, /* (55) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ - { 191, -2 }, /* (56) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ - { 194, 0 }, /* (57) init_deferred_pred_opt ::= */ - { 194, -2 }, /* (58) init_deferred_pred_opt ::= INITIALLY DEFERRED */ - { 194, -2 }, /* (59) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ - { 172, 0 }, /* (60) conslist_opt ::= */ - { 196, -1 }, /* (61) tconscomma ::= COMMA */ - { 197, -2 }, /* (62) tcons ::= CONSTRAINT nm */ - { 197, -7 }, /* (63) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ - { 197, -5 }, /* (64) tcons ::= UNIQUE LP sortlist RP onconf */ - { 197, -5 }, /* (65) tcons ::= CHECK LP expr RP onconf */ - { 197, -10 }, /* (66) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ - { 200, 0 }, /* (67) defer_subclause_opt ::= */ - { 186, 0 }, /* (68) onconf ::= */ - { 186, -3 }, /* (69) onconf ::= ON CONFLICT resolvetype */ - { 201, 0 }, /* (70) orconf ::= */ - { 201, -2 }, /* (71) orconf ::= OR resolvetype */ - { 202, -1 }, /* (72) resolvetype ::= IGNORE */ - { 202, -1 }, /* (73) resolvetype ::= REPLACE */ - { 160, -4 }, /* (74) cmd ::= DROP TABLE ifexists fullname */ - { 204, -2 }, /* (75) ifexists ::= IF EXISTS */ - { 204, 0 }, /* (76) ifexists ::= */ - { 160, -9 }, /* (77) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ - { 160, -4 }, /* (78) cmd ::= DROP VIEW ifexists fullname */ - { 160, -1 }, /* (79) cmd ::= select */ - { 174, -3 }, /* (80) select ::= WITH wqlist selectnowith */ - { 174, -4 }, /* (81) select ::= WITH RECURSIVE wqlist selectnowith */ - { 174, -1 }, /* (82) select ::= selectnowith */ - { 206, -3 }, /* (83) selectnowith ::= selectnowith multiselect_op oneselect */ - { 209, -1 }, /* (84) multiselect_op ::= UNION */ - { 209, -2 }, /* (85) multiselect_op ::= UNION ALL */ - { 209, -1 }, /* (86) multiselect_op ::= EXCEPT|INTERSECT */ - { 207, -9 }, /* (87) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ - { 207, -10 }, /* (88) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ - { 219, -4 }, /* (89) values ::= VALUES LP nexprlist RP */ - { 219, -5 }, /* (90) values ::= values COMMA LP nexprlist RP */ - { 210, -1 }, /* (91) distinct ::= DISTINCT */ - { 210, -1 }, /* (92) distinct ::= ALL */ - { 210, 0 }, /* (93) distinct ::= */ - { 221, 0 }, /* (94) sclp ::= */ - { 211, -5 }, /* (95) selcollist ::= sclp scanpt expr scanpt as */ - { 211, -3 }, /* (96) selcollist ::= sclp scanpt STAR */ - { 211, -5 }, /* (97) selcollist ::= sclp scanpt nm DOT STAR */ - { 222, -2 }, /* (98) as ::= AS nm */ - { 222, 0 }, /* (99) as ::= */ - { 212, 0 }, /* (100) from ::= */ - { 212, -2 }, /* (101) from ::= FROM seltablist */ - { 224, -2 }, /* (102) stl_prefix ::= seltablist joinop */ - { 224, 0 }, /* (103) stl_prefix ::= */ - { 223, -7 }, /* (104) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ - { 223, -9 }, /* (105) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ - { 223, -7 }, /* (106) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ - { 223, -7 }, /* (107) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ - { 170, 0 }, /* (108) dbnm ::= */ - { 170, -2 }, /* (109) dbnm ::= DOT nm */ - { 205, -1 }, /* (110) fullname ::= nm */ - { 205, -3 }, /* (111) fullname ::= nm DOT nm */ - { 230, -1 }, /* (112) xfullname ::= nm */ - { 230, -3 }, /* (113) xfullname ::= nm DOT nm */ - { 230, -5 }, /* (114) xfullname ::= nm DOT nm AS nm */ - { 230, -3 }, /* (115) xfullname ::= nm AS nm */ - { 225, -1 }, /* (116) joinop ::= COMMA|JOIN */ - { 225, -2 }, /* (117) joinop ::= JOIN_KW JOIN */ - { 225, -3 }, /* (118) joinop ::= JOIN_KW nm JOIN */ - { 225, -4 }, /* (119) joinop ::= JOIN_KW nm nm JOIN */ - { 227, -2 }, /* (120) on_opt ::= ON expr */ - { 227, 0 }, /* (121) on_opt ::= */ - { 226, 0 }, /* (122) indexed_opt ::= */ - { 226, -3 }, /* (123) indexed_opt ::= INDEXED BY nm */ - { 226, -2 }, /* (124) indexed_opt ::= NOT INDEXED */ - { 228, -4 }, /* (125) using_opt ::= USING LP idlist RP */ - { 228, 0 }, /* (126) using_opt ::= */ - { 216, 0 }, /* (127) orderby_opt ::= */ - { 216, -3 }, /* (128) orderby_opt ::= ORDER BY sortlist */ - { 198, -4 }, /* (129) sortlist ::= sortlist COMMA expr sortorder */ - { 198, -2 }, /* (130) sortlist ::= expr sortorder */ - { 187, -1 }, /* (131) sortorder ::= ASC */ - { 187, -1 }, /* (132) sortorder ::= DESC */ - { 187, 0 }, /* (133) sortorder ::= */ - { 214, 0 }, /* (134) groupby_opt ::= */ - { 214, -3 }, /* (135) groupby_opt ::= GROUP BY nexprlist */ - { 215, 0 }, /* (136) having_opt ::= */ - { 215, -2 }, /* (137) having_opt ::= HAVING expr */ - { 217, 0 }, /* (138) limit_opt ::= */ - { 217, -2 }, /* (139) limit_opt ::= LIMIT expr */ - { 217, -4 }, /* (140) limit_opt ::= LIMIT expr OFFSET expr */ - { 217, -4 }, /* (141) limit_opt ::= LIMIT expr COMMA expr */ - { 160, -6 }, /* (142) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ - { 213, 0 }, /* (143) where_opt ::= */ - { 213, -2 }, /* (144) where_opt ::= WHERE expr */ - { 160, -8 }, /* (145) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ - { 233, -5 }, /* (146) setlist ::= setlist COMMA nm EQ expr */ - { 233, -7 }, /* (147) setlist ::= setlist COMMA LP idlist RP EQ expr */ - { 233, -3 }, /* (148) setlist ::= nm EQ expr */ - { 233, -5 }, /* (149) setlist ::= LP idlist RP EQ expr */ - { 160, -7 }, /* (150) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ - { 160, -7 }, /* (151) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ - { 236, 0 }, /* (152) upsert ::= */ - { 236, -11 }, /* (153) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ - { 236, -8 }, /* (154) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ - { 236, -4 }, /* (155) upsert ::= ON CONFLICT DO NOTHING */ - { 234, -2 }, /* (156) insert_cmd ::= INSERT orconf */ - { 234, -1 }, /* (157) insert_cmd ::= REPLACE */ - { 235, 0 }, /* (158) idlist_opt ::= */ - { 235, -3 }, /* (159) idlist_opt ::= LP idlist RP */ - { 231, -3 }, /* (160) idlist ::= idlist COMMA nm */ - { 231, -1 }, /* (161) idlist ::= nm */ - { 185, -3 }, /* (162) expr ::= LP expr RP */ - { 185, -1 }, /* (163) expr ::= ID|INDEXED */ - { 185, -1 }, /* (164) expr ::= JOIN_KW */ - { 185, -3 }, /* (165) expr ::= nm DOT nm */ - { 185, -5 }, /* (166) expr ::= nm DOT nm DOT nm */ - { 184, -1 }, /* (167) term ::= NULL|FLOAT|BLOB */ - { 184, -1 }, /* (168) term ::= STRING */ - { 184, -1 }, /* (169) term ::= INTEGER */ - { 185, -1 }, /* (170) expr ::= VARIABLE */ - { 185, -3 }, /* (171) expr ::= expr COLLATE ID|STRING */ - { 185, -6 }, /* (172) expr ::= CAST LP expr AS typetoken RP */ - { 185, -5 }, /* (173) expr ::= ID|INDEXED LP distinct exprlist RP */ - { 185, -4 }, /* (174) expr ::= ID|INDEXED LP STAR RP */ - { 185, -6 }, /* (175) expr ::= ID|INDEXED LP distinct exprlist RP over_clause */ - { 185, -5 }, /* (176) expr ::= ID|INDEXED LP STAR RP over_clause */ - { 184, -1 }, /* (177) term ::= CTIME_KW */ - { 185, -5 }, /* (178) expr ::= LP nexprlist COMMA expr RP */ - { 185, -3 }, /* (179) expr ::= expr AND expr */ - { 185, -3 }, /* (180) expr ::= expr OR expr */ - { 185, -3 }, /* (181) expr ::= expr LT|GT|GE|LE expr */ - { 185, -3 }, /* (182) expr ::= expr EQ|NE expr */ - { 185, -3 }, /* (183) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ - { 185, -3 }, /* (184) expr ::= expr PLUS|MINUS expr */ - { 185, -3 }, /* (185) expr ::= expr STAR|SLASH|REM expr */ - { 185, -3 }, /* (186) expr ::= expr CONCAT expr */ - { 238, -2 }, /* (187) likeop ::= NOT LIKE_KW|MATCH */ - { 185, -3 }, /* (188) expr ::= expr likeop expr */ - { 185, -5 }, /* (189) expr ::= expr likeop expr ESCAPE expr */ - { 185, -2 }, /* (190) expr ::= expr ISNULL|NOTNULL */ - { 185, -3 }, /* (191) expr ::= expr NOT NULL */ - { 185, -3 }, /* (192) expr ::= expr IS expr */ - { 185, -4 }, /* (193) expr ::= expr IS NOT expr */ - { 185, -2 }, /* (194) expr ::= NOT expr */ - { 185, -2 }, /* (195) expr ::= BITNOT expr */ - { 185, -2 }, /* (196) expr ::= PLUS|MINUS expr */ - { 239, -1 }, /* (197) between_op ::= BETWEEN */ - { 239, -2 }, /* (198) between_op ::= NOT BETWEEN */ - { 185, -5 }, /* (199) expr ::= expr between_op expr AND expr */ - { 240, -1 }, /* (200) in_op ::= IN */ - { 240, -2 }, /* (201) in_op ::= NOT IN */ - { 185, -5 }, /* (202) expr ::= expr in_op LP exprlist RP */ - { 185, -3 }, /* (203) expr ::= LP select RP */ - { 185, -5 }, /* (204) expr ::= expr in_op LP select RP */ - { 185, -5 }, /* (205) expr ::= expr in_op nm dbnm paren_exprlist */ - { 185, -4 }, /* (206) expr ::= EXISTS LP select RP */ - { 185, -5 }, /* (207) expr ::= CASE case_operand case_exprlist case_else END */ - { 243, -5 }, /* (208) case_exprlist ::= case_exprlist WHEN expr THEN expr */ - { 243, -4 }, /* (209) case_exprlist ::= WHEN expr THEN expr */ - { 244, -2 }, /* (210) case_else ::= ELSE expr */ - { 244, 0 }, /* (211) case_else ::= */ - { 242, -1 }, /* (212) case_operand ::= expr */ - { 242, 0 }, /* (213) case_operand ::= */ - { 229, 0 }, /* (214) exprlist ::= */ - { 220, -3 }, /* (215) nexprlist ::= nexprlist COMMA expr */ - { 220, -1 }, /* (216) nexprlist ::= expr */ - { 241, 0 }, /* (217) paren_exprlist ::= */ - { 241, -3 }, /* (218) paren_exprlist ::= LP exprlist RP */ - { 160, -12 }, /* (219) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ - { 245, -1 }, /* (220) uniqueflag ::= UNIQUE */ - { 245, 0 }, /* (221) uniqueflag ::= */ - { 189, 0 }, /* (222) eidlist_opt ::= */ - { 189, -3 }, /* (223) eidlist_opt ::= LP eidlist RP */ - { 199, -5 }, /* (224) eidlist ::= eidlist COMMA nm collate sortorder */ - { 199, -3 }, /* (225) eidlist ::= nm collate sortorder */ - { 246, 0 }, /* (226) collate ::= */ - { 246, -2 }, /* (227) collate ::= COLLATE ID|STRING */ - { 160, -4 }, /* (228) cmd ::= DROP INDEX ifexists fullname */ - { 160, -1 }, /* (229) cmd ::= VACUUM */ - { 160, -2 }, /* (230) cmd ::= VACUUM nm */ - { 160, -3 }, /* (231) cmd ::= PRAGMA nm dbnm */ - { 160, -5 }, /* (232) cmd ::= PRAGMA nm dbnm EQ nmnum */ - { 160, -6 }, /* (233) cmd ::= PRAGMA nm dbnm LP nmnum RP */ - { 160, -5 }, /* (234) cmd ::= PRAGMA nm dbnm EQ minus_num */ - { 160, -6 }, /* (235) cmd ::= PRAGMA nm dbnm LP minus_num RP */ - { 180, -2 }, /* (236) plus_num ::= PLUS INTEGER|FLOAT */ - { 181, -2 }, /* (237) minus_num ::= MINUS INTEGER|FLOAT */ - { 160, -5 }, /* (238) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ - { 248, -11 }, /* (239) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ - { 250, -1 }, /* (240) trigger_time ::= BEFORE|AFTER */ - { 250, -2 }, /* (241) trigger_time ::= INSTEAD OF */ - { 250, 0 }, /* (242) trigger_time ::= */ - { 251, -1 }, /* (243) trigger_event ::= DELETE|INSERT */ - { 251, -1 }, /* (244) trigger_event ::= UPDATE */ - { 251, -3 }, /* (245) trigger_event ::= UPDATE OF idlist */ - { 253, 0 }, /* (246) when_clause ::= */ - { 253, -2 }, /* (247) when_clause ::= WHEN expr */ - { 249, -3 }, /* (248) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ - { 249, -2 }, /* (249) trigger_cmd_list ::= trigger_cmd SEMI */ - { 255, -3 }, /* (250) trnm ::= nm DOT nm */ - { 256, -3 }, /* (251) tridxby ::= INDEXED BY nm */ - { 256, -2 }, /* (252) tridxby ::= NOT INDEXED */ - { 254, -8 }, /* (253) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ - { 254, -8 }, /* (254) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ - { 254, -6 }, /* (255) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ - { 254, -3 }, /* (256) trigger_cmd ::= scanpt select scanpt */ - { 185, -4 }, /* (257) expr ::= RAISE LP IGNORE RP */ - { 185, -6 }, /* (258) expr ::= RAISE LP raisetype COMMA nm RP */ - { 203, -1 }, /* (259) raisetype ::= ROLLBACK */ - { 203, -1 }, /* (260) raisetype ::= ABORT */ - { 203, -1 }, /* (261) raisetype ::= FAIL */ - { 160, -4 }, /* (262) cmd ::= DROP TRIGGER ifexists fullname */ - { 160, -6 }, /* (263) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ - { 160, -3 }, /* (264) cmd ::= DETACH database_kw_opt expr */ - { 258, 0 }, /* (265) key_opt ::= */ - { 258, -2 }, /* (266) key_opt ::= KEY expr */ - { 160, -1 }, /* (267) cmd ::= REINDEX */ - { 160, -3 }, /* (268) cmd ::= REINDEX nm dbnm */ - { 160, -1 }, /* (269) cmd ::= ANALYZE */ - { 160, -3 }, /* (270) cmd ::= ANALYZE nm dbnm */ - { 160, -6 }, /* (271) cmd ::= ALTER TABLE fullname RENAME TO nm */ - { 160, -7 }, /* (272) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ - { 259, -1 }, /* (273) add_column_fullname ::= fullname */ - { 160, -8 }, /* (274) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ - { 160, -1 }, /* (275) cmd ::= create_vtab */ - { 160, -4 }, /* (276) cmd ::= create_vtab LP vtabarglist RP */ - { 261, -8 }, /* (277) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ - { 263, 0 }, /* (278) vtabarg ::= */ - { 264, -1 }, /* (279) vtabargtoken ::= ANY */ - { 264, -3 }, /* (280) vtabargtoken ::= lp anylist RP */ - { 265, -1 }, /* (281) lp ::= LP */ - { 232, -2 }, /* (282) with ::= WITH wqlist */ - { 232, -3 }, /* (283) with ::= WITH RECURSIVE wqlist */ - { 208, -6 }, /* (284) wqlist ::= nm eidlist_opt AS LP select RP */ - { 208, -8 }, /* (285) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ - { 267, -1 }, /* (286) windowdefn_list ::= windowdefn */ - { 267, -3 }, /* (287) windowdefn_list ::= windowdefn_list COMMA windowdefn */ - { 268, -3 }, /* (288) windowdefn ::= nm AS window */ - { 269, -5 }, /* (289) window ::= LP part_opt orderby_opt frame_opt RP */ - { 271, -3 }, /* (290) part_opt ::= PARTITION BY nexprlist */ - { 271, 0 }, /* (291) part_opt ::= */ - { 270, 0 }, /* (292) frame_opt ::= */ - { 270, -2 }, /* (293) frame_opt ::= range_or_rows frame_bound_s */ - { 270, -5 }, /* (294) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e */ - { 273, -1 }, /* (295) range_or_rows ::= RANGE */ - { 273, -1 }, /* (296) range_or_rows ::= ROWS */ - { 275, -1 }, /* (297) frame_bound_s ::= frame_bound */ - { 275, -2 }, /* (298) frame_bound_s ::= UNBOUNDED PRECEDING */ - { 276, -1 }, /* (299) frame_bound_e ::= frame_bound */ - { 276, -2 }, /* (300) frame_bound_e ::= UNBOUNDED FOLLOWING */ - { 274, -2 }, /* (301) frame_bound ::= expr PRECEDING */ - { 274, -2 }, /* (302) frame_bound ::= CURRENT ROW */ - { 274, -2 }, /* (303) frame_bound ::= expr FOLLOWING */ - { 218, -2 }, /* (304) window_clause ::= WINDOW windowdefn_list */ - { 237, -3 }, /* (305) over_clause ::= filter_opt OVER window */ - { 237, -3 }, /* (306) over_clause ::= filter_opt OVER nm */ - { 272, 0 }, /* (307) filter_opt ::= */ - { 272, -5 }, /* (308) filter_opt ::= FILTER LP WHERE expr RP */ - { 155, -1 }, /* (309) input ::= cmdlist */ - { 156, -2 }, /* (310) cmdlist ::= cmdlist ecmd */ - { 156, -1 }, /* (311) cmdlist ::= ecmd */ - { 157, -1 }, /* (312) ecmd ::= SEMI */ - { 157, -2 }, /* (313) ecmd ::= cmdx SEMI */ - { 157, -2 }, /* (314) ecmd ::= explain cmdx */ - { 162, 0 }, /* (315) trans_opt ::= */ - { 162, -1 }, /* (316) trans_opt ::= TRANSACTION */ - { 162, -2 }, /* (317) trans_opt ::= TRANSACTION nm */ - { 164, -1 }, /* (318) savepoint_opt ::= SAVEPOINT */ - { 164, 0 }, /* (319) savepoint_opt ::= */ - { 160, -2 }, /* (320) cmd ::= create_table create_table_args */ - { 171, -4 }, /* (321) columnlist ::= columnlist COMMA columnname carglist */ - { 171, -2 }, /* (322) columnlist ::= columnname carglist */ - { 163, -1 }, /* (323) nm ::= ID|INDEXED */ - { 163, -1 }, /* (324) nm ::= STRING */ - { 163, -1 }, /* (325) nm ::= JOIN_KW */ - { 177, -1 }, /* (326) typetoken ::= typename */ - { 178, -1 }, /* (327) typename ::= ID|STRING */ - { 179, -1 }, /* (328) signed ::= plus_num */ - { 179, -1 }, /* (329) signed ::= minus_num */ - { 176, -2 }, /* (330) carglist ::= carglist ccons */ - { 176, 0 }, /* (331) carglist ::= */ - { 183, -2 }, /* (332) ccons ::= NULL onconf */ - { 172, -2 }, /* (333) conslist_opt ::= COMMA conslist */ - { 195, -3 }, /* (334) conslist ::= conslist tconscomma tcons */ - { 195, -1 }, /* (335) conslist ::= tcons */ - { 196, 0 }, /* (336) tconscomma ::= */ - { 200, -1 }, /* (337) defer_subclause_opt ::= defer_subclause */ - { 202, -1 }, /* (338) resolvetype ::= raisetype */ - { 206, -1 }, /* (339) selectnowith ::= oneselect */ - { 207, -1 }, /* (340) oneselect ::= values */ - { 221, -2 }, /* (341) sclp ::= selcollist COMMA */ - { 222, -1 }, /* (342) as ::= ID|STRING */ - { 185, -1 }, /* (343) expr ::= term */ - { 238, -1 }, /* (344) likeop ::= LIKE_KW|MATCH */ - { 229, -1 }, /* (345) exprlist ::= nexprlist */ - { 247, -1 }, /* (346) nmnum ::= plus_num */ - { 247, -1 }, /* (347) nmnum ::= nm */ - { 247, -1 }, /* (348) nmnum ::= ON */ - { 247, -1 }, /* (349) nmnum ::= DELETE */ - { 247, -1 }, /* (350) nmnum ::= DEFAULT */ - { 180, -1 }, /* (351) plus_num ::= INTEGER|FLOAT */ - { 252, 0 }, /* (352) foreach_clause ::= */ - { 252, -3 }, /* (353) foreach_clause ::= FOR EACH ROW */ - { 255, -1 }, /* (354) trnm ::= nm */ - { 256, 0 }, /* (355) tridxby ::= */ - { 257, -1 }, /* (356) database_kw_opt ::= DATABASE */ - { 257, 0 }, /* (357) database_kw_opt ::= */ - { 260, 0 }, /* (358) kwcolumn_opt ::= */ - { 260, -1 }, /* (359) kwcolumn_opt ::= COLUMNKW */ - { 262, -1 }, /* (360) vtabarglist ::= vtabarg */ - { 262, -3 }, /* (361) vtabarglist ::= vtabarglist COMMA vtabarg */ - { 263, -2 }, /* (362) vtabarg ::= vtabarg vtabargtoken */ - { 266, 0 }, /* (363) anylist ::= */ - { 266, -4 }, /* (364) anylist ::= anylist LP anylist RP */ - { 266, -2 }, /* (365) anylist ::= anylist ANY */ - { 232, 0 }, /* (366) with ::= */ +/* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side +** of that rule */ +static const YYCODETYPE yyRuleInfoLhs[] = { + 180, /* (0) explain ::= EXPLAIN */ + 180, /* (1) explain ::= EXPLAIN QUERY PLAN */ + 179, /* (2) cmdx ::= cmd */ + 181, /* (3) cmd ::= BEGIN transtype trans_opt */ + 182, /* (4) transtype ::= */ + 182, /* (5) transtype ::= DEFERRED */ + 182, /* (6) transtype ::= IMMEDIATE */ + 182, /* (7) transtype ::= EXCLUSIVE */ + 181, /* (8) cmd ::= COMMIT|END trans_opt */ + 181, /* (9) cmd ::= ROLLBACK trans_opt */ + 181, /* (10) cmd ::= SAVEPOINT nm */ + 181, /* (11) cmd ::= RELEASE savepoint_opt nm */ + 181, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ + 186, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ + 188, /* (14) createkw ::= CREATE */ + 190, /* (15) ifnotexists ::= */ + 190, /* (16) ifnotexists ::= IF NOT EXISTS */ + 189, /* (17) temp ::= TEMP */ + 189, /* (18) temp ::= */ + 187, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */ + 187, /* (20) create_table_args ::= AS select */ + 194, /* (21) table_options ::= */ + 194, /* (22) table_options ::= WITHOUT nm */ + 196, /* (23) columnname ::= nm typetoken */ + 198, /* (24) typetoken ::= */ + 198, /* (25) typetoken ::= typename LP signed RP */ + 198, /* (26) typetoken ::= typename LP signed COMMA signed RP */ + 199, /* (27) typename ::= typename ID|STRING */ + 203, /* (28) scanpt ::= */ + 204, /* (29) ccons ::= CONSTRAINT nm */ + 204, /* (30) ccons ::= DEFAULT scanpt term scanpt */ + 204, /* (31) ccons ::= DEFAULT LP expr RP */ + 204, /* (32) ccons ::= DEFAULT PLUS term scanpt */ + 204, /* (33) ccons ::= DEFAULT MINUS term scanpt */ + 204, /* (34) ccons ::= DEFAULT scanpt ID|INDEXED */ + 204, /* (35) ccons ::= NOT NULL onconf */ + 204, /* (36) ccons ::= PRIMARY KEY sortorder onconf autoinc */ + 204, /* (37) ccons ::= UNIQUE onconf */ + 204, /* (38) ccons ::= CHECK LP expr RP */ + 204, /* (39) ccons ::= REFERENCES nm eidlist_opt refargs */ + 204, /* (40) ccons ::= defer_subclause */ + 204, /* (41) ccons ::= COLLATE ID|STRING */ + 209, /* (42) autoinc ::= */ + 209, /* (43) autoinc ::= AUTOINCR */ + 211, /* (44) refargs ::= */ + 211, /* (45) refargs ::= refargs refarg */ + 213, /* (46) refarg ::= MATCH nm */ + 213, /* (47) refarg ::= ON INSERT refact */ + 213, /* (48) refarg ::= ON DELETE refact */ + 213, /* (49) refarg ::= ON UPDATE refact */ + 214, /* (50) refact ::= SET NULL */ + 214, /* (51) refact ::= SET DEFAULT */ + 214, /* (52) refact ::= CASCADE */ + 214, /* (53) refact ::= RESTRICT */ + 214, /* (54) refact ::= NO ACTION */ + 212, /* (55) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ + 212, /* (56) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + 215, /* (57) init_deferred_pred_opt ::= */ + 215, /* (58) init_deferred_pred_opt ::= INITIALLY DEFERRED */ + 215, /* (59) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ + 193, /* (60) conslist_opt ::= */ + 217, /* (61) tconscomma ::= COMMA */ + 218, /* (62) tcons ::= CONSTRAINT nm */ + 218, /* (63) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ + 218, /* (64) tcons ::= UNIQUE LP sortlist RP onconf */ + 218, /* (65) tcons ::= CHECK LP expr RP onconf */ + 218, /* (66) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ + 221, /* (67) defer_subclause_opt ::= */ + 207, /* (68) onconf ::= */ + 207, /* (69) onconf ::= ON CONFLICT resolvetype */ + 222, /* (70) orconf ::= */ + 222, /* (71) orconf ::= OR resolvetype */ + 223, /* (72) resolvetype ::= IGNORE */ + 223, /* (73) resolvetype ::= REPLACE */ + 181, /* (74) cmd ::= DROP TABLE ifexists fullname */ + 225, /* (75) ifexists ::= IF EXISTS */ + 225, /* (76) ifexists ::= */ + 181, /* (77) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ + 181, /* (78) cmd ::= DROP VIEW ifexists fullname */ + 181, /* (79) cmd ::= select */ + 195, /* (80) select ::= WITH wqlist selectnowith */ + 195, /* (81) select ::= WITH RECURSIVE wqlist selectnowith */ + 195, /* (82) select ::= selectnowith */ + 227, /* (83) selectnowith ::= selectnowith multiselect_op oneselect */ + 230, /* (84) multiselect_op ::= UNION */ + 230, /* (85) multiselect_op ::= UNION ALL */ + 230, /* (86) multiselect_op ::= EXCEPT|INTERSECT */ + 228, /* (87) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + 228, /* (88) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ + 240, /* (89) values ::= VALUES LP nexprlist RP */ + 240, /* (90) values ::= values COMMA LP nexprlist RP */ + 231, /* (91) distinct ::= DISTINCT */ + 231, /* (92) distinct ::= ALL */ + 231, /* (93) distinct ::= */ + 242, /* (94) sclp ::= */ + 232, /* (95) selcollist ::= sclp scanpt expr scanpt as */ + 232, /* (96) selcollist ::= sclp scanpt STAR */ + 232, /* (97) selcollist ::= sclp scanpt nm DOT STAR */ + 243, /* (98) as ::= AS nm */ + 243, /* (99) as ::= */ + 233, /* (100) from ::= */ + 233, /* (101) from ::= FROM seltablist */ + 245, /* (102) stl_prefix ::= seltablist joinop */ + 245, /* (103) stl_prefix ::= */ + 244, /* (104) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + 244, /* (105) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ + 244, /* (106) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + 244, /* (107) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + 191, /* (108) dbnm ::= */ + 191, /* (109) dbnm ::= DOT nm */ + 226, /* (110) fullname ::= nm */ + 226, /* (111) fullname ::= nm DOT nm */ + 251, /* (112) xfullname ::= nm */ + 251, /* (113) xfullname ::= nm DOT nm */ + 251, /* (114) xfullname ::= nm DOT nm AS nm */ + 251, /* (115) xfullname ::= nm AS nm */ + 246, /* (116) joinop ::= COMMA|JOIN */ + 246, /* (117) joinop ::= JOIN_KW JOIN */ + 246, /* (118) joinop ::= JOIN_KW nm JOIN */ + 246, /* (119) joinop ::= JOIN_KW nm nm JOIN */ + 248, /* (120) on_opt ::= ON expr */ + 248, /* (121) on_opt ::= */ + 247, /* (122) indexed_opt ::= */ + 247, /* (123) indexed_opt ::= INDEXED BY nm */ + 247, /* (124) indexed_opt ::= NOT INDEXED */ + 249, /* (125) using_opt ::= USING LP idlist RP */ + 249, /* (126) using_opt ::= */ + 237, /* (127) orderby_opt ::= */ + 237, /* (128) orderby_opt ::= ORDER BY sortlist */ + 219, /* (129) sortlist ::= sortlist COMMA expr sortorder */ + 219, /* (130) sortlist ::= expr sortorder */ + 208, /* (131) sortorder ::= ASC */ + 208, /* (132) sortorder ::= DESC */ + 208, /* (133) sortorder ::= */ + 235, /* (134) groupby_opt ::= */ + 235, /* (135) groupby_opt ::= GROUP BY nexprlist */ + 236, /* (136) having_opt ::= */ + 236, /* (137) having_opt ::= HAVING expr */ + 238, /* (138) limit_opt ::= */ + 238, /* (139) limit_opt ::= LIMIT expr */ + 238, /* (140) limit_opt ::= LIMIT expr OFFSET expr */ + 238, /* (141) limit_opt ::= LIMIT expr COMMA expr */ + 181, /* (142) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ + 234, /* (143) where_opt ::= */ + 234, /* (144) where_opt ::= WHERE expr */ + 181, /* (145) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ + 254, /* (146) setlist ::= setlist COMMA nm EQ expr */ + 254, /* (147) setlist ::= setlist COMMA LP idlist RP EQ expr */ + 254, /* (148) setlist ::= nm EQ expr */ + 254, /* (149) setlist ::= LP idlist RP EQ expr */ + 181, /* (150) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + 181, /* (151) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ + 257, /* (152) upsert ::= */ + 257, /* (153) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ + 257, /* (154) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ + 257, /* (155) upsert ::= ON CONFLICT DO NOTHING */ + 255, /* (156) insert_cmd ::= INSERT orconf */ + 255, /* (157) insert_cmd ::= REPLACE */ + 256, /* (158) idlist_opt ::= */ + 256, /* (159) idlist_opt ::= LP idlist RP */ + 252, /* (160) idlist ::= idlist COMMA nm */ + 252, /* (161) idlist ::= nm */ + 206, /* (162) expr ::= LP expr RP */ + 206, /* (163) expr ::= ID|INDEXED */ + 206, /* (164) expr ::= JOIN_KW */ + 206, /* (165) expr ::= nm DOT nm */ + 206, /* (166) expr ::= nm DOT nm DOT nm */ + 205, /* (167) term ::= NULL|FLOAT|BLOB */ + 205, /* (168) term ::= STRING */ + 205, /* (169) term ::= INTEGER */ + 206, /* (170) expr ::= VARIABLE */ + 206, /* (171) expr ::= expr COLLATE ID|STRING */ + 206, /* (172) expr ::= CAST LP expr AS typetoken RP */ + 206, /* (173) expr ::= ID|INDEXED LP distinct exprlist RP */ + 206, /* (174) expr ::= ID|INDEXED LP STAR RP */ + 206, /* (175) expr ::= ID|INDEXED LP distinct exprlist RP over_clause */ + 206, /* (176) expr ::= ID|INDEXED LP STAR RP over_clause */ + 205, /* (177) term ::= CTIME_KW */ + 206, /* (178) expr ::= LP nexprlist COMMA expr RP */ + 206, /* (179) expr ::= expr AND expr */ + 206, /* (180) expr ::= expr OR expr */ + 206, /* (181) expr ::= expr LT|GT|GE|LE expr */ + 206, /* (182) expr ::= expr EQ|NE expr */ + 206, /* (183) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ + 206, /* (184) expr ::= expr PLUS|MINUS expr */ + 206, /* (185) expr ::= expr STAR|SLASH|REM expr */ + 206, /* (186) expr ::= expr CONCAT expr */ + 259, /* (187) likeop ::= NOT LIKE_KW|MATCH */ + 206, /* (188) expr ::= expr likeop expr */ + 206, /* (189) expr ::= expr likeop expr ESCAPE expr */ + 206, /* (190) expr ::= expr ISNULL|NOTNULL */ + 206, /* (191) expr ::= expr NOT NULL */ + 206, /* (192) expr ::= expr IS expr */ + 206, /* (193) expr ::= expr IS NOT expr */ + 206, /* (194) expr ::= NOT expr */ + 206, /* (195) expr ::= BITNOT expr */ + 206, /* (196) expr ::= PLUS|MINUS expr */ + 260, /* (197) between_op ::= BETWEEN */ + 260, /* (198) between_op ::= NOT BETWEEN */ + 206, /* (199) expr ::= expr between_op expr AND expr */ + 261, /* (200) in_op ::= IN */ + 261, /* (201) in_op ::= NOT IN */ + 206, /* (202) expr ::= expr in_op LP exprlist RP */ + 206, /* (203) expr ::= LP select RP */ + 206, /* (204) expr ::= expr in_op LP select RP */ + 206, /* (205) expr ::= expr in_op nm dbnm paren_exprlist */ + 206, /* (206) expr ::= EXISTS LP select RP */ + 206, /* (207) expr ::= CASE case_operand case_exprlist case_else END */ + 264, /* (208) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + 264, /* (209) case_exprlist ::= WHEN expr THEN expr */ + 265, /* (210) case_else ::= ELSE expr */ + 265, /* (211) case_else ::= */ + 263, /* (212) case_operand ::= expr */ + 263, /* (213) case_operand ::= */ + 250, /* (214) exprlist ::= */ + 241, /* (215) nexprlist ::= nexprlist COMMA expr */ + 241, /* (216) nexprlist ::= expr */ + 262, /* (217) paren_exprlist ::= */ + 262, /* (218) paren_exprlist ::= LP exprlist RP */ + 181, /* (219) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + 266, /* (220) uniqueflag ::= UNIQUE */ + 266, /* (221) uniqueflag ::= */ + 210, /* (222) eidlist_opt ::= */ + 210, /* (223) eidlist_opt ::= LP eidlist RP */ + 220, /* (224) eidlist ::= eidlist COMMA nm collate sortorder */ + 220, /* (225) eidlist ::= nm collate sortorder */ + 267, /* (226) collate ::= */ + 267, /* (227) collate ::= COLLATE ID|STRING */ + 181, /* (228) cmd ::= DROP INDEX ifexists fullname */ + 181, /* (229) cmd ::= VACUUM vinto */ + 181, /* (230) cmd ::= VACUUM nm vinto */ + 268, /* (231) vinto ::= INTO expr */ + 268, /* (232) vinto ::= */ + 181, /* (233) cmd ::= PRAGMA nm dbnm */ + 181, /* (234) cmd ::= PRAGMA nm dbnm EQ nmnum */ + 181, /* (235) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + 181, /* (236) cmd ::= PRAGMA nm dbnm EQ minus_num */ + 181, /* (237) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + 201, /* (238) plus_num ::= PLUS INTEGER|FLOAT */ + 202, /* (239) minus_num ::= MINUS INTEGER|FLOAT */ + 181, /* (240) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + 270, /* (241) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + 272, /* (242) trigger_time ::= BEFORE|AFTER */ + 272, /* (243) trigger_time ::= INSTEAD OF */ + 272, /* (244) trigger_time ::= */ + 273, /* (245) trigger_event ::= DELETE|INSERT */ + 273, /* (246) trigger_event ::= UPDATE */ + 273, /* (247) trigger_event ::= UPDATE OF idlist */ + 275, /* (248) when_clause ::= */ + 275, /* (249) when_clause ::= WHEN expr */ + 271, /* (250) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + 271, /* (251) trigger_cmd_list ::= trigger_cmd SEMI */ + 277, /* (252) trnm ::= nm DOT nm */ + 278, /* (253) tridxby ::= INDEXED BY nm */ + 278, /* (254) tridxby ::= NOT INDEXED */ + 276, /* (255) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ + 276, /* (256) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + 276, /* (257) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + 276, /* (258) trigger_cmd ::= scanpt select scanpt */ + 206, /* (259) expr ::= RAISE LP IGNORE RP */ + 206, /* (260) expr ::= RAISE LP raisetype COMMA nm RP */ + 224, /* (261) raisetype ::= ROLLBACK */ + 224, /* (262) raisetype ::= ABORT */ + 224, /* (263) raisetype ::= FAIL */ + 181, /* (264) cmd ::= DROP TRIGGER ifexists fullname */ + 181, /* (265) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + 181, /* (266) cmd ::= DETACH database_kw_opt expr */ + 280, /* (267) key_opt ::= */ + 280, /* (268) key_opt ::= KEY expr */ + 181, /* (269) cmd ::= REINDEX */ + 181, /* (270) cmd ::= REINDEX nm dbnm */ + 181, /* (271) cmd ::= ANALYZE */ + 181, /* (272) cmd ::= ANALYZE nm dbnm */ + 181, /* (273) cmd ::= ALTER TABLE fullname RENAME TO nm */ + 181, /* (274) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + 281, /* (275) add_column_fullname ::= fullname */ + 181, /* (276) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + 181, /* (277) cmd ::= create_vtab */ + 181, /* (278) cmd ::= create_vtab LP vtabarglist RP */ + 283, /* (279) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 285, /* (280) vtabarg ::= */ + 286, /* (281) vtabargtoken ::= ANY */ + 286, /* (282) vtabargtoken ::= lp anylist RP */ + 287, /* (283) lp ::= LP */ + 253, /* (284) with ::= WITH wqlist */ + 253, /* (285) with ::= WITH RECURSIVE wqlist */ + 229, /* (286) wqlist ::= nm eidlist_opt AS LP select RP */ + 229, /* (287) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ + 289, /* (288) windowdefn_list ::= windowdefn */ + 289, /* (289) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + 290, /* (290) windowdefn ::= nm AS LP window RP */ + 291, /* (291) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + 291, /* (292) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + 291, /* (293) window ::= ORDER BY sortlist frame_opt */ + 291, /* (294) window ::= nm ORDER BY sortlist frame_opt */ + 291, /* (295) window ::= frame_opt */ + 291, /* (296) window ::= nm frame_opt */ + 292, /* (297) frame_opt ::= */ + 292, /* (298) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + 292, /* (299) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + 295, /* (300) range_or_rows ::= RANGE|ROWS|GROUPS */ + 297, /* (301) frame_bound_s ::= frame_bound */ + 297, /* (302) frame_bound_s ::= UNBOUNDED PRECEDING */ + 298, /* (303) frame_bound_e ::= frame_bound */ + 298, /* (304) frame_bound_e ::= UNBOUNDED FOLLOWING */ + 296, /* (305) frame_bound ::= expr PRECEDING|FOLLOWING */ + 296, /* (306) frame_bound ::= CURRENT ROW */ + 299, /* (307) frame_exclude_opt ::= */ + 299, /* (308) frame_exclude_opt ::= EXCLUDE frame_exclude */ + 300, /* (309) frame_exclude ::= NO OTHERS */ + 300, /* (310) frame_exclude ::= CURRENT ROW */ + 300, /* (311) frame_exclude ::= GROUP|TIES */ + 239, /* (312) window_clause ::= WINDOW windowdefn_list */ + 258, /* (313) over_clause ::= filter_opt OVER LP window RP */ + 258, /* (314) over_clause ::= filter_opt OVER nm */ + 294, /* (315) filter_opt ::= */ + 294, /* (316) filter_opt ::= FILTER LP WHERE expr RP */ + 176, /* (317) input ::= cmdlist */ + 177, /* (318) cmdlist ::= cmdlist ecmd */ + 177, /* (319) cmdlist ::= ecmd */ + 178, /* (320) ecmd ::= SEMI */ + 178, /* (321) ecmd ::= cmdx SEMI */ + 178, /* (322) ecmd ::= explain cmdx */ + 183, /* (323) trans_opt ::= */ + 183, /* (324) trans_opt ::= TRANSACTION */ + 183, /* (325) trans_opt ::= TRANSACTION nm */ + 185, /* (326) savepoint_opt ::= SAVEPOINT */ + 185, /* (327) savepoint_opt ::= */ + 181, /* (328) cmd ::= create_table create_table_args */ + 192, /* (329) columnlist ::= columnlist COMMA columnname carglist */ + 192, /* (330) columnlist ::= columnname carglist */ + 184, /* (331) nm ::= ID|INDEXED */ + 184, /* (332) nm ::= STRING */ + 184, /* (333) nm ::= JOIN_KW */ + 198, /* (334) typetoken ::= typename */ + 199, /* (335) typename ::= ID|STRING */ + 200, /* (336) signed ::= plus_num */ + 200, /* (337) signed ::= minus_num */ + 197, /* (338) carglist ::= carglist ccons */ + 197, /* (339) carglist ::= */ + 204, /* (340) ccons ::= NULL onconf */ + 193, /* (341) conslist_opt ::= COMMA conslist */ + 216, /* (342) conslist ::= conslist tconscomma tcons */ + 216, /* (343) conslist ::= tcons */ + 217, /* (344) tconscomma ::= */ + 221, /* (345) defer_subclause_opt ::= defer_subclause */ + 223, /* (346) resolvetype ::= raisetype */ + 227, /* (347) selectnowith ::= oneselect */ + 228, /* (348) oneselect ::= values */ + 242, /* (349) sclp ::= selcollist COMMA */ + 243, /* (350) as ::= ID|STRING */ + 206, /* (351) expr ::= term */ + 259, /* (352) likeop ::= LIKE_KW|MATCH */ + 250, /* (353) exprlist ::= nexprlist */ + 269, /* (354) nmnum ::= plus_num */ + 269, /* (355) nmnum ::= nm */ + 269, /* (356) nmnum ::= ON */ + 269, /* (357) nmnum ::= DELETE */ + 269, /* (358) nmnum ::= DEFAULT */ + 201, /* (359) plus_num ::= INTEGER|FLOAT */ + 274, /* (360) foreach_clause ::= */ + 274, /* (361) foreach_clause ::= FOR EACH ROW */ + 277, /* (362) trnm ::= nm */ + 278, /* (363) tridxby ::= */ + 279, /* (364) database_kw_opt ::= DATABASE */ + 279, /* (365) database_kw_opt ::= */ + 282, /* (366) kwcolumn_opt ::= */ + 282, /* (367) kwcolumn_opt ::= COLUMNKW */ + 284, /* (368) vtabarglist ::= vtabarg */ + 284, /* (369) vtabarglist ::= vtabarglist COMMA vtabarg */ + 285, /* (370) vtabarg ::= vtabarg vtabargtoken */ + 288, /* (371) anylist ::= */ + 288, /* (372) anylist ::= anylist LP anylist RP */ + 288, /* (373) anylist ::= anylist ANY */ + 253, /* (374) with ::= */ +}; + +/* For rule J, yyRuleInfoNRhs[J] contains the negative of the number +** of symbols on the right-hand side of that rule. */ +static const signed char yyRuleInfoNRhs[] = { + -1, /* (0) explain ::= EXPLAIN */ + -3, /* (1) explain ::= EXPLAIN QUERY PLAN */ + -1, /* (2) cmdx ::= cmd */ + -3, /* (3) cmd ::= BEGIN transtype trans_opt */ + 0, /* (4) transtype ::= */ + -1, /* (5) transtype ::= DEFERRED */ + -1, /* (6) transtype ::= IMMEDIATE */ + -1, /* (7) transtype ::= EXCLUSIVE */ + -2, /* (8) cmd ::= COMMIT|END trans_opt */ + -2, /* (9) cmd ::= ROLLBACK trans_opt */ + -2, /* (10) cmd ::= SAVEPOINT nm */ + -3, /* (11) cmd ::= RELEASE savepoint_opt nm */ + -5, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ + -6, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ + -1, /* (14) createkw ::= CREATE */ + 0, /* (15) ifnotexists ::= */ + -3, /* (16) ifnotexists ::= IF NOT EXISTS */ + -1, /* (17) temp ::= TEMP */ + 0, /* (18) temp ::= */ + -5, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */ + -2, /* (20) create_table_args ::= AS select */ + 0, /* (21) table_options ::= */ + -2, /* (22) table_options ::= WITHOUT nm */ + -2, /* (23) columnname ::= nm typetoken */ + 0, /* (24) typetoken ::= */ + -4, /* (25) typetoken ::= typename LP signed RP */ + -6, /* (26) typetoken ::= typename LP signed COMMA signed RP */ + -2, /* (27) typename ::= typename ID|STRING */ + 0, /* (28) scanpt ::= */ + -2, /* (29) ccons ::= CONSTRAINT nm */ + -4, /* (30) ccons ::= DEFAULT scanpt term scanpt */ + -4, /* (31) ccons ::= DEFAULT LP expr RP */ + -4, /* (32) ccons ::= DEFAULT PLUS term scanpt */ + -4, /* (33) ccons ::= DEFAULT MINUS term scanpt */ + -3, /* (34) ccons ::= DEFAULT scanpt ID|INDEXED */ + -3, /* (35) ccons ::= NOT NULL onconf */ + -5, /* (36) ccons ::= PRIMARY KEY sortorder onconf autoinc */ + -2, /* (37) ccons ::= UNIQUE onconf */ + -4, /* (38) ccons ::= CHECK LP expr RP */ + -4, /* (39) ccons ::= REFERENCES nm eidlist_opt refargs */ + -1, /* (40) ccons ::= defer_subclause */ + -2, /* (41) ccons ::= COLLATE ID|STRING */ + 0, /* (42) autoinc ::= */ + -1, /* (43) autoinc ::= AUTOINCR */ + 0, /* (44) refargs ::= */ + -2, /* (45) refargs ::= refargs refarg */ + -2, /* (46) refarg ::= MATCH nm */ + -3, /* (47) refarg ::= ON INSERT refact */ + -3, /* (48) refarg ::= ON DELETE refact */ + -3, /* (49) refarg ::= ON UPDATE refact */ + -2, /* (50) refact ::= SET NULL */ + -2, /* (51) refact ::= SET DEFAULT */ + -1, /* (52) refact ::= CASCADE */ + -1, /* (53) refact ::= RESTRICT */ + -2, /* (54) refact ::= NO ACTION */ + -3, /* (55) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ + -2, /* (56) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + 0, /* (57) init_deferred_pred_opt ::= */ + -2, /* (58) init_deferred_pred_opt ::= INITIALLY DEFERRED */ + -2, /* (59) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ + 0, /* (60) conslist_opt ::= */ + -1, /* (61) tconscomma ::= COMMA */ + -2, /* (62) tcons ::= CONSTRAINT nm */ + -7, /* (63) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ + -5, /* (64) tcons ::= UNIQUE LP sortlist RP onconf */ + -5, /* (65) tcons ::= CHECK LP expr RP onconf */ + -10, /* (66) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ + 0, /* (67) defer_subclause_opt ::= */ + 0, /* (68) onconf ::= */ + -3, /* (69) onconf ::= ON CONFLICT resolvetype */ + 0, /* (70) orconf ::= */ + -2, /* (71) orconf ::= OR resolvetype */ + -1, /* (72) resolvetype ::= IGNORE */ + -1, /* (73) resolvetype ::= REPLACE */ + -4, /* (74) cmd ::= DROP TABLE ifexists fullname */ + -2, /* (75) ifexists ::= IF EXISTS */ + 0, /* (76) ifexists ::= */ + -9, /* (77) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ + -4, /* (78) cmd ::= DROP VIEW ifexists fullname */ + -1, /* (79) cmd ::= select */ + -3, /* (80) select ::= WITH wqlist selectnowith */ + -4, /* (81) select ::= WITH RECURSIVE wqlist selectnowith */ + -1, /* (82) select ::= selectnowith */ + -3, /* (83) selectnowith ::= selectnowith multiselect_op oneselect */ + -1, /* (84) multiselect_op ::= UNION */ + -2, /* (85) multiselect_op ::= UNION ALL */ + -1, /* (86) multiselect_op ::= EXCEPT|INTERSECT */ + -9, /* (87) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + -10, /* (88) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ + -4, /* (89) values ::= VALUES LP nexprlist RP */ + -5, /* (90) values ::= values COMMA LP nexprlist RP */ + -1, /* (91) distinct ::= DISTINCT */ + -1, /* (92) distinct ::= ALL */ + 0, /* (93) distinct ::= */ + 0, /* (94) sclp ::= */ + -5, /* (95) selcollist ::= sclp scanpt expr scanpt as */ + -3, /* (96) selcollist ::= sclp scanpt STAR */ + -5, /* (97) selcollist ::= sclp scanpt nm DOT STAR */ + -2, /* (98) as ::= AS nm */ + 0, /* (99) as ::= */ + 0, /* (100) from ::= */ + -2, /* (101) from ::= FROM seltablist */ + -2, /* (102) stl_prefix ::= seltablist joinop */ + 0, /* (103) stl_prefix ::= */ + -7, /* (104) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + -9, /* (105) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ + -7, /* (106) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + -7, /* (107) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + 0, /* (108) dbnm ::= */ + -2, /* (109) dbnm ::= DOT nm */ + -1, /* (110) fullname ::= nm */ + -3, /* (111) fullname ::= nm DOT nm */ + -1, /* (112) xfullname ::= nm */ + -3, /* (113) xfullname ::= nm DOT nm */ + -5, /* (114) xfullname ::= nm DOT nm AS nm */ + -3, /* (115) xfullname ::= nm AS nm */ + -1, /* (116) joinop ::= COMMA|JOIN */ + -2, /* (117) joinop ::= JOIN_KW JOIN */ + -3, /* (118) joinop ::= JOIN_KW nm JOIN */ + -4, /* (119) joinop ::= JOIN_KW nm nm JOIN */ + -2, /* (120) on_opt ::= ON expr */ + 0, /* (121) on_opt ::= */ + 0, /* (122) indexed_opt ::= */ + -3, /* (123) indexed_opt ::= INDEXED BY nm */ + -2, /* (124) indexed_opt ::= NOT INDEXED */ + -4, /* (125) using_opt ::= USING LP idlist RP */ + 0, /* (126) using_opt ::= */ + 0, /* (127) orderby_opt ::= */ + -3, /* (128) orderby_opt ::= ORDER BY sortlist */ + -4, /* (129) sortlist ::= sortlist COMMA expr sortorder */ + -2, /* (130) sortlist ::= expr sortorder */ + -1, /* (131) sortorder ::= ASC */ + -1, /* (132) sortorder ::= DESC */ + 0, /* (133) sortorder ::= */ + 0, /* (134) groupby_opt ::= */ + -3, /* (135) groupby_opt ::= GROUP BY nexprlist */ + 0, /* (136) having_opt ::= */ + -2, /* (137) having_opt ::= HAVING expr */ + 0, /* (138) limit_opt ::= */ + -2, /* (139) limit_opt ::= LIMIT expr */ + -4, /* (140) limit_opt ::= LIMIT expr OFFSET expr */ + -4, /* (141) limit_opt ::= LIMIT expr COMMA expr */ + -6, /* (142) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ + 0, /* (143) where_opt ::= */ + -2, /* (144) where_opt ::= WHERE expr */ + -8, /* (145) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ + -5, /* (146) setlist ::= setlist COMMA nm EQ expr */ + -7, /* (147) setlist ::= setlist COMMA LP idlist RP EQ expr */ + -3, /* (148) setlist ::= nm EQ expr */ + -5, /* (149) setlist ::= LP idlist RP EQ expr */ + -7, /* (150) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + -7, /* (151) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ + 0, /* (152) upsert ::= */ + -11, /* (153) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ + -8, /* (154) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ + -4, /* (155) upsert ::= ON CONFLICT DO NOTHING */ + -2, /* (156) insert_cmd ::= INSERT orconf */ + -1, /* (157) insert_cmd ::= REPLACE */ + 0, /* (158) idlist_opt ::= */ + -3, /* (159) idlist_opt ::= LP idlist RP */ + -3, /* (160) idlist ::= idlist COMMA nm */ + -1, /* (161) idlist ::= nm */ + -3, /* (162) expr ::= LP expr RP */ + -1, /* (163) expr ::= ID|INDEXED */ + -1, /* (164) expr ::= JOIN_KW */ + -3, /* (165) expr ::= nm DOT nm */ + -5, /* (166) expr ::= nm DOT nm DOT nm */ + -1, /* (167) term ::= NULL|FLOAT|BLOB */ + -1, /* (168) term ::= STRING */ + -1, /* (169) term ::= INTEGER */ + -1, /* (170) expr ::= VARIABLE */ + -3, /* (171) expr ::= expr COLLATE ID|STRING */ + -6, /* (172) expr ::= CAST LP expr AS typetoken RP */ + -5, /* (173) expr ::= ID|INDEXED LP distinct exprlist RP */ + -4, /* (174) expr ::= ID|INDEXED LP STAR RP */ + -6, /* (175) expr ::= ID|INDEXED LP distinct exprlist RP over_clause */ + -5, /* (176) expr ::= ID|INDEXED LP STAR RP over_clause */ + -1, /* (177) term ::= CTIME_KW */ + -5, /* (178) expr ::= LP nexprlist COMMA expr RP */ + -3, /* (179) expr ::= expr AND expr */ + -3, /* (180) expr ::= expr OR expr */ + -3, /* (181) expr ::= expr LT|GT|GE|LE expr */ + -3, /* (182) expr ::= expr EQ|NE expr */ + -3, /* (183) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ + -3, /* (184) expr ::= expr PLUS|MINUS expr */ + -3, /* (185) expr ::= expr STAR|SLASH|REM expr */ + -3, /* (186) expr ::= expr CONCAT expr */ + -2, /* (187) likeop ::= NOT LIKE_KW|MATCH */ + -3, /* (188) expr ::= expr likeop expr */ + -5, /* (189) expr ::= expr likeop expr ESCAPE expr */ + -2, /* (190) expr ::= expr ISNULL|NOTNULL */ + -3, /* (191) expr ::= expr NOT NULL */ + -3, /* (192) expr ::= expr IS expr */ + -4, /* (193) expr ::= expr IS NOT expr */ + -2, /* (194) expr ::= NOT expr */ + -2, /* (195) expr ::= BITNOT expr */ + -2, /* (196) expr ::= PLUS|MINUS expr */ + -1, /* (197) between_op ::= BETWEEN */ + -2, /* (198) between_op ::= NOT BETWEEN */ + -5, /* (199) expr ::= expr between_op expr AND expr */ + -1, /* (200) in_op ::= IN */ + -2, /* (201) in_op ::= NOT IN */ + -5, /* (202) expr ::= expr in_op LP exprlist RP */ + -3, /* (203) expr ::= LP select RP */ + -5, /* (204) expr ::= expr in_op LP select RP */ + -5, /* (205) expr ::= expr in_op nm dbnm paren_exprlist */ + -4, /* (206) expr ::= EXISTS LP select RP */ + -5, /* (207) expr ::= CASE case_operand case_exprlist case_else END */ + -5, /* (208) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + -4, /* (209) case_exprlist ::= WHEN expr THEN expr */ + -2, /* (210) case_else ::= ELSE expr */ + 0, /* (211) case_else ::= */ + -1, /* (212) case_operand ::= expr */ + 0, /* (213) case_operand ::= */ + 0, /* (214) exprlist ::= */ + -3, /* (215) nexprlist ::= nexprlist COMMA expr */ + -1, /* (216) nexprlist ::= expr */ + 0, /* (217) paren_exprlist ::= */ + -3, /* (218) paren_exprlist ::= LP exprlist RP */ + -12, /* (219) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + -1, /* (220) uniqueflag ::= UNIQUE */ + 0, /* (221) uniqueflag ::= */ + 0, /* (222) eidlist_opt ::= */ + -3, /* (223) eidlist_opt ::= LP eidlist RP */ + -5, /* (224) eidlist ::= eidlist COMMA nm collate sortorder */ + -3, /* (225) eidlist ::= nm collate sortorder */ + 0, /* (226) collate ::= */ + -2, /* (227) collate ::= COLLATE ID|STRING */ + -4, /* (228) cmd ::= DROP INDEX ifexists fullname */ + -2, /* (229) cmd ::= VACUUM vinto */ + -3, /* (230) cmd ::= VACUUM nm vinto */ + -2, /* (231) vinto ::= INTO expr */ + 0, /* (232) vinto ::= */ + -3, /* (233) cmd ::= PRAGMA nm dbnm */ + -5, /* (234) cmd ::= PRAGMA nm dbnm EQ nmnum */ + -6, /* (235) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + -5, /* (236) cmd ::= PRAGMA nm dbnm EQ minus_num */ + -6, /* (237) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + -2, /* (238) plus_num ::= PLUS INTEGER|FLOAT */ + -2, /* (239) minus_num ::= MINUS INTEGER|FLOAT */ + -5, /* (240) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + -11, /* (241) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + -1, /* (242) trigger_time ::= BEFORE|AFTER */ + -2, /* (243) trigger_time ::= INSTEAD OF */ + 0, /* (244) trigger_time ::= */ + -1, /* (245) trigger_event ::= DELETE|INSERT */ + -1, /* (246) trigger_event ::= UPDATE */ + -3, /* (247) trigger_event ::= UPDATE OF idlist */ + 0, /* (248) when_clause ::= */ + -2, /* (249) when_clause ::= WHEN expr */ + -3, /* (250) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + -2, /* (251) trigger_cmd_list ::= trigger_cmd SEMI */ + -3, /* (252) trnm ::= nm DOT nm */ + -3, /* (253) tridxby ::= INDEXED BY nm */ + -2, /* (254) tridxby ::= NOT INDEXED */ + -8, /* (255) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ + -8, /* (256) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + -6, /* (257) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + -3, /* (258) trigger_cmd ::= scanpt select scanpt */ + -4, /* (259) expr ::= RAISE LP IGNORE RP */ + -6, /* (260) expr ::= RAISE LP raisetype COMMA nm RP */ + -1, /* (261) raisetype ::= ROLLBACK */ + -1, /* (262) raisetype ::= ABORT */ + -1, /* (263) raisetype ::= FAIL */ + -4, /* (264) cmd ::= DROP TRIGGER ifexists fullname */ + -6, /* (265) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + -3, /* (266) cmd ::= DETACH database_kw_opt expr */ + 0, /* (267) key_opt ::= */ + -2, /* (268) key_opt ::= KEY expr */ + -1, /* (269) cmd ::= REINDEX */ + -3, /* (270) cmd ::= REINDEX nm dbnm */ + -1, /* (271) cmd ::= ANALYZE */ + -3, /* (272) cmd ::= ANALYZE nm dbnm */ + -6, /* (273) cmd ::= ALTER TABLE fullname RENAME TO nm */ + -7, /* (274) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + -1, /* (275) add_column_fullname ::= fullname */ + -8, /* (276) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + -1, /* (277) cmd ::= create_vtab */ + -4, /* (278) cmd ::= create_vtab LP vtabarglist RP */ + -8, /* (279) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 0, /* (280) vtabarg ::= */ + -1, /* (281) vtabargtoken ::= ANY */ + -3, /* (282) vtabargtoken ::= lp anylist RP */ + -1, /* (283) lp ::= LP */ + -2, /* (284) with ::= WITH wqlist */ + -3, /* (285) with ::= WITH RECURSIVE wqlist */ + -6, /* (286) wqlist ::= nm eidlist_opt AS LP select RP */ + -8, /* (287) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ + -1, /* (288) windowdefn_list ::= windowdefn */ + -3, /* (289) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + -5, /* (290) windowdefn ::= nm AS LP window RP */ + -5, /* (291) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + -6, /* (292) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + -4, /* (293) window ::= ORDER BY sortlist frame_opt */ + -5, /* (294) window ::= nm ORDER BY sortlist frame_opt */ + -1, /* (295) window ::= frame_opt */ + -2, /* (296) window ::= nm frame_opt */ + 0, /* (297) frame_opt ::= */ + -3, /* (298) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + -6, /* (299) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + -1, /* (300) range_or_rows ::= RANGE|ROWS|GROUPS */ + -1, /* (301) frame_bound_s ::= frame_bound */ + -2, /* (302) frame_bound_s ::= UNBOUNDED PRECEDING */ + -1, /* (303) frame_bound_e ::= frame_bound */ + -2, /* (304) frame_bound_e ::= UNBOUNDED FOLLOWING */ + -2, /* (305) frame_bound ::= expr PRECEDING|FOLLOWING */ + -2, /* (306) frame_bound ::= CURRENT ROW */ + 0, /* (307) frame_exclude_opt ::= */ + -2, /* (308) frame_exclude_opt ::= EXCLUDE frame_exclude */ + -2, /* (309) frame_exclude ::= NO OTHERS */ + -2, /* (310) frame_exclude ::= CURRENT ROW */ + -1, /* (311) frame_exclude ::= GROUP|TIES */ + -2, /* (312) window_clause ::= WINDOW windowdefn_list */ + -5, /* (313) over_clause ::= filter_opt OVER LP window RP */ + -3, /* (314) over_clause ::= filter_opt OVER nm */ + 0, /* (315) filter_opt ::= */ + -5, /* (316) filter_opt ::= FILTER LP WHERE expr RP */ + -1, /* (317) input ::= cmdlist */ + -2, /* (318) cmdlist ::= cmdlist ecmd */ + -1, /* (319) cmdlist ::= ecmd */ + -1, /* (320) ecmd ::= SEMI */ + -2, /* (321) ecmd ::= cmdx SEMI */ + -2, /* (322) ecmd ::= explain cmdx */ + 0, /* (323) trans_opt ::= */ + -1, /* (324) trans_opt ::= TRANSACTION */ + -2, /* (325) trans_opt ::= TRANSACTION nm */ + -1, /* (326) savepoint_opt ::= SAVEPOINT */ + 0, /* (327) savepoint_opt ::= */ + -2, /* (328) cmd ::= create_table create_table_args */ + -4, /* (329) columnlist ::= columnlist COMMA columnname carglist */ + -2, /* (330) columnlist ::= columnname carglist */ + -1, /* (331) nm ::= ID|INDEXED */ + -1, /* (332) nm ::= STRING */ + -1, /* (333) nm ::= JOIN_KW */ + -1, /* (334) typetoken ::= typename */ + -1, /* (335) typename ::= ID|STRING */ + -1, /* (336) signed ::= plus_num */ + -1, /* (337) signed ::= minus_num */ + -2, /* (338) carglist ::= carglist ccons */ + 0, /* (339) carglist ::= */ + -2, /* (340) ccons ::= NULL onconf */ + -2, /* (341) conslist_opt ::= COMMA conslist */ + -3, /* (342) conslist ::= conslist tconscomma tcons */ + -1, /* (343) conslist ::= tcons */ + 0, /* (344) tconscomma ::= */ + -1, /* (345) defer_subclause_opt ::= defer_subclause */ + -1, /* (346) resolvetype ::= raisetype */ + -1, /* (347) selectnowith ::= oneselect */ + -1, /* (348) oneselect ::= values */ + -2, /* (349) sclp ::= selcollist COMMA */ + -1, /* (350) as ::= ID|STRING */ + -1, /* (351) expr ::= term */ + -1, /* (352) likeop ::= LIKE_KW|MATCH */ + -1, /* (353) exprlist ::= nexprlist */ + -1, /* (354) nmnum ::= plus_num */ + -1, /* (355) nmnum ::= nm */ + -1, /* (356) nmnum ::= ON */ + -1, /* (357) nmnum ::= DELETE */ + -1, /* (358) nmnum ::= DEFAULT */ + -1, /* (359) plus_num ::= INTEGER|FLOAT */ + 0, /* (360) foreach_clause ::= */ + -3, /* (361) foreach_clause ::= FOR EACH ROW */ + -1, /* (362) trnm ::= nm */ + 0, /* (363) tridxby ::= */ + -1, /* (364) database_kw_opt ::= DATABASE */ + 0, /* (365) database_kw_opt ::= */ + 0, /* (366) kwcolumn_opt ::= */ + -1, /* (367) kwcolumn_opt ::= COLUMNKW */ + -1, /* (368) vtabarglist ::= vtabarg */ + -3, /* (369) vtabarglist ::= vtabarglist COMMA vtabarg */ + -2, /* (370) vtabarg ::= vtabarg vtabargtoken */ + 0, /* (371) anylist ::= */ + -4, /* (372) anylist ::= anylist LP anylist RP */ + -2, /* (373) anylist ::= anylist ANY */ + 0, /* (374) with ::= */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -149483,7 +151256,7 @@ static YYACTIONTYPE yy_reduce( yymsp = yypParser->yytos; #ifndef NDEBUG if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ - yysize = yyRuleInfo[yyruleno].nrhs; + yysize = yyRuleInfoNRhs[yyruleno]; if( yysize ){ fprintf(yyTraceFILE, "%sReduce %d [%s], go to state %d.\n", yyTracePrompt, @@ -149498,7 +151271,7 @@ static YYACTIONTYPE yy_reduce( /* Check that the stack is large enough to grow by a single entry ** if the RHS of the rule is empty. This ensures that there is room ** enough on the stack to push the LHS value */ - if( yyRuleInfo[yyruleno].nrhs==0 ){ + if( yyRuleInfoNRhs[yyruleno]==0 ){ #ifdef YYTRACKMAXSTACKDEPTH if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ yypParser->yyhwm++; @@ -149548,15 +151321,16 @@ static YYACTIONTYPE yy_reduce( { sqlite3FinishCoding(pParse); } break; case 3: /* cmd ::= BEGIN transtype trans_opt */ -{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy70);} +{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy494);} break; case 4: /* transtype ::= */ -{yymsp[1].minor.yy70 = TK_DEFERRED;} +{yymsp[1].minor.yy494 = TK_DEFERRED;} break; case 5: /* transtype ::= DEFERRED */ case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); -{yymsp[0].minor.yy70 = yymsp[0].major; /*A-overwrites-X*/} + case 300: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==300); +{yymsp[0].minor.yy494 = yymsp[0].major; /*A-overwrites-X*/} break; case 8: /* cmd ::= COMMIT|END trans_opt */ case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9); @@ -149579,7 +151353,7 @@ static YYACTIONTYPE yy_reduce( break; case 13: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ { - sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy70,0,0,yymsp[-2].minor.yy70); + sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy494,0,0,yymsp[-2].minor.yy494); } break; case 14: /* createkw ::= CREATE */ @@ -149594,32 +151368,32 @@ static YYACTIONTYPE yy_reduce( case 76: /* ifexists ::= */ yytestcase(yyruleno==76); case 93: /* distinct ::= */ yytestcase(yyruleno==93); case 226: /* collate ::= */ yytestcase(yyruleno==226); -{yymsp[1].minor.yy70 = 0;} +{yymsp[1].minor.yy494 = 0;} break; case 16: /* ifnotexists ::= IF NOT EXISTS */ -{yymsp[-2].minor.yy70 = 1;} +{yymsp[-2].minor.yy494 = 1;} break; case 17: /* temp ::= TEMP */ case 43: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==43); -{yymsp[0].minor.yy70 = 1;} +{yymsp[0].minor.yy494 = 1;} break; case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_options */ { - sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy70,0); + sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy494,0); } break; case 20: /* create_table_args ::= AS select */ { - sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy489); - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy489); + sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy457); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy457); } break; case 22: /* table_options ::= WITHOUT nm */ { if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){ - yymsp[-1].minor.yy70 = TF_WithoutRowid | TF_NoVisibleRowid; + yymsp[-1].minor.yy494 = TF_WithoutRowid | TF_NoVisibleRowid; }else{ - yymsp[-1].minor.yy70 = 0; + yymsp[-1].minor.yy494 = 0; sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); } } @@ -149648,7 +151422,7 @@ static YYACTIONTYPE yy_reduce( case 28: /* scanpt ::= */ { assert( yyLookahead!=YYNOCODE ); - yymsp[1].minor.yy392 = yyLookaheadToken.z; + yymsp[1].minor.yy294 = yyLookaheadToken.z; } break; case 29: /* ccons ::= CONSTRAINT nm */ @@ -149656,18 +151430,18 @@ static YYACTIONTYPE yy_reduce( {pParse->constraintName = yymsp[0].minor.yy0;} break; case 30: /* ccons ::= DEFAULT scanpt term scanpt */ -{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy18,yymsp[-2].minor.yy392,yymsp[0].minor.yy392);} +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy524,yymsp[-2].minor.yy294,yymsp[0].minor.yy294);} break; case 31: /* ccons ::= DEFAULT LP expr RP */ -{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy18,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy524,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} break; case 32: /* ccons ::= DEFAULT PLUS term scanpt */ -{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy18,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy392);} +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy524,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy294);} break; case 33: /* ccons ::= DEFAULT MINUS term scanpt */ { - Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[-1].minor.yy18, 0); - sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy392); + Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[-1].minor.yy524, 0); + sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy294); } break; case 34: /* ccons ::= DEFAULT scanpt ID|INDEXED */ @@ -149681,170 +151455,170 @@ static YYACTIONTYPE yy_reduce( } break; case 35: /* ccons ::= NOT NULL onconf */ -{sqlite3AddNotNull(pParse, yymsp[0].minor.yy70);} +{sqlite3AddNotNull(pParse, yymsp[0].minor.yy494);} break; case 36: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ -{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy70,yymsp[0].minor.yy70,yymsp[-2].minor.yy70);} +{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy494,yymsp[0].minor.yy494,yymsp[-2].minor.yy494);} break; case 37: /* ccons ::= UNIQUE onconf */ -{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy70,0,0,0,0, +{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy494,0,0,0,0, SQLITE_IDXTYPE_UNIQUE);} break; case 38: /* ccons ::= CHECK LP expr RP */ -{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy18);} +{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy524);} break; case 39: /* ccons ::= REFERENCES nm eidlist_opt refargs */ -{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy420,yymsp[0].minor.yy70);} +{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy434,yymsp[0].minor.yy494);} break; case 40: /* ccons ::= defer_subclause */ -{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy70);} +{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy494);} break; case 41: /* ccons ::= COLLATE ID|STRING */ {sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);} break; case 44: /* refargs ::= */ -{ yymsp[1].minor.yy70 = OE_None*0x0101; /* EV: R-19803-45884 */} +{ yymsp[1].minor.yy494 = OE_None*0x0101; /* EV: R-19803-45884 */} break; case 45: /* refargs ::= refargs refarg */ -{ yymsp[-1].minor.yy70 = (yymsp[-1].minor.yy70 & ~yymsp[0].minor.yy111.mask) | yymsp[0].minor.yy111.value; } +{ yymsp[-1].minor.yy494 = (yymsp[-1].minor.yy494 & ~yymsp[0].minor.yy355.mask) | yymsp[0].minor.yy355.value; } break; case 46: /* refarg ::= MATCH nm */ -{ yymsp[-1].minor.yy111.value = 0; yymsp[-1].minor.yy111.mask = 0x000000; } +{ yymsp[-1].minor.yy355.value = 0; yymsp[-1].minor.yy355.mask = 0x000000; } break; case 47: /* refarg ::= ON INSERT refact */ -{ yymsp[-2].minor.yy111.value = 0; yymsp[-2].minor.yy111.mask = 0x000000; } +{ yymsp[-2].minor.yy355.value = 0; yymsp[-2].minor.yy355.mask = 0x000000; } break; case 48: /* refarg ::= ON DELETE refact */ -{ yymsp[-2].minor.yy111.value = yymsp[0].minor.yy70; yymsp[-2].minor.yy111.mask = 0x0000ff; } +{ yymsp[-2].minor.yy355.value = yymsp[0].minor.yy494; yymsp[-2].minor.yy355.mask = 0x0000ff; } break; case 49: /* refarg ::= ON UPDATE refact */ -{ yymsp[-2].minor.yy111.value = yymsp[0].minor.yy70<<8; yymsp[-2].minor.yy111.mask = 0x00ff00; } +{ yymsp[-2].minor.yy355.value = yymsp[0].minor.yy494<<8; yymsp[-2].minor.yy355.mask = 0x00ff00; } break; case 50: /* refact ::= SET NULL */ -{ yymsp[-1].minor.yy70 = OE_SetNull; /* EV: R-33326-45252 */} +{ yymsp[-1].minor.yy494 = OE_SetNull; /* EV: R-33326-45252 */} break; case 51: /* refact ::= SET DEFAULT */ -{ yymsp[-1].minor.yy70 = OE_SetDflt; /* EV: R-33326-45252 */} +{ yymsp[-1].minor.yy494 = OE_SetDflt; /* EV: R-33326-45252 */} break; case 52: /* refact ::= CASCADE */ -{ yymsp[0].minor.yy70 = OE_Cascade; /* EV: R-33326-45252 */} +{ yymsp[0].minor.yy494 = OE_Cascade; /* EV: R-33326-45252 */} break; case 53: /* refact ::= RESTRICT */ -{ yymsp[0].minor.yy70 = OE_Restrict; /* EV: R-33326-45252 */} +{ yymsp[0].minor.yy494 = OE_Restrict; /* EV: R-33326-45252 */} break; case 54: /* refact ::= NO ACTION */ -{ yymsp[-1].minor.yy70 = OE_None; /* EV: R-33326-45252 */} +{ yymsp[-1].minor.yy494 = OE_None; /* EV: R-33326-45252 */} break; case 55: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ -{yymsp[-2].minor.yy70 = 0;} +{yymsp[-2].minor.yy494 = 0;} break; case 56: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ case 71: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==71); case 156: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==156); -{yymsp[-1].minor.yy70 = yymsp[0].minor.yy70;} +{yymsp[-1].minor.yy494 = yymsp[0].minor.yy494;} break; case 58: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ case 75: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==75); case 198: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==198); case 201: /* in_op ::= NOT IN */ yytestcase(yyruleno==201); case 227: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==227); -{yymsp[-1].minor.yy70 = 1;} +{yymsp[-1].minor.yy494 = 1;} break; case 59: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ -{yymsp[-1].minor.yy70 = 0;} +{yymsp[-1].minor.yy494 = 0;} break; case 61: /* tconscomma ::= COMMA */ {pParse->constraintName.n = 0;} break; case 63: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ -{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy420,yymsp[0].minor.yy70,yymsp[-2].minor.yy70,0);} +{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy434,yymsp[0].minor.yy494,yymsp[-2].minor.yy494,0);} break; case 64: /* tcons ::= UNIQUE LP sortlist RP onconf */ -{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy420,yymsp[0].minor.yy70,0,0,0,0, +{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy434,yymsp[0].minor.yy494,0,0,0,0, SQLITE_IDXTYPE_UNIQUE);} break; case 65: /* tcons ::= CHECK LP expr RP onconf */ -{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy18);} +{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy524);} break; case 66: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ { - sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy420, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy420, yymsp[-1].minor.yy70); - sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy70); + sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy434, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy434, yymsp[-1].minor.yy494); + sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy494); } break; case 68: /* onconf ::= */ case 70: /* orconf ::= */ yytestcase(yyruleno==70); -{yymsp[1].minor.yy70 = OE_Default;} +{yymsp[1].minor.yy494 = OE_Default;} break; case 69: /* onconf ::= ON CONFLICT resolvetype */ -{yymsp[-2].minor.yy70 = yymsp[0].minor.yy70;} +{yymsp[-2].minor.yy494 = yymsp[0].minor.yy494;} break; case 72: /* resolvetype ::= IGNORE */ -{yymsp[0].minor.yy70 = OE_Ignore;} +{yymsp[0].minor.yy494 = OE_Ignore;} break; case 73: /* resolvetype ::= REPLACE */ case 157: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==157); -{yymsp[0].minor.yy70 = OE_Replace;} +{yymsp[0].minor.yy494 = OE_Replace;} break; case 74: /* cmd ::= DROP TABLE ifexists fullname */ { - sqlite3DropTable(pParse, yymsp[0].minor.yy135, 0, yymsp[-1].minor.yy70); + sqlite3DropTable(pParse, yymsp[0].minor.yy483, 0, yymsp[-1].minor.yy494); } break; case 77: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ { - sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy420, yymsp[0].minor.yy489, yymsp[-7].minor.yy70, yymsp[-5].minor.yy70); + sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy434, yymsp[0].minor.yy457, yymsp[-7].minor.yy494, yymsp[-5].minor.yy494); } break; case 78: /* cmd ::= DROP VIEW ifexists fullname */ { - sqlite3DropTable(pParse, yymsp[0].minor.yy135, 1, yymsp[-1].minor.yy70); + sqlite3DropTable(pParse, yymsp[0].minor.yy483, 1, yymsp[-1].minor.yy494); } break; case 79: /* cmd ::= select */ { SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; - sqlite3Select(pParse, yymsp[0].minor.yy489, &dest); - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy489); + sqlite3Select(pParse, yymsp[0].minor.yy457, &dest); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy457); } break; case 80: /* select ::= WITH wqlist selectnowith */ { - Select *p = yymsp[0].minor.yy489; + Select *p = yymsp[0].minor.yy457; if( p ){ - p->pWith = yymsp[-1].minor.yy449; + p->pWith = yymsp[-1].minor.yy59; parserDoubleLinkSelect(pParse, p); }else{ - sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy449); + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy59); } - yymsp[-2].minor.yy489 = p; + yymsp[-2].minor.yy457 = p; } break; case 81: /* select ::= WITH RECURSIVE wqlist selectnowith */ { - Select *p = yymsp[0].minor.yy489; + Select *p = yymsp[0].minor.yy457; if( p ){ - p->pWith = yymsp[-1].minor.yy449; + p->pWith = yymsp[-1].minor.yy59; parserDoubleLinkSelect(pParse, p); }else{ - sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy449); + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy59); } - yymsp[-3].minor.yy489 = p; + yymsp[-3].minor.yy457 = p; } break; case 82: /* select ::= selectnowith */ { - Select *p = yymsp[0].minor.yy489; + Select *p = yymsp[0].minor.yy457; if( p ){ parserDoubleLinkSelect(pParse, p); } - yymsp[0].minor.yy489 = p; /*A-overwrites-X*/ + yymsp[0].minor.yy457 = p; /*A-overwrites-X*/ } break; case 83: /* selectnowith ::= selectnowith multiselect_op oneselect */ { - Select *pRhs = yymsp[0].minor.yy489; - Select *pLhs = yymsp[-2].minor.yy489; + Select *pRhs = yymsp[0].minor.yy457; + Select *pLhs = yymsp[-2].minor.yy457; if( pRhs && pRhs->pPrior ){ SrcList *pFrom; Token x; @@ -149854,63 +151628,63 @@ static YYACTIONTYPE yy_reduce( pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); } if( pRhs ){ - pRhs->op = (u8)yymsp[-1].minor.yy70; + pRhs->op = (u8)yymsp[-1].minor.yy494; pRhs->pPrior = pLhs; if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; pRhs->selFlags &= ~SF_MultiValue; - if( yymsp[-1].minor.yy70!=TK_ALL ) pParse->hasCompound = 1; + if( yymsp[-1].minor.yy494!=TK_ALL ) pParse->hasCompound = 1; }else{ sqlite3SelectDelete(pParse->db, pLhs); } - yymsp[-2].minor.yy489 = pRhs; + yymsp[-2].minor.yy457 = pRhs; } break; case 84: /* multiselect_op ::= UNION */ case 86: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==86); -{yymsp[0].minor.yy70 = yymsp[0].major; /*A-overwrites-OP*/} +{yymsp[0].minor.yy494 = yymsp[0].major; /*A-overwrites-OP*/} break; case 85: /* multiselect_op ::= UNION ALL */ -{yymsp[-1].minor.yy70 = TK_ALL;} +{yymsp[-1].minor.yy494 = TK_ALL;} break; case 87: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ { - yymsp[-8].minor.yy489 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy420,yymsp[-5].minor.yy135,yymsp[-4].minor.yy18,yymsp[-3].minor.yy420,yymsp[-2].minor.yy18,yymsp[-1].minor.yy420,yymsp[-7].minor.yy70,yymsp[0].minor.yy18); + yymsp[-8].minor.yy457 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy434,yymsp[-5].minor.yy483,yymsp[-4].minor.yy524,yymsp[-3].minor.yy434,yymsp[-2].minor.yy524,yymsp[-1].minor.yy434,yymsp[-7].minor.yy494,yymsp[0].minor.yy524); } break; case 88: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ { - yymsp[-9].minor.yy489 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy420,yymsp[-6].minor.yy135,yymsp[-5].minor.yy18,yymsp[-4].minor.yy420,yymsp[-3].minor.yy18,yymsp[-1].minor.yy420,yymsp[-8].minor.yy70,yymsp[0].minor.yy18); - if( yymsp[-9].minor.yy489 ){ - yymsp[-9].minor.yy489->pWinDefn = yymsp[-2].minor.yy327; + yymsp[-9].minor.yy457 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy434,yymsp[-6].minor.yy483,yymsp[-5].minor.yy524,yymsp[-4].minor.yy434,yymsp[-3].minor.yy524,yymsp[-1].minor.yy434,yymsp[-8].minor.yy494,yymsp[0].minor.yy524); + if( yymsp[-9].minor.yy457 ){ + yymsp[-9].minor.yy457->pWinDefn = yymsp[-2].minor.yy295; }else{ - sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy327); + sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy295); } } break; case 89: /* values ::= VALUES LP nexprlist RP */ { - yymsp[-3].minor.yy489 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy420,0,0,0,0,0,SF_Values,0); + yymsp[-3].minor.yy457 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy434,0,0,0,0,0,SF_Values,0); } break; case 90: /* values ::= values COMMA LP nexprlist RP */ { - Select *pRight, *pLeft = yymsp[-4].minor.yy489; - pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy420,0,0,0,0,0,SF_Values|SF_MultiValue,0); + Select *pRight, *pLeft = yymsp[-4].minor.yy457; + pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy434,0,0,0,0,0,SF_Values|SF_MultiValue,0); if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; if( pRight ){ pRight->op = TK_ALL; pRight->pPrior = pLeft; - yymsp[-4].minor.yy489 = pRight; + yymsp[-4].minor.yy457 = pRight; }else{ - yymsp[-4].minor.yy489 = pLeft; + yymsp[-4].minor.yy457 = pLeft; } } break; case 91: /* distinct ::= DISTINCT */ -{yymsp[0].minor.yy70 = SF_Distinct;} +{yymsp[0].minor.yy494 = SF_Distinct;} break; case 92: /* distinct ::= ALL */ -{yymsp[0].minor.yy70 = SF_All;} +{yymsp[0].minor.yy494 = SF_All;} break; case 94: /* sclp ::= */ case 127: /* orderby_opt ::= */ yytestcase(yyruleno==127); @@ -149918,19 +151692,19 @@ static YYACTIONTYPE yy_reduce( case 214: /* exprlist ::= */ yytestcase(yyruleno==214); case 217: /* paren_exprlist ::= */ yytestcase(yyruleno==217); case 222: /* eidlist_opt ::= */ yytestcase(yyruleno==222); -{yymsp[1].minor.yy420 = 0;} +{yymsp[1].minor.yy434 = 0;} break; case 95: /* selcollist ::= sclp scanpt expr scanpt as */ { - yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy420, yymsp[-2].minor.yy18); - if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy420, &yymsp[0].minor.yy0, 1); - sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy420,yymsp[-3].minor.yy392,yymsp[-1].minor.yy392); + yymsp[-4].minor.yy434 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy434, yymsp[-2].minor.yy524); + if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy434, &yymsp[0].minor.yy0, 1); + sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy434,yymsp[-3].minor.yy294,yymsp[-1].minor.yy294); } break; case 96: /* selcollist ::= sclp scanpt STAR */ { Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); - yymsp[-2].minor.yy420 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy420, p); + yymsp[-2].minor.yy434 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy434, p); } break; case 97: /* selcollist ::= sclp scanpt nm DOT STAR */ @@ -149938,70 +151712,76 @@ static YYACTIONTYPE yy_reduce( Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); - yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy420, pDot); + yymsp[-4].minor.yy434 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy434, pDot); } break; case 98: /* as ::= AS nm */ case 109: /* dbnm ::= DOT nm */ yytestcase(yyruleno==109); - case 236: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==236); - case 237: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==237); + case 238: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==238); + case 239: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==239); {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} break; case 100: /* from ::= */ -{yymsp[1].minor.yy135 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy135));} +{yymsp[1].minor.yy483 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy483));} break; case 101: /* from ::= FROM seltablist */ { - yymsp[-1].minor.yy135 = yymsp[0].minor.yy135; - sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy135); + yymsp[-1].minor.yy483 = yymsp[0].minor.yy483; + sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy483); } break; case 102: /* stl_prefix ::= seltablist joinop */ { - if( ALWAYS(yymsp[-1].minor.yy135 && yymsp[-1].minor.yy135->nSrc>0) ) yymsp[-1].minor.yy135->a[yymsp[-1].minor.yy135->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy70; + if( ALWAYS(yymsp[-1].minor.yy483 && yymsp[-1].minor.yy483->nSrc>0) ) yymsp[-1].minor.yy483->a[yymsp[-1].minor.yy483->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy494; } break; case 103: /* stl_prefix ::= */ -{yymsp[1].minor.yy135 = 0;} +{yymsp[1].minor.yy483 = 0;} break; case 104: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ { - yymsp[-6].minor.yy135 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy135,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy18,yymsp[0].minor.yy48); - sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy135, &yymsp[-2].minor.yy0); + yymsp[-6].minor.yy483 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy483,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy524,yymsp[0].minor.yy62); + sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy483, &yymsp[-2].minor.yy0); } break; case 105: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ { - yymsp[-8].minor.yy135 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy135,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy18,yymsp[0].minor.yy48); - sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy135, yymsp[-4].minor.yy420); + yymsp[-8].minor.yy483 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy483,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy524,yymsp[0].minor.yy62); + sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy483, yymsp[-4].minor.yy434); } break; case 106: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ { - yymsp[-6].minor.yy135 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy135,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy489,yymsp[-1].minor.yy18,yymsp[0].minor.yy48); + yymsp[-6].minor.yy483 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy483,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy457,yymsp[-1].minor.yy524,yymsp[0].minor.yy62); } break; case 107: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ { - if( yymsp[-6].minor.yy135==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy18==0 && yymsp[0].minor.yy48==0 ){ - yymsp[-6].minor.yy135 = yymsp[-4].minor.yy135; - }else if( yymsp[-4].minor.yy135->nSrc==1 ){ - yymsp[-6].minor.yy135 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy135,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy18,yymsp[0].minor.yy48); - if( yymsp[-6].minor.yy135 ){ - struct SrcList_item *pNew = &yymsp[-6].minor.yy135->a[yymsp[-6].minor.yy135->nSrc-1]; - struct SrcList_item *pOld = yymsp[-4].minor.yy135->a; + if( yymsp[-6].minor.yy483==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy524==0 && yymsp[0].minor.yy62==0 ){ + yymsp[-6].minor.yy483 = yymsp[-4].minor.yy483; + }else if( yymsp[-4].minor.yy483->nSrc==1 ){ + yymsp[-6].minor.yy483 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy483,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy524,yymsp[0].minor.yy62); + if( yymsp[-6].minor.yy483 ){ + struct SrcList_item *pNew = &yymsp[-6].minor.yy483->a[yymsp[-6].minor.yy483->nSrc-1]; + struct SrcList_item *pOld = yymsp[-4].minor.yy483->a; pNew->zName = pOld->zName; pNew->zDatabase = pOld->zDatabase; pNew->pSelect = pOld->pSelect; + if( pOld->fg.isTabFunc ){ + pNew->u1.pFuncArg = pOld->u1.pFuncArg; + pOld->u1.pFuncArg = 0; + pOld->fg.isTabFunc = 0; + pNew->fg.isTabFunc = 1; + } pOld->zName = pOld->zDatabase = 0; pOld->pSelect = 0; } - sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy135); + sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy483); }else{ Select *pSubquery; - sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy135); - pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy135,0,0,0,0,SF_NestedFrom,0); - yymsp[-6].minor.yy135 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy135,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy18,yymsp[0].minor.yy48); + sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy483); + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy483,0,0,0,0,SF_NestedFrom,0); + yymsp[-6].minor.yy483 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy483,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy524,yymsp[0].minor.yy62); } } break; @@ -150011,53 +151791,54 @@ static YYACTIONTYPE yy_reduce( break; case 110: /* fullname ::= nm */ { - yylhsminor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[0].minor.yy0,0); - if( IN_RENAME_OBJECT && yylhsminor.yy135 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy135->a[0].zName, &yymsp[0].minor.yy0); + yylhsminor.yy483 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); + if( IN_RENAME_OBJECT && yylhsminor.yy483 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy483->a[0].zName, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy135 = yylhsminor.yy135; + yymsp[0].minor.yy483 = yylhsminor.yy483; break; case 111: /* fullname ::= nm DOT nm */ { - yylhsminor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); - if( IN_RENAME_OBJECT && yylhsminor.yy135 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy135->a[0].zName, &yymsp[0].minor.yy0); + yylhsminor.yy483 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); + if( IN_RENAME_OBJECT && yylhsminor.yy483 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy483->a[0].zName, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy135 = yylhsminor.yy135; + yymsp[-2].minor.yy483 = yylhsminor.yy483; break; case 112: /* xfullname ::= nm */ -{yymsp[0].minor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} +{yymsp[0].minor.yy483 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} break; case 113: /* xfullname ::= nm DOT nm */ -{yymsp[-2].minor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} +{yymsp[-2].minor.yy483 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} break; case 114: /* xfullname ::= nm DOT nm AS nm */ { - yymsp[-4].minor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ - if( yymsp[-4].minor.yy135 ) yymsp[-4].minor.yy135->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); + yymsp[-4].minor.yy483 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ + if( yymsp[-4].minor.yy483 ) yymsp[-4].minor.yy483->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; case 115: /* xfullname ::= nm AS nm */ { - yymsp[-2].minor.yy135 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ - if( yymsp[-2].minor.yy135 ) yymsp[-2].minor.yy135->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); + yymsp[-2].minor.yy483 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ + if( yymsp[-2].minor.yy483 ) yymsp[-2].minor.yy483->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; case 116: /* joinop ::= COMMA|JOIN */ -{ yymsp[0].minor.yy70 = JT_INNER; } +{ yymsp[0].minor.yy494 = JT_INNER; } break; case 117: /* joinop ::= JOIN_KW JOIN */ -{yymsp[-1].minor.yy70 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} +{yymsp[-1].minor.yy494 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} break; case 118: /* joinop ::= JOIN_KW nm JOIN */ -{yymsp[-2].minor.yy70 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} +{yymsp[-2].minor.yy494 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} break; case 119: /* joinop ::= JOIN_KW nm nm JOIN */ -{yymsp[-3].minor.yy70 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} +{yymsp[-3].minor.yy494 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} break; case 120: /* on_opt ::= ON expr */ case 137: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==137); case 144: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==144); case 210: /* case_else ::= ELSE expr */ yytestcase(yyruleno==210); -{yymsp[-1].minor.yy18 = yymsp[0].minor.yy18;} + case 231: /* vinto ::= INTO expr */ yytestcase(yyruleno==231); +{yymsp[-1].minor.yy524 = yymsp[0].minor.yy524;} break; case 121: /* on_opt ::= */ case 136: /* having_opt ::= */ yytestcase(yyruleno==136); @@ -150065,7 +151846,8 @@ static YYACTIONTYPE yy_reduce( case 143: /* where_opt ::= */ yytestcase(yyruleno==143); case 211: /* case_else ::= */ yytestcase(yyruleno==211); case 213: /* case_operand ::= */ yytestcase(yyruleno==213); -{yymsp[1].minor.yy18 = 0;} + case 232: /* vinto ::= */ yytestcase(yyruleno==232); +{yymsp[1].minor.yy524 = 0;} break; case 123: /* indexed_opt ::= INDEXED BY nm */ {yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} @@ -150074,119 +151856,119 @@ static YYACTIONTYPE yy_reduce( {yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} break; case 125: /* using_opt ::= USING LP idlist RP */ -{yymsp[-3].minor.yy48 = yymsp[-1].minor.yy48;} +{yymsp[-3].minor.yy62 = yymsp[-1].minor.yy62;} break; case 126: /* using_opt ::= */ case 158: /* idlist_opt ::= */ yytestcase(yyruleno==158); -{yymsp[1].minor.yy48 = 0;} +{yymsp[1].minor.yy62 = 0;} break; case 128: /* orderby_opt ::= ORDER BY sortlist */ case 135: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==135); -{yymsp[-2].minor.yy420 = yymsp[0].minor.yy420;} +{yymsp[-2].minor.yy434 = yymsp[0].minor.yy434;} break; case 129: /* sortlist ::= sortlist COMMA expr sortorder */ { - yymsp[-3].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy420,yymsp[-1].minor.yy18); - sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy420,yymsp[0].minor.yy70); + yymsp[-3].minor.yy434 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy434,yymsp[-1].minor.yy524); + sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy434,yymsp[0].minor.yy494); } break; case 130: /* sortlist ::= expr sortorder */ { - yymsp[-1].minor.yy420 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy18); /*A-overwrites-Y*/ - sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy420,yymsp[0].minor.yy70); + yymsp[-1].minor.yy434 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy524); /*A-overwrites-Y*/ + sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy434,yymsp[0].minor.yy494); } break; case 131: /* sortorder ::= ASC */ -{yymsp[0].minor.yy70 = SQLITE_SO_ASC;} +{yymsp[0].minor.yy494 = SQLITE_SO_ASC;} break; case 132: /* sortorder ::= DESC */ -{yymsp[0].minor.yy70 = SQLITE_SO_DESC;} +{yymsp[0].minor.yy494 = SQLITE_SO_DESC;} break; case 133: /* sortorder ::= */ -{yymsp[1].minor.yy70 = SQLITE_SO_UNDEFINED;} +{yymsp[1].minor.yy494 = SQLITE_SO_UNDEFINED;} break; case 139: /* limit_opt ::= LIMIT expr */ -{yymsp[-1].minor.yy18 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy18,0);} +{yymsp[-1].minor.yy524 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy524,0);} break; case 140: /* limit_opt ::= LIMIT expr OFFSET expr */ -{yymsp[-3].minor.yy18 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy18,yymsp[0].minor.yy18);} +{yymsp[-3].minor.yy524 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy524,yymsp[0].minor.yy524);} break; case 141: /* limit_opt ::= LIMIT expr COMMA expr */ -{yymsp[-3].minor.yy18 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy18,yymsp[-2].minor.yy18);} +{yymsp[-3].minor.yy524 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy524,yymsp[-2].minor.yy524);} break; case 142: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ { - sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy135, &yymsp[-1].minor.yy0); - sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy135,yymsp[0].minor.yy18,0,0); + sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy483, &yymsp[-1].minor.yy0); + sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy483,yymsp[0].minor.yy524,0,0); } break; case 145: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ { - sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy135, &yymsp[-3].minor.yy0); - sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy420,"set list"); - sqlite3Update(pParse,yymsp[-4].minor.yy135,yymsp[-1].minor.yy420,yymsp[0].minor.yy18,yymsp[-5].minor.yy70,0,0,0); + sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy483, &yymsp[-3].minor.yy0); + sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy434,"set list"); + sqlite3Update(pParse,yymsp[-4].minor.yy483,yymsp[-1].minor.yy434,yymsp[0].minor.yy524,yymsp[-5].minor.yy494,0,0,0); } break; case 146: /* setlist ::= setlist COMMA nm EQ expr */ { - yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy420, yymsp[0].minor.yy18); - sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy420, &yymsp[-2].minor.yy0, 1); + yymsp[-4].minor.yy434 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy434, yymsp[0].minor.yy524); + sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy434, &yymsp[-2].minor.yy0, 1); } break; case 147: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ { - yymsp[-6].minor.yy420 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy420, yymsp[-3].minor.yy48, yymsp[0].minor.yy18); + yymsp[-6].minor.yy434 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy434, yymsp[-3].minor.yy62, yymsp[0].minor.yy524); } break; case 148: /* setlist ::= nm EQ expr */ { - yylhsminor.yy420 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy18); - sqlite3ExprListSetName(pParse, yylhsminor.yy420, &yymsp[-2].minor.yy0, 1); + yylhsminor.yy434 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy524); + sqlite3ExprListSetName(pParse, yylhsminor.yy434, &yymsp[-2].minor.yy0, 1); } - yymsp[-2].minor.yy420 = yylhsminor.yy420; + yymsp[-2].minor.yy434 = yylhsminor.yy434; break; case 149: /* setlist ::= LP idlist RP EQ expr */ { - yymsp[-4].minor.yy420 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy48, yymsp[0].minor.yy18); + yymsp[-4].minor.yy434 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy62, yymsp[0].minor.yy524); } break; case 150: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ { - sqlite3Insert(pParse, yymsp[-3].minor.yy135, yymsp[-1].minor.yy489, yymsp[-2].minor.yy48, yymsp[-5].minor.yy70, yymsp[0].minor.yy340); + sqlite3Insert(pParse, yymsp[-3].minor.yy483, yymsp[-1].minor.yy457, yymsp[-2].minor.yy62, yymsp[-5].minor.yy494, yymsp[0].minor.yy136); } break; case 151: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ { - sqlite3Insert(pParse, yymsp[-3].minor.yy135, 0, yymsp[-2].minor.yy48, yymsp[-5].minor.yy70, 0); + sqlite3Insert(pParse, yymsp[-3].minor.yy483, 0, yymsp[-2].minor.yy62, yymsp[-5].minor.yy494, 0); } break; case 152: /* upsert ::= */ -{ yymsp[1].minor.yy340 = 0; } +{ yymsp[1].minor.yy136 = 0; } break; case 153: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ -{ yymsp[-10].minor.yy340 = sqlite3UpsertNew(pParse->db,yymsp[-7].minor.yy420,yymsp[-5].minor.yy18,yymsp[-1].minor.yy420,yymsp[0].minor.yy18);} +{ yymsp[-10].minor.yy136 = sqlite3UpsertNew(pParse->db,yymsp[-7].minor.yy434,yymsp[-5].minor.yy524,yymsp[-1].minor.yy434,yymsp[0].minor.yy524);} break; case 154: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ -{ yymsp[-7].minor.yy340 = sqlite3UpsertNew(pParse->db,yymsp[-4].minor.yy420,yymsp[-2].minor.yy18,0,0); } +{ yymsp[-7].minor.yy136 = sqlite3UpsertNew(pParse->db,yymsp[-4].minor.yy434,yymsp[-2].minor.yy524,0,0); } break; case 155: /* upsert ::= ON CONFLICT DO NOTHING */ -{ yymsp[-3].minor.yy340 = sqlite3UpsertNew(pParse->db,0,0,0,0); } +{ yymsp[-3].minor.yy136 = sqlite3UpsertNew(pParse->db,0,0,0,0); } break; case 159: /* idlist_opt ::= LP idlist RP */ -{yymsp[-2].minor.yy48 = yymsp[-1].minor.yy48;} +{yymsp[-2].minor.yy62 = yymsp[-1].minor.yy62;} break; case 160: /* idlist ::= idlist COMMA nm */ -{yymsp[-2].minor.yy48 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy48,&yymsp[0].minor.yy0);} +{yymsp[-2].minor.yy62 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy62,&yymsp[0].minor.yy0);} break; case 161: /* idlist ::= nm */ -{yymsp[0].minor.yy48 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} +{yymsp[0].minor.yy62 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} break; case 162: /* expr ::= LP expr RP */ -{yymsp[-2].minor.yy18 = yymsp[-1].minor.yy18;} +{yymsp[-2].minor.yy524 = yymsp[-1].minor.yy524;} break; case 163: /* expr ::= ID|INDEXED */ case 164: /* expr ::= JOIN_KW */ yytestcase(yyruleno==164); -{yymsp[0].minor.yy18=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} +{yymsp[0].minor.yy524=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} break; case 165: /* expr ::= nm DOT nm */ { @@ -150196,9 +151978,9 @@ static YYACTIONTYPE yy_reduce( sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[0].minor.yy0); sqlite3RenameTokenMap(pParse, (void*)temp1, &yymsp[-2].minor.yy0); } - yylhsminor.yy18 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); + yylhsminor.yy524 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); } - yymsp[-2].minor.yy18 = yylhsminor.yy18; + yymsp[-2].minor.yy524 = yylhsminor.yy524; break; case 166: /* expr ::= nm DOT nm DOT nm */ { @@ -150210,26 +151992,26 @@ static YYACTIONTYPE yy_reduce( sqlite3RenameTokenMap(pParse, (void*)temp3, &yymsp[0].minor.yy0); sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[-2].minor.yy0); } - yylhsminor.yy18 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); + yylhsminor.yy524 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); } - yymsp[-4].minor.yy18 = yylhsminor.yy18; + yymsp[-4].minor.yy524 = yylhsminor.yy524; break; case 167: /* term ::= NULL|FLOAT|BLOB */ case 168: /* term ::= STRING */ yytestcase(yyruleno==168); -{yymsp[0].minor.yy18=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} +{yymsp[0].minor.yy524=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} break; case 169: /* term ::= INTEGER */ { - yylhsminor.yy18 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); + yylhsminor.yy524 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); } - yymsp[0].minor.yy18 = yylhsminor.yy18; + yymsp[0].minor.yy524 = yylhsminor.yy524; break; case 170: /* expr ::= VARIABLE */ { if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){ u32 n = yymsp[0].minor.yy0.n; - yymsp[0].minor.yy18 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); - sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy18, n); + yymsp[0].minor.yy524 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); + sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy524, n); }else{ /* When doing a nested parse, one can include terms in an expression ** that look like this: #1 #2 ... These terms refer to registers @@ -150238,63 +152020,63 @@ static YYACTIONTYPE yy_reduce( assert( t.n>=2 ); if( pParse->nested==0 ){ sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); - yymsp[0].minor.yy18 = 0; + yymsp[0].minor.yy524 = 0; }else{ - yymsp[0].minor.yy18 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); - if( yymsp[0].minor.yy18 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy18->iTable); + yymsp[0].minor.yy524 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); + if( yymsp[0].minor.yy524 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy524->iTable); } } } break; case 171: /* expr ::= expr COLLATE ID|STRING */ { - yymsp[-2].minor.yy18 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy18, &yymsp[0].minor.yy0, 1); + yymsp[-2].minor.yy524 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy524, &yymsp[0].minor.yy0, 1); } break; case 172: /* expr ::= CAST LP expr AS typetoken RP */ { - yymsp[-5].minor.yy18 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); - sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy18, yymsp[-3].minor.yy18, 0); + yymsp[-5].minor.yy524 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); + sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy524, yymsp[-3].minor.yy524, 0); } break; case 173: /* expr ::= ID|INDEXED LP distinct exprlist RP */ { - yylhsminor.yy18 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy420, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy70); + yylhsminor.yy524 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy434, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy494); } - yymsp[-4].minor.yy18 = yylhsminor.yy18; + yymsp[-4].minor.yy524 = yylhsminor.yy524; break; case 174: /* expr ::= ID|INDEXED LP STAR RP */ { - yylhsminor.yy18 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); + yylhsminor.yy524 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); } - yymsp[-3].minor.yy18 = yylhsminor.yy18; + yymsp[-3].minor.yy524 = yylhsminor.yy524; break; case 175: /* expr ::= ID|INDEXED LP distinct exprlist RP over_clause */ { - yylhsminor.yy18 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy420, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy70); - sqlite3WindowAttach(pParse, yylhsminor.yy18, yymsp[0].minor.yy327); + yylhsminor.yy524 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy434, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy494); + sqlite3WindowAttach(pParse, yylhsminor.yy524, yymsp[0].minor.yy295); } - yymsp[-5].minor.yy18 = yylhsminor.yy18; + yymsp[-5].minor.yy524 = yylhsminor.yy524; break; case 176: /* expr ::= ID|INDEXED LP STAR RP over_clause */ { - yylhsminor.yy18 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); - sqlite3WindowAttach(pParse, yylhsminor.yy18, yymsp[0].minor.yy327); + yylhsminor.yy524 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); + sqlite3WindowAttach(pParse, yylhsminor.yy524, yymsp[0].minor.yy295); } - yymsp[-4].minor.yy18 = yylhsminor.yy18; + yymsp[-4].minor.yy524 = yylhsminor.yy524; break; case 177: /* term ::= CTIME_KW */ { - yylhsminor.yy18 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); + yylhsminor.yy524 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); } - yymsp[0].minor.yy18 = yylhsminor.yy18; + yymsp[0].minor.yy524 = yylhsminor.yy524; break; case 178: /* expr ::= LP nexprlist COMMA expr RP */ { - ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy420, yymsp[-1].minor.yy18); - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); - if( yymsp[-4].minor.yy18 ){ - yymsp[-4].minor.yy18->x.pList = pList; + ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy434, yymsp[-1].minor.yy524); + yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); + if( yymsp[-4].minor.yy524 ){ + yymsp[-4].minor.yy524->x.pList = pList; }else{ sqlite3ExprListDelete(pParse->db, pList); } @@ -150308,7 +152090,7 @@ static YYACTIONTYPE yy_reduce( case 184: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==184); case 185: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==185); case 186: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==186); -{yymsp[-2].minor.yy18=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy18,yymsp[0].minor.yy18);} +{yymsp[-2].minor.yy524=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy524,yymsp[0].minor.yy524);} break; case 187: /* likeop ::= NOT LIKE_KW|MATCH */ {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/} @@ -150318,11 +152100,11 @@ static YYACTIONTYPE yy_reduce( ExprList *pList; int bNot = yymsp[-1].minor.yy0.n & 0x80000000; yymsp[-1].minor.yy0.n &= 0x7fffffff; - pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy18); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy18); - yymsp[-2].minor.yy18 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); - if( bNot ) yymsp[-2].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy18, 0); - if( yymsp[-2].minor.yy18 ) yymsp[-2].minor.yy18->flags |= EP_InfixFunc; + pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy524); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy524); + yymsp[-2].minor.yy524 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); + if( bNot ) yymsp[-2].minor.yy524 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy524, 0); + if( yymsp[-2].minor.yy524 ) yymsp[-2].minor.yy524->flags |= EP_InfixFunc; } break; case 189: /* expr ::= expr likeop expr ESCAPE expr */ @@ -150330,62 +152112,62 @@ static YYACTIONTYPE yy_reduce( ExprList *pList; int bNot = yymsp[-3].minor.yy0.n & 0x80000000; yymsp[-3].minor.yy0.n &= 0x7fffffff; - pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy18); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy18); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy18); - yymsp[-4].minor.yy18 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); - if( bNot ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0); - if( yymsp[-4].minor.yy18 ) yymsp[-4].minor.yy18->flags |= EP_InfixFunc; + pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy524); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy524); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy524); + yymsp[-4].minor.yy524 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); + if( bNot ) yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy524, 0); + if( yymsp[-4].minor.yy524 ) yymsp[-4].minor.yy524->flags |= EP_InfixFunc; } break; case 190: /* expr ::= expr ISNULL|NOTNULL */ -{yymsp[-1].minor.yy18 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy18,0);} +{yymsp[-1].minor.yy524 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy524,0);} break; case 191: /* expr ::= expr NOT NULL */ -{yymsp[-2].minor.yy18 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy18,0);} +{yymsp[-2].minor.yy524 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy524,0);} break; case 192: /* expr ::= expr IS expr */ { - yymsp[-2].minor.yy18 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy18,yymsp[0].minor.yy18); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy18, yymsp[-2].minor.yy18, TK_ISNULL); + yymsp[-2].minor.yy524 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy524,yymsp[0].minor.yy524); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy524, yymsp[-2].minor.yy524, TK_ISNULL); } break; case 193: /* expr ::= expr IS NOT expr */ { - yymsp[-3].minor.yy18 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy18,yymsp[0].minor.yy18); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy18, yymsp[-3].minor.yy18, TK_NOTNULL); + yymsp[-3].minor.yy524 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy524,yymsp[0].minor.yy524); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy524, yymsp[-3].minor.yy524, TK_NOTNULL); } break; case 194: /* expr ::= NOT expr */ case 195: /* expr ::= BITNOT expr */ yytestcase(yyruleno==195); -{yymsp[-1].minor.yy18 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy18, 0);/*A-overwrites-B*/} +{yymsp[-1].minor.yy524 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy524, 0);/*A-overwrites-B*/} break; case 196: /* expr ::= PLUS|MINUS expr */ { - yymsp[-1].minor.yy18 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy18, 0); + yymsp[-1].minor.yy524 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy524, 0); /*A-overwrites-B*/ } break; case 197: /* between_op ::= BETWEEN */ case 200: /* in_op ::= IN */ yytestcase(yyruleno==200); -{yymsp[0].minor.yy70 = 0;} +{yymsp[0].minor.yy494 = 0;} break; case 199: /* expr ::= expr between_op expr AND expr */ { - ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy18); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy18); - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy18, 0); - if( yymsp[-4].minor.yy18 ){ - yymsp[-4].minor.yy18->x.pList = pList; + ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy524); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy524); + yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy524, 0); + if( yymsp[-4].minor.yy524 ){ + yymsp[-4].minor.yy524->x.pList = pList; }else{ sqlite3ExprListDelete(pParse->db, pList); } - if( yymsp[-3].minor.yy70 ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0); + if( yymsp[-3].minor.yy494 ) yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy524, 0); } break; case 202: /* expr ::= expr in_op LP exprlist RP */ { - if( yymsp[-1].minor.yy420==0 ){ + if( yymsp[-1].minor.yy434==0 ){ /* Expressions of the form ** ** expr1 IN () @@ -150394,9 +152176,11 @@ static YYACTIONTYPE yy_reduce( ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ - sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy18); - yymsp[-4].minor.yy18 = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[yymsp[-3].minor.yy70],1); - }else if( yymsp[-1].minor.yy420->nExpr==1 ){ + if( IN_RENAME_OBJECT==0 ){ + sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy524); + yymsp[-4].minor.yy524 = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[yymsp[-3].minor.yy494],1); + } + }else if( yymsp[-1].minor.yy434->nExpr==1 ){ /* Expressions of the form: ** ** expr1 IN (?1) @@ -150413,199 +152197,199 @@ static YYACTIONTYPE yy_reduce( ** affinity or the collating sequence to use for comparison. Otherwise, ** the semantics would be subtly different from IN or NOT IN. */ - Expr *pRHS = yymsp[-1].minor.yy420->a[0].pExpr; - yymsp[-1].minor.yy420->a[0].pExpr = 0; - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy420); + Expr *pRHS = yymsp[-1].minor.yy434->a[0].pExpr; + yymsp[-1].minor.yy434->a[0].pExpr = 0; + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy434); /* pRHS cannot be NULL because a malloc error would have been detected ** before now and control would have never reached this point */ if( ALWAYS(pRHS) ){ pRHS->flags &= ~EP_Collate; pRHS->flags |= EP_Generic; } - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, yymsp[-3].minor.yy70 ? TK_NE : TK_EQ, yymsp[-4].minor.yy18, pRHS); + yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, yymsp[-3].minor.yy494 ? TK_NE : TK_EQ, yymsp[-4].minor.yy524, pRHS); }else{ - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy18, 0); - if( yymsp[-4].minor.yy18 ){ - yymsp[-4].minor.yy18->x.pList = yymsp[-1].minor.yy420; - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy18); + yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy524, 0); + if( yymsp[-4].minor.yy524 ){ + yymsp[-4].minor.yy524->x.pList = yymsp[-1].minor.yy434; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy524); }else{ - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy420); + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy434); } - if( yymsp[-3].minor.yy70 ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0); + if( yymsp[-3].minor.yy494 ) yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy524, 0); } } break; case 203: /* expr ::= LP select RP */ { - yymsp[-2].minor.yy18 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); - sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy18, yymsp[-1].minor.yy489); + yymsp[-2].minor.yy524 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); + sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy524, yymsp[-1].minor.yy457); } break; case 204: /* expr ::= expr in_op LP select RP */ { - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy18, 0); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy18, yymsp[-1].minor.yy489); - if( yymsp[-3].minor.yy70 ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0); + yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy524, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy524, yymsp[-1].minor.yy457); + if( yymsp[-3].minor.yy494 ) yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy524, 0); } break; case 205: /* expr ::= expr in_op nm dbnm paren_exprlist */ { - SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); + SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); - if( yymsp[0].minor.yy420 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy420); - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy18, 0); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy18, pSelect); - if( yymsp[-3].minor.yy70 ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0); + if( yymsp[0].minor.yy434 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy434); + yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy524, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy524, pSelect); + if( yymsp[-3].minor.yy494 ) yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy524, 0); } break; case 206: /* expr ::= EXISTS LP select RP */ { Expr *p; - p = yymsp[-3].minor.yy18 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); - sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy489); + p = yymsp[-3].minor.yy524 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); + sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy457); } break; case 207: /* expr ::= CASE case_operand case_exprlist case_else END */ { - yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy18, 0); - if( yymsp[-4].minor.yy18 ){ - yymsp[-4].minor.yy18->x.pList = yymsp[-1].minor.yy18 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy420,yymsp[-1].minor.yy18) : yymsp[-2].minor.yy420; - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy18); + yymsp[-4].minor.yy524 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy524, 0); + if( yymsp[-4].minor.yy524 ){ + yymsp[-4].minor.yy524->x.pList = yymsp[-1].minor.yy524 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy434,yymsp[-1].minor.yy524) : yymsp[-2].minor.yy434; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy524); }else{ - sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy420); - sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy18); + sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy434); + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy524); } } break; case 208: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ { - yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy420, yymsp[-2].minor.yy18); - yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy420, yymsp[0].minor.yy18); + yymsp[-4].minor.yy434 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy434, yymsp[-2].minor.yy524); + yymsp[-4].minor.yy434 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy434, yymsp[0].minor.yy524); } break; case 209: /* case_exprlist ::= WHEN expr THEN expr */ { - yymsp[-3].minor.yy420 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy18); - yymsp[-3].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy420, yymsp[0].minor.yy18); + yymsp[-3].minor.yy434 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy524); + yymsp[-3].minor.yy434 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy434, yymsp[0].minor.yy524); } break; case 212: /* case_operand ::= expr */ -{yymsp[0].minor.yy18 = yymsp[0].minor.yy18; /*A-overwrites-X*/} +{yymsp[0].minor.yy524 = yymsp[0].minor.yy524; /*A-overwrites-X*/} break; case 215: /* nexprlist ::= nexprlist COMMA expr */ -{yymsp[-2].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy420,yymsp[0].minor.yy18);} +{yymsp[-2].minor.yy434 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy434,yymsp[0].minor.yy524);} break; case 216: /* nexprlist ::= expr */ -{yymsp[0].minor.yy420 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy18); /*A-overwrites-Y*/} +{yymsp[0].minor.yy434 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy524); /*A-overwrites-Y*/} break; case 218: /* paren_exprlist ::= LP exprlist RP */ case 223: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==223); -{yymsp[-2].minor.yy420 = yymsp[-1].minor.yy420;} +{yymsp[-2].minor.yy434 = yymsp[-1].minor.yy434;} break; case 219: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ { sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, - sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy420, yymsp[-10].minor.yy70, - &yymsp[-11].minor.yy0, yymsp[0].minor.yy18, SQLITE_SO_ASC, yymsp[-8].minor.yy70, SQLITE_IDXTYPE_APPDEF); + sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy434, yymsp[-10].minor.yy494, + &yymsp[-11].minor.yy0, yymsp[0].minor.yy524, SQLITE_SO_ASC, yymsp[-8].minor.yy494, SQLITE_IDXTYPE_APPDEF); if( IN_RENAME_OBJECT && pParse->pNewIndex ){ sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &yymsp[-4].minor.yy0); } } break; case 220: /* uniqueflag ::= UNIQUE */ - case 260: /* raisetype ::= ABORT */ yytestcase(yyruleno==260); -{yymsp[0].minor.yy70 = OE_Abort;} + case 262: /* raisetype ::= ABORT */ yytestcase(yyruleno==262); +{yymsp[0].minor.yy494 = OE_Abort;} break; case 221: /* uniqueflag ::= */ -{yymsp[1].minor.yy70 = OE_None;} +{yymsp[1].minor.yy494 = OE_None;} break; case 224: /* eidlist ::= eidlist COMMA nm collate sortorder */ { - yymsp[-4].minor.yy420 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy420, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy70, yymsp[0].minor.yy70); + yymsp[-4].minor.yy434 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy434, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy494, yymsp[0].minor.yy494); } break; case 225: /* eidlist ::= nm collate sortorder */ { - yymsp[-2].minor.yy420 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy70, yymsp[0].minor.yy70); /*A-overwrites-Y*/ + yymsp[-2].minor.yy434 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy494, yymsp[0].minor.yy494); /*A-overwrites-Y*/ } break; case 228: /* cmd ::= DROP INDEX ifexists fullname */ -{sqlite3DropIndex(pParse, yymsp[0].minor.yy135, yymsp[-1].minor.yy70);} +{sqlite3DropIndex(pParse, yymsp[0].minor.yy483, yymsp[-1].minor.yy494);} break; - case 229: /* cmd ::= VACUUM */ -{sqlite3Vacuum(pParse,0);} + case 229: /* cmd ::= VACUUM vinto */ +{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy524);} break; - case 230: /* cmd ::= VACUUM nm */ -{sqlite3Vacuum(pParse,&yymsp[0].minor.yy0);} + case 230: /* cmd ::= VACUUM nm vinto */ +{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy524);} break; - case 231: /* cmd ::= PRAGMA nm dbnm */ + case 233: /* cmd ::= PRAGMA nm dbnm */ {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} break; - case 232: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ + case 234: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} break; - case 233: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ + case 235: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} break; - case 234: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ + case 236: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} break; - case 235: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ + case 237: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} break; - case 238: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + case 240: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ { Token all; all.z = yymsp[-3].minor.yy0.z; all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; - sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy207, &all); + sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy455, &all); } break; - case 239: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + case 241: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ { - sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy70, yymsp[-4].minor.yy34.a, yymsp[-4].minor.yy34.b, yymsp[-2].minor.yy135, yymsp[0].minor.yy18, yymsp[-10].minor.yy70, yymsp[-8].minor.yy70); + sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy494, yymsp[-4].minor.yy90.a, yymsp[-4].minor.yy90.b, yymsp[-2].minor.yy483, yymsp[0].minor.yy524, yymsp[-10].minor.yy494, yymsp[-8].minor.yy494); yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ } break; - case 240: /* trigger_time ::= BEFORE|AFTER */ -{ yymsp[0].minor.yy70 = yymsp[0].major; /*A-overwrites-X*/ } + case 242: /* trigger_time ::= BEFORE|AFTER */ +{ yymsp[0].minor.yy494 = yymsp[0].major; /*A-overwrites-X*/ } break; - case 241: /* trigger_time ::= INSTEAD OF */ -{ yymsp[-1].minor.yy70 = TK_INSTEAD;} + case 243: /* trigger_time ::= INSTEAD OF */ +{ yymsp[-1].minor.yy494 = TK_INSTEAD;} break; - case 242: /* trigger_time ::= */ -{ yymsp[1].minor.yy70 = TK_BEFORE; } + case 244: /* trigger_time ::= */ +{ yymsp[1].minor.yy494 = TK_BEFORE; } break; - case 243: /* trigger_event ::= DELETE|INSERT */ - case 244: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==244); -{yymsp[0].minor.yy34.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy34.b = 0;} + case 245: /* trigger_event ::= DELETE|INSERT */ + case 246: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==246); +{yymsp[0].minor.yy90.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy90.b = 0;} break; - case 245: /* trigger_event ::= UPDATE OF idlist */ -{yymsp[-2].minor.yy34.a = TK_UPDATE; yymsp[-2].minor.yy34.b = yymsp[0].minor.yy48;} + case 247: /* trigger_event ::= UPDATE OF idlist */ +{yymsp[-2].minor.yy90.a = TK_UPDATE; yymsp[-2].minor.yy90.b = yymsp[0].minor.yy62;} break; - case 246: /* when_clause ::= */ - case 265: /* key_opt ::= */ yytestcase(yyruleno==265); - case 307: /* filter_opt ::= */ yytestcase(yyruleno==307); -{ yymsp[1].minor.yy18 = 0; } + case 248: /* when_clause ::= */ + case 267: /* key_opt ::= */ yytestcase(yyruleno==267); + case 315: /* filter_opt ::= */ yytestcase(yyruleno==315); +{ yymsp[1].minor.yy524 = 0; } break; - case 247: /* when_clause ::= WHEN expr */ - case 266: /* key_opt ::= KEY expr */ yytestcase(yyruleno==266); -{ yymsp[-1].minor.yy18 = yymsp[0].minor.yy18; } + case 249: /* when_clause ::= WHEN expr */ + case 268: /* key_opt ::= KEY expr */ yytestcase(yyruleno==268); +{ yymsp[-1].minor.yy524 = yymsp[0].minor.yy524; } break; - case 248: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 250: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { - assert( yymsp[-2].minor.yy207!=0 ); - yymsp[-2].minor.yy207->pLast->pNext = yymsp[-1].minor.yy207; - yymsp[-2].minor.yy207->pLast = yymsp[-1].minor.yy207; + assert( yymsp[-2].minor.yy455!=0 ); + yymsp[-2].minor.yy455->pLast->pNext = yymsp[-1].minor.yy455; + yymsp[-2].minor.yy455->pLast = yymsp[-1].minor.yy455; } break; - case 249: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 251: /* trigger_cmd_list ::= trigger_cmd SEMI */ { - assert( yymsp[-1].minor.yy207!=0 ); - yymsp[-1].minor.yy207->pLast = yymsp[-1].minor.yy207; + assert( yymsp[-1].minor.yy455!=0 ); + yymsp[-1].minor.yy455->pLast = yymsp[-1].minor.yy455; } break; - case 250: /* trnm ::= nm DOT nm */ + case 252: /* trnm ::= nm DOT nm */ { yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; sqlite3ErrorMsg(pParse, @@ -150613,312 +152397,334 @@ static YYACTIONTYPE yy_reduce( "statements within triggers"); } break; - case 251: /* tridxby ::= INDEXED BY nm */ + case 253: /* tridxby ::= INDEXED BY nm */ { sqlite3ErrorMsg(pParse, "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 252: /* tridxby ::= NOT INDEXED */ + case 254: /* tridxby ::= NOT INDEXED */ { sqlite3ErrorMsg(pParse, "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 253: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ -{yylhsminor.yy207 = sqlite3TriggerUpdateStep(pParse, &yymsp[-5].minor.yy0, yymsp[-2].minor.yy420, yymsp[-1].minor.yy18, yymsp[-6].minor.yy70, yymsp[-7].minor.yy0.z, yymsp[0].minor.yy392);} - yymsp[-7].minor.yy207 = yylhsminor.yy207; + case 255: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ +{yylhsminor.yy455 = sqlite3TriggerUpdateStep(pParse, &yymsp[-5].minor.yy0, yymsp[-2].minor.yy434, yymsp[-1].minor.yy524, yymsp[-6].minor.yy494, yymsp[-7].minor.yy0.z, yymsp[0].minor.yy294);} + yymsp[-7].minor.yy455 = yylhsminor.yy455; break; - case 254: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + case 256: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ { - yylhsminor.yy207 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy48,yymsp[-2].minor.yy489,yymsp[-6].minor.yy70,yymsp[-1].minor.yy340,yymsp[-7].minor.yy392,yymsp[0].minor.yy392);/*yylhsminor.yy207-overwrites-yymsp[-6].minor.yy70*/ + yylhsminor.yy455 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy62,yymsp[-2].minor.yy457,yymsp[-6].minor.yy494,yymsp[-1].minor.yy136,yymsp[-7].minor.yy294,yymsp[0].minor.yy294);/*yylhsminor.yy455-overwrites-yymsp[-6].minor.yy494*/ } - yymsp[-7].minor.yy207 = yylhsminor.yy207; + yymsp[-7].minor.yy455 = yylhsminor.yy455; break; - case 255: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ -{yylhsminor.yy207 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy18, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy392);} - yymsp[-5].minor.yy207 = yylhsminor.yy207; + case 257: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ +{yylhsminor.yy455 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy524, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy294);} + yymsp[-5].minor.yy455 = yylhsminor.yy455; break; - case 256: /* trigger_cmd ::= scanpt select scanpt */ -{yylhsminor.yy207 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy489, yymsp[-2].minor.yy392, yymsp[0].minor.yy392); /*yylhsminor.yy207-overwrites-yymsp[-1].minor.yy489*/} - yymsp[-2].minor.yy207 = yylhsminor.yy207; + case 258: /* trigger_cmd ::= scanpt select scanpt */ +{yylhsminor.yy455 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy457, yymsp[-2].minor.yy294, yymsp[0].minor.yy294); /*yylhsminor.yy455-overwrites-yymsp[-1].minor.yy457*/} + yymsp[-2].minor.yy455 = yylhsminor.yy455; break; - case 257: /* expr ::= RAISE LP IGNORE RP */ + case 259: /* expr ::= RAISE LP IGNORE RP */ { - yymsp[-3].minor.yy18 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); - if( yymsp[-3].minor.yy18 ){ - yymsp[-3].minor.yy18->affinity = OE_Ignore; + yymsp[-3].minor.yy524 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); + if( yymsp[-3].minor.yy524 ){ + yymsp[-3].minor.yy524->affinity = OE_Ignore; } } break; - case 258: /* expr ::= RAISE LP raisetype COMMA nm RP */ + case 260: /* expr ::= RAISE LP raisetype COMMA nm RP */ { - yymsp[-5].minor.yy18 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); - if( yymsp[-5].minor.yy18 ) { - yymsp[-5].minor.yy18->affinity = (char)yymsp[-3].minor.yy70; + yymsp[-5].minor.yy524 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); + if( yymsp[-5].minor.yy524 ) { + yymsp[-5].minor.yy524->affinity = (char)yymsp[-3].minor.yy494; } } break; - case 259: /* raisetype ::= ROLLBACK */ -{yymsp[0].minor.yy70 = OE_Rollback;} + case 261: /* raisetype ::= ROLLBACK */ +{yymsp[0].minor.yy494 = OE_Rollback;} break; - case 261: /* raisetype ::= FAIL */ -{yymsp[0].minor.yy70 = OE_Fail;} + case 263: /* raisetype ::= FAIL */ +{yymsp[0].minor.yy494 = OE_Fail;} break; - case 262: /* cmd ::= DROP TRIGGER ifexists fullname */ + case 264: /* cmd ::= DROP TRIGGER ifexists fullname */ { - sqlite3DropTrigger(pParse,yymsp[0].minor.yy135,yymsp[-1].minor.yy70); + sqlite3DropTrigger(pParse,yymsp[0].minor.yy483,yymsp[-1].minor.yy494); } break; - case 263: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + case 265: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ { - sqlite3Attach(pParse, yymsp[-3].minor.yy18, yymsp[-1].minor.yy18, yymsp[0].minor.yy18); + sqlite3Attach(pParse, yymsp[-3].minor.yy524, yymsp[-1].minor.yy524, yymsp[0].minor.yy524); } break; - case 264: /* cmd ::= DETACH database_kw_opt expr */ + case 266: /* cmd ::= DETACH database_kw_opt expr */ { - sqlite3Detach(pParse, yymsp[0].minor.yy18); + sqlite3Detach(pParse, yymsp[0].minor.yy524); } break; - case 267: /* cmd ::= REINDEX */ + case 269: /* cmd ::= REINDEX */ {sqlite3Reindex(pParse, 0, 0);} break; - case 268: /* cmd ::= REINDEX nm dbnm */ + case 270: /* cmd ::= REINDEX nm dbnm */ {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 269: /* cmd ::= ANALYZE */ + case 271: /* cmd ::= ANALYZE */ {sqlite3Analyze(pParse, 0, 0);} break; - case 270: /* cmd ::= ANALYZE nm dbnm */ + case 272: /* cmd ::= ANALYZE nm dbnm */ {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 271: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ + case 273: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ { - sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy135,&yymsp[0].minor.yy0); + sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy483,&yymsp[0].minor.yy0); } break; - case 272: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + case 274: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ { yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); } break; - case 273: /* add_column_fullname ::= fullname */ + case 275: /* add_column_fullname ::= fullname */ { disableLookaside(pParse); - sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy135); + sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy483); } break; - case 274: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + case 276: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ { - sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy135, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); + sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy483, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 275: /* cmd ::= create_vtab */ + case 277: /* cmd ::= create_vtab */ {sqlite3VtabFinishParse(pParse,0);} break; - case 276: /* cmd ::= create_vtab LP vtabarglist RP */ + case 278: /* cmd ::= create_vtab LP vtabarglist RP */ {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} break; - case 277: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + case 279: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ { - sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy70); + sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy494); } break; - case 278: /* vtabarg ::= */ + case 280: /* vtabarg ::= */ {sqlite3VtabArgInit(pParse);} break; - case 279: /* vtabargtoken ::= ANY */ - case 280: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==280); - case 281: /* lp ::= LP */ yytestcase(yyruleno==281); + case 281: /* vtabargtoken ::= ANY */ + case 282: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==282); + case 283: /* lp ::= LP */ yytestcase(yyruleno==283); {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} break; - case 282: /* with ::= WITH wqlist */ - case 283: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==283); -{ sqlite3WithPush(pParse, yymsp[0].minor.yy449, 1); } + case 284: /* with ::= WITH wqlist */ + case 285: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==285); +{ sqlite3WithPush(pParse, yymsp[0].minor.yy59, 1); } break; - case 284: /* wqlist ::= nm eidlist_opt AS LP select RP */ + case 286: /* wqlist ::= nm eidlist_opt AS LP select RP */ { - yymsp[-5].minor.yy449 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy420, yymsp[-1].minor.yy489); /*A-overwrites-X*/ + yymsp[-5].minor.yy59 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy434, yymsp[-1].minor.yy457); /*A-overwrites-X*/ } break; - case 285: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ + case 287: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ { - yymsp[-7].minor.yy449 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy449, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy420, yymsp[-1].minor.yy489); + yymsp[-7].minor.yy59 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy59, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy434, yymsp[-1].minor.yy457); } break; - case 286: /* windowdefn_list ::= windowdefn */ -{ yylhsminor.yy327 = yymsp[0].minor.yy327; } - yymsp[0].minor.yy327 = yylhsminor.yy327; + case 288: /* windowdefn_list ::= windowdefn */ +{ yylhsminor.yy295 = yymsp[0].minor.yy295; } + yymsp[0].minor.yy295 = yylhsminor.yy295; break; - case 287: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ + case 289: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ { - assert( yymsp[0].minor.yy327!=0 ); - yymsp[0].minor.yy327->pNextWin = yymsp[-2].minor.yy327; - yylhsminor.yy327 = yymsp[0].minor.yy327; + assert( yymsp[0].minor.yy295!=0 ); + sqlite3WindowChain(pParse, yymsp[0].minor.yy295, yymsp[-2].minor.yy295); + yymsp[0].minor.yy295->pNextWin = yymsp[-2].minor.yy295; + yylhsminor.yy295 = yymsp[0].minor.yy295; } - yymsp[-2].minor.yy327 = yylhsminor.yy327; + yymsp[-2].minor.yy295 = yylhsminor.yy295; break; - case 288: /* windowdefn ::= nm AS window */ + case 290: /* windowdefn ::= nm AS LP window RP */ { - if( ALWAYS(yymsp[0].minor.yy327) ){ - yymsp[0].minor.yy327->zName = sqlite3DbStrNDup(pParse->db, yymsp[-2].minor.yy0.z, yymsp[-2].minor.yy0.n); + if( ALWAYS(yymsp[-1].minor.yy295) ){ + yymsp[-1].minor.yy295->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); } - yylhsminor.yy327 = yymsp[0].minor.yy327; + yylhsminor.yy295 = yymsp[-1].minor.yy295; } - yymsp[-2].minor.yy327 = yylhsminor.yy327; + yymsp[-4].minor.yy295 = yylhsminor.yy295; break; - case 289: /* window ::= LP part_opt orderby_opt frame_opt RP */ + case 291: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ { - yymsp[-4].minor.yy327 = yymsp[-1].minor.yy327; - if( ALWAYS(yymsp[-4].minor.yy327) ){ - yymsp[-4].minor.yy327->pPartition = yymsp[-3].minor.yy420; - yymsp[-4].minor.yy327->pOrderBy = yymsp[-2].minor.yy420; - } + yymsp[-4].minor.yy295 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy295, yymsp[-2].minor.yy434, yymsp[-1].minor.yy434, 0); } break; - case 290: /* part_opt ::= PARTITION BY nexprlist */ -{ yymsp[-2].minor.yy420 = yymsp[0].minor.yy420; } - break; - case 291: /* part_opt ::= */ -{ yymsp[1].minor.yy420 = 0; } - break; - case 292: /* frame_opt ::= */ -{ - yymsp[1].minor.yy327 = sqlite3WindowAlloc(pParse, TK_RANGE, TK_UNBOUNDED, 0, TK_CURRENT, 0); -} - break; - case 293: /* frame_opt ::= range_or_rows frame_bound_s */ -{ - yylhsminor.yy327 = sqlite3WindowAlloc(pParse, yymsp[-1].minor.yy70, yymsp[0].minor.yy119.eType, yymsp[0].minor.yy119.pExpr, TK_CURRENT, 0); -} - yymsp[-1].minor.yy327 = yylhsminor.yy327; - break; - case 294: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e */ -{ - yylhsminor.yy327 = sqlite3WindowAlloc(pParse, yymsp[-4].minor.yy70, yymsp[-2].minor.yy119.eType, yymsp[-2].minor.yy119.pExpr, yymsp[0].minor.yy119.eType, yymsp[0].minor.yy119.pExpr); -} - yymsp[-4].minor.yy327 = yylhsminor.yy327; - break; - case 295: /* range_or_rows ::= RANGE */ -{ yymsp[0].minor.yy70 = TK_RANGE; } - break; - case 296: /* range_or_rows ::= ROWS */ -{ yymsp[0].minor.yy70 = TK_ROWS; } - break; - case 297: /* frame_bound_s ::= frame_bound */ - case 299: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==299); -{ yylhsminor.yy119 = yymsp[0].minor.yy119; } - yymsp[0].minor.yy119 = yylhsminor.yy119; - break; - case 298: /* frame_bound_s ::= UNBOUNDED PRECEDING */ - case 300: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==300); -{yymsp[-1].minor.yy119.eType = TK_UNBOUNDED; yymsp[-1].minor.yy119.pExpr = 0;} - break; - case 301: /* frame_bound ::= expr PRECEDING */ -{ yylhsminor.yy119.eType = TK_PRECEDING; yylhsminor.yy119.pExpr = yymsp[-1].minor.yy18; } - yymsp[-1].minor.yy119 = yylhsminor.yy119; - break; - case 302: /* frame_bound ::= CURRENT ROW */ -{ yymsp[-1].minor.yy119.eType = TK_CURRENT ; yymsp[-1].minor.yy119.pExpr = 0; } - break; - case 303: /* frame_bound ::= expr FOLLOWING */ -{ yylhsminor.yy119.eType = TK_FOLLOWING; yylhsminor.yy119.pExpr = yymsp[-1].minor.yy18; } - yymsp[-1].minor.yy119 = yylhsminor.yy119; - break; - case 304: /* window_clause ::= WINDOW windowdefn_list */ -{ yymsp[-1].minor.yy327 = yymsp[0].minor.yy327; } - break; - case 305: /* over_clause ::= filter_opt OVER window */ + case 292: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ { - yylhsminor.yy327 = yymsp[0].minor.yy327; - assert( yylhsminor.yy327!=0 ); - yylhsminor.yy327->pFilter = yymsp[-2].minor.yy18; + yylhsminor.yy295 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy295, yymsp[-2].minor.yy434, yymsp[-1].minor.yy434, &yymsp[-5].minor.yy0); } - yymsp[-2].minor.yy327 = yylhsminor.yy327; + yymsp[-5].minor.yy295 = yylhsminor.yy295; break; - case 306: /* over_clause ::= filter_opt OVER nm */ + case 293: /* window ::= ORDER BY sortlist frame_opt */ { - yylhsminor.yy327 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); - if( yylhsminor.yy327 ){ - yylhsminor.yy327->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); - yylhsminor.yy327->pFilter = yymsp[-2].minor.yy18; + yymsp[-3].minor.yy295 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy295, 0, yymsp[-1].minor.yy434, 0); +} + break; + case 294: /* window ::= nm ORDER BY sortlist frame_opt */ +{ + yylhsminor.yy295 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy295, 0, yymsp[-1].minor.yy434, &yymsp[-4].minor.yy0); +} + yymsp[-4].minor.yy295 = yylhsminor.yy295; + break; + case 295: /* window ::= frame_opt */ +{ + yylhsminor.yy295 = yymsp[0].minor.yy295; +} + yymsp[0].minor.yy295 = yylhsminor.yy295; + break; + case 296: /* window ::= nm frame_opt */ +{ + yylhsminor.yy295 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy295, 0, 0, &yymsp[-1].minor.yy0); +} + yymsp[-1].minor.yy295 = yylhsminor.yy295; + break; + case 297: /* frame_opt ::= */ +{ + yymsp[1].minor.yy295 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); +} + break; + case 298: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ +{ + yylhsminor.yy295 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy494, yymsp[-1].minor.yy201.eType, yymsp[-1].minor.yy201.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy238); +} + yymsp[-2].minor.yy295 = yylhsminor.yy295; + break; + case 299: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ +{ + yylhsminor.yy295 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy494, yymsp[-3].minor.yy201.eType, yymsp[-3].minor.yy201.pExpr, yymsp[-1].minor.yy201.eType, yymsp[-1].minor.yy201.pExpr, yymsp[0].minor.yy238); +} + yymsp[-5].minor.yy295 = yylhsminor.yy295; + break; + case 301: /* frame_bound_s ::= frame_bound */ + case 303: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==303); +{yylhsminor.yy201 = yymsp[0].minor.yy201;} + yymsp[0].minor.yy201 = yylhsminor.yy201; + break; + case 302: /* frame_bound_s ::= UNBOUNDED PRECEDING */ + case 304: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==304); + case 306: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==306); +{yylhsminor.yy201.eType = yymsp[-1].major; yylhsminor.yy201.pExpr = 0;} + yymsp[-1].minor.yy201 = yylhsminor.yy201; + break; + case 305: /* frame_bound ::= expr PRECEDING|FOLLOWING */ +{yylhsminor.yy201.eType = yymsp[0].major; yylhsminor.yy201.pExpr = yymsp[-1].minor.yy524;} + yymsp[-1].minor.yy201 = yylhsminor.yy201; + break; + case 307: /* frame_exclude_opt ::= */ +{yymsp[1].minor.yy238 = 0;} + break; + case 308: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ +{yymsp[-1].minor.yy238 = yymsp[0].minor.yy238;} + break; + case 309: /* frame_exclude ::= NO OTHERS */ + case 310: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==310); +{yymsp[-1].minor.yy238 = yymsp[-1].major; /*A-overwrites-X*/} + break; + case 311: /* frame_exclude ::= GROUP|TIES */ +{yymsp[0].minor.yy238 = yymsp[0].major; /*A-overwrites-X*/} + break; + case 312: /* window_clause ::= WINDOW windowdefn_list */ +{ yymsp[-1].minor.yy295 = yymsp[0].minor.yy295; } + break; + case 313: /* over_clause ::= filter_opt OVER LP window RP */ +{ + yylhsminor.yy295 = yymsp[-1].minor.yy295; + assert( yylhsminor.yy295!=0 ); + yylhsminor.yy295->pFilter = yymsp[-4].minor.yy524; +} + yymsp[-4].minor.yy295 = yylhsminor.yy295; + break; + case 314: /* over_clause ::= filter_opt OVER nm */ +{ + yylhsminor.yy295 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yylhsminor.yy295 ){ + yylhsminor.yy295->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); + yylhsminor.yy295->pFilter = yymsp[-2].minor.yy524; }else{ - sqlite3ExprDelete(pParse->db, yymsp[-2].minor.yy18); + sqlite3ExprDelete(pParse->db, yymsp[-2].minor.yy524); } } - yymsp[-2].minor.yy327 = yylhsminor.yy327; + yymsp[-2].minor.yy295 = yylhsminor.yy295; break; - case 308: /* filter_opt ::= FILTER LP WHERE expr RP */ -{ yymsp[-4].minor.yy18 = yymsp[-1].minor.yy18; } + case 316: /* filter_opt ::= FILTER LP WHERE expr RP */ +{ yymsp[-4].minor.yy524 = yymsp[-1].minor.yy524; } break; default: - /* (309) input ::= cmdlist */ yytestcase(yyruleno==309); - /* (310) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==310); - /* (311) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=311); - /* (312) ecmd ::= SEMI */ yytestcase(yyruleno==312); - /* (313) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==313); - /* (314) ecmd ::= explain cmdx */ yytestcase(yyruleno==314); - /* (315) trans_opt ::= */ yytestcase(yyruleno==315); - /* (316) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==316); - /* (317) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==317); - /* (318) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==318); - /* (319) savepoint_opt ::= */ yytestcase(yyruleno==319); - /* (320) cmd ::= create_table create_table_args */ yytestcase(yyruleno==320); - /* (321) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==321); - /* (322) columnlist ::= columnname carglist */ yytestcase(yyruleno==322); - /* (323) nm ::= ID|INDEXED */ yytestcase(yyruleno==323); - /* (324) nm ::= STRING */ yytestcase(yyruleno==324); - /* (325) nm ::= JOIN_KW */ yytestcase(yyruleno==325); - /* (326) typetoken ::= typename */ yytestcase(yyruleno==326); - /* (327) typename ::= ID|STRING */ yytestcase(yyruleno==327); - /* (328) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=328); - /* (329) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=329); - /* (330) carglist ::= carglist ccons */ yytestcase(yyruleno==330); - /* (331) carglist ::= */ yytestcase(yyruleno==331); - /* (332) ccons ::= NULL onconf */ yytestcase(yyruleno==332); - /* (333) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==333); - /* (334) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==334); - /* (335) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=335); - /* (336) tconscomma ::= */ yytestcase(yyruleno==336); - /* (337) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=337); - /* (338) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=338); - /* (339) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=339); - /* (340) oneselect ::= values */ yytestcase(yyruleno==340); - /* (341) sclp ::= selcollist COMMA */ yytestcase(yyruleno==341); - /* (342) as ::= ID|STRING */ yytestcase(yyruleno==342); - /* (343) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=343); - /* (344) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==344); - /* (345) exprlist ::= nexprlist */ yytestcase(yyruleno==345); - /* (346) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=346); - /* (347) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=347); - /* (348) nmnum ::= ON */ yytestcase(yyruleno==348); - /* (349) nmnum ::= DELETE */ yytestcase(yyruleno==349); - /* (350) nmnum ::= DEFAULT */ yytestcase(yyruleno==350); - /* (351) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==351); - /* (352) foreach_clause ::= */ yytestcase(yyruleno==352); - /* (353) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==353); - /* (354) trnm ::= nm */ yytestcase(yyruleno==354); - /* (355) tridxby ::= */ yytestcase(yyruleno==355); - /* (356) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==356); - /* (357) database_kw_opt ::= */ yytestcase(yyruleno==357); - /* (358) kwcolumn_opt ::= */ yytestcase(yyruleno==358); - /* (359) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==359); - /* (360) vtabarglist ::= vtabarg */ yytestcase(yyruleno==360); - /* (361) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==361); - /* (362) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==362); - /* (363) anylist ::= */ yytestcase(yyruleno==363); - /* (364) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==364); - /* (365) anylist ::= anylist ANY */ yytestcase(yyruleno==365); - /* (366) with ::= */ yytestcase(yyruleno==366); + /* (317) input ::= cmdlist */ yytestcase(yyruleno==317); + /* (318) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==318); + /* (319) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=319); + /* (320) ecmd ::= SEMI */ yytestcase(yyruleno==320); + /* (321) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==321); + /* (322) ecmd ::= explain cmdx */ yytestcase(yyruleno==322); + /* (323) trans_opt ::= */ yytestcase(yyruleno==323); + /* (324) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==324); + /* (325) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==325); + /* (326) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==326); + /* (327) savepoint_opt ::= */ yytestcase(yyruleno==327); + /* (328) cmd ::= create_table create_table_args */ yytestcase(yyruleno==328); + /* (329) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==329); + /* (330) columnlist ::= columnname carglist */ yytestcase(yyruleno==330); + /* (331) nm ::= ID|INDEXED */ yytestcase(yyruleno==331); + /* (332) nm ::= STRING */ yytestcase(yyruleno==332); + /* (333) nm ::= JOIN_KW */ yytestcase(yyruleno==333); + /* (334) typetoken ::= typename */ yytestcase(yyruleno==334); + /* (335) typename ::= ID|STRING */ yytestcase(yyruleno==335); + /* (336) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=336); + /* (337) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=337); + /* (338) carglist ::= carglist ccons */ yytestcase(yyruleno==338); + /* (339) carglist ::= */ yytestcase(yyruleno==339); + /* (340) ccons ::= NULL onconf */ yytestcase(yyruleno==340); + /* (341) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==341); + /* (342) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==342); + /* (343) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=343); + /* (344) tconscomma ::= */ yytestcase(yyruleno==344); + /* (345) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=345); + /* (346) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=346); + /* (347) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=347); + /* (348) oneselect ::= values */ yytestcase(yyruleno==348); + /* (349) sclp ::= selcollist COMMA */ yytestcase(yyruleno==349); + /* (350) as ::= ID|STRING */ yytestcase(yyruleno==350); + /* (351) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=351); + /* (352) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==352); + /* (353) exprlist ::= nexprlist */ yytestcase(yyruleno==353); + /* (354) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=354); + /* (355) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=355); + /* (356) nmnum ::= ON */ yytestcase(yyruleno==356); + /* (357) nmnum ::= DELETE */ yytestcase(yyruleno==357); + /* (358) nmnum ::= DEFAULT */ yytestcase(yyruleno==358); + /* (359) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==359); + /* (360) foreach_clause ::= */ yytestcase(yyruleno==360); + /* (361) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==361); + /* (362) trnm ::= nm */ yytestcase(yyruleno==362); + /* (363) tridxby ::= */ yytestcase(yyruleno==363); + /* (364) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==364); + /* (365) database_kw_opt ::= */ yytestcase(yyruleno==365); + /* (366) kwcolumn_opt ::= */ yytestcase(yyruleno==366); + /* (367) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==367); + /* (368) vtabarglist ::= vtabarg */ yytestcase(yyruleno==368); + /* (369) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==369); + /* (370) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==370); + /* (371) anylist ::= */ yytestcase(yyruleno==371); + /* (372) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==372); + /* (373) anylist ::= anylist ANY */ yytestcase(yyruleno==373); + /* (374) with ::= */ yytestcase(yyruleno==374); break; /********** End reduce actions ************************************************/ }; - assert( yyruleno=SQLITE_N_KEYWORD ) return SQLITE_ERROR; *pzName = zKWText + aKWOffset[i]; @@ -152095,73 +153905,6 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ return i; } -#ifdef SQLITE_ENABLE_NORMALIZE -/* -** Return the length (in bytes) of the token that begins at z[0]. -** Store the token type in *tokenType before returning. If flags has -** SQLITE_TOKEN_NORMALIZE flag enabled, use the identifier token type -** for keywords. Add SQLITE_TOKEN_QUOTED to flags if the token was -** actually a quoted identifier. Add SQLITE_TOKEN_KEYWORD to flags -** if the token was recognized as a keyword; this is useful when the -** SQLITE_TOKEN_NORMALIZE flag is used, because it enables the caller -** to differentiate between a keyword being treated as an identifier -** (for normalization purposes) and an actual identifier. -*/ -SQLITE_PRIVATE int sqlite3GetTokenNormalized( - const unsigned char *z, - int *tokenType, - int *flags -){ - int n; - unsigned char iClass = aiClass[*z]; - if( iClass==CC_KYWD ){ - int i; - for(i=1; aiClass[z[i]]<=CC_KYWD; i++){} - if( IdChar(z[i]) ){ - /* This token started out using characters that can appear in keywords, - ** but z[i] is a character not allowed within keywords, so this must - ** be an identifier instead */ - i++; - while( IdChar(z[i]) ){ i++; } - *tokenType = TK_ID; - return i; - } - *tokenType = TK_ID; - n = keywordCode((char*)z, i, tokenType); - /* If the token is no longer considered to be an identifier, then it is a - ** keyword of some kind. Make the token back into an identifier and then - ** set the SQLITE_TOKEN_KEYWORD flag. Several non-identifier tokens are - ** used verbatim, including IN, IS, NOT, and NULL. */ - switch( *tokenType ){ - case TK_ID: { - /* do nothing, handled by caller */ - break; - } - case TK_IN: - case TK_IS: - case TK_NOT: - case TK_NULL: { - *flags |= SQLITE_TOKEN_KEYWORD; - break; - } - default: { - *tokenType = TK_ID; - *flags |= SQLITE_TOKEN_KEYWORD; - break; - } - } - }else{ - n = sqlite3GetToken(z, tokenType); - /* If the token is considered to be an identifier and the character class - ** of the first character is a quote, set the SQLITE_TOKEN_QUOTED flag. */ - if( *tokenType==TK_ID && (iClass==CC_QUOTE || iClass==CC_QUOTE2) ){ - *flags |= SQLITE_TOKEN_QUOTED; - } - } - return n; -} -#endif /* SQLITE_ENABLE_NORMALIZE */ - /* ** Run the parser on the given SQL string. The parser structure is ** passed in. An SQLITE_ status code is returned. If an error occurs @@ -152180,6 +153923,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr #ifdef sqlite3Parser_ENGINEALWAYSONSTACK yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif + VVA_ONLY( u8 startedWithOom = db->mallocFailed ); assert( zSql!=0 ); mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; @@ -152189,7 +153933,14 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr pParse->rc = SQLITE_OK; pParse->zTail = zSql; assert( pzErrMsg!=0 ); - /* sqlite3ParserTrace(stdout, "parser: "); */ +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_ParserTrace ){ + printf("parser: [[[%s]]]\n", zSql); + sqlite3ParserTrace(stdout, "parser: "); + }else{ + sqlite3ParserTrace(0, 0); + } +#endif #ifdef sqlite3Parser_ENGINEALWAYSONSTACK pEngine = &sEngine; sqlite3ParserInit(pEngine, pParse); @@ -152204,6 +153955,8 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr assert( pParse->pNewTrigger==0 ); assert( pParse->nVar==0 ); assert( pParse->pVList==0 ); + pParse->pParentParse = db->pParse; + db->pParse = pParse; while( 1 ){ n = sqlite3GetToken((u8*)zSql, &tokenType); mxSqlLen -= n; @@ -152260,7 +154013,8 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr sqlite3Parser(pEngine, tokenType, pParse->sLastToken); lastTokenParsed = tokenType; zSql += n; - if( pParse->rc!=SQLITE_OK || db->mallocFailed ) break; + assert( db->mallocFailed==0 || pParse->rc!=SQLITE_OK || startedWithOom ); + if( pParse->rc!=SQLITE_OK ) break; } assert( nErr==0 ); #ifdef YYTRACKMAXSTACKDEPTH @@ -152328,10 +154082,147 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr pParse->pZombieTab = p->pNextZombie; sqlite3DeleteTable(db, p); } + db->pParse = pParse->pParentParse; + pParse->pParentParse = 0; assert( nErr==0 || pParse->rc!=SQLITE_OK ); return nErr; } + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Insert a single space character into pStr if the current string +** ends with an identifier +*/ +static void addSpaceSeparator(sqlite3_str *pStr){ + if( pStr->nChar && sqlite3IsIdChar(pStr->zText[pStr->nChar-1]) ){ + sqlite3_str_append(pStr, " ", 1); + } +} + +/* +** Compute a normalization of the SQL given by zSql[0..nSql-1]. Return +** the normalization in space obtained from sqlite3DbMalloc(). Or return +** NULL if anything goes wrong or if zSql is NULL. +*/ +SQLITE_PRIVATE char *sqlite3Normalize( + Vdbe *pVdbe, /* VM being reprepared */ + const char *zSql /* The original SQL string */ +){ + sqlite3 *db; /* The database connection */ + int i; /* Next unread byte of zSql[] */ + int n; /* length of current token */ + int tokenType; /* type of current token */ + int prevType = 0; /* Previous non-whitespace token */ + int nParen; /* Number of nested levels of parentheses */ + int iStartIN; /* Start of RHS of IN operator in z[] */ + int nParenAtIN; /* Value of nParent at start of RHS of IN operator */ + int j; /* Bytes of normalized SQL generated so far */ + sqlite3_str *pStr; /* The normalized SQL string under construction */ + + db = sqlite3VdbeDb(pVdbe); + tokenType = -1; + nParen = iStartIN = nParenAtIN = 0; + pStr = sqlite3_str_new(db); + assert( pStr!=0 ); /* sqlite3_str_new() never returns NULL */ + for(i=0; zSql[i] && pStr->accError==0; i+=n){ + if( tokenType!=TK_SPACE ){ + prevType = tokenType; + } + n = sqlite3GetToken((unsigned char*)zSql+i, &tokenType); + if( NEVER(n<=0) ) break; + switch( tokenType ){ + case TK_SPACE: { + break; + } + case TK_NULL: { + if( prevType==TK_IS || prevType==TK_NOT ){ + sqlite3_str_append(pStr, " NULL", 5); + break; + } + /* Fall through */ + } + case TK_STRING: + case TK_INTEGER: + case TK_FLOAT: + case TK_VARIABLE: + case TK_BLOB: { + sqlite3_str_append(pStr, "?", 1); + break; + } + case TK_LP: { + nParen++; + if( prevType==TK_IN ){ + iStartIN = pStr->nChar; + nParenAtIN = nParen; + } + sqlite3_str_append(pStr, "(", 1); + break; + } + case TK_RP: { + if( iStartIN>0 && nParen==nParenAtIN ){ + assert( pStr->nChar>=iStartIN ); + pStr->nChar = iStartIN+1; + sqlite3_str_append(pStr, "?,?,?", 5); + iStartIN = 0; + } + nParen--; + sqlite3_str_append(pStr, ")", 1); + break; + } + case TK_ID: { + iStartIN = 0; + j = pStr->nChar; + if( sqlite3Isquote(zSql[i]) ){ + char *zId = sqlite3DbStrNDup(db, zSql+i, n); + int nId; + int eType = 0; + if( zId==0 ) break; + sqlite3Dequote(zId); + if( zSql[i]=='"' && sqlite3VdbeUsesDoubleQuotedString(pVdbe, zId) ){ + sqlite3_str_append(pStr, "?", 1); + sqlite3DbFree(db, zId); + break; + } + nId = sqlite3Strlen30(zId); + if( sqlite3GetToken((u8*)zId, &eType)==nId && eType==TK_ID ){ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zId, nId); + }else{ + sqlite3_str_appendf(pStr, "\"%w\"", zId); + } + sqlite3DbFree(db, zId); + }else{ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zSql+i, n); + } + while( jnChar ){ + pStr->zText[j] = sqlite3Tolower(pStr->zText[j]); + j++; + } + break; + } + case TK_SELECT: { + iStartIN = 0; + /* fall through */ + } + default: { + if( sqlite3IsIdChar(zSql[i]) ) addSpaceSeparator(pStr); + j = pStr->nChar; + sqlite3_str_append(pStr, zSql+i, n); + while( jnChar ){ + pStr->zText[j] = sqlite3Toupper(pStr->zText[j]); + j++; + } + break; + } + } + } + if( tokenType!=TK_SEMI ) sqlite3_str_append(pStr, ";", 1); + return sqlite3_str_finish(pStr); +} +#endif /* SQLITE_ENABLE_NORMALIZE */ + /************** End of tokenize.c ********************************************/ /************** Begin file complete.c ****************************************/ /* @@ -153377,6 +155268,13 @@ SQLITE_API int sqlite3_config(int op, ...){ } #endif /* SQLITE_ENABLE_SORTER_REFERENCES */ +#ifdef SQLITE_ENABLE_DESERIALIZE + case SQLITE_CONFIG_MEMDB_MAXSIZE: { + sqlite3GlobalConfig.mxMemdbSize = va_arg(ap, sqlite3_int64); + break; + } +#endif /* SQLITE_ENABLE_DESERIALIZE */ + default: { rc = SQLITE_ERROR; break; @@ -153422,7 +155320,7 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ pStart = 0; }else if( pBuf==0 ){ sqlite3BeginBenignMalloc(); - pStart = sqlite3Malloc( sz*cnt ); /* IMP: R-61949-35727 */ + pStart = sqlite3Malloc( sz*(sqlite3_int64)cnt ); /* IMP: R-61949-35727 */ sqlite3EndBenignMalloc(); if( pStart ) cnt = sqlite3MallocSize(pStart)/sz; }else{ @@ -153560,6 +155458,8 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ { SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_TriggerEQP }, { SQLITE_DBCONFIG_RESET_DATABASE, SQLITE_ResetDatabase }, { SQLITE_DBCONFIG_DEFENSIVE, SQLITE_Defensive }, + { SQLITE_DBCONFIG_WRITABLE_SCHEMA, SQLITE_WriteSchema| + SQLITE_NoSchemaError }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ @@ -153567,11 +155467,11 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ if( aFlagOp[i].op==op ){ int onoff = va_arg(ap, int); int *pRes = va_arg(ap, int*); - u32 oldFlags = db->flags; + u64 oldFlags = db->flags; if( onoff>0 ){ db->flags |= aFlagOp[i].mask; }else if( onoff==0 ){ - db->flags &= ~aFlagOp[i].mask; + db->flags &= ~(u64)aFlagOp[i].mask; } if( oldFlags!=db->flags ){ sqlite3ExpirePreparedStatements(db, 0); @@ -154034,7 +155934,7 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ /* Any deferred constraint violations have now been resolved. */ db->nDeferredCons = 0; db->nDeferredImmCons = 0; - db->flags &= ~SQLITE_DeferFKs; + db->flags &= ~(u64)SQLITE_DeferFKs; /* If one has been configured, invoke the rollback-hook callback */ if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ @@ -154776,6 +156676,8 @@ SQLITE_API void *sqlite3_profile( pOld = db->pProfileArg; db->xProfile = xProfile; db->pProfileArg = pArg; + db->mTrace &= SQLITE_TRACE_NONLEGACY_MASK; + if( db->xProfile ) db->mTrace |= SQLITE_TRACE_XPROFILE; sqlite3_mutex_leave(db->mutex); return pOld; } @@ -155127,7 +157029,7 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){ z = sqlite3ErrStr(SQLITE_NOMEM_BKPT); }else{ testcase( db->pErr==0 ); - z = (char*)sqlite3_value_text(db->pErr); + z = db->errCode ? (char*)sqlite3_value_text(db->pErr) : 0; assert( !db->mallocFailed ); if( z==0 ){ z = sqlite3ErrStr(db->errCode); @@ -155657,6 +157559,40 @@ SQLITE_PRIVATE int sqlite3ParseUri( return rc; } +#if defined(SQLITE_HAS_CODEC) +/* +** Process URI filename query parameters relevant to the SQLite Encryption +** Extension. Return true if any of the relevant query parameters are +** seen and return false if not. +*/ +SQLITE_PRIVATE int sqlite3CodecQueryParameters( + sqlite3 *db, /* Database connection */ + const char *zDb, /* Which schema is being created/attached */ + const char *zUri /* URI filename */ +){ + const char *zKey; + if( (zKey = sqlite3_uri_parameter(zUri, "hexkey"))!=0 && zKey[0] ){ + u8 iByte; + int i; + char zDecoded[40]; + for(i=0, iByte=0; i=0 ); return 5; @@ -158878,13 +160824,18 @@ static int fts3DestroyMethod(sqlite3_vtab *pVtab){ sqlite3 *db = p->db; /* Database handle */ /* Drop the shadow tables */ - if( p->zContentTbl==0 ){ - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_content'", zDb, p->zName); - } - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segments'", zDb,p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segdir'", zDb, p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_docsize'", zDb, p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_stat'", zDb, p->zName); + fts3DbExec(&rc, db, + "DROP TABLE IF EXISTS %Q.'%q_segments';" + "DROP TABLE IF EXISTS %Q.'%q_segdir';" + "DROP TABLE IF EXISTS %Q.'%q_docsize';" + "DROP TABLE IF EXISTS %Q.'%q_stat';" + "%s DROP TABLE IF EXISTS %Q.'%q_content';", + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + (p->zContentTbl ? "--" : ""), zDb,p->zName + ); /* If everything has worked, invoke fts3DisconnectMethod() to free the ** memory associated with the Fts3Table structure and return SQLITE_OK. @@ -159116,10 +161067,10 @@ static void fts3Appendf( ** memory. */ static char *fts3QuoteId(char const *zInput){ - int nRet; + sqlite3_int64 nRet; char *zRet; nRet = 2 + (int)strlen(zInput)*2 + 1; - zRet = sqlite3_malloc(nRet); + zRet = sqlite3_malloc64(nRet); if( zRet ){ int i; char *z = zRet; @@ -159300,7 +161251,7 @@ static int fts3PrefixParameter( } } - aIndex = sqlite3_malloc(sizeof(struct Fts3Index) * nIndex); + aIndex = sqlite3_malloc64(sizeof(struct Fts3Index) * nIndex); *apIndex = aIndex; if( !aIndex ){ return SQLITE_NOMEM; @@ -159379,7 +161330,7 @@ static int fts3ContentColumns( if( rc==SQLITE_OK ){ const char **azCol; /* Output array */ - int nStr = 0; /* Size of all column names (incl. 0x00) */ + sqlite3_int64 nStr = 0; /* Size of all column names (incl. 0x00) */ int nCol; /* Number of table columns */ int i; /* Used to iterate through columns */ @@ -159389,11 +161340,11 @@ static int fts3ContentColumns( nCol = sqlite3_column_count(pStmt); for(i=0; i=0 && nSuffix>=0 ); - if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr ){ + if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr || nSuffix==0 ){ rc = FTS_CORRUPT_VTAB; goto finish_scan; } @@ -160452,7 +162403,7 @@ static int fts3PutColNumber(char **pp, int iCol){ ** updated appropriately. The caller is responsible for insuring ** that there is enough space in *pp to hold the complete output. */ -static void fts3PoslistMerge( +static int fts3PoslistMerge( char **pp, /* Output buffer */ char **pp1, /* Left input list */ char **pp2 /* Right input list */ @@ -160465,11 +162416,17 @@ static void fts3PoslistMerge( int iCol1; /* The current column index in pp1 */ int iCol2; /* The current column index in pp2 */ - if( *p1==POS_COLUMN ) fts3GetVarint32(&p1[1], &iCol1); + if( *p1==POS_COLUMN ){ + fts3GetVarint32(&p1[1], &iCol1); + if( iCol1==0 ) return FTS_CORRUPT_VTAB; + } else if( *p1==POS_END ) iCol1 = POSITION_LIST_END; else iCol1 = 0; - if( *p2==POS_COLUMN ) fts3GetVarint32(&p2[1], &iCol2); + if( *p2==POS_COLUMN ){ + fts3GetVarint32(&p2[1], &iCol2); + if( iCol2==0 ) return FTS_CORRUPT_VTAB; + } else if( *p2==POS_END ) iCol2 = POSITION_LIST_END; else iCol2 = 0; @@ -160517,6 +162474,7 @@ static void fts3PoslistMerge( *pp = p; *pp1 = p1 + 1; *pp2 = p2 + 1; + return SQLITE_OK; } /* @@ -160581,10 +162539,9 @@ static int fts3PoslistPhraseMerge( p += sqlite3Fts3PutVarint(p, iCol1); } - assert( *p1!=POS_END && *p1!=POS_COLUMN ); - assert( *p2!=POS_END && *p2!=POS_COLUMN ); fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2; fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2; + if( iPos1<0 || iPos2<0 ) break; while( 1 ){ if( iPos2==iPos1+nToken @@ -160810,6 +162767,7 @@ static int fts3DoclistOrMerge( char *a2, int n2, /* Second doclist */ char **paOut, int *pnOut /* OUT: Malloc'd doclist */ ){ + int rc = SQLITE_OK; sqlite3_int64 i1 = 0; sqlite3_int64 i2 = 0; sqlite3_int64 iPrev = 0; @@ -160853,7 +162811,7 @@ static int fts3DoclistOrMerge( ** A symetric argument may be made if the doclists are in descending ** order. */ - aOut = sqlite3_malloc(n1+n2+FTS3_VARINT_MAX-1); + aOut = sqlite3_malloc64((i64)n1+n2+FTS3_VARINT_MAX-1+FTS3_BUFFER_PADDING); if( !aOut ) return SQLITE_NOMEM; p = aOut; @@ -160864,7 +162822,8 @@ static int fts3DoclistOrMerge( if( p2 && p1 && iDiff==0 ){ fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); - fts3PoslistMerge(&p, &p1, &p2); + rc = fts3PoslistMerge(&p, &p1, &p2); + if( rc ) break; fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); }else if( !p2 || (p1 && iDiff<0) ){ @@ -160878,10 +162837,16 @@ static int fts3DoclistOrMerge( } } + if( rc!=SQLITE_OK ){ + sqlite3_free(aOut); + p = aOut = 0; + }else{ + assert( (p-aOut)<=n1+n2+FTS3_VARINT_MAX-1 ); + memset(&aOut[(p-aOut)], 0, FTS3_BUFFER_PADDING); + } *paOut = aOut; *pnOut = (int)(p-aOut); - assert( *pnOut<=n1+n2+FTS3_VARINT_MAX-1 ); - return SQLITE_OK; + return rc; } /* @@ -160916,7 +162881,7 @@ static int fts3DoclistPhraseMerge( assert( nDist>0 ); if( bDescDoclist ){ - aOut = sqlite3_malloc(*pnRight + FTS3_VARINT_MAX); + aOut = sqlite3_malloc64((sqlite3_int64)*pnRight + FTS3_VARINT_MAX); if( aOut==0 ) return SQLITE_NOMEM; }else{ aOut = aRight; @@ -161100,6 +163065,7 @@ static int fts3TermSelectMerge( pTS->anOutput[0] = nDoclist; if( pTS->aaOutput[0] ){ memcpy(pTS->aaOutput[0], aDoclist, nDoclist); + memset(&pTS->aaOutput[0][nDoclist], 0, FTS3_VARINT_MAX); }else{ return SQLITE_NOMEM; } @@ -161151,8 +163117,8 @@ static int fts3SegReaderCursorAppend( ){ if( (pCsr->nSegment%16)==0 ){ Fts3SegReader **apNew; - int nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); - apNew = (Fts3SegReader **)sqlite3_realloc(pCsr->apSegment, nByte); + sqlite3_int64 nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); + apNew = (Fts3SegReader **)sqlite3_realloc64(pCsr->apSegment, nByte); if( !apNew ){ sqlite3Fts3SegReaderFree(pNew); return SQLITE_NOMEM; @@ -161216,7 +163182,7 @@ static int fts3SegReaderCursor( /* If zTerm is not NULL, and this segment is not stored entirely on its ** root node, the range of leaves scanned can be reduced. Do this. */ - if( iStartBlock && zTerm ){ + if( iStartBlock && zTerm && zRoot ){ sqlite3_int64 *pi = (isPrefix ? &iLeavesEndBlock : 0); rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &iStartBlock, pi); if( rc!=SQLITE_OK ) goto finished; @@ -162158,7 +164124,6 @@ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ Fts3Table *p = (Fts3Table*)pVtab; UNUSED_PARAMETER(iSavepoint); assert( p->inTransaction ); - assert( p->mxSavepoint >= iSavepoint ); TESTONLY( p->mxSavepoint = iSavepoint ); sqlite3Fts3PendingTermsClear(p); return SQLITE_OK; @@ -162933,9 +164898,10 @@ static int fts3EvalIncrPhraseNext( if( bEof==0 ){ int nList = 0; int nByte = a[p->nToken-1].nList; - char *aDoclist = sqlite3_malloc(nByte+1); + char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); if( !aDoclist ) return SQLITE_NOMEM; memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); + memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); for(i=0; i<(p->nToken-1); i++){ if( a[i].bIgnore==0 ){ @@ -163326,7 +165292,7 @@ static int fts3EvalStart(Fts3Cursor *pCsr){ if( rc==SQLITE_OK && nToken>1 && pTab->bFts4 ){ Fts3TokenAndCost *aTC; Fts3Expr **apOr; - aTC = (Fts3TokenAndCost *)sqlite3_malloc( + aTC = (Fts3TokenAndCost *)sqlite3_malloc64( sizeof(Fts3TokenAndCost) * nToken + sizeof(Fts3Expr *) * nOr * 2 ); @@ -163637,7 +165603,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) ){ Fts3Expr *p; - int nTmp = 0; /* Bytes of temp space */ + sqlite3_int64 nTmp = 0; /* Bytes of temp space */ char *aTmp; /* Temp space for PoslistNearMerge() */ /* Allocate temporary working space. */ @@ -163646,7 +165612,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ nTmp += p->pRight->pPhrase->doclist.nList; } nTmp += p->pPhrase->doclist.nList; - aTmp = sqlite3_malloc(nTmp*2); + aTmp = sqlite3_malloc64(nTmp*2); if( !aTmp ){ *pRc = SQLITE_NOMEM; res = 0; @@ -163916,15 +165882,14 @@ static void fts3EvalRestart( ** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase ** expression nodes. */ -static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ +static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){ if( pExpr ){ Fts3Phrase *pPhrase = pExpr->pPhrase; if( pPhrase && pPhrase->doclist.pList ){ int iCol = 0; char *p = pPhrase->doclist.pList; - assert( *p ); - while( 1 ){ + do{ u8 c = 0; int iCnt = 0; while( 0xFE & (*p | c) ){ @@ -163940,11 +165905,11 @@ static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ if( *p==0x00 ) break; p++; p += fts3GetVarint32(p, &iCol); - } + }while( iColpLeft); - fts3EvalUpdateCounts(pExpr->pRight); + fts3EvalUpdateCounts(pExpr->pLeft, nCol); + fts3EvalUpdateCounts(pExpr->pRight, nCol); } } @@ -163988,7 +165953,7 @@ static int fts3EvalGatherStats( for(p=pRoot; p; p=p->pLeft){ Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight); assert( pE->aMI==0 ); - pE->aMI = (u32 *)sqlite3_malloc(pTab->nColumn * 3 * sizeof(u32)); + pE->aMI = (u32 *)sqlite3_malloc64(pTab->nColumn * 3 * sizeof(u32)); if( !pE->aMI ) return SQLITE_NOMEM; memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32)); } @@ -164014,7 +165979,7 @@ static int fts3EvalGatherStats( ); if( rc==SQLITE_OK && pCsr->isEof==0 ){ - fts3EvalUpdateCounts(pRoot); + fts3EvalUpdateCounts(pRoot, pTab->nColumn); } } @@ -164364,7 +166329,7 @@ static int fts3auxConnectMethod( char const *zFts3; /* Name of fts3 table */ int nDb; /* Result of strlen(zDb) */ int nFts3; /* Result of strlen(zFts3) */ - int nByte; /* Bytes of space to allocate here */ + sqlite3_int64 nByte; /* Bytes of space to allocate here */ int rc; /* value returned by declare_vtab() */ Fts3auxTable *p; /* Virtual table object to return */ @@ -164396,7 +166361,7 @@ static int fts3auxConnectMethod( if( rc!=SQLITE_OK ) return rc; nByte = sizeof(Fts3auxTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; - p = (Fts3auxTable *)sqlite3_malloc(nByte); + p = (Fts3auxTable *)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); @@ -164546,7 +166511,7 @@ static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){ static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ if( nSize>pCsr->nStat ){ struct Fts3auxColstats *aNew; - aNew = (struct Fts3auxColstats *)sqlite3_realloc(pCsr->aStat, + aNew = (struct Fts3auxColstats *)sqlite3_realloc64(pCsr->aStat, sizeof(struct Fts3auxColstats) * nSize ); if( aNew==0 ) return SQLITE_NOMEM; @@ -164714,15 +166679,15 @@ static int fts3auxFilterMethod( assert( (iEq==0 && iGe==-1) || (iEq==-1 && iGe==0) ); if( zStr ){ pCsr->filter.zTerm = sqlite3_mprintf("%s", zStr); - pCsr->filter.nTerm = sqlite3_value_bytes(apVal[0]); if( pCsr->filter.zTerm==0 ) return SQLITE_NOMEM; + pCsr->filter.nTerm = (int)strlen(pCsr->filter.zTerm); } } if( iLe>=0 ){ pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iLe])); - pCsr->nStop = sqlite3_value_bytes(apVal[iLe]); if( pCsr->zStop==0 ) return SQLITE_NOMEM; + pCsr->nStop = (int)strlen(pCsr->zStop); } if( iLangid>=0 ){ @@ -164974,8 +166939,8 @@ static int fts3isspace(char c){ ** zero the memory before returning a pointer to it. If unsuccessful, ** return NULL. */ -static void *fts3MallocZero(int nByte){ - void *pRet = sqlite3_malloc(nByte); +static void *fts3MallocZero(sqlite3_int64 nByte){ + void *pRet = sqlite3_malloc64(nByte); if( pRet ) memset(pRet, 0, nByte); return pRet; } @@ -165050,7 +167015,7 @@ static int getNextToken( if( rc==SQLITE_OK ){ const char *zToken; int nToken = 0, iStart = 0, iEnd = 0, iPosition = 0; - int nByte; /* total space to allocate */ + sqlite3_int64 nByte; /* total space to allocate */ rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); if( rc==SQLITE_OK ){ @@ -165104,8 +167069,8 @@ static int getNextToken( ** Enlarge a memory allocation. If an out-of-memory allocation occurs, ** then free the old allocation. */ -static void *fts3ReallocOrFree(void *pOrig, int nNew){ - void *pRet = sqlite3_realloc(pOrig, nNew); +static void *fts3ReallocOrFree(void *pOrig, sqlite3_int64 nNew){ + void *pRet = sqlite3_realloc64(pOrig, nNew); if( !pRet ){ sqlite3_free(pOrig); } @@ -165349,7 +167314,6 @@ static int getNextNode( int nConsumed = 0; pParse->nNest++; rc = fts3ExprParse(pParse, zInput+1, nInput-1, ppExpr, &nConsumed); - if( rc==SQLITE_OK && !*ppExpr ){ rc = SQLITE_DONE; } *pnConsumed = (int)(zInput - z) + 1 + nConsumed; return rc; }else if( *zInput==')' ){ @@ -165648,7 +167612,7 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ if( rc==SQLITE_OK ){ if( (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ Fts3Expr **apLeaf; - apLeaf = (Fts3Expr **)sqlite3_malloc(sizeof(Fts3Expr *) * nMaxDepth); + apLeaf = (Fts3Expr **)sqlite3_malloc64(sizeof(Fts3Expr *) * nMaxDepth); if( 0==apLeaf ){ rc = SQLITE_NOMEM; }else{ @@ -166068,7 +168032,7 @@ static void fts3ExprTestCommon( zExpr = (const char *)sqlite3_value_text(argv[1]); nExpr = sqlite3_value_bytes(argv[1]); nCol = argc-2; - azCol = (char **)sqlite3_malloc(nCol*sizeof(char *)); + azCol = (char **)sqlite3_malloc64(nCol*sizeof(char *)); if( !azCol ){ sqlite3_result_error_nomem(context); goto exprtest_out; @@ -166182,8 +168146,8 @@ SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash *pHash /* ** Malloc and Free functions */ -static void *fts3HashMalloc(int n){ - void *p = sqlite3_malloc(n); +static void *fts3HashMalloc(sqlite3_int64 n){ + void *p = sqlite3_malloc64(n); if( p ){ memset(p, 0, n); } @@ -167277,7 +169241,7 @@ static void fts3TokenizerFunc( nName = sqlite3_value_bytes(argv[0])+1; if( argc==2 ){ - if( fts3TokenizerEnabled(context) ){ + if( fts3TokenizerEnabled(context) || sqlite3_value_frombind(argv[1]) ){ void *pOld; int n = sqlite3_value_bytes(argv[1]); if( zName==0 || n!=sizeof(pPtr) ){ @@ -167304,7 +169268,9 @@ static void fts3TokenizerFunc( return; } } - sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + if( fts3TokenizerEnabled(context) || sqlite3_value_frombind(argv[0]) ){ + sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + } } SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char c){ @@ -167392,8 +169358,8 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( int iArg = 0; z = &z[n+1]; while( zzInput = sqlite3_malloc(nByte+1); + pCsr->zInput = sqlite3_malloc64(nByte+1); if( pCsr->zInput==0 ){ rc = SQLITE_NOMEM; }else{ @@ -168808,10 +170774,12 @@ static int fts3SqlStmt( pStmt = p->aStmt[eStmt]; if( !pStmt ){ + int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; char *zSql; if( eStmt==SQL_CONTENT_INSERT ){ zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName, p->zWriteExprlist); }else if( eStmt==SQL_SELECT_CONTENT_BY_ROWID ){ + f &= ~SQLITE_PREPARE_NO_VTAB; zSql = sqlite3_mprintf(azSql[eStmt], p->zReadExprlist); }else{ zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName); @@ -168819,8 +170787,7 @@ static int fts3SqlStmt( if( !zSql ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(p->db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - &pStmt, NULL); + rc = sqlite3_prepare_v3(p->db, zSql, -1, f, &pStmt, NULL); sqlite3_free(zSql); assert( rc==SQLITE_OK || pStmt==0 ); p->aStmt[eStmt] = pStmt; @@ -168978,7 +170945,7 @@ static sqlite3_int64 getAbsoluteLevel( int iLevel /* Level of segments */ ){ sqlite3_int64 iBase; /* First absolute level for iLangid/iIndex */ - assert( iLangid>=0 ); + assert_fts3_nc( iLangid>=0 ); assert( p->nIndex>0 ); assert( iIndex>=0 && iIndexnIndex ); @@ -169759,7 +171726,9 @@ static int fts3SegReaderNext( /* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf ** blocks have already been traversed. */ - assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock ); +#ifdef CORRUPT_DB + assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock || CORRUPT_DB ); +#endif if( pReader->iCurrentBlock>=pReader->iLeafEndBlock ){ return SQLITE_OK; } @@ -169820,7 +171789,7 @@ static int fts3SegReaderNext( ** b-tree node. And that the final byte of the doclist is 0x00. If either ** of these statements is untrue, then the data structure is corrupt. */ - if( (&pReader->aNode[pReader->nNode] - pReader->aDoclist)nDoclist + if( pReader->nDoclist > pReader->nNode-(pReader->aDoclist-pReader->aNode) || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) ){ return FTS_CORRUPT_VTAB; @@ -170020,8 +171989,13 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( Fts3SegReader *pReader; /* Newly allocated SegReader object */ int nExtra = 0; /* Bytes to allocate segment root node */ - assert( iStartLeaf<=iEndLeaf ); + assert( zRoot!=0 || nRoot==0 ); +#ifdef CORRUPT_DB + assert( zRoot!=0 || CORRUPT_DB ); +#endif + if( iStartLeaf==0 ){ + if( iEndLeaf!=0 ) return FTS_CORRUPT_VTAB; nExtra = nRoot + FTS3_NODE_PADDING; } @@ -170041,7 +172015,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( pReader->aNode = (char *)&pReader[1]; pReader->rootOnly = 1; pReader->nNode = nRoot; - memcpy(pReader->aNode, zRoot, nRoot); + if( nRoot ) memcpy(pReader->aNode, zRoot, nRoot); memset(&pReader->aNode[nRoot], 0, FTS3_NODE_PADDING); }else{ pReader->iCurrentBlock = iStartLeaf-1; @@ -170156,8 +172130,9 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( } if( nElem>0 ){ - int nByte = sizeof(Fts3SegReader) + (nElem+1)*sizeof(Fts3HashElem *); - pReader = (Fts3SegReader *)sqlite3_malloc(nByte); + sqlite3_int64 nByte; + nByte = sizeof(Fts3SegReader) + (nElem+1)*sizeof(Fts3HashElem *); + pReader = (Fts3SegReader *)sqlite3_malloc64(nByte); if( !pReader ){ rc = SQLITE_NOMEM; }else{ @@ -170661,6 +172636,11 @@ static int fts3SegWriterAdd( nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm); nSuffix = nTerm-nPrefix; + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + /* Figure out how many bytes are required by this new entry */ nReq = sqlite3Fts3VarintLen(nPrefix) + /* varint containing prefix size */ sqlite3Fts3VarintLen(nSuffix) + /* varint containing suffix size */ @@ -171368,7 +173348,9 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( }else{ iDelta = iDocid - iPrev; } - assert( iDelta>0 || (nDoclist==0 && iDelta==iDocid) ); + if( iDelta<=0 && (nDoclist>0 || iDelta!=iDocid) ){ + return FTS_CORRUPT_VTAB; + } assert( nDoclist>0 || iDelta==iDocid ); nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); @@ -171634,8 +173616,10 @@ static int fts3SegmentMerge( if( rc!=SQLITE_OK ) goto finished; assert( csr.nSegment>0 ); - assert( iNewLevel>=getAbsoluteLevel(p, iLangid, iIndex, 0) ); - assert( iNewLevel=getAbsoluteLevel(p, iLangid, iIndex, 0) ); + assert_fts3_nc( + iNewLevelnColumn ); + pBlob = sqlite3_malloc64( 10*(sqlite3_int64)p->nColumn ); if( pBlob==0 ){ *pRC = SQLITE_NOMEM; return; @@ -171810,7 +173796,7 @@ static void fts3UpdateDocTotals( const int nStat = p->nColumn+2; if( *pRC ) return; - a = sqlite3_malloc( (sizeof(u32)+10)*nStat ); + a = sqlite3_malloc64( (sizeof(u32)+10)*(sqlite3_int64)nStat ); if( a==0 ){ *pRC = SQLITE_NOMEM; return; @@ -171931,8 +173917,8 @@ static int fts3DoRebuild(Fts3Table *p){ } if( rc==SQLITE_OK ){ - int nByte = sizeof(u32) * (p->nColumn+1)*3; - aSz = (u32 *)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(u32) * ((sqlite3_int64)p->nColumn+1)*3; + aSz = (u32 *)sqlite3_malloc64(nByte); if( aSz==0 ){ rc = SQLITE_NOMEM; }else{ @@ -171998,12 +173984,12 @@ static int fts3IncrmergeCsr( ){ int rc; /* Return Code */ sqlite3_stmt *pStmt = 0; /* Statement used to read %_segdir entry */ - int nByte; /* Bytes allocated at pCsr->apSegment[] */ + sqlite3_int64 nByte; /* Bytes allocated at pCsr->apSegment[] */ /* Allocate space for the Fts3MultiSegReader.aCsr[] array */ memset(pCsr, 0, sizeof(*pCsr)); nByte = sizeof(Fts3SegReader *) * nSeg; - pCsr->apSegment = (Fts3SegReader **)sqlite3_malloc(nByte); + pCsr->apSegment = (Fts3SegReader **)sqlite3_malloc64(nByte); if( pCsr->apSegment==0 ){ rc = SQLITE_NOMEM; @@ -172147,7 +174133,7 @@ static int nodeReaderNext(NodeReader *p){ p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &nSuffix); if( nPrefix>p->iOff || nSuffix>p->nNode-p->iOff ){ - return SQLITE_CORRUPT_VTAB; + return FTS_CORRUPT_VTAB; } blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc); if( rc==SQLITE_OK ){ @@ -172157,7 +174143,7 @@ static int nodeReaderNext(NodeReader *p){ if( p->iChild==0 ){ p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist); if( (p->nNode-p->iOff)nDoclist ){ - return SQLITE_CORRUPT_VTAB; + return FTS_CORRUPT_VTAB; } p->aDoclist = &p->aNode[p->iOff]; p->iOff += p->nDoclist; @@ -173983,7 +175969,7 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( } /* Allocate space to hold the change in document sizes */ - aSzDel = sqlite3_malloc( sizeof(aSzDel[0])*(p->nColumn+1)*2 ); + aSzDel = sqlite3_malloc64(sizeof(aSzDel[0])*((sqlite3_int64)p->nColumn+1)*2); if( aSzDel==0 ){ rc = SQLITE_NOMEM; goto update_out; @@ -174237,17 +176223,19 @@ struct StrBuffer { /* ** Allocate a two-slot MatchinfoBuffer object. */ -static MatchinfoBuffer *fts3MIBufferNew(int nElem, const char *zMatchinfo){ +static MatchinfoBuffer *fts3MIBufferNew(size_t nElem, const char *zMatchinfo){ MatchinfoBuffer *pRet; - int nByte = sizeof(u32) * (2*nElem + 1) + sizeof(MatchinfoBuffer); - int nStr = (int)strlen(zMatchinfo); + sqlite3_int64 nByte = sizeof(u32) * (2*(sqlite3_int64)nElem + 1) + + sizeof(MatchinfoBuffer); + sqlite3_int64 nStr = strlen(zMatchinfo); - pRet = sqlite3_malloc(nByte + nStr+1); + pRet = sqlite3_malloc64(nByte + nStr+1); if( pRet ){ memset(pRet, 0, nByte); pRet->aMatchinfo[0] = (u8*)(&pRet->aMatchinfo[1]) - (u8*)pRet; - pRet->aMatchinfo[1+nElem] = pRet->aMatchinfo[0] + sizeof(u32)*(nElem+1); - pRet->nElem = nElem; + pRet->aMatchinfo[1+nElem] = pRet->aMatchinfo[0] + + sizeof(u32)*((int)nElem+1); + pRet->nElem = (int)nElem; pRet->zMatchinfo = ((char*)pRet) + nByte; memcpy(pRet->zMatchinfo, zMatchinfo, nStr+1); pRet->aRef[0] = 1; @@ -174287,7 +176275,7 @@ static void (*fts3MIBufferAlloc(MatchinfoBuffer *p, u32 **paOut))(void*){ aOut = &p->aMatchinfo[p->nElem+2]; xRet = fts3MIBufferFree; }else{ - aOut = (u32*)sqlite3_malloc(p->nElem * sizeof(u32)); + aOut = (u32*)sqlite3_malloc64(p->nElem * sizeof(u32)); if( aOut ){ xRet = sqlite3_free; if( p->bGlobal ) memcpy(aOut, &p->aMatchinfo[1], p->nElem*sizeof(u32)); @@ -174538,11 +176526,12 @@ static void fts3SnippetDetails( char *pCsr = pPhrase->pTail; int iCsr = pPhrase->iTail; - while( iCsr<(iStart+pIter->nSnippet) ){ + while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){ int j; u64 mPhrase = (u64)1 << i; u64 mPos = (u64)1 << (iCsr - iStart); - assert( iCsr>=iStart ); + assert( iCsr>=iStart && (iCsr - iStart)<=64 ); + assert( i>=0 && i<=64 ); if( (mCover|mCovered)&mPhrase ){ iScore++; }else{ @@ -174584,11 +176573,14 @@ static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ int iFirst = 0; pPhrase->pList = pCsr; fts3GetDeltaPosition(&pCsr, &iFirst); - assert( iFirst>=0 ); - pPhrase->pHead = pCsr; - pPhrase->pTail = pCsr; - pPhrase->iHead = iFirst; - pPhrase->iTail = iFirst; + if( iFirst<0 ){ + rc = FTS_CORRUPT_VTAB; + }else{ + pPhrase->pHead = pCsr; + pPhrase->pTail = pCsr; + pPhrase->iHead = iFirst; + pPhrase->iTail = iFirst; + } }else{ assert( rc!=SQLITE_OK || ( pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0 @@ -174625,7 +176617,7 @@ static int fts3BestSnippet( int rc; /* Return Code */ int nList; /* Number of phrases in expression */ SnippetIter sIter; /* Iterates through snippet candidates */ - int nByte; /* Number of bytes of space to allocate */ + sqlite3_int64 nByte; /* Number of bytes of space to allocate */ int iBestScore = -1; /* Best snippet score found so far */ int i; /* Loop counter */ @@ -174643,7 +176635,7 @@ static int fts3BestSnippet( ** the required space using malloc(). */ nByte = sizeof(SnippetPhrase) * nList; - sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc(nByte); + sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc64(nByte); if( !sIter.aPhrase ){ return SQLITE_NOMEM; } @@ -174713,8 +176705,8 @@ static int fts3StringAppend( ** appended data. */ if( pStr->n+nAppend+1>=pStr->nAlloc ){ - int nAlloc = pStr->nAlloc+nAppend+100; - char *zNew = sqlite3_realloc(pStr->z, nAlloc); + sqlite3_int64 nAlloc = pStr->nAlloc+(sqlite3_int64)nAppend+100; + char *zNew = sqlite3_realloc64(pStr->z, nAlloc); if( !zNew ){ return SQLITE_NOMEM; } @@ -174769,6 +176761,7 @@ static int fts3SnippetShift( for(nLeft=0; !(hlmask & ((u64)1 << nLeft)); nLeft++); for(nRight=0; !(hlmask & ((u64)1 << (nSnippet-1-nRight))); nRight++); + assert( (nSnippet-1-nRight)<=63 && (nSnippet-1-nRight)>=0 ); nDesired = (nLeft-nRight)/2; /* Ideally, the start of the snippet should be pushed forward in the @@ -174961,7 +176954,7 @@ static int fts3ColumnlistCount(char **ppCollist){ /* ** This function gathers 'y' or 'b' data for a single phrase. */ -static void fts3ExprLHits( +static int fts3ExprLHits( Fts3Expr *pExpr, /* Phrase expression node */ MatchInfo *p /* Matchinfo context */ ){ @@ -174991,25 +176984,29 @@ static void fts3ExprLHits( if( *pIter!=0x01 ) break; pIter++; pIter += fts3GetVarint32(pIter, &iCol); + if( iCol>=p->nCol ) return FTS_CORRUPT_VTAB; } + return SQLITE_OK; } /* ** Gather the results for matchinfo directives 'y' and 'b'. */ -static void fts3ExprLHitGather( +static int fts3ExprLHitGather( Fts3Expr *pExpr, MatchInfo *p ){ + int rc = SQLITE_OK; assert( (pExpr->pLeft==0)==(pExpr->pRight==0) ); if( pExpr->bEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){ if( pExpr->pLeft ){ - fts3ExprLHitGather(pExpr->pLeft, p); - fts3ExprLHitGather(pExpr->pRight, p); + rc = fts3ExprLHitGather(pExpr->pLeft, p); + if( rc==SQLITE_OK ) rc = fts3ExprLHitGather(pExpr->pRight, p); }else{ - fts3ExprLHits(pExpr, p); + rc = fts3ExprLHits(pExpr, p); } } + return rc; } /* @@ -175099,8 +177096,8 @@ static int fts3MatchinfoCheck( return SQLITE_ERROR; } -static int fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ - int nVal; /* Number of integers output by cArg */ +static size_t fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ + size_t nVal; /* Number of integers output by cArg */ switch( cArg ){ case FTS3_MATCHINFO_NDOC: @@ -175226,11 +177223,12 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ int i; int iCol; int nToken = 0; + int rc = SQLITE_OK; /* Allocate and populate the array of LcsIterator objects. The array ** contains one element for each matchable phrase in the query. **/ - aIter = sqlite3_malloc(sizeof(LcsIterator) * pCsr->nPhrase); + aIter = sqlite3_malloc64(sizeof(LcsIterator) * pCsr->nPhrase); if( !aIter ) return SQLITE_NOMEM; memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase); (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter); @@ -175246,13 +177244,16 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ int nLive = 0; /* Number of iterators in aIter not at EOF */ for(i=0; inPhrase; i++){ - int rc; LcsIterator *pIt = &aIter[i]; rc = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol, &pIt->pRead); - if( rc!=SQLITE_OK ) return rc; + if( rc!=SQLITE_OK ) goto matchinfo_lcs_out; if( pIt->pRead ){ pIt->iPos = pIt->iPosOffset; - fts3LcsIteratorAdvance(&aIter[i]); + fts3LcsIteratorAdvance(pIt); + if( pIt->pRead==0 ){ + rc = FTS_CORRUPT_VTAB; + goto matchinfo_lcs_out; + } nLive++; } } @@ -175284,8 +177285,9 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ pInfo->aMatchinfo[iCol] = nLcs; } + matchinfo_lcs_out: sqlite3_free(aIter); - return SQLITE_OK; + return rc; } /* @@ -175379,9 +177381,9 @@ static int fts3MatchinfoValues( case FTS3_MATCHINFO_LHITS_BM: case FTS3_MATCHINFO_LHITS: { - int nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); + size_t nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); memset(pInfo->aMatchinfo, 0, nZero); - fts3ExprLHitGather(pCsr->pExpr, pInfo); + rc = fts3ExprLHitGather(pCsr->pExpr, pInfo); break; } @@ -175448,7 +177450,7 @@ static void fts3GetMatchinfo( ** initialize those elements that are constant for every row. */ if( pCsr->pMIBuffer==0 ){ - int nMatchinfo = 0; /* Number of u32 elements in match-info */ + size_t nMatchinfo = 0; /* Number of u32 elements in match-info */ int i; /* Used to iterate through zArg */ /* Determine the number of phrases in the query */ @@ -175533,6 +177535,10 @@ SQLITE_PRIVATE void sqlite3Fts3Snippet( return; } + /* Limit the snippet length to 64 tokens. */ + if( nToken<-64 ) nToken = -64; + if( nToken>+64 ) nToken = +64; + for(nSnippet=1; 1; nSnippet++){ int iSnip; /* Loop counter 0..nSnippet-1 */ @@ -175634,7 +177640,7 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ nTerm = pExpr->pPhrase->nToken; if( pList ){ fts3GetDeltaPosition(&pList, &iPos); - assert( iPos>=0 ); + assert_fts3_nc( iPos>=0 ); } for(iTerm=0; iTermpList) ){ pTerm->pList = 0; }else{ @@ -175900,7 +177906,7 @@ typedef struct unicode_cursor unicode_cursor; struct unicode_tokenizer { sqlite3_tokenizer base; - int bRemoveDiacritic; + int eRemoveDiacritic; int nException; int *aiException; }; @@ -175973,7 +177979,7 @@ static int unicodeAddExceptions( int *aNew; /* New aiException[] array */ int nNew; /* Number of valid entries in array aNew[] */ - aNew = sqlite3_realloc(p->aiException, (p->nException+nEntry)*sizeof(int)); + aNew = sqlite3_realloc64(p->aiException,(p->nException+nEntry)*sizeof(int)); if( aNew==0 ) return SQLITE_NOMEM; nNew = p->nException; @@ -176045,17 +178051,20 @@ static int unicodeCreate( pNew = (unicode_tokenizer *) sqlite3_malloc(sizeof(unicode_tokenizer)); if( pNew==NULL ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(unicode_tokenizer)); - pNew->bRemoveDiacritic = 1; + pNew->eRemoveDiacritic = 1; for(i=0; rc==SQLITE_OK && ibRemoveDiacritic = 1; + pNew->eRemoveDiacritic = 1; } else if( n==19 && memcmp("remove_diacritics=0", z, 19)==0 ){ - pNew->bRemoveDiacritic = 0; + pNew->eRemoveDiacritic = 0; + } + else if( n==19 && memcmp("remove_diacritics=2", z, 19)==0 ){ + pNew->eRemoveDiacritic = 2; } else if( n>=11 && memcmp("tokenchars=", z, 11)==0 ){ rc = unicodeAddExceptions(pNew, 1, &z[11], n-11); @@ -176159,7 +178168,7 @@ static int unicodeNext( /* Grow the output buffer if required. */ if( (zOut-pCsr->zToken)>=(pCsr->nAlloc-4) ){ - char *zNew = sqlite3_realloc(pCsr->zToken, pCsr->nAlloc+64); + char *zNew = sqlite3_realloc64(pCsr->zToken, pCsr->nAlloc+64); if( !zNew ) return SQLITE_NOMEM; zOut = &zNew[zOut - pCsr->zToken]; pCsr->zToken = zNew; @@ -176168,7 +178177,7 @@ static int unicodeNext( /* Write the folded case of the last character read to the output */ zEnd = z; - iOut = sqlite3FtsUnicodeFold((int)iCode, p->bRemoveDiacritic); + iOut = sqlite3FtsUnicodeFold((int)iCode, p->eRemoveDiacritic); if( iOut ){ WRITE_UTF8(zOut, iOut); } @@ -176213,7 +178222,7 @@ SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const * /************** End of fts3_unicode.c ****************************************/ /************** Begin file fts3_unicode2.c ***********************************/ /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -176373,32 +178382,48 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ ** E"). The resuls of passing a codepoint that corresponds to an ** uppercase letter are undefined. */ -static int remove_diacritic(int c){ +static int remove_diacritic(int c, int bComplex){ unsigned short aDia[] = { 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, - 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928, - 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234, - 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504, - 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529, - 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726, - 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122, - 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536, - 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730, - 62924, 63050, 63082, 63274, 63390, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, }; - char aChar[] = { - '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', - 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', - 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o', - 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r', - 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h', - 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't', - 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a', - 'e', 'i', 'o', 'u', 'y', +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', }; unsigned int key = (((unsigned int)c)<<3) | 0x00000007; @@ -176415,7 +178440,8 @@ static int remove_diacritic(int c){ } } assert( key>=aDia[iRes] ); - return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]); + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); } @@ -176428,8 +178454,8 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int c){ unsigned int mask1 = 0x000361F8; if( c<768 || c>817 ) return 0; return (c < 768+32) ? - (mask0 & (1 << (c-768))) : - (mask1 & (1 << (c-768-32))); + (mask0 & ((unsigned int)1 << (c-768))) : + (mask1 & ((unsigned int)1 << (c-768-32))); } @@ -176442,7 +178468,7 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int c){ ** The results are undefined if the value passed to this function ** is less than zero. */ -SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ +SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ /* Each entry in the following array defines a rule for folding a range ** of codepoints to lower case. The rule applies to a range of nRange ** codepoints starting at codepoint iCode. @@ -176565,7 +178591,9 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ assert( ret>0 ); } - if( bRemoveDiacritic ) ret = remove_diacritic(ret); + if( eRemoveDiacritic ){ + ret = remove_diacritic(ret, eRemoveDiacritic==2); + } } else if( c>=66560 && c<66600 ){ @@ -177272,7 +179300,7 @@ static JSON_NOINLINE int jsonParseAddNodeExpand( assert( pParse->nNode>=pParse->nAlloc ); if( pParse->oom ) return -1; nNew = pParse->nAlloc*2 + 10; - pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew); + pNew = sqlite3_realloc64(pParse->aNode, sizeof(JsonNode)*nNew); if( pNew==0 ){ pParse->oom = 1; return -1; @@ -177546,7 +179574,7 @@ static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){ static int jsonParseFindParents(JsonParse *pParse){ u32 *aUp; assert( pParse->aUp==0 ); - aUp = pParse->aUp = sqlite3_malloc( sizeof(u32)*pParse->nNode ); + aUp = pParse->aUp = sqlite3_malloc64( sizeof(u32)*pParse->nNode ); if( aUp==0 ){ pParse->oom = 1; return SQLITE_NOMEM; @@ -177608,7 +179636,7 @@ static JsonParse *jsonParseCached( pMatch->iHold = iMaxHold+1; return pMatch; } - p = sqlite3_malloc( sizeof(*p) + nJson + 1 ); + p = sqlite3_malloc64( sizeof(*p) + nJson + 1 ); if( p==0 ){ sqlite3_result_error_nomem(pCtx); return 0; @@ -179253,6 +181281,9 @@ struct Rtree { u8 inWrTrans; /* True if inside write transaction */ u8 nAux; /* # of auxiliary columns in %_rowid */ u8 nAuxNotNull; /* Number of initial not-null aux columns */ +#ifdef SQLITE_DEBUG + u8 bCorrupt; /* Shadow table corruption detected */ +#endif int iDepth; /* Current depth of the r-tree structure */ char *zDb; /* Name of database containing r-tree table */ char *zName; /* Name of r-tree table */ @@ -179312,6 +181343,15 @@ struct Rtree { # define RTREE_ZERO 0.0 #endif +/* +** Set the Rtree.bCorrupt flag +*/ +#ifdef SQLITE_DEBUG +# define RTREE_IS_CORRUPT(X) ((X)->bCorrupt = 1) +#else +# define RTREE_IS_CORRUPT(X) +#endif + /* ** When doing a search of an r-tree, instances of the following structure ** record intermediate results from the tree walk. @@ -179678,8 +181718,8 @@ static void nodeZero(Rtree *pRtree, RtreeNode *p){ ** Given a node number iNode, return the corresponding key to use ** in the Rtree.aHash table. */ -static int nodeHash(i64 iNode){ - return iNode % HASHSIZE; +static unsigned int nodeHash(i64 iNode){ + return ((unsigned)iNode) % HASHSIZE; } /* @@ -179724,7 +181764,7 @@ static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ */ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ RtreeNode *pNode; - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize); + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode) + pRtree->iNodeSize); if( pNode ){ memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize); pNode->zData = (u8 *)&pNode[1]; @@ -179748,6 +181788,18 @@ static void nodeBlobReset(Rtree *pRtree){ } } +/* +** Check to see if pNode is the same as pParent or any of the parents +** of pParent. +*/ +static int nodeInParentChain(const RtreeNode *pNode, const RtreeNode *pParent){ + do{ + if( pNode==pParent ) return 1; + pParent = pParent->pParent; + }while( pParent ); + return 0; +} + /* ** Obtain a reference to an r-tree node. */ @@ -179766,6 +181818,10 @@ static int nodeAcquire( if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ assert( !pParent || !pNode->pParent || pNode->pParent==pParent ); if( pParent && !pNode->pParent ){ + if( nodeInParentChain(pNode, pParent) ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } pParent->nRef++; pNode->pParent = pParent; } @@ -179796,9 +181852,12 @@ static int nodeAcquire( *ppNode = 0; /* If unable to open an sqlite3_blob on the desired row, that can only ** be because the shadow tables hold erroneous data. */ - if( rc==SQLITE_ERROR ) rc = SQLITE_CORRUPT_VTAB; + if( rc==SQLITE_ERROR ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } }else if( pRtree->iNodeSize==sqlite3_blob_bytes(pRtree->pNodeBlob) ){ - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize); + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode)+pRtree->iNodeSize); if( !pNode ){ rc = SQLITE_NOMEM; }else{ @@ -179811,7 +181870,6 @@ static int nodeAcquire( pNode->pNext = 0; rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData, pRtree->iNodeSize, 0); - nodeReference(pParent); } } @@ -179825,6 +181883,7 @@ static int nodeAcquire( pRtree->iDepth = readInt16(pNode->zData); if( pRtree->iDepth>RTREE_MAX_DEPTH ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } } @@ -179835,14 +181894,17 @@ static int nodeAcquire( if( pNode && rc==SQLITE_OK ){ if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } } if( rc==SQLITE_OK ){ if( pNode!=0 ){ + nodeReference(pParent); nodeHashInsert(pRtree, pNode); }else{ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } *ppNode = pNode; }else{ @@ -180068,7 +182130,7 @@ static void rtreeRelease(Rtree *pRtree){ pRtree->inWrTrans = 0; assert( pRtree->nCursor==0 ); nodeBlobReset(pRtree); - assert( pRtree->nNodeRef==0 ); + assert( pRtree->nNodeRef==0 || pRtree->bCorrupt ); sqlite3_finalize(pRtree->pWriteNode); sqlite3_finalize(pRtree->pDeleteNode); sqlite3_finalize(pRtree->pReadRowid); @@ -180127,7 +182189,7 @@ static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ Rtree *pRtree = (Rtree *)pVTab; RtreeCursor *pCsr; - pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor)); + pCsr = (RtreeCursor *)sqlite3_malloc64(sizeof(RtreeCursor)); if( pCsr ){ memset(pCsr, 0, sizeof(RtreeCursor)); pCsr->base.pVtab = pVTab; @@ -180400,6 +182462,7 @@ static int nodeRowidIndex( return SQLITE_OK; } } + RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -180493,7 +182556,7 @@ static RtreeSearchPoint *rtreeEnqueue( RtreeSearchPoint *pNew; if( pCur->nPoint>=pCur->nPointAlloc ){ int nNew = pCur->nPointAlloc*2 + 8; - pNew = sqlite3_realloc(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); + pNew = sqlite3_realloc64(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); if( pNew==0 ) return 0; pCur->aPoint = pNew; pCur->nPointAlloc = nNew; @@ -180895,7 +182958,7 @@ static int rtreeFilter( */ rc = nodeAcquire(pRtree, 1, 0, &pRoot); if( rc==SQLITE_OK && argc>0 ){ - pCsr->aConstraint = sqlite3_malloc(sizeof(RtreeConstraint)*argc); + pCsr->aConstraint = sqlite3_malloc64(sizeof(RtreeConstraint)*argc); pCsr->nConstraint = argc; if( !pCsr->aConstraint ){ rc = SQLITE_NOMEM; @@ -181040,20 +183103,20 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ ){ u8 op; switch( p->op ){ - case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; - case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; - case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; - case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; - case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; - default: - assert( p->op==SQLITE_INDEX_CONSTRAINT_MATCH ); - op = RTREE_MATCH; - break; + case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; + case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; + case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; + case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; + case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; + case SQLITE_INDEX_CONSTRAINT_MATCH: op = RTREE_MATCH; break; + default: op = 0; break; + } + if( op ){ + zIdxStr[iIdx++] = op; + zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); + pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); + pIdxInfo->aConstraintUsage[ii].omit = 1; } - zIdxStr[iIdx++] = op; - zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); - pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); - pIdxInfo->aConstraintUsage[ii].omit = 1; } } @@ -181089,11 +183152,11 @@ static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ #endif { switch( pRtree->nDim ){ - case 5: area = p->aCoord[9].i - p->aCoord[8].i; - case 4: area *= p->aCoord[7].i - p->aCoord[6].i; - case 3: area *= p->aCoord[5].i - p->aCoord[4].i; - case 2: area *= p->aCoord[3].i - p->aCoord[2].i; - default: area *= p->aCoord[1].i - p->aCoord[0].i; + case 5: area = (i64)p->aCoord[9].i - (i64)p->aCoord[8].i; + case 4: area *= (i64)p->aCoord[7].i - (i64)p->aCoord[6].i; + case 3: area *= (i64)p->aCoord[5].i - (i64)p->aCoord[4].i; + case 2: area *= (i64)p->aCoord[3].i - (i64)p->aCoord[2].i; + default: area *= (i64)p->aCoord[1].i - (i64)p->aCoord[0].i; } } return area; @@ -181262,12 +183325,14 @@ static int AdjustTree( RtreeCell *pCell /* This cell was just inserted */ ){ RtreeNode *p = pNode; + int cnt = 0; while( p->pParent ){ RtreeNode *pParent = p->pParent; RtreeCell cell; int iCell; - if( nodeParentIndex(pRtree, p, &iCell) ){ + if( (++cnt)>1000 || nodeParentIndex(pRtree, p, &iCell) ){ + RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -181464,9 +183529,9 @@ static int splitNodeStartree( int iBestSplit = 0; RtreeDValue fBestMargin = RTREE_ZERO; - int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int)); + sqlite3_int64 nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int)); - aaSorted = (int **)sqlite3_malloc(nByte); + aaSorted = (int **)sqlite3_malloc64(nByte); if( !aaSorted ){ return SQLITE_NOMEM; } @@ -181587,7 +183652,7 @@ static int SplitNode( /* Allocate an array and populate it with a copy of pCell and ** all cells from node pLeft. Then zero the original node. */ - aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); + aCell = sqlite3_malloc64((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); if( !aCell ){ rc = SQLITE_NOMEM; goto splitnode_out; @@ -181735,7 +183800,10 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ } rc = sqlite3_reset(pRtree->pReadParent); if( rc==SQLITE_OK ) rc = rc2; - if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT_VTAB; + if( rc==SQLITE_OK && !pChild->pParent ){ + RTREE_IS_CORRUPT(pRtree); + rc = SQLITE_CORRUPT_VTAB; + } pChild = pChild->pParent; } return rc; @@ -181875,7 +183943,7 @@ static int Reinsert( /* Allocate the buffers used by this operation. The allocation is ** relinquished before this function returns. */ - aCell = (RtreeCell *)sqlite3_malloc(n * ( + aCell = (RtreeCell *)sqlite3_malloc64(n * ( sizeof(RtreeCell) + /* aCell array */ sizeof(int) + /* aOrder array */ sizeof(int) + /* aSpare array */ @@ -182049,8 +184117,12 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ rc = findLeafNode(pRtree, iDelete, &pLeaf, 0); } +#ifdef CORRUPT_DB + assert( pLeaf!=0 || rc!=SQLITE_OK || CORRUPT_DB ); +#endif + /* Delete the cell in question from the leaf node. */ - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && pLeaf ){ int rc2; rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell); if( rc==SQLITE_OK ){ @@ -182322,7 +184394,7 @@ static int rtreeUpdate( rc = rc2; } } - if( pRtree->nAux ){ + if( rc==SQLITE_OK && pRtree->nAux ){ sqlite3_stmt *pUp = pRtree->pWriteAux; int jj; sqlite3_bind_int64(pUp, 1, *pRowid); @@ -182520,6 +184592,7 @@ static int rtreeSqlInit( }; sqlite3_stmt **appStmt[N_STATEMENT]; int i; + const int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; pRtree->db = db; @@ -182576,8 +184649,7 @@ static int rtreeSqlInit( } zSql = sqlite3_mprintf(zFormat, zDb, zPrefix); if( zSql ){ - rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - appStmt[i], 0); + rc = sqlite3_prepare_v3(db, zSql, -1, f, appStmt[i], 0); }else{ rc = SQLITE_NOMEM; } @@ -182607,8 +184679,7 @@ static int rtreeSqlInit( if( zSql==0 ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - &pRtree->pWriteAux, 0); + rc = sqlite3_prepare_v3(db, zSql, -1, f, &pRtree->pWriteAux, 0); sqlite3_free(zSql); } } @@ -182684,6 +184755,7 @@ static int getNodeSize( *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); }else if( pRtree->iNodeSize<(512-64) ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); *pzErr = sqlite3_mprintf("undersize RTree blobs in \"%q_node\"", pRtree->zName); } @@ -182739,7 +184811,7 @@ static int rtreeInit( /* Allocate the sqlite3_vtab structure */ nDb = (int)strlen(argv[1]); nName = (int)strlen(argv[2]); - pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); if( !pRtree ){ return SQLITE_NOMEM; } @@ -182836,49 +184908,45 @@ rtreeInit_fail: ** *2 coordinates. */ static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ - char *zText = 0; RtreeNode node; Rtree tree; int ii; + int nData; + int errCode; + sqlite3_str *pOut; UNUSED_PARAMETER(nArg); memset(&node, 0, sizeof(RtreeNode)); memset(&tree, 0, sizeof(Rtree)); tree.nDim = (u8)sqlite3_value_int(apArg[0]); + if( tree.nDim<1 || tree.nDim>5 ) return; tree.nDim2 = tree.nDim*2; tree.nBytesPerCell = 8 + 8 * tree.nDim; node.zData = (u8 *)sqlite3_value_blob(apArg[1]); + nData = sqlite3_value_bytes(apArg[1]); + if( nData<4 ) return; + if( nData0 ) sqlite3_str_append(pOut, " ", 1); + sqlite3_str_appendf(pOut, "{%lld", cell.iRowid); for(jj=0; jjrc==SQLITE_OK ); - if( pCheck->pGetNode==0 ){ + if( pCheck->rc==SQLITE_OK && pCheck->pGetNode==0 ){ pCheck->pGetNode = rtreeCheckPrepare(pCheck, "SELECT data FROM %Q.'%q_node' WHERE nodeno=?", pCheck->zDb, pCheck->zTab @@ -183020,7 +185087,7 @@ static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ if( sqlite3_step(pCheck->pGetNode)==SQLITE_ROW ){ int nNode = sqlite3_column_bytes(pCheck->pGetNode, 0); const u8 *pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0); - pRet = sqlite3_malloc(nNode); + pRet = sqlite3_malloc64(nNode); if( pRet==0 ){ pCheck->rc = SQLITE_NOMEM; }else{ @@ -183499,6 +185566,14 @@ struct GeoPoly { */ #define GEOPOLY_SZ(N) (sizeof(GeoPoly) + sizeof(GeoCoord)*2*((N)-4)) +/* Macros to access coordinates of a GeoPoly. +** We have to use these macros, rather than just say p->a[i] in order +** to silence (incorrect) UBSAN warnings if the array index is too large. +*/ +#define GeoX(P,I) (((GeoCoord*)(P)->a)[(I)*2]) +#define GeoY(P,I) (((GeoCoord*)(P)->a)[(I)*2+1]) + + /* ** State of a parse of a GeoJSON input. */ @@ -183636,7 +185711,7 @@ static GeoPoly *geopolyParseJson(const unsigned char *z, int *pRc){ GeoPoly *pOut; int x = 1; s.nVertex--; /* Remove the redundant vertex at the end */ - pOut = sqlite3_malloc64( GEOPOLY_SZ(s.nVertex) ); + pOut = sqlite3_malloc64( GEOPOLY_SZ((sqlite3_int64)s.nVertex) ); x = 1; if( pOut==0 ) goto parse_json_err; pOut->nVertex = s.nVertex; @@ -183691,8 +185766,9 @@ static GeoPoly *geopolyFuncParam( memcpy(p->hdr, a, nByte); if( a[0] != *(unsigned char*)&x ){ int ii; - for(ii=0; iia[ii]); + for(ii=0; iihdr[0] ^= 1; } @@ -183751,9 +185827,9 @@ static void geopolyJsonFunc( int i; sqlite3_str_append(x, "[", 1); for(i=0; inVertex; i++){ - sqlite3_str_appendf(x, "[%!g,%!g],", p->a[i*2], p->a[i*2+1]); + sqlite3_str_appendf(x, "[%!g,%!g],", GeoX(p,i), GeoY(p,i)); } - sqlite3_str_appendf(x, "[%!g,%!g]]", p->a[0], p->a[1]); + sqlite3_str_appendf(x, "[%!g,%!g]]", GeoX(p,0), GeoY(p,0)); sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free); sqlite3_free(p); } @@ -183770,7 +185846,9 @@ static void geopolySvgFunc( int argc, sqlite3_value **argv ){ - GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + GeoPoly *p; + if( argc<1 ) return; + p = geopolyFuncParam(context, argv[0], 0); if( p ){ sqlite3 *db = sqlite3_context_db_handle(context); sqlite3_str *x = sqlite3_str_new(db); @@ -183778,10 +185856,10 @@ static void geopolySvgFunc( char cSep = '\''; sqlite3_str_appendf(x, "a[i*2], p->a[i*2+1]); + sqlite3_str_appendf(x, "%c%g,%g", cSep, GeoX(p,i), GeoY(p,i)); cSep = ' '; } - sqlite3_str_appendf(x, " %g,%g'", p->a[0], p->a[1]); + sqlite3_str_appendf(x, " %g,%g'", GeoX(p,0), GeoY(p,0)); for(i=1; inVertex; ii++){ - x0 = p->a[ii*2]; - y0 = p->a[ii*2+1]; + x0 = GeoX(p,ii); + y0 = GeoY(p,ii); x1 = (GeoCoord)(A*x0 + B*y0 + E); y1 = (GeoCoord)(C*x0 + D*y0 + F); - p->a[ii*2] = x1; - p->a[ii*2+1] = y1; + GeoX(p,ii) = x1; + GeoY(p,ii) = y1; } sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); @@ -183850,12 +185928,12 @@ static double geopolyArea(GeoPoly *p){ double rArea = 0.0; int ii; for(ii=0; iinVertex-1; ii++){ - rArea += (p->a[ii*2] - p->a[ii*2+2]) /* (x0 - x1) */ - * (p->a[ii*2+1] + p->a[ii*2+3]) /* (y0 + y1) */ + rArea += (GeoX(p,ii) - GeoX(p,ii+1)) /* (x0 - x1) */ + * (GeoY(p,ii) + GeoY(p,ii+1)) /* (y0 + y1) */ * 0.5; } - rArea += (p->a[ii*2] - p->a[0]) /* (xN - x0) */ - * (p->a[ii*2+1] + p->a[1]) /* (yN + y0) */ + rArea += (GeoX(p,ii) - GeoX(p,0)) /* (xN - x0) */ + * (GeoY(p,ii) + GeoY(p,0)) /* (yN + y0) */ * 0.5; return rArea; } @@ -183902,13 +185980,13 @@ static void geopolyCcwFunc( if( p ){ if( geopolyArea(p)<0.0 ){ int ii, jj; - for(ii=2, jj=p->nVertex*2 - 2; iia[ii]; - p->a[ii] = p->a[jj]; - p->a[jj] = t; - t = p->a[ii+1]; - p->a[ii+1] = p->a[jj+1]; - p->a[jj+1] = t; + for(ii=1, jj=p->nVertex-1; iihdr, @@ -183968,8 +186046,8 @@ static void geopolyRegularFunc( p->hdr[3] = n&0xff; for(i=0; ia[i*2] = x - r*geopolySine(rAngle-0.5*GEOPOLY_PI); - p->a[i*2+1] = y + r*geopolySine(rAngle); + GeoX(p,i) = x - r*geopolySine(rAngle-0.5*GEOPOLY_PI); + GeoY(p,i) = y + r*geopolySine(rAngle); } sqlite3_result_blob(context, p->hdr, 4+8*n, SQLITE_TRANSIENT); sqlite3_free(p); @@ -184006,20 +186084,20 @@ static GeoPoly *geopolyBBox( } if( p ){ int ii; - mnX = mxX = p->a[0]; - mnY = mxY = p->a[1]; + mnX = mxX = GeoX(p,0); + mnY = mxY = GeoY(p,0); for(ii=1; iinVertex; ii++){ - double r = p->a[ii*2]; + double r = GeoX(p,ii); if( rmxX ) mxX = (float)r; - r = p->a[ii*2+1]; + r = GeoY(p,ii); if( rmxY ) mxY = (float)r; } if( pRc ) *pRc = SQLITE_OK; if( aCoord==0 ){ geopolyBboxFill: - pOut = sqlite3_realloc(p, GEOPOLY_SZ(4)); + pOut = sqlite3_realloc64(p, GEOPOLY_SZ(4)); if( pOut==0 ){ sqlite3_free(p); if( context ) sqlite3_result_error_nomem(context); @@ -184032,14 +186110,14 @@ static GeoPoly *geopolyBBox( pOut->hdr[1] = 0; pOut->hdr[2] = 0; pOut->hdr[3] = 4; - pOut->a[0] = mnX; - pOut->a[1] = mnY; - pOut->a[2] = mxX; - pOut->a[3] = mnY; - pOut->a[4] = mxX; - pOut->a[5] = mxY; - pOut->a[6] = mnX; - pOut->a[7] = mxY; + GeoX(pOut,0) = mnX; + GeoY(pOut,0) = mnY; + GeoX(pOut,1) = mxX; + GeoY(pOut,1) = mnY; + GeoX(pOut,2) = mxX; + GeoY(pOut,2) = mxY; + GeoX(pOut,3) = mnX; + GeoY(pOut,3) = mxY; }else{ sqlite3_free(p); aCoord[0].f = mnX; @@ -184177,14 +186255,14 @@ static void geopolyContainsPointFunc( int ii; if( p1==0 ) return; for(ii=0; iinVertex-1; ii++){ - v = pointBeneathLine(x0,y0,p1->a[ii*2],p1->a[ii*2+1], - p1->a[ii*2+2],p1->a[ii*2+3]); + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,ii+1),GeoY(p1,ii+1)); if( v==2 ) break; cnt += v; } if( v!=2 ){ - v = pointBeneathLine(x0,y0,p1->a[ii*2],p1->a[ii*2+1], - p1->a[0],p1->a[1]); + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,0), GeoY(p1,0)); } if( v==2 ){ sqlite3_result_int(context, 1); @@ -184306,10 +186384,10 @@ static void geopolyAddSegments( unsigned int i; GeoCoord *x; for(i=0; i<(unsigned)pPoly->nVertex-1; i++){ - x = pPoly->a + (i*2); + x = &GeoX(pPoly,i); geopolyAddOneSegment(p, x[0], x[1], x[2], x[3], side, i); } - x = pPoly->a + (i*2); + x = &GeoX(pPoly,i); geopolyAddOneSegment(p, x[0], x[1], pPoly->a[0], pPoly->a[1], side, i); } @@ -184415,9 +186493,9 @@ static GeoSegment *geopolySortSegmentsByYAndC(GeoSegment *pList){ ** Determine the overlap between two polygons */ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){ - int nVertex = p1->nVertex + p2->nVertex + 2; + sqlite3_int64 nVertex = p1->nVertex + p2->nVertex + 2; GeoOverlap *p; - int nByte; + sqlite3_int64 nByte; GeoEvent *pThisEvent; double rX; int rc = 0; @@ -184429,7 +186507,7 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){ nByte = sizeof(GeoEvent)*nVertex*2 + sizeof(GeoSegment)*nVertex + sizeof(GeoOverlap); - p = sqlite3_malloc( nByte ); + p = sqlite3_malloc64( nByte ); if( p==0 ) return -1; p->aEvent = (GeoEvent*)&p[1]; p->aSegment = (GeoSegment*)&p->aEvent[nVertex*2]; @@ -184588,8 +186666,8 @@ static int geopolyInit( ){ int rc = SQLITE_OK; Rtree *pRtree; - int nDb; /* Length of string argv[1] */ - int nName; /* Length of string argv[2] */ + sqlite3_int64 nDb; /* Length of string argv[1] */ + sqlite3_int64 nName; /* Length of string argv[2] */ sqlite3_str *pSql; char *zSql; int ii; @@ -184597,9 +186675,9 @@ static int geopolyInit( sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); /* Allocate the sqlite3_vtab structure */ - nDb = (int)strlen(argv[1]); - nName = (int)strlen(argv[2]); - pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2); + nDb = strlen(argv[1]); + nName = strlen(argv[2]); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); if( !pRtree ){ return SQLITE_NOMEM; } @@ -185254,12 +187332,12 @@ static void rtreeMatchArgFree(void *pArg){ static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx); RtreeMatchArg *pBlob; - int nBlob; + sqlite3_int64 nBlob; int memErr = 0; nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue) + nArg*sizeof(sqlite3_value*); - pBlob = (RtreeMatchArg *)sqlite3_malloc(nBlob); + pBlob = (RtreeMatchArg *)sqlite3_malloc64(nBlob); if( !pBlob ){ sqlite3_result_error_nomem(ctx); }else{ @@ -185970,7 +188048,7 @@ static int icuCreate( if( argc>0 ){ n = strlen(argv[0])+1; } - p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n); + p = (IcuTokenizer *)sqlite3_malloc64(sizeof(IcuTokenizer)+n); if( !p ){ return SQLITE_NOMEM; } @@ -186027,7 +188105,7 @@ static int icuOpen( nInput = strlen(zInput); } nChar = nInput+1; - pCsr = (IcuCursor *)sqlite3_malloc( + pCsr = (IcuCursor *)sqlite3_malloc64( sizeof(IcuCursor) + /* IcuCursor */ ((nChar+3)&~3) * sizeof(UChar) + /* IcuCursor.aChar[] */ (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ @@ -186599,7 +188677,11 @@ SQLITE_API sqlite3rbu *sqlite3rbu_open( ** name of the state database is "-vacuum", where ** is the name of the target database file. In this case, on UNIX, if the ** state database is not already present in the file-system, it is created -** with the same permissions as the target db is made. +** with the same permissions as the target db is made. +** +** With an RBU vacuum, it is an SQLITE_MISUSE error if the name of the +** state database ends with "-vactmp". This name is reserved for internal +** use. ** ** This function does not delete the state database after an RBU vacuum ** is completed, even if it created it. However, if the call to @@ -187020,6 +189102,11 @@ struct RbuUpdateStmt { ** it points to an array of flags nTblCol elements in size. The flag is ** set for each column that is either a part of the PK or a part of an ** index. Or clear otherwise. +** +** If there are one or more partial indexes on the table, all fields of +** this array set set to 1. This is because in that case, the module has +** no way to tell which fields will be required to add and remove entries +** from the partial indexes. ** */ struct RbuObjIter { @@ -187464,6 +189551,7 @@ static void rbuFossilDeltaFunc( }else{ nOut2 = rbuDeltaApply(aOrig, nOrig, aDelta, nDelta, aOut); if( nOut2!=nOut ){ + sqlite3_free(aOut); sqlite3_result_error(context, "corrupt fossil delta", -1); }else{ sqlite3_result_blob(context, aOut, nOut, sqlite3_free); @@ -187814,7 +189902,7 @@ static int rbuMPrintfExec(sqlite3rbu *p, sqlite3 *db, const char *zFmt, ...){ ** immediately without attempting the allocation or modifying the stored ** error code. */ -static void *rbuMalloc(sqlite3rbu *p, int nByte){ +static void *rbuMalloc(sqlite3rbu *p, sqlite3_int64 nByte){ void *pRet = 0; if( p->rc==SQLITE_OK ){ assert( nByte>0 ); @@ -187835,7 +189923,7 @@ static void *rbuMalloc(sqlite3rbu *p, int nByte){ ** error code in the RBU handle passed as the first argument. */ static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){ - int nByte = (2*sizeof(char*) + sizeof(int) + 3*sizeof(u8)) * nCol; + sqlite3_int64 nByte = (2*sizeof(char*) + sizeof(int) + 3*sizeof(u8)) * nCol; char **azNew; azNew = (char**)rbuMalloc(p, nByte); @@ -188029,8 +190117,12 @@ static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ pIter->nIndex = 0; while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pList) ){ const char *zIdx = (const char*)sqlite3_column_text(pList, 1); + int bPartial = sqlite3_column_int(pList, 4); sqlite3_stmt *pXInfo = 0; if( zIdx==0 ) break; + if( bPartial ){ + memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol); + } p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) ); @@ -188475,7 +190567,7 @@ static char *rbuObjIterGetSetlist( */ static char *rbuObjIterGetBindlist(sqlite3rbu *p, int nBind){ char *zRet = 0; - int nByte = nBind*2 + 1; + sqlite3_int64 nByte = 2*(sqlite3_int64)nBind + 1; zRet = (char*)rbuMalloc(p, nByte); if( zRet ){ @@ -188737,6 +190829,62 @@ static void rbuTmpInsertFunc( } } +static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ + sqlite3_stmt *pStmt = 0; + int rc = p->rc; + char *zRet = 0; + + if( rc==SQLITE_OK ){ + rc = prepareAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, + "SELECT trim(sql) FROM sqlite_master WHERE type='index' AND name=?" + ); + } + if( rc==SQLITE_OK ){ + int rc2; + rc = sqlite3_bind_text(pStmt, 1, pIter->zIdx, -1, SQLITE_STATIC); + if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zSql = (const char*)sqlite3_column_text(pStmt, 0); + if( zSql ){ + int nParen = 0; /* Number of open parenthesis */ + int i; + for(i=0; zSql[i]; i++){ + char c = zSql[i]; + if( c=='(' ){ + nParen++; + } + else if( c==')' ){ + nParen--; + if( nParen==0 ){ + i++; + break; + } + }else if( c=='"' || c=='\'' || c=='`' ){ + for(i++; 1; i++){ + if( zSql[i]==c ){ + if( zSql[i+1]!=c ) break; + i++; + } + } + }else if( c=='[' ){ + for(i++; 1; i++){ + if( zSql[i]==']' ) break; + } + } + } + if( zSql[i] ){ + zRet = rbuStrndup(&zSql[i], &rc); + } + } + } + + rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + } + + p->rc = rc; + return zRet; +} + /* ** Ensure that the SQLite statement handles required to update the ** target database object currently indicated by the iterator passed @@ -188766,6 +190914,7 @@ static int rbuObjIterPrepareAll( char *zImposterPK = 0; /* Primary key declaration for imposter */ char *zWhere = 0; /* WHERE clause on PK columns */ char *zBind = 0; + char *zPart = 0; int nBind = 0; assert( pIter->eType!=RBU_PK_VTAB ); @@ -188773,6 +190922,7 @@ static int rbuObjIterPrepareAll( p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind ); zBind = rbuObjIterGetBindlist(p, nBind); + zPart = rbuObjIterGetIndexWhere(p, pIter); /* Create the imposter table used to write to this index. */ sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); @@ -188805,28 +190955,30 @@ static int rbuObjIterPrepareAll( char *zSql; if( rbuIsVacuum(p) ){ zSql = sqlite3_mprintf( - "SELECT %s, 0 AS rbu_control FROM '%q' ORDER BY %s%s", + "SELECT %s, 0 AS rbu_control FROM '%q' %s ORDER BY %s%s", zCollist, pIter->zDataTbl, - zCollist, zLimit + zPart, zCollist, zLimit ); }else if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ zSql = sqlite3_mprintf( - "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' ORDER BY %s%s", + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' %s ORDER BY %s%s", zCollist, p->zStateDb, pIter->zDataTbl, - zCollist, zLimit + zPart, zCollist, zLimit ); }else{ zSql = sqlite3_mprintf( - "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' " + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' %s " "UNION ALL " "SELECT %s, rbu_control FROM '%q' " - "WHERE typeof(rbu_control)='integer' AND rbu_control!=1 " + "%s %s typeof(rbu_control)='integer' AND rbu_control!=1 " "ORDER BY %s%s", - zCollist, p->zStateDb, pIter->zDataTbl, + zCollist, p->zStateDb, pIter->zDataTbl, zPart, zCollist, pIter->zDataTbl, + zPart, + (zPart ? "AND" : "WHERE"), zCollist, zLimit ); } @@ -188837,6 +190989,7 @@ static int rbuObjIterPrepareAll( sqlite3_free(zImposterPK); sqlite3_free(zWhere); sqlite3_free(zBind); + sqlite3_free(zPart); }else{ int bRbuRowid = (pIter->eType==RBU_PK_VTAB) ||(pIter->eType==RBU_PK_NONE) @@ -189257,7 +191410,7 @@ static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ if( *zExtra=='\0' ) zExtra = 0; } - zTarget = sqlite3_mprintf("file:%s-vacuum?rbu_memory=1%s%s", + zTarget = sqlite3_mprintf("file:%s-vactmp?rbu_memory=1%s%s", sqlite3_db_filename(p->dbRbu, "main"), (zExtra==0 ? "" : "&"), (zExtra==0 ? "" : zExtra) ); @@ -190523,6 +192676,12 @@ SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( const char *zState ){ if( zTarget==0 ){ return rbuMisuseError(); } + if( zState ){ + int n = strlen(zState); + if( n>=7 && 0==memcmp("-vactmp", &zState[n-7], 7) ){ + return rbuMisuseError(); + } + } /* TODO: Check that both arguments are non-NULL */ return openRbuHandle(0, zTarget, zState); } @@ -190719,7 +192878,10 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *p){ if( p->eStage==RBU_STAGE_OAL ){ assert( rc!=SQLITE_DONE ); if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); - if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "BEGIN IMMEDIATE", 0, 0, 0); + if( rc==SQLITE_OK ){ + const char *zBegin = rbuIsVacuum(p) ? "BEGIN" : "BEGIN IMMEDIATE"; + rc = sqlite3_exec(p->dbRbu, zBegin, 0, 0, 0); + } if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbMain, "BEGIN IMMEDIATE", 0, 0,0); } @@ -191261,7 +193423,7 @@ static int rbuVfsShmMap( assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); if( eStage==RBU_STAGE_OAL || eStage==RBU_STAGE_MOVE ){ if( iRegion<=p->nShm ){ - int nByte = (iRegion+1) * sizeof(char*); + sqlite3_int64 nByte = (iRegion+1) * sizeof(char*); char **apNew = (char**)sqlite3_realloc64(p->apShm, nByte); if( apNew==0 ){ rc = SQLITE_NOMEM; @@ -192250,6 +194412,10 @@ statNextRestart: goto statNextRestart; /* Tail recursion */ } pCsr->iPage++; + if( pCsr->iPage>=ArraySize(pCsr->aPage) ){ + statResetCsr(pCsr); + return SQLITE_CORRUPT_BKPT; + } assert( p==&pCsr->aPage[pCsr->iPage-1] ); if( p->iCell==p->nCell ){ @@ -192321,7 +194487,6 @@ static int statFilter( StatTable *pTab = (StatTable*)(pCursor->pVtab); char *zSql; int rc = SQLITE_OK; - char *zMaster; if( idxNum==1 ){ const char *zDbase = (const char*)sqlite3_value_text(argv[0]); @@ -192337,13 +194502,12 @@ static int statFilter( statResetCsr(pCsr); sqlite3_finalize(pCsr->pStmt); pCsr->pStmt = 0; - zMaster = pCsr->iDb==1 ? "sqlite_temp_master" : "sqlite_master"; zSql = sqlite3_mprintf( "SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type" " UNION ALL " "SELECT name, rootpage, type" - " FROM \"%w\".%s WHERE rootpage!=0" - " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName, zMaster); + " FROM \"%w\".sqlite_master WHERE rootpage!=0" + " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName); if( zSql==0 ){ return SQLITE_NOMEM_BKPT; }else{ @@ -193231,7 +195395,7 @@ static void sessionPutI64(u8 *aBuf, sqlite3_int64 i){ static int sessionSerializeValue( u8 *aBuf, /* If non-NULL, write serialized value here */ sqlite3_value *pValue, /* Value to serialize */ - int *pnWrite /* IN/OUT: Increment by bytes written */ + sqlite3_int64 *pnWrite /* IN/OUT: Increment by bytes written */ ){ int nByte; /* Size of serialized value in bytes */ @@ -193770,9 +195934,9 @@ static int sessionGrowHash(int bPatchset, SessionTable *pTab){ if( pTab->nChange==0 || pTab->nEntry>=(pTab->nChange/2) ){ int i; SessionChange **apNew; - int nNew = (pTab->nChange ? pTab->nChange : 128) * 2; + sqlite3_int64 nNew = 2*(sqlite3_int64)(pTab->nChange ? pTab->nChange : 128); - apNew = (SessionChange **)sqlite3_malloc(sizeof(SessionChange *) * nNew); + apNew = (SessionChange **)sqlite3_malloc64(sizeof(SessionChange *) * nNew); if( apNew==0 ){ if( pTab->nChange==0 ){ return SQLITE_ERROR; @@ -193838,7 +196002,7 @@ static int sessionTableInfo( char *zPragma; sqlite3_stmt *pStmt; int rc; - int nByte; + sqlite3_int64 nByte; int nDbCol = 0; int nThis; int i; @@ -193881,7 +196045,7 @@ static int sessionTableInfo( if( rc==SQLITE_OK ){ nByte += nDbCol * (sizeof(const char *) + sizeof(u8) + 1); - pAlloc = sqlite3_malloc(nByte); + pAlloc = sqlite3_malloc64(nByte); if( pAlloc==0 ){ rc = SQLITE_NOMEM; } @@ -194022,7 +196186,7 @@ static void sessionPreupdateOneChange( int iHash; int bNull = 0; int rc = SQLITE_OK; - SessionStat1Ctx stat1 = {0}; + SessionStat1Ctx stat1 = {{0,0,0,0,0},0}; if( pSession->rc ) return; @@ -194079,7 +196243,7 @@ static void sessionPreupdateOneChange( ** this is an SQLITE_UPDATE or SQLITE_DELETE), or just the PK ** values (if this is an INSERT). */ SessionChange *pChange; /* New change object */ - int nByte; /* Number of bytes to allocate */ + sqlite3_int64 nByte; /* Number of bytes to allocate */ int i; /* Used to iterate through columns */ assert( rc==SQLITE_OK ); @@ -194104,7 +196268,7 @@ static void sessionPreupdateOneChange( } /* Allocate the change object */ - pChange = (SessionChange *)sqlite3_malloc(nByte); + pChange = (SessionChange *)sqlite3_malloc64(nByte); if( !pChange ){ rc = SQLITE_NOMEM; goto error_out; @@ -194548,7 +196712,7 @@ SQLITE_API int sqlite3session_create( *ppSession = 0; /* Allocate and populate the new session object. */ - pNew = (sqlite3_session *)sqlite3_malloc(sizeof(sqlite3_session) + nDb + 1); + pNew = (sqlite3_session *)sqlite3_malloc64(sizeof(sqlite3_session) + nDb + 1); if( !pNew ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(sqlite3_session)); pNew->db = db; @@ -194667,7 +196831,7 @@ SQLITE_API int sqlite3session_attach( if( !pTab ){ /* Allocate new SessionTable object. */ - pTab = (SessionTable *)sqlite3_malloc(sizeof(SessionTable) + nName + 1); + pTab = (SessionTable *)sqlite3_malloc64(sizeof(SessionTable) + nName + 1); if( !pTab ){ rc = SQLITE_NOMEM; }else{ @@ -194697,7 +196861,7 @@ SQLITE_API int sqlite3session_attach( ** If successful, return zero. Otherwise, if an OOM condition is encountered, ** set *pRc to SQLITE_NOMEM and return non-zero. */ -static int sessionBufferGrow(SessionBuffer *p, int nByte, int *pRc){ +static int sessionBufferGrow(SessionBuffer *p, size_t nByte, int *pRc){ if( *pRc==SQLITE_OK && p->nAlloc-p->nBufnAlloc ? p->nAlloc : 128; @@ -194727,7 +196891,7 @@ static int sessionBufferGrow(SessionBuffer *p, int nByte, int *pRc){ static void sessionAppendValue(SessionBuffer *p, sqlite3_value *pVal, int *pRc){ int rc = *pRc; if( rc==SQLITE_OK ){ - int nByte = 0; + sqlite3_int64 nByte = 0; rc = sessionSerializeValue(0, pVal, &nByte); sessionBufferGrow(p, nByte, &rc); if( rc==SQLITE_OK ){ @@ -195603,7 +197767,7 @@ static int sessionValueSetStr( ** argument to sqlite3ValueSetStr() and have the copy created ** automatically. But doing so makes it difficult to detect any OOM ** error. Hence the code to create the copy externally. */ - u8 *aCopy = sqlite3_malloc(nData+1); + u8 *aCopy = sqlite3_malloc64((sqlite3_int64)nData+1); if( aCopy==0 ) return SQLITE_NOMEM; memcpy(aCopy, aData, nData); sqlite3ValueSetStr(pVal, nData, (char*)aCopy, enc, sqlite3_free); @@ -195815,7 +197979,7 @@ static int sessionChangesetReadTblhdr(sqlite3_changeset_iter *p){ } if( rc==SQLITE_OK ){ - int iPK = sizeof(sqlite3_value*)*p->nCol*2; + size_t iPK = sizeof(sqlite3_value*)*p->nCol*2; memset(p->tblhdr.aBuf, 0, iPK); memcpy(&p->tblhdr.aBuf[iPK], &p->in.aData[p->in.iNext], nCopy); p->in.iNext += nCopy; @@ -196216,7 +198380,7 @@ static int sessionChangesetInvert( int iCol; if( 0==apVal ){ - apVal = (sqlite3_value **)sqlite3_malloc(sizeof(apVal[0])*nCol*2); + apVal = (sqlite3_value **)sqlite3_malloc64(sizeof(apVal[0])*nCol*2); if( 0==apVal ){ rc = SQLITE_NOMEM; goto finished_invert; @@ -196730,7 +198894,7 @@ static int sessionSeekToRow( } /* -** This function is called from within sqlite3changset_apply_v2() when +** This function is called from within sqlite3changeset_apply_v2() when ** a conflict is encountered and resolved using conflict resolution ** mode eType (either SQLITE_CHANGESET_OMIT or SQLITE_CHANGESET_REPLACE).. ** It adds a conflict resolution record to the buffer in @@ -197119,7 +199283,7 @@ static int sessionRetryConstraints( rc = sessionChangesetStart(&pIter2, 0, 0, cons.nBuf, cons.aBuf, 0); if( rc==SQLITE_OK ){ - int nByte = 2*pApply->nCol*sizeof(sqlite3_value*); + size_t nByte = 2*pApply->nCol*sizeof(sqlite3_value*); int rc2; pIter2->bPatchset = bPatchset; pIter2->zTab = (char*)zTab; @@ -197489,7 +199653,7 @@ static int sessionChangeMerge( int rc = SQLITE_OK; if( !pExist ){ - pNew = (SessionChange *)sqlite3_malloc(sizeof(SessionChange) + nRec); + pNew = (SessionChange *)sqlite3_malloc64(sizeof(SessionChange) + nRec); if( !pNew ){ return SQLITE_NOMEM; } @@ -197522,8 +199686,8 @@ static int sessionChangeMerge( if( pExist->op==SQLITE_DELETE && pExist->bIndirect ){ *ppNew = pExist; }else{ - int nByte = nRec + pExist->nRecord + sizeof(SessionChange); - pNew = (SessionChange*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = nRec + pExist->nRecord + sizeof(SessionChange); + pNew = (SessionChange*)sqlite3_malloc64(nByte); if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ @@ -197583,14 +199747,14 @@ static int sessionChangeMerge( assert( pNew==0 ); }else{ u8 *aExist = pExist->aRecord; - int nByte; + sqlite3_int64 nByte; u8 *aCsr; /* Allocate a new SessionChange object. Ensure that the aRecord[] ** buffer of the new object is large enough to hold any record that ** may be generated by combining the input records. */ nByte = sizeof(SessionChange) + pExist->nRecord + nRec; - pNew = (SessionChange *)sqlite3_malloc(nByte); + pNew = (SessionChange *)sqlite3_malloc64(nByte); if( !pNew ){ sqlite3_free(pExist); return SQLITE_NOMEM; @@ -197696,7 +199860,7 @@ static int sessionChangesetToHash( if( !pTab ){ SessionTable **ppTab; - pTab = sqlite3_malloc(sizeof(SessionTable) + nCol + nNew+1); + pTab = sqlite3_malloc64(sizeof(SessionTable) + nCol + nNew+1); if( !pTab ){ rc = SQLITE_NOMEM; break; @@ -198470,12 +200634,8 @@ struct Fts5PhraseIter { ** ** Usually, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. The exception is if the table was created -** with the offsets=0 option specified. In this case *piOff is always -** set to -1. -** -** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) -** if an error occurs. +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -198516,7 +200676,7 @@ struct Fts5PhraseIter { ** Save the pointer passed as the second argument as the extension functions ** "auxiliary data". The pointer may then be retrieved by the current or any ** future invocation of the same fts5 extension function made as part of -** of the same MATCH query using the xGetAuxdata() API. +** the same MATCH query using the xGetAuxdata() API. ** ** Each extension function is allocated a single auxiliary data slot for ** each FTS query (MATCH expression). If the extension function is invoked @@ -198531,7 +200691,7 @@ struct Fts5PhraseIter { ** The xDelete callback, if one is specified, is also invoked on the ** auxiliary data pointer after the FTS5 query has finished. ** -** If an error (e.g. an OOM condition) occurs within this function, an +** If an error (e.g. an OOM condition) occurs within this function, ** the auxiliary data is set to NULL and an error code returned. If the ** xDelete parameter was not NULL, it is invoked on the auxiliary data ** pointer before returning. @@ -198764,11 +200924,11 @@ struct Fts5ExtensionApi { ** the tokenizer substitutes "first" for "1st" and the query works ** as expected. ** -**
  • By adding multiple synonyms for a single term to the FTS index. -** In this case, when tokenizing query text, the tokenizer may -** provide multiple synonyms for a single term within the document. -** FTS5 then queries the index for each synonym individually. For -** example, faced with the query: +**
  • By querying the index for all synonyms of each query term +** separately. In this case, when tokenizing query text, the +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each +** synonym individually. For example, faced with the query: ** ** ** ... MATCH 'first place' @@ -198792,7 +200952,7 @@ struct Fts5ExtensionApi { ** "place". ** ** This way, even if the tokenizer does not provide synonyms -** when tokenizing query text (it should not - to do would be +** when tokenizing query text (it should not - to do so would be ** inefficient), it doesn't matter if the user queries for ** 'first + place' or '1st + place', as there are entries in the ** FTS index corresponding to both forms of the first token. @@ -199017,6 +201177,12 @@ SQLITE_API extern int sqlite3_fts5_may_be_corrupt; # define assert_nc(x) assert(x) #endif +/* +** A version of memcmp() that does not cause asan errors if one of the pointer +** parameters is NULL and the number of bytes to compare is zero. +*/ +#define fts5Memcmp(s1, s2, n) ((n)==0 ? 0 : memcmp((s1), (s2), (n))) + /* Mark a function parameter as unused, to suppress nuisance compiler ** warnings. */ #ifndef UNUSED_PARAM @@ -199204,7 +201370,7 @@ static void sqlite3Fts5Put32(u8*, int); static int sqlite3Fts5Get32(const u8*); #define FTS5_POS2COLUMN(iPos) (int)(iPos >> 32) -#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0xFFFFFFFF) +#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0x7FFFFFFF) typedef struct Fts5PoslistReader Fts5PoslistReader; struct Fts5PoslistReader { @@ -199239,7 +201405,7 @@ static int sqlite3Fts5PoslistNext64( ); /* Malloc utility */ -static void *sqlite3Fts5MallocZero(int *pRc, int nByte); +static void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte); static char *sqlite3Fts5Strndup(int *pRc, const char *pIn, int nIn); /* Character set tests (like isspace(), isalpha() etc.) */ @@ -199450,9 +201616,19 @@ static int sqlite3Fts5PutVarint(unsigned char *p, u64 v); /************************************************************************** -** Interface to code in fts5.c. +** Interface to code in fts5_main.c. */ +/* +** Virtual-table object. +*/ +typedef struct Fts5Table Fts5Table; +struct Fts5Table { + sqlite3_vtab base; /* Base class used by SQLite core */ + Fts5Config *pConfig; /* Virtual table configuration */ + Fts5Index *pIndex; /* Full-text index */ +}; + static int sqlite3Fts5GetTokenizer( Fts5Global*, const char **azArg, @@ -199462,7 +201638,9 @@ static int sqlite3Fts5GetTokenizer( char **pzErr ); -static Fts5Index *sqlite3Fts5IndexFromCsrid(Fts5Global*, i64, Fts5Config **); +static Fts5Table *sqlite3Fts5TableFromCsrid(Fts5Global*, i64); + +static int sqlite3Fts5FlushToDisk(Fts5Table*); /* ** End of interface to code in fts5.c. @@ -199495,8 +201673,9 @@ static void sqlite3Fts5HashClear(Fts5Hash*); static int sqlite3Fts5HashQuery( Fts5Hash*, /* Hash table to query */ + int nPre, const char *pTerm, int nTerm, /* Query term */ - const u8 **ppDoclist, /* OUT: Pointer to doclist for pTerm */ + void **ppObj, /* OUT: Pointer to doclist for pTerm */ int *pnDoclist /* OUT: Size of doclist in bytes */ ); @@ -199718,7 +201897,7 @@ static int sqlite3Fts5UnicodeIsdiacritic(int c); static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic); static int sqlite3Fts5UnicodeCatParse(const char*, u8*); -static int sqlite3Fts5UnicodeCategory(int iCode); +static int sqlite3Fts5UnicodeCategory(u32 iCode); static void sqlite3Fts5UnicodeAscii(u8*, u8*); /* ** End of interface to code in fts5_unicode2.c. @@ -200622,41 +202801,70 @@ static void fts5yy_shift( fts5yyTraceShift(fts5yypParser, fts5yyNewState, "Shift"); } -/* The following table contains information about every rule that -** is used during the reduce. -*/ -static const struct { - fts5YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ - signed char nrhs; /* Negative of the number of RHS symbols in the rule */ -} fts5yyRuleInfo[] = { - { 16, -1 }, /* (0) input ::= expr */ - { 20, -4 }, /* (1) colset ::= MINUS LCP colsetlist RCP */ - { 20, -3 }, /* (2) colset ::= LCP colsetlist RCP */ - { 20, -1 }, /* (3) colset ::= STRING */ - { 20, -2 }, /* (4) colset ::= MINUS STRING */ - { 21, -2 }, /* (5) colsetlist ::= colsetlist STRING */ - { 21, -1 }, /* (6) colsetlist ::= STRING */ - { 17, -3 }, /* (7) expr ::= expr AND expr */ - { 17, -3 }, /* (8) expr ::= expr OR expr */ - { 17, -3 }, /* (9) expr ::= expr NOT expr */ - { 17, -5 }, /* (10) expr ::= colset COLON LP expr RP */ - { 17, -3 }, /* (11) expr ::= LP expr RP */ - { 17, -1 }, /* (12) expr ::= exprlist */ - { 19, -1 }, /* (13) exprlist ::= cnearset */ - { 19, -2 }, /* (14) exprlist ::= exprlist cnearset */ - { 18, -1 }, /* (15) cnearset ::= nearset */ - { 18, -3 }, /* (16) cnearset ::= colset COLON nearset */ - { 22, -1 }, /* (17) nearset ::= phrase */ - { 22, -2 }, /* (18) nearset ::= CARET phrase */ - { 22, -5 }, /* (19) nearset ::= STRING LP nearphrases neardist_opt RP */ - { 23, -1 }, /* (20) nearphrases ::= phrase */ - { 23, -2 }, /* (21) nearphrases ::= nearphrases phrase */ - { 25, 0 }, /* (22) neardist_opt ::= */ - { 25, -2 }, /* (23) neardist_opt ::= COMMA STRING */ - { 24, -4 }, /* (24) phrase ::= phrase PLUS STRING star_opt */ - { 24, -2 }, /* (25) phrase ::= STRING star_opt */ - { 26, -1 }, /* (26) star_opt ::= STAR */ - { 26, 0 }, /* (27) star_opt ::= */ +/* For rule J, fts5yyRuleInfoLhs[J] contains the symbol on the left-hand side +** of that rule */ +static const fts5YYCODETYPE fts5yyRuleInfoLhs[] = { + 16, /* (0) input ::= expr */ + 20, /* (1) colset ::= MINUS LCP colsetlist RCP */ + 20, /* (2) colset ::= LCP colsetlist RCP */ + 20, /* (3) colset ::= STRING */ + 20, /* (4) colset ::= MINUS STRING */ + 21, /* (5) colsetlist ::= colsetlist STRING */ + 21, /* (6) colsetlist ::= STRING */ + 17, /* (7) expr ::= expr AND expr */ + 17, /* (8) expr ::= expr OR expr */ + 17, /* (9) expr ::= expr NOT expr */ + 17, /* (10) expr ::= colset COLON LP expr RP */ + 17, /* (11) expr ::= LP expr RP */ + 17, /* (12) expr ::= exprlist */ + 19, /* (13) exprlist ::= cnearset */ + 19, /* (14) exprlist ::= exprlist cnearset */ + 18, /* (15) cnearset ::= nearset */ + 18, /* (16) cnearset ::= colset COLON nearset */ + 22, /* (17) nearset ::= phrase */ + 22, /* (18) nearset ::= CARET phrase */ + 22, /* (19) nearset ::= STRING LP nearphrases neardist_opt RP */ + 23, /* (20) nearphrases ::= phrase */ + 23, /* (21) nearphrases ::= nearphrases phrase */ + 25, /* (22) neardist_opt ::= */ + 25, /* (23) neardist_opt ::= COMMA STRING */ + 24, /* (24) phrase ::= phrase PLUS STRING star_opt */ + 24, /* (25) phrase ::= STRING star_opt */ + 26, /* (26) star_opt ::= STAR */ + 26, /* (27) star_opt ::= */ +}; + +/* For rule J, fts5yyRuleInfoNRhs[J] contains the negative of the number +** of symbols on the right-hand side of that rule. */ +static const signed char fts5yyRuleInfoNRhs[] = { + -1, /* (0) input ::= expr */ + -4, /* (1) colset ::= MINUS LCP colsetlist RCP */ + -3, /* (2) colset ::= LCP colsetlist RCP */ + -1, /* (3) colset ::= STRING */ + -2, /* (4) colset ::= MINUS STRING */ + -2, /* (5) colsetlist ::= colsetlist STRING */ + -1, /* (6) colsetlist ::= STRING */ + -3, /* (7) expr ::= expr AND expr */ + -3, /* (8) expr ::= expr OR expr */ + -3, /* (9) expr ::= expr NOT expr */ + -5, /* (10) expr ::= colset COLON LP expr RP */ + -3, /* (11) expr ::= LP expr RP */ + -1, /* (12) expr ::= exprlist */ + -1, /* (13) exprlist ::= cnearset */ + -2, /* (14) exprlist ::= exprlist cnearset */ + -1, /* (15) cnearset ::= nearset */ + -3, /* (16) cnearset ::= colset COLON nearset */ + -1, /* (17) nearset ::= phrase */ + -2, /* (18) nearset ::= CARET phrase */ + -5, /* (19) nearset ::= STRING LP nearphrases neardist_opt RP */ + -1, /* (20) nearphrases ::= phrase */ + -2, /* (21) nearphrases ::= nearphrases phrase */ + 0, /* (22) neardist_opt ::= */ + -2, /* (23) neardist_opt ::= COMMA STRING */ + -4, /* (24) phrase ::= phrase PLUS STRING star_opt */ + -2, /* (25) phrase ::= STRING star_opt */ + -1, /* (26) star_opt ::= STAR */ + 0, /* (27) star_opt ::= */ }; static void fts5yy_accept(fts5yyParser*); /* Forward Declaration */ @@ -200688,7 +202896,7 @@ static fts5YYACTIONTYPE fts5yy_reduce( fts5yymsp = fts5yypParser->fts5yytos; #ifndef NDEBUG if( fts5yyTraceFILE && fts5yyruleno<(int)(sizeof(fts5yyRuleName)/sizeof(fts5yyRuleName[0])) ){ - fts5yysize = fts5yyRuleInfo[fts5yyruleno].nrhs; + fts5yysize = fts5yyRuleInfoNRhs[fts5yyruleno]; if( fts5yysize ){ fprintf(fts5yyTraceFILE, "%sReduce %d [%s], go to state %d.\n", fts5yyTracePrompt, @@ -200703,7 +202911,7 @@ static fts5YYACTIONTYPE fts5yy_reduce( /* Check that the stack is large enough to grow by a single entry ** if the RHS of the rule is empty. This ensures that there is room ** enough on the stack to push the LHS value */ - if( fts5yyRuleInfo[fts5yyruleno].nrhs==0 ){ + if( fts5yyRuleInfoNRhs[fts5yyruleno]==0 ){ #ifdef fts5YYTRACKMAXSTACKDEPTH if( (int)(fts5yypParser->fts5yytos - fts5yypParser->fts5yystack)>fts5yypParser->fts5yyhwm ){ fts5yypParser->fts5yyhwm++; @@ -200887,9 +203095,9 @@ static fts5YYACTIONTYPE fts5yy_reduce( break; /********** End reduce actions ************************************************/ }; - assert( fts5yyrulenozOut = sqlite3_mprintf("%z%.*s", p->zOut, n, z); if( p->zOut==0 ) *pRc = SQLITE_NOMEM; @@ -201452,7 +203660,7 @@ static int fts5SentenceFinderAdd(Fts5SFinder *p, int iAdd){ int nNew = p->nFirstAlloc ? p->nFirstAlloc*2 : 64; int *aNew; - aNew = (int*)sqlite3_realloc(p->aFirst, nNew*sizeof(int)); + aNew = (int*)sqlite3_realloc64(p->aFirst, nNew*sizeof(int)); if( aNew==0 ) return SQLITE_NOMEM; p->aFirst = aNew; p->nFirstAlloc = nNew; @@ -201519,11 +203727,12 @@ static int fts5SnippetScore( int nInst; int nScore = 0; int iLast = 0; + sqlite3_int64 iEnd = (sqlite3_int64)iPos + nToken; rc = pApi->xInstCount(pFts, &nInst); for(i=0; ixInst(pFts, i, &ip, &ic, &iOff); - if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOff<(iPos+nToken) ){ + if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOffnDocsize ) iAdj = nDocsize - nToken; if( iAdj<0 ) iAdj = 0; - *piPos = iAdj; + *piPos = (int)iAdj; } return rc; @@ -201626,7 +203835,9 @@ static void fts5SnippetFunction( int jj; rc = pApi->xInst(pFts, ii, &ip, &ic, &io); - if( ic!=i || rc!=SQLITE_OK ) continue; + if( ic!=i ) continue; + if( io>nDocsize ) rc = FTS5_CORRUPT; + if( rc!=SQLITE_OK ) continue; memset(aSeen, 0, nPhrase); rc = fts5SnippetScore(pApi, pFts, nDocsize, aSeen, i, io, nToken, &nScore, &iAdj @@ -201752,17 +203963,17 @@ static int fts5Bm25GetData( int nPhrase; /* Number of phrases in query */ sqlite3_int64 nRow = 0; /* Number of rows in table */ sqlite3_int64 nToken = 0; /* Number of tokens in table */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int i; /* Allocate the Fts5Bm25Data object */ nPhrase = pApi->xPhraseCount(pFts); nByte = sizeof(Fts5Bm25Data) + nPhrase*2*sizeof(double); - p = (Fts5Bm25Data*)sqlite3_malloc(nByte); + p = (Fts5Bm25Data*)sqlite3_malloc64(nByte); if( p==0 ){ rc = SQLITE_NOMEM; }else{ - memset(p, 0, nByte); + memset(p, 0, (size_t)nByte); p->nPhrase = nPhrase; p->aIDF = (double*)&p[1]; p->aFreq = &p->aIDF[nPhrase]; @@ -201770,6 +203981,7 @@ static int fts5Bm25GetData( /* Calculate the average document length for this FTS5 table */ if( rc==SQLITE_OK ) rc = pApi->xRowCount(pFts, &nRow); + assert( rc!=SQLITE_OK || nRow>0 ); if( rc==SQLITE_OK ) rc = pApi->xColumnTotalSize(pFts, -1, &nToken); if( rc==SQLITE_OK ) p->avgdl = (double)nToken / (double)nRow; @@ -201895,8 +204107,6 @@ static int sqlite3Fts5AuxInit(fts5_api *pApi){ return rc; } - - /* ** 2014 May 31 ** @@ -201916,17 +204126,17 @@ static int sqlite3Fts5AuxInit(fts5_api *pApi){ static int sqlite3Fts5BufferSize(int *pRc, Fts5Buffer *pBuf, u32 nByte){ if( (u32)pBuf->nSpacenSpace ? pBuf->nSpace : 64; + u64 nNew = pBuf->nSpace ? pBuf->nSpace : 64; u8 *pNew; while( nNewp, nNew); + pNew = sqlite3_realloc64(pBuf->p, nNew); if( pNew==0 ){ *pRc = SQLITE_NOMEM; return 1; }else{ - pBuf->nSpace = nNew; + pBuf->nSpace = (int)nNew; pBuf->p = pNew; } } @@ -201951,7 +204161,7 @@ static void sqlite3Fts5Put32(u8 *aBuf, int iVal){ } static int sqlite3Fts5Get32(const u8 *aBuf){ - return (aBuf[0] << 24) + (aBuf[1] << 16) + (aBuf[2] << 8) + aBuf[3]; + return (int)((((u32)aBuf[0])<<24) + (aBuf[1]<<16) + (aBuf[2]<<8) + aBuf[3]); } /* @@ -202082,7 +204292,7 @@ static int sqlite3Fts5PoslistNext64( iOff = ((i64)iVal) << 32; fts5FastGetVarint32(a, i, iVal); } - *piOff = iOff + (iVal-2); + *piOff = iOff + ((iVal-2) & 0x7FFFFFFF); *pi = i; return 0; } @@ -202143,14 +204353,14 @@ static int sqlite3Fts5PoslistWriterAppend( return SQLITE_OK; } -static void *sqlite3Fts5MallocZero(int *pRc, int nByte){ +static void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte){ void *pRet = 0; if( *pRc==SQLITE_OK ){ - pRet = sqlite3_malloc(nByte); + pRet = sqlite3_malloc64(nByte); if( pRet==0 ){ if( nByte>0 ) *pRc = SQLITE_NOMEM; }else{ - memset(pRet, 0, nByte); + memset(pRet, 0, (size_t)nByte); } } return pRet; @@ -202589,7 +204799,7 @@ static int fts5ConfigParseSpecial( if( sqlite3_strnicmp("tokenize", zCmd, nCmd)==0 ){ const char *p = (const char*)zArg; - int nArg = (int)strlen(zArg) + 1; + sqlite3_int64 nArg = strlen(zArg) + 1; char **azArg = sqlite3Fts5MallocZero(&rc, sizeof(char*) * nArg); char *pDel = sqlite3Fts5MallocZero(&rc, nArg * 2); char *pSpace = pDel; @@ -202619,7 +204829,7 @@ static int fts5ConfigParseSpecial( rc = SQLITE_ERROR; }else{ rc = sqlite3Fts5GetTokenizer(pGlobal, - (const char**)azArg, nArg, &pConfig->pTok, &pConfig->pTokApi, + (const char**)azArg, (int)nArg, &pConfig->pTok, &pConfig->pTokApi, pzErr ); } @@ -202719,8 +204929,8 @@ static const char *fts5ConfigGobbleWord( ){ const char *zRet = 0; - int nIn = (int)strlen(zIn); - char *zOut = sqlite3_malloc(nIn+1); + sqlite3_int64 nIn = strlen(zIn); + char *zOut = sqlite3_malloc64(nIn+1); assert( *pRc==SQLITE_OK ); *pbQuoted = 0; @@ -202729,7 +204939,7 @@ static const char *fts5ConfigGobbleWord( if( zOut==0 ){ *pRc = SQLITE_NOMEM; }else{ - memcpy(zOut, zIn, nIn+1); + memcpy(zOut, zIn, (size_t)(nIn+1)); if( fts5_isopenquote(zOut[0]) ){ int ii = fts5Dequote(zOut); zRet = &zIn[ii]; @@ -202823,7 +205033,7 @@ static int sqlite3Fts5ConfigParse( int rc = SQLITE_OK; /* Return code */ Fts5Config *pRet; /* New object to return */ int i; - int nByte; + sqlite3_int64 nByte; *ppOut = pRet = (Fts5Config*)sqlite3_malloc(sizeof(Fts5Config)); if( pRet==0 ) return SQLITE_NOMEM; @@ -203467,7 +205677,7 @@ static int fts5ExprGetToken( return tok; } -static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc((int)t); } +static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc64((sqlite3_int64)t);} static void fts5ParseFree(void *p){ sqlite3_free(p); } static int sqlite3Fts5ExprNew( @@ -203612,8 +205822,8 @@ static int fts5ExprSynonymList( if( sqlite3Fts5IterEof(pIter)==0 && pIter->iRowid==iRowid ){ if( pIter->nData==0 ) continue; if( nIter==nAlloc ){ - int nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; - Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; + Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc64(nByte); if( aNew==0 ){ rc = SQLITE_NOMEM; goto synonym_poslist_out; @@ -203693,8 +205903,8 @@ static int fts5ExprPhraseIsMatch( /* If the aStatic[] array is not large enough, allocate a large array ** using sqlite3_malloc(). This approach could be improved upon. */ if( pPhrase->nTerm>ArraySize(aStatic) ){ - int nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; - aIter = (Fts5PoslistReader*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; + aIter = (Fts5PoslistReader*)sqlite3_malloc64(nByte); if( !aIter ) return SQLITE_NOMEM; } memset(aIter, 0, sizeof(Fts5PoslistReader) * pPhrase->nTerm); @@ -203828,7 +206038,7 @@ static int fts5ExprNearIsMatch(int *pRc, Fts5ExprNearset *pNear){ /* If the aStatic[] array is not large enough, allocate a large array ** using sqlite3_malloc(). This approach could be improved upon. */ if( pNear->nPhrase>ArraySize(aStatic) ){ - int nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; + sqlite3_int64 nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; a = (Fts5NearTrimmer*)sqlite3Fts5MallocZero(&rc, nByte); }else{ memset(aStatic, 0, sizeof(aStatic)); @@ -204737,18 +206947,20 @@ static Fts5ExprNearset *sqlite3Fts5ParseNearset( return pNear; } if( pNear==0 ){ - int nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); - pRet = sqlite3_malloc(nByte); + sqlite3_int64 nByte; + nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); + pRet = sqlite3_malloc64(nByte); if( pRet==0 ){ pParse->rc = SQLITE_NOMEM; }else{ - memset(pRet, 0, nByte); + memset(pRet, 0, (size_t)nByte); } }else if( (pNear->nPhrase % SZALLOC)==0 ){ int nNew = pNear->nPhrase + SZALLOC; - int nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + sqlite3_int64 nByte; - pRet = (Fts5ExprNearset*)sqlite3_realloc(pNear, nByte); + nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + pRet = (Fts5ExprNearset*)sqlite3_realloc64(pNear, nByte); if( pRet==0 ){ pParse->rc = SQLITE_NOMEM; } @@ -204812,12 +207024,12 @@ static int fts5ParseTokenize( if( pPhrase && pPhrase->nTerm>0 && (tflags & FTS5_TOKEN_COLOCATED) ){ Fts5ExprTerm *pSyn; - int nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; - pSyn = (Fts5ExprTerm*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; + pSyn = (Fts5ExprTerm*)sqlite3_malloc64(nByte); if( pSyn==0 ){ rc = SQLITE_NOMEM; }else{ - memset(pSyn, 0, nByte); + memset(pSyn, 0, (size_t)nByte); pSyn->zTerm = ((char*)pSyn) + sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer); memcpy(pSyn->zTerm, pToken, nToken); pSyn->pSynonym = pPhrase->aTerm[pPhrase->nTerm-1].pSynonym; @@ -204829,7 +207041,7 @@ static int fts5ParseTokenize( Fts5ExprPhrase *pNew; int nNew = SZALLOC + (pPhrase ? pPhrase->nTerm : 0); - pNew = (Fts5ExprPhrase*)sqlite3_realloc(pPhrase, + pNew = (Fts5ExprPhrase*)sqlite3_realloc64(pPhrase, sizeof(Fts5ExprPhrase) + sizeof(Fts5ExprTerm) * nNew ); if( pNew==0 ){ @@ -204915,9 +207127,9 @@ static Fts5ExprPhrase *sqlite3Fts5ParseTerm( if( pAppend==0 ){ if( (pParse->nPhrase % 8)==0 ){ - int nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); + sqlite3_int64 nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); Fts5ExprPhrase **apNew; - apNew = (Fts5ExprPhrase**)sqlite3_realloc(pParse->apPhrase, nByte); + apNew = (Fts5ExprPhrase**)sqlite3_realloc64(pParse->apPhrase, nByte); if( apNew==0 ){ pParse->rc = SQLITE_NOMEM; fts5ExprPhraseFree(sCtx.pPhrase); @@ -204972,10 +207184,12 @@ static int sqlite3Fts5ExprClonePhrase( if( rc==SQLITE_OK ){ Fts5Colset *pColsetOrig = pOrig->pNode->pNear->pColset; if( pColsetOrig ){ - int nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); - Fts5Colset *pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); + sqlite3_int64 nByte; + Fts5Colset *pColset; + nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); + pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); if( pColset ){ - memcpy(pColset, pColsetOrig, nByte); + memcpy(pColset, pColsetOrig, (size_t)nByte); } pNew->pRoot->pNear->pColset = pColset; } @@ -205093,7 +207307,7 @@ static Fts5Colset *fts5ParseColset( assert( pParse->rc==SQLITE_OK ); assert( iCol>=0 && iColpConfig->nCol ); - pNew = sqlite3_realloc(p, sizeof(Fts5Colset) + sizeof(int)*nCol); + pNew = sqlite3_realloc64(p, sizeof(Fts5Colset) + sizeof(int)*nCol); if( pNew==0 ){ pParse->rc = SQLITE_NOMEM; }else{ @@ -205189,10 +207403,10 @@ static Fts5Colset *sqlite3Fts5ParseColset( static Fts5Colset *fts5CloneColset(int *pRc, Fts5Colset *pOrig){ Fts5Colset *pRet; if( pOrig ){ - int nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); + sqlite3_int64 nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); pRet = (Fts5Colset*)sqlite3Fts5MallocZero(pRc, nByte); if( pRet ){ - memcpy(pRet, pOrig, nByte); + memcpy(pRet, pOrig, (size_t)nByte); } }else{ pRet = 0; @@ -205343,7 +207557,7 @@ static Fts5ExprNode *sqlite3Fts5ParseNode( if( pParse->rc==SQLITE_OK ){ int nChild = 0; /* Number of children of returned node */ - int nByte; /* Bytes of space to allocate for this node */ + sqlite3_int64 nByte; /* Bytes of space to allocate for this node */ assert( (eType!=FTS5_STRING && !pNear) || (eType==FTS5_STRING && !pLeft && !pRight) @@ -205475,7 +207689,7 @@ static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( } static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ - int nByte = 0; + sqlite3_int64 nByte = 0; Fts5ExprTerm *p; char *zQuoted; @@ -205483,7 +207697,7 @@ static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ for(p=pTerm; p; p=p->pSynonym){ nByte += (int)strlen(pTerm->zTerm) * 2 + 3 + 2; } - zQuoted = sqlite3_malloc(nByte); + zQuoted = sqlite3_malloc64(nByte); if( zQuoted ){ int i = 0; @@ -205723,7 +207937,7 @@ static void fts5ExprFunction( } nConfig = 3 + (nArg-iArg); - azConfig = (const char**)sqlite3_malloc(sizeof(char*) * nConfig); + azConfig = (const char**)sqlite3_malloc64(sizeof(char*) * nConfig); if( azConfig==0 ){ sqlite3_result_error_nomem(pCtx); return; @@ -205809,7 +208023,7 @@ static void fts5ExprIsAlnum( sqlite3Fts5UnicodeCatParse("N*", aArr); sqlite3Fts5UnicodeCatParse("Co", aArr); iCode = sqlite3_value_int(apVal[0]); - sqlite3_result_int(pCtx, aArr[sqlite3Fts5UnicodeCategory(iCode)]); + sqlite3_result_int(pCtx, aArr[sqlite3Fts5UnicodeCategory((u32)iCode)]); } static void fts5ExprFold( @@ -205904,7 +208118,7 @@ struct Fts5PoslistPopulator { static Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr *pExpr, int bLive){ Fts5PoslistPopulator *pRet; - pRet = sqlite3_malloc(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); + pRet = sqlite3_malloc64(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); if( pRet ){ int i; memset(pRet, 0, sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); @@ -206104,7 +208318,6 @@ static int sqlite3Fts5ExprPhraseCollist( return rc; } - /* ** 2014 August 11 ** @@ -206197,20 +208410,20 @@ static int sqlite3Fts5HashNew(Fts5Config *pConfig, Fts5Hash **ppNew, int *pnByte if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ - int nByte; + sqlite3_int64 nByte; memset(pNew, 0, sizeof(Fts5Hash)); pNew->pnByte = pnByte; pNew->eDetail = pConfig->eDetail; pNew->nSlot = 1024; nByte = sizeof(Fts5HashEntry*) * pNew->nSlot; - pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc(nByte); + pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc64(nByte); if( pNew->aSlot==0 ){ sqlite3_free(pNew); *ppNew = 0; rc = SQLITE_NOMEM; }else{ - memset(pNew->aSlot, 0, nByte); + memset(pNew->aSlot, 0, (size_t)nByte); } } return rc; @@ -206272,7 +208485,7 @@ static int fts5HashResize(Fts5Hash *pHash){ Fts5HashEntry **apNew; Fts5HashEntry **apOld = pHash->aSlot; - apNew = (Fts5HashEntry**)sqlite3_malloc(nNew*sizeof(Fts5HashEntry*)); + apNew = (Fts5HashEntry**)sqlite3_malloc64(nNew*sizeof(Fts5HashEntry*)); if( !apNew ) return SQLITE_NOMEM; memset(apNew, 0, nNew*sizeof(Fts5HashEntry*)); @@ -206294,19 +208507,25 @@ static int fts5HashResize(Fts5Hash *pHash){ return SQLITE_OK; } -static void fts5HashAddPoslistSize(Fts5Hash *pHash, Fts5HashEntry *p){ +static int fts5HashAddPoslistSize( + Fts5Hash *pHash, + Fts5HashEntry *p, + Fts5HashEntry *p2 +){ + int nRet = 0; if( p->iSzPoslist ){ - u8 *pPtr = (u8*)p; + u8 *pPtr = p2 ? (u8*)p2 : (u8*)p; + int nData = p->nData; if( pHash->eDetail==FTS5_DETAIL_NONE ){ - assert( p->nData==p->iSzPoslist ); + assert( nData==p->iSzPoslist ); if( p->bDel ){ - pPtr[p->nData++] = 0x00; + pPtr[nData++] = 0x00; if( p->bContent ){ - pPtr[p->nData++] = 0x00; + pPtr[nData++] = 0x00; } } }else{ - int nSz = (p->nData - p->iSzPoslist - 1); /* Size in bytes */ + int nSz = (nData - p->iSzPoslist - 1); /* Size in bytes */ int nPos = nSz*2 + p->bDel; /* Value of nPos field */ assert( p->bDel==0 || p->bDel==1 ); @@ -206316,14 +208535,19 @@ static void fts5HashAddPoslistSize(Fts5Hash *pHash, Fts5HashEntry *p){ int nByte = sqlite3Fts5GetVarintLen((u32)nPos); memmove(&pPtr[p->iSzPoslist + nByte], &pPtr[p->iSzPoslist + 1], nSz); sqlite3Fts5PutVarint(&pPtr[p->iSzPoslist], nPos); - p->nData += (nByte-1); + nData += (nByte-1); } } - p->iSzPoslist = 0; - p->bDel = 0; - p->bContent = 0; + nRet = nData - p->nData; + if( p2==0 ){ + p->iSzPoslist = 0; + p->bDel = 0; + p->bContent = 0; + p->nData = nData; + } } + return nRet; } /* @@ -206366,7 +208590,7 @@ static int sqlite3Fts5HashWrite( if( p==0 ){ /* Figure out how much space to allocate */ char *zKey; - int nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; + sqlite3_int64 nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; if( nByte<128 ) nByte = 128; /* Grow the Fts5Hash.aSlot[] array if necessary. */ @@ -206377,10 +208601,10 @@ static int sqlite3Fts5HashWrite( } /* Allocate new Fts5HashEntry and add it to the hash table. */ - p = (Fts5HashEntry*)sqlite3_malloc(nByte); + p = (Fts5HashEntry*)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, sizeof(Fts5HashEntry)); - p->nAlloc = nByte; + p->nAlloc = (int)nByte; zKey = fts5EntryKey(p); zKey[0] = bByte; memcpy(&zKey[1], pToken, nToken); @@ -206416,12 +208640,12 @@ static int sqlite3Fts5HashWrite( ** + 5 bytes for the new position offset (32-bit max). */ if( (p->nAlloc - p->nData) < (9 + 4 + 1 + 3 + 5) ){ - int nNew = p->nAlloc * 2; + sqlite3_int64 nNew = p->nAlloc * 2; Fts5HashEntry *pNew; Fts5HashEntry **pp; - pNew = (Fts5HashEntry*)sqlite3_realloc(p, nNew); + pNew = (Fts5HashEntry*)sqlite3_realloc64(p, nNew); if( pNew==0 ) return SQLITE_NOMEM; - pNew->nAlloc = nNew; + pNew->nAlloc = (int)nNew; for(pp=&pHash->aSlot[iHash]; *pp!=p; pp=&(*pp)->pHashNext); *pp = pNew; p = pNew; @@ -206435,7 +208659,7 @@ static int sqlite3Fts5HashWrite( /* If this is a new rowid, append the 4-byte size field for the previous ** entry, and the new rowid for this entry. */ if( iRowid!=p->iRowid ){ - fts5HashAddPoslistSize(pHash, p); + fts5HashAddPoslistSize(pHash, p, 0); p->nData += sqlite3Fts5PutVarint(&pPtr[p->nData], iRowid - p->iRowid); p->iRowid = iRowid; bNew = 1; @@ -206545,14 +208769,16 @@ static int fts5HashEntrySort( int i; *ppSorted = 0; - ap = sqlite3_malloc(sizeof(Fts5HashEntry*) * nMergeSlot); + ap = sqlite3_malloc64(sizeof(Fts5HashEntry*) * nMergeSlot); if( !ap ) return SQLITE_NOMEM; memset(ap, 0, sizeof(Fts5HashEntry*) * nMergeSlot); for(iSlot=0; iSlotnSlot; iSlot++){ Fts5HashEntry *pIter; for(pIter=pHash->aSlot[iSlot]; pIter; pIter=pIter->pHashNext){ - if( pTerm==0 || 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm) ){ + if( pTerm==0 + || (pIter->nKey+1>=nTerm && 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm)) + ){ Fts5HashEntry *pEntry = pIter; pEntry->pScanNext = 0; for(i=0; ap[i]; i++){ @@ -206580,8 +208806,9 @@ static int fts5HashEntrySort( */ static int sqlite3Fts5HashQuery( Fts5Hash *pHash, /* Hash table to query */ + int nPre, const char *pTerm, int nTerm, /* Query term */ - const u8 **ppDoclist, /* OUT: Pointer to doclist for pTerm */ + void **ppOut, /* OUT: Pointer to new object */ int *pnDoclist /* OUT: Size of doclist in bytes */ ){ unsigned int iHash = fts5HashKey(pHash->nSlot, (const u8*)pTerm, nTerm); @@ -206590,15 +208817,25 @@ static int sqlite3Fts5HashQuery( for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){ zKey = fts5EntryKey(p); - if( memcmp(zKey, pTerm, nTerm)==0 && zKey[nTerm]==0 ) break; + assert( p->nKey+1==(int)strlen(zKey) ); + if( nTerm==p->nKey+1 && memcmp(zKey, pTerm, nTerm)==0 ) break; } if( p ){ - fts5HashAddPoslistSize(pHash, p); - *ppDoclist = (const u8*)&zKey[nTerm+1]; - *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm + 1); + int nHashPre = sizeof(Fts5HashEntry) + nTerm + 1; + int nList = p->nData - nHashPre; + u8 *pRet = (u8*)(*ppOut = sqlite3_malloc64(nPre + nList + 10)); + if( pRet ){ + Fts5HashEntry *pFaux = (Fts5HashEntry*)&pRet[nPre-nHashPre]; + memcpy(&pRet[nPre], &((u8*)p)[nHashPre], nList); + nList += fts5HashAddPoslistSize(pHash, p, pFaux); + *pnDoclist = nList; + }else{ + *pnDoclist = 0; + return SQLITE_NOMEM; + } }else{ - *ppDoclist = 0; + *ppOut = 0; *pnDoclist = 0; } @@ -206631,7 +208868,7 @@ static void sqlite3Fts5HashScanEntry( if( (p = pHash->pScan) ){ char *zKey = fts5EntryKey(p); int nTerm = (int)strlen(zKey); - fts5HashAddPoslistSize(pHash, p); + fts5HashAddPoslistSize(pHash, p, 0); *pzTerm = zKey; *ppDoclist = (const u8*)&zKey[nTerm+1]; *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm + 1); @@ -206642,7 +208879,6 @@ static void sqlite3Fts5HashScanEntry( } } - /* ** 2014 May 31 ** @@ -207157,7 +209393,6 @@ struct Fts5Iter { Fts5IndexIter base; /* Base class containing output vars */ Fts5Index *pIndex; /* Index that owns this iterator */ - Fts5Structure *pStruct; /* Database structure for this iterator */ Fts5Buffer poslist; /* Buffer containing current poslist */ Fts5Colset *pColset; /* Restrict matches to these columns */ @@ -207218,7 +209453,7 @@ static u16 fts5GetU16(const u8 *aIn){ ** If an OOM error is encountered, return NULL and set the error code in ** the Fts5Index handle passed as the first argument. */ -static void *fts5IdxMalloc(Fts5Index *p, int nByte){ +static void *fts5IdxMalloc(Fts5Index *p, sqlite3_int64 nByte){ return sqlite3Fts5MallocZero(&p->rc, nByte); } @@ -207252,7 +209487,7 @@ static int fts5BufferCompareBlob( */ static int fts5BufferCompare(Fts5Buffer *pLeft, Fts5Buffer *pRight){ int nCmp = MIN(pLeft->n, pRight->n); - int res = memcmp(pLeft->p, pRight->p, nCmp); + int res = fts5Memcmp(pLeft->p, pRight->p, nCmp); return (res==0 ? (pLeft->n - pRight->n) : res); } @@ -207318,8 +209553,8 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ if( rc==SQLITE_OK ){ u8 *aOut = 0; /* Read blob data into this buffer */ int nByte = sqlite3_blob_bytes(p->pReader); - int nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; - pRet = (Fts5Data*)sqlite3_malloc(nAlloc); + sqlite3_int64 nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; + pRet = (Fts5Data*)sqlite3_malloc64(nAlloc); if( pRet ){ pRet->nn = nByte; aOut = pRet->p = (u8*)&pRet[1]; @@ -207335,6 +209570,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ pRet = 0; }else{ /* TODO1: Fix this */ + pRet->p[nByte] = 0x00; pRet->szLeaf = fts5GetU16(&pRet->p[2]); } } @@ -207374,7 +209610,8 @@ static int fts5IndexPrepareStmt( if( p->rc==SQLITE_OK ){ if( zSql ){ p->rc = sqlite3_prepare_v3(p->pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT, ppStmt, 0); + SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB, + ppStmt, 0); }else{ p->rc = SQLITE_NOMEM; } @@ -207415,23 +209652,12 @@ static void fts5DataDelete(Fts5Index *p, i64 iFirst, i64 iLast){ if( p->rc!=SQLITE_OK ) return; if( p->pDeleter==0 ){ - int rc; Fts5Config *pConfig = p->pConfig; char *zSql = sqlite3_mprintf( "DELETE FROM '%q'.'%q_data' WHERE id>=? AND id<=?", pConfig->zDb, pConfig->zName ); - if( zSql==0 ){ - rc = SQLITE_NOMEM; - }else{ - rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT, &p->pDeleter, 0); - sqlite3_free(zSql); - } - if( rc!=SQLITE_OK ){ - p->rc = rc; - return; - } + if( fts5IndexPrepareStmt(p, &p->pDeleter, zSql) ) return; } sqlite3_bind_int64(p->pDeleter, 1, iFirst); @@ -207503,7 +209729,7 @@ static int fts5StructureDecode( int iLvl; int nLevel = 0; int nSegment = 0; - int nByte; /* Bytes of space to allocate at pRet */ + sqlite3_int64 nByte; /* Bytes of space to allocate at pRet */ Fts5Structure *pRet = 0; /* Structure object to return */ /* Grab the cookie value */ @@ -207514,6 +209740,11 @@ static int fts5StructureDecode( ** structure record. */ i += fts5GetVarint32(&pData[i], nLevel); i += fts5GetVarint32(&pData[i], nSegment); + if( nLevel>FTS5_MAX_SEGMENT || nLevel<0 + || nSegment>FTS5_MAX_SEGMENT || nSegment<0 + ){ + return FTS5_CORRUPT; + } nByte = ( sizeof(Fts5Structure) + /* Main structure */ sizeof(Fts5StructureLevel) * (nLevel-1) /* aLevel[] array */ @@ -207536,25 +209767,35 @@ static int fts5StructureDecode( }else{ i += fts5GetVarint32(&pData[i], pLvl->nMerge); i += fts5GetVarint32(&pData[i], nTotal); - assert( nTotal>=pLvl->nMerge ); + if( nTotalnMerge ) rc = FTS5_CORRUPT; pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&rc, nTotal * sizeof(Fts5StructureSegment) ); + nSegment -= nTotal; } if( rc==SQLITE_OK ){ pLvl->nSeg = nTotal; for(iSeg=0; iSegaSeg[iSeg]; if( i>=nData ){ rc = FTS5_CORRUPT; break; } - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].iSegid); - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].pgnoFirst); - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].pgnoLast); + i += fts5GetVarint32(&pData[i], pSeg->iSegid); + i += fts5GetVarint32(&pData[i], pSeg->pgnoFirst); + i += fts5GetVarint32(&pData[i], pSeg->pgnoLast); + if( pSeg->pgnoLastpgnoFirst ){ + rc = FTS5_CORRUPT; + break; + } } + if( iLvl>0 && pLvl[-1].nMerge && nTotal==0 ) rc = FTS5_CORRUPT; + if( iLvl==nLevel-1 && pLvl->nMerge ) rc = FTS5_CORRUPT; } } + if( nSegment!=0 && rc==SQLITE_OK ) rc = FTS5_CORRUPT; + if( rc!=SQLITE_OK ){ fts5StructureRelease(pRet); pRet = 0; @@ -207572,12 +209813,12 @@ static void fts5StructureAddLevel(int *pRc, Fts5Structure **ppStruct){ if( *pRc==SQLITE_OK ){ Fts5Structure *pStruct = *ppStruct; int nLevel = pStruct->nLevel; - int nByte = ( + sqlite3_int64 nByte = ( sizeof(Fts5Structure) + /* Main structure */ sizeof(Fts5StructureLevel) * (nLevel+1) /* aLevel[] array */ ); - pStruct = sqlite3_realloc(pStruct, nByte); + pStruct = sqlite3_realloc64(pStruct, nByte); if( pStruct ){ memset(&pStruct->aLevel[nLevel], 0, sizeof(Fts5StructureLevel)); pStruct->nLevel++; @@ -207602,10 +209843,10 @@ static void fts5StructureExtendLevel( if( *pRc==SQLITE_OK ){ Fts5StructureLevel *pLvl = &pStruct->aLevel[iLvl]; Fts5StructureSegment *aNew; - int nByte; + sqlite3_int64 nByte; nByte = (pLvl->nSeg + nExtra) * sizeof(Fts5StructureSegment); - aNew = sqlite3_realloc(pLvl->aSeg, nByte); + aNew = sqlite3_realloc64(pLvl->aSeg, nByte); if( aNew ){ if( bInsert==0 ){ memset(&aNew[pLvl->nSeg], 0, sizeof(Fts5StructureSegment) * nExtra); @@ -208119,10 +210360,10 @@ static Fts5DlidxIter *fts5DlidxIterInit( int bDone = 0; for(i=0; p->rc==SQLITE_OK && bDone==0; i++){ - int nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); + sqlite3_int64 nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); Fts5DlidxIter *pNew; - pNew = (Fts5DlidxIter*)sqlite3_realloc(pIter, nByte); + pNew = (Fts5DlidxIter*)sqlite3_realloc64(pIter, nByte); if( pNew==0 ){ p->rc = SQLITE_NOMEM; }else{ @@ -208292,12 +210533,13 @@ static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){ int nNew; /* Bytes of new data */ iOff += fts5GetVarint32(&a[iOff], nNew); - if( iOff+nNew>pIter->pLeaf->nn ){ + if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n || nNew==0 ){ p->rc = FTS5_CORRUPT; return; } pIter->term.n = nKeep; fts5BufferAppendBlob(&p->rc, &pIter->term, nNew, &a[iOff]); + assert( pIter->term.n<=pIter->term.nSpace ); iOff += nNew; pIter->iTermLeafOffset = iOff; pIter->iTermLeafPgno = pIter->iLeafPgno; @@ -208362,7 +210604,7 @@ static void fts5SegIterInit( if( p->rc==SQLITE_OK ){ pIter->iLeafOffset = 4; assert_nc( pIter->pLeaf->nn>4 ); - assert( fts5LeafFirstTermOff(pIter->pLeaf)==4 ); + assert_nc( fts5LeafFirstTermOff(pIter->pLeaf)==4 ); pIter->iPgidxOff = pIter->pLeaf->szLeaf+1; fts5SegIterLoadTerm(p, pIter, 0); fts5SegIterLoadNPos(p, pIter); @@ -208418,7 +210660,7 @@ static void fts5SegIterReverseInitPage(Fts5Index *p, Fts5SegIter *pIter){ /* If necessary, grow the pIter->aRowidOffset[] array. */ if( iRowidOffset>=pIter->nRowidOffset ){ int nNew = pIter->nRowidOffset + 8; - int *aNew = (int*)sqlite3_realloc(pIter->aRowidOffset, nNew*sizeof(int)); + int *aNew = (int*)sqlite3_realloc64(pIter->aRowidOffset,nNew*sizeof(int)); if( aNew==0 ){ p->rc = SQLITE_NOMEM; break; @@ -208872,10 +211114,10 @@ static void fts5LeafSeek( int szLeaf = pIter->pLeaf->szLeaf; int n = pIter->pLeaf->nn; - int nMatch = 0; - int nKeep = 0; - int nNew = 0; - int iTermOff; + u32 nMatch = 0; + u32 nKeep = 0; + u32 nNew = 0; + u32 iTermOff; int iPgidx; /* Current offset in pgidx */ int bEndOfPage = 0; @@ -208899,15 +211141,15 @@ static void fts5LeafSeek( assert( nKeep>=nMatch ); if( nKeep==nMatch ){ - int nCmp; - int i; - nCmp = MIN(nNew, nTerm-nMatch); + u32 nCmp; + u32 i; + nCmp = (u32)MIN(nNew, nTerm-nMatch); for(i=0; ipLeaf->p[iPgidx], iOff); if( iOff<4 || iOff>=pIter->pLeaf->szLeaf ){ p->rc = FTS5_CORRUPT; + return; }else{ nKeep = 0; iTermOff = iOff; @@ -208963,8 +211206,11 @@ static void fts5LeafSeek( } search_success: - pIter->iLeafOffset = iOff + nNew; + if( pIter->iLeafOffset>n || nNew<1 ){ + p->rc = FTS5_CORRUPT; + return; + } pIter->iTermLeafOffset = pIter->iLeafOffset; pIter->iTermLeafPgno = pIter->iLeafPgno; @@ -209071,7 +211317,7 @@ static void fts5SegIterSeekInit( ** 4) the FTS5INDEX_QUERY_SCAN flag was set and the iterator points ** to an entry with a term greater than or equal to (pTerm/nTerm). */ - assert( p->rc!=SQLITE_OK /* 1 */ + assert_nc( p->rc!=SQLITE_OK /* 1 */ || pIter->pLeaf==0 /* 2 */ || fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)==0 /* 3 */ || (bGe && fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)>0) /* 4 */ @@ -209092,31 +211338,40 @@ static void fts5SegIterHashInit( int flags, /* Mask of FTS5INDEX_XXX flags */ Fts5SegIter *pIter /* Object to populate */ ){ - const u8 *pList = 0; int nList = 0; const u8 *z = 0; int n = 0; + Fts5Data *pLeaf = 0; assert( p->pHash ); assert( p->rc==SQLITE_OK ); if( pTerm==0 || (flags & FTS5INDEX_QUERY_SCAN) ){ + const u8 *pList = 0; + p->rc = sqlite3Fts5HashScanInit(p->pHash, (const char*)pTerm, nTerm); sqlite3Fts5HashScanEntry(p->pHash, (const char**)&z, &pList, &nList); n = (z ? (int)strlen((const char*)z) : 0); + if( pList ){ + pLeaf = fts5IdxMalloc(p, sizeof(Fts5Data)); + if( pLeaf ){ + pLeaf->p = (u8*)pList; + } + } }else{ - pIter->flags |= FTS5_SEGITER_ONETERM; - sqlite3Fts5HashQuery(p->pHash, (const char*)pTerm, nTerm, &pList, &nList); + p->rc = sqlite3Fts5HashQuery(p->pHash, sizeof(Fts5Data), + (const char*)pTerm, nTerm, (void**)&pLeaf, &nList + ); + if( pLeaf ){ + pLeaf->p = (u8*)&pLeaf[1]; + } z = pTerm; n = nTerm; + pIter->flags |= FTS5_SEGITER_ONETERM; } - if( pList ){ - Fts5Data *pLeaf; + if( pLeaf ){ sqlite3Fts5BufferSet(&p->rc, &pIter->term, n, z); - pLeaf = fts5IdxMalloc(p, sizeof(Fts5Data)); - if( pLeaf==0 ) return; - pLeaf->p = (u8*)pList; pLeaf->nn = pLeaf->szLeaf = nList; pIter->pLeaf = pLeaf; pIter->iLeafOffset = fts5GetVarint(pLeaf->p, (u64*)&pIter->iRowid); @@ -209169,7 +211424,7 @@ static void fts5AssertComparisonResult( assert( pRes->iFirst==i1 ); }else{ int nMin = MIN(p1->term.n, p2->term.n); - int res = memcmp(p1->term.p, p2->term.p, nMin); + int res = fts5Memcmp(p1->term.p, p2->term.p, nMin); if( res==0 ) res = p1->term.n - p2->term.n; if( res==0 ){ @@ -209269,8 +211524,8 @@ static int fts5MultiIterDoCompare(Fts5Iter *pIter, int iOut){ }else{ int res = fts5BufferCompare(&p1->term, &p2->term); if( res==0 ){ - assert( i2>i1 ); - assert( i2!=0 ); + assert_nc( i2>i1 ); + assert_nc( i2!=0 ); pRes->bTermEq = 1; if( p1->iRowid==p2->iRowid ){ p1->bDel = p2->bDel; @@ -209392,7 +211647,6 @@ static void fts5MultiIterFree(Fts5Iter *pIter){ for(i=0; inSeg; i++){ fts5SegIterClear(&pIter->aSeg[i]); } - fts5StructureRelease(pIter->pStruct); fts5BufferFree(&pIter->poslist); sqlite3_free(pIter); } @@ -209740,7 +211994,8 @@ static void fts5SegiterPoslist( Fts5Colset *pColset, Fts5Buffer *pBuf ){ - if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos) ){ + if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos+FTS5_DATA_ZERO_PADDING) ){ + memset(&pBuf->p[pBuf->n+pSeg->nPos], 0, FTS5_DATA_ZERO_PADDING); if( pColset==0 ){ fts5ChunkIterate(p, pSeg, (void*)pBuf, fts5PoslistCallback); }else{ @@ -210038,9 +212293,7 @@ static void fts5MultiIterNew( if( pNew==0 ) return; pNew->bRev = (0!=(flags & FTS5INDEX_QUERY_DESC)); pNew->bSkipEmpty = (0!=(flags & FTS5INDEX_QUERY_SKIPEMPTY)); - pNew->pStruct = pStruct; pNew->pColset = pColset; - fts5StructureRef(pStruct); if( (flags & FTS5INDEX_QUERY_NOOUTPUT)==0 ){ fts5IterSetOutputCb(&p->rc, pNew); } @@ -210218,24 +212471,24 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ for(iLvl=0; iLvlnLevel; iLvl++){ for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ int iId = pStruct->aLevel[iLvl].aSeg[iSeg].iSegid; - if( iId<=FTS5_MAX_SEGMENT ){ - aUsed[(iId-1) / 32] |= 1 << ((iId-1) % 32); + if( iId<=FTS5_MAX_SEGMENT && iId>0 ){ + aUsed[(iId-1) / 32] |= (u32)1 << ((iId-1) % 32); } } } for(i=0; aUsed[i]==0xFFFFFFFF; i++); mask = aUsed[i]; - for(iSegid=0; mask & (1 << iSegid); iSegid++); + for(iSegid=0; mask & ((u32)1 << iSegid); iSegid++); iSegid += 1 + i*32; #ifdef SQLITE_DEBUG for(iLvl=0; iLvlnLevel; iLvl++){ for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ - assert( iSegid!=pStruct->aLevel[iLvl].aSeg[iSeg].iSegid ); + assert_nc( iSegid!=pStruct->aLevel[iLvl].aSeg[iSeg].iSegid ); } } - assert( iSegid>0 && iSegid<=FTS5_MAX_SEGMENT ); + assert_nc( iSegid>0 && iSegid<=FTS5_MAX_SEGMENT ); { sqlite3_stmt *pIdxSelect = fts5IdxSelectStmt(p); @@ -210243,7 +212496,7 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ u8 aBlob[2] = {0xff, 0xff}; sqlite3_bind_int(pIdxSelect, 1, iSegid); sqlite3_bind_blob(pIdxSelect, 2, aBlob, 2, SQLITE_STATIC); - assert( sqlite3_step(pIdxSelect)!=SQLITE_ROW ); + assert_nc( sqlite3_step(pIdxSelect)!=SQLITE_ROW ); p->rc = sqlite3_reset(pIdxSelect); sqlite3_bind_null(pIdxSelect, 2); } @@ -210313,13 +212566,13 @@ static int fts5WriteDlidxGrow( int nLvl ){ if( p->rc==SQLITE_OK && nLvl>=pWriter->nDlidx ){ - Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc( + Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc64( pWriter->aDlidx, sizeof(Fts5DlidxWriter) * nLvl ); if( aDlidx==0 ){ p->rc = SQLITE_NOMEM; }else{ - int nByte = sizeof(Fts5DlidxWriter) * (nLvl - pWriter->nDlidx); + size_t nByte = sizeof(Fts5DlidxWriter) * (nLvl - pWriter->nDlidx); memset(&aDlidx[pWriter->nDlidx], 0, nByte); pWriter->aDlidx = aDlidx; pWriter->nDlidx = nLvl; @@ -210392,8 +212645,10 @@ static void fts5WriteBtreeTerm( int nTerm, const u8 *pTerm /* First term on new page */ ){ fts5WriteFlushBtree(p, pWriter); - fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); - pWriter->iBtPage = pWriter->writer.pgno; + if( p->rc==SQLITE_OK ){ + fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); + pWriter->iBtPage = pWriter->writer.pgno; + } } /* @@ -210544,6 +212799,7 @@ static void fts5WriteAppendTerm( int nPrefix; /* Bytes of prefix compression for term */ Fts5PageWriter *pPage = &pWriter->writer; Fts5Buffer *pPgidx = &pWriter->writer.pgidx; + int nMin = MIN(pPage->term.n, nTerm); assert( p->rc==SQLITE_OK ); assert( pPage->buf.n>=4 ); @@ -210553,6 +212809,7 @@ static void fts5WriteAppendTerm( if( (pPage->buf.n + pPgidx->n + nTerm + 2)>=p->pConfig->pgsz ){ if( pPage->buf.n>4 ){ fts5WriteFlushLeaf(p, pWriter); + if( p->rc!=SQLITE_OK ) return; } fts5BufferGrow(&p->rc, &pPage->buf, nTerm+FTS5_DATA_PADDING); } @@ -210585,13 +212842,14 @@ static void fts5WriteAppendTerm( ** inefficient, but still correct. */ int n = nTerm; if( pPage->term.n ){ - n = 1 + fts5PrefixCompress(pPage->term.n, pPage->term.p, pTerm); + n = 1 + fts5PrefixCompress(nMin, pPage->term.p, pTerm); } fts5WriteBtreeTerm(p, pWriter, n, pTerm); + if( p->rc!=SQLITE_OK ) return; pPage = &pWriter->writer; } }else{ - nPrefix = fts5PrefixCompress(pPage->term.n, pPage->term.p, pTerm); + nPrefix = fts5PrefixCompress(nMin, pPage->term.p, pTerm); fts5BufferAppendVarint(&p->rc, &pPage->buf, nPrefix); } @@ -210638,7 +212896,7 @@ static void fts5WriteAppendRowid( if( pWriter->bFirstRowidInDoclist || pWriter->bFirstRowidInPage ){ fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid); }else{ - assert( p->rc || iRowid>pWriter->iPrevRowid ); + assert_nc( p->rc || iRowid>pWriter->iPrevRowid ); fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid - pWriter->iPrevRowid); } pWriter->iPrevRowid = iRowid; @@ -210760,7 +213018,7 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ int i; Fts5Buffer buf; memset(&buf, 0, sizeof(Fts5Buffer)); - for(i=0; inSeg; i++){ + for(i=0; inSeg && p->rc==SQLITE_OK; i++){ Fts5SegIter *pSeg = &pIter->aSeg[i]; if( pSeg->pSeg==0 ){ /* no-op */ @@ -210778,35 +213036,44 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ u8 aHdr[4] = {0x00, 0x00, 0x00, 0x00}; iLeafRowid = FTS5_SEGMENT_ROWID(iId, pSeg->iTermLeafPgno); - pData = fts5DataRead(p, iLeafRowid); + pData = fts5LeafRead(p, iLeafRowid); if( pData ){ - fts5BufferZero(&buf); - fts5BufferGrow(&p->rc, &buf, pData->nn); - fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); - fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); - fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); - fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff, &pData->p[iOff]); - if( p->rc==SQLITE_OK ){ - /* Set the szLeaf field */ - fts5PutU16(&buf.p[2], (u16)buf.n); - } + if( iOff>pData->szLeaf ){ + /* This can occur if the pages that the segments occupy overlap - if + ** a single page has been assigned to more than one segment. In + ** this case a prior iteration of this loop may have corrupted the + ** segment currently being trimmed. */ + p->rc = FTS5_CORRUPT; + }else{ + fts5BufferZero(&buf); + fts5BufferGrow(&p->rc, &buf, pData->nn); + fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); + fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); + fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff,&pData->p[iOff]); + if( p->rc==SQLITE_OK ){ + /* Set the szLeaf field */ + fts5PutU16(&buf.p[2], (u16)buf.n); + } - /* Set up the new page-index array */ - fts5BufferAppendVarint(&p->rc, &buf, 4); - if( pSeg->iLeafPgno==pSeg->iTermLeafPgno - && pSeg->iEndofDoclistszLeaf - ){ - int nDiff = pData->szLeaf - pSeg->iEndofDoclist; - fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); - fts5BufferAppendBlob(&p->rc, &buf, - pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] - ); - } + /* Set up the new page-index array */ + fts5BufferAppendVarint(&p->rc, &buf, 4); + if( pSeg->iLeafPgno==pSeg->iTermLeafPgno + && pSeg->iEndofDoclistszLeaf + && pSeg->iPgidxOff<=pData->nn + ){ + int nDiff = pData->szLeaf - pSeg->iEndofDoclist; + fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); + fts5BufferAppendBlob(&p->rc, &buf, + pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] + ); + } + pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; + fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); + fts5DataWrite(p, iLeafRowid, buf.p, buf.n); + } fts5DataRelease(pData); - pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; - fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); - fts5DataWrite(p, iLeafRowid, buf.p, buf.n); } } } @@ -210898,7 +213165,7 @@ static void fts5IndexMergeLevel( const u8 *pTerm; pTerm = fts5MultiIterTerm(pIter, &nTerm); - if( nTerm!=term.n || memcmp(pTerm, term.p, nTerm) ){ + if( nTerm!=term.n || fts5Memcmp(pTerm, term.p, nTerm) ){ if( pnRem && writer.nLeafWritten>nRem ){ break; } @@ -211153,6 +213420,7 @@ static void fts5FlushOneHash(Fts5Index *p){ /* Write the term for this entry to disk. */ sqlite3Fts5HashScanEntry(pHash, &zTerm, &pDoclist, &nDoclist); fts5WriteAppendTerm(p, &writer, (int)strlen(zTerm), (const u8*)zTerm); + if( p->rc!=SQLITE_OK ) break; assert( writer.bFirstRowidInPage==0 ); if( pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){ @@ -211175,6 +213443,7 @@ static void fts5FlushOneHash(Fts5Index *p){ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid); writer.bFirstRowidInPage = 0; fts5WriteDlidxAppend(p, &writer, iRowid); + if( p->rc!=SQLITE_OK ) break; }else{ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iDelta); } @@ -211232,7 +213501,7 @@ static void fts5FlushOneHash(Fts5Index *p){ /* TODO2: Doclist terminator written here. */ /* pBuf->p[pBuf->n++] = '\0'; */ assert( pBuf->n<=pBuf->nSpace ); - sqlite3Fts5HashScanNext(pHash); + if( p->rc==SQLITE_OK ) sqlite3Fts5HashScanNext(pHash); } sqlite3Fts5HashClear(pHash); fts5WriteFinish(p, &writer, &pgnoLast); @@ -211276,7 +213545,7 @@ static Fts5Structure *fts5IndexOptimizeStruct( Fts5Structure *pStruct ){ Fts5Structure *pNew = 0; - int nByte = sizeof(Fts5Structure); + sqlite3_int64 nByte = sizeof(Fts5Structure); int nSeg = pStruct->nSegment; int i; @@ -211406,11 +213675,13 @@ static void fts5AppendPoslist( Fts5Buffer *pBuf ){ int nData = pMulti->base.nData; + int nByte = nData + 9 + 9 + FTS5_DATA_ZERO_PADDING; assert( nData>0 ); - if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nData+9+9) ){ + if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nByte) ){ fts5BufferSafeAppendVarint(pBuf, iDelta); fts5BufferSafeAppendVarint(pBuf, nData*2); fts5BufferSafeAppendBlob(pBuf, pMulti->base.pData, nData); + memset(&pBuf->p[pBuf->n], 0, FTS5_DATA_ZERO_PADDING); } } @@ -211591,6 +213862,8 @@ static void fts5MergePrefixLists( int iOff2 = 0; u8 *a1 = &i1.aPoslist[i1.nSize]; u8 *a2 = &i2.aPoslist[i2.nSize]; + int nCopy; + u8 *aCopy; i64 iPrev = 0; Fts5PoslistWriter writer; @@ -211622,7 +213895,7 @@ static void fts5MergePrefixLists( sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1); if( iPos1<0 ) break; }else{ - assert( iPos2!=iPrev ); + assert_nc( iPos2!=iPrev ); sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2); if( iPos2<0 ) break; @@ -211634,11 +213907,16 @@ static void fts5MergePrefixLists( if( iPos1!=iPrev ){ sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos1); } - fts5BufferSafeAppendBlob(&tmp, &a1[iOff1], i1.nPoslist-iOff1); + aCopy = &a1[iOff1]; + nCopy = i1.nPoslist - iOff1; }else{ assert( iPos2>=0 && iPos2!=iPrev ); sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); - fts5BufferSafeAppendBlob(&tmp, &a2[iOff2], i2.nPoslist-iOff2); + aCopy = &a2[iOff2]; + nCopy = i2.nPoslist - iOff2; + } + if( nCopy>0 ){ + fts5BufferSafeAppendBlob(&tmp, aCopy, nCopy); } /* WRITEPOSLISTSIZE */ @@ -211646,6 +213924,7 @@ static void fts5MergePrefixLists( fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n); fts5DoclistIterNext(&i1); fts5DoclistIterNext(&i2); + assert( out.n<=(p1->n+p2->n+9) ); if( i1.aPoslist==0 || i2.aPoslist==0 ) break; } } @@ -211747,7 +214026,7 @@ static void fts5SetupPrefixIter( } fts5MultiIterFree(p1); - pData = fts5IdxMalloc(p, sizeof(Fts5Data) + doclist.n); + pData = fts5IdxMalloc(p, sizeof(Fts5Data)+doclist.n+FTS5_DATA_ZERO_PADDING); if( pData ){ pData->p = (u8*)&pData[1]; pData->nn = pData->szLeaf = doclist.n; @@ -212509,11 +214788,11 @@ static void fts5IndexIntegrityCheckSegment( iOff = fts5LeafFirstTermOff(pLeaf); iRowidOff = fts5LeafFirstRowidOff(pLeaf); - if( iRowidOff>=iOff ){ + if( iRowidOff>=iOff || iOff>=pLeaf->szLeaf ){ p->rc = FTS5_CORRUPT; }else{ iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm); - res = memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); + res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); if( res==0 ) res = nTerm - nIdxTerm; if( res<0 ) p->rc = FTS5_CORRUPT; } @@ -212908,7 +215187,7 @@ static void fts5DecodeFunction( u8 *a = 0; Fts5Buffer s; /* Build up text to return here */ int rc = SQLITE_OK; /* Return code */ - int nSpace = 0; + sqlite3_int64 nSpace = 0; int eDetailNone = (sqlite3_user_data(pCtx)!=0); assert( nArg==2 ); @@ -212924,8 +215203,7 @@ static void fts5DecodeFunction( nSpace = n + FTS5_DATA_ZERO_PADDING; a = (u8*)sqlite3Fts5MallocZero(&rc, nSpace); if( a==0 ) goto decode_out; - memcpy(a, aBlob, n); - + if( n>0 ) memcpy(a, aBlob, n); fts5DecodeRowid(iRowid, &iSegid, &bDlidx, &iHeight, &iPgno); @@ -213020,6 +215298,9 @@ static void fts5DecodeFunction( iPgidxOff = szLeaf = fts5GetU16(&a[2]); if( iPgidxOffn ){ + rc = FTS5_CORRUPT; + goto decode_out; } } @@ -213031,14 +215312,22 @@ static void fts5DecodeFunction( }else{ iOff = szLeaf; } + if( iOff>n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } fts5DecodePoslist(&rc, &s, &a[4], iOff-4); /* Decode any more doclist data that appears on the page before the ** first term. */ nDoclist = (iTermOff ? iTermOff : szLeaf) - iOff; + if( nDoclist+iOff>n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } fts5DecodeDoclist(&rc, &s, &a[iOff], nDoclist); - while( iPgidxOffszLeaf ){ + rc = FTS5_CORRUPT; + break; + } if( bFirst==0 ){ iOff += fts5GetVarint32(&a[iOff], nByte); + if( nByte>term.n ){ + rc = FTS5_CORRUPT; + break; + } term.n = nByte; } iOff += fts5GetVarint32(&a[iOff], nByte); + if( iOff+nByte>n ){ + rc = FTS5_CORRUPT; + break; + } fts5BufferAppendBlob(&rc, &term, nByte, &a[iOff]); iOff += nByte; @@ -213182,8 +215483,8 @@ SQLITE_API int sqlite3_fts5_may_be_corrupt = 1; typedef struct Fts5Auxdata Fts5Auxdata; typedef struct Fts5Auxiliary Fts5Auxiliary; typedef struct Fts5Cursor Fts5Cursor; +typedef struct Fts5FullTable Fts5FullTable; typedef struct Fts5Sorter Fts5Sorter; -typedef struct Fts5Table Fts5Table; typedef struct Fts5TokenizerModule Fts5TokenizerModule; /* @@ -213264,13 +215565,8 @@ struct Fts5TokenizerModule { Fts5TokenizerModule *pNext; /* Next registered tokenizer module */ }; -/* -** Virtual-table object. -*/ -struct Fts5Table { - sqlite3_vtab base; /* Base class used by SQLite core */ - Fts5Config *pConfig; /* Virtual table configuration */ - Fts5Index *pIndex; /* Full-text index */ +struct Fts5FullTable { + Fts5Table p; /* Public class members from fts5Int.h */ Fts5Storage *pStorage; /* Document store */ Fts5Global *pGlobal; /* Global (connection wide) data */ Fts5Cursor *pSortCsr; /* Sort data from this cursor */ @@ -213408,7 +215704,7 @@ struct Fts5Auxdata { #define FTS5_SAVEPOINT 5 #define FTS5_RELEASE 6 #define FTS5_ROLLBACKTO 7 -static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ +static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){ switch( op ){ case FTS5_BEGIN: assert( p->ts.eState==0 ); @@ -213447,7 +215743,7 @@ static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ case FTS5_ROLLBACKTO: assert( p->ts.eState==1 ); - assert( iSavepoint>=0 ); + assert( iSavepoint>=-1 ); assert( iSavepoint<=p->ts.iSavepoint ); p->ts.iSavepoint = iSavepoint; break; @@ -213460,18 +215756,18 @@ static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ /* ** Return true if pTab is a contentless table. */ -static int fts5IsContentless(Fts5Table *pTab){ - return pTab->pConfig->eContent==FTS5_CONTENT_NONE; +static int fts5IsContentless(Fts5FullTable *pTab){ + return pTab->p.pConfig->eContent==FTS5_CONTENT_NONE; } /* ** Delete a virtual table handle allocated by fts5InitVtab(). */ -static void fts5FreeVtab(Fts5Table *pTab){ +static void fts5FreeVtab(Fts5FullTable *pTab){ if( pTab ){ - sqlite3Fts5IndexClose(pTab->pIndex); + sqlite3Fts5IndexClose(pTab->p.pIndex); sqlite3Fts5StorageClose(pTab->pStorage); - sqlite3Fts5ConfigFree(pTab->pConfig); + sqlite3Fts5ConfigFree(pTab->p.pConfig); sqlite3_free(pTab); } } @@ -213480,7 +215776,7 @@ static void fts5FreeVtab(Fts5Table *pTab){ ** The xDisconnect() virtual table method. */ static int fts5DisconnectMethod(sqlite3_vtab *pVtab){ - fts5FreeVtab((Fts5Table*)pVtab); + fts5FreeVtab((Fts5FullTable*)pVtab); return SQLITE_OK; } @@ -213491,7 +215787,7 @@ static int fts5DestroyMethod(sqlite3_vtab *pVtab){ Fts5Table *pTab = (Fts5Table*)pVtab; int rc = sqlite3Fts5DropAll(pTab->pConfig); if( rc==SQLITE_OK ){ - fts5FreeVtab((Fts5Table*)pVtab); + fts5FreeVtab((Fts5FullTable*)pVtab); } return rc; } @@ -213520,28 +215816,28 @@ static int fts5InitVtab( const char **azConfig = (const char**)argv; int rc = SQLITE_OK; /* Return code */ Fts5Config *pConfig = 0; /* Results of parsing argc/argv */ - Fts5Table *pTab = 0; /* New virtual table object */ + Fts5FullTable *pTab = 0; /* New virtual table object */ /* Allocate the new vtab object and parse the configuration */ - pTab = (Fts5Table*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Table)); + pTab = (Fts5FullTable*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5FullTable)); if( rc==SQLITE_OK ){ rc = sqlite3Fts5ConfigParse(pGlobal, db, argc, azConfig, &pConfig, pzErr); assert( (rc==SQLITE_OK && *pzErr==0) || pConfig==0 ); } if( rc==SQLITE_OK ){ - pTab->pConfig = pConfig; + pTab->p.pConfig = pConfig; pTab->pGlobal = pGlobal; } /* Open the index sub-system */ if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->pIndex, pzErr); + rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->p.pIndex, pzErr); } /* Open the storage sub-system */ if( rc==SQLITE_OK ){ rc = sqlite3Fts5StorageOpen( - pConfig, pTab->pIndex, bCreate, &pTab->pStorage, pzErr + pConfig, pTab->p.pIndex, bCreate, &pTab->pStorage, pzErr ); } @@ -213554,8 +215850,8 @@ static int fts5InitVtab( if( rc==SQLITE_OK ){ assert( pConfig->pzErrmsg==0 ); pConfig->pzErrmsg = pzErr; - rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); - sqlite3Fts5IndexRollback(pTab->pIndex); + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + sqlite3Fts5IndexRollback(pTab->p.pIndex); pConfig->pzErrmsg = 0; } @@ -213768,7 +216064,7 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ return SQLITE_OK; } -static int fts5NewTransaction(Fts5Table *pTab){ +static int fts5NewTransaction(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->base.pVtab==(sqlite3_vtab*)pTab ) return SQLITE_OK; @@ -213780,19 +216076,19 @@ static int fts5NewTransaction(Fts5Table *pTab){ ** Implementation of xOpen method. */ static int fts5OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ - Fts5Table *pTab = (Fts5Table*)pVTab; - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)pVTab; + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = 0; /* New cursor object */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int rc; /* Return code */ rc = fts5NewTransaction(pTab); if( rc==SQLITE_OK ){ nByte = sizeof(Fts5Cursor) + pConfig->nCol * sizeof(int); - pCsr = (Fts5Cursor*)sqlite3_malloc(nByte); + pCsr = (Fts5Cursor*)sqlite3_malloc64(nByte); if( pCsr ){ Fts5Global *pGlobal = pTab->pGlobal; - memset(pCsr, 0, nByte); + memset(pCsr, 0, (size_t)nByte); pCsr->aColumnSize = (int*)&pCsr[1]; pCsr->pNext = pGlobal->pCsr; pGlobal->pCsr = pCsr; @@ -213827,7 +216123,7 @@ static void fts5CsrNewrow(Fts5Cursor *pCsr){ } static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); Fts5Auxdata *pData; Fts5Auxdata *pNext; @@ -213871,7 +216167,7 @@ static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ */ static int fts5CloseMethod(sqlite3_vtab_cursor *pCursor){ if( pCursor ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; Fts5Cursor **pp; @@ -213928,7 +216224,7 @@ static int fts5SorterNext(Fts5Cursor *pCsr){ ** Set the FTS5CSR_REQUIRE_RESEEK flag on all FTS5_PLAN_MATCH cursors ** open on table pTab. */ -static void fts5TripCursors(Fts5Table *pTab){ +static void fts5TripCursors(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->ePlan==FTS5_PLAN_MATCH @@ -213955,11 +216251,11 @@ static int fts5CursorReseek(Fts5Cursor *pCsr, int *pbSkip){ int rc = SQLITE_OK; assert( *pbSkip==0 ); if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_RESEEK) ){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int bDesc = pCsr->bDesc; i64 iRowid = sqlite3Fts5ExprRowid(pCsr->pExpr); - rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->pIndex, iRowid, bDesc); + rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->p.pIndex, iRowid, bDesc); if( rc==SQLITE_OK && iRowid!=sqlite3Fts5ExprRowid(pCsr->pExpr) ){ *pbSkip = 1; } @@ -214056,20 +216352,24 @@ static int fts5PrepareStatement( return rc; } -static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ - Fts5Config *pConfig = pTab->pConfig; +static int fts5CursorFirstSorted( + Fts5FullTable *pTab, + Fts5Cursor *pCsr, + int bDesc +){ + Fts5Config *pConfig = pTab->p.pConfig; Fts5Sorter *pSorter; int nPhrase; - int nByte; + sqlite3_int64 nByte; int rc; const char *zRank = pCsr->zRank; const char *zRankArgs = pCsr->zRankArgs; nPhrase = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); nByte = sizeof(Fts5Sorter) + sizeof(int) * (nPhrase-1); - pSorter = (Fts5Sorter*)sqlite3_malloc(nByte); + pSorter = (Fts5Sorter*)sqlite3_malloc64(nByte); if( pSorter==0 ) return SQLITE_NOMEM; - memset(pSorter, 0, nByte); + memset(pSorter, 0, (size_t)nByte); pSorter->nIdx = nPhrase; /* TODO: It would be better to have some system for reusing statement @@ -214104,10 +216404,10 @@ static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ return rc; } -static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ +static int fts5CursorFirst(Fts5FullTable *pTab, Fts5Cursor *pCsr, int bDesc){ int rc; Fts5Expr *pExpr = pCsr->pExpr; - rc = sqlite3Fts5ExprFirst(pExpr, pTab->pIndex, pCsr->iFirstRowid, bDesc); + rc = sqlite3Fts5ExprFirst(pExpr, pTab->p.pIndex, pCsr->iFirstRowid, bDesc); if( sqlite3Fts5ExprEof(pExpr) ){ CsrFlagSet(pCsr, FTS5CSR_EOF); } @@ -214122,7 +216422,7 @@ static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ ** parameters. */ static int fts5SpecialMatch( - Fts5Table *pTab, + Fts5FullTable *pTab, Fts5Cursor *pCsr, const char *zQuery ){ @@ -214133,18 +216433,18 @@ static int fts5SpecialMatch( while( z[0]==' ' ) z++; for(n=0; z[n] && z[n]!=' '; n++); - assert( pTab->base.zErrMsg==0 ); + assert( pTab->p.base.zErrMsg==0 ); pCsr->ePlan = FTS5_PLAN_SPECIAL; if( 0==sqlite3_strnicmp("reads", z, n) ){ - pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->pIndex); + pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->p.pIndex); } else if( 0==sqlite3_strnicmp("id", z, n) ){ pCsr->iSpecial = pCsr->iCsrId; } else{ /* An unrecognized directive. Return an error message. */ - pTab->base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); + pTab->p.base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); rc = SQLITE_ERROR; } @@ -214156,7 +216456,7 @@ static int fts5SpecialMatch( ** pTab. If one is found, return a pointer to the corresponding Fts5Auxiliary ** structure. Otherwise, if no such function exists, return NULL. */ -static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ +static Fts5Auxiliary *fts5FindAuxiliary(Fts5FullTable *pTab, const char *zName){ Fts5Auxiliary *pAux; for(pAux=pTab->pGlobal->pAux; pAux; pAux=pAux->pNext){ @@ -214169,8 +216469,8 @@ static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ static int fts5FindRankFunction(Fts5Cursor *pCsr){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; Fts5Auxiliary *pAux = 0; const char *zRank = pCsr->zRank; @@ -214186,7 +216486,7 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ assert( rc==SQLITE_OK || pCsr->pRankArgStmt==0 ); if( rc==SQLITE_OK ){ if( SQLITE_ROW==sqlite3_step(pStmt) ){ - int nByte; + sqlite3_int64 nByte; pCsr->nRankArg = sqlite3_column_count(pStmt); nByte = sizeof(sqlite3_value*)*pCsr->nRankArg; pCsr->apRankArg = (sqlite3_value**)sqlite3Fts5MallocZero(&rc, nByte); @@ -214208,8 +216508,8 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ if( rc==SQLITE_OK ){ pAux = fts5FindAuxiliary(pTab, zRank); if( pAux==0 ){ - assert( pTab->base.zErrMsg==0 ); - pTab->base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); + assert( pTab->p.base.zErrMsg==0 ); + pTab->p.base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); rc = SQLITE_ERROR; } } @@ -214284,8 +216584,8 @@ static int fts5FilterMethod( int nVal, /* Number of elements in apVal */ sqlite3_value **apVal /* Arguments for the indexing scheme */ ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; /* Error code */ int iVal = 0; /* Counter for apVal[] */ @@ -214314,8 +216614,8 @@ static int fts5FilterMethod( assert( pCsr->zRank==0 ); assert( pCsr->zRankArgs==0 ); - assert( pzErrmsg==0 || pzErrmsg==&pTab->base.zErrMsg ); - pConfig->pzErrmsg = &pTab->base.zErrMsg; + assert( pzErrmsg==0 || pzErrmsg==&pTab->p.base.zErrMsg ); + pConfig->pzErrmsg = &pTab->p.base.zErrMsg; /* Decode the arguments passed through to this function. ** @@ -214381,7 +216681,7 @@ static int fts5FilterMethod( ** but a request for an internal parameter. */ rc = fts5SpecialMatch(pTab, pCsr, &zExpr[1]); }else{ - char **pzErr = &pTab->base.zErrMsg; + char **pzErr = &pTab->p.base.zErrMsg; rc = sqlite3Fts5ExprNew(pConfig, iCol, zExpr, &pCsr->pExpr, pzErr); if( rc==SQLITE_OK ){ if( bOrderByRank ){ @@ -214404,7 +216704,7 @@ static int fts5FilterMethod( ** by rowid (ePlan==FTS5_PLAN_ROWID). */ pCsr->ePlan = (pRowidEq ? FTS5_PLAN_ROWID : FTS5_PLAN_SCAN); rc = sqlite3Fts5StorageStmt( - pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->base.zErrMsg + pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->p.base.zErrMsg ); if( rc==SQLITE_OK ){ if( pCsr->ePlan==FTS5_PLAN_ROWID ){ @@ -214487,12 +216787,12 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ /* If the cursor does not yet have a statement handle, obtain one now. */ if( pCsr->pStmt==0 ){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int eStmt = fts5StmtType(pCsr); rc = sqlite3Fts5StorageStmt( - pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->base.zErrMsg:0) + pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->p.base.zErrMsg:0) ); - assert( rc!=SQLITE_OK || pTab->base.zErrMsg==0 ); + assert( rc!=SQLITE_OK || pTab->p.base.zErrMsg==0 ); assert( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_CONTENT) ); } @@ -214514,11 +216814,11 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ return rc; } -static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ +static void fts5SetVtabError(Fts5FullTable *p, const char *zFormat, ...){ va_list ap; /* ... printf arguments */ va_start(ap, zFormat); - assert( p->base.zErrMsg==0 ); - p->base.zErrMsg = sqlite3_vmprintf(zFormat, ap); + assert( p->p.base.zErrMsg==0 ); + p->p.base.zErrMsg = sqlite3_vmprintf(zFormat, ap); va_end(ap); } @@ -214538,11 +216838,11 @@ static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ ** more commands are added to this function. */ static int fts5SpecialInsert( - Fts5Table *pTab, /* Fts5 table object */ + Fts5FullTable *pTab, /* Fts5 table object */ const char *zCmd, /* Text inserted into table-name column */ sqlite3_value *pVal /* Value inserted into rank column */ ){ - Fts5Config *pConfig = pTab->pConfig; + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; int bError = 0; @@ -214577,9 +216877,9 @@ static int fts5SpecialInsert( pConfig->bPrefixIndex = sqlite3_value_int(pVal); #endif }else{ - rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); if( rc==SQLITE_OK ){ - rc = sqlite3Fts5ConfigSetValue(pTab->pConfig, zCmd, pVal, &bError); + rc = sqlite3Fts5ConfigSetValue(pTab->p.pConfig, zCmd, pVal, &bError); } if( rc==SQLITE_OK ){ if( bError ){ @@ -214593,7 +216893,7 @@ static int fts5SpecialInsert( } static int fts5SpecialDelete( - Fts5Table *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal ){ int rc = SQLITE_OK; @@ -214607,7 +216907,7 @@ static int fts5SpecialDelete( static void fts5StorageInsert( int *pRc, - Fts5Table *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal, i64 *piRowid ){ @@ -214641,8 +216941,8 @@ static int fts5UpdateMethod( sqlite3_value **apVal, /* Array of arguments */ sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; + Fts5Config *pConfig = pTab->p.pConfig; int eType0; /* value_type() of apVal[0] */ int rc = SQLITE_OK; /* Return code */ @@ -214651,12 +216951,11 @@ static int fts5UpdateMethod( assert( pVtab->zErrMsg==0 ); assert( nArg==1 || nArg==(2+pConfig->nCol+2) ); - assert( nArg==1 - || sqlite3_value_type(apVal[1])==SQLITE_INTEGER - || sqlite3_value_type(apVal[1])==SQLITE_NULL + assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER + || sqlite3_value_type(apVal[0])==SQLITE_NULL ); - assert( pTab->pConfig->pzErrmsg==0 ); - pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + assert( pTab->p.pConfig->pzErrmsg==0 ); + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; /* Put any active cursors into REQUIRE_SEEK state. */ fts5TripCursors(pTab); @@ -214697,7 +216996,7 @@ static int fts5UpdateMethod( /* Filter out attempts to run UPDATE or DELETE on contentless tables. ** This is not suported. */ if( eType0==SQLITE_INTEGER && fts5IsContentless(pTab) ){ - pTab->base.zErrMsg = sqlite3_mprintf( + pTab->p.base.zErrMsg = sqlite3_mprintf( "cannot %s contentless fts5 table: %s", (nArg>1 ? "UPDATE" : "DELETE from"), pConfig->zName ); @@ -214710,46 +217009,52 @@ static int fts5UpdateMethod( rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, 0); } - /* INSERT */ - else if( eType0!=SQLITE_INTEGER ){ - /* If this is a REPLACE, first remove the current entry (if any) */ - if( eConflict==SQLITE_REPLACE - && sqlite3_value_type(apVal[1])==SQLITE_INTEGER - ){ - i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); - } - fts5StorageInsert(&rc, pTab, apVal, pRowid); - } - - /* UPDATE */ + /* INSERT or UPDATE */ else{ - i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ - i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ - if( iOld!=iNew ){ - if( eConflict==SQLITE_REPLACE ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); - } - fts5StorageInsert(&rc, pTab, apVal, pRowid); - }else{ - rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); - } - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal, *pRowid); - } + int eType1 = sqlite3_value_numeric_type(apVal[1]); + + if( eType1!=SQLITE_INTEGER && eType1!=SQLITE_NULL ){ + rc = SQLITE_MISMATCH; + } + + else if( eType0!=SQLITE_INTEGER ){ + /* If this is a REPLACE, first remove the current entry (if any) */ + if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){ + i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); } - }else{ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); fts5StorageInsert(&rc, pTab, apVal, pRowid); } + + /* UPDATE */ + else{ + i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ + i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ + if( eType1==SQLITE_INTEGER && iOld!=iNew ){ + if( eConflict==SQLITE_REPLACE ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + } + fts5StorageInsert(&rc, pTab, apVal, pRowid); + }else{ + rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal,*pRowid); + } + } + }else{ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + fts5StorageInsert(&rc, pTab, apVal, pRowid); + } + } } } - pTab->pConfig->pzErrmsg = 0; + pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -214758,12 +217063,12 @@ static int fts5UpdateMethod( */ static int fts5SyncMethod(sqlite3_vtab *pVtab){ int rc; - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_SYNC, 0); - pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; fts5TripCursors(pTab); rc = sqlite3Fts5StorageSync(pTab->pStorage); - pTab->pConfig->pzErrmsg = 0; + pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -214771,8 +217076,8 @@ static int fts5SyncMethod(sqlite3_vtab *pVtab){ ** Implementation of xBegin() method. */ static int fts5BeginMethod(sqlite3_vtab *pVtab){ - fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_BEGIN, 0); - fts5NewTransaction((Fts5Table*)pVtab); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_BEGIN, 0); + fts5NewTransaction((Fts5FullTable*)pVtab); return SQLITE_OK; } @@ -214783,7 +217088,7 @@ static int fts5BeginMethod(sqlite3_vtab *pVtab){ */ static int fts5CommitMethod(sqlite3_vtab *pVtab){ UNUSED_PARAM(pVtab); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_COMMIT, 0); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_COMMIT, 0); return SQLITE_OK; } @@ -214793,7 +217098,7 @@ static int fts5CommitMethod(sqlite3_vtab *pVtab){ */ static int fts5RollbackMethod(sqlite3_vtab *pVtab){ int rc; - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_ROLLBACK, 0); rc = sqlite3Fts5StorageRollback(pTab->pStorage); return rc; @@ -214817,13 +217122,13 @@ static int fts5ApiColumnTotalSize( sqlite3_int64 *pnToken ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); return sqlite3Fts5StorageSize(pTab->pStorage, iCol, pnToken); } static int fts5ApiRowCount(Fts5Context *pCtx, i64 *pnRow){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); return sqlite3Fts5StorageRowCount(pTab->pStorage, pnRow); } @@ -214858,7 +217163,9 @@ static int fts5ApiColumnText( ){ int rc = SQLITE_OK; Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - if( fts5IsContentless((Fts5Table*)(pCsr->base.pVtab)) ){ + if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab)) + || pCsr->ePlan==FTS5_PLAN_SPECIAL + ){ *pz = 0; *pn = 0; }else{ @@ -214927,10 +217234,11 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ int rc = SQLITE_OK; Fts5PoslistReader *aIter; /* One iterator for each phrase */ int nIter; /* Number of iterators/phrases */ + int nCol = ((Fts5Table*)pCsr->base.pVtab)->pConfig->nCol; nIter = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); if( pCsr->aInstIter==0 ){ - int nByte = sizeof(Fts5PoslistReader) * nIter; + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nIter; pCsr->aInstIter = (Fts5PoslistReader*)sqlite3Fts5MallocZero(&rc, nByte); } aIter = pCsr->aInstIter; @@ -214965,7 +217273,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ nInst++; if( nInst>=pCsr->nInstAlloc ){ pCsr->nInstAlloc = pCsr->nInstAlloc ? pCsr->nInstAlloc*2 : 32; - aInst = (int*)sqlite3_realloc( + aInst = (int*)sqlite3_realloc64( pCsr->aInst, pCsr->nInstAlloc*sizeof(int)*3 ); if( aInst ){ @@ -214980,6 +217288,10 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ aInst[0] = iBest; aInst[1] = FTS5_POS2COLUMN(aIter[iBest].iPos); aInst[2] = FTS5_POS2OFFSET(aIter[iBest].iPos); + if( aInst[1]<0 || aInst[1]>=nCol ){ + rc = FTS5_CORRUPT; + break; + } sqlite3Fts5PoslistReaderNext(&aIter[iBest]); } } @@ -215052,8 +217364,8 @@ static int fts5ColumnSizeCb( static int fts5ApiColumnSize(Fts5Context *pCtx, int iCol, int *pnToken){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_DOCSIZE) ){ @@ -215309,7 +217621,7 @@ static int fts5ApiQueryPhrase( int(*xCallback)(const Fts5ExtensionApi*, Fts5Context*, void*) ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int rc; Fts5Cursor *pNew = 0; @@ -215386,25 +217698,19 @@ static void fts5ApiCallback( /* -** Given cursor id iId, return a pointer to the corresponding Fts5Index +** Given cursor id iId, return a pointer to the corresponding Fts5Table ** object. Or NULL If the cursor id does not exist. -** -** If successful, set *ppConfig to point to the associated config object -** before returning. */ -static Fts5Index *sqlite3Fts5IndexFromCsrid( +static Fts5Table *sqlite3Fts5TableFromCsrid( Fts5Global *pGlobal, /* FTS5 global context for db handle */ - i64 iCsrId, /* Id of cursor to find */ - Fts5Config **ppConfig /* OUT: Configuration object */ + i64 iCsrId /* Id of cursor to find */ ){ Fts5Cursor *pCsr; - Fts5Table *pTab; - pCsr = fts5CursorFromCsrid(pGlobal, iCsrId); - pTab = (Fts5Table*)pCsr->base.pVtab; - *ppConfig = pTab->pConfig; - - return pTab->pIndex; + if( pCsr ){ + return (Fts5Table*)pCsr->base.pVtab; + } + return 0; } /* @@ -215484,8 +217790,8 @@ static int fts5ColumnMethod( sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ int iCol /* Index of column to read value from */ ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; @@ -215537,7 +217843,7 @@ static int fts5FindFunctionMethod( void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ void **ppArg /* OUT: User data for *pxFunc */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; Fts5Auxiliary *pAux; UNUSED_PARAM(nUnused); @@ -215559,21 +217865,24 @@ static int fts5RenameMethod( sqlite3_vtab *pVtab, /* Virtual table handle */ const char *zName /* New name of table */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; return sqlite3Fts5StorageRename(pTab->pStorage, zName); } +static int sqlite3Fts5FlushToDisk(Fts5Table *pTab){ + fts5TripCursors((Fts5FullTable*)pTab); + return sqlite3Fts5StorageSync(((Fts5FullTable*)pTab)->pStorage); +} + /* ** The xSavepoint() method. ** ** Flush the contents of the pending-terms table to disk. */ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState(pTab, FTS5_SAVEPOINT, iSavepoint); - fts5TripCursors(pTab); - return sqlite3Fts5StorageSync(pTab->pStorage); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_SAVEPOINT, iSavepoint); + return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); } /* @@ -215582,11 +217891,9 @@ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** This is a no-op. */ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState(pTab, FTS5_RELEASE, iSavepoint); - fts5TripCursors(pTab); - return sqlite3Fts5StorageSync(pTab->pStorage); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_RELEASE, iSavepoint); + return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); } /* @@ -215595,7 +217902,7 @@ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** Discard the contents of the pending terms table. */ static int fts5RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ fts5CheckTransactionState(pTab, FTS5_ROLLBACKTO, iSavepoint); fts5TripCursors(pTab); @@ -215616,14 +217923,14 @@ static int fts5CreateAux( int rc = sqlite3_overload_function(pGlobal->db, zName, -1); if( rc==SQLITE_OK ){ Fts5Auxiliary *pAux; - int nName; /* Size of zName in bytes, including \0 */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nName; /* Size of zName in bytes, including \0 */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ - nName = (int)strlen(zName) + 1; + nName = strlen(zName) + 1; nByte = sizeof(Fts5Auxiliary) + nName; - pAux = (Fts5Auxiliary*)sqlite3_malloc(nByte); + pAux = (Fts5Auxiliary*)sqlite3_malloc64(nByte); if( pAux ){ - memset(pAux, 0, nByte); + memset(pAux, 0, (size_t)nByte); pAux->zFunc = (char*)&pAux[1]; memcpy(pAux->zFunc, zName, nName); pAux->pGlobal = pGlobal; @@ -215653,15 +217960,15 @@ static int fts5CreateTokenizer( ){ Fts5Global *pGlobal = (Fts5Global*)pApi; Fts5TokenizerModule *pNew; - int nName; /* Size of zName and its \0 terminator */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nName; /* Size of zName and its \0 terminator */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int rc = SQLITE_OK; - nName = (int)strlen(zName) + 1; + nName = strlen(zName) + 1; nByte = sizeof(Fts5TokenizerModule) + nName; - pNew = (Fts5TokenizerModule*)sqlite3_malloc(nByte); + pNew = (Fts5TokenizerModule*)sqlite3_malloc64(nByte); if( pNew ){ - memset(pNew, 0, nByte); + memset(pNew, 0, (size_t)nByte); pNew->zName = (char*)&pNew[1]; memcpy(pNew->zName, zName, nName); pNew->pUserData = pUserData; @@ -215796,7 +218103,7 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2019-04-16 19:49:53 884b4b7e502b4e991677b53971277adfaf0a04a284f8e483e2553d0f83156b50", -1, SQLITE_TRANSIENT); } /* @@ -216045,7 +218352,7 @@ static int fts5StorageGetStmt( char *zBind; int i; - zBind = sqlite3_malloc(1 + nCol*2); + zBind = sqlite3_malloc64(1 + nCol*2); if( zBind ){ for(i=0; idb, zSql, -1, - SQLITE_PREPARE_PERSISTENT, &p->aStmt[eStmt], 0); + int f = SQLITE_PREPARE_PERSISTENT; + if( eStmt>FTS5_STMT_LOOKUP ) f |= SQLITE_PREPARE_NO_VTAB; + rc = sqlite3_prepare_v3(pC->db, zSql, -1, f, &p->aStmt[eStmt], 0); sqlite3_free(zSql); if( rc!=SQLITE_OK && pzErrMsg ){ *pzErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pC->db)); @@ -216211,14 +218519,14 @@ static int sqlite3Fts5StorageOpen( ){ int rc = SQLITE_OK; Fts5Storage *p; /* New object */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ nByte = sizeof(Fts5Storage) /* Fts5Storage object */ + pConfig->nCol * sizeof(i64); /* Fts5Storage.aTotalSize[] */ - *pp = p = (Fts5Storage*)sqlite3_malloc(nByte); + *pp = p = (Fts5Storage*)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; - memset(p, 0, nByte); + memset(p, 0, (size_t)nByte); p->aTotalSize = (i64*)&p[1]; p->pConfig = pConfig; p->pIndex = pIndex; @@ -216226,7 +218534,7 @@ static int sqlite3Fts5StorageOpen( if( bCreate ){ if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ int nDefn = 32 + pConfig->nCol*10; - char *zDefn = sqlite3_malloc(32 + pConfig->nCol * 10); + char *zDefn = sqlite3_malloc64(32 + (sqlite3_int64)pConfig->nCol * 10); if( zDefn==0 ){ rc = SQLITE_NOMEM; }else{ @@ -216517,7 +218825,7 @@ static int sqlite3Fts5StorageRebuild(Fts5Storage *p){ Fts5Config *pConfig = p->pConfig; sqlite3_stmt *pScan = 0; Fts5InsertCtx ctx; - int rc; + int rc, rc2; memset(&ctx, 0, sizeof(Fts5InsertCtx)); ctx.pStorage = p; @@ -216556,6 +218864,8 @@ static int sqlite3Fts5StorageRebuild(Fts5Storage *p){ } } sqlite3_free(buf.p); + rc2 = sqlite3_reset(pScan); + if( rc==SQLITE_OK ) rc = rc2; /* Write the averages record */ if( rc==SQLITE_OK ){ @@ -216805,7 +219115,7 @@ static int sqlite3Fts5StorageIntegrity(Fts5Storage *p){ memset(&ctx, 0, sizeof(Fts5IntegrityCtx)); ctx.pConfig = p->pConfig; - aTotalSize = (i64*)sqlite3_malloc(pConfig->nCol * (sizeof(int)+sizeof(i64))); + aTotalSize = (i64*)sqlite3_malloc64(pConfig->nCol*(sizeof(int)+sizeof(i64))); if( !aTotalSize ) return SQLITE_NOMEM; aColSize = (int*)&aTotalSize[pConfig->nCol]; memset(aTotalSize, 0, sizeof(i64) * pConfig->nCol); @@ -217005,7 +219315,13 @@ static int sqlite3Fts5StorageSize(Fts5Storage *p, int iCol, i64 *pnToken){ static int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow){ int rc = fts5StorageLoadTotals(p, 0); if( rc==SQLITE_OK ){ + /* nTotalRow being zero does not necessarily indicate a corrupt + ** database - it might be that the FTS5 table really does contain zero + ** rows. However this function is only called from the xRowCount() API, + ** and there is no way for that API to be invoked if the table contains + ** no rows. Hence the FTS5_CORRUPT return. */ *pnRow = p->nTotalRow; + if( p->nTotalRow<=0 ) rc = FTS5_CORRUPT; } return rc; } @@ -217215,7 +219531,7 @@ static int fts5AsciiTokenize( nByte = ie-is; if( nByte>nFold ){ if( pFold!=aFold ) sqlite3_free(pFold); - pFold = sqlite3_malloc(nByte*2); + pFold = sqlite3_malloc64((sqlite3_int64)nByte*2); if( pFold==0 ){ rc = SQLITE_NOMEM; break; @@ -217297,13 +219613,18 @@ struct Unicode61Tokenizer { unsigned char aTokenChar[128]; /* ASCII range token characters */ char *aFold; /* Buffer to fold text into */ int nFold; /* Size of aFold[] in bytes */ - int bRemoveDiacritic; /* True if remove_diacritics=1 is set */ + int eRemoveDiacritic; /* True if remove_diacritics=1 is set */ int nException; int *aiException; unsigned char aCategory[32]; /* True for token char categories */ }; +/* Values for eRemoveDiacritic (must match internals of fts5_unicode2.c) */ +#define FTS5_REMOVE_DIACRITICS_NONE 0 +#define FTS5_REMOVE_DIACRITICS_SIMPLE 1 +#define FTS5_REMOVE_DIACRITICS_COMPLEX 2 + static int fts5UnicodeAddExceptions( Unicode61Tokenizer *p, /* Tokenizer object */ const char *z, /* Characters to treat as exceptions */ @@ -217314,13 +219635,14 @@ static int fts5UnicodeAddExceptions( int *aNew; if( n>0 ){ - aNew = (int*)sqlite3_realloc(p->aiException, (n+p->nException)*sizeof(int)); + aNew = (int*)sqlite3_realloc64(p->aiException, + (n+p->nException)*sizeof(int)); if( aNew ){ int nNew = p->nException; const unsigned char *zCsr = (const unsigned char*)z; const unsigned char *zTerm = (const unsigned char*)&z[n]; while( zCsriCode ) break; + if( (u32)aNew[i]>iCode ) break; } memmove(&aNew[i+1], &aNew[i], (nNew-i)*sizeof(int)); aNew[i] = iCode; @@ -217424,9 +219746,9 @@ static int fts5UnicodeCreate( int i; memset(p, 0, sizeof(Unicode61Tokenizer)); - p->bRemoveDiacritic = 1; + p->eRemoveDiacritic = FTS5_REMOVE_DIACRITICS_SIMPLE; p->nFold = 64; - p->aFold = sqlite3_malloc(p->nFold * sizeof(char)); + p->aFold = sqlite3_malloc64(p->nFold * sizeof(char)); if( p->aFold==0 ){ rc = SQLITE_NOMEM; } @@ -217445,10 +219767,15 @@ static int fts5UnicodeCreate( for(i=0; rc==SQLITE_OK && ieRemoveDiacritic = (zArg[0] - '0'); + assert( p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_NONE + || p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_SIMPLE + || p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_COMPLEX + ); } - p->bRemoveDiacritic = (zArg[0]=='1'); }else if( 0==sqlite3_stricmp(azArg[i], "tokenchars") ){ rc = fts5UnicodeAddExceptions(p, zArg, 1); @@ -217482,7 +219809,7 @@ static int fts5UnicodeCreate( */ static int fts5UnicodeIsAlnum(Unicode61Tokenizer *p, int iCode){ return ( - p->aCategory[sqlite3Fts5UnicodeCategory(iCode)] + p->aCategory[sqlite3Fts5UnicodeCategory((u32)iCode)] ^ fts5UnicodeIsException(p, iCode) ); } @@ -217511,7 +219838,7 @@ static int fts5UnicodeTokenize( /* Each iteration of this loop gobbles up a contiguous run of separators, ** then the next token. */ while( rc==SQLITE_OK ){ - int iCode; /* non-ASCII codepoint read from input */ + u32 iCode; /* non-ASCII codepoint read from input */ char *zOut = aFold; int is; int ie; @@ -217543,7 +219870,7 @@ static int fts5UnicodeTokenize( /* Grow the output buffer so that there is sufficient space to fit the ** largest possible utf-8 character. */ if( zOut>pEnd ){ - aFold = sqlite3_malloc(nFold*2); + aFold = sqlite3_malloc64((sqlite3_int64)nFold*2); if( aFold==0 ){ rc = SQLITE_NOMEM; goto tokenize_done; @@ -217562,7 +219889,7 @@ static int fts5UnicodeTokenize( READ_UTF8(zCsr, zTerm, iCode); if( fts5UnicodeIsAlnum(p,iCode)||sqlite3Fts5UnicodeIsdiacritic(iCode) ){ non_ascii_tokenchar: - iCode = sqlite3Fts5UnicodeFold(iCode, p->bRemoveDiacritic); + iCode = sqlite3Fts5UnicodeFold(iCode, p->eRemoveDiacritic); if( iCode ) WRITE_UTF8(zOut, iCode); }else{ break; @@ -218338,10 +220665,8 @@ static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ return rc; } - - /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -218370,32 +220695,48 @@ static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ ** E"). The resuls of passing a codepoint that corresponds to an ** uppercase letter are undefined. */ -static int fts5_remove_diacritic(int c){ +static int fts5_remove_diacritic(int c, int bComplex){ unsigned short aDia[] = { 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, - 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928, - 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234, - 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504, - 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529, - 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726, - 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122, - 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536, - 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730, - 62924, 63050, 63082, 63274, 63390, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, }; - char aChar[] = { - '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', - 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', - 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o', - 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r', - 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h', - 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't', - 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a', - 'e', 'i', 'o', 'u', 'y', +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', }; unsigned int key = (((unsigned int)c)<<3) | 0x00000007; @@ -218412,7 +220753,8 @@ static int fts5_remove_diacritic(int c){ } } assert( key>=aDia[iRes] ); - return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]); + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); } @@ -218425,8 +220767,8 @@ static int sqlite3Fts5UnicodeIsdiacritic(int c){ unsigned int mask1 = 0x000361F8; if( c<768 || c>817 ) return 0; return (c < 768+32) ? - (mask0 & (1 << (c-768))) : - (mask1 & (1 << (c-768-32))); + (mask0 & ((unsigned int)1 << (c-768))) : + (mask1 & ((unsigned int)1 << (c-768-32))); } @@ -218439,7 +220781,7 @@ static int sqlite3Fts5UnicodeIsdiacritic(int c){ ** The results are undefined if the value passed to this function ** is less than zero. */ -static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ +static int sqlite3Fts5UnicodeFold(int c, int eRemoveDiacritic){ /* Each entry in the following array defines a rule for folding a range ** of codepoints to lower case. The rule applies to a range of nRange ** codepoints starting at codepoint iCode. @@ -218562,7 +220904,9 @@ static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ assert( ret>0 ); } - if( bRemoveDiacritic ) ret = fts5_remove_diacritic(ret); + if( eRemoveDiacritic ){ + ret = fts5_remove_diacritic(ret, eRemoveDiacritic==2); + } } else if( c>=66560 && c<66600 ){ @@ -218573,12 +220917,6 @@ static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ } -#if 0 -static int sqlite3Fts5UnicodeNCat(void) { - return 32; -} -#endif - static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ aArray[0] = 1; switch( zCat[0] ){ @@ -219060,7 +221398,7 @@ static u16 aFts5UnicodeData[] = { 34, 3074, 7692, 63, 63, }; -static int sqlite3Fts5UnicodeCategory(int iCode) { +static int sqlite3Fts5UnicodeCategory(u32 iCode) { int iRes = -1; int iHi; int iLo; @@ -219104,7 +221442,6 @@ static void sqlite3Fts5UnicodeAscii(u8 *aArray, u8 *aAscii){ } } - /* ** 2015 May 30 ** @@ -219183,7 +221520,7 @@ static int sqlite3Fts5GetVarint32(const unsigned char *p, u32 *v){ u8 n; p -= 2; n = sqlite3Fts5GetVarint(p, &v64); - *v = (u32)v64; + *v = ((u32)v64) & 0x7FFFFFFF; assert( n>3 && n<=9 ); return n; } @@ -219450,7 +221787,6 @@ static int sqlite3Fts5GetVarintLen(u32 iVal){ return 5; } - /* ** 2015 May 08 ** @@ -219508,7 +221844,7 @@ struct Fts5VocabTable { struct Fts5VocabCursor { sqlite3_vtab_cursor base; sqlite3_stmt *pStmt; /* Statement holding lock on pIndex */ - Fts5Index *pIndex; /* Associated FTS5 index */ + Fts5Table *pFts5; /* Associated FTS5 table */ int bEof; /* True if this cursor is at EOF */ Fts5IndexIter *pIter; /* Term/rowid iterator object */ @@ -219517,7 +221853,6 @@ struct Fts5VocabCursor { char *zLeTerm; /* (term <= $zLeTerm) paramater, or NULL */ /* These are used by 'col' tables only */ - Fts5Config *pConfig; /* Fts5 table configuration */ int iCol; i64 *aCnt; i64 *aDoc; @@ -219780,8 +222115,7 @@ static int fts5VocabOpenMethod( sqlite3_vtab_cursor **ppCsr ){ Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; - Fts5Index *pIndex = 0; - Fts5Config *pConfig = 0; + Fts5Table *pFts5 = 0; Fts5VocabCursor *pCsr = 0; int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; @@ -219800,31 +222134,34 @@ static int fts5VocabOpenMethod( if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ i64 iId = sqlite3_column_int64(pStmt, 0); - pIndex = sqlite3Fts5IndexFromCsrid(pTab->pGlobal, iId, &pConfig); + pFts5 = sqlite3Fts5TableFromCsrid(pTab->pGlobal, iId); } - if( rc==SQLITE_OK && pIndex==0 ){ - rc = sqlite3_finalize(pStmt); - pStmt = 0; - if( rc==SQLITE_OK ){ - pVTab->zErrMsg = sqlite3_mprintf( - "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl - ); - rc = SQLITE_ERROR; + if( rc==SQLITE_OK ){ + if( pFts5==0 ){ + rc = sqlite3_finalize(pStmt); + pStmt = 0; + if( rc==SQLITE_OK ){ + pVTab->zErrMsg = sqlite3_mprintf( + "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl + ); + rc = SQLITE_ERROR; + } + }else{ + rc = sqlite3Fts5FlushToDisk(pFts5); } } if( rc==SQLITE_OK ){ - int nByte = pConfig->nCol * sizeof(i64) * 2 + sizeof(Fts5VocabCursor); + int nByte = pFts5->pConfig->nCol * sizeof(i64)*2 + sizeof(Fts5VocabCursor); pCsr = (Fts5VocabCursor*)sqlite3Fts5MallocZero(&rc, nByte); } if( pCsr ){ - pCsr->pIndex = pIndex; + pCsr->pFts5 = pFts5; pCsr->pStmt = pStmt; - pCsr->pConfig = pConfig; pCsr->aCnt = (i64*)&pCsr[1]; - pCsr->aDoc = &pCsr->aCnt[pConfig->nCol]; + pCsr->aDoc = &pCsr->aCnt[pFts5->pConfig->nCol]; }else{ sqlite3_finalize(pStmt); } @@ -219840,6 +222177,7 @@ static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){ sqlite3_free(pCsr->zLeTerm); pCsr->nLeTerm = -1; pCsr->zLeTerm = 0; + pCsr->bEof = 0; } /* @@ -219878,7 +222216,7 @@ static int fts5VocabInstanceNewTerm(Fts5VocabCursor *pCsr){ } static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){ - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; int rc = SQLITE_OK; Fts5IndexIter *pIter = pCsr->pIter; i64 *pp = &pCsr->iInstPos; @@ -219913,7 +222251,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; Fts5VocabTable *pTab = (Fts5VocabTable*)pCursor->pVtab; int rc = SQLITE_OK; - int nCol = pCsr->pConfig->nCol; + int nCol = pCsr->pFts5->pConfig->nCol; pCsr->rowid++; @@ -219935,6 +222273,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ int nTerm; zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); + assert( nTerm>=0 ); if( pCsr->nLeTerm>=0 ){ int nCmp = MIN(nTerm, pCsr->nLeTerm); int bCmp = memcmp(pCsr->zLeTerm, zTerm, nCmp); @@ -219951,7 +222290,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ assert( pTab->eType==FTS5_VOCAB_COL || pTab->eType==FTS5_VOCAB_ROW ); while( rc==SQLITE_OK ){ - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; const u8 *pPos; int nPos; /* Position list */ i64 iPos = 0; /* 64-bit position read from poslist */ int iOff = 0; /* Current offset within position list */ @@ -219974,7 +222313,6 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ int iCol = -1; while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){ int ii = FTS5_POS2COLUMN(iPos); - pCsr->aCnt[ii]++; if( iCol!=ii ){ if( ii>=nCol ){ rc = FTS5_CORRUPT; @@ -219983,6 +222321,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ pCsr->aDoc[ii]++; iCol = ii; } + pCsr->aCnt[ii]++; } }else if( eDetail==FTS5_DETAIL_COLUMNS ){ while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff,&iPos) ){ @@ -220011,7 +222350,9 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK ){ zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); - if( nTerm!=pCsr->term.n || memcmp(zTerm, pCsr->term.p, nTerm) ){ + if( nTerm!=pCsr->term.n + || (nTerm>0 && memcmp(zTerm, pCsr->term.p, nTerm)) + ){ break; } if( sqlite3Fts5IterEof(pCsr->pIter) ) break; @@ -220022,7 +222363,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK && pCsr->bEof==0 && pTab->eType==FTS5_VOCAB_COL ){ while( pCsr->aDoc[pCsr->iCol]==0 ) pCsr->iCol++; - assert( pCsr->iColpConfig->nCol ); + assert( pCsr->iColpFts5->pConfig->nCol ); } return rc; } @@ -220069,6 +222410,7 @@ static int fts5VocabFilterMethod( } if( pLe ){ const char *zCopy = (const char *)sqlite3_value_text(pLe); + if( zCopy==0 ) zCopy = ""; pCsr->nLeTerm = sqlite3_value_bytes(pLe); pCsr->zLeTerm = sqlite3_malloc(pCsr->nLeTerm+1); if( pCsr->zLeTerm==0 ){ @@ -220080,14 +222422,15 @@ static int fts5VocabFilterMethod( } if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexQuery(pCsr->pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); + Fts5Index *pIndex = pCsr->pFts5->pIndex; + rc = sqlite3Fts5IndexQuery(pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); } if( rc==SQLITE_OK && eType==FTS5_VOCAB_INSTANCE ){ rc = fts5VocabInstanceNewTerm(pCsr); } - if( rc==SQLITE_OK - && !pCsr->bEof - && (eType!=FTS5_VOCAB_INSTANCE || pCsr->pConfig->eDetail!=FTS5_DETAIL_NONE) + if( rc==SQLITE_OK && !pCsr->bEof + && (eType!=FTS5_VOCAB_INSTANCE + || pCsr->pFts5->pConfig->eDetail!=FTS5_DETAIL_NONE) ){ rc = fts5VocabNextMethod(pCursor); } @@ -220110,7 +222453,7 @@ static int fts5VocabColumnMethod( int iCol /* Index of column to read value from */ ){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; int eType = ((Fts5VocabTable*)(pCursor->pVtab))->eType; i64 iVal = 0; @@ -220122,7 +222465,7 @@ static int fts5VocabColumnMethod( assert( iCol==1 || iCol==2 || iCol==3 ); if( iCol==1 ){ if( eDetail!=FTS5_DETAIL_NONE ){ - const char *z = pCsr->pConfig->azCol[pCsr->iCol]; + const char *z = pCsr->pFts5->pConfig->azCol[pCsr->iCol]; sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); } }else if( iCol==2 ){ @@ -220150,8 +222493,8 @@ static int fts5VocabColumnMethod( }else if( eDetail==FTS5_DETAIL_COLUMNS ){ ii = (int)pCsr->iInstPos; } - if( ii>=0 && iipConfig->nCol ){ - const char *z = pCsr->pConfig->azCol[ii]; + if( ii>=0 && iipFts5->pConfig->nCol ){ + const char *z = pCsr->pFts5->pConfig->azCol[ii]; sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); } break; @@ -220524,9 +222867,9 @@ SQLITE_API int sqlite3_stmt_init( #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */ /************** End of stmt.c ************************************************/ -#if __LINE__!=220527 +#if __LINE__!=222870 #undef SQLITE_SOURCE_ID -#define SQLITE_SOURCE_ID "2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238alt2" +#define SQLITE_SOURCE_ID "2019-04-16 19:49:53 884b4b7e502b4e991677b53971277adfaf0a04a284f8e483e2553d0f8315alt2" #endif /* Return the source-id for this library */ SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } diff --git a/src/libs/3rdparty/sqlite/sqlite3.h b/src/libs/3rdparty/sqlite/sqlite3.h index f36ae57a640..fadfe1e1525 100644 --- a/src/libs/3rdparty/sqlite/sqlite3.h +++ b/src/libs/3rdparty/sqlite/sqlite3.h @@ -123,9 +123,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.26.0" -#define SQLITE_VERSION_NUMBER 3026000 -#define SQLITE_SOURCE_ID "2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9" +#define SQLITE_VERSION "3.28.0" +#define SQLITE_VERSION_NUMBER 3028000 +#define SQLITE_SOURCE_ID "2019-04-16 19:49:53 884b4b7e502b4e991677b53971277adfaf0a04a284f8e483e2553d0f83156b50" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -189,6 +189,9 @@ SQLITE_API int sqlite3_libversion_number(void); #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS SQLITE_API int sqlite3_compileoption_used(const char *zOptName); SQLITE_API const char *sqlite3_compileoption_get(int N); +#else +# define sqlite3_compileoption_used(X) 0 +# define sqlite3_compileoption_get(X) ((void*)0) #endif /* @@ -823,6 +826,15 @@ struct sqlite3_io_methods { ** file space based on this hint in order to help writes to the database ** file run faster. ** +**
  • [[SQLITE_FCNTL_SIZE_LIMIT]] +** The [SQLITE_FCNTL_SIZE_LIMIT] opcode is used by in-memory VFS that +** implements [sqlite3_deserialize()] to set an upper bound on the size +** of the in-memory database. The argument is a pointer to a [sqlite3_int64]. +** If the integer pointed to is negative, then it is filled in with the +** current limit. Otherwise the limit is set to the larger of the value +** of the integer pointed to and the current database size. The integer +** pointed to is set to the new limit. +** **
  • [[SQLITE_FCNTL_CHUNK_SIZE]] ** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS ** extends and truncates the database file in chunks of a size specified @@ -1131,6 +1143,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 +#define SQLITE_FCNTL_SIZE_LIMIT 36 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE @@ -1972,6 +1985,17 @@ struct sqlite3_mem_methods { ** negative value for this option restores the default behaviour. ** This option is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. +** +** [[SQLITE_CONFIG_MEMDB_MAXSIZE]] +**
    SQLITE_CONFIG_MEMDB_MAXSIZE +**
    The SQLITE_CONFIG_MEMDB_MAXSIZE option accepts a single parameter +** [sqlite3_int64] parameter which is the default maximum size for an in-memory +** database created using [sqlite3_deserialize()]. This default maximum +** size can be adjusted up or down for individual databases using the +** [SQLITE_FCNTL_SIZE_LIMIT] [sqlite3_file_control|file-control]. If this +** configuration setting is never used, then the default maximum is determined +** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that +** compile-time option is not set, then the default maximum is 1073741824. ** */ #define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ @@ -2002,6 +2026,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ #define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ #define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ +#define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */ /* ** CAPI3REF: Database Connection Configuration Options @@ -2064,8 +2089,8 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] **
    SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
    -**
    ^This option is used to enable or disable the two-argument -** version of the [fts3_tokenizer()] function which is part of the +**
    ^This option is used to enable or disable the +** [fts3_tokenizer()] function which is part of the ** [FTS3] full-text search engine extension. ** There should be two additional arguments. ** The first argument is an integer which is 0 to disable fts3_tokenizer() or @@ -2177,6 +2202,17 @@ struct sqlite3_mem_methods { **
  • Direct writes to [shadow tables]. ** **
  • +** +** [[SQLITE_DBCONFIG_WRITABLE_SCHEMA]]
    SQLITE_DBCONFIG_WRITABLE_SCHEMA
    +**
    The SQLITE_DBCONFIG_WRITABLE_SCHEMA option activates or deactivates the +** "writable_schema" flag. This has the same effect and is logically equivalent +** to setting [PRAGMA writable_schema=ON] or [PRAGMA writable_schema=OFF]. +** The first argument to this setting is an integer which is 0 to disable +** the writable_schema, positive to enable writable_schema, or negative to +** leave the setting unchanged. The second parameter is a pointer to an +** integer into which is written 0 or 1 to indicate whether the writable_schema +** is enabled or disabled following this call. +**
    ** */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ @@ -2190,7 +2226,8 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */ #define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */ #define SQLITE_DBCONFIG_DEFENSIVE 1010 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1010 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1011 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes @@ -2347,7 +2384,7 @@ SQLITE_API int sqlite3_changes(sqlite3*); ** not. ^Changes to a view that are intercepted by INSTEAD OF triggers ** are not counted. ** -** This the [sqlite3_total_changes(D)] interface only reports the number +** The [sqlite3_total_changes(D)] interface only reports the number ** of rows that changed due to SQL statement run against database ** connection D. Any changes by other database connections are ignored. ** To detect changes against a database file from other database @@ -2991,9 +3028,9 @@ SQLITE_API int sqlite3_set_authorizer( ** time is in units of nanoseconds, however the current implementation ** is only capable of millisecond resolution so the six least significant ** digits in the time are meaningless. Future versions of SQLite -** might provide greater resolution on the profiler callback. The -** sqlite3_profile() function is considered experimental and is -** subject to change in future versions of SQLite. +** might provide greater resolution on the profiler callback. Invoking +** either [sqlite3_trace()] or [sqlite3_trace_v2()] will cancel the +** profile callback. */ SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); @@ -3407,6 +3444,8 @@ SQLITE_API int sqlite3_open_v2( ** is not a database file pathname pointer that SQLite passed into the xOpen ** VFS method, then the behavior of this routine is undefined and probably ** undesirable. +** +** See the [URI filename] documentation for additional information. */ SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); @@ -3629,18 +3668,23 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** deplete the limited store of lookaside memory. Future versions of ** SQLite may act on this hint differently. ** -** [[SQLITE_PREPARE_NORMALIZE]] ^(
    SQLITE_PREPARE_NORMALIZE
    -**
    The SQLITE_PREPARE_NORMALIZE flag indicates that a normalized -** representation of the SQL statement should be calculated and then -** associated with the prepared statement, which can be obtained via -** the [sqlite3_normalized_sql()] interface.)^ The semantics used to -** normalize a SQL statement are unspecified and subject to change. -** At a minimum, literal values will be replaced with suitable -** placeholders. +** [[SQLITE_PREPARE_NORMALIZE]]
    SQLITE_PREPARE_NORMALIZE
    +**
    The SQLITE_PREPARE_NORMALIZE flag is a no-op. This flag used +** to be required for any prepared statement that wanted to use the +** [sqlite3_normalized_sql()] interface. However, the +** [sqlite3_normalized_sql()] interface is now available to all +** prepared statements, regardless of whether or not they use this +** flag. +** +** [[SQLITE_PREPARE_NO_VTAB]]
    SQLITE_PREPARE_NO_VTAB
    +**
    The SQLITE_PREPARE_NO_VTAB flag causes the SQL compiler +** to return an error (error code SQLITE_ERROR) if the statement uses +** any virtual tables. ** */ #define SQLITE_PREPARE_PERSISTENT 0x01 #define SQLITE_PREPARE_NORMALIZE 0x02 +#define SQLITE_PREPARE_NO_VTAB 0x04 /* ** CAPI3REF: Compiling An SQL Statement @@ -3865,6 +3909,18 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); */ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); +/* +** CAPI3REF: Query The EXPLAIN Setting For A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_isexplain(S) interface returns 1 if the +** prepared statement S is an EXPLAIN statement, or 2 if the +** statement S is an EXPLAIN QUERY PLAN. +** ^The sqlite3_stmt_isexplain(S) interface returns 0 if S is +** an ordinary statement or a NULL pointer. +*/ +SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); + /* ** CAPI3REF: Determine If A Prepared Statement Has Been Reset ** METHOD: sqlite3_stmt @@ -4004,7 +4060,9 @@ typedef struct sqlite3_context sqlite3_context; ** ^The fifth argument to the BLOB and string binding interfaces ** is a destructor used to dispose of the BLOB or ** string after SQLite has finished with it. ^The destructor is called -** to dispose of the BLOB or string even if the call to bind API fails. +** to dispose of the BLOB or string even if the call to the bind API fails, +** except the destructor is not called if the third parameter is a NULL +** pointer or the fourth parameter is negative. ** ^If the fifth argument is ** the special value [SQLITE_STATIC], then SQLite assumes that the ** information is in static, unmanaged space and does not need to be freed. @@ -4921,6 +4979,8 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** sqlite3_value_nochange   ** →  True if the column is unchanged in an UPDATE ** against a virtual table. +** sqlite3_value_frombind   +** →  True if value originated from a [bound parameter] ** ** ** Details: @@ -4982,6 +5042,11 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** than within an [xUpdate] method call for an UPDATE statement, then ** the return value is arbitrary and meaningless. ** +** ^The sqlite3_value_frombind(X) interface returns non-zero if the +** value X originated from one of the [sqlite3_bind_int|sqlite3_bind()] +** interfaces. ^If X comes from an SQL literal value, or a table column, +** and expression, then sqlite3_value_frombind(X) returns zero. +** ** Please pay particular attention to the fact that the pointer returned ** from [sqlite3_value_blob()], [sqlite3_value_text()], or ** [sqlite3_value_text16()] can be invalidated by a subsequent call to @@ -5027,6 +5092,7 @@ SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); SQLITE_API int sqlite3_value_type(sqlite3_value*); SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); SQLITE_API int sqlite3_value_nochange(sqlite3_value*); +SQLITE_API int sqlite3_value_frombind(sqlite3_value*); /* ** CAPI3REF: Finding The Subtype Of SQL Values @@ -5762,7 +5828,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); ** associated with database N of connection D. ^The main database file ** has the name "main". If there is no attached database N on the database ** connection D, or if database N is a temporary or in-memory database, then -** a NULL pointer is returned. +** this function will return either a NULL pointer or an empty string. ** ** ^The filename returned by this function is the output of the ** xFullPathname method of the [VFS]. ^In other words, the filename @@ -9996,7 +10062,7 @@ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); ** sqlite3changeset_next() is called on the iterator or until the ** conflict-handler function returns. If pnCol is not NULL, then *pnCol is ** set to the number of columns in the table affected by the change. If -** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change ** is an indirect change, or false (0) otherwise. See the documentation for ** [sqlite3session_indirect()] for a description of direct and indirect ** changes. Finally, if pOp is not NULL, then *pOp is set to one of @@ -10863,7 +10929,7 @@ SQLITE_API int sqlite3rebaser_configure( ** in size. This function allocates and populates a buffer with a copy ** of the changeset rebased rebased according to the configuration of the ** rebaser object passed as the first argument. If successful, (*ppOut) -** is set to point to the new buffer containing the rebased changset and +** is set to point to the new buffer containing the rebased changeset and ** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the ** responsibility of the caller to eventually free the new buffer using ** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut) @@ -11230,12 +11296,8 @@ struct Fts5PhraseIter { ** ** Usually, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. The exception is if the table was created -** with the offsets=0 option specified. In this case *piOff is always -** set to -1. -** -** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) -** if an error occurs. +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -11276,7 +11338,7 @@ struct Fts5PhraseIter { ** Save the pointer passed as the second argument as the extension functions ** "auxiliary data". The pointer may then be retrieved by the current or any ** future invocation of the same fts5 extension function made as part of -** of the same MATCH query using the xGetAuxdata() API. +** the same MATCH query using the xGetAuxdata() API. ** ** Each extension function is allocated a single auxiliary data slot for ** each FTS query (MATCH expression). If the extension function is invoked @@ -11291,7 +11353,7 @@ struct Fts5PhraseIter { ** The xDelete callback, if one is specified, is also invoked on the ** auxiliary data pointer after the FTS5 query has finished. ** -** If an error (e.g. an OOM condition) occurs within this function, an +** If an error (e.g. an OOM condition) occurs within this function, ** the auxiliary data is set to NULL and an error code returned. If the ** xDelete parameter was not NULL, it is invoked on the auxiliary data ** pointer before returning. @@ -11524,11 +11586,11 @@ struct Fts5ExtensionApi { ** the tokenizer substitutes "first" for "1st" and the query works ** as expected. ** -**
  • By adding multiple synonyms for a single term to the FTS index. -** In this case, when tokenizing query text, the tokenizer may -** provide multiple synonyms for a single term within the document. -** FTS5 then queries the index for each synonym individually. For -** example, faced with the query: +**
  • By querying the index for all synonyms of each query term +** separately. In this case, when tokenizing query text, the +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each +** synonym individually. For example, faced with the query: ** ** ** ... MATCH 'first place' @@ -11552,7 +11614,7 @@ struct Fts5ExtensionApi { ** "place". ** ** This way, even if the tokenizer does not provide synonyms -** when tokenizing query text (it should not - to do would be +** when tokenizing query text (it should not - to do so would be ** inefficient), it doesn't matter if the user queries for ** 'first + place' or '1st + place', as there are entries in the ** FTS index corresponding to both forms of the first token. diff --git a/src/libs/3rdparty/sqlite/sqlite3ext.h b/src/libs/3rdparty/sqlite/sqlite3ext.h index 34c41fd5a97..088148b9366 100644 --- a/src/libs/3rdparty/sqlite/sqlite3ext.h +++ b/src/libs/3rdparty/sqlite/sqlite3ext.h @@ -319,6 +319,9 @@ struct sqlite3_api_routines { void(*xDestroy)(void*)); /* Version 3.26.0 and later */ const char *(*normalized_sql)(sqlite3_stmt*); + /* Version 3.28.0 and later */ + int (*stmt_isexplain)(sqlite3_stmt*); + int (*value_frombind)(sqlite3_value*); }; /* @@ -608,6 +611,9 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_create_window_function sqlite3_api->create_window_function /* Version 3.26.0 and later */ #define sqlite3_normalized_sql sqlite3_api->normalized_sql +/* Version 3.28.0 and later */ +#define sqlite3_stmt_isexplain sqlite3_api->isexplain +#define sqlite3_value_frombind sqlite3_api->frombind #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) From 4526a02e31d5dee46f41bce3c7f650b26582ac8d Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 10 Jul 2019 14:02:38 +0200 Subject: [PATCH 43/53] ClangRefactoring: Add WAL checkpoint at the end of the symbol storage Change-Id: I70fde54947a302ae0e45bff083cd5654c86b3891 Reviewed-by: Tim Jenssen --- src/tools/clangrefactoringbackend/source/symbolstorage.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/clangrefactoringbackend/source/symbolstorage.h b/src/tools/clangrefactoringbackend/source/symbolstorage.h index cf7d64e8003..f61dc0557db 100644 --- a/src/tools/clangrefactoringbackend/source/symbolstorage.h +++ b/src/tools/clangrefactoringbackend/source/symbolstorage.h @@ -54,6 +54,7 @@ public: , database(database) { transaction.commit(); + database.walCheckpointFull(); } void addSymbolsAndSourceLocations(const SymbolEntries &symbolEntries, From 2eb4050acb20fa3ab23394bb4734a176d6f247f6 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 10 Jul 2019 14:03:38 +0200 Subject: [PATCH 44/53] ClangRefactoring: Make the indexer more robust We check now if the database is busy. This should not be happen but better be careful. Change-Id: I8b667ff183368977991974ea1fe7fcde837e968a Reviewed-by: Tim Jenssen --- .../source/symbolindexer.cpp | 58 +++++++++++-------- tests/unit/unittest/symbolindexer-test.cpp | 43 +++++++------- 2 files changed, 57 insertions(+), 44 deletions(-) diff --git a/src/tools/clangrefactoringbackend/source/symbolindexer.cpp b/src/tools/clangrefactoringbackend/source/symbolindexer.cpp index 4d042b3fd33..c6909a07321 100644 --- a/src/tools/clangrefactoringbackend/source/symbolindexer.cpp +++ b/src/tools/clangrefactoringbackend/source/symbolindexer.cpp @@ -91,12 +91,31 @@ void SymbolIndexer::updateProjectParts(ProjectPartContainers &&projectParts) updateProjectPart(std::move(projectPart)); } +namespace { +void store(SymbolStorageInterface &symbolStorage, + BuildDependenciesStorageInterface &buildDependencyStorage, + Sqlite::TransactionInterface &transactionInterface, + SymbolsCollectorInterface &symbolsCollector) +{ + try { + Sqlite::ImmediateTransaction transaction{transactionInterface}; + buildDependencyStorage.insertOrUpdateIndexingTimeStamps(symbolsCollector.fileStatuses()); + symbolStorage.addSymbolsAndSourceLocations(symbolsCollector.symbols(), + symbolsCollector.sourceLocations()); + transaction.commit(); + } catch (const Sqlite::StatementIsBusy &) { + store(symbolStorage, buildDependencyStorage, transactionInterface, symbolsCollector); + } +} +} // namespace + void SymbolIndexer::updateProjectPart(ProjectPartContainer &&projectPart) { ProjectPartId projectPartId = projectPart.projectPartId; std::vector symbolIndexerTask; symbolIndexerTask.reserve(projectPart.sourcePathIds.size()); + for (FilePathId sourcePathId : projectPart.sourcePathIds) { SourceTimeStamps dependentTimeStamps = m_buildDependencyStorage.fetchIncludedIndexingTimeStamps( sourcePathId); @@ -117,27 +136,28 @@ void SymbolIndexer::updateProjectPart(ProjectPartContainer &&projectPart) preIncludeSearchPath}; symbolsCollector.setFile(sourcePathId, commandLineBuilder.commandLine); - return symbolsCollector.collectSymbols(); - }; - auto store = [&] { - Sqlite::ImmediateTransaction transaction{m_transactionInterface}; - m_buildDependencyStorage.insertOrUpdateIndexingTimeStamps( - symbolsCollector.fileStatuses()); - m_symbolStorage.addSymbolsAndSourceLocations(symbolsCollector.symbols(), - symbolsCollector.sourceLocations()); - transaction.commit(); + return symbolsCollector.collectSymbols(); }; const PchPaths pchPaths = m_precompiledHeaderStorage.fetchPrecompiledHeaders( projectPart.projectPartId); if (pchPaths.projectPchPath.size() && collect(pchPaths.projectPchPath)) { - store(); + store(m_symbolStorage, + m_buildDependencyStorage, + m_transactionInterface, + symbolsCollector); } else if (pchPaths.systemPchPath.size() && collect(pchPaths.systemPchPath)) { - store(); + store(m_symbolStorage, + m_buildDependencyStorage, + m_transactionInterface, + symbolsCollector); } else if (collect({})) { - store(); + store(m_symbolStorage, + m_buildDependencyStorage, + m_transactionInterface, + symbolsCollector); } }; @@ -196,23 +216,15 @@ void SymbolIndexer::updateChangedPath(FilePathId filePathId, return symbolsCollector.collectSymbols(); }; - auto store = [&] { - Sqlite::ImmediateTransaction transaction{m_transactionInterface}; - m_buildDependencyStorage.insertOrUpdateIndexingTimeStamps(symbolsCollector.fileStatuses()); - m_symbolStorage.addSymbolsAndSourceLocations(symbolsCollector.symbols(), - symbolsCollector.sourceLocations()); - transaction.commit(); - }; - const PchPaths pchPaths = m_precompiledHeaderStorage.fetchPrecompiledHeaders( optionalArtefact->projectPartId); if (pchPaths.projectPchPath.size() && collect(pchPaths.projectPchPath)) { - store(); + store(m_symbolStorage, m_buildDependencyStorage, m_transactionInterface, symbolsCollector); } else if (pchPaths.systemPchPath.size() && collect(pchPaths.systemPchPath)) { - store(); + store(m_symbolStorage, m_buildDependencyStorage, m_transactionInterface, symbolsCollector); } else if (collect({})) { - store(); + store(m_symbolStorage, m_buildDependencyStorage, m_transactionInterface, symbolsCollector); } }; diff --git a/tests/unit/unittest/symbolindexer-test.cpp b/tests/unit/unittest/symbolindexer-test.cpp index 3e0359cd8d6..86d0072c904 100644 --- a/tests/unit/unittest/symbolindexer-test.cpp +++ b/tests/unit/unittest/symbolindexer-test.cpp @@ -39,9 +39,10 @@ #include #include +#include #include #include -#include +#include #include #include #include @@ -868,29 +869,29 @@ TEST_F(SymbolIndexer, UpdateProjectPartsCallsGetsNoPchPathsAndHasErrors) TEST_F(SymbolIndexer, UpdateProjectPartsFetchIncludedIndexingTimeStamps) { InSequence s; - ProjectPartContainer projectPart{1, - {"-Wno-pragma-once-outside-header"}, - {{"BAR", "1", 1}, {"FOO", "1", 2}}, - Utils::clone(systemIncludeSearchPaths), - Utils::clone(projectIncludeSearchPaths), - {header1PathId}, - {main1PathId, main2PathId}, - Utils::Language::Cxx, - Utils::LanguageVersion::CXX14, - Utils::LanguageExtension::None}; - EXPECT_CALL(mockBuildDependenciesStorage, fetchIncludedIndexingTimeStamps(Eq(main1PathId))) - .WillOnce(Return(dependentSourceTimeStamps1)); - EXPECT_CALL(mockModifiedTimeChecker, isUpToDate(dependentSourceTimeStamps1)); - EXPECT_CALL(mockBuildDependenciesStorage, fetchIncludedIndexingTimeStamps(Eq(main2PathId))) - .WillOnce(Return(dependentSourceTimeStamps2)); - EXPECT_CALL(mockModifiedTimeChecker, isUpToDate(dependentSourceTimeStamps2)); + EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin()); EXPECT_CALL(mockCollector, fileStatuses()).WillRepeatedly(ReturnRef(fileStatuses1)); - EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateIndexingTimeStamps(fileStatuses1)); - EXPECT_CALL(mockCollector, fileStatuses()).WillRepeatedly(ReturnRef(fileStatuses2)); - EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateIndexingTimeStamps(fileStatuses2)); + EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateIndexingTimeStamps(_)); + EXPECT_CALL(mockSymbolStorage, addSymbolsAndSourceLocations(_, _)); + EXPECT_CALL(mockSqliteTransactionBackend, commit()); - indexer.updateProjectParts({projectPart}); + indexer.updateProjectParts({projectPart1}); +} + +TEST_F(SymbolIndexer, UpdateProjectPartsIsBusyInStoringData) +{ + InSequence s; + + EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin()) + .WillOnce(Throw(Sqlite::StatementIsBusy{""})); + EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin()); + EXPECT_CALL(mockCollector, fileStatuses()).WillRepeatedly(ReturnRef(fileStatuses1)); + EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateIndexingTimeStamps(_)); + EXPECT_CALL(mockSymbolStorage, addSymbolsAndSourceLocations(_, _)); + EXPECT_CALL(mockSqliteTransactionBackend, commit()); + + indexer.updateProjectParts({projectPart1}); } TEST_F(SymbolIndexer, DependentSourceAreNotUpToDate) From 10f3621cf1739413e9658f687a389415bce6e1a1 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 10 Jul 2019 14:33:44 +0200 Subject: [PATCH 45/53] ClangRefactoring: Test for non existing client This can be happen as we shutdown the process. Change-Id: I69f30ed65ef4456abe6d59b4ea188a67c482efe0 Reviewed-by: Tim Jenssen --- src/tools/clangrefactoringbackend/source/refactoringserver.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tools/clangrefactoringbackend/source/refactoringserver.cpp b/src/tools/clangrefactoringbackend/source/refactoringserver.cpp index 387f850c0fc..2f79ae31cc8 100644 --- a/src/tools/clangrefactoringbackend/source/refactoringserver.cpp +++ b/src/tools/clangrefactoringbackend/source/refactoringserver.cpp @@ -142,7 +142,8 @@ void RefactoringServer::setGathererProcessingSlotCount(uint count) void RefactoringServer::setProgress(int progress, int total) { - client()->progress({ProgressType::Indexing, progress, total}); + if (client()) + client()->progress({ProgressType::Indexing, progress, total}); } void RefactoringServer::gatherSourceRangesForQueryMessages( From d7e5935396d07de26f799e7e39987d8330916db2 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 10 Jul 2019 14:34:48 +0200 Subject: [PATCH 46/53] Sqlite: Handle cases that the database is busy This should be not be happen but better be save than sorry. Change-Id: I7b4afe491c07f8d5da2dc13aaffd2f354384a3ae Reviewed-by: Tim Jenssen --- src/libs/sqlite/sqlitedatabasebackend.cpp | 28 +++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/libs/sqlite/sqlitedatabasebackend.cpp b/src/libs/sqlite/sqlitedatabasebackend.cpp index bf9dfab6fc2..91e8df1b37d 100644 --- a/src/libs/sqlite/sqlitedatabasebackend.cpp +++ b/src/libs/sqlite/sqlitedatabasebackend.cpp @@ -25,10 +25,10 @@ #include "sqlitedatabasebackend.h" +#include "sqlitebasestatement.h" #include "sqliteexception.h" #include "sqlitereadstatement.h" #include "sqlitereadwritestatement.h" -#include "sqlitebasestatement.h" #include "sqlitewritestatement.h" #include @@ -177,8 +177,12 @@ void DatabaseBackend::setLastInsertedRowId(int64_t rowId) void DatabaseBackend::execute(Utils::SmallStringView sqlStatement) { - ReadWriteStatement statement(sqlStatement, m_database); - statement.execute(); + try { + ReadWriteStatement statement(sqlStatement, m_database); + statement.execute(); + } catch (StatementIsBusy &) { + execute(sqlStatement); + } } void DatabaseBackend::close() @@ -217,14 +221,14 @@ void DatabaseBackend::registerBusyHandler() void DatabaseBackend::registerRankingFunction() { - sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25", -1, SQLITE_ANY, 0, okapi_bm25, 0, 0, 0); - sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25f", -1, SQLITE_UTF8, 0, okapi_bm25f, 0, 0, 0); - sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25f_kb", -1, SQLITE_UTF8, 0, okapi_bm25f_kb, 0, 0, 0); + // sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25", -1, SQLITE_ANY, 0, okapi_bm25, 0, 0, 0); + // sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25f", -1, SQLITE_UTF8, 0, okapi_bm25f, 0, 0, 0); + // sqlite3_create_function_v2(sqliteDatabaseHandle(), "okapi_bm25f_kb", -1, SQLITE_UTF8, 0, okapi_bm25f_kb, 0, 0, 0); } int DatabaseBackend::busyHandlerCallback(void *, int counter) { - Q_UNUSED(counter); + Q_UNUSED(counter) #ifdef QT_DEBUG //qWarning() << "Busy handler invoked" << counter << "times!"; #endif @@ -453,11 +457,15 @@ void DatabaseBackend::throwDatabaseIsNotOpen(const char *whatHasHappens) const template Type DatabaseBackend::toValue(Utils::SmallStringView sqlStatement) { - ReadWriteStatement statement(sqlStatement, m_database); + try { + ReadWriteStatement statement(sqlStatement, m_database); - statement.next(); + statement.next(); - return statement.fetchValue(0); + return statement.fetchValue(0); + } catch (StatementIsBusy &) { + return toValue(sqlStatement); + } } } // namespace Sqlite From 56277de27f0753e52482a302d9a43b230268f59d Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 10 Jul 2019 14:48:30 +0200 Subject: [PATCH 47/53] ClangPchManager: Protect fetchPchSources It was not protected by a transaction so it was not thread save. Change-Id: Ib4529d0e94942d3cbafb46705a0256812908c8c6 Reviewed-by: Tim Jenssen --- .../source/builddependenciesstorage.h | 13 +++++++++- .../builddependenciesstorage-test.cpp | 26 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/tools/clangpchmanagerbackend/source/builddependenciesstorage.h b/src/tools/clangpchmanagerbackend/source/builddependenciesstorage.h index 00bb429dba2..f75d83b5721 100644 --- a/src/tools/clangpchmanagerbackend/source/builddependenciesstorage.h +++ b/src/tools/clangpchmanagerbackend/source/builddependenciesstorage.h @@ -68,7 +68,18 @@ public: FilePathIds fetchPchSources(ProjectPartId projectPartId) const override { - return fetchPchSourcesStatement.template values(1024, projectPartId.projectPathId); + try { + Sqlite::DeferredTransaction transaction{database}; + + FilePathIds values = fetchPchSourcesStatement + .template values(1024, projectPartId.projectPathId); + + transaction.commit(); + + return values; + } catch (const Sqlite::StatementIsBusy &) { + return fetchPchSources(projectPartId); + } } FilePathIds fetchSources(ProjectPartId projectPartId) const override diff --git a/tests/unit/unittest/builddependenciesstorage-test.cpp b/tests/unit/unittest/builddependenciesstorage-test.cpp index 56f8b42ac5b..b542fd30821 100644 --- a/tests/unit/unittest/builddependenciesstorage-test.cpp +++ b/tests/unit/unittest/builddependenciesstorage-test.cpp @@ -251,6 +251,32 @@ TEST_F(BuildDependenciesStorage, FetchPchSources) ASSERT_THAT(sources, result); } +TEST_F(BuildDependenciesStorage, FetchPchSourcesCalls) +{ + InSequence s; + + EXPECT_CALL(mockDatabase, deferredBegin()); + EXPECT_CALL(fetchPchSourcesStatement, valuesReturnFilePathIds(_, 22)); + EXPECT_CALL(mockDatabase, commit()); + + auto sources = storage.fetchPchSources(22); +} + +TEST_F(BuildDependenciesStorage, FetchPchSourcesCallsIsBusy) +{ + InSequence s; + + EXPECT_CALL(mockDatabase, deferredBegin()); + EXPECT_CALL(fetchPchSourcesStatement, valuesReturnFilePathIds(_, 22)) + .WillOnce(Throw(Sqlite::StatementIsBusy{""})); + EXPECT_CALL(mockDatabase, rollback()); + EXPECT_CALL(mockDatabase, deferredBegin()); + EXPECT_CALL(fetchPchSourcesStatement, valuesReturnFilePathIds(_, 22)); + EXPECT_CALL(mockDatabase, commit()); + + auto sources = storage.fetchPchSources(22); +} + TEST_F(BuildDependenciesStorage, FetchSources) { ClangBackEnd::FilePathIds result{3, 5, 7}; From 1841cb1fa5abe2fa33fdb25838aef8b81f0b852f Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 10 Jul 2019 15:58:23 +0200 Subject: [PATCH 48/53] ClangPchManager: Fix path for excluded include files Still used the old approach but now it is using the new one. Change-Id: I4bf4da3a5d41d46afff261f3d77bd9190737038a Reviewed-by: Tim Jenssen --- .../source/builddependencycollector.cpp | 14 +- .../source/collectbuilddependencytoolaction.h | 6 +- .../source/clangtool.cpp | 2 +- .../source/clangtool.h | 4 +- .../builddependencycollector-test.cpp | 202 +++++++++++------- .../project/main6.cpp | 4 +- 6 files changed, 137 insertions(+), 95 deletions(-) diff --git a/src/tools/clangpchmanagerbackend/source/builddependencycollector.cpp b/src/tools/clangpchmanagerbackend/source/builddependencycollector.cpp index b2c6cf8f86b..20f08e257e5 100644 --- a/src/tools/clangpchmanagerbackend/source/builddependencycollector.cpp +++ b/src/tools/clangpchmanagerbackend/source/builddependencycollector.cpp @@ -136,19 +136,7 @@ void BuildDependencyCollector::collect() void BuildDependencyCollector::setExcludedFilePaths(ClangBackEnd::FilePaths &&excludedFilePaths) { - if (Utils::HostOsInfo::isWindowsHost()) { - m_excludedFilePaths.clear(); - m_excludedFilePaths.reserve(excludedFilePaths.size()); - std::transform(std::make_move_iterator(excludedFilePaths.begin()), - std::make_move_iterator(excludedFilePaths.end()), - std::back_inserter(m_excludedFilePaths), - [](auto &&path) { - path.replace("/", "\\"); - return std::move(path); - }); - } else { - m_excludedFilePaths = std::move(excludedFilePaths); - } + m_excludedFilePaths = std::move(excludedFilePaths); } void BuildDependencyCollector::addFiles(const FilePathIds &filePathIds, diff --git a/src/tools/clangpchmanagerbackend/source/collectbuilddependencytoolaction.h b/src/tools/clangpchmanagerbackend/source/collectbuilddependencytoolaction.h index 471291ee90d..538f2c7d3fa 100644 --- a/src/tools/clangpchmanagerbackend/source/collectbuilddependencytoolaction.h +++ b/src/tools/clangpchmanagerbackend/source/collectbuilddependencytoolaction.h @@ -73,8 +73,10 @@ public: std::vector fileUIDs; fileUIDs.reserve(m_excludedFilePaths.size()); - for (const ClangBackEnd::FilePath &filePath : m_excludedFilePaths) { - const clang::FileEntry *file = fileManager.getFile({filePath.data(), filePath.size()}, + for (const FilePath &filePath : m_excludedFilePaths) { + NativeFilePath nativeFilePath{filePath}; + const clang::FileEntry *file = fileManager.getFile({nativeFilePath.path().data(), + nativeFilePath.path().size()}, true); if (file) diff --git a/src/tools/clangrefactoringbackend/source/clangtool.cpp b/src/tools/clangrefactoringbackend/source/clangtool.cpp index b96f479a81e..34c6b02c64b 100644 --- a/src/tools/clangrefactoringbackend/source/clangtool.cpp +++ b/src/tools/clangrefactoringbackend/source/clangtool.cpp @@ -57,7 +57,7 @@ void ClangTool::addUnsavedFiles(const V2::FileContainers &unsavedFiles) m_unsavedFileContents.reserve(m_unsavedFileContents.size() + unsavedFiles.size()); auto convertToUnsavedFileContent = [](const V2::FileContainer &unsavedFile) { - return UnsavedFileContent{unsavedFile.filePath.clone(), + return UnsavedFileContent{NativeFilePath{unsavedFile.filePath}, unsavedFile.unsavedFileContent.clone()}; }; diff --git a/src/tools/clangrefactoringbackend/source/clangtool.h b/src/tools/clangrefactoringbackend/source/clangtool.h index 1f266e86ebf..2abad0f49b5 100644 --- a/src/tools/clangrefactoringbackend/source/clangtool.h +++ b/src/tools/clangrefactoringbackend/source/clangtool.h @@ -55,12 +55,12 @@ struct FileContent struct UnsavedFileContent { - UnsavedFileContent(FilePath &&filePath, Utils::SmallString &&content) + UnsavedFileContent(NativeFilePath &&filePath, Utils::SmallString &&content) : filePath(std::move(filePath)) , content(std::move(content)) {} - FilePath filePath; + NativeFilePath filePath; Utils::SmallString content; }; diff --git a/tests/unit/unittest/builddependencycollector-test.cpp b/tests/unit/unittest/builddependencycollector-test.cpp index 0d1b9650dce..352a60f1def 100644 --- a/tests/unit/unittest/builddependencycollector-test.cpp +++ b/tests/unit/unittest/builddependencycollector-test.cpp @@ -80,6 +80,13 @@ MATCHER_P3(HasSource, && entry.hasMissingIncludes == hasMissingIncludes; } +static Utils::SmallString toNativePath(Utils::SmallStringView text) +{ + ClangBackEnd::FilePath path{text}; + + return Utils::SmallString{ClangBackEnd::NativeFilePath{path}.path()}; +} + class BuildDependencyCollector : public ::testing::Test { protected: @@ -91,11 +98,11 @@ protected: id(TESTDATA_DIR "/builddependencycollector/project/main2.cpp")}, {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); collector.addUnsavedFiles( {{{TESTDATA_DIR, "BuildDependencyCollector/project/generated_file.h"}, @@ -184,7 +191,8 @@ protected: TESTDATA_DIR "/builddependencycollector/project/main2.cpp", TESTDATA_DIR "/builddependencycollector/project/header1.h", TESTDATA_DIR "/builddependencycollector/project/header2.h", - TESTDATA_DIR "/builddependencycollector/project/generated_file.h"}; + TESTDATA_DIR "/builddependencycollector/project/generated_file.h", + TESTDATA_DIR "/builddependencycollector/project/generated/generated_file.h"}; }; TEST_F(BuildDependencyCollector, IncludesExternalHeader) @@ -245,7 +253,14 @@ TEST_F(BuildDependencyCollector, IncludesAreSorted) TEST_F(BuildDependencyCollector, If) { - emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/if.cpp"), {"cc", "-I", TESTDATA_DIR "/builddependencycollector/external", "-I", TESTDATA_DIR "/builddependencycollector/project", "-isystem", TESTDATA_DIR "/builddependencycollector/system"}); + emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/if.cpp"), + {"cc", + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), + "-isystem", + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); @@ -256,7 +271,14 @@ TEST_F(BuildDependencyCollector, If) TEST_F(BuildDependencyCollector, LocalPath) { - emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/main.cpp"), {"cc", "-I", TESTDATA_DIR "/builddependencycollector/external", "-I", TESTDATA_DIR "/builddependencycollector/project", "-isystem", TESTDATA_DIR "/builddependencycollector/system"}); + emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/main.cpp"), + {"cc", + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), + "-isystem", + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); @@ -274,7 +296,14 @@ TEST_F(BuildDependencyCollector, LocalPath) TEST_F(BuildDependencyCollector, IgnoreMissingFile) { - emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/missingfile.cpp"), {"cc", "-I", TESTDATA_DIR "/builddependencycollector/external", "-I", TESTDATA_DIR "/builddependencycollector/project", "-isystem", TESTDATA_DIR "/builddependencycollector/system"}); + emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/missingfile.cpp"), + {"cc", + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), + "-isystem", + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); @@ -299,7 +328,14 @@ TEST_F(BuildDependencyCollector, IncludesOnlyTopExternalHeader) TEST_F(BuildDependencyCollector, TopIncludeInIfMacro) { - emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/if.cpp"), {"cc", "-I", TESTDATA_DIR "/builddependencycollector/external", "-I", TESTDATA_DIR "/builddependencycollector/project", "-isystem", TESTDATA_DIR "/builddependencycollector/system"}); + emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/if.cpp"), + {"cc", + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), + "-isystem", + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.setExcludedFilePaths({TESTDATA_DIR "/builddependencycollector/project/if.cpp"}); emptyCollector.collect(); @@ -310,7 +346,14 @@ TEST_F(BuildDependencyCollector, TopIncludeInIfMacro) TEST_F(BuildDependencyCollector, TopIncludeWithLocalPath) { - emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/main.cpp"), {"cc", "-I", TESTDATA_DIR "/builddependencycollector/external", "-I", TESTDATA_DIR "/builddependencycollector/project", "-isystem", TESTDATA_DIR "/builddependencycollector/system"}); + emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/main.cpp"), + {"cc", + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), + "-isystem", + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); @@ -323,7 +366,14 @@ TEST_F(BuildDependencyCollector, TopIncludeWithLocalPath) TEST_F(BuildDependencyCollector, TopIncludesIgnoreMissingFile) { - emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/missingfile.cpp"), {"cc", "-I", TESTDATA_DIR "/builddependencycollector/external", "-I", TESTDATA_DIR "/builddependencycollector/project", "-isystem", TESTDATA_DIR "/builddependencycollector/system"}); + emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/missingfile.cpp"), + {"cc", + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), + "-I", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), + "-isystem", + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.setExcludedFilePaths({TESTDATA_DIR "/builddependencycollector/project/missingfile.cpp"}); emptyCollector.collect(); @@ -338,11 +388,11 @@ TEST_F(BuildDependencyCollector, SourceFiles) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); @@ -357,11 +407,11 @@ TEST_F(BuildDependencyCollector, MainFileInSourceFiles) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); ASSERT_THAT(emptyCollector.sourceFiles(), ElementsAre(id(TESTDATA_DIR "/symbolscollector/main.cpp"))); @@ -372,11 +422,11 @@ TEST_F(BuildDependencyCollector, ResetMainFileInSourceFiles) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); ASSERT_THAT(emptyCollector.sourceFiles(), ElementsAre(id(TESTDATA_DIR "/symbolscollector/main.cpp"))); @@ -387,11 +437,11 @@ TEST_F(BuildDependencyCollector, DontDuplicateSourceFiles) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); emptyCollector.collect(); @@ -407,11 +457,11 @@ TEST_F(BuildDependencyCollector, ClearSourceFiles) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.clear(); @@ -423,11 +473,11 @@ TEST_F(BuildDependencyCollector, ClearFileStatus) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); emptyCollector.clear(); @@ -440,11 +490,11 @@ TEST_F(BuildDependencyCollector, ClearUsedMacros) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/defines.h"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); emptyCollector.clear(); @@ -467,11 +517,11 @@ TEST_F(BuildDependencyCollector, DontCollectSourceFilesAfterFilesAreCleared) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.clear(); emptyCollector.collect(); @@ -484,11 +534,11 @@ TEST_F(BuildDependencyCollector, DontCollectFileStatusAfterFilesAreCleared) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.clear(); emptyCollector.collect(); @@ -501,11 +551,11 @@ TEST_F(BuildDependencyCollector, DontCollectUsedMacrosAfterFilesAreCleared) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.clear(); emptyCollector.collect(); @@ -519,11 +569,11 @@ TEST_F(BuildDependencyCollector, DontCollectSourceDependenciesAfterFilesAreClear emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.clear(); emptyCollector.collect(); @@ -552,11 +602,11 @@ TEST_F(BuildDependencyCollector, CollectUsedMacrosWithoutExternalDefine) emptyCollector.addFile(fileId, {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); @@ -574,11 +624,11 @@ TEST_F(BuildDependencyCollector, DontCollectHeaderGuards) emptyCollector.addFile(fileId, {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); @@ -592,11 +642,11 @@ TEST_F(BuildDependencyCollector, DISABLED_DontCollectDynamicLibraryExports) emptyCollector.addFile(fileId, {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); @@ -609,11 +659,11 @@ TEST_F(BuildDependencyCollector, CollectFileStatuses) emptyCollector.addFile(id(TESTDATA_DIR "/symbolscollector/main.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); @@ -645,11 +695,11 @@ TEST_F(BuildDependencyCollector, MissingInclude) emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/main5.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.collect(); @@ -690,15 +740,16 @@ TEST_F(BuildDependencyCollector, MissingInclude) TEST_F(BuildDependencyCollector, GeneratedFile) { generatedFiles.update( - {{TESTDATA_DIR "/builddependencycollector/project/generated_file.h", "#pragma once"}}); + {{TESTDATA_DIR "/builddependencycollector/project/generated/generated_file.h", + "#pragma once"}}); emptyCollector.addFile(id(TESTDATA_DIR "/builddependencycollector/project/main6.cpp"), {"cc", "-I", - TESTDATA_DIR "/builddependencycollector/external", + toNativePath(TESTDATA_DIR "/builddependencycollector/external"), "-I", - TESTDATA_DIR "/builddependencycollector/project", + toNativePath(TESTDATA_DIR "/builddependencycollector/project"), "-isystem", - TESTDATA_DIR "/builddependencycollector/system"}); + toNativePath(TESTDATA_DIR "/builddependencycollector/system")}); emptyCollector.addUnsavedFiles(generatedFiles.fileContainers()); emptyCollector.collect(); @@ -707,7 +758,8 @@ TEST_F(BuildDependencyCollector, GeneratedFile) emptyCollector.sourceEntries(), ElementsAre(HasSource(id(TESTDATA_DIR "/builddependencycollector/project/main6.cpp"), SourceType::Source), - HasSource(id(TESTDATA_DIR "/builddependencycollector/project/generated_file.h"), + HasSource(id(TESTDATA_DIR + "/builddependencycollector/project/generated/generated_file.h"), SourceType::UserInclude))); } @@ -737,14 +789,14 @@ TEST_F(BuildDependencyCollector, Create) 1, {}, {}, - {{TESTDATA_DIR "/builddependencycollector/system", + {{toNativePath(TESTDATA_DIR "/builddependencycollector/system"), 1, ClangBackEnd::IncludeSearchPathType::System}}, { - {TESTDATA_DIR "/builddependencycollector/project", + {toNativePath(TESTDATA_DIR "/builddependencycollector/project"), 1, ClangBackEnd::IncludeSearchPathType::User}, - {TESTDATA_DIR "/builddependencycollector/external", + {toNativePath(TESTDATA_DIR "/builddependencycollector/external"), 2, ClangBackEnd::IncludeSearchPathType::User}, }, @@ -899,14 +951,14 @@ TEST_F(BuildDependencyCollector, Clear) 1, {}, {}, - {{TESTDATA_DIR "/builddependencycollector/system", + {{toNativePath(TESTDATA_DIR "/builddependencycollector/system"), 1, ClangBackEnd::IncludeSearchPathType::System}}, { - {TESTDATA_DIR "/builddependencycollector/project", + {toNativePath(TESTDATA_DIR "/builddependencycollector/project"), 1, ClangBackEnd::IncludeSearchPathType::User}, - {TESTDATA_DIR "/builddependencycollector/external", + {toNativePath(TESTDATA_DIR "/builddependencycollector/external"), 2, ClangBackEnd::IncludeSearchPathType::User}, }, @@ -925,14 +977,14 @@ TEST_F(BuildDependencyCollector, Clear) 1, {}, {}, - {{TESTDATA_DIR "/builddependencycollector/system", + {{toNativePath(TESTDATA_DIR "/builddependencycollector/system"), 1, ClangBackEnd::IncludeSearchPathType::System}}, { - {TESTDATA_DIR "/builddependencycollector/project", + {toNativePath(TESTDATA_DIR "/builddependencycollector/project"), 1, ClangBackEnd::IncludeSearchPathType::User}, - {TESTDATA_DIR "/builddependencycollector/external", + {toNativePath(TESTDATA_DIR "/builddependencycollector/external"), 2, ClangBackEnd::IncludeSearchPathType::User}, }, @@ -960,14 +1012,14 @@ TEST_F(BuildDependencyCollector, PreIncludes) 1, {}, {}, - {{TESTDATA_DIR "/builddependencycollector/system", + {{toNativePath(TESTDATA_DIR "/builddependencycollector/system"), 1, ClangBackEnd::IncludeSearchPathType::System}}, { - {TESTDATA_DIR "/builddependencycollector/project", + {toNativePath(TESTDATA_DIR "/builddependencycollector/project"), 1, ClangBackEnd::IncludeSearchPathType::User}, - {TESTDATA_DIR "/builddependencycollector/external", + {toNativePath(TESTDATA_DIR "/builddependencycollector/external"), 2, ClangBackEnd::IncludeSearchPathType::User}, }, diff --git a/tests/unit/unittest/data/builddependencycollector/project/main6.cpp b/tests/unit/unittest/data/builddependencycollector/project/main6.cpp index 9564e054262..dfb8e42a3aa 100644 --- a/tests/unit/unittest/data/builddependencycollector/project/main6.cpp +++ b/tests/unit/unittest/data/builddependencycollector/project/main6.cpp @@ -1,3 +1,3 @@ -#include "generated_file.h" -#include "generated_file.h" +#include "generated/generated_file.h" +#include "generated/generated_file.h" From f8bebf501b87863c89096f594a87032e184b5c9b Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 10 Jul 2019 17:13:13 +0200 Subject: [PATCH 49/53] Doc: Fix the batch editing example Fixes: QTCREATORBUG-20332 Change-Id: I1010ed105fdc5b953f058be578aef62b70be7506 Reviewed-by: Christian Kandeler --- .../creator-only/creator-projects-settings-build.qdoc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/src/projects/creator-only/creator-projects-settings-build.qdoc b/doc/src/projects/creator-only/creator-projects-settings-build.qdoc index e836be1d500..e6f43c99981 100644 --- a/doc/src/projects/creator-only/creator-projects-settings-build.qdoc +++ b/doc/src/projects/creator-only/creator-projects-settings-build.qdoc @@ -264,9 +264,12 @@ To add a variable value to the environment, enter the variable name and value, separated by the equals sign. For example, the following line - prepends \c /opt/bin to the existing PATH: + prepends the \c /opt/bin folder to the existing PATH: - \c {PATH=/opt/bin:${PATH}} + \list + \li On Windows: \c {PATH=C:\opt\bin;${PATH}} + \li On Linux: \c {PATH=/opt/bin:${PATH}} + \endlist To add or remove several variables, place them on separate lines. The order is important. If you remove a value on a line, you cannot refer to it on the From 526163cc16084045647e1a06a90507bd5afb5e06 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 5 Jul 2019 14:14:29 +0200 Subject: [PATCH 50/53] Doc: Add info on Live Preview The documentation was moved from the Qt Design Studio repository and edited to make it applicable to Qt Creator, too. Change-Id: I3072fc712b5ee002cd6e7486927de31f9117d7bc Reviewed-by: Brook Cronin Reviewed-by: Tim Jenssen --- doc/config/qtcreator-project.qdocconf | 1 + doc/images/qtcreator-live-preview-kit.png | Bin 0 -> 20840 bytes doc/images/qtcreator-live-preview.png | Bin 0 -> 103145 bytes .../creator-projects-building-running.qdoc | 12 +- doc/src/qtcreator-toc.qdoc | 5 + doc/src/qtcreator.qdoc | 1 + .../qtquick/qtquick-live-preview-desktop.qdoc | 70 ++++++++++++ .../qtquick/qtquick-live-preview-devices.qdoc | 104 ++++++++++++++++++ doc/src/qtquick/qtquick-live-preview.qdoc | 66 +++++++++++ doc/src/qtquick/qtquick-ui-forms.qdoc | 2 +- 10 files changed, 258 insertions(+), 3 deletions(-) create mode 100644 doc/images/qtcreator-live-preview-kit.png create mode 100644 doc/images/qtcreator-live-preview.png create mode 100644 doc/src/qtquick/qtquick-live-preview-desktop.qdoc create mode 100644 doc/src/qtquick/qtquick-live-preview-devices.qdoc create mode 100644 doc/src/qtquick/qtquick-live-preview.qdoc diff --git a/doc/config/qtcreator-project.qdocconf b/doc/config/qtcreator-project.qdocconf index 4ab5505f763..ba394e3b275 100644 --- a/doc/config/qtcreator-project.qdocconf +++ b/doc/config/qtcreator-project.qdocconf @@ -20,6 +20,7 @@ imagedirs = ../images \ ../../src/plugins/qmldesigner/components/formeditor \ ../../src/plugins/qmldesigner/components/navigator \ ../../src/plugins/qmldesigner/components/timelineeditor/images \ + ../../src/plugins/qmldesigner/qmlpreviewplugin/images \ ../../src/plugins/scxmleditor/common/images \ ../../src/plugins/texteditor/images \ ../../src/plugins/valgrind/images diff --git a/doc/images/qtcreator-live-preview-kit.png b/doc/images/qtcreator-live-preview-kit.png new file mode 100644 index 0000000000000000000000000000000000000000..f76099ab829310f1b4680ac478108334e9de6ece GIT binary patch literal 20840 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 ~XaJ@UA%rLA?*01Xn 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 literal 0 HcmV?d00001 diff --git a/doc/src/projects/creator-only/creator-projects-building-running.qdoc b/doc/src/projects/creator-only/creator-projects-building-running.qdoc index 656be23bd55..0e1c2c581aa 100644 --- a/doc/src/projects/creator-only/creator-projects-building-running.qdoc +++ b/doc/src/projects/creator-only/creator-projects-building-running.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -33,7 +33,7 @@ \contentspage index.html \previouspage creator-scxml.html \page creator-building-running.html - \nextpage creator-building-targets.html + \nextpage creator-live-preview.html \title Building and Running @@ -46,6 +46,14 @@ running your project. \list + + \li \l {Previewing} + + You can use the QML live preview to preview a QML file or an + entire Qt Quick application on the desktop, as well as on + Android and embedded Linux devices. The changes you make to + the UI are instantly visible to you in the preview. + \li \l{Building for Multiple Platforms} \e {Build configurations} contain everything you need to compile diff --git a/doc/src/qtcreator-toc.qdoc b/doc/src/qtcreator-toc.qdoc index c2beb581b88..331a5a8091b 100644 --- a/doc/src/qtcreator-toc.qdoc +++ b/doc/src/qtcreator-toc.qdoc @@ -156,6 +156,11 @@ \endlist \li \l{Building and Running} \list + \li \l{Previewing} + \list + \li \l{Previewing on Desktop} + \li \l{Previewing on Devices} + \endlist \li \l{Building for Multiple Platforms} \li \l{Running on Multiple Platforms} \li \l{Deploying to Devices} diff --git a/doc/src/qtcreator.qdoc b/doc/src/qtcreator.qdoc index 7c29421693a..4d814582ecc 100644 --- a/doc/src/qtcreator.qdoc +++ b/doc/src/qtcreator.qdoc @@ -94,6 +94,7 @@ \row \li \b {\l{Building and Running}} \list + \li \l{Previewing} \li \l{Building for Multiple Platforms} \li \l{Running on Multiple Platforms} \li \l{Deploying to Devices} diff --git a/doc/src/qtquick/qtquick-live-preview-desktop.qdoc b/doc/src/qtquick/qtquick-live-preview-desktop.qdoc new file mode 100644 index 00000000000..8d9f653b5e8 --- /dev/null +++ b/doc/src/qtquick/qtquick-live-preview-desktop.qdoc @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Studio documentation. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** +****************************************************************************/ + +/*! + \contentspage {Qt Creator} + \previouspage creator-live-preview.html + \page creator-live-preview-desktop.html + \nextpage creator-live-preview-devices.html + + \title Previewing on Desktop + + To preview the currently active QML file on the desktop: + + \list + \li Select \uicontrol Build > \uicontrol {QML Preview}. + \li Select the \inlineimage live_preview.png + (\uicontrol {Show Live Preview}) button. + \li Press \key {Alt+P}. + \endlist + + \if defined(qtcreator) + \image qtcreator-live-preview.png + \else + \image studio-live-preview.png + \endif + + To preview any QML file that belongs to the project, right-click the project + name in the \uicontrol Project tab in the \uicontrol Navigator, and select + \uicontrol {Preview file}. + + To preview the whole UI, select \uicontrol {Show Live Preview} + when viewing the main QML UI file of the project. + + To view the UI in different sizes, select the zooming level on the toolbar. + + The frames-per-second (FPS) refresh rate of animations is displayed in the + \uicontrol FPS field. + + \if defined(qtdesignstudio) + \section1 Selecting the Preview Tool + + By default, the \c qmlscene utility is used for previewing. To use some + other tool, specify it in the \uicontrol {QML viewer} field in the run + settings of the project in the Projects mode. + + \image studio-run-settings.png "Run settings" + \endif +*/ diff --git a/doc/src/qtquick/qtquick-live-preview-devices.qdoc b/doc/src/qtquick/qtquick-live-preview-devices.qdoc new file mode 100644 index 00000000000..d37b84075a1 --- /dev/null +++ b/doc/src/qtquick/qtquick-live-preview-devices.qdoc @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Studio documentation. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** +****************************************************************************/ + +/*! + \contentspage {Qt Creator} + \previouspage creator-live-preview-desktop.html + \page creator-live-preview-devices.html + \if defined(qtdesignstudio) + \nextpage studio-advanced.html + \else + \nextpage creator-building-targets.html + \endif + + \title Previewing on Devices + + \omit + To preview UIs on Android devices, you need to enable USB debugging on them + and connect them to your system with a USB cable. + \endomit + To preview UIs on embedded devices, you need to connect the devices to your + system with a USB cable, or a wired or wireless connection, depending on + the device, and configure connections to them. The necessary kits have been + predefined and you only need to enable them for your current project. + + \e {Deploy configurations} handle the packaging and copying of the + necessary files to a location in a device where you want to run the + executable at. + + To preview a UI on a device: + + \list 1 + \li In \uicontrol Projects > \uicontrol {Build & Run}, enable the kit + predefined for the device type (1). + \li Select the kit for the device in the kit selector (2). + \if defined(qtcreator) + \image qtcreator-live-preview-kit.png + \else + \image studio-kit-selector.png "Kit selector" + \endif + \li Select \uicontrol Build > \uicontrol {QML Preview} or + press \key {Alt+P}. + \endlist + + \omit + \section2 Previewing on Android Devices + + The USB debugging feature on Android devices enables creating connections + to the devices from \QDS and running the live preview utility on them. + + Debugging is enabled in different ways on different Android devices. + Look for \uicontrol {USB Debugging} under \uicontrol {Developer Options}. + On some devices \uicontrol {Developer Options} is hidden and becomes visible + when you tap the \uicontrol {Build number} field in \uicontrol Settings > + \uicontrol About several times. + + After you have enabled debugging, connect the Android device to the system + with a USB cable. + + The first time you preview a UI on devices, the preview utility + is copied to them. This might take some time. Thereafter, previewing will + get faster, because only the UI files need to be copied to the + device. + \endomit + + \section2 Previewing on Embedded Devices + + You can preview UIs on embedded devices that are supported by + \l{Qt for Device Creation}. For a list of supported devices, see + \l{https://doc.qt.io/QtForDeviceCreation/qtee-supported-platforms.html#reference-target-devices} + {Reference Target Devices}. + + You must configure the device as instructed in the + \l{https://doc.qt.io/QtForDeviceCreation/b2qt-installation-guides.html} + {Installation Guides}. + + \note At the time of this writing, \macos is not supported as a development + host for Qt for Device Creation. This means that you cannot preview UIs on + devices if you are using \QDS on \macos. For more information about + supported development hosts, see + \l {https://doc.qt.io/QtForDeviceCreation/qtdc-supported-platforms.html} + {Supported Development Hosts}. +*/ diff --git a/doc/src/qtquick/qtquick-live-preview.qdoc b/doc/src/qtquick/qtquick-live-preview.qdoc new file mode 100644 index 00000000000..95b01b9fe2a --- /dev/null +++ b/doc/src/qtquick/qtquick-live-preview.qdoc @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Studio documentation. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** +****************************************************************************/ + +/*! + \contentspage {Qt Creator} + \if defined(qtdesignstudio) + \previouspage creator-quick-ui-forms.html + \else + \previouspage creator-building-running.html + \endif + \page creator-live-preview.html + \nextpage creator-live-preview-desktop.html + + \title Previewing + + You can use the QML live preview to preview a QML file or the entire + UI on the desktop, as well as on Android and embedded Linux + devices. The changes you make to the UI are instantly visible + to you in the preview. + + \if defined(qtcreator) + \image qtcreator-live-preview.png + \else + \image studio-live-preview.png + \endif + + \list + \li \l{Previewing on Desktop} + + You can preview individual QML files or the whole UI in the + Design mode. + \li \l{Previewing on Devices} + + \if defined(qtcreator) + You can preview Qt Quick applications on devices that you have + connected to the development PC. For more information, see + \l {Connecting Devices}. + \else + When you install \QDS, everything you need for previewing on + devices is set up automatically. You only need to connect your + devices to your system. + \endif + \endlist +*/ diff --git a/doc/src/qtquick/qtquick-ui-forms.qdoc b/doc/src/qtquick/qtquick-ui-forms.qdoc index 6ec6313ccf3..b68fe32f10f 100644 --- a/doc/src/qtquick/qtquick-ui-forms.qdoc +++ b/doc/src/qtquick/qtquick-ui-forms.qdoc @@ -35,7 +35,7 @@ \page creator-quick-ui-forms.html \if defined(qtdesignstudio) \previouspage qmldesigner-pathview-editor.html - \nextpage studio-live-preview.html + \nextpage creator-live-preview.html \else \previouspage qtquick-iso-icon-browser.html \nextpage quick-export-to-qml.html From 3ea670d207a22b43e05fd5c520e7574d1888c26a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 11 Jul 2019 07:53:36 +0200 Subject: [PATCH 51/53] QmlJSEditor: Remove registration of json files Do not open json files with the QmlJSEditor as this produces strange warnings and Json is not JavaScript at all. Rely on the correct syntax highlighting by the generic highlighter and KSyntaxHighlighting respectively. Beside this it helps also when using a json language server. Task-number: QTCREATORBUG-22697 Change-Id: Iebd0009c550d9ea701d504797d528226dc32b0ec Reviewed-by: David Schulz Reviewed-by: Tim Jenssen --- src/plugins/qmljseditor/qmljseditor.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 61576372ea1..068d12f3204 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -1036,7 +1036,6 @@ QmlJSEditorFactory::QmlJSEditorFactory() addMimeType(QmlJSTools::Constants::QBS_MIMETYPE); addMimeType(QmlJSTools::Constants::QMLTYPES_MIMETYPE); addMimeType(QmlJSTools::Constants::JS_MIMETYPE); - addMimeType(QmlJSTools::Constants::JSON_MIMETYPE); setDocumentCreator([]() { return new QmlJSEditorDocument; }); setEditorWidgetCreator([]() { return new QmlJSEditorWidget; }); From 8f6d99dc2965930a17fb18fe6f7d6ce57723cc1a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 10 Jul 2019 14:09:08 +0200 Subject: [PATCH 52/53] AutoTest: Avoid unclosable progress bar widget The progress bar widget gets automatically closed if the underlying future reports that it has finished or got canceled. This patch ensures to emit the respective signal. Fixes: QTCREATORBUG-22699 Change-Id: I5c7d2169194e90165fb1c90831cf69c02e029268 Reviewed-by: David Schulz --- src/plugins/autotest/testrunner.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp index cf432870e3a..ca3b1cebb92 100644 --- a/src/plugins/autotest/testrunner.cpp +++ b/src/plugins/autotest/testrunner.cpp @@ -174,10 +174,13 @@ void TestRunner::scheduleNext() tr("Executable path is empty. (%1)").arg(m_currentConfig->displayName())); delete m_currentConfig; m_currentConfig = nullptr; - if (m_selectedTests.isEmpty()) + if (m_selectedTests.isEmpty()) { + if (m_fakeFutureInterface) + m_fakeFutureInterface->reportFinished(); onFinished(); - else + } else { onProcessFinished(); + } return; } if (!m_currentConfig->project()) From 51cd2885ef56d43b8f421046fab6e5f85f8e6484 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 11 Jul 2019 13:08:52 +0200 Subject: [PATCH 53/53] CppTools: Allow enabling debugging of locator filter tests by environment Change-Id: I9786b7c6959b77eebb1bc774d2e7bd4c8ed3edeb Reviewed-by: Christian Stenger --- src/plugins/cpptools/cpplocatorfilter_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cpptools/cpplocatorfilter_test.cpp b/src/plugins/cpptools/cpplocatorfilter_test.cpp index 0dd34708262..482c89b5b1c 100644 --- a/src/plugins/cpptools/cpplocatorfilter_test.cpp +++ b/src/plugins/cpptools/cpplocatorfilter_test.cpp @@ -50,7 +50,7 @@ using namespace Utils; namespace { -enum { debug = 0 }; +const bool debug = qEnvironmentVariable("QTC_DEBUG_CPPLOCATORFILTERTESTCASE") == "1"; QTC_DECLARE_MYTESTDATADIR("../../../tests/cpplocators/")