summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--accessible/base/Statistics.h39
-rw-r--r--accessible/base/nsAccessibilityService.cpp3
-rw-r--r--accessible/windows/ia2/ia2AccessibleTable.cpp2
-rw-r--r--accessible/windows/msaa/Compatibility.cpp12
-rw-r--r--accessible/windows/msaa/DocAccessibleWrap.cpp2
-rw-r--r--accessible/windows/msaa/TextLeafAccessibleWrap.cpp2
-rw-r--r--application/basilisk/app/blocklist.xml4
-rw-r--r--application/basilisk/app/profile/basilisk.js3
-rw-r--r--application/basilisk/base/content/browser-fullScreenAndPointerLock.js35
-rw-r--r--application/basilisk/components/nsBrowserGlue.js36
-rw-r--r--application/basilisk/components/preferences/connection.js2
-rw-r--r--application/basilisk/confvars.sh2
-rw-r--r--application/basilisk/installer/package-manifest.in2
-rw-r--r--application/basilisk/modules/WindowsPreviewPerTab.jsm9
-rw-r--r--application/palemoon/app/profile/palemoon.js5
-rw-r--r--application/palemoon/base/content/browser-fullScreen.js37
-rw-r--r--application/palemoon/base/content/browser-title.css14
-rw-r--r--application/palemoon/base/content/browser.js8
-rw-r--r--application/palemoon/components/downloads/DownloadsCommon.jsm868
-rw-r--r--application/palemoon/components/downloads/DownloadsViewUI.jsm250
-rw-r--r--application/palemoon/components/downloads/content/allDownloadsViewOverlay.js1200
-rw-r--r--application/palemoon/components/downloads/content/downloads.js488
-rw-r--r--application/palemoon/components/downloads/moz.build1
-rw-r--r--application/palemoon/components/nsBrowserGlue.js8
-rw-r--r--application/palemoon/components/places/content/places.js4
-rw-r--r--application/palemoon/components/preferences/advanced.xul26
-rw-r--r--application/palemoon/components/preferences/connection.js2
-rw-r--r--application/palemoon/components/preferences/security.xul6
-rw-r--r--application/palemoon/config/version.txt2
-rw-r--r--application/palemoon/installer/package-manifest.in2
-rw-r--r--application/palemoon/locales/en-US/chrome/browser/preferences/advanced.dtd15
-rw-r--r--application/palemoon/modules/FormSubmitObserver.jsm46
-rw-r--r--application/palemoon/modules/WindowsPreviewPerTab.jsm9
-rw-r--r--application/palemoon/themes/linux/browser.css12
-rw-r--r--application/palemoon/themes/osx/browser.css12
-rw-r--r--application/palemoon/themes/windows/Toolbar-glass.pngbin0 -> 18803 bytes
-rw-r--r--application/palemoon/themes/windows/Toolbar-glass.svg3678
-rw-r--r--application/palemoon/themes/windows/Toolbar-inverted.pngbin0 -> 7101 bytes
-rw-r--r--application/palemoon/themes/windows/Toolbar.pngbin0 -> 16015 bytes
-rw-r--r--application/palemoon/themes/windows/Toolbar.svg1677
-rw-r--r--application/palemoon/themes/windows/browser.css27
-rw-r--r--application/palemoon/themes/windows/downloads/download-glow.pngbin546 -> 0 bytes
-rw-r--r--application/palemoon/themes/windows/jar.mn3
-rw-r--r--application/palemoon/themes/windows/places/organizer.css7
-rw-r--r--application/palemoon/themes/windows/statusbar/overlay.css2
-rw-r--r--db/sqlite3/src/sqlite3.c35445
-rw-r--r--db/sqlite3/src/sqlite3.h1330
-rw-r--r--devtools/shared/heapsnapshot/HeapSnapshot.cpp23
-rw-r--r--devtools/shared/heapsnapshot/HeapSnapshot.h17
-rw-r--r--devtools/shared/jsinspector/nsJSInspector.cpp1
-rw-r--r--docs/UXP Coding Style.md239
-rw-r--r--docshell/base/nsDocShell.cpp22
-rw-r--r--dom/animation/AnimationEffectReadOnly.cpp1
-rw-r--r--dom/animation/AnimationTimeline.cpp1
-rw-r--r--dom/base/Attr.cpp2
-rw-r--r--dom/base/CustomElementRegistry.cpp1
-rw-r--r--dom/base/DOMException.cpp1
-rw-r--r--dom/base/DOMIntersectionObserver.cpp140
-rw-r--r--dom/base/DOMIntersectionObserver.h25
-rw-r--r--dom/base/Element.cpp70
-rw-r--r--dom/base/Element.h8
-rwxr-xr-xdom/base/File.cpp1
-rw-r--r--dom/base/FormData.cpp1
-rw-r--r--dom/base/FragmentOrElement.cpp10
-rw-r--r--dom/base/FragmentOrElement.h3
-rw-r--r--dom/base/Location.cpp1
-rw-r--r--dom/base/Navigator.cpp1
-rw-r--r--dom/base/Pose.cpp1
-rw-r--r--dom/base/ProcessGlobal.cpp1
-rw-r--r--dom/base/nsContentList.cpp1
-rw-r--r--dom/base/nsDOMAttributeMap.cpp1
-rw-r--r--dom/base/nsDOMMutationObserver.cpp1
-rw-r--r--dom/base/nsDOMWindowUtils.cpp2
-rw-r--r--dom/base/nsDocument.cpp119
-rw-r--r--dom/base/nsDocument.h15
-rw-r--r--dom/base/nsFrameMessageManager.cpp7
-rw-r--r--dom/base/nsGenericDOMDataNode.cpp4
-rw-r--r--dom/base/nsGlobalWindow.cpp12
-rw-r--r--dom/base/nsGlobalWindow.h5
-rw-r--r--dom/base/nsJSEnvironment.cpp23
-rw-r--r--dom/base/nsJSTimeoutHandler.cpp1
-rw-r--r--dom/base/nsNodeUtils.cpp10
-rw-r--r--dom/base/nsObjectLoadingContent.cpp1
-rw-r--r--dom/base/nsRange.cpp1
-rw-r--r--dom/base/nsScriptLoader.cpp1
-rw-r--r--dom/base/nsWrapperCache.cpp2
-rw-r--r--dom/base/nsWrapperCache.h5
-rw-r--r--dom/bindings/CallbackObject.cpp1
-rw-r--r--dom/bindings/Codegen.py1
-rw-r--r--dom/bindings/Exceptions.cpp1
-rw-r--r--dom/bindings/SimpleGlobalObject.cpp2
-rw-r--r--dom/canvas/CanvasRenderingContext2D.cpp1
-rw-r--r--dom/canvas/ImageData.cpp1
-rwxr-xr-xdom/console/Console.cpp1
-rw-r--r--dom/events/DOMEventTargetHelper.cpp1
-rw-r--r--dom/events/DataTransfer.cpp1
-rwxr-xr-xdom/events/Event.cpp1
-rw-r--r--dom/events/JSEventHandler.cpp1
-rw-r--r--dom/filesystem/Directory.cpp1
-rw-r--r--dom/gamepad/GamepadServiceTest.cpp1
-rw-r--r--dom/geolocation/nsGeolocation.cpp31
-rw-r--r--dom/geolocation/nsGeolocation.h6
-rw-r--r--dom/html/HTMLFormControlsCollection.cpp1
-rw-r--r--dom/html/HTMLFormElement.cpp3
-rw-r--r--dom/html/HTMLImageElement.cpp2
-rw-r--r--dom/html/HTMLMediaElement.cpp231
-rw-r--r--dom/html/HTMLMediaElement.h84
-rw-r--r--dom/html/TextTrackManager.cpp16
-rw-r--r--dom/html/TextTrackManager.h7
-rw-r--r--dom/html/nsDOMStringMap.cpp1
-rw-r--r--dom/html/nsGenericHTMLElement.h7
-rw-r--r--dom/indexedDB/ActorsChild.cpp4
-rw-r--r--dom/indexedDB/ActorsParent.cpp143
-rw-r--r--dom/indexedDB/FileManager.h3
-rw-r--r--dom/indexedDB/IDBCursor.cpp1
-rw-r--r--dom/indexedDB/IDBFactory.cpp1
-rw-r--r--dom/indexedDB/IDBIndex.cpp1
-rw-r--r--dom/indexedDB/IDBKeyRange.cpp1
-rw-r--r--dom/indexedDB/IDBObjectStore.cpp1
-rw-r--r--dom/indexedDB/IDBRequest.cpp2
-rw-r--r--dom/indexedDB/IDBWrapperCache.cpp2
-rw-r--r--dom/interfaces/html/nsIDOMHTMLElement.idl1
-rw-r--r--dom/ipc/ContentParent.cpp28
-rw-r--r--dom/ipc/ContentParent.h7
-rw-r--r--dom/ipc/PContent.ipdl10
-rw-r--r--dom/ipc/TabChild.cpp1
-rw-r--r--dom/media/DecoderTraits.cpp21
-rw-r--r--dom/media/GraphDriver.cpp1
-rw-r--r--dom/media/MediaDecoder.cpp37
-rw-r--r--dom/media/MediaDecoder.h4
-rw-r--r--dom/media/MediaDecoderStateMachine.cpp20
-rw-r--r--dom/media/MediaFormatReader.cpp4
-rw-r--r--dom/media/MediaManager.cpp16
-rw-r--r--dom/media/fmp4/MP4Demuxer.cpp40
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp2
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegLibWrapper.h4
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp75
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h1
-rw-r--r--dom/media/platforms/wmf/WMFMediaDataDecoder.cpp45
-rw-r--r--dom/media/platforms/wmf/WMFMediaDataDecoder.h4
-rw-r--r--dom/media/test/crashtests/1228484.html13
-rw-r--r--dom/media/test/crashtests/crashtests.list2
-rw-r--r--dom/media/webaudio/AudioBuffer.cpp1
-rwxr-xr-xdom/media/webaudio/AudioContext.cpp12
-rw-r--r--dom/media/webaudio/AudioContext.h6
-rw-r--r--dom/media/webaudio/AudioParam.cpp1
-rw-r--r--dom/media/webaudio/MediaBufferDecoder.cpp1
-rw-r--r--dom/media/webaudio/WaveShaperNode.cpp1
-rw-r--r--dom/network/TCPSocketChild.cpp1
-rw-r--r--dom/notification/Notification.cpp169
-rw-r--r--dom/notification/Notification.h34
-rw-r--r--dom/performance/PerformanceMainThread.cpp1
-rw-r--r--dom/performance/PerformanceObserver.cpp1
-rwxr-xr-xdom/plugins/ipc/PluginModuleParent.cpp36
-rw-r--r--dom/plugins/ipc/PluginModuleParent.h3
-rw-r--r--dom/promise/Promise.cpp2
-rw-r--r--dom/promise/PromiseCallback.cpp4
-rw-r--r--dom/push/PushSubscriptionOptions.cpp1
-rw-r--r--dom/security/nsMixedContentBlocker.cpp15
-rw-r--r--dom/security/nsMixedContentBlocker.h3
-rw-r--r--dom/storage/DOMStorageCache.cpp57
-rw-r--r--dom/storage/DOMStorageCache.h6
-rw-r--r--dom/svg/DOMSVGLength.cpp1
-rw-r--r--dom/svg/DOMSVGLengthList.cpp1
-rw-r--r--dom/svg/DOMSVGNumber.cpp1
-rw-r--r--dom/svg/DOMSVGNumberList.cpp1
-rw-r--r--dom/svg/DOMSVGPathSeg.cpp1
-rw-r--r--dom/svg/DOMSVGPathSegList.cpp1
-rw-r--r--dom/svg/DOMSVGPointList.cpp1
-rw-r--r--dom/svg/DOMSVGTransformList.cpp1
-rw-r--r--dom/svg/SVGTransform.cpp1
-rw-r--r--dom/svg/nsISVGPoint.cpp1
-rw-r--r--dom/svg/nsSVGElement.h1
-rw-r--r--dom/webidl/AudioContext.webidl1
-rw-r--r--dom/webidl/Element.webidl6
-rw-r--r--dom/webidl/IntersectionObserver.webidl6
-rw-r--r--dom/workers/RuntimeService.cpp1
-rw-r--r--dom/worklet/WorkletGlobalScope.cpp2
-rw-r--r--dom/xbl/nsXBLDocumentInfo.cpp2
-rw-r--r--dom/xslt/xpath/XPathResult.cpp1
-rw-r--r--dom/xul/nsXULElement.cpp1
-rw-r--r--embedding/components/webbrowserpersist/nsWebBrowserPersist.cpp4
-rw-r--r--extensions/cookie/nsPermissionManager.cpp17
-rw-r--r--gfx/ipc/GPUChild.cpp14
-rw-r--r--gfx/ipc/GPUChild.h2
-rw-r--r--gfx/ipc/PGPU.ipdl6
-rw-r--r--gfx/layers/apz/src/AsyncPanZoomController.cpp23
-rw-r--r--gfx/layers/apz/src/PotentialCheckerboardDurationTracker.cpp18
-rw-r--r--gfx/layers/apz/src/PotentialCheckerboardDurationTracker.h2
-rw-r--r--gfx/layers/client/ClientLayerManager.cpp2
-rw-r--r--gfx/layers/ipc/CompositorBridgeParent.cpp2
-rw-r--r--gfx/src/DriverCrashGuard.cpp13
-rw-r--r--gfx/src/DriverCrashGuard.h12
-rw-r--r--gfx/thebes/DeviceManagerDx.cpp2
-rw-r--r--gfx/thebes/gfxFont.cpp3
-rw-r--r--gfx/thebes/gfxPlatform.cpp27
-rw-r--r--gfx/thebes/gfxPlatformFontList.cpp10
-rwxr-xr-xgfx/thebes/gfxWindowsPlatform.cpp16
-rw-r--r--gfx/thebes/gfxWindowsPlatform.h2
-rw-r--r--image/IDecodingTask.cpp15
-rw-r--r--image/IDecodingTask.h8
-rw-r--r--image/Image.h2
-rw-r--r--image/ImageOps.cpp2
-rw-r--r--image/SourceBuffer.cpp14
-rw-r--r--image/SourceBuffer.h7
-rw-r--r--image/VectorImage.cpp9
-rw-r--r--image/VectorImage.h2
-rw-r--r--image/decoders/nsWebPDecoder.cpp4
-rw-r--r--ipc/glue/MessageChannel.cpp6
-rw-r--r--js/public/GCAPI.h8
-rw-r--r--js/src/frontend/Parser.cpp13
-rw-r--r--js/src/frontend/Parser.h2
-rw-r--r--js/src/gc/Nursery.cpp8
-rw-r--r--js/src/gc/Statistics.cpp219
-rw-r--r--js/src/jsapi.h13
-rw-r--r--js/src/jscompartment.cpp37
-rw-r--r--js/src/jscompartment.h31
-rw-r--r--js/src/jsexn.cpp65
-rw-r--r--js/src/jsfriendapi.cpp11
-rw-r--r--js/src/jsfriendapi.h43
-rw-r--r--js/src/jsfun.cpp10
-rw-r--r--js/src/jsgc.cpp11
-rw-r--r--js/src/jsstr.cpp5
-rw-r--r--js/src/jswrapper.h2
-rw-r--r--js/src/proxy/OpaqueCrossCompartmentWrapper.cpp8
-rw-r--r--js/src/proxy/ScriptedProxyHandler.cpp4
-rwxr-xr-xjs/src/tests/user.js1
-rw-r--r--js/src/vm/Interpreter.cpp14
-rw-r--r--js/src/vm/Interpreter.h3
-rw-r--r--js/src/vm/Runtime.cpp14
-rw-r--r--js/src/vm/Runtime.h10
-rw-r--r--js/src/vm/SelfHosting.cpp18
-rw-r--r--js/src/vm/Stopwatch.cpp48
-rw-r--r--js/src/vm/Stopwatch.h30
-rw-r--r--js/src/wasm/WasmBinaryConstants.h9
-rw-r--r--js/src/wasm/WasmModule.cpp3
-rw-r--r--js/xpconnect/loader/mozJSSubScriptLoader.cpp1
-rw-r--r--js/xpconnect/src/Sandbox.cpp1
-rw-r--r--js/xpconnect/src/XPCJSContext.cpp21
-rw-r--r--js/xpconnect/src/nsScriptErrorWithStack.cpp1
-rw-r--r--js/xpconnect/src/xpcprivate.h3
-rw-r--r--js/xpconnect/wrappers/WaiveXrayWrapper.cpp31
-rw-r--r--js/xpconnect/wrappers/WaiveXrayWrapper.h2
-rw-r--r--js/xpconnect/wrappers/XrayWrapper.cpp14
-rw-r--r--js/xpconnect/wrappers/XrayWrapper.h2
-rw-r--r--layout/base/nsCSSRendering.cpp215
-rw-r--r--layout/base/nsDisplayList.cpp121
-rw-r--r--layout/base/nsDisplayList.h47
-rw-r--r--layout/base/nsLayoutUtils.cpp130
-rw-r--r--layout/base/nsLayoutUtils.h5
-rw-r--r--layout/base/nsPresShell.cpp4
-rw-r--r--layout/base/nsRefreshDriver.cpp38
-rw-r--r--layout/build/nsLayoutCID.h3
-rw-r--r--layout/build/nsLayoutModule.cpp6
-rw-r--r--layout/generic/nsSelection.cpp1
-rw-r--r--layout/generic/nsTextFrame.cpp2
-rw-r--r--layout/inspector/inDOMUtils.cpp2
-rw-r--r--layout/style/Declaration.cpp39
-rw-r--r--layout/style/FontFace.cpp1
-rw-r--r--layout/style/ImageLoader.cpp3
-rw-r--r--layout/style/MediaQueryList.cpp1
-rw-r--r--layout/style/StyleAnimationValue.cpp4
-rw-r--r--layout/style/StyleRule.cpp4
-rw-r--r--layout/style/nsCSSDataBlock.cpp2
-rw-r--r--layout/style/nsCSSKeywordList.h1
-rw-r--r--layout/style/nsCSSParser.cpp33
-rw-r--r--layout/style/nsCSSPropAliasList.h2
-rw-r--r--layout/style/nsCSSPropList.h20
-rw-r--r--layout/style/nsCSSProps.cpp62
-rw-r--r--layout/style/nsCSSProps.h3
-rw-r--r--layout/style/nsCSSRules.cpp3
-rw-r--r--layout/style/nsComputedDOMStyle.cpp61
-rw-r--r--layout/style/nsComputedDOMStyle.h12
-rw-r--r--layout/style/nsComputedDOMStylePropertyList.h2
-rw-r--r--layout/style/nsROCSSPrimitiveValue.cpp1
-rw-r--r--layout/style/nsRuleNode.cpp40
-rw-r--r--layout/style/nsStyleConsts.h47
-rw-r--r--layout/style/nsStyleStruct.cpp8
-rw-r--r--layout/style/nsStyleStruct.h8
-rw-r--r--layout/svg/nsCSSClipPathInstance.cpp116
-rw-r--r--layout/svg/nsCSSClipPathInstance.h4
-rw-r--r--layout/svg/nsSVGIntegrationUtils.cpp144
-rw-r--r--layout/svg/nsSVGUtils.cpp21
-rw-r--r--layout/xul/BoxObject.cpp1
-rw-r--r--layout/xul/tree/nsTreeColumns.cpp1
-rw-r--r--media/ffvpx/libavcodec/avcodec.symbols2
-rw-r--r--media/libstagefright/frameworks/av/media/libstagefright/SampleIterator.cpp13
-rw-r--r--media/libstagefright/frameworks/av/media/libstagefright/SampleTable.cpp46
-rw-r--r--media/libstagefright/frameworks/av/media/libstagefright/include/SampleTable.h4
-rw-r--r--media/libwebp/AUTHORS5
-rw-r--r--media/libwebp/NEWS20
-rw-r--r--media/libwebp/README9
-rw-r--r--media/libwebp/README.mux31
-rw-r--r--media/libwebp/UXPCHANGES1
-rw-r--r--media/libwebp/dec/alphai_dec.h2
-rw-r--r--media/libwebp/dec/common_dec.h2
-rw-r--r--media/libwebp/dec/frame_dec.c9
-rw-r--r--media/libwebp/dec/idec_dec.c19
-rw-r--r--media/libwebp/dec/vp8_dec.h2
-rw-r--r--media/libwebp/dec/vp8i_dec.h4
-rw-r--r--media/libwebp/dec/vp8l_dec.c205
-rw-r--r--media/libwebp/dec/vp8li_dec.h2
-rw-r--r--media/libwebp/dec/webpi_dec.h2
-rw-r--r--media/libwebp/demux/demux.c2
-rw-r--r--media/libwebp/dsp/dsp.h6
-rw-r--r--media/libwebp/dsp/lossless.c2
-rw-r--r--media/libwebp/dsp/lossless.h14
-rw-r--r--media/libwebp/dsp/msa_macro.h2
-rw-r--r--media/libwebp/dsp/quant.h70
-rw-r--r--media/libwebp/dsp/rescaler.c4
-rw-r--r--media/libwebp/dsp/rescaler_neon.c18
-rw-r--r--media/libwebp/dsp/rescaler_sse2.c35
-rw-r--r--media/libwebp/dsp/yuv.h2
-rw-r--r--media/libwebp/enc/cost_enc.h2
-rw-r--r--media/libwebp/enc/histogram_enc.h10
-rw-r--r--media/libwebp/enc/vp8i_enc.h6
-rw-r--r--media/libwebp/enc/vp8li_enc.h2
-rw-r--r--media/libwebp/utils/bit_reader_inl_utils.h2
-rw-r--r--media/libwebp/utils/bit_reader_utils.h2
-rw-r--r--media/libwebp/utils/bit_writer_utils.h2
-rw-r--r--media/libwebp/utils/filters_utils.h2
-rw-r--r--media/libwebp/utils/quant_levels_dec_utils.c8
-rw-r--r--media/libwebp/utils/quant_levels_dec_utils.h2
-rw-r--r--media/libwebp/utils/quant_levels_utils.h2
-rw-r--r--media/libwebp/utils/random_utils.h2
-rw-r--r--media/libwebp/utils/rescaler_utils.h2
-rw-r--r--media/libwebp/utils/thread_utils.h2
-rw-r--r--media/libwebp/utils/utils.h28
-rw-r--r--media/libwebp/webp/decode.h14
-rw-r--r--media/libwebp/webp/demux.h2
-rw-r--r--media/libwebp/webp/encode.h2
-rw-r--r--media/libwebp/webp/format_constants.h2
-rw-r--r--media/libwebp/webp/mux.h2
-rw-r--r--media/libwebp/webp/mux_types.h2
-rw-r--r--media/libwebp/webp/types.h2
-rw-r--r--media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp22
-rw-r--r--media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h5
-rw-r--r--modules/libpref/init/all.js11
-rw-r--r--mozglue/build/WindowsDllBlocklist.cpp3
-rw-r--r--netwerk/base/BackgroundFileSaver.cpp13
-rw-r--r--netwerk/base/BackgroundFileSaver.h9
-rw-r--r--netwerk/base/nsIOService.cpp14
-rw-r--r--netwerk/base/nsIOService.h13
-rw-r--r--netwerk/base/nsLoadGroup.cpp94
-rw-r--r--netwerk/base/nsLoadGroup.h11
-rw-r--r--netwerk/base/nsProtocolProxyService.cpp7
-rw-r--r--netwerk/base/nsSocketTransport2.cpp90
-rw-r--r--netwerk/base/nsSocketTransport2.h9
-rw-r--r--netwerk/base/nsSocketTransportService2.cpp68
-rw-r--r--netwerk/base/nsSocketTransportService2.h17
-rw-r--r--netwerk/base/nsUDPSocket.cpp12
-rw-r--r--netwerk/base/nsUDPSocket.h2
-rw-r--r--netwerk/cache2/CacheStorageService.cpp98
-rw-r--r--netwerk/cache2/CacheStorageService.h12
-rw-r--r--netwerk/cookie/nsCookieService.cpp20
-rw-r--r--netwerk/cookie/nsCookieService.h1
-rw-r--r--netwerk/dns/nsHostResolver.cpp2
-rw-r--r--netwerk/protocol/http/Http2Stream.cpp10
-rw-r--r--netwerk/protocol/http/HttpBaseChannel.cpp10
-rw-r--r--netwerk/protocol/http/nsHttpChannel.cpp55
-rw-r--r--netwerk/protocol/http/nsHttpChannel.h3
-rw-r--r--netwerk/protocol/http/nsHttpConnectionMgr.cpp48
-rw-r--r--netwerk/protocol/http/nsHttpConnectionMgr.h1
-rw-r--r--netwerk/protocol/http/nsHttpHandler.cpp16
-rw-r--r--netwerk/protocol/http/nsHttpHandler.h9
-rw-r--r--old-configure.in18
-rw-r--r--python/mozbuild/mozbuild/mach_commands.py2
-rw-r--r--security/certverifier/CertVerifier.cpp41
-rw-r--r--security/certverifier/CertVerifier.h19
-rw-r--r--security/certverifier/NSSCertDBTrustDomain.cpp5
-rw-r--r--security/certverifier/NSSCertDBTrustDomain.h2
-rw-r--r--security/manager/ssl/PublicKeyPinningService.cpp47
-rw-r--r--security/manager/ssl/PublicKeyPinningService.h3
-rw-r--r--security/manager/ssl/RootCertificateTelemetryUtils.cpp90
-rw-r--r--security/manager/ssl/RootCertificateTelemetryUtils.h30
-rw-r--r--security/manager/ssl/SSLServerCertVerification.cpp450
-rw-r--r--security/manager/ssl/moz.build1
-rw-r--r--security/manager/ssl/nsKeygenHandler.cpp10
-rw-r--r--security/manager/ssl/nsNSSCallbacks.cpp47
-rw-r--r--security/manager/ssl/nsNSSComponent.cpp17
-rw-r--r--security/manager/ssl/nsNSSIOLayer.cpp107
-rw-r--r--security/manager/ssl/nsSTSPreloadList.errors4350
-rw-r--r--security/manager/ssl/nsSTSPreloadList.inc5593
-rw-r--r--security/manager/ssl/nsSiteSecurityService.cpp24
-rw-r--r--security/manager/ssl/nsSiteSecurityService.h1
-rw-r--r--toolkit/components/alerts/nsXULAlerts.cpp15
-rw-r--r--toolkit/components/downloads/ApplicationReputation.cpp8
-rw-r--r--toolkit/components/osfile/NativeOSFileInternals.cpp1
-rw-r--r--toolkit/components/passwordmgr/LoginManagerParent.jsm9
-rw-r--r--toolkit/components/perfmonitoring/nsPerformanceStats.cpp27
-rw-r--r--toolkit/components/perfmonitoring/nsPerformanceStats.h17
-rw-r--r--toolkit/components/places/Database.cpp2
-rw-r--r--toolkit/components/places/Helpers.cpp7
-rw-r--r--toolkit/components/places/Helpers.h21
-rw-r--r--toolkit/components/places/nsNavHistory.cpp4
-rw-r--r--toolkit/components/search/current/nsSearchService.js9
-rw-r--r--toolkit/components/search/orginal/nsSearchService.js6
-rw-r--r--toolkit/components/telemetry/TelemetryHistogram.cpp37
-rw-r--r--toolkit/components/thumbnails/BackgroundPageThumbs.jsm3
-rw-r--r--toolkit/components/thumbnails/PageThumbs.jsm3
-rw-r--r--toolkit/components/thumbnails/moz.build4
-rw-r--r--toolkit/components/url-classifier/nsUrlClassifierStreamUpdater.cpp110
-rw-r--r--toolkit/components/webextensions/ExtensionUtils.jsm3
-rw-r--r--toolkit/modules/Deprecated.jsm49
-rw-r--r--toolkit/modules/moz.build2
-rw-r--r--toolkit/mozapps/extensions/GMPInstallManager.jsm961
-rw-r--r--toolkit/mozapps/extensions/GMPUtils.jsm (renamed from toolkit/modules/GMPUtils.jsm)0
-rw-r--r--toolkit/mozapps/extensions/content/extensions.xml14
-rw-r--r--toolkit/mozapps/extensions/internal/GMPProvider.jsm12
-rw-r--r--toolkit/mozapps/extensions/internal/XPIProvider.jsm2
-rw-r--r--toolkit/mozapps/extensions/moz.build4
-rw-r--r--toolkit/mozapps/webextensions/GMPInstallManager.jsm (renamed from toolkit/modules/GMPInstallManager.jsm)0
-rw-r--r--toolkit/mozapps/webextensions/internal/XPIProvider.jsm10
-rw-r--r--toolkit/mozapps/webextensions/moz.build2
-rwxr-xr-xtools/update-packaging/common.sh3
-rw-r--r--widget/windows/nsClipboard.cpp11
-rw-r--r--xpcom/base/nsCycleCollector.cpp9
-rw-r--r--xpcom/base/nsCycleCollectorTraceJSHelpers.cpp5
-rw-r--r--xpcom/glue/nsCycleCollectionParticipant.h45
419 files changed, 40205 insertions, 22965 deletions
diff --git a/accessible/base/Statistics.h b/accessible/base/Statistics.h
deleted file mode 100644
index f5a9a85b8..000000000
--- a/accessible/base/Statistics.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef A11Y_STATISTICS_H_
-#define A11Y_STATISTICS_H_
-
-#include "mozilla/Telemetry.h"
-
-namespace mozilla {
-namespace a11y {
-namespace statistics {
-
- inline void A11yInitialized()
- { /* STUB */ }
-
- inline void A11yConsumers(uint32_t aConsumer)
- { /* STUB */ }
-
- /**
- * Report that ISimpleDOM* has been used.
- */
- inline void ISimpleDOMUsed()
- { /* STUB */ }
-
- /**
- * Report that IAccessibleTable has been used.
- */
- inline void IAccessibleTableUsed()
- { /* STUB */ }
-
-} // namespace statistics
-} // namespace a11y
-} // namespace mozilla
-
-#endif
-
diff --git a/accessible/base/nsAccessibilityService.cpp b/accessible/base/nsAccessibilityService.cpp
index 46d4dde01..90d54e3ab 100644
--- a/accessible/base/nsAccessibilityService.cpp
+++ b/accessible/base/nsAccessibilityService.cpp
@@ -32,7 +32,6 @@
#include "RootAccessibleWrap.h"
#endif
#include "States.h"
-#include "Statistics.h"
#include "TextLeafAccessibleWrap.h"
#include "TreeWalker.h"
#include "xpcAccessibleApplication.h"
@@ -1288,8 +1287,6 @@ nsAccessibilityService::Init()
if (XRE_IsParentProcess())
PlatformInit();
- statistics::A11yInitialized();
-
return true;
}
diff --git a/accessible/windows/ia2/ia2AccessibleTable.cpp b/accessible/windows/ia2/ia2AccessibleTable.cpp
index a99f72def..cf0c0f3e2 100644
--- a/accessible/windows/ia2/ia2AccessibleTable.cpp
+++ b/accessible/windows/ia2/ia2AccessibleTable.cpp
@@ -13,7 +13,6 @@
#include "AccessibleWrap.h"
#include "IUnknownImpl.h"
-#include "Statistics.h"
#include "TableAccessible.h"
#include "nsCOMPtr.h"
@@ -32,7 +31,6 @@ ia2AccessibleTable::QueryInterface(REFIID iid, void** ppv)
*ppv = nullptr;
if (IID_IAccessibleTable == iid) {
- statistics::IAccessibleTableUsed();
*ppv = static_cast<IAccessibleTable*>(this);
(reinterpret_cast<IUnknown*>(*ppv))->AddRef();
return S_OK;
diff --git a/accessible/windows/msaa/Compatibility.cpp b/accessible/windows/msaa/Compatibility.cpp
index 31026c586..9500e875d 100644
--- a/accessible/windows/msaa/Compatibility.cpp
+++ b/accessible/windows/msaa/Compatibility.cpp
@@ -7,7 +7,6 @@
#include "Compatibility.h"
#include "nsWinUtils.h"
-#include "Statistics.h"
#include "mozilla/Preferences.h"
@@ -52,8 +51,6 @@ uint32_t Compatibility::sConsumers = Compatibility::UNKNOWN;
void
Compatibility::Init()
{
- // Note we collect some AT statistics/telemetry here for convenience.
-
HMODULE jawsHandle = ::GetModuleHandleW(L"jhook");
if (jawsHandle)
sConsumers |= (IsModuleVersionLessThan(jawsHandle, 8, 2173)) ?
@@ -92,15 +89,6 @@ Compatibility::Init()
if (sConsumers != Compatibility::UNKNOWN)
sConsumers ^= Compatibility::UNKNOWN;
- // Gather telemetry
- uint32_t temp = sConsumers;
- for (int i = 0; temp; i++) {
- if (temp & 0x1)
- statistics::A11yConsumers(i);
-
- temp >>= 1;
- }
-
// Turn off new tab switching for Jaws and WE.
if (sConsumers & (JAWS | OLDJAWS | WE)) {
// Check to see if the pref for disallowing CtrlTab is already set. If so,
diff --git a/accessible/windows/msaa/DocAccessibleWrap.cpp b/accessible/windows/msaa/DocAccessibleWrap.cpp
index 895fe9192..1ef989cff 100644
--- a/accessible/windows/msaa/DocAccessibleWrap.cpp
+++ b/accessible/windows/msaa/DocAccessibleWrap.cpp
@@ -12,7 +12,6 @@
#include "Role.h"
#include "RootAccessible.h"
#include "sdnDocAccessible.h"
-#include "Statistics.h"
#include "nsIDocShell.h"
#include "nsIInterfaceRequestorUtils.h"
@@ -36,7 +35,6 @@ DocAccessibleWrap::~DocAccessibleWrap()
IMPL_IUNKNOWN_QUERY_HEAD(DocAccessibleWrap)
if (aIID == IID_ISimpleDOMDocument) {
- statistics::ISimpleDOMUsed();
*aInstancePtr = static_cast<ISimpleDOMDocument*>(new sdnDocAccessible(this));
static_cast<IUnknown*>(*aInstancePtr)->AddRef();
return S_OK;
diff --git a/accessible/windows/msaa/TextLeafAccessibleWrap.cpp b/accessible/windows/msaa/TextLeafAccessibleWrap.cpp
index 6f1d193db..36126cb7a 100644
--- a/accessible/windows/msaa/TextLeafAccessibleWrap.cpp
+++ b/accessible/windows/msaa/TextLeafAccessibleWrap.cpp
@@ -7,13 +7,11 @@
#include "TextLeafAccessibleWrap.h"
#include "sdnTextAccessible.h"
-#include "Statistics.h"
using namespace mozilla::a11y;
IMPL_IUNKNOWN_QUERY_HEAD(TextLeafAccessibleWrap)
if (aIID == IID_ISimpleDOMText) {
- statistics::ISimpleDOMUsed();
*aInstancePtr = static_cast<ISimpleDOMText*>(new sdnTextAccessible(this));
static_cast<IUnknown*>(*aInstancePtr)->AddRef();
return S_OK;
diff --git a/application/basilisk/app/blocklist.xml b/application/basilisk/app/blocklist.xml
index 239fe43a4..435d0e78f 100644
--- a/application/basilisk/app/blocklist.xml
+++ b/application/basilisk/app/blocklist.xml
@@ -1,6 +1,8 @@
<?xml version='1.0' encoding='UTF-8'?>
-<blocklist lastupdate="1521130300000" xmlns="http://www.mozilla.org/2006/addons-blocklist">
+<blocklist lastupdate="1547041082000" xmlns="http://www.mozilla.org/2006/addons-blocklist">
<emItems>
+ <!-- Basilisk -->
+ <!-- Inherited malware items -->
<emItem blockID="i988" id="{b12785f5-d8d0-4530-a3ea-5c4263b85bef}">
<prefs/>
<versionRange minVersion="0" maxVersion="*" severity="1"/>
diff --git a/application/basilisk/app/profile/basilisk.js b/application/basilisk/app/profile/basilisk.js
index cff5f599f..ff1f1fbc2 100644
--- a/application/basilisk/app/profile/basilisk.js
+++ b/application/basilisk/app/profile/basilisk.js
@@ -1051,6 +1051,9 @@ sticky_pref("browser.newtabpage.enhanced", false);
// enables Activity Stream inspired layout
pref("browser.newtabpage.compact", false);
+// Disables capturing of page thumbnails
+pref("browser.pagethumbnails.capturing_disabled", false);
+
// enables showing basic placeholders for missing thumbnails
pref("browser.newtabpage.thumbnailPlaceholder", false);
diff --git a/application/basilisk/base/content/browser-fullScreenAndPointerLock.js b/application/basilisk/base/content/browser-fullScreenAndPointerLock.js
index ebe55377f..b26a31f78 100644
--- a/application/basilisk/base/content/browser-fullScreenAndPointerLock.js
+++ b/application/basilisk/base/content/browser-fullScreenAndPointerLock.js
@@ -322,15 +322,9 @@ var FullScreen = {
document.addEventListener("popuphidden", this._setPopupOpen, false);
// If it is not safe to collapse, add the mouse position tracker or
// else it won't be possible to hide the navigation toolbox again
- if (!this._safeToCollapse()) {
- let rect = gBrowser.mPanelContainer.getBoundingClientRect();
- this._mouseTargetRect = {
- top: rect.top + 50,
- bottom: rect.bottom,
- left: rect.left,
- right: rect.right
- };
- MousePosTracker.addListener(this);
+ if (gPrefService.getBoolPref("browser.fullscreen.autohide")) {
+ gBrowser.mPanelContainer.addEventListener("mousemove",
+ this._collapseCallback, false);
}
// In DOM fullscreen mode, we hide toolbars with CSS
if (!document.fullscreenElement)
@@ -468,7 +462,8 @@ var FullScreen = {
cleanup: function () {
if (!window.fullScreen) {
- MousePosTracker.removeListener(this);
+ gBrowser.mPanelContainer.removeEventListener("mousemove",
+ this._collapseCallback, false);
document.removeEventListener("keypress", this._keyToggleCallback, false);
document.removeEventListener("popupshown", this._setPopupOpen, false);
document.removeEventListener("popuphidden", this._setPopupOpen, false);
@@ -497,17 +492,12 @@ var FullScreen = {
.getInterface(Ci.nsIDOMWindowUtils);
},
- getMouseTargetRect: function()
- {
- return this._mouseTargetRect;
- },
-
// Event callbacks
_expandCallback: function()
{
FullScreen.showNavToolbox();
},
- onMouseEnter: function()
+ _collapseCallback: function()
{
FullScreen.hideNavToolbox();
},
@@ -588,14 +578,8 @@ var FullScreen = {
// Track whether mouse is near the toolbox
if (trackMouse && !this.useLionFullScreen) {
- let rect = gBrowser.mPanelContainer.getBoundingClientRect();
- this._mouseTargetRect = {
- top: rect.top + 50,
- bottom: rect.bottom,
- left: rect.left,
- right: rect.right
- };
- MousePosTracker.addListener(this);
+ gBrowser.mPanelContainer.addEventListener("mousemove",
+ this._collapseCallback, false);
}
this._isChromeCollapsed = false;
@@ -622,7 +606,8 @@ var FullScreen = {
gNavToolbox.style.marginTop =
-gNavToolbox.getBoundingClientRect().height + "px";
this._isChromeCollapsed = true;
- MousePosTracker.removeListener(this);
+ gBrowser.mPanelContainer.removeEventListener("mousemove",
+ this._collapseCallback, false);
},
_updateToolbars: function (aEnterFS) {
diff --git a/application/basilisk/components/nsBrowserGlue.js b/application/basilisk/components/nsBrowserGlue.js
index 3258159b6..d77e97f87 100644
--- a/application/basilisk/components/nsBrowserGlue.js
+++ b/application/basilisk/components/nsBrowserGlue.js
@@ -1080,24 +1080,19 @@ BrowserGlue.prototype = {
// For any add-ons that were installed disabled and can be enabled offer
// them to the user.
- let win = RecentWindow.getMostRecentBrowserWindow();
- AddonManager.getAllAddons(addons => {
- for (let addon of addons) {
- // If this add-on has already seen (or seen is undefined for non-XPI
- // add-ons) then skip it.
- if (addon.seen !== false) {
- continue;
- }
-
- // If this add-on cannot be enabled (either already enabled or
- // appDisabled) then skip it.
- if (!(addon.permissions & AddonManager.PERM_CAN_ENABLE)) {
- continue;
- }
-
- win.openUILinkIn("about:newaddon?id=" + addon.id, "tab");
- }
- });
+ let changedIDs = AddonManager.getStartupChanges(AddonManager.STARTUP_CHANGE_INSTALLED);
+ if (changedIDs.length > 0) {
+ let win = this.getMostRecentBrowserWindow();
+ AddonManager.getAddonsByIDs(changedIDs, function(aAddons) {
+ aAddons.forEach(function(aAddon) {
+ // If the add-on isn't user disabled or can't be enabled then skip it.
+ if (!aAddon.userDisabled || !(aAddon.permissions & AddonManager.PERM_CAN_ENABLE))
+ return;
+
+ win.openUILinkIn("about:newaddon?id=" + aAddon.id, "tab");
+ })
+ });
+ }
let signingRequired;
if (AppConstants.MOZ_REQUIRE_SIGNING) {
@@ -1110,6 +1105,11 @@ BrowserGlue.prototype = {
let disabledAddons = AddonManager.getStartupChanges(AddonManager.STARTUP_CHANGE_DISABLED);
AddonManager.getAddonsByIDs(disabledAddons, (addons) => {
for (let addon of addons) {
+ // WEs return null, skip.
+ if (!addon) {
+ continue;
+ }
+
if (addon.type == "experiment")
continue;
diff --git a/application/basilisk/components/preferences/connection.js b/application/basilisk/components/preferences/connection.js
index f6b395a2d..349139bed 100644
--- a/application/basilisk/components/preferences/connection.js
+++ b/application/basilisk/components/preferences/connection.js
@@ -76,7 +76,7 @@ var gConnectionsDialog = {
var autologinProxyPref = document.getElementById("signon.autologin.proxy");
autologinProxyPref.disabled = proxyTypePref.value == 0;
var noProxiesPref = document.getElementById("network.proxy.no_proxies_on");
- noProxiesPref.disabled = proxyTypePref.value != 1;
+ noProxiesPref.disabled = proxyTypePref.value == 0;
var autoconfigURLPref = document.getElementById("network.proxy.autoconfig_url");
autoconfigURLPref.disabled = proxyTypePref.value != 2;
diff --git a/application/basilisk/confvars.sh b/application/basilisk/confvars.sh
index 62aa1a84f..cd18bdb94 100644
--- a/application/basilisk/confvars.sh
+++ b/application/basilisk/confvars.sh
@@ -55,7 +55,7 @@ MOZ_APP_STATIC_INI=1
MOZ_WEBGL_CONFORMANT=1
MOZ_JSDOWNLOADS=1
MOZ_WEBRTC=1
-MOZ_WEBEXTENSIONS=1
+MOZ_WEBEXTENSIONS=
MOZ_DEVTOOLS=1
MOZ_SERVICES_COMMON=1
MOZ_SERVICES_SYNC=1
diff --git a/application/basilisk/installer/package-manifest.in b/application/basilisk/installer/package-manifest.in
index 485bc4917..cebcb6796 100644
--- a/application/basilisk/installer/package-manifest.in
+++ b/application/basilisk/installer/package-manifest.in
@@ -58,8 +58,8 @@
#ifdef HAVE_MAKENSISU
@BINPATH@/uninstall/helper.exe
#endif
-#ifdef MOZ_UPDATER
@RESPATH@/update.locale
+#ifdef MOZ_UPDATER
@RESPATH@/updater.ini
#endif
diff --git a/application/basilisk/modules/WindowsPreviewPerTab.jsm b/application/basilisk/modules/WindowsPreviewPerTab.jsm
index 6586b5d3b..81c2f229f 100644
--- a/application/basilisk/modules/WindowsPreviewPerTab.jsm
+++ b/application/basilisk/modules/WindowsPreviewPerTab.jsm
@@ -597,6 +597,7 @@ TabWindow.prototype = {
"file", "chrome", "resource", "about"
]),
onLinkIconAvailable: function (aBrowser, aIconURL) {
+ let self = this;
let requestURL = null;
if (aIconURL) {
let shouldRequestFaviconURL = true;
@@ -613,15 +614,15 @@ TabWindow.prototype = {
let isDefaultFavicon = !requestURL;
getFaviconAsImage(
requestURL,
- PrivateBrowsingUtils.isWindowPrivate(this.win),
+ PrivateBrowsingUtils.isWindowPrivate(self.win),
img => {
- let index = this.tabbrowser.browsers.indexOf(aBrowser);
+ let index = self.tabbrowser.browsers.indexOf(aBrowser);
// Only add it if we've found the index and the URI is still the same.
// The tab could have closed, and there's no guarantee the icons
// will have finished fetching 'in order'.
if (index != -1) {
- let tab = this.tabbrowser.tabs[index];
- let preview = this.previews.get(tab);
+ let tab = self.tabbrowser.tabs[index];
+ let preview = self.previews.get(tab);
if (tab.getAttribute("image") == aIconURL ||
(!preview.icon && isDefaultFavicon)) {
preview.icon = img;
diff --git a/application/palemoon/app/profile/palemoon.js b/application/palemoon/app/profile/palemoon.js
index 1c6016f0f..9a6a9fdc9 100644
--- a/application/palemoon/app/profile/palemoon.js
+++ b/application/palemoon/app/profile/palemoon.js
@@ -1072,6 +1072,8 @@ pref("prompts.tab_modal.focusSwitch", true);
// Defines the url to be used for new tabs.
pref("browser.newtab.url", "about:logopage");
+pref("browser.newtab.choice", 1);
+
// Activates preloading of the new tab url.
pref("browser.newtab.preload", false);
@@ -1081,6 +1083,9 @@ pref("browser.newtabpage.enabled", true);
// XXX: Remove this when "enhanced" tiles are dead
pref("browser.newtabpage.enhanced", false);
+// Disables capturing of page thumbnails
+pref("browser.pagethumbnails.capturing_disabled", false);
+
// enables showing basic placeholders for missing thumbnails
pref("browser.newtabpage.thumbnailPlaceholder", false);
diff --git a/application/palemoon/base/content/browser-fullScreen.js b/application/palemoon/base/content/browser-fullScreen.js
index b1235a8d3..e816ce5c1 100644
--- a/application/palemoon/base/content/browser-fullScreen.js
+++ b/application/palemoon/base/content/browser-fullScreen.js
@@ -53,17 +53,9 @@ var FullScreen = {
document.addEventListener("popupshown", this._setPopupOpen, false);
document.addEventListener("popuphidden", this._setPopupOpen, false);
this._shouldAnimate = true;
- // If it is not safe to collapse, add the mouse position tracker or
- // else it won't be possible to hide the navigation toolbox again
- if (!this._safeToCollapse(document.mozFullScreen)) {
- let rect = gBrowser.mPanelContainer.getBoundingClientRect();
- this._mouseTargetRect = {
- top: rect.top + 50,
- bottom: rect.bottom,
- left: rect.left,
- right: rect.right
- };
- MousePosTracker.addListener(this);
+ if (gPrefService.getBoolPref("browser.fullscreen.autohide")) {
+ gBrowser.mPanelContainer.addEventListener("mousemove",
+ this._collapseCallback, false);
}
// We don't animate the toolbar collapse if in DOM full-screen mode,
// as the size of the content area would still be changing after the
@@ -149,7 +141,8 @@ var FullScreen = {
cleanup: function () {
if (!window.fullScreen) {
- MousePosTracker.removeListener(this);
+ gBrowser.mPanelContainer.removeEventListener("mousemove",
+ this._collapseCallback, false);
document.removeEventListener("keypress", this._keyToggleCallback, false);
document.removeEventListener("popupshown", this._setPopupOpen, false);
document.removeEventListener("popuphidden", this._setPopupOpen, false);
@@ -164,17 +157,12 @@ var FullScreen = {
}
},
- getMouseTargetRect: function()
- {
- return this._mouseTargetRect;
- },
-
// Event callbacks
_expandCallback: function()
{
FullScreen.showNavToolbox();
},
- onMouseEnter: function()
+ _collapseCallback: function()
{
FullScreen.hideNavToolbox();
},
@@ -328,14 +316,8 @@ var FullScreen = {
// Track whether mouse is near the toolbox
this._isChromeCollapsed = false;
if (trackMouse) {
- let rect = gBrowser.mPanelContainer.getBoundingClientRect();
- this._mouseTargetRect = {
- top: rect.top + 50,
- bottom: rect.bottom,
- left: rect.left,
- right: rect.right
- };
- MousePosTracker.addListener(this);
+ gBrowser.mPanelContainer.addEventListener("mousemove",
+ this._collapseCallback, false);
}
},
@@ -378,7 +360,8 @@ var FullScreen = {
gNavToolbox.style.marginTop =
-gNavToolbox.getBoundingClientRect().height + "px";
this._isChromeCollapsed = true;
- MousePosTracker.removeListener(this);
+ gBrowser.mPanelContainer.removeEventListener("mousemove",
+ this._collapseCallback, false);
},
showXULChrome: function(aTag, aShow)
diff --git a/application/palemoon/base/content/browser-title.css b/application/palemoon/base/content/browser-title.css
index 66b5e6731..5f7e77564 100644
--- a/application/palemoon/base/content/browser-title.css
+++ b/application/palemoon/base/content/browser-title.css
@@ -50,13 +50,6 @@
right: -12px;
}
-/* Lightweight Themes */
-
-#main-window:-moz-lwtheme::after {
- color: inherit;
- text-shadow: inherit;
-}
-
/* Windows Classic theme */
@media all and (-moz-windows-classic) {
@@ -192,6 +185,13 @@
}
+/* Lightweight Themes */
+
+#main-window:-moz-lwtheme::after {
+ color: inherit;
+ text-shadow: inherit;
+}
+
/* Hide for small windows */
diff --git a/application/palemoon/base/content/browser.js b/application/palemoon/base/content/browser.js
index 591d00fbb..eb4916e37 100644
--- a/application/palemoon/base/content/browser.js
+++ b/application/palemoon/base/content/browser.js
@@ -2456,7 +2456,7 @@ function BrowserOnAboutPageLoad(doc) {
docElt.setAttribute("searchEnginePostData", engine.postDataString || "");
docElt.setAttribute("searchEngineURL", engine.searchURL);
}
- updateSearchEngine();
+ Services.search.init(updateSearchEngine);
// Listen for the event that's triggered when the user changes search engine.
// At this point we simply reload about:home to reflect the change.
@@ -2481,7 +2481,7 @@ function BrowserOnAboutPageLoad(doc) {
docElt.setAttribute("searchEnginePostData", engine.postDataString || "");
docElt.setAttribute("searchEngineURL", engine.searchURL);
}
- updateSearchEngine();
+ Services.search.init(updateSearchEngine);
// Listen for the event that's triggered when the user changes search engine.
// At this point we simply reload about:newtab to reflect the change.
@@ -3046,7 +3046,9 @@ const DOMLinkHandler = {
/^(?:https?|ftp):/i.test(link.href) &&
!PrivateBrowsingUtils.isWindowPrivate(window)) {
var engine = { title: link.title, href: link.href };
- BrowserSearch.addEngine(engine, link.ownerDocument);
+ Services.search.init(function () {
+ BrowserSearch.addEngine(engine, link.ownerDocument);
+ });
searchAdded = true;
}
}
diff --git a/application/palemoon/components/downloads/DownloadsCommon.jsm b/application/palemoon/components/downloads/DownloadsCommon.jsm
index bd5d55a73..efe31ce05 100644
--- a/application/palemoon/components/downloads/DownloadsCommon.jsm
+++ b/application/palemoon/components/downloads/DownloadsCommon.jsm
@@ -21,15 +21,9 @@ this.EXPORTED_SYMBOLS = [
*
* DownloadsData
* Retrieves the list of past and completed downloads from the underlying
- * Download Manager data, and provides asynchronous notifications allowing
+ * Downloads API data, and provides asynchronous notifications allowing
* to build a consistent view of the available data.
*
- * DownloadsDataItem
- * Represents a single item in the list of downloads. This object either wraps
- * an existing nsIDownload from the Download Manager, or provides the same
- * information read directly from the downloads database, with the possibility
- * of querying the nsIDownload lazily, for performance reasons.
- *
* DownloadsIndicatorData
* This object registers itself with DownloadsData as a view, and transforms the
* notifications it receives into overall status data, that is then broadcast to
@@ -57,6 +51,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "DownloadUIHelper",
"resource://gre/modules/DownloadUIHelper.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "DownloadUtils",
"resource://gre/modules/DownloadUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
+ "resource://gre/modules/FileUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "OS",
"resource://gre/modules/osfile.jsm")
XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
@@ -94,11 +90,6 @@ const kDownloadsStringsRequiringPluralForm = {
otherDownloads2: true
};
-XPCOMUtils.defineLazyGetter(this, "DownloadsLocalFileCtor", function () {
- return Components.Constructor("@mozilla.org/file/local;1",
- "nsILocalFile", "initWithPath");
-});
-
const kPartialDownloadSuffix = ".part";
const kPrefBranch = Services.prefs.getBranch("browser.download.");
@@ -382,17 +373,27 @@ this.DownloadsCommon = {
},
/**
- * Given an iterable collection of DownloadDataItems, generates and returns
+ * Helper function required because the Downloads Panel and the Downloads View
+ * don't share the controller yet.
+ */
+ removeAndFinalizeDownload(download) {
+ Downloads.getList(Downloads.ALL)
+ .then(list => list.remove(download))
+ .then(() => download.finalize(true))
+ .catch(Cu.reportError);
+ },
+
+ /**
+ * Given an iterable collection of Download objects, generates and returns
* statistics about that collection.
*
- * @param aDataItems An iterable collection of DownloadDataItems.
+ * @param downloads An iterable collection of Download objects.
*
* @return Object whose properties are the generated statistics. Currently,
* we return the following properties:
*
* numActive : The total number of downloads.
* numPaused : The total number of paused downloads.
- * numScanning : The total number of downloads being scanned.
* numDownloading : The total number of downloads being downloaded.
* totalSize : The total size of all downloads once completed.
* totalTransferred: The total amount of transferred data for these
@@ -402,55 +403,48 @@ this.DownloadsCommon = {
* complete.
* percentComplete : The percentage of bytes successfully downloaded.
*/
- summarizeDownloads: function DC_summarizeDownloads(aDataItems)
- {
+ summarizeDownloads(downloads) {
let summary = {
numActive: 0,
numPaused: 0,
- numScanning: 0,
numDownloading: 0,
totalSize: 0,
totalTransferred: 0,
// slowestSpeed is Infinity so that we can use Math.min to
// find the slowest speed. We'll set this to 0 afterwards if
// it's still at Infinity by the time we're done iterating all
- // dataItems.
+ // download.
slowestSpeed: Infinity,
rawTimeLeft: -1,
percentComplete: -1
}
- for (let dataItem of aDataItems) {
+ for (let download of downloads) {
summary.numActive++;
- switch (dataItem.state) {
- case nsIDM.DOWNLOAD_PAUSED:
- summary.numPaused++;
- break;
- case nsIDM.DOWNLOAD_SCANNING:
- summary.numScanning++;
- break;
- case nsIDM.DOWNLOAD_DOWNLOADING:
- summary.numDownloading++;
- if (dataItem.maxBytes > 0 && dataItem.speed > 0) {
- let sizeLeft = dataItem.maxBytes - dataItem.currBytes;
- summary.rawTimeLeft = Math.max(summary.rawTimeLeft,
- sizeLeft / dataItem.speed);
- summary.slowestSpeed = Math.min(summary.slowestSpeed,
- dataItem.speed);
- }
- break;
+
+ if (!download.stopped) {
+ summary.numDownloading++;
+ if (download.hasProgress && download.speed > 0) {
+ let sizeLeft = download.totalBytes - download.currentBytes;
+ summary.rawTimeLeft = Math.max(summary.rawTimeLeft,
+ sizeLeft / download.speed);
+ summary.slowestSpeed = Math.min(summary.slowestSpeed,
+ download.speed);
+ }
+ } else if (download.canceled && download.hasPartialData) {
+ summary.numPaused++;
}
// Only add to total values if we actually know the download size.
- if (dataItem.maxBytes > 0 &&
- dataItem.state != nsIDM.DOWNLOAD_CANCELED &&
- dataItem.state != nsIDM.DOWNLOAD_FAILED) {
- summary.totalSize += dataItem.maxBytes;
- summary.totalTransferred += dataItem.currBytes;
+ if (download.succeeded) {
+ summary.totalSize += download.target.size;
+ summary.totalTransferred += download.target.size;
+ } else if (download.hasProgress) {
+ summary.totalSize += download.totalBytes;
+ summary.totalTransferred += download.currentBytes;
}
}
- if (summary.numActive != 0 && summary.totalSize != 0 &&
- summary.numActive != summary.numScanning) {
+ if (summary.totalSize != 0) {
summary.percentComplete = (summary.totalTransferred /
summary.totalSize) * 100;
}
@@ -501,7 +495,7 @@ this.DownloadsCommon = {
/**
* Opens a downloaded file.
- * If you've a dataItem, you should call dataItem.openLocalFile.
+ *
* @param aFile
* the downloaded file to be opened.
* @param aMimeInfo
@@ -574,7 +568,6 @@ this.DownloadsCommon = {
/**
* Show a downloaded file in the system file manager.
- * If you have a dataItem, use dataItem.showLocalFile.
*
* @param aFile
* a downloaded file.
@@ -651,19 +644,12 @@ XPCOMUtils.defineLazyGetter(DownloadsCommon, "useJSTransfer", function () {
function DownloadsDataCtor(aPrivate) {
this._isPrivate = aPrivate;
- // This Object contains all the available DownloadsDataItem objects, indexed by
- // their globally unique identifier. The identifiers of downloads that have
- // been removed from the Download Manager data are still present, however the
- // associated objects are replaced with the value "null". This is required to
- // prevent race conditions when populating the list asynchronously.
- this.dataItems = {};
+ // Contains all the available Download objects and their integer state.
+ this.oldDownloadStates = new Map();
// Array of view objects that should be notified when the available download
// data changes.
this._views = [];
-
- // Maps Download objects to DownloadDataItem objects.
- this._downloadToDataItemMap = new Map();
}
DownloadsDataCtor.prototype = {
@@ -690,12 +676,19 @@ DownloadsDataCtor.prototype = {
},
/**
+ * Iterator for all the available Download objects. This is empty until the
+ * data has been loaded using the JavaScript API for downloads.
+ */
+ get downloads() this.oldDownloadStates.keys(),
+
+ /**
* True if there are finished downloads that can be removed from the list.
*/
get canRemoveFinished()
{
- for (let [, dataItem] of Iterator(this.dataItems)) {
- if (dataItem && !dataItem.inProgress) {
+ for (let download of this.downloads) {
+ // Stopped, paused, and failed downloads with partial data are removed.
+ if (download.stopped && !(download.canceled && download.hasPartialData)) {
return true;
}
}
@@ -716,103 +709,87 @@ DownloadsDataCtor.prototype = {
//////////////////////////////////////////////////////////////////////////////
//// Integration with the asynchronous Downloads back-end
- onDownloadAdded: function (aDownload)
- {
- let dataItem = new DownloadsDataItem(aDownload);
- this._downloadToDataItemMap.set(aDownload, dataItem);
- this.dataItems[dataItem.downloadGuid] = dataItem;
-
- for (let view of this._views) {
- view.onDataItemAdded(dataItem, true);
- }
-
- this._updateDataItemState(dataItem);
- },
-
- onDownloadChanged: function (aDownload)
- {
- let dataItem = this._downloadToDataItemMap.get(aDownload);
- if (!dataItem) {
- Cu.reportError("Download doesn't exist.");
- return;
- }
+ onDownloadAdded(download) {
+ // Download objects do not store the end time of downloads, as the Downloads
+ // API does not need to persist this information for all platforms. Once a
+ // download terminates on a Desktop browser, it becomes a history download,
+ // for which the end time is stored differently, as a Places annotation.
+ download.endTime = Date.now();
- this._updateDataItemState(dataItem);
- },
+ this.oldDownloadStates.set(download,
+ DownloadsCommon.stateOfDownload(download));
- onDownloadRemoved: function (aDownload)
- {
- let dataItem = this._downloadToDataItemMap.get(aDownload);
- if (!dataItem) {
- Cu.reportError("Download doesn't exist.");
- return;
- }
-
- this._downloadToDataItemMap.delete(aDownload);
- this.dataItems[dataItem.downloadGuid] = null;
for (let view of this._views) {
- view.onDataItemRemoved(dataItem);
- }
- },
-
- /**
- * Updates the given data item and sends related notifications.
- */
- _updateDataItemState: function (aDataItem)
- {
- let oldState = aDataItem.state;
- let wasInProgress = aDataItem.inProgress;
- let wasDone = aDataItem.done;
-
- aDataItem.updateFromJSDownload();
-
- if (wasInProgress && !aDataItem.inProgress) {
- aDataItem.endTime = Date.now();
- }
+ view.onDownloadAdded(download, true);
+ }
+ },
+
+ onDownloadChanged(download) {
+ let oldState = this.oldDownloadStates.get(download);
+ let newState = DownloadsCommon.stateOfDownload(download);
+ this.oldDownloadStates.set(download, newState);
+
+ if (oldState != newState) {
+ if (download.succeeded ||
+ (download.canceled && !download.hasPartialData) ||
+ download.error) {
+ // Store the end time that may be displayed by the views.
+ download.endTime = Date.now();
+
+ // This state transition code should actually be located in a Downloads
+ // API module (bug 941009). Moreover, the fact that state is stored as
+ // annotations should be ideally hidden behind methods of
+ // nsIDownloadHistory (bug 830415).
+ if (!this._isPrivate) {
+ try {
+ let downloadMetaData = {
+ state: DownloadsCommon.stateOfDownload(download),
+ endTime: download.endTime,
+ };
+ if (download.succeeded) {
+ downloadMetaData.fileSize = download.target.size;
+ }
+
+ PlacesUtils.annotations.setPageAnnotation(
+ NetUtil.newURI(download.source.url),
+ "downloads/metaData",
+ JSON.stringify(downloadMetaData), 0,
+ PlacesUtils.annotations.EXPIRE_WITH_HISTORY);
+ } catch (ex) {
+ Cu.reportError(ex);
+ }
+ }
+ }
- if (oldState != aDataItem.state) {
for (let view of this._views) {
try {
- view.getViewItem(aDataItem).onStateChange(oldState);
+ view.onDownloadStateChanged(download);
} catch (ex) {
Cu.reportError(ex);
}
}
- // This state transition code should actually be located in a Downloads
- // API module (bug 941009). Moreover, the fact that state is stored as
- // annotations should be ideally hidden behind methods of
- // nsIDownloadHistory (bug 830415).
- if (!this._isPrivate && !aDataItem.inProgress) {
- try {
- let downloadMetaData = { state: aDataItem.state,
- endTime: aDataItem.endTime };
- if (aDataItem.done) {
- downloadMetaData.fileSize = aDataItem.maxBytes;
- }
-
- // RRR: Annotation service throws here. commented out for now.
- /*PlacesUtils.annotations.setPageAnnotation(
- NetUtil.newURI(aDataItem.uri), "downloads/metaData",
- JSON.stringify(downloadMetaData), 0,
- PlacesUtils.annotations.EXPIRE_WITH_HISTORY);*/
- } catch (ex) {
- Cu.reportError(ex);
- }
+ if (download.succeeded ||
+ (download.error && download.error.becauseBlocked)) {
+ this._notifyDownloadEvent("finish");
}
}
- if (!aDataItem.newDownloadNotified) {
- aDataItem.newDownloadNotified = true;
+ if (!download.newDownloadNotified) {
+ download.newDownloadNotified = true;
this._notifyDownloadEvent("start");
}
- if (!wasDone && aDataItem.done) {
- this._notifyDownloadEvent("finish");
+ for (let view of this._views) {
+ view.onDownloadChanged(download);
}
+ },
+
+ onDownloadRemoved(download) {
+ this.oldDownloadStates.delete(download);
for (let view of this._views) {
- view.getViewItem(aDataItem).onProgressChange();
+ view.onDownloadRemoved(download);
}
},
@@ -864,19 +841,9 @@ DownloadsDataCtor.prototype = {
//let loadedItemsArray = [dataItem
// for each (dataItem in this.dataItems)
// if (dataItem)];
-
- let loadedItemsArray = [];
-
- for each (let dataItem in this.dataItems) {
- if (dataItem) {
- loadedItemsArray.push(dataItem);
- }
- }
-
- loadedItemsArray.sort(function(a, b) b.startTime - a.startTime);
- loadedItemsArray.forEach(
- function (dataItem) aView.onDataItemAdded(dataItem, false)
- );
+ let downloadsArray = [...this.downloads];
+ downloadsArray.sort((a, b) => b.startTime - a.startTime);
+ downloadsArray.forEach(download => aView.onDownloadAdded(download, false));
// Notify the view that all data is available unless loading is in progress.
if (!this._pendingStatement) {
@@ -1328,410 +1295,6 @@ XPCOMUtils.defineLazyGetter(this, "DownloadsData", function() {
});
////////////////////////////////////////////////////////////////////////////////
-//// DownloadsDataItem
-
-/**
- * Represents a single item in the list of downloads. This object either wraps
- * an existing nsIDownload from the Download Manager, or provides the same
- * information read directly from the downloads database, with the possibility
- * of querying the nsIDownload lazily, for performance reasons.
- *
- * @param aSource
- * Object containing the data with which the item should be initialized.
- * This should implement either nsIDownload or mozIStorageRow. If the
- * JavaScript API for downloads is enabled, this is a Download object.
- */
-function DownloadsDataItem(aSource)
-{
- this._initFromJSDownload(aSource);
-}
-
-DownloadsDataItem.prototype = {
- /**
- * The JavaScript API does not need identifiers for Download objects, so they
- * are generated sequentially for the corresponding DownloadDataItem.
- */
- get _autoIncrementId() ++DownloadsDataItem.prototype.__lastId,
- __lastId: 0,
-
- /**
- * Initializes this object from the JavaScript API for downloads.
- *
- * The endTime property is initialized to the current date and time.
- *
- * @param aDownload
- * The Download object with the current state.
- */
- _initFromJSDownload: function (aDownload)
- {
- this._download = aDownload;
-
- this.downloadGuid = "id:" + this._autoIncrementId;
- this.file = aDownload.target.path;
- this.target = OS.Path.basename(aDownload.target.path);
- this.uri = aDownload.source.url;
- this.endTime = Date.now();
-
- this.updateFromJSDownload();
- },
-
- /**
- * Updates this object from the JavaScript API for downloads.
- */
- updateFromJSDownload: function ()
- {
- // Collapse state using the correct priority.
- if (this._download.succeeded) {
- this.state = nsIDM.DOWNLOAD_FINISHED;
- } else if (this._download.error &&
- this._download.error.becauseBlockedByParentalControls) {
- this.state = nsIDM.DOWNLOAD_BLOCKED_PARENTAL;
- } else if (this._download.error) {
- this.state = nsIDM.DOWNLOAD_FAILED;
- } else if (this._download.canceled && this._download.hasPartialData) {
- this.state = nsIDM.DOWNLOAD_PAUSED;
- } else if (this._download.canceled) {
- this.state = nsIDM.DOWNLOAD_CANCELED;
- } else if (this._download.stopped) {
- this.state = nsIDM.DOWNLOAD_NOTSTARTED;
- } else {
- this.state = nsIDM.DOWNLOAD_DOWNLOADING;
- }
-
- this.referrer = this._download.source.referrer;
- this.startTime = this._download.startTime;
- this.currBytes = this._download.currentBytes;
- this.resumable = this._download.hasPartialData;
- this.speed = this._download.speed;
-
- if (this._download.succeeded) {
- // If the download succeeded, show the final size if available, otherwise
- // use the last known number of bytes transferred. The final size on disk
- // will be available when bug 941063 is resolved.
- this.maxBytes = this._download.hasProgress ?
- this._download.totalBytes :
- this._download.currentBytes;
- this.percentComplete = 100;
- } else if (this._download.hasProgress) {
- // If the final size and progress are known, use them.
- this.maxBytes = this._download.totalBytes;
- this.percentComplete = this._download.progress;
- } else {
- // The download final size and progress percentage is unknown.
- this.maxBytes = -1;
- this.percentComplete = -1;
- }
- },
-
- /**
- * Initializes this object from a download object of the Download Manager.
- *
- * The endTime property is initialized to the current date and time.
- *
- * @param aDownload
- * The nsIDownload with the current state.
- */
- _initFromDownload: function DDI_initFromDownload(aDownload)
- {
- this._download = aDownload;
-
- // Fetch all the download properties eagerly.
- this.downloadGuid = aDownload.guid;
- this.file = aDownload.target.spec;
- this.target = aDownload.displayName;
- this.uri = aDownload.source.spec;
- this.referrer = aDownload.referrer && aDownload.referrer.spec;
- this.state = aDownload.state;
- this.startTime = Math.round(aDownload.startTime / 1000);
- this.endTime = Date.now();
- this.currBytes = aDownload.amountTransferred;
- this.maxBytes = aDownload.size;
- this.resumable = aDownload.resumable;
- this.speed = aDownload.speed;
- this.percentComplete = aDownload.percentComplete;
- },
-
- /**
- * Initializes this object from a data row in the downloads database, without
- * querying the associated nsIDownload object, to improve performance when
- * loading the list of downloads asynchronously.
- *
- * When this object is initialized in this way, accessing the "download"
- * property loads the underlying nsIDownload object synchronously, and should
- * be avoided unless the object is really required.
- *
- * @param aStorageRow
- * The mozIStorageRow from the downloads database.
- */
- _initFromDataRow: function DDI_initFromDataRow(aStorageRow)
- {
- // Get the download properties from the data row.
- this._download = null;
- this.downloadGuid = aStorageRow.getResultByName("guid");
- this.file = aStorageRow.getResultByName("target");
- this.target = aStorageRow.getResultByName("name");
- this.uri = aStorageRow.getResultByName("source");
- this.referrer = aStorageRow.getResultByName("referrer");
- this.state = aStorageRow.getResultByName("state");
- this.startTime = Math.round(aStorageRow.getResultByName("startTime") / 1000);
- this.endTime = Math.round(aStorageRow.getResultByName("endTime") / 1000);
- this.currBytes = aStorageRow.getResultByName("currBytes");
- this.maxBytes = aStorageRow.getResultByName("maxBytes");
-
- // Now we have to determine if the download is resumable, but don't want to
- // access the underlying download object unnecessarily. The only case where
- // the property is relevant is when we are currently downloading data, and
- // in this case the download object is already loaded in memory or will be
- // loaded very soon in any case. In all the other cases, including a paused
- // download, we assume that the download is resumable. The property will be
- // updated as soon as the underlying download state changes.
-
- // We'll start by assuming we're resumable, and then if we're downloading,
- // update resumable property in case we were wrong.
- this.resumable = true;
-
- if (this.state == nsIDM.DOWNLOAD_DOWNLOADING) {
- this.getDownload(function(aDownload) {
- this.resumable = aDownload.resumable;
- }.bind(this));
- }
-
- // Compute the other properties without accessing the download object.
- this.speed = 0;
- this.percentComplete = this.maxBytes <= 0
- ? -1
- : Math.round(this.currBytes / this.maxBytes * 100);
- },
-
- /**
- * Asynchronous getter for the download object corresponding to this data item.
- *
- * @param aCallback
- * A callback function which will be called when the download object is
- * available. It should accept one argument which will be the download
- * object.
- */
- getDownload: function DDI_getDownload(aCallback) {
- if (this._download) {
- // Return the download object asynchronously to the caller
- let download = this._download;
- Services.tm.mainThread.dispatch(function () aCallback(download),
- Ci.nsIThread.DISPATCH_NORMAL);
- } else {
- Services.downloads.getDownloadByGUID(this.downloadGuid,
- function(aStatus, aResult) {
- if (!Components.isSuccessCode(aStatus)) {
- Cu.reportError(
- new Components.Exception("Cannot retrieve download for GUID: " +
- this.downloadGuid));
- } else {
- this._download = aResult;
- aCallback(aResult);
- }
- }.bind(this));
- }
- },
-
- /**
- * Indicates whether the download is proceeding normally, and not finished
- * yet. This includes paused downloads. When this property is true, the
- * "progress" property represents the current progress of the download.
- */
- get inProgress()
- {
- return [
- nsIDM.DOWNLOAD_NOTSTARTED,
- nsIDM.DOWNLOAD_QUEUED,
- nsIDM.DOWNLOAD_DOWNLOADING,
- nsIDM.DOWNLOAD_PAUSED,
- nsIDM.DOWNLOAD_SCANNING,
- ].indexOf(this.state) != -1;
- },
-
- /**
- * This is true during the initial phases of a download, before the actual
- * download of data bytes starts.
- */
- get starting()
- {
- return this.state == nsIDM.DOWNLOAD_NOTSTARTED ||
- this.state == nsIDM.DOWNLOAD_QUEUED;
- },
-
- /**
- * Indicates whether the download is paused.
- */
- get paused()
- {
- return this.state == nsIDM.DOWNLOAD_PAUSED;
- },
-
- /**
- * Indicates whether the download is in a final state, either because it
- * completed successfully or because it was blocked.
- */
- get done()
- {
- return [
- nsIDM.DOWNLOAD_FINISHED,
- nsIDM.DOWNLOAD_BLOCKED_PARENTAL,
- nsIDM.DOWNLOAD_BLOCKED_POLICY,
- nsIDM.DOWNLOAD_DIRTY,
- ].indexOf(this.state) != -1;
- },
-
- /**
- * Indicates whether the download is finished and can be opened.
- */
- get openable()
- {
- return this.state == nsIDM.DOWNLOAD_FINISHED;
- },
-
- /**
- * Indicates whether the download stopped because of an error, and can be
- * resumed manually.
- */
- get canRetry()
- {
- return this.state == nsIDM.DOWNLOAD_CANCELED ||
- this.state == nsIDM.DOWNLOAD_FAILED;
- },
-
- /**
- * Returns the nsILocalFile for the download target.
- *
- * @throws if the native path is not valid. This can happen if the same
- * profile is used on different platforms, for example if a native
- * Windows path is stored and then the item is accessed on a Mac.
- */
- get localFile()
- {
- return this._getFile(this.file);
- },
-
- /**
- * Returns the nsILocalFile for the partially downloaded target.
- *
- * @throws if the native path is not valid. This can happen if the same
- * profile is used on different platforms, for example if a native
- * Windows path is stored and then the item is accessed on a Mac.
- */
- get partFile()
- {
- return this._getFile(this.file + kPartialDownloadSuffix);
- },
-
- /**
- * Returns an nsILocalFile for aFilename. aFilename might be a file URL or
- * a native path.
- *
- * @param aFilename the filename of the file to retrieve.
- * @return an nsILocalFile for the file.
- * @throws if the native path is not valid. This can happen if the same
- * profile is used on different platforms, for example if a native
- * Windows path is stored and then the item is accessed on a Mac.
- * @note This function makes no guarantees about the file's existence -
- * callers should check that the returned file exists.
- */
- _getFile: function DDI__getFile(aFilename)
- {
- // The download database may contain targets stored as file URLs or native
- // paths. This can still be true for previously stored items, even if new
- // items are stored using their file URL. See also bug 239948 comment 12.
- if (aFilename.startsWith("file:")) {
- // Assume the file URL we obtained from the downloads database or from the
- // "spec" property of the target has the UTF-8 charset.
- let fileUrl = NetUtil.newURI(aFilename).QueryInterface(Ci.nsIFileURL);
- return fileUrl.file.clone().QueryInterface(Ci.nsILocalFile);
- } else {
- // The downloads database contains a native path. Try to create a local
- // file, though this may throw an exception if the path is invalid.
- return new DownloadsLocalFileCtor(aFilename);
- }
- },
-
- /**
- * Open the target file for this download.
- *
- * @param aOwnerWindow
- * The window with which the required action is associated.
- * @throws if the file cannot be opened.
- */
- openLocalFile: function DDI_openLocalFile(aOwnerWindow) {
- this._download.launch().then(null, Cu.reportError);
- return;
- },
-
- /**
- * Show the downloaded file in the system file manager.
- */
- showLocalFile: function DDI_showLocalFile() {
- DownloadsCommon.showDownloadedFile(this.localFile);
- },
-
- /**
- * Resumes the download if paused, pauses it if active.
- * @throws if the download is not resumable or if has already done.
- */
- togglePauseResume: function DDI_togglePauseResume() {
- if (this._download.stopped) {
- this._download.start();
- } else {
- this._download.cancel();
- }
- return;
- },
-
- /**
- * Attempts to retry the download.
- * @throws if we cannot.
- */
- retry: function DDI_retry() {
- this._download.start();
- return;
- },
-
- /**
- * Support function that deletes the local file for a download. This is
- * used in cases where the Download Manager service doesn't delete the file
- * from disk when cancelling. See bug 732924.
- */
- _ensureLocalFileRemoved: function DDI__ensureLocalFileRemoved()
- {
- try {
- let localFile = this.localFile;
- if (localFile.exists()) {
- localFile.remove(false);
- }
- } catch (ex) { }
- },
-
- /**
- * Cancels the download.
- * @throws if the download is already done.
- */
- cancel: function() {
- this._download.cancel();
- this._download.removePartialData().then(null, Cu.reportError);
- return;
- },
-
- /**
- * Remove the download.
- */
- remove: function DDI_remove() {
- let promiseList = this._download.source.isPrivate
- ? Downloads.getList(Downloads.PUBLIC)
- : Downloads.getList(Downloads.PRIVATE);
- promiseList.then(list => list.remove(this._download))
- .then(() => this._download.finalize(true))
- .then(null, Cu.reportError);
- return;
- }
-};
-
-////////////////////////////////////////////////////////////////////////////////
//// DownloadsViewPrototype
/**
@@ -1858,9 +1421,9 @@ const DownloadsViewPrototype = {
* Called when a new download data item is available, either during the
* asynchronous data load or when a new download is started.
*
- * @param aDataItem
- * DownloadsDataItem object that was just added.
- * @param aNewest
+ * @param download
+ * Download object that was just added.
+ * @param newest
* When true, indicates that this item is the most recent and should be
* added in the topmost position. This happens when a new download is
* started. When false, indicates that the item is the least recent
@@ -1869,37 +1432,46 @@ const DownloadsViewPrototype = {
*
* @note Subclasses should override this.
*/
- onDataItemAdded: function DVP_onDataItemAdded(aDataItem, aNewest)
- {
+ onDownloadAdded(download, newest) {
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
},
/**
- * Called when a data item is removed, ensures that the widget associated with
- * the view item is removed from the user interface.
+ * Called when the overall state of a Download has changed. In particular,
+ * this is called only once when the download succeeds or is blocked
+ * permanently, and is never called if only the current progress changed.
*
- * @param aDataItem
- * DownloadsDataItem object that is being removed.
+ * The onDownloadChanged notification will always be sent afterwards.
*
* @note Subclasses should override this.
*/
- onDataItemRemoved: function DVP_onDataItemRemoved(aDataItem)
- {
+ onDownloadStateChanged(download) {
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
},
/**
- * Returns the view item associated with the provided data item for this view.
+ * Called every time any state property of a Download may have changed,
+ * including progress properties.
*
- * @param aDataItem
- * DownloadsDataItem object for which the view item is requested.
+ * Note that progress notification changes are throttled at the Downloads.jsm
+ * API level, and there is no throttling mechanism in the front-end.
+ *
+ * @note Subclasses should override this.
+ */
+ onDownloadChanged(download) {
+ throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+ },
+
+ /**
+ * Called when a data item is removed, ensures that the widget associated with
+ * the view item is removed from the user interface.
*
- * @return Object that can be used to notify item status events.
+ * @param download
+ * Download object that is being removed.
*
* @note Subclasses should override this.
*/
- getViewItem: function DID_getViewItem(aDataItem)
- {
+ onDownloadRemoved(download) {
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
},
@@ -1963,9 +1535,6 @@ DownloadsIndicatorDataCtor.prototype = {
//////////////////////////////////////////////////////////////////////////////
//// Callback functions from DownloadsData
- /**
- * Called after data loading finished.
- */
onDataLoadCompleted: function DID_onDataLoadCompleted()
{
DownloadsViewPrototype.onDataLoadCompleted.call(this);
@@ -1982,69 +1551,28 @@ DownloadsIndicatorDataCtor.prototype = {
this._itemCount = 0;
},
- /**
- * Called when a new download data item is available, either during the
- * asynchronous data load or when a new download is started.
- *
- * @param aDataItem
- * DownloadsDataItem object that was just added.
- * @param aNewest
- * When true, indicates that this item is the most recent and should be
- * added in the topmost position. This happens when a new download is
- * started. When false, indicates that the item is the least recent
- * with regard to the items that have been already added. The latter
- * generally happens during the asynchronous data load.
- */
- onDataItemAdded: function DID_onDataItemAdded(aDataItem, aNewest)
- {
+ onDownloadAdded(download, newest) {
this._itemCount++;
this._updateViews();
},
- /**
- * Called when a data item is removed, ensures that the widget associated with
- * the view item is removed from the user interface.
- *
- * @param aDataItem
- * DownloadsDataItem object that is being removed.
- */
- onDataItemRemoved: function DID_onDataItemRemoved(aDataItem)
- {
- this._itemCount--;
- this._updateViews();
- },
+ onDownloadStateChanged(download) {
+ if (download.succeeded || download.error) {
+ this.attention = true;
+ }
- /**
- * Returns the view item associated with the provided data item for this view.
- *
- * @param aDataItem
- * DownloadsDataItem object for which the view item is requested.
- *
- * @return Object that can be used to notify item status events.
- */
- getViewItem: function DID_getViewItem(aDataItem)
- {
- let data = this._isPrivate ? PrivateDownloadsIndicatorData
- : DownloadsIndicatorData;
- return Object.freeze({
- onStateChange: function DIVI_onStateChange(aOldState)
- {
- if (aDataItem.state == nsIDM.DOWNLOAD_FINISHED ||
- aDataItem.state == nsIDM.DOWNLOAD_FAILED) {
- data.attention = true;
- }
+ // Since the state of a download changed, reset the estimated time left.
+ this._lastRawTimeLeft = -1;
+ this._lastTimeLeft = -1;
+ },
- // Since the state of a download changed, reset the estimated time left.
- data._lastRawTimeLeft = -1;
- data._lastTimeLeft = -1;
+ onDownloadChanged(download) {
+ this._updateViews();
+ },
- data._updateViews();
- },
- onProgressChange: function DIVI_onProgressChange()
- {
- data._updateViews();
- }
- });
+ onDownloadRemoved(download) {
+ this._itemCount--;
+ this._updateViews();
},
//////////////////////////////////////////////////////////////////////////////
@@ -2135,18 +1663,17 @@ DownloadsIndicatorDataCtor.prototype = {
_lastTimeLeft: -1,
/**
- * A generator function for the dataItems that this summary is currently
+ * A generator function for the Download objects this summary is currently
* interested in. This generator is passed off to summarizeDownloads in order
- * to generate statistics about the dataItems we care about - in this case,
- * it's all dataItems for active downloads.
- */
- _activeDataItems: function DID_activeDataItems()
- {
- let dataItems = this._isPrivate ? PrivateDownloadsData.dataItems
- : DownloadsData.dataItems;
- for each (let dataItem in dataItems) {
- if (dataItem && dataItem.inProgress) {
- yield dataItem;
+ * to generate statistics about the downloads we care about - in this case,
+ * it's all active downloads.
+ */
+ * _activeDownloads() {
+ let downloads = this._isPrivate ? PrivateDownloadsData.downloads
+ : DownloadsData.downloads;
+ for (let download of downloads) {
+ if (!download.stopped || (download.canceled && download.hasPartialData)) {
+ yield download;
}
}
},
@@ -2157,7 +1684,7 @@ DownloadsIndicatorDataCtor.prototype = {
_refreshProperties: function DID_refreshProperties()
{
let summary =
- DownloadsCommon.summarizeDownloads(this._activeDataItems());
+ DownloadsCommon.summarizeDownloads(this._activeDownloads());
// Determine if the indicator should be shown or get attention.
this._hasDownloads = (this._itemCount > 0);
@@ -2218,7 +1745,7 @@ function DownloadsSummaryData(aIsPrivate, aNumToExclude) {
// completely separated from one another.
this._loading = false;
- this._dataItems = [];
+ this._downloads = [];
// Floating point value indicating the last number of seconds estimated until
// the longest download will finish. We need to store this value so that we
@@ -2258,9 +1785,9 @@ DownloadsSummaryData.prototype = {
DownloadsViewPrototype.removeView.call(this, aView);
if (this._views.length == 0) {
- // Clear out our collection of DownloadDataItems. If we ever have
+ // Clear out our collection of Download objects. If we ever have
// another view registered with us, this will get re-populated.
- this._dataItems = [];
+ this._downloads = [];
}
},
@@ -2280,40 +1807,30 @@ DownloadsSummaryData.prototype = {
this._dataItems = [];
},
- onDataItemAdded: function DSD_onDataItemAdded(aDataItem, aNewest)
- {
- if (aNewest) {
- this._dataItems.unshift(aDataItem);
+ onDownloadAdded(download, newest) {
+ if (newest) {
+ this._downloads.unshift(download);
} else {
- this._dataItems.push(aDataItem);
+ this._downloads.push(download);
}
this._updateViews();
},
- onDataItemRemoved: function DSD_onDataItemRemoved(aDataItem)
- {
- let itemIndex = this._dataItems.indexOf(aDataItem);
- this._dataItems.splice(itemIndex, 1);
+ onDownloadStateChanged() {
+ // Since the state of a download changed, reset the estimated time left.
+ this._lastRawTimeLeft = -1;
+ this._lastTimeLeft = -1;
+ },
+
+ onDownloadChanged() {
this._updateViews();
},
- getViewItem: function DSD_getViewItem(aDataItem)
- {
- let self = this;
- return Object.freeze({
- onStateChange: function DIVI_onStateChange(aOldState)
- {
- // Since the state of a download changed, reset the estimated time left.
- self._lastRawTimeLeft = -1;
- self._lastTimeLeft = -1;
- self._updateViews();
- },
- onProgressChange: function DIVI_onProgressChange()
- {
- self._updateViews();
- }
- });
+ onDownloadRemoved(download) {
+ let itemIndex = this._downloads.indexOf(download);
+ this._downloads.splice(itemIndex, 1);
+ this._updateViews();
},
//////////////////////////////////////////////////////////////////////////////
@@ -2351,17 +1868,16 @@ DownloadsSummaryData.prototype = {
//// Property updating based on current download status
/**
- * A generator function for the dataItems that this summary is currently
+ * A generator function for the Download objects this summary is currently
* interested in. This generator is passed off to summarizeDownloads in order
- * to generate statistics about the dataItems we care about - in this case,
- * it's the dataItems in this._dataItems after the first few to exclude,
+ * to generate statistics about the downloads we care about - in this case,
+ * it's the downloads in this._downloads after the first few to exclude,
* which was set when constructing this DownloadsSummaryData instance.
*/
- _dataItemsForSummary: function DSD_dataItemsForSummary()
- {
- if (this._dataItems.length > 0) {
- for (let i = this._numToExclude; i < this._dataItems.length; ++i) {
- yield this._dataItems[i];
+ * _downloadsForSummary() {
+ if (this._downloads.length > 0) {
+ for (let i = this._numToExclude; i < this._downloads.length; ++i) {
+ yield this._downloads[i];
}
}
},
@@ -2373,7 +1889,7 @@ DownloadsSummaryData.prototype = {
{
// Pre-load summary with default values.
let summary =
- DownloadsCommon.summarizeDownloads(this._dataItemsForSummary());
+ DownloadsCommon.summarizeDownloads(this._downloadsForSummary());
this._description = DownloadsCommon.strings
.otherDownloads2(summary.numActive);
diff --git a/application/palemoon/components/downloads/DownloadsViewUI.jsm b/application/palemoon/components/downloads/DownloadsViewUI.jsm
new file mode 100644
index 000000000..ede593e22
--- /dev/null
+++ b/application/palemoon/components/downloads/DownloadsViewUI.jsm
@@ -0,0 +1,250 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * This module is imported by code that uses the "download.xml" binding, and
+ * provides prototypes for objects that handle input and display information.
+ */
+
+"use strict";
+
+this.EXPORTED_SYMBOLS = [
+ "DownloadsViewUI",
+];
+
+const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "DownloadUtils",
+ "resource://gre/modules/DownloadUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "DownloadsCommon",
+ "resource:///modules/DownloadsCommon.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "OS",
+ "resource://gre/modules/osfile.jsm");
+
+this.DownloadsViewUI = {};
+
+/**
+ * A download element shell is responsible for handling the commands and the
+ * displayed data for a single element that uses the "download.xml" binding.
+ *
+ * The information to display is obtained through the associated Download object
+ * from the JavaScript API for downloads, and commands are executed using a
+ * combination of Download methods and DownloadsCommon.jsm helper functions.
+ *
+ * Specialized versions of this shell must be defined, and they are required to
+ * implement the "download" property or getter. Currently these objects are the
+ * HistoryDownloadElementShell and the DownloadsViewItem for the panel. The
+ * history view may use a HistoryDownload object in place of a Download object.
+ */
+this.DownloadsViewUI.DownloadElementShell = function () {}
+
+this.DownloadsViewUI.DownloadElementShell.prototype = {
+ /**
+ * The richlistitem for the download, initialized by the derived object.
+ */
+ element: null,
+
+ /**
+ * URI string for the file type icon displayed in the download element.
+ */
+ get image() {
+ if (!this.download.target.path) {
+ // Old history downloads may not have a target path.
+ return "moz-icon://.unknown?size=32";
+ }
+
+ // When a download that was previously in progress finishes successfully, it
+ // means that the target file now exists and we can extract its specific
+ // icon, for example from a Windows executable. To ensure that the icon is
+ // reloaded, however, we must change the URI used by the XUL image element,
+ // for example by adding a query parameter. This only works if we add one of
+ // the parameters explicitly supported by the nsIMozIconURI interface.
+ return "moz-icon://" + this.download.target.path + "?size=32" +
+ (this.download.succeeded ? "&state=normal" : "");
+ },
+
+ /**
+ * The user-facing label for the download. This is normally the leaf name of
+ * the download target file. In case this is a very old history download for
+ * which the target file is unknown, the download source URI is displayed.
+ */
+ get displayName() {
+ if (!this.download.target.path) {
+ return this.download.source.url;
+ }
+ return OS.Path.basename(this.download.target.path);
+ },
+
+ get extendedDisplayName() {
+ let s = DownloadsCommon.strings;
+ let referrer = this.download.source.referrer ||
+ this.download.source.url;
+ let [displayHost, fullHost] = DownloadUtils.getURIHost(referrer);
+ return s.statusSeparator(this.displayName, displayHost);
+ },
+
+ get extendedDisplayNameTip() {
+ let s = DownloadsCommon.strings;
+ let referrer = this.download.source.referrer ||
+ this.download.source.url;
+ let [displayHost, fullHost] = DownloadUtils.getURIHost(referrer);
+ return s.statusSeparator(this.displayName, fullHost);
+ },
+
+ /**
+ * The progress element for the download, or undefined in case the XBL binding
+ * has not been applied yet.
+ */
+ get _progressElement() {
+ if (!this.__progressElement) {
+ // If the element is not available now, we will try again the next time.
+ this.__progressElement =
+ this.element.ownerDocument.getAnonymousElementByAttribute(
+ this.element, "anonid",
+ "progressmeter");
+ }
+ return this.__progressElement;
+ },
+
+ /**
+ * Processes a major state change in the user interface, then proceeds with
+ * the normal progress update. This function is not called for every progress
+ * update in order to improve performance.
+ */
+ _updateState() {
+ this.element.setAttribute("displayName", this.displayName);
+ this.element.setAttribute("extendedDisplayName", this.extendedDisplayName);
+ this.element.setAttribute("extendedDisplayNameTip", this.extendedDisplayNameTip);
+ this.element.setAttribute("image", this.image);
+ this.element.setAttribute("state",
+ DownloadsCommon.stateOfDownload(this.download));
+
+ // Since state changed, reset the time left estimation.
+ this.lastEstimatedSecondsLeft = Infinity;
+
+ this._updateProgress();
+ },
+
+ /**
+ * Updates the elements that change regularly for in-progress downloads,
+ * namely the progress bar and the status line.
+ */
+ _updateProgress() {
+ if (this.download.succeeded) {
+ // We only need to add or remove this attribute for succeeded downloads.
+ if (this.download.target.exists) {
+ this.element.setAttribute("exists", "true");
+ } else {
+ this.element.removeAttribute("exists");
+ }
+ }
+
+ // The progress bar is only displayed for in-progress downloads.
+ if (this.download.hasProgress) {
+ this.element.setAttribute("progressmode", "normal");
+ this.element.setAttribute("progress", this.download.progress);
+ } else {
+ this.element.setAttribute("progressmode", "undetermined");
+ }
+
+ // Dispatch the ValueChange event for accessibility, if possible.
+ if (this._progressElement) {
+ let event = this.element.ownerDocument.createEvent("Events");
+ event.initEvent("ValueChange", true, true);
+ this._progressElement.dispatchEvent(event);
+ }
+
+ let status = this.statusTextAndTip;
+ this.element.setAttribute("status", status.text);
+ this.element.setAttribute("statusTip", status.tip);
+ },
+
+ lastEstimatedSecondsLeft: Infinity,
+
+ /**
+ * Returns the text for the status line and the associated tooltip. These are
+ * returned by a single property because they are computed together. The
+ * result may be overridden by derived objects.
+ */
+ get statusTextAndTip() this.rawStatusTextAndTip,
+
+ /**
+ * Derived objects may call this to get the status text.
+ */
+ get rawStatusTextAndTip() {
+ const nsIDM = Ci.nsIDownloadManager;
+ let s = DownloadsCommon.strings;
+
+ let text = "";
+ let tip = "";
+
+ if (!this.download.stopped) {
+ let totalBytes = this.download.hasProgress ? this.download.totalBytes
+ : -1;
+ // By default, extended status information including the individual
+ // download rate is displayed in the tooltip. The history view overrides
+ // the getter and displays the datails in the main area instead.
+ [text] = DownloadUtils.getDownloadStatusNoRate(
+ this.download.currentBytes,
+ totalBytes,
+ this.download.speed,
+ this.lastEstimatedSecondsLeft);
+ let newEstimatedSecondsLeft;
+ [tip, newEstimatedSecondsLeft] = DownloadUtils.getDownloadStatus(
+ this.download.currentBytes,
+ totalBytes,
+ this.download.speed,
+ this.lastEstimatedSecondsLeft);
+ this.lastEstimatedSecondsLeft = newEstimatedSecondsLeft;
+ } else if (this.download.canceled && this.download.hasPartialData) {
+ let totalBytes = this.download.hasProgress ? this.download.totalBytes
+ : -1;
+ let transfer = DownloadUtils.getTransferTotal(this.download.currentBytes,
+ totalBytes);
+
+ // We use the same XUL label to display both the state and the amount
+ // transferred, for example "Paused - 1.1 MB".
+ text = s.statusSeparatorBeforeNumber(s.statePaused, transfer);
+ } else if (!this.download.succeeded && !this.download.canceled &&
+ !this.download.error) {
+ text = s.stateStarting;
+ } else {
+ let stateLabel;
+
+ if (this.download.succeeded) {
+ // For completed downloads, show the file size (e.g. "1.5 MB").
+ if (this.download.target.size !== undefined) {
+ let [size, unit] =
+ DownloadUtils.convertByteUnits(this.download.target.size);
+ stateLabel = s.sizeWithUnits(size, unit);
+ } else {
+ // History downloads may not have a size defined.
+ stateLabel = s.sizeUnknown;
+ }
+ } else if (this.download.canceled) {
+ stateLabel = s.stateCanceled;
+ } else if (this.download.error.becauseBlockedByParentalControls) {
+ stateLabel = s.stateBlockedParentalControls;
+ } else if (this.download.error.becauseBlockedByReputationCheck) {
+ stateLabel = s.stateDirty;
+ } else {
+ stateLabel = s.stateFailed;
+ }
+
+ let referrer = this.download.source.referrer || this.download.source.url;
+ let [displayHost, fullHost] = DownloadUtils.getURIHost(referrer);
+
+ let date = new Date(this.download.endTime);
+ let [displayDate, fullDate] = DownloadUtils.getReadableDates(date);
+
+ let firstPart = s.statusSeparator(stateLabel, displayHost);
+ text = s.statusSeparator(firstPart, displayDate);
+ tip = s.statusSeparator(fullHost, fullDate);
+ }
+
+ return { text, tip: tip || text };
+ },
+};
diff --git a/application/palemoon/components/downloads/content/allDownloadsViewOverlay.js b/application/palemoon/components/downloads/content/allDownloadsViewOverlay.js
index 054f0405f..4830f2128 100644
--- a/application/palemoon/components/downloads/content/allDownloadsViewOverlay.js
+++ b/application/palemoon/components/downloads/content/allDownloadsViewOverlay.js
@@ -2,30 +2,32 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
-/**
- * THE PLACES VIEW IMPLEMENTED IN THIS FILE HAS A VERY PARTICULAR USE CASE.
- * IT IS HIGHLY RECOMMENDED NOT TO EXTEND IT FOR ANY OTHER USE CASES OR RELY
- * ON IT AS AN API.
- */
-
-var Cu = Components.utils;
-var Ci = Components.interfaces;
-var Cc = Components.classes;
+var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/NetUtil.jsm");
-Cu.import("resource://gre/modules/DownloadUtils.jsm");
-Cu.import("resource:///modules/DownloadsCommon.jsm");
-Cu.import("resource://gre/modules/PlacesUtils.jsm");
-Cu.import("resource://gre/modules/osfile.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
- "resource://gre/modules/PrivateBrowsingUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow",
- "resource:///modules/RecentWindow.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "DownloadUtils",
+ "resource://gre/modules/DownloadUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "DownloadsCommon",
+ "resource:///modules/DownloadsCommon.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "DownloadsViewUI",
+ "resource:///modules/DownloadsViewUI.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
"resource://gre/modules/FileUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
+ "resource://gre/modules/NetUtil.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "OS",
+ "resource://gre/modules/osfile.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
+ "resource://gre/modules/PlacesUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "Promise",
+ "resource://gre/modules/Promise.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow",
+ "resource:///modules/RecentWindow.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "Services",
+ "resource://gre/modules/Services.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "Task",
+ "resource://gre/modules/Task.jsm");
const nsIDM = Ci.nsIDownloadManager;
@@ -38,549 +40,268 @@ const DOWNLOAD_VIEW_SUPPORTED_COMMANDS =
"downloadsCmd_open", "downloadsCmd_show", "downloadsCmd_retry",
"downloadsCmd_openReferrer", "downloadsCmd_clearDownloads"];
-const NOT_AVAILABLE = Number.MAX_VALUE;
-
/**
- * A download element shell is responsible for handling the commands and the
- * displayed data for a single download view element. The download element
- * could represent either a past download (for which we get data from places) or
- * a "session" download (using a data-item object. See DownloadsCommon.jsm), or both.
- *
- * Once initialized with either a data item or a places node, the created richlistitem
- * can be accessed through the |element| getter, and can then be inserted/removed from
- * a richlistbox.
- *
- * The shell doesn't take care of inserting the item, or removing it when it's no longer
- * valid. That's the caller (a DownloadsPlacesView object) responsibility.
+ * Represents a download from the browser history. It implements part of the
+ * interface of the Download object.
*
- * The caller is also responsible for "passing over" notification from both the
- * download-view and the places-result-observer, in the following manner:
- * - The DownloadsPlacesView object implements getViewItem of the download-view
- * pseudo interface. It returns this object (therefore we implement
- * onStateChangea and onProgressChange here).
- * - The DownloadsPlacesView object adds itself as a places result observer and
- * calls this object's placesNodeIconChanged, placesNodeTitleChanged and
- * placeNodeAnnotationChanged from its callbacks.
- *
- * @param [optional] aDataItem
- * The data item of a the session download. Required if aPlacesNode is not set
- * @param [optional] aPlacesNode
- * The places node for a past download. Required if aDataItem is not set.
- * @param [optional] aAnnotations
- * Map containing annotations values, to speed up the initial loading.
+ * @param aPlacesNode
+ * The Places node from which the history download should be initialized.
*/
-function DownloadElementShell(aDataItem, aPlacesNode, aAnnotations) {
- this._element = document.createElement("richlistitem");
- this._element._shell = this;
-
- this._element.classList.add("download");
- this._element.classList.add("download-state");
-
- if (aAnnotations)
- this._annotations = aAnnotations;
- if (aDataItem)
- this.dataItem = aDataItem;
- if (aPlacesNode)
- this.placesNode = aPlacesNode;
+function HistoryDownload(aPlacesNode) {
+ // TODO (bug 829201): history downloads should get the referrer from Places.
+ this.source = {
+ url: aPlacesNode.uri,
+ };
+ this.target = {
+ path: undefined,
+ exists: false,
+ size: undefined,
+ };
+
+ // In case this download cannot obtain its end time from the Places metadata,
+ // use the time from the Places node, that is the start time of the download.
+ this.endTime = aPlacesNode.time / 1000;
}
-DownloadElementShell.prototype = {
- // The richlistitem for the download
- get element() this._element,
-
+HistoryDownload.prototype = {
/**
- * Manages the "active" state of the shell. By default all the shells
- * without a dataItem are inactive, thus their UI is not updated. They must
- * be activated when entering the visible area. Session downloads are
- * always active since they always have a dataItem.
+ * Pushes information from Places metadata into this object.
*/
- ensureActive: function DES_ensureActive() {
- if (!this._active) {
- this._active = true;
- this._element.setAttribute("active", true);
- this._updateUI();
- }
- },
- get active() !!this._active,
-
- // The data item for the download
- _dataItem: null,
- get dataItem() this._dataItem,
-
- set dataItem(aValue) {
- if (this._dataItem != aValue) {
- if (!aValue && !this._placesNode)
- throw new Error("Should always have either a dataItem or a placesNode");
-
- this._dataItem = aValue;
- if (!this.active)
- this.ensureActive();
- else
- this._updateUI();
+ updateFromMetaData(metaData) {
+ try {
+ this.target.path = Cc["@mozilla.org/network/protocol;1?name=file"]
+ .getService(Ci.nsIFileProtocolHandler)
+ .getFileFromURLSpec(metaData.targetFileSpec).path;
+ } catch (ex) {
+ this.target.path = undefined;
}
- return aValue;
- },
-
- _placesNode: null,
- get placesNode() this._placesNode,
- set placesNode(aValue) {
- if (this._placesNode != aValue) {
- if (!aValue && !this._dataItem)
- throw new Error("Should always have either a dataItem or a placesNode");
-
- // Preserve the annotations map if this is the first loading and we got
- // cached values.
- if (this._placesNode || !this._annotations) {
- this._annotations = new Map();
- }
-
- this._placesNode = aValue;
- // We don't need to update the UI if we had a data item, because
- // the places information isn't used in this case.
- if (!this._dataItem && this.active)
- this._updateUI();
+ if ("state" in metaData) {
+ this.succeeded = metaData.state == nsIDM.DOWNLOAD_FINISHED;
+ this.error = metaData.state == nsIDM.DOWNLOAD_FAILED
+ ? { message: "History download failed." }
+ : metaData.state == nsIDM.DOWNLOAD_BLOCKED_PARENTAL
+ ? { becauseBlockedByParentalControls: true }
+ : metaData.state == nsIDM.DOWNLOAD_DIRTY
+ ? { becauseBlockedByReputationCheck: true }
+ : null;
+ this.canceled = metaData.state == nsIDM.DOWNLOAD_CANCELED ||
+ metaData.state == nsIDM.DOWNLOAD_PAUSED;
+ this.endTime = metaData.endTime;
+
+ // Normal history downloads are assumed to exist until the user interface
+ // is refreshed, at which point these values may be updated.
+ this.target.exists = true;
+ this.target.size = metaData.fileSize;
+ } else {
+ // Metadata might be missing from a download that has started but hasn't
+ // stopped already. Normally, this state is overridden with the one from
+ // the corresponding in-progress session download. But if the browser is
+ // terminated abruptly and additionally the file with information about
+ // in-progress downloads is lost, we may end up using this state. We use
+ // the failed state to allow the download to be restarted.
+ //
+ // On the other hand, if the download is missing the target file
+ // annotation as well, it is just a very old one, and we can assume it
+ // succeeded.
+ this.succeeded = !this.target.path;
+ this.error = this.target.path ? { message: "Unstarted download." } : null;
+ this.canceled = false;
+
+ // These properties may be updated if the user interface is refreshed.
+ this.target.exists = false;
+ this.target.size = undefined;
}
- return aValue;
- },
-
- // The download uri (as a string)
- get downloadURI() {
- if (this._dataItem)
- return this._dataItem.uri;
- if (this._placesNode)
- return this._placesNode.uri;
- throw new Error("Unexpected download element state");
},
- get _downloadURIObj() {
- if (!("__downloadURIObj" in this))
- this.__downloadURIObj = NetUtil.newURI(this.downloadURI);
- return this.__downloadURIObj;
- },
-
- _getIcon: function DES__getIcon() {
- let metaData = this.getDownloadMetaData();
- if ("filePath" in metaData)
- return "moz-icon://" + metaData.filePath + "?size=32";
-
- if (this._placesNode) {
- // Try to extract an extension from the uri.
- let ext = this._downloadURIObj.QueryInterface(Ci.nsIURL).fileExtension;
- if (ext)
- return "moz-icon://." + ext + "?size=32";
- return this._placesNode.icon || "moz-icon://.unknown?size=32";
- }
- if (this._dataItem)
- throw new Error("Session-download items should always have a target file uri");
+ /**
+ * History downloads are never in progress.
+ */
+ stopped: true,
- throw new Error("Unexpected download element state");
- },
+ /**
+ * No percentage indication is shown for history downloads.
+ */
+ hasProgress: false,
- // Helper for getting a places annotation set for the download.
- _getAnnotation: function DES__getAnnotation(aAnnotation, aDefaultValue) {
- let value;
- if (this._annotations.has(aAnnotation))
- value = this._annotations.get(aAnnotation);
+ /**
+ * History downloads cannot be restarted using their partial data, even if
+ * they are indicated as paused in their Places metadata. The only way is to
+ * use the information from a persisted session download, that will be shown
+ * instead of the history download. In case this session download is not
+ * available, we show the history download as canceled, not paused.
+ */
+ hasPartialData: false,
- // If the value is cached, or we know it doesn't exist, avoid a database
- // lookup.
- if (value === undefined) {
- try {
- value = PlacesUtils.annotations.getPageAnnotation(
- this._downloadURIObj, aAnnotation);
- }
- catch(ex) {
- value = NOT_AVAILABLE;
- }
- }
+ /**
+ * This method mimicks the "start" method of session downloads, and is called
+ * when the user retries a history download.
+ *
+ * At present, we always ask the user for a new target path when retrying a
+ * history download. In the future we may consider reusing the known target
+ * path if the folder still exists and the file name is not already used,
+ * except when the user preferences indicate that the target path should be
+ * requested every time a new download is started.
+ */
+ start() {
+ let browserWin = RecentWindow.getMostRecentBrowserWindow();
+ let initiatingDoc = browserWin ? browserWin.document : document;
- if (value === NOT_AVAILABLE) {
- if (aDefaultValue === undefined) {
- throw new Error("Could not get required annotation '" + aAnnotation +
- "' for download with url '" + this.downloadURI + "'");
- }
- value = aDefaultValue;
- }
+ // Do not suggest a file name if we don't know the original target.
+ let leafName = this.target.path ? OS.Path.basename(this.target.path) : null;
+ DownloadURL(this.source.url, leafName, initiatingDoc);
- this._annotations.set(aAnnotation, value);
- return value;
+ return Promise.resolve();
},
- _fetchTargetFileInfo: function DES__fetchTargetFileInfo(aUpdateMetaDataAndStatusUI = false) {
- if (this._targetFileInfoFetched)
- throw new Error("_fetchTargetFileInfo should not be called if the information was already fetched");
- if (!this.active)
- throw new Error("Trying to _fetchTargetFileInfo on an inactive download shell");
-
- let path = this.getDownloadMetaData().filePath;
-
- // In previous version, the target file annotations were not set,
- // so we cannot tell where is the file.
- if (path === undefined) {
- this._targetFileInfoFetched = true;
- this._targetFileExists = false;
- if (aUpdateMetaDataAndStatusUI) {
- this._metaData = null;
- this._updateDownloadStatusUI();
- }
- // Here we don't need to update the download commands,
- // as the state is unknown as it was.
- return;
+ /**
+ * This method mimicks the "refresh" method of session downloads, except that
+ * it cannot notify that the data changed to the Downloads View.
+ */
+ refresh: Task.async(function* () {
+ try {
+ this.target.size = (yield OS.File.stat(this.target.path)).size;
+ this.target.exists = true;
+ } catch (ex) {
+ // We keep the known file size from the metadata, if any.
+ this.target.exists = false;
}
+ }),
+};
- OS.File.stat(path).then(
- function onSuccess(fileInfo) {
- this._targetFileInfoFetched = true;
- this._targetFileExists = true;
- this._targetFileSize = fileInfo.size;
- if (aUpdateMetaDataAndStatusUI) {
- this._metaData = null;
- this._updateDownloadStatusUI();
- }
- if (this._element.selected)
- goUpdateDownloadCommands();
- }.bind(this),
-
- function onFailure(reason) {
- if (reason instanceof OS.File.Error && reason.becauseNoSuchFile) {
- this._targetFileInfoFetched = true;
- this._targetFileExists = false;
- }
- else {
- Cu.reportError("Could not fetch info for target file (reason: " +
- reason + ")");
- }
+/**
+ * A download element shell is responsible for handling the commands and the
+ * displayed data for a single download view element.
+ *
+ * The shell may contain a session download, a history download, or both. When
+ * both a history and a session download are present, the session download gets
+ * priority and its information is displayed.
+ *
+ * On construction, a new richlistitem is created, and can be accessed through
+ * the |element| getter. The shell doesn't insert the item in a richlistbox, the
+ * caller must do it and remove the element when it's no longer needed.
+ *
+ * The caller is also responsible for forwarding status notifications for
+ * session downloads, calling the onStateChanged and onChanged methods.
+ *
+ * @param [optional] aSessionDownload
+ * The session download, required if aHistoryDownload is not set.
+ * @param [optional] aHistoryDownload
+ * The history download, required if aSessionDownload is not set.
+ */
+function HistoryDownloadElementShell(aSessionDownload, aHistoryDownload) {
+ this.element = document.createElement("richlistitem");
+ this.element._shell = this;
- if (aUpdateMetaDataAndStatusUI) {
- this._metaData = null;
- this._updateDownloadStatusUI();
- }
+ this.element.classList.add("download");
+ this.element.classList.add("download-state");
- if (this._element.selected)
- goUpdateDownloadCommands();
- }.bind(this)
- );
- },
+ if (aSessionDownload) {
+ this.sessionDownload = aSessionDownload;
+ }
+ if (aHistoryDownload) {
+ this.historyDownload = aHistoryDownload;
+ }
+}
- _getAnnotatedMetaData: function DES__getAnnotatedMetaData()
- JSON.parse(this._getAnnotation(DOWNLOAD_META_DATA_ANNO)),
+HistoryDownloadElementShell.prototype = {
+ __proto__: DownloadsViewUI.DownloadElementShell.prototype,
- _extractFilePathAndNameFromFileURI:
- function DES__extractFilePathAndNameFromFileURI(aFileURI) {
- let file = Cc["@mozilla.org/network/protocol;1?name=file"]
- .getService(Ci.nsIFileProtocolHandler)
- .getFileFromURLSpec(aFileURI);
- return [file.path, file.leafName];
+ /**
+ * Manages the "active" state of the shell. By default all the shells without
+ * a session download are inactive, thus their UI is not updated. They must
+ * be activated when entering the visible area. Session downloads are always
+ * active.
+ */
+ ensureActive: function DES_ensureActive() {
+ if (!this._active) {
+ this._active = true;
+ this.element.setAttribute("active", true);
+ this._updateUI();
+ }
},
+ get active() !!this._active,
/**
- * Retrieve the meta data object for the download. The following fields
- * may be set.
- *
- * - state - any download state defined in nsIDownloadManager. If this field
- * is not set, the download state is unknown.
- * - endTime: the end time of the download.
- * - filePath: the downloaded file path on the file system, when it
- * was downloaded. The file may not exist. This is set for session
- * downloads that have a local file set, and for history downloads done
- * after the landing of bug 591289.
- * - fileName: the downloaded file name on the file system. Set if filePath
- * is set.
- * - displayName: the user-facing label for the download. This is always
- * set. If available, it's set to the downloaded file name. If not,
- * the places title for the download uri is used. As a last resort,
- * we fallback to the download uri.
- * - fileSize (only set for downloads which completed successfully):
- * the downloaded file size. For downloads done after the landing of
- * bug 826991, this value is "static" - that is, it does not necessarily
- * mean that the file is in place and has this size.
+ * Overrides the base getter to return the Download or HistoryDownload object
+ * for displaying information and executing commands in the user interface.
*/
- getDownloadMetaData: function DES_getDownloadMetaData() {
- if (!this._metaData) {
- if (this._dataItem) {
- let s = DownloadsCommon.strings;
- let referrer = this._dataItem.referrer || this._dataItem.uri;
- let [displayHost, fullHost] = DownloadUtils.getURIHost(referrer);
- this._metaData = {
- state: this._dataItem.state,
- endTime: this._dataItem.endTime,
- fileName: this._dataItem.target,
- displayName: this._dataItem.target,
- extendedDisplayName: s.statusSeparator(this._dataItem.target, displayHost),
- extendedDisplayNameTip: s.statusSeparator(this._dataItem.target, fullHost)
- };
- if (this._dataItem.done)
- this._metaData.fileSize = this._dataItem.maxBytes;
- if (this._dataItem.localFile)
- this._metaData.filePath = this._dataItem.localFile.path;
+ get download() this._sessionDownload || this._historyDownload,
+
+ _sessionDownload: null,
+ get sessionDownload() this._sessionDownload,
+ set sessionDownload(aValue) {
+ if (this._sessionDownload != aValue) {
+ if (!aValue && !this._historyDownload) {
+ throw new Error("Should always have either a Download or a HistoryDownload");
}
- else {
- try {
- this._metaData = this._getAnnotatedMetaData();
- }
- catch(ex) {
- this._metaData = { };
- if (this._targetFileInfoFetched && this._targetFileExists) {
- this._metaData.state = this._targetFileSize > 0 ?
- nsIDM.DOWNLOAD_FINISHED : nsIDM.DOWNLOAD_FAILED;
- this._metaData.fileSize = this._targetFileSize;
- }
- // This is actually the start-time, but it's the best we can get.
- this._metaData.endTime = this._placesNode.time / 1000;
- }
+ this._sessionDownload = aValue;
- try {
- let targetFileURI = this._getAnnotation(DESTINATION_FILE_URI_ANNO);
- [this._metaData.filePath, this._metaData.fileName] =
- this._extractFilePathAndNameFromFileURI(targetFileURI);
- this._metaData.displayName = this._metaData.fileName;
- }
- catch(ex) {
- this._metaData.displayName = this._placesNode.title || this.downloadURI;
- }
- }
+ this.ensureActive();
+ this._updateUI();
}
- return this._metaData;
+ return aValue;
},
- // The status text for the download
- _getStatusText: function DES__getStatusText() {
- let s = DownloadsCommon.strings;
- if (this._dataItem && this._dataItem.inProgress) {
- if (this._dataItem.paused) {
- let transfer =
- DownloadUtils.getTransferTotal(this._dataItem.currBytes,
- this._dataItem.maxBytes);
-
- // We use the same XUL label to display both the state and the amount
- // transferred, for example "Paused - 1.1 MB".
- return s.statusSeparatorBeforeNumber(s.statePaused, transfer);
- }
- if (this._dataItem.state == nsIDM.DOWNLOAD_DOWNLOADING) {
- let [status, newEstimatedSecondsLeft] =
- DownloadUtils.getDownloadStatus(this.dataItem.currBytes,
- this.dataItem.maxBytes,
- this.dataItem.speed,
- this._lastEstimatedSecondsLeft || Infinity);
- this._lastEstimatedSecondsLeft = newEstimatedSecondsLeft;
- return status;
- }
- if (this._dataItem.starting) {
- return s.stateStarting;
- }
- if (this._dataItem.state == nsIDM.DOWNLOAD_SCANNING) {
- return s.stateScanning;
+ _historyDownload: null,
+ get historyDownload() this._historyDownload,
+ set historyDownload(aValue) {
+ if (this._historyDownload != aValue) {
+ if (!aValue && !this._sessionDownload) {
+ throw new Error("Should always have either a Download or a HistoryDownload");
}
- throw new Error("_getStatusText called with a bogus download state");
- }
+ this._historyDownload = aValue;
- // This is a not-in-progress or history download.
- let stateLabel = "";
- let state = this.getDownloadMetaData().state;
- switch (state) {
- case nsIDM.DOWNLOAD_FAILED:
- stateLabel = s.stateFailed;
- break;
- case nsIDM.DOWNLOAD_CANCELED:
- stateLabel = s.stateCanceled;
- break;
- case nsIDM.DOWNLOAD_BLOCKED_PARENTAL:
- stateLabel = s.stateBlockedParentalControls;
- break;
- case nsIDM.DOWNLOAD_BLOCKED_POLICY:
- stateLabel = s.stateBlockedPolicy;
- break;
- case nsIDM.DOWNLOAD_DIRTY:
- stateLabel = s.stateDirty;
- break;
- case nsIDM.DOWNLOAD_FINISHED:{
- // For completed downloads, show the file size (e.g. "1.5 MB")
- let metaData = this.getDownloadMetaData();
- if ("fileSize" in metaData) {
- let [size, unit] = DownloadUtils.convertByteUnits(metaData.fileSize);
- stateLabel = s.sizeWithUnits(size, unit);
- break;
- }
- // Fallback to default unknown state.
+ // We don't need to update the UI if we had a session data item, because
+ // the places information isn't used in this case.
+ if (!this._sessionDownload) {
+ this._updateUI();
}
- default:
- stateLabel = s.sizeUnknown;
- break;
- }
-
- // TODO (bug 829201): history downloads should get the referrer from Places.
- let referrer = this._dataItem && this._dataItem.referrer ||
- this.downloadURI;
- let [displayHost, fullHost] = DownloadUtils.getURIHost(referrer);
-
- let date = new Date(this.getDownloadMetaData().endTime);
- let [displayDate, fullDate] = DownloadUtils.getReadableDates(date);
-
- // We use the same XUL label to display the state, the host name, and the
- // end time.
- let firstPart = s.statusSeparator(stateLabel, displayHost);
- return s.statusSeparator(firstPart, displayDate);
- },
-
- // The progressmeter element for the download
- get _progressElement() {
- if (!("__progressElement" in this)) {
- this.__progressElement =
- document.getAnonymousElementByAttribute(this._element, "anonid",
- "progressmeter");
}
- return this.__progressElement;
+ return aValue;
},
- // Updates the download state attribute (and by that hide/unhide the
- // appropriate buttons and context menu items), the status text label,
- // and the progress meter.
- _updateDownloadStatusUI: function DES__updateDownloadStatusUI() {
- if (!this.active)
- throw new Error("_updateDownloadStatusUI called for an inactive item.");
-
- let state = this.getDownloadMetaData().state;
- if (state !== undefined)
- this._element.setAttribute("state", state);
-
- this._element.setAttribute("status", this._getStatusText());
-
- // For past-downloads, we're done. For session-downloads, we may also need
- // to update the progress-meter.
- if (!this._dataItem)
+ _updateUI() {
+ // There is nothing to do if the item has always been invisible.
+ if (!this.active) {
return;
-
- // Copied from updateProgress in downloads.js.
- if (this._dataItem.starting) {
- // Before the download starts, the progress meter has its initial value.
- this._element.setAttribute("progressmode", "normal");
- this._element.setAttribute("progress", "0");
- }
- else if (this._dataItem.state == nsIDM.DOWNLOAD_SCANNING ||
- this._dataItem.percentComplete == -1) {
- // We might not know the progress of a running download, and we don't know
- // the remaining time during the malware scanning phase.
- this._element.setAttribute("progressmode", "undetermined");
}
- else {
- // This is a running download of which we know the progress.
- this._element.setAttribute("progressmode", "normal");
- this._element.setAttribute("progress", this._dataItem.percentComplete);
- }
-
- // Dispatch the ValueChange event for accessibility, if possible.
- if (this._progressElement) {
- let event = document.createEvent("Events");
- event.initEvent("ValueChange", true, true);
- this._progressElement.dispatchEvent(event);
- }
- },
-
- _updateDisplayNameAndIcon: function DES__updateDisplayNameAndIcon() {
- let metaData = this.getDownloadMetaData();
- this._element.setAttribute("displayName", metaData.displayName);
- if ("extendedDisplayName" in metaData)
- this._element.setAttribute("extendedDisplayName", metaData.extendedDisplayName);
- if ("extendedDisplayNameTip" in metaData)
- this._element.setAttribute("extendedDisplayNameTip", metaData.extendedDisplayNameTip);
- this._element.setAttribute("image", this._getIcon());
- },
-
- _updateUI: function DES__updateUI() {
- if (!this.active)
- throw new Error("Trying to _updateUI on an inactive download shell");
-
- this._metaData = null;
- this._targetFileInfoFetched = false;
- this._updateDisplayNameAndIcon();
+ // Since the state changed, we may need to check the target file again.
+ this._targetFileChecked = false;
- // For history downloads done in past releases, the downloads/metaData
- // annotation is not set, and therefore we cannot tell the download
- // state without the target file information.
- if (this._dataItem || this.getDownloadMetaData().state !== undefined)
- this._updateDownloadStatusUI();
- else
- this._fetchTargetFileInfo(true);
+ this._updateState();
},
- placesNodeIconChanged: function DES_placesNodeIconChanged() {
- if (!this._dataItem)
- this._element.setAttribute("image", this._getIcon());
- },
+ get statusTextAndTip() {
+ let status = this.rawStatusTextAndTip;
- placesNodeTitleChanged: function DES_placesNodeTitleChanged() {
- // If there's a file path, we use the leaf name for the title.
- if (!this._dataItem && this.active && !this.getDownloadMetaData().filePath) {
- this._metaData = null;
- this._updateDisplayNameAndIcon();
+ // The base object would show extended progress information in the tooltip,
+ // but we move this to the main view and never display a tooltip.
+ if (!this.download.stopped) {
+ status.text = status.tip;
}
- },
+ status.tip = "";
- placesNodeAnnotationChanged: function DES_placesNodeAnnotationChanged(aAnnoName) {
- this._annotations.delete(aAnnoName);
- if (!this._dataItem && this.active) {
- if (aAnnoName == DOWNLOAD_META_DATA_ANNO) {
- let metaData = this.getDownloadMetaData();
- let annotatedMetaData = this._getAnnotatedMetaData();
- metaData.endTime = annotatedMetaData.endTime;
- if ("fileSize" in annotatedMetaData)
- metaData.fileSize = annotatedMetaData.fileSize;
- else
- delete metaData.fileSize;
-
- if (metaData.state != annotatedMetaData.state) {
- metaData.state = annotatedMetaData.state;
- if (this._element.selected)
- goUpdateDownloadCommands();
- }
-
- this._updateDownloadStatusUI();
- }
- else if (aAnnoName == DESTINATION_FILE_URI_ANNO) {
- let metaData = this.getDownloadMetaData();
- let targetFileURI = this._getAnnotation(DESTINATION_FILE_URI_ANNO);
- [metaData.filePath, metaData.fileName] =
- this._extractFilePathAndNameFromFileURI(targetFileURI);
- metaData.displayName = metaData.fileName;
- this._updateDisplayNameAndIcon();
-
- if (this._targetFileInfoFetched) {
- // This will also update the download commands if necessary.
- this._targetFileInfoFetched = false;
- this._fetchTargetFileInfo();
- }
- }
- }
+ return status;
},
- /* DownloadView */
- onStateChange: function DES_onStateChange(aOldState) {
- let metaData = this.getDownloadMetaData();
- metaData.state = this.dataItem.state;
- if (aOldState != nsIDM.DOWNLOAD_FINISHED && aOldState != metaData.state) {
- // See comment in DVI_onStateChange in downloads.js (the panel-view)
- this._element.setAttribute("image", this._getIcon() + "&state=normal");
- metaData.fileSize = this._dataItem.maxBytes;
- if (this._targetFileInfoFetched) {
- this._targetFileInfoFetched = false;
- this._fetchTargetFileInfo();
- }
- }
+ onStateChanged() {
+ this.element.setAttribute("image", this.image);
+ this.element.setAttribute("state",
+ DownloadsCommon.stateOfDownload(this.download));
- this._updateDownloadStatusUI();
- if (this._element.selected)
+ if (this.element.selected) {
goUpdateDownloadCommands();
- else
+ } else {
goUpdateCommand("downloadsCmd_clearDownloads");
+ }
},
- /* DownloadView */
- onProgressChange: function DES_onProgressChange() {
- this._updateDownloadStatusUI();
+ onChanged() {
+ this._updateProgress();
},
/* nsIController */
@@ -589,109 +310,79 @@ DownloadElementShell.prototype = {
if (!this.active && aCommand != "cmd_delete")
return false;
switch (aCommand) {
- case "downloadsCmd_open": {
- // We cannot open a session download file unless it's done ("openable").
- // If it's finished, we need to make sure the file was not removed,
- // as we do for past downloads.
- if (this._dataItem && !this._dataItem.openable)
- return false;
-
- if (this._targetFileInfoFetched)
- return this._targetFileExists;
-
- // If the target file information is not yet fetched,
- // temporarily assume that the file is in place.
- return this.getDownloadMetaData().state == nsIDM.DOWNLOAD_FINISHED;
- }
- case "downloadsCmd_show": {
+ case "downloadsCmd_open":
+ // This property is false if the download did not succeed.
+ return this.download.target.exists;
+ case "downloadsCmd_show":
// TODO: Bug 827010 - Handle part-file asynchronously.
- if (this._dataItem &&
- this._dataItem.partFile && this._dataItem.partFile.exists())
- return true;
-
- if (this._targetFileInfoFetched)
- return this._targetFileExists;
+ if (this._sessionDownload && this.download.target.partFilePath) {
+ let partFile = new FileUtils.File(this.download.target.partFilePath);
+ if (partFile.exists()) {
+ return true;
+ }
+ }
- // If the target file information is not yet fetched,
- // temporarily assume that the file is in place.
- return this.getDownloadMetaData().state == nsIDM.DOWNLOAD_FINISHED;
- }
+ // This property is false if the download did not succeed.
+ return this.download.target.exists;
case "downloadsCmd_pauseResume":
- return this._dataItem && this._dataItem.inProgress && this._dataItem.resumable;
+ return this.download.hasPartialData && !this.download.error;
case "downloadsCmd_retry":
- // An history download can always be retried.
- return !this._dataItem || this._dataItem.canRetry;
+ return this.download.canceled || this.download.error;
case "downloadsCmd_openReferrer":
- return this._dataItem && !!this._dataItem.referrer;
+ return !!this.download.source.referrer;
case "cmd_delete":
- // The behavior in this case is somewhat unexpected, so we disallow that.
- if (this._placesNode && this._dataItem && this._dataItem.inProgress)
- return false;
- return true;
+ // We don't want in-progress downloads to be removed accidentally.
+ return this.download.stopped;
case "downloadsCmd_cancel":
- return this._dataItem != null;
+ return !!this._sessionDownload;
}
return false;
},
- _retryAsHistoryDownload: function DES__retryAsHistoryDownload() {
- // In future we may try to download into the same original target uri, when
- // we have it. Though that requires verifying the path is still valid and
- // may surprise the user if he wants to be requested every time.
- let browserWin = RecentWindow.getMostRecentBrowserWindow();
- let initiatingDoc = browserWin ? browserWin.document : document;
- DownloadURL(this.downloadURI, this.getDownloadMetaData().fileName,
- initiatingDoc);
- },
-
/* nsIController */
doCommand: function DES_doCommand(aCommand) {
switch (aCommand) {
case "downloadsCmd_open": {
- let file = this._dataItem ?
- this.dataItem.localFile :
- new FileUtils.File(this.getDownloadMetaData().filePath);
-
+ let file = new FileUtils.File(this.download.target.path);
DownloadsCommon.openDownloadedFile(file, null, window);
break;
}
case "downloadsCmd_show": {
- if (this._dataItem) {
- this._dataItem.showLocalFile();
- }
- else {
- let file = new FileUtils.File(this.getDownloadMetaData().filePath);
- DownloadsCommon.showDownloadedFile(file);
- }
+ let file = new FileUtils.File(this.download.target.path);
+ DownloadsCommon.showDownloadedFile(file);
break;
}
case "downloadsCmd_openReferrer": {
- openURL(this._dataItem.referrer);
+ openURL(this.download.source.referrer);
break;
}
case "downloadsCmd_cancel": {
- this._dataItem.cancel();
+ this.download.cancel().catch(() => {});
+ this.download.removePartialData().catch(Cu.reportError);
break;
}
case "cmd_delete": {
- if (this._dataItem)
- Downloads.getList(Downloads.ALL)
- .then(list => list.remove(this._dataItem._download))
- .then(() => this._dataItem._download.finalize(true))
- .catch(Cu.reportError);
- if (this._placesNode)
- PlacesUtils.bhistory.removePage(this._downloadURIObj);
+ if (this._sessionDownload) {
+ DownloadsCommon.removeAndFinalizeDownload(this.download);
+ }
+ if (this._historyDownload) {
+ let uri = NetUtil.newURI(this.download.source.url);
+ PlacesUtils.bhistory.removePage(uri);
+ }
break;
- }
+ }
case "downloadsCmd_retry": {
- if (this._dataItem)
- this._dataItem.retry();
- else
- this._retryAsHistoryDownload();
+ // Errors when retrying are already reported as download failures.
+ this.download.start().catch(() => {});
break;
}
case "downloadsCmd_pauseResume": {
- this._dataItem.togglePauseResume();
+ // This command is only enabled for session downloads.
+ if (this.download.stopped) {
+ this.download.start();
+ } else {
+ this.download.cancel();
+ }
break;
}
}
@@ -704,8 +395,8 @@ DownloadElementShell.prototype = {
if (!aTerm)
return true;
aTerm = aTerm.toLowerCase();
- return this.getDownloadMetaData().displayName.toLowerCase().includes(aTerm) ||
- this.downloadURI.toLowerCase().includes(aTerm);
+ return this.displayName.toLowerCase().contains(aTerm) ||
+ this.download.source.url.toLowerCase().contains(aTerm);
},
// Handles return keypress on the element (the keypress listener is
@@ -732,30 +423,57 @@ DownloadElementShell.prototype = {
}
return "";
}
- let command = getDefaultCommandForState(this.getDownloadMetaData().state);
+ let state = DownloadsCommon.stateOfDownload(this.download);
+ let command = getDefaultCommandForState(state);
if (command && this.isCommandEnabled(command))
this.doCommand(command);
},
/**
- * At the first time an item is selected, we don't yet have
- * the target file information. Thus the call to goUpdateDownloadCommands
- * in DPV_onSelect would result in best-guess enabled/disabled result.
- * That way we let the user perform command immediately. However, once
- * we have the target file information, we can update the commands
- * appropriately (_fetchTargetFileInfo() calls goUpdateDownloadCommands).
+ * This method is called by the outer download view, after the controller
+ * commands have already been updated. In case we did not check for the
+ * existence of the target file already, we can do it now and then update
+ * the commands as needed.
*/
onSelect: function DES_onSelect() {
if (!this.active)
return;
- if (!this._targetFileInfoFetched)
- this._fetchTargetFileInfo();
- }
+
+ // If this is a history download for which no target file information is
+ // available, we cannot retrieve information about the target file.
+ if (!this.download.target.path) {
+ return;
+ }
+
+ // Start checking for existence. This may be done twice if onSelect is
+ // called again before the information is collected.
+ if (!this._targetFileChecked) {
+ this._checkTargetFileOnSelect().catch(Cu.reportError);
+ }
+ },
+
+ _checkTargetFileOnSelect: Task.async(function* () {
+ try {
+ yield this.download.refresh();
+ } finally {
+ // Do not try to check for existence again if this failed once.
+ this._targetFileChecked = true;
+ }
+
+ // Update the commands only if the element is still selected.
+ if (this.element.selected) {
+ goUpdateDownloadCommands();
+ }
+
+ // Ensure the interface has been updated based on the new values. We need to
+ // do this because history downloads can't trigger update notifications.
+ this._updateProgress();
+ }),
};
/**
* A Downloads Places View is a places view designed to show a places query
- * for history downloads alongside the current "session"-downloads.
+ * for history downloads alongside the session downloads.
*
* As we don't use the places controller, some methods implemented by other
* places views are not implemented by this view.
@@ -774,7 +492,7 @@ function DownloadsPlacesView(aRichListBox, aActive = true) {
this._downloadElementsShellsForURI = new Map();
// Map download data items to their element shells.
- this._viewItemsForDataItems = new WeakMap();
+ this._viewItemsForDownloads = new WeakMap();
// Points to the last session download element. We keep track of this
// in order to keep all session downloads above past downloads.
@@ -817,44 +535,83 @@ DownloadsPlacesView.prototype = {
return this._active;
},
- _forEachDownloadElementShellForURI:
- function DPV__forEachDownloadElementShellForURI(aURI, aCallback) {
- if (this._downloadElementsShellsForURI.has(aURI)) {
- let downloadElementShells = this._downloadElementsShellsForURI.get(aURI);
- for (let des of downloadElementShells) {
- aCallback(des);
+ /**
+ * This cache exists in order to optimize the load of the Downloads View, when
+ * Places annotations for history downloads must be read. In fact, annotations
+ * are stored in a single table, and reading all of them at once is much more
+ * efficient than an individual query.
+ *
+ * When this property is first requested, it reads the annotations for all the
+ * history downloads and stores them indefinitely.
+ *
+ * The historical annotations are not expected to change for the duration of
+ * the session, except in the case where a session download is running for the
+ * same URI as a history download. To ensure we don't use stale data, URIs
+ * corresponding to session downloads are permanently removed from the cache.
+ * This is a very small mumber compared to history downloads.
+ *
+ * This property returns a Map from each download source URI found in Places
+ * annotations to an object with the format:
+ *
+ * { targetFileSpec, state, endTime, fileSize, ... }
+ *
+ * The targetFileSpec property is the value of "downloads/destinationFileURI",
+ * while the other properties are taken from "downloads/metaData". Any of the
+ * properties may be missing from the object.
+ */
+ get _cachedPlacesMetaData() {
+ if (!this.__cachedPlacesMetaData) {
+ this.__cachedPlacesMetaData = new Map();
+
+ // Read the metadata annotations first, but ignore invalid JSON.
+ for (let result of PlacesUtils.annotations.getAnnotationsWithName(
+ DOWNLOAD_META_DATA_ANNO)) {
+ try {
+ this.__cachedPlacesMetaData.set(result.uri.spec,
+ JSON.parse(result.annotationValue));
+ } catch (ex) {}
}
- }
- },
- _getAnnotationsFor: function DPV_getAnnotationsFor(aURI) {
- if (!this._cachedAnnotations) {
- this._cachedAnnotations = new Map();
- for (let name of [ DESTINATION_FILE_URI_ANNO,
- DOWNLOAD_META_DATA_ANNO ]) {
- let results = PlacesUtils.annotations.getAnnotationsWithName(name);
- for (let result of results) {
- let url = result.uri.spec;
- if (!this._cachedAnnotations.has(url))
- this._cachedAnnotations.set(url, new Map());
- let m = this._cachedAnnotations.get(url);
- m.set(result.annotationName, result.annotationValue);
+ // Add the target file annotations to the metadata.
+ for (let result of PlacesUtils.annotations.getAnnotationsWithName(
+ DESTINATION_FILE_URI_ANNO)) {
+ let metaData = this.__cachedPlacesMetaData.get(result.uri.spec);
+ if (!metaData) {
+ metaData = {};
+ this.__cachedPlacesMetaData.set(result.uri.spec, metaData);
}
+ metaData.targetFileSpec = result.annotationValue;
}
}
- let annotations = this._cachedAnnotations.get(aURI);
- if (!annotations) {
- // There are no annotations for this entry, that means it is quite old.
- // Make up a fake annotations entry with default values.
- annotations = new Map();
- annotations.set(DESTINATION_FILE_URI_ANNO, NOT_AVAILABLE);
- }
- // The meta-data annotation has been added recently, so it's likely missing.
- if (!annotations.has(DOWNLOAD_META_DATA_ANNO)) {
- annotations.set(DOWNLOAD_META_DATA_ANNO, NOT_AVAILABLE);
- }
- return annotations;
+ return this.__cachedPlacesMetaData;
+ },
+ __cachedPlacesMetaData: null,
+
+ /**
+ * Reads current metadata from Places annotations for the specified URI, and
+ * returns an object with the format:
+ *
+ * { targetFileSpec, state, endTime, fileSize, ... }
+ *
+ * The targetFileSpec property is the value of "downloads/destinationFileURI",
+ * while the other properties are taken from "downloads/metaData". Any of the
+ * properties may be missing from the object.
+ */
+ _getPlacesMetaDataFor(spec) {
+ let metaData = {};
+
+ try {
+ let uri = NetUtil.newURI(spec);
+ try {
+ metaData = JSON.parse(PlacesUtils.annotations.getPageAnnotation(
+ uri, DOWNLOAD_META_DATA_ANNO));
+ } catch (ex) {}
+ metaData.targetFileSpec = PlacesUtils.annotations.getPageAnnotation(
+ uri, DESTINATION_FILE_URI_ANNO);
+ } catch (ex) {}
+
+ return metaData;
},
/**
@@ -869,14 +626,12 @@ DownloadsPlacesView.prototype = {
* alongside the other session downloads. If we don't, then we go ahead
* and create a new element for the download.
*
- * @param aDataItem
- * The data item of a session download. Set to null for history
- * downloads data.
+ * @param [optional] sessionDownload
+ * A Download object, or null for history downloads.
* @param [optional] aPlacesNode
- * The places node for a history download. Required if there's no data
- * item.
+ * The Places node for a history download, or null for session downloads.
* @param [optional] aNewest
- * @see onDataItemAdded. Ignored for history downloads.
+ * @see onDownloadAdded. Ignored for history downloads.
* @param [optional] aDocumentFragment
* To speed up the appending of multiple elements to the end of the
* list which are coming in a single batch (i.e. invalidateContainer),
@@ -884,16 +639,28 @@ DownloadsPlacesView.prototype = {
* be appended. It's the caller's job to ensure the fragment is merged
* to the richlistbox at the end.
*/
- _addDownloadData:
- function DPV_addDownloadData(aDataItem, aPlacesNode, aNewest = false,
+ _addDownloadData(sessionDownload, aPlacesNode, aNewest = false,
aDocumentFragment = null) {
- let downloadURI = aPlacesNode ? aPlacesNode.uri : aDataItem.uri;
+ let downloadURI = aPlacesNode ? aPlacesNode.uri
+ : sessionDownload.source.url;
let shellsForURI = this._downloadElementsShellsForURI.get(downloadURI);
if (!shellsForURI) {
shellsForURI = new Set();
this._downloadElementsShellsForURI.set(downloadURI, shellsForURI);
}
+ // When a session download is attached to a shell, we ensure not to keep
+ // stale metadata around for the corresponding history download. This
+ // prevents stale state from being used if the view is rebuilt.
+ //
+ // Note that we will eagerly load the data in the cache at this point, even
+ // if we have seen no history download. The case where no history download
+ // will appear at all is rare enough in normal usage, so we can apply this
+ // simpler solution rather than keeping a list of cache items to ignore.
+ if (sessionDownload) {
+ this._cachedPlacesMetaData.delete(sessionDownload.source.url);
+ }
+
let newOrUpdatedShell = null;
// Trivial: if there are no shells for this download URI, we always
@@ -911,44 +678,64 @@ DownloadsPlacesView.prototype = {
// item).
//
// Note: If a cancelled session download is already in the list, and the
- // download is retired, onDataItemAdded is called again for the same
+ // download is retried, onDownloadAdded is called again for the same
// data item. Thus, we also check that we make sure we don't have a view item
// already.
if (!shouldCreateShell &&
- aDataItem && this.getViewItem(aDataItem) == null) {
+ sessionDownload && !this._viewItemsForDownloads.has(sessionDownload)) {
// If there's a past-download-only shell for this download-uri with no
// associated data item, use it for the new data item. Otherwise, go ahead
// and create another shell.
shouldCreateShell = true;
for (let shell of shellsForURI) {
- if (!shell.dataItem) {
+ if (!shell.sessionDownload) {
shouldCreateShell = false;
- shell.dataItem = aDataItem;
+ shell.sessionDownload = sessionDownload;
newOrUpdatedShell = shell;
- this._viewItemsForDataItems.set(aDataItem, shell);
+ this._viewItemsForDownloads.set(sessionDownload, shell);
break;
}
}
}
if (shouldCreateShell) {
- // Bug 836271: The annotations for a url should be cached only when the
- // places node is available, i.e. when we know we we'd be notified for
- // annotation changes.
- // Otherwise we may cache NOT_AVILABLE values first for a given session
- // download, and later use these NOT_AVILABLE values when a history
- // download for the same URL is added.
- let cachedAnnotations = aPlacesNode ? this._getAnnotationsFor(downloadURI) : null;
- let shell = new DownloadElementShell(aDataItem, aPlacesNode, cachedAnnotations);
+ // If we are adding a new history download here, it means there is no
+ // associated session download, thus we must read the Places metadata,
+ // because it will not be obscured by the session download.
+ let historyDownload = null;
+ if (aPlacesNode) {
+ let metaData = this._cachedPlacesMetaData.get(aPlacesNode.uri) ||
+ this._getPlacesMetaDataFor(aPlacesNode.uri);
+ historyDownload = new HistoryDownload(aPlacesNode);
+ historyDownload.updateFromMetaData(metaData);
+ }
+ let shell = new HistoryDownloadElementShell(sessionDownload,
+ historyDownload);
+ shell.element._placesNode = aPlacesNode;
newOrUpdatedShell = shell;
shellsForURI.add(shell);
- if (aDataItem)
- this._viewItemsForDataItems.set(aDataItem, shell);
+ if (sessionDownload) {
+ this._viewItemsForDownloads.set(sessionDownload, shell);
+ }
}
else if (aPlacesNode) {
+ // We are updating information for a history download for which we have
+ // at least one download element shell already. There are two cases:
+ // 1) There are one or more download element shells for this source URI,
+ // each with an associated session download. We update the Places node
+ // because we may need it later, but we don't need to read the Places
+ // metadata until the last session download is removed.
+ // 2) Occasionally, we may receive a duplicate notification for a history
+ // download with no associated session download. We have exactly one
+ // download element shell in this case, but the metdata cannot have
+ // changed, just the reference to the Places node object is different.
+ // So, we update all the node references and keep the metadata intact.
for (let shell of shellsForURI) {
- if (shell.placesNode != aPlacesNode)
- shell.placesNode = aPlacesNode;
+ if (!shell.historyDownload) {
+ // Create the element to host the metadata when needed.
+ shell.historyDownload = new HistoryDownload(aPlacesNode);
+ }
+ shell.element._placesNode = aPlacesNode;
}
}
@@ -963,8 +750,7 @@ DownloadsPlacesView.prototype = {
// the top of the richlistbox, along with other session downloads.
// More generally, if a new download is added, should be made visible.
this._richlistbox.ensureElementIsVisible(newOrUpdatedShell.element);
- }
- else if (aDataItem) {
+ } else if (sessionDownload) {
let before = this._lastSessionDownloadElement ?
this._lastSessionDownloadElement.nextSibling : this._richlistbox.firstChild;
this._richlistbox.insertBefore(newOrUpdatedShell.element, before);
@@ -1015,8 +801,8 @@ DownloadsPlacesView.prototype = {
let shellsForURI = this._downloadElementsShellsForURI.get(downloadURI);
if (shellsForURI) {
for (let shell of shellsForURI) {
- if (shell.dataItem) {
- shell.placesNode = null;
+ if (shell.sessionDownload) {
+ shell.historyDownload = null;
}
else {
this._removeElement(shell.element);
@@ -1028,13 +814,13 @@ DownloadsPlacesView.prototype = {
}
},
- _removeSessionDownloadFromView:
- function DPV__removeSessionDownloadFromView(aDataItem) {
- let shells = this._downloadElementsShellsForURI.get(aDataItem.uri);
+ _removeSessionDownloadFromView(download) {
+ let shells = this._downloadElementsShellsForURI
+ .get(download.source.url);
if (shells.size == 0)
throw new Error("Should have had at leaat one shell for this uri");
- let shell = this.getViewItem(aDataItem);
+ let shell = this._viewItemsForDownloads.get(download);
if (!shells.has(shell))
throw new Error("Missing download element shell in shells list for url");
@@ -1042,14 +828,22 @@ DownloadsPlacesView.prototype = {
// view item for this this particular data item go away.
// If there's only one item for this download uri, we should only
// keep it if it is associated with a history download.
- if (shells.size > 1 || !shell.placesNode) {
+ if (shells.size > 1 || !shell.historyDownload) {
this._removeElement(shell.element);
shells.delete(shell);
if (shells.size == 0)
- this._downloadElementsShellsForURI.delete(aDataItem.uri);
+ this._downloadElementsShellsForURI.delete(download.source.url);
}
else {
- shell.dataItem = null;
+ // We have one download element shell containing both a session download
+ // and a history download, and we are now removing the session download.
+ // Previously, we did not use the Places metadata because it was obscured
+ // by the session download. Since this is no longer the case, we have to
+ // read the latest metadata before removing the session download.
+ let url = shell.historyDownload.source.url;
+ let metaData = this._getPlacesMetaDataFor(url);
+ shell.historyDownload.updateFromMetaData(metaData);
+ shell.sessionDownload = null;
// Move it below the session-download items;
if (this._lastSessionDownloadElement == shell.element) {
this._lastSessionDownloadElement = shell.element.previousSibling;
@@ -1157,13 +951,9 @@ DownloadsPlacesView.prototype = {
},
get selectedNodes() {
- let placesNodes = [];
- let selectedElements = this._richlistbox.selectedItems;
- for (let elt of selectedElements) {
- if (elt._shell.placesNode)
- placesNodes.push(elt._shell.placesNode);
- }
- return placesNodes;
+ return [for (element of this._richlistbox.selectedItems)
+ if (element._placesNode)
+ element._placesNode];
},
get selectedNode() {
@@ -1193,8 +983,9 @@ DownloadsPlacesView.prototype = {
// Loop backwards since _removeHistoryDownloadFromView may removeChild().
for (let i = this._richlistbox.childNodes.length - 1; i >= 0; --i) {
let element = this._richlistbox.childNodes[i];
- if (element._shell.placesNode)
- this._removeHistoryDownloadFromView(element._shell.placesNode);
+ if (element._placesNode) {
+ this._removeHistoryDownloadFromView(element._placesNode);
+ }
}
}
finally {
@@ -1254,24 +1045,9 @@ DownloadsPlacesView.prototype = {
this._removeHistoryDownloadFromView(aPlacesNode);
},
- nodeIconChanged: function DPV_nodeIconChanged(aNode) {
- this._forEachDownloadElementShellForURI(aNode.uri, function(aDownloadElementShell) {
- aDownloadElementShell.placesNodeIconChanged();
- });
- },
-
- nodeAnnotationChanged: function DPV_nodeAnnotationChanged(aNode, aAnnoName) {
- this._forEachDownloadElementShellForURI(aNode.uri, function(aDownloadElementShell) {
- aDownloadElementShell.placesNodeAnnotationChanged(aAnnoName);
- });
- },
-
- nodeTitleChanged: function DPV_nodeTitleChanged(aNode, aNewTitle) {
- this._forEachDownloadElementShellForURI(aNode.uri, function(aDownloadElementShell) {
- aDownloadElementShell.placesNodeTitleChanged();
- });
- },
-
+ nodeAnnotationChanged() {},
+ nodeIconChanged() {},
+ nodeTitleChanged() {},
nodeKeywordChanged: function() {},
nodeDateAddedChanged: function() {},
nodeLastModifiedChanged: function() {},
@@ -1334,16 +1110,21 @@ DownloadsPlacesView.prototype = {
this._ensureInitialSelection();
},
- onDataItemAdded: function DPV_onDataItemAdded(aDataItem, aNewest) {
- this._addDownloadData(aDataItem, null, aNewest);
+ onDownloadAdded(download, newest) {
+ this._addDownloadData(download, null, newest);
},
- onDataItemRemoved: function DPV_onDataItemRemoved(aDataItem) {
- this._removeSessionDownloadFromView(aDataItem);
+ onDownloadStateChanged(download) {
+ this._viewItemsForDownloads.get(download).onStateChanged();
},
- getViewItem: function(aDataItem)
- this._viewItemsForDataItems.get(aDataItem, null),
+ onDownloadChanged(download) {
+ this._viewItemsForDownloads.get(download).onChanged();
+ },
+
+ onDownloadRemoved(download) {
+ this._removeSessionDownloadFromView(download);
+ },
supportsCommand: function DPV_supportsCommand(aCommand) {
if (DOWNLOAD_VIEW_SUPPORTED_COMMANDS.indexOf(aCommand) != -1) {
@@ -1386,8 +1167,11 @@ DownloadsPlacesView.prototype = {
// Because history downloads are always removable and are listed after the
// session downloads, check from bottom to top.
for (let elt = this._richlistbox.lastChild; elt; elt = elt.previousSibling) {
- if (elt._shell.placesNode || !elt._shell.dataItem.inProgress)
+ // Stopped, paused, and failed downloads with partial data are removed.
+ let download = elt._shell.download;
+ if (download.stopped && !(download.canceled && download.hasPartialData)) {
return true;
+ }
}
return false;
},
@@ -1395,10 +1179,11 @@ DownloadsPlacesView.prototype = {
_copySelectedDownloadsToClipboard:
function DPV__copySelectedDownloadsToClipboard() {
let urls = [for (element of this._richlistbox.selectedItems)
- element._shell.downloadURI];
+ element._shell.download.source.url];
- Cc["@mozilla.org/widget/clipboardhelper;1"].
- getService(Ci.nsIClipboardHelper).copyString(urls.join("\n"));
+ Cc["@mozilla.org/widget/clipboardhelper;1"]
+ .getService(Ci.nsIClipboardHelper)
+ .copyString(urls.join("\n"), document);
},
_getURLFromClipboardData: function DPV__getURLFromClipboardData() {
@@ -1486,15 +1271,13 @@ DownloadsPlacesView.prototype = {
// Set the state attribute so that only the appropriate items are displayed.
let contextMenu = document.getElementById("downloadsContextMenu");
- let state = element._shell.getDownloadMetaData().state;
- if (state !== undefined)
- contextMenu.setAttribute("state", state);
- else
- contextMenu.removeAttribute("state");
-
- if (state == nsIDM.DOWNLOAD_DOWNLOADING) {
- // The resumable property of a download may change at any time, so
- // ensure we update the related command now.
+ let download = element._shell.download;
+ contextMenu.setAttribute("state",
+ DownloadsCommon.stateOfDownload(download));
+
+ if (!download.stopped) {
+ // The hasPartialData property of a download may change at any time after
+ // it has started, so ensure we update the related command now.
goUpdateCommand("downloadsCmd_pauseResume");
}
return true;
@@ -1555,10 +1338,13 @@ DownloadsPlacesView.prototype = {
if (!selectedItem)
return;
- let metaData = selectedItem._shell.getDownloadMetaData();
- if (!("filePath" in metaData))
+ let targetPath = selectedItem._shell.download.target.path;
+ if (!targetPath) {
return;
- let file = new FileUtils.File(metaData.filePath);
+ }
+
+ // We must check for existence synchronously because this is a DOM event.
+ let file = new FileUtils.File(targetPath);
if (!file.exists())
return;
diff --git a/application/palemoon/components/downloads/content/downloads.js b/application/palemoon/components/downloads/content/downloads.js
index 833d7d72f..ee1c6902e 100644
--- a/application/palemoon/components/downloads/content/downloads.js
+++ b/application/palemoon/components/downloads/content/downloads.js
@@ -4,6 +4,23 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
+var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "DownloadsCommon",
+ "resource:///modules/DownloadsCommon.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "DownloadsViewUI",
+ "resource:///modules/DownloadsViewUI.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
+ "resource://gre/modules/FileUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
+ "resource://gre/modules/NetUtil.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
+ "resource://gre/modules/PlacesUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "Services",
+ "resource://gre/modules/Services.jsm");
+
/**
* Handles the Downloads panel user interface for each browser window.
*
@@ -65,22 +82,6 @@
"use strict";
////////////////////////////////////////////////////////////////////////////////
-//// Globals
-
-XPCOMUtils.defineLazyModuleGetter(this, "DownloadUtils",
- "resource://gre/modules/DownloadUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "DownloadsCommon",
- "resource:///modules/DownloadsCommon.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "OS",
- "resource://gre/modules/osfile.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
- "resource://gre/modules/PrivateBrowsingUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
- "resource://gre/modules/PlacesUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
- "resource://gre/modules/NetUtil.jsm");
-
-////////////////////////////////////////////////////////////////////////////////
//// DownloadsPanel
/**
@@ -570,8 +571,8 @@ const DownloadsPanel = {
// still exist, and update the allowed items interactions accordingly. We
// do these checks on a background thread, and don't prevent the panel to
// be displayed while these checks are being performed.
- for each (let viewItem in DownloadsView._viewItems) {
- viewItem.verifyTargetExists();
+ for (let viewItem of DownloadsView._visibleViewItems.values()) {
+ viewItem.download.refresh().catch(Cu.reportError);
}
if (aAnchor) {
@@ -703,19 +704,19 @@ const DownloadsView = {
loading: false,
/**
- * Ordered array of all DownloadsDataItem objects. We need to keep this array
- * because only a limited number of items are shown at once, and if an item
- * that is currently visible is removed from the list, we might need to take
- * another item from the array and make it appear at the bottom.
+ * Ordered array of all Download objects. We need to keep this array because
+ * only a limited number of items are shown at once, and if an item that is
+ * currently visible is removed from the list, we might need to take another
+ * item from the array and make it appear at the bottom.
*/
- _dataItems: [],
+ _downloads: [],
/**
- * Object containing the available DownloadsViewItem objects, indexed by their
- * numeric download identifier. There is a limited number of view items in
- * the panel at any given time.
+ * Associates the visible Download objects with their corresponding
+ * DownloadsViewItem object. There is a limited number of view items in the
+ * panel at any given time.
*/
- _viewItems: {},
+ _visibleViewItems: new Map(),
/**
* Called when the number of items in the list changes.
@@ -723,8 +724,8 @@ const DownloadsView = {
_itemCountChanged: function DV_itemCountChanged()
{
DownloadsCommon.log("The downloads item count has changed - we are tracking",
- this._dataItems.length, "downloads in total.");
- let count = this._dataItems.length;
+ this._downloads.length, "downloads in total.");
+ let count = this._downloads.length;
let hiddenCount = count - this.kItemCountLimit;
if (count > 0) {
@@ -813,8 +814,8 @@ const DownloadsView = {
* Called when a new download data item is available, either during the
* asynchronous data load or when a new download is started.
*
- * @param aDataItem
- * DownloadsDataItem object that was just added.
+ * @param aDownload
+ * Download object that was just added.
* @param aNewest
* When true, indicates that this item is the most recent and should be
* added in the topmost position. This happens when a new download is
@@ -822,28 +823,27 @@ const DownloadsView = {
* and should be appended. The latter generally happens during the
* asynchronous data load.
*/
- onDataItemAdded: function DV_onDataItemAdded(aDataItem, aNewest)
- {
+ onDownloadAdded(download, aNewest) {
DownloadsCommon.log("A new download data item was added - aNewest =",
aNewest);
if (aNewest) {
- this._dataItems.unshift(aDataItem);
+ this._downloads.unshift(download);
} else {
- this._dataItems.push(aDataItem);
+ this._downloads.push(download);
}
- let itemsNowOverflow = this._dataItems.length > this.kItemCountLimit;
+ let itemsNowOverflow = this._downloads.length > this.kItemCountLimit;
if (aNewest || !itemsNowOverflow) {
// The newly added item is visible in the panel and we must add the
// corresponding element. This is either because it is the first item, or
// because it was added at the bottom but the list still doesn't overflow.
- this._addViewItem(aDataItem, aNewest);
+ this._addViewItem(download, aNewest);
}
if (aNewest && itemsNowOverflow) {
// If the list overflows, remove the last item from the panel to make room
// for the new one that we just added at the top.
- this._removeViewItem(this._dataItems[this.kItemCountLimit]);
+ this._removeViewItem(this._downloads[this.kItemCountLimit]);
}
// For better performance during batch loads, don't update the count for
@@ -853,26 +853,39 @@ const DownloadsView = {
}
},
+ onDownloadStateChanged(download) {
+ let viewItem = this._visibleViewItems.get(download);
+ if (viewItem) {
+ viewItem.onStateChanged();
+ }
+ },
+
+ onDownloadChanged(download) {
+ let viewItem = this._visibleViewItems.get(download);
+ if (viewItem) {
+ viewItem.onChanged();
+ }
+ },
+
/**
* Called when a data item is removed. Ensures that the widget associated
* with the view item is removed from the user interface.
*
- * @param aDataItem
- * DownloadsDataItem object that is being removed.
+ * @param download
+ * Download object that is being removed.
*/
- onDataItemRemoved: function DV_onDataItemRemoved(aDataItem)
- {
+ onDownloadRemoved(download) {
DownloadsCommon.log("A download data item was removed.");
- let itemIndex = this._dataItems.indexOf(aDataItem);
- this._dataItems.splice(itemIndex, 1);
+ let itemIndex = this._downloads.indexOf(download);
+ this._downloads.splice(itemIndex, 1);
if (itemIndex < this.kItemCountLimit) {
// The item to remove is visible in the panel.
- this._removeViewItem(aDataItem);
- if (this._dataItems.length >= this.kItemCountLimit) {
+ this._removeViewItem(download);
+ if (this._downloads.length >= this.kItemCountLimit) {
// Reinsert the next item into the panel.
- this._addViewItem(this._dataItems[this.kItemCountLimit - 1], false);
+ this._addViewItem(this._downloads[this.kItemCountLimit - 1], false);
}
}
@@ -880,43 +893,29 @@ const DownloadsView = {
},
/**
- * Returns the view item associated with the provided data item for this view.
- *
- * @param aDataItem
- * DownloadsDataItem object for which the view item is requested.
- *
- * @return Object that can be used to notify item status events.
+ * Associates each richlistitem for a download with its corresponding
+ * DownloadsViewItemController object.
*/
- getViewItem: function DV_getViewItem(aDataItem)
- {
- // If the item is visible, just return it, otherwise return a mock object
- // that doesn't react to notifications.
- if (aDataItem.downloadGuid in this._viewItems) {
- return this._viewItems[aDataItem.downloadGuid];
- }
- return this._invisibleViewItem;
- },
+ _controllersForElements: new Map(),
- /**
- * Mock DownloadsDataItem object that doesn't react to notifications.
- */
- _invisibleViewItem: Object.freeze({
- onStateChange: function () { },
- onProgressChange: function () { }
- }),
+ controllerForElement(element) {
+ return this._controllersForElements.get(element);
+ },
/**
* Creates a new view item associated with the specified data item, and adds
* it to the top or the bottom of the list.
*/
- _addViewItem: function DV_addViewItem(aDataItem, aNewest)
+ _addViewItem(download, aNewest)
{
DownloadsCommon.log("Adding a new DownloadsViewItem to the downloads list.",
"aNewest =", aNewest);
let element = document.createElement("richlistitem");
- let viewItem = new DownloadsViewItem(aDataItem, element);
- this._viewItems[aDataItem.downloadGuid] = viewItem;
+ let viewItem = new DownloadsViewItem(download, element);
+ this._visibleViewItems.set(download, viewItem);
+ let viewItemController = new DownloadsViewItemController(download);
+ this._controllersForElements.set(element, viewItemController);
if (aNewest) {
this.richListBox.insertBefore(element, this.richListBox.firstChild);
} else {
@@ -927,17 +926,17 @@ const DownloadsView = {
/**
* Removes the view item associated with the specified data item.
*/
- _removeViewItem: function DV_removeViewItem(aDataItem)
- {
+ _removeViewItem(download) {
DownloadsCommon.log("Removing a DownloadsViewItem from the downloads list.");
- let element = this.getViewItem(aDataItem)._element;
+ let element = this._visibleViewItems.get(download).element;
let previousSelectedIndex = this.richListBox.selectedIndex;
this.richListBox.removeChild(element);
if (previousSelectedIndex != -1) {
this.richListBox.selectedIndex = Math.min(previousSelectedIndex,
this.richListBox.itemCount - 1);
}
- delete this._viewItems[aDataItem.downloadGuid];
+ this._visibleViewItems.delete(download);
+ this._controllersForElements.delete(element);
},
//////////////////////////////////////////////////////////////////////////////
@@ -959,7 +958,7 @@ const DownloadsView = {
while (target.nodeName != "richlistitem") {
target = target.parentNode;
}
- new DownloadsViewItemController(target).doCommand(aCommand);
+ DownloadsView.controllerForElement(target).doCommand(aCommand);
},
onDownloadClick: function DV_onDownloadClick(aEvent)
@@ -1038,8 +1037,9 @@ const DownloadsView = {
return;
}
- let controller = new DownloadsViewItemController(element);
- let localFile = controller.dataItem.localFile;
+ // We must check for existence synchronously because this is a DOM event.
+ let localFile = new FileUtils.File(DownloadsView.controllerForElement(element)
+ .download.target.path);
if (!localFile.exists()) {
return;
}
@@ -1065,259 +1065,39 @@ XPCOMUtils.defineConstant(this, "DownloadsView", DownloadsView);
* Builds and updates a single item in the downloads list widget, responding to
* changes in the download state and real-time data.
*
- * @param aDataItem
- * DownloadsDataItem to be associated with the view item.
+ * @param download
+ * Download object to be associated with the view item.
* @param aElement
* XUL element corresponding to the single download item in the view.
*/
-function DownloadsViewItem(aDataItem, aElement)
-{
- this._element = aElement;
- this.dataItem = aDataItem;
-
- this.lastEstimatedSecondsLeft = Infinity;
-
- // Set the URI that represents the correct icon for the target file. As soon
- // as bug 239948 comment 12 is handled, the "file" property will be always a
- // file URL rather than a file name. At that point we should remove the "//"
- // (double slash) from the icon URI specification (see test_moz_icon_uri.js).
- this.image = "moz-icon://" + this.dataItem.file + "?size=32";
-
- let s = DownloadsCommon.strings;
- let [displayHost, fullHost] =
- DownloadUtils.getURIHost(this.dataItem.referrer || this.dataItem.uri);
-
- let attributes = {
- "type": "download",
- "class": "download-state",
- "id": "downloadsItem_" + this.dataItem.downloadGuid,
- "downloadGuid": this.dataItem.downloadGuid,
- "state": this.dataItem.state,
- "progress": this.dataItem.inProgress ? this.dataItem.percentComplete : 100,
- "displayName": this.dataItem.target,
- "extendedDisplayName": s.statusSeparator(this.dataItem.target, displayHost),
- "extendedDisplayNameTip": s.statusSeparator(this.dataItem.target, fullHost),
- "image": this.image
- };
-
- for (let attributeName in attributes) {
- this._element.setAttribute(attributeName, attributes[attributeName]);
- }
+function DownloadsViewItem(download, aElement) {
+ this.download = download;
+
+ this.element = aElement;
+ this.element._shell = this;
- // Initialize more complex attributes.
- this._updateProgress();
- this._updateStatusLine();
- this.verifyTargetExists();
+ this.element.setAttribute("type", "download");
+ this.element.classList.add("download-state");
+
+ this._updateState();
}
DownloadsViewItem.prototype = {
- /**
- * The DownloadDataItem associated with this view item.
- */
- dataItem: null,
+ __proto__: DownloadsViewUI.DownloadElementShell.prototype,
/**
* The XUL element corresponding to the associated richlistbox item.
*/
_element: null,
- /**
- * The inner XUL element for the progress bar, or null if not available.
- */
- _progressElement: null,
-
- //////////////////////////////////////////////////////////////////////////////
- //// Callback functions from DownloadsData
-
- /**
- * Called when the download state might have changed. Sometimes the state of
- * the download might be the same as before, if the data layer received
- * multiple events for the same download.
- */
- onStateChange: function DVI_onStateChange(aOldState)
- {
- // If a download just finished successfully, it means that the target file
- // now exists and we can extract its specific icon. To ensure that the icon
- // is reloaded, we must change the URI used by the XUL image element, for
- // example by adding a query parameter. Since this URI has a "moz-icon"
- // scheme, this only works if we add one of the parameters explicitly
- // supported by the nsIMozIconURI interface.
- if (aOldState != Ci.nsIDownloadManager.DOWNLOAD_FINISHED &&
- aOldState != this.dataItem.state) {
- this._element.setAttribute("image", this.image + "&state=normal");
-
- // We assume the existence of the target of a download that just completed
- // successfully, without checking the condition in the background. If the
- // panel is already open, this will take effect immediately. If the panel
- // is opened later, a new background existence check will be performed.
- this._element.setAttribute("exists", "true");
- }
-
- // Update the user interface after switching states.
- this._element.setAttribute("state", this.dataItem.state);
- this._updateProgress();
- this._updateStatusLine();
+ onStateChanged() {
+ this.element.setAttribute("image", this.image);
+ this.element.setAttribute("state",
+ DownloadsCommon.stateOfDownload(this.download));
},
- /**
- * Called when the download progress has changed.
- */
- onProgressChange: function DVI_onProgressChange() {
+ onChanged() {
this._updateProgress();
- this._updateStatusLine();
- },
-
- //////////////////////////////////////////////////////////////////////////////
- //// Functions for updating the user interface
-
- /**
- * Updates the progress bar.
- */
- _updateProgress: function DVI_updateProgress() {
- if (this.dataItem.starting) {
- // Before the download starts, the progress meter has its initial value.
- this._element.setAttribute("progressmode", "normal");
- this._element.setAttribute("progress", "0");
- } else if (this.dataItem.state == Ci.nsIDownloadManager.DOWNLOAD_SCANNING ||
- this.dataItem.percentComplete == -1) {
- // We might not know the progress of a running download, and we don't know
- // the remaining time during the malware scanning phase.
- this._element.setAttribute("progressmode", "undetermined");
- } else {
- // This is a running download of which we know the progress.
- this._element.setAttribute("progressmode", "normal");
- this._element.setAttribute("progress", this.dataItem.percentComplete);
- }
-
- // Find the progress element as soon as the download binding is accessible.
- if (!this._progressElement) {
- this._progressElement =
- document.getAnonymousElementByAttribute(this._element, "anonid",
- "progressmeter");
- }
-
- // Dispatch the ValueChange event for accessibility, if possible.
- if (this._progressElement) {
- let event = document.createEvent("Events");
- event.initEvent("ValueChange", true, true);
- this._progressElement.dispatchEvent(event);
- }
- },
-
- /**
- * Updates the main status line, including bytes transferred, bytes total,
- * download rate, and time remaining.
- */
- _updateStatusLine: function DVI_updateStatusLine() {
- const nsIDM = Ci.nsIDownloadManager;
-
- let status = "";
- let statusTip = "";
-
- if (this.dataItem.paused) {
- let transfer = DownloadUtils.getTransferTotal(this.dataItem.currBytes,
- this.dataItem.maxBytes);
-
- // We use the same XUL label to display both the state and the amount
- // transferred, for example "Paused - 1.1 MB".
- status = DownloadsCommon.strings.statusSeparatorBeforeNumber(
- DownloadsCommon.strings.statePaused,
- transfer);
- } else if (this.dataItem.state == nsIDM.DOWNLOAD_DOWNLOADING) {
- // We don't show the rate for each download in order to reduce clutter.
- // The remaining time per download is likely enough information for the
- // panel.
- [status] =
- DownloadUtils.getDownloadStatusNoRate(this.dataItem.currBytes,
- this.dataItem.maxBytes,
- this.dataItem.speed,
- this.lastEstimatedSecondsLeft);
-
- // We are, however, OK with displaying the rate in the tooltip.
- let newEstimatedSecondsLeft;
- [statusTip, newEstimatedSecondsLeft] =
- DownloadUtils.getDownloadStatus(this.dataItem.currBytes,
- this.dataItem.maxBytes,
- this.dataItem.speed,
- this.lastEstimatedSecondsLeft);
- this.lastEstimatedSecondsLeft = newEstimatedSecondsLeft;
- } else if (this.dataItem.starting) {
- status = DownloadsCommon.strings.stateStarting;
- } else if (this.dataItem.state == nsIDM.DOWNLOAD_SCANNING) {
- status = DownloadsCommon.strings.stateScanning;
- } else if (!this.dataItem.inProgress) {
- let stateLabel = function () {
- let s = DownloadsCommon.strings;
- switch (this.dataItem.state) {
- case nsIDM.DOWNLOAD_FAILED: return s.stateFailed;
- case nsIDM.DOWNLOAD_CANCELED: return s.stateCanceled;
- case nsIDM.DOWNLOAD_BLOCKED_PARENTAL: return s.stateBlockedParentalControls;
- case nsIDM.DOWNLOAD_BLOCKED_POLICY: return s.stateBlockedPolicy;
- case nsIDM.DOWNLOAD_DIRTY: return s.stateDirty;
- case nsIDM.DOWNLOAD_FINISHED: return this._fileSizeText;
- }
- return null;
- }.apply(this);
-
- let [displayHost, fullHost] =
- DownloadUtils.getURIHost(this.dataItem.referrer || this.dataItem.uri);
-
- let end = new Date(this.dataItem.endTime);
- let [displayDate, fullDate] = DownloadUtils.getReadableDates(end);
-
- // We use the same XUL label to display the state, the host name, and the
- // end time, for example "Canceled - 222.net - 11:15" or "1.1 MB -
- // website2.com - Yesterday". We show the full host and the complete date
- // in the tooltip.
- let firstPart = DownloadsCommon.strings.statusSeparator(stateLabel,
- displayHost);
- status = DownloadsCommon.strings.statusSeparator(firstPart, displayDate);
- statusTip = DownloadsCommon.strings.statusSeparator(fullHost, fullDate);
- }
-
- this._element.setAttribute("status", status);
- this._element.setAttribute("statusTip", statusTip || status);
- },
-
- /**
- * Localized string representing the total size of completed downloads, for
- * example "1.5 MB" or "Unknown size".
- */
- get _fileSizeText()
- {
- // Display the file size, but show "Unknown" for negative sizes.
- let fileSize = this.dataItem.maxBytes;
- if (fileSize < 0) {
- return DownloadsCommon.strings.sizeUnknown;
- }
- let [size, unit] = DownloadUtils.convertByteUnits(fileSize);
- return DownloadsCommon.strings.sizeWithUnits(size, unit);
- },
-
- //////////////////////////////////////////////////////////////////////////////
- //// Functions called by the panel
-
- /**
- * Starts checking whether the target file of a finished download is still
- * available on disk, and sets an attribute that controls how the item is
- * presented visually.
- *
- * The existence check is executed on a background thread.
- */
- verifyTargetExists: function DVI_verifyTargetExists() {
- // We don't need to check if the download is not finished successfully.
- if (!this.dataItem.openable) {
- return;
- }
-
- OS.File.exists(this.dataItem.localFile.path).then(
- function DVI_RTE_onSuccess(aExists) {
- if (aExists) {
- this._element.setAttribute("exists", "true");
- } else {
- this._element.removeAttribute("exists");
- }
- }.bind(this), Cu.reportError);
},
};
@@ -1372,8 +1152,8 @@ const DownloadsViewController = {
// Other commands are selection-specific.
let element = DownloadsView.richListBox.selectedItem;
- return element &&
- new DownloadsViewItemController(element).isCommandEnabled(aCommand);
+ return element && DownloadsView.controllerForElement(element)
+ .isCommandEnabled(aCommand);
},
doCommand: function DVC_doCommand(aCommand)
@@ -1388,7 +1168,7 @@ const DownloadsViewController = {
let element = DownloadsView.richListBox.selectedItem;
if (element) {
// The doCommand function also checks if the command is enabled.
- new DownloadsViewItemController(element).doCommand(aCommand);
+ DownloadsView.controllerForElement(element).doCommand(aCommand);
}
},
@@ -1428,36 +1208,41 @@ XPCOMUtils.defineConstant(this, "DownloadsViewController", DownloadsViewControll
* Handles all the user interaction events, in particular the "commands",
* related to a single item in the downloads list widgets.
*/
-function DownloadsViewItemController(aElement) {
- let downloadGuid = aElement.getAttribute("downloadGuid");
- this.dataItem = DownloadsCommon.getData(window).dataItems[downloadGuid];
+function DownloadsViewItemController(download) {
+ this.download = download;
}
DownloadsViewItemController.prototype = {
- //////////////////////////////////////////////////////////////////////////////
- //// Command dispatching
-
- /**
- * The DownloadDataItem controlled by this object.
- */
- dataItem: null,
-
isCommandEnabled: function DVIC_isCommandEnabled(aCommand)
{
switch (aCommand) {
case "downloadsCmd_open": {
- return this.dataItem.openable && this.dataItem.localFile.exists();
+ if (!this.download.succeeded) {
+ return false;
+ }
+
+ let file = new FileUtils.File(this.download.target.path);
+ return file.exists();
}
case "downloadsCmd_show": {
- return this.dataItem.localFile.exists() ||
- this.dataItem.partFile.exists();
+ let file = new FileUtils.File(this.download.target.path);
+ if (file.exists()) {
+ return true;
+ }
+
+ if (!this.download.target.partFilePath) {
+ return false;
+ }
+
+ let partFile = new FileUtils.File(this.download.target.partFilePath);
+ return partFile.exists();
}
case "downloadsCmd_pauseResume":
- return this.dataItem.inProgress && this.dataItem.resumable;
+ return this.download.hasPartialData && !this.download.error;
case "downloadsCmd_retry":
- return this.dataItem.canRetry;
+ return this.download.canceled || this.download.error;
case "downloadsCmd_openReferrer":
- return !!this.dataItem.referrer;
+ return !!this.download.source.referrer;
case "cmd_delete":
case "downloadsCmd_cancel":
case "downloadsCmd_copyLocation":
@@ -1485,21 +1270,21 @@ DownloadsViewItemController.prototype = {
commands: {
cmd_delete: function DVIC_cmd_delete()
{
- Downloads.getList(Downloads.ALL)
- .then(list => list.remove(this.dataItem._download))
- .then(() => this.dataItem._download.finalize(true))
- .catch(Cu.reportError);
- PlacesUtils.bhistory.removePage(NetUtil.newURI(this.dataItem.uri));
+ DownloadsCommon.removeAndFinalizeDownload(this.download);
+ PlacesUtils.bhistory.removePage(
+ NetUtil.newURI(this.download.source.url));
},
downloadsCmd_cancel: function DVIC_downloadsCmd_cancel()
{
- this.dataItem.cancel();
+ this.download.cancel().catch(() => {});
+ this.download.removePartialData().catch(Cu.reportError);
},
downloadsCmd_open: function DVIC_downloadsCmd_open()
{
- this.dataItem.openLocalFile(window);
+ this.download.launch().catch(Cu.reportError);
+
// We explicitly close the panel here to give the user the feedback that
// their click has been received, and we're handling the action.
// Otherwise, we'd have to wait for the file-type handler to execute
@@ -1510,7 +1295,8 @@ DownloadsViewItemController.prototype = {
downloadsCmd_show: function DVIC_downloadsCmd_show()
{
- this.dataItem.showLocalFile();
+ let file = new FileUtils.File(this.download.target.path);
+ DownloadsCommon.showDownloadedFile(file);
// We explicitly close the panel here to give the user the feedback that
// their click has been received, and we're handling the action.
@@ -1522,24 +1308,28 @@ DownloadsViewItemController.prototype = {
downloadsCmd_pauseResume: function DVIC_downloadsCmd_pauseResume()
{
- this.dataItem.togglePauseResume();
+ if (this.download.stopped) {
+ this.download.start();
+ } else {
+ this.download.cancel();
+ }
},
downloadsCmd_retry: function DVIC_downloadsCmd_retry()
{
- this.dataItem.retry();
+ this.download.start().catch(() => {});
},
downloadsCmd_openReferrer: function DVIC_downloadsCmd_openReferrer()
{
- openURL(this.dataItem.referrer);
+ openURL(this.download.source.referrer);
},
downloadsCmd_copyLocation: function DVIC_downloadsCmd_copyLocation()
{
let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"]
.getService(Ci.nsIClipboardHelper);
- clipboard.copyString(this.dataItem.uri, document);
+ clipboard.copyString(this.download.source.url, document);
},
downloadsCmd_doDefault: function DVIC_downloadsCmd_doDefault()
@@ -1548,7 +1338,7 @@ DownloadsViewItemController.prototype = {
// Determine the default command for the current item.
let defaultCommand = function () {
- switch (this.dataItem.state) {
+ switch (DownloadsCommon.stateOfDownload(this.download)) {
case nsIDM.DOWNLOAD_NOTSTARTED: return "downloadsCmd_cancel";
case nsIDM.DOWNLOAD_FINISHED: return "downloadsCmd_open";
case nsIDM.DOWNLOAD_FAILED: return "downloadsCmd_retry";
diff --git a/application/palemoon/components/downloads/moz.build b/application/palemoon/components/downloads/moz.build
index 61d8c0f62..abfaab7df 100644
--- a/application/palemoon/components/downloads/moz.build
+++ b/application/palemoon/components/downloads/moz.build
@@ -15,6 +15,7 @@ EXTRA_COMPONENTS += [
EXTRA_JS_MODULES += [
'DownloadsLogger.jsm',
'DownloadsTaskbar.jsm',
+ 'DownloadsViewUI.jsm',
]
EXTRA_PP_JS_MODULES += [
diff --git a/application/palemoon/components/nsBrowserGlue.js b/application/palemoon/components/nsBrowserGlue.js
index f0a7aa22a..ad48dab29 100644
--- a/application/palemoon/components/nsBrowserGlue.js
+++ b/application/palemoon/components/nsBrowserGlue.js
@@ -552,14 +552,6 @@ BrowserGlue.prototype = {
this._showPlacesLockedNotificationBox();
}
- // If there are plugins installed that are outdated, and the user hasn't
- // been warned about them yet, open the plugins update page.
- // Pale Moon: disable this functionality, people are already notified
- // if they visit a page with an outdated plugin, and they can check
- // properly from the plugins page as well.
-// if (Services.prefs.getBoolPref(PREF_PLUGINS_NOTIFYUSER))
-// this._showPluginUpdatePage();
-
// For any add-ons that were installed disabled and can be enabled offer
// them to the user.
let changedIDs = AddonManager.getStartupChanges(AddonManager.STARTUP_CHANGE_INSTALLED);
diff --git a/application/palemoon/components/places/content/places.js b/application/palemoon/components/places/content/places.js
index a94193823..40dbcb9b8 100644
--- a/application/palemoon/components/places/content/places.js
+++ b/application/palemoon/components/places/content/places.js
@@ -491,7 +491,7 @@ var PlacesOrganizer = {
Task.spawn(function() {
try {
- yield BookmarkJSONUtils.importFromFile(aFile, true);
+ yield BookmarkJSONUtils.importFromFile(aFile.path, true);
} catch(ex) {
PlacesOrganizer._showErrorAlert(PlacesUIUtils.getString("bookmarksRestoreParseError"));
}
@@ -519,7 +519,7 @@ var PlacesOrganizer = {
let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
let fpCallback = function fpCallback_done(aResult) {
if (aResult != Ci.nsIFilePicker.returnCancel) {
- BookmarkJSONUtils.exportToFile(fp.file);
+ BookmarkJSONUtils.exportToFile(fp.file.path);
}
};
diff --git a/application/palemoon/components/preferences/advanced.xul b/application/palemoon/components/preferences/advanced.xul
index 3bd5becb3..34998c1b8 100644
--- a/application/palemoon/components/preferences/advanced.xul
+++ b/application/palemoon/components/preferences/advanced.xul
@@ -27,10 +27,7 @@
<!--XXX button prefs -->
<!-- General tab -->
-<!-- Pale Moon: remove accessibility features, they confuse people anyway -->
-<!-- <preference id="accessibility.browsewithcaret" name="accessibility.browsewithcaret" type="bool"/> -->
<preference id="accessibility.typeaheadfind" name="accessibility.typeaheadfind" type="bool"/>
-<!-- <preference id="accessibility.blockautorefresh" name="accessibility.blockautorefresh" type="bool"/> -->
<preference id="general.autoScroll" name="general.autoScroll" type="bool"/>
<preference id="general.smoothScroll" name="general.smoothScroll" type="bool"/>
@@ -51,8 +48,8 @@
type="bool"/>
#endif
<preference id="pref.general.compatmode" name="general.useragent.compatMode" type="int"/>
-
- <!-- Data Choices tab -->
+
+ <preference id="pref.general.captiveportal" name="network.captive-portal-service.enabled" type="bool"/>
<!-- Network tab -->
<preference id="browser.cache.disk.capacity" name="browser.cache.disk.capacity" type="int"/>
@@ -136,22 +133,13 @@
<tabpanel id="generalPanel" orient="vertical">
<!-- Accessibility -->
-<!-- Pale Moon: remove accessibility features, they confuse people anyway -->
<groupbox id="accessibilityGroup" align="start">
<caption label="&accessibility.label;"/>
-<!-- <checkbox id="useCursorNavigation"
- label="&useCursorNavigation.label;"
- accesskey="&useCursorNavigation.accesskey;"
- preference="accessibility.browsewithcaret"/> -->
<checkbox id="searchStartTyping"
label="&searchStartTyping.label;"
accesskey="&searchStartTyping.accesskey;"
preference="accessibility.typeaheadfind"/>
-<!-- <checkbox id="blockAutoRefresh"
- label="&blockAutoRefresh.label;"
- accesskey="&blockAutoRefresh.accesskey;"
- preference="accessibility.blockautorefresh"/> -->
</groupbox>
<!-- Browsing -->
@@ -193,6 +181,7 @@
</hbox>
</groupbox>
#endif
+ <!-- User Agent compatibility -->
<groupbox id="UACompatGroup" orient="vertical">
<caption label="&UACompatGroup.label;"/>
<hbox align="center">
@@ -206,6 +195,15 @@
</menulist>
</hbox>
</groupbox>
+
+ <!-- Captive portal detection -->
+ <groupbox id="captivePortalGroup" orient="vertical">
+ <caption label="&captivePortalGroup.label;"/>
+ <checkbox id="captivePortalDetect"
+ label="&captivePortalDetect.label;"
+ preference="pref.general.captiveportal"/>
+ </groupbox>
+
</tabpanel>
<!-- Network -->
diff --git a/application/palemoon/components/preferences/connection.js b/application/palemoon/components/preferences/connection.js
index c1dd1bb6d..da038c925 100644
--- a/application/palemoon/components/preferences/connection.js
+++ b/application/palemoon/components/preferences/connection.js
@@ -63,7 +63,7 @@ var gConnectionsDialog = {
autologinProxyPref.disabled = proxyTypePref.value == 0;
var noProxiesPref = document.getElementById("network.proxy.no_proxies_on");
- noProxiesPref.disabled = proxyTypePref.value != 1;
+ noProxiesPref.disabled = proxyTypePref.value == 0;
var autoconfigURLPref = document.getElementById("network.proxy.autoconfig_url");
autoconfigURLPref.disabled = proxyTypePref.value != 2;
diff --git a/application/palemoon/components/preferences/security.xul b/application/palemoon/components/preferences/security.xul
index b12946f2a..bc1625275 100644
--- a/application/palemoon/components/preferences/security.xul
+++ b/application/palemoon/components/preferences/security.xul
@@ -43,8 +43,8 @@
<!-- Security Protocols -->
- <preference id="network.stricttransportsecurity.preloadlist"
- name="network.stricttransportsecurity.preloadlist"
+ <preference id="network.stricttransportsecurity.enabled"
+ name="network.stricttransportsecurity.enabled"
type="bool"/>
<preference id="security.cert_pinning.enforcement_level"
name="security.cert_pinning.enforcement_level"
@@ -146,7 +146,7 @@
<checkbox id="enableHSTS"
label="&enableHSTS.label;"
accesskey="&enableHSTS.accesskey;"
- preference="network.stricttransportsecurity.preloadlist" />
+ preference="network.stricttransportsecurity.enabled" />
<checkbox id="enableHPKP"
label="&enableHPKP.label;"
accesskey="&enableHPKP.accesskey;"
diff --git a/application/palemoon/config/version.txt b/application/palemoon/config/version.txt
index 4efefb316..136b56ea8 100644
--- a/application/palemoon/config/version.txt
+++ b/application/palemoon/config/version.txt
@@ -1 +1 @@
-28.3.0a1 \ No newline at end of file
+28.4.0a1 \ No newline at end of file
diff --git a/application/palemoon/installer/package-manifest.in b/application/palemoon/installer/package-manifest.in
index a218a3487..1247d3171 100644
--- a/application/palemoon/installer/package-manifest.in
+++ b/application/palemoon/installer/package-manifest.in
@@ -59,8 +59,8 @@
#ifdef XP_WIN32
@BINPATH@/uninstall/helper.exe
#endif
-#ifdef MOZ_UPDATER
@RESPATH@/update.locale
+#ifdef MOZ_UPDATER
@RESPATH@/updater.ini
#endif
diff --git a/application/palemoon/locales/en-US/chrome/browser/preferences/advanced.dtd b/application/palemoon/locales/en-US/chrome/browser/preferences/advanced.dtd
index 6ef29c680..dcb7b0e90 100644
--- a/application/palemoon/locales/en-US/chrome/browser/preferences/advanced.dtd
+++ b/application/palemoon/locales/en-US/chrome/browser/preferences/advanced.dtd
@@ -33,6 +33,15 @@
<!ENTITY setDefault.accesskey "d">
<!ENTITY isDefault.label "&brandShortName; is currently your default browser">
+<!ENTITY UACompatGroup.label "Compatibility">
+<!ENTITY UACompat.label "User Agent Mode:">
+<!ENTITY UACompat.Native "Native">
+<!ENTITY UACompat.Gecko "Gecko Compatibility">
+<!ENTITY UACompat.Firefox "Firefox Compatibility">
+
+<!ENTITY captivePortalGroup.label "Captive portals">
+<!ENTITY captivePortalDetect.label "Detect restricted network access">
+
<!ENTITY dataChoicesTab.label "Data Choices">
<!ENTITY crashReporterSection.label "Crash Reporter">
@@ -126,12 +135,6 @@
<!ENTITY viewSecurityDevices.label "Security Devices">
<!ENTITY viewSecurityDevices.accesskey "y">
-<!ENTITY UACompatGroup.label "Compatibility">
-<!ENTITY UACompat.label "User Agent Mode:">
-<!ENTITY UACompat.Native "Native">
-<!ENTITY UACompat.Gecko "Gecko Compatibility">
-<!ENTITY UACompat.Firefox "Firefox Compatibility">
-
<!ENTITY scrollparamTab.label "Scrolling">
<!ENTITY smoothscroll.explain.label "The parameters below only have an effect if smooth scrolling is enabled overall with the checkbox above.">
<!ENTITY smoothscroll.to "to">
diff --git a/application/palemoon/modules/FormSubmitObserver.jsm b/application/palemoon/modules/FormSubmitObserver.jsm
index e4d3e765e..6b2ea3c84 100644
--- a/application/palemoon/modules/FormSubmitObserver.jsm
+++ b/application/palemoon/modules/FormSubmitObserver.jsm
@@ -42,10 +42,10 @@ FormSubmitObserver.prototype =
{
this._content = aWindow;
this._tab = aTabChildGlobal;
- this._mm =
- this._content.QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIDocShell)
- .sameTypeRootTreeItem
+ this._mm =
+ this._content.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDocShell)
+ .sameTypeRootTreeItem
.QueryInterface(Ci.nsIDocShell)
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIContentFrameMessageManager);
@@ -104,13 +104,13 @@ FormSubmitObserver.prototype =
return;
}
- // Insure that this is the FormSubmitObserver associated with the form
+ // Ensure that this is the FormSubmitObserver associated with the
// element / window this notification is about.
- if (this._content != aFormElement.ownerDocument.defaultView.top.document.defaultView) {
+ let element = aInvalidElements.queryElementAt(0, Ci.nsISupports);
+ if (this._content != element.ownerGlobal.top.document.defaultView) {
return;
}
- let element = aInvalidElements.queryElementAt(0, Ci.nsISupports);
if (!(element instanceof HTMLInputElement ||
element instanceof HTMLTextAreaElement ||
element instanceof HTMLSelectElement ||
@@ -118,6 +118,9 @@ FormSubmitObserver.prototype =
return;
}
+ // Update validation message before showing notification
+ this._validationMessage = element.validationMessage;
+
// Don't connect up to the same element more than once.
if (this._element == element) {
this._showPopup(element);
@@ -127,8 +130,6 @@ FormSubmitObserver.prototype =
element.focus();
- this._validationMessage = element.validationMessage;
-
// Watch for input changes which may change the validation message.
element.addEventListener("input", this, false);
@@ -142,7 +143,7 @@ FormSubmitObserver.prototype =
/*
* Internal
*/
-
+
/*
* Handles input changes on the form element we've associated a popup
* with. Updates the validation message or closes the popup if form data
@@ -189,18 +190,17 @@ FormSubmitObserver.prototype =
// Note, this is relative to the browser and needs to be translated
// in chrome.
- panelData.contentRect = this._msgRect(aElement);
+ panelData.contentRect = BrowserUtils.getElementBoundingRect(aElement);
// We want to show the popup at the middle of checkbox and radio buttons
// and where the content begin for the other elements.
let offset = 0;
- let position = "";
if (aElement.tagName == 'INPUT' &&
(aElement.type == 'radio' || aElement.type == 'checkbox')) {
panelData.position = "bottomcenter topleft";
} else {
- let win = aElement.ownerDocument.defaultView;
+ let win = aElement.ownerGlobal;
let style = win.getComputedStyle(aElement, null);
if (style.direction == 'rtl') {
offset = parseInt(style.paddingRight) + parseInt(style.borderRightWidth);
@@ -218,8 +218,8 @@ FormSubmitObserver.prototype =
this._mm.sendAsyncMessage("FormValidation:HidePopup", {});
},
- _getWindowUtils: function () {
- return this._content.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
+ _getWindowUtils: function () {
+ return this._content.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
},
_isRootDocumentEvent: function (aEvent) {
@@ -231,21 +231,5 @@ FormSubmitObserver.prototype =
(target.ownerDocument && target.ownerDocument == this._content.document));
},
- /*
- * Return a message manager rect for the element's bounding client rect
- * in top level browser coords.
- */
- _msgRect: function (aElement) {
- let domRect = aElement.getBoundingClientRect();
- let zoomFactor = this._getWindowUtils().fullZoom;
- let { offsetX, offsetY } = BrowserUtils.offsetToTopLevelWindow(this._content, aElement);
- return {
- left: (domRect.left + offsetX) * zoomFactor,
- top: (domRect.top + offsetY) * zoomFactor,
- width: domRect.width * zoomFactor,
- height: domRect.height * zoomFactor
- };
- },
-
QueryInterface : XPCOMUtils.generateQI([Ci.nsIFormSubmitObserver])
};
diff --git a/application/palemoon/modules/WindowsPreviewPerTab.jsm b/application/palemoon/modules/WindowsPreviewPerTab.jsm
index 243a00aae..4b5030ad4 100644
--- a/application/palemoon/modules/WindowsPreviewPerTab.jsm
+++ b/application/palemoon/modules/WindowsPreviewPerTab.jsm
@@ -595,6 +595,7 @@ TabWindow.prototype = {
"file", "chrome", "resource", "about"
]),
onLinkIconAvailable: function (aBrowser, aIconURL) {
+ let self = this;
let requestURL = null;
if (aIconURL) {
let shouldRequestFaviconURL = true;
@@ -611,15 +612,15 @@ TabWindow.prototype = {
let isDefaultFavicon = !requestURL;
getFaviconAsImage(
requestURL,
- PrivateBrowsingUtils.isWindowPrivate(this.win),
+ PrivateBrowsingUtils.isWindowPrivate(self.win),
img => {
- let index = this.tabbrowser.browsers.indexOf(aBrowser);
+ let index = self.tabbrowser.browsers.indexOf(aBrowser);
// Only add it if we've found the index and the URI is still the same.
// The tab could have closed, and there's no guarantee the icons
// will have finished fetching 'in order'.
if (index != -1) {
- let tab = this.tabbrowser.tabs[index];
- let preview = this.previews.get(tab);
+ let tab = self.tabbrowser.tabs[index];
+ let preview = self.previews.get(tab);
if (tab.getAttribute("image") == aIconURL ||
(!preview.icon && isDefaultFavicon)) {
preview.icon = img;
diff --git a/application/palemoon/themes/linux/browser.css b/application/palemoon/themes/linux/browser.css
index 516677fe6..b545b06cb 100644
--- a/application/palemoon/themes/linux/browser.css
+++ b/application/palemoon/themes/linux/browser.css
@@ -1781,9 +1781,9 @@ richlistitem[type~="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-blocked");
}
-#TabsToolbar[brighttext] .tab-icon-sound[soundplaying],
-#TabsToolbar[brighttext] .tab-icon-sound[blocked],
-#TabsToolbar[brighttext] .tab-icon-sound[muted] {
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-sound[soundplaying],
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-sound[blocked],
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-sound[muted] {
filter: invert(1);
}
@@ -1827,17 +1827,17 @@ richlistitem[type~="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-blocked");
}
-#TabsToolbar[brighttext] .tab-icon-overlay[soundplaying]:not([selected]):not(:hover),
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-overlay[soundplaying]:not([selected]):not(:hover),
.tab-icon-overlay[soundplaying][selected]:-moz-lwtheme-brighttext:not(:hover) {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-white");
}
-#TabsToolbar[brighttext] .tab-icon-overlay[muted]:not([crashed]):not([selected]):not(:hover),
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-overlay[muted]:not([crashed]):not([selected]):not(:hover),
.tab-icon-overlay[muted][selected]:-moz-lwtheme-brighttext:not(:hover) {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-white-muted");
}
-#TabsToolbar[brighttext] .tab-icon-overlay[blocked]:not([crashed]):not([selected]):not(:hover),
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-overlay[blocked]:not([crashed]):not([selected]):not(:hover),
.tab-icon-overlay[blocked][selected]:-moz-lwtheme-brighttext:not(:hover) {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-white-blocked");
}
diff --git a/application/palemoon/themes/osx/browser.css b/application/palemoon/themes/osx/browser.css
index a7bd683bd..ddf050785 100644
--- a/application/palemoon/themes/osx/browser.css
+++ b/application/palemoon/themes/osx/browser.css
@@ -1844,9 +1844,9 @@ richlistitem[type~="action"][actiontype="switchtab"][selected="true"] > .ac-url-
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-blocked");
}
-#TabsToolbar[brighttext] .tab-icon-sound[soundplaying],
-#TabsToolbar[brighttext] .tab-icon-sound[blocked],
-#TabsToolbar[brighttext] .tab-icon-sound[muted] {
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-sound[soundplaying],
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-sound[blocked],
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-sound[muted] {
filter: invert(1);
}
@@ -1890,17 +1890,17 @@ richlistitem[type~="action"][actiontype="switchtab"][selected="true"] > .ac-url-
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-blocked");
}
-#TabsToolbar[brighttext] .tab-icon-overlay[soundplaying]:not([selected]):not(:hover),
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-overlay[soundplaying]:not([selected]):not(:hover),
.tab-icon-overlay[soundplaying][selected]:-moz-lwtheme-brighttext:not(:hover) {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-white");
}
-#TabsToolbar[brighttext] .tab-icon-overlay[muted]:not([crashed]):not([selected]):not(:hover),
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-overlay[muted]:not([crashed]):not([selected]):not(:hover),
.tab-icon-overlay[muted][selected]:-moz-lwtheme-brighttext:not(:hover) {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-white-muted");
}
-#TabsToolbar[brighttext] .tab-icon-overlay[blocked]:not([crashed]):not([selected]):not(:hover),
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-overlay[blocked]:not([crashed]):not([selected]):not(:hover),
.tab-icon-overlay[blocked][selected]:-moz-lwtheme-brighttext:not(:hover) {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-white-blocked");
}
diff --git a/application/palemoon/themes/windows/Toolbar-glass.png b/application/palemoon/themes/windows/Toolbar-glass.png
new file mode 100644
index 000000000..f8aac2467
--- /dev/null
+++ b/application/palemoon/themes/windows/Toolbar-glass.png
Binary files differ
diff --git a/application/palemoon/themes/windows/Toolbar-glass.svg b/application/palemoon/themes/windows/Toolbar-glass.svg
index 5212e45e7..9feaac251 100644
--- a/application/palemoon/themes/windows/Toolbar-glass.svg
+++ b/application/palemoon/themes/windows/Toolbar-glass.svg
@@ -6,14 +6,14 @@
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
- enable-background="new 0 0 378 38"
- viewBox="0 0 378 38"
- height="38"
- width="378"
- y="0px"
- x="0px"
+ version="1.1"
id="PaleMoonToolbarSVG"
- version="1.1">
+ x="0px"
+ y="0px"
+ width="378"
+ height="38"
+ viewBox="0 0 378 38"
+ enable-background="new 0 0 378 38">
<metadata
id="metadata146">
<rdf:RDF>
@@ -29,1972 +29,3016 @@
<defs
id="defs144">
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.1087088,0,-1.2351844)"
- r="7.1399999"
- fy="14.778796"
- fx="10.529827"
- cy="14.778796"
- cx="10.529827"
+ xlink:href="#linearGradient4635"
id="radialGradient4669"
- xlink:href="#linearGradient4635" />
+ cx="10.529827"
+ cy="14.778796"
+ fx="10.529827"
+ fy="14.778796"
+ r="7.1399999"
+ gradientTransform="matrix(1,0,0,1.1087088,0,-1.2351844)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4635">
<stop
- id="stop4631"
+ style="stop-color:#6198cb;stop-opacity:1"
offset="0"
- style="stop-color:#6198cb;stop-opacity:1" />
+ id="stop4631" />
<stop
- id="stop4633"
+ style="stop-color:#3a78b2;stop-opacity:1"
offset="1"
- style="stop-color:#3a78b2;stop-opacity:1" />
+ id="stop4633" />
</linearGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0853313,0,-3.029369)"
- r="8.7600002"
- fy="38.79744"
- fx="11.063469"
- cy="38.79744"
- cx="11.063469"
+ xlink:href="#linearGradient4635"
id="radialGradient4637"
- xlink:href="#linearGradient4635" />
+ cx="11.063469"
+ cy="38.79744"
+ fx="11.063469"
+ fy="38.79744"
+ r="8.7600002"
+ gradientTransform="matrix(1,0,0,1.0853313,0,-3.029369)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.1003056,0,-1.1335797)"
- r="7.1399999"
- fy="14.552581"
- fx="34.841751"
- cy="14.552581"
- cx="34.841751"
+ xlink:href="#linearGradient4635"
id="radialGradient4677"
- xlink:href="#linearGradient4635" />
+ cx="34.841751"
+ cy="14.552581"
+ fx="34.841751"
+ fy="14.552581"
+ r="7.1399999"
+ gradientTransform="matrix(1,0,0,1.1003056,0,-1.1335797)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.99218759,0,0.09141507)"
- r="7.6799994"
- fy="12.761739"
- fx="58.062626"
- cy="12.761739"
- cx="58.062626"
+ xlink:href="#linearGradient4603"
id="radialGradient4605"
- xlink:href="#linearGradient4603" />
+ cx="58.062626"
+ cy="12.761739"
+ fx="58.062626"
+ fy="12.761739"
+ r="7.6799994"
+ gradientTransform="matrix(1,0,0,0.99218759,0,0.09141507)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4603">
<stop
- id="stop4599"
+ style="stop-color:#e72b1d;stop-opacity:1"
offset="0"
- style="stop-color:#e72b1d;stop-opacity:1" />
+ id="stop4599" />
<stop
- id="stop4601"
+ style="stop-color:#cc4338;stop-opacity:1"
offset="1"
- style="stop-color:#cc4338;stop-opacity:1" />
+ id="stop4601" />
</linearGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0769231,0,-0.86932835)"
- r="7.8000002"
- fy="13.939252"
- fx="79.305222"
- cy="13.939252"
- cx="79.305222"
+ xlink:href="#linearGradient4523-3"
id="radialGradient4525"
- xlink:href="#linearGradient4523-3" />
+ cx="79.305222"
+ cy="13.939252"
+ fx="79.305222"
+ fy="13.939252"
+ r="7.8000002"
+ gradientTransform="matrix(1,0,0,1.0769231,0,-0.86932835)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4523-3">
<stop
- id="stop4519"
+ style="stop-color:#4fb55d;stop-opacity:1"
offset="0"
- style="stop-color:#4fb55d;stop-opacity:1" />
+ id="stop4519" />
<stop
- id="stop4521"
+ style="stop-color:#2d8539;stop-opacity:1"
offset="1"
- style="stop-color:#2d8539;stop-opacity:1" />
+ id="stop4521" />
</linearGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.87507716,0,1.3868386)"
- r="9.5995998"
- fy="12.664675"
- fx="103.23091"
- cy="12.664675"
- cx="103.23091"
+ xlink:href="#linearGradient4527"
id="radialGradient4529"
- xlink:href="#linearGradient4527" />
+ cx="103.23091"
+ cy="12.664675"
+ fx="103.23091"
+ fy="12.664675"
+ r="9.5995998"
+ gradientTransform="matrix(1,0,0,0.87507716,0,1.3868386)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4527">
<stop
- id="stop4523"
+ style="stop-color:#3f6bbd;stop-opacity:1"
offset="0"
- style="stop-color:#3f6bbd;stop-opacity:1" />
+ id="stop4523" />
<stop
- id="stop4525"
+ style="stop-color:#29467b;stop-opacity:1"
offset="1"
- style="stop-color:#29467b;stop-opacity:1" />
+ id="stop4525" />
</linearGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0032611,0,-0.03620244)"
- r="8.3726959"
- fy="16.659737"
- fx="125.30523"
- cy="16.659737"
- cx="125.30523"
+ xlink:href="#linearGradient4707"
id="radialGradient4709"
- xlink:href="#linearGradient4707" />
+ cx="125.30523"
+ cy="16.659737"
+ fx="125.30523"
+ fy="16.659737"
+ r="8.3726959"
+ gradientTransform="matrix(1,0,0,1.0032611,0,-0.03620244)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4707">
<stop
- id="stop4703"
+ style="stop-color:#8c9ba5;stop-opacity:1"
offset="0"
- style="stop-color:#8c9ba5;stop-opacity:1" />
+ id="stop4703" />
<stop
- id="stop4705"
+ style="stop-color:#607480;stop-opacity:1"
offset="1"
- style="stop-color:#607480;stop-opacity:1" />
+ id="stop4705" />
</linearGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.993055,0,0.07848724)"
- r="8.6400051"
- fy="12.784631"
- fx="149.26262"
- cy="12.784631"
- cx="149.26262"
+ xlink:href="#linearGradient4727"
id="radialGradient4729"
- xlink:href="#linearGradient4727" />
+ cx="149.26262"
+ cy="12.784631"
+ fx="149.26262"
+ fy="12.784631"
+ r="8.6400051"
+ gradientTransform="matrix(1,0,0,0.993055,0,0.07848724)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4727">
<stop
- id="stop4723"
+ style="stop-color:#3eb796;stop-opacity:1"
offset="0"
- style="stop-color:#3eb796;stop-opacity:1" />
+ id="stop4723" />
<stop
- id="stop4725"
+ style="stop-color:#31a886;stop-opacity:1"
offset="1"
- style="stop-color:#31a886;stop-opacity:1" />
+ id="stop4725" />
</linearGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.79035186,0,0,0.79508811,-0.14216924,6.9389816e-4)"
- r="9.6007004"
- fy="12.037849"
- fx="466.94476"
- cy="12.037849"
- cx="466.94476"
+ xlink:href="#linearGradient5023"
id="radialGradient5017"
- xlink:href="#linearGradient5023" />
+ cx="466.94476"
+ cy="12.037849"
+ fx="466.94476"
+ fy="12.037849"
+ r="9.6007004"
+ gradientTransform="matrix(0.79035186,0,0,0.79508811,-0.14216924,6.9389816e-4)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient5023">
<stop
- style="stop-color:#c6cdd2;stop-opacity:1"
+ id="stop5019"
offset="0"
- id="stop5019" />
+ style="stop-color:#c6cdd2;stop-opacity:1" />
<stop
- style="stop-color:#9cabb4;stop-opacity:1"
+ id="stop5021"
offset="1"
- id="stop5021" />
+ style="stop-color:#9cabb4;stop-opacity:1" />
</linearGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.87500048,0,1.3876528)"
- r="9.5999947"
- fy="13.746766"
- fx="194.44176"
- cy="13.746766"
- cx="194.44176"
+ xlink:href="#linearGradient4707"
id="radialGradient4793"
- xlink:href="#linearGradient4707" />
+ cx="194.44176"
+ cy="13.746766"
+ fx="194.44176"
+ fy="13.746766"
+ r="9.5999947"
+ gradientTransform="matrix(1,0,0,0.87500048,0,1.3876528)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.87500002,0,1.3876579)"
- r="9.6000004"
- fy="11.101265"
- fx="239.2"
- cy="11.101265"
- cx="239.2"
+ xlink:href="#linearGradient4707"
id="radialGradient4833"
- xlink:href="#linearGradient4707" />
+ cx="239.2"
+ cy="11.101265"
+ fx="239.2"
+ fy="11.101265"
+ r="9.6000004"
+ gradientTransform="matrix(1,0,0,0.87500002,0,1.3876579)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.79274533,0,0,0.78327978,-0.14435628,0.11758726)"
- r="3.5288758"
- fy="12.418613"
- fx="242.0894"
- cy="12.418613"
- cx="242.0894"
+ xlink:href="#linearGradient4707"
id="radialGradient4841"
- xlink:href="#linearGradient4707" />
+ cx="242.0894"
+ cy="12.418613"
+ fx="242.0894"
+ fy="12.418613"
+ r="3.5288758"
+ gradientTransform="matrix(0.79274533,0,0,0.78327978,-0.14435628,0.11758726)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.99992718,0,0.00247197)"
- r="9.7507105"
- fy="31.105829"
- fx="466.39926"
- cy="31.105829"
- cx="466.39926"
+ xlink:href="#linearGradient5037"
id="radialGradient5031"
- xlink:href="#linearGradient5037" />
+ cx="466.39926"
+ cy="31.105829"
+ fx="466.39926"
+ fy="31.105829"
+ r="9.7507105"
+ gradientTransform="matrix(1,0,0,0.99992718,0,0.00247197)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient5037">
<stop
- style="stop-color:#e8e1a1;stop-opacity:1"
+ id="stop5033"
offset="0"
- id="stop5033" />
+ style="stop-color:#e8e1a1;stop-opacity:1" />
<stop
- style="stop-color:#baad3e;stop-opacity:1"
+ id="stop5035"
offset="1"
- id="stop5035" />
+ style="stop-color:#baad3e;stop-opacity:1" />
</linearGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.8160434,0,2.0506693)"
- r="10.35937"
- fy="16.56296"
- fx="217.95329"
- cy="16.56296"
- cx="217.95329"
+ xlink:href="#linearGradient4707"
id="radialGradient4813"
- xlink:href="#linearGradient4707" />
+ cx="217.95329"
+ cy="16.56296"
+ fx="217.95329"
+ fy="16.56296"
+ r="10.35937"
+ gradientTransform="matrix(1,0,0,0.8160434,0,2.0506693)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.9969072,0,0.03528241)"
- r="8.5577164"
- fy="15.840806"
- fx="262.79288"
- cy="15.840806"
- cx="262.79288"
+ xlink:href="#linearGradient4707"
id="radialGradient4861"
- xlink:href="#linearGradient4707" />
+ cx="262.79288"
+ cy="15.840806"
+ fx="262.79288"
+ fy="15.840806"
+ r="8.5577164"
+ gradientTransform="matrix(1,0,0,0.9969072,0,0.03528241)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- r="8.53125"
- fy="14.171478"
- fx="286.58698"
- cy="14.171478"
- cx="286.58698"
+ xlink:href="#linearGradient4707"
id="radialGradient4881"
- xlink:href="#linearGradient4707" />
+ cx="286.58698"
+ cy="14.171478"
+ fx="286.58698"
+ fy="14.171478"
+ r="8.53125"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.4,0,-4.4901397)"
- r="6.09375"
- fy="14.457072"
- fx="308.97141"
- cy="14.457072"
- cx="308.97141"
+ xlink:href="#linearGradient4707"
id="radialGradient4901"
- xlink:href="#linearGradient4707" />
+ cx="308.97141"
+ cy="14.457072"
+ fx="308.97141"
+ fy="14.457072"
+ r="6.09375"
+ gradientTransform="matrix(1,0,0,1.4,0,-4.4901397)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- r="8.53125"
- fy="13.119289"
- fx="331.15933"
- cy="13.119289"
- cx="331.15933"
+ xlink:href="#linearGradient4707"
id="radialGradient4921"
- xlink:href="#linearGradient4707" />
+ cx="331.15933"
+ cy="13.119289"
+ fx="331.15933"
+ fy="13.119289"
+ r="8.53125"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.79035186,0,0,0.15902921,-0.14216924,7.1987363)"
- r="6.09375"
- fy="11.316628"
- fx="353.15076"
- cy="11.316628"
- cx="353.15076"
+ xlink:href="#linearGradient4707"
id="radialGradient4941"
- xlink:href="#linearGradient4707" />
- <radialGradient
- gradientUnits="userSpaceOnUse"
+ cx="353.15076"
+ cy="11.316628"
+ fx="353.15076"
+ fy="11.316628"
r="6.09375"
- fy="11.407905"
- fx="375.97003"
- cy="11.407905"
- cx="375.97003"
- id="radialGradient4949"
+ gradientTransform="matrix(0.79035186,0,0,0.15902921,-0.14216924,7.1987363)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientTransform="matrix(0.79035186,0,0,0.79514603,-0.14216924,3.8580698e-5)"
xlink:href="#linearGradient4707"
- gradientTransform="matrix(0.79035186,0,0,0.79514603,-0.14216924,3.8580698e-5)" />
+ id="radialGradient4949"
+ cx="375.97003"
+ cy="11.407905"
+ fx="375.97003"
+ fy="11.407905"
+ r="6.09375"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.99701325,0,0.03407254)"
- r="8.5350475"
- fy="13.518586"
- fx="400.5007"
- cy="13.518586"
- cx="400.5007"
+ xlink:href="#linearGradient4707"
id="radialGradient4957"
- xlink:href="#linearGradient4707" />
+ cx="400.5007"
+ cy="13.518586"
+ fx="400.5007"
+ fy="13.518586"
+ r="8.5350475"
+ gradientTransform="matrix(1,0,0,0.99701325,0,0.03407254)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.357667,-0.02466618,0.02411975,1.3275908,-149.53429,5.1574131)"
- r="8.53125"
- fy="15.742972"
- fx="417.02075"
- cy="15.742972"
- cx="417.02075"
+ xlink:href="#linearGradient4975"
id="radialGradient4977"
- xlink:href="#linearGradient4975" />
+ cx="417.02075"
+ cy="15.742972"
+ fx="417.02075"
+ fy="15.742972"
+ r="8.53125"
+ gradientTransform="matrix(1.357667,-0.02466618,0.02411975,1.3275908,-149.53429,5.1574131)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4975">
<stop
- id="stop4971"
+ style="stop-color:#f79729;stop-opacity:1"
offset="0"
- style="stop-color:#f79729;stop-opacity:1" />
+ id="stop4971" />
<stop
- id="stop4973"
+ style="stop-color:#d2831f;stop-opacity:1"
offset="1"
- style="stop-color:#d2831f;stop-opacity:1" />
+ id="stop4973" />
</linearGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.71428563,0,3.2333231)"
- r="8.53125"
- fy="11.316628"
- fx="444.33652"
- cy="11.316628"
- cx="444.33652"
+ xlink:href="#linearGradient4707"
id="radialGradient4997"
- xlink:href="#linearGradient4707" />
+ cx="444.33652"
+ cy="11.316628"
+ fx="444.33652"
+ fy="11.316628"
+ r="8.53125"
+ gradientTransform="matrix(1,0,0,0.71428563,0,3.2333231)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- r="7.9746099"
- fy="9"
- fx="134.97461"
- cy="9"
- cx="134.97461"
- gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
- gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient4747"
id="radialGradient4710"
- xlink:href="#linearGradient4747" />
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
+ cx="134.97461"
+ cy="9"
+ fx="134.97461"
+ fy="9"
+ r="7.9746099" />
<linearGradient
id="linearGradient4747">
<stop
- id="stop4743"
+ style="stop-color:#c5b631;stop-opacity:1"
offset="0"
- style="stop-color:#c5b631;stop-opacity:1" />
+ id="stop4743" />
<stop
- id="stop4745"
+ style="stop-color:#baad3e;stop-opacity:1"
offset="1"
- style="stop-color:#baad3e;stop-opacity:1" />
+ id="stop4745" />
</linearGradient>
<radialGradient
- r="7.9746099"
- fy="9.0947113"
- fx="132.6468"
- cy="9.0947113"
- cx="132.6468"
- gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
- gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient5037"
id="radialGradient4712"
- xlink:href="#linearGradient5037" />
- <radialGradient
- r="7.9746099"
- fy="9"
- fx="134.97461"
- cy="9"
- cx="134.97461"
- gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
gradientUnits="userSpaceOnUse"
- id="radialGradient4714"
- xlink:href="#linearGradient4747" />
+ gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
+ cx="132.6468"
+ cy="9.0947113"
+ fx="132.6468"
+ fy="9.0947113"
+ r="7.9746099" />
<radialGradient
+ xlink:href="#linearGradient4747"
+ id="radialGradient4714"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,28.000001,0,-310.09784)"
- r="0.31640625"
- fy="11.485105"
- fx="166.37157"
- cy="11.485105"
- cx="166.37157"
+ gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
+ cx="134.97461"
+ cy="9"
+ fx="134.97461"
+ fy="9"
+ r="7.9746099" />
+ <radialGradient
+ xlink:href="#linearGradient4707"
id="radialGradient4750"
- xlink:href="#linearGradient4707" />
+ cx="166.37157"
+ cy="11.485105"
+ fx="166.37157"
+ fy="11.485105"
+ r="0.31640625"
+ gradientTransform="matrix(1,0,0,28.000001,0,-310.09784)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0032611,0.11563445,22.233158)"
- r="8.3726959"
- fy="16.659737"
- fx="125.30523"
- cy="16.659737"
- cx="125.30523"
+ xlink:href="#linearGradient4832"
id="radialGradient4709-1"
- xlink:href="#linearGradient4832" />
+ cx="125.30523"
+ cy="16.659737"
+ fx="125.30523"
+ fy="16.659737"
+ r="8.3726959"
+ gradientTransform="matrix(1,0,0,1.0032611,0.11563445,22.233158)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4832">
<stop
- style="stop-color:#22e23d;stop-opacity:1"
+ id="stop5029"
offset="0"
- id="stop5029" />
+ style="stop-color:#22e23d;stop-opacity:1" />
<stop
- style="stop-color:#38a748;stop-opacity:1"
+ id="stop4830"
offset="1"
- id="stop4830" />
+ style="stop-color:#38a748;stop-opacity:1" />
</linearGradient>
<filter
- id="filter4883"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter4883">
<feFlood
- id="feFlood4873"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4873" />
<feComposite
- id="feComposite4875"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4875" />
<feGaussianBlur
- id="feGaussianBlur4877"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4877" />
<feOffset
- id="feOffset4879"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4879" />
<feComposite
- id="feComposite4881"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite4881" />
<feColorMatrix
- id="feColorMatrix6673"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6673" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6675"
flood-opacity="1"
- id="feFlood6675" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6677"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6679"
in="composite1"
- id="feGaussianBlur6679" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6681"
dx="2.77556e-017"
- id="feOffset6681" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6683"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter4895"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter4895">
<feFlood
- id="feFlood4885"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4885" />
<feComposite
- id="feComposite4887"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4887" />
<feGaussianBlur
- id="feGaussianBlur4889"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4889" />
<feOffset
- id="feOffset4891"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4891" />
<feComposite
- id="feComposite4893"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite4893" />
<feColorMatrix
- id="feColorMatrix6685"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6685" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6687"
flood-opacity="1"
- id="feFlood6687" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6689"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6691"
in="composite1"
- id="feGaussianBlur6691" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6693"
dx="2.77556e-017"
- id="feOffset6693" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6695"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter4907"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter4907">
<feFlood
- id="feFlood4897"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4897" />
<feComposite
- id="feComposite4899"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4899" />
<feGaussianBlur
- id="feGaussianBlur4901"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4901" />
<feOffset
- id="feOffset4903"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4903" />
<feComposite
- id="feComposite4905"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite4905" />
<feColorMatrix
- id="feColorMatrix6697"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6697" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6699"
flood-opacity="1"
- id="feFlood6699" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6701"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6703"
in="composite1"
- id="feGaussianBlur6703" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6705"
dx="2.77556e-017"
- id="feOffset6705" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6707"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter4919"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter4919">
<feFlood
- id="feFlood4909"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4909" />
<feComposite
- id="feComposite4911"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4911" />
<feGaussianBlur
- id="feGaussianBlur4913"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4913" />
<feOffset
- id="feOffset4915"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4915" />
<feComposite
- id="feComposite4917"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite4917" />
<feColorMatrix
- id="feColorMatrix6709"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6709" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6711"
flood-opacity="1"
- id="feFlood6711" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6713"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6715"
in="composite1"
- id="feGaussianBlur6715" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6717"
dx="2.77556e-017"
- id="feOffset6717" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6719"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter4931"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter4931">
<feFlood
- id="feFlood4921"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4921" />
<feComposite
- id="feComposite4923"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4923" />
<feGaussianBlur
- id="feGaussianBlur4925"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4925" />
<feOffset
- id="feOffset4927"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4927" />
<feComposite
- id="feComposite4929"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite4929" />
<feColorMatrix
- id="feColorMatrix6721"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6721" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6723"
flood-opacity="1"
- id="feFlood6723" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6725"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6727"
in="composite1"
- id="feGaussianBlur6727" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6729"
dx="2.77556e-017"
- id="feOffset6729" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6731"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter4943"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter4943">
<feFlood
- id="feFlood4933"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4933" />
<feComposite
- id="feComposite4935"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4935" />
<feGaussianBlur
- id="feGaussianBlur4937"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4937" />
<feOffset
- id="feOffset4939"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4939" />
<feComposite
- id="feComposite4941"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite4941" />
<feColorMatrix
- id="feColorMatrix6733"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6733" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6735"
flood-opacity="1"
- id="feFlood6735" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6737"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6739"
in="composite1"
- id="feGaussianBlur6739" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6741"
dx="2.77556e-017"
- id="feOffset6741" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6743"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter4955"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter4955">
<feFlood
- id="feFlood4945"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4945" />
<feComposite
- id="feComposite4947"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4947" />
<feGaussianBlur
- id="feGaussianBlur4949"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4949" />
<feOffset
- id="feOffset4951"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4951" />
<feComposite
- id="feComposite4953"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite4953" />
<feColorMatrix
- id="feColorMatrix6745"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6745" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6747"
flood-opacity="1"
- id="feFlood6747" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6749"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6751"
in="composite1"
- id="feGaussianBlur6751" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6753"
dx="2.77556e-017"
- id="feOffset6753" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6755"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter4967"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter4967">
<feFlood
- id="feFlood4957"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4957" />
<feComposite
- id="feComposite4959"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4959" />
<feGaussianBlur
- id="feGaussianBlur4961"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4961" />
<feOffset
- id="feOffset4963"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4963" />
<feComposite
- id="feComposite4965"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite4965" />
<feColorMatrix
- id="feColorMatrix6757"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6757" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6759"
flood-opacity="1"
- id="feFlood6759" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6761"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6763"
in="composite1"
- id="feGaussianBlur6763" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6765"
dx="2.77556e-017"
- id="feOffset6765" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6767"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter4979"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter4979">
<feFlood
- id="feFlood4969"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4969" />
<feComposite
- id="feComposite4971"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4971" />
<feGaussianBlur
- id="feGaussianBlur4973"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4973" />
<feOffset
- id="feOffset4975"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4975" />
<feComposite
- id="feComposite4977"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite4977" />
<feColorMatrix
- id="feColorMatrix6769"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6769" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6771"
flood-opacity="1"
- id="feFlood6771" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6773"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6775"
in="composite1"
- id="feGaussianBlur6775" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6777"
dx="2.77556e-017"
- id="feOffset6777" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6779"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter4991"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter4991">
<feFlood
- id="feFlood4981"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4981" />
<feComposite
- id="feComposite4983"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4983" />
<feGaussianBlur
- id="feGaussianBlur4985"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4985" />
<feOffset
- id="feOffset4987"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4987" />
<feComposite
- id="feComposite4989"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite4989" />
<feColorMatrix
- id="feColorMatrix6781"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6781" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6783"
flood-opacity="1"
- id="feFlood6783" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6785"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6787"
in="composite1"
- id="feGaussianBlur6787" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6789"
dx="2.77556e-017"
- id="feOffset6789" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6791"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5003"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5003">
<feFlood
- id="feFlood4993"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4993" />
<feComposite
- id="feComposite4995"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4995" />
<feGaussianBlur
- id="feGaussianBlur4997"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4997" />
<feOffset
- id="feOffset4999"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4999" />
<feComposite
- id="feComposite5001"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5001" />
<feColorMatrix
- id="feColorMatrix6793"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6793" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6795"
flood-opacity="1"
- id="feFlood6795" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6797"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6799"
in="composite1"
- id="feGaussianBlur6799" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6801"
dx="2.77556e-017"
- id="feOffset6801" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6803"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5015"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5015">
<feFlood
- id="feFlood5005"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5005" />
<feComposite
- id="feComposite5007"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5007" />
<feGaussianBlur
- id="feGaussianBlur5009"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5009" />
<feOffset
- id="feOffset5011"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5011" />
<feComposite
- id="feComposite5013"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5013" />
<feColorMatrix
- id="feColorMatrix6805"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6805" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6807"
flood-opacity="1"
- id="feFlood6807" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6809"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6811"
in="composite1"
- id="feGaussianBlur6811" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6813"
dx="2.77556e-017"
- id="feOffset6813" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6815"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5027"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5027">
<feFlood
- id="feFlood5017"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5017" />
<feComposite
- id="feComposite5019"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5019" />
<feGaussianBlur
- id="feGaussianBlur5021"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5021" />
<feOffset
- id="feOffset5023"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5023" />
<feComposite
- id="feComposite5025"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5025" />
<feColorMatrix
- id="feColorMatrix6817"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6817" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6819"
flood-opacity="1"
- id="feFlood6819" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6821"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6823"
in="composite1"
- id="feGaussianBlur6823" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6825"
dx="2.77556e-017"
- id="feOffset6825" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6827"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5039"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5039">
<feFlood
- id="feFlood5029"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5029" />
<feComposite
- id="feComposite5031"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5031" />
<feGaussianBlur
- id="feGaussianBlur5033"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5033" />
<feOffset
- id="feOffset5035"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5035" />
<feComposite
- id="feComposite5037"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5037" />
<feColorMatrix
- id="feColorMatrix6829"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6829" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6831"
flood-opacity="1"
- id="feFlood6831" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6833"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6835"
in="composite1"
- id="feGaussianBlur6835" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6837"
dx="2.77556e-017"
- id="feOffset6837" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6839"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5051"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5051">
<feFlood
- id="feFlood5041"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5041" />
<feComposite
- id="feComposite5043"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5043" />
<feGaussianBlur
- id="feGaussianBlur5045"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5045" />
<feOffset
- id="feOffset5047"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5047" />
<feComposite
- id="feComposite5049"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5049" />
<feColorMatrix
- id="feColorMatrix6841"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6841" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6843"
flood-opacity="1"
- id="feFlood6843" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6845"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6847"
in="composite1"
- id="feGaussianBlur6847" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6849"
dx="2.77556e-017"
- id="feOffset6849" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6851"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5063"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5063">
<feFlood
- id="feFlood5053"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5053" />
<feComposite
- id="feComposite5055"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5055" />
<feGaussianBlur
- id="feGaussianBlur5057"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5057" />
<feOffset
- id="feOffset5059"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5059" />
<feComposite
- id="feComposite5061"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5061" />
<feColorMatrix
- id="feColorMatrix6853"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6853" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6855"
flood-opacity="1"
- id="feFlood6855" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6857"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6859"
in="composite1"
- id="feGaussianBlur6859" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6861"
dx="2.77556e-017"
- id="feOffset6861" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6863"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5075"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5075">
<feFlood
- id="feFlood5065"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5065" />
<feComposite
- id="feComposite5067"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5067" />
<feGaussianBlur
- id="feGaussianBlur5069"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5069" />
<feOffset
- id="feOffset5071"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5071" />
<feComposite
- id="feComposite5073"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5073" />
<feColorMatrix
- id="feColorMatrix6865"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6865" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6867"
flood-opacity="1"
- id="feFlood6867" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6869"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6871"
in="composite1"
- id="feGaussianBlur6871" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6873"
dx="2.77556e-017"
- id="feOffset6873" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6875"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5087"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5087">
<feFlood
- id="feFlood5077"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5077" />
<feComposite
- id="feComposite5079"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5079" />
<feGaussianBlur
- id="feGaussianBlur5081"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5081" />
<feOffset
- id="feOffset5083"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5083" />
<feComposite
- id="feComposite5085"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5085" />
<feColorMatrix
- id="feColorMatrix6877"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6877" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6879"
flood-opacity="1"
- id="feFlood6879" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6881"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6883"
in="composite1"
- id="feGaussianBlur6883" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6885"
dx="2.77556e-017"
- id="feOffset6885" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6887"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5099"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5099">
<feFlood
- id="feFlood5089"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5089" />
<feComposite
- id="feComposite5091"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5091" />
<feGaussianBlur
- id="feGaussianBlur5093"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5093" />
<feOffset
- id="feOffset5095"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5095" />
<feComposite
- id="feComposite5097"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5097" />
<feColorMatrix
- id="feColorMatrix6889"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6889" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6891"
flood-opacity="1"
- id="feFlood6891" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6893"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6895"
in="composite1"
- id="feGaussianBlur6895" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6897"
dx="2.77556e-017"
- id="feOffset6897" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6899"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5111"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5111">
<feFlood
- id="feFlood5101"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5101" />
<feComposite
- id="feComposite5103"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5103" />
<feGaussianBlur
- id="feGaussianBlur5105"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5105" />
<feOffset
- id="feOffset5107"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5107" />
<feComposite
- id="feComposite5109"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5109" />
<feColorMatrix
- id="feColorMatrix6901"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6901" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6903"
flood-opacity="1"
- id="feFlood6903" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6905"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6907"
in="composite1"
- id="feGaussianBlur6907" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6909"
dx="2.77556e-017"
- id="feOffset6909" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6911"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5123"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5123">
<feFlood
- id="feFlood5113"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5113" />
<feComposite
- id="feComposite5115"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5115" />
<feGaussianBlur
- id="feGaussianBlur5117"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5117" />
<feOffset
- id="feOffset5119"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5119" />
<feComposite
- id="feComposite5121"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5121" />
<feColorMatrix
- id="feColorMatrix6913"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6913" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
- flood-color="rgb(255,255,255)"
+ id="feFlood6915"
flood-opacity="1"
- id="feFlood6915" />
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
<feComposite
- result="composite1"
- operator="in"
- in="flood"
+ in2="fbSourceGraphic"
id="feComposite6917"
- in2="fbSourceGraphic" />
+ in="flood"
+ operator="in"
+ result="composite1" />
<feGaussianBlur
- result="blur"
- stdDeviation="1"
+ id="feGaussianBlur6919"
in="composite1"
- id="feGaussianBlur6919" />
+ stdDeviation="1"
+ result="blur" />
<feOffset
- result="offset"
- dy="0"
+ id="feOffset6921"
dx="2.77556e-017"
- id="feOffset6921" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
- in="fbSourceGraphic"
+ in2="offset"
id="feComposite6923"
- in2="offset" />
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
</filter>
<filter
- id="filter5135"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter5135">
<feFlood
- id="feFlood5125"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood5125" />
<feComposite
- id="feComposite5127"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5127" />
<feGaussianBlur
- id="feGaussianBlur5129"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5129" />
<feOffset
- id="feOffset5131"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset5131" />
<feComposite
- id="feComposite5133"
- result="fbSourceGraphic"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5133" />
<feColorMatrix
- id="feColorMatrix6925"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6925" />
<feFlood
- in="fbSourceGraphic"
- result="flood"
+ id="feFlood6927"
+ flood-opacity="1"
flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
+ <feComposite
+ in2="fbSourceGraphic"
+ id="feComposite6929"
+ in="flood"
+ operator="in"
+ result="composite1" />
+ <feGaussianBlur
+ id="feGaussianBlur6931"
+ in="composite1"
+ stdDeviation="1"
+ result="blur" />
+ <feOffset
+ id="feOffset6933"
+ dx="2.77556e-017"
+ dy="0"
+ result="offset" />
+ <feComposite
+ in2="offset"
+ id="feComposite6935"
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ id="filter5147">
+ <feFlood
flood-opacity="1"
- id="feFlood6927" />
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood5137" />
<feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
result="composite1"
+ id="feComposite5139" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur5141" />
+ <feOffset
+ dx="2.77556e-017"
+ dy="0"
+ result="offset"
+ id="feOffset5143" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5145" />
+ <feColorMatrix
+ result="fbSourceGraphicAlpha"
+ in="fbSourceGraphic"
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6937" />
+ <feFlood
+ id="feFlood6939"
+ flood-opacity="1"
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
+ <feComposite
+ in2="fbSourceGraphic"
+ id="feComposite6941"
+ in="flood"
operator="in"
+ result="composite1" />
+ <feGaussianBlur
+ id="feGaussianBlur6943"
+ in="composite1"
+ stdDeviation="1"
+ result="blur" />
+ <feOffset
+ id="feOffset6945"
+ dx="2.77556e-017"
+ dy="0"
+ result="offset" />
+ <feComposite
+ in2="offset"
+ id="feComposite6947"
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ id="filter5159">
+ <feFlood
+ flood-opacity="1"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood5149" />
+ <feComposite
in="flood"
- id="feComposite6929"
- in2="fbSourceGraphic" />
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite5151" />
<feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
result="blur"
+ id="feGaussianBlur5153" />
+ <feOffset
+ dx="2.77556e-017"
+ dy="0"
+ result="offset"
+ id="feOffset5155" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5157" />
+ <feColorMatrix
+ result="fbSourceGraphicAlpha"
+ in="fbSourceGraphic"
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6949" />
+ <feFlood
+ id="feFlood6951"
+ flood-opacity="1"
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
+ <feComposite
+ in2="fbSourceGraphic"
+ id="feComposite6953"
+ in="flood"
+ operator="in"
+ result="composite1" />
+ <feGaussianBlur
+ id="feGaussianBlur6955"
+ in="composite1"
stdDeviation="1"
+ result="blur" />
+ <feOffset
+ id="feOffset6957"
+ dx="2.77556e-017"
+ dy="0"
+ result="offset" />
+ <feComposite
+ in2="offset"
+ id="feComposite6959"
+ in="fbSourceGraphic"
+ operator="over"
+ result="composite2" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ id="filter5171">
+ <feFlood
+ flood-opacity="1"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood5161" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite5163" />
+ <feGaussianBlur
in="composite1"
- id="feGaussianBlur6931" />
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur5165" />
<feOffset
- result="offset"
+ dx="2.77556e-017"
dy="0"
+ result="offset"
+ id="feOffset5167" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="fbSourceGraphic"
+ id="feComposite5169" />
+ <feColorMatrix
+ result="fbSourceGraphicAlpha"
+ in="fbSourceGraphic"
+ values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
+ id="feColorMatrix6961" />
+ <feFlood
+ id="feFlood6963"
+ flood-opacity="1"
+ flood-color="rgb(255,255,255)"
+ result="flood"
+ in="fbSourceGraphic" />
+ <feComposite
+ in2="fbSourceGraphic"
+ id="feComposite6965"
+ in="flood"
+ operator="in"
+ result="composite1" />
+ <feGaussianBlur
+ id="feGaussianBlur6967"
+ in="composite1"
+ stdDeviation="1"
+ result="blur" />
+ <feOffset
+ id="feOffset6969"
dx="2.77556e-017"
- id="feOffset6933" />
+ dy="0"
+ result="offset" />
<feComposite
- result="composite2"
- operator="over"
+ in2="offset"
+ id="feComposite6971"
in="fbSourceGraphic"
- id="feComposite6935"
- in2="offset" />
+ operator="over"
+ result="composite2" />
</filter>
+ <radialGradient
+ xlink:href="#linearGradient4635"
+ id="radialGradient4669-9"
+ cx="10.529827"
+ cy="14.778796"
+ fx="10.529827"
+ fy="14.778796"
+ r="7.1399999"
+ gradientTransform="matrix(1,0,0,1.1087088,0,-1.2351844)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter5147"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB"
+ id="filter4701">
<feFlood
- id="feFlood5137"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4691" />
<feComposite
- id="feComposite5139"
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
result="composite1"
+ id="feComposite4693" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="1"
+ result="blur"
+ id="feGaussianBlur4695" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4697" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4699" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4635"
+ id="radialGradient4637-5"
+ cx="11.063469"
+ cy="38.79744"
+ fx="11.063469"
+ fy="38.79744"
+ r="8.7600002"
+ gradientTransform="matrix(1,0,0,1.0853313,0,-3.029369)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4661">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4651" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
operator="out"
+ result="composite1"
+ id="feComposite4653" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="1"
+ result="blur"
+ id="feGaussianBlur4655" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4657" />
+ <feComposite
+ in="offset"
in2="SourceGraphic"
- in="flood" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4659" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4635"
+ id="radialGradient4677-0"
+ cx="34.841751"
+ cy="14.552581"
+ fx="34.841751"
+ fy="14.552581"
+ r="7.1399999"
+ gradientTransform="matrix(1,0,0,1.1003056,0,-1.1335797)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4689">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4679" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4681" />
<feGaussianBlur
- id="feGaussianBlur5141"
+ in="composite1"
+ stdDeviation="1"
result="blur"
- stdDeviation="0.5"
- in="composite1" />
+ id="feGaussianBlur4683" />
<feOffset
- id="feOffset5143"
+ dx="0"
+ dy="0"
result="offset"
+ id="feOffset4685" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4687" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4603"
+ id="radialGradient4605-8"
+ cx="58.062626"
+ cy="12.761739"
+ fx="58.062626"
+ fy="12.761739"
+ r="7.6799994"
+ gradientTransform="matrix(1,0,0,0.99218759,0,0.09141507)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4629">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4619" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4621" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="1"
+ result="blur"
+ id="feGaussianBlur4623" />
+ <feOffset
+ dx="0"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4625" />
<feComposite
- id="feComposite5145"
- result="fbSourceGraphic"
+ in="offset"
+ in2="SourceGraphic"
operator="atop"
+ result="composite2"
+ id="feComposite4627" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4523-3"
+ id="radialGradient4525-6"
+ cx="79.305222"
+ cy="13.939252"
+ fx="79.305222"
+ fy="13.939252"
+ r="7.8000002"
+ gradientTransform="matrix(1,0,0,1.0769231,0,-0.86932835)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4597">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4587" />
+ <feComposite
+ in="flood"
in2="SourceGraphic"
- in="offset" />
- <feColorMatrix
- id="feColorMatrix6937"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
- in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ operator="out"
+ result="composite1"
+ id="feComposite4589" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="1"
+ result="blur"
+ id="feGaussianBlur4591" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4593" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4595" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4527"
+ id="radialGradient4529-9"
+ cx="103.23091"
+ cy="12.664675"
+ fx="103.23091"
+ fy="12.664675"
+ r="9.5995998"
+ gradientTransform="matrix(1,0,0,0.87507716,0,1.3868386)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4783">
<feFlood
- in="fbSourceGraphic"
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
result="flood"
- flood-color="rgb(255,255,255)"
- flood-opacity="1"
- id="feFlood6939" />
+ id="feFlood4773" />
<feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
result="composite1"
- operator="in"
+ id="feComposite4775" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="1"
+ result="blur"
+ id="feGaussianBlur4777" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4779" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4781" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4709-11"
+ cx="125.30523"
+ cy="16.659737"
+ fx="125.30523"
+ fy="16.659737"
+ r="8.3726959"
+ gradientTransform="matrix(1,0,0,1.0032611,0,-0.03620244)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4721">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4711" />
+ <feComposite
in="flood"
- id="feComposite6941"
- in2="fbSourceGraphic" />
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4713" />
<feGaussianBlur
+ in="composite1"
+ stdDeviation="1"
result="blur"
+ id="feGaussianBlur4715" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4717" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4719" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4727"
+ id="radialGradient4729-5"
+ cx="149.26262"
+ cy="12.784631"
+ fx="149.26262"
+ fy="12.784631"
+ r="8.6400051"
+ gradientTransform="matrix(1,0,0,0.993055,0,0.07848724)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4741">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4731" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4733" />
+ <feGaussianBlur
+ in="composite1"
stdDeviation="1"
+ result="blur"
+ id="feGaussianBlur4735" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4737" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4739" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient5023"
+ id="radialGradient5017-9"
+ cx="466.94476"
+ cy="12.037849"
+ fx="466.94476"
+ fy="12.037849"
+ r="9.6007004"
+ gradientTransform="matrix(0.79035186,0,0,0.79508811,-0.14216924,6.9389816e-4)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4793-8"
+ cx="194.44176"
+ cy="13.746766"
+ fx="194.44176"
+ fy="13.746766"
+ r="9.5999947"
+ gradientTransform="matrix(1,0,0,0.87500048,0,1.3876528)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4805">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4795" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4797" />
+ <feGaussianBlur
in="composite1"
- id="feGaussianBlur6943" />
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4799" />
<feOffset
+ dx="0"
+ dy="0"
result="offset"
+ id="feOffset4801" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4803" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4833-4"
+ cx="239.2"
+ cy="11.101265"
+ fx="239.2"
+ fy="11.101265"
+ r="9.6000004"
+ gradientTransform="matrix(1,0,0,0.87500002,0,1.3876579)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4853">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4843" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4845" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4847" />
+ <feOffset
+ dx="0"
dy="0"
- dx="2.77556e-017"
- id="feOffset6945" />
+ result="offset"
+ id="feOffset4849" />
<feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
result="composite2"
- operator="over"
- in="fbSourceGraphic"
- id="feComposite6947"
- in2="offset" />
+ id="feComposite4851" />
</filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4841-0"
+ cx="242.26164"
+ cy="12.423289"
+ fx="242.26164"
+ fy="12.423289"
+ r="3.5288758"
+ gradientTransform="matrix(0.79274531,0,0,0.78327977,-0.14435628,0.11758726)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient8829"
+ cx="242.26164"
+ cy="12.423289"
+ fx="242.26164"
+ fy="12.423289"
+ r="3.5288758"
+ gradientTransform="matrix(0.79274531,0,0,0.78327977,-0.14435628,0.11758726)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ xlink:href="#linearGradient5037"
+ id="radialGradient5031-1"
+ cx="466.39926"
+ cy="31.105829"
+ fx="466.39926"
+ fy="31.105829"
+ r="9.7507105"
+ gradientTransform="matrix(1,0,0,0.99992718,0,0.00247197)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter5159"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB"
+ id="filter5049">
<feFlood
- id="feFlood5149"
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
result="flood"
+ id="feFlood5039" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite5041" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur5043" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset5045" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite5047" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4813-2"
+ cx="217.95329"
+ cy="16.56296"
+ fx="217.95329"
+ fy="16.56296"
+ r="10.35937"
+ gradientTransform="matrix(1,0,0,0.8160434,0,2.0506693)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4825">
+ <feFlood
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood4815" />
<feComposite
- id="feComposite5151"
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
result="composite1"
+ id="feComposite4817" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4819" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4821" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4823" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4861-6"
+ cx="262.79288"
+ cy="15.840806"
+ fx="262.79288"
+ fy="15.840806"
+ r="8.5577164"
+ gradientTransform="matrix(1,0,0,0.9969072,0,0.03528241)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4873">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4863" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
operator="out"
+ result="composite1"
+ id="feComposite4865" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4867" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4869" />
+ <feComposite
+ in="offset"
in2="SourceGraphic"
- in="flood" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4871" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4881-9"
+ cx="286.58698"
+ cy="14.171478"
+ fx="286.58698"
+ fy="14.171478"
+ r="8.53125"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4893">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4883" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4885" />
<feGaussianBlur
- id="feGaussianBlur5153"
+ in="composite1"
+ stdDeviation="0.5"
result="blur"
+ id="feGaussianBlur4887" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4889" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4891" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4901-6"
+ cx="308.97141"
+ cy="14.457072"
+ fx="308.97141"
+ fy="14.457072"
+ r="6.09375"
+ gradientTransform="matrix(1,0,0,1.4,0,-4.4901397)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4913">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4903" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4905-1" />
+ <feGaussianBlur
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4907" />
<feOffset
- id="feOffset5155"
+ dx="0"
+ dy="0"
result="offset"
+ id="feOffset4909" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4911-2" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4921-8"
+ cx="331.15933"
+ cy="13.119289"
+ fx="331.15933"
+ fy="13.119289"
+ r="8.53125"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4933">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4923" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4925" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4927" />
+ <feOffset
+ dx="0"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4929" />
<feComposite
- id="feComposite5157"
- result="fbSourceGraphic"
+ in="offset"
+ in2="SourceGraphic"
operator="atop"
+ result="composite2"
+ id="feComposite4931" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4941-9"
+ cx="353.15076"
+ cy="11.316628"
+ fx="353.15076"
+ fy="11.316628"
+ r="6.09375"
+ gradientTransform="matrix(0.79035186,0,0,0.15902921,-0.14216924,7.1987363)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientTransform="matrix(0.79035186,0,0,0.79514603,-0.14216924,3.8580698e-5)"
+ xlink:href="#linearGradient4707"
+ id="radialGradient4949-5"
+ cx="375.97003"
+ cy="11.407905"
+ fx="375.97003"
+ fy="11.407905"
+ r="6.09375"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4957-2"
+ cx="400.5007"
+ cy="13.518586"
+ fx="400.5007"
+ fy="13.518586"
+ r="8.5350475"
+ gradientTransform="matrix(1,0,0,0.99701325,0,0.03407254)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4969">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4959" />
+ <feComposite
+ in="flood"
in2="SourceGraphic"
- in="offset" />
- <feColorMatrix
- id="feColorMatrix6949"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
- in="fbSourceGraphic"
- result="fbSourceGraphicAlpha" />
+ operator="out"
+ result="composite1"
+ id="feComposite4961" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4963" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4965" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4967" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4975"
+ id="radialGradient4977-4"
+ cx="417.02075"
+ cy="15.742972"
+ fx="417.02075"
+ fy="15.742972"
+ r="8.53125"
+ gradientTransform="matrix(1.357667,-0.02466618,0.02411975,1.3275908,-149.53429,5.1574131)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4989">
<feFlood
- in="fbSourceGraphic"
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
result="flood"
- flood-color="rgb(255,255,255)"
- flood-opacity="1"
- id="feFlood6951" />
+ id="feFlood4979" />
<feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
result="composite1"
- operator="in"
+ id="feComposite4981" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4983" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset4985" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4987" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4997-5"
+ cx="444.33652"
+ cy="11.316628"
+ fx="444.33652"
+ fy="11.316628"
+ r="8.53125"
+ gradientTransform="matrix(1,0,0,0.71428563,0,3.2333231)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter5009">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4999" />
+ <feComposite
in="flood"
- id="feComposite6953"
- in2="fbSourceGraphic" />
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite5001-8" />
<feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
result="blur"
- stdDeviation="1"
+ id="feGaussianBlur5003" />
+ <feOffset
+ dx="0"
+ dy="0"
+ result="offset"
+ id="feOffset5005" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite5007-3" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4747"
+ id="radialGradient4710-4"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
+ cx="134.97461"
+ cy="9"
+ fx="134.97461"
+ fy="9"
+ r="7.9746099" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4729">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4719" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4721" />
+ <feGaussianBlur
in="composite1"
- id="feGaussianBlur6955" />
+ stdDeviation="1"
+ result="blur"
+ id="feGaussianBlur4723" />
<feOffset
+ dx="2.77556e-017"
+ dy="0"
result="offset"
+ id="feOffset4725" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4727" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient5037"
+ id="radialGradient4712-2"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
+ cx="132.6468"
+ cy="9.0947113"
+ fx="132.6468"
+ fy="9.0947113"
+ r="7.9746099" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4774">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4764" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4766" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4768" />
+ <feOffset
+ dx="2.77556e-017"
dy="0"
+ result="offset"
+ id="feOffset4770" />
+ <feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
+ result="composite2"
+ id="feComposite4772" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient4747"
+ id="radialGradient4714-4"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
+ cx="134.97461"
+ cy="9"
+ fx="134.97461"
+ fy="9"
+ r="7.9746099" />
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient4750-3"
+ cx="166.37157"
+ cy="11.485105"
+ fx="166.37157"
+ fy="11.485105"
+ r="0.31640625"
+ gradientTransform="matrix(0.99998863,-0.00473886,0.08838422,18.426509,-1.0132111,-199.35688)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ xlink:href="#linearGradient4832"
+ id="radialGradient4709-1-2"
+ cx="125.30523"
+ cy="16.659737"
+ fx="125.30523"
+ fy="16.659737"
+ r="8.3726959"
+ gradientTransform="matrix(1,0,0,1.0032611,0.11563445,22.233158)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4844">
+ <feFlood
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ result="flood"
+ id="feFlood4834" />
+ <feComposite
+ in="flood"
+ in2="SourceGraphic"
+ operator="out"
+ result="composite1"
+ id="feComposite4836" />
+ <feGaussianBlur
+ in="composite1"
+ stdDeviation="0.5"
+ result="blur"
+ id="feGaussianBlur4838" />
+ <feOffset
dx="2.77556e-017"
- id="feOffset6957" />
+ dy="0"
+ result="offset"
+ id="feOffset4840" />
<feComposite
+ in="offset"
+ in2="SourceGraphic"
+ operator="atop"
result="composite2"
- operator="over"
- in="fbSourceGraphic"
- id="feComposite6959"
- in2="offset" />
+ id="feComposite4842" />
</filter>
+ <radialGradient
+ xlink:href="#linearGradient4707"
+ id="radialGradient9039"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.79274531,0,0,0.78327977,-0.14435628,0.11758726)"
+ cx="242.26164"
+ cy="12.423289"
+ fx="242.26164"
+ fy="12.423289"
+ r="3.5288758" />
<filter
- id="filter5171"
+ id="filter10217"
style="color-interpolation-filters:sRGB;">
<feFlood
- id="feFlood5161"
+ id="feFlood10207"
result="flood"
flood-color="rgb(0,0,0)"
flood-opacity="1" />
<feComposite
- id="feComposite5163"
+ id="feComposite10209"
result="composite1"
operator="out"
in2="SourceGraphic"
in="flood" />
<feGaussianBlur
- id="feGaussianBlur5165"
+ id="feGaussianBlur10211"
result="blur"
stdDeviation="0.5"
in="composite1" />
<feOffset
- id="feOffset5167"
+ id="feOffset10213"
result="offset"
dy="0"
dx="2.77556e-017" />
<feComposite
- id="feComposite5169"
+ id="feComposite10215"
result="fbSourceGraphic"
operator="atop"
in2="SourceGraphic"
in="offset" />
<feColorMatrix
- id="feColorMatrix6961"
+ id="feColorMatrix10219"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
in="fbSourceGraphic"
result="fbSourceGraphicAlpha" />
@@ -2003,172 +3047,172 @@
result="flood"
flood-color="rgb(255,255,255)"
flood-opacity="1"
- id="feFlood6963" />
+ id="feFlood10221" />
<feComposite
result="composite1"
operator="in"
in="flood"
- id="feComposite6965"
+ id="feComposite10223"
in2="fbSourceGraphic" />
<feGaussianBlur
result="blur"
stdDeviation="1"
in="composite1"
- id="feGaussianBlur6967" />
+ id="feGaussianBlur10225" />
<feOffset
result="offset"
dy="0"
dx="2.77556e-017"
- id="feOffset6969" />
+ id="feOffset10227" />
<feComposite
result="composite2"
operator="over"
in="fbSourceGraphic"
- id="feComposite6971"
+ id="feComposite10229"
in2="offset" />
</filter>
</defs>
<g
- id="layer1">
+ style="filter:url(#filter10217)"
+ id="g7757">
<path
- id="path4"
- d="m 17.311578,13.702319 h -5.76 l 2.28,2.28 c 0.6,0.6 0.72,1.44 0.24,1.92 l -0.96,1.08 c -0.48,0.48 -1.32,0.36 -1.92,-0.24 l -6.4800001,-6.6 c -0.12,0 -0.36,-0.48 -0.48,-0.84 0,-0.359999 0.36,-0.719999 0.48,-0.839999 l 6.3600001,-6.48 c 0.6,-0.6000001 1.44,-0.7200001 1.92,-0.24 l 0.96,1.0799999 c 0.48,0.48 0.36,1.32 -0.24,1.9200001 l -2.16,2.1599999 h 5.76 c 0.72,0 1.2,0.48 1.2,1.2000001 v 2.399999 c 0,0.72 -0.48,1.2 -1.2,1.2 z"
- style="display:inline;fill:url(#radialGradient4669);fill-opacity:1;stroke-width:1;filter:url(#filter4883)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4669-9);fill-opacity:1;stroke-width:1;filter:url(#filter4701)"
+ d="m 17.870749,13.841269 -6.303534,-0.0074 2.264363,2.148431 c 0.615648,0.584128 0.72,1.44 0.24,1.92 l -0.96,1.08 c -0.48,0.48 -1.32,0.36 -1.92,-0.24 0,0 -6.4200001,-6.6 -6.4800001,-6.6 -0.06,0 -0.36,-0.48 -0.48,-0.84 0,-0.359999 0.36,-0.719999 0.48,-0.839999 l 6.3600001,-6.48 c 0.6,-0.6000001 1.44,-0.7200001 1.92,-0.24 l 0.96,1.0799999 c 0.48,0.48 0.36,1.32 -0.24,1.9200001 l -2.144363,2.0610645 6.359451,0.043374 c 0.719983,0.00491 1.227959,0.50779 1.227959,1.2277905 v 2.483369 c 0,0.72 -0.563877,1.284215 -1.283876,1.28337 z"
+ id="path4" />
<path
- d="m 19.271765,37.987692 h -7.987059 l 3.607059,3.507571 c 0.515294,0.50108 0.644117,1.377974 0.257648,1.753785 l -1.545884,1.503245 C 13.217059,45.128104 12.315294,45.128104 11.8,44.501752 L 3.5552941,36.609718 c 0,0 -0.5152941,-0.626352 -0.5152941,-1.127434 0,-0.501081 0.5152941,-1.002163 0.5152941,-1.002163 L 11.8,26.462816 c 0.515294,-0.50108 1.417059,-0.626351 1.803529,-0.25054 l 1.545884,1.503245 c 0.386469,0.375811 0.386469,1.252704 -0.257648,1.753785 l -3.478236,3.50757 h 7.858236 c 0.772941,0 1.288236,0.501082 1.288236,1.252705 v 2.505407 c 0,0.751622 -0.515295,1.252704 -1.288236,1.252704 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4637-5);fill-opacity:1;stroke-width:1;filter:url(#filter4661)"
id="path4154"
- style="display:inline;fill:url(#radialGradient4637);fill-opacity:1;stroke-width:1;filter:url(#filter4895)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ d="m 19.187889,37.765372 -7.620674,-0.0365 3.352509,3.266174 c 0.515294,0.50108 0.829738,1.388534 0.443269,1.764345 l -1.759464,1.992905 c -0.356609,0.403923 -1.52102,-0.108922 -2.036314,-0.735274 L 3.9756591,36.471238 c 0,0 -0.7399492,-0.710192 -0.7399492,-1.211274 0,-0.501081 0.7399492,-1.303987 0.7399492,-1.303987 l 7.5915559,-7.545783 c 0.515294,-0.50108 1.613776,-1.093109 1.980397,-0.698138 l 1.815381,1.955768 c 0.386469,0.375811 0.172889,1.300401 -0.471228,1.801482 l -3.32455,3.229041 7.620674,0.02842 c 0.772936,0.0029 1.344153,0.417712 1.344153,1.169335 v 2.560987 c 0,0.751622 -0.571221,1.311987 -1.344153,1.308283 z" />
<path
- d="m 26.86,12.501265 v -2.4 c 0,-0.7200003 0.48,-1.2000003 1.2,-1.2000003 h 5.76 L 31.66,6.7412646 c -0.6,-0.5999999 -0.72,-1.4399999 -0.24,-1.92 l 0.96,-1.08 c 0.48,-0.48 1.32,-0.36 1.92,0.24 l 6.36,6.4800004 c 0.12,0.12 0.48,0.48 0.48,0.84 0,0.36 -0.36,0.84 -0.48,0.84 l -6.48,6.48 c -0.6,0.6 -1.44,0.72 -1.92,0.24 l -0.96,-1.08 c -0.48,-0.48 -0.36,-1.32 0.24,-1.92 l 2.28,-2.16 h -5.76 c -0.72,0 -1.2,-0.48 -1.2,-1.2 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4677-0);fill-opacity:1;stroke-width:1;filter:url(#filter4689)"
id="path4165"
- style="display:inline;fill:url(#radialGradient4677);fill-opacity:1;stroke-width:1;filter:url(#filter4907)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ d="m 26.776124,12.612425 v -2.53895 c 0,-0.7200003 0.480206,-1.3282747 1.2,-1.3111602 l 5.76,0.041051 L 31.66,6.7412646 c -0.602042,-0.5979755 -0.72,-1.4399999 -0.24,-1.92 l 0.96,-1.08 c 0.48,-0.48 1.32,-0.36 1.92,0.24 l 6.36,6.4800004 c 0.12,0.12 0.48,0.48 0.48,0.84 0,0.36 -0.36,0.84 -0.48,0.84 l -6.48,6.48 c -0.6,0.6 -1.44,0.72 -1.92,0.24 l -0.96,-1.08 c -0.48,-0.48 -0.36,-1.32 0.24,-1.92 L 33.736124,13.833888 28.06,13.868005 c -0.719987,0.0043 -1.283876,-0.53558 -1.283876,-1.25558 z" />
<path
- d="m 64.48,6.6012647 -5.039999,5.0400003 5.039999,5.04 -2.519999,2.52 -5.16,-4.92 -5.04,5.04 -2.52,-2.52 5.04,-5.16 -5.16,-5.0400003 2.52,-2.5200001 5.16,5.04 5.04,-5.04 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4605-8);fill-opacity:1;stroke-width:1;filter:url(#filter4629)"
id="path4176"
- style="display:inline;fill:url(#radialGradient4605);fill-opacity:1;stroke-width:1;filter:url(#filter4919)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ d="m 64.708108,6.2881044 -5.061037,5.0305226 5.061037,5.030522 -2.530518,2.515261 -5.061038,-5.030522 -5.061037,5.030522 -2.530519,-2.515261 5.061037,-5.030522 -5.061037,-5.0305226 2.530519,-2.5152612 5.061037,5.0305223 5.061038,-5.0305223 z" />
<path
- d="m 87.000001,11.301265 h -8.4 l 3.36,-3.3600004 c -0.84,-0.6 -1.68,-0.84 -2.76,-0.84 -2.64,0 -4.8,2.1600001 -4.8,4.8000004 0,2.64 2.16,4.8 4.8,4.8 1.68,0 3.24,-0.84 4.08,-2.28 l 2.76,1.2 c -1.32,2.4 -3.84,4.08 -6.84,4.08 -4.32,0 -7.8,-3.48 -7.8,-7.8 0,-4.3200004 3.48,-7.8000004 7.8,-7.8000004 1.8,0 3.48,0.6 4.92,1.6800001 l 2.88,-2.8800001 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4525-6);fill-opacity:1;stroke-width:1;filter:url(#filter4597)"
id="path4187"
- style="display:inline;fill:url(#radialGradient4525);fill-opacity:1;stroke-width:1;filter:url(#filter4931)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ d="m 87.482777,11.318627 h -8.856816 l 3.13833,-3.0716727 C 81.15648,7.545735 80.363876,6.712205 79.283876,6.712205 c -2.64,0 -5.107543,1.9376803 -5.107543,4.577681 0,2.64 2.411627,5.050109 5.051627,5.050109 1.68,0 3.619039,-1.066107 4.459039,-2.506107 l 2.530518,1.25763 c -1.32,2.4 -3.961599,4.443007 -6.961599,4.443007 -4.32,0 -8.219378,-3.896849 -8.219378,-8.216849 0,-4.3200008 3.927337,-7.633261 8.247337,-7.633261 1.8,0 3.619792,0.8778997 5.059792,1.9578998 l 3.139108,-3.1271021 z" />
<path
- id="path4209"
- d="M 102.59961,2.7011715 93,11.101561 h 2.400391 l 1.242188,-0.03516 -0.04297,0.03516 v 8.400392 h 4.800781 v -6.000001 h 2.40039 v 6.000001 h 4.79884 v -8.400392 l -0.043,-0.03516 1.24415,0.03516 h 2.39843 z"
- style="display:inline;fill:url(#radialGradient4529);fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1;filter:url(#filter4943)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4529-9);fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1;filter:url(#filter4783)"
+ d="M 102.66589,2.5152127 92.543814,11.318627 h 3.795778 v 7.545783 h 5.061038 v -5.030522 h 2.53052 v 5.030522 h 5.06104 v -7.545783 h 3.79577 z"
+ id="path4209" />
<path
- d="m 133.15407,12.421265 -6.72001,6.6 c -0.24,0.36 -0.72,0.48 -1.2,0.48 -0.48,0 -0.96,-0.12 -1.32,-0.48 l -6.72,-6.6 c -0.6,-0.72 -0.48,-1.32 0.48,-1.32 h 3.96 V 3.9012646 c 0,-0.72 0.48,-1.2 1.2,-1.2 h 4.8 c 0.72,0 1.2,0.48 1.2,1.2 v 7.2000004 h 3.84 c 0.96001,0 1.20001,0.6 0.48001,1.32 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4709-11);fill-opacity:1;stroke-width:1;filter:url(#filter4721)"
id="path4214"
- style="display:inline;fill:url(#radialGradient4709);fill-opacity:1;stroke-width:1;filter:url(#filter4955)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ d="m 133.03211,12.576257 -6.32629,6.288153 c -0.24,0.36 -0.82401,0.692435 -1.30401,0.692435 -0.48,0 -0.86651,-0.332435 -1.22651,-0.692435 l -6.3263,-6.288153 c -0.79571,-0.72 -0.93921,-1.286268 0.0208,-1.280462 l 3.77501,0.02283 -0.0107,-7.5841022 c -0.001,-0.7199993 0.50796,-1.1722101 1.22796,-1.1722101 h 5.10754 c 0.72,0 1.22426,0.4800094 1.22796,1.2 l 0.0388,7.5563123 3.80118,-0.05062 c 0.95992,-0.01278 0.71459,0.588252 -0.005,1.308252 z" />
<path
- d="m 148,19.881265 c -4.8,0 -8.64,-3.84 -8.64,-8.64 0,-4.6800004 3.84,-8.5200004 8.64,-8.5200004 4.8,0 8.64001,3.84 8.64001,8.6400004 0,4.68 -3.84001,8.52 -8.64001,8.52 z m 0,-14.5200003 c -3.36,0 -6,2.6399999 -6,6.0000003 0,3.24 2.64,6 6,6 3.36,0 6.00001,-2.64 6.00001,-6 0,-3.3600004 -2.64001,-6.0000003 -6.00001,-6.0000003 z m -0.36,7.0800003 c -0.48,-0.12 -0.84,-0.6 -0.84,-1.08 V 7.7612646 c 0,-0.72 0.48,-1.2 1.2,-1.2 0.72,0 1.2,0.48 1.2,1.2 v 3.3600004 c 1.32,1.32 2.4,3.84 2.4,3.84 0,0 -2.64,-1.2 -3.96,-2.52 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4729-5);fill-opacity:1;stroke-width:1;filter:url(#filter4741)"
id="path4225"
- style="display:inline;fill:url(#radialGradient4729);fill-opacity:1;stroke-width:1;filter:url(#filter4967)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ d="m 148.19571,20.103585 c -4.8,0 -8.89163,-3.97895 -8.89163,-8.77895 0,-4.6800005 4.11959,-8.7145303 8.91959,-8.7145303 4.8,0 8.80776,3.9511599 8.80776,8.7511603 0,4.68 -4.03572,8.74232 -8.83572,8.74232 z m 0.0559,-15.04801 c -3.36,0 -6.39142,2.9178996 -6.39142,6.2779 0,3.24 2.9755,6.22232 6.3355,6.22232 3.36,0 6.33551,-2.86232 6.33551,-6.22232 0,-3.3600004 -2.91959,-6.2779 -6.27959,-6.2779 z m -0.63959,7.520682 c -0.48,-0.12 -0.63716,-0.735044 -0.64429,-1.214992 l -0.0559,-3.7667402 c -0.0107,-0.7199217 0.53592,-1.28337 1.25592,-1.28337 0.72,0 1.27834,0.535601 1.28388,1.25558 l 0.0289,3.7518922 c 1.32,1.32 2.53051,3.772891 2.53051,3.772891 0,0 -3.07896,-1.195261 -4.39896,-2.515261 z" />
<path
- d="m 369.00476,4.7878231 0.94842,1.9083504 0.47422,0.858758 0.94842,0.190835 2.18136,0.3816699 -1.61231,1.7175156 -0.6639,0.667923 0.0948,0.954175 0.37937,2.290022 -1.89685,-0.954178 -0.85358,-0.477086 -0.85358,0.477086 -1.89685,0.954178 0.37938,-2.290022 0.0948,-0.954175 -0.6639,-0.667923 -1.61232,-1.7175156 2.27622,-0.3816699 0.94842,-0.190835 0.37936,-0.858758 0.94843,-1.9083504 m 0,-3.4350309 c -0.28454,0 -0.56906,0.1908348 -0.75874,0.667922 l -1.89683,3.9121193 -4.07821,0.6679227 c -0.94842,0.190835 -1.13812,0.8587576 -0.47421,1.5266802 l 2.94011,3.1487776 -0.66391,4.389208 c -0.0948,0.572504 0.1897,0.954174 0.66391,0.954174 0.18967,0 0.37936,-0.09542 0.56905,-0.190835 l 3.69885,-2.003768 3.69884,2.003768 c 0.18969,0.09543 0.47421,0.190835 0.56906,0.190835 0.4742,0 0.75873,-0.38167 0.6639,-1.049592 l -0.6639,-4.389207 2.9401,-3.1487781 c 0.66391,-0.6679226 0.37938,-1.3358454 -0.4742,-1.5266803 L 371.66031,5.837416 369.76347,1.9252968 C 369.5738,1.543627 369.28926,1.3527922 369.00474,1.3527922 Z"
+ style="display:inline;fill:url(#radialGradient5017-9);fill-opacity:1;stroke-width:0.79274529"
id="path4355"
- style="display:inline;fill:url(#radialGradient5017);fill-opacity:1;stroke-width:0.79274529;filter:url(#filter4979)" />
+ d="m 369.00476,4.7878231 0.94842,1.9083504 0.47422,0.858758 0.94842,0.190835 2.18136,0.3816699 -1.61231,1.7175156 -0.6639,0.667923 0.0948,0.954175 0.37937,2.290022 -1.89685,-0.954178 -0.85358,-0.477086 -0.85358,0.477086 -1.89685,0.954178 0.37938,-2.290022 0.0948,-0.954175 -0.6639,-0.667923 -1.61232,-1.7175156 2.27622,-0.3816699 0.94842,-0.190835 0.37936,-0.858758 0.94843,-1.9083504 m 0,-3.4350309 c -0.28454,0 -0.56906,0.1908348 -0.75874,0.667922 l -1.89683,3.9121193 -4.07821,0.6679227 c -0.94842,0.190835 -1.13812,0.8587576 -0.47421,1.5266802 l 2.94011,3.1487776 -0.66391,4.389208 c -0.0948,0.572504 0.1897,0.954174 0.66391,0.954174 0.18967,0 0.37936,-0.09542 0.56905,-0.190835 l 3.69885,-2.003768 3.69884,2.003768 c 0.18969,0.09543 0.47421,0.190835 0.56906,0.190835 0.4742,0 0.75873,-0.38167 0.6639,-1.049592 l -0.6639,-4.389207 2.9401,-3.1487781 c 0.66391,-0.6679226 0.37938,-1.3358454 -0.4742,-1.5266803 L 371.66031,5.837416 369.76347,1.9252968 C 369.5738,1.543627 369.28926,1.3527922 369.00474,1.3527922 Z" />
<path
- d="m 202,17.101265 h -2.4 l 1.2,2.4 h -14.39999 l 1.2,-2.4 h -2.4 c -0.72,0 -1.2,-0.48 -1.2,-1.2 V 9.9012647 c 0,-0.7200001 0.48,-1.2000001 1.2,-1.2000001 h 1.2 V 6.3012647 c 0,-0.7200001 0.48,-1.2000001 1.2,-1.2000001 v -1.2 c 0,-0.72 0.48,-1.2 1.2,-1.2 H 198.4 c 0.72,0 1.2,0.48 1.2,1.2 v 1.2 c 0.72,0 1.2,0.48 1.2,1.2000001 v 2.3999999 h 1.2 c 0.72,0 1.2,0.48 1.2,1.2000001 v 6.0000003 c 0,0.72 -0.48,1.2 -1.2,1.2 z m -14.39999,0 0.6,-1.2 h -0.6 z m 0.6,-6 h -0.6 -0.6 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 h 1.2 c 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z M 198.4,5.1012646 c 0,-0.72 -0.48,-1.2 -1.2,-1.2 h -7.19999 c -0.72,0 -1.2,0.48 -1.2,1.2 v 3.6 c 0,0.7200001 0.48,1.2000001 1.2,1.2000001 H 197.2 c 0.72,0 1.2,-0.48 1.2,-1.2000001 z m -1.08,10.8000004 h -7.43999 l -1.08,2.4 H 198.4 Z m 2.28,0 H 199 l 0.6,1.2 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4793-8);fill-opacity:1;stroke-width:1;filter:url(#filter4805)"
id="path4366"
- style="display:inline;fill:url(#radialGradient4793);fill-opacity:1;stroke-width:1;filter:url(#filter4991)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ d="m 202.62125,17.648005 -2.53039,-0.04122 1.26526,2.515261 h -15.18311 l 1.26526,-2.515261 -2.51784,0.02249 c -0.71997,0.0064 -1.31817,-0.563397 -1.31184,-1.28337 l 0.0559,-6.3612693 c 0.006,-0.7199727 0.59192,-1.2112687 1.31183,-1.2000001 l 1.19667,0.018731 0.0313,-2.5298907 c 0.009,-0.7199457 0.51397,-1.243001 1.23397,-1.243001 l 0.022,-1.2403691 c 0.0127,-0.7198886 0.6198,-1.2535885 1.33979,-1.2555799 l 10.04733,-0.02779 c 0.72,-0.00199 1.21931,0.5078413 1.22796,1.22779 l 0.0156,1.295949 c 0.72,0 1.2692,0.5785813 1.26831,1.2985809 l -0.003,2.4743108 1.26513,-1e-7 c 0.71992,-0.010711 1.26205,0.5376375 1.26526,1.2576305 v 6.288153 c 0,0.729621 -0.61509,1.257631 -1.26526,1.257631 z m -15.18298,-0.04122 1.26526,-2.515262 h -1.26526 z m 0.6,-6.288153 h -0.6 -0.6 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 h 1.2 c 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.25348,-0.503016 -0.6,-0.6 z M 198.8256,5.0304738 c 0,-0.72 -0.54528,-1.2523398 -1.26526,-1.2576306 h -7.59155 c -0.71998,-0.00529 -1.28117,0.5378043 -1.26526,1.2576306 v 3.7728917 c 0.0159,0.7198264 0.54528,1.2629215 1.26526,1.2576305 h 7.59155 c 0.71999,-0.0053 1.24942,-0.5078188 1.25592,-1.2277899 z m -1.26526,10.0610482 h -7.59155 l -1.26526,3.772892 h 10.12207 z m 2.53052,0 h -1.26526 l 1.26526,2.515262 z" />
<path
- d="m 247,19.501265 h -15.6 c -0.96,0 -1.8,-0.84 -1.8,-1.8 V 4.5012646 c 0,-0.9599999 0.84,-1.8 1.8,-1.8 H 247 c 0.96,0 1.8,0.8400001 1.8,1.8 V 17.701265 c 0,0.96 -0.84,1.8 -1.8,1.8 z M 239.8,3.9012646 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 2.28,0 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.36,0.6 0.6,0.6 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 3.72,0 h -1.2 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 h 1.2 c 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 0.6,4.8 c 0,-0.72 -0.48,-1.1999999 -1.2,-1.1999999 h -12 c -0.72,0 -1.2,0.4799999 -1.2,1.1999999 v 7.2000004 c 0,0.72 0.48,1.2 1.2,1.2 h 12 c 0.72,0 1.2,-0.48 1.2,-1.2 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4833-4);fill-opacity:1;stroke-width:1;filter:url(#filter4853)"
id="path4388"
- style="display:inline;fill:url(#radialGradient4833);fill-opacity:1;stroke-width:1;filter:url(#filter5003)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
- <text
- transform="scale(0.98484982,1.0153832)"
- id="text4409"
- y="12.608931"
- x="188.06316"
- style="font-style:normal;font-weight:normal;font-size:9.51294327px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:url(#radialGradient4841);fill-opacity:1;stroke:none;stroke-width:0.79274535px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter5015)"
- xml:space="preserve"><tspan
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.55116463px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#radialGradient4841);fill-opacity:1;stroke-width:0.79274535px;"
- y="12.608931"
- x="188.06316"
- id="tspan4411">+</tspan></text>
+ d="m 248.17426,18.945466 -16.43876,-0.02779 c -0.96,-0.0016 -1.40468,-0.339789 -1.40858,-1.299781 l -0.0559,-13.7557998 c -0.004,-0.959992 0.47654,-1.3847678 1.43653,-1.3831504 l 16.49468,0.02779 c 0.96,0.00162 1.24473,0.3675784 1.24083,1.3275705 l -0.0559,13.7557997 c -0.004,0.959992 -0.25287,1.356983 -1.21287,1.355361 z M 239.88388,3.8178947 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 2.64346,0 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.36,0.6 0.6,0.6 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 3.72,0 h -1.2 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 h 1.2 c 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 0.65592,4.9945298 c 0.005,-0.7199803 -0.53592,-1.2538267 -1.25592,-1.2555798 l -11.41287,-0.02779 c -0.72,-0.00175 -1.22533,0.5077946 -1.22796,1.2277899 l -0.028,7.6724304 c -0.003,0.719994 0.50796,1.175707 1.22795,1.172209 l 11.44083,-0.05558 c 0.71999,-0.0035 1.19464,-0.507809 1.2,-1.227789 z" />
+ <g
+ aria-label="+"
+ transform="scale(0.98484984,1.0153832)"
+ style="font-style:normal;font-weight:normal;font-size:9.51294327px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:url(#radialGradient4841-0);fill-opacity:1;stroke:none;stroke-width:0.79274535px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text4409">
+ <path
+ d="m 194.95358,9.8484986 h -2.03077 v 1.9696994 h -1.01538 V 9.8484986 h -2.03077 V 8.8636487 h 2.03077 V 6.893949 h 1.01538 v 1.9696997 h 2.03077 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.55116463px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#radialGradient9039);fill-opacity:1;stroke-width:0.79274535px"
+ id="path7725" />
+ </g>
<path
- style="display:inline;fill:url(#radialGradient5031);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5027)"
- id="path6182"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
d="m 467.25784,24.196945 c -0.36562,0 -0.73125,0.24375 -0.975,0.853125 l -2.4375,4.996876 -5.24062,0.853125 c -1.21875,0.24375 -1.4625,1.096875 -0.60938,1.95 l 3.77813,4.021875 -0.85313,5.60625 c -0.12181,0.73125 0.24375,1.21875 0.85313,1.21875 0.24375,0 0.4875,-0.121875 0.73125,-0.24375 l 4.75312,-2.559375 4.75313,2.559375 c 0.24375,0.121875 0.60937,0.24375 0.73125,0.24375 0.60937,0 0.975,-0.4875 0.85312,-1.340625 l -0.85312,-5.60625 3.77812,-4.021875 c 0.85313,-0.853125 0.4875,-1.70625 -0.60937,-1.95 l -5.24063,-0.853125 -2.4375,-4.996876 c -0.24375,-0.4875 -0.60937,-0.73125 -0.975,-0.73125 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path6182"
+ style="display:inline;fill:url(#radialGradient5031-1);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5049)" />
<path
- style="display:inline;fill:url(#radialGradient4813);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5039)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 226.66131,15.091518 -0.0388,3.707848 c -0.007,0.673061 -0.5177,1.245488 -1.19079,1.24654 l -17.77799,0.02779 c -0.6731,0.0011 -1.2416,-0.573462 -1.24671,-1.24654 l -0.028,-3.688049 c -0.005,-0.673078 0.6302,-1.305219 1.30331,-1.305219 1.26531,-1.257631 1.03718,-3.269047 1.26531,-5.0305225 0.4278,-2.8226251 0.0953,-6.2244545 3.80878,-6.2479747 l 7.52682,-0.047673 c 3.73297,-0.023644 3.4173,3.4730226 3.84751,6.2956477 0.41438,2.7153765 0,3.7728915 1.26526,5.0305225 0.70548,0 1.26526,0.515815 1.26526,1.25763 z m -7.68106,-4.410561 h -1.82811 V 8.8528316 c 0,-0.8124995 -1.21875,-0.8124995 -1.21875,0 v 1.8281254 h -1.82814 c -0.8125,0 -0.8125,1.218749 0,1.218749 h 1.82814 v 1.828125 c 0,0.812501 1.21875,0.812501 1.21875,0 v -1.828125 h 1.82811 c 0.8125,0 0.8125,-1.218749 0,-1.218749 z"
id="path7318"
- d="m 226.73438,15.945016 v 2.437501 c 0,0.673097 -0.54566,1.21875 -1.21875,1.21875 h -18.28124 c -0.67311,0 -1.21875,-0.545653 -1.21875,-1.21875 v -2.437501 c 0,-0.673097 0.54564,-1.21875 1.21875,-1.21875 h -1.04571 c 2.80313,0 2.36053,-3.256168 2.77368,-5.9703239 0.4278,-2.8226251 0.1927,-6.1069689 3.90598,-6.0616014 l 7.47091,0.091277 c 3.73276,0.045605 3.22143,3.1476992 3.65164,5.9703243 0.41438,2.715376 -0.20346,5.970324 2.60942,5.970324 h -1.08468 c 0.67309,0 1.21875,0.545653 1.21875,1.21875 z m -7.92188,-4.874999 h -1.82811 V 9.2418912 c 0,-0.8124995 -1.21875,-0.8124995 -1.21875,0 v 1.8281258 h -1.82814 c -0.8125,0 -0.8125,1.218749 0,1.218749 h 1.82814 v 1.828125 c 0,0.812501 1.21875,0.812501 1.21875,0 v -1.828125 h 1.82811 c 0.8125,0 0.8125,-1.218749 0,-1.218749 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4813-2);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4825)" />
<path
- style="display:inline;fill:url(#radialGradient4861);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5051)"
- id="path7886"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
d="m 269.02823,19.939154 c -0.975,0 -1.82813,-0.24375 -2.80313,-1.584375 -0.975,-1.340625 -2.07187,-3.046875 -2.07187,-3.046875 0,0 -0.85313,-1.096875 -1.34063,-1.95 -0.60937,-0.853125 -1.34062,-0.609375 -1.34062,-0.609375 0,0 -3.53438,-5.7281239 -4.14375,-6.581249 -0.73125,-1.21875 0.73125,-3.290625 0.73125,-3.290625 l 5.3625,8.531249 c 0,0 1.70625,2.315625 2.31562,2.803125 0.60938,0.4875 1.70625,-0.4875 3.4125,1.096875 2.31563,2.19375 1.58438,4.63125 -0.12181,4.63125 z m -0.36563,-3.534375 c -1.09687,-1.21875 -2.07187,-1.096875 -2.31562,-0.73125 -0.24375,0.365625 0,1.4625 0.4875,2.071875 0.4875,0.609375 0.975,0.853125 1.70625,0.853125 0.73125,0.121875 1.34062,-0.853125 0.1218,-2.19375 z m -4.63125,-5.728124 -1.4625,-2.19375 3.53438,-5.60625 c 0,0 1.4625,2.071875 0.73125,3.290625 -0.36563,0.4875001 -1.70625,2.803125 -2.80313,4.509375 z m -5.60625,3.534374 c 0.36563,-0.365625 1.21875,-1.340625 1.70625,-2.071875 l 0.975,1.4625 c -0.4875,0.73125 -1.09687,1.70625 -1.09687,1.70625 0,0 -1.09688,1.70625 -2.07188,3.046875 -0.85312,1.340625 -1.70625,1.584375 -2.80312,1.584375 -1.70625,0 -2.55938,-2.4375 -0.12181,-4.63125 1.70625,-1.4625 2.80312,-0.609375 3.4125,-1.096875 z m -2.925,2.19375 c -1.09687,1.21875 -0.4875,2.19375 0.24375,2.19375 0.73125,0 1.21875,-0.24375 1.70625,-0.853125 0.4875,-0.609375 0.73125,-1.828125 0.4875,-2.071875 -0.36562,-0.365625 -1.34062,-0.4875 -2.4375,0.73125 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path7886"
+ style="display:inline;fill:url(#radialGradient4861-6);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4873)" />
<path
- style="display:inline;fill:url(#radialGradient4881);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5063)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 292.45286,20.11787 h -7.56413 c -0.73125,0 -1.32549,-0.515308 -1.33058,-1.24654 l -0.028,-4.017519 v -3.16875 -2.9250003 c 0,-0.73125 0.4875,-1.21875 1.21875,-1.21875 l 6.44059,0.00442 2.53052,2.5152613 0.0354,8.810334 c 0.003,0.731244 -0.57138,1.24654 -1.30263,1.24654 z M 289.62394,8.7600607 v 2.4375003 h 2.4375 z m -7.3125,-0.6736655 0.0213,0.7169703 v 2.5152615 3.772891 l -5.06403,0.04019 c -0.73123,0.0058 -1.21672,-0.598663 -1.21875,-1.32991 l -0.028,-10.0556901 c -0.002,-0.7312471 0.4875,-1.21875 1.21875,-1.21875 h 6.09375 l 2.79402,2.5031129 v 1.81343 h -2.53052 c -0.67317,-0.017075 -1.31624,0.241688 -1.28654,1.2424914 z m 0.0213,-4.7304016 v 2.4596813 l 2.53052,-0.02779 z"
id="path8454"
- d="m 292.00552,19.7566 h -7.3125 c -0.73125,0 -1.21875,-0.4875 -1.21875,-1.21875 v -3.656249 -3.16875 -2.9250003 c 0,-0.73125 0.4875,-1.21875 1.21875,-1.21875 0,0 3.9,0 6.09375,0 0,0 2.4375,2.4375003 2.4375,2.4375003 0,2.68125 0,8.531249 0,8.531249 0,0.73125 -0.4875,1.21875 -1.21875,1.21875 z m -2.4375,-10.9687493 v 2.4375003 h 2.4375 z m -7.3125,-1.3406249 v 1.3406249 2.3156253 3.778125 h -4.875 c -0.73125,0 -1.21875,-0.4875 -1.21875,-1.21875 V 3.9128507 c 0,-0.7312499 0.4875,-1.21875 1.21875,-1.21875 0,0 3.9,0 6.09375,0 0,0 2.4375,2.4375 2.4375,2.4375 0,0.4875 0,0.9750001 0,1.5843751 h -3.04688 c -0.36562,0.121875 -0.60937,0.365625 -0.60937,0.73125 z m 0,-3.5343751 v 2.4375001 h 2.4375 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4881-9);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4893)" />
<path
- style="display:inline;fill:url(#radialGradient4901);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5075)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 312.76384,20.20124 -10.1808,-0.02779 c -0.75126,-0.0021 -1.21143,-0.547743 -1.21303,-1.272325 l -0.028,-12.6083588 c -0.002,-0.9749978 0.29395,-1.2762443 1.26895,-1.2723257 l 2.49639,0.010033 c 0,0 0.0587,-2.5309032 2.49616,-2.5309032 2.4375,0 2.56487,2.5309032 2.56487,2.5309032 l 2.48359,0.017757 c 0.97497,0.00697 1.35938,0.3251372 1.35283,1.3001156 l -0.0839,12.4971989 c -0.005,0.808245 -0.51762,1.35744 -1.15713,1.355695 z m -1.86968,-13.8508896 -1.34061,-0.609375 c 0,0 0,-1.8281249 -1.95,-1.8281249 -1.95,0 -1.95,1.8281249 -1.95,1.8281249 l -1.34063,0.609375 -0.47079,1.1953846 h 7.59155 z m 0.53952,2.4530151 h -6.32629 l -2.53052,2.5152615 2.53052,5.030522 7.59155,-5.030522 z"
id="path9022"
- d="m 311.86917,19.7566 h -8.53125 c -0.97501,0 -1.82812,-0.853125 -1.82812,-1.828124 V 6.9597255 c 0,-0.9750001 0.85311,-1.8281251 1.82812,-1.8281251 h 1.82813 c 0,0 0,-2.4375 2.4375,-2.4375 2.4375,0 2.4375,2.4375 2.4375,2.4375 h 1.82812 c 0.975,0 1.82813,0.853125 1.82813,1.8281251 V 17.928476 c 0,0.974999 -0.85313,1.828124 -1.82813,1.828124 z m -0.97501,-13.4062496 -1.34061,-0.609375 c 0,0 0,-1.8281249 -1.95,-1.8281249 -1.95,0 -1.95,1.8281249 -1.95,1.8281249 l -1.34063,0.609375 -0.60937,1.2187501 h 3.04687 3.9 0.975 z m 0.12182,2.071875 h -5.72812 l -3.65625,2.0718756 3.4125,5.971875 8.04375,-4.63125 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4901-6);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4913)" />
<path
- style="display:inline;fill:url(#radialGradient4921);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5087)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="M 335.47361,15.091518 V 7.545735 l 3.79578,3.772892 z m -8.85681,1.257631 h 7.59155 l -3.79578,3.772892 z m 6.32629,-1.257631 h -5.06103 c -0.73124,-0.0041 -1.26114,-0.526392 -1.26526,-1.25763 V 8.8033655 c -0.004,-0.7312386 0.53401,-1.2576305 1.26526,-1.2576305 h 5.06103 c 0.73125,0 1.26526,0.5263804 1.26526,1.2576305 v 5.0305225 c 0,0.609375 -0.53402,1.261705 -1.26526,1.25763 z m 0,-3.772891 c 0,-0.73125 -0.53401,-1.257631 -1.26526,-1.257631 h -2.53052 c -0.73125,0 -1.26525,0.526381 -1.26525,1.257631 v 1.25763 c 0,0.73125 0.534,1.257631 1.26525,1.257631 h 2.53052 c 0.73125,0 1.26526,-0.526381 1.26526,-1.257631 z m -2.53052,-8.8034143 3.79578,3.7728917 h -7.59155 z m -5.06103,5.0305223 v 7.545783 l -3.79578,-3.772891 z"
id="path9590"
- d="M 335.29779,14.881601 V 7.5691009 l 3.65625,3.6562501 z m -8.53125,1.21875 h 7.3125 l -3.65625,3.656249 z m 6.09375,-1.21875 h -4.875 c -0.73125,0 -1.21875,-0.4875 -1.21875,-1.21875 v -4.875 c 0,-0.7312501 0.4875,-1.2187501 1.21875,-1.2187501 h 4.875 c 0.73125,0 1.21875,0.4875 1.21875,1.2187501 v 4.875 c 0,0.609375 -0.4875,1.21875 -1.21875,1.21875 z m 0,-3.65625 c 0,-0.73125 -0.4875,-1.21875 -1.21875,-1.21875 h -2.4375 c -0.73125,0 -1.21875,0.4875 -1.21875,1.21875 v 1.21875 c 0,0.73125 0.4875,1.21875 1.21875,1.21875 h 2.4375 c 0.73125,0 1.21875,-0.4875 1.21875,-1.21875 z m -2.4375,-8.5312501 3.65625,3.6562501 h -7.3125 z m -4.875,4.875 v 7.3125001 l -3.65625,-3.65625 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4921-8);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4933)" />
<path
- style="display:inline;fill:url(#radialGradient4941);fill-opacity:1;stroke-width:0.96615839;filter:url(#filter5099)"
+ d="m 274,8 h 10 v 2 h -10 z"
id="path10158"
- d="m 274.15498,8.0293266 h 9.6324 v 1.9381685 h -9.6324 z" />
+ style="display:inline;fill:url(#radialGradient4941-9);fill-opacity:1;stroke-width:0.96615839" />
<path
- style="display:inline;fill:url(#radialGradient4949);fill-opacity:1;stroke-width:0.96615839;filter:url(#filter5111)"
+ d="m 302,10 h -4 v 4 h -2 v -4 h -4 V 8 h 4 V 4 h 2 v 4 h 4 z"
id="path10726"
- d="m 301.82263,10.040073 h -3.85298 v 3.876338 h -1.92648 v -3.876338 h -3.85298 V 8.1019059 h 3.85298 V 4.2255681 h 1.92648 v 3.8763378 h 3.85298 z" />
+ style="display:inline;fill:url(#radialGradient4949-5);fill-opacity:1;stroke-width:0.96615839" />
<path
- style="display:inline;fill:url(#radialGradient4957);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5123)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 406.82037,12.583531 c -0.12181,0.73125 -0.24375,1.4625 -0.4875,2.071875 -0.4875,1.584375 -1.4625,3.046875 -3.04686,4.021874 0.4875,0.4875 1.58436,1.096875 1.58436,1.096875 0,0 -2.4375,0.365625 -4.99686,0.365625 l -0.12181,-0.121875 v 0.121875 c -1.21875,0 -2.4375,-0.365625 -3.65625,-0.73125 0.85311,-0.73125 1.4625,-1.584374 1.95,-2.559374 0.73125,-1.4625 0.73125,-3.65625 0.73125,-3.65625 0,0 1.09686,1.828125 1.70625,2.559375 1.4625,-0.73125 2.4375,-2.19375 2.55936,-3.65625 0.12181,-1.096875 -0.24375,-2.071875 -0.73125,-2.8031253 -0.4875,-0.8531251 -1.21875,-1.3406251 -2.07186,-1.7062501 0.24375,-0.4874999 0.60936,-1.0968749 0.975,-1.584375 0.4875,-0.73125 1.09686,-1.21875 1.58436,-1.4625 2.55939,1.340625 4.3875,4.5093751 4.02189,8.0437504 z m -8.53125,-2.4375 c 0,0 -1.34061,-1.8281254 -1.95,-2.4375004 -1.70625,0.853125 -2.68125,2.4375004 -2.68125,4.1437504 0.12181,1.828125 1.34064,3.290625 2.925,4.021875 -0.36561,0.609375 -0.73125,1.21875 -1.21875,1.70625 -0.4875,0.609375 -1.09686,0.974999 -1.4625,1.340624 -2.80311,-1.706249 -4.50936,-4.874999 -4.02186,-8.287499 0.1218,-0.8531253 0.36561,-1.7062504 0.60936,-2.4375004 0.4875,-1.3406249 1.34064,-2.4375 2.55939,-3.290625 0.1218,-0.121875 0.24375,-0.121875 0.36561,-0.24375 -0.4875,-0.4875 -1.95,-0.975 -1.95,-0.975 0,0 3.04689,-0.975 8.2875,-0.365625 -1.58436,2.315625 -1.4625,6.8250004 -1.4625,6.8250004 z"
id="path11294"
- d="m 407.09514,12.361211 c -0.12181,0.73125 -0.24375,1.4625 -0.4875,2.071875 -0.4875,1.584375 -1.4625,3.046875 -3.04686,4.021874 0.4875,0.4875 1.58436,1.096875 1.58436,1.096875 0,0 -2.4375,0.365625 -4.99686,0.365625 0,0 -0.12181,-0.121875 -0.12181,-0.121875 v 0.121875 c -1.21875,0 -2.4375,-0.365625 -3.65625,-0.73125 0.85311,-0.73125 1.4625,-1.584374 1.95,-2.559374 0.73125,-1.4625 0.73125,-3.65625 0.73125,-3.65625 0,0 1.09686,1.828125 1.70625,2.559375 1.4625,-0.73125 2.4375,-2.19375 2.55936,-3.65625 0.12181,-1.096875 -0.24375,-2.0718751 -0.73125,-2.8031251 -0.4875,-0.8531251 -1.21875,-1.3406251 -2.07186,-1.7062501 0.24375,-0.4874999 0.60936,-1.0968749 0.975,-1.584375 0.4875,-0.73125 1.09686,-1.21875 1.58436,-1.4625 2.55939,1.340625 4.3875,4.5093751 4.02189,8.0437502 z m -8.53125,-2.4375001 c 0,0 -1.34061,-1.8281251 -1.95,-2.4375001 -1.70625,0.853125 -2.68125,2.4375001 -2.68125,4.1437502 0.12181,1.828125 1.34064,3.290625 2.925,4.021875 -0.36561,0.609375 -0.73125,1.21875 -1.21875,1.70625 -0.4875,0.609375 -1.09686,0.974999 -1.4625,1.340624 -2.80311,-1.706249 -4.50936,-4.874999 -4.02186,-8.287499 0.1218,-0.8531251 0.36561,-1.7062502 0.60936,-2.4375002 0.4875,-1.3406249 1.34064,-2.4375 2.55939,-3.290625 0.1218,-0.121875 0.24375,-0.121875 0.36561,-0.24375 -0.4875,-0.4875 -1.95,-0.975 -1.95,-0.975 0,0 3.04689,-0.975 8.2875,-0.365625 -1.58436,2.315625 -1.4625,6.8250001 -1.4625,6.8250001 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4957-2);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4969)" />
<path
- style="display:inline;fill:url(#radialGradient4977);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5135)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 429.73975,20.187746 -2.55504,0.05558 c -0.48738,0.0106 -0.61242,-0.769541 -0.61242,-1.378916 0,0 0.31966,-4.276424 -3.79578,-8.803414 -3.20233,-3.5225593 -8.85682,-3.7728916 -8.85682,-3.7728916 -0.60938,0 -1.26177,-0.171597 -1.25602,-0.6590635 l 0.028,-2.3732094 c 0.006,-0.4874666 0.61868,-0.7406188 1.22806,-0.7406188 0,0 7.05132,0.3003217 11.38734,5.0305223 3.72704,4.065871 5.06103,11.318675 5.06103,11.318675 0,0.4875 -0.0191,1.310083 -0.62831,1.323336 z M 413.91969,8.8033655 c 0,0 4.48239,0.7421569 7.0114,3.0905195 2.59016,2.40515 3.11068,6.970525 3.11068,6.970525 0,0.4875 -0.7448,1.278471 -1.23236,1.278471 h -1.35283 c -0.4875,0 -1.21059,-0.669096 -1.21059,-1.278471 0,0 0.4472,-2.304652 -1.91012,-4.45401 -1.78736,-1.629677 -4.41618,-1.834143 -4.41618,-1.834143 -0.60938,0 -1.23946,-0.793663 -1.22806,-1.281032 l 0.028,-1.195314 c 0.0114,-0.4873685 0.59073,-1.2965455 1.20011,-1.2965455 z m 1.20944,6.3426395 c 1.34062,0 2.54933,1.124665 2.54933,2.46529 0,1.340626 -1.09688,2.576451 -2.4375,2.576451 -1.34063,0 -2.54933,-1.208035 -2.54933,-2.548661 0,-1.340625 1.09687,-2.49308 2.4375,-2.49308 z"
id="path11862"
- d="m 429.01283,20.243326 h -1.82812 c -0.4875,0 -0.975,-0.365625 -0.975,-0.975 0,0 0.36562,-4.387501 -3.9,-8.775 -3.04688,-3.6562503 -8.53125,-3.9000003 -8.53125,-3.9000003 -0.60938,0 -0.975,-0.365625 -0.975,-0.8531249 V 4.0339507 c 0,-0.4875 0.36562,-0.853125 0.975,-0.853125 0,0 7.67812,0.4875 11.7,5.4843751 4.02187,3.7781242 4.3875,10.7250002 4.3875,10.7250002 0,0.4875 -0.24375,0.853125 -0.85313,0.853125 z M 413.77846,9.2745758 c 0,0 4.50937,0.609375 7.06875,2.9249992 2.55937,2.4375 3.04687,7.190626 3.04687,7.190626 0,0.4875 -0.12181,0.975 -0.60937,0.975 h -1.82813 c -0.4875,0 -0.73125,-0.365625 -0.73125,-0.975 0,0 0.12181,-2.925001 -2.19375,-5.118751 -1.82812,-1.584375 -4.75312,-1.70625 -4.75312,-1.70625 -0.60938,0 -0.975,-0.365625 -0.975,-0.853125 v -1.584374 c 0,-0.4875002 0.36562,-0.8531252 0.975,-0.8531252 z m 1.4625,6.0937492 c 1.34062,0 2.4375,1.096875 2.4375,2.4375 0,1.340626 -1.09688,2.437501 -2.4375,2.437501 -1.34063,0 -2.4375,-1.096875 -2.4375,-2.437501 0,-1.340625 1.09687,-2.4375 2.4375,-2.4375 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4977-4);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4989)" />
<path
- style="display:inline;fill:url(#radialGradient4997);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5147)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 448.08169,13.833888 v 2.515261 c 0,0.975 -0.41214,1.257631 -1.26525,1.257631 h -10.12208 c -0.85314,0 -1.26526,-0.282631 -1.26526,-1.257631 V 6.2881044 c 0,-0.9750001 0.41212,-1.2576306 1.26526,-1.2576306 h 10.12208 c 0.85311,0 1.26525,0.2826305 1.26525,1.2576306 v 2.5152611 l 5.06104,-2.5152611 V 16.349149 Z"
id="path12430"
- d="m 451.64901,16.435377 -3.65625,-3.290625 v 2.559375 c 0,0.975 -0.73125,1.70625 -1.58436,1.70625 h -9.01875 c -0.85314,0 -1.58439,-0.73125 -1.58439,-1.70625 V 6.9291285 c 0,-0.9750001 0.73125,-1.7062501 1.58439,-1.7062501 h 9.01875 c 0.85311,0 1.58436,0.73125 1.58436,1.7062501 v 2.437499 l 3.65625,-3.2906241 c 0.36564,-0.365625 0.73125,-0.4875 1.21875,-0.365625 V 16.801002 c -0.36561,0.121875 -0.85311,0 -1.21875,-0.365625 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4997-5);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5009)" />
<g
- id="g4779"
- style="display:inline;filter:url(#filter5159)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)">
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline"
+ id="g4779">
<path
- style="fill:url(#radialGradient4710);fill-opacity:1;stroke-width:1.265625;"
- d="M 165.73984,2.6257296 V 20.34448 h 9.42792 0.69708 2.46698 c 1.25518,-0.32709 2.23657,-1.314095 2.53125,-2.53125 v -2.53125 -7.5937504 -2.53125 c -0.29468,-1.2171559 -1.27607,-2.2041601 -2.53125,-2.53125 h -2.07148 -1.09258 z m 7.73958,3.0577697 1.33485,2.2420349 c 0,0 0.36967,0.6174141 0.65753,0.813263 0.26974,0.1834496 0.93438,0.2892151 0.93438,0.2892151 h 2.72901 l -1.89596,3.0800167 c 0,0 -0.27577,0.604831 -0.41281,0.907196 -0.20593,0.452534 0.006,1.243536 0.0742,1.982484 0.10732,1.162403 0.19033,2.286529 0.19033,2.286529 l -2.21484,-1.132141 c 0,0 -0.90763,-0.426918 -1.39416,-0.427644 -0.5721,0 -1.64383,0.496858 -1.64383,0.496858 l -2.2198,1.065398 c 0,0 0.16319,-1.013778 0.33866,-2.128325 0.11606,-0.733074 0.43611,-1.567458 0.17798,-2.071473 -0.13995,-0.274086 -0.42023,-0.820679 -0.42023,-0.820679 L 167.532,9.0996981 h 2.71169 c 0,0 0.88228,-0.06226 1.24339,-0.2892151 0.27408,-0.1711231 0.61056,-0.7539368 0.61056,-0.7539368 z"
- id="bookmarks-star-4" />
+ id="bookmarks-star-4"
+ d="M 165.92886,2.5152127 V 20.122041 h 8.85681 1.26526 2.53052 c 1.26526,0 2.53052,-1.257631 2.53052,-2.515261 V 15.091518 7.545735 5.0304738 c 0,-1.2576306 -1.26526,-2.5152611 -2.53052,-2.5152611 h -2.53052 -1.26526 z m 7.59155,2.5152611 1.26526,2.5152612 c 0,0 0.39827,0.9972133 0.68613,1.1930622 0.26974,0.1834496 1.07417,0.064568 1.07417,0.064568 h 3.30074 l -2.53052,3.1379238 c 0,0 -0.38069,0.332603 -0.51773,0.634968 -0.20593,0.452534 -0.18971,0.518683 -0.12151,1.257631 0.10732,1.162403 0.63924,3.772892 0.63924,3.772892 l -2.53052,-1.257631 c 0,0 -0.77873,-0.42944 -1.26526,-0.430166 -0.5721,0 -1.26526,0.430166 -1.26526,0.430166 l -2.53051,1.257631 c 0,0 0.56012,-2.658345 0.73559,-3.772892 0.11606,-0.733074 0.10061,-0.753616 -0.15752,-1.257631 -0.13995,-0.274086 -0.57807,-0.782455 -0.57807,-0.782455 l -2.53052,-2.9904368 h 3.02161 c 0,0 0.91024,-0.099407 1.27135,-0.3263622 0.27408,-0.1711231 0.76807,-0.9312683 0.76807,-0.9312683 z"
+ style="fill:url(#radialGradient4710-4);fill-opacity:1;stroke-width:1.265625;filter:url(#filter4729)" />
<path
- style="fill:url(#radialGradient4712);fill-opacity:1;stroke:none;stroke-width:1.265625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;"
- d="m 163.20859,2.6257296 c -1.25519,0.3270899 -2.23658,1.3140942 -2.53125,2.53125 v 2.53125 7.5937504 2.53125 c 0.29467,1.217155 1.27606,2.20416 2.53125,2.53125 h 3.16406 v -5.0625 -7.5937504 -5.0625 z"
- id="bookmarks-overlay-1" />
+ id="bookmarks-overlay-1"
+ d="m 163.39834,2.5152127 c -1.26526,0 -2.53052,1.2576305 -2.53052,2.5152611 v 2.5152612 7.545783 2.515262 c 0,1.25763 1.26526,2.515261 2.53052,2.515261 h 2.91839 l 0.0559,-4.840061 V 7.6882296 l 0.028,-5.1730169 z"
+ style="fill:url(#radialGradient4712-2);fill-opacity:1;stroke:none;stroke-width:1.265625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;filter:url(#filter4774)" />
<path
- style="opacity:0.66300001;fill:url(#radialGradient4714);fill-opacity:1;stroke:url(#radialGradient4750);stroke-width:0.6328125;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;"
- d="M 166.37156,2.6257296 V 20.34448"
- id="bookmarks-divider-7" />
+ id="bookmarks-divider-7"
+ d="M 165.92886,2.5152127 V 20.122041"
+ style="opacity:0.66300001;fill:url(#radialGradient4714-4);fill-opacity:1;stroke:url(#radialGradient4750-3);stroke-width:1.2614392;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
- d="m 133.26971,34.690626 -6.72001,6.6 c -0.24,0.36 -0.72,0.48 -1.2,0.48 -0.48,0 -0.96,-0.12 -1.32,-0.48 l -6.72,-6.6 c -0.6,-0.72 -0.48,-1.32 0.48,-1.32 h 3.96 v -7.200001 c 0,-0.72 0.48,-1.2 1.2,-1.2 h 4.8 c 0.72,0 1.2,0.48 1.2,1.2 v 7.200001 h 3.84 c 0.96001,0 1.20001,0.6 0.48001,1.32 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ style="display:inline;fill:url(#radialGradient4709-1-2);fill-opacity:1;stroke-width:1;filter:url(#filter4844)"
id="path4214-3"
- style="display:inline;fill:url(#radialGradient4709-1);fill-opacity:1;stroke-width:1;filter:url(#filter5171)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ d="m 133.03211,35.213608 -6.32629,6.288153 c -0.24,0.36 -0.8202,0.518975 -1.3002,0.518975 -0.48,0 -0.87032,-0.158975 -1.23032,-0.518975 l -6.3263,-6.288153 c -0.6,-0.72 -0.96335,-1.29465 -0.003,-1.287183 l 3.79916,0.02955 -0.0908,-7.535242 c -0.009,-0.719949 0.67572,-1.307177 1.39571,-1.31116 l 5.02367,-0.02779 c 0.71999,-0.004 1.25401,0.619416 1.22796,1.33895 l 0.035,7.535242 3.80499,-0.02955 c 0.95998,-0.0075 0.71078,0.567183 -0.009,1.287183 z" />
</g>
</svg>
diff --git a/application/palemoon/themes/windows/Toolbar-inverted.png b/application/palemoon/themes/windows/Toolbar-inverted.png
new file mode 100644
index 000000000..54d83bf5f
--- /dev/null
+++ b/application/palemoon/themes/windows/Toolbar-inverted.png
Binary files differ
diff --git a/application/palemoon/themes/windows/Toolbar.png b/application/palemoon/themes/windows/Toolbar.png
new file mode 100644
index 000000000..8ec756e03
--- /dev/null
+++ b/application/palemoon/themes/windows/Toolbar.png
Binary files differ
diff --git a/application/palemoon/themes/windows/Toolbar.svg b/application/palemoon/themes/windows/Toolbar.svg
index 314e020fb..7a68c0608 100644
--- a/application/palemoon/themes/windows/Toolbar.svg
+++ b/application/palemoon/themes/windows/Toolbar.svg
@@ -6,14 +6,14 @@
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
- enable-background="new 0 0 378 38"
- viewBox="0 0 378 38"
- height="38"
- width="378"
- y="0px"
- x="0px"
+ version="1.1"
id="PaleMoonToolbarSVG"
- version="1.1">
+ x="0px"
+ y="0px"
+ width="378"
+ height="38"
+ viewBox="0 0 378 38"
+ enable-background="new 0 0 378 38">
<metadata
id="metadata146">
<rdf:RDF>
@@ -29,1329 +29,1328 @@
<defs
id="defs144">
<radialGradient
- cy="0.69999999"
- id="globalGradient">
+ id="globalGradient"
+ cy="0.69999999">
<stop
- style="stop-color:#87939b;stop-opacity:1"
+ offset="0.05"
id="stop4"
- offset="0.05" />
+ style="stop-color:#87939b;stop-opacity:1" />
<stop
- style="stop-color:#45555f;stop-opacity:1"
+ offset="1"
id="stop6"
- offset="1" />
+ style="stop-color:#45555f;stop-opacity:1" />
</radialGradient>
<filter
id="insetShadow">
<feFlood
- id="feFlood1875"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood1875" />
<feComposite
- id="feComposite1877"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite1877" />
<feGaussianBlur
- id="feGaussianBlur1879"
- result="blur"
+ in="composite1"
stdDeviation="2"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur1879" />
<feOffset
- id="feOffset1881"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset1881" />
<feComposite
- id="feComposite1883"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite1883" />
</filter>
<filter
- id="filter2164"
- style="color-interpolation-filters:sRGB;">
+ style="color-interpolation-filters:sRGB;"
+ id="filter2164">
<feFlood
- id="feFlood2154"
- result="flood"
+ flood-opacity="1"
flood-color="rgb(0,0,0)"
- flood-opacity="1" />
+ result="flood"
+ id="feFlood2154" />
<feComposite
- id="feComposite2156"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite2156" />
<feGaussianBlur
- id="feGaussianBlur2158"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur2158" />
<feOffset
- id="feOffset2160"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset2160" />
<feComposite
- id="feComposite2162"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite2162" />
</filter>
<radialGradient
- cy="12.21416"
- id="globalGradient-8"
- gradientTransform="matrix(1.0350983,0,0,0.96609178,0,18)"
- cx="95.643087"
- fx="95.643087"
- fy="12.21416"
+ gradientUnits="userSpaceOnUse"
r="7.2456884"
- gradientUnits="userSpaceOnUse">
+ fy="12.21416"
+ fx="95.643087"
+ cx="95.643087"
+ gradientTransform="matrix(1.0350983,0,0,0.96609178,0,18)"
+ id="globalGradient-8"
+ cy="12.21416">
<stop
- style="stop-color:#12d92d;stop-opacity:1"
+ offset="0.05"
id="stop4-5"
- offset="0.05" />
+ style="stop-color:#12d92d;stop-opacity:1" />
<stop
- style="stop-color:#01b222;stop-opacity:1"
+ offset="1"
id="stop6-5"
- offset="1" />
+ style="stop-color:#01b222;stop-opacity:1" />
</radialGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.1087088,0,-1.2351844)"
- r="7.1399999"
- fy="14.778796"
- fx="10.529827"
- cy="14.778796"
- cx="10.529827"
+ xlink:href="#linearGradient4635"
id="radialGradient4669"
- xlink:href="#linearGradient4635" />
+ cx="10.529827"
+ cy="14.778796"
+ fx="10.529827"
+ fy="14.778796"
+ r="7.1399999"
+ gradientTransform="matrix(1,0,0,1.1087088,0,-1.2351844)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4635">
<stop
- id="stop4631"
+ style="stop-color:#6198cb;stop-opacity:1"
offset="0"
- style="stop-color:#6198cb;stop-opacity:1" />
+ id="stop4631" />
<stop
- id="stop4633"
+ style="stop-color:#3a78b2;stop-opacity:1"
offset="1"
- style="stop-color:#3a78b2;stop-opacity:1" />
+ id="stop4633" />
</linearGradient>
<filter
- id="filter4701"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4701">
<feFlood
- id="feFlood4691"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4691" />
<feComposite
- id="feComposite4693"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4693" />
<feGaussianBlur
- id="feGaussianBlur4695"
- result="blur"
+ in="composite1"
stdDeviation="1"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4695" />
<feOffset
- id="feOffset4697"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4697" />
<feComposite
- id="feComposite4699"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4699" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0853313,0,-3.029369)"
- r="8.7600002"
- fy="38.79744"
- fx="11.063469"
- cy="38.79744"
- cx="11.063469"
+ xlink:href="#linearGradient4635"
id="radialGradient4637"
- xlink:href="#linearGradient4635" />
+ cx="11.063469"
+ cy="38.79744"
+ fx="11.063469"
+ fy="38.79744"
+ r="8.7600002"
+ gradientTransform="matrix(1,0,0,1.0853313,0,-3.029369)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter4661"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4661">
<feFlood
- id="feFlood4651"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4651" />
<feComposite
- id="feComposite4653"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4653" />
<feGaussianBlur
- id="feGaussianBlur4655"
- result="blur"
+ in="composite1"
stdDeviation="1"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4655" />
<feOffset
- id="feOffset4657"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4657" />
<feComposite
- id="feComposite4659"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4659" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.1003056,0,-1.1335797)"
- r="7.1399999"
- fy="14.552581"
- fx="34.841751"
- cy="14.552581"
- cx="34.841751"
+ xlink:href="#linearGradient4635"
id="radialGradient4677"
- xlink:href="#linearGradient4635" />
+ cx="34.841751"
+ cy="14.552581"
+ fx="34.841751"
+ fy="14.552581"
+ r="7.1399999"
+ gradientTransform="matrix(1,0,0,1.1003056,0,-1.1335797)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter4689"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4689">
<feFlood
- id="feFlood4679"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4679" />
<feComposite
- id="feComposite4681"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4681" />
<feGaussianBlur
- id="feGaussianBlur4683"
- result="blur"
+ in="composite1"
stdDeviation="1"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4683" />
<feOffset
- id="feOffset4685"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4685" />
<feComposite
- id="feComposite4687"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4687" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.99218759,0,0.09141507)"
- r="7.6799994"
- fy="12.761739"
- fx="58.062626"
- cy="12.761739"
- cx="58.062626"
+ xlink:href="#linearGradient4603"
id="radialGradient4605"
- xlink:href="#linearGradient4603" />
+ cx="58.062626"
+ cy="12.761739"
+ fx="58.062626"
+ fy="12.761739"
+ r="7.6799994"
+ gradientTransform="matrix(1,0,0,0.99218759,0,0.09141507)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4603">
<stop
- id="stop4599"
+ style="stop-color:#e72b1d;stop-opacity:1"
offset="0"
- style="stop-color:#e72b1d;stop-opacity:1" />
+ id="stop4599" />
<stop
- id="stop4601"
+ style="stop-color:#cc4338;stop-opacity:1"
offset="1"
- style="stop-color:#cc4338;stop-opacity:1" />
+ id="stop4601" />
</linearGradient>
<filter
- id="filter4629"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4629">
<feFlood
- id="feFlood4619"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4619" />
<feComposite
- id="feComposite4621"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4621" />
<feGaussianBlur
- id="feGaussianBlur4623"
- result="blur"
+ in="composite1"
stdDeviation="1"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4623" />
<feOffset
- id="feOffset4625"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4625" />
<feComposite
- id="feComposite4627"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4627" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0769231,0,-0.86932835)"
- r="7.8000002"
- fy="13.939252"
- fx="79.305222"
- cy="13.939252"
- cx="79.305222"
+ xlink:href="#linearGradient4523-3"
id="radialGradient4525"
- xlink:href="#linearGradient4523-3" />
+ cx="79.305222"
+ cy="13.939252"
+ fx="79.305222"
+ fy="13.939252"
+ r="7.8000002"
+ gradientTransform="matrix(1,0,0,1.0769231,0,-0.86932835)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4523-3">
<stop
- id="stop4519"
+ style="stop-color:#4fb55d;stop-opacity:1"
offset="0"
- style="stop-color:#4fb55d;stop-opacity:1" />
+ id="stop4519" />
<stop
- id="stop4521"
+ style="stop-color:#2d8539;stop-opacity:1"
offset="1"
- style="stop-color:#2d8539;stop-opacity:1" />
+ id="stop4521" />
</linearGradient>
<filter
- id="filter4597"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4597">
<feFlood
- id="feFlood4587"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4587" />
<feComposite
- id="feComposite4589"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4589" />
<feGaussianBlur
- id="feGaussianBlur4591"
- result="blur"
+ in="composite1"
stdDeviation="1"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4591" />
<feOffset
- id="feOffset4593"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4593" />
<feComposite
- id="feComposite4595"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4595" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.87507716,0,1.3868386)"
- r="9.5995998"
- fy="12.664675"
- fx="103.23091"
- cy="12.664675"
- cx="103.23091"
+ xlink:href="#linearGradient4527"
id="radialGradient4529"
- xlink:href="#linearGradient4527" />
+ cx="103.23091"
+ cy="12.664675"
+ fx="103.23091"
+ fy="12.664675"
+ r="9.5995998"
+ gradientTransform="matrix(1,0,0,0.87507716,0,1.3868386)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4527">
<stop
- id="stop4523"
+ style="stop-color:#3f6bbd;stop-opacity:1"
offset="0"
- style="stop-color:#3f6bbd;stop-opacity:1" />
+ id="stop4523" />
<stop
- id="stop4525"
+ style="stop-color:#29467b;stop-opacity:1"
offset="1"
- style="stop-color:#29467b;stop-opacity:1" />
+ id="stop4525" />
</linearGradient>
<filter
- id="filter4783"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4783">
<feFlood
- id="feFlood4773"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4773" />
<feComposite
- id="feComposite4775"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4775" />
<feGaussianBlur
- id="feGaussianBlur4777"
- result="blur"
+ in="composite1"
stdDeviation="1"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4777" />
<feOffset
- id="feOffset4779"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4779" />
<feComposite
- id="feComposite4781"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4781" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0032611,0,-0.03620244)"
- r="8.3726959"
- fy="16.659737"
- fx="125.30523"
- cy="16.659737"
- cx="125.30523"
+ xlink:href="#linearGradient4707"
id="radialGradient4709"
- xlink:href="#linearGradient4707" />
+ cx="125.30523"
+ cy="16.659737"
+ fx="125.30523"
+ fy="16.659737"
+ r="8.3726959"
+ gradientTransform="matrix(1,0,0,1.0032611,0,-0.03620244)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4707">
<stop
- id="stop4703"
+ style="stop-color:#8c9ba5;stop-opacity:1"
offset="0"
- style="stop-color:#8c9ba5;stop-opacity:1" />
+ id="stop4703" />
<stop
- id="stop4705"
+ style="stop-color:#607480;stop-opacity:1"
offset="1"
- style="stop-color:#607480;stop-opacity:1" />
+ id="stop4705" />
</linearGradient>
<filter
- id="filter4721"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4721">
<feFlood
- id="feFlood4711"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4711" />
<feComposite
- id="feComposite4713"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4713" />
<feGaussianBlur
- id="feGaussianBlur4715"
- result="blur"
+ in="composite1"
stdDeviation="1"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4715" />
<feOffset
- id="feOffset4717"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4717" />
<feComposite
- id="feComposite4719"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4719" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.993055,0,0.07848724)"
- r="8.6400051"
- fy="12.784631"
- fx="149.26262"
- cy="12.784631"
- cx="149.26262"
+ xlink:href="#linearGradient4727"
id="radialGradient4729"
- xlink:href="#linearGradient4727" />
+ cx="149.26262"
+ cy="12.784631"
+ fx="149.26262"
+ fy="12.784631"
+ r="8.6400051"
+ gradientTransform="matrix(1,0,0,0.993055,0,0.07848724)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4727">
<stop
- id="stop4723"
+ style="stop-color:#3eb796;stop-opacity:1"
offset="0"
- style="stop-color:#3eb796;stop-opacity:1" />
+ id="stop4723" />
<stop
- id="stop4725"
+ style="stop-color:#31a886;stop-opacity:1"
offset="1"
- style="stop-color:#31a886;stop-opacity:1" />
+ id="stop4725" />
</linearGradient>
<filter
- id="filter4741"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4741">
<feFlood
- id="feFlood4731"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4731" />
<feComposite
- id="feComposite4733"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4733" />
<feGaussianBlur
- id="feGaussianBlur4735"
- result="blur"
+ in="composite1"
stdDeviation="1"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4735" />
<feOffset
- id="feOffset4737"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4737" />
<feComposite
- id="feComposite4739"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4739" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.79035186,0,0,0.79508811,-0.14216924,6.9389816e-4)"
- r="9.6007004"
- fy="12.037849"
- fx="466.94476"
- cy="12.037849"
- cx="466.94476"
+ xlink:href="#linearGradient5023"
id="radialGradient5017"
- xlink:href="#linearGradient5023" />
+ cx="466.94476"
+ cy="12.037849"
+ fx="466.94476"
+ fy="12.037849"
+ r="9.6007004"
+ gradientTransform="matrix(0.79035186,0,0,0.79508811,-0.14216924,6.9389816e-4)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient5023">
<stop
- style="stop-color:#c6cdd2;stop-opacity:1"
+ id="stop5019"
offset="0"
- id="stop5019" />
+ style="stop-color:#c6cdd2;stop-opacity:1" />
<stop
- style="stop-color:#9cabb4;stop-opacity:1"
+ id="stop5021"
offset="1"
- id="stop5021" />
+ style="stop-color:#9cabb4;stop-opacity:1" />
</linearGradient>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.87500048,0,1.3876528)"
- r="9.5999947"
- fy="13.746766"
- fx="194.44176"
- cy="13.746766"
- cx="194.44176"
+ xlink:href="#linearGradient4707"
id="radialGradient4793"
- xlink:href="#linearGradient4707" />
+ cx="194.44176"
+ cy="13.746766"
+ fx="194.44176"
+ fy="13.746766"
+ r="9.5999947"
+ gradientTransform="matrix(1,0,0,0.87500048,0,1.3876528)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter4805"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4805">
<feFlood
- id="feFlood4795"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4795" />
<feComposite
- id="feComposite4797"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4797" />
<feGaussianBlur
- id="feGaussianBlur4799"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4799" />
<feOffset
- id="feOffset4801"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4801" />
<feComposite
- id="feComposite4803"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4803" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.87500002,0,1.3876579)"
- r="9.6000004"
- fy="11.101265"
- fx="239.2"
- cy="11.101265"
- cx="239.2"
+ xlink:href="#linearGradient4707"
id="radialGradient4833"
- xlink:href="#linearGradient4707" />
+ cx="239.2"
+ cy="11.101265"
+ fx="239.2"
+ fy="11.101265"
+ r="9.6000004"
+ gradientTransform="matrix(1,0,0,0.87500002,0,1.3876579)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter4853"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4853">
<feFlood
- id="feFlood4843"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4843" />
<feComposite
- id="feComposite4845"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4845" />
<feGaussianBlur
- id="feGaussianBlur4847"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4847" />
<feOffset
- id="feOffset4849"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4849" />
<feComposite
- id="feComposite4851"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4851" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.79274533,0,0,0.78327978,-0.14435628,0.11758726)"
- r="3.5288758"
- fy="12.418613"
- fx="242.0894"
- cy="12.418613"
- cx="242.0894"
+ xlink:href="#linearGradient4707"
id="radialGradient4841"
- xlink:href="#linearGradient4707" />
- <radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.9880597,0,0.14828194)"
+ cx="242.26164"
+ cy="12.423289"
+ fx="242.26164"
+ fy="12.423289"
r="3.5288758"
- fy="12.418613"
- fx="242.0894"
- cy="12.418613"
- cx="242.0894"
+ gradientTransform="matrix(0.79274531,0,0,0.78327977,-0.14435628,0.11758726)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ xlink:href="#linearGradient4707"
id="radialGradient4858"
- xlink:href="#linearGradient4707" />
+ cx="242.0894"
+ cy="12.418613"
+ fx="242.0894"
+ fy="12.418613"
+ r="3.5288758"
+ gradientTransform="matrix(1,0,0,0.9880597,0,0.14828194)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.99992718,0,0.00247197)"
- r="9.7507105"
- fy="31.105829"
- fx="466.39926"
- cy="31.105829"
- cx="466.39926"
+ xlink:href="#linearGradient5037"
id="radialGradient5031"
- xlink:href="#linearGradient5037" />
+ cx="466.39926"
+ cy="31.105829"
+ fx="466.39926"
+ fy="31.105829"
+ r="9.7507105"
+ gradientTransform="matrix(1,0,0,0.99992718,0,0.00247197)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient5037">
<stop
- style="stop-color:#e8e1a1;stop-opacity:1"
+ id="stop5033"
offset="0"
- id="stop5033" />
+ style="stop-color:#e8e1a1;stop-opacity:1" />
<stop
- style="stop-color:#baad3e;stop-opacity:1"
+ id="stop5035"
offset="1"
- id="stop5035" />
+ style="stop-color:#baad3e;stop-opacity:1" />
</linearGradient>
<filter
- id="filter5049"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter5049">
<feFlood
- id="feFlood5039"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood5039" />
<feComposite
- id="feComposite5041"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5041" />
<feGaussianBlur
- id="feGaussianBlur5043"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5043" />
<feOffset
- id="feOffset5045"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset5045" />
<feComposite
- id="feComposite5047"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite5047" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.8160434,0,2.0506693)"
- r="10.35937"
- fy="16.56296"
- fx="217.95329"
- cy="16.56296"
- cx="217.95329"
+ xlink:href="#linearGradient4707"
id="radialGradient4813"
- xlink:href="#linearGradient4707" />
+ cx="217.95329"
+ cy="16.56296"
+ fx="217.95329"
+ fy="16.56296"
+ r="10.35937"
+ gradientTransform="matrix(1,0,0,0.8160434,0,2.0506693)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter4825"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4825">
<feFlood
- id="feFlood4815"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4815" />
<feComposite
- id="feComposite4817"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4817" />
<feGaussianBlur
- id="feGaussianBlur4819"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4819" />
<feOffset
- id="feOffset4821"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4821" />
<feComposite
- id="feComposite4823"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4823" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.9969072,0,0.03528241)"
- r="8.5577164"
- fy="15.840806"
- fx="262.79288"
- cy="15.840806"
- cx="262.79288"
+ xlink:href="#linearGradient4707"
id="radialGradient4861"
- xlink:href="#linearGradient4707" />
+ cx="262.79288"
+ cy="15.840806"
+ fx="262.79288"
+ fy="15.840806"
+ r="8.5577164"
+ gradientTransform="matrix(1,0,0,0.9969072,0,0.03528241)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter4873"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4873">
<feFlood
- id="feFlood4863"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4863" />
<feComposite
- id="feComposite4865"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4865" />
<feGaussianBlur
- id="feGaussianBlur4867"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4867" />
<feOffset
- id="feOffset4869"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4869" />
<feComposite
- id="feComposite4871"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4871" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- r="8.53125"
- fy="14.171478"
- fx="286.58698"
- cy="14.171478"
- cx="286.58698"
+ xlink:href="#linearGradient4707"
id="radialGradient4881"
- xlink:href="#linearGradient4707" />
+ cx="286.58698"
+ cy="14.171478"
+ fx="286.58698"
+ fy="14.171478"
+ r="8.53125"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter4893"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4893">
<feFlood
- id="feFlood4883"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4883" />
<feComposite
- id="feComposite4885"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4885" />
<feGaussianBlur
- id="feGaussianBlur4887"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4887" />
<feOffset
- id="feOffset4889"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4889" />
<feComposite
- id="feComposite4891"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4891" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.4,0,-4.4901397)"
- r="6.09375"
- fy="14.457072"
- fx="308.97141"
- cy="14.457072"
- cx="308.97141"
+ xlink:href="#linearGradient4707"
id="radialGradient4901"
- xlink:href="#linearGradient4707" />
+ cx="308.97141"
+ cy="14.457072"
+ fx="308.97141"
+ fy="14.457072"
+ r="6.09375"
+ gradientTransform="matrix(1,0,0,1.4,0,-4.4901397)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter4913"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4913">
<feFlood
- id="feFlood4903"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4903" />
<feComposite
- id="feComposite4905"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4905" />
<feGaussianBlur
- id="feGaussianBlur4907"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4907" />
<feOffset
- id="feOffset4909"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4909" />
<feComposite
- id="feComposite4911"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4911" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- r="8.53125"
- fy="13.119289"
- fx="331.15933"
- cy="13.119289"
- cx="331.15933"
+ xlink:href="#linearGradient4707"
id="radialGradient4921"
- xlink:href="#linearGradient4707" />
+ cx="331.15933"
+ cy="13.119289"
+ fx="331.15933"
+ fy="13.119289"
+ r="8.53125"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter4933"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4933">
<feFlood
- id="feFlood4923"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4923" />
<feComposite
- id="feComposite4925"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4925" />
<feGaussianBlur
- id="feGaussianBlur4927"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4927" />
<feOffset
- id="feOffset4929"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4929" />
<feComposite
- id="feComposite4931"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4931" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.79035186,0,0,0.15902921,-0.14216924,7.1987363)"
- r="6.09375"
- fy="11.316628"
- fx="353.15076"
- cy="11.316628"
- cx="353.15076"
+ xlink:href="#linearGradient4707"
id="radialGradient4941"
- xlink:href="#linearGradient4707" />
- <radialGradient
- gradientUnits="userSpaceOnUse"
+ cx="353.15076"
+ cy="11.316628"
+ fx="353.15076"
+ fy="11.316628"
r="6.09375"
- fy="11.407905"
- fx="375.97003"
- cy="11.407905"
- cx="375.97003"
- id="radialGradient4949"
+ gradientTransform="matrix(0.79035186,0,0,0.15902921,-0.14216924,7.1987363)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ gradientTransform="matrix(0.79035186,0,0,0.79514603,-0.14216924,3.8580698e-5)"
xlink:href="#linearGradient4707"
- gradientTransform="matrix(0.79035186,0,0,0.79514603,-0.14216924,3.8580698e-5)" />
+ id="radialGradient4949"
+ cx="375.97003"
+ cy="11.407905"
+ fx="375.97003"
+ fy="11.407905"
+ r="6.09375"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.99701325,0,0.03407254)"
- r="8.5350475"
- fy="13.518586"
- fx="400.5007"
- cy="13.518586"
- cx="400.5007"
+ xlink:href="#linearGradient4707"
id="radialGradient4957"
- xlink:href="#linearGradient4707" />
+ cx="400.5007"
+ cy="13.518586"
+ fx="400.5007"
+ fy="13.518586"
+ r="8.5350475"
+ gradientTransform="matrix(1,0,0,0.99701325,0,0.03407254)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter4969"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4969">
<feFlood
- id="feFlood4959"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4959" />
<feComposite
- id="feComposite4961"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4961" />
<feGaussianBlur
- id="feGaussianBlur4963"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4963" />
<feOffset
- id="feOffset4965"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4965" />
<feComposite
- id="feComposite4967"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4967" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.357667,-0.02466618,0.02411975,1.3275908,-149.53429,5.1574131)"
- r="8.53125"
- fy="15.742972"
- fx="417.02075"
- cy="15.742972"
- cx="417.02075"
+ xlink:href="#linearGradient4975"
id="radialGradient4977"
- xlink:href="#linearGradient4975" />
+ cx="417.02075"
+ cy="15.742972"
+ fx="417.02075"
+ fy="15.742972"
+ r="8.53125"
+ gradientTransform="matrix(1.357667,-0.02466618,0.02411975,1.3275908,-149.53429,5.1574131)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4975">
<stop
- id="stop4971"
+ style="stop-color:#f79729;stop-opacity:1"
offset="0"
- style="stop-color:#f79729;stop-opacity:1" />
+ id="stop4971" />
<stop
- id="stop4973"
+ style="stop-color:#d2831f;stop-opacity:1"
offset="1"
- style="stop-color:#d2831f;stop-opacity:1" />
+ id="stop4973" />
</linearGradient>
<filter
- id="filter4989"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4989">
<feFlood
- id="feFlood4979"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4979" />
<feComposite
- id="feComposite4981"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4981" />
<feGaussianBlur
- id="feGaussianBlur4983"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4983" />
<feOffset
- id="feOffset4985"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset4985" />
<feComposite
- id="feComposite4987"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4987" />
</filter>
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.71428563,0,3.2333231)"
- r="8.53125"
- fy="11.316628"
- fx="444.33652"
- cy="11.316628"
- cx="444.33652"
+ xlink:href="#linearGradient4707"
id="radialGradient4997"
- xlink:href="#linearGradient4707" />
+ cx="444.33652"
+ cy="11.316628"
+ fx="444.33652"
+ fy="11.316628"
+ r="8.53125"
+ gradientTransform="matrix(1,0,0,0.71428563,0,3.2333231)"
+ gradientUnits="userSpaceOnUse" />
<filter
- id="filter5009"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter5009">
<feFlood
- id="feFlood4999"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4999" />
<feComposite
- id="feComposite5001"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite5001" />
<feGaussianBlur
- id="feGaussianBlur5003"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur5003" />
<feOffset
- id="feOffset5005"
- result="offset"
+ dx="0"
dy="0"
- dx="0" />
+ result="offset"
+ id="feOffset5005" />
<feComposite
- id="feComposite5007"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite5007" />
</filter>
<radialGradient
- r="7.9746099"
- fy="9"
- fx="134.97461"
- cy="9"
- cx="134.97461"
- gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
- gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient4747"
id="radialGradient4710"
- xlink:href="#linearGradient4747" />
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
+ cx="134.97461"
+ cy="9"
+ fx="134.97461"
+ fy="9"
+ r="7.9746099" />
<linearGradient
id="linearGradient4747">
<stop
- id="stop4743"
+ style="stop-color:#c5b631;stop-opacity:1"
offset="0"
- style="stop-color:#c5b631;stop-opacity:1" />
+ id="stop4743" />
<stop
- id="stop4745"
+ style="stop-color:#baad3e;stop-opacity:1"
offset="1"
- style="stop-color:#baad3e;stop-opacity:1" />
+ id="stop4745" />
</linearGradient>
<filter
- id="filter4729"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4729">
<feFlood
- id="feFlood4719"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4719" />
<feComposite
- id="feComposite4721"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4721" />
<feGaussianBlur
- id="feGaussianBlur4723"
- result="blur"
+ in="composite1"
stdDeviation="1"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4723" />
<feOffset
- id="feOffset4725"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4725" />
<feComposite
- id="feComposite4727"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4727" />
</filter>
<radialGradient
- r="7.9746099"
- fy="9.0947113"
- fx="132.6468"
- cy="9.0947113"
- cx="132.6468"
- gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
- gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient5037"
id="radialGradient4712"
- xlink:href="#linearGradient5037" />
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
+ cx="132.6468"
+ cy="9.0947113"
+ fx="132.6468"
+ fy="9.0947113"
+ r="7.9746099" />
<filter
- id="filter4774"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4774">
<feFlood
- id="feFlood4764"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4764" />
<feComposite
- id="feComposite4766"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4766" />
<feGaussianBlur
- id="feGaussianBlur4768"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4768" />
<feOffset
- id="feOffset4770"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4770" />
<feComposite
- id="feComposite4772"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4772" />
</filter>
<radialGradient
- r="7.9746099"
- fy="9"
- fx="134.97461"
- cy="9"
- cx="134.97461"
- gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
- gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient4747"
id="radialGradient4714"
- xlink:href="#linearGradient4747" />
- <radialGradient
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,28.000001,0,-310.09784)"
- r="0.31640625"
- fy="11.485105"
- fx="166.37157"
- cy="11.485105"
- cx="166.37157"
+ gradientTransform="matrix(1.265625,0,0,1.1109477,-0.05703897,1.4865748)"
+ cx="134.97461"
+ cy="9"
+ fx="134.97461"
+ fy="9"
+ r="7.9746099" />
+ <radialGradient
+ xlink:href="#linearGradient4707"
id="radialGradient4750"
- xlink:href="#linearGradient4707" />
+ cx="166.37157"
+ cy="11.485105"
+ fx="166.37157"
+ fy="11.485105"
+ r="0.31640625"
+ gradientTransform="matrix(0.99998863,-0.00473886,0.08838422,18.426509,-1.0132111,-199.35688)"
+ gradientUnits="userSpaceOnUse" />
<radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0032611,0.11563445,22.233158)"
- r="8.3726959"
- fy="16.659737"
- fx="125.30523"
- cy="16.659737"
- cx="125.30523"
+ xlink:href="#linearGradient4832"
id="radialGradient4709-1"
- xlink:href="#linearGradient4832" />
+ cx="125.30523"
+ cy="16.659737"
+ fx="125.30523"
+ fy="16.659737"
+ r="8.3726959"
+ gradientTransform="matrix(1,0,0,1.0032611,0.11563445,22.233158)"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4832">
<stop
- style="stop-color:#22e23d;stop-opacity:1"
+ id="stop5029"
offset="0"
- id="stop5029" />
+ style="stop-color:#22e23d;stop-opacity:1" />
<stop
- style="stop-color:#38a748;stop-opacity:1"
+ id="stop4830"
offset="1"
- id="stop4830" />
+ style="stop-color:#38a748;stop-opacity:1" />
</linearGradient>
<filter
- id="filter4844"
- style="color-interpolation-filters:sRGB">
+ style="color-interpolation-filters:sRGB"
+ id="filter4844">
<feFlood
- id="feFlood4834"
- result="flood"
+ flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
- flood-opacity="0.498039" />
+ result="flood"
+ id="feFlood4834" />
<feComposite
- id="feComposite4836"
- result="composite1"
- operator="out"
+ in="flood"
in2="SourceGraphic"
- in="flood" />
+ operator="out"
+ result="composite1"
+ id="feComposite4836" />
<feGaussianBlur
- id="feGaussianBlur4838"
- result="blur"
+ in="composite1"
stdDeviation="0.5"
- in="composite1" />
+ result="blur"
+ id="feGaussianBlur4838" />
<feOffset
- id="feOffset4840"
- result="offset"
+ dx="2.77556e-017"
dy="0"
- dx="2.77556e-017" />
+ result="offset"
+ id="feOffset4840" />
<feComposite
- id="feComposite4842"
- result="composite2"
- operator="atop"
+ in="offset"
in2="SourceGraphic"
- in="offset" />
+ operator="atop"
+ result="composite2"
+ id="feComposite4842" />
</filter>
</defs>
<g
- id="layer1">
+ id="g7757">
<path
- id="path4"
- d="m 17.311578,13.702319 h -5.76 l 2.28,2.28 c 0.6,0.6 0.72,1.44 0.24,1.92 l -0.96,1.08 c -0.48,0.48 -1.32,0.36 -1.92,-0.24 l -6.4800001,-6.6 c -0.12,0 -0.36,-0.48 -0.48,-0.84 0,-0.359999 0.36,-0.719999 0.48,-0.839999 l 6.3600001,-6.48 c 0.6,-0.6000001 1.44,-0.7200001 1.92,-0.24 l 0.96,1.0799999 c 0.48,0.48 0.36,1.32 -0.24,1.9200001 l -2.16,2.1599999 h 5.76 c 0.72,0 1.2,0.48 1.2,1.2000001 v 2.399999 c 0,0.72 -0.48,1.2 -1.2,1.2 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4669);fill-opacity:1;stroke-width:1;filter:url(#filter4701)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ d="m 17.870749,13.841269 -6.303534,-0.0074 2.264363,2.148431 c 0.615648,0.584128 0.72,1.44 0.24,1.92 l -0.96,1.08 c -0.48,0.48 -1.32,0.36 -1.92,-0.24 0,0 -6.4200001,-6.6 -6.4800001,-6.6 -0.06,0 -0.36,-0.48 -0.48,-0.84 0,-0.359999 0.36,-0.719999 0.48,-0.839999 l 6.3600001,-6.48 c 0.6,-0.6000001 1.44,-0.7200001 1.92,-0.24 l 0.96,1.0799999 c 0.48,0.48 0.36,1.32 -0.24,1.9200001 l -2.144363,2.0610645 6.359451,0.043374 c 0.719983,0.00491 1.227959,0.50779 1.227959,1.2277905 v 2.483369 c 0,0.72 -0.563877,1.284215 -1.283876,1.28337 z"
+ id="path4" />
<path
- d="m 19.271765,37.987692 h -7.987059 l 3.607059,3.507571 c 0.515294,0.50108 0.644117,1.377974 0.257648,1.753785 l -1.545884,1.503245 C 13.217059,45.128104 12.315294,45.128104 11.8,44.501752 L 3.5552941,36.609718 c 0,0 -0.5152941,-0.626352 -0.5152941,-1.127434 0,-0.501081 0.5152941,-1.002163 0.5152941,-1.002163 L 11.8,26.462816 c 0.515294,-0.50108 1.417059,-0.626351 1.803529,-0.25054 l 1.545884,1.503245 c 0.386469,0.375811 0.386469,1.252704 -0.257648,1.753785 l -3.478236,3.50757 h 7.858236 c 0.772941,0 1.288236,0.501082 1.288236,1.252705 v 2.505407 c 0,0.751622 -0.515295,1.252704 -1.288236,1.252704 z"
- id="path4154"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4637);fill-opacity:1;stroke-width:1;filter:url(#filter4661)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path4154"
+ d="m 19.187889,37.765372 -7.620674,-0.0365 3.352509,3.266174 c 0.515294,0.50108 0.829738,1.388534 0.443269,1.764345 l -1.759464,1.992905 c -0.356609,0.403923 -1.52102,-0.108922 -2.036314,-0.735274 L 3.9756591,36.471238 c 0,0 -0.7399492,-0.710192 -0.7399492,-1.211274 0,-0.501081 0.7399492,-1.303987 0.7399492,-1.303987 l 7.5915559,-7.545783 c 0.515294,-0.50108 1.613776,-1.093109 1.980397,-0.698138 l 1.815381,1.955768 c 0.386469,0.375811 0.172889,1.300401 -0.471228,1.801482 l -3.32455,3.229041 7.620674,0.02842 c 0.772936,0.0029 1.344153,0.417712 1.344153,1.169335 v 2.560987 c 0,0.751622 -0.571221,1.311987 -1.344153,1.308283 z" />
<path
- d="m 26.86,12.501265 v -2.4 c 0,-0.7200003 0.48,-1.2000003 1.2,-1.2000003 h 5.76 L 31.66,6.7412646 c -0.6,-0.5999999 -0.72,-1.4399999 -0.24,-1.92 l 0.96,-1.08 c 0.48,-0.48 1.32,-0.36 1.92,0.24 l 6.36,6.4800004 c 0.12,0.12 0.48,0.48 0.48,0.84 0,0.36 -0.36,0.84 -0.48,0.84 l -6.48,6.48 c -0.6,0.6 -1.44,0.72 -1.92,0.24 l -0.96,-1.08 c -0.48,-0.48 -0.36,-1.32 0.24,-1.92 l 2.28,-2.16 h -5.76 c -0.72,0 -1.2,-0.48 -1.2,-1.2 z"
- id="path4165"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4677);fill-opacity:1;stroke-width:1;filter:url(#filter4689)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path4165"
+ d="m 26.776124,12.612425 v -2.53895 c 0,-0.7200003 0.480206,-1.3282747 1.2,-1.3111602 l 5.76,0.041051 L 31.66,6.7412646 c -0.602042,-0.5979755 -0.72,-1.4399999 -0.24,-1.92 l 0.96,-1.08 c 0.48,-0.48 1.32,-0.36 1.92,0.24 l 6.36,6.4800004 c 0.12,0.12 0.48,0.48 0.48,0.84 0,0.36 -0.36,0.84 -0.48,0.84 l -6.48,6.48 c -0.6,0.6 -1.44,0.72 -1.92,0.24 l -0.96,-1.08 c -0.48,-0.48 -0.36,-1.32 0.24,-1.92 L 33.736124,13.833888 28.06,13.868005 c -0.719987,0.0043 -1.283876,-0.53558 -1.283876,-1.25558 z" />
<path
- d="m 64.48,6.6012647 -5.039999,5.0400003 5.039999,5.04 -2.519999,2.52 -5.16,-4.92 -5.04,5.04 -2.52,-2.52 5.04,-5.16 -5.16,-5.0400003 2.52,-2.5200001 5.16,5.04 5.04,-5.04 z"
- id="path4176"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4605);fill-opacity:1;stroke-width:1;filter:url(#filter4629)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path4176"
+ d="m 64.708108,6.2881044 -5.061037,5.0305226 5.061037,5.030522 -2.530518,2.515261 -5.061038,-5.030522 -5.061037,5.030522 -2.530519,-2.515261 5.061037,-5.030522 -5.061037,-5.0305226 2.530519,-2.5152612 5.061037,5.0305223 5.061038,-5.0305223 z" />
<path
- d="m 87.000001,11.301265 h -8.4 l 3.36,-3.3600004 c -0.84,-0.6 -1.68,-0.84 -2.76,-0.84 -2.64,0 -4.8,2.1600001 -4.8,4.8000004 0,2.64 2.16,4.8 4.8,4.8 1.68,0 3.24,-0.84 4.08,-2.28 l 2.76,1.2 c -1.32,2.4 -3.84,4.08 -6.84,4.08 -4.32,0 -7.8,-3.48 -7.8,-7.8 0,-4.3200004 3.48,-7.8000004 7.8,-7.8000004 1.8,0 3.48,0.6 4.92,1.6800001 l 2.88,-2.8800001 z"
- id="path4187"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4525);fill-opacity:1;stroke-width:1;filter:url(#filter4597)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path4187"
+ d="m 87.482777,11.318627 h -8.856816 l 3.13833,-3.0716727 C 81.15648,7.545735 80.363876,6.712205 79.283876,6.712205 c -2.64,0 -5.107543,1.9376803 -5.107543,4.577681 0,2.64 2.411627,5.050109 5.051627,5.050109 1.68,0 3.619039,-1.066107 4.459039,-2.506107 l 2.530518,1.25763 c -1.32,2.4 -3.961599,4.443007 -6.961599,4.443007 -4.32,0 -8.219378,-3.896849 -8.219378,-8.216849 0,-4.3200008 3.927337,-7.633261 8.247337,-7.633261 1.8,0 3.619792,0.8778997 5.059792,1.9578998 l 3.139108,-3.1271021 z" />
<path
- id="path4209"
- d="M 102.59961,2.7011715 93,11.101561 h 2.400391 l 1.242188,-0.03516 -0.04297,0.03516 v 8.400392 h 4.800781 v -6.000001 h 2.40039 v 6.000001 h 4.79884 v -8.400392 l -0.043,-0.03516 1.24415,0.03516 h 2.39843 z"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4529);fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1;filter:url(#filter4783)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ d="M 102.66589,2.5152127 92.543814,11.318627 h 3.795778 v 7.545783 h 5.061038 v -5.030522 h 2.53052 v 5.030522 h 5.06104 v -7.545783 h 3.79577 z"
+ id="path4209" />
<path
- d="m 133.15407,12.421265 -6.72001,6.6 c -0.24,0.36 -0.72,0.48 -1.2,0.48 -0.48,0 -0.96,-0.12 -1.32,-0.48 l -6.72,-6.6 c -0.6,-0.72 -0.48,-1.32 0.48,-1.32 h 3.96 V 3.9012646 c 0,-0.72 0.48,-1.2 1.2,-1.2 h 4.8 c 0.72,0 1.2,0.48 1.2,1.2 v 7.2000004 h 3.84 c 0.96001,0 1.20001,0.6 0.48001,1.32 z"
- id="path4214"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4709);fill-opacity:1;stroke-width:1;filter:url(#filter4721)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path4214"
+ d="m 133.03211,12.576257 -6.32629,6.288153 c -0.24,0.36 -0.82401,0.692435 -1.30401,0.692435 -0.48,0 -0.86651,-0.332435 -1.22651,-0.692435 l -6.3263,-6.288153 c -0.79571,-0.72 -0.93921,-1.286268 0.0208,-1.280462 l 3.77501,0.02283 -0.0107,-7.5841022 c -0.001,-0.7199993 0.50796,-1.1722101 1.22796,-1.1722101 h 5.10754 c 0.72,0 1.22426,0.4800094 1.22796,1.2 l 0.0388,7.5563123 3.80118,-0.05062 c 0.95992,-0.01278 0.71459,0.588252 -0.005,1.308252 z" />
<path
- d="m 148,19.881265 c -4.8,0 -8.64,-3.84 -8.64,-8.64 0,-4.6800004 3.84,-8.5200004 8.64,-8.5200004 4.8,0 8.64001,3.84 8.64001,8.6400004 0,4.68 -3.84001,8.52 -8.64001,8.52 z m 0,-14.5200003 c -3.36,0 -6,2.6399999 -6,6.0000003 0,3.24 2.64,6 6,6 3.36,0 6.00001,-2.64 6.00001,-6 0,-3.3600004 -2.64001,-6.0000003 -6.00001,-6.0000003 z m -0.36,7.0800003 c -0.48,-0.12 -0.84,-0.6 -0.84,-1.08 V 7.7612646 c 0,-0.72 0.48,-1.2 1.2,-1.2 0.72,0 1.2,0.48 1.2,1.2 v 3.3600004 c 1.32,1.32 2.4,3.84 2.4,3.84 0,0 -2.64,-1.2 -3.96,-2.52 z"
- id="path4225"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4729);fill-opacity:1;stroke-width:1;filter:url(#filter4741)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path4225"
+ d="m 148.19571,20.103585 c -4.8,0 -8.89163,-3.97895 -8.89163,-8.77895 0,-4.6800005 4.11959,-8.7145303 8.91959,-8.7145303 4.8,0 8.80776,3.9511599 8.80776,8.7511603 0,4.68 -4.03572,8.74232 -8.83572,8.74232 z m 0.0559,-15.04801 c -3.36,0 -6.39142,2.9178996 -6.39142,6.2779 0,3.24 2.9755,6.22232 6.3355,6.22232 3.36,0 6.33551,-2.86232 6.33551,-6.22232 0,-3.3600004 -2.91959,-6.2779 -6.27959,-6.2779 z m -0.63959,7.520682 c -0.48,-0.12 -0.63716,-0.735044 -0.64429,-1.214992 l -0.0559,-3.7667402 c -0.0107,-0.7199217 0.53592,-1.28337 1.25592,-1.28337 0.72,0 1.27834,0.535601 1.28388,1.25558 l 0.0289,3.7518922 c 1.32,1.32 2.53051,3.772891 2.53051,3.772891 0,0 -3.07896,-1.195261 -4.39896,-2.515261 z" />
<path
- d="m 369.00476,4.7878231 0.94842,1.9083504 0.47422,0.858758 0.94842,0.190835 2.18136,0.3816699 -1.61231,1.7175156 -0.6639,0.667923 0.0948,0.954175 0.37937,2.290022 -1.89685,-0.954178 -0.85358,-0.477086 -0.85358,0.477086 -1.89685,0.954178 0.37938,-2.290022 0.0948,-0.954175 -0.6639,-0.667923 -1.61232,-1.7175156 2.27622,-0.3816699 0.94842,-0.190835 0.37936,-0.858758 0.94843,-1.9083504 m 0,-3.4350309 c -0.28454,0 -0.56906,0.1908348 -0.75874,0.667922 l -1.89683,3.9121193 -4.07821,0.6679227 c -0.94842,0.190835 -1.13812,0.8587576 -0.47421,1.5266802 l 2.94011,3.1487776 -0.66391,4.389208 c -0.0948,0.572504 0.1897,0.954174 0.66391,0.954174 0.18967,0 0.37936,-0.09542 0.56905,-0.190835 l 3.69885,-2.003768 3.69884,2.003768 c 0.18969,0.09543 0.47421,0.190835 0.56906,0.190835 0.4742,0 0.75873,-0.38167 0.6639,-1.049592 l -0.6639,-4.389207 2.9401,-3.1487781 c 0.66391,-0.6679226 0.37938,-1.3358454 -0.4742,-1.5266803 L 371.66031,5.837416 369.76347,1.9252968 C 369.5738,1.543627 369.28926,1.3527922 369.00474,1.3527922 Z"
+ style="display:inline;fill:url(#radialGradient5017);fill-opacity:1;stroke-width:0.79274529"
id="path4355"
- style="display:inline;fill:url(#radialGradient5017);fill-opacity:1;stroke-width:0.79274529" />
+ d="m 369.00476,4.7878231 0.94842,1.9083504 0.47422,0.858758 0.94842,0.190835 2.18136,0.3816699 -1.61231,1.7175156 -0.6639,0.667923 0.0948,0.954175 0.37937,2.290022 -1.89685,-0.954178 -0.85358,-0.477086 -0.85358,0.477086 -1.89685,0.954178 0.37938,-2.290022 0.0948,-0.954175 -0.6639,-0.667923 -1.61232,-1.7175156 2.27622,-0.3816699 0.94842,-0.190835 0.37936,-0.858758 0.94843,-1.9083504 m 0,-3.4350309 c -0.28454,0 -0.56906,0.1908348 -0.75874,0.667922 l -1.89683,3.9121193 -4.07821,0.6679227 c -0.94842,0.190835 -1.13812,0.8587576 -0.47421,1.5266802 l 2.94011,3.1487776 -0.66391,4.389208 c -0.0948,0.572504 0.1897,0.954174 0.66391,0.954174 0.18967,0 0.37936,-0.09542 0.56905,-0.190835 l 3.69885,-2.003768 3.69884,2.003768 c 0.18969,0.09543 0.47421,0.190835 0.56906,0.190835 0.4742,0 0.75873,-0.38167 0.6639,-1.049592 l -0.6639,-4.389207 2.9401,-3.1487781 c 0.66391,-0.6679226 0.37938,-1.3358454 -0.4742,-1.5266803 L 371.66031,5.837416 369.76347,1.9252968 C 369.5738,1.543627 369.28926,1.3527922 369.00474,1.3527922 Z" />
<path
- d="m 202,17.101265 h -2.4 l 1.2,2.4 h -14.39999 l 1.2,-2.4 h -2.4 c -0.72,0 -1.2,-0.48 -1.2,-1.2 V 9.9012647 c 0,-0.7200001 0.48,-1.2000001 1.2,-1.2000001 h 1.2 V 6.3012647 c 0,-0.7200001 0.48,-1.2000001 1.2,-1.2000001 v -1.2 c 0,-0.72 0.48,-1.2 1.2,-1.2 H 198.4 c 0.72,0 1.2,0.48 1.2,1.2 v 1.2 c 0.72,0 1.2,0.48 1.2,1.2000001 v 2.3999999 h 1.2 c 0.72,0 1.2,0.48 1.2,1.2000001 v 6.0000003 c 0,0.72 -0.48,1.2 -1.2,1.2 z m -14.39999,0 0.6,-1.2 h -0.6 z m 0.6,-6 h -0.6 -0.6 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 h 1.2 c 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z M 198.4,5.1012646 c 0,-0.72 -0.48,-1.2 -1.2,-1.2 h -7.19999 c -0.72,0 -1.2,0.48 -1.2,1.2 v 3.6 c 0,0.7200001 0.48,1.2000001 1.2,1.2000001 H 197.2 c 0.72,0 1.2,-0.48 1.2,-1.2000001 z m -1.08,10.8000004 h -7.43999 l -1.08,2.4 H 198.4 Z m 2.28,0 H 199 l 0.6,1.2 z"
- id="path4366"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4793);fill-opacity:1;stroke-width:1;filter:url(#filter4805)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path4366"
+ d="m 202.62125,17.648005 -2.53039,-0.04122 1.26526,2.515261 h -15.18311 l 1.26526,-2.515261 -2.51784,0.02249 c -0.71997,0.0064 -1.31817,-0.563397 -1.31184,-1.28337 l 0.0559,-6.3612693 c 0.006,-0.7199727 0.59192,-1.2112687 1.31183,-1.2000001 l 1.19667,0.018731 0.0313,-2.5298907 c 0.009,-0.7199457 0.51397,-1.243001 1.23397,-1.243001 l 0.022,-1.2403691 c 0.0127,-0.7198886 0.6198,-1.2535885 1.33979,-1.2555799 l 10.04733,-0.02779 c 0.72,-0.00199 1.21931,0.5078413 1.22796,1.22779 l 0.0156,1.295949 c 0.72,0 1.2692,0.5785813 1.26831,1.2985809 l -0.003,2.4743108 1.26513,-10e-8 c 0.71992,-0.010711 1.26205,0.5376375 1.26526,1.2576305 v 6.288153 c 0,0.729621 -0.61509,1.257631 -1.26526,1.257631 z m -15.18298,-0.04122 1.26526,-2.515262 h -1.26526 z m 0.6,-6.288153 h -0.6 -0.6 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 h 1.2 c 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.25348,-0.503016 -0.6,-0.6 z M 198.8256,5.0304738 c 0,-0.72 -0.54528,-1.2523398 -1.26526,-1.2576306 h -7.59155 c -0.71998,-0.00529 -1.28117,0.5378043 -1.26526,1.2576306 v 3.7728917 c 0.0159,0.7198264 0.54528,1.2629215 1.26526,1.2576305 h 7.59155 c 0.71999,-0.0053 1.24942,-0.5078188 1.25592,-1.2277899 z m -1.26526,10.0610482 h -7.59155 l -1.26526,3.772892 h 10.12207 z m 2.53052,0 h -1.26526 l 1.26526,2.515262 z" />
<path
- d="m 247,19.501265 h -15.6 c -0.96,0 -1.8,-0.84 -1.8,-1.8 V 4.5012646 c 0,-0.9599999 0.84,-1.8 1.8,-1.8 H 247 c 0.96,0 1.8,0.8400001 1.8,1.8 V 17.701265 c 0,0.96 -0.84,1.8 -1.8,1.8 z M 239.8,3.9012646 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 2.28,0 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.36,0.6 0.6,0.6 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 3.72,0 h -1.2 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 h 1.2 c 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 0.6,4.8 c 0,-0.72 -0.48,-1.1999999 -1.2,-1.1999999 h -12 c -0.72,0 -1.2,0.4799999 -1.2,1.1999999 v 7.2000004 c 0,0.72 0.48,1.2 1.2,1.2 h 12 c 0.72,0 1.2,-0.48 1.2,-1.2 z"
- id="path4388"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4833);fill-opacity:1;stroke-width:1;filter:url(#filter4853)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
- <text
- transform="scale(0.98484982,1.0153832)"
- id="text4409"
- y="12.608931"
- x="188.06316"
+ id="path4388"
+ d="m 248.17426,18.945466 -16.43876,-0.02779 c -0.96,-0.0016 -1.40468,-0.339789 -1.40858,-1.299781 l -0.0559,-13.7557998 c -0.004,-0.959992 0.47654,-1.3847678 1.43653,-1.3831504 l 16.49468,0.02779 c 0.96,0.00162 1.24473,0.3675784 1.24083,1.3275705 l -0.0559,13.7557997 c -0.004,0.959992 -0.25287,1.356983 -1.21287,1.355361 z M 239.88388,3.8178947 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 2.64346,0 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.36,0.6 0.6,0.6 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 3.72,0 h -1.2 c -0.36,0 -0.6,0.24 -0.6,0.6 0,0.36 0.24,0.6 0.6,0.6 h 1.2 c 0.36,0 0.6,-0.24 0.6,-0.6 0,-0.36 -0.24,-0.6 -0.6,-0.6 z m 0.65592,4.9945298 c 0.005,-0.7199803 -0.53592,-1.2538267 -1.25592,-1.2555798 l -11.41287,-0.02779 c -0.72,-0.00175 -1.22533,0.5077946 -1.22796,1.2277899 l -0.028,7.6724304 c -0.003,0.719994 0.50796,1.175707 1.22795,1.172209 l 11.44083,-0.05558 c 0.71999,-0.0035 1.19464,-0.507809 1.2,-1.227789 z" />
+ <g
+ aria-label="+"
+ transform="scale(0.98484984,1.0153832)"
style="font-style:normal;font-weight:normal;font-size:9.51294327px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:url(#radialGradient4841);fill-opacity:1;stroke:none;stroke-width:0.79274535px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- xml:space="preserve"><tspan
+ id="text4409">
+ <path
+ d="m 194.95358,9.8484986 h -2.03077 v 1.9696994 h -1.01538 V 9.8484986 h -2.03077 V 8.8636487 h 2.03077 V 6.893949 h 1.01538 v 1.9696997 h 2.03077 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.55116463px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#radialGradient4841);fill-opacity:1;stroke-width:0.79274535px"
- y="12.608931"
- x="188.06316"
- id="tspan4411">+</tspan></text>
+ id="path7725" />
+ </g>
<path
- style="display:inline;fill:url(#radialGradient5031);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5049)"
- id="path6182"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
d="m 467.25784,24.196945 c -0.36562,0 -0.73125,0.24375 -0.975,0.853125 l -2.4375,4.996876 -5.24062,0.853125 c -1.21875,0.24375 -1.4625,1.096875 -0.60938,1.95 l 3.77813,4.021875 -0.85313,5.60625 c -0.12181,0.73125 0.24375,1.21875 0.85313,1.21875 0.24375,0 0.4875,-0.121875 0.73125,-0.24375 l 4.75312,-2.559375 4.75313,2.559375 c 0.24375,0.121875 0.60937,0.24375 0.73125,0.24375 0.60937,0 0.975,-0.4875 0.85312,-1.340625 l -0.85312,-5.60625 3.77812,-4.021875 c 0.85313,-0.853125 0.4875,-1.70625 -0.60937,-1.95 l -5.24063,-0.853125 -2.4375,-4.996876 c -0.24375,-0.4875 -0.60937,-0.73125 -0.975,-0.73125 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path6182"
+ style="display:inline;fill:url(#radialGradient5031);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5049)" />
<path
- style="display:inline;fill:url(#radialGradient4813);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4825)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 226.66131,15.091518 -0.0388,3.707848 c -0.007,0.673061 -0.5177,1.245488 -1.19079,1.24654 l -17.77799,0.02779 c -0.6731,0.0011 -1.2416,-0.573462 -1.24671,-1.24654 l -0.028,-3.688049 c -0.005,-0.673078 0.6302,-1.305219 1.30331,-1.305219 1.26531,-1.257631 1.03718,-3.269047 1.26531,-5.0305225 0.4278,-2.8226251 0.0953,-6.2244545 3.80878,-6.2479747 l 7.52682,-0.047673 c 3.73297,-0.023644 3.4173,3.4730226 3.84751,6.2956477 0.41438,2.7153765 0,3.7728915 1.26526,5.0305225 0.70548,0 1.26526,0.515815 1.26526,1.25763 z m -7.68106,-4.410561 h -1.82811 V 8.8528316 c 0,-0.8124995 -1.21875,-0.8124995 -1.21875,0 v 1.8281254 h -1.82814 c -0.8125,0 -0.8125,1.218749 0,1.218749 h 1.82814 v 1.828125 c 0,0.812501 1.21875,0.812501 1.21875,0 v -1.828125 h 1.82811 c 0.8125,0 0.8125,-1.218749 0,-1.218749 z"
id="path7318"
- d="m 226.73438,15.945016 v 2.437501 c 0,0.673097 -0.54566,1.21875 -1.21875,1.21875 h -18.28124 c -0.67311,0 -1.21875,-0.545653 -1.21875,-1.21875 v -2.437501 c 0,-0.673097 0.54564,-1.21875 1.21875,-1.21875 h -1.04571 c 2.80313,0 2.36053,-3.256168 2.77368,-5.9703239 0.4278,-2.8226251 0.1927,-6.1069689 3.90598,-6.0616014 l 7.47091,0.091277 c 3.73276,0.045605 3.22143,3.1476992 3.65164,5.9703243 0.41438,2.715376 -0.20346,5.970324 2.60942,5.970324 h -1.08468 c 0.67309,0 1.21875,0.545653 1.21875,1.21875 z m -7.92188,-4.874999 h -1.82811 V 9.2418912 c 0,-0.8124995 -1.21875,-0.8124995 -1.21875,0 v 1.8281258 h -1.82814 c -0.8125,0 -0.8125,1.218749 0,1.218749 h 1.82814 v 1.828125 c 0,0.812501 1.21875,0.812501 1.21875,0 v -1.828125 h 1.82811 c 0.8125,0 0.8125,-1.218749 0,-1.218749 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4813);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4825)" />
<path
- style="display:inline;fill:url(#radialGradient4861);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4873)"
- id="path7886"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
d="m 269.02823,19.939154 c -0.975,0 -1.82813,-0.24375 -2.80313,-1.584375 -0.975,-1.340625 -2.07187,-3.046875 -2.07187,-3.046875 0,0 -0.85313,-1.096875 -1.34063,-1.95 -0.60937,-0.853125 -1.34062,-0.609375 -1.34062,-0.609375 0,0 -3.53438,-5.7281239 -4.14375,-6.581249 -0.73125,-1.21875 0.73125,-3.290625 0.73125,-3.290625 l 5.3625,8.531249 c 0,0 1.70625,2.315625 2.31562,2.803125 0.60938,0.4875 1.70625,-0.4875 3.4125,1.096875 2.31563,2.19375 1.58438,4.63125 -0.12181,4.63125 z m -0.36563,-3.534375 c -1.09687,-1.21875 -2.07187,-1.096875 -2.31562,-0.73125 -0.24375,0.365625 0,1.4625 0.4875,2.071875 0.4875,0.609375 0.975,0.853125 1.70625,0.853125 0.73125,0.121875 1.34062,-0.853125 0.1218,-2.19375 z m -4.63125,-5.728124 -1.4625,-2.19375 3.53438,-5.60625 c 0,0 1.4625,2.071875 0.73125,3.290625 -0.36563,0.4875001 -1.70625,2.803125 -2.80313,4.509375 z m -5.60625,3.534374 c 0.36563,-0.365625 1.21875,-1.340625 1.70625,-2.071875 l 0.975,1.4625 c -0.4875,0.73125 -1.09687,1.70625 -1.09687,1.70625 0,0 -1.09688,1.70625 -2.07188,3.046875 -0.85312,1.340625 -1.70625,1.584375 -2.80312,1.584375 -1.70625,0 -2.55938,-2.4375 -0.12181,-4.63125 1.70625,-1.4625 2.80312,-0.609375 3.4125,-1.096875 z m -2.925,2.19375 c -1.09687,1.21875 -0.4875,2.19375 0.24375,2.19375 0.73125,0 1.21875,-0.24375 1.70625,-0.853125 0.4875,-0.609375 0.73125,-1.828125 0.4875,-2.071875 -0.36562,-0.365625 -1.34062,-0.4875 -2.4375,0.73125 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path7886"
+ style="display:inline;fill:url(#radialGradient4861);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4873)" />
<path
- style="display:inline;fill:url(#radialGradient4881);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4893)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 292.45286,20.11787 -7.56413,0 c -0.73125,0 -1.32549,-0.515308 -1.33058,-1.24654 l -0.028,-4.017519 v -3.16875 -2.9250003 c 0,-0.73125 0.4875,-1.21875 1.21875,-1.21875 l 6.44059,0.00442 2.53052,2.515261 0.0354,8.810334 c 0.003,0.731244 -0.57138,1.24654 -1.30263,1.24654 z M 289.62394,8.7600607 v 2.4375003 h 2.4375 z m -7.3125,-0.6736655 0.0213,0.7169703 v 2.5152615 3.772891 l -5.06403,0.04019 c -0.73123,0.0058 -1.21672,-0.598663 -1.21875,-1.32991 l -0.028,-10.0556901 c -0.002,-0.7312471 0.4875,-1.21875 1.21875,-1.21875 h 6.09375 l 2.79402,2.5031129 v 1.81343 h -2.53052 c -0.67317,-0.017075 -1.31624,0.241688 -1.28654,1.2424914 z m 0.0213,-4.7304016 v 2.4596813 l 2.53052,-0.02779 z"
id="path8454"
- d="m 292.00552,19.7566 h -7.3125 c -0.73125,0 -1.21875,-0.4875 -1.21875,-1.21875 v -3.656249 -3.16875 -2.9250003 c 0,-0.73125 0.4875,-1.21875 1.21875,-1.21875 0,0 3.9,0 6.09375,0 0,0 2.4375,2.4375003 2.4375,2.4375003 0,2.68125 0,8.531249 0,8.531249 0,0.73125 -0.4875,1.21875 -1.21875,1.21875 z m -2.4375,-10.9687493 v 2.4375003 h 2.4375 z m -7.3125,-1.3406249 v 1.3406249 2.3156253 3.778125 h -4.875 c -0.73125,0 -1.21875,-0.4875 -1.21875,-1.21875 V 3.9128507 c 0,-0.7312499 0.4875,-1.21875 1.21875,-1.21875 0,0 3.9,0 6.09375,0 0,0 2.4375,2.4375 2.4375,2.4375 0,0.4875 0,0.9750001 0,1.5843751 h -3.04688 c -0.36562,0.121875 -0.60937,0.365625 -0.60937,0.73125 z m 0,-3.5343751 v 2.4375001 h 2.4375 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4881);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4893)" />
<path
- style="display:inline;fill:url(#radialGradient4901);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4913)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 312.76384,20.20124 -10.1808,-0.02779 c -0.75126,-0.0021 -1.21143,-0.547743 -1.21303,-1.272325 l -0.028,-12.6083588 c -0.002,-0.9749978 0.29395,-1.2762443 1.26895,-1.2723257 l 2.49639,0.010033 c 0,0 0.0587,-2.5309032 2.49616,-2.5309032 2.4375,0 2.56487,2.5309032 2.56487,2.5309032 l 2.48359,0.017757 c 0.97497,0.00697 1.35938,0.3251372 1.35283,1.3001156 l -0.0839,12.4971989 c -0.005,0.808245 -0.51762,1.35744 -1.15713,1.355695 z m -1.86968,-13.8508896 -1.34061,-0.609375 c 0,0 0,-1.8281249 -1.95,-1.8281249 -1.95,0 -1.95,1.8281249 -1.95,1.8281249 l -1.34063,0.609375 -0.47079,1.1953846 h 7.59155 z m 0.53952,2.4530151 h -6.32629 l -2.53052,2.5152615 2.53052,5.030522 7.59155,-5.030522 z"
id="path9022"
- d="m 311.86917,19.7566 h -8.53125 c -0.97501,0 -1.82812,-0.853125 -1.82812,-1.828124 V 6.9597255 c 0,-0.9750001 0.85311,-1.8281251 1.82812,-1.8281251 h 1.82813 c 0,0 0,-2.4375 2.4375,-2.4375 2.4375,0 2.4375,2.4375 2.4375,2.4375 h 1.82812 c 0.975,0 1.82813,0.853125 1.82813,1.8281251 V 17.928476 c 0,0.974999 -0.85313,1.828124 -1.82813,1.828124 z m -0.97501,-13.4062496 -1.34061,-0.609375 c 0,0 0,-1.8281249 -1.95,-1.8281249 -1.95,0 -1.95,1.8281249 -1.95,1.8281249 l -1.34063,0.609375 -0.60937,1.2187501 h 3.04687 3.9 0.975 z m 0.12182,2.071875 h -5.72812 l -3.65625,2.0718756 3.4125,5.971875 8.04375,-4.63125 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4901);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4913)" />
<path
- style="display:inline;fill:url(#radialGradient4921);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4933)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="M 335.47361,15.091518 V 7.545735 l 3.79578,3.772892 z m -8.85681,1.257631 h 7.59155 l -3.79578,3.772892 z m 6.32629,-1.257631 h -5.06103 c -0.73124,-0.0041 -1.26114,-0.526392 -1.26526,-1.25763 V 8.8033655 c -0.004,-0.7312386 0.53401,-1.2576305 1.26526,-1.2576305 h 5.06103 c 0.73125,0 1.26526,0.5263804 1.26526,1.2576305 v 5.0305225 c 0,0.609375 -0.53402,1.261705 -1.26526,1.25763 z m 0,-3.772891 c 0,-0.73125 -0.53401,-1.257631 -1.26526,-1.257631 h -2.53052 c -0.73125,0 -1.26525,0.526381 -1.26525,1.257631 v 1.25763 c 0,0.73125 0.534,1.257631 1.26525,1.257631 h 2.53052 c 0.73125,0 1.26526,-0.526381 1.26526,-1.257631 z m -2.53052,-8.8034143 3.79578,3.7728917 h -7.59155 z m -5.06103,5.0305223 v 7.545783 l -3.79578,-3.772891 z"
id="path9590"
- d="M 335.29779,14.881601 V 7.5691009 l 3.65625,3.6562501 z m -8.53125,1.21875 h 7.3125 l -3.65625,3.656249 z m 6.09375,-1.21875 h -4.875 c -0.73125,0 -1.21875,-0.4875 -1.21875,-1.21875 v -4.875 c 0,-0.7312501 0.4875,-1.2187501 1.21875,-1.2187501 h 4.875 c 0.73125,0 1.21875,0.4875 1.21875,1.2187501 v 4.875 c 0,0.609375 -0.4875,1.21875 -1.21875,1.21875 z m 0,-3.65625 c 0,-0.73125 -0.4875,-1.21875 -1.21875,-1.21875 h -2.4375 c -0.73125,0 -1.21875,0.4875 -1.21875,1.21875 v 1.21875 c 0,0.73125 0.4875,1.21875 1.21875,1.21875 h 2.4375 c 0.73125,0 1.21875,-0.4875 1.21875,-1.21875 z m -2.4375,-8.5312501 3.65625,3.6562501 h -7.3125 z m -4.875,4.875 v 7.3125001 l -3.65625,-3.65625 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4921);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4933)" />
<path
- style="display:inline;fill:url(#radialGradient4941);fill-opacity:1;stroke-width:0.96615839"
+ d="m 274,8 h 10 v 2 h -10 z"
id="path10158"
- d="m 274.15498,8.0293266 h 9.6324 v 1.9381685 h -9.6324 z" />
+ style="display:inline;fill:url(#radialGradient4941);fill-opacity:1;stroke-width:0.96615839" />
<path
- style="display:inline;fill:url(#radialGradient4949);fill-opacity:1;stroke-width:0.96615839"
+ d="m 302,10 h -4 v 4 h -2 v -4 h -4 V 8 h 4 V 4 h 2 v 4 h 4 z"
id="path10726"
- d="m 301.82263,10.040073 h -3.85298 v 3.876338 h -1.92648 v -3.876338 h -3.85298 V 8.1019059 h 3.85298 V 4.2255681 h 1.92648 v 3.8763378 h 3.85298 z" />
+ style="display:inline;fill:url(#radialGradient4949);fill-opacity:1;stroke-width:0.96615839" />
<path
- style="display:inline;fill:url(#radialGradient4957);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4969)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 406.82037,12.583531 c -0.12181,0.73125 -0.24375,1.4625 -0.4875,2.071875 -0.4875,1.584375 -1.4625,3.046875 -3.04686,4.021874 0.4875,0.4875 1.58436,1.096875 1.58436,1.096875 0,0 -2.4375,0.365625 -4.99686,0.365625 l -0.12181,-0.121875 v 0.121875 c -1.21875,0 -2.4375,-0.365625 -3.65625,-0.73125 0.85311,-0.73125 1.4625,-1.584374 1.95,-2.559374 0.73125,-1.4625 0.73125,-3.65625 0.73125,-3.65625 0,0 1.09686,1.828125 1.70625,2.559375 1.4625,-0.73125 2.4375,-2.19375 2.55936,-3.65625 0.12181,-1.096875 -0.24375,-2.071875 -0.73125,-2.8031253 -0.4875,-0.8531251 -1.21875,-1.3406251 -2.07186,-1.7062501 0.24375,-0.4874999 0.60936,-1.0968749 0.975,-1.584375 0.4875,-0.73125 1.09686,-1.21875 1.58436,-1.4625 2.55939,1.340625 4.3875,4.5093751 4.02189,8.0437504 z m -8.53125,-2.4375 c 0,0 -1.34061,-1.8281254 -1.95,-2.4375004 -1.70625,0.853125 -2.68125,2.4375004 -2.68125,4.1437504 0.12181,1.828125 1.34064,3.290625 2.925,4.021875 -0.36561,0.609375 -0.73125,1.21875 -1.21875,1.70625 -0.4875,0.609375 -1.09686,0.974999 -1.4625,1.340624 -2.80311,-1.706249 -4.50936,-4.874999 -4.02186,-8.287499 0.1218,-0.8531253 0.36561,-1.7062504 0.60936,-2.4375004 0.4875,-1.3406249 1.34064,-2.4375 2.55939,-3.290625 0.1218,-0.121875 0.24375,-0.121875 0.36561,-0.24375 -0.4875,-0.4875 -1.95,-0.975 -1.95,-0.975 0,0 3.04689,-0.975 8.2875,-0.365625 -1.58436,2.315625 -1.4625,6.8250004 -1.4625,6.8250004 z"
id="path11294"
- d="m 407.09514,12.361211 c -0.12181,0.73125 -0.24375,1.4625 -0.4875,2.071875 -0.4875,1.584375 -1.4625,3.046875 -3.04686,4.021874 0.4875,0.4875 1.58436,1.096875 1.58436,1.096875 0,0 -2.4375,0.365625 -4.99686,0.365625 0,0 -0.12181,-0.121875 -0.12181,-0.121875 v 0.121875 c -1.21875,0 -2.4375,-0.365625 -3.65625,-0.73125 0.85311,-0.73125 1.4625,-1.584374 1.95,-2.559374 0.73125,-1.4625 0.73125,-3.65625 0.73125,-3.65625 0,0 1.09686,1.828125 1.70625,2.559375 1.4625,-0.73125 2.4375,-2.19375 2.55936,-3.65625 0.12181,-1.096875 -0.24375,-2.0718751 -0.73125,-2.8031251 -0.4875,-0.8531251 -1.21875,-1.3406251 -2.07186,-1.7062501 0.24375,-0.4874999 0.60936,-1.0968749 0.975,-1.584375 0.4875,-0.73125 1.09686,-1.21875 1.58436,-1.4625 2.55939,1.340625 4.3875,4.5093751 4.02189,8.0437502 z m -8.53125,-2.4375001 c 0,0 -1.34061,-1.8281251 -1.95,-2.4375001 -1.70625,0.853125 -2.68125,2.4375001 -2.68125,4.1437502 0.12181,1.828125 1.34064,3.290625 2.925,4.021875 -0.36561,0.609375 -0.73125,1.21875 -1.21875,1.70625 -0.4875,0.609375 -1.09686,0.974999 -1.4625,1.340624 -2.80311,-1.706249 -4.50936,-4.874999 -4.02186,-8.287499 0.1218,-0.8531251 0.36561,-1.7062502 0.60936,-2.4375002 0.4875,-1.3406249 1.34064,-2.4375 2.55939,-3.290625 0.1218,-0.121875 0.24375,-0.121875 0.36561,-0.24375 -0.4875,-0.4875 -1.95,-0.975 -1.95,-0.975 0,0 3.04689,-0.975 8.2875,-0.365625 -1.58436,2.315625 -1.4625,6.8250001 -1.4625,6.8250001 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4957);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4969)" />
<path
- style="display:inline;fill:url(#radialGradient4977);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4989)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 429.73975,20.187746 -2.55504,0.05558 c -0.48738,0.0106 -0.61242,-0.769541 -0.61242,-1.378916 0,0 0.31966,-4.276424 -3.79578,-8.803414 -3.20233,-3.5225593 -8.85682,-3.7728916 -8.85682,-3.7728916 -0.60938,0 -1.26177,-0.171597 -1.25602,-0.6590635 l 0.028,-2.3732094 c 0.006,-0.4874666 0.61868,-0.7406188 1.22806,-0.7406188 0,0 7.05132,0.3003217 11.38734,5.0305223 3.72704,4.065871 5.06103,11.318675 5.06103,11.318675 0,0.4875 -0.0191,1.310083 -0.62831,1.323336 z M 413.91969,8.8033655 c 0,0 4.48239,0.7421569 7.0114,3.0905195 2.59016,2.40515 3.11068,6.970525 3.11068,6.970525 0,0.4875 -0.7448,1.278471 -1.23236,1.278471 h -1.35283 c -0.4875,0 -1.21059,-0.669096 -1.21059,-1.278471 0,0 0.4472,-2.304652 -1.91012,-4.45401 -1.78736,-1.629677 -4.41618,-1.834143 -4.41618,-1.834143 -0.60938,0 -1.23946,-0.793663 -1.22806,-1.281032 l 0.028,-1.195314 c 0.0114,-0.4873685 0.59073,-1.2965455 1.20011,-1.2965455 z m 1.20944,6.3426395 c 1.34062,0 2.54933,1.124665 2.54933,2.46529 0,1.340626 -1.09688,2.576451 -2.4375,2.576451 -1.34063,0 -2.54933,-1.208035 -2.54933,-2.548661 0,-1.340625 1.09687,-2.49308 2.4375,-2.49308 z"
id="path11862"
- d="m 429.01283,20.243326 h -1.82812 c -0.4875,0 -0.975,-0.365625 -0.975,-0.975 0,0 0.36562,-4.387501 -3.9,-8.775 -3.04688,-3.6562503 -8.53125,-3.9000003 -8.53125,-3.9000003 -0.60938,0 -0.975,-0.365625 -0.975,-0.8531249 V 4.0339507 c 0,-0.4875 0.36562,-0.853125 0.975,-0.853125 0,0 7.67812,0.4875 11.7,5.4843751 4.02187,3.7781242 4.3875,10.7250002 4.3875,10.7250002 0,0.4875 -0.24375,0.853125 -0.85313,0.853125 z M 413.77846,9.2745758 c 0,0 4.50937,0.609375 7.06875,2.9249992 2.55937,2.4375 3.04687,7.190626 3.04687,7.190626 0,0.4875 -0.12181,0.975 -0.60937,0.975 h -1.82813 c -0.4875,0 -0.73125,-0.365625 -0.73125,-0.975 0,0 0.12181,-2.925001 -2.19375,-5.118751 -1.82812,-1.584375 -4.75312,-1.70625 -4.75312,-1.70625 -0.60938,0 -0.975,-0.365625 -0.975,-0.853125 v -1.584374 c 0,-0.4875002 0.36562,-0.8531252 0.975,-0.8531252 z m 1.4625,6.0937492 c 1.34062,0 2.4375,1.096875 2.4375,2.4375 0,1.340626 -1.09688,2.437501 -2.4375,2.437501 -1.34063,0 -2.4375,-1.096875 -2.4375,-2.437501 0,-1.340625 1.09687,-2.4375 2.4375,-2.4375 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4977);fill-opacity:1;stroke-width:1.21875;filter:url(#filter4989)" />
<path
- style="display:inline;fill:url(#radialGradient4997);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5009)"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
+ d="m 448.08169,13.833888 v 2.515261 c 0,0.975 -0.41214,1.257631 -1.26525,1.257631 h -10.12208 c -0.85314,0 -1.26526,-0.282631 -1.26526,-1.257631 V 6.2881044 c 0,-0.9750001 0.41212,-1.2576306 1.26526,-1.2576306 h 10.12208 c 0.85311,0 1.26525,0.2826305 1.26525,1.2576306 v 2.5152611 l 5.06104,-2.5152611 V 16.349149 Z"
id="path12430"
- d="m 451.64901,16.435377 -3.65625,-3.290625 v 2.559375 c 0,0.975 -0.73125,1.70625 -1.58436,1.70625 h -9.01875 c -0.85314,0 -1.58439,-0.73125 -1.58439,-1.70625 V 6.9291285 c 0,-0.9750001 0.73125,-1.7062501 1.58439,-1.7062501 h 9.01875 c 0.85311,0 1.58436,0.73125 1.58436,1.7062501 v 2.437499 l 3.65625,-3.2906241 c 0.36564,-0.365625 0.73125,-0.4875 1.21875,-0.365625 V 16.801002 c -0.36561,0.121875 -0.85311,0 -1.21875,-0.365625 z"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ style="display:inline;fill:url(#radialGradient4997);fill-opacity:1;stroke-width:1.21875;filter:url(#filter5009)" />
<g
- id="g4779"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)">
+ id="g4779">
<path
- style="fill:url(#radialGradient4710);fill-opacity:1;stroke-width:1.265625;filter:url(#filter4729)"
- d="M 165.73984,2.6257296 V 20.34448 h 9.42792 0.69708 2.46698 c 1.25518,-0.32709 2.23657,-1.314095 2.53125,-2.53125 v -2.53125 -7.5937504 -2.53125 c -0.29468,-1.2171559 -1.27607,-2.2041601 -2.53125,-2.53125 h -2.07148 -1.09258 z m 7.73958,3.0577697 1.33485,2.2420349 c 0,0 0.36967,0.6174141 0.65753,0.813263 0.26974,0.1834496 0.93438,0.2892151 0.93438,0.2892151 h 2.72901 l -1.89596,3.0800167 c 0,0 -0.27577,0.604831 -0.41281,0.907196 -0.20593,0.452534 0.006,1.243536 0.0742,1.982484 0.10732,1.162403 0.19033,2.286529 0.19033,2.286529 l -2.21484,-1.132141 c 0,0 -0.90763,-0.426918 -1.39416,-0.427644 -0.5721,0 -1.64383,0.496858 -1.64383,0.496858 l -2.2198,1.065398 c 0,0 0.16319,-1.013778 0.33866,-2.128325 0.11606,-0.733074 0.43611,-1.567458 0.17798,-2.071473 -0.13995,-0.274086 -0.42023,-0.820679 -0.42023,-0.820679 L 167.532,9.0996981 h 2.71169 c 0,0 0.88228,-0.06226 1.24339,-0.2892151 0.27408,-0.1711231 0.61056,-0.7539368 0.61056,-0.7539368 z"
- id="bookmarks-star-4" />
+ id="bookmarks-star-4"
+ d="M 165.92886,2.5152127 V 20.122041 h 8.85681 1.26526 2.53052 c 1.26526,0 2.53052,-1.257631 2.53052,-2.515261 V 15.091518 7.545735 5.0304738 c 0,-1.2576306 -1.26526,-2.5152611 -2.53052,-2.5152611 h -2.53052 -1.26526 z m 7.59155,2.5152611 1.26526,2.5152612 c 0,0 0.39827,0.9972133 0.68613,1.1930622 0.26974,0.1834496 1.07417,0.064568 1.07417,0.064568 h 3.30074 l -2.53052,3.1379238 c 0,0 -0.38069,0.332603 -0.51773,0.634968 -0.20593,0.452534 -0.18971,0.518683 -0.12151,1.257631 0.10732,1.162403 0.63924,3.772892 0.63924,3.772892 l -2.53052,-1.257631 c 0,0 -0.77873,-0.42944 -1.26526,-0.430166 -0.5721,0 -1.26526,0.430166 -1.26526,0.430166 l -2.53051,1.257631 c 0,0 0.56012,-2.658345 0.73559,-3.772892 0.11606,-0.733074 0.10061,-0.753616 -0.15752,-1.257631 -0.13995,-0.274086 -0.57807,-0.782455 -0.57807,-0.782455 l -2.53052,-2.9904368 h 3.02161 c 0,0 0.91024,-0.099407 1.27135,-0.3263622 0.27408,-0.1711231 0.76807,-0.9312683 0.76807,-0.9312683 z"
+ style="fill:url(#radialGradient4710);fill-opacity:1;stroke-width:1.265625;filter:url(#filter4729)" />
<path
- style="fill:url(#radialGradient4712);fill-opacity:1;stroke:none;stroke-width:1.265625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;filter:url(#filter4774)"
- d="m 163.20859,2.6257296 c -1.25519,0.3270899 -2.23658,1.3140942 -2.53125,2.53125 v 2.53125 7.5937504 2.53125 c 0.29467,1.217155 1.27606,2.20416 2.53125,2.53125 h 3.16406 v -5.0625 -7.5937504 -5.0625 z"
- id="bookmarks-overlay-1" />
+ id="bookmarks-overlay-1"
+ d="m 163.39834,2.5152127 c -1.26526,0 -2.53052,1.2576305 -2.53052,2.5152611 v 2.5152612 7.545783 2.515262 c 0,1.25763 1.26526,2.515261 2.53052,2.515261 h 2.91839 l 0.0559,-4.840061 V 7.6882296 l 0.028,-5.1730169 z"
+ style="fill:url(#radialGradient4712);fill-opacity:1;stroke:none;stroke-width:1.265625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;filter:url(#filter4774)" />
<path
- style="opacity:0.66300001;fill:url(#radialGradient4714);fill-opacity:1;stroke:url(#radialGradient4750);stroke-width:0.6328125;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 166.37156,2.6257296 V 20.34448"
- id="bookmarks-divider-7" />
+ id="bookmarks-divider-7"
+ d="M 165.92886,2.5152127 V 20.122041"
+ style="opacity:0.66300001;fill:url(#radialGradient4714);fill-opacity:1;stroke:url(#radialGradient4750);stroke-width:1.2614392;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
- d="m 133.26971,34.690626 -6.72001,6.6 c -0.24,0.36 -0.72,0.48 -1.2,0.48 -0.48,0 -0.96,-0.12 -1.32,-0.48 l -6.72,-6.6 c -0.6,-0.72 -0.48,-1.32 0.48,-1.32 h 3.96 v -7.200001 c 0,-0.72 0.48,-1.2 1.2,-1.2 h 4.8 c 0.72,0 1.2,0.48 1.2,1.2 v 7.200001 h 3.84 c 0.96001,0 1.20001,0.6 0.48001,1.32 z"
- id="path4214-3"
+ transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)"
style="display:inline;fill:url(#radialGradient4709-1);fill-opacity:1;stroke-width:1;filter:url(#filter4844)"
- transform="matrix(0.79035179,0,0,0.79514606,-0.14216927,3.8570695e-5)" />
+ id="path4214-3"
+ d="m 133.03211,35.213608 -6.32629,6.288153 c -0.24,0.36 -0.8202,0.518975 -1.3002,0.518975 -0.48,0 -0.87032,-0.158975 -1.23032,-0.518975 l -6.3263,-6.288153 c -0.6,-0.72 -0.96335,-1.29465 -0.003,-1.287183 l 3.79916,0.02955 -0.0908,-7.535242 c -0.009,-0.719949 0.67572,-1.307177 1.39571,-1.31116 l 5.02367,-0.02779 c 0.71999,-0.004 1.25401,0.619416 1.22796,1.33895 l 0.035,7.535242 3.80499,-0.02955 c 0.95998,-0.0075 0.71078,0.567183 -0.009,1.287183 z" />
</g>
</svg>
diff --git a/application/palemoon/themes/windows/browser.css b/application/palemoon/themes/windows/browser.css
index f921554df..56a8318da 100644
--- a/application/palemoon/themes/windows/browser.css
+++ b/application/palemoon/themes/windows/browser.css
@@ -39,9 +39,9 @@
--toolbarbutton-border-radius: 2.5px;
--toolbarbutton-border-color: hsla(210,54%,20%,.2);
- --toolbarbutton-image: url("chrome://browser/skin/Toolbar.svg");
- --toolbarbutton-glass-image: url("chrome://browser/skin/Toolbar-glass.svg");
- --toolbarbutton-inverted-image: url("chrome://browser/skin/Toolbar-inverted.svg");
+ --toolbarbutton-image: url("chrome://browser/skin/Toolbar.png");
+ --toolbarbutton-glass-image: url("chrome://browser/skin/Toolbar-glass.png");
+ --toolbarbutton-inverted-image: url("chrome://browser/skin/Toolbar-inverted.png");
--tab-background: linear-gradient(transparent, hsla(0,0%,45%,.1) 1px, hsla(0,0%,32%,.2) 80%, hsla(0,0%,0%,.2));
--tab-background-hover: linear-gradient(hsla(0,0%,100%,.3) 1px, hsla(0,0%,75%,.2) 80%, hsla(0,0%,60%,.2));
@@ -52,6 +52,15 @@
--window-text-color: currentColor;
}
+/* Use SVG for HiDPI 133%+ */
+@media (min-resolution: 1.33dppx) {
+ :root {
+ --toolbarbutton-image: url("chrome://browser/skin/Toolbar.svg");
+ --toolbarbutton-glass-image: url("chrome://browser/skin/Toolbar-glass.svg");
+ --toolbarbutton-inverted-image: url("chrome://browser/skin/Toolbar-inverted.svg");
+ }
+}
+
:root:-moz-lwtheme-brighttext {
--toolbar-highlight-top: rgba(32,32,32,.8);
--toolbar-highlight-bottom: rgba(32,32,32,0);
@@ -2041,9 +2050,9 @@ richlistitem[type~="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio.svg#tab-audio-blocked");
}
-#TabsToolbar[brighttext] .tab-icon-sound[soundplaying],
-#TabsToolbar[brighttext] .tab-icon-sound[blocked],
-#TabsToolbar[brighttext] .tab-icon-sound[muted] {
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-sound[soundplaying],
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-sound[blocked],
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-sound[muted] {
filter: invert(1);
}
@@ -2087,17 +2096,17 @@ richlistitem[type~="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-blocked");
}
-#TabsToolbar[brighttext] .tab-icon-overlay[soundplaying]:not([selected]):not(:hover),
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-overlay[soundplaying]:not([selected]):not(:hover),
.tab-icon-overlay[soundplaying][selected]:-moz-lwtheme-brighttext:not(:hover) {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-white");
}
-#TabsToolbar[brighttext] .tab-icon-overlay[muted]:not([crashed]):not([selected]):not(:hover),
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-overlay[muted]:not([crashed]):not([selected]):not(:hover),
.tab-icon-overlay[muted][selected]:-moz-lwtheme-brighttext:not(:hover) {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-white-muted");
}
-#TabsToolbar[brighttext] .tab-icon-overlay[blocked]:not([crashed]):not([selected]):not(:hover),
+#TabsToolbar:-moz-lwtheme-brighttext .tab-icon-overlay[blocked]:not([crashed]):not([selected]):not(:hover),
.tab-icon-overlay[blocked][selected]:-moz-lwtheme-brighttext:not(:hover) {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-small.svg#tab-audio-white-blocked");
}
diff --git a/application/palemoon/themes/windows/downloads/download-glow.png b/application/palemoon/themes/windows/downloads/download-glow.png
deleted file mode 100644
index 53182d7a4..000000000
--- a/application/palemoon/themes/windows/downloads/download-glow.png
+++ /dev/null
Binary files differ
diff --git a/application/palemoon/themes/windows/jar.mn b/application/palemoon/themes/windows/jar.mn
index 8a00d8b70..604466c9f 100644
--- a/application/palemoon/themes/windows/jar.mn
+++ b/application/palemoon/themes/windows/jar.mn
@@ -60,6 +60,9 @@ browser.jar:
skin/classic/browser/Secure24.png
skin/classic/browser/setDesktopBackground.css
skin/classic/browser/slowStartup-16.png
+ skin/classic/browser/Toolbar.png
+ skin/classic/browser/Toolbar-glass.png
+ skin/classic/browser/Toolbar-inverted.png
skin/classic/browser/Toolbar.svg
skin/classic/browser/Toolbar-glass.svg
skin/classic/browser/Toolbar-inverted.svg
diff --git a/application/palemoon/themes/windows/places/organizer.css b/application/palemoon/themes/windows/places/organizer.css
index 16a0ab09c..45851d0da 100644
--- a/application/palemoon/themes/windows/places/organizer.css
+++ b/application/palemoon/themes/windows/places/organizer.css
@@ -8,6 +8,13 @@
--toolbarbutton-image: url("chrome://browser/skin/Toolbar.png");
}
+/* Use SVG for HiDPI 133%+ */
+@media (min-resolution: 1.33dppx) {
+ :root {
+ --toolbarbutton-image: url("chrome://browser/skin/Toolbar.svg");
+ }
+}
+
/* Toolbar */
#placesToolbar {
padding: 3px;
diff --git a/application/palemoon/themes/windows/statusbar/overlay.css b/application/palemoon/themes/windows/statusbar/overlay.css
index 77e8d8732..7f9a5982f 100644
--- a/application/palemoon/themes/windows/statusbar/overlay.css
+++ b/application/palemoon/themes/windows/statusbar/overlay.css
@@ -53,7 +53,7 @@ toolbar[brighttext] #status4evar-download-button #status4evar-download-icon
#status4evar-download-button[attention] #status4evar-download-icon
{
- background-image: url("chrome://browser/skin/downloads/download-glow.png");
+ background: -moz-image-rect(var(--toolbarbutton-glass-image), 19, 108, 36, 90) center no-repeat;
}
toolbar[mode="icons"] #status4evar-download-button[forcelabel="true"] > label
diff --git a/db/sqlite3/src/sqlite3.c b/db/sqlite3/src/sqlite3.c
index 320d6355e..d015df2c3 100644
--- a/db/sqlite3/src/sqlite3.c
+++ b/db/sqlite3/src/sqlite3.c
@@ -1,6 +1,6 @@
/******************************************************************************
** This file is an amalgamation of many separate C source files from SQLite
-** version 3.21.0. By combining all the individual C code files into this
+** version 3.26.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
@@ -55,6 +55,12 @@
#define CTIMEOPT_VAL_(opt) #opt
#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
+/* Like CTIMEOPT_VAL, but especially for SQLITE_DEFAULT_LOOKASIDE. This
+** option requires a separate macro because legal values contain a single
+** comma. e.g. (-DSQLITE_DEFAULT_LOOKASIDE="100,100") */
+#define CTIMEOPT_VAL2_(opt1,opt2) #opt1 "," #opt2
+#define CTIMEOPT_VAL2(opt) CTIMEOPT_VAL2_(opt)
+
/*
** An array of names of all compile-time options. This array should
** be sorted A-Z.
@@ -138,7 +144,7 @@ static const char * const sqlite3azCompileOpt[] = {
"DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE),
#endif
#ifdef SQLITE_DEFAULT_LOOKASIDE
- "DEFAULT_LOOKASIDE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOOKASIDE),
+ "DEFAULT_LOOKASIDE=" CTIMEOPT_VAL2(SQLITE_DEFAULT_LOOKASIDE),
#endif
#if SQLITE_DEFAULT_MEMSTATUS
"DEFAULT_MEMSTATUS",
@@ -213,7 +219,7 @@ static const char * const sqlite3azCompileOpt[] = {
"ENABLE_BATCH_ATOMIC_WRITE",
#endif
#if SQLITE_ENABLE_CEROD
- "ENABLE_CEROD",
+ "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD),
#endif
#if SQLITE_ENABLE_COLUMN_METADATA
"ENABLE_COLUMN_METADATA",
@@ -254,6 +260,9 @@ static const char * const sqlite3azCompileOpt[] = {
#if SQLITE_ENABLE_FTS5
"ENABLE_FTS5",
#endif
+#if SQLITE_ENABLE_GEOPOLY
+ "ENABLE_GEOPOLY",
+#endif
#if SQLITE_ENABLE_HIDDEN_COLUMNS
"ENABLE_HIDDEN_COLUMNS",
#endif
@@ -284,6 +293,9 @@ static const char * const sqlite3azCompileOpt[] = {
#if SQLITE_ENABLE_MULTIPLEX
"ENABLE_MULTIPLEX",
#endif
+#if SQLITE_ENABLE_NORMALIZE
+ "ENABLE_NORMALIZE",
+#endif
#if SQLITE_ENABLE_NULL_TRIM
"ENABLE_NULL_TRIM",
#endif
@@ -311,6 +323,9 @@ static const char * const sqlite3azCompileOpt[] = {
#if SQLITE_ENABLE_SNAPSHOT
"ENABLE_SNAPSHOT",
#endif
+#if SQLITE_ENABLE_SORTER_REFERENCES
+ "ENABLE_SORTER_REFERENCES",
+#endif
#if SQLITE_ENABLE_SQLLOG
"ENABLE_SQLLOG",
#endif
@@ -1147,9 +1162,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
-#define SQLITE_VERSION "3.21.0"
-#define SQLITE_VERSION_NUMBER 3021000
-#define SQLITE_SOURCE_ID "2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827"
+#define SQLITE_VERSION "3.26.0"
+#define SQLITE_VERSION_NUMBER 3026000
+#define SQLITE_SOURCE_ID "2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9"
/*
** CAPI3REF: Run-Time Library Version Numbers
@@ -1494,6 +1509,9 @@ SQLITE_API int sqlite3_exec(
** the most recent error can be obtained using
** [sqlite3_extended_errcode()].
*/
+#define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8))
+#define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8))
+#define SQLITE_ERROR_SNAPSHOT (SQLITE_ERROR | (3<<8))
#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
@@ -1526,17 +1544,22 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8))
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
+#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8))
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8))
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
+#define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
+#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8))
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8))
+#define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8))
+#define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8))
#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8))
#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8))
#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8))
@@ -1904,7 +1927,8 @@ struct sqlite3_io_methods {
** <li>[[SQLITE_FCNTL_PERSIST_WAL]]
** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the
** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary
-** write ahead log and shared memory files used for transaction control
+** write ahead log ([WAL file]) and shared memory
+** files used for transaction control
** are automatically deleted when the latest connection to the database
** closes. Setting persistent WAL mode causes those files to persist after
** close. Persisting the files is useful when other processes that do not
@@ -2084,6 +2108,32 @@ struct sqlite3_io_methods {
** so that all subsequent write operations are independent.
** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without
** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE].
+**
+** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]]
+** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode causes attempts to obtain
+** a file lock using the xLock or xShmLock methods of the VFS to wait
+** for up to M milliseconds before failing, where M is the single
+** unsigned integer parameter.
+**
+** <li>[[SQLITE_FCNTL_DATA_VERSION]]
+** The [SQLITE_FCNTL_DATA_VERSION] opcode is used to detect changes to
+** a database file. The argument is a pointer to a 32-bit unsigned integer.
+** The "data version" for the pager is written into the pointer. The
+** "data version" changes whenever any change occurs to the corresponding
+** database file, either through SQL statements on the same database
+** connection or through transactions committed by separate database
+** connections possibly in other processes. The [sqlite3_total_changes()]
+** interface can be used to find if any database on the connection has changed,
+** but that interface responds to changes on TEMP as well as MAIN and does
+** not provide a mechanism to detect changes to MAIN only. Also, the
+** [sqlite3_total_changes()] interface responds to internal changes only and
+** omits changes made by other database connections. The
+** [PRAGMA data_version] command provide a mechanism to detect changes to
+** a single attached database that occur due to other database connections,
+** but omits changes implemented by the database connection on which it is
+** called. This file control is the only mechanism to detect changes that
+** happen either internally or externally and that are associated with
+** a particular attached database.
** </ul>
*/
#define SQLITE_FCNTL_LOCKSTATE 1
@@ -2118,6 +2168,8 @@ struct sqlite3_io_methods {
#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31
#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32
#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33
+#define SQLITE_FCNTL_LOCK_TIMEOUT 34
+#define SQLITE_FCNTL_DATA_VERSION 35
/* deprecated names */
#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE
@@ -2155,12 +2207,18 @@ typedef struct sqlite3_api_routines sqlite3_api_routines;
** in the name of the object stands for "virtual file system". See
** the [VFS | VFS documentation] for further information.
**
-** The value of the iVersion field is initially 1 but may be larger in
-** future versions of SQLite. Additional fields may be appended to this
-** object when the iVersion value is increased. Note that the structure
-** of the sqlite3_vfs object changes in the transaction between
-** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not
-** modified.
+** The VFS interface is sometimes extended by adding new methods onto
+** the end. Each time such an extension occurs, the iVersion field
+** is incremented. The iVersion value started out as 1 in
+** SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2
+** with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased
+** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields
+** may be appended to the sqlite3_vfs object and the iVersion value
+** may increase again in future versions of SQLite.
+** Note that the structure
+** of the sqlite3_vfs object changes in the transition from
+** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0]
+** and yet the iVersion field was not modified.
**
** The szOsFile field is the size of the subclassed [sqlite3_file]
** structure used by this VFS. mxPathname is the maximum length of
@@ -2937,6 +2995,22 @@ struct sqlite3_mem_methods {
** I/O required to support statement rollback.
** The default value for this setting is controlled by the
** [SQLITE_STMTJRNL_SPILL] compile-time option.
+**
+** [[SQLITE_CONFIG_SORTERREF_SIZE]]
+** <dt>SQLITE_CONFIG_SORTERREF_SIZE
+** <dd>The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter
+** of type (int) - the new value of the sorter-reference size threshold.
+** Usually, when SQLite uses an external sort to order records according
+** to an ORDER BY clause, all fields required by the caller are present in the
+** sorted records. However, if SQLite determines based on the declared type
+** of a table column that its values are likely to be very large - larger
+** than the configured sorter-reference size threshold - then a reference
+** is stored in each sorted record and the required column values loaded
+** from the database as records are returned in sorted order. The default
+** value for this option is to never use this optimization. Specifying a
+** 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.
** </dl>
*/
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
@@ -2966,6 +3040,7 @@ struct sqlite3_mem_methods {
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
+#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */
/*
** CAPI3REF: Database Connection Configuration Options
@@ -2981,6 +3056,7 @@ struct sqlite3_mem_methods {
** is invoked.
**
** <dl>
+** [[SQLITE_DBCONFIG_LOOKASIDE]]
** <dt>SQLITE_DBCONFIG_LOOKASIDE</dt>
** <dd> ^This option takes three additional arguments that determine the
** [lookaside memory allocator] configuration for the [database connection].
@@ -3003,6 +3079,7 @@ struct sqlite3_mem_methods {
** memory is in use leaves the configuration unchanged and returns
** [SQLITE_BUSY].)^</dd>
**
+** [[SQLITE_DBCONFIG_ENABLE_FKEY]]
** <dt>SQLITE_DBCONFIG_ENABLE_FKEY</dt>
** <dd> ^This option is used to enable or disable the enforcement of
** [foreign key constraints]. There should be two additional arguments.
@@ -3013,6 +3090,7 @@ struct sqlite3_mem_methods {
** following this call. The second parameter may be a NULL pointer, in
** which case the FK enforcement setting is not reported back. </dd>
**
+** [[SQLITE_DBCONFIG_ENABLE_TRIGGER]]
** <dt>SQLITE_DBCONFIG_ENABLE_TRIGGER</dt>
** <dd> ^This option is used to enable or disable [CREATE TRIGGER | triggers].
** There should be two additional arguments.
@@ -3023,6 +3101,7 @@ struct sqlite3_mem_methods {
** following this call. The second parameter may be a NULL pointer, in
** which case the trigger setting is not reported back. </dd>
**
+** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]]
** <dt>SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</dt>
** <dd> ^This option is used to enable or disable the two-argument
** version of the [fts3_tokenizer()] function which is part of the
@@ -3036,6 +3115,7 @@ struct sqlite3_mem_methods {
** following this call. The second parameter may be a NULL pointer, in
** which case the new setting is not reported back. </dd>
**
+** [[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION]]
** <dt>SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION</dt>
** <dd> ^This option is used to enable or disable the [sqlite3_load_extension()]
** interface independently of the [load_extension()] SQL function.
@@ -3053,7 +3133,7 @@ struct sqlite3_mem_methods {
** be a NULL pointer, in which case the new setting is not reported back.
** </dd>
**
-** <dt>SQLITE_DBCONFIG_MAINDBNAME</dt>
+** [[SQLITE_DBCONFIG_MAINDBNAME]] <dt>SQLITE_DBCONFIG_MAINDBNAME</dt>
** <dd> ^This option is used to change the name of the "main" database
** schema. ^The sole argument is a pointer to a constant UTF8 string
** which will become the new schema name in place of "main". ^SQLite
@@ -3062,19 +3142,21 @@ struct sqlite3_mem_methods {
** until after the database connection closes.
** </dd>
**
+** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]]
** <dt>SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE</dt>
** <dd> Usually, when a database in wal mode is closed or detached from a
** database handle, SQLite checks if this will mean that there are now no
** connections at all to the database. If so, it performs a checkpoint
** operation before closing the connection. This option may be used to
** override this behaviour. The first parameter passed to this operation
-** is an integer - non-zero to disable checkpoints-on-close, or zero (the
-** default) to enable them. The second parameter is a pointer to an integer
+** is an integer - positive to disable checkpoints-on-close, or zero (the
+** default) to enable them, and 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 checkpoints-on-close
** have been disabled - 0 if they are not disabled, 1 if they are.
** </dd>
**
-** <dt>SQLITE_DBCONFIG_ENABLE_QPSG</dt>
+** [[SQLITE_DBCONFIG_ENABLE_QPSG]] <dt>SQLITE_DBCONFIG_ENABLE_QPSG</dt>
** <dd>^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates
** the [query planner stability guarantee] (QPSG). When the QPSG is active,
** a single SQL query statement will always use the same algorithm regardless
@@ -3083,8 +3165,57 @@ struct sqlite3_mem_methods {
** slower. But the QPSG has the advantage of more predictable behavior. With
** the QPSG active, SQLite will always use the same query plan in the field as
** was used during testing in the lab.
+** The first argument to this setting is an integer which is 0 to disable
+** the QPSG, positive to enable QPSG, 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 QPSG is disabled or enabled
+** following this call.
** </dd>
**
+** [[SQLITE_DBCONFIG_TRIGGER_EQP]] <dt>SQLITE_DBCONFIG_TRIGGER_EQP</dt>
+** <dd> By default, the output of EXPLAIN QUERY PLAN commands does not
+** include output for any operations performed by trigger programs. This
+** option is used to set or clear (the default) a flag that governs this
+** behavior. The first parameter passed to this operation is an integer -
+** positive to enable output for trigger programs, or zero to disable it,
+** 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 output-for-triggers has been disabled - 0 if
+** it is not disabled, 1 if it is.
+** </dd>
+**
+** [[SQLITE_DBCONFIG_RESET_DATABASE]] <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt>
+** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run
+** [VACUUM] in order to reset a database back to an empty database
+** with no schema and no content. The following process works even for
+** a badly corrupted database file:
+** <ol>
+** <li> If the database connection is newly opened, make sure it has read the
+** database schema by preparing then discarding some query against the
+** database, or calling sqlite3_table_column_metadata(), ignoring any
+** errors. This step is only necessary if the application desires to keep
+** the database in WAL mode after the reset if it was in WAL mode before
+** the reset.
+** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
+** <li> [sqlite3_exec](db, "[VACUUM]", 0, 0, 0);
+** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
+** </ol>
+** Because resetting a database is destructive and irreversible, the
+** process requires the use of this obscure API and multiple steps to help
+** ensure that it does not happen by accident.
+**
+** [[SQLITE_DBCONFIG_DEFENSIVE]] <dt>SQLITE_DBCONFIG_DEFENSIVE</dt>
+** <dd>The SQLITE_DBCONFIG_DEFENSIVE option activates or deactivates the
+** "defensive" flag for a database connection. When the defensive
+** flag is enabled, language features that allow ordinary SQL to
+** deliberately corrupt the database file are disabled. The disabled
+** features include but are not limited to the following:
+** <ul>
+** <li> The [PRAGMA writable_schema=ON] statement.
+** <li> Writes to the [sqlite_dbpage] virtual table.
+** <li> Direct writes to [shadow tables].
+** </ul>
+** </dd>
** </dl>
*/
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
@@ -3095,7 +3226,10 @@ struct sqlite3_mem_methods {
#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */
-
+#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 */
/*
** CAPI3REF: Enable Or Disable Extended Result Codes
@@ -3223,12 +3357,17 @@ SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64);
** program, the value returned reflects the number of rows modified by the
** previous INSERT, UPDATE or DELETE statement within the same trigger.
**
-** See also the [sqlite3_total_changes()] interface, the
-** [count_changes pragma], and the [changes() SQL function].
-**
** If a separate thread makes changes on the same database connection
** while [sqlite3_changes()] is running then the value returned
** is unpredictable and not meaningful.
+**
+** See also:
+** <ul>
+** <li> the [sqlite3_total_changes()] interface
+** <li> the [count_changes pragma]
+** <li> the [changes() SQL function]
+** <li> the [data_version pragma]
+** </ul>
*/
SQLITE_API int sqlite3_changes(sqlite3*);
@@ -3246,13 +3385,26 @@ SQLITE_API int sqlite3_changes(sqlite3*);
** count, but those made as part of REPLACE constraint resolution are
** not. ^Changes to a view that are intercepted by INSTEAD OF triggers
** are not counted.
-**
-** See also the [sqlite3_changes()] interface, the
-** [count_changes pragma], and the [total_changes() SQL function].
**
+** This 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
+** connections use the [PRAGMA data_version] command or the
+** [SQLITE_FCNTL_DATA_VERSION] [file control].
+**
** If a separate thread makes changes on the same database connection
** while [sqlite3_total_changes()] is running then the value
** returned is unpredictable and not meaningful.
+**
+** See also:
+** <ul>
+** <li> the [sqlite3_changes()] interface
+** <li> the [count_changes pragma]
+** <li> the [changes() SQL function]
+** <li> the [data_version pragma]
+** <li> the [SQLITE_FCNTL_DATA_VERSION] [file control]
+** </ul>
*/
SQLITE_API int sqlite3_total_changes(sqlite3*);
@@ -3501,16 +3653,16 @@ SQLITE_API void sqlite3_free_table(char **result);
**
** These routines are work-alikes of the "printf()" family of functions
** from the standard C library.
-** These routines understand most of the common K&R formatting options,
-** plus some additional non-standard formats, detailed below.
-** Note that some of the more obscure formatting options from recent
-** C-library standards are omitted from this implementation.
+** These routines understand most of the common formatting options from
+** the standard library printf()
+** plus some additional non-standard formats ([%q], [%Q], [%w], and [%z]).
+** See the [built-in printf()] documentation for details.
**
** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their
-** results into memory obtained from [sqlite3_malloc()].
+** results into memory obtained from [sqlite3_malloc64()].
** The strings returned by these two routines should be
** released by [sqlite3_free()]. ^Both routines return a
-** NULL pointer if [sqlite3_malloc()] is unable to allocate enough
+** NULL pointer if [sqlite3_malloc64()] is unable to allocate enough
** memory to hold the resulting string.
**
** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from
@@ -3534,71 +3686,7 @@ SQLITE_API void sqlite3_free_table(char **result);
**
** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf().
**
-** These routines all implement some additional formatting
-** options that are useful for constructing SQL statements.
-** All of the usual printf() formatting options apply. In addition, there
-** is are "%q", "%Q", "%w" and "%z" options.
-**
-** ^(The %q option works like %s in that it substitutes a nul-terminated
-** string from the argument list. But %q also doubles every '\'' character.
-** %q is designed for use inside a string literal.)^ By doubling each '\''
-** character it escapes that character and allows it to be inserted into
-** the string.
-**
-** For example, assume the string variable zText contains text as follows:
-**
-** <blockquote><pre>
-** char *zText = "It's a happy day!";
-** </pre></blockquote>
-**
-** One can use this text in an SQL statement as follows:
-**
-** <blockquote><pre>
-** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
-** sqlite3_exec(db, zSQL, 0, 0, 0);
-** sqlite3_free(zSQL);
-** </pre></blockquote>
-**
-** Because the %q format string is used, the '\'' character in zText
-** is escaped and the SQL generated is as follows:
-**
-** <blockquote><pre>
-** INSERT INTO table1 VALUES('It''s a happy day!')
-** </pre></blockquote>
-**
-** This is correct. Had we used %s instead of %q, the generated SQL
-** would have looked like this:
-**
-** <blockquote><pre>
-** INSERT INTO table1 VALUES('It's a happy day!');
-** </pre></blockquote>
-**
-** This second example is an SQL syntax error. As a general rule you should
-** always use %q instead of %s when inserting text into a string literal.
-**
-** ^(The %Q option works like %q except it also adds single quotes around
-** the outside of the total string. Additionally, if the parameter in the
-** argument list is a NULL pointer, %Q substitutes the text "NULL" (without
-** single quotes).)^ So, for example, one could say:
-**
-** <blockquote><pre>
-** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
-** sqlite3_exec(db, zSQL, 0, 0, 0);
-** sqlite3_free(zSQL);
-** </pre></blockquote>
-**
-** The code above will render a correct SQL statement in the zSQL
-** variable even if the zText variable is a NULL pointer.
-**
-** ^(The "%w" formatting option is like "%q" except that it expects to
-** be contained within double-quotes instead of single quotes, and it
-** escapes the double-quote character instead of the single-quote
-** character.)^ The "%w" formatting option is intended for safely inserting
-** table and column names into a constructed SQL statement.
-**
-** ^(The "%z" formatting option works like "%s" but with the
-** addition that after the string has been read and copied into
-** the result, [sqlite3_free()] is called on the input string.)^
+** See also: [built-in printf()], [printf() SQL function]
*/
SQLITE_API char *sqlite3_mprintf(const char*,...);
SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
@@ -3956,8 +4044,8 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*,
** KEYWORDS: SQLITE_TRACE
**
** These constants identify classes of events that can be monitored
-** using the [sqlite3_trace_v2()] tracing logic. The third argument
-** to [sqlite3_trace_v2()] is an OR-ed combination of one or more of
+** using the [sqlite3_trace_v2()] tracing logic. The M argument
+** to [sqlite3_trace_v2(D,M,X,P)] is an OR-ed combination of one or more of
** the following constants. ^The first argument to the trace callback
** is one of the following constants.
**
@@ -4372,13 +4460,24 @@ SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int
** [database connection] D failed, then the sqlite3_errcode(D) interface
** returns the numeric [result code] or [extended result code] for that
** API call.
-** If the most recent API call was successful,
-** then the return value from sqlite3_errcode() is undefined.
** ^The sqlite3_extended_errcode()
** interface is the same except that it always returns the
** [extended result code] even when extended result codes are
** disabled.
**
+** The values returned by sqlite3_errcode() and/or
+** sqlite3_extended_errcode() might change with each API call.
+** Except, there are some interfaces that are guaranteed to never
+** change the value of the error code. The error-code preserving
+** interfaces are:
+**
+** <ul>
+** <li> sqlite3_errcode()
+** <li> sqlite3_extended_errcode()
+** <li> sqlite3_errmsg()
+** <li> sqlite3_errmsg16()
+** </ul>
+**
** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
** text that describes the error, as either UTF-8 or UTF-16 respectively.
** ^(Memory to hold the error message string is managed internally.
@@ -4568,9 +4667,19 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
** on this hint by avoiding the use of [lookaside memory] so as not to
** deplete the limited store of lookaside memory. Future versions of
** SQLite may act on this hint differently.
+**
+** [[SQLITE_PREPARE_NORMALIZE]] ^(<dt>SQLITE_PREPARE_NORMALIZE</dt>
+** <dd>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.
** </dl>
*/
#define SQLITE_PREPARE_PERSISTENT 0x01
+#define SQLITE_PREPARE_NORMALIZE 0x02
/*
** CAPI3REF: Compiling An SQL Statement
@@ -4664,13 +4773,13 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
** or [GLOB] operator or if the parameter is compared to an indexed column
** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled.
** </li>
+** </ol>
**
** <p>^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having
** the extra prepFlags parameter, which is a bit array consisting of zero or
** more of the [SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_*] flags. ^The
** sqlite3_prepare_v2() interface works exactly the same as
** sqlite3_prepare_v3() with a zero prepFlags parameter.
-** </ol>
*/
SQLITE_API int sqlite3_prepare(
sqlite3 *db, /* Database handle */
@@ -4728,6 +4837,11 @@ SQLITE_API int sqlite3_prepare16_v3(
** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8
** string containing the SQL text of prepared statement P with
** [bound parameters] expanded.
+** ^The sqlite3_normalized_sql(P) interface returns a pointer to a UTF-8
+** string containing the normalized SQL text of prepared statement P. 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.
**
** ^(For example, if a prepared statement is created using the SQL
** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345
@@ -4743,14 +4857,16 @@ SQLITE_API int sqlite3_prepare16_v3(
** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time
** option causes sqlite3_expanded_sql() to always return NULL.
**
-** ^The string returned by sqlite3_sql(P) is managed by SQLite and is
-** automatically freed when the prepared statement is finalized.
+** ^The strings returned by sqlite3_sql(P) and sqlite3_normalized_sql(P)
+** are managed by SQLite and are automatically freed when the prepared
+** statement is finalized.
** ^The string returned by sqlite3_expanded_sql(P), on the other hand,
** is obtained from [sqlite3_malloc()] and must be free by the application
** by passing it to [sqlite3_free()].
*/
SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt);
SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt);
+SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt);
/*
** CAPI3REF: Determine If An SQL Statement Writes The Database
@@ -5532,11 +5648,25 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** from [sqlite3_column_blob()], [sqlite3_column_text()], etc. into
** [sqlite3_free()].
**
-** ^(If a memory allocation error occurs during the evaluation of any
-** of these routines, a default value is returned. The default value
-** is either the integer 0, the floating point number 0.0, or a NULL
-** pointer. Subsequent calls to [sqlite3_errcode()] will return
-** [SQLITE_NOMEM].)^
+** As long as the input parameters are correct, these routines will only
+** fail if an out-of-memory error occurs during a format conversion.
+** Only the following subset of interfaces are subject to out-of-memory
+** errors:
+**
+** <ul>
+** <li> sqlite3_column_blob()
+** <li> sqlite3_column_text()
+** <li> sqlite3_column_text16()
+** <li> sqlite3_column_bytes()
+** <li> sqlite3_column_bytes16()
+** </ul>
+**
+** If an out-of-memory error occurs, then the return value from these
+** routines is the same as if the column had contained an SQL NULL value.
+** Valid SQL NULL returns can be distinguished from out-of-memory errors
+** by invoking the [sqlite3_errcode()] immediately after the suspect
+** return value is obtained and before any
+** other SQLite interface is called on the same [database connection].
*/
SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
@@ -5613,11 +5743,13 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
**
** ^These functions (collectively known as "function creation routines")
** are used to add SQL functions or aggregates or to redefine the behavior
-** of existing SQL functions or aggregates. The only differences between
-** these routines are the text encoding expected for
-** the second parameter (the name of the function being created)
-** and the presence or absence of a destructor callback for
-** the application data pointer.
+** of existing SQL functions or aggregates. The only differences between
+** the three "sqlite3_create_function*" routines are the text encoding
+** expected for the second parameter (the name of the function being
+** created) and the presence or absence of a destructor callback for
+** the application data pointer. Function sqlite3_create_window_function()
+** is similar, but allows the user to supply the extra callback functions
+** needed by [aggregate window functions].
**
** ^The first parameter is the [database connection] to which the SQL
** function is to be added. ^If an application uses more than one database
@@ -5663,7 +5795,8 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
** ^(The fifth parameter is an arbitrary pointer. The implementation of the
** function can gain access to this pointer using [sqlite3_user_data()].)^
**
-** ^The sixth, seventh and eighth parameters, xFunc, xStep and xFinal, are
+** ^The sixth, seventh and eighth parameters passed to the three
+** "sqlite3_create_function*" functions, xFunc, xStep and xFinal, are
** pointers to C-language functions that implement the SQL function or
** aggregate. ^A scalar SQL function requires an implementation of the xFunc
** callback only; NULL pointers must be passed as the xStep and xFinal
@@ -5672,15 +5805,24 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
** SQL function or aggregate, pass NULL pointers for all three function
** callbacks.
**
-** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL,
-** then it is destructor for the application data pointer.
-** The destructor is invoked when the function is deleted, either by being
-** overloaded or when the database connection closes.)^
-** ^The destructor is also invoked if the call to
-** sqlite3_create_function_v2() fails.
-** ^When the destructor callback of the tenth parameter is invoked, it
-** is passed a single argument which is a copy of the application data
-** pointer which was the fifth parameter to sqlite3_create_function_v2().
+** ^The sixth, seventh, eighth and ninth parameters (xStep, xFinal, xValue
+** and xInverse) passed to sqlite3_create_window_function are pointers to
+** C-language callbacks that implement the new function. xStep and xFinal
+** must both be non-NULL. xValue and xInverse may either both be NULL, in
+** which case a regular aggregate function is created, or must both be
+** non-NULL, in which case the new function may be used as either an aggregate
+** or aggregate window function. More details regarding the implementation
+** of aggregate window functions are
+** [user-defined window functions|available here].
+**
+** ^(If the final parameter to sqlite3_create_function_v2() or
+** sqlite3_create_window_function() is not NULL, then it is destructor for
+** the application data pointer. The destructor is invoked when the function
+** is deleted, either by being overloaded or when the database connection
+** closes.)^ ^The destructor is also invoked if the call to
+** sqlite3_create_function_v2() fails. ^When the destructor callback is
+** invoked, it is passed a single argument which is a copy of the application
+** data pointer which was the fifth parameter to sqlite3_create_function_v2().
**
** ^It is permitted to register multiple implementations of the same
** functions with the same name but with either differing numbers of
@@ -5733,6 +5875,18 @@ SQLITE_API int sqlite3_create_function_v2(
void (*xFinal)(sqlite3_context*),
void(*xDestroy)(void*)
);
+SQLITE_API int sqlite3_create_window_function(
+ sqlite3 *db,
+ const char *zFunctionName,
+ int nArg,
+ int eTextRep,
+ void *pApp,
+ void (*xStep)(sqlite3_context*,int,sqlite3_value**),
+ void (*xFinal)(sqlite3_context*),
+ void (*xValue)(sqlite3_context*),
+ void (*xInverse)(sqlite3_context*,int,sqlite3_value**),
+ void(*xDestroy)(void*)
+);
/*
** CAPI3REF: Text Encodings
@@ -5803,6 +5957,9 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
** datatype of the value
** <tr><td><b>sqlite3_value_numeric_type&nbsp;&nbsp;</b>
** <td>&rarr;&nbsp;&nbsp;<td>Best numeric datatype of the value
+** <tr><td><b>sqlite3_value_nochange&nbsp;&nbsp;</b>
+** <td>&rarr;&nbsp;&nbsp;<td>True if the column is unchanged in an UPDATE
+** against a virtual table.
** </table></blockquote>
**
** <b>Details:</b>
@@ -5851,6 +6008,19 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
** then the conversion is performed. Otherwise no conversion occurs.
** The [SQLITE_INTEGER | datatype] after conversion is returned.)^
**
+** ^Within the [xUpdate] method of a [virtual table], the
+** sqlite3_value_nochange(X) interface returns true if and only if
+** the column corresponding to X is unchanged by the UPDATE operation
+** that the xUpdate method call was invoked to implement and if
+** and the prior [xColumn] method call that was invoked to extracted
+** the value for that column returned without setting a result (probably
+** because it queried [sqlite3_vtab_nochange()] and found that the column
+** was unchanging). ^Within an [xUpdate] method, any value for which
+** sqlite3_value_nochange(X) is true will in all other respects appear
+** to be a NULL value. If sqlite3_value_nochange(X) is invoked anywhere other
+** than within an [xUpdate] method call for an UPDATE statement, then
+** the return value is arbitrary and meaningless.
+**
** 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
@@ -5859,6 +6029,28 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
**
** These routines must be called from the same thread as
** the SQL function that supplied the [sqlite3_value*] parameters.
+**
+** As long as the input parameter is correct, these routines can only
+** fail if an out-of-memory error occurs during a format conversion.
+** Only the following subset of interfaces are subject to out-of-memory
+** errors:
+**
+** <ul>
+** <li> sqlite3_value_blob()
+** <li> sqlite3_value_text()
+** <li> sqlite3_value_text16()
+** <li> sqlite3_value_text16le()
+** <li> sqlite3_value_text16be()
+** <li> sqlite3_value_bytes()
+** <li> sqlite3_value_bytes16()
+** </ul>
+**
+** If an out-of-memory error occurs, then the return value from these
+** routines is the same as if the column had contained an SQL NULL value.
+** Valid SQL NULL returns can be distinguished from out-of-memory errors
+** by invoking the [sqlite3_errcode()] immediately after the suspect
+** return value is obtained and before any
+** other SQLite interface is called on the same [database connection].
*/
SQLITE_API const void *sqlite3_value_blob(sqlite3_value*);
SQLITE_API double sqlite3_value_double(sqlite3_value*);
@@ -5873,6 +6065,7 @@ SQLITE_API int sqlite3_value_bytes(sqlite3_value*);
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*);
/*
** CAPI3REF: Finding The Subtype Of SQL Values
@@ -6529,6 +6722,41 @@ SQLITE_API char *sqlite3_temp_directory;
SQLITE_API char *sqlite3_data_directory;
/*
+** CAPI3REF: Win32 Specific Interface
+**
+** These interfaces are available only on Windows. The
+** [sqlite3_win32_set_directory] interface is used to set the value associated
+** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to
+** zValue, depending on the value of the type parameter. The zValue parameter
+** should be NULL to cause the previous value to be freed via [sqlite3_free];
+** a non-NULL value will be copied into memory obtained from [sqlite3_malloc]
+** prior to being used. The [sqlite3_win32_set_directory] interface returns
+** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported,
+** or [SQLITE_NOMEM] if memory could not be allocated. The value of the
+** [sqlite3_data_directory] variable is intended to act as a replacement for
+** the current directory on the sub-platforms of Win32 where that concept is
+** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and
+** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the
+** sqlite3_win32_set_directory interface except the string parameter must be
+** UTF-8 or UTF-16, respectively.
+*/
+SQLITE_API int sqlite3_win32_set_directory(
+ unsigned long type, /* Identifier for directory being set or reset */
+ void *zValue /* New value for directory being set or reset */
+);
+SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue);
+SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue);
+
+/*
+** CAPI3REF: Win32 Directory Types
+**
+** These macros are only available on Windows. They define the allowed values
+** for the type argument to the [sqlite3_win32_set_directory] interface.
+*/
+#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1
+#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2
+
+/*
** CAPI3REF: Test For Auto-Commit Mode
** KEYWORDS: {autocommit mode}
** METHOD: sqlite3
@@ -7128,6 +7356,9 @@ struct sqlite3_module {
int (*xSavepoint)(sqlite3_vtab *pVTab, int);
int (*xRelease)(sqlite3_vtab *pVTab, int);
int (*xRollbackTo)(sqlite3_vtab *pVTab, int);
+ /* The methods above are in versions 1 and 2 of the sqlite_module object.
+ ** Those below are for version 3 and greater. */
+ int (*xShadowName)(const char*);
};
/*
@@ -7260,6 +7491,10 @@ struct sqlite3_index_info {
/*
** CAPI3REF: Virtual Table Scan Flags
+**
+** Virtual table implementations are allowed to set the
+** [sqlite3_index_info].idxFlags field to some combination of
+** these bits.
*/
#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */
@@ -7285,6 +7520,7 @@ struct sqlite3_index_info {
#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70
#define SQLITE_INDEX_CONSTRAINT_ISNULL 71
#define SQLITE_INDEX_CONSTRAINT_IS 72
+#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150
/*
** CAPI3REF: Register A Virtual Table Implementation
@@ -7961,6 +8197,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
/*
** CAPI3REF: Low-Level Control Of Database Files
** METHOD: sqlite3
+** KEYWORDS: {file control}
**
** ^The [sqlite3_file_control()] interface makes a direct call to the
** xFileControl method for the [sqlite3_io_methods] object associated
@@ -7975,11 +8212,18 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
** the xFileControl method. ^The return value of the xFileControl
** method becomes the return value of this routine.
**
-** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes
+** A few opcodes for [sqlite3_file_control()] are handled directly
+** by the SQLite core and never invoke the
+** sqlite3_io_methods.xFileControl method.
+** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes
** a pointer to the underlying [sqlite3_file] object to be written into
-** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER
-** case is a short-circuit path which does not actually invoke the
-** underlying sqlite3_io_methods.xFileControl method.
+** the space pointed to by the 4th parameter. The
+** [SQLITE_FCNTL_JOURNAL_POINTER] works similarly except that it returns
+** the [sqlite3_file] object associated with the journal file instead of
+** the main database. The [SQLITE_FCNTL_VFS_POINTER] opcode returns
+** a pointer to the underlying [sqlite3_vfs] object for the file.
+** The [SQLITE_FCNTL_DATA_VERSION] returns the data version counter
+** from the pager.
**
** ^If the second parameter (zDbName) does not match the name of any
** open database file, then SQLITE_ERROR is returned. ^This error
@@ -7989,7 +8233,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
** an incorrect zDbName and an SQLITE_ERROR return from the underlying
** xFileControl method.
**
-** See also: [SQLITE_FCNTL_LOCKSTATE]
+** See also: [file control opcodes]
*/
SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*);
@@ -8035,8 +8279,9 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_ALWAYS 13
#define SQLITE_TESTCTRL_RESERVE 14
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
-#define SQLITE_TESTCTRL_ISKEYWORD 16
+#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
+#define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17
#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */
#define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19
@@ -8046,7 +8291,191 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_ISINIT 23
#define SQLITE_TESTCTRL_SORTER_MMAP 24
#define SQLITE_TESTCTRL_IMPOSTER 25
-#define SQLITE_TESTCTRL_LAST 25
+#define SQLITE_TESTCTRL_PARSER_COVERAGE 26
+#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */
+
+/*
+** CAPI3REF: SQL Keyword Checking
+**
+** These routines provide access to the set of SQL language keywords
+** recognized by SQLite. Applications can uses these routines to determine
+** whether or not a specific identifier needs to be escaped (for example,
+** by enclosing in double-quotes) so as not to confuse the parser.
+**
+** The sqlite3_keyword_count() interface returns the number of distinct
+** keywords understood by SQLite.
+**
+** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and
+** makes *Z point to that keyword expressed as UTF8 and writes the number
+** of bytes in the keyword into *L. The string that *Z points to is not
+** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns
+** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z
+** or L are NULL or invalid pointers then calls to
+** sqlite3_keyword_name(N,Z,L) result in undefined behavior.
+**
+** The sqlite3_keyword_check(Z,L) interface checks to see whether or not
+** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero
+** if it is and zero if not.
+**
+** The parser used by SQLite is forgiving. It is often possible to use
+** a keyword as an identifier as long as such use does not result in a
+** parsing ambiguity. For example, the statement
+** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and
+** creates a new table named "BEGIN" with three columns named
+** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid
+** using keywords as identifiers. Common techniques used to avoid keyword
+** name collisions include:
+** <ul>
+** <li> Put all identifier names inside double-quotes. This is the official
+** SQL way to escape identifier names.
+** <li> Put identifier names inside &#91;...&#93;. This is not standard SQL,
+** but it is what SQL Server does and so lots of programmers use this
+** technique.
+** <li> Begin every identifier with the letter "Z" as no SQL keywords start
+** with "Z".
+** <li> Include a digit somewhere in every identifier name.
+** </ul>
+**
+** Note that the number of keywords understood by SQLite can depend on
+** compile-time options. For example, "VACUUM" is not a keyword if
+** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also,
+** new keywords may be added to future releases of SQLite.
+*/
+SQLITE_API int sqlite3_keyword_count(void);
+SQLITE_API int sqlite3_keyword_name(int,const char**,int*);
+SQLITE_API int sqlite3_keyword_check(const char*,int);
+
+/*
+** CAPI3REF: Dynamic String Object
+** KEYWORDS: {dynamic string}
+**
+** An instance of the sqlite3_str object contains a dynamically-sized
+** string under construction.
+**
+** The lifecycle of an sqlite3_str object is as follows:
+** <ol>
+** <li> ^The sqlite3_str object is created using [sqlite3_str_new()].
+** <li> ^Text is appended to the sqlite3_str object using various
+** methods, such as [sqlite3_str_appendf()].
+** <li> ^The sqlite3_str object is destroyed and the string it created
+** is returned using the [sqlite3_str_finish()] interface.
+** </ol>
+*/
+typedef struct sqlite3_str sqlite3_str;
+
+/*
+** CAPI3REF: Create A New Dynamic String Object
+** CONSTRUCTOR: sqlite3_str
+**
+** ^The [sqlite3_str_new(D)] interface allocates and initializes
+** a new [sqlite3_str] object. To avoid memory leaks, the object returned by
+** [sqlite3_str_new()] must be freed by a subsequent call to
+** [sqlite3_str_finish(X)].
+**
+** ^The [sqlite3_str_new(D)] interface always returns a pointer to a
+** valid [sqlite3_str] object, though in the event of an out-of-memory
+** error the returned object might be a special singleton that will
+** silently reject new text, always return SQLITE_NOMEM from
+** [sqlite3_str_errcode()], always return 0 for
+** [sqlite3_str_length()], and always return NULL from
+** [sqlite3_str_finish(X)]. It is always safe to use the value
+** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter
+** to any of the other [sqlite3_str] methods.
+**
+** The D parameter to [sqlite3_str_new(D)] may be NULL. If the
+** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum
+** length of the string contained in the [sqlite3_str] object will be
+** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead
+** of [SQLITE_MAX_LENGTH].
+*/
+SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*);
+
+/*
+** CAPI3REF: Finalize A Dynamic String
+** DESTRUCTOR: sqlite3_str
+**
+** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X
+** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()]
+** that contains the constructed string. The calling application should
+** pass the returned value to [sqlite3_free()] to avoid a memory leak.
+** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any
+** errors were encountered during construction of the string. ^The
+** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the
+** string in [sqlite3_str] object X is zero bytes long.
+*/
+SQLITE_API char *sqlite3_str_finish(sqlite3_str*);
+
+/*
+** CAPI3REF: Add Content To A Dynamic String
+** METHOD: sqlite3_str
+**
+** These interfaces add content to an sqlite3_str object previously obtained
+** from [sqlite3_str_new()].
+**
+** ^The [sqlite3_str_appendf(X,F,...)] and
+** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf]
+** functionality of SQLite to append formatted text onto the end of
+** [sqlite3_str] object X.
+**
+** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S
+** onto the end of the [sqlite3_str] object X. N must be non-negative.
+** S must contain at least N non-zero bytes of content. To append a
+** zero-terminated string in its entirety, use the [sqlite3_str_appendall()]
+** method instead.
+**
+** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of
+** zero-terminated string S onto the end of [sqlite3_str] object X.
+**
+** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the
+** single-byte character C onto the end of [sqlite3_str] object X.
+** ^This method can be used, for example, to add whitespace indentation.
+**
+** ^The [sqlite3_str_reset(X)] method resets the string under construction
+** inside [sqlite3_str] object X back to zero bytes in length.
+**
+** These methods do not return a result code. ^If an error occurs, that fact
+** is recorded in the [sqlite3_str] object and can be recovered by a
+** subsequent call to [sqlite3_str_errcode(X)].
+*/
+SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...);
+SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list);
+SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N);
+SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn);
+SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C);
+SQLITE_API void sqlite3_str_reset(sqlite3_str*);
+
+/*
+** CAPI3REF: Status Of A Dynamic String
+** METHOD: sqlite3_str
+**
+** These interfaces return the current status of an [sqlite3_str] object.
+**
+** ^If any prior errors have occurred while constructing the dynamic string
+** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return
+** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns
+** [SQLITE_NOMEM] following any out-of-memory error, or
+** [SQLITE_TOOBIG] if the size of the dynamic string exceeds
+** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors.
+**
+** ^The [sqlite3_str_length(X)] method returns the current length, in bytes,
+** of the dynamic string under construction in [sqlite3_str] object X.
+** ^The length returned by [sqlite3_str_length(X)] does not include the
+** zero-termination byte.
+**
+** ^The [sqlite3_str_value(X)] method returns a pointer to the current
+** content of the dynamic string under construction in X. The value
+** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X
+** and might be freed or altered by any subsequent method on the same
+** [sqlite3_str] object. Applications must not used the pointer returned
+** [sqlite3_str_value(X)] after any subsequent method call on the same
+** object. ^Applications may change the content of the string returned
+** by [sqlite3_str_value(X)] as long as they do not write into any bytes
+** outside the range of 0 to [sqlite3_str_length(X)] and do not read or
+** write any byte after any subsequent sqlite3_str method call.
+*/
+SQLITE_API int sqlite3_str_errcode(sqlite3_str*);
+SQLITE_API int sqlite3_str_length(sqlite3_str*);
+SQLITE_API char *sqlite3_str_value(sqlite3_str*);
/*
** CAPI3REF: SQLite Runtime Status
@@ -8281,6 +8710,15 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r
** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0.
** </dd>
**
+** [[SQLITE_DBSTATUS_CACHE_SPILL]] ^(<dt>SQLITE_DBSTATUS_CACHE_SPILL</dt>
+** <dd>This parameter returns the number of dirty cache entries that have
+** been written to disk in the middle of a transaction due to the page
+** cache overflowing. Transactions are more efficient if they are written
+** to disk all at once. When pages spill mid-transaction, that introduces
+** additional overhead. This parameter can be used help identify
+** inefficiencies that can be resolve by increasing the cache size.
+** </dd>
+**
** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(<dt>SQLITE_DBSTATUS_DEFERRED_FKS</dt>
** <dd>This parameter returns zero for the current value if and only if
** all foreign key constraints (deferred or immediate) have been
@@ -8300,7 +8738,8 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r
#define SQLITE_DBSTATUS_CACHE_WRITE 9
#define SQLITE_DBSTATUS_DEFERRED_FKS 10
#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11
-#define SQLITE_DBSTATUS_MAX 11 /* Largest defined DBSTATUS */
+#define SQLITE_DBSTATUS_CACHE_SPILL 12
+#define SQLITE_DBSTATUS_MAX 12 /* Largest defined DBSTATUS */
/*
@@ -9255,6 +9694,7 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...);
** can use to customize and optimize their behavior.
**
** <dl>
+** [[SQLITE_VTAB_CONSTRAINT_SUPPORT]]
** <dt>SQLITE_VTAB_CONSTRAINT_SUPPORT
** <dd>Calls of the form
** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported,
@@ -9301,6 +9741,40 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...);
SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *);
/*
+** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE
+**
+** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn]
+** method of a [virtual table], then it returns true if and only if the
+** column is being fetched as part of an UPDATE operation during which the
+** column value will not change. Applications might use this to substitute
+** a return value that is less expensive to compute and that the corresponding
+** [xUpdate] method understands as a "no-change" value.
+**
+** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that
+** the column is not changed by the UPDATE statement, then the xColumn
+** method can optionally return without setting a result, without calling
+** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
+** In that case, [sqlite3_value_nochange(X)] will return true for the
+** same column in the [xUpdate] method.
+*/
+SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*);
+
+/*
+** CAPI3REF: Determine The Collation For a Virtual Table Constraint
+**
+** This function may only be called from within a call to the [xBestIndex]
+** method of a [virtual table].
+**
+** The first argument must be the sqlite3_index_info object that is the
+** first parameter to the xBestIndex() method. The second argument must be
+** an index into the aConstraint[] array belonging to the sqlite3_index_info
+** structure passed to xBestIndex. This function returns a pointer to a buffer
+** containing the name of the collation sequence for the corresponding
+** constraint.
+*/
+SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int);
+
+/*
** CAPI3REF: Conflict resolution modes
** KEYWORDS: {conflict resolution mode}
**
@@ -9570,7 +10044,6 @@ SQLITE_API int sqlite3_system_errno(sqlite3*);
/*
** CAPI3REF: Database Snapshot
** KEYWORDS: {snapshot} {sqlite3_snapshot}
-** EXPERIMENTAL
**
** An instance of the snapshot object records the state of a [WAL mode]
** database for some specific point in history.
@@ -9587,11 +10060,6 @@ SQLITE_API int sqlite3_system_errno(sqlite3*);
** version of the database file so that it is possible to later open a new read
** transaction that sees that historical version of the database rather than
** the most recent version.
-**
-** The constructor for this object is [sqlite3_snapshot_get()]. The
-** [sqlite3_snapshot_open()] method causes a fresh read transaction to refer
-** to an historical snapshot (if possible). The destructor for
-** sqlite3_snapshot objects is [sqlite3_snapshot_free()].
*/
typedef struct sqlite3_snapshot {
unsigned char hidden[48];
@@ -9599,7 +10067,7 @@ typedef struct sqlite3_snapshot {
/*
** CAPI3REF: Record A Database Snapshot
-** EXPERIMENTAL
+** CONSTRUCTOR: sqlite3_snapshot
**
** ^The [sqlite3_snapshot_get(D,S,P)] interface attempts to make a
** new [sqlite3_snapshot] object that records the current state of
@@ -9615,7 +10083,7 @@ typedef struct sqlite3_snapshot {
** in this case.
**
** <ul>
-** <li> The database handle must be in [autocommit mode].
+** <li> The database handle must not be in [autocommit mode].
**
** <li> Schema S of [database connection] D must be a [WAL mode] database.
**
@@ -9638,7 +10106,7 @@ typedef struct sqlite3_snapshot {
** to avoid a memory leak.
**
** The [sqlite3_snapshot_get()] interface is only available when the
-** SQLITE_ENABLE_SNAPSHOT compile-time option is used.
+** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used.
*/
SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get(
sqlite3 *db,
@@ -9648,24 +10116,35 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get(
/*
** CAPI3REF: Start a read transaction on an historical snapshot
-** EXPERIMENTAL
+** METHOD: sqlite3_snapshot
+**
+** ^The [sqlite3_snapshot_open(D,S,P)] interface either starts a new read
+** transaction or upgrades an existing one for schema S of
+** [database connection] D such that the read transaction refers to
+** historical [snapshot] P, rather than the most recent change to the
+** database. ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK
+** on success or an appropriate [error code] if it fails.
+**
+** ^In order to succeed, the database connection must not be in
+** [autocommit mode] when [sqlite3_snapshot_open(D,S,P)] is called. If there
+** is already a read transaction open on schema S, then the database handle
+** must have no active statements (SELECT statements that have been passed
+** to sqlite3_step() but not sqlite3_reset() or sqlite3_finalize()).
+** SQLITE_ERROR is returned if either of these conditions is violated, or
+** if schema S does not exist, or if the snapshot object is invalid.
+**
+** ^A call to sqlite3_snapshot_open() will fail to open if the specified
+** snapshot has been overwritten by a [checkpoint]. In this case
+** SQLITE_ERROR_SNAPSHOT is returned.
+**
+** If there is already a read transaction open when this function is
+** invoked, then the same read transaction remains open (on the same
+** database snapshot) if SQLITE_ERROR, SQLITE_BUSY or SQLITE_ERROR_SNAPSHOT
+** is returned. If another error code - for example SQLITE_PROTOCOL or an
+** SQLITE_IOERR error code - is returned, then the final state of the
+** read transaction is undefined. If SQLITE_OK is returned, then the
+** read transaction is now open on database snapshot P.
**
-** ^The [sqlite3_snapshot_open(D,S,P)] interface starts a
-** read transaction for schema S of
-** [database connection] D such that the read transaction
-** refers to historical [snapshot] P, rather than the most
-** recent change to the database.
-** ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK on success
-** or an appropriate [error code] if it fails.
-**
-** ^In order to succeed, a call to [sqlite3_snapshot_open(D,S,P)] must be
-** the first operation following the [BEGIN] that takes the schema S
-** out of [autocommit mode].
-** ^In other words, schema S must not currently be in
-** a transaction for [sqlite3_snapshot_open(D,S,P)] to work, but the
-** database connection D must be out of [autocommit mode].
-** ^A [snapshot] will fail to open if it has been overwritten by a
-** [checkpoint].
** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the
** database connection D does not know that the database file for
** schema S is in [WAL mode]. A database connection might not know
@@ -9676,7 +10155,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get(
** database connection in order to make it ready to use snapshots.)
**
** The [sqlite3_snapshot_open()] interface is only available when the
-** SQLITE_ENABLE_SNAPSHOT compile-time option is used.
+** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used.
*/
SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open(
sqlite3 *db,
@@ -9686,20 +10165,20 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open(
/*
** CAPI3REF: Destroy a snapshot
-** EXPERIMENTAL
+** DESTRUCTOR: sqlite3_snapshot
**
** ^The [sqlite3_snapshot_free(P)] interface destroys [sqlite3_snapshot] P.
** The application must eventually free every [sqlite3_snapshot] object
** using this routine to avoid a memory leak.
**
** The [sqlite3_snapshot_free()] interface is only available when the
-** SQLITE_ENABLE_SNAPSHOT compile-time option is used.
+** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used.
*/
SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*);
/*
** CAPI3REF: Compare the ages of two snapshot handles.
-** EXPERIMENTAL
+** METHOD: sqlite3_snapshot
**
** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages
** of two valid snapshot handles.
@@ -9718,6 +10197,9 @@ SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*);
** Otherwise, this API returns a negative value if P1 refers to an older
** snapshot than P2, zero if the two handles refer to the same database
** snapshot, and a positive value if P1 is a newer snapshot than P2.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_SNAPSHOT] option.
*/
SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp(
sqlite3_snapshot *p1,
@@ -9726,27 +10208,152 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp(
/*
** CAPI3REF: Recover snapshots from a wal file
-** EXPERIMENTAL
+** METHOD: sqlite3_snapshot
**
-** If all connections disconnect from a database file but do not perform
-** a checkpoint, the existing wal file is opened along with the database
-** file the next time the database is opened. At this point it is only
-** possible to successfully call sqlite3_snapshot_open() to open the most
-** recent snapshot of the database (the one at the head of the wal file),
-** even though the wal file may contain other valid snapshots for which
-** clients have sqlite3_snapshot handles.
+** If a [WAL file] remains on disk after all database connections close
+** (either through the use of the [SQLITE_FCNTL_PERSIST_WAL] [file control]
+** or because the last process to have the database opened exited without
+** calling [sqlite3_close()]) and a new connection is subsequently opened
+** on that database and [WAL file], the [sqlite3_snapshot_open()] interface
+** will only be able to open the last transaction added to the WAL file
+** even though the WAL file contains other valid transactions.
**
-** This function attempts to scan the wal file associated with database zDb
+** This function attempts to scan the WAL file associated with database zDb
** of database handle db and make all valid snapshots available to
** sqlite3_snapshot_open(). It is an error if there is already a read
-** transaction open on the database, or if the database is not a wal mode
+** transaction open on the database, or if the database is not a WAL mode
** database.
**
** SQLITE_OK is returned if successful, or an SQLite error code otherwise.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_SNAPSHOT] option.
*/
SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb);
/*
+** CAPI3REF: Serialize a database
+**
+** The sqlite3_serialize(D,S,P,F) interface returns a pointer to memory
+** that is a serialization of the S database on [database connection] D.
+** If P is not a NULL pointer, then the size of the database in bytes
+** is written into *P.
+**
+** For an ordinary on-disk database file, the serialization is just a
+** copy of the disk file. For an in-memory database or a "TEMP" database,
+** the serialization is the same sequence of bytes which would be written
+** to disk if that database where backed up to disk.
+**
+** The usual case is that sqlite3_serialize() copies the serialization of
+** the database into memory obtained from [sqlite3_malloc64()] and returns
+** a pointer to that memory. The caller is responsible for freeing the
+** returned value to avoid a memory leak. However, if the F argument
+** contains the SQLITE_SERIALIZE_NOCOPY bit, then no memory allocations
+** are made, and the sqlite3_serialize() function will return a pointer
+** to the contiguous memory representation of the database that SQLite
+** is currently using for that database, or NULL if the no such contiguous
+** memory representation of the database exists. A contiguous memory
+** representation of the database will usually only exist if there has
+** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
+** values of D and S.
+** The size of the database is written into *P even if the
+** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy
+** of the database exists.
+**
+** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
+** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory
+** allocation error occurs.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_DESERIALIZE] option.
+*/
+SQLITE_API unsigned char *sqlite3_serialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which DB to serialize. ex: "main", "temp", ... */
+ sqlite3_int64 *piSize, /* Write size of the DB here, if not NULL */
+ unsigned int mFlags /* Zero or more SQLITE_SERIALIZE_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3_serialize
+**
+** Zero or more of the following constants can be OR-ed together for
+** the F argument to [sqlite3_serialize(D,S,P,F)].
+**
+** SQLITE_SERIALIZE_NOCOPY means that [sqlite3_serialize()] will return
+** a pointer to contiguous in-memory database that it is currently using,
+** without making a copy of the database. If SQLite is not currently using
+** a contiguous in-memory database, then this option causes
+** [sqlite3_serialize()] to return a NULL pointer. SQLite will only be
+** using a contiguous in-memory database if it has been initialized by a
+** prior call to [sqlite3_deserialize()].
+*/
+#define SQLITE_SERIALIZE_NOCOPY 0x001 /* Do no memory allocations */
+
+/*
+** CAPI3REF: Deserialize a database
+**
+** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the
+** [database connection] D to disconnect from database S and then
+** reopen S as an in-memory database based on the serialization contained
+** in P. The serialized database P is N bytes in size. M is the size of
+** the buffer P, which might be larger than N. If M is larger than N, and
+** the SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is
+** permitted to add content to the in-memory database as long as the total
+** size does not exceed M bytes.
+**
+** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will
+** invoke sqlite3_free() on the serialization buffer when the database
+** connection closes. If the SQLITE_DESERIALIZE_RESIZEABLE bit is set, then
+** SQLite will try to increase the buffer size using sqlite3_realloc64()
+** if writes on the database cause it to grow larger than M bytes.
+**
+** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the
+** database is currently in a read transaction or is involved in a backup
+** operation.
+**
+** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the
+** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then
+** [sqlite3_free()] is invoked on argument P prior to returning.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_DESERIALIZE] option.
+*/
+SQLITE_API int sqlite3_deserialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which DB to reopen with the deserialization */
+ unsigned char *pData, /* The serialized database content */
+ sqlite3_int64 szDb, /* Number bytes in the deserialization */
+ sqlite3_int64 szBuf, /* Total size of buffer pData[] */
+ unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3_deserialize()
+**
+** The following are allowed values for 6th argument (the F argument) to
+** the [sqlite3_deserialize(D,S,P,N,M,F)] interface.
+**
+** The SQLITE_DESERIALIZE_FREEONCLOSE means that the database serialization
+** in the P argument is held in memory obtained from [sqlite3_malloc64()]
+** and that SQLite should take ownership of this memory and automatically
+** free it when it has finished using it. Without this flag, the caller
+** is responsible for freeing any dynamically allocated memory.
+**
+** The SQLITE_DESERIALIZE_RESIZEABLE flag means that SQLite is allowed to
+** grow the size of the database using calls to [sqlite3_realloc64()]. This
+** flag should only be used if SQLITE_DESERIALIZE_FREEONCLOSE is also used.
+** Without this flag, the deserialized database cannot increase in size beyond
+** the number of bytes specified by the M parameter.
+**
+** The SQLITE_DESERIALIZE_READONLY flag means that the deserialized database
+** should be treated as read-only.
+*/
+#define SQLITE_DESERIALIZE_FREEONCLOSE 1 /* Call sqlite3_free() on close */
+#define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */
+#define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */
+
+/*
** Undo the hack that converts floating point types to integer for
** builds on processors without floating point support.
*/
@@ -9857,7 +10464,7 @@ struct sqlite3_rtree_query_info {
sqlite3_int64 iRowid; /* Rowid for current entry */
sqlite3_rtree_dbl rParentScore; /* Score of parent node */
int eParentWithin; /* Visibility of parent node */
- int eWithin; /* OUT: Visiblity */
+ int eWithin; /* OUT: Visibility */
sqlite3_rtree_dbl rScore; /* OUT: Write the score here */
/* The following fields are only available in 3.8.11 and later */
sqlite3_value **apSqlParam; /* Original SQL values of parameters */
@@ -9893,16 +10500,23 @@ extern "C" {
/*
** CAPI3REF: Session Object Handle
+**
+** An instance of this object is a [session] that can be used to
+** record changes to a database.
*/
typedef struct sqlite3_session sqlite3_session;
/*
** CAPI3REF: Changeset Iterator Handle
+**
+** An instance of this object acts as a cursor for iterating
+** over the elements of a [changeset] or [patchset].
*/
typedef struct sqlite3_changeset_iter sqlite3_changeset_iter;
/*
** CAPI3REF: Create A New Session Object
+** CONSTRUCTOR: sqlite3_session
**
** Create a new session object attached to database handle db. If successful,
** a pointer to the new object is written to *ppSession and SQLITE_OK is
@@ -9939,6 +10553,7 @@ SQLITE_API int sqlite3session_create(
/*
** CAPI3REF: Delete A Session Object
+** DESTRUCTOR: sqlite3_session
**
** Delete a session object previously allocated using
** [sqlite3session_create()]. Once a session object has been deleted, the
@@ -9954,6 +10569,7 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession);
/*
** CAPI3REF: Enable Or Disable A Session Object
+** METHOD: sqlite3_session
**
** Enable or disable the recording of changes by a session object. When
** enabled, a session object records changes made to the database. When
@@ -9973,6 +10589,7 @@ SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable);
/*
** CAPI3REF: Set Or Clear the Indirect Change Flag
+** METHOD: sqlite3_session
**
** Each change recorded by a session object is marked as either direct or
** indirect. A change is marked as indirect if either:
@@ -10002,6 +10619,7 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect)
/*
** CAPI3REF: Attach A Table To A Session Object
+** METHOD: sqlite3_session
**
** If argument zTab is not NULL, then it is the name of a table to attach
** to the session object passed as the first argument. All subsequent changes
@@ -10027,6 +10645,35 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect)
**
** SQLITE_OK is returned if the call completes without error. Or, if an error
** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned.
+**
+** <h3>Special sqlite_stat1 Handling</h3>
+**
+** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to
+** some of the rules above. In SQLite, the schema of sqlite_stat1 is:
+** <pre>
+** &nbsp; CREATE TABLE sqlite_stat1(tbl,idx,stat)
+** </pre>
+**
+** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are
+** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes
+** are recorded for rows for which (idx IS NULL) is true. However, for such
+** rows a zero-length blob (SQL value X'') is stored in the changeset or
+** patchset instead of a NULL value. This allows such changesets to be
+** manipulated by legacy implementations of sqlite3changeset_invert(),
+** concat() and similar.
+**
+** The sqlite3changeset_apply() function automatically converts the
+** zero-length blob back to a NULL value when updating the sqlite_stat1
+** table. However, if the application calls sqlite3changeset_new(),
+** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset
+** iterator directly (including on a changeset iterator passed to a
+** conflict-handler callback) then the X'' value is returned. The application
+** must translate X'' to NULL itself if required.
+**
+** Legacy (older than 3.22.0) versions of the sessions module cannot capture
+** changes made to the sqlite_stat1 table. Legacy versions of the
+** sqlite3changeset_apply() function silently ignore any modifications to the
+** sqlite_stat1 table that are part of a changeset or patchset.
*/
SQLITE_API int sqlite3session_attach(
sqlite3_session *pSession, /* Session object */
@@ -10035,6 +10682,7 @@ SQLITE_API int sqlite3session_attach(
/*
** CAPI3REF: Set a table filter on a Session Object.
+** METHOD: sqlite3_session
**
** The second argument (xFilter) is the "filter callback". For changes to rows
** in tables that are not attached to the Session object, the filter is called
@@ -10053,6 +10701,7 @@ SQLITE_API void sqlite3session_table_filter(
/*
** CAPI3REF: Generate A Changeset From A Session Object
+** METHOD: sqlite3_session
**
** Obtain a changeset containing changes to the tables attached to the
** session object passed as the first argument. If successful,
@@ -10162,7 +10811,8 @@ SQLITE_API int sqlite3session_changeset(
);
/*
-** CAPI3REF: Load The Difference Between Tables Into A Session
+** CAPI3REF: Load The Difference Between Tables Into A Session
+** METHOD: sqlite3_session
**
** If it is not already attached to the session object passed as the first
** argument, this function attaches table zTbl in the same manner as the
@@ -10227,6 +10877,7 @@ SQLITE_API int sqlite3session_diff(
/*
** CAPI3REF: Generate A Patchset From A Session Object
+** METHOD: sqlite3_session
**
** The differences between a patchset and a changeset are that:
**
@@ -10278,6 +10929,7 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession);
/*
** CAPI3REF: Create An Iterator To Traverse A Changeset
+** CONSTRUCTOR: sqlite3_changeset_iter
**
** Create an iterator used to iterate through the contents of a changeset.
** If successful, *pp is set to point to the iterator handle and SQLITE_OK
@@ -10308,16 +10960,43 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession);
** consecutively. There is no chance that the iterator will visit a change
** the applies to table X, then one for table Y, and then later on visit
** another change for table X.
+**
+** The behavior of sqlite3changeset_start_v2() and its streaming equivalent
+** may be modified by passing a combination of
+** [SQLITE_CHANGESETSTART_INVERT | supported flags] as the 4th parameter.
+**
+** Note that the sqlite3changeset_start_v2() API is still <b>experimental</b>
+** and therefore subject to change.
*/
SQLITE_API int sqlite3changeset_start(
sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */
int nChangeset, /* Size of changeset blob in bytes */
void *pChangeset /* Pointer to blob containing changeset */
);
+SQLITE_API int sqlite3changeset_start_v2(
+ sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */
+ int nChangeset, /* Size of changeset blob in bytes */
+ void *pChangeset, /* Pointer to blob containing changeset */
+ int flags /* SESSION_CHANGESETSTART_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3changeset_start_v2
+**
+** The following flags may passed via the 4th parameter to
+** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]:
+**
+** <dt>SQLITE_CHANGESETAPPLY_INVERT <dd>
+** Invert the changeset while iterating through it. This is equivalent to
+** inverting a changeset using sqlite3changeset_invert() before applying it.
+** It is an error to specify this flag with a patchset.
+*/
+#define SQLITE_CHANGESETSTART_INVERT 0x0002
/*
** CAPI3REF: Advance A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function may only be used with iterators created by function
** [sqlite3changeset_start()]. If it is called on an iterator passed to
@@ -10342,6 +11021,7 @@ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter);
/*
** CAPI3REF: Obtain The Current Operation From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -10376,6 +11056,7 @@ SQLITE_API int sqlite3changeset_op(
/*
** CAPI3REF: Obtain The Primary Key Definition Of A Table
+** METHOD: sqlite3_changeset_iter
**
** For each modified table, a changeset includes the following:
**
@@ -10407,6 +11088,7 @@ SQLITE_API int sqlite3changeset_pk(
/*
** CAPI3REF: Obtain old.* Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -10437,6 +11119,7 @@ SQLITE_API int sqlite3changeset_old(
/*
** CAPI3REF: Obtain new.* Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -10470,6 +11153,7 @@ SQLITE_API int sqlite3changeset_new(
/*
** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function should only be used with iterator objects passed to a
** conflict-handler callback by [sqlite3changeset_apply()] with either
@@ -10497,6 +11181,7 @@ SQLITE_API int sqlite3changeset_conflict(
/*
** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations
+** METHOD: sqlite3_changeset_iter
**
** This function may only be called with an iterator passed to an
** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case
@@ -10513,6 +11198,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
/*
** CAPI3REF: Finalize A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function is used to finalize an iterator allocated with
** [sqlite3changeset_start()].
@@ -10529,6 +11215,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
** to that error is returned by this function. Otherwise, SQLITE_OK is
** returned. This is to allow the following pattern (pseudo-code):
**
+** <pre>
** sqlite3changeset_start();
** while( SQLITE_ROW==sqlite3changeset_next() ){
** // Do something with change.
@@ -10537,6 +11224,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
** if( rc!=SQLITE_OK ){
** // An error has occurred
** }
+** </pre>
*/
SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter);
@@ -10584,6 +11272,7 @@ SQLITE_API int sqlite3changeset_invert(
** sqlite3_changegroup object. Calling it produces similar results as the
** following code fragment:
**
+** <pre>
** sqlite3_changegroup *pGrp;
** rc = sqlite3_changegroup_new(&pGrp);
** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA);
@@ -10594,6 +11283,7 @@ SQLITE_API int sqlite3changeset_invert(
** *ppOut = 0;
** *pnOut = 0;
** }
+** </pre>
**
** Refer to the sqlite3_changegroup documentation below for details.
*/
@@ -10609,11 +11299,15 @@ SQLITE_API int sqlite3changeset_concat(
/*
** CAPI3REF: Changegroup Handle
+**
+** A changegroup is an object used to combine two or more
+** [changesets] or [patchsets]
*/
typedef struct sqlite3_changegroup sqlite3_changegroup;
/*
** CAPI3REF: Create A New Changegroup Object
+** CONSTRUCTOR: sqlite3_changegroup
**
** An sqlite3_changegroup object is used to combine two or more changesets
** (or patchsets) into a single changeset (or patchset). A single changegroup
@@ -10651,6 +11345,7 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp);
/*
** CAPI3REF: Add A Changeset To A Changegroup
+** METHOD: sqlite3_changegroup
**
** Add all changes within the changeset (or patchset) in buffer pData (size
** nData bytes) to the changegroup.
@@ -10728,6 +11423,7 @@ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pDa
/*
** CAPI3REF: Obtain A Composite Changeset From A Changegroup
+** METHOD: sqlite3_changegroup
**
** Obtain a buffer containing a changeset (or patchset) representing the
** current contents of the changegroup. If the inputs to the changegroup
@@ -10758,25 +11454,25 @@ SQLITE_API int sqlite3changegroup_output(
/*
** CAPI3REF: Delete A Changegroup Object
+** DESTRUCTOR: sqlite3_changegroup
*/
SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
/*
** CAPI3REF: Apply A Changeset To A Database
**
-** Apply a changeset to a database. This function attempts to update the
-** "main" database attached to handle db with the changes found in the
-** changeset passed via the second and third arguments.
+** Apply a changeset or patchset to a database. These functions attempt to
+** update the "main" database attached to handle db with the changes found in
+** the changeset passed via the second and third arguments.
**
-** The fourth argument (xFilter) passed to this function is the "filter
+** The fourth argument (xFilter) passed to these functions is the "filter
** callback". If it is not NULL, then for each table affected by at least one
** change in the changeset, the filter callback is invoked with
** the table name as the second argument, and a copy of the context pointer
-** passed as the sixth argument to this function as the first. If the "filter
-** callback" returns zero, then no attempt is made to apply any changes to
-** the table. Otherwise, if the return value is non-zero or the xFilter
-** argument to this function is NULL, all changes related to the table are
-** attempted.
+** passed as the sixth argument as the first. If the "filter callback"
+** returns zero, then no attempt is made to apply any changes to the table.
+** Otherwise, if the return value is non-zero or the xFilter argument to
+** is NULL, all changes related to the table are attempted.
**
** For each table that is not excluded by the filter callback, this function
** tests that the target database contains a compatible table. A table is
@@ -10821,7 +11517,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
**
** <dl>
** <dt>DELETE Changes<dd>
-** For each DELETE change, this function checks if the target database
+** For each DELETE change, the function checks if the target database
** contains a row with the same primary key value (or values) as the
** original row values stored in the changeset. If it does, and the values
** stored in all non-primary key columns also match the values stored in
@@ -10866,7 +11562,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
** [SQLITE_CHANGESET_REPLACE].
**
** <dt>UPDATE Changes<dd>
-** For each UPDATE change, this function checks if the target database
+** For each UPDATE change, the function checks if the target database
** contains a row with the same primary key value (or values) as the
** original row values stored in the changeset. If it does, and the values
** stored in all modified non-primary key columns also match the values
@@ -10897,11 +11593,28 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
** This can be used to further customize the applications conflict
** resolution strategy.
**
-** All changes made by this function are enclosed in a savepoint transaction.
+** All changes made by these functions are enclosed in a savepoint transaction.
** If any other error (aside from a constraint failure when attempting to
** write to the target database) occurs, then the savepoint transaction is
** rolled back, restoring the target database to its original state, and an
** SQLite error code returned.
+**
+** If the output parameters (ppRebase) and (pnRebase) are non-NULL and
+** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2()
+** may set (*ppRebase) to point to a "rebase" that may be used with the
+** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase)
+** is set to the size of the buffer in bytes. It is the responsibility of the
+** caller to eventually free any such buffer using sqlite3_free(). The buffer
+** is only allocated and populated if one or more conflicts were encountered
+** while applying the patchset. See comments surrounding the sqlite3_rebaser
+** APIs for further details.
+**
+** The behavior of sqlite3changeset_apply_v2() and its streaming equivalent
+** may be modified by passing a combination of
+** [SQLITE_CHANGESETAPPLY_NOSAVEPOINT | supported flags] as the 9th parameter.
+**
+** Note that the sqlite3changeset_apply_v2() API is still <b>experimental</b>
+** and therefore subject to change.
*/
SQLITE_API int sqlite3changeset_apply(
sqlite3 *db, /* Apply change to "main" db of this handle */
@@ -10918,6 +11631,47 @@ SQLITE_API int sqlite3changeset_apply(
),
void *pCtx /* First argument passed to xConflict */
);
+SQLITE_API int sqlite3changeset_apply_v2(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int nChangeset, /* Size of changeset in bytes */
+ void *pChangeset, /* Changeset blob */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase, /* OUT: Rebase data */
+ int flags /* SESSION_CHANGESETAPPLY_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3changeset_apply_v2
+**
+** The following flags may passed via the 9th parameter to
+** [sqlite3changeset_apply_v2] and [sqlite3changeset_apply_v2_strm]:
+**
+** <dl>
+** <dt>SQLITE_CHANGESETAPPLY_NOSAVEPOINT <dd>
+** Usually, the sessions module encloses all operations performed by
+** a single call to apply_v2() or apply_v2_strm() in a [SAVEPOINT]. The
+** SAVEPOINT is committed if the changeset or patchset is successfully
+** applied, or rolled back if an error occurs. Specifying this flag
+** causes the sessions module to omit this savepoint. In this case, if the
+** caller has an open transaction or savepoint when apply_v2() is called,
+** it may revert the partially applied changeset by rolling it back.
+**
+** <dt>SQLITE_CHANGESETAPPLY_INVERT <dd>
+** Invert the changeset before applying it. This is equivalent to inverting
+** a changeset using sqlite3changeset_invert() before applying it. It is
+** an error to specify this flag with a patchset.
+*/
+#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001
+#define SQLITE_CHANGESETAPPLY_INVERT 0x0002
/*
** CAPI3REF: Constants Passed To The Conflict Handler
@@ -11015,6 +11769,161 @@ SQLITE_API int sqlite3changeset_apply(
#define SQLITE_CHANGESET_REPLACE 1
#define SQLITE_CHANGESET_ABORT 2
+/*
+** CAPI3REF: Rebasing changesets
+** EXPERIMENTAL
+**
+** Suppose there is a site hosting a database in state S0. And that
+** modifications are made that move that database to state S1 and a
+** changeset recorded (the "local" changeset). Then, a changeset based
+** on S0 is received from another site (the "remote" changeset) and
+** applied to the database. The database is then in state
+** (S1+"remote"), where the exact state depends on any conflict
+** resolution decisions (OMIT or REPLACE) made while applying "remote".
+** Rebasing a changeset is to update it to take those conflict
+** resolution decisions into account, so that the same conflicts
+** do not have to be resolved elsewhere in the network.
+**
+** For example, if both the local and remote changesets contain an
+** INSERT of the same key on "CREATE TABLE t1(a PRIMARY KEY, b)":
+**
+** local: INSERT INTO t1 VALUES(1, 'v1');
+** remote: INSERT INTO t1 VALUES(1, 'v2');
+**
+** and the conflict resolution is REPLACE, then the INSERT change is
+** removed from the local changeset (it was overridden). Or, if the
+** conflict resolution was "OMIT", then the local changeset is modified
+** to instead contain:
+**
+** UPDATE t1 SET b = 'v2' WHERE a=1;
+**
+** Changes within the local changeset are rebased as follows:
+**
+** <dl>
+** <dt>Local INSERT<dd>
+** This may only conflict with a remote INSERT. If the conflict
+** resolution was OMIT, then add an UPDATE change to the rebased
+** changeset. Or, if the conflict resolution was REPLACE, add
+** nothing to the rebased changeset.
+**
+** <dt>Local DELETE<dd>
+** This may conflict with a remote UPDATE or DELETE. In both cases the
+** only possible resolution is OMIT. If the remote operation was a
+** DELETE, then add no change to the rebased changeset. If the remote
+** operation was an UPDATE, then the old.* fields of change are updated
+** to reflect the new.* values in the UPDATE.
+**
+** <dt>Local UPDATE<dd>
+** This may conflict with a remote UPDATE or DELETE. If it conflicts
+** with a DELETE, and the conflict resolution was OMIT, then the update
+** is changed into an INSERT. Any undefined values in the new.* record
+** from the update change are filled in using the old.* values from
+** the conflicting DELETE. Or, if the conflict resolution was REPLACE,
+** the UPDATE change is simply omitted from the rebased changeset.
+**
+** If conflict is with a remote UPDATE and the resolution is OMIT, then
+** the old.* values are rebased using the new.* values in the remote
+** change. Or, if the resolution is REPLACE, then the change is copied
+** into the rebased changeset with updates to columns also updated by
+** the conflicting remote UPDATE removed. If this means no columns would
+** be updated, the change is omitted.
+** </dl>
+**
+** A local change may be rebased against multiple remote changes
+** simultaneously. If a single key is modified by multiple remote
+** changesets, they are combined as follows before the local changeset
+** is rebased:
+**
+** <ul>
+** <li> If there has been one or more REPLACE resolutions on a
+** key, it is rebased according to a REPLACE.
+**
+** <li> If there have been no REPLACE resolutions on a key, then
+** the local changeset is rebased according to the most recent
+** of the OMIT resolutions.
+** </ul>
+**
+** Note that conflict resolutions from multiple remote changesets are
+** combined on a per-field basis, not per-row. This means that in the
+** case of multiple remote UPDATE operations, some fields of a single
+** local change may be rebased for REPLACE while others are rebased for
+** OMIT.
+**
+** In order to rebase a local changeset, the remote changeset must first
+** be applied to the local database using sqlite3changeset_apply_v2() and
+** the buffer of rebase information captured. Then:
+**
+** <ol>
+** <li> An sqlite3_rebaser object is created by calling
+** sqlite3rebaser_create().
+** <li> The new object is configured with the rebase buffer obtained from
+** sqlite3changeset_apply_v2() by calling sqlite3rebaser_configure().
+** If the local changeset is to be rebased against multiple remote
+** changesets, then sqlite3rebaser_configure() should be called
+** multiple times, in the same order that the multiple
+** sqlite3changeset_apply_v2() calls were made.
+** <li> Each local changeset is rebased by calling sqlite3rebaser_rebase().
+** <li> The sqlite3_rebaser object is deleted by calling
+** sqlite3rebaser_delete().
+** </ol>
+*/
+typedef struct sqlite3_rebaser sqlite3_rebaser;
+
+/*
+** CAPI3REF: Create a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Allocate a new changeset rebaser object. If successful, set (*ppNew) to
+** point to the new object and return SQLITE_OK. Otherwise, if an error
+** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew)
+** to NULL.
+*/
+SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew);
+
+/*
+** CAPI3REF: Configure a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Configure the changeset rebaser object to rebase changesets according
+** to the conflict resolutions described by buffer pRebase (size nRebase
+** bytes), which must have been obtained from a previous call to
+** sqlite3changeset_apply_v2().
+*/
+SQLITE_API int sqlite3rebaser_configure(
+ sqlite3_rebaser*,
+ int nRebase, const void *pRebase
+);
+
+/*
+** CAPI3REF: Rebase a changeset
+** EXPERIMENTAL
+**
+** Argument pIn must point to a buffer containing a changeset nIn bytes
+** 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
+** (*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)
+** are set to zero and an SQLite error code returned.
+*/
+SQLITE_API int sqlite3rebaser_rebase(
+ sqlite3_rebaser*,
+ int nIn, const void *pIn,
+ int *pnOut, void **ppOut
+);
+
+/*
+** CAPI3REF: Delete a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Delete the changeset rebaser object and all associated resources. There
+** should be one call to this function for each successful invocation
+** of sqlite3rebaser_create().
+*/
+SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p);
+
/*
** CAPI3REF: Streaming Versions of API functions.
**
@@ -11024,6 +11933,7 @@ SQLITE_API int sqlite3changeset_apply(
** <table border=1 style="margin-left:8ex;margin-right:8ex">
** <tr><th>Streaming function<th>Non-streaming equivalent</th>
** <tr><td>sqlite3changeset_apply_strm<td>[sqlite3changeset_apply]
+** <tr><td>sqlite3changeset_apply_strm_v2<td>[sqlite3changeset_apply_v2]
** <tr><td>sqlite3changeset_concat_strm<td>[sqlite3changeset_concat]
** <tr><td>sqlite3changeset_invert_strm<td>[sqlite3changeset_invert]
** <tr><td>sqlite3changeset_start_strm<td>[sqlite3changeset_start]
@@ -11119,6 +12029,23 @@ SQLITE_API int sqlite3changeset_apply_strm(
),
void *pCtx /* First argument passed to xConflict */
);
+SQLITE_API int sqlite3changeset_apply_v2_strm(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
+ void *pIn, /* First arg for xInput */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase,
+ int flags
+);
SQLITE_API int sqlite3changeset_concat_strm(
int (*xInputA)(void *pIn, void *pData, int *pnData),
void *pInA,
@@ -11138,6 +12065,12 @@ SQLITE_API int sqlite3changeset_start_strm(
int (*xInput)(void *pIn, void *pData, int *pnData),
void *pIn
);
+SQLITE_API int sqlite3changeset_start_v2_strm(
+ sqlite3_changeset_iter **pp,
+ int (*xInput)(void *pIn, void *pData, int *pnData),
+ void *pIn,
+ int flags
+);
SQLITE_API int sqlite3session_changeset_strm(
sqlite3_session *pSession,
int (*xOutput)(void *pOut, const void *pData, int nData),
@@ -11156,7 +12089,53 @@ SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*,
int (*xOutput)(void *pOut, const void *pData, int nData),
void *pOut
);
+SQLITE_API int sqlite3rebaser_rebase_strm(
+ sqlite3_rebaser *pRebaser,
+ int (*xInput)(void *pIn, void *pData, int *pnData),
+ void *pIn,
+ int (*xOutput)(void *pOut, const void *pData, int nData),
+ void *pOut
+);
+
+/*
+** CAPI3REF: Configure global parameters
+**
+** The sqlite3session_config() interface is used to make global configuration
+** changes to the sessions module in order to tune it to the specific needs
+** of the application.
+**
+** The sqlite3session_config() interface is not threadsafe. If it is invoked
+** while any other thread is inside any other sessions method then the
+** results are undefined. Furthermore, if it is invoked after any sessions
+** related objects have been created, the results are also undefined.
+**
+** The first argument to the sqlite3session_config() function must be one
+** of the SQLITE_SESSION_CONFIG_XXX constants defined below. The
+** interpretation of the (void*) value passed as the second parameter and
+** the effect of calling this function depends on the value of the first
+** parameter.
+**
+** <dl>
+** <dt>SQLITE_SESSION_CONFIG_STRMSIZE<dd>
+** By default, the sessions module streaming interfaces attempt to input
+** and output data in approximately 1 KiB chunks. This operand may be used
+** to set and query the value of this configuration setting. The pointer
+** passed as the second argument must point to a value of type (int).
+** If this value is greater than 0, it is used as the new streaming data
+** chunk size for both input and output. Before returning, the (int) value
+** pointed to by pArg is set to the final value of the streaming interface
+** chunk size.
+** </dl>
+**
+** This function returns SQLITE_OK if successful, or an SQLite error code
+** otherwise.
+*/
+SQLITE_API int sqlite3session_config(int op, void *pArg);
+/*
+** CAPI3REF: Values for sqlite3session_config().
+*/
+#define SQLITE_SESSION_CONFIG_STRMSIZE 1
/*
** Make sure we can call this stuff from C++.
@@ -11614,7 +12593,7 @@ struct Fts5ExtensionApi {
** This way, even if the tokenizer does not provide synonyms
** when tokenizing query text (it should not - to do would be
** inefficient), it doesn't matter if the user queries for
-** 'first + place' or '1st + place', as there are entires in the
+** 'first + place' or '1st + place', as there are entries in the
** FTS index corresponding to both forms of the first token.
** </ol>
**
@@ -11642,7 +12621,7 @@ struct Fts5ExtensionApi {
** extra data to the FTS index or require FTS5 to query for multiple terms,
** so it is efficient in terms of disk space and query speed. However, it
** does not support prefix queries very well. If, as suggested above, the
-** token "first" is subsituted for "1st" by the tokenizer, then the query:
+** token "first" is substituted for "1st" by the tokenizer, then the query:
**
** <codeblock>
** ... MATCH '1s*'</codeblock>
@@ -12491,105 +13470,119 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
#define TK_ESCAPE 58
#define TK_ID 59
#define TK_COLUMNKW 60
-#define TK_FOR 61
-#define TK_IGNORE 62
-#define TK_INITIALLY 63
-#define TK_INSTEAD 64
-#define TK_NO 65
-#define TK_KEY 66
-#define TK_OF 67
-#define TK_OFFSET 68
-#define TK_PRAGMA 69
-#define TK_RAISE 70
-#define TK_RECURSIVE 71
-#define TK_REPLACE 72
-#define TK_RESTRICT 73
-#define TK_ROW 74
-#define TK_TRIGGER 75
-#define TK_VACUUM 76
-#define TK_VIEW 77
-#define TK_VIRTUAL 78
-#define TK_WITH 79
-#define TK_REINDEX 80
-#define TK_RENAME 81
-#define TK_CTIME_KW 82
-#define TK_ANY 83
-#define TK_BITAND 84
-#define TK_BITOR 85
-#define TK_LSHIFT 86
-#define TK_RSHIFT 87
-#define TK_PLUS 88
-#define TK_MINUS 89
-#define TK_STAR 90
-#define TK_SLASH 91
-#define TK_REM 92
-#define TK_CONCAT 93
-#define TK_COLLATE 94
-#define TK_BITNOT 95
-#define TK_INDEXED 96
-#define TK_STRING 97
-#define TK_JOIN_KW 98
-#define TK_CONSTRAINT 99
-#define TK_DEFAULT 100
-#define TK_NULL 101
-#define TK_PRIMARY 102
-#define TK_UNIQUE 103
-#define TK_CHECK 104
-#define TK_REFERENCES 105
-#define TK_AUTOINCR 106
-#define TK_ON 107
-#define TK_INSERT 108
-#define TK_DELETE 109
-#define TK_UPDATE 110
-#define TK_SET 111
-#define TK_DEFERRABLE 112
-#define TK_FOREIGN 113
-#define TK_DROP 114
-#define TK_UNION 115
-#define TK_ALL 116
-#define TK_EXCEPT 117
-#define TK_INTERSECT 118
-#define TK_SELECT 119
-#define TK_VALUES 120
-#define TK_DISTINCT 121
-#define TK_DOT 122
-#define TK_FROM 123
-#define TK_JOIN 124
-#define TK_USING 125
-#define TK_ORDER 126
-#define TK_GROUP 127
-#define TK_HAVING 128
-#define TK_LIMIT 129
-#define TK_WHERE 130
-#define TK_INTO 131
-#define TK_FLOAT 132
-#define TK_BLOB 133
-#define TK_INTEGER 134
-#define TK_VARIABLE 135
-#define TK_CASE 136
-#define TK_WHEN 137
-#define TK_THEN 138
-#define TK_ELSE 139
-#define TK_INDEX 140
-#define TK_ALTER 141
-#define TK_ADD 142
-#define TK_ISNOT 143
-#define TK_FUNCTION 144
-#define TK_COLUMN 145
-#define TK_AGG_FUNCTION 146
-#define TK_AGG_COLUMN 147
-#define TK_UMINUS 148
-#define TK_UPLUS 149
-#define TK_REGISTER 150
-#define TK_VECTOR 151
-#define TK_SELECT_COLUMN 152
-#define TK_IF_NULL_ROW 153
-#define TK_ASTERISK 154
-#define TK_SPAN 155
-#define TK_END_OF_FILE 156
-#define TK_UNCLOSED_STRING 157
-#define TK_SPACE 158
-#define TK_ILLEGAL 159
+#define TK_DO 61
+#define TK_FOR 62
+#define TK_IGNORE 63
+#define TK_INITIALLY 64
+#define TK_INSTEAD 65
+#define TK_NO 66
+#define TK_KEY 67
+#define TK_OF 68
+#define TK_OFFSET 69
+#define TK_PRAGMA 70
+#define TK_RAISE 71
+#define TK_RECURSIVE 72
+#define TK_REPLACE 73
+#define TK_RESTRICT 74
+#define TK_ROW 75
+#define TK_ROWS 76
+#define TK_TRIGGER 77
+#define TK_VACUUM 78
+#define TK_VIEW 79
+#define TK_VIRTUAL 80
+#define TK_WITH 81
+#define TK_CURRENT 82
+#define TK_FOLLOWING 83
+#define TK_PARTITION 84
+#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
@@ -12710,6 +13703,13 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
#endif
/*
+** Default value for the SQLITE_CONFIG_SORTERREF_SIZE option.
+*/
+#ifndef SQLITE_DEFAULT_SORTERREF_SIZE
+# define SQLITE_DEFAULT_SORTERREF_SIZE 0x7fffffff
+#endif
+
+/*
** The compile-time options SQLITE_MMAP_READWRITE and
** SQLITE_ENABLE_BATCH_ATOMIC_WRITE are not compatible with one another.
** You must choose one or the other (or neither) but not both.
@@ -12856,7 +13856,8 @@ typedef INT16_TYPE LogEst;
# if defined(__SIZEOF_POINTER__)
# define SQLITE_PTRSIZE __SIZEOF_POINTER__
# elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \
- defined(_M_ARM) || defined(__arm__) || defined(__x86)
+ defined(_M_ARM) || defined(__arm__) || defined(__x86) || \
+ (defined(__TOS_AIX__) && !defined(__64BIT__))
# define SQLITE_PTRSIZE 4
# else
# define SQLITE_PTRSIZE 8
@@ -12897,7 +13898,7 @@ typedef INT16_TYPE LogEst;
# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
- defined(__arm__)
+ defined(__arm__) || defined(_M_ARM64)
# define SQLITE_BYTEORDER 1234
# elif defined(sparc) || defined(__ppc__)
# define SQLITE_BYTEORDER 4321
@@ -13033,9 +14034,10 @@ typedef INT16_TYPE LogEst;
*/
typedef struct BusyHandler BusyHandler;
struct BusyHandler {
- int (*xFunc)(void *,int); /* The busy callback */
- void *pArg; /* First arg to busy callback */
- int nBusy; /* Incremented with each busy call */
+ int (*xBusyHandler)(void *,int); /* The busy callback */
+ void *pBusyArg; /* First arg to busy callback */
+ int nBusy; /* Incremented with each busy call */
+ u8 bExtraFileArg; /* Include sqlite3_file as callback arg */
};
/*
@@ -13135,7 +14137,6 @@ typedef struct Db Db;
typedef struct Schema Schema;
typedef struct Expr Expr;
typedef struct ExprList ExprList;
-typedef struct ExprSpan ExprSpan;
typedef struct FKey FKey;
typedef struct FuncDestructor FuncDestructor;
typedef struct FuncDef FuncDef;
@@ -13152,13 +14153,14 @@ typedef struct NameContext NameContext;
typedef struct Parse Parse;
typedef struct PreUpdate PreUpdate;
typedef struct PrintfArguments PrintfArguments;
+typedef struct RenameToken RenameToken;
typedef struct RowSet RowSet;
typedef struct Savepoint Savepoint;
typedef struct Select Select;
typedef struct SQLiteThread SQLiteThread;
typedef struct SelectDest SelectDest;
typedef struct SrcList SrcList;
-typedef struct StrAccum StrAccum;
+typedef struct sqlite3_str StrAccum; /* Internal alias for sqlite3_str */
typedef struct Table Table;
typedef struct TableLock TableLock;
typedef struct Token Token;
@@ -13167,12 +14169,40 @@ typedef struct Trigger Trigger;
typedef struct TriggerPrg TriggerPrg;
typedef struct TriggerStep TriggerStep;
typedef struct UnpackedRecord UnpackedRecord;
+typedef struct Upsert Upsert;
typedef struct VTable VTable;
typedef struct VtabCtx VtabCtx;
typedef struct Walker Walker;
typedef struct WhereInfo WhereInfo;
+typedef struct Window Window;
typedef struct With With;
+
+/*
+** The bitmask datatype defined below is used for various optimizations.
+**
+** Changing this from a 64-bit to a 32-bit type limits the number of
+** tables in a join to 32 instead of 64. But it also reduces the size
+** of the library by 738 bytes on ix86.
+*/
+#ifdef SQLITE_BITMASK_TYPE
+ typedef SQLITE_BITMASK_TYPE Bitmask;
+#else
+ typedef u64 Bitmask;
+#endif
+
+/*
+** The number of bits in a Bitmask. "BMS" means "BitMask Size".
+*/
+#define BMS ((int)(sizeof(Bitmask)*8))
+
+/*
+** A bit in a Bitmask
+*/
+#define MASKBIT(n) (((Bitmask)1)<<(n))
+#define MASKBIT32(n) (((unsigned int)1)<<(n))
+#define ALLBITS ((Bitmask)-1)
+
/* A VList object records a mapping between parameters/variables/wildcards
** in the SQL statement (such as $abc, @pqr, or :xyz) and the integer
** variable number associated with that parameter. See the format description
@@ -13268,7 +14298,7 @@ SQLITE_PRIVATE int sqlite3BtreeGetOptimalReserve(Btree*);
SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p);
SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int);
SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *);
-SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int);
+SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int,int*);
SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster);
SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*, int);
SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*);
@@ -13449,13 +14479,28 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags);
** entry in either an index or table btree.
**
** Index btrees (used for indexes and also WITHOUT ROWID tables) contain
-** an arbitrary key and no data. These btrees have pKey,nKey set to their
-** key and pData,nData,nZero set to zero.
+** an arbitrary key and no data. These btrees have pKey,nKey set to the
+** key and the pData,nData,nZero fields are uninitialized. The aMem,nMem
+** fields give an array of Mem objects that are a decomposition of the key.
+** The nMem field might be zero, indicating that no decomposition is available.
**
** Table btrees (used for rowid tables) contain an integer rowid used as
** the key and passed in the nKey field. The pKey field is zero.
** pData,nData hold the content of the new entry. nZero extra zero bytes
** are appended to the end of the content when constructing the entry.
+** The aMem,nMem fields are uninitialized for table btrees.
+**
+** Field usage summary:
+**
+** Table BTrees Index Btrees
+**
+** pKey always NULL encoded key
+** nKey the ROWID length of pKey
+** pData data not used
+** aMem not used decomposed key value
+** nMem not used entries in aMem
+** nData length of pData not used
+** nZero extra zeros after pData not used
**
** This object is used to pass information into sqlite3BtreeInsert(). The
** same information used to be passed as five separate parameters. But placing
@@ -13466,7 +14511,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags);
struct BtreePayload {
const void *pKey; /* Key content for indexes. NULL for tables */
sqlite3_int64 nKey; /* Size of pKey for indexes. PRIMARY KEY for tabs */
- const void *pData; /* Data for tables. NULL for indexes */
+ const void *pData; /* Data for tables. */
sqlite3_value *aMem; /* First of nMem value in the unpacked pKey */
u16 nMem; /* Number of aMem[] value. Might be zero */
int nData; /* Size of pData. 0 if none. */
@@ -13476,11 +14521,17 @@ 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*);
SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int flags);
SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor*);
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor*);
+#endif
SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*);
SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt);
SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*);
@@ -13640,7 +14691,8 @@ struct VdbeOp {
u64 cycles; /* Total time spent executing this instruction */
#endif
#ifdef SQLITE_VDBE_COVERAGE
- int iSrcLine; /* Source-code line that generated this opcode */
+ u32 iSrcLine; /* Source-code line that generated this opcode
+ ** with flags in the upper 8 bits */
#endif
};
typedef struct VdbeOp VdbeOp;
@@ -13694,6 +14746,7 @@ typedef struct VdbeOpList VdbeOpList;
#define P4_INT64 (-14) /* P4 is a 64-bit signed integer */
#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */
#define P4_FUNCCTX (-16) /* P4 is a pointer to an sqlite3_context object */
+#define P4_DYNBLOB (-17) /* Pointer to memory from sqliteMalloc() */
/* Error message codes for OP_Halt */
#define P5_ConstraintNotNull 1
@@ -13740,52 +14793,52 @@ typedef struct VdbeOpList VdbeOpList;
#define OP_AutoCommit 1
#define OP_Transaction 2
#define OP_SorterNext 3 /* jump */
-#define OP_PrevIfOpen 4 /* jump */
-#define OP_NextIfOpen 5 /* jump */
-#define OP_Prev 6 /* jump */
-#define OP_Next 7 /* jump */
-#define OP_Checkpoint 8
-#define OP_JournalMode 9
-#define OP_Vacuum 10
-#define OP_VFilter 11 /* jump, synopsis: iplan=r[P3] zplan='P4' */
-#define OP_VUpdate 12 /* synopsis: data=r[P3@P2] */
-#define OP_Goto 13 /* jump */
-#define OP_Gosub 14 /* jump */
-#define OP_InitCoroutine 15 /* jump */
-#define OP_Yield 16 /* jump */
-#define OP_MustBeInt 17 /* jump */
-#define OP_Jump 18 /* jump */
+#define OP_Prev 4 /* jump */
+#define OP_Next 5 /* jump */
+#define OP_Checkpoint 6
+#define OP_JournalMode 7
+#define OP_Vacuum 8
+#define OP_VFilter 9 /* jump, synopsis: iplan=r[P3] zplan='P4' */
+#define OP_VUpdate 10 /* synopsis: data=r[P3@P2] */
+#define OP_Goto 11 /* jump */
+#define OP_Gosub 12 /* jump */
+#define OP_InitCoroutine 13 /* jump */
+#define OP_Yield 14 /* jump */
+#define OP_MustBeInt 15 /* jump */
+#define OP_Jump 16 /* jump */
+#define OP_Once 17 /* jump */
+#define OP_If 18 /* jump */
#define OP_Not 19 /* same as TK_NOT, synopsis: r[P2]= !r[P1] */
-#define OP_Once 20 /* jump */
-#define OP_If 21 /* jump */
-#define OP_IfNot 22 /* jump */
-#define OP_IfNullRow 23 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */
-#define OP_SeekLT 24 /* jump, synopsis: key=r[P3@P4] */
-#define OP_SeekLE 25 /* jump, synopsis: key=r[P3@P4] */
-#define OP_SeekGE 26 /* jump, synopsis: key=r[P3@P4] */
-#define OP_SeekGT 27 /* jump, synopsis: key=r[P3@P4] */
-#define OP_NoConflict 28 /* jump, synopsis: key=r[P3@P4] */
-#define OP_NotFound 29 /* jump, synopsis: key=r[P3@P4] */
-#define OP_Found 30 /* jump, synopsis: key=r[P3@P4] */
-#define OP_SeekRowid 31 /* jump, synopsis: intkey=r[P3] */
-#define OP_NotExists 32 /* jump, synopsis: intkey=r[P3] */
-#define OP_Last 33 /* jump */
-#define OP_IfSmaller 34 /* jump */
-#define OP_SorterSort 35 /* jump */
-#define OP_Sort 36 /* jump */
-#define OP_Rewind 37 /* jump */
-#define OP_IdxLE 38 /* jump, synopsis: key=r[P3@P4] */
-#define OP_IdxGT 39 /* jump, synopsis: key=r[P3@P4] */
-#define OP_IdxLT 40 /* jump, synopsis: key=r[P3@P4] */
-#define OP_IdxGE 41 /* jump, synopsis: key=r[P3@P4] */
-#define OP_RowSetRead 42 /* jump, synopsis: r[P3]=rowset(P1) */
+#define OP_IfNot 20 /* jump */
+#define OP_IfNullRow 21 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */
+#define OP_SeekLT 22 /* jump, synopsis: key=r[P3@P4] */
+#define OP_SeekLE 23 /* jump, synopsis: key=r[P3@P4] */
+#define OP_SeekGE 24 /* jump, synopsis: key=r[P3@P4] */
+#define OP_SeekGT 25 /* jump, synopsis: key=r[P3@P4] */
+#define OP_IfNoHope 26 /* jump, synopsis: key=r[P3@P4] */
+#define OP_NoConflict 27 /* jump, synopsis: key=r[P3@P4] */
+#define OP_NotFound 28 /* jump, synopsis: key=r[P3@P4] */
+#define OP_Found 29 /* jump, synopsis: key=r[P3@P4] */
+#define OP_SeekRowid 30 /* jump, synopsis: intkey=r[P3] */
+#define OP_NotExists 31 /* jump, synopsis: intkey=r[P3] */
+#define OP_Last 32 /* jump */
+#define OP_IfSmaller 33 /* jump */
+#define OP_SorterSort 34 /* jump */
+#define OP_Sort 35 /* jump */
+#define OP_Rewind 36 /* jump */
+#define OP_IdxLE 37 /* jump, synopsis: key=r[P3@P4] */
+#define OP_IdxGT 38 /* jump, synopsis: key=r[P3@P4] */
+#define OP_IdxLT 39 /* jump, synopsis: key=r[P3@P4] */
+#define OP_IdxGE 40 /* jump, synopsis: key=r[P3@P4] */
+#define OP_RowSetRead 41 /* jump, synopsis: r[P3]=rowset(P1) */
+#define OP_RowSetTest 42 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */
#define OP_Or 43 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */
#define OP_And 44 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */
-#define OP_RowSetTest 45 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */
-#define OP_Program 46 /* jump */
-#define OP_FkIfZero 47 /* jump, synopsis: if fkctr[P1]==0 goto P2 */
-#define OP_IfPos 48 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */
-#define OP_IfNotZero 49 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */
+#define OP_Program 45 /* jump */
+#define OP_FkIfZero 46 /* jump, synopsis: if fkctr[P1]==0 goto P2 */
+#define OP_IfPos 47 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */
+#define OP_IfNotZero 48 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */
+#define OP_DecrJumpZero 49 /* jump, synopsis: if (--r[P1])==0 goto P2 */
#define OP_IsNull 50 /* jump, same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */
#define OP_NotNull 51 /* jump, same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */
#define OP_Ne 52 /* jump, same as TK_NE, synopsis: IF r[P3]!=r[P1] */
@@ -13795,115 +14848,121 @@ typedef struct VdbeOpList VdbeOpList;
#define OP_Lt 56 /* jump, same as TK_LT, synopsis: IF r[P3]<r[P1] */
#define OP_Ge 57 /* jump, same as TK_GE, synopsis: IF r[P3]>=r[P1] */
#define OP_ElseNotEq 58 /* jump, same as TK_ESCAPE */
-#define OP_DecrJumpZero 59 /* jump, synopsis: if (--r[P1])==0 goto P2 */
-#define OP_IncrVacuum 60 /* jump */
-#define OP_VNext 61 /* jump */
-#define OP_Init 62 /* jump, synopsis: Start at P2 */
-#define OP_Return 63
-#define OP_EndCoroutine 64
-#define OP_HaltIfNull 65 /* synopsis: if r[P3]=null halt */
-#define OP_Halt 66
-#define OP_Integer 67 /* synopsis: r[P2]=P1 */
-#define OP_Int64 68 /* synopsis: r[P2]=P4 */
-#define OP_String 69 /* synopsis: r[P2]='P4' (len=P1) */
-#define OP_Null 70 /* synopsis: r[P2..P3]=NULL */
-#define OP_SoftNull 71 /* synopsis: r[P1]=NULL */
-#define OP_Blob 72 /* synopsis: r[P2]=P4 (len=P1) */
-#define OP_Variable 73 /* synopsis: r[P2]=parameter(P1,P4) */
-#define OP_Move 74 /* synopsis: r[P2@P3]=r[P1@P3] */
-#define OP_Copy 75 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */
-#define OP_SCopy 76 /* synopsis: r[P2]=r[P1] */
-#define OP_IntCopy 77 /* synopsis: r[P2]=r[P1] */
-#define OP_ResultRow 78 /* synopsis: output=r[P1@P2] */
-#define OP_CollSeq 79
-#define OP_AddImm 80 /* synopsis: r[P1]=r[P1]+P2 */
-#define OP_RealAffinity 81
-#define OP_Cast 82 /* synopsis: affinity(r[P1]) */
-#define OP_Permutation 83
-#define OP_BitAnd 84 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */
-#define OP_BitOr 85 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */
-#define OP_ShiftLeft 86 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<<r[P1] */
-#define OP_ShiftRight 87 /* same as TK_RSHIFT, synopsis: r[P3]=r[P2]>>r[P1] */
-#define OP_Add 88 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */
-#define OP_Subtract 89 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */
-#define OP_Multiply 90 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */
-#define OP_Divide 91 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */
-#define OP_Remainder 92 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */
-#define OP_Concat 93 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */
-#define OP_Compare 94 /* synopsis: r[P1@P3] <-> r[P2@P3] */
-#define OP_BitNot 95 /* same as TK_BITNOT, synopsis: r[P1]= ~r[P1] */
-#define OP_Column 96 /* synopsis: r[P3]=PX */
-#define OP_String8 97 /* same as TK_STRING, synopsis: r[P2]='P4' */
-#define OP_Affinity 98 /* synopsis: affinity(r[P1@P2]) */
-#define OP_MakeRecord 99 /* synopsis: r[P3]=mkrec(r[P1@P2]) */
-#define OP_Count 100 /* synopsis: r[P2]=count() */
-#define OP_ReadCookie 101
-#define OP_SetCookie 102
-#define OP_ReopenIdx 103 /* synopsis: root=P2 iDb=P3 */
-#define OP_OpenRead 104 /* synopsis: root=P2 iDb=P3 */
-#define OP_OpenWrite 105 /* synopsis: root=P2 iDb=P3 */
-#define OP_OpenDup 106
-#define OP_OpenAutoindex 107 /* synopsis: nColumn=P2 */
-#define OP_OpenEphemeral 108 /* synopsis: nColumn=P2 */
-#define OP_SorterOpen 109
-#define OP_SequenceTest 110 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */
-#define OP_OpenPseudo 111 /* synopsis: P3 columns in r[P2] */
-#define OP_Close 112
-#define OP_ColumnsUsed 113
-#define OP_Sequence 114 /* synopsis: r[P2]=cursor[P1].ctr++ */
-#define OP_NewRowid 115 /* synopsis: r[P2]=rowid */
-#define OP_Insert 116 /* synopsis: intkey=r[P3] data=r[P2] */
-#define OP_InsertInt 117 /* synopsis: intkey=P3 data=r[P2] */
-#define OP_Delete 118
-#define OP_ResetCount 119
-#define OP_SorterCompare 120 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */
-#define OP_SorterData 121 /* synopsis: r[P2]=data */
-#define OP_RowData 122 /* synopsis: r[P2]=data */
-#define OP_Rowid 123 /* synopsis: r[P2]=rowid */
-#define OP_NullRow 124
-#define OP_SeekEnd 125
-#define OP_SorterInsert 126 /* synopsis: key=r[P2] */
-#define OP_IdxInsert 127 /* synopsis: key=r[P2] */
-#define OP_IdxDelete 128 /* synopsis: key=r[P2@P3] */
-#define OP_DeferredSeek 129 /* synopsis: Move P3 to P1.rowid if needed */
-#define OP_IdxRowid 130 /* synopsis: r[P2]=rowid */
-#define OP_Destroy 131
-#define OP_Real 132 /* same as TK_FLOAT, synopsis: r[P2]=P4 */
-#define OP_Clear 133
-#define OP_ResetSorter 134
-#define OP_CreateBtree 135 /* synopsis: r[P2]=root iDb=P1 flags=P3 */
-#define OP_SqlExec 136
-#define OP_ParseSchema 137
-#define OP_LoadAnalysis 138
-#define OP_DropTable 139
-#define OP_DropIndex 140
-#define OP_DropTrigger 141
-#define OP_IntegrityCk 142
-#define OP_RowSetAdd 143 /* synopsis: rowset(P1)=r[P2] */
-#define OP_Param 144
-#define OP_FkCounter 145 /* synopsis: fkctr[P1]+=P2 */
-#define OP_MemMax 146 /* synopsis: r[P1]=max(r[P1],r[P2]) */
-#define OP_OffsetLimit 147 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */
-#define OP_AggStep0 148 /* synopsis: accum=r[P3] step(r[P2@P5]) */
-#define OP_AggStep 149 /* synopsis: accum=r[P3] step(r[P2@P5]) */
-#define OP_AggFinal 150 /* synopsis: accum=r[P1] N=P2 */
-#define OP_Expire 151
-#define OP_TableLock 152 /* synopsis: iDb=P1 root=P2 write=P3 */
-#define OP_VBegin 153
-#define OP_VCreate 154
-#define OP_VDestroy 155
-#define OP_VOpen 156
-#define OP_VColumn 157 /* synopsis: r[P3]=vcolumn(P2) */
-#define OP_VRename 158
-#define OP_Pagecount 159
-#define OP_MaxPgcnt 160
-#define OP_PureFunc0 161
-#define OP_Function0 162 /* synopsis: r[P3]=func(r[P2@P5]) */
-#define OP_PureFunc 163
-#define OP_Function 164 /* synopsis: r[P3]=func(r[P2@P5]) */
-#define OP_CursorHint 165
-#define OP_Noop 166
-#define OP_Explain 167
+#define OP_IncrVacuum 59 /* jump */
+#define OP_VNext 60 /* jump */
+#define OP_Init 61 /* jump, synopsis: Start at P2 */
+#define OP_PureFunc0 62
+#define OP_Function0 63 /* synopsis: r[P3]=func(r[P2@P5]) */
+#define OP_PureFunc 64
+#define OP_Function 65 /* synopsis: r[P3]=func(r[P2@P5]) */
+#define OP_Return 66
+#define OP_EndCoroutine 67
+#define OP_HaltIfNull 68 /* synopsis: if r[P3]=null halt */
+#define OP_Halt 69
+#define OP_Integer 70 /* synopsis: r[P2]=P1 */
+#define OP_Int64 71 /* synopsis: r[P2]=P4 */
+#define OP_String 72 /* synopsis: r[P2]='P4' (len=P1) */
+#define OP_Null 73 /* synopsis: r[P2..P3]=NULL */
+#define OP_SoftNull 74 /* synopsis: r[P1]=NULL */
+#define OP_Blob 75 /* synopsis: r[P2]=P4 (len=P1) */
+#define OP_Variable 76 /* synopsis: r[P2]=parameter(P1,P4) */
+#define OP_Move 77 /* synopsis: r[P2@P3]=r[P1@P3] */
+#define OP_Copy 78 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */
+#define OP_SCopy 79 /* synopsis: r[P2]=r[P1] */
+#define OP_IntCopy 80 /* synopsis: r[P2]=r[P1] */
+#define OP_ResultRow 81 /* synopsis: output=r[P1@P2] */
+#define OP_CollSeq 82
+#define OP_AddImm 83 /* synopsis: r[P1]=r[P1]+P2 */
+#define OP_RealAffinity 84
+#define OP_Cast 85 /* synopsis: affinity(r[P1]) */
+#define OP_Permutation 86
+#define OP_Compare 87 /* synopsis: r[P1@P3] <-> r[P2@P3] */
+#define OP_IsTrue 88 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */
+#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_ShiftRight 95 /* same as TK_RSHIFT, 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_OpenDup 111
+#define OP_OpenAutoindex 112 /* synopsis: nColumn=P2 */
+#define OP_OpenEphemeral 113 /* synopsis: nColumn=P2 */
+#define OP_SorterOpen 114
+#define OP_SequenceTest 115 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */
+#define OP_OpenPseudo 116 /* synopsis: P3 columns in r[P2] */
+#define OP_Close 117
+#define OP_ColumnsUsed 118
+#define OP_SeekHit 119 /* synopsis: seekHit=P2 */
+#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
/* Properties such as "out2" or "jump" that are specified in
** comments following the "case" for each opcode in the vdbe.c
@@ -13916,28 +14975,28 @@ typedef struct VdbeOpList VdbeOpList;
#define OPFLG_OUT2 0x10 /* out2: P2 is an output */
#define OPFLG_OUT3 0x20 /* out3: P3 is an output */
#define OPFLG_INITIALIZER {\
-/* 0 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01,\
-/* 8 */ 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,\
-/* 16 */ 0x03, 0x03, 0x01, 0x12, 0x01, 0x03, 0x03, 0x01,\
+/* 0 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x10,\
+/* 8 */ 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03,\
+/* 16 */ 0x01, 0x01, 0x03, 0x12, 0x03, 0x01, 0x09, 0x09,\
/* 24 */ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,\
-/* 32 */ 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\
-/* 40 */ 0x01, 0x01, 0x23, 0x26, 0x26, 0x0b, 0x01, 0x01,\
+/* 32 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\
+/* 40 */ 0x01, 0x23, 0x0b, 0x26, 0x26, 0x01, 0x01, 0x03,\
/* 48 */ 0x03, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\
-/* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x01, 0x01, 0x01, 0x02,\
-/* 64 */ 0x02, 0x08, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00,\
-/* 72 */ 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\
-/* 80 */ 0x02, 0x02, 0x02, 0x00, 0x26, 0x26, 0x26, 0x26,\
-/* 88 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x00, 0x12,\
-/* 96 */ 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\
-/* 104 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
-/* 112 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,\
-/* 120 */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x04,\
-/* 128 */ 0x00, 0x00, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10,\
-/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,\
-/* 144 */ 0x10, 0x00, 0x04, 0x1a, 0x00, 0x00, 0x00, 0x00,\
-/* 152 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\
-/* 160 */ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
-}
+/* 56 */ 0x0b, 0x0b, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,\
+/* 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,\
+/* 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,}
/* The sqlite3P2Values() routine is able to run faster if it knows
** the value of the largest JUMP opcode. The smaller the maximum
@@ -13945,7 +15004,7 @@ typedef struct VdbeOpList VdbeOpList;
** generated this include file strives to group all JUMP opcodes
** together near the beginning of the list.
*/
-#define SQLITE_MX_JUMP_OPCODE 62 /* Maximum JUMP opcode */
+#define SQLITE_MX_JUMP_OPCODE 61 /* Maximum JUMP opcode */
/************** End of opcodes.h *********************************************/
/************** Continuing where we left off in vdbe.h ***********************/
@@ -13979,7 +15038,24 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p);
# define sqlite3VdbeVerifyNoMallocRequired(A,B)
# define sqlite3VdbeVerifyNoResultRow(A)
#endif
-SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp, int iLineno);
+#if defined(SQLITE_DEBUG)
+SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int);
+#else
+# define sqlite3VdbeVerifyAbortable(A,B)
+#endif
+SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno);
+#ifndef SQLITE_OMIT_EXPLAIN
+SQLITE_PRIVATE void sqlite3VdbeExplain(Parse*,u8,const char*,...);
+SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse*);
+SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse*);
+# define ExplainQueryPlan(P) sqlite3VdbeExplain P
+# define ExplainQueryPlanPop(P) sqlite3VdbeExplainPop(P)
+# define ExplainQueryPlanParent(P) sqlite3VdbeExplainParent(P)
+#else
+# define ExplainQueryPlan(P)
+# define ExplainQueryPlanPop(P)
+# define ExplainQueryPlanParent(P) 0
+#endif
SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*);
SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8);
SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1);
@@ -14023,6 +15099,7 @@ SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int);
SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*);
#endif
SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*);
+SQLITE_PRIVATE int sqlite3BlobCompare(const Mem*, const Mem*);
SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*);
SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*);
@@ -14078,23 +15155,52 @@ SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...);
**
** VdbeCoverageNeverTaken(v) // Previous branch is never taken
**
+** VdbeCoverageNeverNull(v) // Previous three-way branch is only
+** // taken on the first two ways. The
+** // NULL option is not possible
+**
+** VdbeCoverageEqNe(v) // Previous OP_Jump is only interested
+** // in distingishing equal and not-equal.
+**
** Every VDBE branch operation must be tagged with one of the macros above.
** If not, then when "make test" is run with -DSQLITE_VDBE_COVERAGE and
** -DSQLITE_DEBUG then an ALWAYS() will fail in the vdbeTakeBranch()
** routine in vdbe.c, alerting the developer to the missed tag.
+**
+** During testing, the test application will invoke
+** sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE,...) to set a callback
+** routine that is invoked as each bytecode branch is taken. The callback
+** contains the sqlite3.c source line number ov the VdbeCoverage macro and
+** flags to indicate whether or not the branch was taken. The test application
+** is responsible for keeping track of this and reporting byte-code branches
+** that are never taken.
+**
+** See the VdbeBranchTaken() macro and vdbeTakeBranch() function in the
+** vdbe.c source file for additional information.
*/
#ifdef SQLITE_VDBE_COVERAGE
SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe*,int);
# define VdbeCoverage(v) sqlite3VdbeSetLineNumber(v,__LINE__)
# define VdbeCoverageIf(v,x) if(x)sqlite3VdbeSetLineNumber(v,__LINE__)
-# define VdbeCoverageAlwaysTaken(v) sqlite3VdbeSetLineNumber(v,2);
-# define VdbeCoverageNeverTaken(v) sqlite3VdbeSetLineNumber(v,1);
+# define VdbeCoverageAlwaysTaken(v) \
+ sqlite3VdbeSetLineNumber(v,__LINE__|0x5000000);
+# define VdbeCoverageNeverTaken(v) \
+ sqlite3VdbeSetLineNumber(v,__LINE__|0x6000000);
+# define VdbeCoverageNeverNull(v) \
+ sqlite3VdbeSetLineNumber(v,__LINE__|0x4000000);
+# define VdbeCoverageNeverNullIf(v,x) \
+ if(x)sqlite3VdbeSetLineNumber(v,__LINE__|0x4000000);
+# define VdbeCoverageEqNe(v) \
+ sqlite3VdbeSetLineNumber(v,__LINE__|0x8000000);
# define VDBE_OFFSET_LINENO(x) (__LINE__+x)
#else
# define VdbeCoverage(v)
# define VdbeCoverageIf(v,x)
# define VdbeCoverageAlwaysTaken(v)
# define VdbeCoverageNeverTaken(v)
+# define VdbeCoverageNeverNull(v)
+# define VdbeCoverageNeverNullIf(v,x)
+# define VdbeCoverageEqNe(v)
# define VDBE_OFFSET_LINENO(x) 0
#endif
@@ -14104,6 +15210,10 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus(Vdbe*, int, int, int, LogEst, const ch
# define sqlite3VdbeScanStatus(a,b,c,d,e)
#endif
+#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
+SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, VdbeOp*);
+#endif
+
#endif /* SQLITE_VDBE_H */
/************** End of vdbe.h ************************************************/
@@ -14238,7 +15348,7 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3*);
SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*);
/* Functions used to configure a Pager object. */
-SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *);
+SQLITE_PRIVATE void sqlite3PagerSetBusyHandler(Pager*, int(*)(void *), void *);
SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int);
#ifdef SQLITE_HAS_CODEC
SQLITE_PRIVATE void sqlite3PagerAlignReserve(Pager*,Pager*);
@@ -14291,16 +15401,17 @@ SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager);
SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager);
SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen);
SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3*);
-# ifdef SQLITE_DIRECT_OVERFLOW_READ
-SQLITE_PRIVATE int sqlite3PagerUseWal(Pager *pPager, Pgno);
-# endif
# ifdef SQLITE_ENABLE_SNAPSHOT
SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot);
SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot);
SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager);
+SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot);
+SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager);
# endif
-#else
-# define sqlite3PagerUseWal(x,y) 0
+#endif
+
+#ifdef SQLITE_DIRECT_OVERFLOW_READ
+SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno);
#endif
#ifdef SQLITE_ENABLE_ZIPVFS
@@ -14324,6 +15435,11 @@ SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*);
SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *);
SQLITE_PRIVATE void sqlite3PagerClearCache(Pager*);
SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *);
+#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+SQLITE_PRIVATE void sqlite3PagerResetLockTimeout(Pager *pPager);
+#else
+# define sqlite3PagerResetLockTimeout(X)
+#endif
/* Functions used to truncate the database file. */
SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno);
@@ -14540,6 +15656,10 @@ SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void);
/* Number of dirty pages as a percentage of the configured cache size */
SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache*);
+#ifdef SQLITE_DIRECT_OVERFLOW_READ
+SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache);
+#endif
+
#endif /* _PCACHE_H_ */
/************** End of pcache.h **********************************************/
@@ -15045,12 +16165,14 @@ struct LookasideSlot {
** functions use a regular table table from hash.h.)
**
** Hash each FuncDef structure into one of the FuncDefHash.a[] slots.
-** Collisions are on the FuncDef.u.pHash chain.
+** Collisions are on the FuncDef.u.pHash chain. Use the SQLITE_FUNC_HASH()
+** macro to compute a hash on the function name.
*/
#define SQLITE_FUNC_HASH_SZ 23
struct FuncDefHash {
FuncDef *a[SQLITE_FUNC_HASH_SZ]; /* Hash table for functions */
};
+#define SQLITE_FUNC_HASH(C,L) (((C)+(L))%SQLITE_FUNC_HASH_SZ)
#ifdef SQLITE_USER_AUTHENTICATION
/*
@@ -15111,7 +16233,7 @@ struct sqlite3 {
Db *aDb; /* All backends */
int nDb; /* Number of backends currently in use */
u32 mDbFlags; /* flags recording internal state */
- u32 flags; /* flags settable by pragmas. See below */
+ u64 flags; /* flags settable by pragmas. See below */
i64 lastRowid; /* ROWID of most recent insert (see above) */
i64 szMmap; /* Default mmap_size setting */
u32 nSchemaLock; /* Do not reset the schema when non-zero */
@@ -15131,7 +16253,7 @@ struct sqlite3 {
u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */
u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */
u8 mTrace; /* zero or more SQLITE_TRACE flags */
- u8 skipBtreeMutex; /* True if no shared-cache backends */
+ u8 noSharedCache; /* True if no shared-cache backends */
u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */
int nextPagesize; /* Pagesize after VACUUM if >0 */
u32 magic; /* Magic number for detect library misuse */
@@ -15143,8 +16265,9 @@ struct sqlite3 {
int newTnum; /* Rootpage of table being initialized */
u8 iDb; /* Which db file is being initialized */
u8 busy; /* TRUE if currently initializing */
- u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */
- u8 imposterTable; /* Building an imposter table */
+ unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */
+ unsigned imposterTable : 1; /* Building an imposter table */
+ unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */
} init;
int nVdbeActive; /* Number of VDBEs currently running */
int nVdbeRead; /* Number of active VDBEs that read or write */
@@ -15197,7 +16320,7 @@ struct sqlite3 {
Hash aModule; /* populated by sqlite3_create_module() */
VtabCtx *pVtabCtx; /* Context for active vtab connect/create */
VTable **aVTrans; /* Virtual tables with open transactions */
- VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */
+ VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */
#endif
Hash aFunc; /* Hash table of connection functions */
Hash aCollSeq; /* All collating sequences */
@@ -15272,14 +16395,21 @@ struct sqlite3 {
#define SQLITE_QueryOnly 0x00100000 /* Disable database changes */
#define SQLITE_CellSizeCk 0x00200000 /* Check btree cell sizes on load */
#define SQLITE_Fts3Tokenizer 0x00400000 /* Enable fts3_tokenizer(2) */
-#define SQLITE_EnableQPSG 0x00800000 /* Query Planner Stability Guarantee */
+#define SQLITE_EnableQPSG 0x00800000 /* Query Planner Stability Guarantee*/
+#define SQLITE_TriggerEQP 0x01000000 /* Show trigger EXPLAIN QUERY PLAN */
+#define SQLITE_ResetDatabase 0x02000000 /* Reset the database */
+#define SQLITE_LegacyAlter 0x04000000 /* Legacy ALTER TABLE behaviour */
+#define SQLITE_NoSchemaError 0x08000000 /* Do not report schema parse errors*/
+#define SQLITE_Defensive 0x10000000 /* Input SQL is likely hostile */
+
/* Flags used only if debugging */
+#define HI(X) ((u64)(X)<<32)
#ifdef SQLITE_DEBUG
-#define SQLITE_SqlTrace 0x08000000 /* Debug print SQL as it executes */
-#define SQLITE_VdbeListing 0x10000000 /* Debug listings of VDBE programs */
-#define SQLITE_VdbeTrace 0x20000000 /* True to trace VDBE execution */
-#define SQLITE_VdbeAddopTrace 0x40000000 /* Trace sqlite3VdbeAddOp() calls */
-#define SQLITE_VdbeEQP 0x80000000 /* Debug EXPLAIN QUERY PLAN */
+#define SQLITE_SqlTrace HI(0x0001) /* Debug print SQL as it executes */
+#define SQLITE_VdbeListing HI(0x0002) /* Debug listings of VDBE progs */
+#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 */
#endif
/*
@@ -15288,6 +16418,7 @@ 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 */
/*
** Bits of the sqlite3.dbOptFlags field that are used by the
@@ -15295,7 +16426,7 @@ struct sqlite3 {
** selectively disable various optimizations.
*/
#define SQLITE_QueryFlattener 0x0001 /* Query flattening */
-#define SQLITE_ColumnCache 0x0002 /* Column cache */
+ /* 0x0002 available for reuse */
#define SQLITE_GroupByOrder 0x0004 /* GROUPBY cover of ORDERBY */
#define SQLITE_FactorOutConst 0x0008 /* Constant factoring */
#define SQLITE_DistinctOpt 0x0010 /* DISTINCT using indexes */
@@ -15307,6 +16438,10 @@ struct sqlite3 {
#define SQLITE_CursorHints 0x0400 /* Add OP_CursorHint opcodes */
#define SQLITE_Stat34 0x0800 /* Use STAT3 or STAT4 data */
/* TH3 expects the Stat34 ^^^^^^ value to be 0x0800. Don't change it */
+#define SQLITE_PushDown 0x1000 /* The push-down optimization */
+#define SQLITE_SimplifyJoin 0x2000 /* Convert LEFT JOIN to JOIN */
+#define SQLITE_SkipScan 0x4000 /* Skip-scans */
+#define SQLITE_PropagateConst 0x8000 /* The constant propagation opt */
#define SQLITE_AllOpts 0xffff /* All optimizations */
/*
@@ -15345,11 +16480,13 @@ struct sqlite3 {
*/
struct FuncDef {
i8 nArg; /* Number of arguments. -1 means unlimited */
- u16 funcFlags; /* Some combination of SQLITE_FUNC_* */
+ u32 funcFlags; /* Some combination of SQLITE_FUNC_* */
void *pUserData; /* User data parameter */
FuncDef *pNext; /* Next function with same name */
void (*xSFunc)(sqlite3_context*,int,sqlite3_value**); /* func or agg-step */
void (*xFinalize)(sqlite3_context*); /* Agg finalizer */
+ void (*xValue)(sqlite3_context*); /* Current agg value */
+ void (*xInverse)(sqlite3_context*,int,sqlite3_value**); /* inverse agg-step */
const char *zName; /* SQL name of the function. */
union {
FuncDef *pHash; /* Next with a different name but the same hash */
@@ -15405,6 +16542,10 @@ struct FuncDestructor {
#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a
** single query - might change over time */
#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 */
/*
** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
@@ -15439,6 +16580,12 @@ struct FuncDestructor {
** are interpreted in the same way as the first 4 parameters to
** FUNCTION().
**
+** WFUNCTION(zName, nArg, iArg, xStep, xFinal, xValue, xInverse)
+** Used to create an aggregate function definition implemented by
+** the C functions xStep and xFinal. The first four parameters
+** are interpreted in the same way as the first 4 parameters to
+** FUNCTION().
+**
** LIKEFUNC(zName, nArg, pArg, flags)
** Used to create a scalar function definition of a function zName
** that accepts nArg arguments and is implemented by a call to C
@@ -15449,31 +16596,38 @@ struct FuncDestructor {
*/
#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \
{nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
- SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} }
+ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
#define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \
{nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
- SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} }
+ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
#define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \
- 0, 0, xFunc, 0, #zName, {0} }
+ 0, 0, xFunc, 0, 0, 0, #zName, {0} }
#define PURE_DATE(zName, nArg, iArg, bNC, xFunc) \
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \
- (void*)&sqlite3Config, 0, xFunc, 0, #zName, {0} }
+ (void*)&sqlite3Config, 0, xFunc, 0, 0, 0, #zName, {0} }
#define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \
{nArg,SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\
- SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} }
+ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
- pArg, 0, xFunc, 0, #zName, }
+ pArg, 0, xFunc, 0, 0, 0, #zName, }
#define LIKEFUNC(zName, nArg, arg, flags) \
{nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \
- (void *)arg, 0, likeFunc, 0, #zName, {0} }
-#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \
+ (void *)arg, 0, likeFunc, 0, 0, 0, #zName, {0} }
+#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue) \
{nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL), \
- SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,#zName, {0}}
+ SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xValue,0,#zName, {0}}
#define AGGREGATE2(zName, nArg, arg, nc, xStep, xFinal, extraFlags) \
{nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|extraFlags, \
- SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,#zName, {0}}
+ SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xFinal,0,#zName, {0}}
+#define WAGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue, xInverse, f) \
+ {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \
+ SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xValue,xInverse,#zName, {0}}
+#define INTERNAL_FUNCTION(zName, nArg, xFunc) \
+ {nArg, SQLITE_FUNC_INTERNAL|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \
+ 0, 0, xFunc, 0, 0, 0, #zName, {0} }
+
/*
** All current savepoints are stored in a linked list starting at
@@ -15529,6 +16683,8 @@ struct Column {
#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */
#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */
#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */
+#define COLFLAG_UNIQUE 0x0008 /* Column def contains "UNIQUE" or "PK" */
+#define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */
/*
** A "Collating Sequence" is defined by an instance of the following
@@ -15656,6 +16812,9 @@ 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 */
@@ -15706,6 +16865,7 @@ struct Table {
#define TF_StatsUsed 0x0100 /* Query planner decisions affected by
** Index.aiRowLogEst[] values */
#define TF_HasNotNull 0x0200 /* Contains NOT NULL constraints */
+#define TF_Shadow 0x0400 /* True for a shadow table */
/*
** Test to see whether or not a table is a virtual table. This is
@@ -15816,13 +16976,12 @@ struct FKey {
#define OE_Fail 3 /* Stop the operation but leave all prior changes */
#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */
#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */
-
-#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */
-#define OE_SetNull 7 /* Set the foreign key value to NULL */
-#define OE_SetDflt 8 /* Set the foreign key value to its default */
-#define OE_Cascade 9 /* Cascade the changes */
-
-#define OE_Default 10 /* Do whatever the default action is */
+#define OE_Update 6 /* Process as a DO UPDATE in an upsert */
+#define OE_Restrict 7 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */
+#define OE_SetNull 8 /* Set the foreign key value to NULL */
+#define OE_SetDflt 9 /* Set the foreign key value to its default */
+#define OE_Cascade 10 /* Cascade the changes */
+#define OE_Default 11 /* Do whatever the default action is */
/*
@@ -15949,6 +17108,7 @@ struct Index {
unsigned isCovering:1; /* True if this is a covering index */
unsigned noSkipScan:1; /* Do not try to use skip-scan if true */
unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */
+ unsigned bNoQuery:1; /* Do not use this index to optimize queries */
#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
int nSample; /* Number of elements in aSample[] */
int nSampleCol; /* Size of IndexSample.anEq[] and so on */
@@ -15957,6 +17117,7 @@ struct Index {
tRowcnt *aiRowEst; /* Non-logarithmic stat1 data for this index */
tRowcnt nRowEst0; /* Non-logarithmic number of rows in the index */
#endif
+ Bitmask colNotIdxed; /* 0 for unindexed columns in pTab */
};
/*
@@ -15992,12 +17153,20 @@ struct IndexSample {
};
/*
+** Possible values to use within the flags argument to sqlite3GetToken().
+*/
+#define SQLITE_TOKEN_QUOTED 0x1 /* Token is a quoted identifier. */
+#define SQLITE_TOKEN_KEYWORD 0x2 /* Token is a keyword. */
+
+/*
** Each token coming out of the lexer is an instance of
** this structure. Tokens are also used as part of an expression.
**
-** Note if Token.z==0 then Token.dyn and Token.n are undefined and
-** may contain random values. Do not make any assumptions about Token.dyn
-** and Token.n when Token.z==0.
+** The memory that "z" points to is owned by other objects. Take care
+** that the owner of the "z" string does not deallocate the string before
+** the Token goes out of scope! Very often, the "z" points to some place
+** in the middle of the Parse.zSql text. But it might also point to a
+** static string.
*/
struct Token {
const char *z; /* Text of the token. Not NULL-terminated! */
@@ -16170,8 +17339,11 @@ struct Expr {
** TK_COLUMN: the value of p5 for OP_Column
** TK_AGG_FUNCTION: nesting depth */
AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */
- Table *pTab; /* Table for TK_COLUMN expressions. Can be NULL
- ** for a column of an index on an expression */
+ union {
+ 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 */
+ } y;
};
/*
@@ -16179,8 +17351,8 @@ struct Expr {
*/
#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */
#define EP_Agg 0x000002 /* Contains one or more aggregate functions */
- /* 0x000004 // available for use */
- /* 0x000008 // available for use */
+#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_VarSelect 0x000020 /* pSelect is correlated, not constant */
#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */
@@ -16201,11 +17373,13 @@ struct Expr {
#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */
#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 */
/*
-** Combinations of two or more EP_* flags
+** The EP_Propagate mask is a set of properties that automatically propagate
+** upwards into parent nodes.
*/
-#define EP_Propagate (EP_Collate|EP_Subquery) /* Propagate these bits up tree */
+#define EP_Propagate (EP_Collate|EP_Subquery|EP_HasFunc)
/*
** These macros can be used to test, set, or clear bits in the
@@ -16267,6 +17441,7 @@ struct ExprList {
unsigned done :1; /* A flag to indicate when processing is finished */
unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */
unsigned reusable :1; /* Constant expression is reusable */
+ unsigned bSorterRef :1; /* Defer evaluation until after sorting */
union {
struct {
u16 iOrderByCol; /* For ORDER BY, column number in result set */
@@ -16278,17 +17453,6 @@ struct ExprList {
};
/*
-** An instance of this structure is used by the parser to record both
-** the parse tree for an expression and the span of input text for an
-** expression.
-*/
-struct ExprSpan {
- Expr *pExpr; /* The expression parse tree */
- const char *zStart; /* First character of input text */
- const char *zEnd; /* One character past the end of input text */
-};
-
-/*
** An instance of this structure can hold a simple list of identifiers,
** such as the list "a,b,c" in the following statements:
**
@@ -16312,31 +17476,6 @@ struct IdList {
};
/*
-** The bitmask datatype defined below is used for various optimizations.
-**
-** Changing this from a 64-bit to a 32-bit type limits the number of
-** tables in a join to 32 instead of 64. But it also reduces the size
-** of the library by 738 bytes on ix86.
-*/
-#ifdef SQLITE_BITMASK_TYPE
- typedef SQLITE_BITMASK_TYPE Bitmask;
-#else
- typedef u64 Bitmask;
-#endif
-
-/*
-** The number of bits in a Bitmask. "BMS" means "BitMask Size".
-*/
-#define BMS ((int)(sizeof(Bitmask)*8))
-
-/*
-** A bit in a Bitmask
-*/
-#define MASKBIT(n) (((Bitmask)1)<<(n))
-#define MASKBIT32(n) (((unsigned int)1)<<(n))
-#define ALLBITS ((Bitmask)-1)
-
-/*
** The following structure describes the FROM clause of a SELECT statement.
** Each table or subquery in the FROM clause is a separate element of
** the SrcList.a[] array.
@@ -16377,9 +17516,6 @@ struct SrcList {
unsigned viaCoroutine :1; /* Implemented as a co-routine */
unsigned isRecursive :1; /* True for recursive reference in WITH */
} fg;
-#ifndef SQLITE_OMIT_EXPLAIN
- u8 iSelectId; /* If pSelect!=0, the id of the sub-select in EQP */
-#endif
int iCursor; /* The VDBE cursor number used to access this table */
Expr *pOn; /* The ON clause of a join */
IdList *pUsing; /* The USING clause of a join */
@@ -16461,12 +17597,16 @@ struct SrcList {
struct NameContext {
Parse *pParse; /* The parser */
SrcList *pSrcList; /* One or more tables used to resolve names */
- ExprList *pEList; /* Optional list of result-set columns */
- AggInfo *pAggInfo; /* Information about aggregates at this level */
+ union {
+ ExprList *pEList; /* Optional list of result-set columns */
+ AggInfo *pAggInfo; /* Information about aggregates at this level */
+ Upsert *pUpsert; /* ON CONFLICT clause information from an upsert */
+ } uNC;
NameContext *pNext; /* Next outer name context. NULL for outermost */
int nRef; /* Number of names resolved by this context */
int nErr; /* Number of errors encountered while resolving names */
u16 ncFlags; /* Zero or more NC_* flags defined below */
+ Select *pWinSelect; /* SELECT statement for any window functions */
};
/*
@@ -16484,17 +17624,49 @@ struct NameContext {
#define NC_HasAgg 0x0010 /* One or more aggregate functions seen */
#define NC_IdxExpr 0x0020 /* True if resolving columns of CREATE INDEX */
#define NC_VarSelect 0x0040 /* A correlated subquery has been seen */
+#define NC_UEList 0x0080 /* True if uNC.pEList is used */
+#define NC_UAggInfo 0x0100 /* True if uNC.pAggInfo is used */
+#define NC_UUpsert 0x0200 /* True if uNC.pUpsert is used */
#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 */
+
+/*
+** An instance of the following object describes a single ON CONFLICT
+** clause in an upsert.
+**
+** The pUpsertTarget field is only set if the ON CONFLICT clause includes
+** conflict-target clause. (In "ON CONFLICT(a,b)" the "(a,b)" is the
+** conflict-target clause.) The pUpsertTargetWhere is the optional
+** WHERE clause used to identify partial unique indexes.
+**
+** pUpsertSet is the list of column=expr terms of the UPDATE statement.
+** The pUpsertSet field is NULL for a ON CONFLICT DO NOTHING. The
+** pUpsertWhere is the WHERE clause for the UPDATE and is NULL if the
+** WHERE clause is omitted.
+*/
+struct Upsert {
+ ExprList *pUpsertTarget; /* Optional description of conflicting index */
+ Expr *pUpsertTargetWhere; /* WHERE clause for partial index targets */
+ ExprList *pUpsertSet; /* The SET clause from an ON CONFLICT UPDATE */
+ Expr *pUpsertWhere; /* WHERE clause for the ON CONFLICT UPDATE */
+ /* The fields above comprise the parse tree for the upsert clause.
+ ** The fields below are used to transfer information from the INSERT
+ ** processing down into the UPDATE processing while generating code.
+ ** Upsert owns the memory allocated above, but not the memory below. */
+ Index *pUpsertIdx; /* Constraint that pUpsertTarget identifies */
+ SrcList *pUpsertSrc; /* Table to be updated */
+ int regData; /* First register holding array of VALUES */
+ int iDataCur; /* Index of the data cursor */
+ int iIdxCur; /* Index of the first index cursor */
+};
/*
** An instance of the following structure contains all information
** needed to generate code for a single SELECT statement.
**
-** nLimit is set to -1 if there is no LIMIT clause. nOffset is set to 0.
-** If there is a LIMIT clause, the parser sets nLimit to the value of the
-** limit and nOffset to the value of the offset (or 0 if there is not
-** offset). But later on, nLimit and nOffset become the memory locations
-** in the VDBE that record the limit and offset counters.
+** See the header comment on the computeLimitRegisters() routine for a
+** detailed description of the meaning of the iLimit and iOffset fields.
**
** addrOpenEphm[] entries contain the address of OP_OpenEphemeral opcodes.
** These addresses must be stored so that we can go back and fill in
@@ -16512,9 +17684,7 @@ struct Select {
LogEst nSelectRow; /* Estimated number of result rows */
u32 selFlags; /* Various SF_* values */
int iLimit, iOffset; /* Memory registers holding LIMIT & OFFSET counters */
-#if SELECTTRACE_ENABLED
- char zSelName[12]; /* Symbolic name of this SELECT use for debugging */
-#endif
+ u32 selId; /* Unique identifier number for this SELECT */
int addrOpenEphm[2]; /* OP_OpenEphem opcodes related to this select */
SrcList *pSrc; /* The FROM clause */
Expr *pWhere; /* The WHERE clause */
@@ -16524,8 +17694,11 @@ struct Select {
Select *pPrior; /* Prior select in a compound select statement */
Select *pNext; /* Next select to the left in a compound */
Expr *pLimit; /* LIMIT expression. NULL means not used. */
- Expr *pOffset; /* OFFSET expression. NULL means not used. */
With *pWith; /* WITH clause attached to this select. Or NULL. */
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ Window *pWin; /* List of window functions */
+ Window *pWinDefn; /* List of named window definitions */
+#endif
};
/*
@@ -16555,7 +17728,7 @@ struct Select {
#define SF_MaybeConvert 0x08000 /* Need convertCompoundSelectToSubquery() */
#define SF_Converted 0x10000 /* By convertCompoundSelectToSubquery() */
#define SF_IncludeHidden 0x20000 /* Include hidden columns in output */
-
+#define SF_ComplexResult 0x40000 /* Result contains subquery or function */
/*
** The results of a SELECT can be distributed in several ways, as defined
@@ -16670,13 +17843,6 @@ struct AutoincInfo {
};
/*
-** Size of the column cache
-*/
-#ifndef SQLITE_N_COLCACHE
-# define SQLITE_N_COLCACHE 10
-#endif
-
-/*
** At least one instance of the following structure is created for each
** trigger that may be fired while parsing an INSERT, UPDATE or DELETE
** statement. All such objects are stored in the linked list headed at
@@ -16751,7 +17917,6 @@ 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 nColCache; /* Number of entries in aColCache[] */
int nRangeReg; /* Size of the temporary register block */
int iRangeReg; /* First register in temporary register block */
int nErr; /* Number of errors seen */
@@ -16759,10 +17924,8 @@ struct Parse {
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 for associated with an index on expr, or negative
+ int iSelfTab; /* Table associated with an index on expr, or negative
** of the base register during check-constraint eval */
- int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */
- int iCacheCnt; /* Counter used to generate aColCache[].lru values */
int nLabel; /* Number of labels used */
int *aLabel; /* Space to hold the labels */
ExprList *pConstExpr;/* Constant expressions */
@@ -16772,10 +17935,7 @@ struct Parse {
int regRowid; /* Register holding rowid of CREATE TABLE entry */
int regRoot; /* Register holding root page number for new objects */
int nMaxArg; /* Max args passed to user function by sub-program */
-#if SELECTTRACE_ENABLED
- int nSelect; /* Number of SELECT statements seen */
- int nSelectIndent; /* How far to indent SELECTTRACE() output */
-#endif
+ int nSelect; /* Number of SELECT stmts. Counter for Select.selId */
#ifndef SQLITE_OMIT_SHARED_CACHE
int nTableLock; /* Number of locks in aTableLock */
TableLock *aTableLock; /* Required table locks for shared-cache mode */
@@ -16795,17 +17955,9 @@ struct Parse {
** Fields above must be initialized to zero. The fields that follow,
** down to the beginning of the recursive section, do not need to be
** initialized as they will be set before being used. The boundary is
- ** determined by offsetof(Parse,aColCache).
+ ** determined by offsetof(Parse,aTempReg).
**************************************************************************/
- struct yColCache {
- int iTable; /* Table cursor number */
- i16 iColumn; /* Table column number */
- u8 tempReg; /* iReg is a temp register that needs to be freed */
- int iLevel; /* Nesting level */
- int iReg; /* Reg with value of this column. 0 means none. */
- int lru; /* Least recently used entry has the smallest value */
- } aColCache[SQLITE_N_COLCACHE]; /* One for each column cache entry */
int aTempReg[8]; /* Holding area for temporary registers */
Token sNameToken; /* Token with unqualified schema object name */
@@ -16820,19 +17972,21 @@ struct Parse {
ynVar nVar; /* Number of '?' variables seen in the SQL so far */
u8 iPkSortOrder; /* ASC or DESC for INTEGER PRIMARY KEY */
u8 explain; /* True if the EXPLAIN flag is found on the query */
+#if !(defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_OMIT_ALTERTABLE))
+ u8 eParseMode; /* PARSE_MODE_XXX constant */
+#endif
#ifndef SQLITE_OMIT_VIRTUALTABLE
- u8 declareVtab; /* True if inside sqlite3_declare_vtab() */
int nVtabLock; /* Number of virtual tables to lock */
#endif
int nHeight; /* Expression tree height of current sub-select */
#ifndef SQLITE_OMIT_EXPLAIN
- int iSelectId; /* ID of current select for EXPLAIN output */
- int iNextSelectId; /* Next available select ID for EXPLAIN output */
+ int addrExplain; /* Address of current OP_Explain opcode */
#endif
VList *pVList; /* Mapping between variable names and numbers */
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 */
Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */
const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */
#ifndef SQLITE_OMIT_VIRTUALTABLE
@@ -16843,12 +17997,20 @@ struct Parse {
TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */
With *pWith; /* Current WITH clause, or NULL */
With *pWithToFree; /* Free this WITH object at the end of the parse */
+#ifndef SQLITE_OMIT_ALTERTABLE
+ RenameToken *pRename; /* Tokens subject to renaming by ALTER TABLE */
+#endif
};
+#define PARSE_MODE_NORMAL 0
+#define PARSE_MODE_DECLARE_VTAB 1
+#define PARSE_MODE_RENAME_COLUMN 2
+#define PARSE_MODE_RENAME_TABLE 3
+
/*
** Sizes and pointers of various parts of the Parse object.
*/
-#define PARSE_HDR_SZ offsetof(Parse,aColCache) /* Recursive part w/o aColCache*/
+#define PARSE_HDR_SZ offsetof(Parse,aTempReg) /* Recursive part w/o aColCache*/
#define PARSE_RECURSE_SZ offsetof(Parse,sLastToken) /* Recursive part */
#define PARSE_TAIL_SZ (sizeof(Parse)-PARSE_RECURSE_SZ) /* Non-recursive part */
#define PARSE_TAIL(X) (((char*)(X))+PARSE_RECURSE_SZ) /* Pointer to tail */
@@ -16859,7 +18021,19 @@ struct Parse {
#ifdef SQLITE_OMIT_VIRTUALTABLE
#define IN_DECLARE_VTAB 0
#else
- #define IN_DECLARE_VTAB (pParse->declareVtab)
+ #define IN_DECLARE_VTAB (pParse->eParseMode==PARSE_MODE_DECLARE_VTAB)
+#endif
+
+#if defined(SQLITE_OMIT_ALTERTABLE)
+ #define IN_RENAME_OBJECT 0
+#else
+ #define IN_RENAME_OBJECT (pParse->eParseMode>=PARSE_MODE_RENAME_COLUMN)
+#endif
+
+#if defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_OMIT_ALTERTABLE)
+ #define IN_SPECIAL_PARSE 0
+#else
+ #define IN_SPECIAL_PARSE (pParse->eParseMode!=PARSE_MODE_NORMAL)
#endif
/*
@@ -16885,6 +18059,7 @@ struct AuthContext {
*/
#define OPFLAG_NCHANGE 0x01 /* OP_Insert: Set to update db->nChange */
/* Also used in P2 (not P5) of OP_Delete */
+#define OPFLAG_NOCHNG 0x01 /* OP_VColumn nochange for UPDATE */
#define OPFLAG_EPHEM 0x01 /* OP_Column: Ephemeral output is ok */
#define OPFLAG_LASTROWID 0x20 /* Set to update db->lastRowid */
#define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */
@@ -16900,6 +18075,7 @@ struct AuthContext {
#define OPFLAG_PERMUTE 0x01 /* OP_Compare: use the permutation */
#define OPFLAG_SAVEPOSITION 0x02 /* OP_Delete/Insert: save cursor pos */
#define OPFLAG_AUXDELETE 0x04 /* OP_Delete: index in a DELETE op */
+#define OPFLAG_NOCHNG_MAGIC 0x6d /* OP_MakeRecord: serialtype 10 is ok */
/*
* Each trigger present in the database schema is stored as an instance of
@@ -16985,8 +18161,10 @@ struct TriggerStep {
Select *pSelect; /* SELECT statement or RHS of INSERT INTO SELECT ... */
char *zTarget; /* Target table for DELETE, UPDATE, INSERT */
Expr *pWhere; /* The WHERE clause for DELETE or UPDATE steps */
- ExprList *pExprList; /* SET clause for UPDATE. */
+ ExprList *pExprList; /* SET clause for UPDATE */
IdList *pIdList; /* Column names for INSERT */
+ Upsert *pUpsert; /* Upsert clauses on an INSERT */
+ char *zSpan; /* Original SQL text of this command */
TriggerStep *pNext; /* Next in the link-list */
TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */
};
@@ -17010,17 +18188,15 @@ struct DbFixer {
** An objected used to accumulate the text of a string where we
** do not necessarily know how big the string will be in the end.
*/
-struct StrAccum {
+struct sqlite3_str {
sqlite3 *db; /* Optional database for lookaside. Can be NULL */
char *zText; /* The string collected so far */
u32 nAlloc; /* Amount of space allocated in zText */
u32 mxAlloc; /* Maximum allowed allocation. 0 for no malloc usage */
u32 nChar; /* Length of the string so far */
- u8 accError; /* STRACCUM_NOMEM or STRACCUM_TOOBIG */
+ u8 accError; /* SQLITE_NOMEM or SQLITE_TOOBIG */
u8 printfFlags; /* SQLITE_PRINTF flags below */
};
-#define STRACCUM_NOMEM 1
-#define STRACCUM_TOOBIG 2
#define SQLITE_PRINTF_INTERNAL 0x01 /* Internal-use-only converters allowed */
#define SQLITE_PRINTF_SQLFUNC 0x02 /* SQL function arguments to VXPrintf */
#define SQLITE_PRINTF_MALLOCED 0x04 /* True if xText is allocated space */
@@ -17037,9 +18213,15 @@ typedef struct {
char **pzErrMsg; /* Error message stored here */
int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */
int rc; /* Result code stored here */
+ u32 mInitFlags; /* Flags controlling error messages */
} InitData;
/*
+** Allowed values for mInitFlags
+*/
+#define INITFLAG_AlterTable 0x0001 /* This is a reparse after ALTER TABLE */
+
+/*
** Structure containing global configuration data for the SQLite library.
**
** This structure also contains some state information.
@@ -17089,14 +18271,16 @@ struct Sqlite3Config {
/* The following callback (if not NULL) is invoked on every VDBE branch
** operation. Set the callback using SQLITE_TESTCTRL_VDBE_COVERAGE.
*/
- void (*xVdbeBranch)(void*,int iSrcLine,u8 eThis,u8 eMx); /* Callback */
+ void (*xVdbeBranch)(void*,unsigned iSrcLine,u8 eThis,u8 eMx); /* Callback */
void *pVdbeBranchArg; /* 1st argument */
#endif
#ifndef SQLITE_UNTESTABLE
int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */
#endif
int bLocaltimeFault; /* True to fail localtime() calls */
+ int bInternalFunctions; /* Internal SQL functions are visible */
int iOnceResetThreshold; /* When to reset OP_Once counters */
+ u32 szSorterRef; /* Min size in bytes to use sorter-refs */
};
/*
@@ -17136,9 +18320,12 @@ struct Walker {
struct CCurHint *pCCurHint; /* Used by codeCursorHint() */
int *aiCol; /* array of column indexes */
struct IdxCover *pIdxCover; /* Check for index coverage */
- struct IdxExprTrans *pIdxTrans; /* Convert indexed expr to column */
+ struct IdxExprTrans *pIdxTrans; /* Convert idxed expr to column */
ExprList *pGroupBy; /* GROUP BY clause */
- struct HavingToWhereCtx *pHavingCtx; /* HAVING to WHERE clause ctx */
+ Select *pSelect; /* HAVING to WHERE clause ctx */
+ struct WindowRewrite *pRewrite; /* Window rewrite context */
+ struct WhereConst *pConst; /* WHERE clause constants */
+ struct RenameCtx *pRename; /* RENAME COLUMN context */
} u;
};
@@ -17190,6 +18377,68 @@ struct TreeView {
#endif /* SQLITE_DEBUG */
/*
+** This object is used in varioius 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.
+** This object holds the information contained in the OVER clause,
+** plus additional fields used during code generation.
+**
+** (2) All window functions in a single SELECT form a linked-list
+** attached to Select.pWin. The Window.pFunc and Window.pExpr
+** fields point back to the expression that is the window function.
+**
+** (3) The terms of the WINDOW clause of a SELECT are instances of this
+** 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.
+*/
+struct Window {
+ char *zName; /* Name of window (may be NULL) */
+ ExprList *pPartition; /* PARTITION BY clause */
+ ExprList *pOrderBy; /* ORDER BY clause */
+ u8 eType; /* TK_RANGE or TK_ROWS */
+ u8 eStart; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */
+ u8 eEnd; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */
+ Expr *pStart; /* Expression for "<expr> PRECEDING" */
+ Expr *pEnd; /* Expression for "<expr> FOLLOWING" */
+ Window *pNextWin; /* Next window function belonging to this SELECT */
+ Expr *pFilter; /* The FILTER expression */
+ FuncDef *pFunc; /* The function */
+ int iEphCsr; /* Partition buffer or Peer buffer */
+ int regAccum;
+ 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 */
+ 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 */
+};
+
+#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 void sqlite3WindowAttach(Parse*, Expr*, Window*);
+SQLITE_PRIVATE int sqlite3WindowCompare(Parse*, Window*, Window*);
+SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse*, Window*);
+SQLITE_PRIVATE void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int);
+SQLITE_PRIVATE int sqlite3WindowRewrite(Parse*, Select*);
+SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse*, struct SrcList_item*);
+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);
+#else
+# define sqlite3WindowDelete(a,b)
+# define sqlite3WindowFunctions()
+# define sqlite3WindowAttach(a,b,c)
+#endif
+
+/*
** Assuming zIn points to the first byte of a UTF-8 character,
** advance zIn to point to the first byte of the next UTF-8 character.
*/
@@ -17206,6 +18455,7 @@ struct TreeView {
** using sqlite3_log(). The routines also provide a convenient place
** to set a debugger breakpoint.
*/
+SQLITE_PRIVATE int sqlite3ReportError(int iErr, int lineno, const char *zType);
SQLITE_PRIVATE int sqlite3CorruptError(int);
SQLITE_PRIVATE int sqlite3MisuseError(int);
SQLITE_PRIVATE int sqlite3CantopenError(int);
@@ -17275,15 +18525,14 @@ SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno);
# define sqlite3Tolower(x) tolower((unsigned char)(x))
# define sqlite3Isquote(x) ((x)=='"'||(x)=='\''||(x)=='['||(x)=='`')
#endif
-#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
SQLITE_PRIVATE int sqlite3IsIdChar(u8);
-#endif
/*
** Internal function prototypes
*/
SQLITE_PRIVATE int sqlite3StrICmp(const char*,const char*);
SQLITE_PRIVATE int sqlite3Strlen30(const char*);
+#define sqlite3Strlen30NN(C) (strlen(C)&0x3fffffff)
SQLITE_PRIVATE char *sqlite3ColumnType(Column*,char*);
#define sqlite3StrNICmp sqlite3_strnicmp
@@ -17296,6 +18545,7 @@ SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3*, u64);
SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3*, u64);
SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3*,const char*);
SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3*,const char*, u64);
+SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3*,const char*,const char*);
SQLITE_PRIVATE void *sqlite3Realloc(void*, u64);
SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64);
SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, u64);
@@ -17364,6 +18614,12 @@ SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3*,int*);
SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void);
SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void);
+#if defined(SQLITE_ENABLE_MULTITHREADED_CHECKS) && !defined(SQLITE_MUTEX_OMIT)
+SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex*);
+#else
+# define sqlite3MutexWarnOnContention(x)
+#endif
+
#ifndef SQLITE_OMIT_FLOATING_POINT
SQLITE_PRIVATE int sqlite3IsNaN(double);
#else
@@ -17380,8 +18636,6 @@ struct PrintfArguments {
sqlite3_value **apArg; /* The argument values */
};
-SQLITE_PRIVATE void sqlite3VXPrintf(StrAccum*, const char*, va_list);
-SQLITE_PRIVATE void sqlite3XPrintf(StrAccum*, const char*, ...);
SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...);
SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list);
#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE)
@@ -17395,8 +18649,13 @@ SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*);
SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView*, const Expr*, u8);
SQLITE_PRIVATE void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*);
SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*);
+SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView*, const SrcList*);
SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView*, const Select*, u8);
SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView*, const With*, u8);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView*, const Window*, u8);
+SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView*, const Window*, u8);
+#endif
#endif
@@ -17421,18 +18680,19 @@ SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*);
SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*);
SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse*, Expr*, Select*);
SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*);
-SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*);
+SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*, int);
SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32);
SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*);
SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*);
SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*);
SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int);
SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int);
-SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,ExprSpan*);
+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 sqlite3Init(sqlite3*, char**);
SQLITE_PRIVATE int sqlite3InitCallback(void*, int, char**, char**);
+SQLITE_PRIVATE int sqlite3InitOne(sqlite3*, int, char**, u32);
SQLITE_PRIVATE void sqlite3Pragma(Parse*,Token*,Token*,Token*,int);
#ifndef SQLITE_OMIT_VIRTUALTABLE
SQLITE_PRIVATE Module *sqlite3PragmaVtabRegister(sqlite3*,const char *zName);
@@ -17458,7 +18718,7 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token*,Token*);
SQLITE_PRIVATE void sqlite3AddNotNull(Parse*, int);
SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int);
SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*);
-SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,ExprSpan*);
+SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*);
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*,
@@ -17482,8 +18742,9 @@ SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec*);
SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int,int*);
#endif
-SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int);
-SQLITE_PRIVATE void sqlite3RowSetClear(RowSet*);
+SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3*);
+SQLITE_PRIVATE void sqlite3RowSetDelete(void*);
+SQLITE_PRIVATE void sqlite3RowSetClear(void*);
SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet*, i64);
SQLITE_PRIVATE int sqlite3RowSetTest(RowSet*, int iBatch, i64);
SQLITE_PRIVATE int sqlite3RowSetNext(RowSet*, i64*);
@@ -17502,6 +18763,7 @@ SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask);
SQLITE_PRIVATE void sqlite3DropTable(Parse*, SrcList*, int, int);
SQLITE_PRIVATE void sqlite3CodeDropTable(Parse*, Table*, int, int);
SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3*, Table*);
+SQLITE_PRIVATE void sqlite3FreeIndex(sqlite3*, Index*);
#ifndef SQLITE_OMIT_AUTOINCREMENT
SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse);
SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse);
@@ -17509,9 +18771,9 @@ SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse);
# define sqlite3AutoincrementBegin(X)
# define sqlite3AutoincrementEnd(X)
#endif
-SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int);
+SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*);
SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*);
-SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3*, IdList*, Token*);
+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*);
@@ -17530,22 +18792,23 @@ SQLITE_PRIVATE void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,i
SQLITE_PRIVATE void sqlite3DropIndex(Parse*, SrcList*, int);
SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*);
SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*,
- Expr*,ExprList*,u32,Expr*,Expr*);
+ Expr*,ExprList*,u32,Expr*);
SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*);
SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*);
SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int);
SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int);
#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
-SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,Expr*,char*);
+SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,char*);
#endif
-SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*);
-SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*, Expr*, int);
+SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*, ExprList*, Expr*);
+SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*,Expr*,int,ExprList*,Expr*,
+ Upsert*);
SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*,ExprList*,u16,int);
SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*);
SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo*);
SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo*);
SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo*);
-SQLITE_PRIVATE int sqlite3WhereOrderedInnerLoop(WhereInfo*);
+SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo*);
SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo*);
SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo*);
SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo*);
@@ -17555,15 +18818,8 @@ SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo*, int*);
#define ONEPASS_MULTI 2 /* ONEPASS is valid for multiple rows */
SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int);
SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8);
-SQLITE_PRIVATE void sqlite3ExprCodeGetColumnToReg(Parse*, Table*, int, int, int);
SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int);
SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int);
-SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse*, int, int, int);
-SQLITE_PRIVATE void sqlite3ExprCachePush(Parse*);
-SQLITE_PRIVATE void sqlite3ExprCachePop(Parse*);
-SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse*, int, int);
-SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse*);
-SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse*, int, int);
SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int);
SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, Expr*, int);
SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse*, Expr*, int);
@@ -17594,6 +18850,7 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse*,Expr*, Expr*, int);
SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*, Expr*, int);
SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList*, ExprList*, int);
SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse*,Expr*, Expr*, int);
+SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr*,int);
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*);
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*);
SQLITE_PRIVATE int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx);
@@ -17611,6 +18868,8 @@ SQLITE_PRIVATE void sqlite3EndTransaction(Parse*,int);
SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*);
SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *);
SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*);
+SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr*);
+SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr*);
SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*);
SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*);
SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8);
@@ -17623,13 +18882,17 @@ 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);
SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int);
SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse*,int);
+SQLITE_PRIVATE int sqlite3ExprReferencesUpdatedColumn(Expr*,int*,int);
SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int,
- u8,u8,int,int*,int*);
+ u8,u8,int,int*,int*,Upsert*);
#ifdef SQLITE_ENABLE_NULL_TRIM
SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe*,Table*);
#else
@@ -17648,10 +18911,8 @@ 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);
-#if SELECTTRACE_ENABLED
-SQLITE_PRIVATE void sqlite3SelectSetName(Select*,const char*);
-#else
-# define sqlite3SelectSetName(A,B)
+#ifdef SQLITE_ENABLE_NORMALIZE
+SQLITE_PRIVATE FuncDef *sqlite3FunctionSearchN(int,const char*,int);
#endif
SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(FuncDef*,int);
SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8);
@@ -17663,7 +18924,7 @@ SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*);
SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int);
#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
-SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, int);
+SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, ExprList*,Expr*,int);
#endif
#ifndef SQLITE_OMIT_TRIGGER
@@ -17679,11 +18940,15 @@ SQLITE_PRIVATE void sqlite3CodeRowTrigger(Parse*, Trigger *, int, ExprList*, i
SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(Parse *, Trigger *, Table *, int, int, int);
void sqliteViewTriggers(Parse*, Table*, Expr*, int, ExprList*);
SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3*, TriggerStep*);
-SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*);
-SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(sqlite3*,Token*, IdList*,
- Select*,u8);
-SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList*, Expr*, u8);
-SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*);
+SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*,
+ const char*,const char*);
+SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(Parse*,Token*, IdList*,
+ Select*,u8,Upsert*,
+ const char*,const char*);
+SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(Parse*,Token*,ExprList*, Expr*, u8,
+ const char*,const char*);
+SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(Parse*,Token*, Expr*,
+ const char*,const char*);
SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3*, Trigger*);
SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*);
SQLITE_PRIVATE u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Table*,int);
@@ -17790,9 +19055,14 @@ SQLITE_PRIVATE int sqlite3TwoPartName(Parse *, Token *, Token *, Token **);
SQLITE_PRIVATE const char *sqlite3ErrName(int);
#endif
+#ifdef SQLITE_ENABLE_DESERIALIZE
+SQLITE_PRIVATE int sqlite3MemdbInit(void);
+#endif
+
SQLITE_PRIVATE const char *sqlite3ErrStr(int);
SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse);
SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int);
+SQLITE_PRIVATE int sqlite3IsBinary(const CollSeq*);
SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char*zName);
SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr);
SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, Expr *pExpr);
@@ -17801,6 +19071,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Toke
SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*);
SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr*);
SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *);
+SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3*);
SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *, const char *);
SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *, int);
SQLITE_PRIVATE int sqlite3AddInt64(i64*,i64);
@@ -17838,13 +19109,20 @@ SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions;
SQLITE_PRIVATE int sqlite3PendingByte;
#endif
#endif
+#ifdef VDBE_PROFILE
+SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt;
+#endif
SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3*, int, int, int);
SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*);
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*);
+SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*, int);
SQLITE_PRIVATE int sqlite3CodeSubselect(Parse*, Expr *, int, int);
SQLITE_PRIVATE void sqlite3SelectPrep(Parse*, Select*, NameContext*);
SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p);
@@ -17857,10 +19135,14 @@ SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const
SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int);
SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *);
SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *);
+SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse*, void*, Token*);
+SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse*, void *pTo, void *pFrom);
+SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse*, Expr*);
+SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse*, ExprList*);
SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*);
-SQLITE_PRIVATE char sqlite3AffinityType(const char*, u8*);
+SQLITE_PRIVATE char sqlite3AffinityType(const char*, Column*);
SQLITE_PRIVATE void sqlite3Analyze(Parse*, Token*, Token*);
-SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*);
+SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*, sqlite3_file*);
SQLITE_PRIVATE int sqlite3FindDb(sqlite3*, Token*);
SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *, const char *);
SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3*,int iDB);
@@ -17875,25 +19157,27 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3*,int,int);
SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo*);
SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoRef(KeyInfo*);
SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse*, Index*);
+SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList(Parse*, ExprList*, int, int);
+
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo*);
#endif
SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *,
void (*)(sqlite3_context*,int,sqlite3_value **),
- void (*)(sqlite3_context*,int,sqlite3_value **), void (*)(sqlite3_context*),
+ void (*)(sqlite3_context*,int,sqlite3_value **),
+ void (*)(sqlite3_context*),
+ void (*)(sqlite3_context*),
+ void (*)(sqlite3_context*,int,sqlite3_value **),
FuncDestructor *pDestructor
);
+SQLITE_PRIVATE void sqlite3NoopDestructor(void*);
SQLITE_PRIVATE void sqlite3OomFault(sqlite3*);
SQLITE_PRIVATE void sqlite3OomClear(sqlite3*);
SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int);
SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *);
SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int);
-SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum*,const char*,int);
-SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum*,const char*);
-SQLITE_PRIVATE void sqlite3AppendChar(StrAccum*,int,char);
SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*);
-SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum*);
SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int);
SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int);
@@ -17920,10 +19204,11 @@ SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3*, Index*, int);
** The interface to the LEMON-generated parser
*/
#ifndef SQLITE_AMALGAMATION
-SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(u64));
+SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(u64), Parse*);
SQLITE_PRIVATE void sqlite3ParserFree(void*, void(*)(void*));
#endif
-SQLITE_PRIVATE void sqlite3Parser(void*, int, Token, Parse*);
+SQLITE_PRIVATE void sqlite3Parser(void*, int, Token);
+SQLITE_PRIVATE int sqlite3ParserFallback(int);
#ifdef YYTRACKMAXSTACKDEPTH
SQLITE_PRIVATE int sqlite3ParserStackPeak(void*);
#endif
@@ -17989,11 +19274,13 @@ SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*);
SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *);
SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *);
SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
-SQLITE_PRIVATE void sqlite3InvalidFunction(sqlite3_context*,int,sqlite3_value**);
SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*);
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);
+#endif
SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*);
SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*);
SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);
@@ -18011,6 +19298,18 @@ SQLITE_PRIVATE void sqlite3WithPush(Parse*, With*, u8);
#define sqlite3WithPush(x,y,z)
#define sqlite3WithDelete(x,y)
#endif
+#ifndef SQLITE_OMIT_UPSERT
+SQLITE_PRIVATE Upsert *sqlite3UpsertNew(sqlite3*,ExprList*,Expr*,ExprList*,Expr*);
+SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3*,Upsert*);
+SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3*,Upsert*);
+SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget(Parse*,SrcList*,Upsert*);
+SQLITE_PRIVATE void sqlite3UpsertDoUpdate(Parse*,Upsert*,Table*,Index*,int);
+#else
+#define sqlite3UpsertNew(v,w,x,y,z) ((Upsert*)0)
+#define sqlite3UpsertDelete(x,y)
+#define sqlite3UpsertDup(x,y) ((Upsert*)0)
+#endif
+
/* Declarations for functions in fkey.c. All of these are replaced by
** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign
@@ -18113,6 +19412,9 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db);
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE void sqlite3ParserTrace(FILE*, char *);
#endif
+#if defined(YYCOVERAGE)
+SQLITE_PRIVATE int sqlite3ParserCoverage(FILE*);
+#endif
/*
** If the SQLITE_ENABLE IOTRACE exists then the global variable
@@ -18440,7 +19742,9 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = {
0, /* xTestCallback */
#endif
0, /* bLocaltimeFault */
- 0x7ffffffe /* iOnceResetThreshold */
+ 0, /* bInternalFunctions */
+ 0x7ffffffe, /* iOnceResetThreshold */
+ SQLITE_DEFAULT_SORTERREF_SIZE /* szSorterRef */
};
/*
@@ -18458,6 +19762,13 @@ SQLITE_PRIVATE const Token sqlite3IntTokens[] = {
{ "1", 1 }
};
+#ifdef VDBE_PROFILE
+/*
+** The following performance counter can be used in place of
+** sqlite3Hwtime() for profiling. This is a no-op on standard builds.
+*/
+SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt = 0;
+#endif
/*
** The value of the "pending" byte must be 0x40000000 (1 byte past the
@@ -18602,6 +19913,7 @@ struct VdbeCursor {
Bool isEphemeral:1; /* True for an ephemeral table */
Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */
Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */
+ Bool seekHit:1; /* See the OP_SeekHit and OP_IfNoHope opcodes */
Btree *pBtx; /* Separate file holding temporary table */
i64 seqCount; /* Sequence counter */
int *aAltMap; /* Mapping from table to index column numbers */
@@ -18685,6 +19997,9 @@ struct VdbeFrame {
void *token; /* Copy of SubProgram.token */
i64 lastRowid; /* Last insert rowid (sqlite3.lastRowid) */
AuxData *pAuxData; /* Linked list of auxdata allocations */
+#if SQLITE_DEBUG
+ u32 iFrameMagic; /* magic number for sanity checking */
+#endif
int nCursor; /* Number of entries in apCsr */
int pc; /* Program Counter in parent (calling) frame */
int nOp; /* Size of aOp array */
@@ -18695,6 +20010,13 @@ struct VdbeFrame {
int nDbChange; /* Value of db->nChange */
};
+/* Magic number for sanity checking on VdbeFrame objects */
+#define SQLITE_FRAME_MAGIC 0x879fb71e
+
+/*
+** Return a pointer to the array of registers allocated for use
+** by a VdbeFrame.
+*/
#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))])
/*
@@ -18709,8 +20031,6 @@ struct sqlite3_value {
int nZero; /* Extra zero bytes when MEM_Zero and MEM_Blob set */
const char *zPType; /* Pointer type when MEM_Term|MEM_Subtype|MEM_Null */
FuncDef *pDef; /* Used only when flags==MEM_Agg */
- RowSet *pRowSet; /* Used only when flags==MEM_RowSet */
- VdbeFrame *pFrame; /* Used when flags==MEM_Frame */
} u;
u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */
u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */
@@ -18725,7 +20045,7 @@ struct sqlite3_value {
void (*xDel)(void*);/* Destructor for Mem.z - only valid if MEM_Dyn */
#ifdef SQLITE_DEBUG
Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */
- void *pFiller; /* So that sizeof(Mem) is a multiple of 8 */
+ u16 mScopyFlags; /* flags value immediately after the shallow copy */
#endif
};
@@ -18754,8 +20074,8 @@ 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 */
-#define MEM_RowSet 0x0020 /* Value is a RowSet object */
-#define MEM_Frame 0x0040 /* Value is a VdbeFrame object */
+/* Available 0x0020 */
+/* 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 */
@@ -18782,7 +20102,7 @@ struct sqlite3_value {
** that needs to be deallocated to avoid a leak.
*/
#define VdbeMemDynamic(X) \
- (((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame))!=0)
+ (((X)->flags&(MEM_Agg|MEM_Dyn))!=0)
/*
** Clear any existing type flags from a Mem and replace them with f
@@ -18834,7 +20154,6 @@ struct sqlite3_context {
int iOp; /* Instruction number of OP_Function */
int isError; /* Error code returned by the function. */
u8 skipFlag; /* Skip accumulator loading if true */
- u8 fErrorOrAux; /* isError!=0 or pVdbe->pAuxData modified */
u8 argc; /* Number of arguments */
sqlite3_value *argv[1]; /* Argument set */
};
@@ -18897,14 +20216,15 @@ struct Vdbe {
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 */
#endif
u16 nResColumn; /* Number of columns in one row of the result set */
u8 errorAction; /* Recovery action to do in case of an error */
u8 minWriteFileFormat; /* Minimum file format for writable database files */
u8 prepFlags; /* SQLITE_PREPARE_* flags */
- bft expired:1; /* True if the VM needs to be recompiled */
- bft doingRerun:1; /* True if rerunning after an auto-reprepare */
+ bft expired:2; /* 1: recompile VM immediately 2: when convenient */
bft explain:2; /* True if EXPLAIN present on SQL command */
+ bft doingRerun:1; /* True if rerunning after an auto-reprepare */
bft changeCntOn:1; /* True to update the change-counter */
bft runOnlyOnce:1; /* Automatically expire on reset */
bft usesStmtJournal:1; /* True if uses a statement journal */
@@ -18914,6 +20234,9 @@ struct Vdbe {
yDbMask lockMask; /* Subset of btreeMask that requires a lock */
u32 aCounter[7]; /* Counters used by sqlite3_stmt_status() */
char *zSql; /* Text of the SQL statement that generated this */
+#ifdef SQLITE_ENABLE_NORMALIZE
+ char *zNormSql; /* Normalization of the associated SQL statement */
+#endif
void *pFree; /* Free this when deleting the vdbe */
VdbeFrame *pFrame; /* Parent frame */
VdbeFrame *pDelFrame; /* List of frame objects to free on VM reset */
@@ -18965,9 +20288,6 @@ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*);
void sqliteVdbePopStack(Vdbe*,int);
SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor**, int*);
SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*);
-#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
-SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, Op*);
-#endif
SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32);
SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8);
SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int, u32*);
@@ -18979,7 +20299,9 @@ int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *);
SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*);
SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor*, i64*);
SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*);
+#ifndef SQLITE_OMIT_EXPLAIN
SQLITE_PRIVATE int sqlite3VdbeList(Vdbe*);
+#endif
SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe*);
SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *, int);
SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem*);
@@ -18998,12 +20320,16 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetPointer(Mem*, void*, const char*, void(*)(v
SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem*,sqlite3*,u16);
SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem*);
SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*,int);
-SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem*);
+#ifdef SQLITE_DEBUG
+SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem*);
+#endif
+SQLITE_PRIVATE int sqlite3VdbeMemSetRowSet(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, u8, u8);
SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*);
SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*);
+SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem*, int ifNull);
SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*);
@@ -19011,11 +20337,20 @@ SQLITE_PRIVATE void sqlite3VdbeMemCast(Mem*,u8,u8);
SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*);
SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p);
SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*);
+#endif
+#ifndef SQLITE_OMIT_EXPLAIN
SQLITE_PRIVATE const char *sqlite3OpcodeName(int);
+#endif
SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve);
SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int n);
SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int);
-SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*);
+#ifdef SQLITE_DEBUG
+SQLITE_PRIVATE int sqlite3VdbeFrameIsValid(VdbeFrame*);
+#endif
+SQLITE_PRIVATE void sqlite3VdbeFrameMemDel(void*); /* Destructor on Mem */
+SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*); /* Actually deletes the Frame */
SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *);
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
SQLITE_PRIVATE void sqlite3VdbePreUpdateHook(Vdbe*,VdbeCursor*,int,const char*,Table*,i64,int);
@@ -19031,6 +20366,14 @@ SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *, int *);
SQLITE_PRIVATE int sqlite3VdbeSorterWrite(const VdbeCursor *, Mem *);
SQLITE_PRIVATE int sqlite3VdbeSorterCompare(const VdbeCursor *, Mem *, int, int *);
+#ifdef SQLITE_DEBUG
+SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe*, VdbeCursor*);
+SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe*);
+#else
+# define sqlite3VdbeIncrWriteCounter(V,C)
+# define sqlite3VdbeAssertAbortable(V)
+#endif
+
#if !defined(SQLITE_OMIT_SHARED_CACHE)
SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe*);
#else
@@ -19397,6 +20740,9 @@ SQLITE_API int sqlite3_db_status(
** pagers the database handle is connected to. *pHighwater is always set
** to zero.
*/
+ case SQLITE_DBSTATUS_CACHE_SPILL:
+ op = SQLITE_DBSTATUS_CACHE_WRITE+1;
+ /* Fall through into the next case */
case SQLITE_DBSTATUS_CACHE_HIT:
case SQLITE_DBSTATUS_CACHE_MISS:
case SQLITE_DBSTATUS_CACHE_WRITE:{
@@ -19479,7 +20825,7 @@ SQLITE_API int sqlite3_db_status(
**
** Jean Meeus
** Astronomical Algorithms, 2nd Edition, 1998
-** ISBM 0-943396-61-1
+** ISBN 0-943396-61-1
** Willmann-Bell, Inc
** Richmond, Virginia (USA)
*/
@@ -20817,8 +22163,11 @@ SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){
** routine has no return value since the return value would be meaningless.
*/
SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){
+ if( id->pMethods==0 ) return SQLITE_NOTFOUND;
#ifdef SQLITE_TEST
- if( op!=SQLITE_FCNTL_COMMIT_PHASETWO ){
+ if( op!=SQLITE_FCNTL_COMMIT_PHASETWO
+ && op!=SQLITE_FCNTL_LOCK_TIMEOUT
+ ){
/* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite
** is using a regular VFS, it is called after the corresponding
** transaction has been committed. Injecting a fault at this point
@@ -20835,7 +22184,7 @@ SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){
return id->pMethods->xFileControl(id, op, pArg);
}
SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){
- (void)id->pMethods->xFileControl(id, op, pArg);
+ if( id->pMethods ) (void)id->pMethods->xFileControl(id, op, pArg);
}
SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){
@@ -21099,9 +22448,12 @@ SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){
** Unregister a VFS so that it is no longer accessible.
*/
SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){
-#if SQLITE_THREADSAFE
- sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
+ MUTEX_LOGIC(sqlite3_mutex *mutex;)
+#ifndef SQLITE_OMIT_AUTOINIT
+ int rc = sqlite3_initialize();
+ if( rc ) return rc;
#endif
+ MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
sqlite3_mutex_enter(mutex);
vfsUnlink(pVfs);
sqlite3_mutex_leave(mutex);
@@ -23384,6 +24736,193 @@ static SQLITE_WSD int mutexIsInit = 0;
#ifndef SQLITE_MUTEX_OMIT
+
+#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS
+/*
+** This block (enclosed by SQLITE_ENABLE_MULTITHREADED_CHECKS) contains
+** the implementation of a wrapper around the system default mutex
+** implementation (sqlite3DefaultMutex()).
+**
+** Most calls are passed directly through to the underlying default
+** mutex implementation. Except, if a mutex is configured by calling
+** sqlite3MutexWarnOnContention() on it, then if contention is ever
+** encountered within xMutexEnter() a warning is emitted via sqlite3_log().
+**
+** This type of mutex is used as the database handle mutex when testing
+** apps that usually use SQLITE_CONFIG_MULTITHREAD mode.
+*/
+
+/*
+** Type for all mutexes used when SQLITE_ENABLE_MULTITHREADED_CHECKS
+** is defined. Variable CheckMutex.mutex is a pointer to the real mutex
+** allocated by the system mutex implementation. Variable iType is usually set
+** to the type of mutex requested - SQLITE_MUTEX_RECURSIVE, SQLITE_MUTEX_FAST
+** or one of the static mutex identifiers. Or, if this is a recursive mutex
+** that has been configured using sqlite3MutexWarnOnContention(), it is
+** set to SQLITE_MUTEX_WARNONCONTENTION.
+*/
+typedef struct CheckMutex CheckMutex;
+struct CheckMutex {
+ int iType;
+ sqlite3_mutex *mutex;
+};
+
+#define SQLITE_MUTEX_WARNONCONTENTION (-1)
+
+/*
+** Pointer to real mutex methods object used by the CheckMutex
+** implementation. Set by checkMutexInit().
+*/
+static SQLITE_WSD const sqlite3_mutex_methods *pGlobalMutexMethods;
+
+#ifdef SQLITE_DEBUG
+static int checkMutexHeld(sqlite3_mutex *p){
+ return pGlobalMutexMethods->xMutexHeld(((CheckMutex*)p)->mutex);
+}
+static int checkMutexNotheld(sqlite3_mutex *p){
+ return pGlobalMutexMethods->xMutexNotheld(((CheckMutex*)p)->mutex);
+}
+#endif
+
+/*
+** Initialize and deinitialize the mutex subsystem.
+*/
+static int checkMutexInit(void){
+ pGlobalMutexMethods = sqlite3DefaultMutex();
+ return SQLITE_OK;
+}
+static int checkMutexEnd(void){
+ pGlobalMutexMethods = 0;
+ return SQLITE_OK;
+}
+
+/*
+** Allocate a mutex.
+*/
+static sqlite3_mutex *checkMutexAlloc(int iType){
+ static CheckMutex staticMutexes[] = {
+ {2, 0}, {3, 0}, {4, 0}, {5, 0},
+ {6, 0}, {7, 0}, {8, 0}, {9, 0},
+ {10, 0}, {11, 0}, {12, 0}, {13, 0}
+ };
+ CheckMutex *p = 0;
+
+ assert( SQLITE_MUTEX_RECURSIVE==1 && SQLITE_MUTEX_FAST==0 );
+ if( iType<2 ){
+ p = sqlite3MallocZero(sizeof(CheckMutex));
+ if( p==0 ) return 0;
+ p->iType = iType;
+ }else{
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( iType-2>=ArraySize(staticMutexes) ){
+ (void)SQLITE_MISUSE_BKPT;
+ return 0;
+ }
+#endif
+ p = &staticMutexes[iType-2];
+ }
+
+ if( p->mutex==0 ){
+ p->mutex = pGlobalMutexMethods->xMutexAlloc(iType);
+ if( p->mutex==0 ){
+ if( iType<2 ){
+ sqlite3_free(p);
+ }
+ p = 0;
+ }
+ }
+
+ return (sqlite3_mutex*)p;
+}
+
+/*
+** Free a mutex.
+*/
+static void checkMutexFree(sqlite3_mutex *p){
+ assert( SQLITE_MUTEX_RECURSIVE<2 );
+ assert( SQLITE_MUTEX_FAST<2 );
+ assert( SQLITE_MUTEX_WARNONCONTENTION<2 );
+
+#if SQLITE_ENABLE_API_ARMOR
+ if( ((CheckMutex*)p)->iType<2 )
+#endif
+ {
+ CheckMutex *pCheck = (CheckMutex*)p;
+ pGlobalMutexMethods->xMutexFree(pCheck->mutex);
+ sqlite3_free(pCheck);
+ }
+#ifdef SQLITE_ENABLE_API_ARMOR
+ else{
+ (void)SQLITE_MISUSE_BKPT;
+ }
+#endif
+}
+
+/*
+** Enter the mutex.
+*/
+static void checkMutexEnter(sqlite3_mutex *p){
+ CheckMutex *pCheck = (CheckMutex*)p;
+ if( pCheck->iType==SQLITE_MUTEX_WARNONCONTENTION ){
+ if( SQLITE_OK==pGlobalMutexMethods->xMutexTry(pCheck->mutex) ){
+ return;
+ }
+ sqlite3_log(SQLITE_MISUSE,
+ "illegal multi-threaded access to database connection"
+ );
+ }
+ pGlobalMutexMethods->xMutexEnter(pCheck->mutex);
+}
+
+/*
+** Enter the mutex (do not block).
+*/
+static int checkMutexTry(sqlite3_mutex *p){
+ CheckMutex *pCheck = (CheckMutex*)p;
+ return pGlobalMutexMethods->xMutexTry(pCheck->mutex);
+}
+
+/*
+** Leave the mutex.
+*/
+static void checkMutexLeave(sqlite3_mutex *p){
+ CheckMutex *pCheck = (CheckMutex*)p;
+ pGlobalMutexMethods->xMutexLeave(pCheck->mutex);
+}
+
+sqlite3_mutex_methods const *multiThreadedCheckMutex(void){
+ static const sqlite3_mutex_methods sMutex = {
+ checkMutexInit,
+ checkMutexEnd,
+ checkMutexAlloc,
+ checkMutexFree,
+ checkMutexEnter,
+ checkMutexTry,
+ checkMutexLeave,
+#ifdef SQLITE_DEBUG
+ checkMutexHeld,
+ checkMutexNotheld
+#else
+ 0,
+ 0
+#endif
+ };
+ return &sMutex;
+}
+
+/*
+** Mark the SQLITE_MUTEX_RECURSIVE mutex passed as the only argument as
+** one on which there should be no contention.
+*/
+SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex *p){
+ if( sqlite3GlobalConfig.mutex.xMutexAlloc==checkMutexAlloc ){
+ CheckMutex *pCheck = (CheckMutex*)p;
+ assert( pCheck->iType==SQLITE_MUTEX_RECURSIVE );
+ pCheck->iType = SQLITE_MUTEX_WARNONCONTENTION;
+ }
+}
+#endif /* ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS */
+
/*
** Initialize the mutex system.
*/
@@ -23399,7 +24938,11 @@ SQLITE_PRIVATE int sqlite3MutexInit(void){
sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex;
if( sqlite3GlobalConfig.bCoreMutex ){
+#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS
+ pFrom = multiThreadedCheckMutex();
+#else
pFrom = sqlite3DefaultMutex();
+#endif
}else{
pFrom = sqlite3NoopMutex();
}
@@ -23798,11 +25341,12 @@ struct sqlite3_mutex {
#endif
};
#if SQLITE_MUTEX_NREF
-#define SQLITE3_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER,0,0,(pthread_t)0,0}
+# define SQLITE3_MUTEX_INITIALIZER(id) \
+ {PTHREAD_MUTEX_INITIALIZER,id,0,(pthread_t)0,0}
#elif defined(SQLITE_ENABLE_API_ARMOR)
-#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0 }
+# define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER, id }
#else
-#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER }
+#define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER }
#endif
/*
@@ -23899,18 +25443,18 @@ static int pthreadMutexEnd(void){ return SQLITE_OK; }
*/
static sqlite3_mutex *pthreadMutexAlloc(int iType){
static sqlite3_mutex staticMutexes[] = {
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER
+ SQLITE3_MUTEX_INITIALIZER(2),
+ SQLITE3_MUTEX_INITIALIZER(3),
+ SQLITE3_MUTEX_INITIALIZER(4),
+ SQLITE3_MUTEX_INITIALIZER(5),
+ SQLITE3_MUTEX_INITIALIZER(6),
+ SQLITE3_MUTEX_INITIALIZER(7),
+ SQLITE3_MUTEX_INITIALIZER(8),
+ SQLITE3_MUTEX_INITIALIZER(9),
+ SQLITE3_MUTEX_INITIALIZER(10),
+ SQLITE3_MUTEX_INITIALIZER(11),
+ SQLITE3_MUTEX_INITIALIZER(12),
+ SQLITE3_MUTEX_INITIALIZER(13)
};
sqlite3_mutex *p;
switch( iType ){
@@ -23929,6 +25473,9 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){
pthread_mutex_init(&p->mutex, &recursiveAttr);
pthread_mutexattr_destroy(&recursiveAttr);
#endif
+#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR)
+ p->id = SQLITE_MUTEX_RECURSIVE;
+#endif
}
break;
}
@@ -23936,6 +25483,9 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){
p = sqlite3MallocZero( sizeof(*p) );
if( p ){
pthread_mutex_init(&p->mutex, 0);
+#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR)
+ p->id = SQLITE_MUTEX_FAST;
+#endif
}
break;
}
@@ -23951,7 +25501,7 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){
}
}
#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR)
- if( p ) p->id = iType;
+ assert( p==0 || p->id==iType );
#endif
return p;
}
@@ -24468,7 +26018,7 @@ struct sqlite3_mutex {
#ifdef SQLITE_DEBUG
volatile int nRef; /* Number of enterances */
volatile DWORD owner; /* Thread holding this mutex */
- volatile int trace; /* True to trace changes */
+ volatile LONG trace; /* True to trace changes */
#endif
};
@@ -24480,10 +26030,10 @@ struct sqlite3_mutex {
#define SQLITE_W32_MUTEX_INITIALIZER { 0 }
#ifdef SQLITE_DEBUG
-#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0, \
+#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id, \
0L, (DWORD)0, 0 }
#else
-#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0 }
+#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id }
#endif
#ifdef SQLITE_DEBUG
@@ -24526,18 +26076,18 @@ SQLITE_PRIVATE void sqlite3MemoryBarrier(void){
** Initialize and deinitialize the mutex subsystem.
*/
static sqlite3_mutex winMutex_staticMutexes[] = {
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER,
- SQLITE3_MUTEX_INITIALIZER
+ SQLITE3_MUTEX_INITIALIZER(2),
+ SQLITE3_MUTEX_INITIALIZER(3),
+ SQLITE3_MUTEX_INITIALIZER(4),
+ SQLITE3_MUTEX_INITIALIZER(5),
+ SQLITE3_MUTEX_INITIALIZER(6),
+ SQLITE3_MUTEX_INITIALIZER(7),
+ SQLITE3_MUTEX_INITIALIZER(8),
+ SQLITE3_MUTEX_INITIALIZER(9),
+ SQLITE3_MUTEX_INITIALIZER(10),
+ SQLITE3_MUTEX_INITIALIZER(11),
+ SQLITE3_MUTEX_INITIALIZER(12),
+ SQLITE3_MUTEX_INITIALIZER(13)
};
static int winMutex_isInit = 0;
@@ -24667,15 +26217,15 @@ static sqlite3_mutex *winMutexAlloc(int iType){
}
#endif
p = &winMutex_staticMutexes[iType-2];
- p->id = iType;
#ifdef SQLITE_DEBUG
#ifdef SQLITE_WIN32_MUTEX_TRACE_STATIC
- p->trace = 1;
+ InterlockedCompareExchange(&p->trace, 1, 0);
#endif
#endif
break;
}
}
+ assert( p==0 || p->id==iType );
return p;
}
@@ -25458,6 +27008,19 @@ SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, u64 n){
}
/*
+** The text between zStart and zEnd represents a phrase within a larger
+** SQL statement. Make a copy of this phrase in space obtained form
+** sqlite3DbMalloc(). Omit leading and trailing whitespace.
+*/
+SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){
+ int n;
+ while( sqlite3Isspace(zStart[0]) ) zStart++;
+ n = (int)(zEnd - zStart);
+ while( ALWAYS(n>0) && sqlite3Isspace(zStart[n-1]) ) n--;
+ return sqlite3DbStrNDup(db, zStart, n);
+}
+
+/*
** Free any prior content in *pz and replace it with a copy of zNew.
*/
SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){
@@ -25669,7 +27232,7 @@ static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){
** Set the StrAccum object to an error mode.
*/
static void setStrAccumError(StrAccum *p, u8 eError){
- assert( eError==STRACCUM_NOMEM || eError==STRACCUM_TOOBIG );
+ assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG );
p->accError = eError;
p->nAlloc = 0;
}
@@ -25703,8 +27266,8 @@ static char *getTextArg(PrintfArguments *p){
/*
** Render a string given by "fmt" into the StrAccum object.
*/
-SQLITE_PRIVATE void sqlite3VXPrintf(
- StrAccum *pAccum, /* Accumulate results here */
+SQLITE_API void sqlite3_str_vappendf(
+ sqlite3_str *pAccum, /* Accumulate results here */
const char *fmt, /* Format string */
va_list ap /* arguments */
){
@@ -25741,6 +27304,11 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */
char buf[etBUFSIZE]; /* Conversion buffer */
+ /* pAccum never starts out with an empty buffer that was obtained from
+ ** malloc(). This precondition is required by the mprintf("%z...")
+ ** optimization. */
+ assert( pAccum->nChar>0 || (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 );
+
bufpt = 0;
if( (pAccum->printfFlags & SQLITE_PRINTF_SQLFUNC)!=0 ){
pArgList = va_arg(ap, PrintfArguments*);
@@ -25756,11 +27324,11 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
#else
do{ fmt++; }while( *fmt && *fmt != '%' );
#endif
- sqlite3StrAccumAppend(pAccum, bufpt, (int)(fmt - bufpt));
+ sqlite3_str_append(pAccum, bufpt, (int)(fmt - bufpt));
if( *fmt==0 ) break;
}
if( (c=(*++fmt))==0 ){
- sqlite3StrAccumAppend(pAccum, "%", 1);
+ sqlite3_str_append(pAccum, "%", 1);
break;
}
/* Find out what flags are present */
@@ -25938,7 +27506,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
u64 n = (u64)precision + 10 + precision/3;
zOut = zExtra = sqlite3Malloc( n );
if( zOut==0 ){
- setStrAccumError(pAccum, STRACCUM_NOMEM);
+ setStrAccumError(pAccum, SQLITE_NOMEM);
return;
}
nOut = (int)n;
@@ -26063,7 +27631,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
bufpt = zExtra
= sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 );
if( bufpt==0 ){
- setStrAccumError(pAccum, STRACCUM_NOMEM);
+ setStrAccumError(pAccum, SQLITE_NOMEM);
return;
}
}
@@ -26159,22 +27727,52 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
case etCHARX:
if( bArgList ){
bufpt = getTextArg(pArgList);
- c = bufpt ? bufpt[0] : 0;
+ length = 1;
+ if( bufpt ){
+ buf[0] = c = *(bufpt++);
+ if( (c&0xc0)==0xc0 ){
+ while( length<4 && (bufpt[0]&0xc0)==0x80 ){
+ buf[length++] = *(bufpt++);
+ }
+ }
+ }else{
+ buf[0] = 0;
+ }
}else{
- c = va_arg(ap,int);
+ unsigned int ch = va_arg(ap,unsigned int);
+ if( ch<0x00080 ){
+ buf[0] = ch & 0xff;
+ length = 1;
+ }else if( ch<0x00800 ){
+ buf[0] = 0xc0 + (u8)((ch>>6)&0x1f);
+ buf[1] = 0x80 + (u8)(ch & 0x3f);
+ length = 2;
+ }else if( ch<0x10000 ){
+ buf[0] = 0xe0 + (u8)((ch>>12)&0x0f);
+ buf[1] = 0x80 + (u8)((ch>>6) & 0x3f);
+ buf[2] = 0x80 + (u8)(ch & 0x3f);
+ length = 3;
+ }else{
+ buf[0] = 0xf0 + (u8)((ch>>18) & 0x07);
+ buf[1] = 0x80 + (u8)((ch>>12) & 0x3f);
+ buf[2] = 0x80 + (u8)((ch>>6) & 0x3f);
+ buf[3] = 0x80 + (u8)(ch & 0x3f);
+ length = 4;
+ }
}
if( precision>1 ){
width -= precision-1;
if( width>1 && !flag_leftjustify ){
- sqlite3AppendChar(pAccum, width-1, ' ');
+ sqlite3_str_appendchar(pAccum, width-1, ' ');
width = 0;
}
- sqlite3AppendChar(pAccum, precision-1, c);
+ while( precision-- > 1 ){
+ sqlite3_str_append(pAccum, buf, length);
+ }
}
- length = 1;
- buf[0] = c;
bufpt = buf;
- break;
+ flag_altform2 = 1;
+ goto adjust_width_for_utf8;
case etSTRING:
case etDYNSTRING:
if( bArgList ){
@@ -26186,17 +27784,50 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
if( bufpt==0 ){
bufpt = "";
}else if( xtype==etDYNSTRING ){
+ if( pAccum->nChar==0
+ && pAccum->mxAlloc
+ && width==0
+ && precision<0
+ && pAccum->accError==0
+ ){
+ /* Special optimization for sqlite3_mprintf("%z..."):
+ ** Extend an existing memory allocation rather than creating
+ ** a new one. */
+ assert( (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 );
+ pAccum->zText = bufpt;
+ pAccum->nAlloc = sqlite3DbMallocSize(pAccum->db, bufpt);
+ pAccum->nChar = 0x7fffffff & (int)strlen(bufpt);
+ pAccum->printfFlags |= SQLITE_PRINTF_MALLOCED;
+ length = 0;
+ break;
+ }
zExtra = bufpt;
}
if( precision>=0 ){
- for(length=0; length<precision && bufpt[length]; length++){}
+ if( flag_altform2 ){
+ /* Set length to the number of bytes needed in order to display
+ ** precision characters */
+ unsigned char *z = (unsigned char*)bufpt;
+ while( precision-- > 0 && z[0] ){
+ SQLITE_SKIP_UTF8(z);
+ }
+ length = (int)(z - (unsigned char*)bufpt);
+ }else{
+ for(length=0; length<precision && bufpt[length]; length++){}
+ }
}else{
length = 0x7fffffff & (int)strlen(bufpt);
}
+ adjust_width_for_utf8:
+ if( flag_altform2 && width>0 ){
+ /* Adjust width to account for extra bytes in UTF-8 characters */
+ int ii = length - 1;
+ while( ii>=0 ) if( (bufpt[ii--] & 0xc0)==0x80 ) width++;
+ }
break;
- case etSQLESCAPE: /* Escape ' characters */
- case etSQLESCAPE2: /* Escape ' and enclose in '...' */
- case etSQLESCAPE3: { /* Escape " characters */
+ case etSQLESCAPE: /* %q: Escape ' characters */
+ case etSQLESCAPE2: /* %Q: Escape ' and enclose in '...' */
+ case etSQLESCAPE3: { /* %w: Escape " characters */
int i, j, k, n, isnull;
int needQuote;
char ch;
@@ -26210,16 +27841,24 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
}
isnull = escarg==0;
if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)");
+ /* For %q, %Q, and %w, the precision is the number of byte (or
+ ** characters if the ! flags is present) to use from the input.
+ ** Because of the extra quoting characters inserted, the number
+ ** of output characters may be larger than the precision.
+ */
k = precision;
for(i=n=0; k!=0 && (ch=escarg[i])!=0; i++, k--){
if( ch==q ) n++;
+ if( flag_altform2 && (ch&0xc0)==0xc0 ){
+ while( (escarg[i+1]&0xc0)==0x80 ){ i++; }
+ }
}
needQuote = !isnull && xtype==etSQLESCAPE2;
n += i + 3;
if( n>etBUFSIZE ){
bufpt = zExtra = sqlite3Malloc( n );
if( bufpt==0 ){
- setStrAccumError(pAccum, STRACCUM_NOMEM);
+ setStrAccumError(pAccum, SQLITE_NOMEM);
return;
}
}else{
@@ -26235,10 +27874,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
if( needQuote ) bufpt[j++] = q;
bufpt[j] = 0;
length = j;
- /* The precision in %q and %Q means how many input characters to
- ** consume, not the length of the output...
- ** if( precision>=0 && precision<length ) length = precision; */
- break;
+ goto adjust_width_for_utf8;
}
case etTOKEN: {
Token *pToken;
@@ -26246,7 +27882,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
pToken = va_arg(ap, Token*);
assert( bArgList==0 );
if( pToken && pToken->n ){
- sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n);
+ sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n);
}
length = width = 0;
break;
@@ -26262,10 +27898,10 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
assert( bArgList==0 );
assert( k>=0 && k<pSrc->nSrc );
if( pItem->zDatabase ){
- sqlite3StrAccumAppendAll(pAccum, pItem->zDatabase);
- sqlite3StrAccumAppend(pAccum, ".", 1);
+ sqlite3_str_appendall(pAccum, pItem->zDatabase);
+ sqlite3_str_append(pAccum, ".", 1);
}
- sqlite3StrAccumAppendAll(pAccum, pItem->zName);
+ sqlite3_str_appendall(pAccum, pItem->zName);
length = width = 0;
break;
}
@@ -26277,15 +27913,18 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
/*
** The text of the conversion is pointed to by "bufpt" and is
** "length" characters long. The field width is "width". Do
- ** the output.
+ ** the output. Both length and width are in bytes, not characters,
+ ** at this point. If the "!" flag was present on string conversions
+ ** indicating that width and precision should be expressed in characters,
+ ** then the values have been translated prior to reaching this point.
*/
width -= length;
if( width>0 ){
- if( !flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' ');
- sqlite3StrAccumAppend(pAccum, bufpt, length);
- if( flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' ');
+ if( !flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' ');
+ sqlite3_str_append(pAccum, bufpt, length);
+ if( flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' ');
}else{
- sqlite3StrAccumAppend(pAccum, bufpt, length);
+ sqlite3_str_append(pAccum, bufpt, length);
}
if( zExtra ){
@@ -26306,13 +27945,13 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
char *zNew;
assert( p->nChar+(i64)N >= p->nAlloc ); /* Only called if really needed */
if( p->accError ){
- testcase(p->accError==STRACCUM_TOOBIG);
- testcase(p->accError==STRACCUM_NOMEM);
+ testcase(p->accError==SQLITE_TOOBIG);
+ testcase(p->accError==SQLITE_NOMEM);
return 0;
}
if( p->mxAlloc==0 ){
N = p->nAlloc - p->nChar - 1;
- setStrAccumError(p, STRACCUM_TOOBIG);
+ setStrAccumError(p, SQLITE_TOOBIG);
return N;
}else{
char *zOld = isMalloced(p) ? p->zText : 0;
@@ -26324,8 +27963,8 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
szNew += p->nChar;
}
if( szNew > p->mxAlloc ){
- sqlite3StrAccumReset(p);
- setStrAccumError(p, STRACCUM_TOOBIG);
+ sqlite3_str_reset(p);
+ setStrAccumError(p, SQLITE_TOOBIG);
return 0;
}else{
p->nAlloc = (int)szNew;
@@ -26342,8 +27981,8 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
p->nAlloc = sqlite3DbMallocSize(p->db, zNew);
p->printfFlags |= SQLITE_PRINTF_MALLOCED;
}else{
- sqlite3StrAccumReset(p);
- setStrAccumError(p, STRACCUM_NOMEM);
+ sqlite3_str_reset(p);
+ setStrAccumError(p, SQLITE_NOMEM);
return 0;
}
}
@@ -26353,7 +27992,7 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
/*
** Append N copies of character c to the given string buffer.
*/
-SQLITE_PRIVATE void sqlite3AppendChar(StrAccum *p, int N, char c){
+SQLITE_API void sqlite3_str_appendchar(sqlite3_str *p, int N, char c){
testcase( p->nChar + (i64)N > 0x7fffffff );
if( p->nChar+(i64)N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ){
return;
@@ -26365,9 +28004,9 @@ SQLITE_PRIVATE void sqlite3AppendChar(StrAccum *p, int N, char c){
** The StrAccum "p" is not large enough to accept N new bytes of z[].
** So enlarge if first, then do the append.
**
-** This is a helper routine to sqlite3StrAccumAppend() that does special-case
+** This is a helper routine to sqlite3_str_append() that does special-case
** work (enlarging the buffer) using tail recursion, so that the
-** sqlite3StrAccumAppend() routine can use fast calling semantics.
+** sqlite3_str_append() routine can use fast calling semantics.
*/
static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int N){
N = sqlite3StrAccumEnlarge(p, N);
@@ -26381,7 +28020,7 @@ static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int N){
** Append N bytes of text from z to the StrAccum object. Increase the
** size of the memory allocation for StrAccum if necessary.
*/
-SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
+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 );
@@ -26398,8 +28037,8 @@ SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
/*
** Append the complete text of zero-terminated string z[] to the p string.
*/
-SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){
- sqlite3StrAccumAppend(p, z, sqlite3Strlen30(z));
+SQLITE_API void sqlite3_str_appendall(sqlite3_str *p, const char *z){
+ sqlite3_str_append(p, z, sqlite3Strlen30(z));
}
@@ -26416,7 +28055,7 @@ static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){
memcpy(zText, p->zText, p->nChar+1);
p->printfFlags |= SQLITE_PRINTF_MALLOCED;
}else{
- setStrAccumError(p, STRACCUM_NOMEM);
+ setStrAccumError(p, SQLITE_NOMEM);
}
p->zText = zText;
return zText;
@@ -26432,13 +28071,55 @@ SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){
}
/*
+** This singleton is an sqlite3_str object that is returned if
+** sqlite3_malloc() fails to provide space for a real one. This
+** sqlite3_str object accepts no new text and always returns
+** an SQLITE_NOMEM error.
+*/
+static sqlite3_str sqlite3OomStr = {
+ 0, 0, 0, 0, 0, SQLITE_NOMEM, 0
+};
+
+/* Finalize a string created using sqlite3_str_new().
+*/
+SQLITE_API char *sqlite3_str_finish(sqlite3_str *p){
+ char *z;
+ if( p!=0 && p!=&sqlite3OomStr ){
+ z = sqlite3StrAccumFinish(p);
+ sqlite3_free(p);
+ }else{
+ z = 0;
+ }
+ return z;
+}
+
+/* Return any error code associated with p */
+SQLITE_API int sqlite3_str_errcode(sqlite3_str *p){
+ return p ? p->accError : SQLITE_NOMEM;
+}
+
+/* Return the current length of p in bytes */
+SQLITE_API int sqlite3_str_length(sqlite3_str *p){
+ return p ? p->nChar : 0;
+}
+
+/* Return the current value for p */
+SQLITE_API char *sqlite3_str_value(sqlite3_str *p){
+ if( p==0 || p->nChar==0 ) return 0;
+ p->zText[p->nChar] = 0;
+ return p->zText;
+}
+
+/*
** Reset an StrAccum string. Reclaim all malloced memory.
*/
-SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum *p){
+SQLITE_API void sqlite3_str_reset(StrAccum *p){
if( isMalloced(p) ){
sqlite3DbFree(p->db, p->zText);
p->printfFlags &= ~SQLITE_PRINTF_MALLOCED;
}
+ p->nAlloc = 0;
+ p->nChar = 0;
p->zText = 0;
}
@@ -26466,6 +28147,18 @@ SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum *p, sqlite3 *db, char *zBase, i
p->printfFlags = 0;
}
+/* Allocate and initialize a new dynamic string object */
+SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3 *db){
+ sqlite3_str *p = sqlite3_malloc64(sizeof(*p));
+ if( p ){
+ sqlite3StrAccumInit(p, 0, 0, 0,
+ db ? db->aLimit[SQLITE_LIMIT_LENGTH] : SQLITE_MAX_LENGTH);
+ }else{
+ p = &sqlite3OomStr;
+ }
+ return p;
+}
+
/*
** Print into memory obtained from sqliteMalloc(). Use the internal
** %-conversion extensions.
@@ -26478,9 +28171,9 @@ SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list a
sqlite3StrAccumInit(&acc, db, zBase, sizeof(zBase),
db->aLimit[SQLITE_LIMIT_LENGTH]);
acc.printfFlags = SQLITE_PRINTF_INTERNAL;
- sqlite3VXPrintf(&acc, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
z = sqlite3StrAccumFinish(&acc);
- if( acc.accError==STRACCUM_NOMEM ){
+ if( acc.accError==SQLITE_NOMEM ){
sqlite3OomFault(db);
}
return z;
@@ -26518,7 +28211,7 @@ SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){
if( sqlite3_initialize() ) return 0;
#endif
sqlite3StrAccumInit(&acc, 0, zBase, sizeof(zBase), SQLITE_MAX_LENGTH);
- sqlite3VXPrintf(&acc, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
z = sqlite3StrAccumFinish(&acc);
return z;
}
@@ -26563,7 +28256,7 @@ SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_li
}
#endif
sqlite3StrAccumInit(&acc, 0, zBuf, n, 0);
- sqlite3VXPrintf(&acc, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
zBuf[acc.nChar] = 0;
return zBuf;
}
@@ -26585,7 +28278,7 @@ SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){
** allocate memory because it might be called while the memory allocator
** mutex is held.
**
-** sqlite3VXPrintf() might ask for *temporary* memory allocations for
+** sqlite3_str_vappendf() might ask for *temporary* memory allocations for
** certain format characters (%q) or for very large precisions or widths.
** Care must be taken that any sqlite3_log() calls that occur while the
** memory mutex is held do not use these mechanisms.
@@ -26595,7 +28288,7 @@ static void renderLogMsg(int iErrCode, const char *zFormat, va_list ap){
char zMsg[SQLITE_PRINT_BUF_SIZE*3]; /* Complete log message */
sqlite3StrAccumInit(&acc, 0, zMsg, sizeof(zMsg), 0);
- sqlite3VXPrintf(&acc, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
sqlite3GlobalConfig.xLog(sqlite3GlobalConfig.pLogArg, iErrCode,
sqlite3StrAccumFinish(&acc));
}
@@ -26624,23 +28317,30 @@ SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){
char zBuf[500];
sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
va_start(ap,zFormat);
- sqlite3VXPrintf(&acc, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
va_end(ap);
sqlite3StrAccumFinish(&acc);
+#ifdef SQLITE_OS_TRACE_PROC
+ {
+ extern void SQLITE_OS_TRACE_PROC(const char *zBuf, int nBuf);
+ SQLITE_OS_TRACE_PROC(zBuf, sizeof(zBuf));
+ }
+#else
fprintf(stdout,"%s", zBuf);
fflush(stdout);
+#endif
}
#endif
/*
-** variable-argument wrapper around sqlite3VXPrintf(). The bFlags argument
+** variable-argument wrapper around sqlite3_str_vappendf(). The bFlags argument
** can contain the bit SQLITE_PRINTF_INTERNAL enable internal formats.
*/
-SQLITE_PRIVATE void sqlite3XPrintf(StrAccum *p, const char *zFormat, ...){
+SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){
va_list ap;
va_start(ap,zFormat);
- sqlite3VXPrintf(p, zFormat, ap);
+ sqlite3_str_vappendf(p, zFormat, ap);
va_end(ap);
}
@@ -26706,15 +28406,17 @@ static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){
sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
if( p ){
for(i=0; i<p->iLevel && i<sizeof(p->bLine)-1; i++){
- sqlite3StrAccumAppend(&acc, p->bLine[i] ? "| " : " ", 4);
+ sqlite3_str_append(&acc, p->bLine[i] ? "| " : " ", 4);
}
- sqlite3StrAccumAppend(&acc, p->bLine[i] ? "|-- " : "'-- ", 4);
+ sqlite3_str_append(&acc, p->bLine[i] ? "|-- " : "'-- ", 4);
+ }
+ if( zFormat!=0 ){
+ va_start(ap, zFormat);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
+ va_end(ap);
+ assert( acc.nChar>0 );
+ sqlite3_str_append(&acc, "\n", 1);
}
- va_start(ap, zFormat);
- sqlite3VXPrintf(&acc, zFormat, ap);
- va_end(ap);
- assert( acc.nChar>0 );
- if( zBuf[acc.nChar-1]!='\n' ) sqlite3StrAccumAppend(&acc, "\n", 1);
sqlite3StrAccumFinish(&acc);
fprintf(stdout,"%s", zBuf);
fflush(stdout);
@@ -26747,17 +28449,17 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m
char zLine[1000];
const struct Cte *pCte = &pWith->a[i];
sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0);
- sqlite3XPrintf(&x, "%s", pCte->zName);
+ sqlite3_str_appendf(&x, "%s", pCte->zName);
if( pCte->pCols && pCte->pCols->nExpr>0 ){
char cSep = '(';
int j;
for(j=0; j<pCte->pCols->nExpr; j++){
- sqlite3XPrintf(&x, "%c%s", cSep, pCte->pCols->a[j].zName);
+ sqlite3_str_appendf(&x, "%c%s", cSep, pCte->pCols->a[j].zName);
cSep = ',';
}
- sqlite3XPrintf(&x, ")");
+ sqlite3_str_appendf(&x, ")");
}
- sqlite3XPrintf(&x, " AS");
+ sqlite3_str_appendf(&x, " AS");
sqlite3StrAccumFinish(&x);
sqlite3TreeViewItem(pView, zLine, i<pWith->nCte-1);
sqlite3TreeViewSelect(pView, pCte->pSelect, 0);
@@ -26767,6 +28469,42 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m
}
}
+/*
+** Generate a human-readable description of a SrcList object.
+*/
+SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){
+ int i;
+ for(i=0; i<pSrc->nSrc; i++){
+ const struct SrcList_item *pItem = &pSrc->a[i];
+ StrAccum x;
+ char zLine[100];
+ sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0);
+ sqlite3_str_appendf(&x, "{%d,*}", pItem->iCursor);
+ if( pItem->zDatabase ){
+ sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName);
+ }else if( pItem->zName ){
+ sqlite3_str_appendf(&x, " %s", pItem->zName);
+ }
+ if( pItem->pTab ){
+ sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName);
+ }
+ if( pItem->zAlias ){
+ sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias);
+ }
+ if( pItem->fg.jointype & JT_LEFT ){
+ sqlite3_str_appendf(&x, " LEFT-JOIN");
+ }
+ sqlite3StrAccumFinish(&x);
+ sqlite3TreeViewItem(pView, zLine, i<pSrc->nSrc-1);
+ if( pItem->pSelect ){
+ sqlite3TreeViewSelect(pView, pItem->pSelect, 0);
+ }
+ if( pItem->fg.isTabFunc ){
+ sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:");
+ }
+ sqlite3TreeViewPop(pView);
+ }
+}
/*
** Generate a human-readable description of a Select object.
@@ -26785,9 +28523,11 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
sqlite3TreeViewPush(pView, 1);
}
do{
- sqlite3TreeViewLine(pView, "SELECT%s%s (0x%p) selFlags=0x%x nSelectRow=%d",
+ sqlite3TreeViewLine(pView,
+ "SELECT%s%s (%u/%p) selFlags=0x%x nSelectRow=%d",
((p->selFlags & SF_Distinct) ? " DISTINCT" : ""),
- ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), p, p->selFlags,
+ ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""),
+ p->selId, p, p->selFlags,
(int)p->nSelectRow
);
if( cnt++ ) sqlite3TreeViewPop(pView);
@@ -26801,43 +28541,27 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
if( p->pHaving ) n++;
if( p->pOrderBy ) n++;
if( p->pLimit ) n++;
- if( p->pOffset ) n++;
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( p->pWin ) n++;
+ if( p->pWinDefn ) n++;
+#endif
}
sqlite3TreeViewExprList(pView, p->pEList, (n--)>0, "result-set");
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( p->pWin ){
+ Window *pX;
+ pView = sqlite3TreeViewPush(pView, (n--)>0);
+ sqlite3TreeViewLine(pView, "window-functions");
+ for(pX=p->pWin; pX; pX=pX->pNextWin){
+ sqlite3TreeViewWinFunc(pView, pX, pX->pNextWin!=0);
+ }
+ sqlite3TreeViewPop(pView);
+ }
+#endif
if( p->pSrc && p->pSrc->nSrc ){
- int i;
pView = sqlite3TreeViewPush(pView, (n--)>0);
sqlite3TreeViewLine(pView, "FROM");
- for(i=0; i<p->pSrc->nSrc; i++){
- struct SrcList_item *pItem = &p->pSrc->a[i];
- StrAccum x;
- char zLine[100];
- sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0);
- sqlite3XPrintf(&x, "{%d,*}", pItem->iCursor);
- if( pItem->zDatabase ){
- sqlite3XPrintf(&x, " %s.%s", pItem->zDatabase, pItem->zName);
- }else if( pItem->zName ){
- sqlite3XPrintf(&x, " %s", pItem->zName);
- }
- if( pItem->pTab ){
- sqlite3XPrintf(&x, " tabname=%Q", pItem->pTab->zName);
- }
- if( pItem->zAlias ){
- sqlite3XPrintf(&x, " (AS %s)", pItem->zAlias);
- }
- if( pItem->fg.jointype & JT_LEFT ){
- sqlite3XPrintf(&x, " LEFT-JOIN");
- }
- sqlite3StrAccumFinish(&x);
- sqlite3TreeViewItem(pView, zLine, i<p->pSrc->nSrc-1);
- if( pItem->pSelect ){
- sqlite3TreeViewSelect(pView, pItem->pSelect, 0);
- }
- if( pItem->fg.isTabFunc ){
- sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:");
- }
- sqlite3TreeViewPop(pView);
- }
+ sqlite3TreeViewSrcList(pView, p->pSrc);
sqlite3TreeViewPop(pView);
}
if( p->pWhere ){
@@ -26853,17 +28577,27 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
sqlite3TreeViewExpr(pView, p->pHaving, 0);
sqlite3TreeViewPop(pView);
}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( p->pWinDefn ){
+ Window *pX;
+ sqlite3TreeViewItem(pView, "WINDOW", (n--)>0);
+ for(pX=p->pWinDefn; pX; pX=pX->pNextWin){
+ sqlite3TreeViewWindow(pView, pX, pX->pNextWin!=0);
+ }
+ sqlite3TreeViewPop(pView);
+ }
+#endif
if( p->pOrderBy ){
sqlite3TreeViewExprList(pView, p->pOrderBy, (n--)>0, "ORDERBY");
}
if( p->pLimit ){
sqlite3TreeViewItem(pView, "LIMIT", (n--)>0);
- sqlite3TreeViewExpr(pView, p->pLimit, 0);
- sqlite3TreeViewPop(pView);
- }
- if( p->pOffset ){
- sqlite3TreeViewItem(pView, "OFFSET", (n--)>0);
- sqlite3TreeViewExpr(pView, p->pOffset, 0);
+ sqlite3TreeViewExpr(pView, p->pLimit->pLeft, p->pLimit->pRight!=0);
+ if( p->pLimit->pRight ){
+ sqlite3TreeViewItem(pView, "OFFSET", (n--)>0);
+ sqlite3TreeViewExpr(pView, p->pLimit->pRight, 0);
+ sqlite3TreeViewPop(pView);
+ }
sqlite3TreeViewPop(pView);
}
if( p->pPrior ){
@@ -26880,6 +28614,83 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
sqlite3TreeViewPop(pView);
}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+/*
+** Generate a description of starting or stopping bounds
+*/
+SQLITE_PRIVATE void sqlite3TreeViewBound(
+ TreeView *pView, /* View context */
+ u8 eBound, /* UNBOUNDED, CURRENT, PRECEDING, FOLLOWING */
+ Expr *pExpr, /* Value for PRECEDING or FOLLOWING */
+ u8 moreToFollow /* True if more to follow */
+){
+ switch( eBound ){
+ case TK_UNBOUNDED: {
+ sqlite3TreeViewItem(pView, "UNBOUNDED", moreToFollow);
+ sqlite3TreeViewPop(pView);
+ break;
+ }
+ case TK_CURRENT: {
+ sqlite3TreeViewItem(pView, "CURRENT", moreToFollow);
+ sqlite3TreeViewPop(pView);
+ break;
+ }
+ case TK_PRECEDING: {
+ sqlite3TreeViewItem(pView, "PRECEDING", moreToFollow);
+ sqlite3TreeViewExpr(pView, pExpr, 0);
+ sqlite3TreeViewPop(pView);
+ break;
+ }
+ case TK_FOLLOWING: {
+ sqlite3TreeViewItem(pView, "FOLLOWING", moreToFollow);
+ sqlite3TreeViewExpr(pView, pExpr, 0);
+ sqlite3TreeViewPop(pView);
+ break;
+ }
+ }
+}
+#endif /* SQLITE_OMIT_WINDOWFUNC */
+
+#ifndef SQLITE_OMIT_WINDOWFUNC
+/*
+** Generate a human-readable explanation for a Window object
+*/
+SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){
+ pView = sqlite3TreeViewPush(pView, more);
+ if( pWin->zName ){
+ sqlite3TreeViewLine(pView, "OVER %s", pWin->zName);
+ }else{
+ sqlite3TreeViewLine(pView, "OVER");
+ }
+ if( pWin->pPartition ){
+ sqlite3TreeViewExprList(pView, pWin->pPartition, 1, "PARTITION-BY");
+ }
+ if( pWin->pOrderBy ){
+ sqlite3TreeViewExprList(pView, pWin->pOrderBy, 1, "ORDER-BY");
+ }
+ if( pWin->eType ){
+ sqlite3TreeViewItem(pView, pWin->eType==TK_RANGE ? "RANGE" : "ROWS", 0);
+ sqlite3TreeViewBound(pView, pWin->eStart, pWin->pStart, 1);
+ sqlite3TreeViewBound(pView, pWin->eEnd, pWin->pEnd, 0);
+ sqlite3TreeViewPop(pView);
+ }
+ sqlite3TreeViewPop(pView);
+}
+#endif /* SQLITE_OMIT_WINDOWFUNC */
+
+#ifndef SQLITE_OMIT_WINDOWFUNC
+/*
+** Generate a human-readable explanation for a Window Function object
+*/
+SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView *pView, const Window *pWin, u8 more){
+ pView = sqlite3TreeViewPush(pView, more);
+ sqlite3TreeViewLine(pView, "WINFUNC %s(%d)",
+ pWin->pFunc->zName, pWin->pFunc->nArg);
+ sqlite3TreeViewWindow(pView, pWin, 0);
+ sqlite3TreeViewPop(pView);
+}
+#endif /* SQLITE_OMIT_WINDOWFUNC */
+
/*
** Generate a human-readable explanation of an expression tree.
*/
@@ -26917,6 +28728,9 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
sqlite3TreeViewLine(pView, "{%d:%d}%s",
pExpr->iTable, pExpr->iColumn, zFlgs);
}
+ if( ExprHasProperty(pExpr, EP_FixedCol) ){
+ sqlite3TreeViewExpr(pView, pExpr->pLeft, 0);
+ }
break;
}
case TK_INTEGER: {
@@ -26941,6 +28755,11 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
sqlite3TreeViewLine(pView,"NULL");
break;
}
+ case TK_TRUEFALSE: {
+ sqlite3TreeViewLine(pView,
+ sqlite3ExprTruthValue(pExpr) ? "TRUE" : "FALSE");
+ break;
+ }
#ifndef SQLITE_OMIT_BLOB_LITERAL
case TK_BLOB: {
sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken);
@@ -26997,6 +28816,19 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
case TK_ISNULL: zUniOp = "ISNULL"; break;
case TK_NOTNULL: zUniOp = "NOTNULL"; break;
+ case TK_TRUTH: {
+ int x;
+ const char *azOp[] = {
+ "IS-FALSE", "IS-TRUE", "IS-NOT-FALSE", "IS-NOT-TRUE"
+ };
+ assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT );
+ assert( pExpr->pRight );
+ assert( pExpr->pRight->op==TK_TRUEFALSE );
+ x = (pExpr->op2==TK_ISNOT)*2 + sqlite3ExprTruthValue(pExpr->pRight);
+ zUniOp = azOp[x];
+ break;
+ }
+
case TK_SPAN: {
sqlite3TreeViewLine(pView, "SPAN %Q", pExpr->u.zToken);
sqlite3TreeViewExpr(pView, pExpr->pLeft, 0);
@@ -27012,10 +28844,17 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
case TK_AGG_FUNCTION:
case TK_FUNCTION: {
ExprList *pFarg; /* List of function arguments */
+ Window *pWin;
if( ExprHasProperty(pExpr, EP_TokenOnly) ){
pFarg = 0;
+ pWin = 0;
}else{
pFarg = pExpr->x.pList;
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ pWin = pExpr->y.pWin;
+#else
+ pWin = 0;
+#endif
}
if( pExpr->op==TK_AGG_FUNCTION ){
sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q",
@@ -27024,8 +28863,13 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
sqlite3TreeViewLine(pView, "FUNCTION %Q", pExpr->u.zToken);
}
if( pFarg ){
- sqlite3TreeViewExprList(pView, pFarg, 0, 0);
+ sqlite3TreeViewExprList(pView, pFarg, pWin!=0, 0);
}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( pWin ){
+ sqlite3TreeViewWindow(pView, pWin, 0);
+ }
+#endif
break;
}
#ifndef SQLITE_OMIT_SUBQUERY
@@ -27156,12 +29000,25 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList(
sqlite3TreeViewLine(pView, "%s", zLabel);
for(i=0; i<pList->nExpr; i++){
int j = pList->a[i].u.x.iOrderByCol;
- if( j ){
- sqlite3TreeViewPush(pView, 0);
- sqlite3TreeViewLine(pView, "iOrderByCol=%d", j);
+ char *zName = pList->a[i].zName;
+ int moreToFollow = i<pList->nExpr - 1;
+ if( j || zName ){
+ sqlite3TreeViewPush(pView, moreToFollow);
+ moreToFollow = 0;
+ sqlite3TreeViewLine(pView, 0);
+ if( zName ){
+ fprintf(stdout, "AS %s ", zName);
+ }
+ if( j ){
+ fprintf(stdout, "iOrderByCol=%d", j);
+ }
+ fprintf(stdout, "\n");
+ fflush(stdout);
+ }
+ sqlite3TreeViewExpr(pView, pList->a[i].pExpr, moreToFollow);
+ if( j || zName ){
+ sqlite3TreeViewPop(pView);
}
- sqlite3TreeViewExpr(pView, pList->a[i].pExpr, i<pList->nExpr-1);
- if( j ) sqlite3TreeViewPop(pView);
}
}
}
@@ -28452,6 +30309,45 @@ SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){
}
/*
+** Compute 10 to the E-th power. Examples: E==1 results in 10.
+** E==2 results in 100. E==50 results in 1.0e50.
+**
+** This routine only works for values of E between 1 and 341.
+*/
+static LONGDOUBLE_TYPE sqlite3Pow10(int E){
+#if defined(_MSC_VER)
+ static const LONGDOUBLE_TYPE x[] = {
+ 1.0e+001,
+ 1.0e+002,
+ 1.0e+004,
+ 1.0e+008,
+ 1.0e+016,
+ 1.0e+032,
+ 1.0e+064,
+ 1.0e+128,
+ 1.0e+256
+ };
+ LONGDOUBLE_TYPE r = 1.0;
+ int i;
+ assert( E>=0 && E<=307 );
+ for(i=0; E!=0; i++, E >>=1){
+ if( E & 1 ) r *= x[i];
+ }
+ return r;
+#else
+ LONGDOUBLE_TYPE x = 10.0;
+ LONGDOUBLE_TYPE r = 1.0;
+ while(1){
+ if( E & 1 ) r *= x;
+ E >>= 1;
+ if( E==0 ) break;
+ x *= x;
+ }
+ return r;
+#endif
+}
+
+/*
** The string z[] is an text representation of a real number.
** Convert this string to a double and write it into *pResult.
**
@@ -28518,12 +30414,12 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en
/* copy max significant digits to significand */
while( z<zEnd && sqlite3Isdigit(*z) && s<((LARGEST_INT64-9)/10) ){
s = s*10 + (*z - '0');
- z+=incr, nDigits++;
+ z+=incr; nDigits++;
}
/* skip non-significant significand digits
** (increase exponent by d to shift decimal left) */
- while( z<zEnd && sqlite3Isdigit(*z) ) z+=incr, nDigits++, d++;
+ while( z<zEnd && sqlite3Isdigit(*z) ){ z+=incr; nDigits++; d++; }
if( z>=zEnd ) goto do_atof_calc;
/* if decimal point is present */
@@ -28536,7 +30432,7 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en
s = s*10 + (*z - '0');
d--;
}
- z+=incr, nDigits++;
+ z+=incr; nDigits++;
}
}
if( z>=zEnd ) goto do_atof_calc;
@@ -28606,11 +30502,10 @@ do_atof_calc:
if( e==0 ){ /*OPTIMIZATION-IF-TRUE*/
result = (double)s;
}else{
- LONGDOUBLE_TYPE scale = 1.0;
/* attempt to handle extremely small/large numbers better */
if( e>307 ){ /*OPTIMIZATION-IF-TRUE*/
if( e<342 ){ /*OPTIMIZATION-IF-TRUE*/
- while( e%308 ) { scale *= 1.0e+1; e -= 1; }
+ LONGDOUBLE_TYPE scale = sqlite3Pow10(e-308);
if( esign<0 ){
result = s / scale;
result /= 1.0e+308;
@@ -28630,10 +30525,7 @@ do_atof_calc:
}
}
}else{
- /* 1.0e+22 is the largest power of 10 than can be
- ** represented exactly. */
- while( e%22 ) { scale *= 1.0e+1; e -= 1; }
- while( e>0 ) { scale *= 1.0e+22; e -= 22; }
+ LONGDOUBLE_TYPE scale = sqlite3Pow10(e);
if( esign<0 ){
result = s / scale;
}else{
@@ -28691,7 +30583,7 @@ static int compare2pow63(const char *zNum, int incr){
** Returns:
**
** 0 Successful transformation. Fits in a 64-bit signed integer.
-** 1 Excess text after the integer value
+** 1 Excess non-space text after the integer value
** 2 Integer too large for a 64-bit signed integer or is malformed
** 3 Special case of 9223372036854775808
**
@@ -28734,47 +30626,57 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc
for(i=0; &zNum[i]<zEnd && (c=zNum[i])>='0' && c<='9'; i+=incr){
u = u*10 + c - '0';
}
+ testcase( i==18*incr );
+ testcase( i==19*incr );
+ testcase( i==20*incr );
if( u>LARGEST_INT64 ){
+ /* This test and assignment is needed only to suppress UB warnings
+ ** from clang and -fsanitize=undefined. This test and assignment make
+ ** the code a little larger and slower, and no harm comes from omitting
+ ** them, but we must appaise the undefined-behavior pharisees. */
*pNum = neg ? SMALLEST_INT64 : LARGEST_INT64;
}else if( neg ){
*pNum = -(i64)u;
}else{
*pNum = (i64)u;
}
- testcase( i==18 );
- testcase( i==19 );
- testcase( i==20 );
- if( &zNum[i]<zEnd /* Extra bytes at the end */
- || (i==0 && zStart==zNum) /* No digits */
+ rc = 0;
+ if( (i==0 && zStart==zNum) /* No digits */
|| nonNum /* UTF16 with high-order bytes non-zero */
){
rc = 1;
- }else{
- rc = 0;
+ }else if( &zNum[i]<zEnd ){ /* Extra bytes at the end */
+ int jj = i;
+ do{
+ if( !sqlite3Isspace(zNum[jj]) ){
+ rc = 1; /* Extra non-space text after the integer */
+ break;
+ }
+ jj += incr;
+ }while( &zNum[jj]<zEnd );
}
- if( i>19*incr ){ /* Too many digits */
- /* zNum is empty or contains non-numeric text or is longer
- ** than 19 digits (thus guaranteeing that it is too large) */
- return 2;
- }else if( i<19*incr ){
+ if( i<19*incr ){
/* Less than 19 digits, so we know that it fits in 64 bits */
assert( u<=LARGEST_INT64 );
return rc;
}else{
/* zNum is a 19-digit numbers. Compare it against 9223372036854775808. */
- c = compare2pow63(zNum, incr);
+ c = i>19*incr ? 1 : compare2pow63(zNum, incr);
if( c<0 ){
/* zNum is less than 9223372036854775808 so it fits */
assert( u<=LARGEST_INT64 );
return rc;
- }else if( c>0 ){
- /* zNum is greater than 9223372036854775808 so it overflows */
- return 2;
}else{
- /* zNum is exactly 9223372036854775808. Fits if negative. The
- ** special case 2 overflow if positive */
- assert( u-1==LARGEST_INT64 );
- return neg ? rc : 3;
+ *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64;
+ if( c>0 ){
+ /* zNum is greater than 9223372036854775808 so it overflows */
+ return 2;
+ }else{
+ /* zNum is exactly 9223372036854775808. Fits if negative. The
+ ** special case 2 overflow if positive */
+ assert( u-1==LARGEST_INT64 );
+ return neg ? rc : 3;
+ }
}
}
}
@@ -29777,6 +31679,20 @@ 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; i<n; i++){
+ /* Knuth multiplicative hashing. (Sorting & Searching, p. 510).
+ ** 0x9e3779b1 is 2654435761 which is the closest prime number to
+ ** (2**32)*golden_ratio, where golden_ratio = (sqrt(5) - 1)/2. */
+ h += sqlite3UpperToLower[z[i]];
+ h *= 0x9e3779b1;
+ }
+ return h;
+}
+#endif /* SQLITE_ENABLE_NORMALIZE */
/* Link pNew element into the hash table pH. If pEntry!=0 then also
@@ -29888,6 +31804,40 @@ static HashElem *findElementWithHash(
}
return &nullElement;
}
+#ifdef SQLITE_ENABLE_NORMALIZE
+static HashElem *findElementWithHashN(
+ const Hash *pH, /* The pH to be searched */
+ const char *pKey, /* The key we are searching for */
+ int nKey, /* Number of key bytes to use */
+ unsigned int *pHash /* Write the hash value here */
+){
+ HashElem *elem; /* Used to loop thru the element list */
+ int count; /* Number of elements left to test */
+ unsigned int h; /* The computed hash */
+ static HashElem nullElement = { 0, 0, 0, 0 };
+
+ if( pH->ht ){ /*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.
@@ -29932,6 +31882,14 @@ 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".
@@ -29999,52 +31957,52 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
/* 1 */ "AutoCommit" OpHelp(""),
/* 2 */ "Transaction" OpHelp(""),
/* 3 */ "SorterNext" OpHelp(""),
- /* 4 */ "PrevIfOpen" OpHelp(""),
- /* 5 */ "NextIfOpen" OpHelp(""),
- /* 6 */ "Prev" OpHelp(""),
- /* 7 */ "Next" OpHelp(""),
- /* 8 */ "Checkpoint" OpHelp(""),
- /* 9 */ "JournalMode" OpHelp(""),
- /* 10 */ "Vacuum" OpHelp(""),
- /* 11 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"),
- /* 12 */ "VUpdate" OpHelp("data=r[P3@P2]"),
- /* 13 */ "Goto" OpHelp(""),
- /* 14 */ "Gosub" OpHelp(""),
- /* 15 */ "InitCoroutine" OpHelp(""),
- /* 16 */ "Yield" OpHelp(""),
- /* 17 */ "MustBeInt" OpHelp(""),
- /* 18 */ "Jump" OpHelp(""),
+ /* 4 */ "Prev" OpHelp(""),
+ /* 5 */ "Next" OpHelp(""),
+ /* 6 */ "Checkpoint" OpHelp(""),
+ /* 7 */ "JournalMode" OpHelp(""),
+ /* 8 */ "Vacuum" OpHelp(""),
+ /* 9 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"),
+ /* 10 */ "VUpdate" OpHelp("data=r[P3@P2]"),
+ /* 11 */ "Goto" OpHelp(""),
+ /* 12 */ "Gosub" OpHelp(""),
+ /* 13 */ "InitCoroutine" OpHelp(""),
+ /* 14 */ "Yield" OpHelp(""),
+ /* 15 */ "MustBeInt" OpHelp(""),
+ /* 16 */ "Jump" OpHelp(""),
+ /* 17 */ "Once" OpHelp(""),
+ /* 18 */ "If" OpHelp(""),
/* 19 */ "Not" OpHelp("r[P2]= !r[P1]"),
- /* 20 */ "Once" OpHelp(""),
- /* 21 */ "If" OpHelp(""),
- /* 22 */ "IfNot" OpHelp(""),
- /* 23 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"),
- /* 24 */ "SeekLT" OpHelp("key=r[P3@P4]"),
- /* 25 */ "SeekLE" OpHelp("key=r[P3@P4]"),
- /* 26 */ "SeekGE" OpHelp("key=r[P3@P4]"),
- /* 27 */ "SeekGT" OpHelp("key=r[P3@P4]"),
- /* 28 */ "NoConflict" OpHelp("key=r[P3@P4]"),
- /* 29 */ "NotFound" OpHelp("key=r[P3@P4]"),
- /* 30 */ "Found" OpHelp("key=r[P3@P4]"),
- /* 31 */ "SeekRowid" OpHelp("intkey=r[P3]"),
- /* 32 */ "NotExists" OpHelp("intkey=r[P3]"),
- /* 33 */ "Last" OpHelp(""),
- /* 34 */ "IfSmaller" OpHelp(""),
- /* 35 */ "SorterSort" OpHelp(""),
- /* 36 */ "Sort" OpHelp(""),
- /* 37 */ "Rewind" OpHelp(""),
- /* 38 */ "IdxLE" OpHelp("key=r[P3@P4]"),
- /* 39 */ "IdxGT" OpHelp("key=r[P3@P4]"),
- /* 40 */ "IdxLT" OpHelp("key=r[P3@P4]"),
- /* 41 */ "IdxGE" OpHelp("key=r[P3@P4]"),
- /* 42 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"),
+ /* 20 */ "IfNot" OpHelp(""),
+ /* 21 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"),
+ /* 22 */ "SeekLT" OpHelp("key=r[P3@P4]"),
+ /* 23 */ "SeekLE" OpHelp("key=r[P3@P4]"),
+ /* 24 */ "SeekGE" OpHelp("key=r[P3@P4]"),
+ /* 25 */ "SeekGT" OpHelp("key=r[P3@P4]"),
+ /* 26 */ "IfNoHope" OpHelp("key=r[P3@P4]"),
+ /* 27 */ "NoConflict" OpHelp("key=r[P3@P4]"),
+ /* 28 */ "NotFound" OpHelp("key=r[P3@P4]"),
+ /* 29 */ "Found" OpHelp("key=r[P3@P4]"),
+ /* 30 */ "SeekRowid" OpHelp("intkey=r[P3]"),
+ /* 31 */ "NotExists" OpHelp("intkey=r[P3]"),
+ /* 32 */ "Last" OpHelp(""),
+ /* 33 */ "IfSmaller" OpHelp(""),
+ /* 34 */ "SorterSort" OpHelp(""),
+ /* 35 */ "Sort" OpHelp(""),
+ /* 36 */ "Rewind" OpHelp(""),
+ /* 37 */ "IdxLE" OpHelp("key=r[P3@P4]"),
+ /* 38 */ "IdxGT" OpHelp("key=r[P3@P4]"),
+ /* 39 */ "IdxLT" OpHelp("key=r[P3@P4]"),
+ /* 40 */ "IdxGE" OpHelp("key=r[P3@P4]"),
+ /* 41 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"),
+ /* 42 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"),
/* 43 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"),
/* 44 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"),
- /* 45 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"),
- /* 46 */ "Program" OpHelp(""),
- /* 47 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"),
- /* 48 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"),
- /* 49 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"),
+ /* 45 */ "Program" OpHelp(""),
+ /* 46 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"),
+ /* 47 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"),
+ /* 48 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"),
+ /* 49 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"),
/* 50 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"),
/* 51 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"),
/* 52 */ "Ne" OpHelp("IF r[P3]!=r[P1]"),
@@ -30054,115 +32012,121 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
/* 56 */ "Lt" OpHelp("IF r[P3]<r[P1]"),
/* 57 */ "Ge" OpHelp("IF r[P3]>=r[P1]"),
/* 58 */ "ElseNotEq" OpHelp(""),
- /* 59 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"),
- /* 60 */ "IncrVacuum" OpHelp(""),
- /* 61 */ "VNext" OpHelp(""),
- /* 62 */ "Init" OpHelp("Start at P2"),
- /* 63 */ "Return" OpHelp(""),
- /* 64 */ "EndCoroutine" OpHelp(""),
- /* 65 */ "HaltIfNull" OpHelp("if r[P3]=null halt"),
- /* 66 */ "Halt" OpHelp(""),
- /* 67 */ "Integer" OpHelp("r[P2]=P1"),
- /* 68 */ "Int64" OpHelp("r[P2]=P4"),
- /* 69 */ "String" OpHelp("r[P2]='P4' (len=P1)"),
- /* 70 */ "Null" OpHelp("r[P2..P3]=NULL"),
- /* 71 */ "SoftNull" OpHelp("r[P1]=NULL"),
- /* 72 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"),
- /* 73 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"),
- /* 74 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"),
- /* 75 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"),
- /* 76 */ "SCopy" OpHelp("r[P2]=r[P1]"),
- /* 77 */ "IntCopy" OpHelp("r[P2]=r[P1]"),
- /* 78 */ "ResultRow" OpHelp("output=r[P1@P2]"),
- /* 79 */ "CollSeq" OpHelp(""),
- /* 80 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"),
- /* 81 */ "RealAffinity" OpHelp(""),
- /* 82 */ "Cast" OpHelp("affinity(r[P1])"),
- /* 83 */ "Permutation" OpHelp(""),
- /* 84 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"),
- /* 85 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"),
- /* 86 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<<r[P1]"),
- /* 87 */ "ShiftRight" OpHelp("r[P3]=r[P2]>>r[P1]"),
- /* 88 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"),
- /* 89 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"),
- /* 90 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"),
- /* 91 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"),
- /* 92 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"),
- /* 93 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"),
- /* 94 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"),
- /* 95 */ "BitNot" OpHelp("r[P1]= ~r[P1]"),
- /* 96 */ "Column" OpHelp("r[P3]=PX"),
- /* 97 */ "String8" OpHelp("r[P2]='P4'"),
- /* 98 */ "Affinity" OpHelp("affinity(r[P1@P2])"),
- /* 99 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"),
- /* 100 */ "Count" OpHelp("r[P2]=count()"),
- /* 101 */ "ReadCookie" OpHelp(""),
- /* 102 */ "SetCookie" OpHelp(""),
- /* 103 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"),
- /* 104 */ "OpenRead" OpHelp("root=P2 iDb=P3"),
- /* 105 */ "OpenWrite" OpHelp("root=P2 iDb=P3"),
- /* 106 */ "OpenDup" OpHelp(""),
- /* 107 */ "OpenAutoindex" OpHelp("nColumn=P2"),
- /* 108 */ "OpenEphemeral" OpHelp("nColumn=P2"),
- /* 109 */ "SorterOpen" OpHelp(""),
- /* 110 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"),
- /* 111 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"),
- /* 112 */ "Close" OpHelp(""),
- /* 113 */ "ColumnsUsed" OpHelp(""),
- /* 114 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"),
- /* 115 */ "NewRowid" OpHelp("r[P2]=rowid"),
- /* 116 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"),
- /* 117 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"),
- /* 118 */ "Delete" OpHelp(""),
- /* 119 */ "ResetCount" OpHelp(""),
- /* 120 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"),
- /* 121 */ "SorterData" OpHelp("r[P2]=data"),
- /* 122 */ "RowData" OpHelp("r[P2]=data"),
- /* 123 */ "Rowid" OpHelp("r[P2]=rowid"),
- /* 124 */ "NullRow" OpHelp(""),
- /* 125 */ "SeekEnd" OpHelp(""),
- /* 126 */ "SorterInsert" OpHelp("key=r[P2]"),
- /* 127 */ "IdxInsert" OpHelp("key=r[P2]"),
- /* 128 */ "IdxDelete" OpHelp("key=r[P2@P3]"),
- /* 129 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"),
- /* 130 */ "IdxRowid" OpHelp("r[P2]=rowid"),
- /* 131 */ "Destroy" OpHelp(""),
- /* 132 */ "Real" OpHelp("r[P2]=P4"),
- /* 133 */ "Clear" OpHelp(""),
- /* 134 */ "ResetSorter" OpHelp(""),
- /* 135 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"),
- /* 136 */ "SqlExec" OpHelp(""),
- /* 137 */ "ParseSchema" OpHelp(""),
- /* 138 */ "LoadAnalysis" OpHelp(""),
- /* 139 */ "DropTable" OpHelp(""),
- /* 140 */ "DropIndex" OpHelp(""),
- /* 141 */ "DropTrigger" OpHelp(""),
- /* 142 */ "IntegrityCk" OpHelp(""),
- /* 143 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"),
- /* 144 */ "Param" OpHelp(""),
- /* 145 */ "FkCounter" OpHelp("fkctr[P1]+=P2"),
- /* 146 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"),
- /* 147 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"),
- /* 148 */ "AggStep0" OpHelp("accum=r[P3] step(r[P2@P5])"),
- /* 149 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"),
- /* 150 */ "AggFinal" OpHelp("accum=r[P1] N=P2"),
- /* 151 */ "Expire" OpHelp(""),
- /* 152 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"),
- /* 153 */ "VBegin" OpHelp(""),
- /* 154 */ "VCreate" OpHelp(""),
- /* 155 */ "VDestroy" OpHelp(""),
- /* 156 */ "VOpen" OpHelp(""),
- /* 157 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"),
- /* 158 */ "VRename" OpHelp(""),
- /* 159 */ "Pagecount" OpHelp(""),
- /* 160 */ "MaxPgcnt" OpHelp(""),
- /* 161 */ "PureFunc0" OpHelp(""),
- /* 162 */ "Function0" OpHelp("r[P3]=func(r[P2@P5])"),
- /* 163 */ "PureFunc" OpHelp(""),
- /* 164 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"),
- /* 165 */ "CursorHint" OpHelp(""),
- /* 166 */ "Noop" OpHelp(""),
- /* 167 */ "Explain" OpHelp(""),
+ /* 59 */ "IncrVacuum" OpHelp(""),
+ /* 60 */ "VNext" OpHelp(""),
+ /* 61 */ "Init" OpHelp("Start at P2"),
+ /* 62 */ "PureFunc0" OpHelp(""),
+ /* 63 */ "Function0" OpHelp("r[P3]=func(r[P2@P5])"),
+ /* 64 */ "PureFunc" OpHelp(""),
+ /* 65 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"),
+ /* 66 */ "Return" OpHelp(""),
+ /* 67 */ "EndCoroutine" OpHelp(""),
+ /* 68 */ "HaltIfNull" OpHelp("if r[P3]=null halt"),
+ /* 69 */ "Halt" OpHelp(""),
+ /* 70 */ "Integer" OpHelp("r[P2]=P1"),
+ /* 71 */ "Int64" OpHelp("r[P2]=P4"),
+ /* 72 */ "String" OpHelp("r[P2]='P4' (len=P1)"),
+ /* 73 */ "Null" OpHelp("r[P2..P3]=NULL"),
+ /* 74 */ "SoftNull" OpHelp("r[P1]=NULL"),
+ /* 75 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"),
+ /* 76 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"),
+ /* 77 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"),
+ /* 78 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"),
+ /* 79 */ "SCopy" OpHelp("r[P2]=r[P1]"),
+ /* 80 */ "IntCopy" OpHelp("r[P2]=r[P1]"),
+ /* 81 */ "ResultRow" OpHelp("output=r[P1@P2]"),
+ /* 82 */ "CollSeq" OpHelp(""),
+ /* 83 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"),
+ /* 84 */ "RealAffinity" OpHelp(""),
+ /* 85 */ "Cast" OpHelp("affinity(r[P1])"),
+ /* 86 */ "Permutation" OpHelp(""),
+ /* 87 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"),
+ /* 88 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"),
+ /* 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]"),
+ /* 95 */ "ShiftRight" 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"),
+ /* 111 */ "OpenDup" OpHelp(""),
+ /* 112 */ "OpenAutoindex" OpHelp("nColumn=P2"),
+ /* 113 */ "OpenEphemeral" OpHelp("nColumn=P2"),
+ /* 114 */ "SorterOpen" OpHelp(""),
+ /* 115 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"),
+ /* 116 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"),
+ /* 117 */ "Close" OpHelp(""),
+ /* 118 */ "ColumnsUsed" OpHelp(""),
+ /* 119 */ "SeekHit" OpHelp("seekHit=P2"),
+ /* 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(""),
};
return azName[i];
}
@@ -30308,12 +32272,10 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
#define SQLITE_FSFLAGS_IS_MSDOS 0x1
/*
-** If we are to be thread-safe, include the pthreads header and define
-** the SQLITE_UNIX_THREADS macro.
+** If we are to be thread-safe, include the pthreads header.
*/
#if SQLITE_THREADSAFE
/* # include <pthread.h> */
-# define SQLITE_UNIX_THREADS 1
#endif
/*
@@ -30401,6 +32363,9 @@ struct unixFile {
#if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__)
unsigned fsFlags; /* cached details from statfs() */
#endif
+#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+ unsigned iBusyTimeout; /* Wait this many millisec on locks */
+#endif
#if OS_VXWORKS
struct vxworksFileId *pId; /* Unique file ID */
#endif
@@ -30838,7 +32803,11 @@ static struct unix_syscall {
#endif
#define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent)
+#if defined(HAVE_FCHOWN)
{ "geteuid", (sqlite3_syscall_ptr)geteuid, 0 },
+#else
+ { "geteuid", (sqlite3_syscall_ptr)0, 0 },
+#endif
#define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent)
#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0
@@ -30853,7 +32822,7 @@ static struct unix_syscall {
#else
{ "munmap", (sqlite3_syscall_ptr)0, 0 },
#endif
-#define osMunmap ((void*(*)(void*,size_t))aSyscall[23].pCurrent)
+#define osMunmap ((int(*)(void*,size_t))aSyscall[23].pCurrent)
#if HAVE_MREMAP && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)
{ "mremap", (sqlite3_syscall_ptr)mremap, 0 },
@@ -30883,7 +32852,15 @@ static struct unix_syscall {
#endif
#define osLstat ((int(*)(const char*,struct stat*))aSyscall[27].pCurrent)
+#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE)
+# ifdef __ANDROID__
+ { "ioctl", (sqlite3_syscall_ptr)(int(*)(int, int, ...))ioctl, 0 },
+# else
{ "ioctl", (sqlite3_syscall_ptr)ioctl, 0 },
+# endif
+#else
+ { "ioctl", (sqlite3_syscall_ptr)0, 0 },
+#endif
#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent)
}; /* End of the overrideable system calls */
@@ -31061,16 +33038,30 @@ static int robust_open(const char *z, int f, mode_t m){
** unixEnterMutex()
** assert( unixMutexHeld() );
** unixEnterLeave()
+**
+** To prevent deadlock, the global unixBigLock must must be acquired
+** before the unixInodeInfo.pLockMutex mutex, if both are held. It is
+** OK to get the pLockMutex without holding unixBigLock first, but if
+** that happens, the unixBigLock mutex must not be acquired until after
+** pLockMutex is released.
+**
+** OK: enter(unixBigLock), enter(pLockInfo)
+** OK: enter(unixBigLock)
+** OK: enter(pLockInfo)
+** ERROR: enter(pLockInfo), enter(unixBigLock)
*/
+static sqlite3_mutex *unixBigLock = 0;
static void unixEnterMutex(void){
- sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ assert( sqlite3_mutex_notheld(unixBigLock) ); /* Not a recursive mutex */
+ sqlite3_mutex_enter(unixBigLock);
}
static void unixLeaveMutex(void){
- sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ assert( sqlite3_mutex_held(unixBigLock) );
+ sqlite3_mutex_leave(unixBigLock);
}
#ifdef SQLITE_DEBUG
static int unixMutexHeld(void) {
- return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ return sqlite3_mutex_held(unixBigLock);
}
#endif
@@ -31460,22 +33451,39 @@ struct unixFileId {
/*
** An instance of the following structure is allocated for each open
-** inode. Or, on LinuxThreads, there is one of these structures for
-** each inode opened by each thread.
+** inode.
**
** A single inode can have multiple file descriptors, so each unixFile
** structure contains a pointer to an instance of this object and this
** object keeps a count of the number of unixFile pointing to it.
+**
+** Mutex rules:
+**
+** (1) Only the pLockMutex mutex must be held in order to read or write
+** any of the locking fields:
+** nShared, nLock, eFileLock, bProcessLock, pUnused
+**
+** (2) When nRef>0, then the following fields are unchanging and can
+** be read (but not written) without holding any mutex:
+** fileId, pLockMutex
+**
+** (3) With the exceptions above, all the fields may only be read
+** or written while holding the global unixBigLock mutex.
+**
+** Deadlock prevention: The global unixBigLock mutex may not
+** be acquired while holding the pLockMutex mutex. If both unixBigLock
+** and pLockMutex are needed, then unixBigLock must be acquired first.
*/
struct unixInodeInfo {
struct unixFileId fileId; /* The lookup key */
- int nShared; /* Number of SHARED locks held */
- unsigned char eFileLock; /* One of SHARED_LOCK, RESERVED_LOCK etc. */
- unsigned char bProcessLock; /* An exclusive process lock is held */
+ sqlite3_mutex *pLockMutex; /* Hold this mutex for... */
+ int nShared; /* Number of SHARED locks held */
+ int nLock; /* Number of outstanding file locks */
+ unsigned char eFileLock; /* One of SHARED_LOCK, RESERVED_LOCK etc. */
+ unsigned char bProcessLock; /* An exclusive process lock is held */
+ UnixUnusedFd *pUnused; /* Unused file descriptors to close */
int nRef; /* Number of pointers to this structure */
unixShmNode *pShmNode; /* Shared memory associated with this inode */
- int nLock; /* Number of outstanding file locks */
- UnixUnusedFd *pUnused; /* Unused file descriptors to close */
unixInodeInfo *pNext; /* List of all unixInodeInfo objects */
unixInodeInfo *pPrev; /* .... doubly linked */
#if SQLITE_ENABLE_LOCKING_STYLE
@@ -31489,9 +33497,26 @@ struct unixInodeInfo {
/*
** A lists of all unixInodeInfo objects.
+**
+** Must hold unixBigLock in order to read or write this variable.
*/
static unixInodeInfo *inodeList = 0; /* All unixInodeInfo objects */
-static unsigned int nUnusedFd = 0; /* Total unused file descriptors */
+
+#ifdef SQLITE_DEBUG
+/*
+** True if the inode mutex (on the unixFile.pFileMutex field) is held, or not.
+** This routine is used only within assert() to help verify correct mutex
+** usage.
+*/
+int unixFileMutexHeld(unixFile *pFile){
+ assert( pFile->pInode );
+ return sqlite3_mutex_held(pFile->pInode->pLockMutex);
+}
+int unixFileMutexNotheld(unixFile *pFile){
+ assert( pFile->pInode );
+ return sqlite3_mutex_notheld(pFile->pInode->pLockMutex);
+}
+#endif
/*
**
@@ -31597,11 +33622,11 @@ static void closePendingFds(unixFile *pFile){
unixInodeInfo *pInode = pFile->pInode;
UnixUnusedFd *p;
UnixUnusedFd *pNext;
+ assert( unixFileMutexHeld(pFile) );
for(p=pInode->pUnused; p; p=pNext){
pNext = p->pNext;
robust_close(pFile, p->fd, __LINE__);
sqlite3_free(p);
- nUnusedFd--;
}
pInode->pUnused = 0;
}
@@ -31609,17 +33634,20 @@ static void closePendingFds(unixFile *pFile){
/*
** Release a unixInodeInfo structure previously allocated by findInodeInfo().
**
-** The mutex entered using the unixEnterMutex() function must be held
-** when this function is called.
+** The global mutex must be held when this routine is called, but the mutex
+** on the inode being deleted must NOT be held.
*/
static void releaseInodeInfo(unixFile *pFile){
unixInodeInfo *pInode = pFile->pInode;
assert( unixMutexHeld() );
+ assert( unixFileMutexNotheld(pFile) );
if( ALWAYS(pInode) ){
pInode->nRef--;
if( pInode->nRef==0 ){
assert( pInode->pShmNode==0 );
+ sqlite3_mutex_enter(pInode->pLockMutex);
closePendingFds(pFile);
+ sqlite3_mutex_leave(pInode->pLockMutex);
if( pInode->pPrev ){
assert( pInode->pPrev->pNext==pInode );
pInode->pPrev->pNext = pInode->pNext;
@@ -31631,10 +33659,10 @@ static void releaseInodeInfo(unixFile *pFile){
assert( pInode->pNext->pPrev==pInode );
pInode->pNext->pPrev = pInode->pPrev;
}
+ sqlite3_mutex_free(pInode->pLockMutex);
sqlite3_free(pInode);
}
}
- assert( inodeList!=0 || nUnusedFd==0 );
}
/*
@@ -31642,8 +33670,7 @@ static void releaseInodeInfo(unixFile *pFile){
** describes that file descriptor. Create a new one if necessary. The
** return value might be uninitialized if an error occurs.
**
-** The mutex entered using the unixEnterMutex() function must be held
-** when this function is called.
+** The global mutex must held when calling this routine.
**
** Return an appropriate error code.
*/
@@ -31704,7 +33731,7 @@ static int findInodeInfo(
#else
fileId.ino = (u64)statbuf.st_ino;
#endif
- assert( inodeList!=0 || nUnusedFd==0 );
+ assert( unixMutexHeld() );
pInode = inodeList;
while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){
pInode = pInode->pNext;
@@ -31716,7 +33743,15 @@ static int findInodeInfo(
}
memset(pInode, 0, sizeof(*pInode));
memcpy(&pInode->fileId, &fileId, sizeof(fileId));
+ if( sqlite3GlobalConfig.bCoreMutex ){
+ pInode->pLockMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
+ if( pInode->pLockMutex==0 ){
+ sqlite3_free(pInode);
+ return SQLITE_NOMEM_BKPT;
+ }
+ }
pInode->nRef = 1;
+ assert( unixMutexHeld() );
pInode->pNext = inodeList;
pInode->pPrev = 0;
if( inodeList ) inodeList->pPrev = pInode;
@@ -31794,7 +33829,7 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){
assert( pFile );
assert( pFile->eFileLock<=SHARED_LOCK );
- unixEnterMutex(); /* Because pFile->pInode is shared across threads */
+ sqlite3_mutex_enter(pFile->pInode->pLockMutex);
/* Check if a thread in this process holds such a lock */
if( pFile->pInode->eFileLock>SHARED_LOCK ){
@@ -31819,7 +33854,7 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){
}
#endif
- unixLeaveMutex();
+ sqlite3_mutex_leave(pFile->pInode->pLockMutex);
OSTRACE(("TEST WR-LOCK %d %d %d (unix)\n", pFile->h, rc, reserved));
*pResOut = reserved;
@@ -31827,6 +33862,43 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){
}
/*
+** Set a posix-advisory-lock.
+**
+** There are two versions of this routine. If compiled with
+** SQLITE_ENABLE_SETLK_TIMEOUT then the routine has an extra parameter
+** which is a pointer to a unixFile. If the unixFile->iBusyTimeout
+** value is set, then it is the number of milliseconds to wait before
+** failing the lock. The iBusyTimeout value is always reset back to
+** zero on each call.
+**
+** If SQLITE_ENABLE_SETLK_TIMEOUT is not defined, then do a non-blocking
+** attempt to set the lock.
+*/
+#ifndef SQLITE_ENABLE_SETLK_TIMEOUT
+# define osSetPosixAdvisoryLock(h,x,t) osFcntl(h,F_SETLK,x)
+#else
+static int osSetPosixAdvisoryLock(
+ int h, /* The file descriptor on which to take the lock */
+ struct flock *pLock, /* The description of the lock */
+ unixFile *pFile /* Structure holding timeout value */
+){
+ int rc = osFcntl(h,F_SETLK,pLock);
+ while( rc<0 && pFile->iBusyTimeout>0 ){
+ /* On systems that support some kind of blocking file lock with a timeout,
+ ** make appropriate changes here to invoke that blocking file lock. On
+ ** generic posix, however, there is no such API. So we simply try the
+ ** lock once every millisecond until either the timeout expires, or until
+ ** the lock is obtained. */
+ usleep(1000);
+ rc = osFcntl(h,F_SETLK,pLock);
+ pFile->iBusyTimeout--;
+ }
+ return rc;
+}
+#endif /* SQLITE_ENABLE_SETLK_TIMEOUT */
+
+
+/*
** Attempt to set a system-lock on the file pFile. The lock is
** described by pLock.
**
@@ -31848,8 +33920,8 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){
static int unixFileLock(unixFile *pFile, struct flock *pLock){
int rc;
unixInodeInfo *pInode = pFile->pInode;
- assert( unixMutexHeld() );
assert( pInode!=0 );
+ assert( sqlite3_mutex_held(pInode->pLockMutex) );
if( (pFile->ctrlFlags & (UNIXFILE_EXCL|UNIXFILE_RDONLY))==UNIXFILE_EXCL ){
if( pInode->bProcessLock==0 ){
struct flock lock;
@@ -31858,7 +33930,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){
lock.l_start = SHARED_FIRST;
lock.l_len = SHARED_SIZE;
lock.l_type = F_WRLCK;
- rc = osFcntl(pFile->h, F_SETLK, &lock);
+ rc = osSetPosixAdvisoryLock(pFile->h, &lock, pFile);
if( rc<0 ) return rc;
pInode->bProcessLock = 1;
pInode->nLock++;
@@ -31866,7 +33938,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){
rc = 0;
}
}else{
- rc = osFcntl(pFile->h, F_SETLK, pLock);
+ rc = osSetPosixAdvisoryLock(pFile->h, pLock, pFile);
}
return rc;
}
@@ -31968,8 +34040,8 @@ static int unixLock(sqlite3_file *id, int eFileLock){
/* This mutex is needed because pFile->pInode is shared across threads
*/
- unixEnterMutex();
pInode = pFile->pInode;
+ sqlite3_mutex_enter(pInode->pLockMutex);
/* If some thread using this PID has a lock via a different unixFile*
** handle that precludes the requested lock, return BUSY.
@@ -32112,7 +34184,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){
}
end_lock:
- unixLeaveMutex();
+ sqlite3_mutex_leave(pInode->pLockMutex);
OSTRACE(("LOCK %d %s %s (unix)\n", pFile->h, azFileLock(eFileLock),
rc==SQLITE_OK ? "ok" : "failed"));
return rc;
@@ -32125,11 +34197,11 @@ end_lock:
static void setPendingFd(unixFile *pFile){
unixInodeInfo *pInode = pFile->pInode;
UnixUnusedFd *p = pFile->pPreallocatedUnused;
+ assert( unixFileMutexHeld(pFile) );
p->pNext = pInode->pUnused;
pInode->pUnused = p;
pFile->h = -1;
pFile->pPreallocatedUnused = 0;
- nUnusedFd++;
}
/*
@@ -32160,8 +34232,8 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){
if( pFile->eFileLock<=eFileLock ){
return SQLITE_OK;
}
- unixEnterMutex();
pInode = pFile->pInode;
+ sqlite3_mutex_enter(pInode->pLockMutex);
assert( pInode->nShared!=0 );
if( pFile->eFileLock>SHARED_LOCK ){
assert( pInode->eFileLock==pFile->eFileLock );
@@ -32287,14 +34359,14 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){
*/
pInode->nLock--;
assert( pInode->nLock>=0 );
- if( pInode->nLock==0 ){
- closePendingFds(pFile);
- }
+ if( pInode->nLock==0 ) closePendingFds(pFile);
}
end_unlock:
- unixLeaveMutex();
- if( rc==SQLITE_OK ) pFile->eFileLock = eFileLock;
+ sqlite3_mutex_leave(pInode->pLockMutex);
+ if( rc==SQLITE_OK ){
+ pFile->eFileLock = eFileLock;
+ }
return rc;
}
@@ -32365,15 +34437,20 @@ static int closeUnixFile(sqlite3_file *id){
static int unixClose(sqlite3_file *id){
int rc = SQLITE_OK;
unixFile *pFile = (unixFile *)id;
+ unixInodeInfo *pInode = pFile->pInode;
+
+ assert( pInode!=0 );
verifyDbFile(pFile);
unixUnlock(id, NO_LOCK);
+ assert( unixFileMutexNotheld(pFile) );
unixEnterMutex();
/* unixFile.pInode is always valid here. Otherwise, a different close
** routine (e.g. nolockClose()) would be called instead.
*/
assert( pFile->pInode->nLock>0 || pFile->pInode->bProcessLock==0 );
- if( ALWAYS(pFile->pInode) && pFile->pInode->nLock ){
+ sqlite3_mutex_enter(pInode->pLockMutex);
+ if( pInode->nLock ){
/* If there are outstanding locks, do not actually close the file just
** yet because that would clear those locks. Instead, add the file
** descriptor to pInode->pUnused list. It will be automatically closed
@@ -32381,6 +34458,7 @@ static int unixClose(sqlite3_file *id){
*/
setPendingFd(pFile);
}
+ sqlite3_mutex_leave(pInode->pLockMutex);
releaseInodeInfo(pFile);
rc = closeUnixFile(id);
unixLeaveMutex();
@@ -32978,6 +35056,7 @@ static int semXClose(sqlite3_file *id) {
unixFile *pFile = (unixFile*)id;
semXUnlock(id, NO_LOCK);
assert( pFile );
+ assert( unixFileMutexNotheld(pFile) );
unixEnterMutex();
releaseInodeInfo(pFile);
unixLeaveMutex();
@@ -33092,8 +35171,7 @@ static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){
*pResOut = 1;
return SQLITE_OK;
}
- unixEnterMutex(); /* Because pFile->pInode is shared across threads */
-
+ sqlite3_mutex_enter(pFile->pInode->pLockMutex);
/* Check if a thread in this process holds such a lock */
if( pFile->pInode->eFileLock>SHARED_LOCK ){
reserved = 1;
@@ -33117,7 +35195,7 @@ static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){
}
}
- unixLeaveMutex();
+ sqlite3_mutex_leave(pFile->pInode->pLockMutex);
OSTRACE(("TEST WR-LOCK %d %d %d (afp)\n", pFile->h, rc, reserved));
*pResOut = reserved;
@@ -33180,8 +35258,8 @@ static int afpLock(sqlite3_file *id, int eFileLock){
/* This mutex is needed because pFile->pInode is shared across threads
*/
- unixEnterMutex();
pInode = pFile->pInode;
+ sqlite3_mutex_enter(pInode->pLockMutex);
/* If some thread using this PID has a lock via a different unixFile*
** handle that precludes the requested lock, return BUSY.
@@ -33317,7 +35395,7 @@ static int afpLock(sqlite3_file *id, int eFileLock){
}
afp_end_lock:
- unixLeaveMutex();
+ sqlite3_mutex_leave(pInode->pLockMutex);
OSTRACE(("LOCK %d %s %s (afp)\n", pFile->h, azFileLock(eFileLock),
rc==SQLITE_OK ? "ok" : "failed"));
return rc;
@@ -33349,8 +35427,8 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) {
if( pFile->eFileLock<=eFileLock ){
return SQLITE_OK;
}
- unixEnterMutex();
pInode = pFile->pInode;
+ sqlite3_mutex_enter(pInode->pLockMutex);
assert( pInode->nShared!=0 );
if( pFile->eFileLock>SHARED_LOCK ){
assert( pInode->eFileLock==pFile->eFileLock );
@@ -33419,14 +35497,14 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) {
if( rc==SQLITE_OK ){
pInode->nLock--;
assert( pInode->nLock>=0 );
- if( pInode->nLock==0 ){
- closePendingFds(pFile);
- }
+ if( pInode->nLock==0 ) closePendingFds(pFile);
}
}
- unixLeaveMutex();
- if( rc==SQLITE_OK ) pFile->eFileLock = eFileLock;
+ sqlite3_mutex_leave(pInode->pLockMutex);
+ if( rc==SQLITE_OK ){
+ pFile->eFileLock = eFileLock;
+ }
return rc;
}
@@ -33438,14 +35516,20 @@ static int afpClose(sqlite3_file *id) {
unixFile *pFile = (unixFile*)id;
assert( id!=0 );
afpUnlock(id, NO_LOCK);
+ assert( unixFileMutexNotheld(pFile) );
unixEnterMutex();
- if( pFile->pInode && pFile->pInode->nLock ){
- /* If there are outstanding locks, do not actually close the file just
- ** yet because that would clear those locks. Instead, add the file
- ** descriptor to pInode->aPending. It will be automatically closed when
- ** the last lock is cleared.
- */
- setPendingFd(pFile);
+ if( pFile->pInode ){
+ unixInodeInfo *pInode = pFile->pInode;
+ sqlite3_mutex_enter(pInode->pLockMutex);
+ if( pInode->nLock ){
+ /* If there are outstanding locks, do not actually close the file just
+ ** yet because that would clear those locks. Instead, add the file
+ ** descriptor to pInode->aPending. It will be automatically closed when
+ ** the last lock is cleared.
+ */
+ setPendingFd(pFile);
+ }
+ sqlite3_mutex_leave(pInode->pLockMutex);
}
releaseInodeInfo(pFile);
sqlite3_free(pFile->lockingContext);
@@ -34100,7 +36184,7 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){
do{
err = osFallocate(pFile->h, buf.st_size, nSize-buf.st_size);
}while( err==EINTR );
- if( err ) return SQLITE_IOERR_WRITE;
+ if( err && err!=EINVAL ) return SQLITE_IOERR_WRITE;
#else
/* If the OS does not have posix_fallocate(), fake it. Write a
** single byte to the last byte in each block that falls entirely
@@ -34226,6 +36310,12 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){
*(int*)pArg = fileHasMoved(pFile);
return SQLITE_OK;
}
+#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+ case SQLITE_FCNTL_LOCK_TIMEOUT: {
+ pFile->iBusyTimeout = *(int*)pArg;
+ return SQLITE_OK;
+ }
+#endif
#if SQLITE_MAX_MMAP_SIZE>0
case SQLITE_FCNTL_MMAP_SIZE: {
i64 newLimit = *(i64*)pArg;
@@ -34316,7 +36406,7 @@ static void setDeviceCharacteristics(unixFile *pFile){
pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE;
pFile->deviceCharacteristics = 0;
if( fstatvfs(pFile->h, &fsInfo) == -1 ) {
- return pFile->sectorSize;
+ return;
}
if( !strcmp(fsInfo.f_basetype, "tmp") ) {
@@ -34459,21 +36549,22 @@ static int unixGetpagesize(void){
**
** The following fields are read-only after the object is created:
**
-** fid
+** hShm
** zFilename
**
-** Either unixShmNode.mutex must be held or unixShmNode.nRef==0 and
+** Either unixShmNode.pShmMutex must be held or unixShmNode.nRef==0 and
** unixMutexHeld() is true when reading or writing any other field
** in this structure.
*/
struct unixShmNode {
unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */
- sqlite3_mutex *mutex; /* Mutex to access this object */
+ sqlite3_mutex *pShmMutex; /* Mutex to access this object */
char *zFilename; /* Name of the mmapped file */
- int h; /* Open file descriptor */
+ int hShm; /* Open file descriptor */
int szRegion; /* Size of shared-memory regions */
u16 nRegion; /* Size of array apRegion */
u8 isReadonly; /* True if read-only */
+ u8 isUnlocked; /* True if no DMS lock held */
char **apRegion; /* Array of mapped shared-memory regions */
int nRef; /* Number of unixShm objects pointing to this */
unixShm *pFirst; /* All unixShm objects pointing to this */
@@ -34491,16 +36582,16 @@ struct unixShmNode {
** The following fields are initialized when this object is created and
** are read-only thereafter:
**
-** unixShm.pFile
+** unixShm.pShmNode
** unixShm.id
**
-** All other fields are read/write. The unixShm.pFile->mutex must be held
-** while accessing any read/write fields.
+** All other fields are read/write. The unixShm.pShmNode->pShmMutex must
+** be held while accessing any read/write fields.
*/
struct unixShm {
unixShmNode *pShmNode; /* The underlying unixShmNode object */
unixShm *pNext; /* Next unixShm with the same unixShmNode */
- u8 hasMutex; /* True if holding the unixShmNode mutex */
+ u8 hasMutex; /* True if holding the unixShmNode->pShmMutex */
u8 id; /* Id of this connection within its unixShmNode */
u16 sharedMask; /* Mask of shared locks held */
u16 exclMask; /* Mask of exclusive locks held */
@@ -34530,7 +36621,8 @@ static int unixShmSystemLock(
/* Access to the unixShmNode object is serialized by the caller */
pShmNode = pFile->pInode->pShmNode;
- assert( sqlite3_mutex_held(pShmNode->mutex) || pShmNode->nRef==0 );
+ assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->pShmMutex) );
+ assert( pShmNode->nRef>0 || unixMutexHeld() );
/* Shared locks never span more than one byte */
assert( n==1 || lockType!=F_RDLCK );
@@ -34538,15 +36630,13 @@ static int unixShmSystemLock(
/* Locks are within range */
assert( n>=1 && n<=SQLITE_SHM_NLOCK );
- if( pShmNode->h>=0 ){
+ if( pShmNode->hShm>=0 ){
/* Initialize the locking parameters */
- memset(&f, 0, sizeof(f));
f.l_type = lockType;
f.l_whence = SEEK_SET;
f.l_start = ofst;
f.l_len = n;
-
- rc = osFcntl(pShmNode->h, F_SETLK, &f);
+ rc = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile);
rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY;
}
@@ -34618,18 +36708,18 @@ static void unixShmPurge(unixFile *pFd){
int nShmPerMap = unixShmRegionPerMap();
int i;
assert( p->pInode==pFd->pInode );
- sqlite3_mutex_free(p->mutex);
+ sqlite3_mutex_free(p->pShmMutex);
for(i=0; i<p->nRegion; i+=nShmPerMap){
- if( p->h>=0 ){
+ if( p->hShm>=0 ){
osMunmap(p->apRegion[i], p->szRegion);
}else{
sqlite3_free(p->apRegion[i]);
}
}
sqlite3_free(p->apRegion);
- if( p->h>=0 ){
- robust_close(pFd, p->h, __LINE__);
- p->h = -1;
+ if( p->hShm>=0 ){
+ robust_close(pFd, p->hShm, __LINE__);
+ p->hShm = -1;
}
p->pInode->pShmNode = 0;
sqlite3_free(p);
@@ -34637,6 +36727,69 @@ static void unixShmPurge(unixFile *pFd){
}
/*
+** The DMS lock has not yet been taken on shm file pShmNode. Attempt to
+** take it now. Return SQLITE_OK if successful, or an SQLite error
+** code otherwise.
+**
+** If the DMS cannot be locked because this is a readonly_shm=1
+** connection and no other process already holds a lock, return
+** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1.
+*/
+static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){
+ struct flock lock;
+ int rc = SQLITE_OK;
+
+ /* Use F_GETLK to determine the locks other processes are holding
+ ** on the DMS byte. If it indicates that another process is holding
+ ** a SHARED lock, then this process may also take a SHARED lock
+ ** and proceed with opening the *-shm file.
+ **
+ ** Or, if no other process is holding any lock, then this process
+ ** is the first to open it. In this case take an EXCLUSIVE lock on the
+ ** DMS byte and truncate the *-shm file to zero bytes in size. Then
+ ** downgrade to a SHARED lock on the DMS byte.
+ **
+ ** If another process is holding an EXCLUSIVE lock on the DMS byte,
+ ** return SQLITE_BUSY to the caller (it will try again). An earlier
+ ** version of this code attempted the SHARED lock at this point. But
+ ** this introduced a subtle race condition: if the process holding
+ ** EXCLUSIVE failed just before truncating the *-shm file, then this
+ ** process might open and use the *-shm file without truncating it.
+ ** And if the *-shm file has been corrupted by a power failure or
+ ** system crash, the database itself may also become corrupt. */
+ lock.l_whence = SEEK_SET;
+ lock.l_start = UNIX_SHM_DMS;
+ lock.l_len = 1;
+ lock.l_type = F_WRLCK;
+ if( osFcntl(pShmNode->hShm, F_GETLK, &lock)!=0 ) {
+ rc = SQLITE_IOERR_LOCK;
+ }else if( lock.l_type==F_UNLCK ){
+ if( pShmNode->isReadonly ){
+ pShmNode->isUnlocked = 1;
+ rc = SQLITE_READONLY_CANTINIT;
+ }else{
+ rc = unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1);
+ /* The first connection to attach must truncate the -shm file. We
+ ** truncate to 3 bytes (an arbitrary small number, less than the
+ ** -shm header size) rather than 0 as a system debugging aid, to
+ ** help detect if a -shm file truncation is legitimate or is the work
+ ** or a rogue process. */
+ if( rc==SQLITE_OK && robust_ftruncate(pShmNode->hShm, 3) ){
+ rc = unixLogError(SQLITE_IOERR_SHMOPEN,"ftruncate",pShmNode->zFilename);
+ }
+ }
+ }else if( lock.l_type==F_WRLCK ){
+ rc = SQLITE_BUSY;
+ }
+
+ if( rc==SQLITE_OK ){
+ assert( lock.l_type==F_UNLCK || lock.l_type==F_RDLCK );
+ rc = unixShmSystemLock(pDbFd, F_RDLCK, UNIX_SHM_DMS, 1);
+ }
+ return rc;
+}
+
+/*
** Open a shared-memory area associated with open database file pDbFd.
** This particular implementation uses mmapped files.
**
@@ -34674,9 +36827,9 @@ static void unixShmPurge(unixFile *pFd){
static int unixOpenSharedMemory(unixFile *pDbFd){
struct unixShm *p = 0; /* The connection to be opened */
struct unixShmNode *pShmNode; /* The underlying mmapped file */
- int rc; /* Result code */
+ int rc = SQLITE_OK; /* Result code */
unixInodeInfo *pInode; /* The inode of fd */
- char *zShmFilename; /* Name of the file used for SHM */
+ char *zShm; /* Name of the file used for SHM */
int nShmFilename; /* Size of the SHM filename in bytes */
/* Allocate space for the new unixShm object. */
@@ -34688,6 +36841,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
/* Check to see if a unixShmNode object already exists. Reuse an existing
** one if present. Create a new one if necessary.
*/
+ assert( unixFileMutexNotheld(pDbFd) );
unixEnterMutex();
pInode = pDbFd->pInode;
pShmNode = pInode->pShmNode;
@@ -34717,57 +36871,47 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
goto shm_open_err;
}
memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename);
- zShmFilename = pShmNode->zFilename = (char*)&pShmNode[1];
+ zShm = pShmNode->zFilename = (char*)&pShmNode[1];
#ifdef SQLITE_SHM_DIRECTORY
- sqlite3_snprintf(nShmFilename, zShmFilename,
+ sqlite3_snprintf(nShmFilename, zShm,
SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x",
(u32)sStat.st_ino, (u32)sStat.st_dev);
#else
- sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", zBasePath);
- sqlite3FileSuffix3(pDbFd->zPath, zShmFilename);
+ sqlite3_snprintf(nShmFilename, zShm, "%s-shm", zBasePath);
+ sqlite3FileSuffix3(pDbFd->zPath, zShm);
#endif
- pShmNode->h = -1;
+ pShmNode->hShm = -1;
pDbFd->pInode->pShmNode = pShmNode;
pShmNode->pInode = pDbFd->pInode;
if( sqlite3GlobalConfig.bCoreMutex ){
- pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
- if( pShmNode->mutex==0 ){
+ pShmNode->pShmMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
+ if( pShmNode->pShmMutex==0 ){
rc = SQLITE_NOMEM_BKPT;
goto shm_open_err;
}
}
if( pInode->bProcessLock==0 ){
- int openFlags = O_RDWR | O_CREAT;
- if( sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
- openFlags = O_RDONLY;
- pShmNode->isReadonly = 1;
+ if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
+ pShmNode->hShm = robust_open(zShm, O_RDWR|O_CREAT,(sStat.st_mode&0777));
}
- pShmNode->h = robust_open(zShmFilename, openFlags, (sStat.st_mode&0777));
- if( pShmNode->h<0 ){
- rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShmFilename);
- goto shm_open_err;
+ if( pShmNode->hShm<0 ){
+ pShmNode->hShm = robust_open(zShm, O_RDONLY, (sStat.st_mode&0777));
+ if( pShmNode->hShm<0 ){
+ rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShm);
+ goto shm_open_err;
+ }
+ pShmNode->isReadonly = 1;
}
/* If this process is running as root, make sure that the SHM file
** is owned by the same user that owns the original database. Otherwise,
** the original owner will not be able to connect.
*/
- robustFchown(pShmNode->h, sStat.st_uid, sStat.st_gid);
-
- /* Check to see if another process is holding the dead-man switch.
- ** If not, truncate the file to zero length.
- */
- rc = SQLITE_OK;
- if( unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1)==SQLITE_OK ){
- if( robust_ftruncate(pShmNode->h, 0) ){
- rc = unixLogError(SQLITE_IOERR_SHMOPEN, "ftruncate", zShmFilename);
- }
- }
- if( rc==SQLITE_OK ){
- rc = unixShmSystemLock(pDbFd, F_RDLCK, UNIX_SHM_DMS, 1);
- }
- if( rc ) goto shm_open_err;
+ robustFchown(pShmNode->hShm, sStat.st_uid, sStat.st_gid);
+
+ rc = unixLockSharedMemory(pDbFd, pShmNode);
+ if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err;
}
}
@@ -34784,14 +36928,14 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
** the cover of the unixEnterMutex() mutex and the pointer from the
** new (struct unixShm) object to the pShmNode has been set. All that is
** left to do is to link the new object into the linked list starting
- ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex
- ** mutex.
+ ** at pShmNode->pFirst. This must be done while holding the
+ ** pShmNode->pShmMutex.
*/
- sqlite3_mutex_enter(pShmNode->mutex);
+ sqlite3_mutex_enter(pShmNode->pShmMutex);
p->pNext = pShmNode->pFirst;
pShmNode->pFirst = p;
- sqlite3_mutex_leave(pShmNode->mutex);
- return SQLITE_OK;
+ sqlite3_mutex_leave(pShmNode->pShmMutex);
+ return rc;
/* Jump here on any error */
shm_open_err:
@@ -34842,11 +36986,16 @@ static int unixShmMap(
p = pDbFd->pShm;
pShmNode = p->pShmNode;
- sqlite3_mutex_enter(pShmNode->mutex);
+ sqlite3_mutex_enter(pShmNode->pShmMutex);
+ if( pShmNode->isUnlocked ){
+ rc = unixLockSharedMemory(pDbFd, pShmNode);
+ if( rc!=SQLITE_OK ) goto shmpage_out;
+ pShmNode->isUnlocked = 0;
+ }
assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
assert( pShmNode->pInode==pDbFd->pInode );
- assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 );
- assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 );
+ assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 );
+ assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 );
/* Minimum number of regions required to be mapped. */
nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap;
@@ -34858,12 +37007,12 @@ static int unixShmMap(
pShmNode->szRegion = szRegion;
- if( pShmNode->h>=0 ){
+ if( pShmNode->hShm>=0 ){
/* The requested region is not mapped into this processes address space.
** Check to see if it has been allocated (i.e. if the wal-index file is
** large enough to contain the requested region).
*/
- if( osFstat(pShmNode->h, &sStat) ){
+ if( osFstat(pShmNode->hShm, &sStat) ){
rc = SQLITE_IOERR_SHMSIZE;
goto shmpage_out;
}
@@ -34891,7 +37040,7 @@ static int unixShmMap(
assert( (nByte % pgsz)==0 );
for(iPg=(sStat.st_size/pgsz); iPg<(nByte/pgsz); iPg++){
int x = 0;
- if( seekAndWriteFd(pShmNode->h, iPg*pgsz + pgsz-1, "", 1, &x)!=1 ){
+ if( seekAndWriteFd(pShmNode->hShm, iPg*pgsz + pgsz-1,"",1,&x)!=1 ){
const char *zFile = pShmNode->zFilename;
rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile);
goto shmpage_out;
@@ -34914,22 +37063,22 @@ static int unixShmMap(
int nMap = szRegion*nShmPerMap;
int i;
void *pMem;
- if( pShmNode->h>=0 ){
+ if( pShmNode->hShm>=0 ){
pMem = osMmap(0, nMap,
pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE,
- MAP_SHARED, pShmNode->h, szRegion*(i64)pShmNode->nRegion
+ MAP_SHARED, pShmNode->hShm, szRegion*(i64)pShmNode->nRegion
);
if( pMem==MAP_FAILED ){
rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename);
goto shmpage_out;
}
}else{
- pMem = sqlite3_malloc64(szRegion);
+ pMem = sqlite3_malloc64(nMap);
if( pMem==0 ){
rc = SQLITE_NOMEM_BKPT;
goto shmpage_out;
}
- memset(pMem, 0, szRegion);
+ memset(pMem, 0, nMap);
}
for(i=0; i<nShmPerMap; i++){
@@ -34946,7 +37095,7 @@ shmpage_out:
*pp = 0;
}
if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY;
- sqlite3_mutex_leave(pShmNode->mutex);
+ sqlite3_mutex_leave(pShmNode->pShmMutex);
return rc;
}
@@ -34980,12 +37129,12 @@ static int unixShmLock(
|| flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED)
|| flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) );
assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 );
- assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 );
- assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 );
+ assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 );
+ assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 );
mask = (1<<(ofst+n)) - (1<<ofst);
assert( n>1 || mask==(1<<ofst) );
- sqlite3_mutex_enter(pShmNode->mutex);
+ sqlite3_mutex_enter(pShmNode->pShmMutex);
if( flags & SQLITE_SHM_UNLOCK ){
u16 allMask = 0; /* Mask of locks held by siblings */
@@ -35058,7 +37207,7 @@ static int unixShmLock(
}
}
}
- sqlite3_mutex_leave(pShmNode->mutex);
+ sqlite3_mutex_leave(pShmNode->pShmMutex);
OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n",
p->id, osGetpid(0), p->sharedMask, p->exclMask));
return rc;
@@ -35075,6 +37224,9 @@ static void unixShmBarrier(
){
UNUSED_PARAMETER(fd);
sqlite3MemoryBarrier(); /* compiler-defined memory barrier */
+ assert( fd->pMethods->xLock==nolockLock
+ || unixFileMutexNotheld((unixFile*)fd)
+ );
unixEnterMutex(); /* Also mutex, for redundancy */
unixLeaveMutex();
}
@@ -35105,22 +37257,23 @@ static int unixShmUnmap(
/* Remove connection p from the set of connections associated
** with pShmNode */
- sqlite3_mutex_enter(pShmNode->mutex);
+ sqlite3_mutex_enter(pShmNode->pShmMutex);
for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){}
*pp = p->pNext;
/* Free the connection p */
sqlite3_free(p);
pDbFd->pShm = 0;
- sqlite3_mutex_leave(pShmNode->mutex);
+ sqlite3_mutex_leave(pShmNode->pShmMutex);
/* If pShmNode->nRef has reached 0, then close the underlying
** shared-memory file, too */
+ assert( unixFileMutexNotheld(pDbFd) );
unixEnterMutex();
assert( pShmNode->nRef>0 );
pShmNode->nRef--;
if( pShmNode->nRef==0 ){
- if( deleteFlag && pShmNode->h>=0 ){
+ if( deleteFlag && pShmNode->hShm>=0 ){
osUnlink(pShmNode->zFilename);
}
unixShmPurge(pDbFd);
@@ -35442,7 +37595,7 @@ IOMETHODS(
IOMETHODS(
nolockIoFinder, /* Finder function name */
nolockIoMethods, /* sqlite3_io_methods object name */
- 3, /* shared memory is disabled */
+ 3, /* shared memory and mmap are enabled */
nolockClose, /* xClose method */
nolockLock, /* xLock method */
nolockUnlock, /* xUnlock method */
@@ -35938,7 +38091,7 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){
**
** Even if a subsequent open() call does succeed, the consequences of
** not searching for a reusable file descriptor are not dire. */
- if( nUnusedFd>0 && 0==osStat(zPath, &sStat) ){
+ if( inodeList!=0 && 0==osStat(zPath, &sStat) ){
unixInodeInfo *pInode;
pInode = inodeList;
@@ -35948,12 +38101,14 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){
}
if( pInode ){
UnixUnusedFd **pp;
+ assert( sqlite3_mutex_notheld(pInode->pLockMutex) );
+ sqlite3_mutex_enter(pInode->pLockMutex);
for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext));
pUnused = *pp;
if( pUnused ){
- nUnusedFd--;
*pp = pUnused->pNext;
}
+ sqlite3_mutex_leave(pInode->pLockMutex);
}
}
unixLeaveMutex();
@@ -36111,7 +38266,7 @@ static int unixOpen(
** a file-descriptor on the directory too. The first time unixSync()
** is called the directory file descriptor will be fsync()ed and close()d.
*/
- int syncDir = (isCreate && (
+ int isNewJrnl = (isCreate && (
eType==SQLITE_OPEN_MASTER_JOURNAL
|| eType==SQLITE_OPEN_MAIN_JOURNAL
|| eType==SQLITE_OPEN_WAL
@@ -36158,7 +38313,6 @@ static int unixOpen(
randomnessPid = osGetpid(0);
sqlite3_randomness(0,0);
}
-
memset(p, 0, sizeof(unixFile));
if( eType==SQLITE_OPEN_MAIN_DB ){
@@ -36181,7 +38335,7 @@ static int unixOpen(
}else if( !zName ){
/* If zName is NULL, the upper layer is requesting a temp file. */
- assert(isDelete && !syncDir);
+ assert(isDelete && !isNewJrnl);
rc = unixGetTempname(pVfs->mxPathname, zTmpname);
if( rc!=SQLITE_OK ){
return rc;
@@ -36216,17 +38370,24 @@ static int unixOpen(
fd = robust_open(zName, openFlags, openMode);
OSTRACE(("OPENX %-3d %s 0%o\n", fd, zName, openFlags));
assert( !isExclusive || (openFlags & O_CREAT)!=0 );
- if( fd<0 && errno!=EISDIR && isReadWrite ){
- /* Failed to open the file for read/write access. Try read-only. */
- flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
- openFlags &= ~(O_RDWR|O_CREAT);
- flags |= SQLITE_OPEN_READONLY;
- openFlags |= O_RDONLY;
- isReadonly = 1;
- fd = robust_open(zName, openFlags, openMode);
+ if( fd<0 ){
+ if( isNewJrnl && errno==EACCES && osAccess(zName, F_OK) ){
+ /* If unable to create a journal because the directory is not
+ ** writable, change the error code to indicate that. */
+ rc = SQLITE_READONLY_DIRECTORY;
+ }else if( errno!=EISDIR && isReadWrite ){
+ /* Failed to open the file for read/write access. Try read-only. */
+ flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
+ openFlags &= ~(O_RDWR|O_CREAT);
+ flags |= SQLITE_OPEN_READONLY;
+ openFlags |= O_RDONLY;
+ isReadonly = 1;
+ fd = robust_open(zName, openFlags, openMode);
+ }
}
if( fd<0 ){
- rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName);
+ int rc2 = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName);
+ if( rc==SQLITE_OK ) rc = rc2;
goto open_finished;
}
@@ -36286,7 +38447,7 @@ static int unixOpen(
if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY;
noLock = eType!=SQLITE_OPEN_MAIN_DB;
if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK;
- if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC;
+ if( isNewJrnl ) ctrlFlags |= UNIXFILE_DIRSYNC;
if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI;
#if SQLITE_ENABLE_LOCKING_STYLE
@@ -38026,6 +40187,7 @@ SQLITE_API int sqlite3_os_init(void){
for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){
sqlite3_vfs_register(&aVfs[i], i==0);
}
+ unixBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1);
return SQLITE_OK;
}
@@ -38037,6 +40199,7 @@ SQLITE_API int sqlite3_os_init(void){
** This routine is a no-op for unix.
*/
SQLITE_API int sqlite3_os_end(void){
+ unixBigLock = 0;
return SQLITE_OK;
}
@@ -38528,8 +40691,7 @@ struct winFile {
int nFetchOut; /* Number of outstanding xFetch references */
HANDLE hMap; /* Handle for accessing memory mapping */
void *pMapRegion; /* Area memory mapped */
- sqlite3_int64 mmapSize; /* Usable size of mapped region */
- sqlite3_int64 mmapSizeActual; /* Actual size of mapped region */
+ sqlite3_int64 mmapSize; /* Size of mapped region */
sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */
#endif
};
@@ -38560,22 +40722,6 @@ struct winVfsAppData {
#endif
/*
- * The value used with sqlite3_win32_set_directory() to specify that
- * the data directory should be changed.
- */
-#ifndef SQLITE_WIN32_DATA_DIRECTORY_TYPE
-# define SQLITE_WIN32_DATA_DIRECTORY_TYPE (1)
-#endif
-
-/*
- * The value used with sqlite3_win32_set_directory() to specify that
- * the temporary directory should be changed.
- */
-#ifndef SQLITE_WIN32_TEMP_DIRECTORY_TYPE
-# define SQLITE_WIN32_TEMP_DIRECTORY_TYPE (2)
-#endif
-
-/*
* If compiled with SQLITE_WIN32_MALLOC on Windows, we will use the
* various Win32 API heap functions instead of our own.
*/
@@ -40171,13 +42317,13 @@ SQLITE_API char *sqlite3_win32_utf8_to_mbcs_v2(const char *zText, int useAnsi){
}
/*
-** This function sets the data directory or the temporary directory based on
-** the provided arguments. The type argument must be 1 in order to set the
-** data directory or 2 in order to set the temporary directory. The zValue
-** argument is the name of the directory to use. The return value will be
-** SQLITE_OK if successful.
+** This function is the same as sqlite3_win32_set_directory (below); however,
+** it accepts a UTF-8 string.
*/
-SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){
+SQLITE_API int sqlite3_win32_set_directory8(
+ unsigned long type, /* Identifier for directory being set or reset */
+ const char *zValue /* New value for directory being set or reset */
+){
char **ppDirectory = 0;
#ifndef SQLITE_OMIT_AUTOINIT
int rc = sqlite3_initialize();
@@ -40193,21 +42339,54 @@ SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){
);
assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) );
if( ppDirectory ){
- char *zValueUtf8 = 0;
+ char *zCopy = 0;
if( zValue && zValue[0] ){
- zValueUtf8 = winUnicodeToUtf8(zValue);
- if ( zValueUtf8==0 ){
+ zCopy = sqlite3_mprintf("%s", zValue);
+ if ( zCopy==0 ){
return SQLITE_NOMEM_BKPT;
}
}
sqlite3_free(*ppDirectory);
- *ppDirectory = zValueUtf8;
+ *ppDirectory = zCopy;
return SQLITE_OK;
}
return SQLITE_ERROR;
}
/*
+** This function is the same as sqlite3_win32_set_directory (below); however,
+** it accepts a UTF-16 string.
+*/
+SQLITE_API int sqlite3_win32_set_directory16(
+ unsigned long type, /* Identifier for directory being set or reset */
+ const void *zValue /* New value for directory being set or reset */
+){
+ int rc;
+ char *zUtf8 = 0;
+ if( zValue ){
+ zUtf8 = sqlite3_win32_unicode_to_utf8(zValue);
+ if( zUtf8==0 ) return SQLITE_NOMEM_BKPT;
+ }
+ rc = sqlite3_win32_set_directory8(type, zUtf8);
+ if( zUtf8 ) sqlite3_free(zUtf8);
+ return rc;
+}
+
+/*
+** This function sets the data directory or the temporary directory based on
+** the provided arguments. The type argument must be 1 in order to set the
+** data directory or 2 in order to set the temporary directory. The zValue
+** argument is the name of the directory to use. The return value will be
+** SQLITE_OK if successful.
+*/
+SQLITE_API int sqlite3_win32_set_directory(
+ unsigned long type, /* Identifier for directory being set or reset */
+ void *zValue /* New value for directory being set or reset */
+){
+ return sqlite3_win32_set_directory16(type, zValue);
+}
+
+/*
** The return value of winGetLastErrorMsg
** is zero if the error message fits in the buffer, or non-zero
** otherwise (if the message was truncated).
@@ -41131,6 +43310,29 @@ static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){
winFile *pFile = (winFile*)id; /* File handle object */
int rc = SQLITE_OK; /* Return code for this function */
DWORD lastErrno;
+#if SQLITE_MAX_MMAP_SIZE>0
+ sqlite3_int64 oldMmapSize;
+ if( pFile->nFetchOut>0 ){
+ /* File truncation is a no-op if there are outstanding memory mapped
+ ** pages. This is because truncating the file means temporarily unmapping
+ ** the file, and that might delete memory out from under existing cursors.
+ **
+ ** This can result in incremental vacuum not truncating the file,
+ ** if there is an active read cursor when the incremental vacuum occurs.
+ ** No real harm comes of this - the database file is not corrupted,
+ ** though some folks might complain that the file is bigger than it
+ ** needs to be.
+ **
+ ** The only feasible work-around is to defer the truncation until after
+ ** all references to memory-mapped content are closed. That is doable,
+ ** but involves adding a few branches in the common write code path which
+ ** could slow down normal operations slightly. Hence, we have decided for
+ ** now to simply make trancations a no-op if there are pending reads. We
+ ** can maybe revisit this decision in the future.
+ */
+ return SQLITE_OK;
+ }
+#endif
assert( pFile );
SimulateIOError(return SQLITE_IOERR_TRUNCATE);
@@ -41146,6 +43348,15 @@ static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){
nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk;
}
+#if SQLITE_MAX_MMAP_SIZE>0
+ if( pFile->pMapRegion ){
+ oldMmapSize = pFile->mmapSize;
+ }else{
+ oldMmapSize = 0;
+ }
+ winUnmapfile(pFile);
+#endif
+
/* SetEndOfFile() returns non-zero when successful, or zero when it fails. */
if( winSeekFile(pFile, nByte) ){
rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno,
@@ -41158,12 +43369,12 @@ static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){
}
#if SQLITE_MAX_MMAP_SIZE>0
- /* If the file was truncated to a size smaller than the currently
- ** mapped region, reduce the effective mapping size as well. SQLite will
- ** use read() and write() to access data beyond this point from now on.
- */
- if( pFile->pMapRegion && nByte<pFile->mmapSize ){
- pFile->mmapSize = nByte;
+ if( rc==SQLITE_OK && oldMmapSize>0 ){
+ if( oldMmapSize>nByte ){
+ winMapfile(pFile, -1);
+ }else{
+ winMapfile(pFile, oldMmapSize);
+ }
}
#endif
@@ -41875,15 +44086,16 @@ static SYSTEM_INFO winSysInfo;
** assert( winShmMutexHeld() );
** winShmLeaveMutex()
*/
+static sqlite3_mutex *winBigLock = 0;
static void winShmEnterMutex(void){
- sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ sqlite3_mutex_enter(winBigLock);
}
static void winShmLeaveMutex(void){
- sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ sqlite3_mutex_leave(winBigLock);
}
#ifndef NDEBUG
static int winShmMutexHeld(void) {
- return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1));
+ return sqlite3_mutex_held(winBigLock);
}
#endif
@@ -41917,6 +44129,9 @@ struct winShmNode {
int szRegion; /* Size of shared-memory regions */
int nRegion; /* Size of array apRegion */
+ u8 isReadonly; /* True if read-only */
+ u8 isUnlocked; /* True if no DMS lock held */
+
struct ShmRegion {
HANDLE hMap; /* File handle from CreateFileMapping */
void *pMap;
@@ -41983,7 +44198,7 @@ static int winShmSystemLock(
int rc = 0; /* Result code form Lock/UnlockFileEx() */
/* Access to the winShmNode object is serialized by the caller */
- assert( sqlite3_mutex_held(pFile->mutex) || pFile->nRef==0 );
+ assert( pFile->nRef==0 || sqlite3_mutex_held(pFile->mutex) );
OSTRACE(("SHM-LOCK file=%p, lock=%d, offset=%d, size=%d\n",
pFile->hFile.h, lockType, ofst, nByte));
@@ -42065,6 +44280,37 @@ static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){
}
/*
+** The DMS lock has not yet been taken on shm file pShmNode. Attempt to
+** take it now. Return SQLITE_OK if successful, or an SQLite error
+** code otherwise.
+**
+** If the DMS cannot be locked because this is a readonly_shm=1
+** connection and no other process already holds a lock, return
+** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1.
+*/
+static int winLockSharedMemory(winShmNode *pShmNode){
+ int rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, WIN_SHM_DMS, 1);
+
+ if( rc==SQLITE_OK ){
+ if( pShmNode->isReadonly ){
+ pShmNode->isUnlocked = 1;
+ winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);
+ return SQLITE_READONLY_CANTINIT;
+ }else if( winTruncate((sqlite3_file*)&pShmNode->hFile, 0) ){
+ winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);
+ return winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(),
+ "winLockSharedMemory", pShmNode->zFilename);
+ }
+ }
+
+ if( rc==SQLITE_OK ){
+ winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);
+ }
+
+ return winShmSystemLock(pShmNode, WINSHM_RDLCK, WIN_SHM_DMS, 1);
+}
+
+/*
** Open the shared-memory area associated with database file pDbFd.
**
** When opening a new shared-memory file, if no other instances of that
@@ -42073,9 +44319,9 @@ static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){
*/
static int winOpenSharedMemory(winFile *pDbFd){
struct winShm *p; /* The connection to be opened */
- struct winShmNode *pShmNode = 0; /* The underlying mmapped file */
- int rc; /* Result code */
- struct winShmNode *pNew; /* Newly allocated winShmNode */
+ winShmNode *pShmNode = 0; /* The underlying mmapped file */
+ int rc = SQLITE_OK; /* Result code */
+ winShmNode *pNew; /* Newly allocated winShmNode */
int nName; /* Size of zName in bytes */
assert( pDbFd->pShm==0 ); /* Not previously opened */
@@ -42108,6 +44354,9 @@ static int winOpenSharedMemory(winFile *pDbFd){
if( pShmNode ){
sqlite3_free(pNew);
}else{
+ int inFlags = SQLITE_OPEN_WAL;
+ int outFlags = 0;
+
pShmNode = pNew;
pNew = 0;
((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE;
@@ -42122,30 +44371,23 @@ static int winOpenSharedMemory(winFile *pDbFd){
}
}
- rc = winOpen(pDbFd->pVfs,
- pShmNode->zFilename, /* Name of the file (UTF-8) */
- (sqlite3_file*)&pShmNode->hFile, /* File handle here */
- SQLITE_OPEN_WAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
- 0);
- if( SQLITE_OK!=rc ){
+ if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
+ inFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
+ }else{
+ inFlags |= SQLITE_OPEN_READONLY;
+ }
+ rc = winOpen(pDbFd->pVfs, pShmNode->zFilename,
+ (sqlite3_file*)&pShmNode->hFile,
+ inFlags, &outFlags);
+ if( rc!=SQLITE_OK ){
+ rc = winLogError(rc, osGetLastError(), "winOpenShm",
+ pShmNode->zFilename);
goto shm_open_err;
}
+ if( outFlags==SQLITE_OPEN_READONLY ) pShmNode->isReadonly = 1;
- /* Check to see if another process is holding the dead-man switch.
- ** If not, truncate the file to zero length.
- */
- if( winShmSystemLock(pShmNode, WINSHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){
- rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0);
- if( rc!=SQLITE_OK ){
- rc = winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(),
- "winOpenShm", pDbFd->zPath);
- }
- }
- if( rc==SQLITE_OK ){
- winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);
- rc = winShmSystemLock(pShmNode, WINSHM_RDLCK, WIN_SHM_DMS, 1);
- }
- if( rc ) goto shm_open_err;
+ rc = winLockSharedMemory(pShmNode);
+ if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err;
}
/* Make the new connection a child of the winShmNode */
@@ -42168,7 +44410,7 @@ static int winOpenSharedMemory(winFile *pDbFd){
p->pNext = pShmNode->pFirst;
pShmNode->pFirst = p;
sqlite3_mutex_leave(pShmNode->mutex);
- return SQLITE_OK;
+ return rc;
/* Jump here on any error */
shm_open_err:
@@ -42372,6 +44614,8 @@ static int winShmMap(
winFile *pDbFd = (winFile*)fd;
winShm *pShm = pDbFd->pShm;
winShmNode *pShmNode;
+ DWORD protect = PAGE_READWRITE;
+ DWORD flags = FILE_MAP_WRITE | FILE_MAP_READ;
int rc = SQLITE_OK;
if( !pShm ){
@@ -42382,6 +44626,11 @@ static int winShmMap(
pShmNode = pShm->pShmNode;
sqlite3_mutex_enter(pShmNode->mutex);
+ if( pShmNode->isUnlocked ){
+ rc = winLockSharedMemory(pShmNode);
+ if( rc!=SQLITE_OK ) goto shmpage_out;
+ pShmNode->isUnlocked = 0;
+ }
assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
if( pShmNode->nRegion<=iRegion ){
@@ -42428,21 +44677,26 @@ static int winShmMap(
}
pShmNode->aRegion = apNew;
+ if( pShmNode->isReadonly ){
+ protect = PAGE_READONLY;
+ flags = FILE_MAP_READ;
+ }
+
while( pShmNode->nRegion<=iRegion ){
HANDLE hMap = NULL; /* file-mapping handle */
void *pMap = 0; /* Mapped memory region */
#if SQLITE_OS_WINRT
hMap = osCreateFileMappingFromApp(pShmNode->hFile.h,
- NULL, PAGE_READWRITE, nByte, NULL
+ NULL, protect, nByte, NULL
);
#elif defined(SQLITE_WIN32_HAS_WIDE)
hMap = osCreateFileMappingW(pShmNode->hFile.h,
- NULL, PAGE_READWRITE, 0, nByte, NULL
+ NULL, protect, 0, nByte, NULL
);
#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA
hMap = osCreateFileMappingA(pShmNode->hFile.h,
- NULL, PAGE_READWRITE, 0, nByte, NULL
+ NULL, protect, 0, nByte, NULL
);
#endif
OSTRACE(("SHM-MAP-CREATE pid=%lu, region=%d, size=%d, rc=%s\n",
@@ -42452,11 +44706,11 @@ static int winShmMap(
int iOffset = pShmNode->nRegion*szRegion;
int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity;
#if SQLITE_OS_WINRT
- pMap = osMapViewOfFileFromApp(hMap, FILE_MAP_WRITE | FILE_MAP_READ,
+ pMap = osMapViewOfFileFromApp(hMap, flags,
iOffset - iOffsetShift, szRegion + iOffsetShift
);
#else
- pMap = osMapViewOfFile(hMap, FILE_MAP_WRITE | FILE_MAP_READ,
+ pMap = osMapViewOfFile(hMap, flags,
0, iOffset - iOffsetShift, szRegion + iOffsetShift
);
#endif
@@ -42487,6 +44741,7 @@ shmpage_out:
}else{
*pp = 0;
}
+ if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY;
sqlite3_mutex_leave(pShmNode->mutex);
return rc;
}
@@ -42505,9 +44760,9 @@ shmpage_out:
static int winUnmapfile(winFile *pFile){
assert( pFile!=0 );
OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, hMap=%p, pMapRegion=%p, "
- "mmapSize=%lld, mmapSizeActual=%lld, mmapSizeMax=%lld\n",
+ "mmapSize=%lld, mmapSizeMax=%lld\n",
osGetCurrentProcessId(), pFile, pFile->hMap, pFile->pMapRegion,
- pFile->mmapSize, pFile->mmapSizeActual, pFile->mmapSizeMax));
+ pFile->mmapSize, pFile->mmapSizeMax));
if( pFile->pMapRegion ){
if( !osUnmapViewOfFile(pFile->pMapRegion) ){
pFile->lastErrno = osGetLastError();
@@ -42519,7 +44774,6 @@ static int winUnmapfile(winFile *pFile){
}
pFile->pMapRegion = 0;
pFile->mmapSize = 0;
- pFile->mmapSizeActual = 0;
}
if( pFile->hMap!=NULL ){
if( !osCloseHandle(pFile->hMap) ){
@@ -42630,7 +44884,6 @@ static int winMapfile(winFile *pFd, sqlite3_int64 nByte){
}
pFd->pMapRegion = pNew;
pFd->mmapSize = nMap;
- pFd->mmapSizeActual = nMap;
}
OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n",
@@ -43315,8 +45568,10 @@ static int winOpen(
&extendedParameters);
if( h!=INVALID_HANDLE_VALUE ) break;
if( isReadWrite ){
- int isRO = 0;
- int rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ int rc2, isRO = 0;
+ sqlite3BeginBenignMalloc();
+ rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ sqlite3EndBenignMalloc();
if( rc2==SQLITE_OK && isRO ) break;
}
}while( winRetryIoerr(&cnt, &lastErrno) );
@@ -43330,8 +45585,10 @@ static int winOpen(
NULL);
if( h!=INVALID_HANDLE_VALUE ) break;
if( isReadWrite ){
- int isRO = 0;
- int rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ int rc2, isRO = 0;
+ sqlite3BeginBenignMalloc();
+ rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ sqlite3EndBenignMalloc();
if( rc2==SQLITE_OK && isRO ) break;
}
}while( winRetryIoerr(&cnt, &lastErrno) );
@@ -43348,8 +45605,10 @@ static int winOpen(
NULL);
if( h!=INVALID_HANDLE_VALUE ) break;
if( isReadWrite ){
- int isRO = 0;
- int rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ int rc2, isRO = 0;
+ sqlite3BeginBenignMalloc();
+ rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ sqlite3EndBenignMalloc();
if( rc2==SQLITE_OK && isRO ) break;
}
}while( winRetryIoerr(&cnt, &lastErrno) );
@@ -43426,7 +45685,6 @@ static int winOpen(
pFile->hMap = NULL;
pFile->pMapRegion = 0;
pFile->mmapSize = 0;
- pFile->mmapSizeActual = 0;
pFile->mmapSizeMax = sqlite3GlobalConfig.szMmap;
#endif
@@ -44257,6 +46515,10 @@ SQLITE_API int sqlite3_os_init(void){
sqlite3_vfs_register(&winLongPathNolockVfs, 0);
#endif
+#ifndef SQLITE_OMIT_WAL
+ winBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1);
+#endif
+
return SQLITE_OK;
}
@@ -44267,12 +46529,609 @@ SQLITE_API int sqlite3_os_end(void){
sleepObj = NULL;
}
#endif
+
+#ifndef SQLITE_OMIT_WAL
+ winBigLock = 0;
+#endif
+
return SQLITE_OK;
}
#endif /* SQLITE_OS_WIN */
/************** End of os_win.c **********************************************/
+/************** Begin file memdb.c *******************************************/
+/*
+** 2016-09-07
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file implements an in-memory VFS. A database is held as a contiguous
+** block of memory.
+**
+** This file also implements interface sqlite3_serialize() and
+** sqlite3_deserialize().
+*/
+/* #include "sqliteInt.h" */
+#ifdef SQLITE_ENABLE_DESERIALIZE
+
+/*
+** Forward declaration of objects used by this utility
+*/
+typedef struct sqlite3_vfs MemVfs;
+typedef struct MemFile MemFile;
+
+/* Access to a lower-level VFS that (might) implement dynamic loading,
+** access to randomness, etc.
+*/
+#define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData))
+
+/* An open file */
+struct MemFile {
+ sqlite3_file base; /* IO methods */
+ sqlite3_int64 sz; /* Size of the file */
+ sqlite3_int64 szMax; /* Space allocated to aData */
+ unsigned char *aData; /* content of the file */
+ int nMmap; /* Number of memory mapped pages */
+ unsigned mFlags; /* Flags */
+ int eLock; /* Most recent lock against this file */
+};
+
+/*
+** Methods for MemFile
+*/
+static int memdbClose(sqlite3_file*);
+static int memdbRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
+static int memdbWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
+static int memdbTruncate(sqlite3_file*, sqlite3_int64 size);
+static int memdbSync(sqlite3_file*, int flags);
+static int memdbFileSize(sqlite3_file*, sqlite3_int64 *pSize);
+static int memdbLock(sqlite3_file*, int);
+/* static int memdbCheckReservedLock(sqlite3_file*, int *pResOut);// not used */
+static int memdbFileControl(sqlite3_file*, int op, void *pArg);
+/* static int memdbSectorSize(sqlite3_file*); // not used */
+static int memdbDeviceCharacteristics(sqlite3_file*);
+static int memdbFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
+static int memdbUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
+
+/*
+** Methods for MemVfs
+*/
+static int memdbOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
+/* static int memdbDelete(sqlite3_vfs*, const char *zName, int syncDir); */
+static int memdbAccess(sqlite3_vfs*, const char *zName, int flags, int *);
+static int memdbFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
+static void *memdbDlOpen(sqlite3_vfs*, const char *zFilename);
+static void memdbDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
+static void (*memdbDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
+static void memdbDlClose(sqlite3_vfs*, void*);
+static int memdbRandomness(sqlite3_vfs*, int nByte, char *zOut);
+static int memdbSleep(sqlite3_vfs*, int microseconds);
+/* static int memdbCurrentTime(sqlite3_vfs*, double*); */
+static int memdbGetLastError(sqlite3_vfs*, int, char *);
+static int memdbCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
+
+static sqlite3_vfs memdb_vfs = {
+ 2, /* iVersion */
+ 0, /* szOsFile (set when registered) */
+ 1024, /* mxPathname */
+ 0, /* pNext */
+ "memdb", /* zName */
+ 0, /* pAppData (set when registered) */
+ memdbOpen, /* xOpen */
+ 0, /* memdbDelete, */ /* xDelete */
+ memdbAccess, /* xAccess */
+ memdbFullPathname, /* xFullPathname */
+ memdbDlOpen, /* xDlOpen */
+ memdbDlError, /* xDlError */
+ memdbDlSym, /* xDlSym */
+ memdbDlClose, /* xDlClose */
+ memdbRandomness, /* xRandomness */
+ memdbSleep, /* xSleep */
+ 0, /* memdbCurrentTime, */ /* xCurrentTime */
+ memdbGetLastError, /* xGetLastError */
+ memdbCurrentTimeInt64 /* xCurrentTimeInt64 */
+};
+
+static const sqlite3_io_methods memdb_io_methods = {
+ 3, /* iVersion */
+ memdbClose, /* xClose */
+ memdbRead, /* xRead */
+ memdbWrite, /* xWrite */
+ memdbTruncate, /* xTruncate */
+ memdbSync, /* xSync */
+ memdbFileSize, /* xFileSize */
+ memdbLock, /* xLock */
+ memdbLock, /* xUnlock - same as xLock in this case */
+ 0, /* memdbCheckReservedLock, */ /* xCheckReservedLock */
+ memdbFileControl, /* xFileControl */
+ 0, /* memdbSectorSize,*/ /* xSectorSize */
+ memdbDeviceCharacteristics, /* xDeviceCharacteristics */
+ 0, /* xShmMap */
+ 0, /* xShmLock */
+ 0, /* xShmBarrier */
+ 0, /* xShmUnmap */
+ memdbFetch, /* xFetch */
+ memdbUnfetch /* xUnfetch */
+};
+
+
+
+/*
+** Close an memdb-file.
+**
+** The pData pointer is owned by the application, so there is nothing
+** to free.
+*/
+static int memdbClose(sqlite3_file *pFile){
+ MemFile *p = (MemFile *)pFile;
+ if( p->mFlags & SQLITE_DESERIALIZE_FREEONCLOSE ) sqlite3_free(p->aData);
+ return SQLITE_OK;
+}
+
+/*
+** Read data from an memdb-file.
+*/
+static int memdbRead(
+ sqlite3_file *pFile,
+ void *zBuf,
+ int iAmt,
+ sqlite_int64 iOfst
+){
+ MemFile *p = (MemFile *)pFile;
+ if( iOfst+iAmt>p->sz ){
+ memset(zBuf, 0, iAmt);
+ if( iOfst<p->sz ) memcpy(zBuf, p->aData+iOfst, p->sz - iOfst);
+ return SQLITE_IOERR_SHORT_READ;
+ }
+ memcpy(zBuf, p->aData+iOfst, iAmt);
+ return SQLITE_OK;
+}
+
+/*
+** Try to enlarge the memory allocation to hold at least sz bytes
+*/
+static int memdbEnlarge(MemFile *p, sqlite3_int64 newSz){
+ unsigned char *pNew;
+ if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){
+ return SQLITE_FULL;
+ }
+ pNew = sqlite3_realloc64(p->aData, newSz);
+ if( pNew==0 ) return SQLITE_NOMEM;
+ p->aData = pNew;
+ p->szMax = newSz;
+ return SQLITE_OK;
+}
+
+/*
+** Write data to an memdb-file.
+*/
+static int memdbWrite(
+ sqlite3_file *pFile,
+ const void *z,
+ int iAmt,
+ sqlite_int64 iOfst
+){
+ MemFile *p = (MemFile *)pFile;
+ if( iOfst+iAmt>p->sz ){
+ int rc;
+ if( iOfst+iAmt>p->szMax
+ && (rc = memdbEnlarge(p, (iOfst+iAmt)*2))!=SQLITE_OK
+ ){
+ return rc;
+ }
+ if( iOfst>p->sz ) memset(p->aData+p->sz, 0, iOfst-p->sz);
+ p->sz = iOfst+iAmt;
+ }
+ memcpy(p->aData+iOfst, z, iAmt);
+ return SQLITE_OK;
+}
+
+/*
+** Truncate an memdb-file.
+**
+** In rollback mode (which is always the case for memdb, as it does not
+** support WAL mode) the truncate() method is only used to reduce
+** the size of a file, never to increase the size.
+*/
+static int memdbTruncate(sqlite3_file *pFile, sqlite_int64 size){
+ MemFile *p = (MemFile *)pFile;
+ if( NEVER(size>p->sz) ) return SQLITE_FULL;
+ p->sz = size;
+ return SQLITE_OK;
+}
+
+/*
+** Sync an memdb-file.
+*/
+static int memdbSync(sqlite3_file *pFile, int flags){
+ return SQLITE_OK;
+}
+
+/*
+** Return the current file-size of an memdb-file.
+*/
+static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
+ MemFile *p = (MemFile *)pFile;
+ *pSize = p->sz;
+ return SQLITE_OK;
+}
+
+/*
+** Lock an memdb-file.
+*/
+static int memdbLock(sqlite3_file *pFile, int eLock){
+ MemFile *p = (MemFile *)pFile;
+ p->eLock = eLock;
+ return SQLITE_OK;
+}
+
+#if 0 /* Never used because memdbAccess() always returns false */
+/*
+** Check if another file-handle holds a RESERVED lock on an memdb-file.
+*/
+static int memdbCheckReservedLock(sqlite3_file *pFile, int *pResOut){
+ *pResOut = 0;
+ return SQLITE_OK;
+}
+#endif
+
+/*
+** File control method. For custom operations on an memdb-file.
+*/
+static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){
+ MemFile *p = (MemFile *)pFile;
+ int rc = SQLITE_NOTFOUND;
+ if( op==SQLITE_FCNTL_VFSNAME ){
+ *(char**)pArg = sqlite3_mprintf("memdb(%p,%lld)", p->aData, p->sz);
+ rc = SQLITE_OK;
+ }
+ return rc;
+}
+
+#if 0 /* Not used because of SQLITE_IOCAP_POWERSAFE_OVERWRITE */
+/*
+** Return the sector-size in bytes for an memdb-file.
+*/
+static int memdbSectorSize(sqlite3_file *pFile){
+ return 1024;
+}
+#endif
+
+/*
+** Return the device characteristic flags supported by an memdb-file.
+*/
+static int memdbDeviceCharacteristics(sqlite3_file *pFile){
+ return SQLITE_IOCAP_ATOMIC |
+ SQLITE_IOCAP_POWERSAFE_OVERWRITE |
+ SQLITE_IOCAP_SAFE_APPEND |
+ SQLITE_IOCAP_SEQUENTIAL;
+}
+
+/* Fetch a page of a memory-mapped file */
+static int memdbFetch(
+ sqlite3_file *pFile,
+ sqlite3_int64 iOfst,
+ int iAmt,
+ void **pp
+){
+ MemFile *p = (MemFile *)pFile;
+ p->nMmap++;
+ *pp = (void*)(p->aData + iOfst);
+ return SQLITE_OK;
+}
+
+/* Release a memory-mapped page */
+static int memdbUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
+ MemFile *p = (MemFile *)pFile;
+ p->nMmap--;
+ return SQLITE_OK;
+}
+
+/*
+** Open an mem file handle.
+*/
+static int memdbOpen(
+ sqlite3_vfs *pVfs,
+ const char *zName,
+ sqlite3_file *pFile,
+ int flags,
+ int *pOutFlags
+){
+ MemFile *p = (MemFile*)pFile;
+ if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
+ return ORIGVFS(pVfs)->xOpen(ORIGVFS(pVfs), zName, pFile, flags, pOutFlags);
+ }
+ memset(p, 0, sizeof(*p));
+ p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE;
+ assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */
+ *pOutFlags = flags | SQLITE_OPEN_MEMORY;
+ p->base.pMethods = &memdb_io_methods;
+ return SQLITE_OK;
+}
+
+#if 0 /* Only used to delete rollback journals, master journals, and WAL
+ ** files, none of which exist in memdb. So this routine is never used */
+/*
+** Delete the file located at zPath. If the dirSync argument is true,
+** ensure the file-system modifications are synced to disk before
+** returning.
+*/
+static int memdbDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
+ return SQLITE_IOERR_DELETE;
+}
+#endif
+
+/*
+** Test for access permissions. Return true if the requested permission
+** is available, or false otherwise.
+**
+** With memdb, no files ever exist on disk. So always return false.
+*/
+static int memdbAccess(
+ sqlite3_vfs *pVfs,
+ const char *zPath,
+ int flags,
+ int *pResOut
+){
+ *pResOut = 0;
+ return SQLITE_OK;
+}
+
+/*
+** Populate buffer zOut with the full canonical pathname corresponding
+** to the pathname in zPath. zOut is guaranteed to point to a buffer
+** of at least (INST_MAX_PATHNAME+1) bytes.
+*/
+static int memdbFullPathname(
+ sqlite3_vfs *pVfs,
+ const char *zPath,
+ int nOut,
+ char *zOut
+){
+ sqlite3_snprintf(nOut, zOut, "%s", zPath);
+ return SQLITE_OK;
+}
+
+/*
+** Open the dynamic library located at zPath and return a handle.
+*/
+static void *memdbDlOpen(sqlite3_vfs *pVfs, const char *zPath){
+ return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
+}
+
+/*
+** Populate the buffer zErrMsg (size nByte bytes) with a human readable
+** utf-8 string describing the most recent error encountered associated
+** with dynamic libraries.
+*/
+static void memdbDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
+ ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
+}
+
+/*
+** Return a pointer to the symbol zSymbol in the dynamic library pHandle.
+*/
+static void (*memdbDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
+ return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
+}
+
+/*
+** Close the dynamic library handle pHandle.
+*/
+static void memdbDlClose(sqlite3_vfs *pVfs, void *pHandle){
+ ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
+}
+
+/*
+** Populate the buffer pointed to by zBufOut with nByte bytes of
+** random data.
+*/
+static int memdbRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
+ return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
+}
+
+/*
+** Sleep for nMicro microseconds. Return the number of microseconds
+** actually slept.
+*/
+static int memdbSleep(sqlite3_vfs *pVfs, int nMicro){
+ return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
+}
+
+#if 0 /* Never used. Modern cores only call xCurrentTimeInt64() */
+/*
+** Return the current time as a Julian Day number in *pTimeOut.
+*/
+static int memdbCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
+ return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
+}
+#endif
+
+static int memdbGetLastError(sqlite3_vfs *pVfs, int a, char *b){
+ return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
+}
+static int memdbCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
+ return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
+}
+
+/*
+** Translate a database connection pointer and schema name into a
+** MemFile pointer.
+*/
+static MemFile *memdbFromDbSchema(sqlite3 *db, const char *zSchema){
+ MemFile *p = 0;
+ int rc = sqlite3_file_control(db, zSchema, SQLITE_FCNTL_FILE_POINTER, &p);
+ if( rc ) return 0;
+ if( p->base.pMethods!=&memdb_io_methods ) return 0;
+ return p;
+}
+
+/*
+** Return the serialization of a database
+*/
+SQLITE_API unsigned char *sqlite3_serialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which database within the connection */
+ sqlite3_int64 *piSize, /* Write size here, if not NULL */
+ unsigned int mFlags /* Maybe SQLITE_SERIALIZE_NOCOPY */
+){
+ MemFile *p;
+ int iDb;
+ Btree *pBt;
+ sqlite3_int64 sz;
+ int szPage = 0;
+ sqlite3_stmt *pStmt = 0;
+ unsigned char *pOut;
+ char *zSql;
+ int rc;
+
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db) ){
+ (void)SQLITE_MISUSE_BKPT;
+ return 0;
+ }
+#endif
+
+ if( zSchema==0 ) zSchema = db->aDb[0].zDbSName;
+ p = memdbFromDbSchema(db, zSchema);
+ iDb = sqlite3FindDbName(db, zSchema);
+ if( piSize ) *piSize = -1;
+ if( iDb<0 ) return 0;
+ if( p ){
+ if( piSize ) *piSize = p->sz;
+ if( mFlags & SQLITE_SERIALIZE_NOCOPY ){
+ pOut = p->aData;
+ }else{
+ pOut = sqlite3_malloc64( p->sz );
+ if( pOut ) memcpy(pOut, p->aData, p->sz);
+ }
+ return pOut;
+ }
+ pBt = db->aDb[iDb].pBt;
+ if( pBt==0 ) return 0;
+ szPage = sqlite3BtreeGetPageSize(pBt);
+ zSql = sqlite3_mprintf("PRAGMA \"%w\".page_count", zSchema);
+ rc = zSql ? sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) : SQLITE_NOMEM;
+ sqlite3_free(zSql);
+ if( rc ) return 0;
+ rc = sqlite3_step(pStmt);
+ if( rc!=SQLITE_ROW ){
+ pOut = 0;
+ }else{
+ sz = sqlite3_column_int64(pStmt, 0)*szPage;
+ if( piSize ) *piSize = sz;
+ if( mFlags & SQLITE_SERIALIZE_NOCOPY ){
+ pOut = 0;
+ }else{
+ pOut = sqlite3_malloc64( sz );
+ if( pOut ){
+ int nPage = sqlite3_column_int(pStmt, 0);
+ Pager *pPager = sqlite3BtreePager(pBt);
+ int pgno;
+ for(pgno=1; pgno<=nPage; pgno++){
+ DbPage *pPage = 0;
+ unsigned char *pTo = pOut + szPage*(sqlite3_int64)(pgno-1);
+ rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pPage, 0);
+ if( rc==SQLITE_OK ){
+ memcpy(pTo, sqlite3PagerGetData(pPage), szPage);
+ }else{
+ memset(pTo, 0, szPage);
+ }
+ sqlite3PagerUnref(pPage);
+ }
+ }
+ }
+ }
+ sqlite3_finalize(pStmt);
+ return pOut;
+}
+
+/* Convert zSchema to a MemDB and initialize its content.
+*/
+SQLITE_API int sqlite3_deserialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which DB to reopen with the deserialization */
+ unsigned char *pData, /* The serialized database content */
+ sqlite3_int64 szDb, /* Number bytes in the deserialization */
+ sqlite3_int64 szBuf, /* Total size of buffer pData[] */
+ unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */
+){
+ MemFile *p;
+ char *zSql;
+ sqlite3_stmt *pStmt = 0;
+ int rc;
+ int iDb;
+
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db) ){
+ return SQLITE_MISUSE_BKPT;
+ }
+ if( szDb<0 ) return SQLITE_MISUSE_BKPT;
+ if( szBuf<0 ) return SQLITE_MISUSE_BKPT;
+#endif
+
+ sqlite3_mutex_enter(db->mutex);
+ if( zSchema==0 ) zSchema = db->aDb[0].zDbSName;
+ iDb = sqlite3FindDbName(db, zSchema);
+ if( iDb<0 ){
+ rc = SQLITE_ERROR;
+ goto end_deserialize;
+ }
+ zSql = sqlite3_mprintf("ATTACH x AS %Q", zSchema);
+ rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
+ sqlite3_free(zSql);
+ if( rc ) goto end_deserialize;
+ db->init.iDb = (u8)iDb;
+ db->init.reopenMemdb = 1;
+ rc = sqlite3_step(pStmt);
+ db->init.reopenMemdb = 0;
+ if( rc!=SQLITE_DONE ){
+ rc = SQLITE_ERROR;
+ goto end_deserialize;
+ }
+ p = memdbFromDbSchema(db, zSchema);
+ if( p==0 ){
+ rc = SQLITE_ERROR;
+ }else{
+ p->aData = pData;
+ p->sz = szDb;
+ p->szMax = szBuf;
+ p->mFlags = mFlags;
+ rc = SQLITE_OK;
+ }
+
+end_deserialize:
+ sqlite3_finalize(pStmt);
+ sqlite3_mutex_leave(db->mutex);
+ return rc;
+}
+
+/*
+** This routine is called when the extension is loaded.
+** Register the new VFS.
+*/
+SQLITE_PRIVATE int sqlite3MemdbInit(void){
+ sqlite3_vfs *pLower = sqlite3_vfs_find(0);
+ int sz = pLower->szOsFile;
+ memdb_vfs.pAppData = pLower;
+ /* In all known configurations of SQLite, the size of a default
+ ** sqlite3_file is greater than the size of a memdb sqlite3_file.
+ ** Should that ever change, remove the following NEVER() */
+ if( NEVER(sz<sizeof(MemFile)) ) sz = sizeof(MemFile);
+ memdb_vfs.szOsFile = sz;
+ return sqlite3_vfs_register(&memdb_vfs, 0);
+}
+#endif /* SQLITE_ENABLE_DESERIALIZE */
+
+/************** End of memdb.c ***********************************************/
/************** Begin file bitvec.c ******************************************/
/*
** 2008 February 16
@@ -44722,7 +47581,7 @@ bitvec_end:
** The PCache.pSynced variable is used to optimize searching for a dirty
** page to eject from the cache mid-transaction. It is better to eject
** a page that does not require a journal sync than one that does.
-** Therefore, pSynced is maintained to that it *almost* always points
+** Therefore, pSynced is maintained so that it *almost* always points
** to either the oldest page in the pDirty/pDirtyTail list that has a
** clear PGHDR_NEED_SYNC flag or to a page that is older than this one
** (so that the right page to eject can be found by following pDirtyPrev
@@ -45121,7 +47980,7 @@ SQLITE_PRIVATE int sqlite3PcacheFetchStress(
sqlite3_log(SQLITE_FULL,
"spill page %d making room for %d - cache used: %d/%d",
pPg->pgno, pgno,
- sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache),
+ sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache),
numberOfCachePages(pCache));
#endif
pcacheTrace(("%p.SPILL %d\n",pCache,pPg->pgno));
@@ -45256,16 +48115,15 @@ SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){
*/
SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr *p){
assert( sqlite3PcachePageSanity(p) );
- if( ALWAYS((p->flags & PGHDR_DIRTY)!=0) ){
- assert( (p->flags & PGHDR_CLEAN)==0 );
- pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE);
- p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC|PGHDR_WRITEABLE);
- p->flags |= PGHDR_CLEAN;
- pcacheTrace(("%p.CLEAN %d\n",p->pCache,p->pgno));
- assert( sqlite3PcachePageSanity(p) );
- if( p->nRef==0 ){
- pcacheUnpin(p);
- }
+ assert( (p->flags & PGHDR_DIRTY)!=0 );
+ assert( (p->flags & PGHDR_CLEAN)==0 );
+ pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE);
+ p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC|PGHDR_WRITEABLE);
+ p->flags |= PGHDR_CLEAN;
+ pcacheTrace(("%p.CLEAN %d\n",p->pCache,p->pgno));
+ assert( sqlite3PcachePageSanity(p) );
+ if( p->nRef==0 ){
+ pcacheUnpin(p);
}
}
@@ -45547,6 +48405,15 @@ SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache *pCache){
return nCache ? (int)(((i64)nDirty * 100) / nCache) : 0;
}
+#ifdef SQLITE_DIRECT_OVERFLOW_READ
+/*
+** Return true if there are one or more dirty pages in the cache. Else false.
+*/
+SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache){
+ return (pCache->pDirty!=0);
+}
+#endif
+
#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG)
/*
** For all dirty pages currently in the cache, invoke the specified
@@ -45670,7 +48537,8 @@ struct PgHdr1 {
};
/*
-** A page is pinned if it is no on the LRU list
+** A page is pinned if it is not on the LRU list. To be "pinned" means
+** that the page is in active use and must not be deallocated.
*/
#define PAGE_IS_PINNED(p) ((p)->pLruNext==0)
#define PAGE_IS_UNPINNED(p) ((p)->pLruNext!=0)
@@ -46950,30 +49818,23 @@ struct RowSet {
#define ROWSET_NEXT 0x02 /* True if sqlite3RowSetNext() has been called */
/*
-** Turn bulk memory into a RowSet object. N bytes of memory
-** are available at pSpace. The db pointer is used as a memory context
-** for any subsequent allocations that need to occur.
-** Return a pointer to the new RowSet object.
-**
-** It must be the case that N is sufficient to make a Rowset. If not
-** an assertion fault occurs.
-**
-** If N is larger than the minimum, use the surplus as an initial
-** allocation of entries available to be filled.
+** Allocate a RowSet object. Return NULL if a memory allocation
+** error occurs.
*/
-SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3 *db, void *pSpace, unsigned int N){
- RowSet *p;
- assert( N >= ROUND8(sizeof(*p)) );
- p = pSpace;
- p->pChunk = 0;
- p->db = db;
- p->pEntry = 0;
- p->pLast = 0;
- p->pForest = 0;
- p->pFresh = (struct RowSetEntry*)(ROUND8(sizeof(*p)) + (char*)p);
- p->nFresh = (u16)((N - ROUND8(sizeof(*p)))/sizeof(struct RowSetEntry));
- p->rsFlags = ROWSET_SORTED;
- p->iBatch = 0;
+SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3 *db){
+ RowSet *p = sqlite3DbMallocRawNN(db, sizeof(*p));
+ if( p ){
+ int N = sqlite3DbMallocSize(db, p);
+ p->pChunk = 0;
+ p->db = db;
+ p->pEntry = 0;
+ p->pLast = 0;
+ p->pForest = 0;
+ p->pFresh = (struct RowSetEntry*)(ROUND8(sizeof(*p)) + (char*)p);
+ p->nFresh = (u16)((N - ROUND8(sizeof(*p)))/sizeof(struct RowSetEntry));
+ p->rsFlags = ROWSET_SORTED;
+ p->iBatch = 0;
+ }
return p;
}
@@ -46982,7 +49843,8 @@ SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3 *db, void *pSpace, unsigned int
** the RowSet has allocated over its lifetime. This routine is
** the destructor for the RowSet.
*/
-SQLITE_PRIVATE void sqlite3RowSetClear(RowSet *p){
+SQLITE_PRIVATE void sqlite3RowSetClear(void *pArg){
+ RowSet *p = (RowSet*)pArg;
struct RowSetChunk *pChunk, *pNextChunk;
for(pChunk=p->pChunk; pChunk; pChunk = pNextChunk){
pNextChunk = pChunk->pNextChunk;
@@ -46997,6 +49859,16 @@ SQLITE_PRIVATE void sqlite3RowSetClear(RowSet *p){
}
/*
+** Deallocate all chunks from a RowSet. This frees all memory that
+** the RowSet has allocated over its lifetime. This routine is
+** the destructor for the RowSet.
+*/
+SQLITE_PRIVATE void sqlite3RowSetDelete(void *pArg){
+ sqlite3RowSetClear(pArg);
+ sqlite3DbFree(((RowSet*)pArg)->db, pArg);
+}
+
+/*
** Allocate a new RowSetEntry object that is associated with the
** given RowSet. Return a pointer to the new and completely uninitialized
** objected.
@@ -47483,6 +50355,8 @@ SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal);
SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot);
SQLITE_PRIVATE void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot);
SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal);
+SQLITE_PRIVATE int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot);
+SQLITE_PRIVATE void sqlite3WalSnapshotUnlock(Wal *pWal);
#endif
#ifdef SQLITE_ENABLE_ZIPVFS
@@ -48178,7 +51052,7 @@ struct Pager {
char *zJournal; /* Name of the journal file */
int (*xBusyHandler)(void*); /* Function to call when busy */
void *pBusyHandlerArg; /* Context argument for xBusyHandler */
- int aStat[3]; /* Total cache hits, misses and writes */
+ int aStat[4]; /* Total cache hits, misses, writes, spills */
#ifdef SQLITE_TEST
int nRead; /* Database pages read */
#endif
@@ -48206,6 +51080,7 @@ struct Pager {
#define PAGER_STAT_HIT 0
#define PAGER_STAT_MISS 1
#define PAGER_STAT_WRITE 2
+#define PAGER_STAT_SPILL 3
/*
** The following global variables hold counters used for
@@ -48303,19 +51178,30 @@ static const unsigned char aJournalMagic[] = {
*/
#define isOpen(pFd) ((pFd)->pMethods!=0)
+#ifdef SQLITE_DIRECT_OVERFLOW_READ
/*
-** Return true if this pager uses a write-ahead log to read page pgno.
-** Return false if the pager reads pgno directly from the database.
+** Return true if page pgno can be read directly from the database file
+** by the b-tree layer. This is the case if:
+**
+** * the database file is open,
+** * there are no dirty pages in the cache, and
+** * the desired page is not currently in the wal file.
*/
-#if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_DIRECT_OVERFLOW_READ)
-SQLITE_PRIVATE int sqlite3PagerUseWal(Pager *pPager, Pgno pgno){
- u32 iRead = 0;
- int rc;
- if( pPager->pWal==0 ) return 0;
- rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead);
- return rc || iRead;
+SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){
+ if( pPager->fd->pMethods==0 ) return 0;
+ if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0;
+#ifndef SQLITE_OMIT_WAL
+ if( pPager->pWal ){
+ u32 iRead = 0;
+ int rc;
+ rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead);
+ return (rc==SQLITE_OK && iRead==0);
+ }
+#endif
+ return 1;
}
#endif
+
#ifndef SQLITE_OMIT_WAL
# define pagerUseWal(x) ((x)->pWal!=0)
#else
@@ -48475,8 +51361,12 @@ static int assert_pager_state(Pager *p){
** to "print *pPager" in gdb:
**
** (gdb) printf "%s", print_pager_state(pPager)
+**
+** This routine has external linkage in order to suppress compiler warnings
+** about an unused function. It is enclosed within SQLITE_DEBUG and so does
+** not appear in normal builds.
*/
-static char *print_pager_state(Pager *p){
+char *print_pager_state(Pager *p){
static char zRet[1024];
sqlite3_snprintf(1024, zRet,
@@ -48692,7 +51582,7 @@ static int jrnlBufferSize(Pager *pPager){
#endif
#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
- if( dc&SQLITE_IOCAP_BATCH_ATOMIC ){
+ if( pPager->dbSize>0 && (dc&SQLITE_IOCAP_BATCH_ATOMIC) ){
return -1;
}
#endif
@@ -49242,7 +52132,6 @@ static void pager_reset(Pager *pPager){
** Return the pPager->iDataVersion value
*/
SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager *pPager){
- assert( pPager->eState>PAGER_OPEN );
return pPager->iDataVersion;
}
@@ -49608,7 +52497,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){
rc = pager_truncate(pPager, pPager->dbSize);
}
- if( rc==SQLITE_OK && bCommit && isOpen(pPager->fd) ){
+ if( rc==SQLITE_OK && bCommit ){
rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0);
if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK;
}
@@ -50427,9 +53316,7 @@ end_playback:
** assertion that the transaction counter was modified.
*/
#ifdef SQLITE_DEBUG
- if( pPager->fd->pMethods ){
- sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0);
- }
+ sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0);
#endif
/* If this playback is happening automatically as a result of an IO or
@@ -51182,20 +54069,18 @@ static int pagerOpentemp(
** retried. If it returns zero, then the SQLITE_BUSY error is
** returned to the caller of the pager API function.
*/
-SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(
+SQLITE_PRIVATE void sqlite3PagerSetBusyHandler(
Pager *pPager, /* Pager object */
int (*xBusyHandler)(void *), /* Pointer to busy-handler function */
void *pBusyHandlerArg /* Argument to pass to xBusyHandler */
){
+ void **ap;
pPager->xBusyHandler = xBusyHandler;
pPager->pBusyHandlerArg = pBusyHandlerArg;
-
- if( isOpen(pPager->fd) ){
- void **ap = (void **)&pPager->xBusyHandler;
- assert( ((int(*)(void *))(ap[0]))==xBusyHandler );
- assert( ap[1]==pBusyHandlerArg );
- sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap);
- }
+ ap = (void **)&pPager->xBusyHandler;
+ assert( ((int(*)(void *))(ap[0]))==xBusyHandler );
+ assert( ap[1]==pBusyHandlerArg );
+ sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap);
}
/*
@@ -51581,6 +54466,30 @@ static void pagerFreeMapHdrs(Pager *pPager){
}
}
+/* Verify that the database file has not be deleted or renamed out from
+** under the pager. Return SQLITE_OK if the database is still where it ought
+** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error
+** code from sqlite3OsAccess()) if the database has gone missing.
+*/
+static int databaseIsUnmoved(Pager *pPager){
+ int bHasMoved = 0;
+ int rc;
+
+ if( pPager->tempFile ) return SQLITE_OK;
+ if( pPager->dbSize==0 ) return SQLITE_OK;
+ assert( pPager->zFilename && pPager->zFilename[0] );
+ rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved);
+ if( rc==SQLITE_NOTFOUND ){
+ /* If the HAS_MOVED file-control is unimplemented, assume that the file
+ ** has not been moved. That is the historical behavior of SQLite: prior to
+ ** version 3.8.3, it never checked */
+ rc = SQLITE_OK;
+ }else if( rc==SQLITE_OK && bHasMoved ){
+ rc = SQLITE_READONLY_DBMOVED;
+ }
+ return rc;
+}
+
/*
** Shutdown the page cache. Free all memory and close all files.
@@ -51597,8 +54506,7 @@ static void pagerFreeMapHdrs(Pager *pPager){
** to the caller.
*/
SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){
- u8 *pTmp = (u8 *)pPager->pTmpSpace;
-
+ u8 *pTmp = (u8*)pPager->pTmpSpace;
assert( db || pagerUseWal(pPager)==0 );
assert( assert_pager_state(pPager) );
disable_simulated_io_errors();
@@ -51607,11 +54515,17 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){
/* pPager->errCode = 0; */
pPager->exclusiveMode = 0;
#ifndef SQLITE_OMIT_WAL
- assert( db || pPager->pWal==0 );
- sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, pPager->pageSize,
- (db && (db->flags & SQLITE_NoCkptOnClose) ? 0 : pTmp)
- );
- pPager->pWal = 0;
+ {
+ u8 *a = 0;
+ assert( db || pPager->pWal==0 );
+ if( db && 0==(db->flags & SQLITE_NoCkptOnClose)
+ && SQLITE_OK==databaseIsUnmoved(pPager)
+ ){
+ a = pTmp;
+ }
+ sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, pPager->pageSize,a);
+ pPager->pWal = 0;
+ }
#endif
pager_reset(pPager);
if( MEMDB ){
@@ -52068,6 +54982,7 @@ static int pagerStress(void *p, PgHdr *pPg){
return SQLITE_OK;
}
+ pPager->aStat[PAGER_STAT_SPILL]++;
pPg->pDirty = 0;
if( pagerUseWal(pPager) ){
/* Write a single frame for this page to the log. */
@@ -52173,6 +55088,11 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
int rc = SQLITE_OK; /* Return code */
int tempFile = 0; /* True for temp files (incl. in-memory files) */
int memDb = 0; /* True if this is an in-memory file */
+#ifdef SQLITE_ENABLE_DESERIALIZE
+ int memJM = 0; /* Memory journal mode */
+#else
+# define memJM 0
+#endif
int readOnly = 0; /* True if this is a read-only file */
int journalFileSize; /* Bytes to allocate for each journal fd */
char *zPathname = 0; /* Full path to database file */
@@ -52300,7 +55220,10 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
int fout = 0; /* VFS flags returned by xOpen() */
rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout);
assert( !memDb );
- readOnly = (fout&SQLITE_OPEN_READONLY);
+#ifdef SQLITE_ENABLE_DESERIALIZE
+ memJM = (fout&SQLITE_OPEN_MEMORY)!=0;
+#endif
+ readOnly = (fout&SQLITE_OPEN_READONLY)!=0;
/* If the file was successfully opened for read/write access,
** choose a default page size in case we have to create the
@@ -52431,7 +55354,7 @@ act_like_temp_file:
setSectorSize(pPager);
if( !useJournal ){
pPager->journalMode = PAGER_JOURNALMODE_OFF;
- }else if( memDb ){
+ }else if( memDb || memJM ){
pPager->journalMode = PAGER_JOURNALMODE_MEMORY;
}
/* pPager->xBusyHandler = 0; */
@@ -52446,30 +55369,6 @@ act_like_temp_file:
}
-/* Verify that the database file has not be deleted or renamed out from
-** under the pager. Return SQLITE_OK if the database is still were it ought
-** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error
-** code from sqlite3OsAccess()) if the database has gone missing.
-*/
-static int databaseIsUnmoved(Pager *pPager){
- int bHasMoved = 0;
- int rc;
-
- if( pPager->tempFile ) return SQLITE_OK;
- if( pPager->dbSize==0 ) return SQLITE_OK;
- assert( pPager->zFilename && pPager->zFilename[0] );
- rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved);
- if( rc==SQLITE_NOTFOUND ){
- /* If the HAS_MOVED file-control is unimplemented, assume that the file
- ** has not been moved. That is the historical behavior of SQLite: prior to
- ** version 3.8.3, it never checked */
- rc = SQLITE_OK;
- }else if( rc==SQLITE_OK && bHasMoved ){
- rc = SQLITE_READONLY_DBMOVED;
- }
- return rc;
-}
-
/*
** This function is called after transitioning from PAGER_UNLOCK to
@@ -53058,7 +55957,7 @@ static int getPageMMap(
}
if( pPg==0 ){
rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg);
- }else{
+ }else{
sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData);
}
if( pPg ){
@@ -53157,6 +56056,7 @@ SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage *pPg){
assert( pPg->pgno==1 );
assert( (pPg->flags & PGHDR_MMAP)==0 ); /* Page1 is never memory mapped */
pPager = pPg->pPager;
+ sqlite3PagerResetLockTimeout(pPager);
sqlite3PcacheRelease(pPg);
pagerUnlockIfUnused(pPager);
}
@@ -53752,12 +56652,9 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){
*/
SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster){
int rc = SQLITE_OK;
-
- if( isOpen(pPager->fd) ){
- void *pArg = (void*)zMaster;
- rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg);
- if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK;
- }
+ void *pArg = (void*)zMaster;
+ rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg);
+ if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK;
if( rc==SQLITE_OK && !pPager->noSync ){
assert( !MEMDB );
rc = sqlite3OsSync(pPager->fd, pPager->syncFlags);
@@ -53852,9 +56749,10 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
** backup in progress needs to be restarted. */
sqlite3BackupRestart(pPager->pBackup);
}else{
+ PgHdr *pList;
if( pagerUseWal(pPager) ){
- PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache);
PgHdr *pPageOne = 0;
+ pList = sqlite3PcacheDirtyList(pPager->pPCache);
if( pList==0 ){
/* Must have at least one page for the WAL commit flag.
** Ticket [2d1a5c67dfc2363e44f29d9bbd57f] 2011-05-18 */
@@ -53875,14 +56773,14 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
** should be used. No rollback journal is created if batch-atomic-write
** is enabled.
*/
- sqlite3_file *fd = pPager->fd;
#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
- const int bBatch = zMaster==0 /* An SQLITE_IOCAP_BATCH_ATOMIC commit */
+ sqlite3_file *fd = pPager->fd;
+ int bBatch = zMaster==0 /* An SQLITE_IOCAP_BATCH_ATOMIC commit */
&& (sqlite3OsDeviceCharacteristics(fd) & SQLITE_IOCAP_BATCH_ATOMIC)
&& !pPager->noSync
&& sqlite3JournalIsInMemory(pPager->jfd);
#else
-# define bBatch 0
+# define bBatch 0
#endif
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
@@ -53934,15 +56832,16 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
}
}
}
-#else
+#else /* SQLITE_ENABLE_ATOMIC_WRITE */
#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
if( zMaster ){
rc = sqlite3JournalCreate(pPager->jfd);
if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
+ assert( bBatch==0 );
}
#endif
rc = pager_incr_changecounter(pPager, 0);
-#endif
+#endif /* !SQLITE_ENABLE_ATOMIC_WRITE */
if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
/* Write the master journal name into the journal file. If a master
@@ -53966,23 +56865,36 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
rc = syncJournal(pPager, 0);
if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
+ pList = sqlite3PcacheDirtyList(pPager->pPCache);
+#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
if( bBatch ){
- /* The pager is now in DBMOD state. But regardless of what happens
- ** next, attempting to play the journal back into the database would
- ** be unsafe. Close it now to make sure that does not happen. */
- sqlite3OsClose(pPager->jfd);
rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_BEGIN_ATOMIC_WRITE, 0);
- if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
- }
- rc = pager_write_pagelist(pPager,sqlite3PcacheDirtyList(pPager->pPCache));
- if( bBatch ){
if( rc==SQLITE_OK ){
- rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_COMMIT_ATOMIC_WRITE, 0);
+ rc = pager_write_pagelist(pPager, pList);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_COMMIT_ATOMIC_WRITE, 0);
+ }
+ if( rc!=SQLITE_OK ){
+ sqlite3OsFileControlHint(fd, SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE, 0);
+ }
+ }
+
+ if( (rc&0xFF)==SQLITE_IOERR && rc!=SQLITE_IOERR_NOMEM ){
+ rc = sqlite3JournalCreate(pPager->jfd);
+ if( rc!=SQLITE_OK ){
+ sqlite3OsClose(pPager->jfd);
+ goto commit_phase_one_exit;
+ }
+ bBatch = 0;
}else{
- sqlite3OsFileControl(fd, SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE, 0);
+ sqlite3OsClose(pPager->jfd);
}
}
+#endif /* SQLITE_ENABLE_BATCH_ATOMIC_WRITE */
+ if( bBatch==0 ){
+ rc = pager_write_pagelist(pPager, pList);
+ }
if( rc!=SQLITE_OK ){
assert( rc!=SQLITE_IOERR_BLOCKED );
goto commit_phase_one_exit;
@@ -54203,8 +57115,12 @@ SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){
#endif
/*
-** Parameter eStat must be either SQLITE_DBSTATUS_CACHE_HIT or
-** SQLITE_DBSTATUS_CACHE_MISS. Before returning, *pnVal is incremented by the
+** Parameter eStat must be one of SQLITE_DBSTATUS_CACHE_HIT, _MISS, _WRITE,
+** or _WRITE+1. The SQLITE_DBSTATUS_CACHE_WRITE+1 case is a translation
+** of SQLITE_DBSTATUS_CACHE_SPILL. The _SPILL case is not contiguous because
+** it was added later.
+**
+** Before returning, *pnVal is incremented by the
** current cache hit or miss count, according to the value of eStat. If the
** reset parameter is non-zero, the cache hit or miss count is zeroed before
** returning.
@@ -54214,15 +57130,18 @@ SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, i
assert( eStat==SQLITE_DBSTATUS_CACHE_HIT
|| eStat==SQLITE_DBSTATUS_CACHE_MISS
|| eStat==SQLITE_DBSTATUS_CACHE_WRITE
+ || eStat==SQLITE_DBSTATUS_CACHE_WRITE+1
);
assert( SQLITE_DBSTATUS_CACHE_HIT+1==SQLITE_DBSTATUS_CACHE_MISS );
assert( SQLITE_DBSTATUS_CACHE_HIT+2==SQLITE_DBSTATUS_CACHE_WRITE );
- assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1 && PAGER_STAT_WRITE==2 );
+ assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1
+ && PAGER_STAT_WRITE==2 && PAGER_STAT_SPILL==3 );
- *pnVal += pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT];
+ eStat -= SQLITE_DBSTATUS_CACHE_HIT;
+ *pnVal += pPager->aStat[eStat];
if( reset ){
- pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT] = 0;
+ pPager->aStat[eStat] = 0;
}
}
@@ -54426,6 +57345,16 @@ SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){
return pPager->fd;
}
+#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+/*
+** Reset the lock timeout for pager.
+*/
+SQLITE_PRIVATE void sqlite3PagerResetLockTimeout(Pager *pPager){
+ int x = 0;
+ sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_LOCK_TIMEOUT, &x);
+}
+#endif
+
/*
** Return the file handle for the journal file (if it exists).
** This will be either the rollback journal or the WAL file.
@@ -54456,7 +57385,11 @@ SQLITE_PRIVATE void sqlite3PagerSetCodec(
void (*xCodecFree)(void*),
void *pCodec
){
- if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec);
+ if( pPager->xCodecFree ){
+ pPager->xCodecFree(pPager->pCodec);
+ }else{
+ pager_reset(pPager);
+ }
pPager->xCodec = pPager->memDb ? 0 : xCodec;
pPager->xCodecSizeChng = xCodecSizeChng;
pPager->xCodecFree = xCodecFree;
@@ -54717,13 +57650,6 @@ SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *pPager, int eMode){
SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){
u8 eOld = pPager->journalMode; /* Prior journalmode */
-#ifdef SQLITE_DEBUG
- /* The print_pager_state() routine is intended to be used by the debugger
- ** only. We invoke it once here to suppress a compiler warning. */
- print_pager_state(pPager);
-#endif
-
-
/* The eMode parameter is always valid */
assert( eMode==PAGER_JOURNALMODE_DELETE
|| eMode==PAGER_JOURNALMODE_TRUNCATE
@@ -54886,6 +57812,7 @@ SQLITE_PRIVATE int sqlite3PagerCheckpoint(
pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace,
pnLog, pnCkpt
);
+ sqlite3PagerResetLockTimeout(pPager);
}
return rc;
}
@@ -55091,6 +58018,38 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager){
}
return rc;
}
+
+/*
+** The caller currently has a read transaction open on the database.
+** If this is not a WAL database, SQLITE_ERROR is returned. Otherwise,
+** this function takes a SHARED lock on the CHECKPOINTER slot and then
+** checks if the snapshot passed as the second argument is still
+** available. If so, SQLITE_OK is returned.
+**
+** If the snapshot is not available, SQLITE_ERROR is returned. Or, if
+** the CHECKPOINTER lock cannot be obtained, SQLITE_BUSY. If any error
+** occurs (any value other than SQLITE_OK is returned), the CHECKPOINTER
+** lock is released before returning.
+*/
+SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot){
+ int rc;
+ if( pPager->pWal ){
+ rc = sqlite3WalSnapshotCheck(pPager->pWal, pSnapshot);
+ }else{
+ rc = SQLITE_ERROR;
+ }
+ return rc;
+}
+
+/*
+** Release a lock obtained by an earlier successful call to
+** sqlite3PagerSnapshotCheck().
+*/
+SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager){
+ assert( pPager->pWal );
+ return sqlite3WalSnapshotUnlock(pPager->pWal);
+}
+
#endif /* SQLITE_ENABLE_SNAPSHOT */
#endif /* !SQLITE_OMIT_WAL */
@@ -55246,6 +58205,10 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){
** on a network filesystem. All users of the database must be able to
** share memory.
**
+** In the default unix and windows implementation, the wal-index is a mmapped
+** file whose name is the database name with a "-shm" suffix added. For that
+** reason, the wal-index is sometimes called the "shm" file.
+**
** The wal-index is transient. After a crash, the wal-index can (and should
** be) reconstructed from the original WAL file. In fact, the VFS is required
** to either truncate or zero the header of the wal-index when the last
@@ -55369,6 +58332,18 @@ SQLITE_PRIVATE int sqlite3WalTrace = 0;
#endif
/*
+** WAL mode depends on atomic aligned 32-bit loads and stores in a few
+** places. The following macros try to make this explicit.
+*/
+#if GCC_VESRION>=5004000
+# define AtomicLoad(PTR) __atomic_load_n((PTR),__ATOMIC_RELAXED)
+# define AtomicStore(PTR,VAL) __atomic_store_n((PTR),(VAL),__ATOMIC_RELAXED)
+#else
+# define AtomicLoad(PTR) (*(PTR))
+# define AtomicStore(PTR,VAL) (*(PTR) = (VAL))
+#endif
+
+/*
** The maximum (and only) versions of the wal and wal-index formats
** that may be interpreted by this version of SQLite.
**
@@ -55385,9 +58360,18 @@ SQLITE_PRIVATE int sqlite3WalTrace = 0;
#define WALINDEX_MAX_VERSION 3007000
/*
-** Indices of various locking bytes. WAL_NREADER is the number
+** Index numbers for various locking bytes. WAL_NREADER is the number
** of available reader locks and should be at least 3. The default
** is SQLITE_SHM_NLOCK==8 and WAL_NREADER==5.
+**
+** Technically, the various VFSes are free to implement these locks however
+** they see fit. However, compatibility is encouraged so that VFSes can
+** interoperate. The standard implemention used on both unix and windows
+** is for the index number to indicate a byte offset into the
+** WalCkptInfo.aLock[] array in the wal-index header. In other words, all
+** locks are on the shm file. The WALINDEX_LOCK_OFFSET constant (which
+** should be 120) is the location in the shm file for the first locking
+** byte.
*/
#define WAL_WRITE_LOCK 0
#define WAL_ALL_BUT_WRITE 1
@@ -55511,7 +58495,6 @@ struct WalCkptInfo {
#define WAL_FRAME_HDRSIZE 24
/* Size of write ahead log header, including checksum. */
-/* #define WAL_HDRSIZE 24 */
#define WAL_HDRSIZE 32
/* WAL magic value. Either this value, or the same value with the least
@@ -55557,6 +58540,7 @@ struct Wal {
u8 truncateOnCommit; /* True to truncate WAL file on commit */
u8 syncHeader; /* Fsync the WAL header if true */
u8 padToSectorBoundary; /* Pad transactions out to the next sector */
+ u8 bShmUnreliable; /* SHM content is read-only and unreliable */
WalIndexHdr hdr; /* Wal-index header for current transaction */
u32 minFrame; /* Ignore wal frames before this one */
u32 iReCksum; /* On commit, recalculate checksums from here */
@@ -55646,11 +58630,20 @@ struct WalIterator {
** is broken into pages of WALINDEX_PGSZ bytes. Wal-index pages are
** numbered from zero.
**
+** If the wal-index is currently smaller the iPage pages then the size
+** of the wal-index might be increased, but only if it is safe to do
+** so. It is safe to enlarge the wal-index if pWal->writeLock is true
+** or pWal->exclusiveMode==WAL_HEAPMEMORY_MODE.
+**
** If this call is successful, *ppPage is set to point to the wal-index
** page and SQLITE_OK is returned. If an error (an OOM or VFS error) occurs,
** then an SQLite error code is returned and *ppPage is set to 0.
*/
-static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){
+static SQLITE_NOINLINE int walIndexPageRealloc(
+ Wal *pWal, /* The WAL context */
+ int iPage, /* The page we seek */
+ volatile u32 **ppPage /* Write the page pointer here */
+){
int rc = SQLITE_OK;
/* Enlarge the pWal->apWiData[] array if required */
@@ -55669,16 +58662,19 @@ static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){
}
/* Request a pointer to the required page from the VFS */
- if( pWal->apWiData[iPage]==0 ){
- if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){
- pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ);
- if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM_BKPT;
- }else{
- rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ,
- pWal->writeLock, (void volatile **)&pWal->apWiData[iPage]
- );
+ assert( pWal->apWiData[iPage]==0 );
+ if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){
+ pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ);
+ if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM_BKPT;
+ }else{
+ rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ,
+ pWal->writeLock, (void volatile **)&pWal->apWiData[iPage]
+ );
+ assert( pWal->apWiData[iPage]!=0 || rc!=SQLITE_OK || pWal->writeLock==0 );
+ testcase( pWal->apWiData[iPage]==0 && rc==SQLITE_OK );
+ if( (rc&0xff)==SQLITE_READONLY ){
+ pWal->readOnly |= WAL_SHM_RDONLY;
if( rc==SQLITE_READONLY ){
- pWal->readOnly |= WAL_SHM_RDONLY;
rc = SQLITE_OK;
}
}
@@ -55688,6 +58684,16 @@ static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){
assert( iPage==0 || *ppPage || rc!=SQLITE_OK );
return rc;
}
+static int walIndexPage(
+ Wal *pWal, /* The WAL context */
+ int iPage, /* The page we seek */
+ volatile u32 **ppPage /* Write the page pointer here */
+){
+ if( pWal->nWiData<=iPage || (*ppPage = pWal->apWiData[iPage])==0 ){
+ return walIndexPageRealloc(pWal, iPage, ppPage);
+ }
+ return SQLITE_OK;
+}
/*
** Return a pointer to the WalCkptInfo structure in the wal-index.
@@ -55959,48 +58965,51 @@ static int walNextHash(int iPriorHash){
return (iPriorHash+1)&(HASHTABLE_NSLOT-1);
}
+/*
+** An instance of the WalHashLoc object is used to describe the location
+** of a page hash table in the wal-index. This becomes the return value
+** from walHashGet().
+*/
+typedef struct WalHashLoc WalHashLoc;
+struct WalHashLoc {
+ volatile ht_slot *aHash; /* Start of the wal-index hash table */
+ volatile u32 *aPgno; /* aPgno[1] is the page of first frame indexed */
+ u32 iZero; /* One less than the frame number of first indexed*/
+};
+
/*
** Return pointers to the hash table and page number array stored on
** page iHash of the wal-index. The wal-index is broken into 32KB pages
** numbered starting from 0.
**
-** Set output variable *paHash to point to the start of the hash table
-** in the wal-index file. Set *piZero to one less than the frame
+** Set output variable pLoc->aHash to point to the start of the hash table
+** in the wal-index file. Set pLoc->iZero to one less than the frame
** number of the first frame indexed by this hash table. If a
** slot in the hash table is set to N, it refers to frame number
-** (*piZero+N) in the log.
+** (pLoc->iZero+N) in the log.
**
-** Finally, set *paPgno so that *paPgno[1] is the page number of the
-** first frame indexed by the hash table, frame (*piZero+1).
+** Finally, set pLoc->aPgno so that pLoc->aPgno[1] is the page number of the
+** first frame indexed by the hash table, frame (pLoc->iZero+1).
*/
static int walHashGet(
Wal *pWal, /* WAL handle */
int iHash, /* Find the iHash'th table */
- volatile ht_slot **paHash, /* OUT: Pointer to hash index */
- volatile u32 **paPgno, /* OUT: Pointer to page number array */
- u32 *piZero /* OUT: Frame associated with *paPgno[0] */
+ WalHashLoc *pLoc /* OUT: Hash table location */
){
int rc; /* Return code */
- volatile u32 *aPgno;
- rc = walIndexPage(pWal, iHash, &aPgno);
+ rc = walIndexPage(pWal, iHash, &pLoc->aPgno);
assert( rc==SQLITE_OK || iHash>0 );
if( rc==SQLITE_OK ){
- u32 iZero;
- volatile ht_slot *aHash;
-
- aHash = (volatile ht_slot *)&aPgno[HASHTABLE_NPAGE];
+ pLoc->aHash = (volatile ht_slot *)&pLoc->aPgno[HASHTABLE_NPAGE];
if( iHash==0 ){
- aPgno = &aPgno[WALINDEX_HDR_SIZE/sizeof(u32)];
- iZero = 0;
+ pLoc->aPgno = &pLoc->aPgno[WALINDEX_HDR_SIZE/sizeof(u32)];
+ pLoc->iZero = 0;
}else{
- iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE;
+ pLoc->iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE;
}
-
- *paPgno = &aPgno[-1];
- *paHash = aHash;
- *piZero = iZero;
+ pLoc->aPgno = &pLoc->aPgno[-1];
}
return rc;
}
@@ -56046,9 +59055,7 @@ static u32 walFramePgno(Wal *pWal, u32 iFrame){
** actually needed.
*/
static void walCleanupHash(Wal *pWal){
- volatile ht_slot *aHash = 0; /* Pointer to hash table to clear */
- volatile u32 *aPgno = 0; /* Page number array for hash table */
- u32 iZero = 0; /* frame == (aHash[x]+iZero) */
+ WalHashLoc sLoc; /* Hash table location */
int iLimit = 0; /* Zero values greater than this */
int nByte; /* Number of bytes to zero in aPgno[] */
int i; /* Used to iterate through aHash[] */
@@ -56066,24 +59073,24 @@ static void walCleanupHash(Wal *pWal){
*/
assert( pWal->nWiData>walFramePage(pWal->hdr.mxFrame) );
assert( pWal->apWiData[walFramePage(pWal->hdr.mxFrame)] );
- walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &aHash, &aPgno, &iZero);
+ walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &sLoc);
/* Zero all hash-table entries that correspond to frame numbers greater
** than pWal->hdr.mxFrame.
*/
- iLimit = pWal->hdr.mxFrame - iZero;
+ iLimit = pWal->hdr.mxFrame - sLoc.iZero;
assert( iLimit>0 );
for(i=0; i<HASHTABLE_NSLOT; i++){
- if( aHash[i]>iLimit ){
- aHash[i] = 0;
+ if( sLoc.aHash[i]>iLimit ){
+ sLoc.aHash[i] = 0;
}
}
/* Zero the entries in the aPgno array that correspond to frames with
** frame numbers greater than pWal->hdr.mxFrame.
*/
- nByte = (int)((char *)aHash - (char *)&aPgno[iLimit+1]);
- memset((void *)&aPgno[iLimit+1], 0, nByte);
+ nByte = (int)((char *)sLoc.aHash - (char *)&sLoc.aPgno[iLimit+1]);
+ memset((void *)&sLoc.aPgno[iLimit+1], 0, nByte);
#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
/* Verify that the every entry in the mapping region is still reachable
@@ -56093,10 +59100,10 @@ static void walCleanupHash(Wal *pWal){
int j; /* Loop counter */
int iKey; /* Hash key */
for(j=1; j<=iLimit; j++){
- for(iKey=walHash(aPgno[j]); aHash[iKey]; iKey=walNextHash(iKey)){
- if( aHash[iKey]==j ) break;
+ for(iKey=walHash(sLoc.aPgno[j]);sLoc.aHash[iKey];iKey=walNextHash(iKey)){
+ if( sLoc.aHash[iKey]==j ) break;
}
- assert( aHash[iKey]==j );
+ assert( sLoc.aHash[iKey]==j );
}
}
#endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */
@@ -56109,11 +59116,9 @@ static void walCleanupHash(Wal *pWal){
*/
static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
int rc; /* Return code */
- u32 iZero = 0; /* One less than frame number of aPgno[1] */
- volatile u32 *aPgno = 0; /* Page number array */
- volatile ht_slot *aHash = 0; /* Hash table */
+ WalHashLoc sLoc; /* Wal-index hash table location */
- rc = walHashGet(pWal, walFramePage(iFrame), &aHash, &aPgno, &iZero);
+ rc = walHashGet(pWal, walFramePage(iFrame), &sLoc);
/* Assuming the wal-index file was successfully mapped, populate the
** page number array and hash table entry.
@@ -56123,15 +59128,16 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
int idx; /* Value to write to hash-table slot */
int nCollide; /* Number of hash collisions */
- idx = iFrame - iZero;
+ idx = iFrame - sLoc.iZero;
assert( idx <= HASHTABLE_NSLOT/2 + 1 );
/* If this is the first entry to be added to this hash-table, zero the
** entire hash table and aPgno[] array before proceeding.
*/
if( idx==1 ){
- int nByte = (int)((u8 *)&aHash[HASHTABLE_NSLOT] - (u8 *)&aPgno[1]);
- memset((void*)&aPgno[1], 0, nByte);
+ int nByte = (int)((u8 *)&sLoc.aHash[HASHTABLE_NSLOT]
+ - (u8 *)&sLoc.aPgno[1]);
+ memset((void*)&sLoc.aPgno[1], 0, nByte);
}
/* If the entry in aPgno[] is already set, then the previous writer
@@ -56140,18 +59146,18 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
** Remove the remnants of that writers uncommitted transaction from
** the hash-table before writing any new entries.
*/
- if( aPgno[idx] ){
+ if( sLoc.aPgno[idx] ){
walCleanupHash(pWal);
- assert( !aPgno[idx] );
+ assert( !sLoc.aPgno[idx] );
}
/* Write the aPgno[] array entry and the hash-table slot. */
nCollide = idx;
- for(iKey=walHash(iPage); aHash[iKey]; iKey=walNextHash(iKey)){
+ for(iKey=walHash(iPage); sLoc.aHash[iKey]; iKey=walNextHash(iKey)){
if( (nCollide--)==0 ) return SQLITE_CORRUPT_BKPT;
}
- aPgno[idx] = iPage;
- aHash[iKey] = (ht_slot)idx;
+ sLoc.aPgno[idx] = iPage;
+ sLoc.aHash[iKey] = (ht_slot)idx;
#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
/* Verify that the number of entries in the hash table exactly equals
@@ -56160,7 +59166,7 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
{
int i; /* Loop counter */
int nEntry = 0; /* Number of entries in the hash table */
- for(i=0; i<HASHTABLE_NSLOT; i++){ if( aHash[i] ) nEntry++; }
+ for(i=0; i<HASHTABLE_NSLOT; i++){ if( sLoc.aHash[i] ) nEntry++; }
assert( nEntry==idx );
}
@@ -56172,10 +59178,12 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
if( (idx&0x3ff)==0 ){
int i; /* Loop counter */
for(i=1; i<=idx; i++){
- for(iKey=walHash(aPgno[i]); aHash[iKey]; iKey=walNextHash(iKey)){
- if( aHash[iKey]==i ) break;
+ for(iKey=walHash(sLoc.aPgno[i]);
+ sLoc.aHash[iKey];
+ iKey=walNextHash(iKey)){
+ if( sLoc.aHash[iKey]==i ) break;
}
- assert( aHash[iKey]==i );
+ assert( sLoc.aHash[iKey]==i );
}
}
#endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */
@@ -56201,7 +59209,6 @@ static int walIndexRecover(Wal *pWal){
i64 nSize; /* Size of log file */
u32 aFrameCksum[2] = {0, 0};
int iLock; /* Lock offset to lock for checkpoint */
- int nLock; /* Number of locks to hold */
/* Obtain an exclusive lock on all byte in the locking range not already
** locked by the caller. The caller is guaranteed to have locked the
@@ -56214,11 +59221,17 @@ static int walIndexRecover(Wal *pWal){
assert( WAL_CKPT_LOCK==WAL_ALL_BUT_WRITE );
assert( pWal->writeLock );
iLock = WAL_ALL_BUT_WRITE + pWal->ckptLock;
- nLock = SQLITE_SHM_NLOCK - iLock;
- rc = walLockExclusive(pWal, iLock, nLock);
+ rc = walLockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock);
+ if( rc==SQLITE_OK ){
+ rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1);
+ if( rc!=SQLITE_OK ){
+ walUnlockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock);
+ }
+ }
if( rc ){
return rc;
}
+
WALTRACE(("WAL%p: recovery begin...\n", pWal));
memset(&pWal->hdr, 0, sizeof(WalIndexHdr));
@@ -56356,7 +59369,8 @@ finished:
recovery_error:
WALTRACE(("WAL%p: recovery %s\n", pWal, rc ? "failed" : "ok"));
- walUnlockExclusive(pWal, iLock, nLock);
+ walUnlockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock);
+ walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1);
return rc;
}
@@ -56364,13 +59378,14 @@ recovery_error:
** Close an open wal-index.
*/
static void walIndexClose(Wal *pWal, int isDelete){
- if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){
+ if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE || pWal->bShmUnreliable ){
int i;
for(i=0; i<pWal->nWiData; i++){
sqlite3_free((void *)pWal->apWiData[i]);
pWal->apWiData[i] = 0;
}
- }else{
+ }
+ if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){
sqlite3OsShmUnmap(pWal->pDbFd, isDelete);
}
}
@@ -56657,8 +59672,9 @@ static void walIteratorFree(WalIterator *p){
/*
** Construct a WalInterator object that can be used to loop over all
-** pages in the WAL in ascending order. The caller must hold the checkpoint
-** lock.
+** pages in the WAL following frame nBackfill in ascending order. Frames
+** nBackfill or earlier may be included - excluding them is an optimization
+** only. The caller must hold the checkpoint lock.
**
** On success, make *pp point to the newly allocated WalInterator object
** return SQLITE_OK. Otherwise, return an error code. If this routine
@@ -56667,7 +59683,7 @@ static void walIteratorFree(WalIterator *p){
** The calling routine should invoke walIteratorFree() to destroy the
** WalIterator object when it has finished with it.
*/
-static int walIteratorInit(Wal *pWal, WalIterator **pp){
+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 */
@@ -56704,40 +59720,39 @@ static int walIteratorInit(Wal *pWal, WalIterator **pp){
rc = SQLITE_NOMEM_BKPT;
}
- for(i=0; rc==SQLITE_OK && i<nSegment; i++){
- volatile ht_slot *aHash;
- u32 iZero;
- volatile u32 *aPgno;
+ for(i=walFramePage(nBackfill+1); rc==SQLITE_OK && i<nSegment; i++){
+ WalHashLoc sLoc;
- rc = walHashGet(pWal, i, &aHash, &aPgno, &iZero);
+ rc = walHashGet(pWal, i, &sLoc);
if( rc==SQLITE_OK ){
int j; /* Counter variable */
int nEntry; /* Number of entries in this segment */
ht_slot *aIndex; /* Sorted index for this segment */
- aPgno++;
+ sLoc.aPgno++;
if( (i+1)==nSegment ){
- nEntry = (int)(iLast - iZero);
+ nEntry = (int)(iLast - sLoc.iZero);
}else{
- nEntry = (int)((u32*)aHash - (u32*)aPgno);
+ nEntry = (int)((u32*)sLoc.aHash - (u32*)sLoc.aPgno);
}
- aIndex = &((ht_slot *)&p->aSegment[p->nSegment])[iZero];
- iZero++;
+ aIndex = &((ht_slot *)&p->aSegment[p->nSegment])[sLoc.iZero];
+ sLoc.iZero++;
for(j=0; j<nEntry; j++){
aIndex[j] = (ht_slot)j;
}
- walMergesort((u32 *)aPgno, aTmp, aIndex, &nEntry);
- p->aSegment[i].iZero = iZero;
+ walMergesort((u32 *)sLoc.aPgno, aTmp, aIndex, &nEntry);
+ p->aSegment[i].iZero = sLoc.iZero;
p->aSegment[i].nEntry = nEntry;
p->aSegment[i].aIndex = aIndex;
- p->aSegment[i].aPgno = (u32 *)aPgno;
+ p->aSegment[i].aPgno = (u32 *)sLoc.aPgno;
}
}
sqlite3_free(aTmp);
if( rc!=SQLITE_OK ){
walIteratorFree(p);
+ p = 0;
}
*pp = p;
return rc;
@@ -56860,13 +59875,6 @@ static int walCheckpoint(
pInfo = walCkptInfo(pWal);
if( pInfo->nBackfill<pWal->hdr.mxFrame ){
- /* Allocate the iterator */
- rc = walIteratorInit(pWal, &pIter);
- if( rc!=SQLITE_OK ){
- return rc;
- }
- assert( pIter );
-
/* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked
** in the SQLITE_CHECKPOINT_PASSIVE mode. */
assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 );
@@ -56903,10 +59911,15 @@ static int walCheckpoint(
}
}
- if( pInfo->nBackfill<mxSafeFrame
+ /* Allocate the iterator */
+ if( pInfo->nBackfill<mxSafeFrame ){
+ rc = walIteratorInit(pWal, pInfo->nBackfill, &pIter);
+ assert( rc==SQLITE_OK || pIter==0 );
+ }
+
+ if( pIter
&& (rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(0),1))==SQLITE_OK
){
- i64 nSize; /* Current size of database file */
u32 nBackfill = pInfo->nBackfill;
pInfo->nBackfillAttempted = mxSafeFrame;
@@ -56919,6 +59932,7 @@ static int walCheckpoint(
*/
if( rc==SQLITE_OK ){
i64 nReq = ((i64)mxPage * szPage);
+ i64 nSize; /* Current size of database file */
rc = sqlite3OsFileSize(pWal->pDbFd, &nSize);
if( rc==SQLITE_OK && nSize<nReq ){
sqlite3OsFileControlHint(pWal->pDbFd, SQLITE_FCNTL_SIZE_HINT, &nReq);
@@ -57164,6 +60178,12 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){
}
/*
+** This is the value that walTryBeginRead returns when it needs to
+** be retried.
+*/
+#define WAL_RETRY (-1)
+
+/*
** Read the wal-index header from the wal-index and into pWal->hdr.
** If the wal-header appears to be corrupt, try to reconstruct the
** wal-index from the WAL before returning.
@@ -57186,9 +60206,29 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
assert( pChanged );
rc = walIndexPage(pWal, 0, &page0);
if( rc!=SQLITE_OK ){
- return rc;
- };
- assert( page0 || pWal->writeLock==0 );
+ assert( rc!=SQLITE_READONLY ); /* READONLY changed to OK in walIndexPage */
+ if( rc==SQLITE_READONLY_CANTINIT ){
+ /* The SQLITE_READONLY_CANTINIT return means that the shared-memory
+ ** was openable but is not writable, and this thread is unable to
+ ** confirm that another write-capable connection has the shared-memory
+ ** open, and hence the content of the shared-memory is unreliable,
+ ** since the shared-memory might be inconsistent with the WAL file
+ ** and there is no writer on hand to fix it. */
+ assert( page0==0 );
+ assert( pWal->writeLock==0 );
+ assert( pWal->readOnly & WAL_SHM_RDONLY );
+ pWal->bShmUnreliable = 1;
+ pWal->exclusiveMode = WAL_HEAPMEMORY_MODE;
+ *pChanged = 1;
+ }else{
+ return rc; /* Any other non-OK return is just an error */
+ }
+ }else{
+ /* page0 can be NULL if the SHM is zero bytes in size and pWal->writeLock
+ ** is zero, which prevents the SHM from growing */
+ testcase( page0!=0 );
+ }
+ assert( page0!=0 || pWal->writeLock==0 );
/* If the first page of the wal-index has been mapped, try to read the
** wal-index header immediately, without holding any lock. This usually
@@ -57202,7 +60242,7 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
*/
assert( badHdr==0 || pWal->writeLock==0 );
if( badHdr ){
- if( pWal->readOnly & WAL_SHM_RDONLY ){
+ if( pWal->bShmUnreliable==0 && (pWal->readOnly & WAL_SHM_RDONLY) ){
if( SQLITE_OK==(rc = walLockShared(pWal, WAL_WRITE_LOCK)) ){
walUnlockShared(pWal, WAL_WRITE_LOCK);
rc = SQLITE_READONLY_RECOVERY;
@@ -57232,15 +60272,193 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
if( badHdr==0 && pWal->hdr.iVersion!=WALINDEX_MAX_VERSION ){
rc = SQLITE_CANTOPEN_BKPT;
}
+ if( pWal->bShmUnreliable ){
+ if( rc!=SQLITE_OK ){
+ walIndexClose(pWal, 0);
+ pWal->bShmUnreliable = 0;
+ assert( pWal->nWiData>0 && pWal->apWiData[0]==0 );
+ /* walIndexRecover() might have returned SHORT_READ if a concurrent
+ ** writer truncated the WAL out from under it. If that happens, it
+ ** indicates that a writer has fixed the SHM file for us, so retry */
+ if( rc==SQLITE_IOERR_SHORT_READ ) rc = WAL_RETRY;
+ }
+ pWal->exclusiveMode = WAL_NORMAL_MODE;
+ }
return rc;
}
/*
-** This is the value that walTryBeginRead returns when it needs to
-** be retried.
+** Open a transaction in a connection where the shared-memory is read-only
+** and where we cannot verify that there is a separate write-capable connection
+** on hand to keep the shared-memory up-to-date with the WAL file.
+**
+** This can happen, for example, when the shared-memory is implemented by
+** memory-mapping a *-shm file, where a prior writer has shut down and
+** left the *-shm file on disk, and now the present connection is trying
+** to use that database but lacks write permission on the *-shm file.
+** Other scenarios are also possible, depending on the VFS implementation.
+**
+** Precondition:
+**
+** The *-wal file has been read and an appropriate wal-index has been
+** constructed in pWal->apWiData[] using heap memory instead of shared
+** memory.
+**
+** If this function returns SQLITE_OK, then the read transaction has
+** been successfully opened. In this case output variable (*pChanged)
+** is set to true before returning if the caller should discard the
+** contents of the page cache before proceeding. Or, if it returns
+** WAL_RETRY, then the heap memory wal-index has been discarded and
+** the caller should retry opening the read transaction from the
+** beginning (including attempting to map the *-shm file).
+**
+** If an error occurs, an SQLite error code is returned.
*/
-#define WAL_RETRY (-1)
+static int walBeginShmUnreliable(Wal *pWal, int *pChanged){
+ i64 szWal; /* Size of wal file on disk in bytes */
+ i64 iOffset; /* Current offset when reading wal file */
+ u8 aBuf[WAL_HDRSIZE]; /* Buffer to load WAL header into */
+ u8 *aFrame = 0; /* Malloc'd buffer to load entire frame */
+ int szFrame; /* Number of bytes in buffer aFrame[] */
+ u8 *aData; /* Pointer to data part of aFrame buffer */
+ volatile void *pDummy; /* Dummy argument for xShmMap */
+ int rc; /* Return code */
+ u32 aSaveCksum[2]; /* Saved copy of pWal->hdr.aFrameCksum */
+
+ assert( pWal->bShmUnreliable );
+ assert( pWal->readOnly & WAL_SHM_RDONLY );
+ assert( pWal->nWiData>0 && pWal->apWiData[0] );
+
+ /* Take WAL_READ_LOCK(0). This has the effect of preventing any
+ ** writers from running a checkpoint, but does not stop them
+ ** from running recovery. */
+ rc = walLockShared(pWal, WAL_READ_LOCK(0));
+ if( rc!=SQLITE_OK ){
+ if( rc==SQLITE_BUSY ) rc = WAL_RETRY;
+ goto begin_unreliable_shm_out;
+ }
+ pWal->readLock = 0;
+
+ /* Check to see if a separate writer has attached to the shared-memory area,
+ ** thus making the shared-memory "reliable" again. Do this by invoking
+ ** the xShmMap() routine of the VFS and looking to see if the return
+ ** is SQLITE_READONLY instead of SQLITE_READONLY_CANTINIT.
+ **
+ ** If the shared-memory is now "reliable" return WAL_RETRY, which will
+ ** cause the heap-memory WAL-index to be discarded and the actual
+ ** shared memory to be used in its place.
+ **
+ ** This step is important because, even though this connection is holding
+ ** the WAL_READ_LOCK(0) which prevents a checkpoint, a writer might
+ ** have already checkpointed the WAL file and, while the current
+ ** is active, wrap the WAL and start overwriting frames that this
+ ** process wants to use.
+ **
+ ** Once sqlite3OsShmMap() has been called for an sqlite3_file and has
+ ** returned any SQLITE_READONLY value, it must return only SQLITE_READONLY
+ ** or SQLITE_READONLY_CANTINIT or some error for all subsequent invocations,
+ ** even if some external agent does a "chmod" to make the shared-memory
+ ** writable by us, until sqlite3OsShmUnmap() has been called.
+ ** This is a requirement on the VFS implementation.
+ */
+ rc = sqlite3OsShmMap(pWal->pDbFd, 0, WALINDEX_PGSZ, 0, &pDummy);
+ assert( rc!=SQLITE_OK ); /* SQLITE_OK not possible for read-only connection */
+ if( rc!=SQLITE_READONLY_CANTINIT ){
+ rc = (rc==SQLITE_READONLY ? WAL_RETRY : rc);
+ goto begin_unreliable_shm_out;
+ }
+
+ /* We reach this point only if the real shared-memory is still unreliable.
+ ** Assume the in-memory WAL-index substitute is correct and load it
+ ** into pWal->hdr.
+ */
+ memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr));
+
+ /* Make sure some writer hasn't come in and changed the WAL file out
+ ** from under us, then disconnected, while we were not looking.
+ */
+ rc = sqlite3OsFileSize(pWal->pWalFd, &szWal);
+ if( rc!=SQLITE_OK ){
+ goto begin_unreliable_shm_out;
+ }
+ if( szWal<WAL_HDRSIZE ){
+ /* If the wal file is too small to contain a wal-header and the
+ ** wal-index header has mxFrame==0, then it must be safe to proceed
+ ** reading the database file only. However, the page cache cannot
+ ** be trusted, as a read/write connection may have connected, written
+ ** the db, run a checkpoint, truncated the wal file and disconnected
+ ** since this client's last read transaction. */
+ *pChanged = 1;
+ rc = (pWal->hdr.mxFrame==0 ? SQLITE_OK : WAL_RETRY);
+ goto begin_unreliable_shm_out;
+ }
+
+ /* Check the salt keys at the start of the wal file still match. */
+ rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0);
+ if( rc!=SQLITE_OK ){
+ goto begin_unreliable_shm_out;
+ }
+ if( memcmp(&pWal->hdr.aSalt, &aBuf[16], 8) ){
+ /* Some writer has wrapped the WAL file while we were not looking.
+ ** Return WAL_RETRY which will cause the in-memory WAL-index to be
+ ** rebuilt. */
+ rc = WAL_RETRY;
+ goto begin_unreliable_shm_out;
+ }
+
+ /* Allocate a buffer to read frames into */
+ szFrame = pWal->hdr.szPage + WAL_FRAME_HDRSIZE;
+ aFrame = (u8 *)sqlite3_malloc64(szFrame);
+ if( aFrame==0 ){
+ rc = SQLITE_NOMEM_BKPT;
+ goto begin_unreliable_shm_out;
+ }
+ aData = &aFrame[WAL_FRAME_HDRSIZE];
+
+ /* Check to see if a complete transaction has been appended to the
+ ** wal file since the heap-memory wal-index was created. If so, the
+ ** heap-memory wal-index is discarded and WAL_RETRY returned to
+ ** the caller. */
+ aSaveCksum[0] = pWal->hdr.aFrameCksum[0];
+ aSaveCksum[1] = pWal->hdr.aFrameCksum[1];
+ for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->hdr.szPage);
+ iOffset+szFrame<=szWal;
+ iOffset+=szFrame
+ ){
+ u32 pgno; /* Database page number for frame */
+ u32 nTruncate; /* dbsize field from frame header */
+
+ /* Read and decode the next log frame. */
+ rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset);
+ if( rc!=SQLITE_OK ) break;
+ if( !walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame) ) break;
+
+ /* If nTruncate is non-zero, then a complete transaction has been
+ ** appended to this wal file. Set rc to WAL_RETRY and break out of
+ ** the loop. */
+ if( nTruncate ){
+ rc = WAL_RETRY;
+ break;
+ }
+ }
+ pWal->hdr.aFrameCksum[0] = aSaveCksum[0];
+ pWal->hdr.aFrameCksum[1] = aSaveCksum[1];
+
+ begin_unreliable_shm_out:
+ sqlite3_free(aFrame);
+ if( rc!=SQLITE_OK ){
+ int i;
+ for(i=0; i<pWal->nWiData; i++){
+ sqlite3_free((void*)pWal->apWiData[i]);
+ pWal->apWiData[i] = 0;
+ }
+ pWal->bShmUnreliable = 0;
+ sqlite3WalEndReadTransaction(pWal);
+ *pChanged = 1;
+ }
+ return rc;
+}
/*
** Attempt to start a read transaction. This might fail due to a race or
@@ -57256,7 +60474,7 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
** checkpointed. If useWal==0 then this routine calls walIndexReadHdr()
** to make a copy of the wal-index header into pWal->hdr. If the
** wal-index header has changed, *pChanged is set to 1 (as an indication
-** to the caller that the local paget cache is obsolete and needs to be
+** to the caller that the local page cache is obsolete and needs to be
** flushed.) When useWal==1, the wal-index header is assumed to already
** be loaded and the pChanged parameter is unused.
**
@@ -57302,6 +60520,9 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
assert( pWal->readLock<0 ); /* Not currently locked */
+ /* useWal may only be set for read/write connections */
+ assert( (pWal->readOnly & WAL_SHM_RDONLY)==0 || useWal==0 );
+
/* Take steps to avoid spinning forever if there is a protocol error.
**
** Circumstances that cause a RETRY should only last for the briefest
@@ -57330,7 +60551,10 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
}
if( !useWal ){
- rc = walIndexReadHdr(pWal, pChanged);
+ assert( rc==SQLITE_OK );
+ if( pWal->bShmUnreliable==0 ){
+ rc = walIndexReadHdr(pWal, pChanged);
+ }
if( rc==SQLITE_BUSY ){
/* If there is not a recovery running in another thread or process
** then convert BUSY errors to WAL_RETRY. If recovery is known to
@@ -57359,13 +60583,17 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
if( rc!=SQLITE_OK ){
return rc;
}
+ else if( pWal->bShmUnreliable ){
+ return walBeginShmUnreliable(pWal, pChanged);
+ }
}
+ assert( pWal->nWiData>0 );
+ assert( pWal->apWiData[0]!=0 );
pInfo = walCkptInfo(pWal);
- if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame
+ if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame
#ifdef SQLITE_ENABLE_SNAPSHOT
- && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0
- || 0==memcmp(&pWal->hdr, pWal->pSnapshot, sizeof(WalIndexHdr)))
+ && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0)
#endif
){
/* The WAL has been completely backfilled (or it is empty).
@@ -57412,7 +60640,7 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
}
#endif
for(i=1; i<WAL_NREADER; i++){
- u32 thisMark = pInfo->aReadMark[i];
+ u32 thisMark = AtomicLoad(pInfo->aReadMark+i);
if( mxReadMark<=thisMark && thisMark<=mxFrame ){
assert( thisMark!=READMARK_NOT_USED );
mxReadMark = thisMark;
@@ -57425,7 +60653,7 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
for(i=1; i<WAL_NREADER; i++){
rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1);
if( rc==SQLITE_OK ){
- mxReadMark = pInfo->aReadMark[i] = mxFrame;
+ mxReadMark = AtomicStore(pInfo->aReadMark+i,mxFrame);
mxI = i;
walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1);
break;
@@ -57436,7 +60664,7 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
}
if( mxI==0 ){
assert( rc==SQLITE_BUSY || (pWal->readOnly & WAL_SHM_RDONLY)!=0 );
- return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTLOCK;
+ return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTINIT;
}
rc = walLockShared(pWal, WAL_READ_LOCK(mxI));
@@ -57477,9 +60705,9 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
** we can guarantee that the checkpointer that set nBackfill could not
** see any pages past pWal->hdr.mxFrame, this problem does not come up.
*/
- pWal->minFrame = pInfo->nBackfill+1;
+ pWal->minFrame = AtomicLoad(&pInfo->nBackfill)+1;
walShmBarrier(pWal);
- if( pInfo->aReadMark[mxI]!=mxReadMark
+ if( AtomicLoad(pInfo->aReadMark+mxI)!=mxReadMark
|| memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr))
){
walUnlockShared(pWal, WAL_READ_LOCK(mxI));
@@ -57530,16 +60758,14 @@ SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal){
}else{
u32 i = pInfo->nBackfillAttempted;
for(i=pInfo->nBackfillAttempted; i>pInfo->nBackfill; i--){
- volatile ht_slot *dummy;
- volatile u32 *aPgno; /* Array of page numbers */
- u32 iZero; /* Frame corresponding to aPgno[0] */
+ WalHashLoc sLoc; /* Hash table location */
u32 pgno; /* Page number in db file */
i64 iDbOff; /* Offset of db file entry */
i64 iWalOff; /* Offset of wal file entry */
- rc = walHashGet(pWal, walFramePage(i), &dummy, &aPgno, &iZero);
+ rc = walHashGet(pWal, walFramePage(i), &sLoc);
if( rc!=SQLITE_OK ) break;
- pgno = aPgno[i-iZero];
+ pgno = sLoc.aPgno[i-sLoc.iZero];
iDbOff = (i64)(pgno-1) * szPage;
if( iDbOff+szPage<=szDb ){
@@ -57580,7 +60806,7 @@ SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal){
**
** If the database contents have changes since the previous read
** transaction, then *pChanged is set to 1 before returning. The
-** Pager layer will use this to know that is cache is stale and
+** Pager layer will use this to know that its cache is stale and
** needs to be flushed.
*/
SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){
@@ -57642,7 +60868,7 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){
/* Check that the wal file has not been wrapped. Assuming that it has
** not, also check that no checkpointer has attempted to checkpoint any
** frames beyond pSnapshot->mxFrame. If either of these conditions are
- ** true, return SQLITE_BUSY_SNAPSHOT. Otherwise, overwrite pWal->hdr
+ ** true, return SQLITE_ERROR_SNAPSHOT. Otherwise, overwrite pWal->hdr
** with *pSnapshot and set *pChanged as appropriate for opening the
** snapshot. */
if( !memcmp(pSnapshot->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt))
@@ -57652,11 +60878,12 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){
memcpy(&pWal->hdr, pSnapshot, sizeof(WalIndexHdr));
*pChanged = bChanged;
}else{
- rc = SQLITE_BUSY_SNAPSHOT;
+ rc = SQLITE_ERROR_SNAPSHOT;
}
/* Release the shared CKPT lock obtained above. */
walUnlockShared(pWal, WAL_CKPT_LOCK);
+ pWal->minFrame = 1;
}
@@ -57708,7 +60935,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame(
** then the WAL is ignored by the reader so return early, as if the
** WAL were empty.
*/
- if( iLast==0 || pWal->readLock==0 ){
+ if( iLast==0 || (pWal->readLock==0 && pWal->bShmUnreliable==0) ){
*piRead = 0;
return SQLITE_OK;
}
@@ -57739,22 +60966,21 @@ SQLITE_PRIVATE int sqlite3WalFindFrame(
** table after the current read-transaction had started.
*/
iMinHash = walFramePage(pWal->minFrame);
- for(iHash=walFramePage(iLast); iHash>=iMinHash && iRead==0; iHash--){
- volatile ht_slot *aHash; /* Pointer to hash table */
- volatile u32 *aPgno; /* Pointer to array of page numbers */
- u32 iZero; /* Frame number corresponding to aPgno[0] */
+ for(iHash=walFramePage(iLast); iHash>=iMinHash; iHash--){
+ WalHashLoc sLoc; /* Hash table location */
int iKey; /* Hash slot index */
int nCollide; /* Number of hash collisions remaining */
int rc; /* Error code */
- rc = walHashGet(pWal, iHash, &aHash, &aPgno, &iZero);
+ rc = walHashGet(pWal, iHash, &sLoc);
if( rc!=SQLITE_OK ){
return rc;
}
nCollide = HASHTABLE_NSLOT;
- for(iKey=walHash(pgno); aHash[iKey]; iKey=walNextHash(iKey)){
- u32 iFrame = aHash[iKey] + iZero;
- if( iFrame<=iLast && iFrame>=pWal->minFrame && aPgno[aHash[iKey]]==pgno ){
+ for(iKey=walHash(pgno); sLoc.aHash[iKey]; iKey=walNextHash(iKey)){
+ u32 iFrame = sLoc.aHash[iKey] + sLoc.iZero;
+ if( iFrame<=iLast && iFrame>=pWal->minFrame
+ && sLoc.aPgno[sLoc.aHash[iKey]]==pgno ){
assert( iFrame>iRead || CORRUPT_DB );
iRead = iFrame;
}
@@ -57762,6 +60988,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame(
return SQLITE_CORRUPT_BKPT;
}
}
+ if( iRead ) break;
}
#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
@@ -57771,8 +60998,8 @@ SQLITE_PRIVATE int sqlite3WalFindFrame(
{
u32 iRead2 = 0;
u32 iTest;
- assert( pWal->minFrame>0 );
- for(iTest=iLast; iTest>=pWal->minFrame; iTest--){
+ assert( pWal->bShmUnreliable || pWal->minFrame>0 );
+ for(iTest=iLast; iTest>=pWal->minFrame && iTest>0; iTest--){
if( walFramePgno(pWal, iTest)==pgno ){
iRead2 = iTest;
break;
@@ -58548,24 +61775,24 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){
assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) );
if( op==0 ){
- if( pWal->exclusiveMode ){
- pWal->exclusiveMode = 0;
+ if( pWal->exclusiveMode!=WAL_NORMAL_MODE ){
+ pWal->exclusiveMode = WAL_NORMAL_MODE;
if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){
- pWal->exclusiveMode = 1;
+ pWal->exclusiveMode = WAL_EXCLUSIVE_MODE;
}
- rc = pWal->exclusiveMode==0;
+ rc = pWal->exclusiveMode==WAL_NORMAL_MODE;
}else{
/* Already in locking_mode=NORMAL */
rc = 0;
}
}else if( op>0 ){
- assert( pWal->exclusiveMode==0 );
+ assert( pWal->exclusiveMode==WAL_NORMAL_MODE );
assert( pWal->readLock>=0 );
walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock));
- pWal->exclusiveMode = 1;
+ pWal->exclusiveMode = WAL_EXCLUSIVE_MODE;
rc = 1;
}else{
- rc = pWal->exclusiveMode==0;
+ rc = pWal->exclusiveMode==WAL_NORMAL_MODE;
}
return rc;
}
@@ -58628,6 +61855,43 @@ SQLITE_API int sqlite3_snapshot_cmp(sqlite3_snapshot *p1, sqlite3_snapshot *p2){
if( pHdr1->mxFrame>pHdr2->mxFrame ) return +1;
return 0;
}
+
+/*
+** The caller currently has a read transaction open on the database.
+** This function takes a SHARED lock on the CHECKPOINTER slot and then
+** checks if the snapshot passed as the second argument is still
+** available. If so, SQLITE_OK is returned.
+**
+** If the snapshot is not available, SQLITE_ERROR is returned. Or, if
+** the CHECKPOINTER lock cannot be obtained, SQLITE_BUSY. If any error
+** occurs (any value other than SQLITE_OK is returned), the CHECKPOINTER
+** lock is released before returning.
+*/
+SQLITE_PRIVATE int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot){
+ int rc;
+ rc = walLockShared(pWal, WAL_CKPT_LOCK);
+ if( rc==SQLITE_OK ){
+ WalIndexHdr *pNew = (WalIndexHdr*)pSnapshot;
+ if( memcmp(pNew->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt))
+ || pNew->mxFrame<walCkptInfo(pWal)->nBackfillAttempted
+ ){
+ rc = SQLITE_ERROR_SNAPSHOT;
+ walUnlockShared(pWal, WAL_CKPT_LOCK);
+ }
+ }
+ return rc;
+}
+
+/*
+** Release a lock obtained by an earlier successful call to
+** sqlite3WalSnapshotCheck().
+*/
+SQLITE_PRIVATE void sqlite3WalSnapshotUnlock(Wal *pWal){
+ assert( pWal );
+ walUnlockShared(pWal, WAL_CKPT_LOCK);
+}
+
+
#endif /* SQLITE_ENABLE_SNAPSHOT */
#ifdef SQLITE_ENABLE_ZIPVFS
@@ -59176,20 +62440,20 @@ struct BtCursor {
u8 curFlags; /* zero or more BTCF_* flags defined below */
u8 curPagerFlags; /* Flags to send to sqlite3PagerGet() */
u8 hints; /* As configured by CursorSetHints() */
- int nOvflAlloc; /* Allocated size of aOverflow[] array */
+ int skipNext; /* Prev() is noop if negative. Next() is noop if positive.
+ ** Error code if eState==CURSOR_FAULT */
Btree *pBtree; /* The Btree to which this cursor belongs */
- BtShared *pBt; /* The BtShared this cursor points to */
- BtCursor *pNext; /* Forms a linked list of all cursors */
Pgno *aOverflow; /* Cache of overflow page locations */
- CellInfo info; /* A parse of the cell we are pointing at */
- i64 nKey; /* Size of pKey, or last integer key */
void *pKey; /* Saved key that was cursor last known position */
- Pgno pgnoRoot; /* The root page of this tree */
- int skipNext; /* Prev() is noop if negative. Next() is noop if positive.
- ** Error code if eState==CURSOR_FAULT */
/* All fields above are zeroed when the cursor is allocated. See
** sqlite3BtreeCursorZero(). Fields that follow must be manually
** initialized. */
+#define BTCURSOR_FIRST_UNINIT pBt /* Name of first uninitialized field */
+ BtShared *pBt; /* The BtShared this cursor points to */
+ BtCursor *pNext; /* Forms a linked list of all cursors */
+ CellInfo info; /* A parse of the cell we are pointing at */
+ i64 nKey; /* Size of pKey, or last integer key */
+ Pgno pgnoRoot; /* The root page of this tree */
i8 iPage; /* Index of current page in apPage */
u8 curIntKey; /* Value of apPage[0]->intKey */
u16 ix; /* Current index for apPage[iPage] */
@@ -59239,8 +62503,8 @@ struct BtCursor {
** Do nothing else with this cursor. Any attempt to use the cursor
** should return the error code stored in BtCursor.skipNext
*/
-#define CURSOR_INVALID 0
-#define CURSOR_VALID 1
+#define CURSOR_VALID 0
+#define CURSOR_INVALID 1
#define CURSOR_SKIPNEXT 2
#define CURSOR_REQUIRESEEK 3
#define CURSOR_FAULT 4
@@ -59557,10 +62821,10 @@ static void SQLITE_NOINLINE btreeEnterAll(sqlite3 *db){
skipOk = 0;
}
}
- db->skipBtreeMutex = skipOk;
+ db->noSharedCache = skipOk;
}
SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){
- if( db->skipBtreeMutex==0 ) btreeEnterAll(db);
+ if( db->noSharedCache==0 ) btreeEnterAll(db);
}
static void SQLITE_NOINLINE btreeLeaveAll(sqlite3 *db){
int i;
@@ -59572,7 +62836,7 @@ static void SQLITE_NOINLINE btreeLeaveAll(sqlite3 *db){
}
}
SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){
- if( db->skipBtreeMutex==0 ) btreeLeaveAll(db);
+ if( db->noSharedCache==0 ) btreeLeaveAll(db);
}
#ifndef NDEBUG
@@ -59785,6 +63049,34 @@ SQLITE_API int sqlite3_enable_shared_cache(int enable){
#define hasReadConflicts(a, b) 0
#endif
+/*
+** Implementation of the SQLITE_CORRUPT_PAGE() macro. Takes a single
+** (MemPage*) as an argument. The (MemPage*) must not be NULL.
+**
+** If SQLITE_DEBUG is not defined, then this macro is equivalent to
+** SQLITE_CORRUPT_BKPT. Or, if SQLITE_DEBUG is set, then the log message
+** normally produced as a side-effect of SQLITE_CORRUPT_BKPT is augmented
+** with the page number and filename associated with the (MemPage*).
+*/
+#ifdef SQLITE_DEBUG
+int corruptPageError(int lineno, MemPage *p){
+ char *zMsg;
+ sqlite3BeginBenignMalloc();
+ zMsg = sqlite3_mprintf("database corruption page %d of %s",
+ (int)p->pgno, sqlite3PagerFilename(p->pBt->pPager, 0)
+ );
+ sqlite3EndBenignMalloc();
+ if( zMsg ){
+ sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg);
+ }
+ sqlite3_free(zMsg);
+ return SQLITE_CORRUPT_BKPT;
+}
+# define SQLITE_CORRUPT_PAGE(pMemPage) corruptPageError(__LINE__, pMemPage)
+#else
+# define SQLITE_CORRUPT_PAGE(pMemPage) SQLITE_CORRUPT_PGNO(pMemPage->pgno)
+#endif
+
#ifndef SQLITE_OMIT_SHARED_CACHE
#ifdef SQLITE_DEBUG
@@ -60509,7 +63801,11 @@ static int btreeRestoreCursorPosition(BtCursor *pCur){
** back to where it ought to be if this routine returns true.
*/
SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur){
- return pCur->eState!=CURSOR_VALID;
+ assert( EIGHT_BYTE_ALIGNMENT(pCur)
+ || pCur==sqlite3BtreeFakeValidCursor() );
+ assert( offsetof(BtCursor, eState)==0 );
+ assert( sizeof(pCur->eState)==1 );
+ return CURSOR_VALID != *(u8*)pCur;
}
/*
@@ -61073,7 +64369,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
int sz = get2byte(&data[iFree+2]);
int top = get2byte(&data[hdr+5]);
if( top>=iFree ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
if( iFree2 ){
assert( iFree+sz<=iFree2 ); /* Verified by pageFindSlot() */
@@ -61107,13 +64403,13 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
** if PRAGMA cell_size_check=ON.
*/
if( pc<iCellFirst || pc>iCellLast ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
assert( pc>=iCellFirst && pc<=iCellLast );
size = pPage->xCellSize(pPage, &src[pc]);
cbrk -= size;
if( cbrk<iCellFirst || pc+size>usableSize ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
assert( cbrk+size<=usableSize && cbrk>=iCellFirst );
testcase( cbrk+size==usableSize );
@@ -61133,7 +64429,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
defragment_out:
if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
assert( cbrk>=iCellFirst );
put2byte(&data[hdr+5], cbrk);
@@ -61177,7 +64473,7 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
testcase( x==4 );
testcase( x==3 );
if( size+pc > usableSize ){
- *pRc = SQLITE_CORRUPT_PGNO(pPg->pgno);
+ *pRc = SQLITE_CORRUPT_PAGE(pPg);
return 0;
}else if( x<4 ){
/* EVIDENCE-OF: R-11498-58022 In a well-formed b-tree page, the total
@@ -61200,7 +64496,7 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
if( pc<iAddr+size ) break;
}
if( pc ){
- *pRc = SQLITE_CORRUPT_PGNO(pPg->pgno);
+ *pRc = SQLITE_CORRUPT_PAGE(pPg);
}
return 0;
@@ -61248,7 +64544,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
if( top==0 && pPage->pBt->usableSize==65536 ){
top = 65536;
}else{
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
}
@@ -61338,12 +64634,12 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
while( (iFreeBlk = get2byte(&data[iPtr]))<iStart ){
if( iFreeBlk<iPtr+4 ){
if( iFreeBlk==0 ) break;
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
iPtr = iFreeBlk;
}
if( iFreeBlk>pPage->pBt->usableSize-4 ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
assert( iFreeBlk>iPtr || iFreeBlk==0 );
@@ -61355,10 +64651,10 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
*/
if( iFreeBlk && iEnd+3>=iFreeBlk ){
nFrag = iFreeBlk - iEnd;
- if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PAGE(pPage);
iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]);
if( iEnd > pPage->pBt->usableSize ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
iSize = iEnd - iStart;
iFreeBlk = get2byte(&data[iFreeBlk]);
@@ -61371,13 +64667,13 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
if( iPtr>hdr+1 ){
int iPtrEnd = iPtr + get2byte(&data[iPtr+2]);
if( iPtrEnd+3>=iStart ){
- if( iPtrEnd>iStart ) return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ if( iPtrEnd>iStart ) return SQLITE_CORRUPT_PAGE(pPage);
nFrag += iStart - iPtrEnd;
iSize = iEnd - iPtr;
iStart = iPtr;
}
}
- if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PAGE(pPage);
data[hdr+7] -= nFrag;
}
x = get2byte(&data[hdr+5]);
@@ -61385,7 +64681,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
/* The new freeblock is at the beginning of the cell content area,
** so just extend the cell content area rather than create another
** freelist entry */
- if( iStart<x || iPtr!=hdr+1 ) return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ if( iStart<x || iPtr!=hdr+1 ) return SQLITE_CORRUPT_PAGE(pPage);
put2byte(&data[hdr+1], iFreeBlk);
put2byte(&data[hdr+5], iEnd);
}else{
@@ -61458,7 +64754,7 @@ static int decodeFlags(MemPage *pPage, int flagByte){
}else{
/* EVIDENCE-OF: R-47608-56469 Any other value for the b-tree page type is
** an error. */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
pPage->max1bytePayload = pBt->max1bytePayload;
return SQLITE_OK;
@@ -61499,7 +64795,7 @@ static int btreeInitPage(MemPage *pPage){
/* 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_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
assert( pBt->pageSize>=512 && pBt->pageSize<=65536 );
pPage->maskPage = (u16)(pBt->pageSize - 1);
@@ -61518,7 +64814,7 @@ static int btreeInitPage(MemPage *pPage){
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_PGNO(pPage->pgno);
+ 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
@@ -61546,12 +64842,12 @@ static int btreeInitPage(MemPage *pPage){
testcase( pc==iCellFirst );
testcase( pc==iCellLast );
if( pc<iCellFirst || pc>iCellLast ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
sz = pPage->xCellSize(pPage, &data[pc]);
testcase( pc+sz==usableSize );
if( pc+sz>usableSize ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
}
if( !pPage->leaf ) iCellLast++;
@@ -61569,12 +64865,12 @@ static int btreeInitPage(MemPage *pPage){
/* EVIDENCE-OF: R-55530-52930 In a well-formed b-tree page, there will
** always be at least one cell before the first freeblock.
*/
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
while( 1 ){
if( pc>iCellLast ){
/* Freeblock off the end of the page */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
next = get2byte(&data[pc]);
size = get2byte(&data[pc+2]);
@@ -61584,11 +64880,11 @@ static int btreeInitPage(MemPage *pPage){
}
if( next>0 ){
/* Freeblock not in ascending order */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
if( pc+size>(unsigned int)usableSize ){
/* Last freeblock extends past page end */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
}
@@ -61600,7 +64896,7 @@ static int btreeInitPage(MemPage *pPage){
** area, according to the page header, lies within the page.
*/
if( nFree>usableSize ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
pPage->nFree = (u16)(nFree - iCellFirst);
pPage->isInit = 1;
@@ -61876,7 +65172,8 @@ static int btreeInvokeBusyHandler(void *pArg){
BtShared *pBt = (BtShared*)pArg;
assert( pBt->db );
assert( sqlite3_mutex_held(pBt->db->mutex) );
- return sqlite3InvokeBusyHandler(&pBt->db->busyHandler);
+ return sqlite3InvokeBusyHandler(&pBt->db->busyHandler,
+ sqlite3PagerFile(pBt->pPager));
}
/*
@@ -62054,7 +65351,7 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
}
pBt->openFlags = (u8)flags;
pBt->db = db;
- sqlite3PagerSetBusyhandler(pBt->pPager, btreeInvokeBusyHandler, pBt);
+ sqlite3PagerSetBusyHandler(pBt->pPager, btreeInvokeBusyHandler, pBt);
p->pBt = pBt;
pBt->pCursor = 0;
@@ -62616,6 +65913,10 @@ static void setDefaultSyncFlag(BtShared *pBt, u8 safety_level){
# define setDefaultSyncFlag(pBt,safety_level)
#endif
+/* Forward declaration */
+static int newDatabase(BtShared*);
+
+
/*
** Get a reference to pPage1 of the database file. This will
** also acquire a readlock on that file.
@@ -62647,6 +65948,9 @@ static int lockBtree(BtShared *pBt){
if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){
nPage = nPageFile;
}
+ if( (pBt->db->flags & SQLITE_ResetDatabase)!=0 ){
+ nPage = 0;
+ }
if( nPage>0 ){
u32 pageSize;
u32 usableSize;
@@ -62745,7 +66049,7 @@ static int lockBtree(BtShared *pBt){
pageSize-usableSize);
return rc;
}
- if( (pBt->db->flags & SQLITE_WriteSchema)==0 && nPage>nPageFile ){
+ if( sqlite3WritableSchema(pBt->db)==0 && nPage>nPageFile ){
rc = SQLITE_CORRUPT_BKPT;
goto page1_init_failed;
}
@@ -62933,7 +66237,7 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p){
** when A already has a read lock, we encourage A to give up and let B
** proceed.
*/
-SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
+SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){
BtShared *pBt = p->pBt;
int rc = SQLITE_OK;
@@ -62949,6 +66253,12 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
}
assert( pBt->inTransaction==TRANS_WRITE || IfNotOmitAV(pBt->bDoTruncate)==0 );
+ if( (p->db->flags & SQLITE_ResetDatabase)
+ && sqlite3PagerIsreadonly(pBt->pPager)==0
+ ){
+ pBt->btsFlags &= ~BTS_READ_ONLY;
+ }
+
/* Write transactions are not possible on a read-only database */
if( (pBt->btsFlags & BTS_READ_ONLY)!=0 && wrflag ){
rc = SQLITE_READONLY;
@@ -63008,6 +66318,11 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
rc = sqlite3PagerBegin(pBt->pPager,wrflag>1,sqlite3TempInMemory(p->db));
if( rc==SQLITE_OK ){
rc = newDatabase(pBt);
+ }else if( rc==SQLITE_BUSY_SNAPSHOT && pBt->inTransaction==TRANS_NONE ){
+ /* if there was no transaction opened when this function was
+ ** called and SQLITE_BUSY_SNAPSHOT is returned, change the error
+ ** code to SQLITE_BUSY. */
+ rc = SQLITE_BUSY;
}
}
}
@@ -63017,6 +66332,7 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
}
}while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE &&
btreeInvokeBusyHandler(pBt) );
+ sqlite3PagerResetLockTimeout(pBt->pPager);
if( rc==SQLITE_OK ){
if( p->inTrans==TRANS_NONE ){
@@ -63058,14 +66374,18 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
}
}
-
trans_begun:
- if( rc==SQLITE_OK && wrflag ){
- /* This call makes sure that the pager has the correct number of
- ** open savepoints. If the second parameter is greater than 0 and
- ** the sub-journal is not already open, then it will be opened here.
- */
- rc = sqlite3PagerOpenSavepoint(pBt->pPager, p->db->nSavepoint);
+ if( rc==SQLITE_OK ){
+ if( pSchemaVersion ){
+ *pSchemaVersion = get4byte(&pBt->pPage1->aData[40]);
+ }
+ if( wrflag ){
+ /* This call makes sure that the pager has the correct number of
+ ** open savepoints. If the second parameter is greater than 0 and
+ ** the sub-journal is not already open, then it will be opened here.
+ */
+ rc = sqlite3PagerOpenSavepoint(pBt->pPager, p->db->nSavepoint);
+ }
}
btreeIntegrity(p);
@@ -63131,7 +66451,7 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
if( eType==PTRMAP_OVERFLOW2 ){
/* The pointer is always the first 4 bytes of the page in this case. */
if( get4byte(pPage->aData)!=iFrom ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
put4byte(pPage->aData, iTo);
}else{
@@ -63150,7 +66470,7 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
pPage->xParseCell(pPage, pCell, &info);
if( info.nLocal<info.nPayload ){
if( pCell+info.nSize > pPage->aData+pPage->pBt->usableSize ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
if( iFrom==get4byte(pCell+info.nSize-4) ){
put4byte(pCell+info.nSize-4, iTo);
@@ -63168,7 +66488,7 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
if( i==nCell ){
if( eType!=PTRMAP_BTREE ||
get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
put4byte(&pPage->aData[pPage->hdrOffset+8], iTo);
}
@@ -63203,6 +66523,7 @@ static int relocatePage(
eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE );
assert( sqlite3_mutex_held(pBt->mutex) );
assert( pDbPage->pBt==pBt );
+ if( iDbPage<3 ) return SQLITE_CORRUPT_BKPT;
/* Move page iDbPage from its current location to page number iFreePage */
TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n",
@@ -63990,7 +67311,7 @@ SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){
** of run-time by skipping the initialization of those elements.
*/
SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor *p){
- memset(p, 0, offsetof(BtCursor, iPage));
+ memset(p, 0, offsetof(BtCursor, BTCURSOR_FIRST_UNINIT));
}
/*
@@ -64033,11 +67354,19 @@ SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){
** Using this cache reduces the number of calls to btreeParseCell().
*/
#ifndef NDEBUG
+ static int cellInfoEqual(CellInfo *a, CellInfo *b){
+ if( a->nKey!=b->nKey ) return 0;
+ if( a->pPayload!=b->pPayload ) return 0;
+ if( a->nPayload!=b->nPayload ) return 0;
+ if( a->nLocal!=b->nLocal ) return 0;
+ if( a->nSize!=b->nSize ) return 0;
+ return 1;
+ }
static void assertCellInfo(BtCursor *pCur){
CellInfo info;
memset(&info, 0, sizeof(info));
btreeParseCell(pCur->pPage, pCur->ix, &info);
- assert( CORRUPT_DB || memcmp(&info, &pCur->info, sizeof(info))==0 );
+ assert( CORRUPT_DB || cellInfoEqual(&info, &pCur->info) );
}
#else
#define assertCellInfo(x)
@@ -64080,6 +67409,20 @@ SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor *pCur){
return pCur->info.nKey;
}
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+/*
+** Return the offset into the database file for the start of the
+** payload to which the cursor is pointing.
+*/
+SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor *pCur){
+ assert( cursorHoldsMutex(pCur) );
+ assert( pCur->eState==CURSOR_VALID );
+ getCellInfo(pCur);
+ return (i64)pCur->pBt->pageSize*((i64)pCur->pPage->pgno - 1) +
+ (i64)(pCur->info.pPayload - pCur->pPage->aData);
+}
+#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */
+
/*
** Return the number of bytes of payload for the entry that pCur is
** currently pointing to. For table btrees, this will be the amount
@@ -64266,7 +67609,7 @@ static int accessPayload(
** &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize]
** but is recast into its current form to avoid integer overflow problems
*/
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
/* Check if data must be read/written to/from the btree page itself. */
@@ -64299,14 +67642,15 @@ static int accessPayload(
*/
if( (pCur->curFlags & BTCF_ValidOvfl)==0 ){
int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize;
- if( nOvfl>pCur->nOvflAlloc ){
+ if( pCur->aOverflow==0
+ || nOvfl*(int)sizeof(Pgno) > sqlite3MallocSize(pCur->aOverflow)
+ ){
Pgno *aNew = (Pgno*)sqlite3Realloc(
pCur->aOverflow, nOvfl*2*sizeof(Pgno)
);
if( aNew==0 ){
return SQLITE_NOMEM_BKPT;
}else{
- pCur->nOvflAlloc = nOvfl*2;
pCur->aOverflow = aNew;
}
}
@@ -64351,9 +67695,6 @@ static int accessPayload(
/* Need to read this page properly. It contains some of the
** range of data that is being read (eOp==0) or written (eOp!=0).
*/
-#ifdef SQLITE_DIRECT_OVERFLOW_READ
- sqlite3_file *fd; /* File from which to do direct overflow read */
-#endif
int a = amt;
if( a + offset > ovflSize ){
a = ovflSize - offset;
@@ -64364,7 +67705,7 @@ static int accessPayload(
**
** 1) this is a read operation, and
** 2) data is required from the start of this overflow page, and
- ** 3) there is no open write-transaction, and
+ ** 3) there are no dirty pages in the page-cache
** 4) the database is file-backed, and
** 5) the page is not in the WAL file
** 6) at least 4 bytes have already been read into the output buffer
@@ -64375,11 +67716,10 @@ static int accessPayload(
*/
if( eOp==0 /* (1) */
&& offset==0 /* (2) */
- && pBt->inTransaction==TRANS_READ /* (3) */
- && (fd = sqlite3PagerFile(pBt->pPager))->pMethods /* (4) */
- && 0==sqlite3PagerUseWal(pBt->pPager, nextPage) /* (5) */
+ && sqlite3PagerDirectReadOk(pBt->pPager, nextPage) /* (3,4,5) */
&& &pBuf[-4]>=pBufStart /* (6) */
){
+ sqlite3_file *fd = sqlite3PagerFile(pBt->pPager);
u8 aSave[4];
u8 *aWrite = &pBuf[-4];
assert( aWrite>=pBufStart ); /* due to (6) */
@@ -64414,7 +67754,7 @@ static int accessPayload(
if( rc==SQLITE_OK && amt>0 ){
/* Overflow chain ends prematurely */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
return rc;
}
@@ -64692,7 +68032,7 @@ static int moveToRoot(BtCursor *pCur){
** (or the freelist). */
assert( pRoot->intKey==1 || pRoot->intKey==0 );
if( pRoot->isInit==0 || (pCur->pKeyInfo==0)!=pRoot->intKey ){
- return SQLITE_CORRUPT_PGNO(pCur->pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pCur->pPage);
}
skip_init:
@@ -64789,6 +68129,23 @@ 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.
@@ -64965,7 +68322,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
if( pPage->intKeyLeaf ){
while( 0x80 <= *(pCell++) ){
if( pCell>=pPage->aDataEnd ){
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
}
}
@@ -65039,7 +68396,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */
testcase( nCell==2 ); /* Minimum legal index key size */
if( nCell<2 ){
- rc = SQLITE_CORRUPT_PGNO(pPage->pgno);
+ rc = SQLITE_CORRUPT_PAGE(pPage);
goto moveto_finish;
}
pCellKey = sqlite3Malloc( nCell+18 );
@@ -65193,7 +68550,16 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){
pPage = pCur->pPage;
idx = ++pCur->ix;
- assert( pPage->isInit );
+ if( !pPage->isInit ){
+ /* The only known way for this to happen is for there to be a
+ ** recursive SQL function that does a DELETE operation as part of a
+ ** SELECT which deletes content out from under an active cursor
+ ** in a corrupt database file where the table being DELETE-ed from
+ ** has pages in common with the table being queried. See TH3
+ ** module cov1/btree78.test testcase 220 (2018-06-08) for an
+ ** example. */
+ return SQLITE_CORRUPT_BKPT;
+ }
/* If the database file is corrupt, it is possible for the value of idx
** to be invalid here. This can only occur if a second cursor modifies
@@ -65820,9 +69186,8 @@ static void freePage(MemPage *pPage, int *pRC){
}
/*
-** Free any overflow pages associated with the given Cell. Write the
-** local Cell size (the number of bytes on the original page, omitting
-** overflow) into *pnSize.
+** Free any overflow pages associated with the given Cell. Store
+** size information about the cell in pInfo.
*/
static int clearCell(
MemPage *pPage, /* The page that contains the Cell */
@@ -65840,9 +69205,11 @@ static int clearCell(
if( pInfo->nLocal==pInfo->nPayload ){
return SQLITE_OK; /* No overflow pages. Return without doing anything */
}
- if( pCell+pInfo->nSize-1 > pPage->aData+pPage->maskPage ){
+ testcase( pCell + pInfo->nSize == pPage->aDataEnd );
+ testcase( pCell + (pInfo->nSize-1) == pPage->aDataEnd );
+ if( pCell + pInfo->nSize > pPage->aDataEnd ){
/* Cell extends past end of page */
- return SQLITE_CORRUPT_PGNO(pPage->pgno);
+ return SQLITE_CORRUPT_PAGE(pPage);
}
ovflPgno = get4byte(pCell + pInfo->nSize - 4);
pBt = pPage->pBt;
@@ -67026,7 +70393,7 @@ static int balance_nonroot(
}
/* Load b.apCell[] with pointers to all cells in pOld. If pOld
- ** constains overflow cells, include them in the b.apCell[] array
+ ** contains overflow cells, include them in the b.apCell[] array
** in the correct spot.
**
** Note that when there are multiple overflow cells, it is always the
@@ -67766,6 +71133,94 @@ static int balance(BtCursor *pCur){
return rc;
}
+/* Overwrite content from pX into pDest. Only do the write if the
+** content is different from what is already there.
+*/
+static int btreeOverwriteContent(
+ MemPage *pPage, /* MemPage on which writing will occur */
+ u8 *pDest, /* Pointer to the place to start writing */
+ const BtreePayload *pX, /* Source of data to write */
+ int iOffset, /* Offset of first byte to write */
+ int iAmt /* Number of bytes to be written */
+){
+ int nData = pX->nData - iOffset;
+ if( nData<=0 ){
+ /* Overwritting with zeros */
+ int i;
+ for(i=0; i<iAmt && pDest[i]==0; i++){}
+ if( i<iAmt ){
+ int rc = sqlite3PagerWrite(pPage->pDbPage);
+ if( rc ) return rc;
+ memset(pDest + i, 0, iAmt - i);
+ }
+ }else{
+ if( nData<iAmt ){
+ /* Mixed read data and zeros at the end. Make a recursive call
+ ** to write the zeros then fall through to write the real data */
+ int rc = btreeOverwriteContent(pPage, pDest+nData, pX, iOffset+nData,
+ iAmt-nData);
+ if( rc ) return rc;
+ iAmt = nData;
+ }
+ 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);
+ }
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Overwrite the cell that cursor pCur is pointing to with fresh content
+** contained in pX.
+*/
+static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){
+ int iOffset; /* Next byte of pX->pData to write */
+ int nTotal = pX->nData + pX->nZero; /* Total bytes of to write */
+ int rc; /* Return code */
+ MemPage *pPage = pCur->pPage; /* Page being written */
+ BtShared *pBt; /* Btree */
+ Pgno ovflPgno; /* Next overflow page to write */
+ u32 ovflPageSize; /* Size to write on overflow page */
+
+ if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+ /* Overwrite the local portion first */
+ rc = btreeOverwriteContent(pPage, pCur->info.pPayload, pX,
+ 0, pCur->info.nLocal);
+ if( rc ) return rc;
+ if( pCur->info.nLocal==nTotal ) return SQLITE_OK;
+
+ /* Now overwrite the overflow pages */
+ iOffset = pCur->info.nLocal;
+ assert( nTotal>=0 );
+ assert( iOffset>=0 );
+ ovflPgno = get4byte(pCur->info.pPayload + iOffset);
+ pBt = pPage->pBt;
+ ovflPageSize = pBt->usableSize - 4;
+ do{
+ rc = btreeGetPage(pBt, ovflPgno, &pPage, 0);
+ if( rc ) return rc;
+ if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ if( iOffset+ovflPageSize<(u32)nTotal ){
+ ovflPgno = get4byte(pPage->aData);
+ }else{
+ ovflPageSize = nTotal - iOffset;
+ }
+ rc = btreeOverwriteContent(pPage, pPage->aData+4, pX,
+ iOffset, ovflPageSize);
+ }
+ sqlite3PagerUnref(pPage->pDbPage);
+ if( rc ) return rc;
+ iOffset += ovflPageSize;
+ }while( iOffset<nTotal );
+ return SQLITE_OK;
+}
+
/*
** Insert a new record into the BTree. The content of the new record
@@ -67856,35 +71311,86 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
invalidateIncrblobCursors(p, pCur->pgnoRoot, pX->nKey, 0);
/* If BTREE_SAVEPOSITION is set, the cursor must already be pointing
- ** to a row with the same key as the new entry being inserted. */
- assert( (flags & BTREE_SAVEPOSITION)==0 ||
- ((pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey==pCur->info.nKey) );
+ ** to a row with the same key as the new entry being inserted.
+ */
+#ifdef SQLITE_DEBUG
+ if( flags & BTREE_SAVEPOSITION ){
+ assert( pCur->curFlags & BTCF_ValidNKey );
+ assert( pX->nKey==pCur->info.nKey );
+ assert( pCur->info.nSize!=0 );
+ assert( loc==0 );
+ }
+#endif
- /* If the cursor is currently on the last row and we are appending a
- ** new row onto the end, set the "loc" to avoid an unnecessary
- ** btreeMoveto() call */
+ /* On the other hand, BTREE_SAVEPOSITION==0 does not imply
+ ** that the cursor is not pointing to a row to be overwritten.
+ ** So do a complete check.
+ */
if( (pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey==pCur->info.nKey ){
- loc = 0;
+ /* The cursor is pointing to the entry that is to be
+ ** overwritten */
+ assert( pX->nData>=0 && pX->nZero>=0 );
+ if( pCur->info.nSize!=0
+ && pCur->info.nPayload==(u32)pX->nData+pX->nZero
+ ){
+ /* New entry is the same size as the old. Do an overwrite */
+ return btreeOverwriteCell(pCur, pX);
+ }
+ assert( loc==0 );
}else if( loc==0 ){
+ /* The cursor is *not* pointing to the cell to be overwritten, nor
+ ** to an adjacent cell. Move the cursor so that it is pointing either
+ ** to the cell to be overwritten or an adjacent cell.
+ */
rc = sqlite3BtreeMovetoUnpacked(pCur, 0, pX->nKey, flags!=0, &loc);
if( rc ) return rc;
}
- }else if( loc==0 && (flags & BTREE_SAVEPOSITION)==0 ){
- if( pX->nMem ){
- UnpackedRecord r;
- r.pKeyInfo = pCur->pKeyInfo;
- r.aMem = pX->aMem;
- r.nField = pX->nMem;
- r.default_rc = 0;
- r.errCode = 0;
- r.r1 = 0;
- r.r2 = 0;
- r.eqSeen = 0;
- rc = sqlite3BtreeMovetoUnpacked(pCur, &r, 0, flags!=0, &loc);
- }else{
- rc = btreeMoveto(pCur, pX->pKey, pX->nKey, flags!=0, &loc);
+ }else{
+ /* This is an index or a WITHOUT ROWID table */
+
+ /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing
+ ** to a row with the same key as the new entry being inserted.
+ */
+ assert( (flags & BTREE_SAVEPOSITION)==0 || loc==0 );
+
+ /* If the cursor is not already pointing either to the cell to be
+ ** overwritten, or if a new cell is being inserted, if the cursor is
+ ** not pointing to an immediately adjacent cell, then move the cursor
+ ** so that it does.
+ */
+ if( loc==0 && (flags & BTREE_SAVEPOSITION)==0 ){
+ if( pX->nMem ){
+ UnpackedRecord r;
+ r.pKeyInfo = pCur->pKeyInfo;
+ r.aMem = pX->aMem;
+ r.nField = pX->nMem;
+ r.default_rc = 0;
+ r.errCode = 0;
+ r.r1 = 0;
+ r.r2 = 0;
+ r.eqSeen = 0;
+ rc = sqlite3BtreeMovetoUnpacked(pCur, &r, 0, flags!=0, &loc);
+ }else{
+ rc = btreeMoveto(pCur, pX->pKey, pX->nKey, flags!=0, &loc);
+ }
+ if( rc ) return rc;
}
- if( rc ) return rc;
+
+ /* If the cursor is currently pointing to an entry to be overwritten
+ ** and the new content is the same as as the old, then use the
+ ** overwrite optimization.
+ */
+ if( loc==0 ){
+ getCellInfo(pCur);
+ if( pCur->info.nKey==pX->nKey ){
+ BtreePayload x2;
+ x2.pData = pX->pKey;
+ x2.nData = pX->nKey;
+ x2.nZero = 0;
+ return btreeOverwriteCell(pCur, &x2);
+ }
+ }
+
}
assert( pCur->eState==CURSOR_VALID || (pCur->eState==CURSOR_INVALID && loc) );
@@ -68723,14 +72229,14 @@ static void checkAppendMsg(
pCheck->nErr++;
va_start(ap, zFormat);
if( pCheck->errMsg.nChar ){
- sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1);
+ sqlite3_str_append(&pCheck->errMsg, "\n", 1);
}
if( pCheck->zPfx ){
- sqlite3XPrintf(&pCheck->errMsg, pCheck->zPfx, pCheck->v1, pCheck->v2);
+ sqlite3_str_appendf(&pCheck->errMsg, pCheck->zPfx, pCheck->v1, pCheck->v2);
}
- sqlite3VXPrintf(&pCheck->errMsg, zFormat, ap);
+ sqlite3_str_vappendf(&pCheck->errMsg, zFormat, ap);
va_end(ap);
- if( pCheck->errMsg.accError==STRACCUM_NOMEM ){
+ if( pCheck->errMsg.accError==SQLITE_NOMEM ){
pCheck->mallocFailed = 1;
}
}
@@ -68765,8 +72271,7 @@ static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){
** Also check that the page number is in bounds.
*/
static int checkRef(IntegrityCk *pCheck, Pgno iPage){
- if( iPage==0 ) return 1;
- if( iPage>pCheck->nPage ){
+ if( iPage>pCheck->nPage || iPage==0 ){
checkAppendMsg(pCheck, "invalid page number %d", iPage);
return 1;
}
@@ -68821,17 +72326,12 @@ static void checkList(
){
int i;
int expected = N;
- int iFirst = iPage;
- while( N-- > 0 && pCheck->mxErr ){
+ int nErrAtStart = pCheck->nErr;
+ while( iPage!=0 && pCheck->mxErr ){
DbPage *pOvflPage;
unsigned char *pOvflData;
- if( iPage<1 ){
- checkAppendMsg(pCheck,
- "%d of %d pages missing from overflow list starting at %d",
- N+1, expected, iFirst);
- break;
- }
if( checkRef(pCheck, iPage) ) break;
+ N--;
if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){
checkAppendMsg(pCheck, "failed to get page %d", iPage);
break;
@@ -68875,10 +72375,12 @@ static void checkList(
#endif
iPage = get4byte(pOvflData);
sqlite3PagerUnref(pOvflPage);
-
- if( isFreeList && N<(iPage!=0) ){
- checkAppendMsg(pCheck, "free-page count in header is too small");
- }
+ }
+ if( N && nErrAtStart==pCheck->nErr ){
+ checkAppendMsg(pCheck,
+ "%s is %d but should be %d",
+ isFreeList ? "size" : "overflow list length",
+ expected-N, expected);
}
}
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
@@ -69272,6 +72774,24 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
/* Check all the tables.
*/
+#ifndef SQLITE_OMIT_AUTOVACUUM
+ if( pBt->autoVacuum ){
+ int mx = 0;
+ int mxInHdr;
+ for(i=0; (int)i<nRoot; i++) if( mx<aRoot[i] ) mx = aRoot[i];
+ mxInHdr = get4byte(&pBt->pPage1->aData[52]);
+ if( mx!=mxInHdr ){
+ checkAppendMsg(&sCheck,
+ "max rootpage (%d) disagrees with header (%d)",
+ mx, mxInHdr
+ );
+ }
+ }else if( get4byte(&pBt->pPage1->aData[64])!=0 ){
+ checkAppendMsg(&sCheck,
+ "incremental_vacuum enabled with a max rootpage of zero"
+ );
+ }
+#endif
testcase( pBt->db->flags & SQLITE_CellSizeCk );
pBt->db->flags &= ~SQLITE_CellSizeCk;
for(i=0; (int)i<nRoot && sCheck.mxErr; i++){
@@ -69314,11 +72834,11 @@ integrity_ck_cleanup:
sqlite3PageFree(sCheck.heap);
sqlite3_free(sCheck.aPgRef);
if( sCheck.mallocFailed ){
- sqlite3StrAccumReset(&sCheck.errMsg);
+ sqlite3_str_reset(&sCheck.errMsg);
sCheck.nErr++;
}
*pnErr = sCheck.nErr;
- if( sCheck.nErr==0 ) sqlite3StrAccumReset(&sCheck.errMsg);
+ if( sCheck.nErr==0 ) sqlite3_str_reset(&sCheck.errMsg);
/* Make sure this analysis did not leave any unref() pages. */
assert( nRef==sqlite3PagerRefcount(pBt->pPager) );
sqlite3BtreeLeave(p);
@@ -69553,11 +73073,11 @@ SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){
pBt->btsFlags &= ~BTS_NO_WAL;
if( iVersion==1 ) pBt->btsFlags |= BTS_NO_WAL;
- rc = sqlite3BtreeBeginTrans(pBtree, 0);
+ rc = sqlite3BtreeBeginTrans(pBtree, 0, 0);
if( rc==SQLITE_OK ){
u8 *aData = pBt->pPage1->aData;
if( aData[18]!=(u8)iVersion || aData[19]!=(u8)iVersion ){
- rc = sqlite3BtreeBeginTrans(pBtree, 2);
+ rc = sqlite3BtreeBeginTrans(pBtree, 2, 0);
if( rc==SQLITE_OK ){
rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
if( rc==SQLITE_OK ){
@@ -69997,7 +73517,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){
** before this function exits.
*/
if( rc==SQLITE_OK && 0==sqlite3BtreeIsInReadTrans(p->pSrc) ){
- rc = sqlite3BtreeBeginTrans(p->pSrc, 0);
+ rc = sqlite3BtreeBeginTrans(p->pSrc, 0, 0);
bCloseTrans = 1;
}
@@ -70013,10 +73533,10 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){
/* Lock the destination database, if it is not locked already. */
if( SQLITE_OK==rc && p->bDestLocked==0
- && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2))
+ && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2,
+ (int*)&p->iDestSchema))
){
p->bDestLocked = 1;
- sqlite3BtreeGetMeta(p->pDest, BTREE_SCHEMA_VERSION, &p->iDestSchema);
}
/* Do not allow backup if the destination database is in WAL mode
@@ -70460,8 +73980,7 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){
if( p->flags & MEM_Null ){
/* Cannot be both MEM_Null and some other type */
- assert( (p->flags & (MEM_Int|MEM_Real|MEM_Str|MEM_Blob
- |MEM_RowSet|MEM_Frame|MEM_Agg|MEM_Zero))==0 );
+ assert( (p->flags & (MEM_Int|MEM_Real|MEM_Str|MEM_Blob|MEM_Agg))==0 );
/* If MEM_Null is set, then either the value is a pure NULL (the usual
** case) or it is a pointer set using sqlite3_bind_pointer() or
@@ -70511,6 +74030,51 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){
}
#endif
+#ifdef SQLITE_DEBUG
+/*
+** Check that string value of pMem agrees with its integer or real value.
+**
+** A single int or real value always converts to the same strings. But
+** many different strings can be converted into the same int or real.
+** If a table contains a numeric value and an index is based on the
+** corresponding string value, then it is important that the string be
+** derived from the numeric value, not the other way around, to ensure
+** that the index and table are consistent. See ticket
+** https://www.sqlite.org/src/info/343634942dd54ab (2018-01-31) for
+** an example.
+**
+** This routine looks at pMem to verify that if it has both a numeric
+** representation and a string representation then the string rep has
+** been derived from the numeric and not the other way around. It returns
+** true if everything is ok and false if there is a problem.
+**
+** This routine is for use inside of assert() statements only.
+*/
+SQLITE_PRIVATE int sqlite3VdbeMemConsistentDualRep(Mem *p){
+ char zBuf[100];
+ char *z;
+ int i, j, incr;
+ if( (p->flags & MEM_Str)==0 ) return 1;
+ if( (p->flags & (MEM_Int|MEM_Real))==0 ) return 1;
+ if( p->flags & MEM_Int ){
+ sqlite3_snprintf(sizeof(zBuf),zBuf,"%lld",p->u.i);
+ }else{
+ sqlite3_snprintf(sizeof(zBuf),zBuf,"%!.15g",p->u.r);
+ }
+ z = p->z;
+ i = j = 0;
+ incr = 1;
+ if( p->enc!=SQLITE_UTF8 ){
+ incr = 2;
+ if( p->enc==SQLITE_UTF16BE ) z++;
+ }
+ while( zBuf[j] ){
+ if( zBuf[j++]!=z[i] ) return 0;
+ i += incr;
+ }
+ return 1;
+}
+#endif /* SQLITE_DEBUG */
/*
** If pMem is an object with a valid string representation, this routine
@@ -70529,7 +74093,7 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
#ifndef SQLITE_OMIT_UTF16
int rc;
#endif
- assert( (pMem->flags&MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pMem) );
assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE
|| desiredEnc==SQLITE_UTF16BE );
if( !(pMem->flags&MEM_Str) || pMem->enc==desiredEnc ){
@@ -70562,7 +74126,7 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
*/
SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){
assert( sqlite3VdbeCheckMemInvariants(pMem) );
- assert( (pMem->flags&MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pMem) );
testcase( pMem->db==0 );
/* If the bPreserve flag is set to true, then the memory cell must already
@@ -70650,7 +74214,7 @@ static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){
*/
SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
- assert( (pMem->flags&MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pMem) );
if( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ){
if( ExpandBlob(pMem) ) return SQLITE_NOMEM;
if( pMem->szMalloc==0 || pMem->z!=pMem->zMalloc ){
@@ -70675,7 +74239,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){
int nByte;
assert( pMem->flags & MEM_Zero );
assert( pMem->flags&MEM_Blob );
- assert( (pMem->flags&MEM_RowSet)==0 );
+ 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. */
@@ -70730,7 +74294,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){
assert( !(fg&MEM_Zero) );
assert( !(fg&(MEM_Str|MEM_Blob)) );
assert( fg&(MEM_Int|MEM_Real) );
- assert( (pMem->flags&MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pMem) );
assert( EIGHT_BYTE_ALIGNMENT(pMem) );
@@ -70751,7 +74315,8 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){
assert( fg & MEM_Real );
sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->u.r);
}
- pMem->n = sqlite3Strlen30(pMem->z);
+ assert( pMem->z!=0 );
+ pMem->n = sqlite3Strlen30NN(pMem->z);
pMem->enc = SQLITE_UTF8;
pMem->flags |= MEM_Str|MEM_Term;
if( bForce ) pMem->flags &= ~(MEM_Int|MEM_Real);
@@ -70768,29 +74333,56 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){
** otherwise.
*/
SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){
- int rc = SQLITE_OK;
- if( ALWAYS(pFunc && pFunc->xFinalize) ){
- sqlite3_context ctx;
- Mem t;
- assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef );
- assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
- memset(&ctx, 0, sizeof(ctx));
- memset(&t, 0, sizeof(t));
- t.flags = MEM_Null;
- t.db = pMem->db;
- ctx.pOut = &t;
- ctx.pMem = pMem;
- ctx.pFunc = pFunc;
- pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */
- assert( (pMem->flags & MEM_Dyn)==0 );
- if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc);
- memcpy(pMem, &t, sizeof(t));
- rc = ctx.isError;
- }
- return rc;
+ sqlite3_context ctx;
+ Mem t;
+ assert( pFunc!=0 );
+ assert( pFunc->xFinalize!=0 );
+ assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef );
+ assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ memset(&ctx, 0, sizeof(ctx));
+ memset(&t, 0, sizeof(t));
+ t.flags = MEM_Null;
+ t.db = pMem->db;
+ ctx.pOut = &t;
+ ctx.pMem = pMem;
+ ctx.pFunc = pFunc;
+ pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */
+ assert( (pMem->flags & MEM_Dyn)==0 );
+ if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc);
+ memcpy(pMem, &t, sizeof(t));
+ return ctx.isError;
}
/*
+** Memory cell pAccum contains the context of an aggregate function.
+** This routine calls the xValue method for that function and stores
+** the results in memory cell pMem.
+**
+** SQLITE_ERROR is returned if xValue() reports an error. SQLITE_OK
+** otherwise.
+*/
+#ifndef SQLITE_OMIT_WINDOWFUNC
+SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem *pAccum, Mem *pOut, FuncDef *pFunc){
+ sqlite3_context ctx;
+ Mem t;
+ assert( pFunc!=0 );
+ assert( pFunc->xValue!=0 );
+ assert( (pAccum->flags & MEM_Null)!=0 || pFunc==pAccum->u.pDef );
+ assert( pAccum->db==0 || sqlite3_mutex_held(pAccum->db->mutex) );
+ memset(&ctx, 0, sizeof(ctx));
+ memset(&t, 0, sizeof(t));
+ t.flags = MEM_Null;
+ t.db = pAccum->db;
+ sqlite3VdbeMemSetNull(pOut);
+ ctx.pOut = pOut;
+ ctx.pMem = pAccum;
+ ctx.pFunc = pFunc;
+ pFunc->xValue(&ctx);
+ return ctx.isError;
+}
+#endif /* SQLITE_OMIT_WINDOWFUNC */
+
+/*
** If the memory cell contains a value that must be freed by
** invoking the external callback in Mem.xDel, then this routine
** will free that value. It also sets Mem.flags to MEM_Null.
@@ -70808,15 +74400,8 @@ static SQLITE_NOINLINE void vdbeMemClearExternAndSetNull(Mem *p){
testcase( p->flags & MEM_Dyn );
}
if( p->flags&MEM_Dyn ){
- assert( (p->flags&MEM_RowSet)==0 );
assert( p->xDel!=SQLITE_DYNAMIC && p->xDel!=0 );
p->xDel((void *)p->z);
- }else if( p->flags&MEM_RowSet ){
- sqlite3RowSetClear(p->u.pRowSet);
- }else if( p->flags&MEM_Frame ){
- VdbeFrame *pFrame = p->u.pFrame;
- pFrame->pParent = pFrame->v->pDelFrame;
- pFrame->v->pDelFrame = pFrame;
}
p->flags = MEM_Null;
}
@@ -70948,13 +74533,23 @@ SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){
}
/*
+** Return 1 if pMem represents true, and return 0 if pMem represents false.
+** Return the value ifNull if pMem is NULL.
+*/
+SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem *pMem, int ifNull){
+ if( pMem->flags & MEM_Int ) return pMem->u.i!=0;
+ if( pMem->flags & MEM_Null ) return ifNull;
+ return sqlite3VdbeRealValue(pMem)!=0.0;
+}
+
+/*
** The MEM structure is already a MEM_Real. Try to also make it a
** MEM_Int if we can.
*/
SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){
i64 ix;
assert( pMem->flags & MEM_Real );
- assert( (pMem->flags & MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pMem) );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
assert( EIGHT_BYTE_ALIGNMENT(pMem) );
@@ -70981,7 +74576,7 @@ SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){
*/
SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
- assert( (pMem->flags & MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pMem) );
assert( EIGHT_BYTE_ALIGNMENT(pMem) );
pMem->u.i = sqlite3VdbeIntValue(pMem);
@@ -71002,6 +74597,18 @@ SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){
return SQLITE_OK;
}
+/* Compare a floating point value to an integer. Return true if the two
+** values are the same within the precision of the floating point value.
+**
+** For some versions of GCC on 32-bit machines, if you do the more obvious
+** comparison of "r1==(double)i" you sometimes get an answer of false even
+** though the r1 and (double)i values are bit-for-bit the same.
+*/
+static int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){
+ double r2 = (double)i;
+ return memcmp(&r1, &r2, sizeof(r1))==0;
+}
+
/*
** Convert pMem so that it has types MEM_Real or MEM_Int or both.
** Invalidate any prior representations.
@@ -71021,7 +74628,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){
}else{
i64 i = pMem->u.i;
sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc);
- if( rc==1 && pMem->u.r==(double)i ){
+ if( rc==1 && sqlite3RealSameAsInt(pMem->u.r, i) ){
pMem->u.i = i;
MemSetTypeFlag(pMem, MEM_Int);
}else{
@@ -71153,7 +74760,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){
}
/* A no-op destructor */
-static void sqlite3NoopDestructor(void *p){ UNUSED_PARAMETER(p); }
+SQLITE_PRIVATE void sqlite3NoopDestructor(void *p){ UNUSED_PARAMETER(p); }
/*
** Set the value stored in *pMem should already be a NULL.
@@ -71187,26 +74794,36 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem *pMem, double val){
}
#endif
+#ifdef SQLITE_DEBUG
+/*
+** Return true if the Mem holds a RowSet object. This routine is intended
+** for use inside of assert() statements.
+*/
+SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem *pMem){
+ return (pMem->flags&(MEM_Blob|MEM_Dyn))==(MEM_Blob|MEM_Dyn)
+ && pMem->xDel==sqlite3RowSetDelete;
+}
+#endif
+
/*
** Delete any previous value and set the value of pMem to be an
** empty boolean index.
+**
+** Return SQLITE_OK on success and SQLITE_NOMEM if a memory allocation
+** error occurs.
*/
-SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem *pMem){
+SQLITE_PRIVATE int sqlite3VdbeMemSetRowSet(Mem *pMem){
sqlite3 *db = pMem->db;
+ RowSet *p;
assert( db!=0 );
- assert( (pMem->flags & MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pMem) );
sqlite3VdbeMemRelease(pMem);
- pMem->zMalloc = sqlite3DbMallocRawNN(db, 64);
- if( db->mallocFailed ){
- pMem->flags = MEM_Null;
- pMem->szMalloc = 0;
- }else{
- assert( pMem->zMalloc );
- pMem->szMalloc = sqlite3DbMallocSize(db, pMem->zMalloc);
- pMem->u.pRowSet = sqlite3RowSetInit(db, pMem->zMalloc, pMem->szMalloc);
- assert( pMem->u.pRowSet!=0 );
- pMem->flags = MEM_RowSet;
- }
+ p = sqlite3RowSetInit(db);
+ if( p==0 ) return SQLITE_NOMEM;
+ pMem->z = (char*)p;
+ pMem->flags = MEM_Blob|MEM_Dyn;
+ pMem->xDel = sqlite3RowSetDelete;
+ return SQLITE_OK;
}
/*
@@ -71239,7 +74856,21 @@ SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){
Mem *pX;
for(i=0, pX=pVdbe->aMem; i<pVdbe->nMem; i++, pX++){
if( pX->pScopyFrom==pMem ){
- pX->flags |= MEM_Undefined;
+ /* If pX is marked as a shallow copy of pMem, then verify that
+ ** no significant changes have been made to pX since the OP_SCopy.
+ ** A significant change would indicated a missed call to this
+ ** function for pX. Minor changes, such as adding or removing a
+ ** dual type, are allowed, as long as the underlying value is the
+ ** same. */
+ u16 mFlags = pMem->flags & pX->flags & pX->mScopyFlags;
+ assert( (mFlags&MEM_Int)==0 || pMem->u.i==pX->u.i );
+ assert( (mFlags&MEM_Real)==0 || pMem->u.r==pX->u.r );
+ assert( (mFlags&MEM_Str)==0 || (pMem->n==pX->n && pMem->z==pX->z) );
+ assert( (mFlags&MEM_Blob)==0 || sqlite3BlobCompare(pMem,pX)==0 );
+
+ /* pMem is the register that is changing. But also mark pX as
+ ** undefined so that we can quickly detect the shallow-copy error */
+ pX->flags = MEM_Undefined;
pX->pScopyFrom = 0;
}
}
@@ -71260,7 +74891,7 @@ static SQLITE_NOINLINE void vdbeClrCopy(Mem *pTo, const Mem *pFrom, int eType){
sqlite3VdbeMemShallowCopy(pTo, pFrom, eType);
}
SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){
- assert( (pFrom->flags & MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pFrom) );
assert( pTo->db==pFrom->db );
if( VdbeMemDynamic(pTo) ){ vdbeClrCopy(pTo,pFrom,srcType); return; }
memcpy(pTo, pFrom, MEMCELLSIZE);
@@ -71278,7 +74909,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int sr
SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){
int rc = SQLITE_OK;
- assert( (pFrom->flags & MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pFrom) );
if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo);
memcpy(pTo, pFrom, MEMCELLSIZE);
pTo->flags &= ~MEM_Dyn;
@@ -71336,7 +74967,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
u16 flags = 0; /* New value for pMem->flags */
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
- assert( (pMem->flags & MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pMem) );
/* If z is a NULL pointer, set pMem to contain an SQL NULL. */
if( !z ){
@@ -71458,7 +75089,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(
/* Note: the calls to BtreeKeyFetch() and DataFetch() below assert()
** that both the BtShared and database handle mutexes are held. */
- assert( (pMem->flags & MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pMem) );
zData = (char *)sqlite3BtreePayloadFetch(pCur, &available);
assert( zData!=0 );
@@ -71482,7 +75113,7 @@ static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){
assert( pVal!=0 );
assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) );
assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) );
- assert( (pVal->flags & MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pVal) );
assert( (pVal->flags & (MEM_Null))==0 );
if( pVal->flags & (MEM_Blob|MEM_Str) ){
if( ExpandBlob(pVal) ) return 0;
@@ -71504,6 +75135,7 @@ static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){
assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0
|| pVal->db->mallocFailed );
if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){
+ assert( sqlite3VdbeMemConsistentDualRep(pVal) );
return pVal->z;
}else{
return 0;
@@ -71524,8 +75156,9 @@ SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){
if( !pVal ) return 0;
assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) );
assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) );
- assert( (pVal->flags & MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pVal) );
if( (pVal->flags&(MEM_Str|MEM_Term))==(MEM_Str|MEM_Term) && pVal->enc==enc ){
+ assert( sqlite3VdbeMemConsistentDualRep(pVal) );
return pVal->z;
}
if( pVal->flags&MEM_Null ){
@@ -71741,7 +75374,11 @@ static int valueFromExpr(
assert( pExpr!=0 );
while( (op = pExpr->op)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft;
+#if defined(SQLITE_ENABLE_STAT3_OR_STAT4)
+ if( op==TK_REGISTER ) op = pExpr->op2;
+#else
if( NEVER(op==TK_REGISTER) ) op = pExpr->op2;
+#endif
/* Compressed expressions only appear when parsing the DEFAULT clause
** on a table column definition, and hence only when pCtx==0. This
@@ -71825,18 +75462,25 @@ static int valueFromExpr(
0, SQLITE_DYNAMIC);
}
#endif
-
#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
else if( op==TK_FUNCTION && pCtx!=0 ){
rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx);
}
#endif
+ else if( op==TK_TRUEFALSE ){
+ pVal = valueNew(db, pCtx);
+ pVal->flags = MEM_Int;
+ pVal->u.i = pExpr->u.zToken[4]==0;
+ }
*ppVal = pVal;
return rc;
no_mem:
- sqlite3OomFault(db);
+#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+ if( pCtx==0 || pCtx->pParse->nErr==0 )
+#endif
+ sqlite3OomFault(db);
sqlite3DbFree(db, zVal);
assert( *ppVal==0 );
#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
@@ -72079,11 +75723,11 @@ SQLITE_PRIVATE int sqlite3Stat4Column(
int iCol, /* Column to extract */
sqlite3_value **ppVal /* OUT: Extracted value */
){
- u32 t; /* a column type code */
+ u32 t = 0; /* a column type code */
int nHdr; /* Size of the header in the record */
int iHdr; /* Next unread header byte */
int iField; /* Next unread data byte */
- int szField; /* Size of the current data field */
+ int szField = 0; /* Size of the current data field */
int i; /* Column index */
u8 *a = (u8*)pRec; /* Typecast byte array */
Mem *pMem = *ppVal; /* Write result into this Mem object */
@@ -72247,6 +75891,13 @@ 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
}
/*
@@ -72268,6 +75919,11 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){
zTmp = pA->zSql;
pA->zSql = pB->zSql;
pB->zSql = zTmp;
+#ifdef SQLITE_ENABLE_NORMALIZE
+ zTmp = pA->zNormSql;
+ pA->zNormSql = pB->zNormSql;
+ pB->zNormSql = zTmp;
+#endif
pB->expmask = pA->expmask;
pB->prepFlags = pA->prepFlags;
memcpy(pB->aCounter, pA->aCounter, sizeof(pB->aCounter));
@@ -72376,14 +76032,6 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){
#endif
#ifdef SQLITE_DEBUG
if( p->db->flags & SQLITE_VdbeAddopTrace ){
- int jj, kk;
- Parse *pParse = p->pParse;
- for(jj=kk=0; jj<pParse->nColCache; jj++){
- struct yColCache *x = pParse->aColCache + jj;
- printf(" r[%d]={%d:%d}", x->iReg, x->iTable, x->iColumn);
- kk++;
- }
- if( kk ) printf("\n");
sqlite3VdbePrintOp(0, i, &p->aOp[i]);
test_addop_breakpoint();
}
@@ -72486,6 +76134,49 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8(
return sqlite3VdbeAddOp4(p, op, p1, p2, p3, p4copy, p4type);
}
+#ifndef SQLITE_OMIT_EXPLAIN
+/*
+** Return the address of the current EXPLAIN QUERY PLAN baseline.
+** 0 means "none".
+*/
+SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse *pParse){
+ VdbeOp *pOp;
+ if( pParse->addrExplain==0 ) return 0;
+ pOp = sqlite3VdbeGetOp(pParse->pVdbe, pParse->addrExplain);
+ return pOp->p2;
+}
+
+/*
+** Add a new OP_Explain 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 ){
+ char *zMsg;
+ Vdbe *v;
+ va_list ap;
+ int iThis;
+ va_start(ap, zFmt);
+ zMsg = sqlite3VMPrintf(pParse->db, zFmt, ap);
+ va_end(ap);
+ v = pParse->pVdbe;
+ iThis = v->nOp;
+ sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0,
+ zMsg, P4_DYNAMIC);
+ if( bPush) pParse->addrExplain = iThis;
+ }
+}
+
+/*
+** Pop the EXPLAIN QUERY PLAN stack one level.
+*/
+SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse *pParse){
+ pParse->addrExplain = sqlite3VdbeExplainParent(pParse);
+}
+#endif /* SQLITE_OMIT_EXPLAIN */
+
/*
** Add an OP_ParseSchema opcode. This routine is broken out from
** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees
@@ -72575,6 +76266,12 @@ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){
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);
+ }
+#endif
+ assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */
p->aLabel[j] = v->nOp;
}
}
@@ -72724,6 +76421,32 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
}
#endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */
+#ifdef SQLITE_DEBUG
+/*
+** Increment the nWrite counter in the VDBE if the cursor is not an
+** ephemeral cursor, or if the cursor argument is NULL.
+*/
+SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe *p, VdbeCursor *pC){
+ if( pC==0
+ || (pC->eCurType!=CURTYPE_SORTER
+ && pC->eCurType!=CURTYPE_PSEUDO
+ && !pC->isEphemeral)
+ ){
+ p->nWrite++;
+ }
+}
+#endif
+
+#ifdef SQLITE_DEBUG
+/*
+** Assert if an Abort at this point in time might result in a corrupt
+** database.
+*/
+SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe *p){
+ assert( p->nWrite==0 || p->usesStmtJournal );
+}
+#endif
+
/*
** This routine is called after all opcodes have been inserted. It loops
** through all the opcodes and fixes up some details.
@@ -72784,7 +76507,6 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
break;
}
case OP_Next:
- case OP_NextIfOpen:
case OP_SorterNext: {
pOp->p4.xAdvance = sqlite3BtreeNext;
pOp->p4type = P4_ADVANCE;
@@ -72794,8 +76516,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
assert( pOp->p2>=0 );
break;
}
- case OP_Prev:
- case OP_PrevIfOpen: {
+ case OP_Prev: {
pOp->p4.xAdvance = sqlite3BtreePrevious;
pOp->p4type = P4_ADVANCE;
/* The code generator never codes any of these opcodes as a jump
@@ -72884,6 +76605,17 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p){
#endif
/*
+** Generate code (a single OP_Abortable opcode) that will
+** verify that the VDBE program can safely call Abort in the current
+** context.
+*/
+#if defined(SQLITE_DEBUG)
+SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int onError){
+ if( onError==OE_Abort ) sqlite3VdbeAddOp0(p, OP_Abortable);
+}
+#endif
+
+/*
** This function returns a pointer to the array of opcodes associated with
** the Vdbe passed as the first argument. It is the callers responsibility
** to arrange for the returned array to be eventually freed using the
@@ -73049,6 +76781,7 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){
case P4_REAL:
case P4_INT64:
case P4_DYNAMIC:
+ case P4_DYNBLOB:
case P4_INTARRAY: {
sqlite3DbFree(db, p4);
break;
@@ -73426,23 +77159,23 @@ static void displayP4Expr(StrAccum *p, Expr *pExpr){
const char *zOp = 0;
switch( pExpr->op ){
case TK_STRING:
- sqlite3XPrintf(p, "%Q", pExpr->u.zToken);
+ sqlite3_str_appendf(p, "%Q", pExpr->u.zToken);
break;
case TK_INTEGER:
- sqlite3XPrintf(p, "%d", pExpr->u.iValue);
+ sqlite3_str_appendf(p, "%d", pExpr->u.iValue);
break;
case TK_NULL:
- sqlite3XPrintf(p, "NULL");
+ sqlite3_str_appendf(p, "NULL");
break;
case TK_REGISTER: {
- sqlite3XPrintf(p, "r[%d]", pExpr->iTable);
+ sqlite3_str_appendf(p, "r[%d]", pExpr->iTable);
break;
}
case TK_COLUMN: {
if( pExpr->iColumn<0 ){
- sqlite3XPrintf(p, "rowid");
+ sqlite3_str_appendf(p, "rowid");
}else{
- sqlite3XPrintf(p, "c%d", (int)pExpr->iColumn);
+ sqlite3_str_appendf(p, "c%d", (int)pExpr->iColumn);
}
break;
}
@@ -73474,18 +77207,18 @@ static void displayP4Expr(StrAccum *p, Expr *pExpr){
case TK_NOTNULL: zOp = "NOTNULL"; break;
default:
- sqlite3XPrintf(p, "%s", "expr");
+ sqlite3_str_appendf(p, "%s", "expr");
break;
}
if( zOp ){
- sqlite3XPrintf(p, "%s(", zOp);
+ sqlite3_str_appendf(p, "%s(", zOp);
displayP4Expr(p, pExpr->pLeft);
if( pExpr->pRight ){
- sqlite3StrAccumAppend(p, ",", 1);
+ sqlite3_str_append(p, ",", 1);
displayP4Expr(p, pExpr->pRight);
}
- sqlite3StrAccumAppend(p, ")", 1);
+ sqlite3_str_append(p, ")", 1);
}
}
#endif /* VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) */
@@ -73506,14 +77239,15 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
int j;
KeyInfo *pKeyInfo = pOp->p4.pKeyInfo;
assert( pKeyInfo->aSortOrder!=0 );
- sqlite3XPrintf(&x, "k(%d", pKeyInfo->nKeyField);
+ sqlite3_str_appendf(&x, "k(%d", pKeyInfo->nKeyField);
for(j=0; j<pKeyInfo->nKeyField; j++){
CollSeq *pColl = pKeyInfo->aColl[j];
const char *zColl = pColl ? pColl->zName : "";
if( strcmp(zColl, "BINARY")==0 ) zColl = "B";
- sqlite3XPrintf(&x, ",%s%s", pKeyInfo->aSortOrder[j] ? "-" : "", zColl);
+ sqlite3_str_appendf(&x, ",%s%s",
+ pKeyInfo->aSortOrder[j] ? "-" : "", zColl);
}
- sqlite3StrAccumAppend(&x, ")", 1);
+ sqlite3_str_append(&x, ")", 1);
break;
}
#ifdef SQLITE_ENABLE_CURSOR_HINTS
@@ -73524,31 +77258,31 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
#endif
case P4_COLLSEQ: {
CollSeq *pColl = pOp->p4.pColl;
- sqlite3XPrintf(&x, "(%.20s)", pColl->zName);
+ sqlite3_str_appendf(&x, "(%.20s)", pColl->zName);
break;
}
case P4_FUNCDEF: {
FuncDef *pDef = pOp->p4.pFunc;
- sqlite3XPrintf(&x, "%s(%d)", pDef->zName, pDef->nArg);
+ sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg);
break;
}
#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
case P4_FUNCCTX: {
FuncDef *pDef = pOp->p4.pCtx->pFunc;
- sqlite3XPrintf(&x, "%s(%d)", pDef->zName, pDef->nArg);
+ sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg);
break;
}
#endif
case P4_INT64: {
- sqlite3XPrintf(&x, "%lld", *pOp->p4.pI64);
+ sqlite3_str_appendf(&x, "%lld", *pOp->p4.pI64);
break;
}
case P4_INT32: {
- sqlite3XPrintf(&x, "%d", pOp->p4.i);
+ sqlite3_str_appendf(&x, "%d", pOp->p4.i);
break;
}
case P4_REAL: {
- sqlite3XPrintf(&x, "%.16g", *pOp->p4.pReal);
+ sqlite3_str_appendf(&x, "%.16g", *pOp->p4.pReal);
break;
}
case P4_MEM: {
@@ -73556,9 +77290,9 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
if( pMem->flags & MEM_Str ){
zP4 = pMem->z;
}else if( pMem->flags & MEM_Int ){
- sqlite3XPrintf(&x, "%lld", pMem->u.i);
+ sqlite3_str_appendf(&x, "%lld", pMem->u.i);
}else if( pMem->flags & MEM_Real ){
- sqlite3XPrintf(&x, "%.16g", pMem->u.r);
+ sqlite3_str_appendf(&x, "%.16g", pMem->u.r);
}else if( pMem->flags & MEM_Null ){
zP4 = "NULL";
}else{
@@ -73570,7 +77304,7 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
#ifndef SQLITE_OMIT_VIRTUALTABLE
case P4_VTAB: {
sqlite3_vtab *pVtab = pOp->p4.pVtab->pVtab;
- sqlite3XPrintf(&x, "vtab:%p", pVtab);
+ sqlite3_str_appendf(&x, "vtab:%p", pVtab);
break;
}
#endif
@@ -73580,22 +77314,23 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
int n = ai[0]; /* The first element of an INTARRAY is always the
** count of the number of elements to follow */
for(i=1; i<=n; i++){
- sqlite3XPrintf(&x, ",%d", ai[i]);
+ sqlite3_str_appendf(&x, ",%d", ai[i]);
}
zTemp[0] = '[';
- sqlite3StrAccumAppend(&x, "]", 1);
+ sqlite3_str_append(&x, "]", 1);
break;
}
case P4_SUBPROGRAM: {
- sqlite3XPrintf(&x, "program");
+ sqlite3_str_appendf(&x, "program");
break;
}
+ case P4_DYNBLOB:
case P4_ADVANCE: {
zTemp[0] = 0;
break;
}
case P4_TABLE: {
- sqlite3XPrintf(&x, "%s", pOp->p4.pTab->zName);
+ sqlite3_str_appendf(&x, "%s", pOp->p4.pTab->zName);
break;
}
default: {
@@ -73696,7 +77431,7 @@ SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe *p){
/*
** Print a single opcode. This routine is used for debugging only.
*/
-SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){
+SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){
char *zP4;
char zPtr[50];
char zCom[100];
@@ -73765,9 +77500,8 @@ static void releaseMemArray(Mem *p, int N){
*/
testcase( p->flags & MEM_Agg );
testcase( p->flags & MEM_Dyn );
- testcase( p->flags & MEM_Frame );
- testcase( p->flags & MEM_RowSet );
- if( p->flags&(MEM_Agg|MEM_Dyn|MEM_Frame|MEM_RowSet) ){
+ testcase( p->xDel==sqlite3VdbeFrameMemDel );
+ if( p->flags&(MEM_Agg|MEM_Dyn) ){
sqlite3VdbeMemRelease(p);
}else if( p->szMalloc ){
sqlite3DbFreeNN(db, p->zMalloc);
@@ -73779,6 +77513,35 @@ static void releaseMemArray(Mem *p, int N){
}
}
+#ifdef SQLITE_DEBUG
+/*
+** Verify that pFrame is a valid VdbeFrame pointer. Return true if it is
+** and false if something is wrong.
+**
+** This routine is intended for use inside of assert() statements only.
+*/
+SQLITE_PRIVATE int sqlite3VdbeFrameIsValid(VdbeFrame *pFrame){
+ if( pFrame->iFrameMagic!=SQLITE_FRAME_MAGIC ) return 0;
+ return 1;
+}
+#endif
+
+
+/*
+** This is a destructor on a Mem object (which is really an sqlite3_value)
+** that deletes the Frame object that is attached to it as a blob.
+**
+** This routine does not delete the Frame right away. It merely adds the
+** frame to a list of frames to be deleted when the Vdbe halts.
+*/
+SQLITE_PRIVATE void sqlite3VdbeFrameMemDel(void *pArg){
+ VdbeFrame *pFrame = (VdbeFrame*)pArg;
+ assert( sqlite3VdbeFrameIsValid(pFrame) );
+ pFrame->pParent = pFrame->v->pDelFrame;
+ pFrame->v->pDelFrame = pFrame;
+}
+
+
/*
** Delete a VdbeFrame object and its contents. VdbeFrame objects are
** allocated by the OP_Program opcode in sqlite3VdbeExec().
@@ -73787,6 +77550,7 @@ SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){
int i;
Mem *aMem = VdbeFrameMem(p);
VdbeCursor **apCsr = (VdbeCursor **)&aMem[p->nChildMem];
+ assert( sqlite3VdbeFrameIsValid(p) );
for(i=0; i<p->nChildCsr; i++){
sqlite3VdbeFreeCursor(p->v, apCsr[i]);
}
@@ -73807,6 +77571,9 @@ SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){
** p->explain==2, only OP_Explain instructions are listed and these
** are shown in a different format. p->explain==2 is used to implement
** EXPLAIN QUERY PLAN.
+** 2018-04-24: In p->explain==2 mode, the OP_Init opcodes of triggers
+** are also shown, so that the boundaries between the main program and
+** each trigger are clear.
**
** When p->explain==1, first the main program is listed, then each of
** the trigger subprograms are listed one by one.
@@ -73822,6 +77589,8 @@ SQLITE_PRIVATE int sqlite3VdbeList(
int i; /* Loop counter */
int rc = SQLITE_OK; /* Return code */
Mem *pMem = &p->aMem[1]; /* First Mem of result set */
+ int bListSubprogs = (p->explain==1 || (db->flags & SQLITE_TriggerEQP)!=0);
+ Op *pOp = 0;
assert( p->explain );
assert( p->magic==VDBE_MAGIC_RUN );
@@ -73834,7 +77603,7 @@ SQLITE_PRIVATE int sqlite3VdbeList(
releaseMemArray(pMem, 8);
p->pResultSet = 0;
- if( p->rc==SQLITE_NOMEM_BKPT ){
+ if( p->rc==SQLITE_NOMEM ){
/* This happens if a malloc() inside a call to sqlite3_column_text() or
** sqlite3_column_text16() failed. */
sqlite3OomFault(db);
@@ -73849,7 +77618,7 @@ SQLITE_PRIVATE int sqlite3VdbeList(
** encountered, but p->pc will eventually catch up to nRow.
*/
nRow = p->nOp;
- if( p->explain==1 ){
+ if( bListSubprogs ){
/* The first 8 memory cells are used for the result set. So we will
** commandeer the 9th cell to use as storage for an array of pointers
** to trigger subprograms. The VDBE is guaranteed to have at least 9
@@ -73867,19 +77636,13 @@ SQLITE_PRIVATE int sqlite3VdbeList(
}
}
- do{
+ while(1){ /* Loop exits via break */
i = p->pc++;
- }while( i<nRow && p->explain==2 && p->aOp[i].opcode!=OP_Explain );
- if( i>=nRow ){
- p->rc = SQLITE_OK;
- rc = SQLITE_DONE;
- }else if( db->u1.isInterrupted ){
- p->rc = SQLITE_INTERRUPT;
- rc = SQLITE_ERROR;
- sqlite3VdbeError(p, sqlite3ErrStr(p->rc));
- }else{
- char *zP4;
- Op *pOp;
+ if( i>=nRow ){
+ p->rc = SQLITE_OK;
+ rc = SQLITE_DONE;
+ break;
+ }
if( i<p->nOp ){
/* The output line number is small enough that we are still in the
** main program. */
@@ -73894,94 +77657,113 @@ SQLITE_PRIVATE int sqlite3VdbeList(
}
pOp = &apSub[j]->aOp[i];
}
- if( p->explain==1 ){
- pMem->flags = MEM_Int;
- pMem->u.i = i; /* Program counter */
- pMem++;
-
- pMem->flags = MEM_Static|MEM_Str|MEM_Term;
- pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */
- assert( pMem->z!=0 );
- pMem->n = sqlite3Strlen30(pMem->z);
- pMem->enc = SQLITE_UTF8;
- pMem++;
- /* When an OP_Program opcode is encounter (the only opcode that has
- ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms
- ** kept in p->aMem[9].z to hold the new program - assuming this subprogram
- ** has not already been seen.
- */
- if( pOp->p4type==P4_SUBPROGRAM ){
- int nByte = (nSub+1)*sizeof(SubProgram*);
- int j;
- for(j=0; j<nSub; j++){
- if( apSub[j]==pOp->p4.pProgram ) break;
- }
- if( j==nSub && SQLITE_OK==sqlite3VdbeMemGrow(pSub, nByte, nSub!=0) ){
- apSub = (SubProgram **)pSub->z;
- apSub[nSub++] = pOp->p4.pProgram;
- pSub->flags |= MEM_Blob;
- pSub->n = nSub*sizeof(SubProgram*);
+ /* When an OP_Program opcode is encounter (the only opcode that has
+ ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms
+ ** kept in p->aMem[9].z to hold the new program - assuming this subprogram
+ ** has not already been seen.
+ */
+ if( bListSubprogs && pOp->p4type==P4_SUBPROGRAM ){
+ int nByte = (nSub+1)*sizeof(SubProgram*);
+ int j;
+ for(j=0; j<nSub; j++){
+ if( apSub[j]==pOp->p4.pProgram ) break;
+ }
+ if( j==nSub ){
+ p->rc = sqlite3VdbeMemGrow(pSub, nByte, nSub!=0);
+ if( p->rc!=SQLITE_OK ){
+ rc = SQLITE_ERROR;
+ break;
}
+ apSub = (SubProgram **)pSub->z;
+ apSub[nSub++] = pOp->p4.pProgram;
+ pSub->flags |= MEM_Blob;
+ pSub->n = nSub*sizeof(SubProgram*);
+ nRow += pOp->p4.pProgram->nOp;
}
}
+ if( p->explain<2 ) break;
+ if( pOp->opcode==OP_Explain ) break;
+ if( pOp->opcode==OP_Init && p->pc>1 ) break;
+ }
- pMem->flags = MEM_Int;
- pMem->u.i = pOp->p1; /* P1 */
- pMem++;
+ if( rc==SQLITE_OK ){
+ if( db->u1.isInterrupted ){
+ p->rc = SQLITE_INTERRUPT;
+ rc = SQLITE_ERROR;
+ sqlite3VdbeError(p, sqlite3ErrStr(p->rc));
+ }else{
+ char *zP4;
+ if( p->explain==1 ){
+ pMem->flags = MEM_Int;
+ pMem->u.i = i; /* Program counter */
+ pMem++;
+
+ pMem->flags = MEM_Static|MEM_Str|MEM_Term;
+ pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */
+ assert( pMem->z!=0 );
+ pMem->n = sqlite3Strlen30(pMem->z);
+ pMem->enc = SQLITE_UTF8;
+ pMem++;
+ }
- pMem->flags = MEM_Int;
- pMem->u.i = pOp->p2; /* P2 */
- pMem++;
+ pMem->flags = MEM_Int;
+ pMem->u.i = pOp->p1; /* P1 */
+ pMem++;
- pMem->flags = MEM_Int;
- pMem->u.i = pOp->p3; /* P3 */
- pMem++;
+ pMem->flags = MEM_Int;
+ pMem->u.i = pOp->p2; /* P2 */
+ pMem++;
- if( sqlite3VdbeMemClearAndResize(pMem, 100) ){ /* P4 */
- assert( p->db->mallocFailed );
- return SQLITE_ERROR;
- }
- pMem->flags = MEM_Str|MEM_Term;
- zP4 = displayP4(pOp, pMem->z, pMem->szMalloc);
- if( zP4!=pMem->z ){
- pMem->n = 0;
- sqlite3VdbeMemSetStr(pMem, zP4, -1, SQLITE_UTF8, 0);
- }else{
- assert( pMem->z!=0 );
- pMem->n = sqlite3Strlen30(pMem->z);
- pMem->enc = SQLITE_UTF8;
- }
- pMem++;
+ pMem->flags = MEM_Int;
+ pMem->u.i = pOp->p3; /* P3 */
+ pMem++;
- if( p->explain==1 ){
- if( sqlite3VdbeMemClearAndResize(pMem, 4) ){
+ if( sqlite3VdbeMemClearAndResize(pMem, 100) ){ /* P4 */
assert( p->db->mallocFailed );
return SQLITE_ERROR;
}
pMem->flags = MEM_Str|MEM_Term;
- pMem->n = 2;
- sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */
- pMem->enc = SQLITE_UTF8;
+ zP4 = displayP4(pOp, pMem->z, pMem->szMalloc);
+ if( zP4!=pMem->z ){
+ pMem->n = 0;
+ sqlite3VdbeMemSetStr(pMem, zP4, -1, SQLITE_UTF8, 0);
+ }else{
+ assert( pMem->z!=0 );
+ pMem->n = sqlite3Strlen30(pMem->z);
+ pMem->enc = SQLITE_UTF8;
+ }
pMem++;
-
+
+ if( p->explain==1 ){
+ if( sqlite3VdbeMemClearAndResize(pMem, 4) ){
+ assert( p->db->mallocFailed );
+ return SQLITE_ERROR;
+ }
+ pMem->flags = MEM_Str|MEM_Term;
+ pMem->n = 2;
+ sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */
+ pMem->enc = SQLITE_UTF8;
+ pMem++;
+
#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
- if( sqlite3VdbeMemClearAndResize(pMem, 500) ){
- assert( p->db->mallocFailed );
- return SQLITE_ERROR;
- }
- pMem->flags = MEM_Str|MEM_Term;
- pMem->n = displayComment(pOp, zP4, pMem->z, 500);
- pMem->enc = SQLITE_UTF8;
+ if( sqlite3VdbeMemClearAndResize(pMem, 500) ){
+ assert( p->db->mallocFailed );
+ return SQLITE_ERROR;
+ }
+ pMem->flags = MEM_Str|MEM_Term;
+ pMem->n = displayComment(pOp, zP4, pMem->z, 500);
+ pMem->enc = SQLITE_UTF8;
#else
- pMem->flags = MEM_Null; /* Comment */
+ pMem->flags = MEM_Null; /* Comment */
#endif
- }
+ }
- p->nResColumn = 8 - 4*(p->explain-1);
- p->pResultSet = &p->aMem[1];
- p->rc = SQLITE_OK;
- rc = SQLITE_ROW;
+ p->nResColumn = 8 - 4*(p->explain-1);
+ p->pResultSet = &p->aMem[1];
+ p->rc = SQLITE_OK;
+ rc = SQLITE_ROW;
+ }
}
return rc;
}
@@ -74451,6 +78233,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){
pPager = sqlite3BtreePager(pBt);
if( db->aDb[i].safety_level!=PAGER_SYNCHRONOUS_OFF
&& aMJNeeded[sqlite3PagerGetJournalMode(pPager)]
+ && sqlite3PagerIsMemdb(pPager)==0
){
assert( i!=1 );
nTrans++;
@@ -75064,7 +78847,7 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
*/
sqlite3VdbeHalt(p);
- /* If the VDBE has be run even partially, then transfer the error code
+ /* If the VDBE has been run even partially, then transfer the error code
** and error message from the VDBE into the main database structure. But
** if the VDBE has just been set to run but has not actually executed any
** instructions yet, leave the main database error information unchanged.
@@ -75094,6 +78877,9 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = 0;
p->pResultSet = 0;
+#ifdef SQLITE_DEBUG
+ p->nWrite = 0;
+#endif
/* Save profiling information from this VDBE run.
*/
@@ -75209,6 +78995,9 @@ SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){
vdbeFreeOpArray(db, p->aOp, p->nOp);
sqlite3DbFree(db, p->aColName);
sqlite3DbFree(db, p->zSql);
+#ifdef SQLITE_ENABLE_NORMALIZE
+ sqlite3DbFree(db, p->zNormSql);
+#endif
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
{
int i;
@@ -75226,7 +79015,7 @@ SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){
SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){
sqlite3 *db;
- if( NEVER(p==0) ) return;
+ assert( p!=0 );
db = p->db;
assert( sqlite3_mutex_held(db->mutex) );
sqlite3VdbeClearObject(db, p);
@@ -75622,7 +79411,13 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
Mem *pMem /* Memory cell to write value into */
){
switch( serial_type ){
- case 10: /* Reserved for future use */
+ case 10: { /* Internal use only: NULL with virtual table
+ ** UPDATE no-change flag set */
+ pMem->flags = MEM_Null|MEM_Zero;
+ pMem->n = 0;
+ pMem->u.nZero = 0;
+ break;
+ }
case 11: /* Reserved for future use */
case 0: { /* Null */
/* EVIDENCE-OF: R-24078-09375 Value is a NULL. */
@@ -75967,7 +79762,7 @@ static int isAllZero(const char *z, int n){
** is less than, equal to, or greater than the second, respectively.
** If one blob is a prefix of the other, then the shorter is the lessor.
*/
-static SQLITE_NOINLINE int sqlite3BlobCompare(const Mem *pB1, const Mem *pB2){
+SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3BlobCompare(const Mem *pB1, const Mem *pB2){
int c;
int n1 = pB1->n;
int n2 = pB2->n;
@@ -76010,13 +79805,10 @@ static int sqlite3IntFloatCompare(i64 i, double r){
i64 y;
double s;
if( r<-9223372036854775808.0 ) return +1;
- if( r>9223372036854775807.0 ) return -1;
+ if( r>=9223372036854775808.0 ) return -1;
y = (i64)r;
if( i<y ) return -1;
- if( i>y ){
- if( y==SMALLEST_INT64 && r>0.0 ) return -1;
- return +1;
- }
+ if( i>y ) return +1;
s = (double)i;
if( s<r ) return -1;
if( s>r ) return +1;
@@ -76040,7 +79832,7 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C
f1 = pMem1->flags;
f2 = pMem2->flags;
combined_flags = f1|f2;
- assert( (combined_flags & MEM_RowSet)==0 );
+ assert( !sqlite3VdbeMemIsRowSet(pMem1) && !sqlite3VdbeMemIsRowSet(pMem2) );
/* If one value is NULL, it is less than the other. If both values
** are NULL, return 0.
@@ -76185,7 +79977,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
u32 idx1; /* Offset of first type in header */
int rc = 0; /* Return value */
Mem *pRhs = pPKey2->aMem; /* Next field of pPKey2 to compare */
- KeyInfo *pKeyInfo = pPKey2->pKeyInfo;
+ KeyInfo *pKeyInfo;
const unsigned char *aKey1 = (const unsigned char *)pKey1;
Mem mem1;
@@ -76280,7 +80072,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
if( (d1+mem1.n) > (unsigned)nKey1 ){
pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT;
return 0; /* Corruption */
- }else if( pKeyInfo->aColl[i] ){
+ }else if( (pKeyInfo = pPKey2->pKeyInfo)->aColl[i] ){
mem1.enc = pKeyInfo->enc;
mem1.db = pKeyInfo->db;
mem1.flags = MEM_Str;
@@ -76331,7 +80123,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
}
if( rc!=0 ){
- if( pKeyInfo->aSortOrder[i] ){
+ if( pPKey2->pKeyInfo->aSortOrder[i] ){
rc = -rc;
}
assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, rc) );
@@ -76340,10 +80132,11 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
}
i++;
+ if( i==pPKey2->nField ) break;
pRhs++;
d1 += sqlite3VdbeSerialTypeLen(serial_type);
idx1 += sqlite3VarintLen(serial_type);
- }while( idx1<(unsigned)szHdr1 && i<pPKey2->nField && d1<=(unsigned)nKey1 );
+ }while( idx1<(unsigned)szHdr1 && d1<=(unsigned)nKey1 );
/* No memory allocation is ever used on mem1. Prove this using
** the following assert(). If the assert() fails, it indicates a
@@ -76355,7 +80148,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
** value. */
assert( CORRUPT_DB
|| vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, pPKey2->default_rc)
- || pKeyInfo->db->mallocFailed
+ || pPKey2->pKeyInfo->db->mallocFailed
);
pPKey2->eqSeen = 1;
return pPKey2->default_rc;
@@ -76606,7 +80399,9 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){
(void)getVarint32((u8*)m.z, szHdr);
testcase( szHdr==3 );
testcase( szHdr==m.n );
- if( unlikely(szHdr<3 || (int)szHdr>m.n) ){
+ testcase( szHdr>0x7fffffff );
+ assert( m.n>=0 );
+ if( unlikely(szHdr<3 || szHdr>(unsigned)m.n) ){
goto idx_rowid_corruption;
}
@@ -76681,7 +80476,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(
if( rc ){
return rc;
}
- *res = sqlite3VdbeRecordCompare(m.n, m.z, pUnpacked);
+ *res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, pUnpacked, 0);
sqlite3VdbeMemRelease(&m);
return SQLITE_OK;
}
@@ -76713,11 +80508,19 @@ SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe *v){
** programs obsolete. Removing user-defined functions or collating
** sequences, or changing an authorization function are the types of
** things that make prepared statements obsolete.
+**
+** If iCode is 1, then expiration is advisory. The statement should
+** be reprepared before being restarted, but if it is already running
+** it is allowed to run to completion.
+**
+** Internally, this function just sets the Vdbe.expired flag on all
+** prepared statements. The flag is set to 1 for an immediate expiration
+** and set to 2 for an advisory expiration.
*/
-SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3 *db){
+SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3 *db, int iCode){
Vdbe *p;
for(p = db->pVdbe; p; p=p->pNext){
- p->expired = 1;
+ p->expired = iCode+1;
}
}
@@ -77175,6 +80978,11 @@ SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){
return aType[pVal->flags&MEM_AffMask];
}
+/* Return true if a parameter to xUpdate represents an unchanged column */
+SQLITE_API int sqlite3_value_nochange(sqlite3_value *pVal){
+ return (pVal->flags&(MEM_Null|MEM_Zero))==(MEM_Null|MEM_Zero);
+}
+
/* Make a copy of an sqlite3_value object
*/
SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){
@@ -77274,14 +81082,12 @@ SQLITE_API void sqlite3_result_double(sqlite3_context *pCtx, double rVal){
SQLITE_API void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
pCtx->isError = SQLITE_ERROR;
- pCtx->fErrorOrAux = 1;
sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF8, SQLITE_TRANSIENT);
}
#ifndef SQLITE_OMIT_UTF16
SQLITE_API void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
pCtx->isError = SQLITE_ERROR;
- pCtx->fErrorOrAux = 1;
sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT);
}
#endif
@@ -77387,8 +81193,7 @@ SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){
return SQLITE_OK;
}
SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
- pCtx->isError = errCode;
- pCtx->fErrorOrAux = 1;
+ pCtx->isError = errCode ? errCode : -1;
#ifdef SQLITE_DEBUG
if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode;
#endif
@@ -77402,7 +81207,6 @@ SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
pCtx->isError = SQLITE_TOOBIG;
- pCtx->fErrorOrAux = 1;
sqlite3VdbeMemSetStr(pCtx->pOut, "string or blob too big", -1,
SQLITE_UTF8, SQLITE_STATIC);
}
@@ -77412,7 +81216,6 @@ SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
sqlite3VdbeMemSetNull(pCtx->pOut);
pCtx->isError = SQLITE_NOMEM_BKPT;
- pCtx->fErrorOrAux = 1;
sqlite3OomFault(pCtx->pOut->db);
}
@@ -77653,6 +81456,25 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){
}
/*
+** If this routine is invoked from within an xColumn method of a virtual
+** table, then it returns true if and only if the the call is during an
+** UPDATE operation and the value of the column will not be modified
+** by the UPDATE.
+**
+** If this routine is called from any context other than within the
+** xColumn method of a virtual table, then the return value is meaningless
+** and arbitrary.
+**
+** Virtual table implements might use this routine to optimize their
+** performance by substituting a NULL result, or some other light-weight
+** value, as a signal to the xUpdate routine that the column is unchanged.
+*/
+SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){
+ assert( p );
+ return sqlite3_value_nochange(p->pOut);
+}
+
+/*
** Return the current time for a statement. If the current time
** is requested more than once within the same run of a single prepared
** statement, the exact same time is returned for each invocation regardless
@@ -77676,28 +81498,6 @@ SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){
}
/*
-** The following is the implementation of an SQL function that always
-** fails with an error message stating that the function is used in the
-** wrong context. The sqlite3_overload_function() API might construct
-** SQL function that use this routine so that the functions will exist
-** for name resolution but are actually overloaded by the xFindFunction
-** method of virtual tables.
-*/
-SQLITE_PRIVATE void sqlite3InvalidFunction(
- sqlite3_context *context, /* The function calling context */
- int NotUsed, /* Number of arguments to the function */
- sqlite3_value **NotUsed2 /* Value of each argument */
-){
- const char *zName = context->pFunc->zName;
- char *zErr;
- UNUSED_PARAMETER2(NotUsed, NotUsed2);
- zErr = sqlite3_mprintf(
- "unable to use function %s in the requested context", zName);
- sqlite3_result_error(context, zErr, -1);
- sqlite3_free(zErr);
-}
-
-/*
** Create a new aggregate context for p and return a pointer to
** its pMem->z element.
*/
@@ -77800,10 +81600,7 @@ SQLITE_API void sqlite3_set_auxdata(
pAuxData->iAuxArg = iArg;
pAuxData->pNextAux = pVdbe->pAuxData;
pVdbe->pAuxData = pAuxData;
- if( pCtx->fErrorOrAux==0 ){
- pCtx->isError = 0;
- pCtx->fErrorOrAux = 1;
- }
+ if( pCtx->isError==0 ) pCtx->isError = -1;
}else if( pAuxData->xDeleteAux ){
pAuxData->xDeleteAux(pAuxData->pAux);
}
@@ -77883,7 +81680,7 @@ static const Mem *columnNullValue(void){
/* .xDel = */ (void(*)(void*))0,
#ifdef SQLITE_DEBUG
/* .pScopyFrom = */ (Mem*)0,
- /* .pFiller = */ (void*)0,
+ /* .mScopyFlags= */ 0,
#endif
};
return &nullMem;
@@ -78559,7 +82356,9 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){
Vdbe *pVdbe = (Vdbe*)pStmt;
u32 v;
#ifdef SQLITE_ENABLE_API_ARMOR
- if( !pStmt ){
+ if( !pStmt
+ || (op!=SQLITE_STMTSTATUS_MEMUSED && (op<0||op>=ArraySize(pVdbe->aCounter)))
+ ){
(void)SQLITE_MISUSE_BKPT;
return 0;
}
@@ -78613,6 +82412,16 @@ SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){
#endif
}
+#ifdef SQLITE_ENABLE_NORMALIZE
+/*
+** Return the normalized SQL associated with a prepared statement.
+*/
+SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt){
+ Vdbe *p = (Vdbe *)pStmt;
+ return p ? p->zNormSql : 0;
+}
+#endif /* SQLITE_ENABLE_NORMALIZE */
+
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
/*
** Allocate and populate an UnpackedRecord structure based on the serialized
@@ -78965,17 +82774,17 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
while( *zRawSql ){
const char *zStart = zRawSql;
while( *(zRawSql++)!='\n' && *zRawSql );
- sqlite3StrAccumAppend(&out, "-- ", 3);
+ sqlite3_str_append(&out, "-- ", 3);
assert( (zRawSql - zStart) > 0 );
- sqlite3StrAccumAppend(&out, zStart, (int)(zRawSql-zStart));
+ sqlite3_str_append(&out, zStart, (int)(zRawSql-zStart));
}
}else if( p->nVar==0 ){
- sqlite3StrAccumAppend(&out, zRawSql, sqlite3Strlen30(zRawSql));
+ sqlite3_str_append(&out, zRawSql, sqlite3Strlen30(zRawSql));
}else{
while( zRawSql[0] ){
n = findNextHostParameter(zRawSql, &nToken);
assert( n>0 );
- sqlite3StrAccumAppend(&out, zRawSql, n);
+ sqlite3_str_append(&out, zRawSql, n);
zRawSql += n;
assert( zRawSql[0] || nToken==0 );
if( nToken==0 ) break;
@@ -79001,11 +82810,11 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
assert( idx>0 && idx<=p->nVar );
pVar = &p->aVar[idx-1];
if( pVar->flags & MEM_Null ){
- sqlite3StrAccumAppend(&out, "NULL", 4);
+ sqlite3_str_append(&out, "NULL", 4);
}else if( pVar->flags & MEM_Int ){
- sqlite3XPrintf(&out, "%lld", pVar->u.i);
+ sqlite3_str_appendf(&out, "%lld", pVar->u.i);
}else if( pVar->flags & MEM_Real ){
- sqlite3XPrintf(&out, "%!.15g", pVar->u.r);
+ sqlite3_str_appendf(&out, "%!.15g", pVar->u.r);
}else if( pVar->flags & MEM_Str ){
int nOut; /* Number of bytes of the string text to include in output */
#ifndef SQLITE_OMIT_UTF16
@@ -79015,7 +82824,7 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
utf8.db = db;
sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, enc, SQLITE_STATIC);
if( SQLITE_NOMEM==sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8) ){
- out.accError = STRACCUM_NOMEM;
+ out.accError = SQLITE_NOMEM;
out.nAlloc = 0;
}
pVar = &utf8;
@@ -79028,38 +82837,38 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
while( nOut<pVar->n && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; }
}
#endif
- sqlite3XPrintf(&out, "'%.*q'", nOut, pVar->z);
+ sqlite3_str_appendf(&out, "'%.*q'", nOut, pVar->z);
#ifdef SQLITE_TRACE_SIZE_LIMIT
if( nOut<pVar->n ){
- sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut);
+ sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut);
}
#endif
#ifndef SQLITE_OMIT_UTF16
if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8);
#endif
}else if( pVar->flags & MEM_Zero ){
- sqlite3XPrintf(&out, "zeroblob(%d)", pVar->u.nZero);
+ sqlite3_str_appendf(&out, "zeroblob(%d)", pVar->u.nZero);
}else{
int nOut; /* Number of bytes of the blob to include in output */
assert( pVar->flags & MEM_Blob );
- sqlite3StrAccumAppend(&out, "x'", 2);
+ sqlite3_str_append(&out, "x'", 2);
nOut = pVar->n;
#ifdef SQLITE_TRACE_SIZE_LIMIT
if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT;
#endif
for(i=0; i<nOut; i++){
- sqlite3XPrintf(&out, "%02x", pVar->z[i]&0xff);
+ sqlite3_str_appendf(&out, "%02x", pVar->z[i]&0xff);
}
- sqlite3StrAccumAppend(&out, "'", 1);
+ sqlite3_str_append(&out, "'", 1);
#ifdef SQLITE_TRACE_SIZE_LIMIT
if( nOut<pVar->n ){
- sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut);
+ sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut);
}
#endif
}
}
}
- if( out.accError ) sqlite3StrAccumReset(&out);
+ if( out.accError ) sqlite3_str_reset(&out);
return sqlite3StrAccumFinish(&out);
}
@@ -79191,32 +83000,56 @@ 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, 2 or 3, that indices how many different ways the
-** branch can go. It is usually 2. "I" is the direction the branch
-** goes. 0 means falls through. 1 means branch is taken. 2 means the
-** second alternative branch is taken.
+** 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.
**
** iSrcLine is the source code line (from the __LINE__ macro) that
-** generated the VDBE instruction. This instrumentation assumes that all
-** source code is in a single file (the amalgamation). Special values 1
-** and 2 for the iSrcLine parameter mean that this particular branch is
-** always taken or never taken, respectively.
+** generated the VDBE instruction combined with flag bits. The source
+** code line number is in the lower 24 bits of iSrcLine and the upper
+** 8 bytes are flags. The lower three bits of the flags indicate
+** values for I that should never occur. For example, if the branch is
+** always taken, the flags should be 0x05 since the fall-through and
+** 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
+** interested in equal or not-equal. In other words, I==0 and I==2
+** should be treated the same.
+**
+** Since only a line number is retained, not the filename, this macro
+** only works for amalgamation builds. But that is ok, since these macros
+** should be no-ops except for special builds used to measure test coverage.
*/
#if !defined(SQLITE_VDBE_COVERAGE)
# define VdbeBranchTaken(I,M)
#else
# define VdbeBranchTaken(I,M) vdbeTakeBranch(pOp->iSrcLine,I,M)
- static void vdbeTakeBranch(int iSrcLine, u8 I, u8 M){
- if( iSrcLine<=2 && ALWAYS(iSrcLine>0) ){
- M = iSrcLine;
- /* Assert the truth of VdbeCoverageAlwaysTaken() and
- ** VdbeCoverageNeverTaken() */
- assert( (M & I)==I );
- }else{
- if( sqlite3GlobalConfig.xVdbeBranch==0 ) return; /*NO_TEST*/
- sqlite3GlobalConfig.xVdbeBranch(sqlite3GlobalConfig.pVdbeBranchArg,
- iSrcLine,I,M);
- }
+ static void vdbeTakeBranch(u32 iSrcLine, u8 I, u8 M){
+ u8 mNever;
+ assert( I<=2 ); /* 0: fall through, 1: taken, 2: alternate taken */
+ assert( M<=4 ); /* 2: two-way branch, 3: three-way branch, 4: OP_Jump */
+ assert( I<M ); /* I can only be 2 if M is 3 or 4 */
+ /* Transform I from a integer [0,1,2] into a bitmask of [1,2,4] */
+ I = 1<<I;
+ /* The upper 8 bits of iSrcLine are flags. The lower three bits of
+ ** the flags indicate directions that the branch can never go. If
+ ** a branch really does go in one of those directions, assert right
+ ** away. */
+ mNever = iSrcLine >> 24;
+ assert( (I & mNever)==0 );
+ if( sqlite3GlobalConfig.xVdbeBranch==0 ) return; /*NO_TEST*/
+ I |= mNever;
+ if( M==2 ) I |= 0x04;
+ if( M==4 ){
+ I |= 0x08;
+ if( (mNever&0x08)!=0 && (I&0x05)!=0) I |= 0x05; /*NO_TEST*/
+ }
+ sqlite3GlobalConfig.xVdbeBranch(sqlite3GlobalConfig.pVdbeBranchArg,
+ iSrcLine&0xffffff, I, M);
}
#endif
@@ -79333,6 +83166,11 @@ static void applyNumericAffinity(Mem *pRec, int bTryForInt){
pRec->flags |= MEM_Real;
if( bTryForInt ) sqlite3VdbeIntegerAffinity(pRec);
}
+ /* TEXT->NUMERIC is many->one. Hence, it is important to invalidate the
+ ** string representation after computing a numeric equivalent, because the
+ ** string representation might not be the canonical representation for the
+ ** numeric value. Ticket [343634942dd54ab57b7024] 2018-01-31. */
+ pRec->flags &= ~MEM_Str;
}
/*
@@ -79533,7 +83371,7 @@ static void memTracePrint(Mem *p){
if( p->flags & MEM_Undefined ){
printf(" undefined");
}else if( p->flags & MEM_Null ){
- printf(" NULL");
+ printf(p->flags & MEM_Zero ? " NULL-nochng" : " NULL");
}else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){
printf(" si:%lld", p->u.i);
}else if( p->flags & MEM_Int ){
@@ -79542,7 +83380,7 @@ static void memTracePrint(Mem *p){
}else if( p->flags & MEM_Real ){
printf(" r:%g", p->u.r);
#endif
- }else if( p->flags & MEM_RowSet ){
+ }else if( sqlite3VdbeMemIsRowSet(p) ){
printf(" (rowset)");
}else{
char zBuf[200];
@@ -79801,7 +83639,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
assert( pOp>=aOp && pOp<&aOp[p->nOp]);
#ifdef VDBE_PROFILE
- start = sqlite3Hwtime();
+ start = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
#endif
nVmStep++;
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
@@ -80068,6 +83906,9 @@ case OP_Yield: { /* in1, jump */
*/
case OP_HaltIfNull: { /* in3 */
pIn3 = &aMem[pOp->p3];
+#ifdef SQLITE_DEBUG
+ if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); }
+#endif
if( (pIn3->flags & MEM_Null)==0 ) break;
/* Fall through into OP_Halt */
}
@@ -80107,6 +83948,9 @@ case OP_Halt: {
int pcx;
pcx = (int)(pOp - aOp);
+#ifdef SQLITE_DEBUG
+ if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); }
+#endif
if( pOp->p1==SQLITE_OK && p->pFrame ){
/* Halt the sub-program. Return control to the parent frame. */
pFrame = p->pFrame;
@@ -80290,6 +84134,9 @@ case OP_Null: { /* out2 */
assert( pOp->p3<=(p->nMem+1 - p->nCursor) );
pOut->flags = nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null;
pOut->n = 0;
+#ifdef SQLITE_DEBUG
+ pOut->uTemp = 0;
+#endif
while( cnt>0 ){
pOut++;
memAboutToChange(p, pOut);
@@ -80411,6 +84258,7 @@ case OP_Copy: {
pOut = &aMem[pOp->p2];
assert( pOut!=pIn1 );
while( 1 ){
+ memAboutToChange(p, pOut);
sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
Deephemeralize(pOut);
#ifdef SQLITE_DEBUG
@@ -80443,7 +84291,8 @@ case OP_SCopy: { /* out2 */
assert( pOut!=pIn1 );
sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
#ifdef SQLITE_DEBUG
- if( pOut->pScopyFrom==0 ) pOut->pScopyFrom = pIn1;
+ pOut->pScopyFrom = pIn1;
+ pOut->mScopyFlags = pIn1->flags;
#endif
break;
}
@@ -81077,7 +84926,12 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
if( (flags1 | flags3)&MEM_Str ){
if( (flags1 & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){
applyNumericAffinity(pIn1,0);
- testcase( flags3!=pIn3->flags ); /* Possible if pIn1==pIn3 */
+ assert( flags3==pIn3->flags );
+ /* testcase( flags3!=pIn3->flags );
+ ** this used to be possible with pIn1==pIn3, but not since
+ ** the column cache was removed. The following assignment
+ ** is essentially a no-op. But, it provides defense-in-depth
+ ** in case our analysis is incorrect, so it is left in. */
flags3 = pIn3->flags;
}
if( (flags3 & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){
@@ -81291,11 +85145,11 @@ case OP_Compare: {
*/
case OP_Jump: { /* jump */
if( iCompare<0 ){
- VdbeBranchTaken(0,3); pOp = &aOp[pOp->p1 - 1];
+ VdbeBranchTaken(0,4); pOp = &aOp[pOp->p1 - 1];
}else if( iCompare==0 ){
- VdbeBranchTaken(1,3); pOp = &aOp[pOp->p2 - 1];
+ VdbeBranchTaken(1,4); pOp = &aOp[pOp->p2 - 1];
}else{
- VdbeBranchTaken(2,3); pOp = &aOp[pOp->p3 - 1];
+ VdbeBranchTaken(2,4); pOp = &aOp[pOp->p3 - 1];
}
break;
}
@@ -81325,18 +85179,8 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */
int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
- pIn1 = &aMem[pOp->p1];
- if( pIn1->flags & MEM_Null ){
- v1 = 2;
- }else{
- v1 = sqlite3VdbeIntValue(pIn1)!=0;
- }
- pIn2 = &aMem[pOp->p2];
- if( pIn2->flags & MEM_Null ){
- v2 = 2;
- }else{
- v2 = sqlite3VdbeIntValue(pIn2)!=0;
- }
+ v1 = sqlite3VdbeBooleanValue(&aMem[pOp->p1], 2);
+ v2 = sqlite3VdbeBooleanValue(&aMem[pOp->p2], 2);
if( pOp->opcode==OP_And ){
static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 };
v1 = and_logic[v1*3+v2];
@@ -81354,6 +85198,35 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */
break;
}
+/* Opcode: IsTrue P1 P2 P3 P4 *
+** Synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4
+**
+** This opcode implements the IS TRUE, IS FALSE, IS NOT TRUE, and
+** IS NOT FALSE operators.
+**
+** Interpret the value in register P1 as a boolean value. Store that
+** boolean (a 0 or 1) in register P2. Or if the value in register P1 is
+** NULL, then the P3 is stored in register P2. Invert the answer if P4
+** is 1.
+**
+** The logic is summarized like this:
+**
+** <ul>
+** <li> If P3==0 and P4==0 then r[P2] := r[P1] IS TRUE
+** <li> If P3==1 and P4==1 then r[P2] := r[P1] IS FALSE
+** <li> If P3==0 and P4==1 then r[P2] := r[P1] IS NOT TRUE
+** <li> If P3==1 and P4==0 then r[P2] := r[P1] IS NOT FALSE
+** </ul>
+*/
+case OP_IsTrue: { /* in1, out2 */
+ assert( pOp->p4type==P4_INT32 );
+ assert( pOp->p4.i==0 || pOp->p4.i==1 );
+ assert( pOp->p3==0 || pOp->p3==1 );
+ sqlite3VdbeMemSetInt64(&aMem[pOp->p2],
+ sqlite3VdbeBooleanValue(&aMem[pOp->p1], pOp->p3) ^ pOp->p4.i);
+ break;
+}
+
/* Opcode: Not P1 P2 * * *
** Synopsis: r[P2]= !r[P1]
**
@@ -81364,16 +85237,16 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */
case OP_Not: { /* same as TK_NOT, in1, out2 */
pIn1 = &aMem[pOp->p1];
pOut = &aMem[pOp->p2];
- sqlite3VdbeMemSetNull(pOut);
if( (pIn1->flags & MEM_Null)==0 ){
- pOut->flags = MEM_Int;
- pOut->u.i = !sqlite3VdbeIntValue(pIn1);
+ sqlite3VdbeMemSetInt64(pOut, !sqlite3VdbeBooleanValue(pIn1,0));
+ }else{
+ sqlite3VdbeMemSetNull(pOut);
}
break;
}
/* Opcode: BitNot P1 P2 * * *
-** Synopsis: r[P1]= ~r[P1]
+** Synopsis: r[P2]= ~r[P1]
**
** Interpret the content of register P1 as an integer. Store the
** ones-complement of the P1 value into register P2. If P1 holds
@@ -81434,30 +85307,25 @@ case OP_Once: { /* jump */
** is considered true if it is numeric and non-zero. If the value
** in P1 is NULL then take the jump if and only if P3 is non-zero.
*/
+case OP_If: { /* jump, in1 */
+ int c;
+ c = sqlite3VdbeBooleanValue(&aMem[pOp->p1], pOp->p3);
+ VdbeBranchTaken(c!=0, 2);
+ if( c ) goto jump_to_p2;
+ break;
+}
+
/* Opcode: IfNot P1 P2 P3 * *
**
** Jump to P2 if the value in register P1 is False. The value
** is considered false if it has a numeric value of zero. If the value
** in P1 is NULL then take the jump if and only if P3 is non-zero.
*/
-case OP_If: /* jump, in1 */
case OP_IfNot: { /* jump, in1 */
int c;
- pIn1 = &aMem[pOp->p1];
- if( pIn1->flags & MEM_Null ){
- c = pOp->p3;
- }else{
-#ifdef SQLITE_OMIT_FLOATING_POINT
- c = sqlite3VdbeIntValue(pIn1)!=0;
-#else
- c = sqlite3VdbeRealValue(pIn1)!=0.0;
-#endif
- if( pOp->opcode==OP_IfNot ) c = !c;
- }
+ c = !sqlite3VdbeBooleanValue(&aMem[pOp->p1], !pOp->p3);
VdbeBranchTaken(c!=0, 2);
- if( c ){
- goto jump_to_p2;
- }
+ if( c ) goto jump_to_p2;
break;
}
@@ -81507,6 +85375,36 @@ case OP_IfNullRow: { /* jump */
break;
}
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+/* Opcode: Offset P1 P2 P3 * *
+** Synopsis: r[P3] = sqlite_offset(P1)
+**
+** Store in register r[P3] the byte offset into the database file that is the
+** start of the payload for the record at which that cursor P1 is currently
+** pointing.
+**
+** P2 is the column number for the argument to the sqlite_offset() function.
+** This opcode does not use P2 itself, but the P2 value is used by the
+** code generator. The P1, P2, and P3 operands to this opcode are the
+** same as for OP_Column.
+**
+** This opcode is only available if SQLite is compiled with the
+** -DSQLITE_ENABLE_OFFSET_SQL_FUNC option.
+*/
+case OP_Offset: { /* out3 */
+ VdbeCursor *pC; /* The VDBE cursor */
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ pC = p->apCsr[pOp->p1];
+ pOut = &p->aMem[pOp->p3];
+ if( NEVER(pC==0) || pC->eCurType!=CURTYPE_BTREE ){
+ sqlite3VdbeMemSetNull(pOut);
+ }else{
+ sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor));
+ }
+ break;
+}
+#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */
+
/* Opcode: Column P1 P2 P3 P4 P5
** Synopsis: r[P3]=PX
**
@@ -81920,9 +85818,18 @@ case OP_MakeRecord: {
pRec = pLast;
do{
assert( memIsValid(pRec) );
- pRec->uTemp = serial_type = sqlite3VdbeSerialType(pRec, file_format, &len);
+ serial_type = sqlite3VdbeSerialType(pRec, file_format, &len);
if( pRec->flags & MEM_Zero ){
- if( nData ){
+ if( serial_type==0 ){
+ /* Values with MEM_Null and MEM_Zero are created by xColumn virtual
+ ** table methods that never invoke sqlite3_result_xxxxx() while
+ ** computing an unchanging column value in an UPDATE statement.
+ ** Give such values a special internal-use-only serial-type of 10
+ ** so that they can be passed through to xUpdate and have
+ ** a true sqlite3_value_nochange(). */
+ assert( pOp->p5==OPFLAG_NOCHNG_MAGIC || CORRUPT_DB );
+ serial_type = 10;
+ }else if( nData ){
if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem;
}else{
nZero += pRec->u.nZero;
@@ -81933,6 +85840,7 @@ case OP_MakeRecord: {
testcase( serial_type==127 );
testcase( serial_type==128 );
nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type);
+ pRec->uTemp = serial_type;
if( pRec==pData0 ) break;
pRec--;
}while(1);
@@ -81953,17 +85861,25 @@ case OP_MakeRecord: {
if( nVarint<sqlite3VarintLen(nHdr) ) nHdr++;
}
nByte = nHdr+nData;
- if( nByte+nZero>db->aLimit[SQLITE_LIMIT_LENGTH] ){
- goto too_big;
- }
/* Make sure the output register has a buffer large enough to store
** the new record. The output register (pOp->p3) is not allowed to
** be one of the input registers (because the following call to
** sqlite3VdbeMemClearAndResize() could clobber the value before it is used).
*/
- if( sqlite3VdbeMemClearAndResize(pOut, (int)nByte) ){
- goto no_mem;
+ if( nByte+nZero<=pOut->szMalloc ){
+ /* The output register is already large enough to hold the record.
+ ** No error checks or buffer enlargement is required */
+ pOut->z = pOut->zMalloc;
+ }else{
+ /* Need to make sure that the output is not too big and then enlarge
+ ** the output register to hold the full result */
+ if( nByte+nZero>db->aLimit[SQLITE_LIMIT_LENGTH] ){
+ goto too_big;
+ }
+ if( sqlite3VdbeMemClearAndResize(pOut, (int)nByte) ){
+ goto no_mem;
+ }
}
zNewRecord = (u8 *)pOut->z;
@@ -82153,7 +86069,7 @@ case OP_Savepoint: {
}
}
if( isSchemaChange ){
- sqlite3ExpirePreparedStatements(db);
+ sqlite3ExpirePreparedStatements(db, 0);
sqlite3ResetAllSchemasOfConnection(db);
db->mDbFlags |= DBFLAG_SchemaChange;
}
@@ -82295,8 +86211,7 @@ case OP_AutoCommit: {
*/
case OP_Transaction: {
Btree *pBt;
- int iMeta;
- int iGen;
+ int iMeta = 0;
assert( p->bIsReader );
assert( p->readOnly==0 || pOp->p2==0 );
@@ -82309,7 +86224,7 @@ case OP_Transaction: {
pBt = db->aDb[pOp->p1].pBt;
if( pBt ){
- rc = sqlite3BtreeBeginTrans(pBt, pOp->p2);
+ rc = sqlite3BtreeBeginTrans(pBt, pOp->p2, &iMeta);
testcase( rc==SQLITE_BUSY_SNAPSHOT );
testcase( rc==SQLITE_BUSY_RECOVERY );
if( rc!=SQLITE_OK ){
@@ -82342,19 +86257,17 @@ case OP_Transaction: {
p->nStmtDefCons = db->nDeferredCons;
p->nStmtDefImmCons = db->nDeferredImmCons;
}
-
- /* Gather the schema version number for checking:
+ }
+ assert( pOp->p5==0 || pOp->p4type==P4_INT32 );
+ if( pOp->p5
+ && (iMeta!=pOp->p3
+ || db->aDb[pOp->p1].pSchema->iGeneration!=pOp->p4.i)
+ ){
+ /*
** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema
** version is checked to ensure that the schema has not changed since the
** SQL statement was prepared.
*/
- sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta);
- iGen = db->aDb[pOp->p1].pSchema->iGeneration;
- }else{
- iGen = iMeta = 0;
- }
- assert( pOp->p5==0 || pOp->p4type==P4_INT32 );
- if( pOp->p5 && (iMeta!=pOp->p3 || iGen!=pOp->p4.i) ){
sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed");
/* If the schema-cookie from the database file matches the cookie
@@ -82423,6 +86336,8 @@ case OP_ReadCookie: { /* out2 */
*/
case OP_SetCookie: {
Db *pDb;
+
+ sqlite3VdbeIncrWriteCounter(p, 0);
assert( pOp->p2<SQLITE_N_BTREE_META );
assert( pOp->p1>=0 && pOp->p1<db->nDb );
assert( DbMaskTest(p->btreeMask, pOp->p1) );
@@ -82443,7 +86358,7 @@ case OP_SetCookie: {
if( pOp->p1==1 ){
/* Invalidate all prepared statements whenever the TEMP database
** schema is changed. Ticket #1644 */
- sqlite3ExpirePreparedStatements(db);
+ sqlite3ExpirePreparedStatements(db, 0);
p->expired = 0;
}
if( rc ) goto abort_due_to_error;
@@ -82461,59 +86376,78 @@ case OP_SetCookie: {
** values need not be contiguous but all P1 values should be small integers.
** It is an error for P1 to be negative.
**
-** If P5!=0 then use the content of register P2 as the root page, not
-** the value of P2 itself.
-**
-** There will be a read lock on the database whenever there is an
-** open cursor. If the database was unlocked prior to this instruction
-** then a read lock is acquired as part of this instruction. A read
-** lock allows other processes to read the database but prohibits
-** any other process from modifying the database. The read lock is
-** released when all cursors are closed. If this instruction attempts
-** to get a read lock but fails, the script terminates with an
-** SQLITE_BUSY error code.
+** Allowed P5 bits:
+** <ul>
+** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for
+** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
+** of OP_SeekLE/OP_IdxGT)
+** </ul>
**
** The P4 value may be either an integer (P4_INT32) or a pointer to
** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
-** structure, then said structure defines the content and collating
-** sequence of the index being opened. Otherwise, if P4 is an integer
-** value, it is set to the number of columns in the table.
+** object, then table being opened must be an [index b-tree] where the
+** KeyInfo object defines the content and collating
+** sequence of that index b-tree. Otherwise, if P4 is an integer
+** value, then the table being opened must be a [table b-tree] with a
+** number of columns no less than the value of P4.
**
** See also: OpenWrite, ReopenIdx
*/
/* Opcode: ReopenIdx P1 P2 P3 P4 P5
** Synopsis: root=P2 iDb=P3
**
-** The ReopenIdx opcode works exactly like ReadOpen except that it first
-** checks to see if the cursor on P1 is already open with a root page
-** number of P2 and if it is this opcode becomes a no-op. In other words,
+** The ReopenIdx opcode works like OP_OpenRead except that it first
+** checks to see if the cursor on P1 is already open on the same
+** b-tree and if it is this opcode becomes a no-op. In other words,
** if the cursor is already open, do not reopen it.
**
-** The ReopenIdx opcode may only be used with P5==0 and with P4 being
-** a P4_KEYINFO object. Furthermore, the P3 value must be the same as
-** every other ReopenIdx or OpenRead for the same cursor number.
+** The ReopenIdx opcode may only be used with P5==0 or P5==OPFLAG_SEEKEQ
+** and with P4 being a P4_KEYINFO object. Furthermore, the P3 value must
+** be the same as every other ReopenIdx or OpenRead for the same cursor
+** number.
**
-** See the OpenRead opcode documentation for additional information.
+** Allowed P5 bits:
+** <ul>
+** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for
+** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
+** of OP_SeekLE/OP_IdxGT)
+** </ul>
+**
+** See also: OP_OpenRead, OP_OpenWrite
*/
/* Opcode: OpenWrite P1 P2 P3 P4 P5
** Synopsis: root=P2 iDb=P3
**
** Open a read/write cursor named P1 on the table or index whose root
-** page is P2. Or if P5!=0 use the content of register P2 to find the
-** root page.
+** page is P2 (or whose root page is held in register P2 if the
+** OPFLAG_P2ISREG bit is set in P5 - see below).
**
** The P4 value may be either an integer (P4_INT32) or a pointer to
** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
-** structure, then said structure defines the content and collating
-** sequence of the index being opened. Otherwise, if P4 is an integer
-** value, it is set to the number of columns in the table, or to the
-** largest index of any column of the table that is actually used.
+** object, then table being opened must be an [index b-tree] where the
+** KeyInfo object defines the content and collating
+** sequence of that index b-tree. Otherwise, if P4 is an integer
+** value, then the table being opened must be a [table b-tree] with a
+** number of columns no less than the value of P4.
+**
+** Allowed P5 bits:
+** <ul>
+** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for
+** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
+** of OP_SeekLE/OP_IdxGT)
+** <li> <b>0x08 OPFLAG_FORDELETE</b>: This cursor is used only to seek
+** and subsequently delete entries in an index btree. This is a
+** hint to the storage engine that the storage engine is allowed to
+** ignore. The hint is not used by the official SQLite b*tree storage
+** engine, but is used by COMDB2.
+** <li> <b>0x10 OPFLAG_P2ISREG</b>: Use the content of register P2
+** as the root page, not the value of P2 itself.
+** </ul>
**
-** This instruction works just like OpenRead except that it opens the cursor
-** in read/write mode. For a given table, there can be one or more read-only
-** cursors or a single read/write cursor but not both.
+** This instruction works like OpenRead except that it opens the cursor
+** in read/write mode.
**
-** See also OpenRead.
+** See also: OP_OpenRead, OP_ReopenIdx
*/
case OP_ReopenIdx: {
int nField;
@@ -82542,7 +86476,7 @@ case OP_OpenWrite:
assert( pOp->opcode==OP_OpenRead || pOp->opcode==OP_ReopenIdx
|| p->readOnly==0 );
- if( p->expired ){
+ if( p->expired==1 ){
rc = SQLITE_ABORT_ROLLBACK;
goto abort_due_to_error;
}
@@ -82569,6 +86503,7 @@ case OP_OpenWrite:
if( pOp->p5 & OPFLAG_P2ISREG ){
assert( p2>0 );
assert( p2<=(p->nMem+1 - p->nCursor) );
+ assert( pOp->opcode==OP_OpenWrite );
pIn2 = &aMem[p2];
assert( memIsValid(pIn2) );
assert( (pIn2->flags & MEM_Int)!=0 );
@@ -82697,7 +86632,7 @@ case OP_OpenEphemeral: {
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);
+ rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0);
}
if( rc==SQLITE_OK ){
/* If a transient index is required, create it by calling
@@ -82924,10 +86859,10 @@ case OP_ColumnsUsed: {
**
** See also: Found, NotFound, SeekGt, SeekGe, SeekLt
*/
-case OP_SeekLT: /* jump, in3 */
-case OP_SeekLE: /* jump, in3 */
-case OP_SeekGE: /* jump, in3 */
-case OP_SeekGT: { /* jump, in3 */
+case OP_SeekLT: /* jump, in3, group */
+case OP_SeekLE: /* jump, in3, group */
+case OP_SeekGE: /* jump, in3, group */
+case OP_SeekGT: { /* jump, in3, group */
int res; /* Comparison result */
int oc; /* Opcode */
VdbeCursor *pC; /* The cursor to seek */
@@ -83105,6 +87040,25 @@ seek_not_found:
break;
}
+/* Opcode: SeekHit P1 P2 * * *
+** Synopsis: seekHit=P2
+**
+** Set the seekHit flag on cursor P1 to the value in P2.
+** The seekHit flag is used by the IfNoHope opcode.
+**
+** P1 must be a valid b-tree cursor. P2 must be a boolean value,
+** either 0 or 1.
+*/
+case OP_SeekHit: {
+ VdbeCursor *pC;
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ pC = p->apCsr[pOp->p1];
+ assert( pC!=0 );
+ assert( pOp->p2==0 || pOp->p2==1 );
+ pC->seekHit = pOp->p2 & 1;
+ break;
+}
+
/* Opcode: Found P1 P2 P3 P4 *
** Synopsis: key=r[P3@P4]
**
@@ -83139,7 +87093,34 @@ seek_not_found:
** advanced in either direction. In other words, the Next and Prev
** opcodes do not work after this operation.
**
-** See also: Found, NotExists, NoConflict
+** See also: Found, NotExists, NoConflict, IfNoHope
+*/
+/* Opcode: IfNoHope P1 P2 P3 P4 *
+** Synopsis: key=r[P3@P4]
+**
+** Register P3 is the first of P4 registers that form an unpacked
+** record.
+**
+** Cursor P1 is on an index btree. If the seekHit flag is set on P1, then
+** this opcode is a no-op. But if the seekHit flag of P1 is clear, then
+** check to see if there is any entry in P1 that matches the
+** prefix identified by P3 and P4. If no entry matches the prefix,
+** jump to P2. Otherwise fall through.
+**
+** This opcode behaves like OP_NotFound if the seekHit
+** flag is clear and it behaves like OP_Noop if the seekHit flag is set.
+**
+** This opcode is used in IN clause processing for a multi-column key.
+** If an IN clause is attached to an element of the key other than the
+** left-most element, and if there are no matches on the most recent
+** seek over the whole key, then it might be that one of the key element
+** to the left is prohibiting a match, and hence there is "no hope" of
+** any match regardless of how many IN clause elements are checked.
+** In such a case, we abandon the IN clause search early, using this
+** opcode. The opcode name comes from the fact that the
+** jump is taken if there is "no hope" of achieving a match.
+**
+** See also: NotFound, SeekHit
*/
/* Opcode: NoConflict P1 P2 P3 P4 *
** Synopsis: key=r[P3@P4]
@@ -83164,6 +87145,14 @@ seek_not_found:
**
** See also: NotFound, Found, NotExists
*/
+case OP_IfNoHope: { /* jump, in3 */
+ VdbeCursor *pC;
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ pC = p->apCsr[pOp->p1];
+ assert( pC!=0 );
+ if( pC->seekHit ) break;
+ /* Fall through into OP_NotFound */
+}
case OP_NoConflict: /* jump, in3 */
case OP_NotFound: /* jump, in3 */
case OP_Found: { /* jump, in3 */
@@ -83301,18 +87290,26 @@ case OP_SeekRowid: { /* jump, in3 */
pIn3 = &aMem[pOp->p3];
if( (pIn3->flags & MEM_Int)==0 ){
+ /* Make sure pIn3->u.i contains a valid integer representation of
+ ** the key value, but do not change the datatype of the register, as
+ ** other parts of the perpared statement might be depending on the
+ ** current datatype. */
+ u16 origFlags = pIn3->flags;
+ int isNotInt;
applyAffinity(pIn3, SQLITE_AFF_NUMERIC, encoding);
- if( (pIn3->flags & MEM_Int)==0 ) goto jump_to_p2;
+ isNotInt = (pIn3->flags & MEM_Int)==0;
+ pIn3->flags = origFlags;
+ if( isNotInt ) goto jump_to_p2;
}
/* Fall through into OP_NotExists */
case OP_NotExists: /* jump, in3 */
pIn3 = &aMem[pOp->p3];
- assert( pIn3->flags & MEM_Int );
+ assert( (pIn3->flags & MEM_Int)!=0 || pOp->opcode==OP_SeekRowid );
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
assert( pC!=0 );
#ifdef SQLITE_DEBUG
- pC->seekOp = 0;
+ pC->seekOp = OP_SeekRowid;
#endif
assert( pC->isTable );
assert( pC->eCurType==CURTYPE_BTREE );
@@ -83387,6 +87384,7 @@ case OP_NewRowid: { /* out2 */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
assert( pC!=0 );
+ assert( pC->isTable );
assert( pC->eCurType==CURTYPE_BTREE );
assert( pC->uc.pCursor!=0 );
{
@@ -83543,10 +87541,8 @@ case OP_InsertInt: {
int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */
const char *zDb; /* database name - used by the update hook */
Table *pTab; /* Table structure - used by update and pre-update hooks */
- int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
BtreePayload x; /* Payload to be inserted */
- op = 0;
pData = &aMem[pOp->p2];
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
assert( memIsValid(pData) );
@@ -83557,6 +87553,7 @@ case OP_InsertInt: {
assert( (pOp->p5 & OPFLAG_ISNOOP) || pC->isTable );
assert( pOp->p4type==P4_TABLE || pOp->p4type>=P4_STATIC );
REGISTER_TRACE(pOp->p2, pData);
+ sqlite3VdbeIncrWriteCounter(p, pC);
if( pOp->opcode==OP_Insert ){
pKey = &aMem[pOp->p3];
@@ -83574,19 +87571,21 @@ case OP_InsertInt: {
zDb = db->aDb[pC->iDb].zDbSName;
pTab = pOp->p4.pTab;
assert( (pOp->p5 & OPFLAG_ISNOOP) || HasRowid(pTab) );
- op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
}else{
- pTab = 0; /* Not needed. Silence a compiler warning. */
+ pTab = 0;
zDb = 0; /* Not needed. Silence a compiler warning. */
}
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
/* Invoke the pre-update hook, if any */
- if( db->xPreUpdateCallback
- && pOp->p4type==P4_TABLE
- && !(pOp->p5 & OPFLAG_ISUPDATE)
- ){
- sqlite3VdbePreUpdateHook(p, pC, SQLITE_INSERT, zDb, pTab, x.nKey, pOp->p2);
+ if( pTab ){
+ if( db->xPreUpdateCallback && !(pOp->p5 & OPFLAG_ISUPDATE) ){
+ sqlite3VdbePreUpdateHook(p, pC, SQLITE_INSERT, zDb, pTab, x.nKey,pOp->p2);
+ }
+ if( db->xUpdateCallback==0 || pTab->aCol==0 ){
+ /* Prevent post-update hook from running in cases when it should not */
+ pTab = 0;
+ }
}
if( pOp->p5 & OPFLAG_ISNOOP ) break;
#endif
@@ -83611,8 +87610,12 @@ case OP_InsertInt: {
/* Invoke the update-hook if required. */
if( rc ) goto abort_due_to_error;
- if( db->xUpdateCallback && op ){
- db->xUpdateCallback(db->pUpdateArg, op, zDb, pTab->zName, x.nKey);
+ if( pTab ){
+ assert( db->xUpdateCallback!=0 );
+ assert( pTab->aCol!=0 );
+ db->xUpdateCallback(db->pUpdateArg,
+ (pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT,
+ zDb, pTab->zName, x.nKey);
}
break;
}
@@ -83665,6 +87668,7 @@ case OP_Delete: {
assert( pC->eCurType==CURTYPE_BTREE );
assert( pC->uc.pCursor!=0 );
assert( pC->deferredMoveto==0 );
+ sqlite3VdbeIncrWriteCounter(p, pC);
#ifdef SQLITE_DEBUG
if( pOp->p4type==P4_TABLE && HasRowid(pOp->p4.pTab) && pOp->p5==0 ){
@@ -83833,10 +87837,10 @@ case OP_SorterData: {
** If the P1 cursor must be pointing to a valid row (not a NULL row)
** of a real table, not a pseudo-table.
**
-** If P3!=0 then this opcode is allowed to make an ephermeral pointer
+** If P3!=0 then this opcode is allowed to make an ephemeral pointer
** into the database page. That means that the content of the output
** register will be invalidated as soon as the cursor moves - including
-** moves caused by other cursors that "save" the the current cursors
+** moves caused by other cursors that "save" the current cursors
** position in order that they can write to the same table. If P3==0
** then a copy of the data is made into memory. P3!=0 is faster, but
** P3==0 is safer.
@@ -83959,6 +87963,9 @@ case OP_NullRow: {
assert( pC->uc.pCursor!=0 );
sqlite3BtreeClearCursor(pC->uc.pCursor);
}
+#ifdef SQLITE_DEBUG
+ if( pC->seekOp==0 ) pC->seekOp = OP_NullRow;
+#endif
break;
}
@@ -84077,7 +88084,7 @@ case OP_Sort: { /* jump */
p->aCounter[SQLITE_STMTSTATUS_SORT]++;
/* Fall through into OP_Rewind */
}
-/* Opcode: Rewind P1 P2 * * *
+/* Opcode: Rewind P1 P2 * * P5
**
** 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.
@@ -84085,6 +88092,10 @@ 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.
@@ -84109,6 +88120,9 @@ 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;
}
@@ -84145,12 +88159,7 @@ case OP_Rewind: { /* jump */
** If P5 is positive and the jump is taken, then event counter
** number P5-1 in the prepared statement is incremented.
**
-** See also: Prev, NextIfOpen
-*/
-/* Opcode: NextIfOpen P1 P2 P3 P4 P5
-**
-** This opcode works just like Next except that if cursor P1 is not
-** open it behaves a no-op.
+** See also: Prev
*/
/* Opcode: Prev P1 P2 P3 P4 P5
**
@@ -84178,11 +88187,6 @@ case OP_Rewind: { /* jump */
** If P5 is positive and the jump is taken, then event counter
** number P5-1 in the prepared statement is incremented.
*/
-/* Opcode: PrevIfOpen P1 P2 P3 P4 P5
-**
-** This opcode works just like Prev except that if cursor P1 is not
-** open it behaves a no-op.
-*/
/* Opcode: SorterNext P1 P2 * * P5
**
** This opcode works just like OP_Next except that P1 must be a
@@ -84197,10 +88201,6 @@ case OP_SorterNext: { /* jump */
assert( isSorter(pC) );
rc = sqlite3VdbeSorterNext(db, pC);
goto next_tail;
-case OP_PrevIfOpen: /* jump */
-case OP_NextIfOpen: /* jump */
- if( p->apCsr[pOp->p1]==0 ) break;
- /* Fall through */
case OP_Prev: /* jump */
case OP_Next: /* jump */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
@@ -84211,17 +88211,17 @@ case OP_Next: /* jump */
assert( pC->eCurType==CURTYPE_BTREE );
assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext );
assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious );
- assert( pOp->opcode!=OP_NextIfOpen || pOp->p4.xAdvance==sqlite3BtreeNext );
- assert( pOp->opcode!=OP_PrevIfOpen || pOp->p4.xAdvance==sqlite3BtreePrevious);
- /* The Next opcode is only used after SeekGT, SeekGE, and Rewind.
+ /* The Next opcode is only used after SeekGT, SeekGE, Rewind, and Found.
** The Prev opcode is only used after SeekLT, SeekLE, and Last. */
- assert( pOp->opcode!=OP_Next || pOp->opcode!=OP_NextIfOpen
+ assert( pOp->opcode!=OP_Next
|| pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE
- || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found);
- assert( pOp->opcode!=OP_Prev || pOp->opcode!=OP_PrevIfOpen
+ || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found
+ || pC->seekOp==OP_NullRow);
+ assert( pOp->opcode!=OP_Prev
|| pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE
- || pC->seekOp==OP_Last );
+ || pC->seekOp==OP_Last
+ || pC->seekOp==OP_NullRow);
rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3);
next_tail:
@@ -84283,6 +88283,7 @@ case OP_IdxInsert: { /* in2 */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
+ sqlite3VdbeIncrWriteCounter(p, pC);
assert( pC!=0 );
assert( isSorter(pC)==(pOp->opcode==OP_SorterInsert) );
pIn2 = &aMem[pOp->p2];
@@ -84329,6 +88330,7 @@ case OP_IdxDelete: {
pC = p->apCsr[pOp->p1];
assert( pC!=0 );
assert( pC->eCurType==CURTYPE_BTREE );
+ sqlite3VdbeIncrWriteCounter(p, pC);
pCrsr = pC->uc.pCursor;
assert( pCrsr!=0 );
assert( pOp->p5==0 );
@@ -84502,7 +88504,13 @@ case OP_IdxGE: { /* jump */
}
r.aMem = &aMem[pOp->p3];
#ifdef SQLITE_DEBUG
- { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
+ {
+ int i;
+ for(i=0; i<r.nField; i++){
+ assert( memIsValid(&r.aMem[i]) );
+ REGISTER_TRACE(pOp->p3+i, &aMem[pOp->p3+i]);
+ }
+ }
#endif
res = 0; /* Not needed. Only used to silence a warning. */
rc = sqlite3VdbeIdxKeyCompare(db, pC, &r, &res);
@@ -84551,6 +88559,7 @@ case OP_Destroy: { /* out2 */
int iMoved;
int iDb;
+ sqlite3VdbeIncrWriteCounter(p, 0);
assert( p->readOnly==0 );
assert( pOp->p1>1 );
pOut = out2Prerelease(p, pOp);
@@ -84600,6 +88609,7 @@ case OP_Destroy: { /* out2 */
case OP_Clear: {
int nChange;
+ sqlite3VdbeIncrWriteCounter(p, 0);
nChange = 0;
assert( p->readOnly==0 );
assert( DbMaskTest(p->btreeMask, pOp->p2) );
@@ -84649,13 +88659,14 @@ case OP_ResetSorter: {
** Allocate a new b-tree in the main database file if P1==0 or in the
** TEMP database file if P1==1 or in an attached database if
** P1>1. The P3 argument must be 1 (BTREE_INTKEY) for a rowid table
-** it must be 2 (BTREE_BLOBKEY) for a index or WITHOUT ROWID table.
+** it must be 2 (BTREE_BLOBKEY) for an index or WITHOUT ROWID table.
** The root page number of the new b-tree is stored in register P2.
*/
case OP_CreateBtree: { /* out2 */
int pgno;
Db *pDb;
+ sqlite3VdbeIncrWriteCounter(p, 0);
pOut = out2Prerelease(p, pOp);
pgno = 0;
assert( pOp->p3==BTREE_INTKEY || pOp->p3==BTREE_BLOBKEY );
@@ -84675,6 +88686,7 @@ case OP_CreateBtree: { /* out2 */
** Run the SQL statement or statements specified in the P4 string.
*/
case OP_SqlExec: {
+ sqlite3VdbeIncrWriteCounter(p, 0);
db->nSqlExec++;
rc = sqlite3_exec(db, pOp->p4.z, 0, 0, 0);
db->nSqlExec--;
@@ -84685,7 +88697,8 @@ case OP_SqlExec: {
/* Opcode: ParseSchema P1 * * P4 *
**
** Read and parse all entries from the SQLITE_MASTER table of database P1
-** that match the WHERE clause P4.
+** that match the WHERE clause P4. If P4 is a NULL pointer, then the
+** entire schema for P1 is reparsed.
**
** This opcode invokes the parser to create a new virtual machine,
** then runs the new virtual machine. It is thus a re-entrant opcode.
@@ -84709,11 +88722,22 @@ case OP_ParseSchema: {
iDb = pOp->p1;
assert( iDb>=0 && iDb<db->nDb );
assert( DbHasProperty(db, iDb, DB_SchemaLoaded) );
- /* Used to be a conditional */ {
+
+#ifndef SQLITE_OMIT_ALTERTABLE
+ if( pOp->p4.z==0 ){
+ sqlite3SchemaClear(db->aDb[iDb].pSchema);
+ db->mDbFlags &= ~DBFLAG_SchemaKnownOk;
+ rc = sqlite3InitOne(db, iDb, &p->zErrMsg, INITFLAG_AlterTable);
+ db->mDbFlags |= DBFLAG_SchemaChange;
+ p->expired = 0;
+ }else
+#endif
+ {
zMaster = MASTER_NAME;
initData.db = db;
- initData.iDb = pOp->p1;
+ initData.iDb = iDb;
initData.pzErrMsg = &p->zErrMsg;
+ initData.mInitFlags = 0;
zSql = sqlite3MPrintf(db,
"SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid",
db->aDb[iDb].zDbSName, zMaster, pOp->p4.z);
@@ -84764,6 +88788,7 @@ case OP_LoadAnalysis: {
** schema consistent with what is on disk.
*/
case OP_DropTable: {
+ sqlite3VdbeIncrWriteCounter(p, 0);
sqlite3UnlinkAndDeleteTable(db, pOp->p1, pOp->p4.z);
break;
}
@@ -84777,6 +88802,7 @@ case OP_DropTable: {
** schema consistent with what is on disk.
*/
case OP_DropIndex: {
+ sqlite3VdbeIncrWriteCounter(p, 0);
sqlite3UnlinkAndDeleteIndex(db, pOp->p1, pOp->p4.z);
break;
}
@@ -84790,6 +88816,7 @@ case OP_DropIndex: {
** schema consistent with what is on disk.
*/
case OP_DropTrigger: {
+ sqlite3VdbeIncrWriteCounter(p, 0);
sqlite3UnlinkAndDeleteTrigger(db, pOp->p1, pOp->p4.z);
break;
}
@@ -84863,11 +88890,11 @@ case OP_RowSetAdd: { /* in1, in2 */
pIn1 = &aMem[pOp->p1];
pIn2 = &aMem[pOp->p2];
assert( (pIn2->flags & MEM_Int)!=0 );
- if( (pIn1->flags & MEM_RowSet)==0 ){
- sqlite3VdbeMemSetRowSet(pIn1);
- if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem;
+ if( (pIn1->flags & MEM_Blob)==0 ){
+ if( sqlite3VdbeMemSetRowSet(pIn1) ) goto no_mem;
}
- sqlite3RowSetInsert(pIn1->u.pRowSet, pIn2->u.i);
+ assert( sqlite3VdbeMemIsRowSet(pIn1) );
+ sqlite3RowSetInsert((RowSet*)pIn1->z, pIn2->u.i);
break;
}
@@ -84883,8 +88910,9 @@ case OP_RowSetRead: { /* jump, in1, out3 */
i64 val;
pIn1 = &aMem[pOp->p1];
- if( (pIn1->flags & MEM_RowSet)==0
- || sqlite3RowSetNext(pIn1->u.pRowSet, &val)==0
+ assert( (pIn1->flags & MEM_Blob)==0 || sqlite3VdbeMemIsRowSet(pIn1) );
+ if( (pIn1->flags & MEM_Blob)==0
+ || sqlite3RowSetNext((RowSet*)pIn1->z, &val)==0
){
/* The boolean index is empty */
sqlite3VdbeMemSetNull(pIn1);
@@ -84933,20 +88961,19 @@ case OP_RowSetTest: { /* jump, in1, in3 */
/* If there is anything other than a rowset object in memory cell P1,
** delete it now and initialize P1 with an empty rowset
*/
- if( (pIn1->flags & MEM_RowSet)==0 ){
- sqlite3VdbeMemSetRowSet(pIn1);
- if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem;
+ if( (pIn1->flags & MEM_Blob)==0 ){
+ if( sqlite3VdbeMemSetRowSet(pIn1) ) goto no_mem;
}
-
+ assert( sqlite3VdbeMemIsRowSet(pIn1) );
assert( pOp->p4type==P4_INT32 );
assert( iSet==-1 || iSet>=0 );
if( iSet ){
- exists = sqlite3RowSetTest(pIn1->u.pRowSet, iSet, pIn3->u.i);
+ exists = sqlite3RowSetTest((RowSet*)pIn1->z, iSet, pIn3->u.i);
VdbeBranchTaken(exists!=0,2);
if( exists ) goto jump_to_p2;
}
if( iSet>=0 ){
- sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i);
+ sqlite3RowSetInsert((RowSet*)pIn1->z, pIn3->u.i);
}
break;
}
@@ -85010,7 +89037,7 @@ case OP_Program: { /* jump */
** of the current program, and the memory required at runtime to execute
** the trigger program. If this trigger has been fired before, then pRt
** is already allocated. Otherwise, it must be initialized. */
- if( (pRt->flags&MEM_Frame)==0 ){
+ if( (pRt->flags&MEM_Blob)==0 ){
/* SubProgram.nMem is set to the number of memory cells used by the
** program stored in SubProgram.aOp. As well as these, one memory
** cell is required for each cursor used by the program. Set local
@@ -85028,8 +89055,10 @@ case OP_Program: { /* jump */
goto no_mem;
}
sqlite3VdbeMemRelease(pRt);
- pRt->flags = MEM_Frame;
- pRt->u.pFrame = pFrame;
+ pRt->flags = MEM_Blob|MEM_Dyn;
+ pRt->z = (char*)pFrame;
+ pRt->n = nByte;
+ pRt->xDel = sqlite3VdbeFrameMemDel;
pFrame->v = p;
pFrame->nChildMem = nMem;
@@ -85045,6 +89074,9 @@ case OP_Program: { /* jump */
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
pFrame->anExec = p->anExec;
#endif
+#ifdef SQLITE_DEBUG
+ pFrame->iFrameMagic = SQLITE_FRAME_MAGIC;
+#endif
pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem];
for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){
@@ -85052,7 +89084,8 @@ case OP_Program: { /* jump */
pMem->db = db;
}
}else{
- pFrame = pRt->u.pFrame;
+ pFrame = (VdbeFrame*)pRt->z;
+ assert( pRt->xDel==sqlite3VdbeFrameMemDel );
assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem
|| (pProgram->nCsr==0 && pProgram->nMem+1==pFrame->nChildMem) );
assert( pProgram->nCsr==pFrame->nChildCsr );
@@ -85281,24 +89314,35 @@ case OP_DecrJumpZero: { /* jump, in1 */
}
-/* Opcode: AggStep0 * P2 P3 P4 P5
+/* Opcode: AggStep * P2 P3 P4 P5
** Synopsis: accum=r[P3] step(r[P2@P5])
**
-** Execute the step function for an aggregate. The
-** function has P5 arguments. P4 is a pointer to the FuncDef
-** structure that specifies the function. Register P3 is the
+** Execute the xStep function for an aggregate.
+** The function has P5 arguments. P4 is a pointer to the
+** FuncDef structure that specifies the function. Register P3 is the
** accumulator.
**
** The P5 arguments are taken from register P2 and its
** successors.
*/
-/* Opcode: AggStep * P2 P3 P4 P5
+/* Opcode: AggInverse * P2 P3 P4 P5
+** Synopsis: accum=r[P3] inverse(r[P2@P5])
+**
+** Execute the xInverse function for an aggregate.
+** The function has P5 arguments. P4 is a pointer to the
+** FuncDef structure that specifies the function. Register P3 is the
+** accumulator.
+**
+** The P5 arguments are taken from register P2 and its
+** successors.
+*/
+/* Opcode: AggStep1 P1 P2 P3 P4 P5
** Synopsis: accum=r[P3] step(r[P2@P5])
**
-** Execute the step function for an aggregate. The
-** function has P5 arguments. P4 is a pointer to an sqlite3_context
-** object that is used to run the function. Register P3 is
-** as the accumulator.
+** Execute the xStep (if P1==0) or xInverse (if P1!=0) function for an
+** aggregate. The function has P5 arguments. P4 is a pointer to the
+** FuncDef structure that specifies the function. Register P3 is the
+** accumulator.
**
** The P5 arguments are taken from register P2 and its
** successors.
@@ -85309,7 +89353,8 @@ case OP_DecrJumpZero: { /* jump, in1 */
** sqlite3_context only happens once, instead of on each call to the
** step function.
*/
-case OP_AggStep0: {
+case OP_AggInverse:
+case OP_AggStep: {
int n;
sqlite3_context *pCtx;
@@ -85318,28 +89363,47 @@ case OP_AggStep0: {
assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) );
assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) );
assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+n );
- pCtx = sqlite3DbMallocRawNN(db, sizeof(*pCtx) + (n-1)*sizeof(sqlite3_value*));
+ pCtx = sqlite3DbMallocRawNN(db, n*sizeof(sqlite3_value*) +
+ (sizeof(pCtx[0]) + sizeof(Mem) - sizeof(sqlite3_value*)));
if( pCtx==0 ) goto no_mem;
pCtx->pMem = 0;
+ pCtx->pOut = (Mem*)&(pCtx->argv[n]);
+ sqlite3VdbeMemInit(pCtx->pOut, db, MEM_Null);
pCtx->pFunc = pOp->p4.pFunc;
pCtx->iOp = (int)(pOp - aOp);
pCtx->pVdbe = p;
+ pCtx->skipFlag = 0;
+ pCtx->isError = 0;
pCtx->argc = n;
pOp->p4type = P4_FUNCCTX;
pOp->p4.pCtx = pCtx;
- pOp->opcode = OP_AggStep;
+
+ /* OP_AggInverse must have P1==1 and OP_AggStep must have P1==0 */
+ assert( pOp->p1==(pOp->opcode==OP_AggInverse) );
+
+ pOp->opcode = OP_AggStep1;
/* Fall through into OP_AggStep */
}
-case OP_AggStep: {
+case OP_AggStep1: {
int i;
sqlite3_context *pCtx;
Mem *pMem;
- Mem t;
assert( pOp->p4type==P4_FUNCCTX );
pCtx = pOp->p4.pCtx;
pMem = &aMem[pOp->p3];
+#ifdef SQLITE_DEBUG
+ if( pOp->p1 ){
+ /* This is an OP_AggInverse call. Verify that xStep has always
+ ** been called at least once prior to any xInverse call. */
+ assert( pMem->uTemp==0x1122e0e3 );
+ }else{
+ /* This is an OP_AggStep call. Mark it as such. */
+ pMem->uTemp = 0x1122e0e3;
+ }
+#endif
+
/* If this function is inside of a trigger, the register array in aMem[]
** might change from one evaluation to the next. The next block of code
** checks to see if the register array has changed, and if so it
@@ -85357,48 +89421,80 @@ case OP_AggStep: {
#endif
pMem->n++;
- sqlite3VdbeMemInit(&t, db, MEM_Null);
- pCtx->pOut = &t;
- pCtx->fErrorOrAux = 0;
- pCtx->skipFlag = 0;
+ assert( pCtx->pOut->flags==MEM_Null );
+ assert( pCtx->isError==0 );
+ assert( pCtx->skipFlag==0 );
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( pOp->p1 ){
+ (pCtx->pFunc->xInverse)(pCtx,pCtx->argc,pCtx->argv);
+ }else
+#endif
(pCtx->pFunc->xSFunc)(pCtx,pCtx->argc,pCtx->argv); /* IMP: R-24505-23230 */
- if( pCtx->fErrorOrAux ){
- if( pCtx->isError ){
- sqlite3VdbeError(p, "%s", sqlite3_value_text(&t));
+
+ if( pCtx->isError ){
+ if( pCtx->isError>0 ){
+ sqlite3VdbeError(p, "%s", sqlite3_value_text(pCtx->pOut));
rc = pCtx->isError;
}
- sqlite3VdbeMemRelease(&t);
+ if( pCtx->skipFlag ){
+ assert( pOp[-1].opcode==OP_CollSeq );
+ i = pOp[-1].p1;
+ if( i ) sqlite3VdbeMemSetInt64(&aMem[i], 1);
+ pCtx->skipFlag = 0;
+ }
+ sqlite3VdbeMemRelease(pCtx->pOut);
+ pCtx->pOut->flags = MEM_Null;
+ pCtx->isError = 0;
if( rc ) goto abort_due_to_error;
- }else{
- assert( t.flags==MEM_Null );
- }
- if( pCtx->skipFlag ){
- assert( pOp[-1].opcode==OP_CollSeq );
- i = pOp[-1].p1;
- if( i ) sqlite3VdbeMemSetInt64(&aMem[i], 1);
}
+ assert( pCtx->pOut->flags==MEM_Null );
+ assert( pCtx->skipFlag==0 );
break;
}
/* Opcode: AggFinal P1 P2 * P4 *
** Synopsis: accum=r[P1] N=P2
**
-** Execute the finalizer function for an aggregate. P1 is
-** the memory location that is the accumulator for the aggregate.
+** P1 is the memory location that is the accumulator for an aggregate
+** or window function. Execute the finalizer function
+** for an aggregate and store the result in P1.
**
** P2 is the number of arguments that the step function takes and
** P4 is a pointer to the FuncDef for this function. The P2
** argument is not used by this opcode. It is only there to disambiguate
** functions that can take varying numbers of arguments. The
-** P4 argument is only needed for the degenerate case where
+** P4 argument is only needed for the case where
** the step function was not previously called.
*/
+/* Opcode: AggValue * P2 P3 P4 *
+** Synopsis: r[P3]=value N=P2
+**
+** Invoke the xValue() function and store the result in register P3.
+**
+** P2 is the number of arguments that the step function takes and
+** P4 is a pointer to the FuncDef for this function. The P2
+** argument is not used by this opcode. It is only there to disambiguate
+** functions that can take varying numbers of arguments. The
+** P4 argument is only needed for the case where
+** the step function was not previously called.
+*/
+case OP_AggValue:
case OP_AggFinal: {
Mem *pMem;
assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) );
+ assert( pOp->p3==0 || pOp->opcode==OP_AggValue );
pMem = &aMem[pOp->p1];
assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 );
- rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( pOp->p3 ){
+ rc = sqlite3VdbeMemAggValue(pMem, &aMem[pOp->p3], pOp->p4.pFunc);
+ pMem = &aMem[pOp->p3];
+ }else
+#endif
+ {
+ rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc);
+ }
+
if( rc ){
sqlite3VdbeError(p, "%s", sqlite3_value_text(pMem));
goto abort_due_to_error;
@@ -85593,7 +89689,7 @@ case OP_IncrVacuum: { /* jump */
}
#endif
-/* Opcode: Expire P1 * * * *
+/* Opcode: Expire P1 P2 * * *
**
** Cause precompiled statements to expire. When an expired statement
** is executed using sqlite3_step() it will either automatically
@@ -85602,12 +89698,19 @@ case OP_IncrVacuum: { /* jump */
**
** If P1 is 0, then all SQL statements become expired. If P1 is non-zero,
** then only the currently executing statement is expired.
+**
+** If P2 is 0, then SQL statements are expired immediately. If P2 is 1,
+** then running SQL statements are allowed to continue to run to completion.
+** The P2==1 case occurs when a CREATE INDEX or similar schema change happens
+** that might help the statement run faster but which does not affect the
+** correctness of operation.
*/
case OP_Expire: {
+ assert( pOp->p2==0 || pOp->p2==1 );
if( !pOp->p1 ){
- sqlite3ExpirePreparedStatements(db);
+ sqlite3ExpirePreparedStatements(db, pOp->p2);
}else{
- p->expired = 1;
+ p->expired = pOp->p2+1;
}
break;
}
@@ -85821,12 +89924,19 @@ case OP_VFilter: { /* jump */
#endif /* SQLITE_OMIT_VIRTUALTABLE */
#ifndef SQLITE_OMIT_VIRTUALTABLE
-/* Opcode: VColumn P1 P2 P3 * *
+/* Opcode: VColumn P1 P2 P3 * P5
** Synopsis: r[P3]=vcolumn(P2)
**
-** Store the value of the P2-th column of
-** the row of the virtual-table that the
-** P1 cursor is pointing to into register P3.
+** Store in register P3 the value of the P2-th column of
+** the current row of the virtual-table of cursor P1.
+**
+** If the VColumn opcode is being used to fetch the value of
+** an unchanging column during an UPDATE operation, then the P5
+** value is OPFLAG_NOCHNG. This will cause the sqlite3_vtab_nochange()
+** function to return true inside the xColumn method of the virtual
+** table implementation. The P5 column might also contain other
+** bits (OPFLAG_LENGTHARG or OPFLAG_TYPEOFARG) but those bits are
+** unused by OP_VColumn.
*/
case OP_VColumn: {
sqlite3_vtab *pVtab;
@@ -85848,10 +89958,18 @@ case OP_VColumn: {
assert( pModule->xColumn );
memset(&sContext, 0, sizeof(sContext));
sContext.pOut = pDest;
- MemSetTypeFlag(pDest, MEM_Null);
+ testcase( (pOp->p5 & OPFLAG_NOCHNG)==0 && pOp->p5!=0 );
+ if( pOp->p5 & OPFLAG_NOCHNG ){
+ sqlite3VdbeMemSetNull(pDest);
+ pDest->flags = MEM_Null|MEM_Zero;
+ pDest->u.nZero = 0;
+ }else{
+ MemSetTypeFlag(pDest, MEM_Null);
+ }
rc = pModule->xColumn(pCur->uc.pVCur, &sContext, pOp->p2);
sqlite3VtabImportErrmsg(p, pVtab);
- if( sContext.isError ){
+ if( sContext.isError>0 ){
+ sqlite3VdbeError(p, "%s", sqlite3_value_text(pDest));
rc = sContext.isError;
}
sqlite3VdbeChangeEncoding(pDest, encoding);
@@ -85918,7 +90036,10 @@ case OP_VNext: { /* jump */
case OP_VRename: {
sqlite3_vtab *pVtab;
Mem *pName;
-
+ int isLegacy;
+
+ isLegacy = (db->flags & SQLITE_LegacyAlter);
+ db->flags |= SQLITE_LegacyAlter;
pVtab = pOp->p4.pVtab->pVtab;
pName = &aMem[pOp->p1];
assert( pVtab->pModule->xRename );
@@ -85932,6 +90053,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;
sqlite3VtabImportErrmsg(p, pVtab);
p->expired = 0;
if( rc ) goto abort_due_to_error;
@@ -85980,6 +90102,8 @@ case OP_VUpdate: {
|| pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace
);
assert( p->readOnly==0 );
+ if( db->mallocFailed ) goto no_mem;
+ sqlite3VdbeIncrWriteCounter(p, 0);
pVtab = pOp->p4.pVtab->pVtab;
if( pVtab==0 || NEVER(pVtab->pModule==0) ){
rc = SQLITE_LOCKED;
@@ -86100,8 +90224,8 @@ case OP_MaxPgcnt: { /* out2 */
**
** See also: Function0, AggStep, AggFinal
*/
-case OP_PureFunc0:
-case OP_Function0: {
+case OP_PureFunc0: /* group */
+case OP_Function0: { /* group */
int n;
sqlite3_context *pCtx;
@@ -86116,6 +90240,7 @@ case OP_Function0: {
pCtx->pFunc = pOp->p4.pFunc;
pCtx->iOp = (int)(pOp - aOp);
pCtx->pVdbe = p;
+ pCtx->isError = 0;
pCtx->argc = n;
pOp->p4type = P4_FUNCCTX;
pOp->p4.pCtx = pCtx;
@@ -86124,8 +90249,8 @@ case OP_Function0: {
pOp->opcode += 2;
/* Fall through into OP_Function */
}
-case OP_PureFunc:
-case OP_Function: {
+case OP_PureFunc: /* group */
+case OP_Function: { /* group */
int i;
sqlite3_context *pCtx;
@@ -86150,16 +90275,17 @@ case OP_Function: {
}
#endif
MemSetTypeFlag(pOut, MEM_Null);
- pCtx->fErrorOrAux = 0;
+ assert( pCtx->isError==0 );
(*pCtx->pFunc->xSFunc)(pCtx, pCtx->argc, pCtx->argv);/* IMP: R-24505-23230 */
/* If the function returned an error, throw an exception */
- if( pCtx->fErrorOrAux ){
- if( pCtx->isError ){
+ if( pCtx->isError ){
+ if( pCtx->isError>0 ){
sqlite3VdbeError(p, "%s", sqlite3_value_text(pOut));
rc = pCtx->isError;
}
sqlite3VdbeDeleteAuxData(db, &p->pAuxData, pCtx->iOp, pOp->p1);
+ pCtx->isError = 0;
if( rc ) goto abort_due_to_error;
}
@@ -86174,7 +90300,13 @@ case OP_Function: {
break;
}
-
+/* Opcode: Trace P1 P2 * P4 *
+**
+** Write P4 on the statement trace output if statement tracing is
+** enabled.
+**
+** Operand P1 must be 0x7fffffff and P2 must positive.
+*/
/* Opcode: Init P1 P2 P3 P4 *
** Synopsis: Start at P2
**
@@ -86193,9 +90325,12 @@ case OP_Function: {
** If P3 is not zero, then it is an address to jump to if an SQLITE_CORRUPT
** error is encountered.
*/
+case OP_Trace:
case OP_Init: { /* jump */
- char *zTrace;
int i;
+#ifndef SQLITE_OMIT_TRACE
+ char *zTrace;
+#endif
/* If the P4 argument is not NULL, then it must be an SQL comment string.
** The "--" string is broken up to prevent false-positives with srcck1.c.
@@ -86207,7 +90342,9 @@ case OP_Init: { /* jump */
** sqlite3_expanded_sql(P) otherwise.
*/
assert( pOp->p4.z==0 || strncmp(pOp->p4.z, "-" "- ", 3)==0 );
- assert( pOp==p->aOp ); /* Always instruction 0 */
+
+ /* OP_Init is always instruction 0 */
+ assert( pOp==p->aOp || pOp->opcode==OP_Trace );
#ifndef SQLITE_OMIT_TRACE
if( (db->mTrace & (SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY))!=0
@@ -86250,6 +90387,7 @@ case OP_Init: { /* jump */
#endif /* SQLITE_OMIT_TRACE */
assert( pOp->p2>0 );
if( pOp->p1>=sqlite3GlobalConfig.iOnceResetThreshold ){
+ if( pOp->opcode==OP_Trace ) break;
for(i=1; i<p->nOp; i++){
if( p->aOp[i].opcode==OP_Once ) p->aOp[i].p1 = 0;
}
@@ -86283,6 +90421,22 @@ case OP_CursorHint: {
}
#endif /* SQLITE_ENABLE_CURSOR_HINTS */
+#ifdef SQLITE_DEBUG
+/* Opcode: Abortable * * * * *
+**
+** Verify that an Abort can happen. Assert if an Abort at this point
+** might cause database corruption. This opcode only appears in debugging
+** builds.
+**
+** An Abort is safe if either there have been no writes, or if there is
+** an active statement journal.
+*/
+case OP_Abortable: {
+ sqlite3VdbeAssertAbortable(p);
+ break;
+}
+#endif
+
/* Opcode: Noop * * * * *
**
** Do nothing. This instruction is often useful as a jump
@@ -86294,8 +90448,9 @@ case OP_CursorHint: {
** This opcode records information from the optimizer. It is the
** the same as a no-op. This opcodesnever appears in a real VM program.
*/
-default: { /* This is really OP_Noop and OP_Explain */
+default: { /* This is really OP_Noop, OP_Explain */
assert( pOp->opcode==OP_Noop || pOp->opcode==OP_Explain );
+
break;
}
@@ -86309,7 +90464,7 @@ default: { /* This is really OP_Noop and OP_Explain */
#ifdef VDBE_PROFILE
{
- u64 endTime = sqlite3Hwtime();
+ u64 endTime = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
if( endTime>start ) pOrigOp->cycles += endTime - start;
pOrigOp->cnt++;
}
@@ -89020,7 +93175,11 @@ static int vdbeMergeEngineInit(
){
int rc = SQLITE_OK; /* Return code */
int i; /* For looping over PmaReader objects */
- int nTree = pMerger->nTree;
+ int nTree; /* Number of subtrees to merge */
+
+ /* Failure to allocate the merge would have been detected prior to
+ ** invoking this routine */
+ assert( pMerger!=0 );
/* eMode is always INCRINIT_NORMAL in single-threaded mode */
assert( SQLITE_MAX_WORKER_THREADS>0 || eMode==INCRINIT_NORMAL );
@@ -89029,6 +93188,7 @@ static int vdbeMergeEngineInit(
assert( pMerger->pTask==0 );
pMerger->pTask = pTask;
+ nTree = pMerger->nTree;
for(i=0; i<nTree; i++){
if( SQLITE_MAX_WORKER_THREADS>0 && eMode==INCRINIT_ROOT ){
/* PmaReaders should be normally initialized in order, as if they are
@@ -90157,6 +94317,14 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){
}else if( pExpr->x.pList ){
if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort;
}
+#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;
+ }
+#endif
}
break;
}
@@ -90194,7 +94362,6 @@ 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( sqlite3WalkExpr(pWalker, p->pOffset) ) return WRC_Abort;
return WRC_Continue;
}
@@ -90211,16 +94378,15 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){
struct SrcList_item *pItem;
pSrc = p->pSrc;
- if( ALWAYS(pSrc) ){
- for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){
- if( pItem->pSelect && sqlite3WalkSelect(pWalker, pItem->pSelect) ){
- return WRC_Abort;
- }
- if( pItem->fg.isTabFunc
- && sqlite3WalkExprList(pWalker, pItem->u1.pFuncArg)
- ){
- return WRC_Abort;
- }
+ assert( pSrc!=0 );
+ for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){
+ if( pItem->pSelect && sqlite3WalkSelect(pWalker, pItem->pSelect) ){
+ return WRC_Abort;
+ }
+ if( pItem->fg.isTabFunc
+ && sqlite3WalkExprList(pWalker, pItem->u1.pFuncArg)
+ ){
+ return WRC_Abort;
}
}
return WRC_Continue;
@@ -90342,29 +94508,31 @@ static void resolveAlias(
assert( pOrig!=0 );
db = pParse->db;
pDup = sqlite3ExprDup(db, pOrig, 0);
- if( pDup==0 ) return;
- if( zType[0]!='G' ) incrAggFunctionDepth(pDup, nSubquery);
- if( pExpr->op==TK_COLLATE ){
- pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken);
- }
- ExprSetProperty(pDup, EP_Alias);
+ if( pDup!=0 ){
+ if( zType[0]!='G' ) incrAggFunctionDepth(pDup, nSubquery);
+ 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,
- ** allowing it to be repopulated by the memcpy() on the following line.
- ** The pExpr->u.zToken might point into memory that will be freed by the
- ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to
- ** make a copy of the token before doing the sqlite3DbFree().
- */
- ExprSetProperty(pExpr, EP_Static);
- sqlite3ExprDelete(db, pExpr);
- memcpy(pExpr, pDup, sizeof(*pExpr));
- if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){
- assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 );
- pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken);
- pExpr->flags |= EP_MemToken;
+ /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This
+ ** prevents ExprDelete() from deleting the Expr structure itself,
+ ** allowing it to be repopulated by the memcpy() on the following line.
+ ** The pExpr->u.zToken might point into memory that will be freed by the
+ ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to
+ ** make a copy of the token before doing the sqlite3DbFree().
+ */
+ ExprSetProperty(pExpr, EP_Static);
+ sqlite3ExprDelete(db, pExpr);
+ memcpy(pExpr, pDup, sizeof(*pExpr));
+ if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){
+ assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 );
+ pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken);
+ pExpr->flags |= EP_MemToken;
+ }
+ sqlite3DbFree(db, pDup);
}
- sqlite3DbFree(db, pDup);
+ ExprSetProperty(pExpr, EP_Alias);
}
@@ -90424,7 +94592,7 @@ SQLITE_PRIVATE int sqlite3MatchSpanName(
** (even if X is implied).
** pExpr->iTable Set to the cursor number for the table obtained
** from pSrcList.
-** pExpr->pTab Points to the Table structure of X.Y (even if
+** pExpr->y.pTab Points to the Table structure of X.Y (even if
** X and/or Y are implied.)
** pExpr->iColumn Set to the column number within the table.
** pExpr->op Set to TK_COLUMN.
@@ -90458,7 +94626,7 @@ static int lookupName(
struct SrcList_item *pMatch = 0; /* The matching pSrcList item */
NameContext *pTopNC = pNC; /* First namecontext in the list */
Schema *pSchema = 0; /* Schema of the expression */
- int isTrigger = 0; /* True if resolved to a trigger column */
+ int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */
Table *pTab = 0; /* Table hold the row */
Column *pCol; /* A column of pTab */
@@ -90468,7 +94636,6 @@ static int lookupName(
/* Initialize the node to no-match */
pExpr->iTable = -1;
- pExpr->pTab = 0;
ExprSetVVAProperty(pExpr, EP_NoReduce);
/* Translate the schema name in zDb into a pointer to the corresponding
@@ -90529,6 +94696,9 @@ static int lookupName(
if( sqlite3StrICmp(zTabName, zTab)!=0 ){
continue;
}
+ if( IN_RENAME_OBJECT && pItem->zAlias ){
+ sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab);
+ }
}
if( 0==(cntTab++) ){
pMatch = pItem;
@@ -90553,32 +94723,45 @@ static int lookupName(
}
if( pMatch ){
pExpr->iTable = pMatch->iCursor;
- pExpr->pTab = pMatch->pTab;
+ pExpr->y.pTab = pMatch->pTab;
/* RIGHT JOIN not (yet) supported */
assert( (pMatch->fg.jointype & JT_RIGHT)==0 );
if( (pMatch->fg.jointype & JT_LEFT)!=0 ){
ExprSetProperty(pExpr, EP_CanBeNull);
}
- pSchema = pExpr->pTab->pSchema;
+ pSchema = pExpr->y.pTab->pSchema;
}
} /* if( pSrcList ) */
-#ifndef SQLITE_OMIT_TRIGGER
+#if !defined(SQLITE_OMIT_TRIGGER) || !defined(SQLITE_OMIT_UPSERT)
/* If we have not already resolved the name, then maybe
- ** it is a new.* or old.* trigger argument reference
+ ** it is a new.* or old.* trigger argument reference. Or
+ ** maybe it is an excluded.* from an upsert.
*/
- if( zDb==0 && zTab!=0 && cntTab==0 && pParse->pTriggerTab!=0 ){
- int op = pParse->eTriggerOp;
- assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT );
- if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){
- pExpr->iTable = 1;
- pTab = pParse->pTriggerTab;
- }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){
- pExpr->iTable = 0;
- pTab = pParse->pTriggerTab;
- }else{
- pTab = 0;
+ if( zDb==0 && zTab!=0 && cntTab==0 ){
+ pTab = 0;
+#ifndef SQLITE_OMIT_TRIGGER
+ if( pParse->pTriggerTab!=0 ){
+ int op = pParse->eTriggerOp;
+ assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT );
+ if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){
+ pExpr->iTable = 1;
+ pTab = pParse->pTriggerTab;
+ }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){
+ pExpr->iTable = 0;
+ pTab = pParse->pTriggerTab;
+ }
}
+#endif /* SQLITE_OMIT_TRIGGER */
+#ifndef SQLITE_OMIT_UPSERT
+ if( (pNC->ncFlags & NC_UUpsert)!=0 ){
+ Upsert *pUpsert = pNC->uNC.pUpsert;
+ if( pUpsert && sqlite3StrICmp("excluded",zTab)==0 ){
+ pTab = pUpsert->pUpsertSrc->a[0].pTab;
+ pExpr->iTable = 2;
+ }
+ }
+#endif /* SQLITE_OMIT_UPSERT */
if( pTab ){
int iCol;
@@ -90598,24 +94781,42 @@ static int lookupName(
}
if( iCol<pTab->nCol ){
cnt++;
- if( iCol<0 ){
- pExpr->affinity = SQLITE_AFF_INTEGER;
- }else if( pExpr->iTable==0 ){
- testcase( iCol==31 );
- testcase( iCol==32 );
- pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
- }else{
- testcase( iCol==31 );
- testcase( iCol==32 );
- pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
+#ifndef SQLITE_OMIT_UPSERT
+ if( pExpr->iTable==2 ){
+ testcase( iCol==(-1) );
+ if( IN_RENAME_OBJECT ){
+ pExpr->iColumn = iCol;
+ pExpr->y.pTab = pTab;
+ eNewExprOp = TK_COLUMN;
+ }else{
+ pExpr->iTable = pNC->uNC.pUpsert->regData + iCol;
+ eNewExprOp = TK_REGISTER;
+ ExprSetProperty(pExpr, EP_Alias);
+ }
+ }else
+#endif /* SQLITE_OMIT_UPSERT */
+ {
+#ifndef SQLITE_OMIT_TRIGGER
+ if( iCol<0 ){
+ pExpr->affinity = SQLITE_AFF_INTEGER;
+ }else if( pExpr->iTable==0 ){
+ testcase( iCol==31 );
+ testcase( iCol==32 );
+ pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
+ }else{
+ testcase( iCol==31 );
+ testcase( iCol==32 );
+ pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
+ }
+ pExpr->y.pTab = pTab;
+ pExpr->iColumn = (i16)iCol;
+ eNewExprOp = TK_TRIGGER;
+#endif /* SQLITE_OMIT_TRIGGER */
}
- pExpr->iColumn = (i16)iCol;
- pExpr->pTab = pTab;
- isTrigger = 1;
}
}
}
-#endif /* !defined(SQLITE_OMIT_TRIGGER) */
+#endif /* !defined(SQLITE_OMIT_TRIGGER) || !defined(SQLITE_OMIT_UPSERT) */
/*
** Perhaps the name is a reference to the ROWID
@@ -90650,10 +94851,12 @@ static int lookupName(
** is supported for backwards compatibility only. Hence, we issue a warning
** on sqlite3_log() whenever the capability is used.
*/
- if( (pEList = pNC->pEList)!=0
- && zTab==0
+ if( (pNC->ncFlags & NC_UEList)!=0
&& cnt==0
+ && zTab==0
){
+ pEList = pNC->uNC.pEList;
+ assert( pEList!=0 );
for(j=0; j<pEList->nExpr; j++){
char *zAs = pEList->a[j].zName;
if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
@@ -90674,6 +94877,9 @@ static int lookupName(
cnt = 1;
pMatch = 0;
assert( zTab==0 && zDb==0 );
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenRemap(pParse, 0, (void*)pExpr);
+ }
goto lookupname_end;
}
}
@@ -90698,10 +94904,16 @@ static int lookupName(
** Because no reference was made to outer contexts, the pNC->nRef
** fields are not changed in any context.
*/
- if( cnt==0 && zTab==0 && ExprHasProperty(pExpr,EP_DblQuoted) ){
- pExpr->op = TK_STRING;
- pExpr->pTab = 0;
- return WRC_Prune;
+ if( cnt==0 && zTab==0 ){
+ assert( pExpr->op==TK_ID );
+ if( ExprHasProperty(pExpr,EP_DblQuoted) ){
+ pExpr->op = TK_STRING;
+ pExpr->y.pTab = 0;
+ return WRC_Prune;
+ }
+ if( sqlite3ExprIdToTrueFalse(pExpr) ){
+ return WRC_Prune;
+ }
}
/*
@@ -90744,7 +94956,7 @@ static int lookupName(
pExpr->pLeft = 0;
sqlite3ExprDelete(db, pExpr->pRight);
pExpr->pRight = 0;
- pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN);
+ pExpr->op = eNewExprOp;
ExprSetProperty(pExpr, EP_Leaf);
lookupname_end:
if( cnt==1 ){
@@ -90774,9 +94986,9 @@ SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSr
Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0);
if( p ){
struct SrcList_item *pItem = &pSrc->a[iSrc];
- p->pTab = pItem->pTab;
+ p->y.pTab = pItem->pTab;
p->iTable = pItem->iCursor;
- if( p->pTab->iPKey==iCol ){
+ if( p->y.pTab->iPKey==iCol ){
p->iColumn = -1;
}else{
p->iColumn = (ynVar)iCol;
@@ -90863,9 +95075,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
SrcList *pSrcList = pNC->pSrcList;
struct SrcList_item *pItem;
assert( pSrcList && pSrcList->nSrc==1 );
- pItem = pSrcList->a;
+ pItem = pSrcList->a;
+ assert( HasRowid(pItem->pTab) && pItem->pTab->pSelect==0 );
pExpr->op = TK_COLUMN;
- pExpr->pTab = pItem->pTab;
+ pExpr->y.pTab = pItem->pTab;
pExpr->iTable = pItem->iCursor;
pExpr->iColumn = -1;
pExpr->affinity = SQLITE_AFF_INTEGER;
@@ -90894,17 +95107,22 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
zTable = 0;
zColumn = pExpr->u.zToken;
}else{
+ Expr *pLeft = pExpr->pLeft;
notValid(pParse, pNC, "the \".\" operator", NC_IdxExpr);
pRight = pExpr->pRight;
if( pRight->op==TK_ID ){
zDb = 0;
- zTable = pExpr->pLeft->u.zToken;
- zColumn = pRight->u.zToken;
}else{
assert( pRight->op==TK_DOT );
- zDb = pExpr->pLeft->u.zToken;
- zTable = pRight->pLeft->u.zToken;
- zColumn = pRight->pRight->u.zToken;
+ zDb = pLeft->u.zToken;
+ pLeft = pRight->pLeft;
+ pRight = pRight->pRight;
+ }
+ zTable = pLeft->u.zToken;
+ zColumn = pRight->u.zToken;
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight);
+ sqlite3RenameTokenRemap(pParse, (void*)&pExpr->y.pTab, (void*)pLeft);
}
}
return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr);
@@ -90986,41 +95204,105 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
notValid(pParse, pNC, "non-deterministic functions",
NC_IdxExpr|NC_PartIdx);
}
+ if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0
+ && pParse->nested==0
+ && sqlite3Config.bInternalFunctions==0
+ ){
+ /* Internal-use-only functions are disallowed unless the
+ ** SQL is being compiled using sqlite3NestedParse() */
+ no_such_func = 1;
+ pDef = 0;
+ }
}
- if( is_agg && (pNC->ncFlags & NC_AllowAgg)==0 ){
- sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId);
- pNC->nErr++;
- is_agg = 0;
- }else if( no_such_func && pParse->db->init.busy==0
+
+ if( 0==IN_RENAME_OBJECT ){
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ assert( is_agg==0 || (pDef->funcFlags & SQLITE_FUNC_MINMAX)
+ || (pDef->xValue==0 && pDef->xInverse==0)
+ || (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize)
+ );
+ if( pDef && pDef->xValue==0 && ExprHasProperty(pExpr, EP_WinFunc) ){
+ sqlite3ErrorMsg(pParse,
+ "%.*s() may not be used as a window function", nId, zId
+ );
+ pNC->nErr++;
+ }else if(
+ (is_agg && (pNC->ncFlags & NC_AllowAgg)==0)
+ || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pExpr->y.pWin)
+ || (is_agg && pExpr->y.pWin && (pNC->ncFlags & NC_AllowWin)==0)
+ ){
+ const char *zType;
+ if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pExpr->y.pWin ){
+ zType = "window";
+ }else{
+ zType = "aggregate";
+ }
+ sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()",zType,nId,zId);
+ pNC->nErr++;
+ is_agg = 0;
+ }
+#else
+ if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) ){
+ sqlite3ErrorMsg(pParse,"misuse of aggregate function %.*s()",nId,zId);
+ pNC->nErr++;
+ is_agg = 0;
+ }
+#endif
+ else if( no_such_func && pParse->db->init.busy==0
#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
- && pParse->explain==0
+ && pParse->explain==0
#endif
- ){
- sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId);
- pNC->nErr++;
- }else if( wrong_num_args ){
- sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()",
- nId, zId);
- pNC->nErr++;
- }
- if( is_agg ) pNC->ncFlags &= ~NC_AllowAgg;
+ ){
+ sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId);
+ pNC->nErr++;
+ }else if( wrong_num_args ){
+ sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()",
+ nId, zId);
+ pNC->nErr++;
+ }
+ if( is_agg ){
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ pNC->ncFlags &= ~(pExpr->y.pWin ? NC_AllowWin : NC_AllowAgg);
+#else
+ pNC->ncFlags &= ~NC_AllowAgg;
+#endif
+ }
+ }
sqlite3WalkExprList(pWalker, pList);
if( is_agg ){
- NameContext *pNC2 = pNC;
- pExpr->op = TK_AGG_FUNCTION;
- pExpr->op2 = 0;
- while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){
- pExpr->op2++;
- pNC2 = pNC2->pNext;
- }
- assert( pDef!=0 );
- if( pNC2 ){
- assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg );
- testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 );
- pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( pExpr->y.pWin ){
+ Select *pSel = pNC->pWinSelect;
+ 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;
+ }else
+#endif /* SQLITE_OMIT_WINDOWFUNC */
+ {
+ NameContext *pNC2 = pNC;
+ pExpr->op = TK_AGG_FUNCTION;
+ pExpr->op2 = 0;
+ while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){
+ pExpr->op2++;
+ pNC2 = pNC2->pNext;
+ }
+ assert( pDef!=0 );
+ if( pNC2 ){
+ assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg );
+ testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 );
+ pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX);
+ }
+ pNC->ncFlags |= NC_AllowAgg;
}
- pNC->ncFlags |= NC_AllowAgg;
}
/* FIX ME: Compute pExpr->affinity based on the expected return
** type of the function
@@ -91049,15 +95331,30 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr);
break;
}
+ case TK_IS:
+ case TK_ISNOT: {
+ Expr *pRight;
+ assert( !ExprHasProperty(pExpr, EP_Reduced) );
+ /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE",
+ ** and "x IS NOT FALSE". */
+ if( (pRight = pExpr->pRight)->op==TK_ID ){
+ int rc = resolveExprStep(pWalker, pRight);
+ if( rc==WRC_Abort ) return WRC_Abort;
+ if( pRight->op==TK_TRUEFALSE ){
+ pExpr->op2 = pExpr->op;
+ pExpr->op = TK_TRUTH;
+ return WRC_Continue;
+ }
+ }
+ /* Fall thru */
+ }
case TK_BETWEEN:
case TK_EQ:
case TK_NE:
case TK_LT:
case TK_LE:
case TK_GT:
- case TK_GE:
- case TK_IS:
- case TK_ISNOT: {
+ case TK_GE: {
int nLeft, nRight;
if( pParse->db->mallocFailed ) break;
assert( pExpr->pLeft!=0 );
@@ -91160,8 +95457,8 @@ static int resolveOrderByTermToExprList(
memset(&nc, 0, sizeof(nc));
nc.pParse = pParse;
nc.pSrcList = pSelect->pSrc;
- nc.pEList = pEList;
- nc.ncFlags = NC_AllowAgg;
+ nc.uNC.pEList = pEList;
+ nc.ncFlags = NC_AllowAgg|NC_UEList;
nc.nErr = 0;
db = pParse->db;
savedSuppErr = db->suppressErr;
@@ -91406,6 +95703,19 @@ static int resolveOrderGroupBy(
}
for(j=0; j<pSelect->pEList->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
pItem->u.x.iOrderByCol = j+1;
}
}
@@ -91462,8 +95772,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
*/
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = pParse;
- if( sqlite3ResolveExprNames(&sNC, p->pLimit) ||
- sqlite3ResolveExprNames(&sNC, p->pOffset) ){
+ sNC.pWinSelect = p;
+ if( sqlite3ResolveExprNames(&sNC, p->pLimit) ){
return WRC_Abort;
}
@@ -91511,12 +95821,13 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
/* Set up the local name-context to pass to sqlite3ResolveExprNames() to
** resolve the result-set expression list.
*/
- sNC.ncFlags = NC_AllowAgg;
+ sNC.ncFlags = NC_AllowAgg|NC_AllowWin;
sNC.pSrcList = p->pSrc;
sNC.pNext = pOuterNC;
/* Resolve names in the result set. */
if( sqlite3ResolveExprListNames(&sNC, p->pEList) ) return WRC_Abort;
+ sNC.ncFlags &= ~NC_AllowWin;
/* If there are no aggregate functions in the result-set, and no GROUP BY
** expression, do not allow aggregates in any of the other expressions.
@@ -91545,7 +95856,9 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
** Minor point: If this is the case, then the expression will be
** re-evaluated for each reference to it.
*/
- sNC.pEList = p->pEList;
+ assert( (sNC.ncFlags & (NC_UAggInfo|NC_UUpsert))==0 );
+ sNC.uNC.pEList = p->pEList;
+ sNC.ncFlags |= NC_UEList;
if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort;
if( sqlite3ResolveExprNames(&sNC, p->pWhere) ) return WRC_Abort;
@@ -91563,7 +95876,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
** outer queries
*/
sNC.pNext = 0;
- sNC.ncFlags |= NC_AllowAgg;
+ sNC.ncFlags |= NC_AllowAgg|NC_AllowWin;
/* If this is a converted compound query, move the ORDER BY clause from
** the sub-query back to the parent query. At this point each term
@@ -91594,6 +95907,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
if( db->mallocFailed ){
return WRC_Abort;
}
+ sNC.ncFlags &= ~NC_AllowWin;
/* Resolve the GROUP BY clause. At the same time, make sure
** the GROUP BY clause does not contain aggregate functions.
@@ -91778,7 +96092,7 @@ SQLITE_PRIVATE void sqlite3ResolveSelfReference(
Table *pTab, /* The table being referenced */
int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr */
Expr *pExpr, /* Expression to resolve. May be NULL. */
- ExprList *pList /* Expression list to resolve. May be NUL. */
+ ExprList *pList /* Expression list to resolve. May be NULL. */
){
SrcList sSrc; /* Fake SrcList for pParse->pNewTable */
NameContext sNC; /* Name context for pParse->pNewTable */
@@ -91859,8 +96173,8 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){
return sqlite3AffinityType(pExpr->u.zToken, 0);
}
#endif
- if( (op==TK_AGG_COLUMN || op==TK_COLUMN) && pExpr->pTab ){
- return sqlite3TableColumnAffinity(pExpr->pTab, pExpr->iColumn);
+ if( (op==TK_AGG_COLUMN || op==TK_COLUMN) && pExpr->y.pTab ){
+ return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn);
}
if( op==TK_SELECT_COLUMN ){
assert( pExpr->pLeft->flags&EP_xIsSelect );
@@ -91942,27 +96256,27 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){
while( p ){
int op = p->op;
if( p->flags & EP_Generic ) break;
- if( op==TK_CAST || op==TK_UPLUS ){
- p = p->pLeft;
- continue;
- }
- if( op==TK_COLLATE || (op==TK_REGISTER && p->op2==TK_COLLATE) ){
- pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken);
- break;
- }
if( (op==TK_AGG_COLUMN || op==TK_COLUMN
|| op==TK_REGISTER || op==TK_TRIGGER)
- && p->pTab!=0
+ && p->y.pTab!=0
){
- /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally
+ /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally
** a TK_COLUMN but was previously evaluated and cached in a register */
int j = p->iColumn;
if( j>=0 ){
- const char *zColl = p->pTab->aCol[j].zColl;
+ const char *zColl = p->y.pTab->aCol[j].zColl;
pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
}
break;
}
+ if( op==TK_CAST || op==TK_UPLUS ){
+ p = p->pLeft;
+ continue;
+ }
+ if( op==TK_COLLATE || (op==TK_REGISTER && p->op2==TK_COLLATE) ){
+ pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken);
+ break;
+ }
if( p->flags & EP_Collate ){
if( p->pLeft && (p->pLeft->flags & EP_Collate)!=0 ){
p = p->pLeft;
@@ -92382,7 +96696,6 @@ static void codeVectorCompare(
Expr *pL, *pR;
int r1, r2;
assert( i>=0 && i<nLeft );
- if( i>0 ) sqlite3ExprCachePush(pParse);
r1 = exprVectorRegister(pParse, pLeft, i, regLeft, &pL, &regFree1);
r2 = exprVectorRegister(pParse, pRight, i, regRight, &pR, &regFree2);
codeCompare(pParse, pL, pR, opx, r1, r2, dest, p5);
@@ -92394,7 +96707,6 @@ static void codeVectorCompare(
testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne);
sqlite3ReleaseTempReg(pParse, regFree1);
sqlite3ReleaseTempReg(pParse, regFree2);
- if( i>0 ) sqlite3ExprCachePop(pParse);
if( i==nLeft-1 ){
break;
}
@@ -92459,16 +96771,15 @@ static void heightOfExprList(ExprList *p, int *pnHeight){
}
}
}
-static void heightOfSelect(Select *p, int *pnHeight){
- if( p ){
+static void heightOfSelect(Select *pSelect, int *pnHeight){
+ Select *p;
+ for(p=pSelect; p; p=p->pPrior){
heightOfExpr(p->pWhere, pnHeight);
heightOfExpr(p->pHaving, pnHeight);
heightOfExpr(p->pLimit, pnHeight);
- heightOfExpr(p->pOffset, pnHeight);
heightOfExprList(p->pEList, pnHeight);
heightOfExprList(p->pGroupBy, pnHeight);
heightOfExprList(p->pOrderBy, pnHeight);
- heightOfSelect(p->pPrior, pnHeight);
}
}
@@ -92743,7 +97054,12 @@ SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3 *db, Expr *pLeft, Expr *pRight){
** Construct a new expression node for a function with multiple
** arguments.
*/
-SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){
+SQLITE_PRIVATE Expr *sqlite3ExprFunction(
+ Parse *pParse, /* Parsing context */
+ ExprList *pList, /* Argument list */
+ Token *pToken, /* Name of the function */
+ int eDistinct /* SF_Distinct or SF_ALL or 0 */
+){
Expr *pNew;
sqlite3 *db = pParse->db;
assert( pToken );
@@ -92752,9 +97068,14 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *
sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */
return 0;
}
+ if( pList && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
+ sqlite3ErrorMsg(pParse, "too many arguments on function %T", pToken);
+ }
pNew->x.pList = pList;
+ ExprSetProperty(pNew, EP_HasFunc);
assert( !ExprHasProperty(pNew, EP_xIsSelect) );
sqlite3ExprSetHeightAndFlags(pParse, pNew);
+ if( eDistinct==SF_Distinct ) ExprSetProperty(pNew, EP_Distinct);
return pNew;
}
@@ -92846,6 +97167,10 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){
assert( p!=0 );
/* Sanity check: Assert that the IntValue is non-negative if it exists */
assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 );
+
+ assert( !ExprHasProperty(p, EP_WinFunc) || p->y.pWin!=0 || db->mallocFailed );
+ assert( p->op!=TK_FUNCTION || ExprHasProperty(p, EP_TokenOnly|EP_Reduced)
+ || p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc) );
#ifdef SQLITE_DEBUG
if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){
assert( p->pLeft==0 );
@@ -92864,6 +97189,10 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){
}else{
sqlite3ExprListDelete(db, p->x.pList);
}
+ if( ExprHasProperty(p, EP_WinFunc) ){
+ assert( p->op==TK_FUNCTION );
+ sqlite3WindowDelete(db, p->y.pWin);
+ }
}
if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken);
if( !ExprHasProperty(p, EP_Static) ){
@@ -92912,7 +97241,7 @@ static int exprStructSize(Expr *p){
** Note that with flags==EXPRDUP_REDUCE, this routines works on full-size
** (unreduced) Expr objects as they or originally constructed by the parser.
** During expression analysis, extra information is computed and moved into
-** later parts of teh Expr object and that extra information might get chopped
+** later parts of the Expr object and that extra information might get chopped
** off if the expression is reduced. Note also that it does not work to
** make an EXPRDUP_REDUCE copy of a reduced expression. It is only legal
** to reduce a pristine expression tree from the parser. The implementation
@@ -92924,7 +97253,11 @@ static int dupedExprStructSize(Expr *p, int flags){
assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */
assert( EXPR_FULLSIZE<=0xfff );
assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 );
- if( 0==flags || p->op==TK_SELECT_COLUMN ){
+ if( 0==flags || p->op==TK_SELECT_COLUMN
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ || ExprHasProperty(p, EP_WinFunc)
+#endif
+ ){
nSize = EXPR_FULLSIZE;
}else{
assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) );
@@ -92949,7 +97282,7 @@ static int dupedExprStructSize(Expr *p, int flags){
static int dupedExprNodeSize(Expr *p, int flags){
int nByte = dupedExprStructSize(p, flags) & 0xfff;
if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
- nByte += sqlite3Strlen30(p->u.zToken)+1;
+ nByte += sqlite3Strlen30NN(p->u.zToken)+1;
}
return ROUND8(nByte);
}
@@ -93052,7 +97385,7 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
}
/* Fill in pNew->pLeft and pNew->pRight. */
- if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly) ){
+ if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly|EP_WinFunc) ){
zAlloc += dupedExprNodeSize(p, dupFlags);
if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){
pNew->pLeft = p->pLeft ?
@@ -93060,6 +97393,12 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
pNew->pRight = p->pRight ?
exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc) : 0;
}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( ExprHasProperty(p, EP_WinFunc) ){
+ pNew->y.pWin = sqlite3WindowDup(db, pNew, p->y.pWin);
+ assert( ExprHasProperty(pNew, EP_WinFunc) );
+ }
+#endif /* SQLITE_OMIT_WINDOWFUNC */
if( pzBuffer ){
*pzBuffer = zAlloc;
}
@@ -93164,6 +97503,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags)
pItem->sortOrder = pOldItem->sortOrder;
pItem->done = 0;
pItem->bSpanIsTab = pOldItem->bSpanIsTab;
+ pItem->bSorterRef = pOldItem->bSorterRef;
pItem->u = pOldItem->u;
}
return pNew;
@@ -93262,7 +97602,6 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){
pNew->pNext = pNext;
pNew->pPrior = 0;
pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags);
- pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags);
pNew->iLimit = 0;
pNew->iOffset = 0;
pNew->selFlags = p->selFlags & ~SF_UsesEphemeral;
@@ -93270,7 +97609,11 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){
pNew->addrOpenEphm[1] = -1;
pNew->nSelectRow = p->nSelectRow;
pNew->pWith = withDup(db, p->pWith);
- sqlite3SelectSetName(pNew, p->zSelName);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ pNew->pWin = 0;
+ pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn);
+#endif
+ pNew->selId = p->selId;
*pp = pNew;
pp = &pNew->pPrior;
pNext = pNew;
@@ -93442,6 +97785,9 @@ SQLITE_PRIVATE void sqlite3ExprListSetName(
assert( pItem->zName==0 );
pItem->zName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n);
if( dequote ) sqlite3Dequote(pItem->zName);
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenMap(pParse, (void*)pItem->zName, pName);
+ }
}
}
@@ -93456,17 +97802,16 @@ SQLITE_PRIVATE void sqlite3ExprListSetName(
SQLITE_PRIVATE void sqlite3ExprListSetSpan(
Parse *pParse, /* Parsing context */
ExprList *pList, /* List to which to add the span. */
- ExprSpan *pSpan /* The span to be added */
+ const char *zStart, /* Start of the span */
+ const char *zEnd /* End of the span */
){
sqlite3 *db = pParse->db;
assert( pList!=0 || db->mallocFailed!=0 );
if( pList ){
struct ExprList_item *pItem = &pList->a[pList->nExpr-1];
assert( pList->nExpr>0 );
- assert( db->mallocFailed || pItem->pExpr==pSpan->pExpr );
sqlite3DbFree(db, pItem->zSpan);
- pItem->zSpan = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
- (int)(pSpan->zEnd - pSpan->zStart));
+ pItem->zSpan = sqlite3DbSpanDup(db, zStart, zEnd);
}
}
@@ -93536,6 +97881,34 @@ SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){
}
/*
+** If the input expression is an ID with the name "true" or "false"
+** then convert it into an TK_TRUEFALSE term. Return non-zero if
+** the conversion happened, and zero if the expression is unaltered.
+*/
+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
+ ){
+ pExpr->op = TK_TRUEFALSE;
+ return 1;
+ }
+ return 0;
+}
+
+/*
+** The argument must be a TK_TRUEFALSE Expr node. Return 1 if it is TRUE
+** and 0 if it is FALSE.
+*/
+SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr *pExpr){
+ assert( pExpr->op==TK_TRUEFALSE );
+ assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0
+ || sqlite3StrICmp(pExpr->u.zToken,"false")==0 );
+ return pExpr->u.zToken[4]==0;
+}
+
+
+/*
** These routines are Walker callbacks used to check expressions to
** see if they are "constant" for some definition of constant. The
** Walker.eCode value determines the type of "constant" we are looking
@@ -93582,6 +97955,12 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
return WRC_Abort;
}
case TK_ID:
+ /* Convert "true" or "false" in a DEFAULT clause into the
+ ** appropriate TK_TRUEFALSE operator */
+ if( sqlite3ExprIdToTrueFalse(pExpr) ){
+ return WRC_Prune;
+ }
+ /* Fall thru */
case TK_COLUMN:
case TK_AGG_FUNCTION:
case TK_AGG_COLUMN:
@@ -93589,11 +97968,16 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
testcase( pExpr->op==TK_COLUMN );
testcase( pExpr->op==TK_AGG_FUNCTION );
testcase( pExpr->op==TK_AGG_COLUMN );
+ if( ExprHasProperty(pExpr, EP_FixedCol) && pWalker->eCode!=2 ){
+ return WRC_Continue;
+ }
if( pWalker->eCode==3 && pExpr->iTable==pWalker->u.iCur ){
return WRC_Continue;
}
/* Fall through */
case TK_IF_NULL_ROW:
+ case TK_REGISTER:
+ testcase( pExpr->op==TK_REGISTER );
testcase( pExpr->op==TK_IF_NULL_ROW );
pWalker->eCode = 0;
return WRC_Abort;
@@ -93611,8 +97995,8 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
}
/* Fall through */
default:
- testcase( pExpr->op==TK_SELECT ); /* sqlite3SelectWalkFail will disallow */
- testcase( pExpr->op==TK_EXISTS ); /* sqlite3SelectWalkFail will disallow */
+ testcase( pExpr->op==TK_SELECT ); /* sqlite3SelectWalkFail() disallows */
+ testcase( pExpr->op==TK_EXISTS ); /* sqlite3SelectWalkFail() disallows */
return WRC_Continue;
}
}
@@ -93642,10 +98026,17 @@ SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){
}
/*
-** Walk an expression tree. Return non-zero if the expression is constant
-** that does no originate from the ON or USING clauses of a join.
-** Return 0 if it involves variables or function calls or terms from
-** an ON or USING clause.
+** Walk an expression tree. Return non-zero if
+**
+** (1) the expression is constant, and
+** (2) the expression does originate in the ON or USING clause
+** of a LEFT JOIN, and
+** (3) the expression does not contain any EP_FixedCol TK_COLUMN
+** operands created by the constant propagation optimization.
+**
+** When this routine returns true, it indicates that the expression
+** can be added to the pParse->pConstExpr list and evaluated once when
+** the prepared statement starts up. See sqlite3ExprCodeAtInit().
*/
SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){
return exprIsConst(p, 2, 0);
@@ -93675,7 +98066,7 @@ static int exprNodeIsConstantOrGroupBy(Walker *pWalker, Expr *pExpr){
Expr *p = pGroupBy->a[i].pExpr;
if( sqlite3ExprCompare(0, pExpr, p, -1)<2 ){
CollSeq *pColl = sqlite3ExprNNCollSeq(pWalker->pParse, p);
- if( sqlite3_stricmp("BINARY", pColl->zName)==0 ){
+ if( sqlite3IsBinary(pColl) ){
return WRC_Prune;
}
}
@@ -93817,8 +98208,8 @@ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){
return 0;
case TK_COLUMN:
return ExprHasProperty(p, EP_CanBeNull) ||
- p->pTab==0 || /* Reference to column of index on expression */
- (p->iColumn>=0 && p->pTab->aCol[p->iColumn].notNull==0);
+ p->y.pTab==0 || /* Reference to column of index on expression */
+ (p->iColumn>=0 && p->y.pTab->aCol[p->iColumn].notNull==0);
default:
return 1;
}
@@ -93873,6 +98264,14 @@ 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
@@ -93899,7 +98298,6 @@ static Select *isCandidateForInOpt(Expr *pX){
}
assert( p->pGroupBy==0 ); /* Has no GROUP BY clause */
if( p->pLimit ) return 0; /* Has no LIMIT clause */
- assert( p->pOffset==0 ); /* No LIMIT means no OFFSET */
if( p->pWhere ) return 0; /* Has no WHERE clause */
pSrc = p->pSrc;
assert( pSrc!=0 );
@@ -93989,16 +98387,15 @@ static int sqlite3InRhsIsConstant(Expr *pIn){
** pX->iTable made to point to the ephemeral table instead of an
** existing table.
**
-** The inFlags parameter must contain exactly one of the bits
-** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP. If inFlags contains
-** IN_INDEX_MEMBERSHIP, then the generated table will be used for a
-** fast membership test. When the IN_INDEX_LOOP bit is set, the
-** IN index will be used to loop over all values of the RHS of the
-** IN operator.
+** The inFlags parameter must contain, at a minimum, one of the bits
+** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains
+** IN_INDEX_MEMBERSHIP, then the generated table will be used for a fast
+** membership test. When the IN_INDEX_LOOP bit is set, the IN index will
+** be used to loop over all values of the RHS of the IN operator.
**
** When IN_INDEX_LOOP is used (and the b-tree will be used to iterate
** through the set members) then the b-tree must not contain duplicates.
-** An epheremal table must be used unless the selected columns are guaranteed
+** An epheremal table will be created unless the selected columns are guaranteed
** to be unique - either because it is an INTEGER PRIMARY KEY or due to
** a UNIQUE constraint or index.
**
@@ -94099,7 +98496,8 @@ SQLITE_PRIVATE int sqlite3FindInIndex(
sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
eType = IN_INDEX_ROWID;
-
+ ExplainQueryPlan((pParse, 0,
+ "USING ROWID SEARCH ON TABLE %s FOR IN-OPERATOR",pTab->zName));
sqlite3VdbeJumpHere(v, iAddr);
}else{
Index *pIdx; /* Iterator variable */
@@ -94178,11 +98576,8 @@ SQLITE_PRIVATE int sqlite3FindInIndex(
if( colUsed==(MASKBIT(nExpr)-1) ){
/* If we reach this point, that means the index pIdx is usable */
int iAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
-#ifndef SQLITE_OMIT_EXPLAIN
- sqlite3VdbeAddOp4(v, OP_Explain, 0, 0, 0,
- sqlite3MPrintf(db, "USING INDEX %s FOR IN-OPERATOR",pIdx->zName),
- P4_DYNAMIC);
-#endif
+ ExplainQueryPlan((pParse, 0,
+ "USING INDEX %s FOR IN-OPERATOR",pIdx->zName));
sqlite3VdbeAddOp3(v, OP_OpenRead, iTab, pIdx->tnum, iDb);
sqlite3VdbeSetP4KeyInfo(pParse, pIdx);
VdbeComment((v, "%s", pIdx->zName));
@@ -94361,7 +98756,6 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
int rReg = 0; /* Register storing resulting */
Vdbe *v = sqlite3GetVdbe(pParse);
if( NEVER(v==0) ) return 0;
- sqlite3ExprCachePush(pParse);
/* The evaluation of the IN/EXISTS/SELECT must be repeated every time it
** is encountered if any of the following is true:
@@ -94377,17 +98771,6 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
jmpIfDynamic = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
}
-#ifndef SQLITE_OMIT_EXPLAIN
- if( pParse->explain==2 ){
- char *zMsg = sqlite3MPrintf(pParse->db, "EXECUTE %s%s SUBQUERY %d",
- jmpIfDynamic>=0?"":"CORRELATED ",
- pExpr->op==TK_IN?"LIST":"SCALAR",
- pParse->iNextSelectId
- );
- sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
- }
-#endif
-
switch( pExpr->op ){
case TK_IN: {
int addr; /* Address of OP_OpenEphemeral instruction */
@@ -94425,6 +98808,9 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
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. */
@@ -94466,7 +98852,6 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
ExprList *pList = pExpr->x.pList;
struct ExprList_item *pItem;
int r1, r2, r3;
-
affinity = sqlite3ExprAffinity(pLeft);
if( !affinity ){
affinity = SQLITE_AFF_BLOB;
@@ -94506,7 +98891,6 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3);
}else{
sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1);
- sqlite3ExprCacheAffinityChange(pParse, r3, 1);
sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pExpr->iTable, r2, r3, 1);
}
}
@@ -94539,6 +98923,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
Select *pSel; /* SELECT statement to encode */
SelectDest dest; /* How to deal with SELECT result */
int nReg; /* Registers to allocate */
+ Expr *pLimit; /* New limit expression */
testcase( pExpr->op==TK_EXISTS );
testcase( pExpr->op==TK_SELECT );
@@ -94546,6 +98931,8 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
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;
@@ -94560,11 +98947,14 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm);
VdbeComment((v, "Init EXISTS result"));
}
- sqlite3ExprDelete(pParse->db, pSel->pLimit);
- pSel->pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,
- &sqlite3IntTokens[1], 0);
+ 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;
- pSel->selFlags &= ~SF_MultiValue;
if( sqlite3Select(pParse, pSel, &dest) ){
return 0;
}
@@ -94581,7 +98971,6 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
if( jmpIfDynamic>=0 ){
sqlite3VdbeJumpHere(v, jmpIfDynamic);
}
- sqlite3ExprCachePop(pParse);
return rReg;
}
@@ -94700,7 +99089,6 @@ static void sqlite3ExprCodeIN(
** aiMap[] array contains a mapping from the original LHS field order to
** the field order that matches the RHS index.
*/
- sqlite3ExprCachePush(pParse);
rLhsOrig = exprCodeVector(pParse, pLeft, &iDummy);
for(i=0; i<nVector && aiMap[i]==i; i++){} /* Are LHS fields reordered? */
if( i==nVector ){
@@ -94859,7 +99247,6 @@ static void sqlite3ExprCodeIN(
sqlite3ExprCodeIN_finished:
if( rLhs!=rLhsOrig ) sqlite3ReleaseTempReg(pParse, rLhs);
- sqlite3ExprCachePop(pParse);
VdbeComment((v, "end IN expr"));
sqlite3ExprCodeIN_oom_error:
sqlite3DbFree(pParse->db, aiMap);
@@ -94927,145 +99314,6 @@ static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){
}
}
-/*
-** Erase column-cache entry number i
-*/
-static void cacheEntryClear(Parse *pParse, int i){
- if( pParse->aColCache[i].tempReg ){
- if( pParse->nTempReg<ArraySize(pParse->aTempReg) ){
- pParse->aTempReg[pParse->nTempReg++] = pParse->aColCache[i].iReg;
- }
- }
- pParse->nColCache--;
- if( i<pParse->nColCache ){
- pParse->aColCache[i] = pParse->aColCache[pParse->nColCache];
- }
-}
-
-
-/*
-** Record in the column cache that a particular column from a
-** particular table is stored in a particular register.
-*/
-SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int iReg){
- int i;
- int minLru;
- int idxLru;
- struct yColCache *p;
-
- /* Unless an error has occurred, register numbers are always positive. */
- assert( iReg>0 || pParse->nErr || pParse->db->mallocFailed );
- assert( iCol>=-1 && iCol<32768 ); /* Finite column numbers */
-
- /* The SQLITE_ColumnCache flag disables the column cache. This is used
- ** for testing only - to verify that SQLite always gets the same answer
- ** with and without the column cache.
- */
- if( OptimizationDisabled(pParse->db, SQLITE_ColumnCache) ) return;
-
- /* First replace any existing entry.
- **
- ** Actually, the way the column cache is currently used, we are guaranteed
- ** that the object will never already be in cache. Verify this guarantee.
- */
-#ifndef NDEBUG
- for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){
- assert( p->iTable!=iTab || p->iColumn!=iCol );
- }
-#endif
-
- /* If the cache is already full, delete the least recently used entry */
- if( pParse->nColCache>=SQLITE_N_COLCACHE ){
- minLru = 0x7fffffff;
- idxLru = -1;
- for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
- if( p->lru<minLru ){
- idxLru = i;
- minLru = p->lru;
- }
- }
- p = &pParse->aColCache[idxLru];
- }else{
- p = &pParse->aColCache[pParse->nColCache++];
- }
-
- /* Add the new entry to the end of the cache */
- p->iLevel = pParse->iCacheLevel;
- p->iTable = iTab;
- p->iColumn = iCol;
- p->iReg = iReg;
- p->tempReg = 0;
- p->lru = pParse->iCacheCnt++;
-}
-
-/*
-** Indicate that registers between iReg..iReg+nReg-1 are being overwritten.
-** Purge the range of registers from the column cache.
-*/
-SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse *pParse, int iReg, int nReg){
- int i = 0;
- while( i<pParse->nColCache ){
- struct yColCache *p = &pParse->aColCache[i];
- if( p->iReg >= iReg && p->iReg < iReg+nReg ){
- cacheEntryClear(pParse, i);
- }else{
- i++;
- }
- }
-}
-
-/*
-** Remember the current column cache context. Any new entries added
-** added to the column cache after this call are removed when the
-** corresponding pop occurs.
-*/
-SQLITE_PRIVATE void sqlite3ExprCachePush(Parse *pParse){
- pParse->iCacheLevel++;
-#ifdef SQLITE_DEBUG
- if( pParse->db->flags & SQLITE_VdbeAddopTrace ){
- printf("PUSH to %d\n", pParse->iCacheLevel);
- }
-#endif
-}
-
-/*
-** Remove from the column cache any entries that were added since the
-** the previous sqlite3ExprCachePush operation. In other words, restore
-** the cache to the state it was in prior the most recent Push.
-*/
-SQLITE_PRIVATE void sqlite3ExprCachePop(Parse *pParse){
- int i = 0;
- assert( pParse->iCacheLevel>=1 );
- pParse->iCacheLevel--;
-#ifdef SQLITE_DEBUG
- if( pParse->db->flags & SQLITE_VdbeAddopTrace ){
- printf("POP to %d\n", pParse->iCacheLevel);
- }
-#endif
- while( i<pParse->nColCache ){
- if( pParse->aColCache[i].iLevel>pParse->iCacheLevel ){
- cacheEntryClear(pParse, i);
- }else{
- i++;
- }
- }
-}
-
-/*
-** When a cached column is reused, make sure that its register is
-** no longer available as a temp register. ticket #3879: that same
-** register might be in the cache in multiple places, so be sure to
-** get them all.
-*/
-static void sqlite3ExprCachePinRegister(Parse *pParse, int iReg){
- int i;
- struct yColCache *p;
- for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){
- if( p->iReg==iReg ){
- p->tempReg = 0;
- }
- }
-}
/* Generate code that will load into register regOut a value that is
** appropriate for the iIdxCol-th column of index pIdx.
@@ -95121,12 +99369,7 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(
/*
** Generate code that will extract the iColumn-th column from
-** table pTab and store the column value in a register.
-**
-** An effort is made to store the column value in register iReg. This
-** is not garanteeed for GetColumn() - the result can be stored in
-** any register. But the result is guaranteed to land in register iReg
-** for GetColumnToReg().
+** table pTab and store the column value in register iReg.
**
** There must be an open cursor to pTab in iTable when this routine
** is called. If iColumn<0 then code is generated that extracts the rowid.
@@ -95140,96 +99383,23 @@ SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(
u8 p5 /* P5 value for OP_Column + FLAGS */
){
Vdbe *v = pParse->pVdbe;
- int i;
- struct yColCache *p;
-
- for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){
- if( p->iTable==iTable && p->iColumn==iColumn ){
- p->lru = pParse->iCacheCnt++;
- sqlite3ExprCachePinRegister(pParse, p->iReg);
- return p->iReg;
- }
- }
assert( v!=0 );
sqlite3ExprCodeGetColumnOfTable(v, pTab, iTable, iColumn, iReg);
if( p5 ){
sqlite3VdbeChangeP5(v, p5);
- }else{
- sqlite3ExprCacheStore(pParse, iTable, iColumn, iReg);
}
return iReg;
}
-SQLITE_PRIVATE void sqlite3ExprCodeGetColumnToReg(
- Parse *pParse, /* Parsing and code generating context */
- Table *pTab, /* Description of the table we are reading from */
- int iColumn, /* Index of the table column */
- int iTable, /* The cursor pointing to the table */
- int iReg /* Store results here */
-){
- int r1 = sqlite3ExprCodeGetColumn(pParse, pTab, iColumn, iTable, iReg, 0);
- if( r1!=iReg ) sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, r1, iReg);
-}
-
-
-/*
-** Clear all column cache entries.
-*/
-SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse *pParse){
- int i;
-
-#ifdef SQLITE_DEBUG
- if( pParse->db->flags & SQLITE_VdbeAddopTrace ){
- printf("CLEAR\n");
- }
-#endif
- for(i=0; i<pParse->nColCache; i++){
- if( pParse->aColCache[i].tempReg
- && pParse->nTempReg<ArraySize(pParse->aTempReg)
- ){
- pParse->aTempReg[pParse->nTempReg++] = pParse->aColCache[i].iReg;
- }
- }
- pParse->nColCache = 0;
-}
-
-/*
-** Record the fact that an affinity change has occurred on iCount
-** registers starting with iStart.
-*/
-SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse *pParse, int iStart, int iCount){
- sqlite3ExprCacheRemove(pParse, iStart, iCount);
-}
/*
** Generate code to move content from registers iFrom...iFrom+nReg-1
-** over to iTo..iTo+nReg-1. Keep the column cache up-to-date.
+** over to iTo..iTo+nReg-1.
*/
SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){
assert( iFrom>=iTo+nReg || iFrom+nReg<=iTo );
sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg);
- sqlite3ExprCacheRemove(pParse, iFrom, nReg);
}
-#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST)
-/*
-** Return true if any register in the range iFrom..iTo (inclusive)
-** is used as part of the column cache.
-**
-** This routine is used within assert() and testcase() macros only
-** and does not appear in a normal build.
-*/
-static int usedAsColumnCache(Parse *pParse, int iFrom, int iTo){
- int i;
- struct yColCache *p;
- for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){
- int r = p->iReg;
- if( r>=iFrom && r<=iTo ) return 1; /*NO_TEST*/
- }
- return 0;
-}
-#endif /* SQLITE_DEBUG || SQLITE_COVERAGE_TEST */
-
-
/*
** Convert a scalar expression node to a TK_REGISTER referencing
** register iReg. The caller must ensure that iReg already contains
@@ -95305,6 +99475,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
return 0;
}
+expr_code_doover:
if( pExpr==0 ){
op = TK_NULL;
}else{
@@ -95326,6 +99497,28 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
}
case TK_COLUMN: {
int iTab = pExpr->iTable;
+ if( ExprHasProperty(pExpr, EP_FixedCol) ){
+ /* This COLUMN expression is really a constant due to WHERE clause
+ ** constraints, and that constant is coded by the pExpr->pLeft
+ ** expresssion. However, make sure the constant has the correct
+ ** datatype by applying the Affinity of the table column to the
+ ** constant.
+ */
+ int iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target);
+ int aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn);
+ if( aff!=SQLITE_AFF_BLOB ){
+ static const char zAff[] = "B\000C\000D\000E";
+ assert( SQLITE_AFF_BLOB=='A' );
+ assert( SQLITE_AFF_TEXT=='B' );
+ if( iReg!=target ){
+ sqlite3VdbeAddOp2(v, OP_SCopy, iReg, target);
+ iReg = target;
+ }
+ sqlite3VdbeAddOp4(v, OP_Affinity, iReg, 1, 0,
+ &zAff[(aff-'B')*2], P4_STATIC);
+ }
+ return iReg;
+ }
if( iTab<0 ){
if( pParse->iSelfTab<0 ){
/* Generating CHECK constraints or inserting into partial index */
@@ -95336,7 +99529,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
iTab = pParse->iSelfTab - 1;
}
}
- return sqlite3ExprCodeGetColumn(pParse, pExpr->pTab,
+ return sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab,
pExpr->iColumn, iTab, target,
pExpr->op2);
}
@@ -95344,6 +99537,10 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
codeInteger(pParse, pExpr, 0, target);
return target;
}
+ case TK_TRUEFALSE: {
+ sqlite3VdbeAddOp2(v, OP_Integer, sqlite3ExprTruthValue(pExpr), target);
+ return target;
+ }
#ifndef SQLITE_OMIT_FLOATING_POINT
case TK_FLOAT: {
assert( !ExprHasProperty(pExpr, EP_IntValue) );
@@ -95402,8 +99599,6 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
}
sqlite3VdbeAddOp2(v, OP_Cast, target,
sqlite3AffinityType(pExpr->u.zToken, 0));
- testcase( usedAsColumnCache(pParse, inReg, inReg) );
- sqlite3ExprCacheAffinityChange(pParse, inReg, 1);
return inReg;
}
#endif /* SQLITE_OMIT_CAST */
@@ -95499,6 +99694,18 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
sqlite3VdbeAddOp2(v, op, r1, inReg);
break;
}
+ case TK_TRUTH: {
+ int isTrue; /* IS TRUE or IS NOT TRUE */
+ int bNormal; /* IS TRUE or IS FALSE */
+ r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
+ testcase( regFree1==0 );
+ isTrue = sqlite3ExprTruthValue(pExpr->pRight);
+ bNormal = pExpr->op2==TK_IS;
+ testcase( isTrue && bNormal);
+ testcase( !isTrue && bNormal);
+ sqlite3VdbeAddOp4Int(v, OP_IsTrue, r1, inReg, !isTrue, isTrue ^ bNormal);
+ break;
+ }
case TK_ISNULL:
case TK_NOTNULL: {
int addr;
@@ -95535,6 +99742,12 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
u8 enc = ENC(db); /* The text encoding used by this database */
CollSeq *pColl = 0; /* A collating sequence */
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( ExprHasProperty(pExpr, EP_WinFunc) ){
+ return pExpr->y.pWin->regResult;
+ }
+#endif
+
if( ConstFactorOk(pParse) && sqlite3ExprIsConstantNotJoin(pExpr) ){
/* SQL functions can be expensive. So try to move constant functions
** out of the inner loop, even if that means an extra OP_Copy. */
@@ -95571,10 +99784,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
for(i=1; i<nFarg; i++){
sqlite3VdbeAddOp2(v, OP_NotNull, target, endCoalesce);
VdbeCoverage(v);
- sqlite3ExprCacheRemove(pParse, target, 1);
- sqlite3ExprCachePush(pParse);
sqlite3ExprCode(pParse, pFarg->a[i].pExpr, target);
- sqlite3ExprCachePop(pParse);
}
sqlite3VdbeResolveLabel(v, endCoalesce);
break;
@@ -95640,10 +99850,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
}
}
- sqlite3ExprCachePush(pParse); /* Ticket 2ea2425d34be */
sqlite3ExprCodeExprList(pParse, pFarg, r1, 0,
SQLITE_ECEL_DUP|SQLITE_ECEL_FACTOR);
- sqlite3ExprCachePop(pParse); /* Ticket 2ea2425d34be */
}else{
r1 = 0;
}
@@ -95660,7 +99868,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
** "glob(B,A). We want to use the A in "A glob B" to test
** for function overloading. But we use the B term in "glob(B,A)".
*/
- if( nFarg>=2 && (pExpr->flags & EP_InfixFunc) ){
+ if( nFarg>=2 && ExprHasProperty(pExpr, EP_InfixFunc) ){
pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr);
}else if( nFarg>0 ){
pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr);
@@ -95670,9 +99878,21 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
if( !pColl ) pColl = db->pDfltColl;
sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ);
}
- sqlite3VdbeAddOp4(v, pParse->iSelfTab ? OP_PureFunc0 : OP_Function0,
- constMask, r1, target, (char*)pDef, P4_FUNCDEF);
- sqlite3VdbeChangeP5(v, (u8)nFarg);
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ if( pDef->funcFlags & SQLITE_FUNC_OFFSET ){
+ Expr *pArg = pFarg->a[0].pExpr;
+ if( pArg->op==TK_COLUMN ){
+ sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target);
+ }else{
+ sqlite3VdbeAddOp2(v, OP_Null, 0, target);
+ }
+ }else
+#endif
+ {
+ sqlite3VdbeAddOp4(v, pParse->iSelfTab ? OP_PureFunc0 : OP_Function0,
+ constMask, r1, target, (char*)pDef, P4_FUNCDEF);
+ sqlite3VdbeChangeP5(v, (u8)nFarg);
+ }
if( nFarg && constMask==0 ){
sqlite3ReleaseTempRange(pParse, r1, nFarg);
}
@@ -95737,7 +99957,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
case TK_SPAN:
case TK_COLLATE:
case TK_UPLUS: {
- return sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
+ pExpr = pExpr->pLeft;
+ goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. OSSFuzz. */
}
case TK_TRIGGER: {
@@ -95766,7 +99987,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
** p1==1 -> old.a p1==4 -> new.a
** p1==2 -> old.b p1==5 -> new.b
*/
- Table *pTab = pExpr->pTab;
+ Table *pTab = pExpr->y.pTab;
int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn;
assert( pExpr->iTable==0 || pExpr->iTable==1 );
@@ -95775,10 +99996,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
assert( p1>=0 && p1<(pTab->nCol*2+2) );
sqlite3VdbeAddOp2(v, OP_Param, p1, target);
- VdbeComment((v, "%s.%s -> $%d",
+ VdbeComment((v, "r[%d]=%s.%s", target,
(pExpr->iTable ? "new" : "old"),
- (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName),
- target
+ (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[pExpr->iColumn].zName)
));
#ifndef SQLITE_OMIT_FLOATING_POINT
@@ -95804,9 +100024,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
case TK_IF_NULL_ROW: {
int addrINR;
addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable);
- sqlite3ExprCachePush(pParse);
inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
- sqlite3ExprCachePop(pParse);
sqlite3VdbeJumpHere(v, addrINR);
sqlite3VdbeChangeP3(v, addrINR, inReg);
break;
@@ -95843,7 +100061,6 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
Expr opCompare; /* The X==Ei expression */
Expr *pX; /* The X expression */
Expr *pTest = 0; /* X==Ei (form A) or just Ei (form B) */
- VVA_ONLY( int iCacheLevel = pParse->iCacheLevel; )
assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList );
assert(pExpr->x.pList->nExpr > 0);
@@ -95867,7 +100084,6 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
regFree1 = 0;
}
for(i=0; i<nExpr-1; i=i+2){
- sqlite3ExprCachePush(pParse);
if( pX ){
assert( pTest!=0 );
opCompare.pRight = aListelem[i].pExpr;
@@ -95880,18 +100096,13 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
testcase( aListelem[i+1].pExpr->op==TK_COLUMN );
sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target);
sqlite3VdbeGoto(v, endLabel);
- sqlite3ExprCachePop(pParse);
sqlite3VdbeResolveLabel(v, nextCase);
}
if( (nExpr&1)!=0 ){
- sqlite3ExprCachePush(pParse);
sqlite3ExprCode(pParse, pEList->a[nExpr-1].pExpr, target);
- sqlite3ExprCachePop(pParse);
}else{
sqlite3VdbeAddOp2(v, OP_Null, 0, target);
}
- assert( pParse->db->mallocFailed || pParse->nErr>0
- || pParse->iCacheLevel==iCacheLevel );
sqlite3VdbeResolveLabel(v, endLabel);
break;
}
@@ -96041,7 +100252,7 @@ SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse *pParse, Expr *pExpr, int target){
** might choose to code the expression at initialization time.
*/
SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){
- if( pParse->okConstFactor && sqlite3ExprIsConstant(pExpr) ){
+ if( pParse->okConstFactor && sqlite3ExprIsConstantNotJoin(pExpr) ){
sqlite3ExprCodeAtInit(pParse, pExpr, target);
}else{
sqlite3ExprCode(pParse, pExpr, target);
@@ -96110,6 +100321,12 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList(
if( !ConstFactorOk(pParse) ) flags &= ~SQLITE_ECEL_FACTOR;
for(pItem=pList->a, i=0; i<n; i++, pItem++){
Expr *pExpr = pItem->pExpr;
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( pItem->bSorterRef ){
+ i--;
+ n--;
+ }else
+#endif
if( (flags & SQLITE_ECEL_REF)!=0 && (j = pItem->u.x.iOrderByCol)>0 ){
if( flags & SQLITE_ECEL_OMITREF ){
i--;
@@ -96117,7 +100334,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList(
}else{
sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i);
}
- }else if( (flags & SQLITE_ECEL_FACTOR)!=0 && sqlite3ExprIsConstant(pExpr) ){
+ }else if( (flags & SQLITE_ECEL_FACTOR)!=0
+ && sqlite3ExprIsConstantNotJoin(pExpr)
+ ){
sqlite3ExprCodeAtInit(pParse, pExpr, target+i);
}else{
int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i);
@@ -96243,18 +100462,14 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int
int d2 = sqlite3VdbeMakeLabel(v);
testcase( jumpIfNull==0 );
sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL);
- sqlite3ExprCachePush(pParse);
sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
sqlite3VdbeResolveLabel(v, d2);
- sqlite3ExprCachePop(pParse);
break;
}
case TK_OR: {
testcase( jumpIfNull==0 );
sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
- sqlite3ExprCachePush(pParse);
sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
- sqlite3ExprCachePop(pParse);
break;
}
case TK_NOT: {
@@ -96262,6 +100477,23 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int
sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
break;
}
+ case TK_TRUTH: {
+ int isNot; /* IS NOT TRUE or IS NOT FALSE */
+ int isTrue; /* IS TRUE or IS NOT TRUE */
+ testcase( jumpIfNull==0 );
+ isNot = pExpr->op2==TK_ISNOT;
+ isTrue = sqlite3ExprTruthValue(pExpr->pRight);
+ testcase( isTrue && isNot );
+ testcase( !isTrue && isNot );
+ if( isTrue ^ isNot ){
+ sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest,
+ isNot ? SQLITE_JUMPIFNULL : 0);
+ }else{
+ sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest,
+ isNot ? SQLITE_JUMPIFNULL : 0);
+ }
+ break;
+ }
case TK_IS:
case TK_ISNOT:
testcase( op==TK_IS );
@@ -96396,19 +100628,15 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int
case TK_AND: {
testcase( jumpIfNull==0 );
sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
- sqlite3ExprCachePush(pParse);
sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
- sqlite3ExprCachePop(pParse);
break;
}
case TK_OR: {
int d2 = sqlite3VdbeMakeLabel(v);
testcase( jumpIfNull==0 );
sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL);
- sqlite3ExprCachePush(pParse);
sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
sqlite3VdbeResolveLabel(v, d2);
- sqlite3ExprCachePop(pParse);
break;
}
case TK_NOT: {
@@ -96416,6 +100644,26 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int
sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
break;
}
+ case TK_TRUTH: {
+ int isNot; /* IS NOT TRUE or IS NOT FALSE */
+ int isTrue; /* IS TRUE or IS NOT TRUE */
+ testcase( jumpIfNull==0 );
+ isNot = pExpr->op2==TK_ISNOT;
+ isTrue = sqlite3ExprTruthValue(pExpr->pRight);
+ testcase( isTrue && isNot );
+ testcase( !isTrue && isNot );
+ if( isTrue ^ isNot ){
+ /* IS TRUE and IS NOT FALSE */
+ sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest,
+ isNot ? 0 : SQLITE_JUMPIFNULL);
+
+ }else{
+ /* IS FALSE and IS NOT TRUE */
+ sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest,
+ isNot ? 0 : SQLITE_JUMPIFNULL);
+ }
+ break;
+ }
case TK_IS:
case TK_ISNOT:
testcase( pExpr->op==TK_IS );
@@ -96601,17 +100849,35 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa
if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){
if( pA->op==TK_FUNCTION ){
if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2;
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ /* Justification for the assert():
+ ** window functions have p->op==TK_FUNCTION but aggregate functions
+ ** have p->op==TK_AGG_FUNCTION. So any comparison between an aggregate
+ ** function and a window function should have failed before reaching
+ ** this point. And, it is not possible to have a window function and
+ ** a scalar function with the same name and number of arguments. So
+ ** if we reach this point, either A and B both window functions or
+ ** neither are a window functions. */
+ assert( ExprHasProperty(pA,EP_WinFunc)==ExprHasProperty(pB,EP_WinFunc) );
+ if( ExprHasProperty(pA,EP_WinFunc) ){
+ if( sqlite3WindowCompare(pParse,pA->y.pWin,pB->y.pWin)!=0 ) return 2;
+ }
+#endif
+ }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 ){
- return pA->op==TK_COLLATE ? 1 : 2;
+ return 2;
}
}
if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2;
if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){
if( combinedFlags & EP_xIsSelect ) return 2;
- if( sqlite3ExprCompare(pParse, pA->pLeft, pB->pLeft, iTab) ) 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;
- if( ALWAYS((combinedFlags & EP_Reduced)==0) && pA->op!=TK_STRING ){
+ assert( (combinedFlags & EP_Reduced)==0 );
+ if( pA->op!=TK_STRING && pA->op!=TK_TRUEFALSE ){
if( pA->iColumn!=pB->iColumn ) return 2;
if( pA->iTable!=pB->iTable
&& (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2;
@@ -96704,6 +100970,102 @@ SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse *pParse, Expr *pE1, Expr *pE2, i
}
/*
+** This is the Expr node callback for sqlite3ExprImpliesNotNullRow().
+** If the expression node requires that the table at pWalker->iCur
+** have one or more non-NULL column, then set pWalker->eCode to 1 and abort.
+**
+** This routine controls an optimization. False positives (setting
+** pWalker->eCode to 1 when it should not be) are deadly, but false-negatives
+** (never setting pWalker->eCode) is a harmless missed optimization.
+*/
+static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){
+ testcase( pExpr->op==TK_AGG_COLUMN );
+ testcase( pExpr->op==TK_AGG_FUNCTION );
+ if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune;
+ switch( pExpr->op ){
+ case TK_ISNOT:
+ case TK_NOT:
+ case TK_ISNULL:
+ case TK_IS:
+ case TK_OR:
+ case TK_CASE:
+ case TK_IN:
+ case TK_FUNCTION:
+ testcase( pExpr->op==TK_ISNOT );
+ testcase( pExpr->op==TK_NOT );
+ testcase( pExpr->op==TK_ISNULL );
+ testcase( pExpr->op==TK_IS );
+ testcase( pExpr->op==TK_OR );
+ testcase( pExpr->op==TK_CASE );
+ testcase( pExpr->op==TK_IN );
+ testcase( pExpr->op==TK_FUNCTION );
+ return WRC_Prune;
+ case TK_COLUMN:
+ if( pWalker->u.iCur==pExpr->iTable ){
+ pWalker->eCode = 1;
+ return WRC_Abort;
+ }
+ return WRC_Prune;
+
+ /* Virtual tables are allowed to use constraints like x=NULL. So
+ ** a term of the form x=y does not prove that y is not null if x
+ ** is the column of a virtual table */
+ case TK_EQ:
+ case TK_NE:
+ case TK_LT:
+ case TK_LE:
+ case TK_GT:
+ case TK_GE:
+ testcase( pExpr->op==TK_EQ );
+ testcase( pExpr->op==TK_NE );
+ testcase( pExpr->op==TK_LT );
+ testcase( pExpr->op==TK_LE );
+ testcase( pExpr->op==TK_GT );
+ testcase( pExpr->op==TK_GE );
+ if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->y.pTab))
+ || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->y.pTab))
+ ){
+ return WRC_Prune;
+ }
+ default:
+ return WRC_Continue;
+ }
+}
+
+/*
+** Return true (non-zero) if expression p can only be true if at least
+** one column of table iTab is non-null. In other words, return true
+** if expression p will always be NULL or false if every column of iTab
+** is NULL.
+**
+** False negatives are acceptable. In other words, it is ok to return
+** zero even if expression p will never be true of every column of iTab
+** is NULL. A false negative is merely a missed optimization opportunity.
+**
+** False positives are not allowed, however. A false positive may result
+** in an incorrect answer.
+**
+** Terms of p that are marked with EP_FromJoin (and hence that come from
+** the ON or USING clauses of LEFT JOINS) are excluded from the analysis.
+**
+** This routine is used to check if a LEFT JOIN can be converted into
+** an ordinary JOIN. The p argument is the WHERE clause. If the WHERE
+** clause requires that some column of the right table of the LEFT JOIN
+** be non-NULL, then the LEFT JOIN can be safely converted into an
+** ordinary join.
+*/
+SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){
+ Walker w;
+ w.xExprCallback = impliesNotNullRow;
+ w.xSelectCallback = 0;
+ w.xSelectCallback2 = 0;
+ w.eCode = 0;
+ w.u.iCur = iTab;
+ sqlite3WalkExpr(&w, p);
+ return w.eCode;
+}
+
+/*
** An instance of the following structure is used by the tree walker
** to determine if an expression can be evaluated by reference to the
** index only, without having to do a search for the corresponding
@@ -96858,8 +101220,9 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
NameContext *pNC = pWalker->u.pNC;
Parse *pParse = pNC->pParse;
SrcList *pSrcList = pNC->pSrcList;
- AggInfo *pAggInfo = pNC->pAggInfo;
+ AggInfo *pAggInfo = pNC->uNC.pAggInfo;
+ assert( pNC->ncFlags & NC_UAggInfo );
switch( pExpr->op ){
case TK_AGG_COLUMN:
case TK_COLUMN: {
@@ -96891,7 +101254,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
&& (k = addAggInfoColumn(pParse->db, pAggInfo))>=0
){
pCol = &pAggInfo->aCol[k];
- pCol->pTab = pExpr->pTab;
+ pCol->pTab = pExpr->y.pTab;
pCol->iTable = pExpr->iTable;
pCol->iColumn = pExpr->iColumn;
pCol->iMem = ++pParse->nMem;
@@ -97037,21 +101400,9 @@ SQLITE_PRIVATE int sqlite3GetTempReg(Parse *pParse){
/*
** Deallocate a register, making available for reuse for some other
** purpose.
-**
-** If a register is currently being used by the column cache, then
-** the deallocation is deferred until the column cache line that uses
-** the register becomes stale.
*/
SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){
if( iReg && pParse->nTempReg<ArraySize(pParse->aTempReg) ){
- int i;
- struct yColCache *p;
- for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){
- if( p->iReg==iReg ){
- p->tempReg = 1;
- return;
- }
- }
pParse->aTempReg[pParse->nTempReg++] = iReg;
}
}
@@ -97065,7 +101416,6 @@ SQLITE_PRIVATE int sqlite3GetTempRange(Parse *pParse, int nReg){
i = pParse->iRangeReg;
n = pParse->nRangeReg;
if( nReg<=n ){
- assert( !usedAsColumnCache(pParse, i, i+n-1) );
pParse->iRangeReg += nReg;
pParse->nRangeReg -= nReg;
}else{
@@ -97079,7 +101429,6 @@ SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){
sqlite3ReleaseTempReg(pParse, iReg);
return;
}
- sqlite3ExprCacheRemove(pParse, iReg, nReg);
if( nReg>pParse->nRangeReg ){
pParse->nRangeReg = nReg;
pParse->iRangeReg = iReg;
@@ -97141,366 +101490,63 @@ SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){
*/
#ifndef SQLITE_OMIT_ALTERTABLE
-
-/*
-** This function is used by SQL generated to implement the
-** ALTER TABLE command. The first argument is the text of a CREATE TABLE or
-** CREATE INDEX command. The second is a table name. The table name in
-** the CREATE TABLE or CREATE INDEX statement is replaced with the third
-** argument and the result returned. Examples:
-**
-** sqlite_rename_table('CREATE TABLE abc(a, b, c)', 'def')
-** -> 'CREATE TABLE def(a, b, c)'
-**
-** sqlite_rename_table('CREATE INDEX i ON abc(a)', 'def')
-** -> 'CREATE INDEX i ON def(a, b, c)'
-*/
-static void renameTableFunc(
- sqlite3_context *context,
- int NotUsed,
- sqlite3_value **argv
-){
- unsigned char const *zSql = sqlite3_value_text(argv[0]);
- unsigned char const *zTableName = sqlite3_value_text(argv[1]);
-
- int token;
- Token tname;
- unsigned char const *zCsr = zSql;
- int len = 0;
- char *zRet;
-
- sqlite3 *db = sqlite3_context_db_handle(context);
-
- UNUSED_PARAMETER(NotUsed);
-
- /* The principle used to locate the table name in the CREATE TABLE
- ** statement is that the table name is the first non-space token that
- ** is immediately followed by a TK_LP or TK_USING token.
- */
- if( zSql ){
- do {
- if( !*zCsr ){
- /* Ran out of input before finding an opening bracket. Return NULL. */
- return;
- }
-
- /* Store the token that zCsr points to in tname. */
- tname.z = (char*)zCsr;
- tname.n = len;
-
- /* Advance zCsr to the next token. Store that token type in 'token',
- ** and its length in 'len' (to be used next iteration of this loop).
- */
- do {
- zCsr += len;
- len = sqlite3GetToken(zCsr, &token);
- } while( token==TK_SPACE );
- assert( len>0 );
- } while( token!=TK_LP && token!=TK_USING );
-
- zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", (int)(((u8*)tname.z) - zSql),
- zSql, zTableName, tname.z+tname.n);
- sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC);
- }
-}
-
-/*
-** This C function implements an SQL user function that is used by SQL code
-** generated by the ALTER TABLE ... RENAME command to modify the definition
-** of any foreign key constraints that use the table being renamed as the
-** parent table. It is passed three arguments:
-**
-** 1) The complete text of the CREATE TABLE statement being modified,
-** 2) The old name of the table being renamed, and
-** 3) The new name of the table being renamed.
-**
-** It returns the new CREATE TABLE statement. For example:
-**
-** sqlite_rename_parent('CREATE TABLE t1(a REFERENCES t2)', 't2', 't3')
-** -> 'CREATE TABLE t1(a REFERENCES t3)'
-*/
-#ifndef SQLITE_OMIT_FOREIGN_KEY
-static void renameParentFunc(
- sqlite3_context *context,
- int NotUsed,
- sqlite3_value **argv
-){
- sqlite3 *db = sqlite3_context_db_handle(context);
- char *zOutput = 0;
- char *zResult;
- unsigned char const *zInput = sqlite3_value_text(argv[0]);
- unsigned char const *zOld = sqlite3_value_text(argv[1]);
- unsigned char const *zNew = sqlite3_value_text(argv[2]);
-
- unsigned const char *z; /* Pointer to token */
- int n; /* Length of token z */
- int token; /* Type of token */
-
- UNUSED_PARAMETER(NotUsed);
- if( zInput==0 || zOld==0 ) return;
- for(z=zInput; *z; z=z+n){
- n = sqlite3GetToken(z, &token);
- if( token==TK_REFERENCES ){
- char *zParent;
- do {
- z += n;
- n = sqlite3GetToken(z, &token);
- }while( token==TK_SPACE );
-
- if( token==TK_ILLEGAL ) break;
- zParent = sqlite3DbStrNDup(db, (const char *)z, n);
- if( zParent==0 ) break;
- sqlite3Dequote(zParent);
- if( 0==sqlite3StrICmp((const char *)zOld, zParent) ){
- char *zOut = sqlite3MPrintf(db, "%s%.*s\"%w\"",
- (zOutput?zOutput:""), (int)(z-zInput), zInput, (const char *)zNew
- );
- sqlite3DbFree(db, zOutput);
- zOutput = zOut;
- zInput = &z[n];
- }
- sqlite3DbFree(db, zParent);
- }
- }
-
- zResult = sqlite3MPrintf(db, "%s%s", (zOutput?zOutput:""), zInput),
- sqlite3_result_text(context, zResult, -1, SQLITE_DYNAMIC);
- sqlite3DbFree(db, zOutput);
-}
-#endif
-
-#ifndef SQLITE_OMIT_TRIGGER
-/* This function is used by SQL generated to implement the
-** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER
-** statement. The second is a table name. The table name in the CREATE
-** TRIGGER statement is replaced with the third argument and the result
-** returned. This is analagous to renameTableFunc() above, except for CREATE
-** TRIGGER, not CREATE INDEX and CREATE TABLE.
-*/
-static void renameTriggerFunc(
- sqlite3_context *context,
- int NotUsed,
- sqlite3_value **argv
-){
- unsigned char const *zSql = sqlite3_value_text(argv[0]);
- unsigned char const *zTableName = sqlite3_value_text(argv[1]);
-
- int token;
- Token tname;
- int dist = 3;
- unsigned char const *zCsr = zSql;
- int len = 0;
- char *zRet;
- sqlite3 *db = sqlite3_context_db_handle(context);
-
- UNUSED_PARAMETER(NotUsed);
-
- /* The principle used to locate the table name in the CREATE TRIGGER
- ** statement is that the table name is the first token that is immediately
- ** preceded by either TK_ON or TK_DOT and immediately followed by one
- ** of TK_WHEN, TK_BEGIN or TK_FOR.
- */
- if( zSql ){
- do {
-
- if( !*zCsr ){
- /* Ran out of input before finding the table name. Return NULL. */
- return;
- }
-
- /* Store the token that zCsr points to in tname. */
- tname.z = (char*)zCsr;
- tname.n = len;
-
- /* Advance zCsr to the next token. Store that token type in 'token',
- ** and its length in 'len' (to be used next iteration of this loop).
- */
- do {
- zCsr += len;
- len = sqlite3GetToken(zCsr, &token);
- }while( token==TK_SPACE );
- assert( len>0 );
-
- /* Variable 'dist' stores the number of tokens read since the most
- ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN
- ** token is read and 'dist' equals 2, the condition stated above
- ** to be met.
- **
- ** Note that ON cannot be a database, table or column name, so
- ** there is no need to worry about syntax like
- ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc.
- */
- dist++;
- if( token==TK_DOT || token==TK_ON ){
- dist = 0;
- }
- } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) );
-
- /* Variable tname now contains the token that is the old table-name
- ** in the CREATE TRIGGER statement.
- */
- zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", (int)(((u8*)tname.z) - zSql),
- zSql, zTableName, tname.z+tname.n);
- sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC);
- }
-}
-#endif /* !SQLITE_OMIT_TRIGGER */
-
-/*
-** Register built-in functions used to help implement ALTER TABLE
-*/
-SQLITE_PRIVATE void sqlite3AlterFunctions(void){
- static FuncDef aAlterTableFuncs[] = {
- FUNCTION(sqlite_rename_table, 2, 0, 0, renameTableFunc),
-#ifndef SQLITE_OMIT_TRIGGER
- FUNCTION(sqlite_rename_trigger, 2, 0, 0, renameTriggerFunc),
-#endif
-#ifndef SQLITE_OMIT_FOREIGN_KEY
- FUNCTION(sqlite_rename_parent, 3, 0, 0, renameParentFunc),
-#endif
- };
- sqlite3InsertBuiltinFuncs(aAlterTableFuncs, ArraySize(aAlterTableFuncs));
-}
-
/*
-** This function is used to create the text of expressions of the form:
-**
-** name=<constant1> OR name=<constant2> OR ...
-**
-** If argument zWhere is NULL, then a pointer string containing the text
-** "name=<constant>" is returned, where <constant> is the quoted version
-** of the string passed as argument zConstant. The returned buffer is
-** allocated using sqlite3DbMalloc(). It is the responsibility of the
-** caller to ensure that it is eventually freed.
+** Parameter zName is the name of a table that is about to be altered
+** (either with ALTER TABLE ... RENAME TO or ALTER TABLE ... ADD COLUMN).
+** If the table is a system table, this function leaves an error message
+** in pParse->zErr (system tables may not be altered) and returns non-zero.
**
-** If argument zWhere is not NULL, then the string returned is
-** "<where> OR name=<constant>", where <where> is the contents of zWhere.
-** In this case zWhere is passed to sqlite3DbFree() before returning.
-**
-*/
-static char *whereOrName(sqlite3 *db, char *zWhere, char *zConstant){
- char *zNew;
- if( !zWhere ){
- zNew = sqlite3MPrintf(db, "name=%Q", zConstant);
- }else{
- zNew = sqlite3MPrintf(db, "%s OR name=%Q", zWhere, zConstant);
- sqlite3DbFree(db, zWhere);
- }
- return zNew;
-}
-
-#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
-/*
-** Generate the text of a WHERE expression which can be used to select all
-** tables that have foreign key constraints that refer to table pTab (i.e.
-** constraints for which pTab is the parent table) from the sqlite_master
-** table.
-*/
-static char *whereForeignKeys(Parse *pParse, Table *pTab){
- FKey *p;
- char *zWhere = 0;
- for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
- zWhere = whereOrName(pParse->db, zWhere, p->pFrom->zName);
- }
- return zWhere;
-}
-#endif
-
-/*
-** Generate the text of a WHERE expression which can be used to select all
-** temporary triggers on table pTab from the sqlite_temp_master table. If
-** table pTab has no temporary triggers, or is itself stored in the
-** temporary database, NULL is returned.
+** Or, if zName is not a system table, zero is returned.
*/
-static char *whereTempTriggers(Parse *pParse, Table *pTab){
- Trigger *pTrig;
- char *zWhere = 0;
- const Schema *pTempSchema = pParse->db->aDb[1].pSchema; /* Temp db schema */
-
- /* If the table is not located in the temp-db (in which case NULL is
- ** returned, loop through the tables list of triggers. For each trigger
- ** that is not part of the temp-db schema, add a clause to the WHERE
- ** expression being built up in zWhere.
- */
- if( pTab->pSchema!=pTempSchema ){
- sqlite3 *db = pParse->db;
- for(pTrig=sqlite3TriggerList(pParse, pTab); pTrig; pTrig=pTrig->pNext){
- if( pTrig->pSchema==pTempSchema ){
- zWhere = whereOrName(db, zWhere, pTrig->zName);
- }
- }
- }
- if( zWhere ){
- char *zNew = sqlite3MPrintf(pParse->db, "type='trigger' AND (%s)", zWhere);
- sqlite3DbFree(pParse->db, zWhere);
- zWhere = zNew;
+static int isSystemTable(Parse *pParse, const char *zName){
+ if( 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){
+ sqlite3ErrorMsg(pParse, "table %s may not be altered", zName);
+ return 1;
}
- return zWhere;
+ return 0;
}
/*
-** Generate code to drop and reload the internal representation of table
-** pTab from the database, including triggers and temporary triggers.
-** Argument zName is the name of the table in the database schema at
-** the time the generated code is executed. This can be different from
-** pTab->zName if this function is being called to code part of an
-** "ALTER TABLE RENAME TO" statement.
+** Generate code to verify that the schemas of database zDb and, if
+** bTemp is not true, database "temp", can still be parsed. This is
+** called at the end of the generation of an ALTER TABLE ... RENAME ...
+** statement to ensure that the operation has not rendered any schema
+** objects unusable.
*/
-static void reloadTableSchema(Parse *pParse, Table *pTab, const char *zName){
- Vdbe *v;
- char *zWhere;
- int iDb; /* Index of database containing pTab */
-#ifndef SQLITE_OMIT_TRIGGER
- Trigger *pTrig;
-#endif
-
- v = sqlite3GetVdbe(pParse);
- if( NEVER(v==0) ) return;
- assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
- iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
- assert( iDb>=0 );
-
-#ifndef SQLITE_OMIT_TRIGGER
- /* Drop any table triggers from the internal schema. */
- for(pTrig=sqlite3TriggerList(pParse, pTab); pTrig; pTrig=pTrig->pNext){
- int iTrigDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);
- assert( iTrigDb==iDb || iTrigDb==1 );
- sqlite3VdbeAddOp4(v, OP_DropTrigger, iTrigDb, 0, 0, pTrig->zName, 0);
- }
-#endif
-
- /* Drop the table and index from the internal schema. */
- sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
-
- /* Reload the table, index and permanent trigger schemas. */
- zWhere = sqlite3MPrintf(pParse->db, "tbl_name=%Q", zName);
- if( !zWhere ) return;
- sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere);
+static void renameTestSchema(Parse *pParse, const char *zDb, int bTemp){
+ sqlite3NestedParse(pParse,
+ "SELECT 1 "
+ "FROM \"%w\".%s "
+ "WHERE name NOT LIKE 'sqlite_%%'"
+ " AND sql NOT LIKE 'create virtual%%'"
+ " AND sqlite_rename_test(%Q, sql, type, name, %d)=NULL ",
+ zDb, MASTER_NAME,
+ zDb, bTemp
+ );
-#ifndef SQLITE_OMIT_TRIGGER
- /* Now, if the table is not stored in the temp database, reload any temp
- ** triggers. Don't use IN(...) in case SQLITE_OMIT_SUBQUERY is defined.
- */
- if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){
- sqlite3VdbeAddParseSchemaOp(v, 1, zWhere);
+ if( bTemp==0 ){
+ sqlite3NestedParse(pParse,
+ "SELECT 1 "
+ "FROM temp.%s "
+ "WHERE name NOT LIKE 'sqlite_%%'"
+ " AND sql NOT LIKE 'create virtual%%'"
+ " AND sqlite_rename_test(%Q, sql, type, name, 1)=NULL ",
+ MASTER_NAME, zDb
+ );
}
-#endif
}
/*
-** Parameter zName is the name of a table that is about to be altered
-** (either with ALTER TABLE ... RENAME TO or ALTER TABLE ... ADD COLUMN).
-** If the table is a system table, this function leaves an error message
-** in pParse->zErr (system tables may not be altered) and returns non-zero.
-**
-** Or, if zName is not a system table, zero is returned.
+** Generate code to reload the schema for database iDb. And, if iDb!=1, for
+** the temp database as well.
*/
-static int isSystemTable(Parse *pParse, const char *zName){
- if( 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){
- sqlite3ErrorMsg(pParse, "table %s may not be altered", zName);
- return 1;
+static void renameReloadSchema(Parse *pParse, int iDb){
+ Vdbe *v = pParse->pVdbe;
+ if( v ){
+ sqlite3ChangeCookie(pParse, iDb);
+ sqlite3VdbeAddParseSchemaOp(pParse->pVdbe, iDb, 0);
+ if( iDb!=1 ) sqlite3VdbeAddParseSchemaOp(pParse->pVdbe, 1, 0);
}
- return 0;
}
/*
@@ -97520,9 +101566,6 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
int nTabName; /* Number of UTF-8 characters in zTabName */
const char *zTabName; /* Original name of the table */
Vdbe *v;
-#ifndef SQLITE_OMIT_TRIGGER
- char *zWhere = 0; /* Where clause to locate temp triggers */
-#endif
VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */
u32 savedDbFlags; /* Saved value of db->mDbFlags */
@@ -97595,52 +101638,25 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
if( v==0 ){
goto exit_rename_table;
}
- sqlite3BeginWriteOperation(pParse, pVTab!=0, iDb);
- sqlite3ChangeCookie(pParse, iDb);
-
- /* If this is a virtual table, invoke the xRename() function if
- ** one is defined. The xRename() callback will modify the names
- ** of any resources used by the v-table implementation (including other
- ** SQLite tables) that are identified by the name of the virtual table.
- */
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( pVTab ){
- int i = ++pParse->nMem;
- sqlite3VdbeLoadString(v, i, zName);
- sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB);
- sqlite3MayAbort(pParse);
- }
-#endif
/* figure out how many UTF-8 characters are in zName */
zTabName = pTab->zName;
nTabName = sqlite3Utf8CharLen(zTabName, -1);
-#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
- if( db->flags&SQLITE_ForeignKeys ){
- /* If foreign-key support is enabled, rewrite the CREATE TABLE
- ** statements corresponding to all child tables of foreign key constraints
- ** for which the renamed table is the parent table. */
- if( (zWhere=whereForeignKeys(pParse, pTab))!=0 ){
- sqlite3NestedParse(pParse,
- "UPDATE \"%w\".%s SET "
- "sql = sqlite_rename_parent(sql, %Q, %Q) "
- "WHERE %s;", zDb, MASTER_NAME, zTabName, zName, zWhere);
- sqlite3DbFree(db, zWhere);
- }
- }
-#endif
+ /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in
+ ** the schema to use the new table name. */
+ sqlite3NestedParse(pParse,
+ "UPDATE \"%w\".%s SET "
+ "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) "
+ "WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)"
+ "AND name NOT LIKE 'sqlite_%%'"
+ , zDb, MASTER_NAME, zDb, zTabName, zName, (iDb==1), zTabName
+ );
- /* Modify the sqlite_master table to use the new table name. */
+ /* Update the tbl_name and name columns of the sqlite_master table
+ ** as required. */
sqlite3NestedParse(pParse,
"UPDATE %Q.%s SET "
-#ifdef SQLITE_OMIT_TRIGGER
- "sql = sqlite_rename_table(sql, %Q), "
-#else
- "sql = CASE "
- "WHEN type = 'trigger' THEN sqlite_rename_trigger(sql, %Q)"
- "ELSE sqlite_rename_table(sql, %Q) END, "
-#endif
"tbl_name = %Q, "
"name = CASE "
"WHEN type='table' THEN %Q "
@@ -97649,11 +101665,9 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
"ELSE name END "
"WHERE tbl_name=%Q COLLATE nocase AND "
"(type='table' OR type='index' OR type='trigger');",
- zDb, MASTER_NAME, zName, zName, zName,
-#ifndef SQLITE_OMIT_TRIGGER
- zName,
-#endif
- zName, nTabName, zTabName
+ zDb, MASTER_NAME,
+ zName, zName, zName,
+ nTabName, zTabName
);
#ifndef SQLITE_OMIT_AUTOINCREMENT
@@ -97667,35 +101681,37 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
}
#endif
-#ifndef SQLITE_OMIT_TRIGGER
- /* If there are TEMP triggers on this table, modify the sqlite_temp_master
- ** table. Don't do this if the table being ALTERed is itself located in
- ** the temp database.
- */
- if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){
+ /* If the table being renamed is not itself part of the temp database,
+ ** edit view and trigger definitions within the temp database
+ ** as required. */
+ if( iDb!=1 ){
sqlite3NestedParse(pParse,
"UPDATE sqlite_temp_master SET "
- "sql = sqlite_rename_trigger(sql, %Q), "
- "tbl_name = %Q "
- "WHERE %s;", zName, zName, zWhere);
- sqlite3DbFree(db, zWhere);
+ "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, 1), "
+ "tbl_name = "
+ "CASE WHEN tbl_name=%Q COLLATE nocase AND "
+ " sqlite_rename_test(%Q, sql, type, name, 1) "
+ "THEN %Q ELSE tbl_name END "
+ "WHERE type IN ('view', 'trigger')"
+ , zDb, zTabName, zName, zTabName, zDb, zName);
}
-#endif
-#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
- if( db->flags&SQLITE_ForeignKeys ){
- FKey *p;
- for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
- Table *pFrom = p->pFrom;
- if( pFrom!=pTab ){
- reloadTableSchema(pParse, p->pFrom, pFrom->zName);
- }
- }
+ /* If this is a virtual table, invoke the xRename() function if
+ ** one is defined. The xRename() callback will modify the names
+ ** of any resources used by the v-table implementation (including other
+ ** SQLite tables) that are identified by the name of the virtual table.
+ */
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ if( pVTab ){
+ int i = ++pParse->nMem;
+ sqlite3VdbeLoadString(v, i, zName);
+ sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB);
+ sqlite3MayAbort(pParse);
}
#endif
- /* Drop and reload the internal table schema. */
- reloadTableSchema(pParse, pTab, zName);
+ renameReloadSchema(pParse, iDb);
+ renameTestSchema(pParse, zDb, iDb==1);
exit_rename_table:
sqlite3SrcListDelete(db, pSrc);
@@ -97721,12 +101737,11 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
Column *pCol; /* The new column */
Expr *pDflt; /* Default value for the new column */
sqlite3 *db; /* The database connection; */
- Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */
+ Vdbe *v; /* The prepared statement under construction */
int r1; /* Temporary registers */
db = pParse->db;
if( pParse->nErr || db->mallocFailed ) return;
- assert( v!=0 );
pNew = pParse->pNewTable;
assert( pNew );
@@ -97821,17 +101836,20 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
** from less than 3 to 4, as that will corrupt any preexisting DESC
** index.
*/
- r1 = sqlite3GetTempReg(pParse);
- sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT);
- sqlite3VdbeUsesBtree(v, iDb);
- sqlite3VdbeAddOp2(v, OP_AddImm, r1, -2);
- sqlite3VdbeAddOp2(v, OP_IfPos, r1, sqlite3VdbeCurrentAddr(v)+2);
- VdbeCoverage(v);
- sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3);
- sqlite3ReleaseTempReg(pParse, r1);
+ v = sqlite3GetVdbe(pParse);
+ if( v ){
+ r1 = sqlite3GetTempReg(pParse);
+ sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT);
+ sqlite3VdbeUsesBtree(v, iDb);
+ sqlite3VdbeAddOp2(v, OP_AddImm, r1, -2);
+ sqlite3VdbeAddOp2(v, OP_IfPos, r1, sqlite3VdbeCurrentAddr(v)+2);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3);
+ sqlite3ReleaseTempReg(pParse, r1);
+ }
- /* Reload the schema of the modified table. */
- reloadTableSchema(pParse, pTab, pTab->zName);
+ /* Reload the table definition */
+ renameReloadSchema(pParse, iDb);
}
/*
@@ -97852,7 +101870,6 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
Table *pNew;
Table *pTab;
- Vdbe *v;
int iDb;
int i;
int nAlloc;
@@ -97916,16 +101933,1146 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
pNew->addColOffset = pTab->addColOffset;
pNew->nTabRef = 1;
- /* Begin a transaction and increment the schema cookie. */
- sqlite3BeginWriteOperation(pParse, 0, iDb);
- v = sqlite3GetVdbe(pParse);
- if( !v ) goto exit_begin_add_column;
- sqlite3ChangeCookie(pParse, iDb);
-
exit_begin_add_column:
sqlite3SrcListDelete(db, pSrc);
return;
}
+
+/*
+** Parameter pTab is the subject of an ALTER TABLE ... RENAME COLUMN
+** command. This function checks if the table is a view or virtual
+** table (columns of views or virtual tables may not be renamed). If so,
+** it loads an error message into pParse and returns non-zero.
+**
+** Or, if pTab is not a view or virtual table, zero is returned.
+*/
+#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
+static int isRealTable(Parse *pParse, Table *pTab){
+ const char *zType = 0;
+#ifndef SQLITE_OMIT_VIEW
+ if( pTab->pSelect ){
+ zType = "view";
+ }
+#endif
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ if( IsVirtual(pTab) ){
+ zType = "virtual table";
+ }
+#endif
+ if( zType ){
+ sqlite3ErrorMsg(
+ pParse, "cannot rename columns of %s \"%s\"", zType, pTab->zName
+ );
+ return 1;
+ }
+ return 0;
+}
+#else /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */
+# define isRealTable(x,y) (0)
+#endif
+
+/*
+** Handles the following parser reduction:
+**
+** cmd ::= ALTER TABLE pSrc RENAME COLUMN pOld TO pNew
+*/
+SQLITE_PRIVATE void sqlite3AlterRenameColumn(
+ Parse *pParse, /* Parsing context */
+ SrcList *pSrc, /* Table being altered. pSrc->nSrc==1 */
+ Token *pOld, /* Name of column being changed */
+ Token *pNew /* New column name */
+){
+ sqlite3 *db = pParse->db; /* Database connection */
+ Table *pTab; /* Table being updated */
+ int iCol; /* Index of column being renamed */
+ char *zOld = 0; /* Old column name */
+ char *zNew = 0; /* New column name */
+ const char *zDb; /* Name of schema containing the table */
+ int iSchema; /* Index of the schema */
+ int bQuote; /* True to quote the new name */
+
+ /* Locate the table to be altered */
+ pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]);
+ 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!=isRealTable(pParse, pTab) ) goto exit_rename_column;
+
+ /* Which schema holds the table to be altered */
+ iSchema = sqlite3SchemaToIndex(db, pTab->pSchema);
+ assert( iSchema>=0 );
+ zDb = db->aDb[iSchema].zDbSName;
+
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ /* Invoke the authorization callback. */
+ if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){
+ goto exit_rename_column;
+ }
+#endif
+
+ /* Make sure the old name really is a column name in the table to be
+ ** altered. Set iCol to be the index of the column being renamed */
+ zOld = sqlite3NameFromToken(db, pOld);
+ if( !zOld ) goto exit_rename_column;
+ for(iCol=0; iCol<pTab->nCol; iCol++){
+ if( 0==sqlite3StrICmp(pTab->aCol[iCol].zName, zOld) ) break;
+ }
+ if( iCol==pTab->nCol ){
+ sqlite3ErrorMsg(pParse, "no such column: \"%s\"", zOld);
+ goto exit_rename_column;
+ }
+
+ /* Do the rename operation using a recursive UPDATE statement that
+ ** uses the sqlite_rename_column() SQL function to compute the new
+ ** CREATE statement text for the sqlite_master table.
+ */
+ zNew = sqlite3NameFromToken(db, pNew);
+ if( !zNew ) goto exit_rename_column;
+ assert( pNew->n>0 );
+ bQuote = sqlite3Isquote(pNew->z[0]);
+ sqlite3NestedParse(pParse,
+ "UPDATE \"%w\".%s SET "
+ "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) "
+ "WHERE name NOT LIKE 'sqlite_%%' AND (type != 'index' OR tbl_name = %Q)"
+ " AND sql NOT LIKE 'create virtual%%'",
+ zDb, MASTER_NAME,
+ zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1,
+ pTab->zName
+ );
+
+ sqlite3NestedParse(pParse,
+ "UPDATE temp.%s SET "
+ "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) "
+ "WHERE type IN ('trigger', 'view')",
+ MASTER_NAME,
+ zDb, pTab->zName, iCol, zNew, bQuote
+ );
+
+ /* Drop and reload the database schema. */
+ renameReloadSchema(pParse, iSchema);
+ renameTestSchema(pParse, zDb, iSchema==1);
+
+ exit_rename_column:
+ sqlite3SrcListDelete(db, pSrc);
+ sqlite3DbFree(db, zOld);
+ sqlite3DbFree(db, zNew);
+ return;
+}
+
+/*
+** Each RenameToken object maps an element of the parse tree into
+** the token that generated that element. The parse tree element
+** might be one of:
+**
+** * A pointer to an Expr that represents an ID
+** * The name of a table column in Column.zName
+**
+** A list of RenameToken objects can be constructed during parsing.
+** Each new object is created by sqlite3RenameTokenMap().
+** As the parse tree is transformed, the sqlite3RenameTokenRemap()
+** routine is used to keep the mapping current.
+**
+** After the parse finishes, renameTokenFind() routine can be used
+** to look up the actual token value that created some element in
+** the parse tree.
+*/
+struct RenameToken {
+ void *p; /* Parse tree element created by token t */
+ Token t; /* The token that created parse tree element p */
+ RenameToken *pNext; /* Next is a list of all RenameToken objects */
+};
+
+/*
+** The context of an ALTER TABLE RENAME COLUMN operation that gets passed
+** down into the Walker.
+*/
+typedef struct RenameCtx RenameCtx;
+struct RenameCtx {
+ RenameToken *pList; /* List of tokens to overwrite */
+ int nList; /* Number of tokens in pList */
+ int iCol; /* Index of column being renamed */
+ Table *pTab; /* Table being ALTERed */
+ const char *zOld; /* Old column name */
+};
+
+#ifdef SQLITE_DEBUG
+/*
+** This function is only for debugging. It performs two tasks:
+**
+** 1. Checks that pointer pPtr does not already appear in the
+** rename-token list.
+**
+** 2. Dereferences each pointer in the rename-token list.
+**
+** The second is most effective when debugging under valgrind or
+** address-sanitizer or similar. If any of these pointers no longer
+** point to valid objects, an exception is raised by the memory-checking
+** tool.
+**
+** The point of this is to prevent comparisons of invalid pointer values.
+** Even though this always seems to work, it is undefined according to the
+** C standard. Example of undefined comparison:
+**
+** sqlite3_free(x);
+** if( x==y ) ...
+**
+** Technically, as x no longer points into a valid object or to the byte
+** following a valid object, it may not be used in comparison operations.
+*/
+static void renameTokenCheckAll(Parse *pParse, void *pPtr){
+ if( pParse->nErr==0 && pParse->db->mallocFailed==0 ){
+ RenameToken *p;
+ u8 i = 0;
+ for(p=pParse->pRename; p; p=p->pNext){
+ if( p->p ){
+ assert( p->p!=pPtr );
+ i += *(u8*)(p->p);
+ }
+ }
+ }
+}
+#else
+# define renameTokenCheckAll(x,y)
+#endif
+
+/*
+** Remember that the parser tree element pPtr was created using
+** the token pToken.
+**
+** In other words, construct a new RenameToken object and add it
+** to the list of RenameToken objects currently being built up
+** in pParse->pRename.
+**
+** The pPtr argument is returned so that this routine can be used
+** with tail recursion in tokenExpr() routine, for a small performance
+** improvement.
+*/
+SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse *pParse, void *pPtr, Token *pToken){
+ RenameToken *pNew;
+ assert( pPtr || pParse->db->mallocFailed );
+ renameTokenCheckAll(pParse, pPtr);
+ pNew = sqlite3DbMallocZero(pParse->db, sizeof(RenameToken));
+ if( pNew ){
+ pNew->p = pPtr;
+ pNew->t = *pToken;
+ pNew->pNext = pParse->pRename;
+ pParse->pRename = pNew;
+ }
+
+ return pPtr;
+}
+
+/*
+** It is assumed that there is already a RenameToken object associated
+** with parse tree element pFrom. This function remaps the associated token
+** to parse tree element pTo.
+*/
+SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse *pParse, void *pTo, void *pFrom){
+ RenameToken *p;
+ renameTokenCheckAll(pParse, pTo);
+ for(p=pParse->pRename; p; p=p->pNext){
+ if( p->p==pFrom ){
+ p->p = pTo;
+ break;
+ }
+ }
+}
+
+/*
+** Walker callback used by sqlite3RenameExprUnmap().
+*/
+static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){
+ Parse *pParse = pWalker->pParse;
+ sqlite3RenameTokenRemap(pParse, 0, (void*)pExpr);
+ return WRC_Continue;
+}
+
+/*
+** Remove all nodes that are part of expression pExpr from the rename list.
+*/
+SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse *pParse, Expr *pExpr){
+ Walker sWalker;
+ memset(&sWalker, 0, sizeof(Walker));
+ sWalker.pParse = pParse;
+ sWalker.xExprCallback = renameUnmapExprCb;
+ sqlite3WalkExpr(&sWalker, pExpr);
+}
+
+/*
+** Remove all nodes that are part of expression-list pEList from the
+** rename list.
+*/
+SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){
+ if( pEList ){
+ int i;
+ Walker sWalker;
+ memset(&sWalker, 0, sizeof(Walker));
+ sWalker.pParse = pParse;
+ sWalker.xExprCallback = renameUnmapExprCb;
+ sqlite3WalkExprList(&sWalker, pEList);
+ for(i=0; i<pEList->nExpr; i++){
+ sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zName);
+ }
+ }
+}
+
+/*
+** Free the list of RenameToken objects given in the second argument
+*/
+static void renameTokenFree(sqlite3 *db, RenameToken *pToken){
+ RenameToken *pNext;
+ RenameToken *p;
+ for(p=pToken; p; p=pNext){
+ pNext = p->pNext;
+ sqlite3DbFree(db, p);
+ }
+}
+
+/*
+** Search the Parse object passed as the first argument for a RenameToken
+** object associated with parse tree element pPtr. If found, remove it
+** from the Parse object and add it to the list maintained by the
+** RenameCtx object passed as the second argument.
+*/
+static void renameTokenFind(Parse *pParse, struct RenameCtx *pCtx, void *pPtr){
+ RenameToken **pp;
+ assert( pPtr!=0 );
+ for(pp=&pParse->pRename; (*pp); pp=&(*pp)->pNext){
+ if( (*pp)->p==pPtr ){
+ RenameToken *pToken = *pp;
+ *pp = pToken->pNext;
+ pToken->pNext = pCtx->pList;
+ pCtx->pList = pToken;
+ pCtx->nList++;
+ break;
+ }
+ }
+}
+
+/*
+** 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);
+ return WRC_Continue;
+}
+
+/*
+** This is a Walker expression callback.
+**
+** For every TK_COLUMN node in the expression tree, search to see
+** if the column being references is the column being renamed by an
+** ALTER TABLE statement. If it is, then attach its associated
+** RenameToken object to the list of RenameToken objects being
+** constructed in RenameCtx object at pWalker->u.pRename.
+*/
+static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){
+ RenameCtx *p = pWalker->u.pRename;
+ if( pExpr->op==TK_TRIGGER
+ && pExpr->iColumn==p->iCol
+ && pWalker->pParse->pTriggerTab==p->pTab
+ ){
+ renameTokenFind(pWalker->pParse, p, (void*)pExpr);
+ }else if( pExpr->op==TK_COLUMN
+ && pExpr->iColumn==p->iCol
+ && p->pTab==pExpr->y.pTab
+ ){
+ renameTokenFind(pWalker->pParse, p, (void*)pExpr);
+ }
+ return WRC_Continue;
+}
+
+/*
+** The RenameCtx contains a list of tokens that reference a column that
+** is being renamed by an ALTER TABLE statement. Return the "last"
+** RenameToken in the RenameCtx and remove that RenameToken from the
+** RenameContext. "Last" means the last RenameToken encountered when
+** the input SQL is parsed from left to right. Repeated calls to this routine
+** return all column name tokens in the order that they are encountered
+** in the SQL statement.
+*/
+static RenameToken *renameColumnTokenNext(RenameCtx *pCtx){
+ RenameToken *pBest = pCtx->pList;
+ RenameToken *pToken;
+ RenameToken **pp;
+
+ for(pToken=pBest->pNext; pToken; pToken=pToken->pNext){
+ if( pToken->t.z>pBest->t.z ) pBest = pToken;
+ }
+ for(pp=&pCtx->pList; *pp!=pBest; pp=&(*pp)->pNext);
+ *pp = pBest->pNext;
+
+ return pBest;
+}
+
+/*
+** An error occured while parsing or otherwise processing a database
+** object (either pParse->pNewTable, pNewIndex or pNewTrigger) as part of an
+** ALTER TABLE RENAME COLUMN program. The error message emitted by the
+** sub-routine is currently stored in pParse->zErrMsg. This function
+** adds context to the error message and then stores it in pCtx.
+*/
+static void renameColumnParseError(
+ sqlite3_context *pCtx,
+ int bPost,
+ sqlite3_value *pType,
+ sqlite3_value *pObject,
+ Parse *pParse
+){
+ const char *zT = (const char*)sqlite3_value_text(pType);
+ const char *zN = (const char*)sqlite3_value_text(pObject);
+ char *zErr;
+
+ zErr = sqlite3_mprintf("error in %s %s%s: %s",
+ zT, zN, (bPost ? " after rename" : ""),
+ pParse->zErrMsg
+ );
+ sqlite3_result_error(pCtx, zErr, -1);
+ sqlite3_free(zErr);
+}
+
+/*
+** For each name in the the expression-list pEList (i.e. each
+** pEList->a[i].zName) that matches the string in zOld, extract the
+** corresponding rename-token from Parse object pParse and add it
+** to the RenameCtx pCtx.
+*/
+static void renameColumnElistNames(
+ Parse *pParse,
+ RenameCtx *pCtx,
+ ExprList *pEList,
+ const char *zOld
+){
+ if( pEList ){
+ int i;
+ for(i=0; i<pEList->nExpr; i++){
+ char *zName = pEList->a[i].zName;
+ if( 0==sqlite3_stricmp(zName, zOld) ){
+ renameTokenFind(pParse, pCtx, (void*)zName);
+ }
+ }
+ }
+}
+
+/*
+** For each name in the the id-list pIdList (i.e. each pIdList->a[i].zName)
+** that matches the string in zOld, extract the corresponding rename-token
+** from Parse object pParse and add it to the RenameCtx pCtx.
+*/
+static void renameColumnIdlistNames(
+ Parse *pParse,
+ RenameCtx *pCtx,
+ IdList *pIdList,
+ const char *zOld
+){
+ if( pIdList ){
+ int i;
+ for(i=0; i<pIdList->nId; i++){
+ char *zName = pIdList->a[i].zName;
+ if( 0==sqlite3_stricmp(zName, zOld) ){
+ renameTokenFind(pParse, pCtx, (void*)zName);
+ }
+ }
+ }
+}
+
+/*
+** Parse the SQL statement zSql using Parse object (*p). The Parse object
+** is initialized by this function before it is used.
+*/
+static int renameParseSql(
+ Parse *p, /* Memory to use for Parse object */
+ const char *zDb, /* Name of schema SQL belongs to */
+ int bTable, /* 1 -> RENAME TABLE, 0 -> RENAME COLUMN */
+ sqlite3 *db, /* Database handle */
+ const char *zSql, /* SQL to parse */
+ int bTemp /* True if SQL is from temp schema */
+){
+ int rc;
+ char *zErr = 0;
+
+ db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb);
+
+ /* Parse the SQL statement passed as the first argument. If no error
+ ** occurs and the parse does not result in a new table, index or
+ ** trigger object, the database must be corrupt. */
+ memset(p, 0, sizeof(Parse));
+ p->eParseMode = (bTable ? PARSE_MODE_RENAME_TABLE : PARSE_MODE_RENAME_COLUMN);
+ p->db = db;
+ p->nQueryLoop = 1;
+ 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
+ && p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0
+ ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }
+
+#ifdef SQLITE_DEBUG
+ /* Ensure that all mappings in the Parse.pRename list really do map to
+ ** a part of the input string. */
+ if( rc==SQLITE_OK ){
+ int nSql = sqlite3Strlen30(zSql);
+ RenameToken *pToken;
+ for(pToken=p->pRename; pToken; pToken=pToken->pNext){
+ assert( pToken->t.z>=zSql && &pToken->t.z[pToken->t.n]<=&zSql[nSql] );
+ }
+ }
+#endif
+
+ db->init.iDb = 0;
+ return rc;
+}
+
+/*
+** This function edits SQL statement zSql, replacing each token identified
+** by the linked list pRename with the text of zNew. If argument bQuote is
+** true, then zNew is always quoted first. If no error occurs, the result
+** is loaded into context object pCtx as the result.
+**
+** Or, if an error occurs (i.e. an OOM condition), an error is left in
+** pCtx and an SQLite error code returned.
+*/
+static int renameEditSql(
+ sqlite3_context *pCtx, /* Return result here */
+ RenameCtx *pRename, /* Rename context */
+ const char *zSql, /* SQL statement to edit */
+ const char *zNew, /* New token text */
+ int bQuote /* True to always quote token */
+){
+ int nNew = sqlite3Strlen30(zNew);
+ int nSql = sqlite3Strlen30(zSql);
+ sqlite3 *db = sqlite3_context_db_handle(pCtx);
+ int rc = SQLITE_OK;
+ char *zQuot;
+ char *zOut;
+ int nQuot;
+
+ /* Set zQuot to point to a buffer containing a quoted copy of the
+ ** identifier zNew. If the corresponding identifier in the original
+ ** ALTER TABLE statement was quoted (bQuote==1), then set zNew to
+ ** point to zQuot so that all substitutions are made using the
+ ** quoted version of the new column name. */
+ zQuot = sqlite3MPrintf(db, "\"%w\"", zNew);
+ if( zQuot==0 ){
+ return SQLITE_NOMEM;
+ }else{
+ nQuot = sqlite3Strlen30(zQuot);
+ }
+ if( bQuote ){
+ zNew = zQuot;
+ nNew = nQuot;
+ }
+
+ /* At this point pRename->pList contains a list of RenameToken objects
+ ** corresponding to all tokens in the input SQL that must be replaced
+ ** with the new column name. All that remains is to construct and
+ ** return the edited SQL string. */
+ assert( nQuot>=nNew );
+ zOut = sqlite3DbMallocZero(db, nSql + pRename->nList*nQuot + 1);
+ if( zOut ){
+ int nOut = nSql;
+ memcpy(zOut, zSql, nSql);
+ while( pRename->pList ){
+ int iOff; /* Offset of token to replace in zOut */
+ RenameToken *pBest = renameColumnTokenNext(pRename);
+
+ u32 nReplace;
+ const char *zReplace;
+ if( sqlite3IsIdChar(*pBest->t.z) ){
+ nReplace = nNew;
+ zReplace = zNew;
+ }else{
+ nReplace = nQuot;
+ zReplace = zQuot;
+ }
+
+ iOff = pBest->t.z - zSql;
+ if( pBest->t.n!=nReplace ){
+ memmove(&zOut[iOff + nReplace], &zOut[iOff + pBest->t.n],
+ nOut - (iOff + pBest->t.n)
+ );
+ nOut += nReplace - pBest->t.n;
+ zOut[nOut] = '\0';
+ }
+ memcpy(&zOut[iOff], zReplace, nReplace);
+ sqlite3DbFree(db, pBest);
+ }
+
+ sqlite3_result_text(pCtx, zOut, -1, SQLITE_TRANSIENT);
+ sqlite3DbFree(db, zOut);
+ }else{
+ rc = SQLITE_NOMEM;
+ }
+
+ sqlite3_free(zQuot);
+ return rc;
+}
+
+/*
+** Resolve all symbols in the trigger at pParse->pNewTrigger, assuming
+** it was read from the schema of database zDb. Return SQLITE_OK if
+** successful. Otherwise, return an SQLite error code and leave an error
+** message in the Parse object.
+*/
+static int renameResolveTrigger(Parse *pParse, const char *zDb){
+ sqlite3 *db = pParse->db;
+ Trigger *pNew = pParse->pNewTrigger;
+ TriggerStep *pStep;
+ NameContext sNC;
+ int rc = SQLITE_OK;
+
+ memset(&sNC, 0, sizeof(sNC));
+ sNC.pParse = pParse;
+ assert( pNew->pTabSchema );
+ pParse->pTriggerTab = sqlite3FindTable(db, pNew->table,
+ db->aDb[sqlite3SchemaToIndex(db, pNew->pTabSchema)].zDbSName
+ );
+ pParse->eTriggerOp = pNew->op;
+ /* ALWAYS() because if the table of the trigger does not exist, the
+ ** error would have been hit before this point */
+ if( ALWAYS(pParse->pTriggerTab) ){
+ rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab);
+ }
+
+ /* Resolve symbols in WHEN clause */
+ if( rc==SQLITE_OK && pNew->pWhen ){
+ rc = sqlite3ResolveExprNames(&sNC, pNew->pWhen);
+ }
+
+ for(pStep=pNew->step_list; rc==SQLITE_OK && pStep; pStep=pStep->pNext){
+ if( pStep->pSelect ){
+ sqlite3SelectPrep(pParse, pStep->pSelect, &sNC);
+ if( pParse->nErr ) rc = pParse->rc;
+ }
+ if( rc==SQLITE_OK && pStep->zTarget ){
+ Table *pTarget = sqlite3LocateTable(pParse, 0, pStep->zTarget, zDb);
+ if( pTarget==0 ){
+ rc = SQLITE_ERROR;
+ }else if( SQLITE_OK==(rc = sqlite3ViewGetColumnNames(pParse, pTarget)) ){
+ SrcList sSrc;
+ memset(&sSrc, 0, sizeof(sSrc));
+ sSrc.nSrc = 1;
+ sSrc.a[0].zName = pStep->zTarget;
+ sSrc.a[0].pTab = pTarget;
+ sNC.pSrcList = &sSrc;
+ if( pStep->pWhere ){
+ rc = sqlite3ResolveExprNames(&sNC, pStep->pWhere);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sqlite3ResolveExprListNames(&sNC, pStep->pExprList);
+ }
+ assert( !pStep->pUpsert || (!pStep->pWhere && !pStep->pExprList) );
+ if( pStep->pUpsert ){
+ Upsert *pUpsert = pStep->pUpsert;
+ assert( rc==SQLITE_OK );
+ pUpsert->pUpsertSrc = &sSrc;
+ sNC.uNC.pUpsert = pUpsert;
+ sNC.ncFlags = NC_UUpsert;
+ rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget);
+ if( rc==SQLITE_OK ){
+ ExprList *pUpsertSet = pUpsert->pUpsertSet;
+ rc = sqlite3ResolveExprListNames(&sNC, pUpsertSet);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertWhere);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere);
+ }
+ sNC.ncFlags = 0;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+/*
+** Invoke sqlite3WalkExpr() or sqlite3WalkSelect() on all Select or Expr
+** objects that are part of the trigger passed as the second argument.
+*/
+static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){
+ TriggerStep *pStep;
+
+ /* Find tokens to edit in WHEN clause */
+ sqlite3WalkExpr(pWalker, pTrigger->pWhen);
+
+ /* Find tokens to edit in trigger steps */
+ for(pStep=pTrigger->step_list; pStep; pStep=pStep->pNext){
+ sqlite3WalkSelect(pWalker, pStep->pSelect);
+ sqlite3WalkExpr(pWalker, pStep->pWhere);
+ sqlite3WalkExprList(pWalker, pStep->pExprList);
+ if( pStep->pUpsert ){
+ Upsert *pUpsert = pStep->pUpsert;
+ sqlite3WalkExprList(pWalker, pUpsert->pUpsertTarget);
+ sqlite3WalkExprList(pWalker, pUpsert->pUpsertSet);
+ sqlite3WalkExpr(pWalker, pUpsert->pUpsertWhere);
+ sqlite3WalkExpr(pWalker, pUpsert->pUpsertTargetWhere);
+ }
+ }
+}
+
+/*
+** Free the contents of Parse object (*pParse). Do not free the memory
+** occupied by the Parse object itself.
+*/
+static void renameParseCleanup(Parse *pParse){
+ sqlite3 *db = pParse->db;
+ if( pParse->pVdbe ){
+ sqlite3VdbeFinalize(pParse->pVdbe);
+ }
+ sqlite3DeleteTable(db, pParse->pNewTable);
+ if( pParse->pNewIndex ) sqlite3FreeIndex(db, pParse->pNewIndex);
+ sqlite3DeleteTrigger(db, pParse->pNewTrigger);
+ sqlite3DbFree(db, pParse->zErrMsg);
+ renameTokenFree(db, pParse->pRename);
+ sqlite3ParserReset(pParse);
+}
+
+/*
+** SQL function:
+**
+** sqlite_rename_column(zSql, iCol, bQuote, zNew, zTable, zOld)
+**
+** 0. zSql: SQL statement to rewrite
+** 1. type: Type of object ("table", "view" etc.)
+** 2. object: Name of object
+** 3. Database: Database name (e.g. "main")
+** 4. Table: Table name
+** 5. iCol: Index of column to rename
+** 6. zNew: New column name
+** 7. bQuote: Non-zero if the new column name should be quoted.
+** 8. bTemp: True if zSql comes from temp schema
+**
+** Do a column rename operation on the CREATE statement given in zSql.
+** The iCol-th column (left-most is 0) of table zTable is renamed from zCol
+** into zNew. The name should be quoted if bQuote is true.
+**
+** This function is used internally by the ALTER TABLE RENAME COLUMN command.
+** It is only accessible to SQL created using sqlite3NestedParse(). It is
+** not reachable from ordinary SQL passed into sqlite3_prepare().
+*/
+static void renameColumnFunc(
+ sqlite3_context *context,
+ int NotUsed,
+ sqlite3_value **argv
+){
+ sqlite3 *db = sqlite3_context_db_handle(context);
+ RenameCtx sCtx;
+ const char *zSql = (const char*)sqlite3_value_text(argv[0]);
+ const char *zDb = (const char*)sqlite3_value_text(argv[3]);
+ const char *zTable = (const char*)sqlite3_value_text(argv[4]);
+ int iCol = sqlite3_value_int(argv[5]);
+ const char *zNew = (const char*)sqlite3_value_text(argv[6]);
+ int bQuote = sqlite3_value_int(argv[7]);
+ int bTemp = sqlite3_value_int(argv[8]);
+ const char *zOld;
+ int rc;
+ Parse sParse;
+ Walker sWalker;
+ Index *pIdx;
+ int i;
+ Table *pTab;
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ sqlite3_xauth xAuth = db->xAuth;
+#endif
+
+ UNUSED_PARAMETER(NotUsed);
+ if( zSql==0 ) return;
+ if( zTable==0 ) return;
+ if( zNew==0 ) return;
+ if( iCol<0 ) return;
+ sqlite3BtreeEnterAll(db);
+ pTab = sqlite3FindTable(db, zTable, zDb);
+ if( pTab==0 || iCol>=pTab->nCol ){
+ sqlite3BtreeLeaveAll(db);
+ return;
+ }
+ zOld = pTab->aCol[iCol].zName;
+ memset(&sCtx, 0, sizeof(sCtx));
+ sCtx.iCol = ((iCol==pTab->iPKey) ? -1 : iCol);
+
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ db->xAuth = 0;
+#endif
+ rc = renameParseSql(&sParse, zDb, 0, db, zSql, bTemp);
+
+ /* Find tokens that need to be replaced. */
+ memset(&sWalker, 0, sizeof(Walker));
+ sWalker.pParse = &sParse;
+ sWalker.xExprCallback = renameColumnExprCb;
+ sWalker.xSelectCallback = renameColumnSelectCb;
+ sWalker.u.pRename = &sCtx;
+
+ sCtx.pTab = pTab;
+ if( rc!=SQLITE_OK ) goto renameColumnFunc_done;
+ if( sParse.pNewTable ){
+ Select *pSelect = sParse.pNewTable->pSelect;
+ if( pSelect ){
+ sParse.rc = SQLITE_OK;
+ sqlite3SelectPrep(&sParse, sParse.pNewTable->pSelect, 0);
+ rc = (db->mallocFailed ? SQLITE_NOMEM : sParse.rc);
+ if( rc==SQLITE_OK ){
+ sqlite3WalkSelect(&sWalker, pSelect);
+ }
+ if( rc!=SQLITE_OK ) goto renameColumnFunc_done;
+ }else{
+ /* A regular table */
+ int bFKOnly = sqlite3_stricmp(zTable, sParse.pNewTable->zName);
+ FKey *pFKey;
+ assert( sParse.pNewTable->pSelect==0 );
+ sCtx.pTab = sParse.pNewTable;
+ if( bFKOnly==0 ){
+ renameTokenFind(
+ &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zName
+ );
+ if( sCtx.iCol<0 ){
+ renameTokenFind(&sParse, &sCtx, (void*)&sParse.pNewTable->iPKey);
+ }
+ sqlite3WalkExprList(&sWalker, sParse.pNewTable->pCheck);
+ for(pIdx=sParse.pNewTable->pIndex; pIdx; pIdx=pIdx->pNext){
+ sqlite3WalkExprList(&sWalker, pIdx->aColExpr);
+ }
+ }
+
+ for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){
+ for(i=0; i<pFKey->nCol; i++){
+ if( bFKOnly==0 && pFKey->aCol[i].iFrom==iCol ){
+ renameTokenFind(&sParse, &sCtx, (void*)&pFKey->aCol[i]);
+ }
+ if( 0==sqlite3_stricmp(pFKey->zTo, zTable)
+ && 0==sqlite3_stricmp(pFKey->aCol[i].zCol, zOld)
+ ){
+ renameTokenFind(&sParse, &sCtx, (void*)pFKey->aCol[i].zCol);
+ }
+ }
+ }
+ }
+ }else if( sParse.pNewIndex ){
+ sqlite3WalkExprList(&sWalker, sParse.pNewIndex->aColExpr);
+ sqlite3WalkExpr(&sWalker, sParse.pNewIndex->pPartIdxWhere);
+ }else{
+ /* A trigger */
+ TriggerStep *pStep;
+ rc = renameResolveTrigger(&sParse, (bTemp ? 0 : zDb));
+ if( rc!=SQLITE_OK ) goto renameColumnFunc_done;
+
+ for(pStep=sParse.pNewTrigger->step_list; pStep; pStep=pStep->pNext){
+ if( pStep->zTarget ){
+ Table *pTarget = sqlite3LocateTable(&sParse, 0, pStep->zTarget, zDb);
+ if( pTarget==pTab ){
+ if( pStep->pUpsert ){
+ ExprList *pUpsertSet = pStep->pUpsert->pUpsertSet;
+ renameColumnElistNames(&sParse, &sCtx, pUpsertSet, zOld);
+ }
+ renameColumnIdlistNames(&sParse, &sCtx, pStep->pIdList, zOld);
+ renameColumnElistNames(&sParse, &sCtx, pStep->pExprList, zOld);
+ }
+ }
+ }
+
+
+ /* Find tokens to edit in UPDATE OF clause */
+ if( sParse.pTriggerTab==pTab ){
+ renameColumnIdlistNames(&sParse, &sCtx,sParse.pNewTrigger->pColumns,zOld);
+ }
+
+ /* Find tokens to edit in various expressions and selects */
+ renameWalkTrigger(&sWalker, sParse.pNewTrigger);
+ }
+
+ assert( rc==SQLITE_OK );
+ rc = renameEditSql(context, &sCtx, zSql, zNew, bQuote);
+
+renameColumnFunc_done:
+ if( rc!=SQLITE_OK ){
+ if( sParse.zErrMsg ){
+ renameColumnParseError(context, 0, argv[1], argv[2], &sParse);
+ }else{
+ sqlite3_result_error_code(context, rc);
+ }
+ }
+
+ renameParseCleanup(&sParse);
+ renameTokenFree(db, sCtx.pList);
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ db->xAuth = xAuth;
+#endif
+ sqlite3BtreeLeaveAll(db);
+}
+
+/*
+** Walker expression callback used by "RENAME TABLE".
+*/
+static int renameTableExprCb(Walker *pWalker, Expr *pExpr){
+ RenameCtx *p = pWalker->u.pRename;
+ if( pExpr->op==TK_COLUMN && p->pTab==pExpr->y.pTab ){
+ renameTokenFind(pWalker->pParse, p, (void*)&pExpr->y.pTab);
+ }
+ return WRC_Continue;
+}
+
+/*
+** Walker select callback used by "RENAME TABLE".
+*/
+static int renameTableSelectCb(Walker *pWalker, Select *pSelect){
+ int i;
+ RenameCtx *p = pWalker->u.pRename;
+ SrcList *pSrc = pSelect->pSrc;
+ for(i=0; i<pSrc->nSrc; i++){
+ struct SrcList_item *pItem = &pSrc->a[i];
+ if( pItem->pTab==p->pTab ){
+ renameTokenFind(pWalker->pParse, p, pItem->zName);
+ }
+ }
+
+ return WRC_Continue;
+}
+
+
+/*
+** This C function implements an SQL user function that is used by SQL code
+** generated by the ALTER TABLE ... RENAME command to modify the definition
+** of any foreign key constraints that use the table being renamed as the
+** parent table. It is passed three arguments:
+**
+** 0: The database containing the table being renamed.
+** 1. type: Type of object ("table", "view" etc.)
+** 2. object: Name of object
+** 3: The complete text of the schema statement being modified,
+** 4: The old name of the table being renamed, and
+** 5: The new name of the table being renamed.
+** 6: True if the schema statement comes from the temp db.
+**
+** It returns the new schema statement. For example:
+**
+** sqlite_rename_table('main', 'CREATE TABLE t1(a REFERENCES t2)','t2','t3',0)
+** -> 'CREATE TABLE t1(a REFERENCES t3)'
+*/
+static void renameTableFunc(
+ sqlite3_context *context,
+ int NotUsed,
+ sqlite3_value **argv
+){
+ sqlite3 *db = sqlite3_context_db_handle(context);
+ const char *zDb = (const char*)sqlite3_value_text(argv[0]);
+ const char *zInput = (const char*)sqlite3_value_text(argv[3]);
+ const char *zOld = (const char*)sqlite3_value_text(argv[4]);
+ const char *zNew = (const char*)sqlite3_value_text(argv[5]);
+ int bTemp = sqlite3_value_int(argv[6]);
+ UNUSED_PARAMETER(NotUsed);
+
+ if( zInput && zOld && zNew ){
+ Parse sParse;
+ int rc;
+ int bQuote = 1;
+ RenameCtx sCtx;
+ Walker sWalker;
+
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ sqlite3_xauth xAuth = db->xAuth;
+ db->xAuth = 0;
+#endif
+
+ sqlite3BtreeEnterAll(db);
+
+ memset(&sCtx, 0, sizeof(RenameCtx));
+ sCtx.pTab = sqlite3FindTable(db, zOld, zDb);
+ memset(&sWalker, 0, sizeof(Walker));
+ sWalker.pParse = &sParse;
+ sWalker.xExprCallback = renameTableExprCb;
+ sWalker.xSelectCallback = renameTableSelectCb;
+ sWalker.u.pRename = &sCtx;
+
+ rc = renameParseSql(&sParse, zDb, 1, db, zInput, bTemp);
+
+ if( rc==SQLITE_OK ){
+ int isLegacy = (db->flags & SQLITE_LegacyAlter);
+ if( sParse.pNewTable ){
+ Table *pTab = sParse.pNewTable;
+
+ if( pTab->pSelect ){
+ if( isLegacy==0 ){
+ NameContext sNC;
+ memset(&sNC, 0, sizeof(sNC));
+ sNC.pParse = &sParse;
+
+ sqlite3SelectPrep(&sParse, pTab->pSelect, &sNC);
+ if( sParse.nErr ) rc = sParse.rc;
+ sqlite3WalkSelect(&sWalker, pTab->pSelect);
+ }
+ }else{
+ /* Modify any FK definitions to point to the new table. */
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+ if( isLegacy==0 || (db->flags & SQLITE_ForeignKeys) ){
+ FKey *pFKey;
+ for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){
+ if( sqlite3_stricmp(pFKey->zTo, zOld)==0 ){
+ renameTokenFind(&sParse, &sCtx, (void*)pFKey->zTo);
+ }
+ }
+ }
+#endif
+
+ /* If this is the table being altered, fix any table refs in CHECK
+ ** expressions. Also update the name that appears right after the
+ ** "CREATE [VIRTUAL] TABLE" bit. */
+ if( sqlite3_stricmp(zOld, pTab->zName)==0 ){
+ sCtx.pTab = pTab;
+ if( isLegacy==0 ){
+ sqlite3WalkExprList(&sWalker, pTab->pCheck);
+ }
+ renameTokenFind(&sParse, &sCtx, pTab->zName);
+ }
+ }
+ }
+
+ else if( sParse.pNewIndex ){
+ renameTokenFind(&sParse, &sCtx, sParse.pNewIndex->zName);
+ if( isLegacy==0 ){
+ sqlite3WalkExpr(&sWalker, sParse.pNewIndex->pPartIdxWhere);
+ }
+ }
+
+#ifndef SQLITE_OMIT_TRIGGER
+ else{
+ Trigger *pTrigger = sParse.pNewTrigger;
+ TriggerStep *pStep;
+ if( 0==sqlite3_stricmp(sParse.pNewTrigger->table, zOld)
+ && sCtx.pTab->pSchema==pTrigger->pTabSchema
+ ){
+ renameTokenFind(&sParse, &sCtx, sParse.pNewTrigger->table);
+ }
+
+ if( isLegacy==0 ){
+ rc = renameResolveTrigger(&sParse, bTemp ? 0 : zDb);
+ if( rc==SQLITE_OK ){
+ renameWalkTrigger(&sWalker, pTrigger);
+ for(pStep=pTrigger->step_list; pStep; pStep=pStep->pNext){
+ if( pStep->zTarget && 0==sqlite3_stricmp(pStep->zTarget, zOld) ){
+ renameTokenFind(&sParse, &sCtx, pStep->zTarget);
+ }
+ }
+ }
+ }
+ }
+#endif
+ }
+
+ if( rc==SQLITE_OK ){
+ rc = renameEditSql(context, &sCtx, zInput, zNew, bQuote);
+ }
+ if( rc!=SQLITE_OK ){
+ if( sParse.zErrMsg ){
+ renameColumnParseError(context, 0, argv[1], argv[2], &sParse);
+ }else{
+ sqlite3_result_error_code(context, rc);
+ }
+ }
+
+ renameParseCleanup(&sParse);
+ renameTokenFree(db, sCtx.pList);
+ sqlite3BtreeLeaveAll(db);
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ db->xAuth = xAuth;
+#endif
+ }
+
+ return;
+}
+
+/*
+** An SQL user function that checks that there are no parse or symbol
+** resolution problems in a CREATE TRIGGER|TABLE|VIEW|INDEX statement.
+** After an ALTER TABLE .. RENAME operation is performed and the schema
+** reloaded, this function is called on each SQL statement in the schema
+** to ensure that it is still usable.
+**
+** 0: Database name ("main", "temp" etc.).
+** 1: SQL statement.
+** 2: Object type ("view", "table", "trigger" or "index").
+** 3: Object name.
+** 4: True if object is from temp schema.
+**
+** Unless it finds an error, this function normally returns NULL. However, it
+** returns integer value 1 if:
+**
+** * the SQL argument creates a trigger, and
+** * the table that the trigger is attached to is in database zDb.
+*/
+static void renameTableTest(
+ sqlite3_context *context,
+ int NotUsed,
+ sqlite3_value **argv
+){
+ sqlite3 *db = sqlite3_context_db_handle(context);
+ char const *zDb = (const char*)sqlite3_value_text(argv[0]);
+ char const *zInput = (const char*)sqlite3_value_text(argv[1]);
+ int bTemp = sqlite3_value_int(argv[4]);
+ int isLegacy = (db->flags & SQLITE_LegacyAlter);
+
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ sqlite3_xauth xAuth = db->xAuth;
+ db->xAuth = 0;
+#endif
+
+ UNUSED_PARAMETER(NotUsed);
+ if( zDb && zInput ){
+ int rc;
+ Parse sParse;
+ rc = renameParseSql(&sParse, zDb, 1, db, zInput, bTemp);
+ if( rc==SQLITE_OK ){
+ if( isLegacy==0 && sParse.pNewTable && sParse.pNewTable->pSelect ){
+ NameContext sNC;
+ memset(&sNC, 0, sizeof(sNC));
+ sNC.pParse = &sParse;
+ sqlite3SelectPrep(&sParse, sParse.pNewTable->pSelect, &sNC);
+ if( sParse.nErr ) rc = sParse.rc;
+ }
+
+ else if( sParse.pNewTrigger ){
+ if( isLegacy==0 ){
+ rc = renameResolveTrigger(&sParse, bTemp ? 0 : zDb);
+ }
+ if( rc==SQLITE_OK ){
+ int i1 = sqlite3SchemaToIndex(db, sParse.pNewTrigger->pTabSchema);
+ int i2 = sqlite3FindDbName(db, zDb);
+ if( i1==i2 ) sqlite3_result_int(context, 1);
+ }
+ }
+ }
+
+ if( rc!=SQLITE_OK ){
+ renameColumnParseError(context, 1, argv[2], argv[3], &sParse);
+ }
+ renameParseCleanup(&sParse);
+ }
+
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ db->xAuth = xAuth;
+#endif
+}
+
+/*
+** Register built-in functions used to help implement ALTER TABLE
+*/
+SQLITE_PRIVATE void sqlite3AlterFunctions(void){
+ static FuncDef aAlterTableFuncs[] = {
+ INTERNAL_FUNCTION(sqlite_rename_column, 9, renameColumnFunc),
+ INTERNAL_FUNCTION(sqlite_rename_table, 7, renameTableFunc),
+ INTERNAL_FUNCTION(sqlite_rename_test, 5, renameTableTest),
+ };
+ sqlite3InsertBuiltinFuncs(aAlterTableFuncs, ArraySize(aAlterTableFuncs));
+}
#endif /* SQLITE_ALTER_TABLE */
/************** End of alter.c ***********************************************/
@@ -98166,6 +103313,10 @@ static void openStatTable(
"DELETE FROM %Q.%s WHERE %s=%Q",
pDb->zDbSName, zTab, zWhereType, zWhere
);
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ }else if( db->xPreUpdateCallback ){
+ sqlite3NestedParse(pParse, "DELETE FROM %Q.%s", pDb->zDbSName, zTab);
+#endif
}else{
/* The sqlite_stat[134] table already exists. Delete all rows. */
sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb);
@@ -98413,6 +103564,7 @@ static const FuncDef statInitFuncdef = {
0, /* pNext */
statInit, /* xSFunc */
0, /* xFinalize */
+ 0, 0, /* xValue, xInverse */
"stat_init", /* zName */
{0}
};
@@ -98729,6 +103881,7 @@ static const FuncDef statPushFuncdef = {
0, /* pNext */
statPush, /* xSFunc */
0, /* xFinalize */
+ 0, 0, /* xValue, xInverse */
"stat_push", /* zName */
{0}
};
@@ -98880,6 +104033,7 @@ static const FuncDef statGetFuncdef = {
0, /* pNext */
statGet, /* xSFunc */
0, /* xFinalize */
+ 0, 0, /* xValue, xInverse */
"stat_get", /* zName */
{0}
};
@@ -98930,6 +104084,9 @@ static void analyzeOneTable(
int regIdxname = iMem++; /* Register containing index name */
int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */
int regPrev = iMem; /* MUST BE LAST (see below) */
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ Table *pStat1 = 0;
+#endif
pParse->nMem = MAX(pParse->nMem, iMem);
v = sqlite3GetVdbe(pParse);
@@ -98940,7 +104097,7 @@ static void analyzeOneTable(
/* Do not gather statistics on views or virtual tables */
return;
}
- if( sqlite3_strlike("sqlite_%", pTab->zName, 0)==0 ){
+ if( sqlite3_strlike("sqlite\\_%", pTab->zName, '\\')==0 ){
/* Do not gather statistics on system tables */
return;
}
@@ -98955,6 +104112,18 @@ static void analyzeOneTable(
}
#endif
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ if( db->xPreUpdateCallback ){
+ pStat1 = (Table*)sqlite3DbMallocZero(db, sizeof(Table) + 13);
+ if( pStat1==0 ) return;
+ pStat1->zName = (char*)&pStat1[1];
+ memcpy(pStat1->zName, "sqlite_stat1", 13);
+ pStat1->nCol = 3;
+ pStat1->iPKey = -1;
+ sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNBLOB);
+ }
+#endif
+
/* Establish a read-lock on the table at the shared-cache level.
** Open a read-only cursor on the table. Also allocate a cursor number
** to use for scanning indexes (iIdxCur). No index cursor is opened at
@@ -99156,6 +104325,9 @@ static void analyzeOneTable(
sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0);
sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid);
sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid);
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE);
+#endif
sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
/* Add the entries to the stat3 or stat4 table. */
@@ -99181,10 +104353,7 @@ static void analyzeOneTable(
callStatGet(v, regStat4, STAT_GET_NLT, regLt);
callStatGet(v, regStat4, STAT_GET_NDLT, regDLt);
sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0);
- /* We know that the regSampleRowid row exists because it was read by
- ** the previous loop. Thus the not-found jump of seekOp will never
- ** be taken */
- VdbeCoverageNeverTaken(v);
+ VdbeCoverage(v);
#ifdef SQLITE_ENABLE_STAT3
sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, 0, regSample);
#else
@@ -99219,6 +104388,9 @@ static void analyzeOneTable(
sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid);
sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid);
sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE);
+#endif
sqlite3VdbeJumpHere(v, jZeroRows);
}
}
@@ -99821,7 +104993,7 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
/* Load the statistics from the sqlite_stat4 table. */
#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
- if( rc==SQLITE_OK && OptimizationEnabled(db, SQLITE_Stat34) ){
+ if( rc==SQLITE_OK ){
db->lookaside.bDisable++;
rc = loadStat4(db, sInfo.zDatabase);
db->lookaside.bDisable--;
@@ -99901,6 +105073,10 @@ static int resolveAttachExpr(NameContext *pName, Expr *pExpr)
**
** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the
** third argument.
+**
+** If the db->init.reopenMemdb flags is set, then instead of attaching a
+** new database, close the database on db->init.iDb and reopen it as an
+** empty MemDB.
*/
static void attachFunc(
sqlite3_context *context,
@@ -99921,66 +105097,86 @@ static void attachFunc(
sqlite3_vfs *pVfs;
UNUSED_PARAMETER(NotUsed);
-
zFile = (const char *)sqlite3_value_text(argv[0]);
zName = (const char *)sqlite3_value_text(argv[1]);
if( zFile==0 ) zFile = "";
if( zName==0 ) zName = "";
- /* Check for the following errors:
- **
- ** * Too many attached databases,
- ** * Transaction currently open
- ** * Specified database name already being used.
- */
- if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){
- zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d",
- db->aLimit[SQLITE_LIMIT_ATTACHED]
- );
- goto attach_error;
- }
- for(i=0; i<db->nDb; i++){
- char *z = db->aDb[i].zDbSName;
- assert( z && zName );
- if( sqlite3StrICmp(z, zName)==0 ){
- zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName);
+#ifdef SQLITE_ENABLE_DESERIALIZE
+# define REOPEN_AS_MEMDB(db) (db->init.reopenMemdb)
+#else
+# define REOPEN_AS_MEMDB(db) (0)
+#endif
+
+ if( REOPEN_AS_MEMDB(db) ){
+ /* This is not a real ATTACH. Instead, this routine is being called
+ ** from sqlite3_deserialize() to close database db->init.iDb and
+ ** reopen it as a MemDB */
+ pVfs = sqlite3_vfs_find("memdb");
+ if( pVfs==0 ) return;
+ pNew = &db->aDb[db->init.iDb];
+ if( pNew->pBt ) sqlite3BtreeClose(pNew->pBt);
+ pNew->pBt = 0;
+ pNew->pSchema = 0;
+ rc = sqlite3BtreeOpen(pVfs, "x\0", db, &pNew->pBt, 0, SQLITE_OPEN_MAIN_DB);
+ }else{
+ /* This is a real ATTACH
+ **
+ ** Check for the following errors:
+ **
+ ** * Too many attached databases,
+ ** * Transaction currently open
+ ** * Specified database name already being used.
+ */
+ if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){
+ zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d",
+ db->aLimit[SQLITE_LIMIT_ATTACHED]
+ );
goto attach_error;
}
+ for(i=0; i<db->nDb; i++){
+ char *z = db->aDb[i].zDbSName;
+ assert( z && zName );
+ if( sqlite3StrICmp(z, zName)==0 ){
+ zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName);
+ goto attach_error;
+ }
+ }
+
+ /* Allocate the new entry in the db->aDb[] array and initialize the schema
+ ** hash tables.
+ */
+ if( db->aDb==db->aDbStatic ){
+ aNew = sqlite3DbMallocRawNN(db, sizeof(db->aDb[0])*3 );
+ if( aNew==0 ) return;
+ memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);
+ }else{
+ aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );
+ if( aNew==0 ) return;
+ }
+ db->aDb = aNew;
+ pNew = &db->aDb[db->nDb];
+ memset(pNew, 0, sizeof(*pNew));
+
+ /* Open the database file. If the btree is successfully opened, use
+ ** it to obtain the database schema. At this point the schema may
+ ** or may not be initialized.
+ */
+ flags = db->openFlags;
+ rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr);
+ if( rc!=SQLITE_OK ){
+ if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);
+ sqlite3_result_error(context, zErr, -1);
+ sqlite3_free(zErr);
+ return;
+ }
+ assert( pVfs );
+ flags |= SQLITE_OPEN_MAIN_DB;
+ rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags);
+ sqlite3_free( zPath );
+ db->nDb++;
}
-
- /* Allocate the new entry in the db->aDb[] array and initialize the schema
- ** hash tables.
- */
- if( db->aDb==db->aDbStatic ){
- aNew = sqlite3DbMallocRawNN(db, sizeof(db->aDb[0])*3 );
- if( aNew==0 ) return;
- memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);
- }else{
- aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );
- if( aNew==0 ) return;
- }
- db->aDb = aNew;
- pNew = &db->aDb[db->nDb];
- memset(pNew, 0, sizeof(*pNew));
-
- /* Open the database file. If the btree is successfully opened, use
- ** it to obtain the database schema. At this point the schema may
- ** or may not be initialized.
- */
- flags = db->openFlags;
- rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr);
- if( rc!=SQLITE_OK ){
- if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);
- sqlite3_result_error(context, zErr, -1);
- sqlite3_free(zErr);
- return;
- }
- assert( pVfs );
- flags |= SQLITE_OPEN_MAIN_DB;
- rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags);
- sqlite3_free( zPath );
- db->nDb++;
- db->skipBtreeMutex = 0;
+ db->noSharedCache = 0;
if( rc==SQLITE_CONSTRAINT ){
rc = SQLITE_ERROR;
zErrDyn = sqlite3MPrintf(db, "database is already attached");
@@ -100006,7 +105202,7 @@ static void attachFunc(
sqlite3BtreeLeave(pNew->pBt);
}
pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1;
- pNew->zDbSName = sqlite3DbStrDup(db, zName);
+ if( !REOPEN_AS_MEMDB(db) ) pNew->zDbSName = sqlite3DbStrDup(db, zName);
if( rc==SQLITE_OK && pNew->zDbSName==0 ){
rc = SQLITE_NOMEM_BKPT;
}
@@ -100046,13 +105242,16 @@ static void attachFunc(
/* 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
- ** remove the entry from the db->aDb[] array. i.e. put everything back the way
- ** we found it.
+ ** remove the entry from the db->aDb[] array. i.e. put everything back the
+ ** way we found it.
*/
if( rc==SQLITE_OK ){
sqlite3BtreeEnterAll(db);
+ db->init.iDb = 0;
+ db->mDbFlags &= ~(DBFLAG_SchemaKnownOk);
rc = sqlite3Init(db, &zErrDyn);
sqlite3BtreeLeaveAll(db);
+ assert( zErrDyn==0 || rc!=SQLITE_OK );
}
#ifdef SQLITE_USER_AUTHENTICATION
if( rc==SQLITE_OK ){
@@ -100064,21 +105263,23 @@ static void attachFunc(
}
#endif
if( rc ){
- int iDb = db->nDb - 1;
- assert( iDb>=2 );
- if( db->aDb[iDb].pBt ){
- sqlite3BtreeClose(db->aDb[iDb].pBt);
- db->aDb[iDb].pBt = 0;
- db->aDb[iDb].pSchema = 0;
- }
- sqlite3ResetAllSchemasOfConnection(db);
- db->nDb = iDb;
- if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
- sqlite3OomFault(db);
- sqlite3DbFree(db, zErrDyn);
- zErrDyn = sqlite3MPrintf(db, "out of memory");
- }else if( zErrDyn==0 ){
- zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile);
+ if( !REOPEN_AS_MEMDB(db) ){
+ int iDb = db->nDb - 1;
+ assert( iDb>=2 );
+ if( db->aDb[iDb].pBt ){
+ sqlite3BtreeClose(db->aDb[iDb].pBt);
+ db->aDb[iDb].pBt = 0;
+ db->aDb[iDb].pSchema = 0;
+ }
+ sqlite3ResetAllSchemasOfConnection(db);
+ db->nDb = iDb;
+ if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
+ sqlite3OomFault(db);
+ sqlite3DbFree(db, zErrDyn);
+ zErrDyn = sqlite3MPrintf(db, "out of memory");
+ }else if( zErrDyn==0 ){
+ zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile);
+ }
}
goto attach_error;
}
@@ -100231,6 +105432,7 @@ SQLITE_PRIVATE void sqlite3Detach(Parse *pParse, Expr *pDbname){
0, /* pNext */
detachFunc, /* xSFunc */
0, /* xFinalize */
+ 0, 0, /* xValue, xInverse */
"sqlite_detach", /* zName */
{0}
};
@@ -100250,6 +105452,7 @@ SQLITE_PRIVATE void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *p
0, /* pNext */
attachFunc, /* xSFunc */
0, /* xFinalize */
+ 0, 0, /* xValue, xInverse */
"sqlite_attach", /* zName */
{0}
};
@@ -100320,6 +105523,9 @@ SQLITE_PRIVATE int sqlite3FixSrcList(
if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1;
if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1;
#endif
+ if( pItem->fg.isTabFunc && sqlite3FixExprList(pFix, pItem->u1.pFuncArg) ){
+ return 1;
+ }
}
return 0;
}
@@ -100350,8 +105556,13 @@ SQLITE_PRIVATE int sqlite3FixSelect(
if( sqlite3FixExpr(pFix, pSelect->pLimit) ){
return 1;
}
- if( sqlite3FixExpr(pFix, pSelect->pOffset) ){
- return 1;
+ if( pSelect->pWith ){
+ int i;
+ for(i=0; i<pSelect->pWith->nCte; i++){
+ if( sqlite3FixSelect(pFix, pSelect->pWith->a[i].pSelect) ){
+ return 1;
+ }
+ }
}
pSelect = pSelect->pPrior;
}
@@ -100414,6 +105625,18 @@ SQLITE_PRIVATE int sqlite3FixTriggerStep(
if( sqlite3FixExprList(pFix, pStep->pExprList) ){
return 1;
}
+#ifndef SQLITE_OMIT_UPSERT
+ if( pStep->pUpsert ){
+ Upsert *pUp = pStep->pUpsert;
+ if( sqlite3FixExprList(pFix, pUp->pUpsertTarget)
+ || sqlite3FixExpr(pFix, pUp->pUpsertTargetWhere)
+ || sqlite3FixExprList(pFix, pUp->pUpsertSet)
+ || sqlite3FixExpr(pFix, pUp->pUpsertWhere)
+ ){
+ return 1;
+ }
+ }
+#endif
pStep = pStep->pNext;
}
return 0;
@@ -100502,7 +105725,7 @@ SQLITE_API int sqlite3_set_authorizer(
sqlite3_mutex_enter(db->mutex);
db->xAuth = (sqlite3_xauth)xAuth;
db->pAuthArg = pArg;
- sqlite3ExpirePreparedStatements(db);
+ sqlite3ExpirePreparedStatements(db, 0);
sqlite3_mutex_leave(db->mutex);
return SQLITE_OK;
}
@@ -100574,6 +105797,8 @@ SQLITE_PRIVATE void sqlite3AuthRead(
int iDb; /* The index of the database the expression refers to */
int iCol; /* Index of column in table */
+ assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER );
+ assert( !IN_RENAME_OBJECT || db->xAuth==0 );
if( db->xAuth==0 ) return;
iDb = sqlite3SchemaToIndex(pParse->db, pSchema);
if( iDb<0 ){
@@ -100582,7 +105807,6 @@ SQLITE_PRIVATE void sqlite3AuthRead(
return;
}
- assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER );
if( pExpr->op==TK_TRIGGER ){
pTab = pParse->pTriggerTab;
}else{
@@ -100631,7 +105855,8 @@ SQLITE_PRIVATE int sqlite3AuthCheck(
/* Don't do any authorization checks if the database is initialising
** or if the parser is being invoked from within sqlite3_declare_vtab.
*/
- if( db->init.busy || IN_DECLARE_VTAB ){
+ assert( !IN_RENAME_OBJECT || db->xAuth==0 );
+ if( db->init.busy || IN_SPECIAL_PARSE ){
return SQLITE_OK;
}
@@ -100923,7 +106148,6 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){
/* Get the VDBE program ready for execution
*/
if( v && pParse->nErr==0 && !db->mallocFailed ){
- assert( pParse->iCacheLevel==0 ); /* Disables and re-enables match */
/* A minimum of one cursor is required if autoincrement is used
* See ticket [a696379c1f08866] */
if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1;
@@ -101041,28 +106265,29 @@ SQLITE_PRIVATE Table *sqlite3LocateTable(
const char *zDbase /* Name of the database. Might be NULL */
){
Table *p;
+ sqlite3 *db = pParse->db;
/* Read the database schema. If an error occurs, leave an error message
** and code in pParse and return NULL. */
- if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
+ if( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0
+ && SQLITE_OK!=sqlite3ReadSchema(pParse)
+ ){
return 0;
}
- p = sqlite3FindTable(pParse->db, zName, zDbase);
+ 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( sqlite3FindDbName(pParse->db, zDbase)<1 ){
- /* 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(&pParse->db->aModule, zName);
- if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){
- pMod = sqlite3PragmaVtabRegister(pParse->db, zName);
- }
- if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){
- return pMod->pEpoTab;
- }
+ /* 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;
}
#endif
if( (flags & LOCATE_NOERR)==0 ){
@@ -101135,7 +106360,7 @@ SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const cha
/*
** Reclaim the memory used by an index
*/
-static void freeIndex(sqlite3 *db, Index *p){
+SQLITE_PRIVATE void sqlite3FreeIndex(sqlite3 *db, Index *p){
#ifndef SQLITE_OMIT_ANALYZE
sqlite3DeleteIndexSamples(db, p);
#endif
@@ -101175,7 +106400,7 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char
p->pNext = pIndex->pNext;
}
}
- freeIndex(db, pIndex);
+ sqlite3FreeIndex(db, pIndex);
}
db->mDbFlags |= DBFLAG_SchemaChange;
}
@@ -101223,6 +106448,7 @@ SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
DbSetProperty(db, iDb, DB_ResetWanted);
DbSetProperty(db, 1, DB_ResetWanted);
+ db->mDbFlags &= ~DBFLAG_SchemaKnownOk;
}
if( db->nSchemaLock==0 ){
@@ -101241,17 +106467,22 @@ SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){
SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){
int i;
sqlite3BtreeEnterAll(db);
- assert( db->nSchemaLock==0 );
for(i=0; i<db->nDb; i++){
Db *pDb = &db->aDb[i];
if( pDb->pSchema ){
- sqlite3SchemaClear(pDb->pSchema);
+ if( db->nSchemaLock==0 ){
+ sqlite3SchemaClear(pDb->pSchema);
+ }else{
+ DbSetProperty(db, i, DB_ResetWanted);
+ }
}
}
- db->mDbFlags &= ~DBFLAG_SchemaChange;
+ db->mDbFlags &= ~(DBFLAG_SchemaChange|DBFLAG_SchemaKnownOk);
sqlite3VtabUnlockList(db);
sqlite3BtreeLeaveAll(db);
- sqlite3CollapseDatabaseArray(db);
+ if( db->nSchemaLock==0 ){
+ sqlite3CollapseDatabaseArray(db);
+ }
}
/*
@@ -101320,7 +106551,7 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
assert( pOld==pIndex || pOld==0 );
}
- freeIndex(db, pIndex);
+ sqlite3FreeIndex(db, pIndex);
}
/* Delete any foreign keys attached to this table. */
@@ -101328,6 +106559,12 @@ 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);
@@ -101478,7 +106715,7 @@ SQLITE_PRIVATE int sqlite3TwoPartName(
return -1;
}
}else{
- assert( db->init.iDb==0 || db->init.busy
+ assert( db->init.iDb==0 || db->init.busy || IN_RENAME_OBJECT
|| (db->mDbFlags & DBFLAG_Vacuum)!=0);
iDb = db->init.iDb;
*pUnqual = pName1;
@@ -101487,6 +106724,20 @@ SQLITE_PRIVATE int sqlite3TwoPartName(
}
/*
+** True if PRAGMA writable_schema is ON
+*/
+SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3 *db){
+ testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==0 );
+ testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==
+ SQLITE_WriteSchema );
+ testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==
+ SQLITE_Defensive );
+ testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==
+ (SQLITE_WriteSchema|SQLITE_Defensive) );
+ return (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==SQLITE_WriteSchema;
+}
+
+/*
** This routine is used to check if the UTF-8 string zName is a legal
** unqualified name for a new schema object (table, index, view or
** trigger). All names are legal except those that begin with the string
@@ -101495,7 +106746,7 @@ SQLITE_PRIVATE int sqlite3TwoPartName(
*/
SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *pParse, const char *zName){
if( !pParse->db->init.busy && pParse->nested==0
- && (pParse->db->flags & SQLITE_WriteSchema)==0
+ && sqlite3WritableSchema(pParse->db)==0
&& 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){
sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName);
return SQLITE_ERROR;
@@ -101573,6 +106824,9 @@ SQLITE_PRIVATE void sqlite3StartTable(
}
if( !OMIT_TEMPDB && isTemp ) iDb = 1;
zName = sqlite3NameFromToken(db, pName);
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenMap(pParse, (void*)zName, pName);
+ }
}
pParse->sNameToken = *pName;
if( zName==0 ) return;
@@ -101608,7 +106862,7 @@ SQLITE_PRIVATE void sqlite3StartTable(
** and types will be used, so there is no need to test for namespace
** collisions.
*/
- if( !IN_DECLARE_VTAB ){
+ if( !IN_SPECIAL_PARSE ){
char *zDb = db->aDb[iDb].zDbSName;
if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
goto begin_table_error;
@@ -101767,6 +107021,7 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){
}
z = sqlite3DbMallocRaw(db, pName->n + pType->n + 2);
if( z==0 ) return;
+ if( IN_RENAME_OBJECT ) sqlite3RenameTokenMap(pParse, (void*)z, pName);
memcpy(z, pName->z, pName->n);
z[pName->n] = 0;
sqlite3Dequote(z);
@@ -101793,15 +107048,20 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){
if( pType->n==0 ){
/* If there is no type specified, columns have the default affinity
- ** 'BLOB'. */
+ ** 'BLOB' with a default size of 4 bytes. */
pCol->affinity = SQLITE_AFF_BLOB;
pCol->szEst = 1;
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( 4>=sqlite3GlobalConfig.szSorterRef ){
+ pCol->colFlags |= COLFLAG_SORTERREF;
+ }
+#endif
}else{
zType = z + sqlite3Strlen30(z) + 1;
memcpy(zType, pType->z, pType->n);
zType[pType->n] = 0;
sqlite3Dequote(zType);
- pCol->affinity = sqlite3AffinityType(zType, &pCol->szEst);
+ pCol->affinity = sqlite3AffinityType(zType, pCol);
pCol->colFlags |= COLFLAG_HASTYPE;
}
p->nCol++;
@@ -101816,10 +107076,24 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){
*/
SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){
Table *p;
+ Column *pCol;
p = pParse->pNewTable;
if( p==0 || NEVER(p->nCol<1) ) return;
- p->aCol[p->nCol-1].notNull = (u8)onError;
+ pCol = &p->aCol[p->nCol-1];
+ pCol->notNull = (u8)onError;
p->tabFlags |= TF_HasNotNull;
+
+ /* Set the uniqNotNull flag on any UNIQUE or PK indexes already created
+ ** on this column. */
+ if( pCol->colFlags & COLFLAG_UNIQUE ){
+ Index *pIdx;
+ for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){
+ assert( pIdx->nKeyCol==1 && pIdx->onError!=OE_None );
+ if( pIdx->aiColumn[0]==p->nCol-1 ){
+ pIdx->uniqNotNull = 1;
+ }
+ }
+ }
}
/*
@@ -101847,7 +107121,7 @@ SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){
** If none of the substrings in the above table are found,
** SQLITE_AFF_NUMERIC is returned.
*/
-SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, u8 *pszEst){
+SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, Column *pCol){
u32 h = 0;
char aff = SQLITE_AFF_NUMERIC;
const char *zChar = 0;
@@ -101884,27 +107158,32 @@ SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, u8 *pszEst){
}
}
- /* If pszEst is not NULL, store an estimate of the field size. The
+ /* If pCol is not NULL, store an estimate of the field size. The
** estimate is scaled so that the size of an integer is 1. */
- if( pszEst ){
- *pszEst = 1; /* default size is approx 4 bytes */
+ if( pCol ){
+ int v = 0; /* default size is approx 4 bytes */
if( aff<SQLITE_AFF_NUMERIC ){
if( zChar ){
while( zChar[0] ){
if( sqlite3Isdigit(zChar[0]) ){
- int v = 0;
+ /* BLOB(k), VARCHAR(k), CHAR(k) -> r=(k/4+1) */
sqlite3GetInt32(zChar, &v);
- v = v/4 + 1;
- if( v>255 ) v = 255;
- *pszEst = v; /* BLOB(k), VARCHAR(k), CHAR(k) -> r=(k/4+1) */
break;
}
zChar++;
}
}else{
- *pszEst = 5; /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/
+ v = 16; /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/
}
}
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( v>=sqlite3GlobalConfig.szSorterRef ){
+ pCol->colFlags |= COLFLAG_SORTERREF;
+ }
+#endif
+ v = v/4 + 1;
+ if( v>255 ) v = 255;
+ pCol->szEst = v;
}
return aff;
}
@@ -101919,34 +107198,40 @@ SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, u8 *pszEst){
** This routine is called by the parser while in the middle of
** parsing a CREATE TABLE statement.
*/
-SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse *pParse, ExprSpan *pSpan){
+SQLITE_PRIVATE void sqlite3AddDefaultValue(
+ Parse *pParse, /* Parsing context */
+ Expr *pExpr, /* The parsed expression of the default value */
+ const char *zStart, /* Start of the default value text */
+ const char *zEnd /* First character past end of defaut value text */
+){
Table *p;
Column *pCol;
sqlite3 *db = pParse->db;
p = pParse->pNewTable;
if( p!=0 ){
pCol = &(p->aCol[p->nCol-1]);
- if( !sqlite3ExprIsConstantOrFunction(pSpan->pExpr, db->init.busy) ){
+ if( !sqlite3ExprIsConstantOrFunction(pExpr, db->init.busy) ){
sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant",
pCol->zName);
}else{
/* A copy of pExpr is used instead of the original, as pExpr contains
- ** tokens that point to volatile memory. The 'span' of the expression
- ** is required by pragma table_info.
+ ** tokens that point to volatile memory.
*/
Expr x;
sqlite3ExprDelete(db, pCol->pDflt);
memset(&x, 0, sizeof(x));
x.op = TK_SPAN;
- x.u.zToken = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
- (int)(pSpan->zEnd - pSpan->zStart));
- x.pLeft = pSpan->pExpr;
+ x.u.zToken = sqlite3DbSpanDup(db, zStart, zEnd);
+ x.pLeft = pExpr;
x.flags = EP_Skip;
pCol->pDflt = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE);
sqlite3DbFree(db, x.u.zToken);
}
}
- sqlite3ExprDelete(db, pSpan->pExpr);
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameExprUnmap(pParse, pExpr);
+ }
+ sqlite3ExprDelete(db, pExpr);
}
/*
@@ -102037,6 +107322,9 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey(
&& sqlite3StrICmp(sqlite3ColumnType(pCol,""), "INTEGER")==0
&& sortOrder!=SQLITE_SO_DESC
){
+ if( IN_RENAME_OBJECT && pList ){
+ sqlite3RenameTokenRemap(pParse, &pTab->iPKey, pList->a[0].pExpr);
+ }
pTab->iPKey = iCol;
pTab->keyConf = (u8)onError;
assert( autoInc==0 || autoInc==1 );
@@ -102177,7 +107465,7 @@ SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){
Vdbe *v = pParse->pVdbe;
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION,
- db->aDb[iDb].pSchema->schema_cookie+1);
+ (int)(1+(unsigned)db->aDb[iDb].pSchema->schema_cookie));
}
/*
@@ -102362,6 +107650,31 @@ static int hasColumn(const i16 *aiCol, int nCol, int x){
return 0;
}
+/* Recompute the colNotIdxed field of the Index.
+**
+** colNotIdxed is a bitmask that has a 0 bit representing each indexed
+** columns that are within the first 63 columns of the table. The
+** high-order bit of colNotIdxed is always 1. All unindexed columns
+** of the table have a 1.
+**
+** The colNotIdxed mask is AND-ed with the SrcList.a[].colUsed mask
+** to determine if the index is covering index.
+*/
+static void recomputeColumnsNotIndexed(Index *pIdx){
+ Bitmask m = 0;
+ int j;
+ for(j=pIdx->nColumn-1; j>=0; j--){
+ int x = pIdx->aiColumn[j];
+ if( x>=0 ){
+ testcase( x==BMS-1 );
+ testcase( x==BMS-2 );
+ if( x<BMS-1 ) m |= MASKBIT(x);
+ }
+ }
+ pIdx->colNotIdxed = ~m;
+ assert( (pIdx->colNotIdxed>>63)==1 );
+}
+
/*
** This routine runs at the end of parsing a CREATE TABLE statement that
** has a WITHOUT ROWID clause. The job of this routine is to convert both
@@ -102404,10 +107717,6 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
}
}
- /* The remaining transformations only apply to b-tree tables, not to
- ** virtual tables */
- if( IN_DECLARE_VTAB ) return;
-
/* Convert the P3 operand of the OP_CreateBtree opcode from BTREE_INTKEY
** into BTREE_BLOBKEY.
*/
@@ -102430,7 +107739,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
assert( pParse->pNewTable==pTab );
sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0,
SQLITE_IDXTYPE_PRIMARYKEY);
- if( db->mallocFailed ) return;
+ if( db->mallocFailed || pParse->nErr ) return;
pPk = sqlite3PrimaryKeyIndex(pTab);
pTab->iPKey = -1;
}else{
@@ -102510,7 +107819,38 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
}else{
pPk->nColumn = pTab->nCol;
}
+ recomputeColumnsNotIndexed(pPk);
+}
+
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+/*
+** Return true if zName is a shadow table name in the current database
+** connection.
+**
+** zName is temporarily modified while this routine is running, but is
+** restored to its original value prior to this routine returning.
+*/
+static int isShadowTableName(sqlite3 *db, char *zName){
+ char *zTail; /* Pointer to the last "_" in zName */
+ Table *pTab; /* Table that zName is a shadow of */
+ Module *pMod; /* Module for the virtual table */
+
+ zTail = strrchr(zName, '_');
+ if( zTail==0 ) return 0;
+ *zTail = 0;
+ pTab = sqlite3FindTable(db, zName, 0);
+ *zTail = '_';
+ if( pTab==0 ) return 0;
+ if( !IsVirtual(pTab) ) return 0;
+ pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]);
+ if( pMod==0 ) return 0;
+ if( pMod->pModule->iVersion<3 ) return 0;
+ if( pMod->pModule->xShadowName==0 ) return 0;
+ return pMod->pModule->xShadowName(zTail+1);
}
+#else
+# define isShadowTableName(x,y) 0
+#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
/*
** This routine is called to report the final ")" that terminates
@@ -102551,7 +107891,9 @@ SQLITE_PRIVATE void sqlite3EndTable(
p = pParse->pNewTable;
if( p==0 ) return;
- assert( !db->init.busy || !pSelect );
+ if( pSelect==0 && isShadowTableName(db, p->zName) ){
+ p->tabFlags |= TF_Shadow;
+ }
/* If the db->init.busy is 1 it means we are reading the SQL off the
** "sqlite_master" or "sqlite_temp_master" table on the disk.
@@ -102563,6 +107905,10 @@ SQLITE_PRIVATE void sqlite3EndTable(
** table itself. So mark it read-only.
*/
if( db->init.busy ){
+ if( pSelect ){
+ sqlite3ErrorMsg(pParse, "");
+ return;
+ }
p->tnum = db->init.newTnum;
if( p->tnum==1 ) p->tabFlags |= TF_Readonly;
}
@@ -102663,10 +108009,6 @@ SQLITE_PRIVATE void sqlite3EndTable(
pParse->nTab = 2;
addrTop = sqlite3VdbeCurrentAddr(v) + 1;
sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop);
- sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield);
- sqlite3Select(pParse, pSelect, &dest);
- sqlite3VdbeEndCoroutine(v, regYield);
- sqlite3VdbeJumpHere(v, addrTop - 1);
if( pParse->nErr ) return;
pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect);
if( pSelTab==0 ) return;
@@ -102676,6 +108018,11 @@ SQLITE_PRIVATE void sqlite3EndTable(
pSelTab->nCol = 0;
pSelTab->aCol = 0;
sqlite3DeleteTable(db, pSelTab);
+ sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield);
+ sqlite3Select(pParse, pSelect, &dest);
+ if( pParse->nErr ) return;
+ sqlite3VdbeEndCoroutine(v, regYield);
+ sqlite3VdbeJumpHere(v, addrTop - 1);
addrInsLoop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm);
VdbeCoverage(v);
sqlite3VdbeAddOp3(v, OP_MakeRecord, dest.iSdst, dest.nSdst, regRec);
@@ -102810,7 +108157,12 @@ SQLITE_PRIVATE void sqlite3CreateView(
** allocated rather than point to the input string - which means that
** they will persist after the current sqlite3_exec() call returns.
*/
- p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
+ if( IN_RENAME_OBJECT ){
+ p->pSelect = pSelect;
+ pSelect = 0;
+ }else{
+ p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
+ }
p->pCheck = sqlite3ExprListDup(db, pCNames, EXPRDUP_REDUCE);
if( db->mallocFailed ) goto create_view_fail;
@@ -102818,7 +108170,7 @@ SQLITE_PRIVATE void sqlite3CreateView(
** the end.
*/
sEnd = pParse->sLastToken;
- assert( sEnd.z[0]!=0 );
+ assert( sEnd.z[0]!=0 || sEnd.n==0 );
if( sEnd.z[0]!=';' ){
sEnd.z += sEnd.n;
}
@@ -102835,6 +108187,9 @@ SQLITE_PRIVATE void sqlite3CreateView(
create_view_fail:
sqlite3SelectDelete(db, pSelect);
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameExprlistUnmap(pParse, pCNames);
+ }
sqlite3ExprListDelete(db, pCNames);
return;
}
@@ -102852,7 +108207,7 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
int nErr = 0; /* Number of errors encountered */
int n; /* Temporarily holds the number of cursors assigned */
sqlite3 *db = pParse->db; /* Database connection for malloc errors */
-#ifndef SQLITE_OMIT_VIRTUALTABLE
+#ifndef SQLITE_OMIT_VIRTUALTABLE
int rc;
#endif
#ifndef SQLITE_OMIT_AUTHORIZATION
@@ -102908,6 +108263,10 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
assert( pTable->pSelect );
pSel = sqlite3SelectDup(db, pTable->pSelect, 0);
if( pSel ){
+#ifndef SQLITE_OMIT_ALTERTABLE
+ u8 eParseMode = pParse->eParseMode;
+ pParse->eParseMode = PARSE_MODE_NORMAL;
+#endif
n = pParse->nTab;
sqlite3SrcListAssignCursors(pParse, pSel->pSrc);
pTable->nCol = -1;
@@ -102953,10 +108312,18 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
sqlite3DeleteTable(db, pSelTab);
sqlite3SelectDelete(db, pSel);
db->lookaside.bDisable--;
+#ifndef SQLITE_OMIT_ALTERTABLE
+ pParse->eParseMode = eParseMode;
+#endif
} else {
nErr++;
}
pTable->pSchema->schemaFlags |= DB_UnresetViews;
+ if( db->mallocFailed ){
+ sqlite3DeleteColumnNames(db, pTable);
+ pTable->aCol = 0;
+ pTable->nCol = 0;
+ }
#endif /* SQLITE_OMIT_VIEW */
return nErr;
}
@@ -103035,7 +108402,7 @@ SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iT
static void destroyRootPage(Parse *pParse, int iTable, int iDb){
Vdbe *v = sqlite3GetVdbe(pParse);
int r1 = sqlite3GetTempReg(pParse);
- assert( iTable>1 );
+ if( iTable<2 ) sqlite3ErrorMsg(pParse, "corrupt schema");
sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb);
sqlite3MayAbort(pParse);
#ifndef SQLITE_OMIT_AUTOVACUUM
@@ -103295,8 +108662,10 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView,
v = sqlite3GetVdbe(pParse);
if( v ){
sqlite3BeginWriteOperation(pParse, 1, iDb);
- sqlite3ClearStatTables(pParse, iDb, "tbl", pTab->zName);
- sqlite3FkDropTable(pParse, pName, pTab);
+ if( !isView ){
+ sqlite3ClearStatTables(pParse, iDb, "tbl", pTab->zName);
+ sqlite3FkDropTable(pParse, pName, pTab);
+ }
sqlite3CodeDropTable(pParse, pTab, iDb, isView);
}
@@ -103371,6 +108740,9 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
pFKey->pNextFrom = p->pFKey;
z = (char*)&pFKey->aCol[nCol];
pFKey->zTo = z;
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenMap(pParse, (void*)z, pTo);
+ }
memcpy(z, pTo->z, pTo->n);
z[pTo->n] = 0;
sqlite3Dequote(z);
@@ -103393,12 +108765,18 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
pFromCol->a[i].zName);
goto fk_end;
}
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenRemap(pParse, &pFKey->aCol[i], pFromCol->a[i].zName);
+ }
}
}
if( pToCol ){
for(i=0; i<nCol; i++){
int n = sqlite3Strlen30(pToCol->a[i].zName);
pFKey->aCol[i].zCol = z;
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenRemap(pParse, z, pToCol->a[i].zName);
+ }
memcpy(z, pToCol->a[i].zName, n);
z[n] = 0;
z += n+1;
@@ -103507,6 +108885,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); VdbeCoverage(v);
regRecord = sqlite3GetTempReg(pParse);
+ sqlite3MultiWrite(pParse);
sqlite3GenerateIndexKey(pParse,pIndex,iTab,regRecord,0,&iPartIdxLabel,0,0);
sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord);
@@ -103520,12 +108899,13 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0); VdbeCoverage(v);
if( IsUniqueIndex(pIndex) ){
- int j2 = sqlite3VdbeCurrentAddr(v) + 3;
- sqlite3VdbeGoto(v, j2);
+ int j2 = sqlite3VdbeGoto(v, 1);
addr2 = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeVerifyAbortable(v, OE_Abort);
sqlite3VdbeAddOp4Int(v, OP_SorterCompare, iSorter, j2, regRecord,
pIndex->nKeyCol); VdbeCoverage(v);
sqlite3UniqueConstraint(pParse, OE_Abort, pIndex);
+ sqlite3VdbeJumpHere(v, j2);
}else{
addr2 = sqlite3VdbeCurrentAddr(v);
}
@@ -103688,7 +109068,11 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
#if SQLITE_USER_AUTHENTICATION
&& sqlite3UserAuthTable(pTab->zName)==0
#endif
- && sqlite3StrNICmp(&pTab->zName[7],"altertab_",9)!=0 ){
+#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;
}
@@ -103725,20 +109109,22 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
goto exit_create_index;
}
- if( !db->init.busy ){
- if( sqlite3FindTable(db, zName, 0)!=0 ){
- sqlite3ErrorMsg(pParse, "there is already a table named %s", zName);
- goto exit_create_index;
+ if( !IN_RENAME_OBJECT ){
+ if( !db->init.busy ){
+ if( sqlite3FindTable(db, zName, 0)!=0 ){
+ sqlite3ErrorMsg(pParse, "there is already a table named %s", zName);
+ goto exit_create_index;
+ }
}
- }
- if( sqlite3FindIndex(db, zName, pDb->zDbSName)!=0 ){
- if( !ifNotExist ){
- sqlite3ErrorMsg(pParse, "index %s already exists", zName);
- }else{
- assert( !db->init.busy );
- sqlite3CodeVerifySchema(pParse, iDb);
+ if( sqlite3FindIndex(db, zName, pDb->zDbSName)!=0 ){
+ if( !ifNotExist ){
+ sqlite3ErrorMsg(pParse, "index %s already exists", zName);
+ }else{
+ assert( !db->init.busy );
+ sqlite3CodeVerifySchema(pParse, iDb);
+ }
+ goto exit_create_index;
}
- goto exit_create_index;
}
}else{
int n;
@@ -103754,13 +109140,13 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
** The following statement converts "sqlite3_autoindex..." into
** "sqlite3_butoindex..." in order to make the names distinct.
** The "vtab_err.test" test demonstrates the need of this statement. */
- if( IN_DECLARE_VTAB ) zName[7]++;
+ if( IN_SPECIAL_PARSE ) zName[7]++;
}
/* Check for authorization to create an index.
*/
#ifndef SQLITE_OMIT_AUTHORIZATION
- {
+ if( !IN_RENAME_OBJECT ){
const char *zDb = pDb->zDbSName;
if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){
goto exit_create_index;
@@ -103779,7 +109165,9 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
*/
if( pList==0 ){
Token prevCol;
- sqlite3TokenInit(&prevCol, pTab->aCol[pTab->nCol-1].zName);
+ Column *pCol = &pTab->aCol[pTab->nCol-1];
+ pCol->colFlags |= COLFLAG_UNIQUE;
+ sqlite3TokenInit(&prevCol, pCol->zName);
pList = sqlite3ExprListAppend(pParse, 0,
sqlite3ExprAlloc(db, TK_ID, &prevCol, 0));
if( pList==0 ) goto exit_create_index;
@@ -103845,7 +109233,12 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
** TODO: Issue a warning if the table primary key is used as part of the
** index key.
*/
- for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){
+ pListItem = pList->a;
+ if( IN_RENAME_OBJECT ){
+ pIndex->aColExpr = pList;
+ pList = 0;
+ }
+ for(i=0; i<pIndex->nKeyCol; i++, pListItem++){
Expr *pCExpr; /* The i-th index expression */
int requestedSortOrder; /* ASC or DESC on the i-th expression */
const char *zColl; /* Collation sequence name */
@@ -103861,12 +109254,8 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
goto exit_create_index;
}
if( pIndex->aColExpr==0 ){
- ExprList *pCopy = sqlite3ExprListDup(db, pList, 0);
- pIndex->aColExpr = pCopy;
- if( !db->mallocFailed ){
- assert( pCopy!=0 );
- pListItem = &pCopy->a[i];
- }
+ pIndex->aColExpr = pList;
+ pList = 0;
}
j = XN_EXPR;
pIndex->aiColumn[i] = XN_EXPR;
@@ -103932,6 +109321,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
** it as a covering index */
assert( HasRowid(pTab)
|| pTab->iPKey<0 || sqlite3ColumnOfIndex(pIndex, pTab->iPKey)>=0 );
+ recomputeColumnsNotIndexed(pIndex);
if( pTblName!=0 && pIndex->nColumn>=pTab->nCol ){
pIndex->isCovering = 1;
for(j=0; j<pTab->nCol; j++){
@@ -104004,98 +109394,101 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
}
}
- /* Link the new Index structure to its table and to the other
- ** in-memory database structures.
- */
- assert( pParse->nErr==0 );
- if( db->init.busy ){
- Index *p;
- assert( !IN_DECLARE_VTAB );
- assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
- p = sqlite3HashInsert(&pIndex->pSchema->idxHash,
- pIndex->zName, pIndex);
- if( p ){
- assert( p==pIndex ); /* Malloc must have failed */
- sqlite3OomFault(db);
- goto exit_create_index;
- }
- db->mDbFlags |= DBFLAG_SchemaChange;
- if( pTblName!=0 ){
- pIndex->tnum = db->init.newTnum;
- }
- }
+ if( !IN_RENAME_OBJECT ){
- /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the
- ** index is an implied index for a UNIQUE or PRIMARY KEY constraint) then
- ** emit code to allocate the index rootpage on disk and make an entry for
- ** the index in the sqlite_master table and populate the index with
- ** content. But, do not do this if we are simply reading the sqlite_master
- ** table to parse the schema, or if this index is the PRIMARY KEY index
- ** of a WITHOUT ROWID table.
- **
- ** If pTblName==0 it means this index is generated as an implied PRIMARY KEY
- ** or UNIQUE index in a CREATE TABLE statement. Since the table
- ** has just been created, it contains no data and the index initialization
- ** step can be skipped.
- */
- else if( HasRowid(pTab) || pTblName!=0 ){
- Vdbe *v;
- char *zStmt;
- int iMem = ++pParse->nMem;
-
- v = sqlite3GetVdbe(pParse);
- if( v==0 ) goto exit_create_index;
-
- sqlite3BeginWriteOperation(pParse, 1, iDb);
-
- /* Create the rootpage for the index using CreateIndex. But before
- ** doing so, code a Noop instruction and store its address in
- ** Index.tnum. This is required in case this index is actually a
- ** PRIMARY KEY and the table is actually a WITHOUT ROWID table. In
- ** that case the convertToWithoutRowidTable() routine will replace
- ** the Noop with a Goto to jump over the VDBE code generated below. */
- pIndex->tnum = sqlite3VdbeAddOp0(v, OP_Noop);
- sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, iMem, BTREE_BLOBKEY);
-
- /* Gather the complete text of the CREATE INDEX statement into
- ** the zStmt variable
+ /* Link the new Index structure to its table and to the other
+ ** in-memory database structures.
*/
- if( pStart ){
- int n = (int)(pParse->sLastToken.z - pName->z) + pParse->sLastToken.n;
- if( pName->z[n-1]==';' ) n--;
- /* A named index with an explicit CREATE INDEX statement */
- zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s",
- onError==OE_None ? "" : " UNIQUE", n, pName->z);
- }else{
- /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */
- /* zStmt = sqlite3MPrintf(""); */
- zStmt = 0;
+ assert( pParse->nErr==0 );
+ if( db->init.busy ){
+ Index *p;
+ assert( !IN_SPECIAL_PARSE );
+ assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
+ p = sqlite3HashInsert(&pIndex->pSchema->idxHash,
+ pIndex->zName, pIndex);
+ if( p ){
+ assert( p==pIndex ); /* Malloc must have failed */
+ sqlite3OomFault(db);
+ goto exit_create_index;
+ }
+ db->mDbFlags |= DBFLAG_SchemaChange;
+ if( pTblName!=0 ){
+ pIndex->tnum = db->init.newTnum;
+ }
}
- /* Add an entry in sqlite_master for this index
+ /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the
+ ** index is an implied index for a UNIQUE or PRIMARY KEY constraint) then
+ ** emit code to allocate the index rootpage on disk and make an entry for
+ ** the index in the sqlite_master table and populate the index with
+ ** content. But, do not do this if we are simply reading the sqlite_master
+ ** table to parse the schema, or if this index is the PRIMARY KEY index
+ ** of a WITHOUT ROWID table.
+ **
+ ** If pTblName==0 it means this index is generated as an implied PRIMARY KEY
+ ** or UNIQUE index in a CREATE TABLE statement. Since the table
+ ** has just been created, it contains no data and the index initialization
+ ** step can be skipped.
*/
- sqlite3NestedParse(pParse,
- "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);",
- db->aDb[iDb].zDbSName, MASTER_NAME,
- pIndex->zName,
- pTab->zName,
- iMem,
- zStmt
- );
- sqlite3DbFree(db, zStmt);
+ else if( HasRowid(pTab) || pTblName!=0 ){
+ Vdbe *v;
+ char *zStmt;
+ int iMem = ++pParse->nMem;
+
+ v = sqlite3GetVdbe(pParse);
+ if( v==0 ) goto exit_create_index;
+
+ sqlite3BeginWriteOperation(pParse, 1, iDb);
+
+ /* Create the rootpage for the index using CreateIndex. But before
+ ** doing so, code a Noop instruction and store its address in
+ ** Index.tnum. This is required in case this index is actually a
+ ** PRIMARY KEY and the table is actually a WITHOUT ROWID table. In
+ ** that case the convertToWithoutRowidTable() routine will replace
+ ** the Noop with a Goto to jump over the VDBE code generated below. */
+ pIndex->tnum = sqlite3VdbeAddOp0(v, OP_Noop);
+ sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, iMem, BTREE_BLOBKEY);
+
+ /* Gather the complete text of the CREATE INDEX statement into
+ ** the zStmt variable
+ */
+ if( pStart ){
+ int n = (int)(pParse->sLastToken.z - pName->z) + pParse->sLastToken.n;
+ if( pName->z[n-1]==';' ) n--;
+ /* A named index with an explicit CREATE INDEX statement */
+ zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s",
+ onError==OE_None ? "" : " UNIQUE", n, pName->z);
+ }else{
+ /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */
+ /* zStmt = sqlite3MPrintf(""); */
+ zStmt = 0;
+ }
- /* Fill the index with data and reparse the schema. Code an OP_Expire
- ** to invalidate all pre-compiled statements.
- */
- if( pTblName ){
- sqlite3RefillIndex(pParse, pIndex, iMem);
- sqlite3ChangeCookie(pParse, iDb);
- sqlite3VdbeAddParseSchemaOp(v, iDb,
- sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName));
- sqlite3VdbeAddOp0(v, OP_Expire);
- }
+ /* Add an entry in sqlite_master for this index
+ */
+ sqlite3NestedParse(pParse,
+ "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);",
+ db->aDb[iDb].zDbSName, MASTER_NAME,
+ pIndex->zName,
+ pTab->zName,
+ iMem,
+ zStmt
+ );
+ sqlite3DbFree(db, zStmt);
+
+ /* Fill the index with data and reparse the schema. Code an OP_Expire
+ ** to invalidate all pre-compiled statements.
+ */
+ if( pTblName ){
+ sqlite3RefillIndex(pParse, pIndex, iMem);
+ sqlite3ChangeCookie(pParse, iDb);
+ sqlite3VdbeAddParseSchemaOp(v, iDb,
+ sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName));
+ sqlite3VdbeAddOp2(v, OP_Expire, 0, 1);
+ }
- sqlite3VdbeJumpHere(v, pIndex->tnum);
+ sqlite3VdbeJumpHere(v, pIndex->tnum);
+ }
}
/* When adding an index to the list of indices for a table, make
@@ -104119,10 +109512,15 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
}
pIndex = 0;
}
+ else if( IN_RENAME_OBJECT ){
+ assert( pParse->pNewIndex==0 );
+ pParse->pNewIndex = pIndex;
+ pIndex = 0;
+ }
/* Clean up before exiting */
exit_create_index:
- if( pIndex ) freeIndex(db, pIndex);
+ if( pIndex ) sqlite3FreeIndex(db, pIndex);
sqlite3ExprDelete(db, pPIWhere);
sqlite3ExprListDelete(db, pList);
sqlite3SrcListDelete(db, pTblName);
@@ -104291,7 +109689,8 @@ SQLITE_PRIVATE void *sqlite3ArrayAllocate(
**
** A new IdList is returned, or NULL if malloc() fails.
*/
-SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pToken){
+SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token *pToken){
+ sqlite3 *db = pParse->db;
int i;
if( pList==0 ){
pList = sqlite3DbMallocZero(db, sizeof(IdList) );
@@ -104309,6 +109708,9 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pT
return 0;
}
pList->a[i].zName = sqlite3NameFromToken(db, pToken);
+ if( IN_RENAME_OBJECT && pList->a[i].zName ){
+ sqlite3RenameTokenMap(pParse, (void*)pList->a[i].zName, pToken);
+ }
return pList;
}
@@ -104550,10 +109952,17 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(
goto append_from_error;
}
p = sqlite3SrcListAppend(db, p, pTable, pDatabase);
- if( p==0 || NEVER(p->nSrc==0) ){
+ if( p==0 ){
goto append_from_error;
}
+ assert( p->nSrc>0 );
pItem = &p->a[p->nSrc-1];
+ assert( (pTable==0)==(pDatabase==0) );
+ assert( pItem->zName==0 || pDatabase!=0 );
+ if( IN_RENAME_OBJECT && pItem->zName ){
+ Token *pToken = (ALWAYS(pDatabase) && pDatabase->z) ? pDatabase : pTable;
+ sqlite3RenameTokenMap(pParse, pItem->zName, pToken);
+ }
assert( pAlias!=0 );
if( pAlias->n ){
pItem->zAlias = sqlite3NameFromToken(db, pAlias);
@@ -104864,16 +110273,16 @@ SQLITE_PRIVATE void sqlite3UniqueConstraint(
sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, 200);
if( pIdx->aColExpr ){
- sqlite3XPrintf(&errMsg, "index '%q'", pIdx->zName);
+ sqlite3_str_appendf(&errMsg, "index '%q'", pIdx->zName);
}else{
for(j=0; j<pIdx->nKeyCol; j++){
char *zCol;
assert( pIdx->aiColumn[j]>=0 );
zCol = pTab->aCol[pIdx->aiColumn[j]].zName;
- if( j ) sqlite3StrAccumAppend(&errMsg, ", ", 2);
- sqlite3StrAccumAppendAll(&errMsg, pTab->zName);
- sqlite3StrAccumAppend(&errMsg, ".", 1);
- sqlite3StrAccumAppendAll(&errMsg, zCol);
+ if( j ) sqlite3_str_append(&errMsg, ", ", 2);
+ sqlite3_str_appendall(&errMsg, pTab->zName);
+ sqlite3_str_append(&errMsg, ".", 1);
+ sqlite3_str_appendall(&errMsg, zCol);
}
}
zErr = sqlite3StrAccumFinish(&errMsg);
@@ -105061,6 +110470,18 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){
pKey->aSortOrder[i] = pIdx->aSortOrder[i];
}
if( pParse->nErr ){
+ assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ );
+ if( pIdx->bNoQuery==0 ){
+ /* Deactivate the index because it contains an unknown collating
+ ** sequence. The only way to reactive the index is to reload the
+ ** schema. Adding the missing collating sequence later does not
+ ** reactive the index. The application had the chance to register
+ ** the missing index using the collation-needed callback. For
+ ** simplicity, SQLite will not give the application a second chance.
+ */
+ pIdx->bNoQuery = 1;
+ pParse->rc = SQLITE_ERROR_RETRY;
+ }
sqlite3KeyInfoUnref(pKey);
pKey = 0;
}
@@ -105246,6 +110667,7 @@ SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(
assert( !p || p->xCmp );
if( p==0 ){
sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName);
+ pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ;
}
return p;
}
@@ -105435,6 +110857,21 @@ 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.
@@ -105448,7 +110885,7 @@ SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(
FuncDef *pOther;
const char *zName = aDef[i].zName;
int nName = sqlite3Strlen30(zName);
- int h = (zName[0] + nName) % SQLITE_FUNC_HASH_SZ;
+ int h = SQLITE_FUNC_HASH(zName[0], nName);
assert( zName[0]>='a' && zName[0]<='z' );
pOther = functionSearch(h, zName);
if( pOther ){
@@ -105527,7 +110964,7 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction(
*/
if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){
bestScore = 0;
- h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % SQLITE_FUNC_HASH_SZ;
+ h = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zName[0]], nName);
p = functionSearch(h, zName);
while( p ){
int score = matchQuality(p, nArg, enc);
@@ -105546,10 +110983,12 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction(
if( createFlag && bestScore<FUNC_PERFECT_MATCH &&
(pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName+1))!=0 ){
FuncDef *pOther;
+ u8 *z;
pBest->zName = (const char*)&pBest[1];
pBest->nArg = (u16)nArg;
pBest->funcFlags = enc;
memcpy((char*)&pBest[1], zName, nName+1);
+ for(z=(u8*)pBest->zName; *z; z++) *z = sqlite3UpperToLower[*z];
pOther = (FuncDef*)sqlite3HashInsert(&db->aFunc, pBest->zName, pBest);
if( pOther==pBest ){
sqlite3DbFree(db, pBest);
@@ -105673,32 +111112,49 @@ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){
return pTab;
}
+/* Return true if table pTab is read-only.
+**
+** A table is read-only if any of the following are true:
+**
+** 1) It is a virtual table and no implementation of the xUpdate method
+** has been provided
+**
+** 2) It is a system table (i.e. sqlite_master), this call is not
+** part of a nested parse and writable_schema pragma has not
+** been specified
+**
+** 3) The table is a shadow table, the database connection is in
+** defensive mode, and the current sqlite3_prepare()
+** is for a top-level SQL statement.
+*/
+static int tabIsReadOnly(Parse *pParse, Table *pTab){
+ sqlite3 *db;
+ if( IsVirtual(pTab) ){
+ return sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0;
+ }
+ if( (pTab->tabFlags & (TF_Readonly|TF_Shadow))==0 ) return 0;
+ db = pParse->db;
+ if( (pTab->tabFlags & TF_Readonly)!=0 ){
+ return sqlite3WritableSchema(db)==0 && pParse->nested==0;
+ }
+ assert( pTab->tabFlags & TF_Shadow );
+ return (db->flags & SQLITE_Defensive)!=0
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ && db->pVtabCtx==0
+#endif
+ && db->nVdbeExec==0;
+}
+
/*
** Check to make sure the given table is writable. If it is not
** writable, generate an error message and return 1. If it is
** writable return 0;
*/
SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){
- /* A table is not writable under the following circumstances:
- **
- ** 1) It is a virtual table and no implementation of the xUpdate method
- ** has been provided, or
- ** 2) It is a system table (i.e. sqlite_master), this call is not
- ** part of a nested parse and writable_schema pragma has not
- ** been specified.
- **
- ** In either case leave an error message in pParse and return non-zero.
- */
- if( ( IsVirtual(pTab)
- && sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0 )
- || ( (pTab->tabFlags & TF_Readonly)!=0
- && (pParse->db->flags & SQLITE_WriteSchema)==0
- && pParse->nested==0 )
- ){
+ if( tabIsReadOnly(pParse, pTab) ){
sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName);
return 1;
}
-
#ifndef SQLITE_OMIT_VIEW
if( !viewOk && pTab->pSelect ){
sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName);
@@ -105719,6 +111175,8 @@ SQLITE_PRIVATE void sqlite3MaterializeView(
Parse *pParse, /* Parsing context */
Table *pView, /* View definition */
Expr *pWhere, /* Optional WHERE clause to be added */
+ ExprList *pOrderBy, /* Optional ORDER BY clause */
+ Expr *pLimit, /* Optional LIMIT clause */
int iCur /* Cursor number for ephemeral table */
){
SelectDest dest;
@@ -105735,8 +111193,8 @@ SQLITE_PRIVATE void sqlite3MaterializeView(
assert( pFrom->a[0].pOn==0 );
assert( pFrom->a[0].pUsing==0 );
}
- pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0,
- SF_IncludeHidden, 0, 0);
+ pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy,
+ SF_IncludeHidden, pLimit);
sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur);
sqlite3Select(pParse, pSel, &dest);
sqlite3SelectDelete(db, pSel);
@@ -105758,29 +111216,29 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere(
Expr *pWhere, /* The WHERE clause. May be null */
ExprList *pOrderBy, /* The ORDER BY clause. May be null */
Expr *pLimit, /* The LIMIT clause. May be null */
- Expr *pOffset, /* The OFFSET clause. May be null */
char *zStmtType /* Either DELETE or UPDATE. For err msgs. */
){
- Expr *pWhereRowid = NULL; /* WHERE rowid .. */
+ sqlite3 *db = pParse->db;
+ Expr *pLhs = NULL; /* LHS of IN(SELECT...) operator */
Expr *pInClause = NULL; /* WHERE rowid IN ( select ) */
- Expr *pSelectRowid = NULL; /* SELECT rowid ... */
ExprList *pEList = NULL; /* Expression list contaning only pSelectRowid */
SrcList *pSelectSrc = NULL; /* SELECT rowid FROM x ... (dup of pSrc) */
Select *pSelect = NULL; /* Complete SELECT tree */
+ Table *pTab;
/* Check that there isn't an ORDER BY without a LIMIT clause.
*/
- if( pOrderBy && (pLimit == 0) ) {
+ if( pOrderBy && pLimit==0 ) {
sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType);
- goto limit_where_cleanup;
+ sqlite3ExprDelete(pParse->db, pWhere);
+ sqlite3ExprListDelete(pParse->db, pOrderBy);
+ return 0;
}
/* We only need to generate a select expression if there
** is a limit/offset term to enforce.
*/
if( pLimit == 0 ) {
- /* if pLimit is null, pOffset will always be null as well. */
- assert( pOffset == 0 );
return pWhere;
}
@@ -105793,36 +111251,47 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere(
** );
*/
- pSelectRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0);
- if( pSelectRowid == 0 ) goto limit_where_cleanup;
- pEList = sqlite3ExprListAppend(pParse, 0, pSelectRowid);
- if( pEList == 0 ) goto limit_where_cleanup;
+ pTab = pSrc->a[0].pTab;
+ if( HasRowid(pTab) ){
+ pLhs = sqlite3PExpr(pParse, TK_ROW, 0, 0);
+ pEList = sqlite3ExprListAppend(
+ pParse, 0, sqlite3PExpr(pParse, TK_ROW, 0, 0)
+ );
+ }else{
+ Index *pPk = sqlite3PrimaryKeyIndex(pTab);
+ if( pPk->nKeyCol==1 ){
+ const char *zName = pTab->aCol[pPk->aiColumn[0]].zName;
+ pLhs = sqlite3Expr(db, TK_ID, zName);
+ pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, zName));
+ }else{
+ int i;
+ for(i=0; i<pPk->nKeyCol; i++){
+ Expr *p = sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zName);
+ pEList = sqlite3ExprListAppend(pParse, pEList, p);
+ }
+ pLhs = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
+ if( pLhs ){
+ pLhs->x.pList = sqlite3ExprListDup(db, pEList, 0);
+ }
+ }
+ }
/* duplicate the FROM clause as it is needed by both the DELETE/UPDATE tree
** and the SELECT subtree. */
+ pSrc->a[0].pTab = 0;
pSelectSrc = sqlite3SrcListDup(pParse->db, pSrc, 0);
- if( pSelectSrc == 0 ) {
- sqlite3ExprListDelete(pParse->db, pEList);
- goto limit_where_cleanup;
- }
+ pSrc->a[0].pTab = pTab;
+ pSrc->a[0].pIBIndex = 0;
/* generate the SELECT expression tree. */
- pSelect = sqlite3SelectNew(pParse,pEList,pSelectSrc,pWhere,0,0,
- pOrderBy,0,pLimit,pOffset);
- if( pSelect == 0 ) return 0;
+ pSelect = sqlite3SelectNew(pParse, pEList, pSelectSrc, pWhere, 0 ,0,
+ pOrderBy,0,pLimit
+ );
/* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */
- pWhereRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0);
- pInClause = pWhereRowid ? sqlite3PExpr(pParse, TK_IN, pWhereRowid, 0) : 0;
+ pInClause = sqlite3PExpr(pParse, TK_IN, pLhs, 0);
sqlite3PExprAddSelect(pParse, pInClause, pSelect);
return pInClause;
-
-limit_where_cleanup:
- sqlite3ExprDelete(pParse->db, pWhere);
- sqlite3ExprListDelete(pParse->db, pOrderBy);
- sqlite3ExprDelete(pParse->db, pLimit);
- sqlite3ExprDelete(pParse->db, pOffset);
- return 0;
}
#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) */
/* && !defined(SQLITE_OMIT_SUBQUERY) */
@@ -105837,7 +111306,9 @@ limit_where_cleanup:
SQLITE_PRIVATE void sqlite3DeleteFrom(
Parse *pParse, /* The parser context */
SrcList *pTabList, /* The table from which we should delete things */
- Expr *pWhere /* The WHERE clause. May be null */
+ Expr *pWhere, /* The WHERE clause. May be null */
+ ExprList *pOrderBy, /* ORDER BY clause. May be null */
+ Expr *pLimit /* LIMIT clause. May be null */
){
Vdbe *v; /* The virtual database engine */
Table *pTab; /* The table from which records will be deleted */
@@ -105852,7 +111323,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
AuthContext sContext; /* Authorization context */
NameContext sNC; /* Name context to resolve expressions in */
int iDb; /* Database number */
- int memCnt = -1; /* Memory cell used for change counting */
+ int memCnt = 0; /* Memory cell used for change counting */
int rcauth; /* Value returned by authorization callback */
int eOnePass; /* ONEPASS_OFF or _SINGLE or _MULTI */
int aiCurOnePass[2]; /* The write cursors opened by WHERE_ONEPASS */
@@ -105882,6 +111353,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
}
assert( pTabList->nSrc==1 );
+
/* Locate the table which we want to delete. This table has to be
** put in an SrcList structure because some of the subroutines we
** will be calling are designed to work with multiple tables and expect
@@ -105896,16 +111368,26 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
#ifndef SQLITE_OMIT_TRIGGER
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
isView = pTab->pSelect!=0;
- bComplex = pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0);
#else
# define pTrigger 0
# define isView 0
#endif
+ bComplex = pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0);
#ifdef SQLITE_OMIT_VIEW
# undef isView
# define isView 0
#endif
+#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
+ if( !isView ){
+ pWhere = sqlite3LimitWhere(
+ pParse, pTabList, pWhere, pOrderBy, pLimit, "DELETE"
+ );
+ pOrderBy = 0;
+ pLimit = 0;
+ }
+#endif
+
/* If pTab is really a view, make sure it has been initialized.
*/
if( sqlite3ViewGetColumnNames(pParse, pTab) ){
@@ -105946,15 +111428,19 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
goto delete_from_cleanup;
}
if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
- sqlite3BeginWriteOperation(pParse, 1, iDb);
+ sqlite3BeginWriteOperation(pParse, bComplex, iDb);
/* If we are trying to delete from a view, realize that view into
** an ephemeral table.
*/
#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
if( isView ){
- sqlite3MaterializeView(pParse, pTab, pWhere, iTabCur);
+ sqlite3MaterializeView(pParse, pTab,
+ pWhere, pOrderBy, pLimit, iTabCur
+ );
iDataCur = iIdxCur = iTabCur;
+ pOrderBy = 0;
+ pLimit = 0;
}
#endif
@@ -105970,7 +111456,10 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
/* Initialize the counter of the number of rows deleted, if
** we are counting rows.
*/
- if( db->flags & SQLITE_CountRows ){
+ if( (db->flags & SQLITE_CountRows)!=0
+ && !pParse->nested
+ && !pParse->pTriggerTab
+ ){
memCnt = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt);
}
@@ -105998,7 +111487,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
assert( !isView );
sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName);
if( HasRowid(pTab) ){
- sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt,
+ sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt ? memCnt : -1,
pTab->zName, P4_STATIC);
}
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
@@ -106043,9 +111532,10 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI );
assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF );
+ if( eOnePass!=ONEPASS_SINGLE ) sqlite3MultiWrite(pParse);
/* Keep track of the number of rows to be deleted */
- if( db->flags & SQLITE_CountRows ){
+ if( memCnt ){
sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1);
}
@@ -106058,9 +111548,8 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
}
iKey = iPk;
}else{
- iKey = pParse->nMem + 1;
- iKey = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iTabCur, iKey, 0);
- if( iKey>pParse->nMem ) pParse->nMem = iKey;
+ iKey = ++pParse->nMem;
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, -1, iKey);
}
if( eOnePass!=ONEPASS_OFF ){
@@ -106148,13 +111637,16 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
if( IsVirtual(pTab) ){
const char *pVTab = (const char *)sqlite3GetVTable(db, pTab);
sqlite3VtabMakeWritable(pParse, pTab);
- sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB);
- sqlite3VdbeChangeP5(v, OE_Abort);
assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE );
sqlite3MayAbort(pParse);
- if( eOnePass==ONEPASS_SINGLE && sqlite3IsToplevel(pParse) ){
- pParse->isMultiWrite = 0;
+ if( eOnePass==ONEPASS_SINGLE ){
+ sqlite3VdbeAddOp1(v, OP_Close, iTabCur);
+ if( sqlite3IsToplevel(pParse) ){
+ pParse->isMultiWrite = 0;
+ }
}
+ sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB);
+ sqlite3VdbeChangeP5(v, OE_Abort);
}else
#endif
{
@@ -106188,7 +111680,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
** generating code because of a call to sqlite3NestedParse(), do not
** invoke the callback function.
*/
- if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){
+ if( memCnt ){
sqlite3VdbeAddOp2(v, OP_ResultRow, memCnt, 1);
sqlite3VdbeSetNumCols(v, 1);
sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", SQLITE_STATIC);
@@ -106198,6 +111690,10 @@ delete_from_cleanup:
sqlite3AuthContextPop(&sContext);
sqlite3SrcListDelete(db, pTabList);
sqlite3ExprDelete(db, pWhere);
+#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT)
+ sqlite3ExprListDelete(db, pOrderBy);
+ sqlite3ExprDelete(db, pLimit);
+#endif
sqlite3DbFree(db, aToOpen);
return;
}
@@ -106355,7 +111851,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete(
u8 p5 = 0;
sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,iIdxNoSeek);
sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0));
- if( pParse->nested==0 ){
+ if( pParse->nested==0 || 0==sqlite3_stricmp(pTab->zName, "sqlite_stat1") ){
sqlite3VdbeAppendP4(v, (char*)pTab, P4_TABLE);
}
if( eMode!=ONEPASS_OFF ){
@@ -106486,7 +111982,6 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey(
if( pIdx->pPartIdxWhere ){
*piPartIdxLabel = sqlite3VdbeMakeLabel(v);
pParse->iSelfTab = iDataCur + 1;
- sqlite3ExprCachePush(pParse);
sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel,
SQLITE_JUMPIFNULL);
pParse->iSelfTab = 0;
@@ -106533,7 +112028,6 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey(
SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse *pParse, int iLabel){
if( iLabel ){
sqlite3VdbeResolveLabel(pParse->pVdbe, iLabel);
- sqlite3ExprCachePop(pParse);
}
}
@@ -106576,6 +112070,8 @@ static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
** iteration of the aggregate loop.
*/
static void sqlite3SkipAccumulatorLoad(sqlite3_context *context){
+ assert( context->isError<=0 );
+ context->isError = -1;
context->skipFlag = 1;
}
@@ -106642,8 +112138,6 @@ static void lengthFunc(
int argc,
sqlite3_value **argv
){
- int len;
-
assert( argc==1 );
UNUSED_PARAMETER(argc);
switch( sqlite3_value_type(argv[0]) ){
@@ -106655,13 +112149,17 @@ static void lengthFunc(
}
case SQLITE_TEXT: {
const unsigned char *z = sqlite3_value_text(argv[0]);
+ const unsigned char *z0;
+ unsigned char c;
if( z==0 ) return;
- len = 0;
- while( *z ){
- len++;
- SQLITE_SKIP_UTF8(z);
+ z0 = z;
+ while( (c = *z)!=0 ){
+ z++;
+ if( c>=0xc0 ){
+ while( (*z & 0xc0)==0x80 ){ z++; z0++; }
+ }
}
- sqlite3_result_int(context, len);
+ sqlite3_result_int(context, (int)(z-z0));
break;
}
default: {
@@ -106788,7 +112286,7 @@ static void printfFunc(
x.apArg = argv+1;
sqlite3StrAccumInit(&str, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]);
str.printfFlags = SQLITE_PRINTF_SQLFUNC;
- sqlite3XPrintf(&str, zFormat, &x);
+ sqlite3_str_appendf(&str, zFormat, &x);
n = str.nChar;
sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n,
SQLITE_DYNAMIC);
@@ -107239,16 +112737,20 @@ static int patternCompare(
** c or cx.
*/
if( c<=0x80 ){
- u32 cx;
+ char zStop[3];
int bMatch;
if( noCase ){
- cx = sqlite3Toupper(c);
- c = sqlite3Tolower(c);
+ zStop[0] = sqlite3Toupper(c);
+ zStop[1] = sqlite3Tolower(c);
+ zStop[2] = 0;
}else{
- cx = c;
+ zStop[0] = c;
+ zStop[1] = 0;
}
- while( (c2 = *(zString++))!=0 ){
- if( c2!=c && c2!=cx ) continue;
+ while(1){
+ zString += strcspn((const char*)zString, zStop);
+ if( zString[0]==0 ) break;
+ zString++;
bMatch = patternCompare(zPattern,zString,pInfo,matchOther);
if( bMatch!=SQLITE_NOMATCH ) return bMatch;
}
@@ -107732,6 +113234,8 @@ static void replaceFunc(
i64 nOut; /* Maximum size of zOut */
int loopLimit; /* Last zStr[] that might match zPattern[] */
int i, j; /* Loop counters */
+ unsigned cntExpand; /* Number zOut expansions */
+ sqlite3 *db = sqlite3_context_db_handle(context);
assert( argc==3 );
UNUSED_PARAMETER(argc);
@@ -107763,33 +113267,40 @@ static void replaceFunc(
return;
}
loopLimit = nStr - nPattern;
+ cntExpand = 0;
for(i=j=0; i<=loopLimit; i++){
if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
zOut[j++] = zStr[i];
}else{
- u8 *zOld;
- sqlite3 *db = sqlite3_context_db_handle(context);
- nOut += nRep - nPattern;
- testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
- testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
- if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
- sqlite3_result_error_toobig(context);
- sqlite3_free(zOut);
- return;
- }
- zOld = zOut;
- zOut = sqlite3_realloc64(zOut, (int)nOut);
- if( zOut==0 ){
- sqlite3_result_error_nomem(context);
- sqlite3_free(zOld);
- return;
+ if( nRep>nPattern ){
+ nOut += nRep - nPattern;
+ testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
+ testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
+ if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
+ sqlite3_result_error_toobig(context);
+ sqlite3_free(zOut);
+ return;
+ }
+ cntExpand++;
+ if( (cntExpand&(cntExpand-1))==0 ){
+ /* Grow the size of the output buffer only on substitutions
+ ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */
+ u8 *zOld;
+ zOld = zOut;
+ zOut = sqlite3_realloc64(zOut, (int)nOut + (nOut - nStr - 1));
+ if( zOut==0 ){
+ sqlite3_result_error_nomem(context);
+ sqlite3_free(zOld);
+ return;
+ }
+ }
}
memcpy(&zOut[j], zRep, nRep);
j += nRep;
i += nPattern-1;
}
}
- assert( j+nStr-i+1==nOut );
+ assert( j+nStr-i+1<=nOut );
memcpy(&zOut[j], &zStr[i], nStr-i);
j += nStr - i;
assert( j<=nOut );
@@ -108029,7 +113540,7 @@ static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
i64 v = sqlite3_value_int64(argv[0]);
p->rSum += v;
if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){
- p->overflow = 1;
+ p->approx = p->overflow = 1;
}
}else{
p->rSum += sqlite3_value_double(argv[0]);
@@ -108037,6 +113548,32 @@ static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
}
}
}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+static void sumInverse(sqlite3_context *context, int argc, sqlite3_value**argv){
+ SumCtx *p;
+ int type;
+ assert( argc==1 );
+ UNUSED_PARAMETER(argc);
+ p = sqlite3_aggregate_context(context, sizeof(*p));
+ type = sqlite3_value_numeric_type(argv[0]);
+ /* p is always non-NULL because sumStep() will have been called first
+ ** to initialize it */
+ if( ALWAYS(p) && type!=SQLITE_NULL ){
+ assert( p->cnt>0 );
+ p->cnt--;
+ assert( type==SQLITE_INTEGER || p->approx );
+ if( type==SQLITE_INTEGER && p->approx==0 ){
+ i64 v = sqlite3_value_int64(argv[0]);
+ p->rSum -= v;
+ p->iSum -= v;
+ }else{
+ p->rSum -= sqlite3_value_double(argv[0]);
+ }
+ }
+}
+#else
+# define sumInverse 0
+#endif /* SQLITE_OMIT_WINDOWFUNC */
static void sumFinalize(sqlite3_context *context){
SumCtx *p;
p = sqlite3_aggregate_context(context, 0);
@@ -108071,6 +113608,9 @@ static void totalFinalize(sqlite3_context *context){
typedef struct CountCtx CountCtx;
struct CountCtx {
i64 n;
+#ifdef SQLITE_DEBUG
+ int bInverse; /* True if xInverse() ever called */
+#endif
};
/*
@@ -108088,7 +113628,7 @@ static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
** sure it still operates correctly, verify that its count agrees with our
** internal count when using count(*) and when the total count can be
** expressed as a 32-bit integer. */
- assert( argc==1 || p==0 || p->n>0x7fffffff
+ assert( argc==1 || p==0 || p->n>0x7fffffff || p->bInverse
|| p->n==sqlite3_aggregate_count(context) );
#endif
}
@@ -108097,6 +113637,21 @@ static void countFinalize(sqlite3_context *context){
p = sqlite3_aggregate_context(context, 0);
sqlite3_result_int64(context, p ? p->n : 0);
}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+static void countInverse(sqlite3_context *ctx, int argc, sqlite3_value **argv){
+ CountCtx *p;
+ p = sqlite3_aggregate_context(ctx, sizeof(*p));
+ /* p is always non-NULL since countStep() will have been called first */
+ if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && ALWAYS(p) ){
+ p->n--;
+#ifdef SQLITE_DEBUG
+ p->bInverse = 1;
+#endif
+ }
+}
+#else
+# define countInverse 0
+#endif /* SQLITE_OMIT_WINDOWFUNC */
/*
** Routines to implement min() and max() aggregate functions.
@@ -108113,7 +113668,7 @@ static void minmaxStep(
pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
if( !pBest ) return;
- if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
+ if( sqlite3_value_type(pArg)==SQLITE_NULL ){
if( pBest->flags ) sqlite3SkipAccumulatorLoad(context);
}else if( pBest->flags ){
int max;
@@ -108139,16 +113694,26 @@ static void minmaxStep(
sqlite3VdbeMemCopy(pBest, pArg);
}
}
-static void minMaxFinalize(sqlite3_context *context){
+static void minMaxValueFinalize(sqlite3_context *context, int bValue){
sqlite3_value *pRes;
pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
if( pRes ){
if( pRes->flags ){
sqlite3_result_value(context, pRes);
}
- sqlite3VdbeMemRelease(pRes);
+ if( bValue==0 ) sqlite3VdbeMemRelease(pRes);
}
}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+static void minMaxValue(sqlite3_context *context){
+ minMaxValueFinalize(context, 1);
+}
+#else
+# define minMaxValue 0
+#endif /* SQLITE_OMIT_WINDOWFUNC */
+static void minMaxFinalize(sqlite3_context *context){
+ minMaxValueFinalize(context, 0);
+}
/*
** group_concat(EXPR, ?SEPARATOR?)
@@ -108178,20 +113743,52 @@ static void groupConcatStep(
zSep = ",";
nSep = 1;
}
- if( zSep ) sqlite3StrAccumAppend(pAccum, zSep, nSep);
+ if( zSep ) sqlite3_str_append(pAccum, zSep, nSep);
}
zVal = (char*)sqlite3_value_text(argv[0]);
nVal = sqlite3_value_bytes(argv[0]);
- if( zVal ) sqlite3StrAccumAppend(pAccum, zVal, nVal);
+ if( zVal ) sqlite3_str_append(pAccum, zVal, nVal);
+ }
+}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+static void groupConcatInverse(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ int n;
+ StrAccum *pAccum;
+ assert( argc==1 || argc==2 );
+ if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
+ pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
+ /* pAccum is always non-NULL since groupConcatStep() will have always
+ ** run frist to initialize it */
+ if( ALWAYS(pAccum) ){
+ n = sqlite3_value_bytes(argv[0]);
+ if( argc==2 ){
+ n += sqlite3_value_bytes(argv[1]);
+ }else{
+ n++;
+ }
+ if( n>=(int)pAccum->nChar ){
+ pAccum->nChar = 0;
+ }else{
+ pAccum->nChar -= n;
+ memmove(pAccum->zText, &pAccum->zText[n], pAccum->nChar);
+ }
+ if( pAccum->nChar==0 ) pAccum->mxAlloc = 0;
}
}
+#else
+# define groupConcatInverse 0
+#endif /* SQLITE_OMIT_WINDOWFUNC */
static void groupConcatFinalize(sqlite3_context *context){
StrAccum *pAccum;
pAccum = sqlite3_aggregate_context(context, 0);
if( pAccum ){
- if( pAccum->accError==STRACCUM_TOOBIG ){
+ if( pAccum->accError==SQLITE_TOOBIG ){
sqlite3_result_error_toobig(context);
- }else if( pAccum->accError==STRACCUM_NOMEM ){
+ }else if( pAccum->accError==SQLITE_NOMEM ){
sqlite3_result_error_nomem(context);
}else{
sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
@@ -108199,6 +113796,24 @@ static void groupConcatFinalize(sqlite3_context *context){
}
}
}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+static void groupConcatValue(sqlite3_context *context){
+ sqlite3_str *pAccum;
+ pAccum = (sqlite3_str*)sqlite3_aggregate_context(context, 0);
+ if( pAccum ){
+ if( pAccum->accError==SQLITE_TOOBIG ){
+ sqlite3_result_error_toobig(context);
+ }else if( pAccum->accError==SQLITE_NOMEM ){
+ sqlite3_result_error_nomem(context);
+ }else{
+ const char *zText = sqlite3_str_value(pAccum);
+ sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
+ }
+ }
+}
+#else
+# define groupConcatValue 0
+#endif /* SQLITE_OMIT_WINDOWFUNC */
/*
** This routine does per-connection function registration. Most
@@ -108236,10 +113851,10 @@ SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive)
}else{
pInfo = (struct compareInfo*)&likeInfoNorm;
}
- sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
- sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
+ sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0);
+ sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0);
sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
- (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0);
+ (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0, 0, 0);
setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
setLikeOptFlag(db, "like",
caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
@@ -108336,6 +113951,10 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
#ifdef SQLITE_DEBUG
FUNCTION2(affinity, 1, 0, 0, noopFunc, SQLITE_FUNC_AFFINITY),
#endif
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET|
+ SQLITE_FUNC_TYPEOF),
+#endif
FUNCTION(ltrim, 1, 1, 0, trimFunc ),
FUNCTION(ltrim, 2, 1, 0, trimFunc ),
FUNCTION(rtrim, 1, 2, 0, trimFunc ),
@@ -108344,11 +113963,11 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
FUNCTION(trim, 2, 3, 0, trimFunc ),
FUNCTION(min, -1, 0, 1, minmaxFunc ),
FUNCTION(min, 0, 0, 1, 0 ),
- AGGREGATE2(min, 1, 0, 1, minmaxStep, minMaxFinalize,
+ WAGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize, minMaxValue, 0,
SQLITE_FUNC_MINMAX ),
FUNCTION(max, -1, 1, 1, minmaxFunc ),
FUNCTION(max, 0, 1, 1, 0 ),
- AGGREGATE2(max, 1, 1, 1, minmaxStep, minMaxFinalize,
+ WAGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize, minMaxValue, 0,
SQLITE_FUNC_MINMAX ),
FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF),
FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH),
@@ -108379,14 +113998,17 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
FUNCTION(substr, 2, 0, 0, substrFunc ),
FUNCTION(substr, 3, 0, 0, substrFunc ),
- AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
- AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
- AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
- AGGREGATE2(count, 0, 0, 0, countStep, countFinalize,
- SQLITE_FUNC_COUNT ),
- AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
- AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
- AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
+ WAGGREGATE(sum, 1,0,0, sumStep, sumFinalize, sumFinalize, sumInverse, 0),
+ WAGGREGATE(total, 1,0,0, sumStep,totalFinalize,totalFinalize,sumInverse, 0),
+ WAGGREGATE(avg, 1,0,0, sumStep, avgFinalize, avgFinalize, sumInverse, 0),
+ WAGGREGATE(count, 0,0,0, countStep,
+ countFinalize, countFinalize, countInverse, SQLITE_FUNC_COUNT ),
+ WAGGREGATE(count, 1,0,0, countStep,
+ countFinalize, countFinalize, countInverse, 0 ),
+ WAGGREGATE(group_concat, 1, 0, 0, groupConcatStep,
+ groupConcatFinalize, groupConcatValue, groupConcatInverse, 0),
+ WAGGREGATE(group_concat, 2, 0, 0, groupConcatStep,
+ groupConcatFinalize, groupConcatValue, groupConcatInverse, 0),
LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
#ifdef SQLITE_CASE_SENSITIVE_LIKE
@@ -108406,6 +114028,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
#ifndef SQLITE_OMIT_ALTERTABLE
sqlite3AlterFunctions();
#endif
+ sqlite3WindowFunctions();
#if defined(SQLITE_ENABLE_STAT3) || defined(SQLITE_ENABLE_STAT4)
sqlite3AnalyzeFunctions();
#endif
@@ -108764,6 +114387,12 @@ static void fkLookupParent(
int iCur = pParse->nTab - 1; /* Cursor number to use */
int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */
+ sqlite3VdbeVerifyAbortable(v,
+ (!pFKey->isDeferred
+ && !(pParse->db->flags & SQLITE_DeferFKs)
+ && !pParse->pToplevel
+ && !pParse->isMultiWrite) ? OE_Abort : OE_Ignore);
+
/* If nIncr is less than zero, then check at runtime if there are any
** outstanding constraints to resolve. If there are not, there is no need
** to check if deleting this row resolves any outstanding violations.
@@ -108929,7 +114558,7 @@ static Expr *exprTableColumn(
){
Expr *pExpr = sqlite3Expr(db, TK_COLUMN, 0);
if( pExpr ){
- pExpr->pTab = pTab;
+ pExpr->y.pTab = pTab;
pExpr->iTable = iCursor;
pExpr->iColumn = iCol;
}
@@ -109137,11 +114766,12 @@ static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){
*/
SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){
sqlite3 *db = pParse->db;
- if( (db->flags&SQLITE_ForeignKeys) && !IsVirtual(pTab) && !pTab->pSelect ){
+ if( (db->flags&SQLITE_ForeignKeys) && !IsVirtual(pTab) ){
int iSkip = 0;
Vdbe *v = sqlite3GetVdbe(pParse);
assert( v ); /* VDBE has already been allocated */
+ assert( pTab->pSelect==0 ); /* Not a view */
if( sqlite3FkReferences(pTab)==0 ){
/* Search for a deferred foreign key constraint for which this table
** is the child table. If one cannot be found, return without
@@ -109158,7 +114788,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa
}
pParse->disableTriggers = 1;
- sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0);
+ sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0, 0, 0);
pParse->disableTriggers = 0;
/* If the DELETE has generated immediate foreign key constraint
@@ -109171,6 +114801,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa
** constraints are violated.
*/
if( (db->flags & SQLITE_DeferFKs)==0 ){
+ sqlite3VdbeVerifyAbortable(v, OE_Abort);
sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v)+2);
VdbeCoverage(v);
sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY,
@@ -109716,7 +115347,7 @@ static Trigger *fkActionTrigger(
sqlite3ExprListAppend(pParse, 0, pRaise),
sqlite3SrcListAppend(db, 0, &tFrom, 0),
pWhere,
- 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0
);
pWhere = 0;
}
@@ -110003,7 +115634,8 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){
}while( i>=0 && zColAff[i]==SQLITE_AFF_BLOB );
pTab->zColAff = zColAff;
}
- i = sqlite3Strlen30(zColAff);
+ assert( zColAff!=0 );
+ i = sqlite3Strlen30NN(zColAff);
if( i ){
if( iReg ){
sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i);
@@ -110067,11 +115699,12 @@ static int readsTable(Parse *p, int iDb, Table *pTab){
** first use of table pTab. On 2nd and subsequent uses, the original
** AutoincInfo structure is used.
**
-** Three memory locations are allocated:
+** Four consecutive registers are allocated:
**
-** (1) Register to hold the name of the pTab table.
-** (2) Register to hold the maximum ROWID of pTab.
-** (3) Register to hold the rowid in sqlite_sequence of pTab
+** (1) The name of the pTab table.
+** (2) The maximum ROWID of pTab.
+** (3) The rowid in sqlite_sequence of pTab
+** (4) The original value of the max ROWID in pTab, or NULL if none
**
** The 2nd register is the one that is returned. That is all the
** insert routine needs to know about.
@@ -110082,11 +115715,26 @@ static int autoIncBegin(
Table *pTab /* The table we are writing to */
){
int memId = 0; /* Register holding maximum rowid */
+ assert( pParse->db->aDb[iDb].pSchema!=0 );
if( (pTab->tabFlags & TF_Autoincrement)!=0
&& (pParse->db->mDbFlags & DBFLAG_Vacuum)==0
){
Parse *pToplevel = sqlite3ParseToplevel(pParse);
AutoincInfo *pInfo;
+ Table *pSeqTab = pParse->db->aDb[iDb].pSchema->pSeqTab;
+
+ /* Verify that the sqlite_sequence table exists and is an ordinary
+ ** rowid table with exactly two columns.
+ ** Ticket d8dc2b3a58cd5dc2918a1d4acb 2018-05-23 */
+ if( pSeqTab==0
+ || !HasRowid(pSeqTab)
+ || IsVirtual(pSeqTab)
+ || pSeqTab->nCol!=2
+ ){
+ pParse->nErr++;
+ pParse->rc = SQLITE_CORRUPT_SEQUENCE;
+ return 0;
+ }
pInfo = pToplevel->pAinc;
while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; }
@@ -110099,7 +115747,7 @@ static int autoIncBegin(
pInfo->iDb = iDb;
pToplevel->nMem++; /* Register to hold name of table */
pInfo->regCtr = ++pToplevel->nMem; /* Max rowid register */
- pToplevel->nMem++; /* Rowid in sqlite_sequence */
+ pToplevel->nMem +=2; /* Rowid in sqlite_sequence + orig max val */
}
memId = pInfo->regCtr;
}
@@ -110127,15 +115775,17 @@ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){
static const int iLn = VDBE_OFFSET_LINENO(2);
static const VdbeOpList autoInc[] = {
/* 0 */ {OP_Null, 0, 0, 0},
- /* 1 */ {OP_Rewind, 0, 9, 0},
+ /* 1 */ {OP_Rewind, 0, 10, 0},
/* 2 */ {OP_Column, 0, 0, 0},
- /* 3 */ {OP_Ne, 0, 7, 0},
+ /* 3 */ {OP_Ne, 0, 9, 0},
/* 4 */ {OP_Rowid, 0, 0, 0},
/* 5 */ {OP_Column, 0, 1, 0},
- /* 6 */ {OP_Goto, 0, 9, 0},
- /* 7 */ {OP_Next, 0, 2, 0},
- /* 8 */ {OP_Integer, 0, 0, 0},
- /* 9 */ {OP_Close, 0, 0, 0}
+ /* 6 */ {OP_AddImm, 0, 0, 0},
+ /* 7 */ {OP_Copy, 0, 0, 0},
+ /* 8 */ {OP_Goto, 0, 11, 0},
+ /* 9 */ {OP_Next, 0, 2, 0},
+ /* 10 */ {OP_Integer, 0, 0, 0},
+ /* 11 */ {OP_Close, 0, 0, 0}
};
VdbeOp *aOp;
pDb = &db->aDb[p->iDb];
@@ -110146,14 +115796,17 @@ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){
aOp = sqlite3VdbeAddOpList(v, ArraySize(autoInc), autoInc, iLn);
if( aOp==0 ) break;
aOp[0].p2 = memId;
- aOp[0].p3 = memId+1;
+ aOp[0].p3 = memId+2;
aOp[2].p3 = memId;
aOp[3].p1 = memId-1;
aOp[3].p3 = memId;
aOp[3].p5 = SQLITE_JUMPIFNULL;
aOp[4].p2 = memId+1;
aOp[5].p3 = memId;
- aOp[8].p2 = memId;
+ aOp[6].p1 = memId;
+ aOp[7].p2 = memId+2;
+ aOp[7].p1 = memId;
+ aOp[10].p2 = memId;
}
}
@@ -110200,6 +115853,8 @@ static SQLITE_NOINLINE void autoIncrementEnd(Parse *pParse){
iRec = sqlite3GetTempReg(pParse);
assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) );
+ sqlite3VdbeAddOp3(v, OP_Le, memId+2, sqlite3VdbeCurrentAddr(v)+7, memId);
+ VdbeCoverage(v);
sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite);
aOp = sqlite3VdbeAddOpList(v, ArraySize(autoIncEnd), autoIncEnd, iLn);
if( aOp==0 ) break;
@@ -110337,7 +115992,8 @@ SQLITE_PRIVATE void sqlite3Insert(
SrcList *pTabList, /* Name of table into which we are inserting */
Select *pSelect, /* A SELECT statement to use as the data source */
IdList *pColumn, /* Column names corresponding to IDLIST. */
- int onError /* How to handle constraint errors */
+ int onError, /* How to handle constraint errors */
+ Upsert *pUpsert /* ON CONFLICT clauses for upsert, or NULL */
){
sqlite3 *db; /* The main database structure */
Table *pTab; /* The table to insert into. aka TABLE */
@@ -110632,7 +116288,10 @@ SQLITE_PRIVATE void sqlite3Insert(
/* Initialize the count of rows to be inserted
*/
- if( db->flags & SQLITE_CountRows ){
+ if( (db->flags & SQLITE_CountRows)!=0
+ && !pParse->nested
+ && !pParse->pTriggerTab
+ ){
regRowCount = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount);
}
@@ -110652,6 +116311,19 @@ SQLITE_PRIVATE void sqlite3Insert(
pParse->nMem += pIdx->nColumn;
}
}
+#ifndef SQLITE_OMIT_UPSERT
+ if( pUpsert ){
+ pTabList->a[0].iCursor = iDataCur;
+ pUpsert->pUpsertSrc = pTabList;
+ pUpsert->regData = regData;
+ pUpsert->iDataCur = iDataCur;
+ pUpsert->iIdxCur = iIdxCur;
+ if( pUpsert->pUpsertTarget ){
+ sqlite3UpsertAnalyzeTarget(pParse, pTabList, pUpsert);
+ }
+ }
+#endif
+
/* This is the top of the main insertion loop */
if( useTempTable ){
@@ -110766,7 +116438,8 @@ SQLITE_PRIVATE void sqlite3Insert(
VdbeOp *pOp;
sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid);
pOp = sqlite3VdbeGetOp(v, -1);
- if( ALWAYS(pOp) && pOp->opcode==OP_Null && !IsVirtual(pTab) ){
+ assert( pOp!=0 );
+ if( pOp->opcode==OP_Null && !IsVirtual(pTab) ){
appendFlag = 1;
pOp->opcode = OP_NewRowid;
pOp->p1 = iDataCur;
@@ -110853,7 +116526,7 @@ SQLITE_PRIVATE void sqlite3Insert(
int isReplace; /* Set to true if constraints may cause a replace */
int bUseSeek; /* True to use OPFLAG_SEEKRESULT */
sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur,
- regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0
+ regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0, pUpsert
);
sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0);
@@ -110876,7 +116549,7 @@ SQLITE_PRIVATE void sqlite3Insert(
/* Update the count of rows that are inserted
*/
- if( (db->flags & SQLITE_CountRows)!=0 ){
+ if( regRowCount ){
sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
}
@@ -110913,7 +116586,7 @@ insert_end:
** generating code because of a call to sqlite3NestedParse(), do not
** invoke the callback function.
*/
- if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){
+ if( regRowCount ){
sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
sqlite3VdbeSetNumCols(v, 1);
sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC);
@@ -110922,6 +116595,7 @@ insert_end:
insert_cleanup:
sqlite3SrcListDelete(db, pTabList);
sqlite3ExprListDelete(db, pList);
+ sqlite3UpsertDelete(db, pUpsert);
sqlite3SelectDelete(db, pSelect);
sqlite3IdListDelete(db, pColumn);
sqlite3DbFree(db, aRegIdx);
@@ -110941,14 +116615,15 @@ insert_cleanup:
#endif
/*
-** Meanings of bits in of pWalker->eCode for checkConstraintUnchanged()
+** Meanings of bits in of pWalker->eCode for
+** sqlite3ExprReferencesUpdatedColumn()
*/
#define CKCNSTRNT_COLUMN 0x01 /* CHECK constraint uses a changing column */
#define CKCNSTRNT_ROWID 0x02 /* CHECK constraint references the ROWID */
-/* This is the Walker callback from checkConstraintUnchanged(). Set
-** bit 0x01 of pWalker->eCode if
-** pWalker->eCode to 0 if this expression node references any of the
+/* This is the Walker callback from sqlite3ExprReferencesUpdatedColumn().
+* Set bit 0x01 of pWalker->eCode if pWalker->eCode to 0 and if this
+** expression node references any of the
** columns that are being modifed by an UPDATE statement.
*/
static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){
@@ -110970,12 +116645,21 @@ static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){
** only columns that are modified by the UPDATE are those for which
** aiChng[i]>=0, and also the ROWID is modified if chngRowid is true.
**
-** Return true if CHECK constraint pExpr does not use any of the
+** Return true if CHECK constraint pExpr uses any of the
** changing columns (or the rowid if it is changing). In other words,
-** return true if this CHECK constraint can be skipped when validating
+** return true if this CHECK constraint must be validated for
** the new row in the UPDATE statement.
+**
+** 2018-09-15: pExpr might also be an expression for an index-on-expressions.
+** The operation of this routine is the same - return true if an only if
+** the expression uses one or more of columns identified by the second and
+** third arguments.
*/
-static int checkConstraintUnchanged(Expr *pExpr, int *aiChng, int chngRowid){
+SQLITE_PRIVATE int sqlite3ExprReferencesUpdatedColumn(
+ Expr *pExpr, /* The expression to be checked */
+ int *aiChng, /* aiChng[x]>=0 if column x changed by the UPDATE */
+ int chngRowid /* True if UPDATE changes the rowid */
+){
Walker w;
memset(&w, 0, sizeof(w));
w.eCode = 0;
@@ -110990,7 +116674,7 @@ static int checkConstraintUnchanged(Expr *pExpr, int *aiChng, int chngRowid){
testcase( w.eCode==CKCNSTRNT_COLUMN );
testcase( w.eCode==CKCNSTRNT_ROWID );
testcase( w.eCode==(CKCNSTRNT_ROWID|CKCNSTRNT_COLUMN) );
- return !w.eCode;
+ return w.eCode!=0;
}
/*
@@ -111088,7 +116772,8 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
u8 overrideError, /* Override onError to this if not OE_Default */
int ignoreDest, /* Jump to this label on an OE_Ignore resolution */
int *pbMayReplace, /* OUT: Set to true if constraint may cause a replace */
- int *aiChng /* column i is unchanged if aiChng[i]<0 */
+ int *aiChng, /* column i is unchanged if aiChng[i]<0 */
+ Upsert *pUpsert /* ON CONFLICT clauses, if any. NULL otherwise */
){
Vdbe *v; /* VDBE under constrution */
Index *pIdx; /* Pointer to one of the indices */
@@ -111101,10 +116786,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
int addr1; /* Address of jump instruction */
int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */
int nPkField; /* Number of fields in PRIMARY KEY. 1 for ROWID tables */
- int ipkTop = 0; /* Top of the rowid change constraint check */
- int ipkBottom = 0; /* Bottom of the rowid change constraint check */
+ Index *pUpIdx = 0; /* Index to which to apply the upsert */
u8 isUpdate; /* True if this is an UPDATE operation */
u8 bAffinityDone = 0; /* True if the OP_Affinity operation has been run */
+ int upsertBypass = 0; /* Address of Goto to bypass upsert subroutine */
+ int upsertJump = 0; /* Address of Goto that jumps into upsert subroutine */
+ int ipkTop = 0; /* Top of the IPK uniqueness check */
+ int ipkBottom = 0; /* OP_Goto at the end of the IPK uniqueness check */
isUpdate = regOldData!=0;
db = pParse->db;
@@ -111192,8 +116880,15 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
for(i=0; i<pCheck->nExpr; i++){
int allOk;
Expr *pExpr = pCheck->a[i].pExpr;
- if( aiChng && checkConstraintUnchanged(pExpr, aiChng, pkChng) ) continue;
+ if( aiChng
+ && !sqlite3ExprReferencesUpdatedColumn(pExpr, aiChng, pkChng)
+ ){
+ /* The check constraints do not reference any of the columns being
+ ** updated so there is no point it verifying the check constraint */
+ continue;
+ }
allOk = sqlite3VdbeMakeLabel(v);
+ sqlite3VdbeVerifyAbortable(v, onError);
sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL);
if( onError==OE_Ignore ){
sqlite3VdbeGoto(v, ignoreDest);
@@ -111211,6 +116906,50 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
}
#endif /* !defined(SQLITE_OMIT_CHECK) */
+ /* UNIQUE and PRIMARY KEY constraints should be handled in the following
+ ** order:
+ **
+ ** (1) OE_Update
+ ** (2) OE_Abort, OE_Fail, OE_Rollback, OE_Ignore
+ ** (3) OE_Replace
+ **
+ ** OE_Fail and OE_Ignore must happen before any changes are made.
+ ** OE_Update guarantees that only a single row will change, so it
+ ** must happen before OE_Replace. Technically, OE_Abort and OE_Rollback
+ ** could happen in any order, but they are grouped up front for
+ ** convenience.
+ **
+ ** 2018-08-14: Ticket https://www.sqlite.org/src/info/908f001483982c43
+ ** The order of constraints used to have OE_Update as (2) and OE_Abort
+ ** and so forth as (1). But apparently PostgreSQL checks the OE_Update
+ ** constraint before any others, so it had to be moved.
+ **
+ ** Constraint checking code is generated in this order:
+ ** (A) The rowid constraint
+ ** (B) Unique index constraints that do not have OE_Replace as their
+ ** default conflict resolution strategy
+ ** (C) Unique index that do use OE_Replace by default.
+ **
+ ** The ordering of (2) and (3) is accomplished by making sure the linked
+ ** list of indexes attached to a table puts all OE_Replace indexes last
+ ** in the list. See sqlite3CreateIndex() for where that happens.
+ */
+
+ if( pUpsert ){
+ if( pUpsert->pUpsertTarget==0 ){
+ /* An ON CONFLICT DO NOTHING clause, without a constraint-target.
+ ** Make all unique constraint resolution be OE_Ignore */
+ assert( pUpsert->pUpsertSet==0 );
+ overrideError = OE_Ignore;
+ pUpsert = 0;
+ }else if( (pUpIdx = pUpsert->pUpsertIdx)!=0 ){
+ /* If the constraint-target uniqueness check must be run first.
+ ** Jump to that uniqueness check now */
+ upsertJump = sqlite3VdbeAddOp0(v, OP_Goto);
+ VdbeComment((v, "UPSERT constraint goes first"));
+ }
+ }
+
/* If rowid is changing, make sure the new rowid does not previously
** exist in the table.
*/
@@ -111225,13 +116964,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
onError = OE_Abort;
}
- if( isUpdate ){
- /* pkChng!=0 does not mean that the rowid has changed, only that
- ** it might have changed. Skip the conflict logic below if the rowid
- ** is unchanged. */
- sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData);
- sqlite3VdbeChangeP5(v, SQLITE_NOTNULL);
- VdbeCoverage(v);
+ /* figure out whether or not upsert applies in this case */
+ if( pUpsert && pUpsert->pUpsertIdx==0 ){
+ if( pUpsert->pUpsertSet==0 ){
+ onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */
+ }else{
+ onError = OE_Update; /* DO UPDATE */
+ }
}
/* If the response to a rowid conflict is REPLACE but the response
@@ -111239,21 +116978,30 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
** to defer the running of the rowid conflict checking until after
** the UNIQUE constraints have run.
*/
- if( onError==OE_Replace && overrideError!=OE_Replace ){
- for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
- if( pIdx->onError==OE_Ignore || pIdx->onError==OE_Fail ){
- ipkTop = sqlite3VdbeAddOp0(v, OP_Goto);
- break;
- }
- }
+ if( onError==OE_Replace /* IPK rule is REPLACE */
+ && onError!=overrideError /* Rules for other contraints are different */
+ && pTab->pIndex /* There exist other constraints */
+ ){
+ ipkTop = sqlite3VdbeAddOp0(v, OP_Goto)+1;
+ VdbeComment((v, "defer IPK REPLACE until last"));
+ }
+
+ if( isUpdate ){
+ /* pkChng!=0 does not mean that the rowid has changed, only that
+ ** it might have changed. Skip the conflict logic below if the rowid
+ ** is unchanged. */
+ sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData);
+ sqlite3VdbeChangeP5(v, SQLITE_NOTNULL);
+ VdbeCoverage(v);
}
/* Check to see if the new rowid already exists in the table. Skip
** the following conflict logic if it does not. */
+ VdbeNoopComment((v, "uniqueness check for ROWID"));
+ sqlite3VdbeVerifyAbortable(v, onError);
sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData);
VdbeCoverage(v);
- /* Generate code that deals with a rowid collision */
switch( onError ){
default: {
onError = OE_Abort;
@@ -111262,6 +117010,9 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
case OE_Rollback:
case OE_Abort:
case OE_Fail: {
+ testcase( onError==OE_Rollback );
+ testcase( onError==OE_Abort );
+ testcase( onError==OE_Fail );
sqlite3RowidConstraint(pParse, onError, pTab);
break;
}
@@ -111298,14 +117049,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
regNewData, 1, 0, OE_Replace, 1, -1);
}else{
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
- if( HasRowid(pTab) ){
- /* This OP_Delete opcode fires the pre-update-hook only. It does
- ** not modify the b-tree. It is more efficient to let the coming
- ** OP_Insert replace the existing entry than it is to delete the
- ** existing entry and then insert a new one. */
- sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP);
- sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
- }
+ assert( HasRowid(pTab) );
+ /* This OP_Delete opcode fires the pre-update-hook only. It does
+ ** not modify the b-tree. It is more efficient to let the coming
+ ** OP_Insert replace the existing entry than it is to delete the
+ ** existing entry and then insert a new one. */
+ sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP);
+ sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
if( pTab->pIndex ){
sqlite3MultiWrite(pParse);
@@ -111315,8 +117065,14 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
seenReplace = 1;
break;
}
+#ifndef SQLITE_OMIT_UPSERT
+ case OE_Update: {
+ sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, 0, iDataCur);
+ /* Fall through */
+ }
+#endif
case OE_Ignore: {
- /*assert( seenReplace==0 );*/
+ testcase( onError==OE_Ignore );
sqlite3VdbeGoto(v, ignoreDest);
break;
}
@@ -111324,7 +117080,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
sqlite3VdbeResolveLabel(v, addrRowidOk);
if( ipkTop ){
ipkBottom = sqlite3VdbeAddOp0(v, OP_Goto);
- sqlite3VdbeJumpHere(v, ipkTop);
+ sqlite3VdbeJumpHere(v, ipkTop-1);
}
}
@@ -111342,12 +117098,21 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */
if( aRegIdx[ix]==0 ) continue; /* Skip indices that do not change */
- if( bAffinityDone==0 ){
+ if( pUpIdx==pIdx ){
+ addrUniqueOk = upsertJump+1;
+ upsertBypass = sqlite3VdbeGoto(v, 0);
+ VdbeComment((v, "Skip upsert subroutine"));
+ sqlite3VdbeJumpHere(v, upsertJump);
+ }else{
+ addrUniqueOk = sqlite3VdbeMakeLabel(v);
+ }
+ if( bAffinityDone==0 && (pUpIdx==0 || pUpIdx==pIdx) ){
sqlite3TableAffinity(v, pTab, regNewData+1);
bAffinityDone = 1;
}
+ VdbeNoopComment((v, "uniqueness check for %s", pIdx->zName));
iThisCur = iIdxCur+ix;
- addrUniqueOk = sqlite3VdbeMakeLabel(v);
+
/* Skip partial indices for which the WHERE clause is not true */
if( pIdx->pPartIdxWhere ){
@@ -111407,6 +117172,15 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
onError = OE_Abort;
}
+ /* Figure out if the upsert clause applies to this index */
+ if( pUpIdx==pIdx ){
+ if( pUpsert->pUpsertSet==0 ){
+ onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */
+ }else{
+ onError = OE_Update; /* DO UPDATE */
+ }
+ }
+
/* Collision detection may be omitted if all of the following are true:
** (1) The conflict resolution algorithm is REPLACE
** (2) The table is a WITHOUT ROWID table
@@ -111427,6 +117201,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
}
/* Check to see if the new index entry will be unique */
+ sqlite3VdbeVerifyAbortable(v, onError);
sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk,
regIdx, pIdx->nKeyCol); VdbeCoverage(v);
@@ -111488,25 +117263,37 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
/* Generate code that executes if the new index entry is not unique */
assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail
- || onError==OE_Ignore || onError==OE_Replace );
+ || onError==OE_Ignore || onError==OE_Replace || onError==OE_Update );
switch( onError ){
case OE_Rollback:
case OE_Abort:
case OE_Fail: {
+ testcase( onError==OE_Rollback );
+ testcase( onError==OE_Abort );
+ testcase( onError==OE_Fail );
sqlite3UniqueConstraint(pParse, onError, pIdx);
break;
}
+#ifndef SQLITE_OMIT_UPSERT
+ case OE_Update: {
+ sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, pIdx, iIdxCur+ix);
+ /* Fall through */
+ }
+#endif
case OE_Ignore: {
+ testcase( onError==OE_Ignore );
sqlite3VdbeGoto(v, ignoreDest);
break;
}
default: {
Trigger *pTrigger = 0;
assert( onError==OE_Replace );
- sqlite3MultiWrite(pParse);
if( db->flags&SQLITE_RecTriggers ){
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
}
+ if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){
+ sqlite3MultiWrite(pParse);
+ }
sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur,
regR, nPkField, 0, OE_Replace,
(pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur);
@@ -111514,14 +117301,22 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
break;
}
}
- sqlite3VdbeResolveLabel(v, addrUniqueOk);
+ if( pUpIdx==pIdx ){
+ sqlite3VdbeGoto(v, upsertJump+1);
+ sqlite3VdbeJumpHere(v, upsertBypass);
+ }else{
+ sqlite3VdbeResolveLabel(v, addrUniqueOk);
+ }
if( regR!=regIdx ) sqlite3ReleaseTempRange(pParse, regR, nPkField);
}
+
+ /* If the IPK constraint is a REPLACE, run it last */
if( ipkTop ){
sqlite3VdbeGoto(v, ipkTop+1);
+ VdbeComment((v, "Do IPK REPLACE"));
sqlite3VdbeJumpHere(v, ipkBottom);
}
-
+
*pbMayReplace = seenReplace;
VdbeModuleComment((v, "END: GenCnstCks(%d)", seenReplace));
}
@@ -111617,7 +117412,6 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion(
sqlite3SetMakeRecordP5(v, pTab);
if( !bAffinityDone ){
sqlite3TableAffinity(v, pTab, 0);
- sqlite3ExprCacheAffinityChange(pParse, regData, pTab->nCol);
}
if( pParse->nested ){
pik_flags = 0;
@@ -111863,7 +117657,6 @@ static int xferOptimization(
if( pSelect->pLimit ){
return 0; /* SELECT may not have a LIMIT clause */
}
- assert( pSelect->pOffset==0 ); /* Must be so if pLimit==0 */
if( pSelect->pPrior ){
return 0; /* SELECT may not be a compound query */
}
@@ -112021,6 +117814,7 @@ static int xferOptimization(
emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v);
if( pDest->iPKey>=0 ){
addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid);
+ sqlite3VdbeVerifyAbortable(v, onError);
addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid);
VdbeCoverage(v);
sqlite3RowidConstraint(pParse, onError, pDest);
@@ -112575,6 +118369,33 @@ struct sqlite3_api_routines {
int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*));
void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*));
void *(*value_pointer)(sqlite3_value*,const char*);
+ int (*vtab_nochange)(sqlite3_context*);
+ int (*value_nochange)(sqlite3_value*);
+ const char *(*vtab_collation)(sqlite3_index_info*,int);
+ /* Version 3.24.0 and later */
+ int (*keyword_count)(void);
+ int (*keyword_name)(int,const char**,int*);
+ int (*keyword_check)(const char*,int);
+ sqlite3_str *(*str_new)(sqlite3*);
+ char *(*str_finish)(sqlite3_str*);
+ void (*str_appendf)(sqlite3_str*, const char *zFormat, ...);
+ void (*str_vappendf)(sqlite3_str*, const char *zFormat, va_list);
+ void (*str_append)(sqlite3_str*, const char *zIn, int N);
+ void (*str_appendall)(sqlite3_str*, const char *zIn);
+ void (*str_appendchar)(sqlite3_str*, int N, char C);
+ void (*str_reset)(sqlite3_str*);
+ int (*str_errcode)(sqlite3_str*);
+ int (*str_length)(sqlite3_str*);
+ char *(*str_value)(sqlite3_str*);
+ /* Version 3.25.0 and later */
+ int (*create_window_function)(sqlite3*,const char*,int,int,void*,
+ void (*xStep)(sqlite3_context*,int,sqlite3_value**),
+ void (*xFinal)(sqlite3_context*),
+ void (*xValue)(sqlite3_context*),
+ void (*xInv)(sqlite3_context*,int,sqlite3_value**),
+ void(*xDestroy)(void*));
+ /* Version 3.26.0 and later */
+ const char *(*normalized_sql)(sqlite3_stmt*);
};
/*
@@ -112841,6 +118662,29 @@ typedef int (*sqlite3_loadext_entry)(
#define sqlite3_bind_pointer sqlite3_api->bind_pointer
#define sqlite3_result_pointer sqlite3_api->result_pointer
#define sqlite3_value_pointer sqlite3_api->value_pointer
+/* Version 3.22.0 and later */
+#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange
+#define sqlite3_value_nochange sqlite3_api->value_nochange
+#define sqlite3_vtab_collation sqlite3_api->vtab_collation
+/* Version 3.24.0 and later */
+#define sqlite3_keyword_count sqlite3_api->keyword_count
+#define sqlite3_keyword_name sqlite3_api->keyword_name
+#define sqlite3_keyword_check sqlite3_api->keyword_check
+#define sqlite3_str_new sqlite3_api->str_new
+#define sqlite3_str_finish sqlite3_api->str_finish
+#define sqlite3_str_appendf sqlite3_api->str_appendf
+#define sqlite3_str_vappendf sqlite3_api->str_vappendf
+#define sqlite3_str_append sqlite3_api->str_append
+#define sqlite3_str_appendall sqlite3_api->str_appendall
+#define sqlite3_str_appendchar sqlite3_api->str_appendchar
+#define sqlite3_str_reset sqlite3_api->str_reset
+#define sqlite3_str_errcode sqlite3_api->str_errcode
+#define sqlite3_str_length sqlite3_api->str_length
+#define sqlite3_str_value sqlite3_api->str_value
+/* Version 3.25.0 and later */
+#define sqlite3_create_window_function sqlite3_api->create_window_function
+/* Version 3.26.0 and later */
+#define sqlite3_normalized_sql sqlite3_api->normalized_sql
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
@@ -112929,6 +118773,7 @@ typedef int (*sqlite3_loadext_entry)(
# define sqlite3_declare_vtab 0
# define sqlite3_vtab_config 0
# define sqlite3_vtab_on_conflict 0
+# define sqlite3_vtab_collation 0
#endif
#ifdef SQLITE_OMIT_SHARED_CACHE
@@ -113275,7 +119120,34 @@ static const sqlite3_api_routines sqlite3Apis = {
sqlite3_prepare16_v3,
sqlite3_bind_pointer,
sqlite3_result_pointer,
- sqlite3_value_pointer
+ sqlite3_value_pointer,
+ /* Version 3.22.0 and later */
+ sqlite3_vtab_nochange,
+ sqlite3_value_nochange,
+ sqlite3_vtab_collation,
+ /* Version 3.24.0 and later */
+ sqlite3_keyword_count,
+ sqlite3_keyword_name,
+ sqlite3_keyword_check,
+ sqlite3_str_new,
+ sqlite3_str_finish,
+ sqlite3_str_appendf,
+ sqlite3_str_vappendf,
+ sqlite3_str_append,
+ sqlite3_str_appendall,
+ sqlite3_str_appendchar,
+ sqlite3_str_reset,
+ sqlite3_str_errcode,
+ sqlite3_str_length,
+ sqlite3_str_value,
+ /* Version 3.25.0 and later */
+ sqlite3_create_window_function,
+ /* Version 3.26.0 and later */
+#ifdef SQLITE_ENABLE_NORMALIZE
+ sqlite3_normalized_sql
+#else
+ 0
+#endif
};
/*
@@ -113725,10 +119597,9 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){
#define PragTyp_ACTIVATE_EXTENSIONS 40
#define PragTyp_HEXKEY 41
#define PragTyp_KEY 42
-#define PragTyp_REKEY 43
-#define PragTyp_LOCK_STATUS 44
-#define PragTyp_PARSER_TRACE 45
-#define PragTyp_STATS 46
+#define PragTyp_LOCK_STATUS 43
+#define PragTyp_PARSER_TRACE 44
+#define PragTyp_STATS 45
/* Property flags associated with various pragma. */
#define PragFlg_NeedSchema 0x01 /* Force schema load before running */
@@ -113745,58 +119616,57 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){
** result column is different from the name of the pragma
*/
static const char *const pragCName[] = {
- /* 0 */ "cache_size", /* Used by: default_cache_size */
- /* 1 */ "cid", /* Used by: table_info */
- /* 2 */ "name",
- /* 3 */ "type",
- /* 4 */ "notnull",
- /* 5 */ "dflt_value",
- /* 6 */ "pk",
- /* 7 */ "tbl", /* Used by: stats */
- /* 8 */ "idx",
- /* 9 */ "wdth",
- /* 10 */ "hght",
- /* 11 */ "flgs",
- /* 12 */ "seqno", /* Used by: index_info */
- /* 13 */ "cid",
- /* 14 */ "name",
+ /* 0 */ "id", /* Used by: foreign_key_list */
+ /* 1 */ "seq",
+ /* 2 */ "table",
+ /* 3 */ "from",
+ /* 4 */ "to",
+ /* 5 */ "on_update",
+ /* 6 */ "on_delete",
+ /* 7 */ "match",
+ /* 8 */ "cid", /* Used by: table_xinfo */
+ /* 9 */ "name",
+ /* 10 */ "type",
+ /* 11 */ "notnull",
+ /* 12 */ "dflt_value",
+ /* 13 */ "pk",
+ /* 14 */ "hidden",
+ /* table_info reuses 8 */
/* 15 */ "seqno", /* Used by: index_xinfo */
/* 16 */ "cid",
/* 17 */ "name",
/* 18 */ "desc",
/* 19 */ "coll",
/* 20 */ "key",
- /* 21 */ "seq", /* Used by: index_list */
- /* 22 */ "name",
- /* 23 */ "unique",
- /* 24 */ "origin",
- /* 25 */ "partial",
- /* 26 */ "seq", /* Used by: database_list */
+ /* 21 */ "tbl", /* Used by: stats */
+ /* 22 */ "idx",
+ /* 23 */ "wdth",
+ /* 24 */ "hght",
+ /* 25 */ "flgs",
+ /* 26 */ "seq", /* Used by: index_list */
/* 27 */ "name",
- /* 28 */ "file",
- /* 29 */ "name", /* Used by: function_list */
- /* 30 */ "builtin",
- /* 31 */ "name", /* Used by: module_list pragma_list */
- /* 32 */ "seq", /* Used by: collation_list */
- /* 33 */ "name",
- /* 34 */ "id", /* Used by: foreign_key_list */
- /* 35 */ "seq",
- /* 36 */ "table",
- /* 37 */ "from",
- /* 38 */ "to",
- /* 39 */ "on_update",
- /* 40 */ "on_delete",
- /* 41 */ "match",
- /* 42 */ "table", /* Used by: foreign_key_check */
- /* 43 */ "rowid",
- /* 44 */ "parent",
- /* 45 */ "fkid",
- /* 46 */ "busy", /* Used by: wal_checkpoint */
- /* 47 */ "log",
- /* 48 */ "checkpointed",
- /* 49 */ "timeout", /* Used by: busy_timeout */
- /* 50 */ "database", /* Used by: lock_status */
- /* 51 */ "status",
+ /* 28 */ "unique",
+ /* 29 */ "origin",
+ /* 30 */ "partial",
+ /* 31 */ "table", /* Used by: foreign_key_check */
+ /* 32 */ "rowid",
+ /* 33 */ "parent",
+ /* 34 */ "fkid",
+ /* index_info reuses 15 */
+ /* 35 */ "seq", /* Used by: database_list */
+ /* 36 */ "name",
+ /* 37 */ "file",
+ /* 38 */ "busy", /* Used by: wal_checkpoint */
+ /* 39 */ "log",
+ /* 40 */ "checkpointed",
+ /* 41 */ "name", /* Used by: function_list */
+ /* 42 */ "builtin",
+ /* collation_list reuses 26 */
+ /* 43 */ "database", /* Used by: lock_status */
+ /* 44 */ "status",
+ /* 45 */ "cache_size", /* Used by: default_cache_size */
+ /* module_list pragma_list reuses 9 */
+ /* 46 */ "timeout", /* Used by: busy_timeout */
};
/* Definitions of all built-in pragmas */
@@ -113806,7 +119676,7 @@ typedef struct PragmaName {
u8 mPragFlg; /* Zero or more PragFlg_XXX values */
u8 iPragCName; /* Start of column names in pragCName[] */
u8 nPragCName; /* Num of col names. 0 means use pragma name */
- u32 iArg; /* Extra argument */
+ u64 iArg; /* Extra argument */
} PragmaName;
static const PragmaName aPragmaName[] = {
#if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD)
@@ -113842,7 +119712,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "busy_timeout",
/* ePragTyp: */ PragTyp_BUSY_TIMEOUT,
/* ePragFlg: */ PragFlg_Result0,
- /* ColNames: */ 49, 1,
+ /* ColNames: */ 46, 1,
/* iArg: */ 0 },
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
{/* zName: */ "cache_size",
@@ -113879,7 +119749,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "collation_list",
/* ePragTyp: */ PragTyp_COLLATION_LIST,
/* ePragFlg: */ PragFlg_Result0,
- /* ColNames: */ 32, 2,
+ /* ColNames: */ 26, 2,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS)
@@ -113914,14 +119784,14 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "database_list",
/* ePragTyp: */ PragTyp_DATABASE_LIST,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0,
- /* ColNames: */ 26, 3,
+ /* ColNames: */ 35, 3,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
{/* zName: */ "default_cache_size",
/* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1,
- /* ColNames: */ 0, 1,
+ /* ColNames: */ 45, 1,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
@@ -113951,14 +119821,14 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "foreign_key_check",
/* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0,
- /* ColNames: */ 42, 4,
+ /* ColNames: */ 31, 4,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_FOREIGN_KEY)
{/* zName: */ "foreign_key_list",
/* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
- /* ColNames: */ 34, 8,
+ /* ColNames: */ 0, 8,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
@@ -113994,7 +119864,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "function_list",
/* ePragTyp: */ PragTyp_FUNCTION_LIST,
/* ePragFlg: */ PragFlg_Result0,
- /* ColNames: */ 29, 2,
+ /* ColNames: */ 41, 2,
/* iArg: */ 0 },
#endif
#endif
@@ -114003,12 +119873,12 @@ static const PragmaName aPragmaName[] = {
/* ePragTyp: */ PragTyp_HEXKEY,
/* ePragFlg: */ 0,
/* ColNames: */ 0, 0,
- /* iArg: */ 0 },
+ /* iArg: */ 2 },
{/* zName: */ "hexrekey",
/* ePragTyp: */ PragTyp_HEXKEY,
/* ePragFlg: */ 0,
/* ColNames: */ 0, 0,
- /* iArg: */ 0 },
+ /* iArg: */ 3 },
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
#if !defined(SQLITE_OMIT_CHECK)
@@ -114030,12 +119900,12 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "index_info",
/* ePragTyp: */ PragTyp_INDEX_INFO,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
- /* ColNames: */ 12, 3,
+ /* ColNames: */ 15, 3,
/* iArg: */ 0 },
{/* zName: */ "index_list",
/* ePragTyp: */ PragTyp_INDEX_LIST,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
- /* ColNames: */ 21, 5,
+ /* ColNames: */ 26, 5,
/* iArg: */ 0 },
{/* zName: */ "index_xinfo",
/* ePragTyp: */ PragTyp_INDEX_INFO,
@@ -114070,6 +119940,11 @@ static const PragmaName aPragmaName[] = {
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
+ {/* zName: */ "legacy_alter_table",
+ /* ePragTyp: */ PragTyp_FLAG,
+ /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1,
+ /* ColNames: */ 0, 0,
+ /* iArg: */ SQLITE_LegacyAlter },
{/* zName: */ "legacy_file_format",
/* ePragTyp: */ PragTyp_FLAG,
/* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1,
@@ -114087,7 +119962,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "lock_status",
/* ePragTyp: */ PragTyp_LOCK_STATUS,
/* ePragFlg: */ PragFlg_Result0,
- /* ColNames: */ 50, 2,
+ /* ColNames: */ 43, 2,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
@@ -114113,7 +119988,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "module_list",
/* ePragTyp: */ PragTyp_MODULE_LIST,
/* ePragFlg: */ PragFlg_Result0,
- /* ColNames: */ 31, 1,
+ /* ColNames: */ 9, 1,
/* iArg: */ 0 },
#endif
#endif
@@ -114146,7 +120021,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "pragma_list",
/* ePragTyp: */ PragTyp_PRAGMA_LIST,
/* ePragFlg: */ PragFlg_Result0,
- /* ColNames: */ 31, 1,
+ /* ColNames: */ 9, 1,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
@@ -114177,10 +120052,10 @@ static const PragmaName aPragmaName[] = {
#endif
#if defined(SQLITE_HAS_CODEC)
{/* zName: */ "rekey",
- /* ePragTyp: */ PragTyp_REKEY,
+ /* ePragTyp: */ PragTyp_KEY,
/* ePragFlg: */ 0,
/* ColNames: */ 0, 0,
- /* iArg: */ 0 },
+ /* iArg: */ 1 },
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{/* zName: */ "reverse_unordered_selects",
@@ -114233,7 +120108,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "stats",
/* ePragTyp: */ PragTyp_STATS,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq,
- /* ColNames: */ 7, 5,
+ /* ColNames: */ 21, 5,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
@@ -114247,8 +120122,13 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "table_info",
/* ePragTyp: */ PragTyp_TABLE_INFO,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
- /* ColNames: */ 1, 6,
+ /* ColNames: */ 8, 6,
/* iArg: */ 0 },
+ {/* zName: */ "table_xinfo",
+ /* ePragTyp: */ PragTyp_TABLE_INFO,
+ /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
+ /* ColNames: */ 8, 7,
+ /* iArg: */ 1 },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
{/* zName: */ "temp_store",
@@ -114262,6 +120142,18 @@ static const PragmaName aPragmaName[] = {
/* ColNames: */ 0, 0,
/* iArg: */ 0 },
#endif
+#if defined(SQLITE_HAS_CODEC)
+ {/* zName: */ "textkey",
+ /* ePragTyp: */ PragTyp_KEY,
+ /* ePragFlg: */ 0,
+ /* ColNames: */ 0, 0,
+ /* iArg: */ 4 },
+ {/* zName: */ "textrekey",
+ /* ePragTyp: */ PragTyp_KEY,
+ /* ePragFlg: */ 0,
+ /* ColNames: */ 0, 0,
+ /* iArg: */ 5 },
+#endif
{/* zName: */ "threads",
/* ePragTyp: */ PragTyp_THREADS,
/* ePragFlg: */ PragFlg_Result0,
@@ -114312,7 +120204,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "wal_checkpoint",
/* ePragTyp: */ PragTyp_WAL_CHECKPOINT,
/* ePragFlg: */ PragFlg_NeedSchema,
- /* ColNames: */ 46, 3,
+ /* ColNames: */ 38, 3,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
@@ -114320,10 +120212,10 @@ static const PragmaName aPragmaName[] = {
/* ePragTyp: */ PragTyp_FLAG,
/* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1,
/* ColNames: */ 0, 0,
- /* iArg: */ SQLITE_WriteSchema },
+ /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError },
#endif
};
-/* Number of pragmas: 60 on by default, 77 total. */
+/* Number of pragmas: 62 on by default, 81 total. */
/************** End of pragma.h **********************************************/
/************** Continuing where we left off in pragma.c *********************/
@@ -115335,7 +121227,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
setPragmaResultColumnNames(v, pPragma);
returnSingleInt(v, (db->flags & pPragma->iArg)!=0 );
}else{
- int mask = pPragma->iArg; /* Mask of bits to set or clear. */
+ u64 mask = pPragma->iArg; /* Mask of bits to set or clear. */
if( db->autoCommit==0 ){
/* Foreign key support may not be enabled or disabled while not
** in auto-commit mode. */
@@ -115378,20 +121270,23 @@ SQLITE_PRIVATE void sqlite3Pragma(
** type: Column declaration type.
** notnull: True if 'NOT NULL' is part of column declaration
** dflt_value: The default value for the column, if any.
+ ** pk: Non-zero for PK fields.
*/
case PragTyp_TABLE_INFO: if( zRight ){
Table *pTab;
pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb);
if( pTab ){
+ int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
int i, k;
int nHidden = 0;
Column *pCol;
Index *pPk = sqlite3PrimaryKeyIndex(pTab);
- pParse->nMem = 6;
- sqlite3CodeVerifySchema(pParse, iDb);
+ pParse->nMem = 7;
+ sqlite3CodeVerifySchema(pParse, iTabDb);
sqlite3ViewGetColumnNames(pParse, pTab);
for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){
- if( IsHiddenColumn(pCol) ){
+ int isHidden = IsHiddenColumn(pCol);
+ if( isHidden && pPragma->iArg==0 ){
nHidden++;
continue;
}
@@ -115403,13 +121298,14 @@ SQLITE_PRIVATE void sqlite3Pragma(
for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){}
}
assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN );
- sqlite3VdbeMultiLoad(v, 1, "issisi",
+ sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi",
i-nHidden,
pCol->zName,
sqlite3ColumnType(pCol,""),
pCol->notNull ? 1 : 0,
pCol->pDflt ? pCol->pDflt->u.zToken : 0,
- k);
+ k,
+ isHidden);
}
}
}
@@ -115447,6 +121343,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
Table *pTab;
pIdx = sqlite3FindIndex(db, zRight, zDb);
if( pIdx ){
+ int iIdxDb = sqlite3SchemaToIndex(db, pIdx->pSchema);
int i;
int mx;
if( pPragma->iArg ){
@@ -115459,7 +121356,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
pParse->nMem = 3;
}
pTab = pIdx->pTable;
- sqlite3CodeVerifySchema(pParse, iDb);
+ sqlite3CodeVerifySchema(pParse, iIdxDb);
assert( pParse->nMem<=pPragma->nPragCName );
for(i=0; i<mx; i++){
i16 cnum = pIdx->aiColumn[i];
@@ -115483,8 +121380,9 @@ SQLITE_PRIVATE void sqlite3Pragma(
int i;
pTab = sqlite3FindTable(db, zRight, zDb);
if( pTab ){
+ int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
pParse->nMem = 5;
- sqlite3CodeVerifySchema(pParse, iDb);
+ sqlite3CodeVerifySchema(pParse, iTabDb);
for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){
const char *azOrigin[] = { "c", "u", "pk" };
sqlite3VdbeMultiLoad(v, 1, "isisi",
@@ -115531,6 +121429,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
pParse->nMem = 2;
for(i=0; i<SQLITE_FUNC_HASH_SZ; i++){
for(p=sqlite3BuiltinFunctions.a[i]; p; p=p->u.pHash ){
+ if( p->funcFlags & SQLITE_FUNC_INTERNAL ) continue;
sqlite3VdbeMultiLoad(v, 1, "si", p->zName, 1);
}
}
@@ -115572,9 +121471,10 @@ SQLITE_PRIVATE void sqlite3Pragma(
if( pTab ){
pFK = pTab->pFKey;
if( pFK ){
+ int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
int i = 0;
pParse->nMem = 8;
- sqlite3CodeVerifySchema(pParse, iDb);
+ sqlite3CodeVerifySchema(pParse, iTabDb);
while(pFK){
int j;
for(j=0; j<pFK->nCol; j++){
@@ -115619,9 +121519,9 @@ SQLITE_PRIVATE void sqlite3Pragma(
pParse->nMem += 4;
regKey = ++pParse->nMem;
regRow = ++pParse->nMem;
- sqlite3CodeVerifySchema(pParse, iDb);
k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash);
while( k ){
+ int iTabDb;
if( zRight ){
pTab = sqlite3LocateTable(pParse, 0, zRight, zDb);
k = 0;
@@ -115630,21 +121530,23 @@ SQLITE_PRIVATE void sqlite3Pragma(
k = sqliteHashNext(k);
}
if( pTab==0 || pTab->pFKey==0 ) continue;
- sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
+ iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+ sqlite3CodeVerifySchema(pParse, iTabDb);
+ sqlite3TableLock(pParse, iTabDb, pTab->tnum, 0, pTab->zName);
if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow;
- sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead);
+ sqlite3OpenTable(pParse, 0, iTabDb, pTab, OP_OpenRead);
sqlite3VdbeLoadString(v, regResult, pTab->zName);
for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){
pParent = sqlite3FindTable(db, pFK->zTo, zDb);
if( pParent==0 ) continue;
pIdx = 0;
- sqlite3TableLock(pParse, iDb, pParent->tnum, 0, pParent->zName);
+ sqlite3TableLock(pParse, iTabDb, pParent->tnum, 0, pParent->zName);
x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0);
if( x==0 ){
if( pIdx==0 ){
- sqlite3OpenTable(pParse, i, iDb, pParent, OP_OpenRead);
+ sqlite3OpenTable(pParse, i, iTabDb, pParent, OP_OpenRead);
}else{
- sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iDb);
+ sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iTabDb);
sqlite3VdbeSetP4KeyInfo(pParse, pIdx);
}
}else{
@@ -115847,7 +121749,6 @@ SQLITE_PRIVATE void sqlite3Pragma(
if( pTab->tnum<1 ) continue; /* Skip VIEWs or VIRTUAL TABLEs */
pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
- sqlite3ExprCacheClear(pParse);
sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0,
1, 0, &iDataCur, &iIdxCur);
/* reg[7] counts the number of entries in the table.
@@ -115861,6 +121762,11 @@ SQLITE_PRIVATE void sqlite3Pragma(
assert( sqlite3NoTempsInRange(pParse,1,7+j) );
sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v);
loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1);
+ if( !isQuick ){
+ /* Sanity check on record header decoding */
+ sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nCol-1, 3);
+ sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG);
+ }
/* Verify that all NOT NULL columns really are NOT NULL */
for(j=0; j<pTab->nCol; j++){
char *zErr;
@@ -115885,7 +121791,6 @@ SQLITE_PRIVATE void sqlite3Pragma(
char *zErr;
int k;
pParse->iSelfTab = iDataCur + 1;
- sqlite3ExprCachePush(pParse);
for(k=pCheck->nExpr-1; k>0; k--){
sqlite3ExprIfFalse(pParse, pCheck->a[k].pExpr, addrCkFault, 0);
}
@@ -115898,14 +121803,10 @@ SQLITE_PRIVATE void sqlite3Pragma(
sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC);
integrityCheckResultRow(v);
sqlite3VdbeResolveLabel(v, addrCkOk);
- sqlite3ExprCachePop(pParse);
}
sqlite3ExprListDelete(db, pCheck);
}
if( !isQuick ){ /* Omit the remaining tests for quick_check */
- /* Sanity check on record header decoding */
- sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nCol-1, 3);
- sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG);
/* Validate index entries for the current row */
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
int jmp2, jmp3, jmp4, jmp5;
@@ -116414,12 +122315,24 @@ SQLITE_PRIVATE void sqlite3Pragma(
#endif
#ifdef SQLITE_HAS_CODEC
+ /* Pragma iArg
+ ** ---------- ------
+ ** key 0
+ ** rekey 1
+ ** hexkey 2
+ ** hexrekey 3
+ ** textkey 4
+ ** textrekey 5
+ */
case PragTyp_KEY: {
- if( zRight ) sqlite3_key_v2(db, zDb, zRight, sqlite3Strlen30(zRight));
- break;
- }
- case PragTyp_REKEY: {
- if( zRight ) sqlite3_rekey_v2(db, zDb, zRight, sqlite3Strlen30(zRight));
+ if( zRight ){
+ int n = pPragma->iArg<4 ? sqlite3Strlen30(zRight) : -1;
+ if( (pPragma->iArg & 1)==0 ){
+ sqlite3_key_v2(db, zDb, zRight, n);
+ }else{
+ sqlite3_rekey_v2(db, zDb, zRight, n);
+ }
+ }
break;
}
case PragTyp_HEXKEY: {
@@ -116431,7 +122344,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
iByte = (iByte<<4) + sqlite3HexToInt(zRight[i]);
if( (i&1)!=0 ) zKey[i/2] = iByte;
}
- if( (zLeft[3] & 0xf)==0xb ){
+ if( (pPragma->iArg & 1)==0 ){
sqlite3_key_v2(db, zDb, zKey, i/2);
}else{
sqlite3_rekey_v2(db, zDb, zKey, i/2);
@@ -116513,26 +122426,25 @@ static int pragmaVtabConnect(
UNUSED_PARAMETER(argc);
UNUSED_PARAMETER(argv);
sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
- sqlite3StrAccumAppendAll(&acc, "CREATE TABLE x");
+ sqlite3_str_appendall(&acc, "CREATE TABLE x");
for(i=0, j=pPragma->iPragCName; i<pPragma->nPragCName; i++, j++){
- sqlite3XPrintf(&acc, "%c\"%s\"", cSep, pragCName[j]);
+ sqlite3_str_appendf(&acc, "%c\"%s\"", cSep, pragCName[j]);
cSep = ',';
}
if( i==0 ){
- sqlite3XPrintf(&acc, "(\"%s\"", pPragma->zName);
- cSep = ',';
+ sqlite3_str_appendf(&acc, "(\"%s\"", pPragma->zName);
i++;
}
j = 0;
if( pPragma->mPragFlg & PragFlg_Result1 ){
- sqlite3StrAccumAppendAll(&acc, ",arg HIDDEN");
+ sqlite3_str_appendall(&acc, ",arg HIDDEN");
j++;
}
if( pPragma->mPragFlg & (PragFlg_SchemaOpt|PragFlg_SchemaReq) ){
- sqlite3StrAccumAppendAll(&acc, ",schema HIDDEN");
+ sqlite3_str_appendall(&acc, ",schema HIDDEN");
j++;
}
- sqlite3StrAccumAppend(&acc, ")", 1);
+ sqlite3_str_append(&acc, ")", 1);
sqlite3StrAccumFinish(&acc);
assert( strlen(zBuf) < sizeof(zBuf)-1 );
rc = sqlite3_declare_vtab(db, zBuf);
@@ -116684,13 +122596,13 @@ static int pragmaVtabFilter(
}
}
sqlite3StrAccumInit(&acc, 0, 0, 0, pTab->db->aLimit[SQLITE_LIMIT_SQL_LENGTH]);
- sqlite3StrAccumAppendAll(&acc, "PRAGMA ");
+ sqlite3_str_appendall(&acc, "PRAGMA ");
if( pCsr->azArg[1] ){
- sqlite3XPrintf(&acc, "%Q.", pCsr->azArg[1]);
+ sqlite3_str_appendf(&acc, "%Q.", pCsr->azArg[1]);
}
- sqlite3StrAccumAppendAll(&acc, pTab->pName->zName);
+ sqlite3_str_appendall(&acc, pTab->pName->zName);
if( pCsr->azArg[0] ){
- sqlite3XPrintf(&acc, "=%Q", pCsr->azArg[0]);
+ sqlite3_str_appendf(&acc, "=%Q", pCsr->azArg[0]);
}
zSql = sqlite3StrAccumFinish(&acc);
if( zSql==0 ) return SQLITE_NOMEM;
@@ -116762,7 +122674,8 @@ static const sqlite3_module pragmaVtabModule = {
0, /* xRename - rename the table */
0, /* xSavepoint */
0, /* xRelease */
- 0 /* xRollbackTo */
+ 0, /* xRollbackTo */
+ 0 /* xShadowName */
};
/*
@@ -116813,15 +122726,23 @@ static void corruptSchema(
const char *zExtra /* Error information */
){
sqlite3 *db = pData->db;
- if( !db->mallocFailed && (db->flags & SQLITE_WriteSchema)==0 ){
+ if( db->mallocFailed ){
+ pData->rc = SQLITE_NOMEM_BKPT;
+ }else if( pData->pzErrMsg[0]!=0 ){
+ /* A error message has already been generated. Do not overwrite it */
+ }else if( pData->mInitFlags & INITFLAG_AlterTable ){
+ *pData->pzErrMsg = sqlite3DbStrDup(db, zExtra);
+ pData->rc = SQLITE_ERROR;
+ }else if( db->flags & SQLITE_WriteSchema ){
+ pData->rc = SQLITE_CORRUPT_BKPT;
+ }else{
char *z;
if( zObj==0 ) zObj = "?";
z = sqlite3MPrintf(db, "malformed database schema (%s)", zObj);
- if( zExtra ) z = sqlite3MPrintf(db, "%z - %s", z, zExtra);
- sqlite3DbFree(db, *pData->pzErrMsg);
+ if( zExtra && zExtra[0] ) z = sqlite3MPrintf(db, "%z - %s", z, zExtra);
*pData->pzErrMsg = z;
+ pData->rc = SQLITE_CORRUPT_BKPT;
}
- pData->rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_CORRUPT_BKPT;
}
/*
@@ -116873,7 +122794,7 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char
rc = db->errCode;
assert( (rc&0xFF)==(rcp&0xFF) );
db->init.iDb = saved_iDb;
- assert( saved_iDb==0 || (db->mDbFlags & DBFLAG_Vacuum)!=0 );
+ /* assert( saved_iDb==0 || (db->mDbFlags & DBFLAG_Vacuum)!=0 ); */
if( SQLITE_OK!=rc ){
if( db->init.orphanTrigger ){
assert( iDb==1 );
@@ -116920,7 +122841,7 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char
** auxiliary databases. Return one of the SQLITE_ error codes to
** indicate success or failure.
*/
-static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
+SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){
int rc;
int i;
#ifndef SQLITE_OMIT_DEPRECATED
@@ -116933,6 +122854,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
const char *zMasterName;
int openedTransaction = 0;
+ assert( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 );
assert( iDb>=0 && iDb<db->nDb );
assert( db->aDb[iDb].pSchema );
assert( sqlite3_mutex_held(db->mutex) );
@@ -116954,6 +122876,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
initData.iDb = iDb;
initData.rc = SQLITE_OK;
initData.pzErrMsg = pzErrMsg;
+ initData.mInitFlags = mFlags;
sqlite3InitCallback(&initData, 3, (char **)azArg, 0);
if( initData.rc ){
rc = initData.rc;
@@ -116975,7 +122898,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
** will be closed before this function returns. */
sqlite3BtreeEnter(pDb->pBt);
if( !sqlite3BtreeIsInReadTrans(pDb->pBt) ){
- rc = sqlite3BtreeBeginTrans(pDb->pBt, 0);
+ rc = sqlite3BtreeBeginTrans(pDb->pBt, 0, 0);
if( rc!=SQLITE_OK ){
sqlite3SetString(pzErrMsg, db, sqlite3ErrStr(rc));
goto initone_error_out;
@@ -117003,6 +122926,9 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
for(i=0; i<ArraySize(meta); i++){
sqlite3BtreeGetMeta(pDb->pBt, i+1, (u32 *)&meta[i]);
}
+ if( (db->flags & SQLITE_ResetDatabase)!=0 ){
+ memset(meta, 0, sizeof(meta));
+ }
pDb->pSchema->schema_cookie = meta[BTREE_SCHEMA_VERSION-1];
/* If opening a non-empty database, check the text encoding. For the
@@ -117102,8 +123028,8 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
rc = SQLITE_NOMEM_BKPT;
sqlite3ResetAllSchemasOfConnection(db);
}
- if( rc==SQLITE_OK || (db->flags&SQLITE_WriteSchema)){
- /* Black magic: If the SQLITE_WriteSchema flag is set, then consider
+ if( rc==SQLITE_OK || (db->flags&SQLITE_NoSchemaError)){
+ /* Black magic: If the SQLITE_NoSchemaError flag is set, then consider
** the schema loaded, even if errors occurred. In this situation the
** current sqlite3_prepare() operation will fail, but the following one
** will attempt to compile the supplied statement against whatever subset
@@ -117157,13 +123083,14 @@ SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){
assert( db->nDb>0 );
/* Do the main schema first */
if( !DbHasProperty(db, 0, DB_SchemaLoaded) ){
- rc = sqlite3InitOne(db, 0, pzErrMsg);
+ rc = sqlite3InitOne(db, 0, pzErrMsg, 0);
if( rc ) return rc;
}
/* All other schemas after the main schema. The "temp" schema must be last */
for(i=db->nDb-1; i>0; i--){
+ assert( i==1 || sqlite3BtreeHoldsMutex(db->aDb[i].pBt) );
if( !DbHasProperty(db, i, DB_SchemaLoaded) ){
- rc = sqlite3InitOne(db, i, pzErrMsg);
+ rc = sqlite3InitOne(db, i, pzErrMsg, 0);
if( rc ) return rc;
}
}
@@ -117183,10 +123110,12 @@ SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse){
assert( sqlite3_mutex_held(db->mutex) );
if( !db->init.busy ){
rc = sqlite3Init(db, &pParse->zErrMsg);
- }
- if( rc!=SQLITE_OK ){
- pParse->rc = rc;
- pParse->nErr++;
+ if( rc!=SQLITE_OK ){
+ pParse->rc = rc;
+ pParse->nErr++;
+ }else if( db->noSharedCache ){
+ db->mDbFlags |= DBFLAG_SchemaKnownOk;
+ }
}
return rc;
}
@@ -117214,7 +123143,7 @@ static void schemaIsValid(Parse *pParse){
** on the b-tree database, open one now. If a transaction is opened, it
** will be closed immediately after reading the meta-value. */
if( !sqlite3BtreeIsInReadTrans(pBt) ){
- rc = sqlite3BtreeBeginTrans(pBt, 0);
+ rc = sqlite3BtreeBeginTrans(pBt, 0, 0);
if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
sqlite3OomFault(db);
}
@@ -117261,7 +123190,8 @@ SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){
*/
assert( sqlite3_mutex_held(db->mutex) );
if( pSchema ){
- for(i=0; ALWAYS(i<db->nDb); i++){
+ for(i=0; 1; i++){
+ assert( i<db->nDb );
if( db->aDb[i].pSchema==pSchema ){
break;
}
@@ -117396,7 +123326,7 @@ static int sqlite3Prepare(
if( rc==SQLITE_OK && sParse.pVdbe && sParse.explain ){
static const char * const azColName[] = {
"addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment",
- "selectid", "order", "from", "detail"
+ "id", "parent", "notused", "detail"
};
int iFirst, mx;
if( sParse.explain==2 ){
@@ -117442,8 +123372,6 @@ static int sqlite3Prepare(
end_prepare:
sqlite3ParserReset(&sParse);
- rc = sqlite3ApiExit(db, rc);
- assert( (rc&db->errMask)==rc );
return rc;
}
static int sqlite3LockAndPrepare(
@@ -117456,6 +123384,7 @@ static int sqlite3LockAndPrepare(
const char **pzTail /* OUT: End of parsed string */
){
int rc;
+ int cnt = 0;
#ifdef SQLITE_ENABLE_API_ARMOR
if( ppStmt==0 ) return SQLITE_MISUSE_BKPT;
@@ -117466,18 +123395,309 @@ static int sqlite3LockAndPrepare(
}
sqlite3_mutex_enter(db->mutex);
sqlite3BtreeEnterAll(db);
- rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail);
- if( rc==SQLITE_SCHEMA ){
- sqlite3ResetOneSchema(db, -1);
- sqlite3_finalize(*ppStmt);
+ do{
+ /* Make multiple attempts to compile the SQL, until it either succeeds
+ ** or encounters a permanent error. A schema problem after one schema
+ ** reset is considered a permanent error. */
rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail);
- }
+ assert( rc==SQLITE_OK || *ppStmt==0 );
+ }while( rc==SQLITE_ERROR_RETRY
+ || (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) );
sqlite3BtreeLeaveAll(db);
+ rc = sqlite3ApiExit(db, rc);
+ assert( (rc&db->errMask)==rc );
sqlite3_mutex_leave(db->mutex);
- assert( rc==SQLITE_OK || *ppStmt==0 );
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; i<db->nDb; 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; j<pTab->nCol; 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( nOut<nSql*5 ){
+ while( z[0]!=0 && z[0]!='I' && z[0]!='i' ){ z++; }
+ if( z[0]==0 ) break;
+ z++;
+ if( z[0]!='N' && z[0]!='n' ) break;
+ z++;
+ while( sqlite3Isspace(z[0]) ){ z++; }
+ if( z[0]!='(' ) break;
+ z++;
+ nOut += 5; /* ?,?,? */
+ }
+ return nOut;
+}
+
+/*
+** Copy the current token into the output buffer while dealing with quoted
+** identifiers. By default, all letters will be converted into lowercase.
+** If the bUpper flag is set, uppercase will be used. The piOut argument
+** will be used to update the target index into the output string.
+*/
+static void copyNormalizedToken(
+ const char *zSql, /* The original SQL string */
+ int iIn, /* Current index into the original SQL string */
+ int nToken, /* Number of bytes in the current token */
+ int tokenFlags, /* Flags returned by the tokenizer */
+ char *zOut, /* The output string */
+ int *piOut /* Pointer to target index into the output string */
+){
+ int bQuoted = tokenFlags & SQLITE_TOKEN_QUOTED;
+ int bKeyword = tokenFlags & SQLITE_TOKEN_KEYWORD;
+ int j = *piOut, k = 0;
+ for(; k<nToken; k++){
+ if( bQuoted ){
+ if( k==0 && iIn>0 ){
+ 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; i<nSql && zSql[i]; i+=n){
+ int flags = 0;
+ if( tokenType!=TK_SPACE ) prevTokenType = tokenType;
+ n = sqlite3GetTokenNormalized((unsigned char*)zSql+i, &tokenType, &flags);
+ switch( tokenType ){
+ case TK_SPACE: {
+ break;
+ }
+ case TK_ILLEGAL: {
+ sqlite3DbFree(db, z);
+ sqlite3HashClear(&inHash);
+ return;
+ }
+ case TK_STRING:
+ case TK_INTEGER:
+ case TK_FLOAT:
+ case TK_VARIABLE:
+ case TK_BLOB: {
+ z[j++] = '?';
+ break;
+ }
+ case TK_LP:
+ case TK_RP: {
+ if( tokenType==TK_LP ){
+ nParen++;
+ if( prevTokenType==TK_IN ){
+ assert( nParen<nSql );
+ sqlite3HashInsert(&inHash, zSql+nParen, SQLITE_INT_TO_PTR(j));
+ }
+ }else{
+ int jj;
+ assert( nParen<nSql );
+ jj = SQLITE_PTR_TO_INT(sqlite3HashFind(&inHash, zSql+nParen));
+ if( jj>0 ){
+ sqlite3HashInsert(&inHash, zSql+nParen, 0);
+ assert( jj+6<nZ );
+ memcpy(z+jj+1, "?,?,?", 5);
+ j = jj+6;
+ assert( nZ-1-j>=0 );
+ assert( nZ-1-j<nZ );
+ memset(z+j, 0, nZ-1-j);
+ }
+ nParen--;
+ }
+ assert( nParen>=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( nParen<nSql );
+ sqlite3HashInsert(&inHash, zSql+nParen, 0);
+ }
+ if( flags&SQLITE_TOKEN_QUOTED ){ i2++; n2-=2; }
+ if( shouldTreatAsIdentifier(db, zSql+i2, n2, &rc)==0 ){
+ if( rc!=SQLITE_OK ){
+ sqlite3DbFree(db, z);
+ sqlite3HashClear(&inHash);
+ return;
+ }
+ if( sqlite3_keyword_check(zSql+i2, n2)==0 ){
+ z[j++] = '?';
+ break;
+ }
+ }
+ }
+ copyNormalizedToken(zSql, i, n, flags, z, &j);
+ break;
+ }
+ }
+ }
+ assert( j<nZ && "one" );
+ while( j>0 && z[j-1]==' ' ){ j--; }
+ if( j>0 && z[j-1]!=';' ){ z[j++] = ';'; }
+ z[j] = 0;
+ assert( j<nZ && "two" );
+ pVdbe->zNormSql = z;
+ sqlite3HashClear(&inHash);
+}
+#endif /* SQLITE_ENABLE_NORMALIZE */
+
/*
** Rerun the compilation of a statement after a schema change.
**
@@ -117708,8 +123928,7 @@ SQLITE_API int sqlite3_prepare16_v3(
/***/ int sqlite3SelectTrace = 0;
# define SELECTTRACE(K,P,S,X) \
if(sqlite3SelectTrace&(K)) \
- sqlite3DebugPrintf("%*s%s.%p: ",(P)->nSelectIndent*2-2,"",\
- (S)->zSelName,(S)),\
+ sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\
sqlite3DebugPrintf X
#else
# define SELECTTRACE(K,P,S,X)
@@ -117732,6 +123951,20 @@ struct DistinctCtx {
/*
** An instance of the following object is used to record information about
** the ORDER BY (or GROUP BY) clause of query is being coded.
+**
+** The aDefer[] array is used by the sorter-references optimization. For
+** example, assuming there is no index that can be used for the ORDER BY,
+** for the query:
+**
+** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10;
+**
+** it may be more efficient to add just the "a" values to the sorter, and
+** retrieve the associated "bigblob" values directly from table t1 as the
+** 10 smallest "a" values are extracted from the sorter.
+**
+** When the sorter-reference optimization is used, there is one entry in the
+** aDefer[] array for each database table that may be read as values are
+** extracted from the sorter.
*/
typedef struct SortCtx SortCtx;
struct SortCtx {
@@ -117742,8 +123975,17 @@ struct SortCtx {
int labelBkOut; /* Start label for the block-output subroutine */
int addrSortIndex; /* Address of the OP_SorterOpen or OP_OpenEphemeral */
int labelDone; /* Jump here when done, ex: LIMIT reached */
+ int labelOBLopt; /* Jump here when sorter is full */
u8 sortFlags; /* Zero or more SORTFLAG_* bits */
- u8 bOrderedInnerLoop; /* ORDER BY correctly sorts the inner loop */
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ u8 nDefer; /* Number of valid entries in aDefer[] */
+ struct DeferredCsr {
+ Table *pTab; /* Table definition */
+ int iCsr; /* Cursor number for table */
+ int nKey; /* Number of PK columns for table pTab (>=1) */
+ } aDefer[4];
+#endif
+ struct RowLoadInfo *pDeferredRowLoad; /* Deferred row loading info or NULL */
};
#define SORTFLAG_UseSorter 0x01 /* Use SorterOpen instead of OpenEphemeral */
@@ -117761,7 +124003,11 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){
sqlite3ExprDelete(db, p->pHaving);
sqlite3ExprListDelete(db, p->pOrderBy);
sqlite3ExprDelete(db, p->pLimit);
- sqlite3ExprDelete(db, p->pOffset);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( OK_IF_ALWAYS_TRUE(p->pWinDefn) ){
+ sqlite3WindowListDelete(db, p->pWinDefn);
+ }
+#endif
if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith);
if( bFree ) sqlite3DbFreeNN(db, p);
p = pPrior;
@@ -117794,8 +124040,7 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(
Expr *pHaving, /* the HAVING clause */
ExprList *pOrderBy, /* the ORDER BY clause */
u32 selFlags, /* Flag parameters, such as SF_Distinct */
- Expr *pLimit, /* LIMIT value. NULL means not used */
- Expr *pOffset /* OFFSET value. NULL means no offset */
+ Expr *pLimit /* LIMIT value. NULL means not used */
){
Select *pNew;
Select standin;
@@ -117813,9 +124058,7 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(
pNew->selFlags = selFlags;
pNew->iLimit = 0;
pNew->iOffset = 0;
-#if SELECTTRACE_ENABLED
- pNew->zSelName[0] = 0;
-#endif
+ pNew->selId = ++pParse->nSelect;
pNew->addrOpenEphm[0] = -1;
pNew->addrOpenEphm[1] = -1;
pNew->nSelectRow = 0;
@@ -117828,10 +124071,11 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(
pNew->pPrior = 0;
pNew->pNext = 0;
pNew->pLimit = pLimit;
- pNew->pOffset = pOffset;
pNew->pWith = 0;
- assert( pOffset==0 || pLimit!=0 || pParse->nErr>0
- || pParse->db->mallocFailed!=0 );
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ pNew->pWin = 0;
+ pNew->pWinDefn = 0;
+#endif
if( pParse->db->mallocFailed ) {
clearSelect(pParse->db, pNew, pNew!=&standin);
pNew = 0;
@@ -117842,17 +124086,6 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(
return pNew;
}
-#if SELECTTRACE_ENABLED
-/*
-** Set the name of a Select object
-*/
-SQLITE_PRIVATE void sqlite3SelectSetName(Select *p, const char *zName){
- if( p && zName ){
- sqlite3_snprintf(sizeof(p->zSelName), p->zSelName, "%s", zName);
- }
-}
-#endif
-
/*
** Delete the given Select structure and all of its substructures.
@@ -118075,6 +124308,29 @@ static void setJoinExpr(Expr *p, int iTable){
}
}
+/* Undo the work of setJoinExpr(). In the expression tree p, convert every
+** term that is marked with EP_FromJoin and iRightJoinTable==iTable into
+** an ordinary term that omits the EP_FromJoin mark.
+**
+** This happens when a LEFT JOIN is simplified into an ordinary JOIN.
+*/
+static void unsetJoinExpr(Expr *p, int iTable){
+ while( p ){
+ if( ExprHasProperty(p, EP_FromJoin)
+ && (iTable<0 || p->iRightJoinTable==iTable) ){
+ ExprClearProperty(p, EP_FromJoin);
+ }
+ if( p->op==TK_FUNCTION && p->x.pList ){
+ int i;
+ for(i=0; i<p->x.pList->nExpr; i++){
+ unsetJoinExpr(p->x.pList->a[i].pExpr, iTable);
+ }
+ }
+ unsetJoinExpr(p->pLeft, iTable);
+ p = p->pRight;
+ }
+}
+
/*
** This routine processes the join information for a SELECT statement.
** ON and USING clauses are converted into extra terms of the WHERE clause.
@@ -118176,13 +124432,61 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){
return 0;
}
-/* Forward reference */
-static KeyInfo *keyInfoFromExprList(
- Parse *pParse, /* Parsing context */
- ExprList *pList, /* Form the KeyInfo object from this ExprList */
- int iStart, /* Begin with this column of pList */
- int nExtra /* Add this many extra columns to the end */
-);
+/*
+** An instance of this object holds information (beyond pParse and pSelect)
+** needed to load the next result row that is to be added to the sorter.
+*/
+typedef struct RowLoadInfo RowLoadInfo;
+struct RowLoadInfo {
+ int regResult; /* Store results in array of registers here */
+ u8 ecelFlags; /* Flag argument to ExprCodeExprList() */
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ ExprList *pExtra; /* Extra columns needed by sorter refs */
+ int regExtraResult; /* Where to load the extra columns */
+#endif
+};
+
+/*
+** This routine does the work of loading query data into an array of
+** registers so that it can be added to the sorter.
+*/
+static void innerLoopLoadRow(
+ Parse *pParse, /* Statement under construction */
+ Select *pSelect, /* The query being coded */
+ RowLoadInfo *pInfo /* Info needed to complete the row load */
+){
+ sqlite3ExprCodeExprList(pParse, pSelect->pEList, pInfo->regResult,
+ 0, pInfo->ecelFlags);
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( pInfo->pExtra ){
+ sqlite3ExprCodeExprList(pParse, pInfo->pExtra, pInfo->regExtraResult, 0, 0);
+ sqlite3ExprListDelete(pParse->db, pInfo->pExtra);
+ }
+#endif
+}
+
+/*
+** Code the OP_MakeRecord instruction that generates the entry to be
+** added into the sorter.
+**
+** Return the register in which the result is stored.
+*/
+static int makeSorterRecord(
+ Parse *pParse,
+ SortCtx *pSort,
+ Select *pSelect,
+ int regBase,
+ int nBase
+){
+ int nOBSat = pSort->nOBSat;
+ Vdbe *v = pParse->pVdbe;
+ int regOut = ++pParse->nMem;
+ if( pSort->pDeferredRowLoad ){
+ innerLoopLoadRow(pParse, pSelect, pSort->pDeferredRowLoad);
+ }
+ sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regOut);
+ return regOut;
+}
/*
** Generate code that will push the record in registers regData
@@ -118194,7 +124498,7 @@ static void pushOntoSorter(
Select *pSelect, /* The whole SELECT statement */
int regData, /* First register holding data to be sorted */
int regOrigData, /* First register holding data before packing */
- int nData, /* Number of elements in the data array */
+ int nData, /* Number of elements in the regData data array */
int nPrefixReg /* No. of reg prior to regData available for use */
){
Vdbe *v = pParse->pVdbe; /* Stmt under construction */
@@ -118202,16 +124506,32 @@ static void pushOntoSorter(
int nExpr = pSort->pOrderBy->nExpr; /* No. of ORDER BY terms */
int nBase = nExpr + bSeq + nData; /* Fields in sorter record */
int regBase; /* Regs for sorter record */
- int regRecord = ++pParse->nMem; /* Assembled sorter record */
+ int regRecord = 0; /* Assembled sorter record */
int nOBSat = pSort->nOBSat; /* ORDER BY terms to skip */
int op; /* Opcode to add sorter record to sorter */
int iLimit; /* LIMIT counter */
+ int iSkip = 0; /* End of the sorter insert loop */
assert( bSeq==0 || bSeq==1 );
+
+ /* Three cases:
+ ** (1) The data to be sorted has already been packed into a Record
+ ** by a prior OP_MakeRecord. In this case nData==1 and regData
+ ** will be completely unrelated to regOrigData.
+ ** (2) All output columns are included in the sort record. In that
+ ** case regData==regOrigData.
+ ** (3) Some output columns are omitted from the sort record due to
+ ** the SQLITE_ENABLE_SORTER_REFERENCE optimization, or due to the
+ ** SQLITE_ECEL_OMITREF optimization, or due to the
+ ** SortCtx.pDeferredRowLoad optimiation. In any of these cases
+ ** regOrigData is 0 to prevent this routine from trying to copy
+ ** values that might not yet exist.
+ */
assert( nData==1 || regData==regOrigData || regOrigData==0 );
+
if( nPrefixReg ){
assert( nPrefixReg==nExpr+bSeq );
- regBase = regData - nExpr - bSeq;
+ regBase = regData - nPrefixReg;
}else{
regBase = pParse->nMem + 1;
pParse->nMem += nBase;
@@ -118227,7 +124547,6 @@ static void pushOntoSorter(
if( nPrefixReg==0 && nData>0 ){
sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+bSeq, nData);
}
- sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regRecord);
if( nOBSat>0 ){
int regPrevKey; /* The first nOBSat columns of the previous row */
int addrFirst; /* Address of the OP_IfNot opcode */
@@ -118236,6 +124555,7 @@ static void pushOntoSorter(
int nKey; /* Number of sorting key columns, including OP_Sequence */
KeyInfo *pKI; /* Original KeyInfo on the sorter table */
+ regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase);
regPrevKey = pParse->nMem+1;
pParse->nMem += pSort->nOBSat;
nKey = nExpr - pSort->nOBSat + bSeq;
@@ -118253,7 +124573,7 @@ static void pushOntoSorter(
memset(pKI->aSortOrder, 0, pKI->nKeyField); /* Makes OP_Jump testable */
sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO);
testcase( pKI->nAllField > pKI->nKeyField+2 );
- pOp->p4.pKeyInfo = keyInfoFromExprList(pParse, pSort->pOrderBy, nOBSat,
+ pOp->p4.pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pSort->pOrderBy,nOBSat,
pKI->nAllField-pKI->nKeyField-1);
addrJmp = sqlite3VdbeCurrentAddr(v);
sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v);
@@ -118269,6 +124589,34 @@ static void pushOntoSorter(
sqlite3ExprCodeMove(pParse, regBase, regPrevKey, pSort->nOBSat);
sqlite3VdbeJumpHere(v, addrJmp);
}
+ if( iLimit ){
+ /* At this point the values for the new sorter entry are stored
+ ** in an array of registers. They need to be composed into a record
+ ** and inserted into the sorter if either (a) there are currently
+ ** less than LIMIT+OFFSET items or (b) the new record is smaller than
+ ** the largest record currently in the sorter. If (b) is true and there
+ ** are already LIMIT+OFFSET items in the sorter, delete the largest
+ ** entry before inserting the new one. This way there are never more
+ ** than LIMIT+OFFSET items in the sorter.
+ **
+ ** If the new record does not need to be inserted into the sorter,
+ ** jump to the next iteration of the loop. If the pSort->labelOBLopt
+ ** value is not zero, then it is a label of where to jump. Otherwise,
+ ** just bypass the row insert logic. See the header comment on the
+ ** sqlite3WhereOrderByLimitOptLabel() function for additional info.
+ */
+ int iCsr = pSort->iECursor;
+ sqlite3VdbeAddOp2(v, OP_IfNotZero, iLimit, sqlite3VdbeCurrentAddr(v)+4);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp2(v, OP_Last, iCsr, 0);
+ iSkip = sqlite3VdbeAddOp4Int(v, OP_IdxLE,
+ iCsr, 0, regBase+nOBSat, nExpr-nOBSat);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp1(v, OP_Delete, iCsr);
+ }
+ if( regRecord==0 ){
+ regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase);
+ }
if( pSort->sortFlags & SORTFLAG_UseSorter ){
op = OP_SorterInsert;
}else{
@@ -118276,33 +124624,9 @@ static void pushOntoSorter(
}
sqlite3VdbeAddOp4Int(v, op, pSort->iECursor, regRecord,
regBase+nOBSat, nBase-nOBSat);
- if( iLimit ){
- int addr;
- int r1 = 0;
- /* Fill the sorter until it contains LIMIT+OFFSET entries. (The iLimit
- ** register is initialized with value of LIMIT+OFFSET.) After the sorter
- ** fills up, delete the least entry in the sorter after each insert.
- ** Thus we never hold more than the LIMIT+OFFSET rows in memory at once */
- addr = sqlite3VdbeAddOp1(v, OP_IfNotZero, iLimit); VdbeCoverage(v);
- sqlite3VdbeAddOp1(v, OP_Last, pSort->iECursor);
- if( pSort->bOrderedInnerLoop ){
- r1 = ++pParse->nMem;
- sqlite3VdbeAddOp3(v, OP_Column, pSort->iECursor, nExpr, r1);
- VdbeComment((v, "seq"));
- }
- sqlite3VdbeAddOp1(v, OP_Delete, pSort->iECursor);
- if( pSort->bOrderedInnerLoop ){
- /* If the inner loop is driven by an index such that values from
- ** the same iteration of the inner loop are in sorted order, then
- ** immediately jump to the next iteration of an inner loop if the
- ** entry from the current iteration does not fit into the top
- ** LIMIT+OFFSET entries of the sorter. */
- int iBrk = sqlite3VdbeCurrentAddr(v) + 2;
- sqlite3VdbeAddOp3(v, OP_Eq, regBase+nExpr, iBrk, r1);
- sqlite3VdbeChangeP5(v, SQLITE_NULLEQ);
- VdbeCoverage(v);
- }
- sqlite3VdbeJumpHere(v, addr);
+ if( iSkip ){
+ sqlite3VdbeChangeP2(v, iSkip,
+ pSort->labelOBLopt ? pSort->labelOBLopt : sqlite3VdbeCurrentAddr(v));
}
}
@@ -118348,6 +124672,87 @@ static void codeDistinct(
sqlite3ReleaseTempReg(pParse, r1);
}
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+/*
+** This function is called as part of inner-loop generation for a SELECT
+** statement with an ORDER BY that is not optimized by an index. It
+** determines the expressions, if any, that the sorter-reference
+** optimization should be used for. The sorter-reference optimization
+** is used for SELECT queries like:
+**
+** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10
+**
+** If the optimization is used for expression "bigblob", then instead of
+** storing values read from that column in the sorter records, the PK of
+** the row from table t1 is stored instead. Then, as records are extracted from
+** the sorter to return to the user, the required value of bigblob is
+** retrieved directly from table t1. If the values are very large, this
+** can be more efficient than storing them directly in the sorter records.
+**
+** The ExprList_item.bSorterRef flag is set for each expression in pEList
+** for which the sorter-reference optimization should be enabled.
+** Additionally, the pSort->aDefer[] array is populated with entries
+** for all cursors required to evaluate all selected expressions. Finally.
+** output variable (*ppExtra) is set to an expression list containing
+** expressions for all extra PK values that should be stored in the
+** sorter records.
+*/
+static void selectExprDefer(
+ Parse *pParse, /* Leave any error here */
+ SortCtx *pSort, /* Sorter context */
+ ExprList *pEList, /* Expressions destined for sorter */
+ ExprList **ppExtra /* Expressions to append to sorter record */
+){
+ int i;
+ int nDefer = 0;
+ ExprList *pExtra = 0;
+ for(i=0; i<pEList->nExpr; i++){
+ struct ExprList_item *pItem = &pEList->a[i];
+ if( pItem->u.x.iOrderByCol==0 ){
+ Expr *pExpr = pItem->pExpr;
+ Table *pTab = pExpr->y.pTab;
+ if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab)
+ && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF)
+ ){
+ int j;
+ for(j=0; j<nDefer; j++){
+ if( pSort->aDefer[j].iCsr==pExpr->iTable ) break;
+ }
+ if( j==nDefer ){
+ if( nDefer==ArraySize(pSort->aDefer) ){
+ continue;
+ }else{
+ int nKey = 1;
+ int k;
+ Index *pPk = 0;
+ if( !HasRowid(pTab) ){
+ pPk = sqlite3PrimaryKeyIndex(pTab);
+ nKey = pPk->nKeyCol;
+ }
+ for(k=0; k<nKey; k++){
+ Expr *pNew = sqlite3PExpr(pParse, TK_COLUMN, 0, 0);
+ if( pNew ){
+ pNew->iTable = pExpr->iTable;
+ pNew->y.pTab = pExpr->y.pTab;
+ pNew->iColumn = pPk ? pPk->aiColumn[k] : -1;
+ pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew);
+ }
+ }
+ pSort->aDefer[nDefer].pTab = pExpr->y.pTab;
+ pSort->aDefer[nDefer].iCsr = pExpr->iTable;
+ pSort->aDefer[nDefer].nKey = nKey;
+ nDefer++;
+ }
+ }
+ pItem->bSorterRef = 1;
+ }
+ }
+ }
+ pSort->nDefer = (u8)nDefer;
+ *ppExtra = pExtra;
+}
+#endif
+
/*
** This routine generates the code for the inside of the inner loop
** of a SELECT.
@@ -118374,6 +124779,7 @@ static void selectInnerLoop(
int iParm = pDest->iSDParm; /* First argument to disposal method */
int nResultCol; /* Number of result columns */
int nPrefixReg = 0; /* Number of extra registers before regResult */
+ RowLoadInfo sRowLoadInfo; /* Info for deferred row loading */
/* Usually, regResult is the first cell in an array of memory cells
** containing the current result row. In this case regOrig is set to the
@@ -118420,10 +124826,14 @@ static void selectInnerLoop(
VdbeComment((v, "%s", p->pEList->a[i].zName));
}
}else if( eDest!=SRT_Exists ){
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ ExprList *pExtra = 0;
+#endif
/* If the destination is an EXISTS(...) expression, the actual
** values returned by the SELECT are not required.
*/
- u8 ecelFlags;
+ u8 ecelFlags; /* "ecel" is an abbreviation of "ExprCodeExprList" */
+ ExprList *pEList;
if( eDest==SRT_Mem || eDest==SRT_Output || eDest==SRT_Coroutine ){
ecelFlags = SQLITE_ECEL_DUP;
}else{
@@ -118437,18 +124847,68 @@ static void selectInnerLoop(
** This allows the p->pEList field to be omitted from the sorted record,
** saving space and CPU cycles. */
ecelFlags |= (SQLITE_ECEL_OMITREF|SQLITE_ECEL_REF);
+
for(i=pSort->nOBSat; i<pSort->pOrderBy->nExpr; i++){
int j;
if( (j = pSort->pOrderBy->a[i].u.x.iOrderByCol)>0 ){
p->pEList->a[j-1].u.x.iOrderByCol = i+1-pSort->nOBSat;
}
}
- regOrig = 0;
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ selectExprDefer(pParse, pSort, p->pEList, &pExtra);
+ if( pExtra && pParse->db->mallocFailed==0 ){
+ /* If there are any extra PK columns to add to the sorter records,
+ ** allocate extra memory cells and adjust the OpenEphemeral
+ ** instruction to account for the larger records. This is only
+ ** required if there are one or more WITHOUT ROWID tables with
+ ** composite primary keys in the SortCtx.aDefer[] array. */
+ VdbeOp *pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex);
+ pOp->p2 += (pExtra->nExpr - pSort->nDefer);
+ pOp->p4.pKeyInfo->nAllField += (pExtra->nExpr - pSort->nDefer);
+ pParse->nMem += pExtra->nExpr;
+ }
+#endif
+
+ /* Adjust nResultCol to account for columns that are omitted
+ ** from the sorter by the optimizations in this branch */
+ pEList = p->pEList;
+ for(i=0; i<pEList->nExpr; i++){
+ if( pEList->a[i].u.x.iOrderByCol>0
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ || pEList->a[i].bSorterRef
+#endif
+ ){
+ nResultCol--;
+ regOrig = 0;
+ }
+ }
+
+ testcase( regOrig );
+ testcase( eDest==SRT_Set );
+ testcase( eDest==SRT_Mem );
+ testcase( eDest==SRT_Coroutine );
+ testcase( eDest==SRT_Output );
assert( eDest==SRT_Set || eDest==SRT_Mem
|| eDest==SRT_Coroutine || eDest==SRT_Output );
}
- nResultCol = sqlite3ExprCodeExprList(pParse,p->pEList,regResult,
- 0,ecelFlags);
+ sRowLoadInfo.regResult = regResult;
+ sRowLoadInfo.ecelFlags = ecelFlags;
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ sRowLoadInfo.pExtra = pExtra;
+ sRowLoadInfo.regExtraResult = regResult + nResultCol;
+ if( pExtra ) nResultCol += pExtra->nExpr;
+#endif
+ if( p->iLimit
+ && (ecelFlags & SQLITE_ECEL_OMITREF)!=0
+ && nPrefixReg>0
+ ){
+ assert( pSort!=0 );
+ assert( hasDistinct==0 );
+ pSort->pDeferredRowLoad = &sRowLoadInfo;
+ regOrig = 0;
+ }else{
+ innerLoopLoadRow(pParse, p, &sRowLoadInfo);
+ }
}
/* If the DISTINCT keyword was present on the SELECT statement
@@ -118564,7 +125024,8 @@ static void selectInnerLoop(
}
#endif
if( pSort ){
- pushOntoSorter(pParse, pSort, p, r1+nPrefixReg,regResult,1,nPrefixReg);
+ assert( regResult==regOrig );
+ pushOntoSorter(pParse, pSort, p, r1+nPrefixReg, regOrig, 1, nPrefixReg);
}else{
int r2 = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, r2);
@@ -118594,7 +125055,6 @@ static void selectInnerLoop(
assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol );
sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol,
r1, pDest->zAffSdst, nResultCol);
- sqlite3ExprCacheAffinityChange(pParse, regResult, nResultCol);
sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol);
sqlite3ReleaseTempReg(pParse, r1);
}
@@ -118638,7 +125098,6 @@ static void selectInnerLoop(
sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm);
}else{
sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, nResultCol);
- sqlite3ExprCacheAffinityChange(pParse, regResult, nResultCol);
}
break;
}
@@ -118781,7 +125240,7 @@ SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo *p){ return p->nRef==1; }
** function is responsible for seeing that this structure is eventually
** freed.
*/
-static KeyInfo *keyInfoFromExprList(
+SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList(
Parse *pParse, /* Parsing context */
ExprList *pList, /* Form the KeyInfo object from this ExprList */
int iStart, /* Begin with this column of pList */
@@ -118831,11 +125290,7 @@ static const char *selectOpName(int id){
** is determined by the zUsage argument.
*/
static void explainTempTable(Parse *pParse, const char *zUsage){
- if( pParse->explain==2 ){
- Vdbe *v = pParse->pVdbe;
- char *zMsg = sqlite3MPrintf(pParse->db, "USE TEMP B-TREE FOR %s", zUsage);
- sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
- }
+ ExplainQueryPlan((pParse, 0, "USE TEMP B-TREE FOR %s", zUsage));
}
/*
@@ -118853,42 +125308,6 @@ static void explainTempTable(Parse *pParse, const char *zUsage){
# define explainSetInteger(y,z)
#endif
-#if !defined(SQLITE_OMIT_EXPLAIN) && !defined(SQLITE_OMIT_COMPOUND_SELECT)
-/*
-** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function
-** is a no-op. Otherwise, it adds a single row of output to the EQP result,
-** where the caption is of one of the two forms:
-**
-** "COMPOSITE SUBQUERIES iSub1 and iSub2 (op)"
-** "COMPOSITE SUBQUERIES iSub1 and iSub2 USING TEMP B-TREE (op)"
-**
-** where iSub1 and iSub2 are the integers passed as the corresponding
-** function parameters, and op is the text representation of the parameter
-** of the same name. The parameter "op" must be one of TK_UNION, TK_EXCEPT,
-** TK_INTERSECT or TK_ALL. The first form is used if argument bUseTmp is
-** false, or the second form if it is true.
-*/
-static void explainComposite(
- Parse *pParse, /* Parse context */
- int op, /* One of TK_UNION, TK_EXCEPT etc. */
- int iSub1, /* Subquery id 1 */
- int iSub2, /* Subquery id 2 */
- int bUseTmp /* True if a temp table was used */
-){
- assert( op==TK_UNION || op==TK_EXCEPT || op==TK_INTERSECT || op==TK_ALL );
- if( pParse->explain==2 ){
- Vdbe *v = pParse->pVdbe;
- char *zMsg = sqlite3MPrintf(
- pParse->db, "COMPOUND SUBQUERIES %d AND %d %s(%s)", iSub1, iSub2,
- bUseTmp?"USING TEMP B-TREE ":"", selectOpName(op)
- );
- sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
- }
-}
-#else
-/* No-op versions of the explainXXX() functions and macros. */
-# define explainComposite(v,w,x,y,z)
-#endif
/*
** If the inner loop was generated using a non-null pOrderBy argument,
@@ -118906,7 +125325,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 addr;
+ int addr; /* Top of output loop. Jump for Next. */
int addrOnce = 0;
int iTab;
ExprList *pOrderBy = pSort->pOrderBy;
@@ -118915,11 +125334,11 @@ static void generateSortTail(
int regRow;
int regRowid;
int iCol;
- int nKey;
+ int nKey; /* Number of key columns in sorter record */
int iSortTab; /* Sorter cursor to read from */
- int nSortData; /* Trailing values to read from sorter */
int i;
int bSeq; /* True if sorter record includes seq. no. */
+ int nRefKey = 0;
struct ExprList_item *aOutEx = p->pEList->a;
assert( addrBreak<0 );
@@ -118928,15 +125347,24 @@ static void generateSortTail(
sqlite3VdbeGoto(v, addrBreak);
sqlite3VdbeResolveLabel(v, pSort->labelBkOut);
}
+
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ /* Open any cursors needed for sorter-reference expressions */
+ for(i=0; i<pSort->nDefer; i++){
+ Table *pTab = pSort->aDefer[i].pTab;
+ int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
+ sqlite3OpenTable(pParse, pSort->aDefer[i].iCsr, iDb, pTab, OP_OpenRead);
+ nRefKey = MAX(nRefKey, pSort->aDefer[i].nKey);
+ }
+#endif
+
iTab = pSort->iECursor;
if( eDest==SRT_Output || eDest==SRT_Coroutine || eDest==SRT_Mem ){
regRowid = 0;
regRow = pDest->iSdst;
- nSortData = nColumn;
}else{
regRowid = sqlite3GetTempReg(pParse);
regRow = sqlite3GetTempRange(pParse, nColumn);
- nSortData = nColumn;
}
nKey = pOrderBy->nExpr - pSort->nOBSat;
if( pSort->sortFlags & SORTFLAG_UseSorter ){
@@ -118945,7 +125373,8 @@ static void generateSortTail(
if( pSort->labelBkOut ){
addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
}
- sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut, nKey+1+nSortData);
+ sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut,
+ nKey+1+nColumn+nRefKey);
if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce);
addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak);
VdbeCoverage(v);
@@ -118958,15 +125387,59 @@ static void generateSortTail(
iSortTab = iTab;
bSeq = 1;
}
- for(i=0, iCol=nKey+bSeq; i<nSortData; i++){
- int iRead;
- if( aOutEx[i].u.x.iOrderByCol ){
- iRead = aOutEx[i].u.x.iOrderByCol-1;
- }else{
- iRead = iCol++;
+ for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( aOutEx[i].bSorterRef ) continue;
+#endif
+ if( aOutEx[i].u.x.iOrderByCol==0 ) iCol++;
+ }
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( pSort->nDefer ){
+ int iKey = iCol+1;
+ int regKey = sqlite3GetTempRange(pParse, nRefKey);
+
+ for(i=0; i<pSort->nDefer; i++){
+ int iCsr = pSort->aDefer[i].iCsr;
+ Table *pTab = pSort->aDefer[i].pTab;
+ int nKey = pSort->aDefer[i].nKey;
+
+ sqlite3VdbeAddOp1(v, OP_NullRow, iCsr);
+ if( HasRowid(pTab) ){
+ sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey);
+ sqlite3VdbeAddOp3(v, OP_SeekRowid, iCsr,
+ sqlite3VdbeCurrentAddr(v)+1, regKey);
+ }else{
+ int k;
+ int iJmp;
+ assert( sqlite3PrimaryKeyIndex(pTab)->nKeyCol==nKey );
+ for(k=0; k<nKey; k++){
+ sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey+k);
+ }
+ iJmp = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeAddOp4Int(v, OP_SeekGE, iCsr, iJmp+2, regKey, nKey);
+ sqlite3VdbeAddOp4Int(v, OP_IdxLE, iCsr, iJmp+3, regKey, nKey);
+ sqlite3VdbeAddOp1(v, OP_NullRow, iCsr);
+ }
+ }
+ sqlite3ReleaseTempRange(pParse, regKey, nRefKey);
+ }
+#endif
+ for(i=nColumn-1; i>=0; i--){
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ if( aOutEx[i].bSorterRef ){
+ sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i);
+ }else
+#endif
+ {
+ int iRead;
+ if( aOutEx[i].u.x.iOrderByCol ){
+ iRead = aOutEx[i].u.x.iOrderByCol-1;
+ }else{
+ iRead = iCol--;
+ }
+ sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i);
+ VdbeComment((v, "%s", aOutEx[i].zName?aOutEx[i].zName : aOutEx[i].zSpan));
}
- sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i);
- VdbeComment((v, "%s", aOutEx[i].zName ? aOutEx[i].zName : aOutEx[i].zSpan));
}
switch( eDest ){
case SRT_Table:
@@ -118981,7 +125454,6 @@ static void generateSortTail(
assert( nColumn==sqlite3Strlen30(pDest->zAffSdst) );
sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, nColumn, regRowid,
pDest->zAffSdst, nColumn);
- sqlite3ExprCacheAffinityChange(pParse, regRow, nColumn);
sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, regRowid, regRow, nColumn);
break;
}
@@ -118996,7 +125468,6 @@ static void generateSortTail(
testcase( eDest==SRT_Coroutine );
if( eDest==SRT_Output ){
sqlite3VdbeAddOp2(v, OP_ResultRow, pDest->iSdst, nColumn);
- sqlite3ExprCacheAffinityChange(pParse, pDest->iSdst, nColumn);
}else{
sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm);
}
@@ -119073,8 +125544,9 @@ static const char *columnTypeImpl(
assert( pExpr!=0 );
assert( pNC->pSrcList!=0 );
+ assert( pExpr->op!=TK_AGG_COLUMN ); /* This routine runes before aggregates
+ ** are processed */
switch( pExpr->op ){
- case TK_AGG_COLUMN:
case TK_COLUMN: {
/* The expression is a column. Locate the table the column is being
** extracted from in NameContext.pSrcList. This table may be real
@@ -119083,8 +125555,6 @@ static const char *columnTypeImpl(
Table *pTab = 0; /* Table structure column is extracted from */
Select *pS = 0; /* Select the column is extracted from */
int iCol = pExpr->iColumn; /* Index of column in pTab */
- testcase( pExpr->op==TK_AGG_COLUMN );
- testcase( pExpr->op==TK_COLUMN );
while( pNC && !pTab ){
SrcList *pTabList = pNC->pSrcList;
for(j=0;j<pTabList->nSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++);
@@ -119117,7 +125587,7 @@ static const char *columnTypeImpl(
break;
}
- assert( pTab && pExpr->pTab==pTab );
+ assert( pTab && pExpr->y.pTab==pTab );
if( pS ){
/* The "table" is actually a sub-select or a view in the FROM clause
** of the SELECT statement. Return the declaration type and origin
@@ -119285,9 +125755,10 @@ static void generateColumnNames(
}
#endif
- if( pParse->colNamesSet || db->mallocFailed ) return;
+ if( pParse->colNamesSet ) return;
/* Column names are determined by the left-most term of a compound select */
while( pSelect->pPrior ) pSelect = pSelect->pPrior;
+ SELECTTRACE(1,pParse,pSelect,("generating column names\n"));
pTabList = pSelect->pSrc;
pEList = pSelect->pEList;
assert( v!=0 );
@@ -119301,7 +125772,7 @@ static void generateColumnNames(
assert( p!=0 );
assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */
- assert( p->op!=TK_COLUMN || p->pTab!=0 ); /* Covering idx not yet coded */
+ assert( p->op!=TK_COLUMN || p->y.pTab!=0 ); /* Covering idx not yet coded */
if( pEList->a[i].zName ){
/* An AS clause always takes first priority */
char *zName = pEList->a[i].zName;
@@ -119309,7 +125780,7 @@ static void generateColumnNames(
}else if( srcName && p->op==TK_COLUMN ){
char *zCol;
int iCol = p->iColumn;
- pTab = p->pTab;
+ pTab = p->y.pTab;
assert( pTab!=0 );
if( iCol<0 ) iCol = pTab->iPKey;
assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) );
@@ -119396,12 +125867,12 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList(
pColExpr = pColExpr->pRight;
assert( pColExpr!=0 );
}
- if( (pColExpr->op==TK_COLUMN || pColExpr->op==TK_AGG_COLUMN)
- && pColExpr->pTab!=0
- ){
+ assert( pColExpr->op!=TK_AGG_COLUMN );
+ if( pColExpr->op==TK_COLUMN ){
/* For columns use the column name name */
int iCol = pColExpr->iColumn;
- Table *pTab = pColExpr->pTab;
+ Table *pTab = pColExpr->y.pTab;
+ assert( pTab!=0 );
if( iCol<0 ) iCol = pTab->iPKey;
zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid";
}else if( pColExpr->op==TK_ID ){
@@ -119561,7 +126032,7 @@ SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){
/*
** Compute the iLimit and iOffset fields of the SELECT based on the
-** pLimit and pOffset expressions. pLimit and pOffset hold the expressions
+** pLimit expressions. pLimit->pLeft and pLimit->pRight hold the expressions
** that appear in the original SQL statement after the LIMIT and OFFSET
** keywords. Or NULL if those keywords are omitted. iLimit and iOffset
** are the integer memory register numbers for counters used to compute
@@ -119569,15 +126040,15 @@ SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){
** iLimit and iOffset are negative.
**
** This routine changes the values of iLimit and iOffset only if
-** a limit or offset is defined by pLimit and pOffset. iLimit and
-** iOffset should have been preset to appropriate default values (zero)
+** a limit or offset is defined by pLimit->pLeft and pLimit->pRight. iLimit
+** and iOffset should have been preset to appropriate default values (zero)
** prior to calling this routine.
**
** The iOffset register (if it exists) is initialized to the value
** of the OFFSET. The iLimit register is initialized to LIMIT. Register
** iOffset+1 is initialized to LIMIT+OFFSET.
**
-** Only if pLimit!=0 or pOffset!=0 do the limit registers get
+** Only if pLimit->pLeft!=0 do the limit registers get
** redefined. The UNION ALL operator uses this property to force
** the reuse of the same limit and offset registers across multiple
** SELECT statements.
@@ -119587,6 +126058,8 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
int iLimit = 0;
int iOffset;
int n;
+ Expr *pLimit = p->pLimit;
+
if( p->iLimit ) return;
/*
@@ -119595,13 +126068,13 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
** The current implementation interprets "LIMIT 0" to mean
** no rows.
*/
- sqlite3ExprCacheClear(pParse);
- assert( p->pOffset==0 || p->pLimit!=0 );
- if( p->pLimit ){
+ if( pLimit ){
+ assert( pLimit->op==TK_LIMIT );
+ assert( pLimit->pLeft!=0 );
p->iLimit = iLimit = ++pParse->nMem;
v = sqlite3GetVdbe(pParse);
assert( v!=0 );
- if( sqlite3ExprIsInteger(p->pLimit, &n) ){
+ if( sqlite3ExprIsInteger(pLimit->pLeft, &n) ){
sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit);
VdbeComment((v, "LIMIT counter"));
if( n==0 ){
@@ -119611,15 +126084,15 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
p->selFlags |= SF_FixedLimit;
}
}else{
- sqlite3ExprCode(pParse, p->pLimit, iLimit);
+ sqlite3ExprCode(pParse, pLimit->pLeft, iLimit);
sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v);
VdbeComment((v, "LIMIT counter"));
sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); VdbeCoverage(v);
}
- if( p->pOffset ){
+ if( pLimit->pRight ){
p->iOffset = iOffset = ++pParse->nMem;
pParse->nMem++; /* Allocate an extra register for limit+offset */
- sqlite3ExprCode(pParse, p->pOffset, iOffset);
+ sqlite3ExprCode(pParse, pLimit->pRight, iOffset);
sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v);
VdbeComment((v, "OFFSET counter"));
sqlite3VdbeAddOp3(v, OP_OffsetLimit, iLimit, iOffset+1, iOffset);
@@ -119749,9 +126222,16 @@ static void generateWithRecursiveQuery(
int i; /* Loop counter */
int rc; /* Result code */
ExprList *pOrderBy; /* The ORDER BY clause */
- Expr *pLimit, *pOffset; /* Saved LIMIT and OFFSET */
+ Expr *pLimit; /* Saved LIMIT and OFFSET */
int regLimit, regOffset; /* Registers used by LIMIT and OFFSET */
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( p->pWin ){
+ sqlite3ErrorMsg(pParse, "cannot use window functions in recursive queries");
+ return;
+ }
+#endif
+
/* Obtain authorization to do a recursive query */
if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return;
@@ -119760,10 +126240,9 @@ static void generateWithRecursiveQuery(
p->nSelectRow = 320; /* 4 billion rows */
computeLimitRegisters(pParse, p, addrBreak);
pLimit = p->pLimit;
- pOffset = p->pOffset;
regLimit = p->iLimit;
regOffset = p->iOffset;
- p->pLimit = p->pOffset = 0;
+ p->pLimit = 0;
p->iLimit = p->iOffset = 0;
pOrderBy = p->pOrderBy;
@@ -119809,6 +126288,7 @@ static void generateWithRecursiveQuery(
/* Store the results of the setup-query in Queue. */
pSetup->pNext = 0;
+ ExplainQueryPlan((pParse, 1, "SETUP"));
rc = sqlite3Select(pParse, pSetup, &destQueue);
pSetup->pNext = p;
if( rc ) goto end_of_recursive_query;
@@ -119843,6 +126323,7 @@ static void generateWithRecursiveQuery(
sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported");
}else{
p->pPrior = 0;
+ ExplainQueryPlan((pParse, 1, "RECURSIVE STEP"));
sqlite3Select(pParse, p, &destQueue);
assert( p->pPrior==0 );
p->pPrior = pSetup;
@@ -119856,7 +126337,6 @@ end_of_recursive_query:
sqlite3ExprListDelete(pParse->db, p->pOrderBy);
p->pOrderBy = pOrderBy;
p->pLimit = pLimit;
- p->pOffset = pOffset;
return;
}
#endif /* SQLITE_OMIT_CTE */
@@ -119875,36 +126355,38 @@ static int multiSelectOrderBy(
** on a VALUES clause.
**
** Because the Select object originates from a VALUES clause:
-** (1) It has no LIMIT or OFFSET
+** (1) There is no LIMIT or OFFSET or else there is a LIMIT of exactly 1
** (2) All terms are UNION ALL
** (3) There is no ORDER BY clause
+**
+** The "LIMIT of exactly 1" case of condition (1) comes about when a VALUES
+** clause occurs within scalar expression (ex: "SELECT (VALUES(1),(2),(3))").
+** The sqlite3CodeSubselect will have added the LIMIT 1 clause in tht case.
+** Since the limit is exactly 1, we only need to evalutes the left-most VALUES.
*/
static int multiSelectValues(
Parse *pParse, /* Parsing context */
Select *p, /* The right-most of SELECTs to be coded */
SelectDest *pDest /* What to do with query results */
){
- Select *pPrior;
int nRow = 1;
int rc = 0;
+ int bShowAll = p->pLimit==0;
assert( p->selFlags & SF_MultiValue );
do{
assert( p->selFlags & SF_Values );
assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) );
- assert( p->pLimit==0 );
- assert( p->pOffset==0 );
assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr );
if( p->pPrior==0 ) break;
assert( p->pPrior->pNext==p );
p = p->pPrior;
- nRow++;
+ nRow += bShowAll;
}while(1);
+ ExplainQueryPlan((pParse, 0, "SCAN %d CONSTANT ROW%s", nRow,
+ nRow==1 ? "" : "S"));
while( p ){
- pPrior = p->pPrior;
- p->pPrior = 0;
- rc = sqlite3Select(pParse, p, pDest);
- p->pPrior = pPrior;
- if( rc ) break;
+ selectInnerLoop(pParse, p, -1, 0, 0, pDest, 1, 1);
+ if( !bShowAll ) break;
p->nSelectRow = nRow;
p = p->pNext;
}
@@ -119953,10 +126435,6 @@ static int multiSelect(
SelectDest dest; /* Alternative data destination */
Select *pDelete = 0; /* Chain of simple selects to delete */
sqlite3 *db; /* Database connection */
-#ifndef SQLITE_OMIT_EXPLAIN
- int iSub1 = 0; /* EQP id of left-hand query */
- int iSub2 = 0; /* EQP id of right-hand query */
-#endif
/* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only
** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT.
@@ -120007,226 +126485,231 @@ static int multiSelect(
*/
if( p->pOrderBy ){
return multiSelectOrderBy(pParse, p, pDest);
- }else
+ }else{
- /* Generate code for the left and right SELECT statements.
- */
- switch( p->op ){
- case TK_ALL: {
- int addr = 0;
- int nLimit;
- assert( !pPrior->pLimit );
- pPrior->iLimit = p->iLimit;
- pPrior->iOffset = p->iOffset;
- pPrior->pLimit = p->pLimit;
- pPrior->pOffset = p->pOffset;
- explainSetInteger(iSub1, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, pPrior, &dest);
- p->pLimit = 0;
- p->pOffset = 0;
- if( rc ){
- goto multi_select_end;
- }
- p->pPrior = 0;
- p->iLimit = pPrior->iLimit;
- p->iOffset = pPrior->iOffset;
- if( p->iLimit ){
- addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v);
- VdbeComment((v, "Jump ahead if LIMIT reached"));
- if( p->iOffset ){
- sqlite3VdbeAddOp3(v, OP_OffsetLimit,
- p->iLimit, p->iOffset+1, p->iOffset);
+#ifndef SQLITE_OMIT_EXPLAIN
+ if( pPrior->pPrior==0 ){
+ ExplainQueryPlan((pParse, 1, "COMPOUND QUERY"));
+ ExplainQueryPlan((pParse, 1, "LEFT-MOST SUBQUERY"));
+ }
+#endif
+
+ /* Generate code for the left and right SELECT statements.
+ */
+ switch( p->op ){
+ case TK_ALL: {
+ int addr = 0;
+ int nLimit;
+ assert( !pPrior->pLimit );
+ pPrior->iLimit = p->iLimit;
+ pPrior->iOffset = p->iOffset;
+ pPrior->pLimit = p->pLimit;
+ rc = sqlite3Select(pParse, pPrior, &dest);
+ p->pLimit = 0;
+ if( rc ){
+ goto multi_select_end;
+ }
+ p->pPrior = 0;
+ p->iLimit = pPrior->iLimit;
+ p->iOffset = pPrior->iOffset;
+ if( p->iLimit ){
+ addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v);
+ VdbeComment((v, "Jump ahead if LIMIT reached"));
+ if( p->iOffset ){
+ sqlite3VdbeAddOp3(v, OP_OffsetLimit,
+ p->iLimit, p->iOffset+1, p->iOffset);
+ }
}
+ ExplainQueryPlan((pParse, 1, "UNION ALL"));
+ rc = sqlite3Select(pParse, p, &dest);
+ testcase( rc!=SQLITE_OK );
+ pDelete = p->pPrior;
+ p->pPrior = pPrior;
+ p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);
+ if( pPrior->pLimit
+ && sqlite3ExprIsInteger(pPrior->pLimit->pLeft, &nLimit)
+ && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit)
+ ){
+ p->nSelectRow = sqlite3LogEst((u64)nLimit);
+ }
+ if( addr ){
+ sqlite3VdbeJumpHere(v, addr);
+ }
+ break;
}
- explainSetInteger(iSub2, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, p, &dest);
- testcase( rc!=SQLITE_OK );
- pDelete = p->pPrior;
- p->pPrior = pPrior;
- p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);
- if( pPrior->pLimit
- && sqlite3ExprIsInteger(pPrior->pLimit, &nLimit)
- && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit)
- ){
- p->nSelectRow = sqlite3LogEst((u64)nLimit);
- }
- if( addr ){
- sqlite3VdbeJumpHere(v, addr);
- }
- break;
- }
- case TK_EXCEPT:
- case TK_UNION: {
- int unionTab; /* Cursor number of the temporary table holding result */
- u8 op = 0; /* One of the SRT_ operations to apply to self */
- int priorOp; /* The SRT_ operation to apply to prior selects */
- Expr *pLimit, *pOffset; /* Saved values of p->nLimit and p->nOffset */
- int addr;
- SelectDest uniondest;
-
- testcase( p->op==TK_EXCEPT );
- testcase( p->op==TK_UNION );
- priorOp = SRT_Union;
- if( dest.eDest==priorOp ){
- /* We can reuse a temporary table generated by a SELECT to our
- ** right.
+ case TK_EXCEPT:
+ case TK_UNION: {
+ int unionTab; /* Cursor number of the temp table holding result */
+ u8 op = 0; /* One of the SRT_ operations to apply to self */
+ int priorOp; /* The SRT_ operation to apply to prior selects */
+ Expr *pLimit; /* Saved values of p->nLimit */
+ int addr;
+ SelectDest uniondest;
+
+ testcase( p->op==TK_EXCEPT );
+ testcase( p->op==TK_UNION );
+ priorOp = SRT_Union;
+ if( dest.eDest==priorOp ){
+ /* We can reuse a temporary table generated by a SELECT to our
+ ** right.
+ */
+ assert( p->pLimit==0 ); /* Not allowed on leftward elements */
+ unionTab = dest.iSDParm;
+ }else{
+ /* We will need to create our own temporary table to hold the
+ ** intermediate results.
+ */
+ unionTab = pParse->nTab++;
+ assert( p->pOrderBy==0 );
+ addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0);
+ assert( p->addrOpenEphm[0] == -1 );
+ p->addrOpenEphm[0] = addr;
+ findRightmost(p)->selFlags |= SF_UsesEphemeral;
+ assert( p->pEList );
+ }
+
+ /* Code the SELECT statements to our left
*/
- assert( p->pLimit==0 ); /* Not allowed on leftward elements */
- assert( p->pOffset==0 ); /* Not allowed on leftward elements */
- unionTab = dest.iSDParm;
- }else{
- /* We will need to create our own temporary table to hold the
- ** intermediate results.
+ assert( !pPrior->pOrderBy );
+ sqlite3SelectDestInit(&uniondest, priorOp, unionTab);
+ rc = sqlite3Select(pParse, pPrior, &uniondest);
+ if( rc ){
+ goto multi_select_end;
+ }
+
+ /* Code the current SELECT statement
*/
- unionTab = pParse->nTab++;
+ if( p->op==TK_EXCEPT ){
+ op = SRT_Except;
+ }else{
+ assert( p->op==TK_UNION );
+ op = SRT_Union;
+ }
+ p->pPrior = 0;
+ pLimit = p->pLimit;
+ p->pLimit = 0;
+ uniondest.eDest = op;
+ ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE",
+ selectOpName(p->op)));
+ rc = sqlite3Select(pParse, p, &uniondest);
+ testcase( rc!=SQLITE_OK );
+ /* Query flattening in sqlite3Select() might refill p->pOrderBy.
+ ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */
+ sqlite3ExprListDelete(db, p->pOrderBy);
+ pDelete = p->pPrior;
+ p->pPrior = pPrior;
+ p->pOrderBy = 0;
+ if( p->op==TK_UNION ){
+ p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);
+ }
+ sqlite3ExprDelete(db, p->pLimit);
+ p->pLimit = pLimit;
+ p->iLimit = 0;
+ p->iOffset = 0;
+
+ /* Convert the data in the temporary table into whatever form
+ ** it is that we currently need.
+ */
+ assert( unionTab==dest.iSDParm || dest.eDest!=priorOp );
+ if( dest.eDest!=priorOp ){
+ int iCont, iBreak, iStart;
+ assert( p->pEList );
+ iBreak = sqlite3VdbeMakeLabel(v);
+ iCont = sqlite3VdbeMakeLabel(v);
+ computeLimitRegisters(pParse, p, iBreak);
+ sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v);
+ iStart = sqlite3VdbeCurrentAddr(v);
+ selectInnerLoop(pParse, p, unionTab,
+ 0, 0, &dest, iCont, iBreak);
+ sqlite3VdbeResolveLabel(v, iCont);
+ sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v);
+ sqlite3VdbeResolveLabel(v, iBreak);
+ sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0);
+ }
+ break;
+ }
+ default: assert( p->op==TK_INTERSECT ); {
+ int tab1, tab2;
+ int iCont, iBreak, iStart;
+ Expr *pLimit;
+ int addr;
+ SelectDest intersectdest;
+ int r1;
+
+ /* INTERSECT is different from the others since it requires
+ ** two temporary tables. Hence it has its own case. Begin
+ ** by allocating the tables we will need.
+ */
+ tab1 = pParse->nTab++;
+ tab2 = pParse->nTab++;
assert( p->pOrderBy==0 );
- addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0);
+
+ addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0);
assert( p->addrOpenEphm[0] == -1 );
p->addrOpenEphm[0] = addr;
findRightmost(p)->selFlags |= SF_UsesEphemeral;
assert( p->pEList );
- }
-
- /* Code the SELECT statements to our left
- */
- assert( !pPrior->pOrderBy );
- sqlite3SelectDestInit(&uniondest, priorOp, unionTab);
- explainSetInteger(iSub1, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, pPrior, &uniondest);
- if( rc ){
- goto multi_select_end;
- }
-
- /* Code the current SELECT statement
- */
- if( p->op==TK_EXCEPT ){
- op = SRT_Except;
- }else{
- assert( p->op==TK_UNION );
- op = SRT_Union;
- }
- p->pPrior = 0;
- pLimit = p->pLimit;
- p->pLimit = 0;
- pOffset = p->pOffset;
- p->pOffset = 0;
- uniondest.eDest = op;
- explainSetInteger(iSub2, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, p, &uniondest);
- testcase( rc!=SQLITE_OK );
- /* Query flattening in sqlite3Select() might refill p->pOrderBy.
- ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */
- sqlite3ExprListDelete(db, p->pOrderBy);
- pDelete = p->pPrior;
- p->pPrior = pPrior;
- p->pOrderBy = 0;
- if( p->op==TK_UNION ){
- p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);
- }
- sqlite3ExprDelete(db, p->pLimit);
- p->pLimit = pLimit;
- p->pOffset = pOffset;
- p->iLimit = 0;
- p->iOffset = 0;
-
- /* Convert the data in the temporary table into whatever form
- ** it is that we currently need.
- */
- assert( unionTab==dest.iSDParm || dest.eDest!=priorOp );
- if( dest.eDest!=priorOp ){
- int iCont, iBreak, iStart;
+
+ /* Code the SELECTs to our left into temporary table "tab1".
+ */
+ sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1);
+ rc = sqlite3Select(pParse, pPrior, &intersectdest);
+ if( rc ){
+ goto multi_select_end;
+ }
+
+ /* Code the current SELECT into temporary table "tab2"
+ */
+ addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0);
+ assert( p->addrOpenEphm[1] == -1 );
+ p->addrOpenEphm[1] = addr;
+ p->pPrior = 0;
+ pLimit = p->pLimit;
+ p->pLimit = 0;
+ intersectdest.iSDParm = tab2;
+ ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE",
+ selectOpName(p->op)));
+ rc = sqlite3Select(pParse, p, &intersectdest);
+ testcase( rc!=SQLITE_OK );
+ pDelete = p->pPrior;
+ p->pPrior = pPrior;
+ if( p->nSelectRow>pPrior->nSelectRow ){
+ p->nSelectRow = pPrior->nSelectRow;
+ }
+ sqlite3ExprDelete(db, p->pLimit);
+ p->pLimit = pLimit;
+
+ /* Generate code to take the intersection of the two temporary
+ ** tables.
+ */
assert( p->pEList );
iBreak = sqlite3VdbeMakeLabel(v);
iCont = sqlite3VdbeMakeLabel(v);
computeLimitRegisters(pParse, p, iBreak);
- sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v);
- iStart = sqlite3VdbeCurrentAddr(v);
- selectInnerLoop(pParse, p, unionTab,
+ sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v);
+ r1 = sqlite3GetTempReg(pParse);
+ iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1);
+ sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0);
+ VdbeCoverage(v);
+ sqlite3ReleaseTempReg(pParse, r1);
+ selectInnerLoop(pParse, p, tab1,
0, 0, &dest, iCont, iBreak);
sqlite3VdbeResolveLabel(v, iCont);
- sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v);
+ sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v);
sqlite3VdbeResolveLabel(v, iBreak);
- sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0);
+ sqlite3VdbeAddOp2(v, OP_Close, tab2, 0);
+ sqlite3VdbeAddOp2(v, OP_Close, tab1, 0);
+ break;
}
- break;
}
- default: assert( p->op==TK_INTERSECT ); {
- int tab1, tab2;
- int iCont, iBreak, iStart;
- Expr *pLimit, *pOffset;
- int addr;
- SelectDest intersectdest;
- int r1;
-
- /* INTERSECT is different from the others since it requires
- ** two temporary tables. Hence it has its own case. Begin
- ** by allocating the tables we will need.
- */
- tab1 = pParse->nTab++;
- tab2 = pParse->nTab++;
- assert( p->pOrderBy==0 );
-
- addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0);
- assert( p->addrOpenEphm[0] == -1 );
- p->addrOpenEphm[0] = addr;
- findRightmost(p)->selFlags |= SF_UsesEphemeral;
- assert( p->pEList );
-
- /* Code the SELECTs to our left into temporary table "tab1".
- */
- sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1);
- explainSetInteger(iSub1, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, pPrior, &intersectdest);
- if( rc ){
- goto multi_select_end;
- }
-
- /* Code the current SELECT into temporary table "tab2"
- */
- addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0);
- assert( p->addrOpenEphm[1] == -1 );
- p->addrOpenEphm[1] = addr;
- p->pPrior = 0;
- pLimit = p->pLimit;
- p->pLimit = 0;
- pOffset = p->pOffset;
- p->pOffset = 0;
- intersectdest.iSDParm = tab2;
- explainSetInteger(iSub2, pParse->iNextSelectId);
- rc = sqlite3Select(pParse, p, &intersectdest);
- testcase( rc!=SQLITE_OK );
- pDelete = p->pPrior;
- p->pPrior = pPrior;
- if( p->nSelectRow>pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow;
- sqlite3ExprDelete(db, p->pLimit);
- p->pLimit = pLimit;
- p->pOffset = pOffset;
-
- /* Generate code to take the intersection of the two temporary
- ** tables.
- */
- assert( p->pEList );
- iBreak = sqlite3VdbeMakeLabel(v);
- iCont = sqlite3VdbeMakeLabel(v);
- computeLimitRegisters(pParse, p, iBreak);
- sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v);
- r1 = sqlite3GetTempReg(pParse);
- iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1);
- sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); VdbeCoverage(v);
- sqlite3ReleaseTempReg(pParse, r1);
- selectInnerLoop(pParse, p, tab1,
- 0, 0, &dest, iCont, iBreak);
- sqlite3VdbeResolveLabel(v, iCont);
- sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v);
- sqlite3VdbeResolveLabel(v, iBreak);
- sqlite3VdbeAddOp2(v, OP_Close, tab2, 0);
- sqlite3VdbeAddOp2(v, OP_Close, tab1, 0);
- break;
+
+ #ifndef SQLITE_OMIT_EXPLAIN
+ if( p->pNext==0 ){
+ ExplainQueryPlanPop(pParse);
}
+ #endif
}
-
- explainComposite(pParse, p->op, iSub1, iSub2, p->op!=TK_ALL);
-
+
/* Compute collating sequences used by
** temporary tables needed to implement the compound select.
** Attach the KeyInfo structure to all temporary tables.
@@ -120377,7 +126860,6 @@ static int generateOutputSubroutine(
r1 = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst,
r1, pDest->zAffSdst, pIn->nSdst);
- sqlite3ExprCacheAffinityChange(pParse, pIn->iSdst, pIn->nSdst);
sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pDest->iSDParm, r1,
pIn->iSdst, pIn->nSdst);
sqlite3ReleaseTempReg(pParse, r1);
@@ -120420,7 +126902,6 @@ static int generateOutputSubroutine(
default: {
assert( pDest->eDest==SRT_Output );
sqlite3VdbeAddOp2(v, OP_ResultRow, pIn->iSdst, pIn->nSdst);
- sqlite3ExprCacheAffinityChange(pParse, pIn->iSdst, pIn->nSdst);
break;
}
}
@@ -120564,10 +127045,6 @@ static int multiSelectOrderBy(
ExprList *pOrderBy; /* The ORDER BY clause */
int nOrderBy; /* Number of terms in the ORDER BY clause */
int *aPermute; /* Mapping from ORDER BY terms to result set columns */
-#ifndef SQLITE_OMIT_EXPLAIN
- int iSub1; /* EQP id of left-hand query */
- int iSub2; /* EQP id of right-hand query */
-#endif
assert( p->pOrderBy!=0 );
assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */
@@ -120679,8 +127156,6 @@ static int multiSelectOrderBy(
}
sqlite3ExprDelete(db, p->pLimit);
p->pLimit = 0;
- sqlite3ExprDelete(db, p->pOffset);
- p->pOffset = 0;
regAddrA = ++pParse->nMem;
regAddrB = ++pParse->nMem;
@@ -120689,6 +127164,8 @@ static int multiSelectOrderBy(
sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA);
sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB);
+ ExplainQueryPlan((pParse, 1, "MERGE (%s)", selectOpName(p->op)));
+
/* Generate a coroutine to evaluate the SELECT statement to the
** left of the compound operator - the "A" select.
*/
@@ -120696,7 +127173,7 @@ static int multiSelectOrderBy(
addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA);
VdbeComment((v, "left SELECT"));
pPrior->iLimit = regLimitA;
- explainSetInteger(iSub1, pParse->iNextSelectId);
+ ExplainQueryPlan((pParse, 1, "LEFT"));
sqlite3Select(pParse, pPrior, &destA);
sqlite3VdbeEndCoroutine(v, regAddrA);
sqlite3VdbeJumpHere(v, addr1);
@@ -120711,7 +127188,7 @@ static int multiSelectOrderBy(
savedOffset = p->iOffset;
p->iLimit = regLimitB;
p->iOffset = 0;
- explainSetInteger(iSub2, pParse->iNextSelectId);
+ ExplainQueryPlan((pParse, 1, "RIGHT"));
sqlite3Select(pParse, p, &destB);
p->iLimit = savedLimit;
p->iOffset = savedOffset;
@@ -120823,7 +127300,7 @@ static int multiSelectOrderBy(
/*** TBD: Insert subroutine calls to close cursors on incomplete
**** subqueries ****/
- explainComposite(pParse, p->op, iSub1, iSub2, 0);
+ ExplainQueryPlanPop(pParse);
return pParse->nErr!=0;
}
#endif
@@ -120879,7 +127356,7 @@ static Expr *substExpr(
Expr *pCopy = pSubst->pEList->a[pExpr->iColumn].pExpr;
Expr ifNullRow;
assert( pSubst->pEList!=0 && pExpr->iColumn<pSubst->pEList->nExpr );
- assert( pExpr->pLeft==0 && pExpr->pRight==0 );
+ assert( pExpr->pRight==0 );
if( sqlite3ExprIsVector(pCopy) ){
sqlite3VectorErrorMsg(pSubst->pParse, pCopy);
}else{
@@ -121070,12 +127547,11 @@ static void substSelect(
** (19) If the subquery uses LIMIT then the outer query may not
** have a WHERE clause.
**
-** (**) Subsumed into (17d3). Was: If the sub-query is a compound select,
-** then it must not use an ORDER BY clause - Ticket #3773. Because
-** of (17d3), then only way to have a compound subquery is if it is
-** the only term in the FROM clause of the outer query. But if the
-** only term in the FROM clause has an ORDER BY, then it will be
-** implemented as a co-routine and the flattener will never be called.
+** (20) If the sub-query is a compound select, then it must not use
+** an ORDER BY clause. Ticket #3773. We could relax this constraint
+** somewhat by saying that the terms of the ORDER BY clause must
+** appear as unmodified result columns in the outer query. But we
+** have other optimizations in mind to deal with that case.
**
** (21) If the subquery uses LIMIT then the outer query may not be
** DISTINCT. (See ticket [752e1646fc]).
@@ -121094,6 +127570,10 @@ static void substSelect(
** "SELECT x FROM (SELECT max(y), x FROM t1)" would not necessarily
** return the value X for which Y was maximal.)
**
+** (25) If either the subquery or the parent query contains a window
+** function in the select list or ORDER BY clause, flattening
+** is not attempted.
+**
**
** In this routine, the "p" parameter is a pointer to the outer query.
** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query
@@ -121137,6 +127617,10 @@ static int flattenSubquery(
pSub = pSubitem->pSelect;
assert( pSub!=0 );
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( p->pWin || pSub->pWin ) return 0; /* Restriction (25) */
+#endif
+
pSubSrc = pSub->pSrc;
assert( pSubSrc );
/* Prior to version 3.1.2, when LIMIT and OFFSET had to be simple constants,
@@ -121145,7 +127629,7 @@ static int flattenSubquery(
** became arbitrary expressions, we were forced to add restrictions (13)
** and (14). */
if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */
- if( pSub->pOffset ) return 0; /* Restriction (14) */
+ if( pSub->pLimit && pSub->pLimit->pRight ) return 0; /* Restriction (14) */
if( (p->selFlags & SF_Compound)!=0 && pSub->pLimit ){
return 0; /* Restriction (15) */
}
@@ -121209,6 +127693,9 @@ static int flattenSubquery(
** queries.
*/
if( pSub->pPrior ){
+ if( pSub->pOrderBy ){
+ return 0; /* Restriction (20) */
+ }
if( isAgg || (p->selFlags & SF_Distinct)!=0 || pSrc->nSrc!=1 ){
return 0; /* (17d1), (17d2), or (17d3) */
}
@@ -121243,18 +127730,9 @@ static int flattenSubquery(
*/
assert( (p->selFlags & SF_Recursive)==0 || pSub->pPrior==0 );
- /* Ex-restriction (20):
- ** A compound subquery must be the only term in the FROM clause of the
- ** outer query by restriction (17d3). But if that term also has an
- ** ORDER BY clause, then the subquery will be implemented by co-routine
- ** and so the flattener will never be invoked. Hence, it is not possible
- ** for the subquery to be a compound and have an ORDER BY clause.
- */
- assert( pSub->pPrior==0 || pSub->pOrderBy==0 );
-
/***** If we reach this point, flattening is permitted. *****/
- SELECTTRACE(1,pParse,p,("flatten %s.%p from term %d\n",
- pSub->zSelName, pSub, iFrom));
+ SELECTTRACE(1,pParse,p,("flatten %u.%p from term %d\n",
+ pSub->selId, pSub, iFrom));
/* Authorize the subquery */
pParse->zAuthContext = pSubitem->zName;
@@ -121299,16 +127777,12 @@ static int flattenSubquery(
Select *pNew;
ExprList *pOrderBy = p->pOrderBy;
Expr *pLimit = p->pLimit;
- Expr *pOffset = p->pOffset;
Select *pPrior = p->pPrior;
p->pOrderBy = 0;
p->pSrc = 0;
p->pPrior = 0;
p->pLimit = 0;
- p->pOffset = 0;
pNew = sqlite3SelectDup(db, p, 0);
- sqlite3SelectSetName(pNew, pSub->zSelName);
- p->pOffset = pOffset;
p->pLimit = pLimit;
p->pOrderBy = pOrderBy;
p->pSrc = pSrc;
@@ -121320,9 +127794,8 @@ static int flattenSubquery(
if( pPrior ) pPrior->pNext = pNew;
pNew->pNext = p;
p->pPrior = pNew;
- SELECTTRACE(2,pParse,p,
- ("compound-subquery flattener creates %s.%p as peer\n",
- pNew->zSelName, pNew));
+ SELECTTRACE(2,pParse,p,("compound-subquery flattener"
+ " creates %u as peer\n",pNew->selId));
}
if( db->mallocFailed ) return 1;
}
@@ -121456,7 +127929,6 @@ static int flattenSubquery(
pOrderBy->a[i].u.x.iOrderByCol = 0;
}
assert( pParent->pOrderBy==0 );
- assert( pSub->pPrior==0 );
pParent->pOrderBy = pOrderBy;
pSub->pOrderBy = 0;
}
@@ -121508,7 +127980,183 @@ static int flattenSubquery(
}
#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */
+/*
+** A structure to keep track of all of the column values that are fixed to
+** a known value due to WHERE clause constraints of the form COLUMN=VALUE.
+*/
+typedef struct WhereConst WhereConst;
+struct WhereConst {
+ Parse *pParse; /* Parsing context */
+ int nConst; /* Number for COLUMN=CONSTANT terms */
+ int nChng; /* Number of times a constant is propagated */
+ Expr **apExpr; /* [i*2] is COLUMN and [i*2+1] is VALUE */
+};
+
+/*
+** Add a new entry to the pConst object. Except, do not add duplicate
+** pColumn entires.
+*/
+static void constInsert(
+ WhereConst *pConst, /* The WhereConst into which we are inserting */
+ Expr *pColumn, /* The COLUMN part of the constraint */
+ Expr *pValue /* The VALUE part of the constraint */
+){
+ int i;
+ assert( pColumn->op==TK_COLUMN );
+
+ /* 2018-10-25 ticket [cf5ed20f]
+ ** Make sure the same pColumn is not inserted more than once */
+ for(i=0; i<pConst->nConst; i++){
+ const Expr *pExpr = pConst->apExpr[i*2];
+ assert( pExpr->op==TK_COLUMN );
+ if( pExpr->iTable==pColumn->iTable
+ && pExpr->iColumn==pColumn->iColumn
+ ){
+ return; /* Already present. Return without doing anything. */
+ }
+ }
+ pConst->nConst++;
+ pConst->apExpr = sqlite3DbReallocOrFree(pConst->pParse->db, pConst->apExpr,
+ pConst->nConst*2*sizeof(Expr*));
+ if( pConst->apExpr==0 ){
+ pConst->nConst = 0;
+ }else{
+ if( ExprHasProperty(pValue, EP_FixedCol) ) pValue = pValue->pLeft;
+ pConst->apExpr[pConst->nConst*2-2] = pColumn;
+ pConst->apExpr[pConst->nConst*2-1] = pValue;
+ }
+}
+
+/*
+** Find all terms of COLUMN=VALUE or VALUE=COLUMN in pExpr where VALUE
+** is a constant expression and where the term must be true because it
+** is part of the AND-connected terms of the expression. For each term
+** found, add it to the pConst structure.
+*/
+static void findConstInWhere(WhereConst *pConst, Expr *pExpr){
+ Expr *pRight, *pLeft;
+ if( pExpr==0 ) return;
+ if( ExprHasProperty(pExpr, EP_FromJoin) ) return;
+ if( pExpr->op==TK_AND ){
+ findConstInWhere(pConst, pExpr->pRight);
+ findConstInWhere(pConst, pExpr->pLeft);
+ return;
+ }
+ if( pExpr->op!=TK_EQ ) return;
+ pRight = pExpr->pRight;
+ pLeft = pExpr->pLeft;
+ assert( pRight!=0 );
+ assert( pLeft!=0 );
+ if( pRight->op==TK_COLUMN
+ && !ExprHasProperty(pRight, EP_FixedCol)
+ && sqlite3ExprIsConstant(pLeft)
+ && sqlite3IsBinary(sqlite3BinaryCompareCollSeq(pConst->pParse,pLeft,pRight))
+ ){
+ constInsert(pConst, pRight, pLeft);
+ }else
+ if( pLeft->op==TK_COLUMN
+ && !ExprHasProperty(pLeft, EP_FixedCol)
+ && sqlite3ExprIsConstant(pRight)
+ && sqlite3IsBinary(sqlite3BinaryCompareCollSeq(pConst->pParse,pLeft,pRight))
+ ){
+ constInsert(pConst, pLeft, pRight);
+ }
+}
+
+/*
+** This is a Walker expression callback. pExpr is a candidate expression
+** to be replaced by a value. If pExpr is equivalent to one of the
+** columns named in pWalker->u.pConst, then overwrite it with its
+** corresponding value.
+*/
+static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){
+ int i;
+ WhereConst *pConst;
+ if( pExpr->op!=TK_COLUMN ) return WRC_Continue;
+ if( ExprHasProperty(pExpr, EP_FixedCol) ) return WRC_Continue;
+ pConst = pWalker->u.pConst;
+ for(i=0; i<pConst->nConst; i++){
+ Expr *pColumn = pConst->apExpr[i*2];
+ if( pColumn==pExpr ) continue;
+ if( pColumn->iTable!=pExpr->iTable ) continue;
+ if( pColumn->iColumn!=pExpr->iColumn ) continue;
+ /* A match is found. Add the EP_FixedCol property */
+ pConst->nChng++;
+ ExprClearProperty(pExpr, EP_Leaf);
+ ExprSetProperty(pExpr, EP_FixedCol);
+ assert( pExpr->pLeft==0 );
+ pExpr->pLeft = sqlite3ExprDup(pConst->pParse->db, pConst->apExpr[i*2+1], 0);
+ break;
+ }
+ return WRC_Prune;
+}
+
+/*
+** The WHERE-clause constant propagation optimization.
+**
+** If the WHERE clause contains terms of the form COLUMN=CONSTANT or
+** CONSTANT=COLUMN that must be tree (in other words, if the terms top-level
+** AND-connected terms that are not part of a ON clause from a LEFT JOIN)
+** then throughout the query replace all other occurrences of COLUMN
+** with CONSTANT within the WHERE clause.
+**
+** For example, the query:
+**
+** SELECT * FROM t1, t2, t3 WHERE t1.a=39 AND t2.b=t1.a AND t3.c=t2.b
+**
+** Is transformed into
+**
+** SELECT * FROM t1, t2, t3 WHERE t1.a=39 AND t2.b=39 AND t3.c=39
+**
+** Return true if any transformations where made and false if not.
+**
+** Implementation note: Constant propagation is tricky due to affinity
+** and collating sequence interactions. Consider this example:
+**
+** CREATE TABLE t1(a INT,b TEXT);
+** INSERT INTO t1 VALUES(123,'0123');
+** SELECT * FROM t1 WHERE a=123 AND b=a;
+** SELECT * FROM t1 WHERE a=123 AND b=123;
+**
+** The two SELECT statements above should return different answers. b=a
+** is alway true because the comparison uses numeric affinity, but b=123
+** is false because it uses text affinity and '0123' is not the same as '123'.
+** To work around this, the expression tree is not actually changed from
+** "b=a" to "b=123" but rather the "a" in "b=a" is tagged with EP_FixedCol
+** and the "123" value is hung off of the pLeft pointer. Code generator
+** routines know to generate the constant "123" instead of looking up the
+** column value. Also, to avoid collation problems, this optimization is
+** only attempted if the "a=123" term uses the default BINARY collation.
+*/
+static int propagateConstants(
+ Parse *pParse, /* The parsing context */
+ Select *p /* The query in which to propagate constants */
+){
+ WhereConst x;
+ Walker w;
+ int nChng = 0;
+ x.pParse = pParse;
+ do{
+ x.nConst = 0;
+ x.nChng = 0;
+ x.apExpr = 0;
+ findConstInWhere(&x, p->pWhere);
+ if( x.nConst ){
+ memset(&w, 0, sizeof(w));
+ w.pParse = pParse;
+ w.xExprCallback = propagateConstantExprRewrite;
+ w.xSelectCallback = sqlite3SelectWalkNoop;
+ w.xSelectCallback2 = 0;
+ w.walkerDepth = 0;
+ w.u.pConst = &x;
+ sqlite3WalkExpr(&w, p->pWhere);
+ sqlite3DbFree(x.pParse->db, x.apExpr);
+ nChng += x.nChng;
+ }
+ }while( x.nChng );
+ return nChng;
+}
#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
/*
@@ -121538,14 +128186,28 @@ static int flattenSubquery(
** (2) The inner query is the recursive part of a common table expression.
**
** (3) The inner query has a LIMIT clause (since the changes to the WHERE
-** close would change the meaning of the LIMIT).
+** clause would change the meaning of the LIMIT).
**
-** (4) The inner query is the right operand of a LEFT JOIN. (The caller
-** enforces this restriction since this routine does not have enough
-** information to know.)
+** (4) The inner query is the right operand of a LEFT JOIN and the
+** expression to be pushed down does not come from the ON clause
+** on that LEFT JOIN.
**
** (5) The WHERE clause expression originates in the ON or USING clause
-** of a LEFT JOIN.
+** of a LEFT JOIN where iCursor is not the right-hand table of that
+** left join. An example:
+**
+** SELECT *
+** FROM (SELECT 1 AS a1 UNION ALL SELECT 2) AS aa
+** JOIN (SELECT 1 AS b2 UNION ALL SELECT 2) AS bb ON (a1=b2)
+** LEFT JOIN (SELECT 8 AS c3 UNION ALL SELECT 9) AS cc ON (b2=2);
+**
+** The correct answer is three rows: (1,1,NULL),(2,2,8),(2,2,9).
+** But if the (b2=2) term were to be pushed down into the bb subquery,
+** then the (1,1,NULL) row would be suppressed.
+**
+** (6) The inner query features one or more window-functions (since
+** changes to the WHERE clause of the inner query could change the
+** window over which window functions are calculated).
**
** Return 0 if no changes are made and non-zero if one or more WHERE clause
** terms are duplicated into the subquery.
@@ -121554,13 +128216,18 @@ static int pushDownWhereTerms(
Parse *pParse, /* Parse context (for malloc() and error reporting) */
Select *pSubq, /* The subquery whose WHERE clause is to be augmented */
Expr *pWhere, /* The WHERE clause of the outer query */
- int iCursor /* Cursor number of the subquery */
+ int iCursor, /* Cursor number of the subquery */
+ int isLeftJoin /* True if pSubq is the right term of a LEFT JOIN */
){
Expr *pNew;
int nChng = 0;
if( pWhere==0 ) return 0;
if( pSubq->selFlags & SF_Recursive ) return 0; /* restriction (2) */
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( pSubq->pWin ) return 0; /* restriction (6) */
+#endif
+
#ifdef SQLITE_DEBUG
/* Only the first term of a compound can have a WITH clause. But make
** sure no other terms are marked SF_Recursive in case something changes
@@ -121578,15 +128245,25 @@ static int pushDownWhereTerms(
return 0; /* restriction (3) */
}
while( pWhere->op==TK_AND ){
- nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, iCursor);
+ nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight,
+ iCursor, isLeftJoin);
pWhere = pWhere->pLeft;
}
- if( ExprHasProperty(pWhere,EP_FromJoin) ) return 0; /* restriction (5) */
+ if( isLeftJoin
+ && (ExprHasProperty(pWhere,EP_FromJoin)==0
+ || pWhere->iRightJoinTable!=iCursor)
+ ){
+ return 0; /* restriction (4) */
+ }
+ if( ExprHasProperty(pWhere,EP_FromJoin) && pWhere->iRightJoinTable!=iCursor ){
+ return 0; /* restriction (5) */
+ }
if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){
nChng++;
while( pSubq ){
SubstContext x;
pNew = sqlite3ExprDup(pParse->db, pWhere, 0);
+ unsetJoinExpr(pNew, -1);
x.pParse = pParse;
x.iTable = iCursor;
x.iNewTable = iCursor;
@@ -121606,42 +128283,44 @@ static int pushDownWhereTerms(
#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */
/*
-** Based on the contents of the AggInfo structure indicated by the first
-** argument, this function checks if the following are true:
+** The pFunc is the only aggregate function in the query. Check to see
+** if the query is a candidate for the min/max optimization.
**
-** * the query contains just a single aggregate function,
-** * the aggregate function is either min() or max(), and
-** * the argument to the aggregate function is a column value.
+** If the query is a candidate for the min/max optimization, then set
+** *ppMinMax to be an ORDER BY clause to be used for the optimization
+** and return either WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX depending on
+** whether pFunc is a min() or max() function.
**
-** If all of the above are true, then WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX
-** is returned as appropriate. Also, *ppMinMax is set to point to the
-** list of arguments passed to the aggregate before returning.
+** If the query is not a candidate for the min/max optimization, return
+** WHERE_ORDERBY_NORMAL (which must be zero).
**
-** Or, if the conditions above are not met, *ppMinMax is set to 0 and
-** WHERE_ORDERBY_NORMAL is returned.
+** This routine must be called after aggregate functions have been
+** located but before their arguments have been subjected to aggregate
+** analysis.
*/
-static u8 minMaxQuery(AggInfo *pAggInfo, ExprList **ppMinMax){
- int eRet = WHERE_ORDERBY_NORMAL; /* Return value */
-
- *ppMinMax = 0;
- if( pAggInfo->nFunc==1 ){
- Expr *pExpr = pAggInfo->aFunc[0].pExpr; /* Aggregate function */
- ExprList *pEList = pExpr->x.pList; /* Arguments to agg function */
-
- assert( pExpr->op==TK_AGG_FUNCTION );
- if( pEList && pEList->nExpr==1 && pEList->a[0].pExpr->op==TK_AGG_COLUMN ){
- const char *zFunc = pExpr->u.zToken;
- if( sqlite3StrICmp(zFunc, "min")==0 ){
- eRet = WHERE_ORDERBY_MIN;
- *ppMinMax = pEList;
- }else if( sqlite3StrICmp(zFunc, "max")==0 ){
- eRet = WHERE_ORDERBY_MAX;
- *ppMinMax = pEList;
- }
- }
- }
-
- assert( *ppMinMax==0 || (*ppMinMax)->nExpr==1 );
+static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){
+ int eRet = WHERE_ORDERBY_NORMAL; /* Return value */
+ ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */
+ const char *zFunc; /* Name of aggregate function pFunc */
+ ExprList *pOrderBy;
+ u8 sortOrder;
+
+ assert( *ppMinMax==0 );
+ assert( pFunc->op==TK_AGG_FUNCTION );
+ if( pEList==0 || pEList->nExpr!=1 ) return eRet;
+ zFunc = pFunc->u.zToken;
+ if( sqlite3StrICmp(zFunc, "min")==0 ){
+ eRet = WHERE_ORDERBY_MIN;
+ sortOrder = SQLITE_SO_ASC;
+ }else if( sqlite3StrICmp(zFunc, "max")==0 ){
+ eRet = WHERE_ORDERBY_MAX;
+ sortOrder = SQLITE_SO_DESC;
+ }else{
+ return eRet;
+ }
+ *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0);
+ assert( pOrderBy!=0 || db->mallocFailed );
+ if( pOrderBy ) pOrderBy->a[0].sortOrder = sortOrder;
return eRet;
}
@@ -121772,7 +128451,6 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){
assert( pNew->pPrior!=0 );
pNew->pPrior->pNext = pNew;
pNew->pLimit = 0;
- pNew->pOffset = 0;
return WRC_Continue;
}
@@ -121996,6 +128674,35 @@ static void selectPopWith(Walker *pWalker, Select *p){
#endif
/*
+** The SrcList_item structure passed as the second argument represents a
+** sub-query in the FROM clause of a SELECT statement. This function
+** allocates and populates the SrcList_item.pTab object. If successful,
+** SQLITE_OK is returned. Otherwise, if an OOM error is encountered,
+** SQLITE_NOMEM.
+*/
+SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, struct SrcList_item *pFrom){
+ Select *pSel = pFrom->pSelect;
+ Table *pTab;
+
+ assert( pSel );
+ pFrom->pTab = pTab = sqlite3DbMallocZero(pParse->db, sizeof(Table));
+ if( pTab==0 ) return SQLITE_NOMEM;
+ pTab->nTabRef = 1;
+ if( pFrom->zAlias ){
+ pTab->zName = sqlite3DbStrDup(pParse->db, pFrom->zAlias);
+ }else{
+ pTab->zName = sqlite3MPrintf(pParse->db, "subquery_%u", pSel->selId);
+ }
+ while( pSel->pPrior ){ pSel = pSel->pPrior; }
+ sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol);
+ pTab->iPKey = -1;
+ pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) );
+ pTab->tabFlags |= TF_Ephemeral;
+
+ return SQLITE_OK;
+}
+
+/*
** This routine is a Walker callback for "expanding" a SELECT statement.
** "Expanding" means to do the following:
**
@@ -122028,19 +128735,19 @@ static int selectExpander(Walker *pWalker, Select *p){
sqlite3 *db = pParse->db;
Expr *pE, *pRight, *pExpr;
u16 selFlags = p->selFlags;
+ u32 elistFlags = 0;
p->selFlags |= SF_Expanded;
if( db->mallocFailed ){
return WRC_Abort;
}
- if( NEVER(p->pSrc==0) || (selFlags & SF_Expanded)!=0 ){
+ assert( p->pSrc!=0 );
+ if( (selFlags & SF_Expanded)!=0 ){
return WRC_Prune;
}
pTabList = p->pSrc;
pEList = p->pEList;
- if( OK_IF_ALWAYS_TRUE(p->pWith) ){
- sqlite3WithPush(pParse, p->pWith, 0);
- }
+ sqlite3WithPush(pParse, p->pWith, 0);
/* Make sure cursor numbers have been assigned to all entries in
** the FROM clause of the SELECT statement.
@@ -122067,19 +128774,7 @@ static int selectExpander(Walker *pWalker, Select *p){
assert( pSel!=0 );
assert( pFrom->pTab==0 );
if( sqlite3WalkSelect(pWalker, pSel) ) return WRC_Abort;
- pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table));
- if( pTab==0 ) return WRC_Abort;
- pTab->nTabRef = 1;
- if( pFrom->zAlias ){
- pTab->zName = sqlite3DbStrDup(db, pFrom->zAlias);
- }else{
- pTab->zName = sqlite3MPrintf(db, "subquery_%p", (void*)pTab);
- }
- while( pSel->pPrior ){ pSel = pSel->pPrior; }
- sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol);
- pTab->iPKey = -1;
- pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) );
- pTab->tabFlags |= TF_Ephemeral;
+ if( sqlite3ExpandSubquery(pParse, pFrom) ) return WRC_Abort;
#endif
}else{
/* An ordinary table or view name in the FROM clause */
@@ -122102,7 +128797,6 @@ static int selectExpander(Walker *pWalker, Select *p){
if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort;
assert( pFrom->pSelect==0 );
pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0);
- sqlite3SelectSetName(pFrom->pSelect, pTab->zName);
nCol = pTab->nCol;
pTab->nCol = -1;
sqlite3WalkSelect(pWalker, pFrom->pSelect);
@@ -122140,6 +128834,7 @@ static int selectExpander(Walker *pWalker, Select *p){
assert( pE->op!=TK_DOT || pE->pRight!=0 );
assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) );
if( pE->op==TK_DOT && pE->pRight->op==TK_ASTERISK ) break;
+ elistFlags |= pE->flags;
}
if( k<pEList->nExpr ){
/*
@@ -122155,6 +128850,7 @@ static int selectExpander(Walker *pWalker, Select *p){
for(k=0; k<pEList->nExpr; k++){
pE = a[k].pExpr;
+ elistFlags |= pE->flags;
pRight = pE->pRight;
assert( pE->op!=TK_DOT || pRight!=0 );
if( pE->op!=TK_ASTERISK
@@ -122284,9 +128980,14 @@ static int selectExpander(Walker *pWalker, Select *p){
sqlite3ExprListDelete(db, pEList);
p->pEList = pNew;
}
- if( p->pEList && p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
- sqlite3ErrorMsg(pParse, "too many columns in result set");
- return WRC_Abort;
+ if( p->pEList ){
+ if( p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
+ sqlite3ErrorMsg(pParse, "too many columns in result set");
+ return WRC_Abort;
+ }
+ if( (elistFlags & (EP_HasFunc|EP_Subquery))!=0 ){
+ p->selFlags |= SF_ComplexResult;
+ }
}
return WRC_Continue;
}
@@ -122373,7 +129074,7 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){
struct SrcList_item *pFrom;
assert( p->selFlags & SF_Resolved );
- assert( (p->selFlags & SF_HasTypeInfo)==0 );
+ if( p->selFlags & SF_HasTypeInfo ) return;
p->selFlags |= SF_HasTypeInfo;
pParse = pWalker->pParse;
pTabList = p->pSrc;
@@ -122476,7 +129177,7 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){
"argument");
pFunc->iDistinct = -1;
}else{
- KeyInfo *pKeyInfo = keyInfoFromExprList(pParse, pE->x.pList, 0, 0);
+ KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pE->x.pList,0,0);
sqlite3VdbeAddOp4(v, OP_OpenEphemeral, pFunc->iDistinct, 0, 0,
(char*)pKeyInfo, P4_KEYINFO);
}
@@ -122500,11 +129201,17 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
}
}
+
/*
** Update the accumulator memory cells for an aggregate based on
** the current cursor position.
+**
+** 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
+** of setting and clearing regAcc.
*/
-static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){
+static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){
Vdbe *v = pParse->pVdbe;
int i;
int regHit = 0;
@@ -122547,36 +129254,24 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){
if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem;
sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ);
}
- sqlite3VdbeAddOp3(v, OP_AggStep0, 0, regAgg, pF->iMem);
+ sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, pF->iMem);
sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
sqlite3VdbeChangeP5(v, (u8)nArg);
- sqlite3ExprCacheAffinityChange(pParse, regAgg, nArg);
sqlite3ReleaseTempRange(pParse, regAgg, nArg);
if( addrNext ){
sqlite3VdbeResolveLabel(v, addrNext);
- sqlite3ExprCacheClear(pParse);
}
}
-
- /* Before populating the accumulator registers, clear the column cache.
- ** Otherwise, if any of the required column values are already present
- ** in registers, sqlite3ExprCode() may use OP_SCopy to copy the value
- ** to pC->iMem. But by the time the value is used, the original register
- ** may have been used, invalidating the underlying buffer holding the
- ** text or blob value. See ticket [883034dcb5].
- **
- ** Another solution would be to change the OP_SCopy used to copy cached
- ** values to an OP_Copy.
- */
+ if( regHit==0 && pAggInfo->nAccumulator ){
+ regHit = regAcc;
+ }
if( regHit ){
addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v);
}
- sqlite3ExprCacheClear(pParse);
for(i=0, pC=pAggInfo->aCol; i<pAggInfo->nAccumulator; i++, pC++){
sqlite3ExprCode(pParse, pC->pExpr, pC->iMem);
}
pAggInfo->directMode = 0;
- sqlite3ExprCacheClear(pParse);
if( addrHitTest ){
sqlite3VdbeJumpHere(v, addrHitTest);
}
@@ -122594,14 +129289,11 @@ static void explainSimpleCount(
){
if( pParse->explain==2 ){
int bCover = (pIdx!=0 && (HasRowid(pTab) || !IsPrimaryKeyIndex(pIdx)));
- char *zEqp = sqlite3MPrintf(pParse->db, "SCAN TABLE %s%s%s",
+ sqlite3VdbeExplain(pParse, 0, "SCAN TABLE %s%s%s",
pTab->zName,
bCover ? " USING COVERING INDEX " : "",
bCover ? pIdx->zName : ""
);
- sqlite3VdbeAddOp4(
- pParse->pVdbe, OP_Explain, pParse->iSelectId, 0, 0, zEqp, P4_DYNAMIC
- );
}
}
#else
@@ -122609,14 +129301,6 @@ static void explainSimpleCount(
#endif
/*
-** Context object for havingToWhereExprCb().
-*/
-struct HavingToWhereCtx {
- Expr **ppWhere;
- ExprList *pGroupBy;
-};
-
-/*
** sqlite3WalkExpr() callback used by havingToWhere().
**
** If the node passed to the callback is a TK_AND node, return
@@ -122629,15 +129313,16 @@ struct HavingToWhereCtx {
*/
static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){
if( pExpr->op!=TK_AND ){
- struct HavingToWhereCtx *p = pWalker->u.pHavingCtx;
- if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, p->pGroupBy) ){
+ Select *pS = pWalker->u.pSelect;
+ if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, pS->pGroupBy) ){
sqlite3 *db = pWalker->pParse->db;
Expr *pNew = sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[1], 0);
if( pNew ){
- Expr *pWhere = *(p->ppWhere);
+ Expr *pWhere = pS->pWhere;
SWAP(Expr, *pNew, *pExpr);
pNew = sqlite3ExprAnd(db, pWhere, pNew);
- *(p->ppWhere) = pNew;
+ pS->pWhere = pNew;
+ pWalker->eCode = 1;
}
}
return WRC_Prune;
@@ -122660,23 +129345,19 @@ static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){
** entirely of constants and expressions that are also GROUP BY terms that
** use the "BINARY" collation sequence.
*/
-static void havingToWhere(
- Parse *pParse,
- ExprList *pGroupBy,
- Expr *pHaving,
- Expr **ppWhere
-){
- struct HavingToWhereCtx sCtx;
+static void havingToWhere(Parse *pParse, Select *p){
Walker sWalker;
-
- sCtx.ppWhere = ppWhere;
- sCtx.pGroupBy = pGroupBy;
-
memset(&sWalker, 0, sizeof(sWalker));
sWalker.pParse = pParse;
sWalker.xExprCallback = havingToWhereExprCb;
- sWalker.u.pHavingCtx = &sCtx;
- sqlite3WalkExpr(&sWalker, pHaving);
+ sWalker.u.pSelect = p;
+ sqlite3WalkExpr(&sWalker, p->pHaving);
+#if SELECTTRACE_ENABLED
+ if( sWalker.eCode && (sqlite3SelectTrace & 0x100)!=0 ){
+ SELECTTRACE(0x100,pParse,p,("Move HAVING terms into WHERE:\n"));
+ sqlite3TreeViewSelect(0, p, 0);
+ }
+#endif
}
/*
@@ -122720,6 +129401,7 @@ static struct SrcList_item *isSelfJoinView(
** The transformation only works if all of the following are true:
**
** * The subquery is a UNION ALL of two or more terms
+** * The subquery does not have a LIMIT clause
** * There is no WHERE or GROUP BY or HAVING clauses on the subqueries
** * The outer query is a simple count(*)
**
@@ -122743,6 +129425,7 @@ static int countOfViewOptimization(Parse *pParse, Select *p){
do{
if( pSub->op!=TK_ALL && pSub->pPrior ) return 0; /* Must be UNION ALL */
if( pSub->pWhere ) return 0; /* No WHERE clause */
+ if( pSub->pLimit ) return 0; /* No LIMIT clause */
if( pSub->selFlags & SF_Aggregate ) return 0; /* Not an aggregate */
pSub = pSub->pPrior; /* Repeat over compound */
}while( pSub );
@@ -122822,21 +129505,18 @@ SQLITE_PRIVATE int sqlite3Select(
AggInfo sAggInfo; /* Information used by aggregate queries */
int iEnd; /* Address of the end of the query */
sqlite3 *db; /* The database connection */
-
-#ifndef SQLITE_OMIT_EXPLAIN
- int iRestoreSelectId = pParse->iSelectId;
- pParse->iSelectId = pParse->iNextSelectId++;
-#endif
+ ExprList *pMinMaxOrderBy = 0; /* Added ORDER BY for min/max queries */
+ u8 minMaxFlag; /* Flag for min/max queries */
db = pParse->db;
+ v = sqlite3GetVdbe(pParse);
if( p==0 || db->mallocFailed || pParse->nErr ){
return 1;
}
if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1;
memset(&sAggInfo, 0, sizeof(sAggInfo));
#if SELECTTRACE_ENABLED
- pParse->nSelectIndent++;
- SELECTTRACE(1,pParse,p, ("begin processing:\n"));
+ SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain));
if( sqlite3SelectTrace & 0x100 ){
sqlite3TreeViewSelect(0, p, 0);
}
@@ -122858,36 +129538,60 @@ SQLITE_PRIVATE int sqlite3Select(
p->selFlags &= ~SF_Distinct;
}
sqlite3SelectPrep(pParse, p, 0);
- memset(&sSort, 0, sizeof(sSort));
- sSort.pOrderBy = p->pOrderBy;
- pTabList = p->pSrc;
if( pParse->nErr || db->mallocFailed ){
goto select_end;
}
assert( p->pEList!=0 );
- isAgg = (p->selFlags & SF_Aggregate)!=0;
#if SELECTTRACE_ENABLED
- if( sqlite3SelectTrace & 0x100 ){
- SELECTTRACE(0x100,pParse,p, ("after name resolution:\n"));
+ if( sqlite3SelectTrace & 0x104 ){
+ SELECTTRACE(0x104,pParse,p, ("after name resolution:\n"));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
- /* Get a pointer the VDBE under construction, allocating a new VDBE if one
- ** does not already exist */
- v = sqlite3GetVdbe(pParse);
- if( v==0 ) goto select_end;
if( pDest->eDest==SRT_Output ){
generateColumnNames(pParse, p);
}
- /* Try to flatten subqueries in the FROM clause up into the main query
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( sqlite3WindowRewrite(pParse, p) ){
+ goto select_end;
+ }
+#if SELECTTRACE_ENABLED
+ if( sqlite3SelectTrace & 0x108 ){
+ SELECTTRACE(0x104,pParse,p, ("after window rewrite:\n"));
+ sqlite3TreeViewSelect(0, p, 0);
+ }
+#endif
+#endif /* SQLITE_OMIT_WINDOWFUNC */
+ pTabList = p->pSrc;
+ isAgg = (p->selFlags & SF_Aggregate)!=0;
+ memset(&sSort, 0, sizeof(sSort));
+ sSort.pOrderBy = p->pOrderBy;
+
+ /* Try to various optimizations (flattening subqueries, and strength
+ ** reduction of join operators) in the FROM clause up into the main query
*/
#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
for(i=0; !p->pPrior && i<pTabList->nSrc; i++){
struct SrcList_item *pItem = &pTabList->a[i];
Select *pSub = pItem->pSelect;
Table *pTab = pItem->pTab;
+
+ /* Convert LEFT JOIN into JOIN if there are terms of the right table
+ ** of the LEFT JOIN used in the WHERE clause.
+ */
+ if( (pItem->fg.jointype & JT_LEFT)!=0
+ && sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor)
+ && OptimizationEnabled(db, SQLITE_SimplifyJoin)
+ ){
+ SELECTTRACE(0x100,pParse,p,
+ ("LEFT-JOIN simplifies to JOIN on term %d\n",i));
+ pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER);
+ unsetJoinExpr(p->pWhere, pItem->iCursor);
+ }
+
+ /* No futher action if this term of the FROM clause is no a subquery */
if( pSub==0 ) continue;
/* Catch mismatch in the declared columns of a view and the number of
@@ -122908,7 +129612,9 @@ SQLITE_PRIVATE int sqlite3Select(
if( (pSub->selFlags & SF_Aggregate)!=0 ) continue;
assert( pSub->pGroupBy==0 );
- /* If the subquery contains an ORDER BY clause and if
+ /* If the outer query contains a "complex" result set (that is,
+ ** if the result set of the outer query uses functions or subqueries)
+ ** and if the subquery contains an ORDER BY clause and if
** it will be implemented as a co-routine, then do not flatten. This
** restriction allows SQL constructs like this:
**
@@ -122917,9 +129623,16 @@ SQLITE_PRIVATE int sqlite3Select(
**
** The expensive_function() is only computed on the 10 rows that
** are output, rather than every row of the table.
+ **
+ ** The requirement that the outer query have a complex result set
+ ** means that flattening does occur on simpler SQL constraints without
+ ** the expensive_function() like:
+ **
+ ** SELECT x FROM (SELECT x FROM tab ORDER BY y LIMIT 10);
*/
if( pSub->pOrderBy!=0
&& i==0
+ && (p->selFlags & SF_ComplexResult)!=0
&& (pTabList->nSrc==1
|| (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0)
){
@@ -122944,15 +129657,46 @@ SQLITE_PRIVATE int sqlite3Select(
*/
if( p->pPrior ){
rc = multiSelect(pParse, p, pDest);
- explainSetInteger(pParse->iSelectId, iRestoreSelectId);
#if SELECTTRACE_ENABLED
- SELECTTRACE(1,pParse,p,("end compound-select processing\n"));
- pParse->nSelectIndent--;
+ SELECTTRACE(0x1,pParse,p,("end compound-select processing\n"));
+ if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){
+ sqlite3TreeViewSelect(0, p, 0);
+ }
#endif
+ if( p->pNext==0 ) ExplainQueryPlanPop(pParse);
return rc;
}
#endif
+ /* Do the WHERE-clause constant propagation optimization if this is
+ ** a join. No need to speed time on this operation for non-join queries
+ ** as the equivalent optimization will be handled by query planner in
+ ** sqlite3WhereBegin().
+ */
+ if( pTabList->nSrc>1
+ && OptimizationEnabled(db, SQLITE_PropagateConst)
+ && propagateConstants(pParse, p)
+ ){
+#if SELECTTRACE_ENABLED
+ if( sqlite3SelectTrace & 0x100 ){
+ SELECTTRACE(0x100,pParse,p,("After constant propagation:\n"));
+ sqlite3TreeViewSelect(0, p, 0);
+ }
+#endif
+ }else{
+ SELECTTRACE(0x100,pParse,p,("Constant propagation not helpful\n"));
+ }
+
+#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION
+ if( OptimizationEnabled(db, SQLITE_QueryFlattener|SQLITE_CountOfView)
+ && countOfViewOptimization(pParse, p)
+ ){
+ if( db->mallocFailed ) goto select_end;
+ pEList = p->pEList;
+ pTabList = p->pSrc;
+ }
+#endif
+
/* For each term in the FROM clause, do two things:
** (1) Authorized unreferenced tables
** (2) Generate code for all sub-queries
@@ -123020,15 +129764,19 @@ SQLITE_PRIVATE int sqlite3Select(
/* Make copies of constant WHERE-clause terms in the outer query down
** inside the subquery. This can help the subquery to run more efficiently.
*/
- if( (pItem->fg.jointype & JT_OUTER)==0
- && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor)
+ if( OptimizationEnabled(db, SQLITE_PushDown)
+ && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor,
+ (pItem->fg.jointype & JT_OUTER)!=0)
){
#if SELECTTRACE_ENABLED
if( sqlite3SelectTrace & 0x100 ){
- SELECTTRACE(0x100,pParse,p,("After WHERE-clause push-down:\n"));
+ SELECTTRACE(0x100,pParse,p,
+ ("After WHERE-clause push-down into subquery %d:\n", pSub->selId));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
+ }else{
+ SELECTTRACE(0x100,pParse,p,("Push-down not possible\n"));
}
zSavedAuthContext = pParse->zAuthContext;
@@ -123057,7 +129805,7 @@ SQLITE_PRIVATE int sqlite3Select(
VdbeComment((v, "%s", pItem->pTab->zName));
pItem->addrFillSub = addrTop;
sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn);
- explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId);
+ ExplainQueryPlan((pParse, 1, "CO-ROUTINE %u", pSub->selId));
sqlite3Select(pParse, pSub, &dest);
pItem->pTab->nRowLogEst = pSub->nSelectRow;
pItem->fg.viaCoroutine = 1;
@@ -123092,12 +129840,11 @@ SQLITE_PRIVATE int sqlite3Select(
pPrior = isSelfJoinView(pTabList, pItem);
if( pPrior ){
sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pPrior->iCursor);
- explainSetInteger(pItem->iSelectId, pPrior->iSelectId);
assert( pPrior->pSelect!=0 );
pSub->nSelectRow = pPrior->pSelect->nSelectRow;
}else{
sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor);
- explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId);
+ ExplainQueryPlan((pParse, 1, "MATERIALIZE %u", pSub->selId));
sqlite3Select(pParse, pSub, &dest);
}
pItem->pTab->nRowLogEst = pSub->nSelectRow;
@@ -123128,16 +129875,6 @@ SQLITE_PRIVATE int sqlite3Select(
}
#endif
-#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION
- if( OptimizationEnabled(db, SQLITE_QueryFlattener|SQLITE_CountOfView)
- && countOfViewOptimization(pParse, p)
- ){
- if( db->mallocFailed ) goto select_end;
- pEList = p->pEList;
- pTabList = p->pSrc;
- }
-#endif
-
/* If the query is DISTINCT with an ORDER BY but is not an aggregate, and
** if the select-list is the same as the ORDER BY list, then this query
** can be rewritten as a GROUP BY. In other words, this:
@@ -123181,7 +129918,8 @@ SQLITE_PRIVATE int sqlite3Select(
*/
if( sSort.pOrderBy ){
KeyInfo *pKeyInfo;
- pKeyInfo = keyInfoFromExprList(pParse, sSort.pOrderBy, 0, pEList->nExpr);
+ pKeyInfo = sqlite3KeyInfoFromExprList(
+ pParse, sSort.pOrderBy, 0, pEList->nExpr);
sSort.iECursor = pParse->nTab++;
sSort.addrSortIndex =
sqlite3VdbeAddOp4(v, OP_OpenEphemeral,
@@ -123215,9 +129953,9 @@ SQLITE_PRIVATE int sqlite3Select(
if( p->selFlags & SF_Distinct ){
sDistinct.tabTnct = pParse->nTab++;
sDistinct.addrTnct = sqlite3VdbeAddOp4(v, OP_OpenEphemeral,
- sDistinct.tabTnct, 0, 0,
- (char*)keyInfoFromExprList(pParse, p->pEList,0,0),
- P4_KEYINFO);
+ sDistinct.tabTnct, 0, 0,
+ (char*)sqlite3KeyInfoFromExprList(pParse, p->pEList,0,0),
+ P4_KEYINFO);
sqlite3VdbeChangeP5(v, BTREE_UNORDERED);
sDistinct.eTnctType = WHERE_DISTINCT_UNORDERED;
}else{
@@ -123226,11 +129964,19 @@ SQLITE_PRIVATE int sqlite3Select(
if( !isAgg && pGroupBy==0 ){
/* No aggregate functions and no GROUP BY clause */
- u16 wctrlFlags = (sDistinct.isTnct ? WHERE_WANT_DISTINCT : 0);
+ u16 wctrlFlags = (sDistinct.isTnct ? WHERE_WANT_DISTINCT : 0)
+ | (p->selFlags & SF_FixedLimit);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ Window *pWin = p->pWin; /* Master window object (or NULL) */
+ if( pWin ){
+ sqlite3WindowCodeInit(pParse, pWin);
+ }
+#endif
assert( WHERE_USE_LIMIT==SF_FixedLimit );
- wctrlFlags |= p->selFlags & SF_FixedLimit;
+
/* Begin the database scan. */
+ SELECTTRACE(1,pParse,p,("WhereBegin\n"));
pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, sSort.pOrderBy,
p->pEList, wctrlFlags, p->nSelectRow);
if( pWInfo==0 ) goto select_end;
@@ -123242,7 +129988,7 @@ SQLITE_PRIVATE int sqlite3Select(
}
if( sSort.pOrderBy ){
sSort.nOBSat = sqlite3WhereIsOrdered(pWInfo);
- sSort.bOrderedInnerLoop = sqlite3WhereOrderedInnerLoop(pWInfo);
+ sSort.labelOBLopt = sqlite3WhereOrderByLimitOptLabel(pWInfo);
if( sSort.nOBSat==sSort.pOrderBy->nExpr ){
sSort.pOrderBy = 0;
}
@@ -123256,15 +130002,37 @@ SQLITE_PRIVATE int sqlite3Select(
sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex);
}
- /* Use the standard inner loop. */
assert( p->pEList==pEList );
- selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest,
- sqlite3WhereContinueLabel(pWInfo),
- sqlite3WhereBreakLabel(pWInfo));
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( pWin ){
+ int addrGosub = sqlite3VdbeMakeLabel(v);
+ int iCont = sqlite3VdbeMakeLabel(v);
+ int iBreak = sqlite3VdbeMakeLabel(v);
+ int regGosub = ++pParse->nMem;
+
+ sqlite3WindowCodeStep(pParse, p, pWInfo, regGosub, addrGosub);
+
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, iBreak);
+ sqlite3VdbeResolveLabel(v, addrGosub);
+ VdbeNoopComment((v, "inner-loop subroutine"));
+ sSort.labelOBLopt = 0;
+ selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, iCont, iBreak);
+ sqlite3VdbeResolveLabel(v, iCont);
+ sqlite3VdbeAddOp1(v, OP_Return, regGosub);
+ VdbeComment((v, "end inner-loop subroutine"));
+ sqlite3VdbeResolveLabel(v, iBreak);
+ }else
+#endif /* SQLITE_OMIT_WINDOWFUNC */
+ {
+ /* Use the standard inner loop. */
+ selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest,
+ sqlite3WhereContinueLabel(pWInfo),
+ sqlite3WhereBreakLabel(pWInfo));
- /* End the database scan loop.
- */
- sqlite3WhereEnd(pWInfo);
+ /* End the database scan loop.
+ */
+ sqlite3WhereEnd(pWInfo);
+ }
}else{
/* This case when there exist aggregate functions or a GROUP BY clause
** or both */
@@ -123323,7 +130091,8 @@ SQLITE_PRIVATE int sqlite3Select(
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = pParse;
sNC.pSrcList = pTabList;
- sNC.pAggInfo = &sAggInfo;
+ sNC.uNC.pAggInfo = &sAggInfo;
+ VVA_ONLY( sNC.ncFlags = NC_UAggInfo; )
sAggInfo.mnReg = pParse->nMem+1;
sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0;
sAggInfo.pGroupBy = pGroupBy;
@@ -123332,12 +130101,19 @@ SQLITE_PRIVATE int sqlite3Select(
if( pHaving ){
if( pGroupBy ){
assert( pWhere==p->pWhere );
- havingToWhere(pParse, pGroupBy, pHaving, &p->pWhere);
+ assert( pHaving==p->pHaving );
+ assert( pGroupBy==p->pGroupBy );
+ havingToWhere(pParse, p);
pWhere = p->pWhere;
}
sqlite3ExprAnalyzeAggregates(&sNC, pHaving);
}
sAggInfo.nAccumulator = sAggInfo.nColumn;
+ if( p->pGroupBy==0 && p->pHaving==0 && sAggInfo.nFunc==1 ){
+ minMaxFlag = minMaxQuery(db, sAggInfo.aFunc[0].pExpr, &pMinMaxOrderBy);
+ }else{
+ minMaxFlag = WHERE_ORDERBY_NORMAL;
+ }
for(i=0; i<sAggInfo.nFunc; i++){
assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) );
sNC.ncFlags |= NC_InAggFunc;
@@ -123346,6 +130122,24 @@ SQLITE_PRIVATE int sqlite3Select(
}
sAggInfo.mxReg = pParse->nMem;
if( db->mallocFailed ) goto select_end;
+#if SELECTTRACE_ENABLED
+ if( sqlite3SelectTrace & 0x400 ){
+ int ii;
+ SELECTTRACE(0x400,pParse,p,("After aggregate analysis:\n"));
+ sqlite3TreeViewSelect(0, p, 0);
+ for(ii=0; ii<sAggInfo.nColumn; ii++){
+ sqlite3DebugPrintf("agg-column[%d] iMem=%d\n",
+ ii, sAggInfo.aCol[ii].iMem);
+ sqlite3TreeViewExpr(0, sAggInfo.aCol[ii].pExpr, 0);
+ }
+ for(ii=0; ii<sAggInfo.nFunc; ii++){
+ sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n",
+ ii, sAggInfo.aFunc[ii].iMem);
+ sqlite3TreeViewExpr(0, sAggInfo.aFunc[ii].pExpr, 0);
+ }
+ }
+#endif
+
/* Processing for aggregates with GROUP BY is very different and
** much more complex than aggregates without a GROUP BY.
@@ -123367,7 +130161,7 @@ SQLITE_PRIVATE int sqlite3Select(
** will be converted into a Noop.
*/
sAggInfo.sortingIdx = pParse->nTab++;
- pKeyInfo = keyInfoFromExprList(pParse, pGroupBy, 0, sAggInfo.nColumn);
+ pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pGroupBy,0,sAggInfo.nColumn);
addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen,
sAggInfo.sortingIdx, sAggInfo.nSortingColumn,
0, (char*)pKeyInfo, P4_KEYINFO);
@@ -123386,8 +130180,6 @@ SQLITE_PRIVATE int sqlite3Select(
pParse->nMem += pGroupBy->nExpr;
sqlite3VdbeAddOp2(v, OP_Integer, 0, iAbortFlag);
VdbeComment((v, "clear abort flag"));
- sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag);
- VdbeComment((v, "indicate accumulator empty"));
sqlite3VdbeAddOp3(v, OP_Null, 0, iAMem, iAMem+pGroupBy->nExpr-1);
/* Begin a loop that will extract all source rows in GROUP BY order.
@@ -123396,6 +130188,7 @@ SQLITE_PRIVATE int sqlite3Select(
** in the right order to begin with.
*/
sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset);
+ SELECTTRACE(1,pParse,p,("WhereBegin\n"));
pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, 0,
WHERE_GROUPBY | (orderByGrp ? WHERE_SORTBYGROUP : 0), 0
);
@@ -123432,15 +130225,14 @@ SQLITE_PRIVATE int sqlite3Select(
}
}
regBase = sqlite3GetTempRange(pParse, nCol);
- sqlite3ExprCacheClear(pParse);
sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0, 0);
j = nGroupBy;
for(i=0; i<sAggInfo.nColumn; i++){
struct AggInfo_col *pCol = &sAggInfo.aCol[i];
if( pCol->iSorterColumn>=j ){
int r1 = j + regBase;
- sqlite3ExprCodeGetColumnToReg(pParse,
- pCol->pTab, pCol->iColumn, pCol->iTable, r1);
+ sqlite3ExprCodeGetColumnOfTable(v,
+ pCol->pTab, pCol->iTable, pCol->iColumn, r1);
j++;
}
}
@@ -123456,8 +130248,6 @@ SQLITE_PRIVATE int sqlite3Select(
sqlite3VdbeAddOp2(v, OP_SorterSort, sAggInfo.sortingIdx, addrEnd);
VdbeComment((v, "GROUP BY sort")); VdbeCoverage(v);
sAggInfo.useSortingIdx = 1;
- sqlite3ExprCacheClear(pParse);
-
}
/* If the index or temporary table used by the GROUP BY sort
@@ -123480,7 +130270,6 @@ SQLITE_PRIVATE int sqlite3Select(
** from the previous row currently stored in a0, a1, a2...
*/
addrTopOfLoop = sqlite3VdbeCurrentAddr(v);
- sqlite3ExprCacheClear(pParse);
if( groupBySort ){
sqlite3VdbeAddOp3(v, OP_SorterData, sAggInfo.sortingIdx,
sortOut, sortPTab);
@@ -123519,7 +130308,7 @@ SQLITE_PRIVATE int sqlite3Select(
** the current row
*/
sqlite3VdbeJumpHere(v, addr1);
- updateAccumulator(pParse, &sAggInfo);
+ updateAccumulator(pParse, iUseFlag, &sAggInfo);
sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag);
VdbeComment((v, "indicate data in accumulator"));
@@ -123571,11 +130360,12 @@ SQLITE_PRIVATE int sqlite3Select(
*/
sqlite3VdbeResolveLabel(v, addrReset);
resetAccumulator(pParse, &sAggInfo);
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag);
+ VdbeComment((v, "indicate accumulator empty"));
sqlite3VdbeAddOp1(v, OP_Return, regReset);
} /* endif pGroupBy. Begin aggregate queries without GROUP BY: */
else {
- ExprList *pDel = 0;
#ifndef SQLITE_OMIT_BTREECOUNT
Table *pTab;
if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){
@@ -123637,67 +130427,50 @@ SQLITE_PRIVATE int sqlite3Select(
}else
#endif /* SQLITE_OMIT_BTREECOUNT */
{
- /* Check if the query is of one of the following forms:
- **
- ** SELECT min(x) FROM ...
- ** SELECT max(x) FROM ...
- **
- ** If it is, then ask the code in where.c to attempt to sort results
- ** as if there was an "ORDER ON x" or "ORDER ON x DESC" clause.
- ** If where.c is able to produce results sorted in this order, then
- ** add vdbe code to break out of the processing loop after the
- ** first iteration (since the first iteration of the loop is
- ** guaranteed to operate on the row with the minimum or maximum
- ** value of x, the only row required).
- **
- ** A special flag must be passed to sqlite3WhereBegin() to slightly
- ** modify behavior as follows:
- **
- ** + If the query is a "SELECT min(x)", then the loop coded by
- ** where.c should not iterate over any values with a NULL value
- ** for x.
- **
- ** + The optimizer code in where.c (the thing that decides which
- ** index or indices to use) should place a different priority on
- ** satisfying the 'ORDER BY' clause than it does in other cases.
- ** Refer to code and comments in where.c for details.
- */
- ExprList *pMinMax = 0;
- u8 flag = WHERE_ORDERBY_NORMAL;
-
- assert( p->pGroupBy==0 );
- assert( flag==0 );
- if( p->pHaving==0 ){
- flag = minMaxQuery(&sAggInfo, &pMinMax);
- }
- assert( flag==0 || (pMinMax!=0 && pMinMax->nExpr==1) );
-
- if( flag ){
- pMinMax = sqlite3ExprListDup(db, pMinMax, 0);
- pDel = pMinMax;
- assert( db->mallocFailed || pMinMax!=0 );
- if( !db->mallocFailed ){
- pMinMax->a[0].sortOrder = flag!=WHERE_ORDERBY_MIN ?1:0;
- pMinMax->a[0].pExpr->op = TK_COLUMN;
+ int regAcc = 0; /* "populate accumulators" flag */
+
+ /* If there are accumulator registers but no min() or max() functions,
+ ** allocate register regAcc. Register regAcc will contain 0 the first
+ ** time the inner loop runs, and 1 thereafter. The code generated
+ ** by updateAccumulator() only updates the accumulator registers if
+ ** regAcc contains 0. */
+ if( sAggInfo.nAccumulator ){
+ for(i=0; i<sAggInfo.nFunc; i++){
+ if( sAggInfo.aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ) break;
+ }
+ if( i==sAggInfo.nFunc ){
+ regAcc = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regAcc);
}
}
-
+
/* This case runs if the aggregate has no GROUP BY clause. The
** processing is much simpler since there is only a single row
** of output.
*/
+ assert( p->pGroupBy==0 );
resetAccumulator(pParse, &sAggInfo);
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMax, 0,flag,0);
+
+ /* If this query is a candidate for the min/max optimization, then
+ ** minMaxFlag will have been previously set to either
+ ** WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX and pMinMaxOrderBy will
+ ** be an appropriate ORDER BY expression for the optimization.
+ */
+ assert( minMaxFlag==WHERE_ORDERBY_NORMAL || pMinMaxOrderBy!=0 );
+ assert( pMinMaxOrderBy==0 || pMinMaxOrderBy->nExpr==1 );
+
+ SELECTTRACE(1,pParse,p,("WhereBegin\n"));
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMaxOrderBy,
+ 0, minMaxFlag, 0);
if( pWInfo==0 ){
- sqlite3ExprListDelete(db, pDel);
goto select_end;
}
- updateAccumulator(pParse, &sAggInfo);
- assert( pMinMax==0 || pMinMax->nExpr==1 );
+ updateAccumulator(pParse, regAcc, &sAggInfo);
+ if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc);
if( sqlite3WhereIsOrdered(pWInfo)>0 ){
sqlite3VdbeGoto(v, sqlite3WhereBreakLabel(pWInfo));
VdbeComment((v, "%s() by index",
- (flag==WHERE_ORDERBY_MIN?"min":"max")));
+ (minMaxFlag==WHERE_ORDERBY_MIN?"min":"max")));
}
sqlite3WhereEnd(pWInfo);
finalizeAggFunctions(pParse, &sAggInfo);
@@ -123707,7 +130480,6 @@ SQLITE_PRIVATE int sqlite3Select(
sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL);
selectInnerLoop(pParse, p, -1, 0, 0,
pDest, addrEnd, addrEnd);
- sqlite3ExprListDelete(db, pDel);
}
sqlite3VdbeResolveLabel(v, addrEnd);
@@ -123723,6 +130495,7 @@ SQLITE_PRIVATE int sqlite3Select(
if( sSort.pOrderBy ){
explainTempTable(pParse,
sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY");
+ assert( p->pEList==pEList );
generateSortTail(pParse, p, &sSort, pEList->nExpr, pDest);
}
@@ -123738,14 +130511,16 @@ SQLITE_PRIVATE int sqlite3Select(
** successful coding of the SELECT.
*/
select_end:
- explainSetInteger(pParse->iSelectId, iRestoreSelectId);
-
+ sqlite3ExprListDelete(db, pMinMaxOrderBy);
sqlite3DbFree(db, sAggInfo.aCol);
sqlite3DbFree(db, sAggInfo.aFunc);
#if SELECTTRACE_ENABLED
- SELECTTRACE(1,pParse,p,("end processing\n"));
- pParse->nSelectIndent--;
+ SELECTTRACE(0x1,pParse,p,("end processing\n"));
+ if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){
+ sqlite3TreeViewSelect(0, p, 0);
+ }
#endif
+ ExplainQueryPlanPop(pParse);
return rc;
}
@@ -123979,6 +130754,8 @@ SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3 *db, TriggerStep *pTriggerS
sqlite3ExprListDelete(db, pTmp->pExprList);
sqlite3SelectDelete(db, pTmp->pSelect);
sqlite3IdListDelete(db, pTmp->pIdList);
+ sqlite3UpsertDelete(db, pTmp->pUpsert);
+ sqlite3DbFree(db, pTmp->zSpan);
sqlite3DbFree(db, pTmp);
}
@@ -124133,14 +130910,16 @@ SQLITE_PRIVATE void sqlite3BeginTrigger(
goto trigger_cleanup;
}
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
- if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash),zName) ){
- if( !noErr ){
- sqlite3ErrorMsg(pParse, "trigger %T already exists", pName);
- }else{
- assert( !db->init.busy );
- sqlite3CodeVerifySchema(pParse, iDb);
+ if( !IN_RENAME_OBJECT ){
+ if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash),zName) ){
+ if( !noErr ){
+ sqlite3ErrorMsg(pParse, "trigger %T already exists", pName);
+ }else{
+ assert( !db->init.busy );
+ sqlite3CodeVerifySchema(pParse, iDb);
+ }
+ goto trigger_cleanup;
}
- goto trigger_cleanup;
}
/* Do not create a trigger on a system table */
@@ -124164,7 +130943,7 @@ SQLITE_PRIVATE void sqlite3BeginTrigger(
}
#ifndef SQLITE_OMIT_AUTHORIZATION
- {
+ if( !IN_RENAME_OBJECT ){
int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
int code = SQLITE_CREATE_TRIGGER;
const char *zDb = db->aDb[iTabDb].zDbSName;
@@ -124198,8 +130977,15 @@ SQLITE_PRIVATE void sqlite3BeginTrigger(
pTrigger->pTabSchema = pTab->pSchema;
pTrigger->op = (u8)op;
pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER;
- pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE);
- pTrigger->pColumns = sqlite3IdListDup(db, pColumns);
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenRemap(pParse, pTrigger->table, pTableName->a[0].zName);
+ pTrigger->pWhen = pWhen;
+ pWhen = 0;
+ }else{
+ pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE);
+ }
+ pTrigger->pColumns = pColumns;
+ pColumns = 0;
assert( pParse->pNewTrigger==0 );
pParse->pNewTrigger = pTrigger;
@@ -124248,6 +131034,14 @@ SQLITE_PRIVATE void sqlite3FinishTrigger(
goto triggerfinish_cleanup;
}
+#ifndef SQLITE_OMIT_ALTERTABLE
+ if( IN_RENAME_OBJECT ){
+ assert( !db->init.busy );
+ pParse->pNewTrigger = pTrig;
+ pTrig = 0;
+ }else
+#endif
+
/* if we are not initializing,
** build the sqlite_master entry
*/
@@ -124289,18 +131083,34 @@ SQLITE_PRIVATE void sqlite3FinishTrigger(
triggerfinish_cleanup:
sqlite3DeleteTrigger(db, pTrig);
- assert( !pParse->pNewTrigger );
+ assert( IN_RENAME_OBJECT || !pParse->pNewTrigger );
sqlite3DeleteTriggerStep(db, pStepList);
}
/*
+** Duplicate a range of text from an SQL statement, then convert all
+** whitespace characters into ordinary space characters.
+*/
+static char *triggerSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){
+ char *z = sqlite3DbSpanDup(db, zStart, zEnd);
+ int i;
+ if( z ) for(i=0; z[i]; i++) if( sqlite3Isspace(z[i]) ) z[i] = ' ';
+ return z;
+}
+
+/*
** Turn a SELECT statement (that the pSelect parameter points to) into
** a trigger step. Return a pointer to a TriggerStep structure.
**
** The parser calls this routine when it finds a SELECT statement in
** body of a TRIGGER.
*/
-SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelect){
+SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(
+ sqlite3 *db, /* Database connection */
+ Select *pSelect, /* The SELECT statement */
+ const char *zStart, /* Start of SQL text */
+ const char *zEnd /* End of SQL text */
+){
TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
if( pTriggerStep==0 ) {
sqlite3SelectDelete(db, pSelect);
@@ -124309,6 +131119,7 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelec
pTriggerStep->op = TK_SELECT;
pTriggerStep->pSelect = pSelect;
pTriggerStep->orconf = OE_Default;
+ pTriggerStep->zSpan = triggerSpanDup(db, zStart, zEnd);
return pTriggerStep;
}
@@ -124319,10 +131130,13 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelec
** If an OOM error occurs, NULL is returned and db->mallocFailed is set.
*/
static TriggerStep *triggerStepAllocate(
- sqlite3 *db, /* Database connection */
+ Parse *pParse, /* Parser context */
u8 op, /* Trigger opcode */
- Token *pName /* The target name */
+ Token *pName, /* The target name */
+ const char *zStart, /* Start of SQL text */
+ const char *zEnd /* End of SQL text */
){
+ sqlite3 *db = pParse->db;
TriggerStep *pTriggerStep;
pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1);
@@ -124332,6 +131146,10 @@ static TriggerStep *triggerStepAllocate(
sqlite3Dequote(z);
pTriggerStep->zTarget = z;
pTriggerStep->op = op;
+ pTriggerStep->zSpan = triggerSpanDup(db, zStart, zEnd);
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenMap(pParse, pTriggerStep->zTarget, pName);
+ }
}
return pTriggerStep;
}
@@ -124344,23 +131162,36 @@ static TriggerStep *triggerStepAllocate(
** body of a trigger.
*/
SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(
- sqlite3 *db, /* The database connection */
+ Parse *pParse, /* Parser */
Token *pTableName, /* Name of the table into which we insert */
IdList *pColumn, /* List of columns in pTableName to insert into */
Select *pSelect, /* A SELECT statement that supplies values */
- u8 orconf /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */
+ u8 orconf, /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */
+ Upsert *pUpsert, /* ON CONFLICT clauses for upsert */
+ const char *zStart, /* Start of SQL text */
+ const char *zEnd /* End of SQL text */
){
+ sqlite3 *db = pParse->db;
TriggerStep *pTriggerStep;
assert(pSelect != 0 || db->mallocFailed);
- pTriggerStep = triggerStepAllocate(db, TK_INSERT, pTableName);
+ pTriggerStep = triggerStepAllocate(pParse, TK_INSERT, pTableName,zStart,zEnd);
if( pTriggerStep ){
- pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
+ if( IN_RENAME_OBJECT ){
+ pTriggerStep->pSelect = pSelect;
+ pSelect = 0;
+ }else{
+ pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
+ }
pTriggerStep->pIdList = pColumn;
+ pTriggerStep->pUpsert = pUpsert;
pTriggerStep->orconf = orconf;
}else{
+ testcase( pColumn );
sqlite3IdListDelete(db, pColumn);
+ testcase( pUpsert );
+ sqlite3UpsertDelete(db, pUpsert);
}
sqlite3SelectDelete(db, pSelect);
@@ -124373,18 +131204,28 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(
** sees an UPDATE statement inside the body of a CREATE TRIGGER.
*/
SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(
- sqlite3 *db, /* The database connection */
+ Parse *pParse, /* Parser */
Token *pTableName, /* Name of the table to be updated */
ExprList *pEList, /* The SET clause: list of column and new values */
Expr *pWhere, /* The WHERE clause */
- u8 orconf /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
+ u8 orconf, /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
+ const char *zStart, /* Start of SQL text */
+ const char *zEnd /* End of SQL text */
){
+ sqlite3 *db = pParse->db;
TriggerStep *pTriggerStep;
- pTriggerStep = triggerStepAllocate(db, TK_UPDATE, pTableName);
+ pTriggerStep = triggerStepAllocate(pParse, TK_UPDATE, pTableName,zStart,zEnd);
if( pTriggerStep ){
- pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE);
- pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
+ if( IN_RENAME_OBJECT ){
+ pTriggerStep->pExprList = pEList;
+ pTriggerStep->pWhere = pWhere;
+ pEList = 0;
+ pWhere = 0;
+ }else{
+ pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE);
+ pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
+ }
pTriggerStep->orconf = orconf;
}
sqlite3ExprListDelete(db, pEList);
@@ -124398,15 +131239,23 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(
** sees a DELETE statement inside the body of a CREATE TRIGGER.
*/
SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(
- sqlite3 *db, /* Database connection */
+ Parse *pParse, /* Parser */
Token *pTableName, /* The table from which rows are deleted */
- Expr *pWhere /* The WHERE clause */
+ Expr *pWhere, /* The WHERE clause */
+ const char *zStart, /* Start of SQL text */
+ const char *zEnd /* End of SQL text */
){
+ sqlite3 *db = pParse->db;
TriggerStep *pTriggerStep;
- pTriggerStep = triggerStepAllocate(db, TK_DELETE, pTableName);
+ pTriggerStep = triggerStepAllocate(pParse, TK_DELETE, pTableName,zStart,zEnd);
if( pTriggerStep ){
- pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
+ if( IN_RENAME_OBJECT ){
+ pTriggerStep->pWhere = pWhere;
+ pWhere = 0;
+ }else{
+ pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
+ }
pTriggerStep->orconf = OE_Default;
}
sqlite3ExprDelete(db, pWhere);
@@ -124659,13 +131508,21 @@ static int codeTriggerProgram(
pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf;
assert( pParse->okConstFactor==0 );
+#ifndef SQLITE_OMIT_TRACE
+ if( pStep->zSpan ){
+ sqlite3VdbeAddOp4(v, OP_Trace, 0x7fffffff, 1, 0,
+ sqlite3MPrintf(db, "-- %s", pStep->zSpan),
+ P4_DYNAMIC);
+ }
+#endif
+
switch( pStep->op ){
case TK_UPDATE: {
sqlite3Update(pParse,
targetSrcList(pParse, pStep),
sqlite3ExprListDup(db, pStep->pExprList, 0),
sqlite3ExprDup(db, pStep->pWhere, 0),
- pParse->eOrconf
+ pParse->eOrconf, 0, 0, 0
);
break;
}
@@ -124674,14 +131531,15 @@ static int codeTriggerProgram(
targetSrcList(pParse, pStep),
sqlite3SelectDup(db, pStep->pSelect, 0),
sqlite3IdListDup(db, pStep->pIdList),
- pParse->eOrconf
+ pParse->eOrconf,
+ sqlite3UpsertDup(db, pStep->pUpsert)
);
break;
}
case TK_DELETE: {
sqlite3DeleteFrom(pParse,
targetSrcList(pParse, pStep),
- sqlite3ExprDup(db, pStep->pWhere, 0)
+ sqlite3ExprDup(db, pStep->pWhere, 0), 0, 0
);
break;
}
@@ -124799,9 +131657,11 @@ static TriggerPrg *codeRowTrigger(
pTab->zName
));
#ifndef SQLITE_OMIT_TRACE
- sqlite3VdbeChangeP4(v, -1,
- sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC
- );
+ if( pTrigger->zName ){
+ sqlite3VdbeChangeP4(v, -1,
+ sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC
+ );
+ }
#endif
/* If one was specified, code the WHEN clause. If it evaluates to false
@@ -124829,7 +131689,7 @@ static TriggerPrg *codeRowTrigger(
VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf)));
transferParseError(pParse, pSubParse);
- if( db->mallocFailed==0 ){
+ if( db->mallocFailed==0 && pParse->nErr==0 ){
pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg);
}
pProgram->nMem = pSubParse->nMem;
@@ -125137,6 +131997,57 @@ SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
}
/*
+** Check to see if column iCol of index pIdx references any of the
+** columns defined by aXRef and chngRowid. Return true if it does
+** and false if not. This is an optimization. False-positives are a
+** performance degradation, but false-negatives can result in a corrupt
+** index and incorrect answers.
+**
+** aXRef[j] will be non-negative if column j of the original table is
+** being updated. chngRowid will be true if the rowid of the table is
+** being updated.
+*/
+static int indexColumnIsBeingUpdated(
+ Index *pIdx, /* The index to check */
+ int iCol, /* Which column of the index to check */
+ int *aXRef, /* aXRef[j]>=0 if column j is being updated */
+ int chngRowid /* true if the rowid is being updated */
+){
+ i16 iIdxCol = pIdx->aiColumn[iCol];
+ assert( iIdxCol!=XN_ROWID ); /* Cannot index rowid */
+ if( iIdxCol>=0 ){
+ return aXRef[iIdxCol]>=0;
+ }
+ assert( iIdxCol==XN_EXPR );
+ assert( pIdx->aColExpr!=0 );
+ assert( pIdx->aColExpr->a[iCol].pExpr!=0 );
+ return sqlite3ExprReferencesUpdatedColumn(pIdx->aColExpr->a[iCol].pExpr,
+ aXRef,chngRowid);
+}
+
+/*
+** Check to see if index pIdx is a partial index whose conditional
+** expression might change values due to an UPDATE. Return true if
+** the index is subject to change and false if the index is guaranteed
+** to be unchanged. This is an optimization. False-positives are a
+** performance degradation, but false-negatives can result in a corrupt
+** index and incorrect answers.
+**
+** aXRef[j] will be non-negative if column j of the original table is
+** being updated. chngRowid will be true if the rowid of the table is
+** being updated.
+*/
+static int indexWhereClauseMightChange(
+ Index *pIdx, /* The index to check */
+ int *aXRef, /* aXRef[j]>=0 if column j is being updated */
+ int chngRowid /* true if the rowid is being updated */
+){
+ if( pIdx->pPartIdxWhere==0 ) return 0;
+ return sqlite3ExprReferencesUpdatedColumn(pIdx->pPartIdxWhere,
+ aXRef, chngRowid);
+}
+
+/*
** Process an UPDATE statement.
**
** UPDATE OR IGNORE table_wxyz SET a=b, c=d WHERE e<5 AND f NOT NULL;
@@ -125148,7 +132059,10 @@ SQLITE_PRIVATE void sqlite3Update(
SrcList *pTabList, /* The table in which we should change things */
ExprList *pChanges, /* Things to be changed */
Expr *pWhere, /* The WHERE clause. May be null */
- int onError /* How to handle constraint errors */
+ int onError, /* How to handle constraint errors */
+ ExprList *pOrderBy, /* ORDER BY clause. May be null */
+ Expr *pLimit, /* LIMIT clause. May be null */
+ Upsert *pUpsert /* ON CONFLICT clause, or null */
){
int i, j; /* Loop counters */
Table *pTab; /* The table to be updated */
@@ -125233,6 +132147,16 @@ SQLITE_PRIVATE void sqlite3Update(
# define isView 0
#endif
+#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
+ if( !isView ){
+ pWhere = sqlite3LimitWhere(
+ pParse, pTabList, pWhere, pOrderBy, pLimit, "UPDATE"
+ );
+ pOrderBy = 0;
+ pLimit = 0;
+ }
+#endif
+
if( sqlite3ViewGetColumnNames(pParse, pTab) ){
goto update_cleanup;
}
@@ -125245,16 +132169,23 @@ SQLITE_PRIVATE void sqlite3Update(
** need to occur right after the database cursor. So go ahead and
** allocate enough space, just in case.
*/
- pTabList->a[0].iCursor = iBaseCur = iDataCur = pParse->nTab++;
+ iBaseCur = iDataCur = pParse->nTab++;
iIdxCur = iDataCur+1;
pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
+ testcase( pPk!=0 && pPk!=pTab->pIndex );
for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){
- if( IsPrimaryKeyIndex(pIdx) && pPk!=0 ){
+ if( pPk==pIdx ){
iDataCur = pParse->nTab;
- pTabList->a[0].iCursor = iDataCur;
}
pParse->nTab++;
}
+ if( pUpsert ){
+ /* On an UPSERT, reuse the same cursors already opened by INSERT */
+ iDataCur = pUpsert->iDataCur;
+ iIdxCur = pUpsert->iIdxCur;
+ pParse->nTab = iBaseCur;
+ }
+ pTabList->a[0].iCursor = iDataCur;
/* Allocate space for aXRef[], aRegIdx[], and aToOpen[].
** Initialize aXRef[] and aToOpen[] to their default values.
@@ -125271,6 +132202,8 @@ SQLITE_PRIVATE void sqlite3Update(
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = pParse;
sNC.pSrcList = pTabList;
+ sNC.uNC.pUpsert = pUpsert;
+ sNC.ncFlags = NC_UUpsert;
/* Resolve the column names in all the expressions of the
** of the UPDATE statement. Also find the column index
@@ -125337,19 +132270,18 @@ SQLITE_PRIVATE void sqlite3Update(
/* There is one entry in the aRegIdx[] array for each index on the table
** being updated. Fill in aRegIdx[] with a register number that will hold
** the key for accessing each index.
- **
- ** FIXME: Be smarter about omitting indexes that use expressions.
*/
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
int reg;
- if( chngKey || hasFK>1 || pIdx->pPartIdxWhere || pIdx==pPk ){
+ if( chngKey || hasFK>1 || pIdx==pPk
+ || indexWhereClauseMightChange(pIdx,aXRef,chngRowid)
+ ){
reg = ++pParse->nMem;
pParse->nMem += pIdx->nColumn;
}else{
reg = 0;
for(i=0; i<pIdx->nKeyCol; i++){
- i16 iIdxCol = pIdx->aiColumn[i];
- if( iIdxCol<0 || aXRef[iIdxCol]>=0 ){
+ if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){
reg = ++pParse->nMem;
pParse->nMem += pIdx->nColumn;
if( (onError==OE_Replace)
@@ -125374,7 +132306,7 @@ SQLITE_PRIVATE void sqlite3Update(
v = sqlite3GetVdbe(pParse);
if( v==0 ) goto update_cleanup;
if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
- sqlite3BeginWriteOperation(pParse, 1, iDb);
+ sqlite3BeginWriteOperation(pParse, pTrigger || hasFK, iDb);
/* Allocate required registers. */
if( !IsVirtual(pTab) ){
@@ -125401,7 +132333,11 @@ SQLITE_PRIVATE void sqlite3Update(
*/
#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
if( isView ){
- sqlite3MaterializeView(pParse, pTab, pWhere, iDataCur);
+ sqlite3MaterializeView(pParse, pTab,
+ pWhere, pOrderBy, pLimit, iDataCur
+ );
+ pOrderBy = 0;
+ pLimit = 0;
}
#endif
@@ -125421,8 +132357,16 @@ SQLITE_PRIVATE void sqlite3Update(
}
#endif
- /* Initialize the count of updated rows */
- if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab ){
+ /* Jump to labelBreak to abandon further processing of this UPDATE */
+ labelContinue = labelBreak = sqlite3VdbeMakeLabel(v);
+
+ /* Not an UPSERT. Normal processing. Begin by
+ ** initialize the count of updated rows */
+ if( (db->flags&SQLITE_CountRows)!=0
+ && !pParse->pTriggerTab
+ && !pParse->nested
+ && pUpsert==0
+ ){
regRowCount = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount);
}
@@ -125435,46 +132379,61 @@ SQLITE_PRIVATE void sqlite3Update(
iPk = pParse->nMem+1;
pParse->nMem += nPk;
regKey = ++pParse->nMem;
- iEph = pParse->nTab++;
-
- sqlite3VdbeAddOp2(v, OP_Null, 0, iPk);
- addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk);
- sqlite3VdbeSetP4KeyInfo(pParse, pPk);
- }
-
- /* Begin the database scan.
- **
- ** Do not consider a single-pass strategy for a multi-row update if
- ** there are any triggers or foreign keys to process, or rows may
- ** be deleted as a result of REPLACE conflict handling. Any of these
- ** things might disturb a cursor being used to scan through the table
- ** or index, causing a single-pass approach to malfunction. */
- flags = WHERE_ONEPASS_DESIRED|WHERE_SEEK_UNIQ_TABLE;
- if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){
- flags |= WHERE_ONEPASS_MULTIROW;
- }
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags, iIdxCur);
- if( pWInfo==0 ) goto update_cleanup;
-
- /* A one-pass strategy that might update more than one row may not
- ** be used if any column of the index used for the scan is being
- ** updated. Otherwise, if there is an index on "b", statements like
- ** the following could create an infinite loop:
- **
- ** UPDATE t1 SET b=b+1 WHERE b>?
- **
- ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI
- ** strategy that uses an index for which one or more columns are being
- ** updated. */
- eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
- if( eOnePass==ONEPASS_MULTI ){
- int iCur = aiCurOnePass[1];
- if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){
- eOnePass = ONEPASS_OFF;
+ if( pUpsert==0 ){
+ iEph = pParse->nTab++;
+ sqlite3VdbeAddOp3(v, OP_Null, 0, iPk, iPk+nPk-1);
+ addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk);
+ sqlite3VdbeSetP4KeyInfo(pParse, pPk);
}
- assert( iCur!=iDataCur || !HasRowid(pTab) );
}
+ if( pUpsert ){
+ /* If this is an UPSERT, then all cursors have already been opened by
+ ** the outer INSERT and the data cursor should be pointing at the row
+ ** that is to be updated. So bypass the code that searches for the
+ ** row(s) to be updated.
+ */
+ pWInfo = 0;
+ eOnePass = ONEPASS_SINGLE;
+ sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL);
+ }else{
+ /* Begin the database scan.
+ **
+ ** Do not consider a single-pass strategy for a multi-row update if
+ ** there are any triggers or foreign keys to process, or rows may
+ ** be deleted as a result of REPLACE conflict handling. Any of these
+ ** things might disturb a cursor being used to scan through the table
+ ** or index, causing a single-pass approach to malfunction. */
+ flags = WHERE_ONEPASS_DESIRED|WHERE_SEEK_UNIQ_TABLE;
+ if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){
+ flags |= WHERE_ONEPASS_MULTIROW;
+ }
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags, iIdxCur);
+ if( pWInfo==0 ) goto update_cleanup;
+
+ /* A one-pass strategy that might update more than one row may not
+ ** be used if any column of the index used for the scan is being
+ ** updated. Otherwise, if there is an index on "b", statements like
+ ** the following could create an infinite loop:
+ **
+ ** UPDATE t1 SET b=b+1 WHERE b>?
+ **
+ ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI
+ ** strategy that uses an index for which one or more columns are being
+ ** updated. */
+ eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
+ if( eOnePass!=ONEPASS_SINGLE ){
+ sqlite3MultiWrite(pParse);
+ if( eOnePass==ONEPASS_MULTI ){
+ int iCur = aiCurOnePass[1];
+ if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){
+ eOnePass = ONEPASS_OFF;
+ }
+ assert( iCur!=iDataCur || !HasRowid(pTab) );
+ }
+ }
+ }
+
if( HasRowid(pTab) ){
/* Read the rowid of the current row of the WHERE scan. In ONEPASS_OFF
** mode, write the rowid into the FIFO. In either of the one-pass modes,
@@ -125494,7 +132453,7 @@ SQLITE_PRIVATE void sqlite3Update(
sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur,pPk->aiColumn[i],iPk+i);
}
if( eOnePass ){
- sqlite3VdbeChangeToNoop(v, addrOpen);
+ if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen);
nKey = nPk;
regKey = iPk;
}else{
@@ -125504,59 +132463,58 @@ SQLITE_PRIVATE void sqlite3Update(
}
}
- if( eOnePass!=ONEPASS_MULTI ){
- sqlite3WhereEnd(pWInfo);
- }
-
- labelBreak = sqlite3VdbeMakeLabel(v);
- if( !isView ){
- int addrOnce = 0;
-
- /* Open every index that needs updating. */
- if( eOnePass!=ONEPASS_OFF ){
- if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0;
- if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0;
- }
-
- if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){
- addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
+ if( pUpsert==0 ){
+ if( eOnePass!=ONEPASS_MULTI ){
+ sqlite3WhereEnd(pWInfo);
}
- sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur, aToOpen,
- 0, 0);
- if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce);
- }
-
- /* Top of the update loop */
- if( eOnePass!=ONEPASS_OFF ){
- if( !isView && aiCurOnePass[0]!=iDataCur && aiCurOnePass[1]!=iDataCur ){
- assert( pPk );
- sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey, nKey);
- VdbeCoverageNeverTaken(v);
+
+ if( !isView ){
+ int addrOnce = 0;
+
+ /* Open every index that needs updating. */
+ if( eOnePass!=ONEPASS_OFF ){
+ if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0;
+ if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0;
+ }
+
+ if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){
+ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
+ }
+ sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur,
+ aToOpen, 0, 0);
+ if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce);
}
- if( eOnePass==ONEPASS_SINGLE ){
- labelContinue = labelBreak;
- }else{
+
+ /* Top of the update loop */
+ if( eOnePass!=ONEPASS_OFF ){
+ if( !isView && aiCurOnePass[0]!=iDataCur && aiCurOnePass[1]!=iDataCur ){
+ assert( pPk );
+ sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey,nKey);
+ VdbeCoverage(v);
+ }
+ if( eOnePass!=ONEPASS_SINGLE ){
+ labelContinue = sqlite3VdbeMakeLabel(v);
+ }
+ sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak);
+ VdbeCoverageIf(v, pPk==0);
+ VdbeCoverageIf(v, pPk!=0);
+ }else if( pPk ){
labelContinue = sqlite3VdbeMakeLabel(v);
+ sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v);
+ addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey);
+ sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0);
+ VdbeCoverage(v);
+ }else{
+ labelContinue = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet,labelBreak,
+ regOldRowid);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid);
+ VdbeCoverage(v);
}
- sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak);
- VdbeCoverageIf(v, pPk==0);
- VdbeCoverageIf(v, pPk!=0);
- }else if( pPk ){
- labelContinue = sqlite3VdbeMakeLabel(v);
- sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v);
- addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey);
- sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0);
- VdbeCoverage(v);
- }else{
- labelContinue = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet, labelBreak,
- regOldRowid);
- VdbeCoverage(v);
- sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid);
- VdbeCoverage(v);
}
- /* If the record number will change, set register regNewRowid to
- ** contain the new value. If the record number is not being modified,
+ /* If the rowid value will change, set register regNewRowid to
+ ** contain the new value. If the rowid is not being modified,
** then regNewRowid is the same register as regOldRowid, which is
** already populated. */
assert( chngKey || pTrigger || hasFK || regOldRowid==regNewRowid );
@@ -125619,7 +132577,7 @@ SQLITE_PRIVATE void sqlite3Update(
*/
testcase( i==31 );
testcase( i==32 );
- sqlite3ExprCodeGetColumnToReg(pParse, pTab, i, iDataCur, regNew+i);
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i);
}else{
sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);
}
@@ -125648,10 +132606,14 @@ SQLITE_PRIVATE void sqlite3Update(
VdbeCoverage(v);
}
- /* If it did not delete it, the row-trigger may still have modified
+ /* After-BEFORE-trigger-reload-loop:
+ ** If it did not delete it, the BEFORE trigger may still have modified
** some of the columns of the row being updated. Load the values for
- ** all columns not modified by the update statement into their
- ** registers in case this has happened.
+ ** all columns not modified by the update statement into their registers
+ ** in case this has happened. Only unmodified columns are reloaded.
+ ** The values computed for modified columns use the values before the
+ ** BEFORE trigger runs. See test case trigger1-18.0 (added 2018-04-26)
+ ** for an example.
*/
for(i=0; i<pTab->nCol; i++){
if( aXRef[i]<0 && i!=pTab->iPKey ){
@@ -125667,7 +132629,7 @@ SQLITE_PRIVATE void sqlite3Update(
assert( regOldRowid>0 );
sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur,
regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace,
- aXRef);
+ aXRef, 0);
/* Do FK constraint checks. */
if( hasFK ){
@@ -125737,7 +132699,7 @@ SQLITE_PRIVATE void sqlite3Update(
/* Increment the row counter
*/
- if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab){
+ if( regRowCount ){
sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
}
@@ -125764,16 +132726,15 @@ SQLITE_PRIVATE void sqlite3Update(
** maximum rowid counter values recorded while inserting into
** autoincrement tables.
*/
- if( pParse->nested==0 && pParse->pTriggerTab==0 ){
+ if( pParse->nested==0 && pParse->pTriggerTab==0 && pUpsert==0 ){
sqlite3AutoincrementEnd(pParse);
}
/*
- ** Return the number of rows that were changed. If this routine is
- ** generating code because of a call to sqlite3NestedParse(), do not
- ** invoke the callback function.
+ ** Return the number of rows that were changed, if we are tracking
+ ** that information.
*/
- if( (db->flags&SQLITE_CountRows) && !pParse->pTriggerTab && !pParse->nested ){
+ if( regRowCount ){
sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
sqlite3VdbeSetNumCols(v, 1);
sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC);
@@ -125785,6 +132746,10 @@ update_cleanup:
sqlite3SrcListDelete(db, pTabList);
sqlite3ExprListDelete(db, pChanges);
sqlite3ExprDelete(db, pWhere);
+#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT)
+ sqlite3ExprListDelete(db, pOrderBy);
+ sqlite3ExprDelete(db, pLimit);
+#endif
return;
}
/* Make sure "isView" and other macros defined above are undefined. Otherwise
@@ -125841,10 +132806,10 @@ static void updateVirtualTable(
int regRowid; /* Register for ephem table rowid */
int iCsr = pSrc->a[0].iCursor; /* Cursor used for virtual table scan */
int aDummy[2]; /* Unused arg for sqlite3WhereOkOnePass() */
- int bOnePass; /* True to use onepass strategy */
+ int eOnePass; /* True to use onepass strategy */
int addr; /* Address of OP_OpenEphemeral */
- /* Allocate nArg registers to martial the arguments to VUpdate. Then
+ /* Allocate nArg registers in which to gather the arguments for VUpdate. Then
** create and open the ephemeral table in which the records created from
** these arguments will be temporarily stored. */
assert( v );
@@ -125865,6 +132830,7 @@ static void updateVirtualTable(
sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i);
}else{
sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i);
+ sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG);/* Enable sqlite3_vtab_nochange() */
}
}
if( HasRowid(pTab) ){
@@ -125885,26 +132851,32 @@ static void updateVirtualTable(
sqlite3VdbeAddOp2(v, OP_SCopy, regArg+2+iPk, regArg+1);
}
- bOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy);
+ eOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy);
- if( bOnePass ){
+ /* There is no ONEPASS_MULTI on virtual tables */
+ assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE );
+
+ if( eOnePass ){
/* If using the onepass strategy, no-op out the OP_OpenEphemeral coded
- ** above. Also, if this is a top-level parse (not a trigger), clear the
- ** multi-write flag so that the VM does not open a statement journal */
+ ** above. */
sqlite3VdbeChangeToNoop(v, addr);
- if( sqlite3IsToplevel(pParse) ){
- pParse->isMultiWrite = 0;
- }
+ sqlite3VdbeAddOp1(v, OP_Close, iCsr);
}else{
/* Create a record from the argument register contents and insert it into
** the ephemeral table. */
+ sqlite3MultiWrite(pParse);
sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec);
+#ifdef SQLITE_DEBUG
+ /* Signal an assert() within OP_MakeRecord that it is allowed to
+ ** accept no-change records with serial_type 10 */
+ sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG_MAGIC);
+#endif
sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid);
sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid);
}
- if( bOnePass==0 ){
+ if( eOnePass==ONEPASS_OFF ){
/* End the virtual table scan */
sqlite3WhereEnd(pWInfo);
@@ -125924,7 +132896,7 @@ static void updateVirtualTable(
/* End of the ephemeral table scan. Or, if using the onepass strategy,
** jump to here if the scan visited zero rows. */
- if( bOnePass==0 ){
+ if( eOnePass==ONEPASS_OFF ){
sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); VdbeCoverage(v);
sqlite3VdbeJumpHere(v, addr);
sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0);
@@ -125935,6 +132907,261 @@ static void updateVirtualTable(
#endif /* SQLITE_OMIT_VIRTUALTABLE */
/************** End of update.c **********************************************/
+/************** Begin file upsert.c ******************************************/
+/*
+** 2018-04-12
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file contains code to implement various aspects of UPSERT
+** processing and handling of the Upsert object.
+*/
+/* #include "sqliteInt.h" */
+
+#ifndef SQLITE_OMIT_UPSERT
+/*
+** Free a list of Upsert objects
+*/
+SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3 *db, Upsert *p){
+ if( p ){
+ sqlite3ExprListDelete(db, p->pUpsertTarget);
+ sqlite3ExprDelete(db, p->pUpsertTargetWhere);
+ sqlite3ExprListDelete(db, p->pUpsertSet);
+ sqlite3ExprDelete(db, p->pUpsertWhere);
+ sqlite3DbFree(db, p);
+ }
+}
+
+/*
+** Duplicate an Upsert object.
+*/
+SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3 *db, Upsert *p){
+ if( p==0 ) return 0;
+ return sqlite3UpsertNew(db,
+ sqlite3ExprListDup(db, p->pUpsertTarget, 0),
+ sqlite3ExprDup(db, p->pUpsertTargetWhere, 0),
+ sqlite3ExprListDup(db, p->pUpsertSet, 0),
+ sqlite3ExprDup(db, p->pUpsertWhere, 0)
+ );
+}
+
+/*
+** Create a new Upsert object.
+*/
+SQLITE_PRIVATE Upsert *sqlite3UpsertNew(
+ sqlite3 *db, /* Determines which memory allocator to use */
+ ExprList *pTarget, /* Target argument to ON CONFLICT, or NULL */
+ Expr *pTargetWhere, /* Optional WHERE clause on the target */
+ ExprList *pSet, /* UPDATE columns, or NULL for a DO NOTHING */
+ Expr *pWhere /* WHERE clause for the ON CONFLICT UPDATE */
+){
+ Upsert *pNew;
+ pNew = sqlite3DbMallocRaw(db, sizeof(Upsert));
+ if( pNew==0 ){
+ sqlite3ExprListDelete(db, pTarget);
+ sqlite3ExprDelete(db, pTargetWhere);
+ sqlite3ExprListDelete(db, pSet);
+ sqlite3ExprDelete(db, pWhere);
+ return 0;
+ }else{
+ pNew->pUpsertTarget = pTarget;
+ pNew->pUpsertTargetWhere = pTargetWhere;
+ pNew->pUpsertSet = pSet;
+ pNew->pUpsertWhere = pWhere;
+ pNew->pUpsertIdx = 0;
+ }
+ return pNew;
+}
+
+/*
+** Analyze the ON CONFLICT clause described by pUpsert. Resolve all
+** symbols in the conflict-target.
+**
+** Return SQLITE_OK if everything works, or an error code is something
+** is wrong.
+*/
+SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget(
+ Parse *pParse, /* The parsing context */
+ SrcList *pTabList, /* Table into which we are inserting */
+ Upsert *pUpsert /* The ON CONFLICT clauses */
+){
+ Table *pTab; /* That table into which we are inserting */
+ int rc; /* Result code */
+ int iCursor; /* Cursor used by pTab */
+ Index *pIdx; /* One of the indexes of pTab */
+ ExprList *pTarget; /* The conflict-target clause */
+ Expr *pTerm; /* One term of the conflict-target clause */
+ NameContext sNC; /* Context for resolving symbolic names */
+ Expr sCol[2]; /* Index column converted into an Expr */
+
+ assert( pTabList->nSrc==1 );
+ assert( pTabList->a[0].pTab!=0 );
+ assert( pUpsert!=0 );
+ assert( pUpsert->pUpsertTarget!=0 );
+
+ /* Resolve all symbolic names in the conflict-target clause, which
+ ** includes both the list of columns and the optional partial-index
+ ** WHERE clause.
+ */
+ memset(&sNC, 0, sizeof(sNC));
+ sNC.pParse = pParse;
+ sNC.pSrcList = pTabList;
+ rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget);
+ if( rc ) return rc;
+ rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere);
+ if( rc ) return rc;
+
+ /* Check to see if the conflict target matches the rowid. */
+ pTab = pTabList->a[0].pTab;
+ pTarget = pUpsert->pUpsertTarget;
+ iCursor = pTabList->a[0].iCursor;
+ if( HasRowid(pTab)
+ && pTarget->nExpr==1
+ && (pTerm = pTarget->a[0].pExpr)->op==TK_COLUMN
+ && pTerm->iColumn==XN_ROWID
+ ){
+ /* The conflict-target is the rowid of the primary table */
+ assert( pUpsert->pUpsertIdx==0 );
+ return SQLITE_OK;
+ }
+
+ /* Initialize sCol[0..1] to be an expression parse tree for a
+ ** single column of an index. The sCol[0] node will be the TK_COLLATE
+ ** operator and sCol[1] will be the TK_COLUMN operator. Code below
+ ** will populate the specific collation and column number values
+ ** prior to comparing against the conflict-target expression.
+ */
+ memset(sCol, 0, sizeof(sCol));
+ sCol[0].op = TK_COLLATE;
+ sCol[0].pLeft = &sCol[1];
+ sCol[1].op = TK_COLUMN;
+ sCol[1].iTable = pTabList->a[0].iCursor;
+
+ /* Check for matches against other indexes */
+ for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
+ int ii, jj, nn;
+ if( !IsUniqueIndex(pIdx) ) continue;
+ if( pTarget->nExpr!=pIdx->nKeyCol ) continue;
+ if( pIdx->pPartIdxWhere ){
+ if( pUpsert->pUpsertTargetWhere==0 ) continue;
+ if( sqlite3ExprCompare(pParse, pUpsert->pUpsertTargetWhere,
+ pIdx->pPartIdxWhere, iCursor)!=0 ){
+ continue;
+ }
+ }
+ nn = pIdx->nKeyCol;
+ for(ii=0; ii<nn; ii++){
+ Expr *pExpr;
+ sCol[0].u.zToken = (char*)pIdx->azColl[ii];
+ if( pIdx->aiColumn[ii]==XN_EXPR ){
+ assert( pIdx->aColExpr!=0 );
+ assert( pIdx->aColExpr->nExpr>ii );
+ pExpr = pIdx->aColExpr->a[ii].pExpr;
+ if( pExpr->op!=TK_COLLATE ){
+ sCol[0].pLeft = pExpr;
+ pExpr = &sCol[0];
+ }
+ }else{
+ sCol[0].pLeft = &sCol[1];
+ sCol[1].iColumn = pIdx->aiColumn[ii];
+ pExpr = &sCol[0];
+ }
+ for(jj=0; jj<nn; jj++){
+ if( sqlite3ExprCompare(pParse, pTarget->a[jj].pExpr, pExpr,iCursor)<2 ){
+ break; /* Column ii of the index matches column jj of target */
+ }
+ }
+ if( jj>=nn ){
+ /* The target contains no match for column jj of the index */
+ break;
+ }
+ }
+ if( ii<nn ){
+ /* Column ii of the index did not match any term of the conflict target.
+ ** Continue the search with the next index. */
+ continue;
+ }
+ pUpsert->pUpsertIdx = pIdx;
+ return SQLITE_OK;
+ }
+ sqlite3ErrorMsg(pParse, "ON CONFLICT clause does not match any "
+ "PRIMARY KEY or UNIQUE constraint");
+ return SQLITE_ERROR;
+}
+
+/*
+** Generate bytecode that does an UPDATE as part of an upsert.
+**
+** If pIdx is NULL, then the UNIQUE constraint that failed was the IPK.
+** In this case parameter iCur is a cursor open on the table b-tree that
+** currently points to the conflicting table row. Otherwise, if pIdx
+** is not NULL, then pIdx is the constraint that failed and iCur is a
+** cursor points to the conflicting row.
+*/
+SQLITE_PRIVATE void sqlite3UpsertDoUpdate(
+ Parse *pParse, /* The parsing and code-generating context */
+ Upsert *pUpsert, /* The ON CONFLICT clause for the upsert */
+ Table *pTab, /* The table being updated */
+ Index *pIdx, /* The UNIQUE constraint that failed */
+ int iCur /* Cursor for pIdx (or pTab if pIdx==NULL) */
+){
+ Vdbe *v = pParse->pVdbe;
+ sqlite3 *db = pParse->db;
+ SrcList *pSrc; /* FROM clause for the UPDATE */
+ int iDataCur;
+
+ assert( v!=0 );
+ assert( pUpsert!=0 );
+ VdbeNoopComment((v, "Begin DO UPDATE of UPSERT"));
+ iDataCur = pUpsert->iDataCur;
+ if( pIdx && iCur!=iDataCur ){
+ if( HasRowid(pTab) ){
+ int regRowid = sqlite3GetTempReg(pParse);
+ sqlite3VdbeAddOp2(v, OP_IdxRowid, iCur, regRowid);
+ sqlite3VdbeAddOp3(v, OP_SeekRowid, iDataCur, 0, regRowid);
+ VdbeCoverage(v);
+ sqlite3ReleaseTempReg(pParse, regRowid);
+ }else{
+ Index *pPk = sqlite3PrimaryKeyIndex(pTab);
+ int nPk = pPk->nKeyCol;
+ int iPk = pParse->nMem+1;
+ int i;
+ pParse->nMem += nPk;
+ for(i=0; i<nPk; i++){
+ int k;
+ assert( pPk->aiColumn[i]>=0 );
+ k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]);
+ sqlite3VdbeAddOp3(v, OP_Column, iCur, k, iPk+i);
+ VdbeComment((v, "%s.%s", pIdx->zName,
+ pTab->aCol[pPk->aiColumn[i]].zName));
+ }
+ sqlite3VdbeVerifyAbortable(v, OE_Abort);
+ i = sqlite3VdbeAddOp4Int(v, OP_Found, iDataCur, 0, iPk, nPk);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0,
+ "corrupt database", P4_STATIC);
+ sqlite3VdbeJumpHere(v, i);
+ }
+ }
+ /* pUpsert does not own pUpsertSrc - the outer INSERT statement does. So
+ ** we have to make a copy before passing it down into sqlite3Update() */
+ pSrc = sqlite3SrcListDup(db, pUpsert->pUpsertSrc, 0);
+ sqlite3Update(pParse, pSrc, pUpsert->pUpsertSet,
+ pUpsert->pUpsertWhere, OE_Abort, 0, 0, pUpsert);
+ pUpsert->pUpsertSet = 0; /* Will have been deleted by sqlite3Update() */
+ pUpsert->pUpsertWhere = 0; /* Will have been deleted by sqlite3Update() */
+ VdbeNoopComment((v, "End DO UPDATE of UPSERT"));
+}
+
+#endif /* SQLITE_OMIT_UPSERT */
+
+/************** End of upsert.c **********************************************/
/************** Begin file vacuum.c ******************************************/
/*
** 2003 April 6
@@ -125977,8 +133204,14 @@ static int execSql(sqlite3 *db, char **pzErrMsg, const char *zSql){
while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
const char *zSubSql = (const char*)sqlite3_column_text(pStmt,0);
assert( sqlite3_strnicmp(zSql,"SELECT",6)==0 );
- if( zSubSql ){
- assert( zSubSql[0]!='S' );
+ /* The secondary SQL must be one of CREATE TABLE, CREATE INDEX,
+ ** or INSERT. Historically there have been attacks that first
+ ** corrupt the sqlite_master.sql field with other kinds of statements
+ ** then run VACUUM to get those statements to execute at inappropriate
+ ** times. */
+ if( zSubSql
+ && (strncmp(zSubSql,"CRE",3)==0 || strncmp(zSubSql,"INS",3)==0)
+ ){
rc = execSql(db, pzErrMsg, zSubSql);
if( rc!=SQLITE_OK ) break;
}
@@ -126098,7 +133331,8 @@ 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 | SQLITE_CountRows);
+ db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder
+ | SQLITE_Defensive | SQLITE_CountRows);
db->mTrace = 0;
zDbMain = db->aDb[iDb].zDbSName;
@@ -126156,7 +133390,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);
+ rc = sqlite3BtreeBeginTrans(pMain, 2, 0);
if( rc!=SQLITE_OK ) goto end_of_vacuum;
/* Do not attempt to change the page size for a WAL database */
@@ -126191,7 +133425,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){
if( rc!=SQLITE_OK ) goto end_of_vacuum;
rc = execSqlF(db, pzErrMsg,
"SELECT sql FROM \"%w\".sqlite_master"
- " WHERE type='index' AND length(sql)>10",
+ " WHERE type='index'",
zDbMain
);
if( rc!=SQLITE_OK ) goto end_of_vacuum;
@@ -126574,7 +133808,7 @@ SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){
assert( sqlite3_mutex_held(db->mutex) );
if( p ){
- sqlite3ExpirePreparedStatements(db);
+ sqlite3ExpirePreparedStatements(db, 0);
do {
VTable *pNext = p->pNext;
sqlite3VtabUnlock(p);
@@ -126640,7 +133874,6 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse(
Token *pModuleName, /* Name of the module for the virtual table */
int ifNotExists /* No error if the table already exists */
){
- int iDb; /* The database the table is being created in */
Table *pTable; /* The new virtual table */
sqlite3 *db; /* Database connection */
@@ -126650,8 +133883,6 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse(
assert( 0==pTable->pIndex );
db = pParse->db;
- iDb = sqlite3SchemaToIndex(db, pTable->pSchema);
- assert( iDb>=0 );
assert( pTable->nModuleArg==0 );
addModuleArgument(db, pTable, sqlite3NameFromToken(db, pModuleName));
@@ -126671,6 +133902,8 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse(
** The second call, to obtain permission to create the table, is made now.
*/
if( pTable->azModuleArg ){
+ int iDb = sqlite3SchemaToIndex(db, pTable->pSchema);
+ assert( iDb>=0 ); /* The database the table is being created in */
sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName,
pTable->azModuleArg[0], pParse->db->aDb[iDb].zDbSName);
}
@@ -127070,7 +134303,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
assert( IsVirtual(pTab) );
memset(&sParse, 0, sizeof(sParse));
- sParse.declareVtab = 1;
+ sParse.eParseMode = PARSE_MODE_DECLARE_VTAB;
sParse.db = db;
sParse.nQueryLoop = 1;
if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable, &zErr)
@@ -127111,7 +134344,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
sqlite3DbFree(db, zErr);
rc = SQLITE_ERROR;
}
- sParse.declareVtab = 0;
+ sParse.eParseMode = PARSE_MODE_NORMAL;
if( sParse.pVdbe ){
sqlite3VdbeFinalize(sParse.pVdbe);
@@ -127361,14 +134594,11 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
void *pArg = 0;
FuncDef *pNew;
int rc = 0;
- char *zLowerName;
- unsigned char *z;
-
/* Check to see the left operand is a column in a virtual table */
if( NEVER(pExpr==0) ) return pDef;
if( pExpr->op!=TK_COLUMN ) return pDef;
- pTab = pExpr->pTab;
+ pTab = pExpr->y.pTab;
if( pTab==0 ) return pDef;
if( !IsVirtual(pTab) ) return pDef;
pVtab = sqlite3GetVTable(db, pTab)->pVtab;
@@ -127378,16 +134608,22 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
if( pMod->xFindFunction==0 ) return pDef;
/* Call the xFindFunction method on the virtual table implementation
- ** to see if the implementation wants to overload this function
+ ** to see if the implementation wants to overload this function.
+ **
+ ** Though undocumented, we have historically always invoked xFindFunction
+ ** with an all lower-case function name. Continue in this tradition to
+ ** avoid any chance of an incompatibility.
*/
- zLowerName = sqlite3DbStrDup(db, pDef->zName);
- if( zLowerName ){
- for(z=(unsigned char*)zLowerName; *z; z++){
- *z = sqlite3UpperToLower[*z];
+#ifdef SQLITE_DEBUG
+ {
+ int i;
+ for(i=0; pDef->zName[i]; i++){
+ unsigned char x = (unsigned char)pDef->zName[i];
+ assert( x==sqlite3UpperToLower[x] );
}
- rc = pMod->xFindFunction(pVtab, nArg, zLowerName, &xSFunc, &pArg);
- sqlite3DbFree(db, zLowerName);
}
+#endif
+ rc = pMod->xFindFunction(pVtab, nArg, pDef->zName, &xSFunc, &pArg);
if( rc==0 ){
return pDef;
}
@@ -127599,7 +134835,7 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){
** Trace output macros
*/
#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG)
-/***/ int sqlite3WhereTrace;
+/***/ extern int sqlite3WhereTrace;
#endif
#if defined(SQLITE_DEBUG) \
&& (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_WHERETRACE))
@@ -127662,6 +134898,8 @@ struct WhereLevel {
struct InLoop {
int iCur; /* The VDBE cursor used by this IN operator */
int addrInTop; /* Top of the IN loop */
+ int iBase; /* Base register of multi-key index record */
+ int nPrefix; /* Number of prior entires in the key */
u8 eEndLoopOp; /* IN Loop terminator. OP_Next or OP_Prev */
} *aInLoop; /* Information about each nested IN operator */
} in; /* Used when pWLoop->wsFlags&WHERE_IN_ABLE */
@@ -127900,6 +135138,7 @@ struct WhereClause {
WhereInfo *pWInfo; /* WHERE clause processing context */
WhereClause *pOuter; /* Outer conjunction */
u8 op; /* Split operator. TK_AND or TK_OR */
+ u8 hasOr; /* True if any a[].eOperator is WO_OR */
int nTerm; /* Number of terms */
int nSlot; /* Number of entries in a[] */
WhereTerm *a; /* Each a[] describes a term of the WHERE cluase */
@@ -127979,12 +135218,33 @@ struct WhereLoopBuilder {
int nRecValid; /* Number of valid fields currently in pRec */
#endif
unsigned int bldFlags; /* SQLITE_BLDF_* flags */
+ unsigned int iPlanLimit; /* Search limiter */
};
/* Allowed values for WhereLoopBuider.bldFlags */
#define SQLITE_BLDF_INDEXED 0x0001 /* An index is used */
#define SQLITE_BLDF_UNIQUE 0x0002 /* All keys of a UNIQUE index used */
+/* The WhereLoopBuilder.iPlanLimit is used to limit the number of
+** index+constraint combinations the query planner will consider for a
+** particular query. If this parameter is unlimited, then certain
+** pathological queries can spend excess time in the sqlite3WhereBegin()
+** routine. The limit is high enough that is should not impact real-world
+** queries.
+**
+** SQLITE_QUERY_PLANNER_LIMIT is the baseline limit. The limit is
+** increased by SQLITE_QUERY_PLANNER_LIMIT_INCR before each term of the FROM
+** clause is processed, so that every table in a join is guaranteed to be
+** able to propose a some index+constraint combinations even if the initial
+** baseline limit was exhausted by prior tables of the join.
+*/
+#ifndef SQLITE_QUERY_PLANNER_LIMIT
+# define SQLITE_QUERY_PLANNER_LIMIT 20000
+#endif
+#ifndef SQLITE_QUERY_PLANNER_LIMIT_INCR
+# define SQLITE_QUERY_PLANNER_LIMIT_INCR 1000
+#endif
+
/*
** The WHERE clause processing routine has two halves. The
** first part does the start of the WHERE loop and the second
@@ -128047,12 +135307,10 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
Parse *pParse, /* Parse context */
SrcList *pTabList, /* Table list this loop refers to */
WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */
- int iLevel, /* Value for "level" column of output */
- int iFrom, /* Value for "from" column of output */
u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */
);
#else
-# define sqlite3WhereExplainOneScan(u,v,w,x,y,z) 0
+# define sqlite3WhereExplainOneScan(u,v,w,x) 0
#endif /* SQLITE_OMIT_EXPLAIN */
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
SQLITE_PRIVATE void sqlite3WhereAddScanStatus(
@@ -128075,6 +135333,7 @@ SQLITE_PRIVATE void sqlite3WhereClauseInit(WhereClause*,WhereInfo*);
SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause*);
SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause*,Expr*,u8);
SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet*, Expr*);
+SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet*, Expr*);
SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet*, ExprList*);
SQLITE_PRIVATE void sqlite3WhereExprAnalyze(SrcList*, WhereClause*);
SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, struct SrcList_item*, WhereClause*);
@@ -128137,6 +135396,7 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, struct SrcList_item*, WhereC
#define WHERE_SKIPSCAN 0x00008000 /* Uses the skip-scan algorithm */
#define WHERE_UNQ_WANTED 0x00010000 /* WHERE_ONEROW would have been helpful*/
#define WHERE_PARTIALIDX 0x00020000 /* The automatic index is partial */
+#define WHERE_IN_EARLYOUT 0x00040000 /* Perhaps quit IN loops early */
/************** End of whereInt.h ********************************************/
/************** Continuing where we left off in wherecode.c ******************/
@@ -128172,23 +135432,23 @@ static void explainAppendTerm(
int i;
assert( nTerm>=1 );
- if( bAnd ) sqlite3StrAccumAppend(pStr, " AND ", 5);
+ if( bAnd ) sqlite3_str_append(pStr, " AND ", 5);
- if( nTerm>1 ) sqlite3StrAccumAppend(pStr, "(", 1);
+ if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1);
for(i=0; i<nTerm; i++){
- if( i ) sqlite3StrAccumAppend(pStr, ",", 1);
- sqlite3StrAccumAppendAll(pStr, explainIndexColumnName(pIdx, iTerm+i));
+ if( i ) sqlite3_str_append(pStr, ",", 1);
+ sqlite3_str_appendall(pStr, explainIndexColumnName(pIdx, iTerm+i));
}
- if( nTerm>1 ) sqlite3StrAccumAppend(pStr, ")", 1);
+ if( nTerm>1 ) sqlite3_str_append(pStr, ")", 1);
- sqlite3StrAccumAppend(pStr, zOp, 1);
+ sqlite3_str_append(pStr, zOp, 1);
- if( nTerm>1 ) sqlite3StrAccumAppend(pStr, "(", 1);
+ if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1);
for(i=0; i<nTerm; i++){
- if( i ) sqlite3StrAccumAppend(pStr, ",", 1);
- sqlite3StrAccumAppend(pStr, "?", 1);
+ if( i ) sqlite3_str_append(pStr, ",", 1);
+ sqlite3_str_append(pStr, "?", 1);
}
- if( nTerm>1 ) sqlite3StrAccumAppend(pStr, ")", 1);
+ if( nTerm>1 ) sqlite3_str_append(pStr, ")", 1);
}
/*
@@ -128212,11 +135472,11 @@ static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){
int i, j;
if( nEq==0 && (pLoop->wsFlags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ) return;
- sqlite3StrAccumAppend(pStr, " (", 2);
+ sqlite3_str_append(pStr, " (", 2);
for(i=0; i<nEq; i++){
const char *z = explainIndexColumnName(pIndex, i);
- if( i ) sqlite3StrAccumAppend(pStr, " AND ", 5);
- sqlite3XPrintf(pStr, i>=nSkip ? "%s=?" : "ANY(%s)", z);
+ if( i ) sqlite3_str_append(pStr, " AND ", 5);
+ sqlite3_str_appendf(pStr, i>=nSkip ? "%s=?" : "ANY(%s)", z);
}
j = i;
@@ -128227,7 +135487,7 @@ static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){
if( pLoop->wsFlags&WHERE_TOP_LIMIT ){
explainAppendTerm(pStr, pIndex, pLoop->u.btree.nTop, j, i, "<");
}
- sqlite3StrAccumAppend(pStr, ")", 1);
+ sqlite3_str_append(pStr, ")", 1);
}
/*
@@ -128243,19 +135503,16 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
Parse *pParse, /* Parse context */
SrcList *pTabList, /* Table list this loop refers to */
WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */
- int iLevel, /* Value for "level" column of output */
- int iFrom, /* Value for "from" column of output */
u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */
){
int ret = 0;
#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS)
- if( pParse->explain==2 )
+ if( sqlite3ParseToplevel(pParse)->explain==2 )
#endif
{
struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom];
Vdbe *v = pParse->pVdbe; /* VM being constructed */
sqlite3 *db = pParse->db; /* Database handle */
- int iId = pParse->iSelectId; /* Select id (left-most output column) */
int isSearch; /* True for a SEARCH. False for SCAN. */
WhereLoop *pLoop; /* The controlling WhereLoop object */
u32 flags; /* Flags that describe this loop */
@@ -128272,15 +135529,15 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
|| (wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX));
sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH);
- sqlite3StrAccumAppendAll(&str, isSearch ? "SEARCH" : "SCAN");
+ sqlite3_str_appendall(&str, isSearch ? "SEARCH" : "SCAN");
if( pItem->pSelect ){
- sqlite3XPrintf(&str, " SUBQUERY %d", pItem->iSelectId);
+ sqlite3_str_appendf(&str, " SUBQUERY %u", pItem->pSelect->selId);
}else{
- sqlite3XPrintf(&str, " TABLE %s", pItem->zName);
+ sqlite3_str_appendf(&str, " TABLE %s", pItem->zName);
}
if( pItem->zAlias ){
- sqlite3XPrintf(&str, " AS %s", pItem->zAlias);
+ sqlite3_str_appendf(&str, " AS %s", pItem->zAlias);
}
if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 ){
const char *zFmt = 0;
@@ -128303,8 +135560,8 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
zFmt = "INDEX %s";
}
if( zFmt ){
- sqlite3StrAccumAppend(&str, " USING ", 7);
- sqlite3XPrintf(&str, zFmt, pIdx->zName);
+ sqlite3_str_append(&str, " USING ", 7);
+ sqlite3_str_appendf(&str, zFmt, pIdx->zName);
explainIndexRange(&str, pLoop);
}
}else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){
@@ -128319,23 +135576,26 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
assert( flags&WHERE_TOP_LIMIT);
zRangeOp = "<";
}
- sqlite3XPrintf(&str, " USING INTEGER PRIMARY KEY (rowid%s?)",zRangeOp);
+ sqlite3_str_appendf(&str,
+ " USING INTEGER PRIMARY KEY (rowid%s?)",zRangeOp);
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
else if( (flags & WHERE_VIRTUALTABLE)!=0 ){
- sqlite3XPrintf(&str, " VIRTUAL TABLE INDEX %d:%s",
+ sqlite3_str_appendf(&str, " VIRTUAL TABLE INDEX %d:%s",
pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr);
}
#endif
#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS
if( pLoop->nOut>=10 ){
- sqlite3XPrintf(&str, " (~%llu rows)", sqlite3LogEstToInt(pLoop->nOut));
+ sqlite3_str_appendf(&str, " (~%llu rows)",
+ sqlite3LogEstToInt(pLoop->nOut));
}else{
- sqlite3StrAccumAppend(&str, " (~1 row)", 9);
+ sqlite3_str_append(&str, " (~1 row)", 9);
}
#endif
zMsg = sqlite3StrAccumFinish(&str);
- ret = sqlite3VdbeAddOp4(v, OP_Explain, iId, iLevel, iFrom, zMsg,P4_DYNAMIC);
+ ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v),
+ pParse->addrExplain, 0, zMsg,P4_DYNAMIC);
}
return ret;
}
@@ -128415,8 +135675,8 @@ SQLITE_PRIVATE void sqlite3WhereAddScanStatus(
*/
static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
int nLoop = 0;
- while( ALWAYS(pTerm!=0)
- && (pTerm->wtFlags & TERM_CODED)==0
+ assert( pTerm!=0 );
+ while( (pTerm->wtFlags & TERM_CODED)==0
&& (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin))
&& (pLevel->notReady & pTerm->prereqAll)==0
){
@@ -128427,6 +135687,7 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
}
if( pTerm->iParent<0 ) break;
pTerm = &pTerm->pWC->a[pTerm->iParent];
+ assert( pTerm!=0 );
pTerm->nChild--;
if( pTerm->nChild!=0 ) break;
nLoop++;
@@ -128467,7 +135728,6 @@ static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){
/* Code the OP_Affinity opcode if there is anything left to do. */
if( n>0 ){
sqlite3VdbeAddOp4(v, OP_Affinity, base, n, 0, zAff, n);
- sqlite3ExprCacheAffinityChange(pParse, base, n);
}
}
@@ -128497,6 +135757,102 @@ static void updateRangeAffinityStr(
}
}
+
+/*
+** pX is an expression of the form: (vector) IN (SELECT ...)
+** In other words, it is a vector IN operator with a SELECT clause on the
+** LHS. But not all terms in the vector are indexable and the terms might
+** not be in the correct order for indexing.
+**
+** This routine makes a copy of the input pX expression and then adjusts
+** the vector on the LHS with corresponding changes to the SELECT so that
+** the vector contains only index terms and those terms are in the correct
+** order. The modified IN expression is returned. The caller is responsible
+** for deleting the returned expression.
+**
+** Example:
+**
+** CREATE TABLE t1(a,b,c,d,e,f);
+** CREATE INDEX t1x1 ON t1(e,c);
+** SELECT * FROM t1 WHERE (a,b,c,d,e) IN (SELECT v,w,x,y,z FROM t2)
+** \_______________________________________/
+** The pX expression
+**
+** Since only columns e and c can be used with the index, in that order,
+** the modified IN expression that is returned will be:
+**
+** (e,c) IN (SELECT z,x FROM t2)
+**
+** The reduced pX is different from the original (obviously) and thus is
+** only used for indexing, to improve performance. The original unaltered
+** IN expression must also be run on each output row for correctness.
+*/
+static Expr *removeUnindexableInClauseTerms(
+ Parse *pParse, /* The parsing context */
+ int iEq, /* Look at loop terms starting here */
+ WhereLoop *pLoop, /* The current loop */
+ Expr *pX /* The IN expression to be reduced */
+){
+ sqlite3 *db = pParse->db;
+ Expr *pNew = sqlite3ExprDup(db, pX, 0);
+ if( db->mallocFailed==0 ){
+ ExprList *pOrigRhs = pNew->x.pSelect->pEList; /* Original unmodified RHS */
+ ExprList *pOrigLhs = pNew->pLeft->x.pList; /* Original unmodified LHS */
+ ExprList *pRhs = 0; /* New RHS after modifications */
+ ExprList *pLhs = 0; /* New LHS after mods */
+ int i; /* Loop counter */
+ Select *pSelect; /* Pointer to the SELECT on the RHS */
+
+ for(i=iEq; i<pLoop->nLTerm; i++){
+ if( pLoop->aLTerm[i]->pExpr==pX ){
+ int iField = pLoop->aLTerm[i]->iField - 1;
+ if( pOrigRhs->a[iField].pExpr==0 ) continue; /* Duplicate PK column */
+ pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr);
+ pOrigRhs->a[iField].pExpr = 0;
+ assert( pOrigLhs->a[iField].pExpr!=0 );
+ pLhs = sqlite3ExprListAppend(pParse, pLhs, pOrigLhs->a[iField].pExpr);
+ pOrigLhs->a[iField].pExpr = 0;
+ }
+ }
+ sqlite3ExprListDelete(db, pOrigRhs);
+ sqlite3ExprListDelete(db, pOrigLhs);
+ pNew->pLeft->x.pList = pLhs;
+ pNew->x.pSelect->pEList = pRhs;
+ if( pLhs && pLhs->nExpr==1 ){
+ /* Take care here not to generate a TK_VECTOR containing only a
+ ** single value. Since the parser never creates such a vector, some
+ ** of the subroutines do not handle this case. */
+ Expr *p = pLhs->a[0].pExpr;
+ pLhs->a[0].pExpr = 0;
+ sqlite3ExprDelete(db, pNew->pLeft);
+ pNew->pLeft = p;
+ }
+ pSelect = pNew->x.pSelect;
+ if( pSelect->pOrderBy ){
+ /* If the SELECT statement has an ORDER BY clause, zero the
+ ** iOrderByCol variables. These are set to non-zero when an
+ ** ORDER BY term exactly matches one of the terms of the
+ ** result-set. Since the result-set of the SELECT statement may
+ ** have been modified or reordered, these variables are no longer
+ ** set correctly. Since setting them is just an optimization,
+ ** it's easiest just to zero them here. */
+ ExprList *pOrderBy = pSelect->pOrderBy;
+ for(i=0; i<pOrderBy->nExpr; i++){
+ pOrderBy->a[i].u.x.iOrderByCol = 0;
+ }
+ }
+
+#if 0
+ printf("For indexing, change the IN expr:\n");
+ sqlite3TreeViewExpr(0, pX, 0);
+ printf("Into:\n");
+ sqlite3TreeViewExpr(0, pNew, 0);
+#endif
+ }
+ return pNew;
+}
+
+
/*
** Generate code for a single equality term of the WHERE clause. An equality
** term can be either X=expr or X IN (...). pTerm is the term to be
@@ -128559,68 +135915,23 @@ static int codeEqualityTerm(
}
}
for(i=iEq;i<pLoop->nLTerm; i++){
- if( ALWAYS(pLoop->aLTerm[i]) && pLoop->aLTerm[i]->pExpr==pX ) nEq++;
+ assert( pLoop->aLTerm[i]!=0 );
+ if( pLoop->aLTerm[i]->pExpr==pX ) nEq++;
}
if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){
eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0);
}else{
- Select *pSelect = pX->x.pSelect;
sqlite3 *db = pParse->db;
- u16 savedDbOptFlags = db->dbOptFlags;
- ExprList *pOrigRhs = pSelect->pEList;
- ExprList *pOrigLhs = pX->pLeft->x.pList;
- ExprList *pRhs = 0; /* New Select.pEList for RHS */
- ExprList *pLhs = 0; /* New pX->pLeft vector */
+ pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX);
- for(i=iEq;i<pLoop->nLTerm; i++){
- if( pLoop->aLTerm[i]->pExpr==pX ){
- int iField = pLoop->aLTerm[i]->iField - 1;
- Expr *pNewRhs = sqlite3ExprDup(db, pOrigRhs->a[iField].pExpr, 0);
- Expr *pNewLhs = sqlite3ExprDup(db, pOrigLhs->a[iField].pExpr, 0);
-
- pRhs = sqlite3ExprListAppend(pParse, pRhs, pNewRhs);
- pLhs = sqlite3ExprListAppend(pParse, pLhs, pNewLhs);
- }
- }
if( !db->mallocFailed ){
- Expr *pLeft = pX->pLeft;
-
- if( pSelect->pOrderBy ){
- /* If the SELECT statement has an ORDER BY clause, zero the
- ** iOrderByCol variables. These are set to non-zero when an
- ** ORDER BY term exactly matches one of the terms of the
- ** result-set. Since the result-set of the SELECT statement may
- ** have been modified or reordered, these variables are no longer
- ** set correctly. Since setting them is just an optimization,
- ** it's easiest just to zero them here. */
- ExprList *pOrderBy = pSelect->pOrderBy;
- for(i=0; i<pOrderBy->nExpr; i++){
- pOrderBy->a[i].u.x.iOrderByCol = 0;
- }
- }
-
- /* Take care here not to generate a TK_VECTOR containing only a
- ** single value. Since the parser never creates such a vector, some
- ** of the subroutines do not handle this case. */
- if( pLhs->nExpr==1 ){
- pX->pLeft = pLhs->a[0].pExpr;
- }else{
- pLeft->x.pList = pLhs;
- aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int) * nEq);
- testcase( aiMap==0 );
- }
- pSelect->pEList = pRhs;
- db->dbOptFlags |= SQLITE_QueryFlattener;
+ aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq);
eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap);
- db->dbOptFlags = savedDbOptFlags;
- testcase( aiMap!=0 && aiMap[0]!=0 );
- pSelect->pEList = pOrigRhs;
- pLeft->x.pList = pOrigLhs;
- pX->pLeft = pLeft;
+ pTerm->pExpr->iTable = pX->iTable;
}
- sqlite3ExprListDelete(pParse->db, pLhs);
- sqlite3ExprListDelete(pParse->db, pRhs);
+ sqlite3ExprDelete(db, pX);
+ pX = pTerm->pExpr;
}
if( eType==IN_INDEX_INDEX_DESC ){
@@ -128660,7 +135971,14 @@ static int codeEqualityTerm(
sqlite3VdbeAddOp1(v, OP_IsNull, iOut); VdbeCoverage(v);
if( i==iEq ){
pIn->iCur = iTab;
- pIn->eEndLoopOp = bRev ? OP_PrevIfOpen : OP_NextIfOpen;
+ pIn->eEndLoopOp = bRev ? OP_Prev : OP_Next;
+ if( iEq>0 && (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ){
+ pIn->iBase = iReg - i;
+ pIn->nPrefix = i;
+ pLoop->wsFlags |= WHERE_IN_EARLYOUT;
+ }else{
+ pIn->nPrefix = 0;
+ }
}else{
pIn->eEndLoopOp = OP_Noop;
}
@@ -128947,11 +136265,8 @@ static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){
struct CCurHint *pHint = pWalker->u.pCCurHint;
if( pExpr->op==TK_COLUMN ){
if( pExpr->iTable!=pHint->iTabCur ){
- Vdbe *v = pWalker->pParse->pVdbe;
int reg = ++pWalker->pParse->nMem; /* Register for column value */
- sqlite3ExprCodeGetColumnOfTable(
- v, pExpr->pTab, pExpr->iTable, pExpr->iColumn, reg
- );
+ sqlite3ExprCode(pWalker->pParse, pExpr, reg);
pExpr->op = TK_REGISTER;
pExpr->iTable = reg;
}else if( pHint->pIdx!=0 ){
@@ -129183,7 +136498,7 @@ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){
pExpr->op = TK_COLUMN;
pExpr->iTable = pX->iIdxCur;
pExpr->iColumn = pX->iIdxCol;
- pExpr->pTab = 0;
+ pExpr->y.pTab = 0;
return WRC_Prune;
}else{
return WRC_Continue;
@@ -129284,6 +136599,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** initialize a memory cell that records if this table matches any
** row of the left table of the join.
*/
+ assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)
+ || pLevel->iFrom>0 || (pTabItem[0].fg.jointype & JT_LEFT)==0
+ );
if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){
pLevel->iLeftJoin = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin);
@@ -129301,7 +136619,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub);
pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk);
VdbeCoverage(v);
- VdbeComment((v, "next row of \"%s\"", pTabItem->pTab->zName));
+ VdbeComment((v, "next row of %s", pTabItem->pTab->zName));
pLevel->op = OP_Goto;
}else
@@ -129315,7 +136633,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
int nConstraint = pLoop->nLTerm;
int iIn; /* Counter for IN constraints */
- sqlite3ExprCachePush(pParse);
iReg = sqlite3GetTempRange(pParse, nConstraint+2);
addrNotFound = pLevel->addrBrk;
for(j=0; j<nConstraint; j++){
@@ -129388,7 +136705,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
**
** sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2);
*/
- sqlite3ExprCachePop(pParse);
}else
#endif /* SQLITE_OMIT_VIRTUALTABLE */
@@ -129412,9 +136728,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
addrNxt = pLevel->addrNxt;
sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg);
VdbeCoverage(v);
- sqlite3ExprCacheAffinityChange(pParse, iRowidReg, 1);
- sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
- VdbeComment((v, "pk"));
pLevel->op = OP_Noop;
}else if( (pLoop->wsFlags & WHERE_IPK)!=0
&& (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0
@@ -129464,7 +136777,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
if( sqlite3ExprIsVector(pX->pRight) ){
r1 = rTemp = sqlite3GetTempReg(pParse);
codeExprOrVector(pParse, pX->pRight, r1, 1);
- op = aMoveOp[(pX->op - TK_GT) | 0x0001];
+ testcase( pX->op==TK_GT );
+ testcase( pX->op==TK_GE );
+ testcase( pX->op==TK_LT );
+ testcase( pX->op==TK_LE );
+ op = aMoveOp[((pX->op - TK_GT - 1) & 0x3) | 0x1];
+ assert( pX->op!=TK_GT || op==OP_SeekGE );
+ assert( pX->op!=TK_GE || op==OP_SeekGE );
+ assert( pX->op!=TK_LT || op==OP_SeekLE );
+ assert( pX->op!=TK_LE || op==OP_SeekLE );
}else{
r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp);
disableTerm(pLevel, pStart);
@@ -129476,7 +136797,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
VdbeCoverageIf(v, pX->op==TK_LE);
VdbeCoverageIf(v, pX->op==TK_LT);
VdbeCoverageIf(v, pX->op==TK_GE);
- sqlite3ExprCacheAffinityChange(pParse, r1, 1);
sqlite3ReleaseTempReg(pParse, rTemp);
}else{
sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrHalt);
@@ -129511,7 +136831,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
if( testOp!=OP_Noop ){
iRowidReg = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg);
- sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg);
VdbeCoverageIf(v, testOp==OP_Le);
VdbeCoverageIf(v, testOp==OP_Lt);
@@ -129716,6 +137035,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** above has already left the cursor sitting on the correct row,
** so no further seeking is needed */
}else{
+ if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){
+ sqlite3VdbeAddOp1(v, OP_SeekHit, iIdxCur);
+ }
op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev];
assert( op!=0 );
sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint);
@@ -129734,7 +137056,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
nConstraint = nEq;
if( pRangeEnd ){
Expr *pRight = pRangeEnd->pExpr->pRight;
- sqlite3ExprCacheRemove(pParse, regBase+nEq, 1);
codeExprOrVector(pParse, pRight, regBase+nEq, nTop);
whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd);
if( (pRangeEnd->wtFlags & TERM_VNULL)==0
@@ -129778,6 +137099,10 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE );
}
+ if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){
+ sqlite3VdbeAddOp2(v, OP_SeekHit, iIdxCur, 1);
+ }
+
/* Seek the table cursor, if required */
if( omitTable ){
/* pIdx is a covering index. No need to access the main table. */
@@ -129788,7 +137113,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
)){
iRowidReg = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg);
- sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, iRowidReg);
VdbeCoverage(v);
}else{
@@ -129808,9 +137132,16 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
/* If pIdx is an index on one or more expressions, then look through
** all the expressions in pWInfo and try to transform matching expressions
** into reference to index columns.
+ **
+ ** Do not do this for the RHS of a LEFT JOIN. This is because the
+ ** expression may be evaluated after OP_NullRow has been executed on
+ ** 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
*/
- whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo);
-
+ if( pLevel->iLeftJoin==0 ){
+ whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo);
+ }
/* Record the instruction used to terminate the loop. */
if( pLoop->wsFlags & WHERE_ONEROW ){
@@ -129966,7 +137297,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
for(iTerm=0; iTerm<pWC->nTerm; iTerm++){
Expr *pExpr = pWC->a[iTerm].pExpr;
if( &pWC->a[iTerm] == pTerm ) continue;
- if( ExprHasProperty(pExpr, EP_FromJoin) ) continue;
testcase( pWC->a[iTerm].wtFlags & TERM_VIRTUAL );
testcase( pWC->a[iTerm].wtFlags & TERM_CODED );
if( (pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_CODED))!=0 ) continue;
@@ -129985,13 +137315,17 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** sub-WHERE clause is to to invoke the main loop body as a subroutine.
*/
wctrlFlags = WHERE_OR_SUBCLAUSE | (pWInfo->wctrlFlags & WHERE_SEEK_TABLE);
+ ExplainQueryPlan((pParse, 1, "MULTI-INDEX OR"));
for(ii=0; ii<pOrWc->nTerm; ii++){
WhereTerm *pOrTerm = &pOrWc->a[ii];
if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){
WhereInfo *pSubWInfo; /* Info for single OR-term scan */
Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */
int jmp1 = 0; /* Address of jump operation */
- if( pAndExpr && !ExprHasProperty(pOrExpr, EP_FromJoin) ){
+ assert( (pTabItem[0].fg.jointype & JT_LEFT)==0
+ || ExprHasProperty(pOrExpr, EP_FromJoin)
+ );
+ if( pAndExpr ){
pAndExpr->pLeft = pOrExpr;
pOrExpr = pAndExpr;
}
@@ -130003,7 +137337,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
if( pSubWInfo ){
WhereLoop *pSubLoop;
int addrExplain = sqlite3WhereExplainOneScan(
- pParse, pOrTab, &pSubWInfo->a[0], iLevel, pLevel->iFrom, 0
+ pParse, pOrTab, &pSubWInfo->a[0], 0
);
sqlite3WhereAddScanStatus(v, pOrTab, &pSubWInfo->a[0], addrExplain);
@@ -130013,23 +137347,23 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** row will be skipped in subsequent sub-WHERE clauses.
*/
if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){
- int r;
int iSet = ((ii==pOrWc->nTerm-1)?-1:ii);
if( HasRowid(pTab) ){
- r = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, regRowid, 0);
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, regRowid);
jmp1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0,
- r,iSet);
+ regRowid, iSet);
VdbeCoverage(v);
}else{
Index *pPk = sqlite3PrimaryKeyIndex(pTab);
int nPk = pPk->nKeyCol;
int iPk;
+ int r;
/* Read the PK into an array of temp registers. */
r = sqlite3GetTempRange(pParse, nPk);
for(iPk=0; iPk<nPk; iPk++){
int iCol = pPk->aiColumn[iPk];
- sqlite3ExprCodeGetColumnToReg(pParse, pTab, iCol, iCur, r+iPk);
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol, r+iPk);
}
/* Check if the temp table already contains this key. If so,
@@ -130102,6 +137436,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
}
}
+ ExplainQueryPlanPop(pParse);
pLevel->u.pCovidx = pCov;
if( pCov ) pLevel->iIdxCur = iCovCur;
if( pAndExpr ){
@@ -130174,7 +137509,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
pE = pTerm->pExpr;
assert( pE!=0 );
- if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){
+ if( (pTabItem->fg.jointype&JT_LEFT) && !ExprHasProperty(pE,EP_FromJoin) ){
continue;
}
@@ -130187,7 +137522,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
continue;
}
- if( pTerm->wtFlags & TERM_LIKECOND ){
+ if( (pTerm->wtFlags & TERM_LIKECOND)!=0 ){
/* If the TERM_LIKECOND flag is set, that means that the range search
** is sufficient to guarantee that the LIKE operator is true, so we
** can skip the call to the like(A,B) function. But this only works
@@ -130197,8 +137532,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
continue;
#else
u32 x = pLevel->iLikeRepCntr;
- assert( x>0 );
- skipLikeAddr = sqlite3VdbeAddOp1(v, (x&1)?OP_IfNot:OP_If, (int)(x>>1));
+ if( x>0 ){
+ skipLikeAddr = sqlite3VdbeAddOp1(v, (x&1)?OP_IfNot:OP_If,(int)(x>>1));
+ }
VdbeCoverage(v);
#endif
}
@@ -130238,6 +137574,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
WO_EQ|WO_IN|WO_IS, 0);
if( pAlt==0 ) continue;
if( pAlt->wtFlags & (TERM_CODED) ) continue;
+ if( (pAlt->eOperator & WO_IN)
+ && (pAlt->pExpr->flags & EP_xIsSelect)
+ && (pAlt->pExpr->x.pSelect->pEList->nExpr>1)
+ ){
+ continue;
+ }
testcase( pAlt->eOperator & WO_EQ );
testcase( pAlt->eOperator & WO_IS );
testcase( pAlt->eOperator & WO_IN );
@@ -130254,7 +137596,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
pLevel->addrFirst = sqlite3VdbeCurrentAddr(v);
sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin);
VdbeComment((v, "record LEFT JOIN hit"));
- sqlite3ExprCacheClear(pParse);
for(pTerm=pWC->a, j=0; j<pWC->nTerm; j++, pTerm++){
testcase( pTerm->wtFlags & TERM_VIRTUAL );
testcase( pTerm->wtFlags & TERM_CODED );
@@ -130470,18 +137811,18 @@ static int isLikeOrGlob(
int *pisComplete, /* True if the only wildcard is % in the last character */
int *pnoCase /* True if uppercase is equivalent to lowercase */
){
- const u8 *z = 0; /* String on RHS of LIKE operator */
+ const u8 *z = 0; /* String on RHS of LIKE operator */
Expr *pRight, *pLeft; /* Right and left size of LIKE operator */
ExprList *pList; /* List of operands to the LIKE operator */
- int c; /* One character in z[] */
+ u8 c; /* One character in z[] */
int cnt; /* Number of non-wildcard prefix characters */
- char wc[4]; /* Wildcard characters */
+ u8 wc[4]; /* Wildcard characters */
sqlite3 *db = pParse->db; /* Database connection */
sqlite3_value *pVal = 0;
int op; /* Opcode of pRight */
int rc; /* Result code to return */
- if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, wc) ){
+ if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, (char*)wc) ){
return 0;
}
#ifdef SQLITE_EBCDIC
@@ -130506,23 +137847,6 @@ static int isLikeOrGlob(
}
if( z ){
- /* If the RHS begins with a digit or a minus sign, then the LHS must
- ** be an ordinary column (not a virtual table column) with TEXT affinity.
- ** Otherwise the LHS might be numeric and "lhs >= rhs" would be false
- ** even though "lhs LIKE rhs" is true. But if the RHS does not start
- ** with a digit or '-', then "lhs LIKE rhs" will always be false if
- ** the LHS is numeric and so the optimization still works.
- */
- if( sqlite3Isdigit(z[0]) || z[0]=='-' ){
- if( pLeft->op!=TK_COLUMN
- || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT
- || IsVirtual(pLeft->pTab) /* Value might be numeric */
- ){
- sqlite3ValueFree(pVal);
- return 0;
- }
- }
-
/* Count the number of prefix characters prior to the first wildcard */
cnt = 0;
while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){
@@ -130532,11 +137856,13 @@ static int isLikeOrGlob(
/* The optimization is possible only if (1) the pattern does not begin
** with a wildcard and if (2) the non-wildcard prefix does not end with
- ** an (illegal 0xff) character. The second condition is necessary so
+ ** an (illegal 0xff) character, or (3) the pattern does not consist of
+ ** a single escape character. The second condition is necessary so
** that we can increment the prefix key to find an upper bound for the
- ** range search.
- */
- if( cnt!=0 && 255!=(u8)z[cnt-1] ){
+ ** range search. The third is because the caller assumes that the pattern
+ ** consists of at least one character after all escapes have been
+ ** removed. */
+ if( cnt!=0 && 255!=(u8)z[cnt-1] && (cnt>1 || z[0]!=wc[3]) ){
Expr *pPrefix;
/* A "complete" match if the pattern ends with "*" or "%" */
@@ -130553,6 +137879,32 @@ static int isLikeOrGlob(
zNew[iTo++] = zNew[iFrom];
}
zNew[iTo] = 0;
+
+ /* If the RHS begins with a digit or a minus sign, then the LHS must be
+ ** an ordinary column (not a virtual table column) with TEXT affinity.
+ ** Otherwise the LHS might be numeric and "lhs >= rhs" would be false
+ ** even though "lhs LIKE rhs" is true. But if the RHS does not start
+ ** with a digit or '-', then "lhs LIKE rhs" will always be false if
+ ** the LHS is numeric and so the optimization still works.
+ **
+ ** 2018-09-10 ticket c94369cae9b561b1f996d0054bfab11389f9d033
+ ** The RHS pattern must not be '/%' because the termination condition
+ ** will then become "x<'0'" and if the affinity is numeric, will then
+ ** be converted into "x<0", which is incorrect.
+ */
+ if( sqlite3Isdigit(zNew[0])
+ || zNew[0]=='-'
+ || (zNew[0]+1=='0' && iTo==1)
+ ){
+ if( pLeft->op!=TK_COLUMN
+ || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT
+ || IsVirtual(pLeft->y.pTab) /* Value might be numeric */
+ ){
+ sqlite3ExprDelete(db, pPrefix);
+ sqlite3ValueFree(pVal);
+ return 0;
+ }
+ }
}
*ppPrefix = pPrefix;
@@ -130614,6 +137966,7 @@ static int isLikeOrGlob(
** If the expression matches none of the patterns above, return 0.
*/
static int isAuxiliaryVtabOperator(
+ sqlite3 *db, /* Parsing context */
Expr *pExpr, /* Test this expression */
unsigned char *peOp2, /* OUT: 0 for MATCH, or else an op2 value */
Expr **ppLeft, /* Column expression to left of MATCH/op2 */
@@ -130637,26 +137990,64 @@ static int isAuxiliaryVtabOperator(
if( pList==0 || pList->nExpr!=2 ){
return 0;
}
+
+ /* Built-in operators MATCH, GLOB, LIKE, and REGEXP attach to a
+ ** virtual table on their second argument, which is the same as
+ ** the left-hand side operand in their in-fix form.
+ **
+ ** vtab_column MATCH expression
+ ** MATCH(expression,vtab_column)
+ */
pCol = pList->a[1].pExpr;
- if( pCol->op!=TK_COLUMN || !IsVirtual(pCol->pTab) ){
- return 0;
+ if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){
+ for(i=0; i<ArraySize(aOp); i++){
+ if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){
+ *peOp2 = aOp[i].eOp2;
+ *ppRight = pList->a[0].pExpr;
+ *ppLeft = pCol;
+ return 1;
+ }
+ }
}
- for(i=0; i<ArraySize(aOp); i++){
- if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){
- *peOp2 = aOp[i].eOp2;
- *ppRight = pList->a[0].pExpr;
- *ppLeft = pCol;
- return 1;
+
+ /* We can also match against the first column of overloaded
+ ** functions where xFindFunction returns a value of at least
+ ** SQLITE_INDEX_CONSTRAINT_FUNCTION.
+ **
+ ** OVERLOADED(vtab_column,expression)
+ **
+ ** Historically, xFindFunction expected to see lower-case function
+ ** names. But for this use case, xFindFunction is expected to deal
+ ** with function names in an arbitrary case.
+ */
+ pCol = pList->a[0].pExpr;
+ if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){
+ sqlite3_vtab *pVtab;
+ sqlite3_module *pMod;
+ void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**);
+ void *pNotUsed;
+ pVtab = sqlite3GetVTable(db, pCol->y.pTab)->pVtab;
+ assert( pVtab!=0 );
+ assert( pVtab->pModule!=0 );
+ pMod = (sqlite3_module *)pVtab->pModule;
+ if( pMod->xFindFunction!=0 ){
+ i = pMod->xFindFunction(pVtab,2, pExpr->u.zToken, &xNotUsed, &pNotUsed);
+ if( i>=SQLITE_INDEX_CONSTRAINT_FUNCTION ){
+ *peOp2 = i;
+ *ppRight = pList->a[1].pExpr;
+ *ppLeft = pCol;
+ return 1;
+ }
}
}
}else if( pExpr->op==TK_NE || pExpr->op==TK_ISNOT || pExpr->op==TK_NOTNULL ){
int res = 0;
Expr *pLeft = pExpr->pLeft;
Expr *pRight = pExpr->pRight;
- if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->pTab) ){
+ if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->y.pTab) ){
res++;
}
- if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->pTab) ){
+ if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->y.pTab) ){
res++;
SWAP(Expr*, pLeft, pRight);
}
@@ -130948,7 +138339,12 @@ static void exprAnalyzeOrTerm(
** empty.
*/
pOrInfo->indexable = indexable;
- pTerm->eOperator = indexable==0 ? 0 : WO_OR;
+ if( indexable ){
+ pTerm->eOperator = WO_OR;
+ pWC->hasOr = 1;
+ }else{
+ pTerm->eOperator = WO_OR;
+ }
/* For a two-way OR, attempt to implementation case 2.
*/
@@ -131089,12 +138485,11 @@ static void exprAnalyzeOrTerm(
idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC);
testcase( idxNew==0 );
exprAnalyze(pSrc, pWC, idxNew);
- pTerm = &pWC->a[idxTerm];
+ /* pTerm = &pWC->a[idxTerm]; // would be needed if pTerm where used again */
markTermAsChild(pWC, idxNew, idxTerm);
}else{
sqlite3ExprListDelete(db, pList);
}
- pTerm->eOperator = WO_NOOP; /* case 1 trumps case 3 */
}
}
}
@@ -131129,7 +138524,7 @@ static int termIsEquivalence(Parse *pParse, Expr *pExpr){
return 0;
}
pColl = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight);
- if( pColl==0 || sqlite3StrICmp(pColl->zName, "BINARY")==0 ) return 1;
+ if( sqlite3IsBinary(pColl) ) return 1;
return sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight);
}
@@ -131152,6 +138547,9 @@ static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){
for(i=0; i<pSrc->nSrc; i++){
mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect);
mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].pOn);
+ if( pSrc->a[i].fg.isTabFunc ){
+ mask |= sqlite3WhereExprListUsage(pMaskSet, pSrc->a[i].u1.pFuncArg);
+ }
}
}
pS = pS->pPrior;
@@ -131259,7 +138657,7 @@ static void exprAnalyze(
int op; /* Top-level operator. pExpr->op */
Parse *pParse = pWInfo->pParse; /* Parsing context */
sqlite3 *db = pParse->db; /* Database connection */
- unsigned char eOp2; /* op2 value for LIKE/REGEXP/GLOB */
+ unsigned char eOp2 = 0; /* op2 value for LIKE/REGEXP/GLOB */
int nLeft; /* Number of elements on left side vector */
if( db->mallocFailed ){
@@ -131285,7 +138683,7 @@ static void exprAnalyze(
pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight);
}
pMaskSet->bVarSelect = 0;
- prereqAll = sqlite3WhereExprUsage(pMaskSet, pExpr);
+ prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr);
if( pMaskSet->bVarSelect ) pTerm->wtFlags |= TERM_VARSELECT;
if( ExprHasProperty(pExpr, EP_FromJoin) ){
Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable);
@@ -131467,7 +138865,7 @@ static void exprAnalyze(
}
*pC = c + 1;
}
- zCollSeqName = noCase ? "NOCASE" : "BINARY";
+ zCollSeqName = noCase ? "NOCASE" : sqlite3StrBINARY;
pNewExpr1 = sqlite3ExprDup(db, pLeft, 0);
pNewExpr1 = sqlite3PExpr(pParse, TK_GE,
sqlite3ExprAddCollateString(pParse,pNewExpr1,zCollSeqName),
@@ -131503,8 +138901,8 @@ static void exprAnalyze(
** to do anything with MATCH functions.
*/
if( pWC->op==TK_AND ){
- Expr *pRight, *pLeft;
- int res = isAuxiliaryVtabOperator(pExpr, &eOp2, &pLeft, &pRight);
+ Expr *pRight = 0, *pLeft = 0;
+ int res = isAuxiliaryVtabOperator(db, pExpr, &eOp2, &pLeft, &pRight);
while( res-- > 0 ){
int idxNew;
WhereTerm *pNewTerm;
@@ -131564,7 +138962,7 @@ static void exprAnalyze(
exprAnalyze(pSrc, pWC, idxNew);
}
pTerm = &pWC->a[idxTerm];
- pTerm->wtFlags = TERM_CODED|TERM_VIRTUAL; /* Disable the original */
+ pTerm->wtFlags |= TERM_CODED|TERM_VIRTUAL; /* Disable the original */
pTerm->eOperator = 0;
}
@@ -131601,6 +138999,7 @@ static void exprAnalyze(
if( pExpr->op==TK_NOTNULL
&& pExpr->pLeft->op==TK_COLUMN
&& pExpr->pLeft->iColumn>=0
+ && !ExprHasProperty(pExpr, EP_FromJoin)
&& OptimizationEnabled(db, SQLITE_Stat34)
){
Expr *pNewExpr;
@@ -131678,6 +139077,7 @@ SQLITE_PRIVATE void sqlite3WhereClauseInit(
WhereInfo *pWInfo /* The WHERE processing context */
){
pWC->pWInfo = pWInfo;
+ pWC->hasOr = 0;
pWC->pOuter = 0;
pWC->nTerm = 0;
pWC->nSlot = ArraySize(pWC->aStatic);
@@ -131714,17 +139114,18 @@ SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){
** a bitmask indicating which tables are used in that expression
** tree.
*/
-SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){
+SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){
Bitmask mask;
- if( p==0 ) return 0;
- if( p->op==TK_COLUMN ){
+ if( p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){
return sqlite3WhereGetMask(pMaskSet, p->iTable);
+ }else if( ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){
+ assert( p->op!=TK_IF_NULL_ROW );
+ return 0;
}
mask = (p->op==TK_IF_NULL_ROW) ? sqlite3WhereGetMask(pMaskSet, p->iTable) : 0;
- assert( !ExprHasProperty(p, EP_TokenOnly) );
- if( p->pLeft ) mask |= sqlite3WhereExprUsage(pMaskSet, p->pLeft);
+ if( p->pLeft ) mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pLeft);
if( p->pRight ){
- mask |= sqlite3WhereExprUsage(pMaskSet, p->pRight);
+ mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pRight);
assert( p->x.pList==0 );
}else if( ExprHasProperty(p, EP_xIsSelect) ){
if( ExprHasProperty(p, EP_VarSelect) ) pMaskSet->bVarSelect = 1;
@@ -131734,6 +139135,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){
}
return mask;
}
+SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){
+ return p ? sqlite3WhereExprUsageNN(pMaskSet,p) : 0;
+}
SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet *pMaskSet, ExprList *pList){
int i;
Bitmask mask = 0;
@@ -131787,6 +139191,7 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(
pArgs = pItem->u1.pFuncArg;
if( pArgs==0 ) return;
for(j=k=0; j<pArgs->nExpr; j++){
+ Expr *pRhs;
while( k<pTab->nCol && (pTab->aCol[k].colFlags & COLFLAG_HIDDEN)==0 ){k++;}
if( k>=pTab->nCol ){
sqlite3ErrorMsg(pParse, "too many arguments on %s() - max %d",
@@ -131797,9 +139202,10 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(
if( pColRef==0 ) return;
pColRef->iTable = pItem->iCursor;
pColRef->iColumn = k++;
- pColRef->pTab = pTab;
- pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef,
- sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0));
+ pColRef->y.pTab = pTab;
+ pRhs = sqlite3PExpr(pParse, TK_UPLUS,
+ sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0);
+ pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs);
whereClauseInsert(pWC, pTerm, TERM_DYNAMIC);
}
}
@@ -131827,6 +139233,21 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(
/* #include "sqliteInt.h" */
/* #include "whereInt.h" */
+/*
+** Extra information appended to the end of sqlite3_index_info but not
+** visible to the xBestIndex function, at least not directly. The
+** sqlite3_vtab_collation() interface knows how to reach it, however.
+**
+** This object is not an API and can be changed from one release to the
+** next. As long as allocateIndexInfo() and sqlite3_vtab_collation()
+** agree on the structure, all will be well.
+*/
+typedef struct HiddenIndexInfo HiddenIndexInfo;
+struct HiddenIndexInfo {
+ WhereClause *pWC; /* The Where clause being analyzed */
+ Parse *pParse; /* The parsing context */
+};
+
/* Forward declaration of methods */
static int whereLoopResize(sqlite3*, WhereLoop*, int);
@@ -131860,15 +139281,38 @@ SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){
}
/*
-** Return TRUE if the innermost loop of the WHERE clause implementation
-** returns rows in ORDER BY order for complete run of the inner loop.
+** In the ORDER BY LIMIT optimization, if the inner-most loop is known
+** to emit rows in increasing order, and if the last row emitted by the
+** inner-most loop did not fit within the sorter, then we can skip all
+** subsequent rows for the current iteration of the inner loop (because they
+** will not fit in the sorter either) and continue with the second inner
+** loop - the loop immediately outside the inner-most.
+**
+** When a row does not fit in the sorter (because the sorter already
+** holds LIMIT+OFFSET rows that are smaller), then a jump is made to the
+** label returned by this function.
+**
+** If the ORDER BY LIMIT optimization applies, the jump destination should
+** be the continuation for the second-inner-most loop. If the ORDER BY
+** LIMIT optimization does not apply, then the jump destination should
+** be the continuation for the inner-most loop.
**
-** Across multiple iterations of outer loops, the output rows need not be
-** sorted. As long as rows are sorted for just the innermost loop, this
-** routine can return TRUE.
+** It is always safe for this routine to return the continuation of the
+** inner-most loop, in the sense that a correct answer will result.
+** Returning the continuation the second inner loop is an optimization
+** that might make the code run a little faster, but should not change
+** the final answer.
*/
-SQLITE_PRIVATE int sqlite3WhereOrderedInnerLoop(WhereInfo *pWInfo){
- return pWInfo->bOrderedInnerLoop;
+SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo *pWInfo){
+ WhereLevel *pInner;
+ if( !pWInfo->bOrderedInnerLoop ){
+ /* The ORDER BY LIMIT optimization does not apply. Jump to the
+ ** continuation of the inner-most loop. */
+ return pWInfo->iContinue;
+ }
+ pInner = &pWInfo->a[pWInfo->nLevel-1];
+ assert( pInner->addrNxt!=0 );
+ return pInner->addrNxt;
}
/*
@@ -132595,7 +140039,6 @@ static void constructAutomaticIndex(
VdbeComment((v, "for %s", pTable->zName));
/* Fill the automatic index with content */
- sqlite3ExprCachePush(pParse);
pTabItem = &pWC->pWInfo->pTabList->a[pLevel->iFrom];
if( pTabItem->fg.viaCoroutine ){
int regYield = pTabItem->regReturn;
@@ -132603,7 +140046,7 @@ static void constructAutomaticIndex(
sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub);
addrTop = sqlite3VdbeAddOp1(v, OP_Yield, regYield);
VdbeCoverage(v);
- VdbeComment((v, "next row of \"%s\"", pTabItem->pTab->zName));
+ VdbeComment((v, "next row of %s", pTabItem->pTab->zName));
}else{
addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v);
}
@@ -132625,14 +140068,12 @@ 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);
}
sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX);
sqlite3VdbeJumpHere(v, addrTop);
sqlite3ReleaseTempReg(pParse, regRecord);
- sqlite3ExprCachePop(pParse);
/* Jump here when skipping the initialization */
sqlite3VdbeJumpHere(v, addrInit);
@@ -132649,11 +140090,11 @@ end_auto_index_create:
** by passing the pointer returned by this function to sqlite3_free().
*/
static sqlite3_index_info *allocateIndexInfo(
- Parse *pParse,
- WhereClause *pWC,
+ Parse *pParse, /* The parsing context */
+ WhereClause *pWC, /* The WHERE clause being analyzed */
Bitmask mUnusable, /* Ignore terms with these prereqs */
- struct SrcList_item *pSrc,
- ExprList *pOrderBy,
+ struct SrcList_item *pSrc, /* The FROM clause term that is the vtab */
+ ExprList *pOrderBy, /* The ORDER BY clause */
u16 *pmNoOmit /* Mask of terms not to omit */
){
int i, j;
@@ -132661,6 +140102,7 @@ static sqlite3_index_info *allocateIndexInfo(
struct sqlite3_index_constraint *pIdxCons;
struct sqlite3_index_orderby *pIdxOrderBy;
struct sqlite3_index_constraint_usage *pUsage;
+ struct HiddenIndexInfo *pHidden;
WhereTerm *pTerm;
int nOrderBy;
sqlite3_index_info *pIdxInfo;
@@ -132702,7 +140144,7 @@ static sqlite3_index_info *allocateIndexInfo(
*/
pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo)
+ (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm
- + sizeof(*pIdxOrderBy)*nOrderBy );
+ + sizeof(*pIdxOrderBy)*nOrderBy + sizeof(*pHidden) );
if( pIdxInfo==0 ){
sqlite3ErrorMsg(pParse, "out of memory");
return 0;
@@ -132713,7 +140155,8 @@ static sqlite3_index_info *allocateIndexInfo(
** changing them. We have to do some funky casting in order to
** initialize those fields.
*/
- pIdxCons = (struct sqlite3_index_constraint*)&pIdxInfo[1];
+ pHidden = (struct HiddenIndexInfo*)&pIdxInfo[1];
+ pIdxCons = (struct sqlite3_index_constraint*)&pHidden[1];
pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm];
pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy];
*(int*)&pIdxInfo->nConstraint = nTerm;
@@ -132723,6 +140166,8 @@ static sqlite3_index_info *allocateIndexInfo(
*(struct sqlite3_index_constraint_usage**)&pIdxInfo->aConstraintUsage =
pUsage;
+ pHidden->pWC = pWC;
+ pHidden->pParse = pParse;
for(i=j=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
u16 op;
if( pTerm->leftCursor != pSrc->iCursor ) continue;
@@ -132734,6 +140179,20 @@ static sqlite3_index_info *allocateIndexInfo(
testcase( pTerm->eOperator & WO_ALL );
if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue;
if( pTerm->wtFlags & TERM_VNULL ) continue;
+ if( (pSrc->fg.jointype & JT_LEFT)!=0
+ && !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
+ && (pTerm->eOperator & (WO_IS|WO_ISNULL))
+ ){
+ /* An "IS" term in the WHERE clause where the virtual table is the rhs
+ ** of a LEFT JOIN. Do not pass this term to the virtual table
+ ** implementation, as this can lead to incorrect results from SQL such
+ ** as:
+ **
+ ** "LEFT JOIN vtab WHERE vtab.col IS NULL" */
+ testcase( pTerm->eOperator & WO_ISNULL );
+ testcase( pTerm->eOperator & WO_IS );
+ continue;
+ }
assert( pTerm->u.leftColumn>=(-1) );
pIdxCons[j].iColumn = pTerm->u.leftColumn;
pIdxCons[j].iTermOffset = i;
@@ -132786,9 +140245,11 @@ static sqlite3_index_info *allocateIndexInfo(
** method of the virtual table with the sqlite3_index_info object that
** comes in as the 3rd argument to this function.
**
-** If an error occurs, pParse is populated with an error message and a
-** non-zero value is returned. Otherwise, 0 is returned and the output
-** part of the sqlite3_index_info structure is left populated.
+** If an error occurs, pParse is populated with an error message and an
+** appropriate error code is returned. A return of SQLITE_CONSTRAINT from
+** xBestIndex is not considered an error. SQLITE_CONSTRAINT indicates that
+** the current configuration of "unusable" flags in sqlite3_index_info can
+** not result in a valid plan.
**
** Whether or not an error is returned, it is the responsibility of the
** caller to eventually free p->idxStr if p->needToFreeIdxStr indicates
@@ -132802,7 +140263,7 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){
rc = pVtab->pModule->xBestIndex(pVtab, p);
TRACE_IDX_OUTPUTS(p);
- if( rc!=SQLITE_OK ){
+ if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){
if( rc==SQLITE_NOMEM ){
sqlite3OomFault(pParse->db);
}else if( !pVtab->zErrMsg ){
@@ -132813,19 +140274,7 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){
}
sqlite3_free(pVtab->zErrMsg);
pVtab->zErrMsg = 0;
-
-#if 0
- /* This error is now caught by the caller.
- ** Search for "xBestIndex malfunction" below */
- for(i=0; i<p->nConstraint; i++){
- if( !p->aConstraint[i].usable && p->aConstraintUsage[i].argvIndex>0 ){
- sqlite3ErrorMsg(pParse,
- "table %s: xBestIndex returned an invalid plan", pTab->zName);
- }
- }
-#endif
-
- return pParse->nErr;
+ return rc;
}
#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */
@@ -133225,7 +140674,9 @@ static int whereRangeScanEst(
Index *p = pLoop->u.btree.pIndex;
int nEq = pLoop->u.btree.nEq;
- if( p->nSample>0 && nEq<p->nSampleCol ){
+ if( p->nSample>0 && nEq<p->nSampleCol
+ && OptimizationEnabled(pParse->db, SQLITE_Stat34)
+ ){
if( nEq==pBuilder->nRecValid ){
UnpackedRecord *pRec = pBuilder->pRec;
tRowcnt a[2];
@@ -133671,22 +141122,21 @@ static void whereLoopDelete(sqlite3 *db, WhereLoop *p){
** Free a WhereInfo structure
*/
static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){
- if( ALWAYS(pWInfo) ){
- int i;
- for(i=0; i<pWInfo->nLevel; i++){
- WhereLevel *pLevel = &pWInfo->a[i];
- if( pLevel->pWLoop && (pLevel->pWLoop->wsFlags & WHERE_IN_ABLE) ){
- sqlite3DbFree(db, pLevel->u.in.aInLoop);
- }
- }
- sqlite3WhereClauseClear(&pWInfo->sWC);
- while( pWInfo->pLoops ){
- WhereLoop *p = pWInfo->pLoops;
- pWInfo->pLoops = p->pNextLoop;
- whereLoopDelete(db, p);
+ int i;
+ assert( pWInfo!=0 );
+ for(i=0; i<pWInfo->nLevel; i++){
+ WhereLevel *pLevel = &pWInfo->a[i];
+ if( pLevel->pWLoop && (pLevel->pWLoop->wsFlags & WHERE_IN_ABLE) ){
+ sqlite3DbFree(db, pLevel->u.in.aInLoop);
}
- sqlite3DbFreeNN(db, pWInfo);
}
+ sqlite3WhereClauseClear(&pWInfo->sWC);
+ while( pWInfo->pLoops ){
+ WhereLoop *p = pWInfo->pLoops;
+ pWInfo->pLoops = p->pNextLoop;
+ whereLoopDelete(db, p);
+ }
+ sqlite3DbFreeNN(db, pWInfo);
}
/*
@@ -133879,6 +141329,14 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){
sqlite3 *db = pWInfo->pParse->db;
int rc;
+ /* Stop the search once we hit the query planner search limit */
+ if( pBuilder->iPlanLimit==0 ){
+ WHERETRACE(0xffffffff,("=== query planner search limit reached ===\n"));
+ if( pBuilder->pOrSet ) pBuilder->pOrSet->n = 0;
+ return SQLITE_DONE;
+ }
+ pBuilder->iPlanLimit--;
+
/* If pBuilder->pOrSet is defined, then only keep track of the costs
** and prereqs.
*/
@@ -134163,8 +141621,8 @@ static int whereLoopAddBtreeIndex(
pNew = pBuilder->pNew;
if( db->mallocFailed ) return SQLITE_NOMEM_BKPT;
- WHERETRACE(0x800, ("BEGIN addBtreeIdx(%s), nEq=%d\n",
- pProbe->zName, pNew->u.btree.nEq));
+ WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d\n",
+ pProbe->pTable->zName,pProbe->zName, pNew->u.btree.nEq));
assert( (pNew->wsFlags & WHERE_VIRTUALTABLE)==0 );
assert( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 );
@@ -134210,15 +141668,12 @@ static int whereLoopAddBtreeIndex(
** to mix with a lower range bound from some other source */
if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue;
- /* Do not allow IS constraints from the WHERE clause to be used by the
+ /* Do not allow constraints from the WHERE clause to be used by the
** right table of a LEFT JOIN. Only constraints in the ON clause are
** allowed */
if( (pSrc->fg.jointype & JT_LEFT)!=0
&& !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
- && (eOp & (WO_IS|WO_ISNULL))!=0
){
- testcase( eOp & WO_IS );
- testcase( eOp & WO_ISNULL );
continue;
}
@@ -134244,7 +141699,6 @@ static int whereLoopAddBtreeIndex(
if( eOp & WO_IN ){
Expr *pExpr = pTerm->pExpr;
- pNew->wsFlags |= WHERE_COLUMN_IN;
if( ExprHasProperty(pExpr, EP_xIsSelect) ){
/* "x IN (SELECT ...)": TUNING: the SELECT returns 25 rows */
int i;
@@ -134264,17 +141718,55 @@ static int whereLoopAddBtreeIndex(
assert( nIn>0 ); /* RHS always has 2 or more terms... The parser
** changes "x IN (?)" into "x=?". */
}
+ if( pProbe->hasStat1 ){
+ LogEst M, logK, safetyMargin;
+ /* Let:
+ ** N = the total number of rows in the table
+ ** K = the number of entries on the RHS of the IN operator
+ ** M = the number of rows in the table that match terms to the
+ ** to the left in the same index. If the IN operator is on
+ ** the left-most index column, M==N.
+ **
+ ** Given the definitions above, it is better to omit the IN operator
+ ** from the index lookup and instead do a scan of the M elements,
+ ** testing each scanned row against the IN operator separately, if:
+ **
+ ** M*log(K) < K*log(N)
+ **
+ ** Our estimates for M, K, and N might be inaccurate, so we build in
+ ** a safety margin of 2 (LogEst: 10) that favors using the IN operator
+ ** with the index, as using an index has better worst-case behavior.
+ ** If we do not have real sqlite_stat1 data, always prefer to use
+ ** the index.
+ */
+ M = pProbe->aiRowLogEst[saved_nEq];
+ logK = estLog(nIn);
+ safetyMargin = 10; /* TUNING: extra weight for indexed IN */
+ if( M + logK + safetyMargin < nIn + rLogSize ){
+ WHERETRACE(0x40,
+ ("Scan preferred over IN operator on column %d of \"%s\" (%d<%d)\n",
+ saved_nEq, pProbe->zName, M+logK+10, nIn+rLogSize));
+ continue;
+ }else{
+ WHERETRACE(0x40,
+ ("IN operator preferred on column %d of \"%s\" (%d>=%d)\n",
+ saved_nEq, pProbe->zName, M+logK+10, nIn+rLogSize));
+ }
+ }
+ pNew->wsFlags |= WHERE_COLUMN_IN;
}else if( eOp & (WO_EQ|WO_IS) ){
int iCol = pProbe->aiColumn[saved_nEq];
pNew->wsFlags |= WHERE_COLUMN_EQ;
assert( saved_nEq==pNew->u.btree.nEq );
if( iCol==XN_ROWID
- || (iCol>0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1)
+ || (iCol>=0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1)
){
- if( iCol>=0 && pProbe->uniqNotNull==0 ){
- pNew->wsFlags |= WHERE_UNQ_WANTED;
- }else{
+ if( iCol==XN_ROWID || pProbe->uniqNotNull
+ || (pProbe->nKeyCol==1 && pProbe->onError && eOp==WO_EQ)
+ ){
pNew->wsFlags |= WHERE_ONEROW;
+ }else{
+ pNew->wsFlags |= WHERE_UNQ_WANTED;
}
}
}else if( eOp & WO_ISNULL ){
@@ -134340,6 +141832,7 @@ static int whereLoopAddBtreeIndex(
&& pProbe->nSample
&& pNew->u.btree.nEq<=pProbe->nSampleCol
&& ((eOp & WO_IN)==0 || !ExprHasProperty(pTerm->pExpr, EP_xIsSelect))
+ && OptimizationEnabled(db, SQLITE_Stat34)
){
Expr *pExpr = pTerm->pExpr;
if( (eOp & (WO_EQ|WO_ISNULL|WO_IS))!=0 ){
@@ -134428,6 +141921,7 @@ static int whereLoopAddBtreeIndex(
if( saved_nEq==saved_nSkip
&& saved_nEq+1<pProbe->nKeyCol
&& pProbe->noSkipScan==0
+ && OptimizationEnabled(db, SQLITE_SkipScan)
&& pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */
&& (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK
){
@@ -134448,8 +141942,8 @@ static int whereLoopAddBtreeIndex(
pNew->wsFlags = saved_wsFlags;
}
- WHERETRACE(0x800, ("END addBtreeIdx(%s), nEq=%d, rc=%d\n",
- pProbe->zName, saved_nEq, rc));
+ WHERETRACE(0x800, ("END %s.addBtreeIdx(%s), nEq=%d, rc=%d\n",
+ pProbe->pTable->zName, pProbe->zName, saved_nEq, rc));
return rc;
}
@@ -134491,24 +141985,6 @@ static int indexMightHelpWithOrderBy(
return 0;
}
-/*
-** Return a bitmask where 1s indicate that the corresponding column of
-** the table is used by an index. Only the first 63 columns are considered.
-*/
-static Bitmask columnsInIndex(Index *pIdx){
- Bitmask m = 0;
- int j;
- for(j=pIdx->nColumn-1; j>=0; j--){
- int x = pIdx->aiColumn[j];
- if( x>=0 ){
- testcase( x==BMS-1 );
- testcase( x==BMS-2 );
- if( x<BMS-1 ) m |= MASKBIT(x);
- }
- }
- return m;
-}
-
/* Check to see if a partial index with pPartIndexWhere can be used
** in the current query. Return true if it can be and false if not.
*/
@@ -134653,14 +142129,16 @@ static int whereLoopAddBtree(
/* TUNING: One-time cost for computing the automatic index is
** estimated to be X*N*log2(N) where N is the number of rows in
** the table being indexed and where X is 7 (LogEst=28) for normal
- ** tables or 1.375 (LogEst=4) for views and subqueries. The value
+ ** tables or 0.5 (LogEst=-10) for views and subqueries. The value
** of X is smaller for views and subqueries so that the query planner
** will be more aggressive about generating automatic indexes for
** those objects, since there is no opportunity to add schema
** indexes on subqueries and views. */
- pNew->rSetup = rLogSize + rSize + 4;
+ pNew->rSetup = rLogSize + rSize;
if( pTab->pSelect==0 && (pTab->tabFlags & TF_Ephemeral)==0 ){
- pNew->rSetup += 24;
+ pNew->rSetup += 28;
+ }else{
+ pNew->rSetup -= 10;
}
ApplyCostMultiplier(pNew->rSetup, pTab->costMult);
if( pNew->rSetup<0 ) pNew->rSetup = 0;
@@ -134678,14 +142156,17 @@ static int whereLoopAddBtree(
}
#endif /* SQLITE_OMIT_AUTOMATIC_INDEX */
- /* Loop over all indices
- */
- for(; rc==SQLITE_OK && pProbe; pProbe=pProbe->pNext, iSortIdx++){
+ /* Loop over all indices. If there was an INDEXED BY clause, then only
+ ** consider index pProbe. */
+ for(; rc==SQLITE_OK && pProbe;
+ pProbe=(pSrc->pIBIndex ? 0 : pProbe->pNext), iSortIdx++
+ ){
if( pProbe->pPartIdxWhere!=0
&& !whereUsablePartialIndex(pSrc->iCursor, pWC, pProbe->pPartIdxWhere) ){
testcase( pNew->iTab!=pSrc->iCursor ); /* See ticket [98d973b8f5] */
continue; /* Partial index inappropriate for this query */
}
+ if( pProbe->bNoQuery ) continue;
rSize = pProbe->aiRowLogEst[0];
pNew->u.btree.nEq = 0;
pNew->u.btree.nBtm = 0;
@@ -134719,7 +142200,7 @@ static int whereLoopAddBtree(
pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED;
m = 0;
}else{
- m = pSrc->colUsed & ~columnsInIndex(pProbe);
+ m = pSrc->colUsed & pProbe->colNotIdxed;
pNew->wsFlags = (m==0) ? (WHERE_IDX_ONLY|WHERE_INDEXED) : WHERE_INDEXED;
}
@@ -134790,10 +142271,6 @@ static int whereLoopAddBtree(
pBuilder->nRecValid = 0;
pBuilder->pRec = 0;
#endif
-
- /* If there was an INDEXED BY clause, then only that one index is
- ** considered. */
- if( pSrc->pIBIndex ) break;
}
return rc;
}
@@ -134870,7 +142347,17 @@ static int whereLoopAddVirtualOne(
/* Invoke the virtual table xBestIndex() method */
rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo);
- if( rc ) return rc;
+ if( rc ){
+ if( rc==SQLITE_CONSTRAINT ){
+ /* If the xBestIndex method returns SQLITE_CONSTRAINT, that means
+ ** that the particular combination of parameters provided is unusable.
+ ** Make no entries in the loop table.
+ */
+ WHERETRACE(0xffff, (" ^^^^--- non-viable plan rejected!\n"));
+ return SQLITE_OK;
+ }
+ return rc;
+ }
mxTerm = -1;
assert( pNew->nLSlot>=nConstraint );
@@ -134888,9 +142375,9 @@ static int whereLoopAddVirtualOne(
|| pNew->aLTerm[iTerm]!=0
|| pIdxCons->usable==0
){
- rc = SQLITE_ERROR;
sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName);
- return rc;
+ testcase( pIdxInfo->needToFreeIdxStr );
+ return SQLITE_ERROR;
}
testcase( iTerm==nConstraint-1 );
testcase( j==0 );
@@ -134918,6 +142405,15 @@ static int whereLoopAddVirtualOne(
pNew->u.vtab.omitMask &= ~mNoOmit;
pNew->nLTerm = mxTerm+1;
+ for(i=0; i<=mxTerm; i++){
+ if( pNew->aLTerm[i]==0 ){
+ /* The non-zero argvIdx values must be contiguous. Raise an
+ ** error if they are not */
+ sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName);
+ testcase( pIdxInfo->needToFreeIdxStr );
+ return SQLITE_ERROR;
+ }
+ }
assert( pNew->nLTerm<=pNew->nLSlot );
pNew->u.vtab.idxNum = pIdxInfo->idxNum;
pNew->u.vtab.needFree = pIdxInfo->needToFreeIdxStr;
@@ -134948,6 +142444,27 @@ static int whereLoopAddVirtualOne(
return rc;
}
+/*
+** If this function is invoked from within an xBestIndex() callback, it
+** returns a pointer to a buffer containing the name of the collation
+** sequence associated with element iCons of the sqlite3_index_info.aConstraint
+** array. Or, if iCons is out of range or there is no active xBestIndex
+** call, return NULL.
+*/
+SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int iCons){
+ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
+ const char *zRet = 0;
+ if( iCons>=0 && iCons<pIdxInfo->nConstraint ){
+ CollSeq *pC = 0;
+ int iTerm = pIdxInfo->aConstraint[iCons].iTermOffset;
+ Expr *pX = pHidden->pWC->a[iTerm].pExpr;
+ if( pX->pLeft ){
+ pC = sqlite3BinaryCompareCollSeq(pHidden->pParse, pX->pLeft, pX->pRight);
+ }
+ zRet = (pC ? pC->zName : sqlite3StrBINARY);
+ }
+ return zRet;
+}
/*
** Add all WhereLoop objects for a table of the join identified by
@@ -135012,6 +142529,7 @@ static int whereLoopAddVirtual(
}
/* First call xBestIndex() with all constraints usable. */
+ WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName));
WHERETRACE(0x40, (" VirtualOne: all usable\n"));
rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn);
@@ -135087,6 +142605,7 @@ static int whereLoopAddVirtual(
if( p->needToFreeIdxStr ) sqlite3_free(p->idxStr);
sqlite3DbFreeNN(pParse->db, p);
+ WHERETRACE(0x800, ("END %s.addVirtual(), rc=%d\n", pSrc->pTab->zName, rc));
return rc;
}
#endif /* SQLITE_OMIT_VIRTUALTABLE */
@@ -135234,9 +142753,11 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){
/* Loop over the tables in the join, from left to right */
pNew = pBuilder->pNew;
whereLoopInit(pNew);
+ pBuilder->iPlanLimit = SQLITE_QUERY_PLANNER_LIMIT;
for(iTab=0, pItem=pTabList->a; pItem<pEnd; iTab++, pItem++){
Bitmask mUnusable = 0;
pNew->iTab = iTab;
+ pBuilder->iPlanLimit += SQLITE_QUERY_PLANNER_LIMIT_INCR;
pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor);
if( ((pItem->fg.jointype|priorJointype) & (JT_LEFT|JT_CROSS))!=0 ){
/* This condition is true when pItem is the FROM clause term on the
@@ -135258,11 +142779,19 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){
{
rc = whereLoopAddBtree(pBuilder, mPrereq);
}
- if( rc==SQLITE_OK ){
+ if( rc==SQLITE_OK && pBuilder->pWC->hasOr ){
rc = whereLoopAddOr(pBuilder, mPrereq, mUnusable);
}
mPrior |= pNew->maskSelf;
- if( rc || db->mallocFailed ) break;
+ if( rc || db->mallocFailed ){
+ if( rc==SQLITE_DONE ){
+ /* We hit the query planner search limit set by iPlanLimit */
+ sqlite3_log(SQLITE_WARNING, "abbreviated query algorithm search");
+ rc = SQLITE_OK;
+ }else{
+ break;
+ }
+ }
}
whereLoopClear(db, pNew);
@@ -135765,12 +143294,15 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
if( (pWLoop->prereq & ~pFrom->maskLoop)!=0 ) continue;
if( (pWLoop->maskSelf & pFrom->maskLoop)!=0 ) continue;
- if( (pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 && pFrom->nRow<10 ){
+ if( (pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 && pFrom->nRow<3 ){
/* Do not use an automatic index if the this loop is expected
- ** to run less than 2 times. */
+ ** to run less than 1.25 times. It is tempting to also exclude
+ ** automatic index usage on an outer loop, but sometimes an automatic
+ ** index is useful in the outer loop of a correlated subquery. */
assert( 10==sqlite3LogEst(2) );
continue;
}
+
/* At this point, pWLoop is a candidate to be the next loop.
** Compute its cost */
rUnsorted = sqlite3LogEstAdd(pWLoop->rSetup,pWLoop->rRun + pFrom->nRow);
@@ -135790,7 +143322,11 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
pWInfo, nRowEst, nOrderBy, isOrdered
);
}
- rCost = sqlite3LogEstAdd(rUnsorted, aSortCost[isOrdered]);
+ /* TUNING: Add a small extra penalty (5) to sorting as an
+ ** extra encouragment to the query planner to select a plan
+ ** where the rows emerge in the correct order without any sorting
+ ** required. */
+ rCost = sqlite3LogEstAdd(rUnsorted, aSortCost[isOrdered]) + 5;
WHERETRACE(0x002,
("---- sort cost=%-3d (%d/%d) increases cost %3d to %-3d\n",
@@ -135980,6 +143516,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
pWInfo->eDistinct = WHERE_DISTINCT_ORDERED;
}
}
+ pWInfo->bOrderedInnerLoop = 0;
if( pWInfo->pOrderBy ){
if( pWInfo->wctrlFlags & WHERE_DISTINCTBY ){
if( pFrom->isOrdered==pWInfo->pOrderBy->nExpr ){
@@ -136091,7 +143628,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){
}
if( j!=pIdx->nKeyCol ) continue;
pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_ONEROW|WHERE_INDEXED;
- if( pIdx->isCovering || (pItem->colUsed & ~columnsInIndex(pIdx))==0 ){
+ if( pIdx->isCovering || (pItem->colUsed & pIdx->colNotIdxed)==0 ){
pLoop->wsFlags |= WHERE_IDX_ONLY;
}
pLoop->nLTerm = j;
@@ -136352,6 +143889,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
if( wctrlFlags & WHERE_WANT_DISTINCT ){
pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE;
}
+ ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW"));
}else{
/* Assign a bit from the bitmask to every term in the FROM clause.
**
@@ -136401,6 +143939,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
*/
for(ii=0; ii<sWLB.pWC->nTerm; ii++){
WhereTerm *pT = &sWLB.pWC->a[ii];
+ if( pT->wtFlags & TERM_VIRTUAL ) continue;
if( pT->prereqAll==0 && (nTabList==0 || exprIsDeterministic(pT->pExpr)) ){
sqlite3ExprIfFalse(pParse, pT->pExpr, pWInfo->iBreak, SQLITE_JUMPIFNULL);
pT->wtFlags |= TERM_CODED;
@@ -136488,35 +144027,80 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
}
}
#endif
- /* Attempt to omit tables from the join that do not effect the result */
+
+ /* Attempt to omit tables from the join that do not affect the result.
+ ** For a table to not affect the result, the following must be true:
+ **
+ ** 1) The query must not be an aggregate.
+ ** 2) The table must be the RHS of a LEFT JOIN.
+ ** 3) Either the query must be DISTINCT, or else the ON or USING clause
+ ** must contain a constraint that limits the scan of the table to
+ ** at most a single row.
+ ** 4) The table must not be referenced by any part of the query apart
+ ** from its own USING or ON clause.
+ **
+ ** For example, given:
+ **
+ ** CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1);
+ ** CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2);
+ ** CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3);
+ **
+ ** then table t2 can be omitted from the following:
+ **
+ ** SELECT v1, v3 FROM t1
+ ** LEFT JOIN t2 USING (t1.ipk=t2.ipk)
+ ** LEFT JOIN t3 USING (t1.ipk=t3.ipk)
+ **
+ ** or from:
+ **
+ ** SELECT DISTINCT v1, v3 FROM t1
+ ** LEFT JOIN t2
+ ** LEFT JOIN t3 USING (t1.ipk=t3.ipk)
+ */
+ notReady = ~(Bitmask)0;
if( pWInfo->nLevel>=2
- && pResultSet!=0
+ && pResultSet!=0 /* guarantees condition (1) above */
&& OptimizationEnabled(db, SQLITE_OmitNoopJoin)
){
+ int i;
Bitmask tabUsed = sqlite3WhereExprListUsage(pMaskSet, pResultSet);
if( sWLB.pOrderBy ){
tabUsed |= sqlite3WhereExprListUsage(pMaskSet, sWLB.pOrderBy);
}
- while( pWInfo->nLevel>=2 ){
+ for(i=pWInfo->nLevel-1; i>=1; i--){
WhereTerm *pTerm, *pEnd;
- pLoop = pWInfo->a[pWInfo->nLevel-1].pWLoop;
- if( (pWInfo->pTabList->a[pLoop->iTab].fg.jointype & JT_LEFT)==0 ) break;
+ struct SrcList_item *pItem;
+ pLoop = pWInfo->a[i].pWLoop;
+ pItem = &pWInfo->pTabList->a[pLoop->iTab];
+ if( (pItem->fg.jointype & JT_LEFT)==0 ) continue;
if( (wctrlFlags & WHERE_WANT_DISTINCT)==0
&& (pLoop->wsFlags & WHERE_ONEROW)==0
){
- break;
+ continue;
}
- if( (tabUsed & pLoop->maskSelf)!=0 ) break;
+ if( (tabUsed & pLoop->maskSelf)!=0 ) continue;
pEnd = sWLB.pWC->a + sWLB.pWC->nTerm;
for(pTerm=sWLB.pWC->a; pTerm<pEnd; pTerm++){
- if( (pTerm->prereqAll & pLoop->maskSelf)!=0
- && !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
- ){
- break;
+ if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){
+ if( !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
+ || pTerm->pExpr->iRightJoinTable!=pItem->iCursor
+ ){
+ break;
+ }
}
}
- if( pTerm<pEnd ) break;
+ if( pTerm<pEnd ) continue;
WHERETRACE(0xffff, ("-> drop loop %c not used\n", pLoop->cId));
+ notReady &= ~pLoop->maskSelf;
+ for(pTerm=sWLB.pWC->a; pTerm<pEnd; pTerm++){
+ if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){
+ pTerm->wtFlags |= TERM_CODED;
+ }
+ }
+ if( i!=pWInfo->nLevel-1 ){
+ int nByte = (pWInfo->nLevel-1-i) * sizeof(WhereLevel);
+ memmove(&pWInfo->a[i], &pWInfo->a[i+1], nByte);
+ }
pWInfo->nLevel--;
nTabList--;
}
@@ -136526,15 +144110,32 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
/* If the caller is an UPDATE or DELETE statement that is requesting
** to use a one-pass algorithm, determine if this is appropriate.
+ **
+ ** A one-pass approach can be used if the caller has requested one
+ ** and either (a) the scan visits at most one row or (b) each
+ ** of the following are true:
+ **
+ ** * the caller has indicated that a one-pass approach can be used
+ ** with multiple rows (by setting WHERE_ONEPASS_MULTIROW), and
+ ** * the table is not a virtual table, and
+ ** * either the scan does not use the OR optimization or the caller
+ ** is a DELETE operation (WHERE_DUPLICATES_OK is only specified
+ ** for DELETE).
+ **
+ ** The last qualification is because an UPDATE statement uses
+ ** WhereInfo.aiCurOnePass[1] to determine whether or not it really can
+ ** use a one-pass approach, and this is not set accurately for scans
+ ** that use the OR optimization.
*/
assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 );
if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){
int wsFlags = pWInfo->a[0].pWLoop->wsFlags;
int bOnerow = (wsFlags & WHERE_ONEROW)!=0;
- if( bOnerow
- || ((wctrlFlags & WHERE_ONEPASS_MULTIROW)!=0
- && 0==(wsFlags & WHERE_VIRTUALTABLE))
- ){
+ if( bOnerow || (
+ 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW)
+ && 0==(wsFlags & WHERE_VIRTUALTABLE)
+ && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK))
+ )){
pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI;
if( HasRowid(pTabList->a[0].pTab) && (wsFlags & WHERE_IDX_ONLY) ){
if( wctrlFlags & WHERE_ONEPASS_MULTIROW ){
@@ -136671,7 +144272,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
** loop below generates code for a single nested loop of the VM
** program.
*/
- notReady = ~(Bitmask)0;
for(ii=0; ii<nTabList; ii++){
int addrExplain;
int wsFlags;
@@ -136685,7 +144285,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
}
#endif
addrExplain = sqlite3WhereExplainOneScan(
- pParse, pTabList, pLevel, ii, pLevel->iFrom, wctrlFlags
+ pParse, pTabList, pLevel, wctrlFlags
);
pLevel->addrBody = sqlite3VdbeCurrentAddr(v);
notReady = sqlite3WhereCodeOneLoopStart(pWInfo, ii, notReady);
@@ -136709,6 +144309,26 @@ whereBeginError:
}
/*
+** Part of sqlite3WhereEnd() will rewrite opcodes to reference the
+** index rather than the main table. In SQLITE_DEBUG mode, we want
+** to trace those changes if PRAGMA vdbe_addoptrace=on. This routine
+** does that.
+*/
+#ifndef SQLITE_DEBUG
+# define OpcodeRewriteTrace(D,K,P) /* no-op */
+#else
+# define OpcodeRewriteTrace(D,K,P) sqlite3WhereOpcodeRewriteTrace(D,K,P)
+ static void sqlite3WhereOpcodeRewriteTrace(
+ sqlite3 *db,
+ int pc,
+ VdbeOp *pOp
+ ){
+ if( (db->flags & SQLITE_VdbeAddopTrace)==0 ) return;
+ sqlite3VdbePrintOp(0, pc, pOp);
+ }
+#endif
+
+/*
** Generate the end of the WHERE loop. See comments on
** sqlite3WhereBegin() for additional information.
*/
@@ -136724,7 +144344,6 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
/* Generate loop termination code.
*/
VdbeModuleComment((v, "End WHERE-core"));
- sqlite3ExprCacheClear(pParse);
for(i=pWInfo->nLevel-1; i>=0; i--){
int addr;
pLevel = &pWInfo->a[i];
@@ -136735,6 +144354,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
Index *pIdx;
int n;
if( pWInfo->eDistinct==WHERE_DISTINCT_ORDERED
+ && i==pWInfo->nLevel-1 /* Ticket [ef9318757b152e3] 2017-10-21 */
&& (pLoop->wsFlags & WHERE_INDEXED)!=0
&& (pIdx = pLoop->u.btree.pIndex)->hasStat1
&& (n = pLoop->u.btree.nIdxCol)>0
@@ -136774,10 +144394,17 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){
sqlite3VdbeJumpHere(v, pIn->addrInTop+1);
if( pIn->eEndLoopOp!=OP_Noop ){
+ if( pIn->nPrefix ){
+ assert( pLoop->wsFlags & WHERE_IN_EARLYOUT );
+ sqlite3VdbeAddOp4Int(v, OP_IfNoHope, pLevel->iIdxCur,
+ sqlite3VdbeCurrentAddr(v)+2,
+ pIn->iBase, pIn->nPrefix);
+ VdbeCoverage(v);
+ }
sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop);
VdbeCoverage(v);
- VdbeCoverageIf(v, pIn->eEndLoopOp==OP_PrevIfOpen);
- VdbeCoverageIf(v, pIn->eEndLoopOp==OP_NextIfOpen);
+ VdbeCoverageIf(v, pIn->eEndLoopOp==OP_Prev);
+ VdbeCoverageIf(v, pIn->eEndLoopOp==OP_Next);
}
sqlite3VdbeJumpHere(v, pIn->addrInTop-1);
}
@@ -136801,7 +144428,8 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); VdbeCoverage(v);
assert( (ws & WHERE_IDX_ONLY)==0 || (ws & WHERE_INDEXED)!=0 );
if( (ws & WHERE_IDX_ONLY)==0 ){
- sqlite3VdbeAddOp1(v, OP_NullRow, pTabList->a[i].iCursor);
+ assert( pLevel->iTabCur==pTabList->a[pLevel->iFrom].iCursor );
+ sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iTabCur);
}
if( (ws & WHERE_INDEXED)
|| ((ws & WHERE_MULTI_OR) && pLevel->u.pCovidx)
@@ -136867,10 +144495,19 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
){
last = sqlite3VdbeCurrentAddr(v);
k = pLevel->addrBody;
+#ifdef SQLITE_DEBUG
+ if( db->flags & SQLITE_VdbeAddopTrace ){
+ printf("TRANSLATE opcodes in range %d..%d\n", k, last-1);
+ }
+#endif
pOp = sqlite3VdbeGetOp(v, k);
for(; k<last; k++, pOp++){
if( pOp->p1!=pLevel->iTabCur ) continue;
- if( pOp->opcode==OP_Column ){
+ if( pOp->opcode==OP_Column
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ || pOp->opcode==OP_Offset
+#endif
+ ){
int x = pOp->p2;
assert( pIdx->pTable==pTab );
if( !HasRowid(pTab) ){
@@ -136882,16 +144519,22 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
if( x>=0 ){
pOp->p2 = x;
pOp->p1 = pLevel->iIdxCur;
+ OpcodeRewriteTrace(db, k, pOp);
}
assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0
|| pWInfo->eOnePass );
}else if( pOp->opcode==OP_Rowid ){
pOp->p1 = pLevel->iIdxCur;
pOp->opcode = OP_IdxRowid;
+ OpcodeRewriteTrace(db, k, pOp);
}else if( pOp->opcode==OP_IfNullRow ){
pOp->p1 = pLevel->iIdxCur;
+ OpcodeRewriteTrace(db, k, pOp);
}
}
+#ifdef SQLITE_DEBUG
+ if( db->flags & SQLITE_VdbeAddopTrace ) printf("TRANSLATE complete\n");
+#endif
}
}
@@ -136903,6 +144546,2263 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
}
/************** End of where.c ***********************************************/
+/************** Begin file window.c ******************************************/
+/*
+** 2018 May 08
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+*/
+/* #include "sqliteInt.h" */
+
+#ifndef SQLITE_OMIT_WINDOWFUNC
+
+/*
+** SELECT REWRITING
+**
+** Any SELECT statement that contains one or more window functions in
+** either the select list or ORDER BY clause (the only two places window
+** functions may be used) is transformed by function sqlite3WindowRewrite()
+** in order to support window function processing. For example, with the
+** schema:
+**
+** CREATE TABLE t1(a, b, c, d, e, f, g);
+**
+** the statement:
+**
+** SELECT a+1, max(b) OVER (PARTITION BY c ORDER BY d) FROM t1 ORDER BY e;
+**
+** is transformed to:
+**
+** SELECT a+1, max(b) OVER (PARTITION BY c ORDER BY d) FROM (
+** SELECT a, e, c, d, b FROM t1 ORDER BY c, d
+** ) ORDER BY e;
+**
+** The flattening optimization is disabled when processing this transformed
+** SELECT statement. This allows the implementation of the window function
+** (in this case max()) to process rows sorted in order of (c, d), which
+** makes things easier for obvious reasons. More generally:
+**
+** * FROM, WHERE, GROUP BY and HAVING clauses are all moved to
+** the sub-query.
+**
+** * ORDER BY, LIMIT and OFFSET remain part of the parent query.
+**
+** * Terminals from each of the expression trees that make up the
+** select-list and ORDER BY expressions in the parent query are
+** selected by the sub-query. For the purposes of the transformation,
+** terminals are column references and aggregate functions.
+**
+** If there is more than one window function in the SELECT that uses
+** the same window declaration (the OVER bit), then a single scan may
+** be used to process more than one window function. For example:
+**
+** SELECT max(b) OVER (PARTITION BY c ORDER BY d),
+** min(e) OVER (PARTITION BY c ORDER BY d)
+** FROM t1;
+**
+** is transformed in the same way as the example above. However:
+**
+** SELECT max(b) OVER (PARTITION BY c ORDER BY d),
+** min(e) OVER (PARTITION BY a ORDER BY b)
+** FROM t1;
+**
+** Must be transformed to:
+**
+** SELECT max(b) OVER (PARTITION BY c ORDER BY d) FROM (
+** SELECT e, min(e) OVER (PARTITION BY a ORDER BY b), c, d, b FROM
+** SELECT a, e, c, d, b FROM t1 ORDER BY a, b
+** ) ORDER BY c, d
+** ) ORDER BY e;
+**
+** so that both min() and max() may process rows in the order defined by
+** their respective window declarations.
+**
+** INTERFACE WITH SELECT.C
+**
+** When processing the rewritten SELECT statement, code in select.c calls
+** sqlite3WhereBegin() to begin iterating through the results of the
+** sub-query, which is always implemented as a co-routine. It then calls
+** sqlite3WindowCodeStep() to process rows and finish the scan by calling
+** sqlite3WhereEnd().
+**
+** sqlite3WindowCodeStep() generates VM code so that, for each row returned
+** by the sub-query a sub-routine (OP_Gosub) coded by select.c is invoked.
+** When the sub-routine is invoked:
+**
+** * The results of all window-functions for the row are stored
+** in the associated Window.regResult registers.
+**
+** * The required terminal values are stored in the current row of
+** temp table Window.iEphCsr.
+**
+** In some cases, depending on the window frame and the specific window
+** functions invoked, sqlite3WindowCodeStep() caches each entire partition
+** in a temp table before returning any rows. In other cases it does not.
+** This detail is encapsulated within this file, the code generated by
+** select.c is the same in either case.
+**
+** BUILT-IN WINDOW FUNCTIONS
+**
+** This implementation features the following built-in window functions:
+**
+** row_number()
+** rank()
+** dense_rank()
+** percent_rank()
+** cume_dist()
+** ntile(N)
+** lead(expr [, offset [, default]])
+** lag(expr [, offset [, default]])
+** first_value(expr)
+** last_value(expr)
+** nth_value(expr, N)
+**
+** These are the same built-in window functions supported by Postgres.
+** Although the behaviour of aggregate window functions (functions that
+** can be used as either aggregates or window funtions) allows them to
+** be implemented using an API, built-in window functions are much more
+** esoteric. Additionally, some window functions (e.g. nth_value())
+** may only be implemented by caching the entire partition in memory.
+** As such, some built-in window functions use the same API as aggregate
+** window functions and some are implemented directly using VDBE
+** instructions. Additionally, for those functions that use the API, the
+** window frame is sometimes modified before the SELECT statement is
+** rewritten. For example, regardless of the specified window frame, the
+** row_number() function always uses:
+**
+** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+**
+** See sqlite3WindowUpdate() for details.
+**
+** As well as some of the built-in window functions, aggregate window
+** functions min() and max() are implemented using VDBE instructions if
+** the start of the window frame is declared as anything other than
+** UNBOUNDED PRECEDING.
+*/
+
+/*
+** Implementation of built-in window function row_number(). Assumes that the
+** window frame has been coerced to:
+**
+** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+*/
+static void row_numberStepFunc(
+ sqlite3_context *pCtx,
+ int nArg,
+ sqlite3_value **apArg
+){
+ i64 *p = (i64*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( p ) (*p)++;
+ UNUSED_PARAMETER(nArg);
+ UNUSED_PARAMETER(apArg);
+}
+static void row_numberValueFunc(sqlite3_context *pCtx){
+ i64 *p = (i64*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ sqlite3_result_int64(pCtx, (p ? *p : 0));
+}
+
+/*
+** Context object type used by rank(), dense_rank(), percent_rank() and
+** cume_dist().
+*/
+struct CallCount {
+ i64 nValue;
+ i64 nStep;
+ i64 nTotal;
+};
+
+/*
+** Implementation of built-in window function dense_rank(). Assumes that
+** the window frame has been set to:
+**
+** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+*/
+static void dense_rankStepFunc(
+ sqlite3_context *pCtx,
+ int nArg,
+ sqlite3_value **apArg
+){
+ struct CallCount *p;
+ p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( p ) p->nStep = 1;
+ UNUSED_PARAMETER(nArg);
+ UNUSED_PARAMETER(apArg);
+}
+static void dense_rankValueFunc(sqlite3_context *pCtx){
+ struct CallCount *p;
+ p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( p ){
+ if( p->nStep ){
+ p->nValue++;
+ p->nStep = 0;
+ }
+ sqlite3_result_int64(pCtx, p->nValue);
+ }
+}
+
+/*
+** Implementation of built-in window function rank(). Assumes that
+** the window frame has been set to:
+**
+** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+*/
+static void rankStepFunc(
+ sqlite3_context *pCtx,
+ int nArg,
+ sqlite3_value **apArg
+){
+ struct CallCount *p;
+ p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( p ){
+ p->nStep++;
+ if( p->nValue==0 ){
+ p->nValue = p->nStep;
+ }
+ }
+ UNUSED_PARAMETER(nArg);
+ UNUSED_PARAMETER(apArg);
+}
+static void rankValueFunc(sqlite3_context *pCtx){
+ struct CallCount *p;
+ p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( p ){
+ sqlite3_result_int64(pCtx, p->nValue);
+ p->nValue = 0;
+ }
+}
+
+/*
+** Implementation of built-in window function percent_rank(). Assumes that
+** the window frame has been set to:
+**
+** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+*/
+static void percent_rankStepFunc(
+ sqlite3_context *pCtx,
+ int nArg,
+ sqlite3_value **apArg
+){
+ struct CallCount *p;
+ UNUSED_PARAMETER(nArg); assert( nArg==1 );
+
+ 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;
+ }
+ }
+}
+static void percent_rankValueFunc(sqlite3_context *pCtx){
+ struct CallCount *p;
+ p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( p ){
+ if( p->nTotal>1 ){
+ double r = (double)(p->nValue-1) / (double)(p->nTotal-1);
+ sqlite3_result_double(pCtx, r);
+ }else{
+ sqlite3_result_double(pCtx, 0.0);
+ }
+ p->nValue = 0;
+ }
+}
+
+/*
+** Implementation of built-in window function cume_dist(). Assumes that
+** the window frame has been set to:
+**
+** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+*/
+static void cume_distStepFunc(
+ sqlite3_context *pCtx,
+ int nArg,
+ sqlite3_value **apArg
+){
+ struct CallCount *p;
+ assert( nArg==1 ); UNUSED_PARAMETER(nArg);
+
+ p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( p ){
+ if( p->nTotal==0 ){
+ p->nTotal = sqlite3_value_int64(apArg[0]);
+ }
+ 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 ){
+ double r = (double)(p->nStep) / (double)(p->nTotal);
+ sqlite3_result_double(pCtx, r);
+ }
+}
+
+/*
+** Context object for ntile() window function.
+*/
+struct NtileCtx {
+ i64 nTotal; /* Total rows in partition */
+ i64 nParam; /* Parameter passed to ntile(N) */
+ i64 iRow; /* Current row */
+};
+
+/*
+** Implementation of ntile(). This assumes that the window frame has
+** been coerced to:
+**
+** ROWS UNBOUNDED PRECEDING AND CURRENT ROW
+*/
+static void ntileStepFunc(
+ sqlite3_context *pCtx,
+ int nArg,
+ sqlite3_value **apArg
+){
+ struct NtileCtx *p;
+ assert( nArg==2 ); 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++;
+ }
+}
+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);
+ }else{
+ i64 nLarge = p->nTotal - p->nParam*nSize;
+ i64 iSmall = nLarge*(nSize+1);
+ i64 iRow = p->iRow-1;
+
+ assert( (nLarge*(nSize+1) + (p->nParam-nLarge)*nSize)==p->nTotal );
+
+ if( iRow<iSmall ){
+ sqlite3_result_int64(pCtx, 1 + iRow/(nSize+1));
+ }else{
+ sqlite3_result_int64(pCtx, 1 + nLarge + (iRow-iSmall)/nSize);
+ }
+ }
+ }
+}
+
+/*
+** Context object for last_value() window function.
+*/
+struct LastValueCtx {
+ sqlite3_value *pVal;
+ int nVal;
+};
+
+/*
+** Implementation of last_value().
+*/
+static void last_valueStepFunc(
+ sqlite3_context *pCtx,
+ int nArg,
+ sqlite3_value **apArg
+){
+ struct LastValueCtx *p;
+ UNUSED_PARAMETER(nArg);
+ p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( p ){
+ sqlite3_value_free(p->pVal);
+ p->pVal = sqlite3_value_dup(apArg[0]);
+ if( p->pVal==0 ){
+ sqlite3_result_error_nomem(pCtx);
+ }else{
+ p->nVal++;
+ }
+ }
+}
+static void last_valueInvFunc(
+ sqlite3_context *pCtx,
+ int nArg,
+ sqlite3_value **apArg
+){
+ struct LastValueCtx *p;
+ UNUSED_PARAMETER(nArg);
+ UNUSED_PARAMETER(apArg);
+ p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( ALWAYS(p) ){
+ p->nVal--;
+ if( p->nVal==0 ){
+ sqlite3_value_free(p->pVal);
+ p->pVal = 0;
+ }
+ }
+}
+static void last_valueValueFunc(sqlite3_context *pCtx){
+ struct LastValueCtx *p;
+ p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( p && p->pVal ){
+ sqlite3_result_value(pCtx, p->pVal);
+ }
+}
+static void last_valueFinalizeFunc(sqlite3_context *pCtx){
+ struct LastValueCtx *p;
+ p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p));
+ if( p && p->pVal ){
+ sqlite3_result_value(pCtx, p->pVal);
+ sqlite3_value_free(p->pVal);
+ p->pVal = 0;
+ }
+}
+
+/*
+** Static names for the built-in window function names. These static
+** names are used, rather than string literals, so that FuncDef objects
+** can be associated with a particular window function by direct
+** comparison of the zName pointer. Example:
+**
+** if( pFuncDef->zName==row_valueName ){ ... }
+*/
+static const char row_numberName[] = "row_number";
+static const char dense_rankName[] = "dense_rank";
+static const char rankName[] = "rank";
+static const char percent_rankName[] = "percent_rank";
+static const char cume_distName[] = "cume_dist";
+static const char ntileName[] = "ntile";
+static const char last_valueName[] = "last_value";
+static const char nth_valueName[] = "nth_value";
+static const char first_valueName[] = "first_value";
+static const char leadName[] = "lead";
+static const char lagName[] = "lag";
+
+/*
+** No-op implementations of xStep() and xFinalize(). Used as place-holders
+** for built-in window functions that never call those interfaces.
+**
+** The noopValueFunc() is called but is expected to do nothing. The
+** noopStepFunc() is never called, and so it is marked with NO_TEST to
+** let the test coverage routine know not to expect this function to be
+** invoked.
+*/
+static void noopStepFunc( /*NO_TEST*/
+ sqlite3_context *p, /*NO_TEST*/
+ int n, /*NO_TEST*/
+ sqlite3_value **a /*NO_TEST*/
+){ /*NO_TEST*/
+ UNUSED_PARAMETER(p); /*NO_TEST*/
+ UNUSED_PARAMETER(n); /*NO_TEST*/
+ UNUSED_PARAMETER(a); /*NO_TEST*/
+ assert(0); /*NO_TEST*/
+} /*NO_TEST*/
+static void noopValueFunc(sqlite3_context *p){ UNUSED_PARAMETER(p); /*no-op*/ }
+
+/* Window functions that use all window interfaces: xStep, xFinal,
+** xValue, and xInverse */
+#define WINDOWFUNCALL(name,nArg,extra) { \
+ nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \
+ name ## StepFunc, name ## FinalizeFunc, name ## ValueFunc, \
+ name ## InvFunc, name ## Name, {0} \
+}
+
+/* Window functions that are implemented using bytecode and thus have
+** no-op routines for their methods */
+#define WINDOWFUNCNOOP(name,nArg,extra) { \
+ nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \
+ noopStepFunc, noopValueFunc, noopValueFunc, \
+ noopStepFunc, name ## Name, {0} \
+}
+
+/* Window functions that use all window interfaces: xStep, the
+** same routine for xFinalize and xValue and which never call
+** xInverse. */
+#define WINDOWFUNCX(name,nArg,extra) { \
+ nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \
+ name ## StepFunc, name ## ValueFunc, name ## ValueFunc, \
+ noopStepFunc, name ## Name, {0} \
+}
+
+
+/*
+** Register those built-in window functions that are not also aggregates.
+*/
+SQLITE_PRIVATE void sqlite3WindowFunctions(void){
+ static FuncDef aWindowFuncs[] = {
+ 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(last_value, 1, 0),
+ WINDOWFUNCNOOP(nth_value, 2, 0),
+ WINDOWFUNCNOOP(first_value, 1, 0),
+ WINDOWFUNCNOOP(lead, 1, 0),
+ WINDOWFUNCNOOP(lead, 2, 0),
+ WINDOWFUNCNOOP(lead, 3, 0),
+ WINDOWFUNCNOOP(lag, 1, 0),
+ WINDOWFUNCNOOP(lag, 2, 0),
+ WINDOWFUNCNOOP(lag, 3, 0),
+ };
+ sqlite3InsertBuiltinFuncs(aWindowFuncs, ArraySize(aWindowFuncs));
+}
+
+/*
+** This function is called immediately after resolving the function name
+** for a window function within a SELECT statement. Argument pList is a
+** linked list of WINDOW definitions for the current SELECT statement.
+** Argument pFunc is the function definition just resolved and pWin
+** is the Window object representing the associated OVER clause. This
+** function updates the contents of pWin as follows:
+**
+** * If the OVER clause refered to a named window (as in "max(x) OVER win"),
+** search list pList for a matching WINDOW definition, and update pWin
+** accordingly. If no such WINDOW clause can be found, leave an error
+** in pParse.
+**
+** * If the function is a built-in window function that requires the
+** window to be coerced (see "BUILT-IN WINDOW FUNCTIONS" at the top
+** of this file), pWin is updated here.
+*/
+SQLITE_PRIVATE void sqlite3WindowUpdate(
+ Parse *pParse,
+ Window *pList, /* List of named windows for this SELECT */
+ 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;
+ }
+ 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;
+ }
+ 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;
+ }
+ }
+ pWin->pFunc = pFunc;
+}
+
+/*
+** Context object passed through sqlite3WalkExprList() to
+** selectWindowRewriteExprCb() by selectWindowRewriteEList().
+*/
+typedef struct WindowRewrite WindowRewrite;
+struct WindowRewrite {
+ Window *pWin;
+ SrcList *pSrc;
+ ExprList *pSub;
+ Select *pSubSelect; /* Current sub-select, if any */
+};
+
+/*
+** Callback function used by selectWindowRewriteEList(). If necessary,
+** this function appends to the output expression-list and updates
+** expression (*ppExpr) in place.
+*/
+static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){
+ struct WindowRewrite *p = pWalker->u.pRewrite;
+ Parse *pParse = pWalker->pParse;
+
+ /* If this function is being called from within a scalar sub-select
+ ** that used by the SELECT statement being processed, only process
+ ** TK_COLUMN expressions that refer to it (the outer SELECT). Do
+ ** not process aggregates or window functions at all, as they belong
+ ** to the scalar sub-select. */
+ if( p->pSubSelect ){
+ if( pExpr->op!=TK_COLUMN ){
+ return WRC_Continue;
+ }else{
+ int nSrc = p->pSrc->nSrc;
+ int i;
+ for(i=0; i<nSrc; i++){
+ if( pExpr->iTable==p->pSrc->a[i].iCursor ) break;
+ }
+ if( i==nSrc ) return WRC_Continue;
+ }
+ }
+
+ switch( pExpr->op ){
+
+ case TK_FUNCTION:
+ if( !ExprHasProperty(pExpr, EP_WinFunc) ){
+ break;
+ }else{
+ Window *pWin;
+ for(pWin=p->pWin; pWin; pWin=pWin->pNextWin){
+ if( pExpr->y.pWin==pWin ){
+ assert( pWin->pOwner==pExpr );
+ return WRC_Prune;
+ }
+ }
+ }
+ /* Fall through. */
+
+ case TK_AGG_FUNCTION:
+ case TK_COLUMN: {
+ Expr *pDup = sqlite3ExprDup(pParse->db, pExpr, 0);
+ p->pSub = sqlite3ExprListAppend(pParse, p->pSub, pDup);
+ if( p->pSub ){
+ assert( ExprHasProperty(pExpr, EP_Static)==0 );
+ ExprSetProperty(pExpr, EP_Static);
+ sqlite3ExprDelete(pParse->db, pExpr);
+ ExprClearProperty(pExpr, EP_Static);
+ memset(pExpr, 0, sizeof(Expr));
+
+ pExpr->op = TK_COLUMN;
+ pExpr->iColumn = p->pSub->nExpr-1;
+ pExpr->iTable = p->pWin->iEphCsr;
+ }
+
+ break;
+ }
+
+ default: /* no-op */
+ break;
+ }
+
+ return WRC_Continue;
+}
+static int selectWindowRewriteSelectCb(Walker *pWalker, Select *pSelect){
+ struct WindowRewrite *p = pWalker->u.pRewrite;
+ Select *pSave = p->pSubSelect;
+ if( pSave==pSelect ){
+ return WRC_Continue;
+ }else{
+ p->pSubSelect = pSelect;
+ sqlite3WalkSelect(pWalker, pSelect);
+ p->pSubSelect = pSave;
+ }
+ return WRC_Prune;
+}
+
+
+/*
+** Iterate through each expression in expression-list pEList. For each:
+**
+** * TK_COLUMN,
+** * aggregate function, or
+** * window function with a Window object that is not a member of the
+** Window list passed as the second argument (pWin).
+**
+** Append the node to output expression-list (*ppSub). And replace it
+** with a TK_COLUMN that reads the (N-1)th element of table
+** pWin->iEphCsr, where N is the number of elements in (*ppSub) after
+** appending the new one.
+*/
+static void selectWindowRewriteEList(
+ Parse *pParse,
+ Window *pWin,
+ SrcList *pSrc,
+ ExprList *pEList, /* Rewrite expressions in this list */
+ ExprList **ppSub /* IN/OUT: Sub-select expression-list */
+){
+ Walker sWalker;
+ WindowRewrite sRewrite;
+
+ memset(&sWalker, 0, sizeof(Walker));
+ memset(&sRewrite, 0, sizeof(WindowRewrite));
+
+ sRewrite.pSub = *ppSub;
+ sRewrite.pWin = pWin;
+ sRewrite.pSrc = pSrc;
+
+ sWalker.pParse = pParse;
+ sWalker.xExprCallback = selectWindowRewriteExprCb;
+ sWalker.xSelectCallback = selectWindowRewriteSelectCb;
+ sWalker.u.pRewrite = &sRewrite;
+
+ (void)sqlite3WalkExprList(&sWalker, pEList);
+
+ *ppSub = sRewrite.pSub;
+}
+
+/*
+** Append a copy of each expression in expression-list pAppend to
+** expression list pList. Return a pointer to the result list.
+*/
+static ExprList *exprListAppendList(
+ Parse *pParse, /* Parsing context */
+ ExprList *pList, /* List to which to append. Might be NULL */
+ ExprList *pAppend /* List of values to append. Might be NULL */
+){
+ if( pAppend ){
+ int i;
+ int nInit = pList ? pList->nExpr : 0;
+ for(i=0; i<pAppend->nExpr; i++){
+ Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0);
+ pList = sqlite3ExprListAppend(pParse, pList, pDup);
+ if( pList ) pList->a[nInit+i].sortOrder = pAppend->a[i].sortOrder;
+ }
+ }
+ return pList;
+}
+
+/*
+** If the SELECT statement passed as the second argument does not invoke
+** any SQL window functions, this function is a no-op. Otherwise, it
+** rewrites the SELECT statement so that window function xStep functions
+** are invoked in the correct order as described under "SELECT REWRITING"
+** at the top of this file.
+*/
+SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
+ int rc = SQLITE_OK;
+ if( p->pWin && p->pPrior==0 ){
+ Vdbe *v = sqlite3GetVdbe(pParse);
+ sqlite3 *db = pParse->db;
+ Select *pSub = 0; /* The subquery */
+ SrcList *pSrc = p->pSrc;
+ Expr *pWhere = p->pWhere;
+ ExprList *pGroupBy = p->pGroupBy;
+ Expr *pHaving = p->pHaving;
+ ExprList *pSort = 0;
+
+ ExprList *pSublist = 0; /* Expression list for sub-query */
+ Window *pMWin = p->pWin; /* Master window object */
+ Window *pWin; /* Window object iterator */
+
+ p->pSrc = 0;
+ p->pWhere = 0;
+ p->pGroupBy = 0;
+ p->pHaving = 0;
+
+ /* Create the ORDER BY clause for the sub-select. This is the concatenation
+ ** of the window PARTITION and ORDER BY clauses. Then, if this makes it
+ ** redundant, remove the ORDER BY from the parent SELECT. */
+ pSort = sqlite3ExprListDup(db, pMWin->pPartition, 0);
+ pSort = exprListAppendList(pParse, pSort, pMWin->pOrderBy);
+ if( pSort && p->pOrderBy ){
+ if( sqlite3ExprListCompare(pSort, p->pOrderBy, -1)==0 ){
+ sqlite3ExprListDelete(db, p->pOrderBy);
+ p->pOrderBy = 0;
+ }
+ }
+
+ /* Assign a cursor number for the ephemeral table used to buffer rows.
+ ** The OpenEphemeral instruction is coded later, after it is known how
+ ** many columns the table will have. */
+ pMWin->iEphCsr = pParse->nTab++;
+
+ selectWindowRewriteEList(pParse, pMWin, pSrc, p->pEList, &pSublist);
+ selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, &pSublist);
+ pMWin->nBufferCol = (pSublist ? pSublist->nExpr : 0);
+
+ /* Append the PARTITION BY and ORDER BY expressions to the to the
+ ** sub-select expression list. They are required to figure out where
+ ** boundaries for partitions and sets of peer rows lie. */
+ pSublist = exprListAppendList(pParse, pSublist, pMWin->pPartition);
+ pSublist = exprListAppendList(pParse, pSublist, pMWin->pOrderBy);
+
+ /* Append the arguments passed to each window function to the
+ ** sub-select expression list. Also allocate two registers for each
+ ** window function - one for the accumulator, another for interim
+ ** results. */
+ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
+ pWin->iArgCol = (pSublist ? pSublist->nExpr : 0);
+ pSublist = exprListAppendList(pParse, pSublist, pWin->pOwner->x.pList);
+ if( pWin->pFilter ){
+ Expr *pFilter = sqlite3ExprDup(db, pWin->pFilter, 0);
+ pSublist = sqlite3ExprListAppend(pParse, pSublist, pFilter);
+ }
+ pWin->regAccum = ++pParse->nMem;
+ pWin->regResult = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum);
+ }
+
+ /* If there is no ORDER BY or PARTITION BY clause, and the window
+ ** function accepts zero arguments, and there are no other columns
+ ** selected (e.g. "SELECT row_number() OVER () FROM t1"), it is possible
+ ** that pSublist is still NULL here. Add a constant expression here to
+ ** keep everything legal in this case.
+ */
+ if( pSublist==0 ){
+ pSublist = sqlite3ExprListAppend(pParse, 0,
+ sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[0], 0)
+ );
+ }
+
+ pSub = sqlite3SelectNew(
+ pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0
+ );
+ p->pSrc = sqlite3SrcListAppend(db, 0, 0, 0);
+ assert( p->pSrc || db->mallocFailed );
+ if( p->pSrc ){
+ p->pSrc->a[0].pSelect = pSub;
+ sqlite3SrcListAssignCursors(pParse, p->pSrc);
+ if( sqlite3ExpandSubquery(pParse, &p->pSrc->a[0]) ){
+ rc = SQLITE_NOMEM;
+ }else{
+ pSub->selFlags |= SF_Expanded;
+ p->selFlags &= ~SF_Aggregate;
+ sqlite3SelectPrep(pParse, pSub, 0);
+ }
+
+ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, pSublist->nExpr);
+ }else{
+ sqlite3SelectDelete(db, pSub);
+ }
+ if( db->mallocFailed ) rc = SQLITE_NOMEM;
+ }
+
+ return rc;
+}
+
+/*
+** Free the Window object passed as the second argument.
+*/
+SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3 *db, Window *p){
+ if( p ){
+ sqlite3ExprDelete(db, p->pFilter);
+ sqlite3ExprListDelete(db, p->pPartition);
+ sqlite3ExprListDelete(db, p->pOrderBy);
+ sqlite3ExprDelete(db, p->pEnd);
+ sqlite3ExprDelete(db, p->pStart);
+ sqlite3DbFree(db, p->zName);
+ sqlite3DbFree(db, p);
+ }
+}
+
+/*
+** Free the linked list of Window objects starting at the second argument.
+*/
+SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p){
+ while( p ){
+ Window *pNext = p->pNextWin;
+ sqlite3WindowDelete(db, p);
+ p = pNext;
+ }
+}
+
+/*
+** The argument expression is an PRECEDING or FOLLOWING offset. The
+** value should be a non-negative integer. If the value is not a
+** constant, change it to NULL. The fact that it is then a non-negative
+** integer will be caught later. But it is important not to leave
+** variable values in the expression tree.
+*/
+static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){
+ if( 0==sqlite3ExprIsConstant(pExpr) ){
+ sqlite3ExprDelete(pParse->db, pExpr);
+ pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0);
+ }
+ return pExpr;
+}
+
+/*
+** Allocate and return a new Window object describing a Window Definition.
+*/
+SQLITE_PRIVATE Window *sqlite3WindowAlloc(
+ Parse *pParse, /* Parsing context */
+ int eType, /* Frame type. TK_RANGE or TK_ROWS */
+ 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 */
+){
+ Window *pWin = 0;
+
+ /* Parser assures the following: */
+ assert( eType==TK_RANGE || eType==TK_ROWS );
+ assert( eStart==TK_CURRENT || eStart==TK_PRECEDING
+ || eStart==TK_UNBOUNDED || eStart==TK_FOLLOWING );
+ assert( eEnd==TK_CURRENT || eEnd==TK_FOLLOWING
+ || eEnd==TK_UNBOUNDED || eEnd==TK_PRECEDING );
+ 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 "<expr> PRECEDING" or "<expr> FOLLOWING".
+ */
+ if( eType==TK_RANGE && (pStart!=0 || pEnd!=0) ){
+ sqlite3ErrorMsg(pParse, "RANGE must use only UNBOUNDED or CURRENT ROW");
+ goto windowAllocErr;
+ }
+
+ /* Additionally, the
+ ** starting boundary type may not occur earlier in the following list than
+ ** the ending boundary type:
+ **
+ ** UNBOUNDED PRECEDING
+ ** <expr> PRECEDING
+ ** CURRENT ROW
+ ** <expr> FOLLOWING
+ ** UNBOUNDED FOLLOWING
+ **
+ ** The parser ensures that "UNBOUNDED PRECEDING" cannot be used as an ending
+ ** boundary, and than "UNBOUNDED FOLLOWING" cannot be used as a starting
+ ** frame boundary.
+ */
+ if( (eStart==TK_CURRENT && eEnd==TK_PRECEDING)
+ || (eStart==TK_FOLLOWING && (eEnd==TK_PRECEDING || eEnd==TK_CURRENT))
+ ){
+ sqlite3ErrorMsg(pParse, "unsupported frame delimiter for ROWS");
+ goto windowAllocErr;
+ }
+
+ pWin = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
+ if( pWin==0 ) goto windowAllocErr;
+ pWin->eType = eType;
+ pWin->eStart = eStart;
+ pWin->eEnd = eEnd;
+ pWin->pEnd = sqlite3WindowOffsetExpr(pParse, pEnd);
+ pWin->pStart = sqlite3WindowOffsetExpr(pParse, pStart);
+ return pWin;
+
+windowAllocErr:
+ sqlite3ExprDelete(pParse->db, pEnd);
+ sqlite3ExprDelete(pParse->db, pStart);
+ return 0;
+}
+
+/*
+** Attach window object pWin to expression p.
+*/
+SQLITE_PRIVATE void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){
+ if( p ){
+ assert( p->op==TK_FUNCTION );
+ /* This routine is only called for the parser. If pWin was not
+ ** allocated due to an OOM, then the parser would fail before ever
+ ** invoking this routine */
+ if( ALWAYS(pWin) ){
+ p->y.pWin = pWin;
+ ExprSetProperty(p, EP_WinFunc);
+ pWin->pOwner = p;
+ if( p->flags & EP_Distinct ){
+ sqlite3ErrorMsg(pParse,
+ "DISTINCT is not supported for window functions");
+ }
+ }
+ }else{
+ sqlite3WindowDelete(pParse->db, pWin);
+ }
+}
+
+/*
+** Return 0 if the two window objects are identical, or non-zero otherwise.
+** 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->eStart!=p2->eStart ) return 1;
+ if( p1->eEnd!=p2->eEnd ) 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;
+ if( sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1) ) return 1;
+ return 0;
+}
+
+
+/*
+** This is called by code in select.c before it calls sqlite3WhereBegin()
+** to begin iterating through the sub-query results. It is used to allocate
+** and initialize registers and cursors used by sqlite3WindowCodeStep().
+*/
+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 ){
+ pMWin->regPart = pParse->nMem+1;
+ pParse->nMem += nPart;
+ sqlite3VdbeAddOp3(v, OP_Null, 0, pMWin->regPart, pMWin->regPart+nPart-1);
+ }
+
+ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
+ FuncDef *p = pWin->pFunc;
+ if( (p->funcFlags & SQLITE_FUNC_MINMAX) && pWin->eStart!=TK_UNBOUNDED ){
+ /* The inline versions of min() and max() require a single ephemeral
+ ** table and 3 registers. The registers are used as follows:
+ **
+ ** regApp+0: slot to copy min()/max() argument to for MakeRecord
+ ** regApp+1: integer value used to ensure keys are unique
+ ** regApp+2: output of MakeRecord
+ */
+ ExprList *pList = pWin->pOwner->x.pList;
+ KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0);
+ pWin->csrApp = pParse->nTab++;
+ pWin->regApp = pParse->nMem+1;
+ pParse->nMem += 3;
+ if( pKeyInfo && pWin->pFunc->zName[1]=='i' ){
+ assert( pKeyInfo->aSortOrder[0]==0 );
+ pKeyInfo->aSortOrder[0] = 1;
+ }
+ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pWin->csrApp, 2);
+ sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO);
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1);
+ }
+ 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);
+ }
+ }
+}
+
+/*
+** A "PRECEDING <expr>" (eCond==0) or "FOLLOWING <expr>" (eCond==1) or the
+** value of the second argument to nth_value() (eCond==2) has just been
+** evaluated and the result left in register reg. This function generates VM
+** 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 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"
+ };
+ static int aOp[] = { OP_Ge, OP_Ge, OP_Gt };
+ Vdbe *v = sqlite3GetVdbe(pParse);
+ int regZero = sqlite3GetTempReg(pParse);
+ assert( eCond==0 || eCond==1 || eCond==2 );
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regZero);
+ sqlite3VdbeAddOp2(v, OP_MustBeInt, reg, sqlite3VdbeCurrentAddr(v)+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==2);
+ sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort);
+ sqlite3VdbeAppendP4(v, (void*)azErr[eCond], P4_STATIC);
+ sqlite3ReleaseTempReg(pParse, regZero);
+}
+
+/*
+** Return the number of arguments passed to the window-function associated
+** with the object passed as the only argument to this function.
+*/
+static int windowArgCount(Window *pWin){
+ ExprList *pList = pWin->pOwner->x.pList;
+ return (pList ? pList->nExpr : 0);
+}
+
+/*
+** Generate VM code to invoke either xStep() (if bInverse is 0) or
+** xInverse (if bInverse is non-zero) for each window function in the
+** linked list starting at pMWin. Or, for built-in window functions
+** that do not use the standard function API, generate the required
+** inline VM code.
+**
+** If argument csr is greater than or equal to 0, then argument reg is
+** the first register in an array of registers guaranteed to be large
+** enough to hold the array of arguments for each function. In this case
+** the arguments are extracted from the current row of csr into the
+** array of registers before invoking OP_AggStep or OP_AggInverse
+**
+** Or, if csr is less than zero, then the array of registers at reg is
+** already populated with all columns from the current row of the sub-query.
+**
+** If argument regPartSize is non-zero, then it is a register containing the
+** number of rows in the current partition.
+*/
+static void windowAggStep(
+ Parse *pParse,
+ 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 */
+){
+ Vdbe *v = sqlite3GetVdbe(pParse);
+ Window *pWin;
+ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
+ int flags = pWin->pFunc->funcFlags;
+ int regArg;
+ int nArg = windowArgCount(pWin);
+
+ if( csr>=0 ){
+ int i;
+ for(i=0; i<nArg; i++){
+ sqlite3VdbeAddOp3(v, OP_Column, csr, 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;
+ }
+
+ if( (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX)
+ && pWin->eStart!=TK_UNBOUNDED
+ ){
+ int addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regArg);
+ VdbeCoverage(v);
+ if( bInverse==0 ){
+ sqlite3VdbeAddOp2(v, OP_AddImm, pWin->regApp+1, 1);
+ sqlite3VdbeAddOp2(v, OP_SCopy, regArg, pWin->regApp);
+ sqlite3VdbeAddOp3(v, OP_MakeRecord, pWin->regApp, 2, pWin->regApp+2);
+ sqlite3VdbeAddOp2(v, OP_IdxInsert, pWin->csrApp, pWin->regApp+2);
+ }else{
+ sqlite3VdbeAddOp4Int(v, OP_SeekGE, pWin->csrApp, 0, regArg, 1);
+ VdbeCoverageNeverTaken(v);
+ sqlite3VdbeAddOp1(v, OP_Delete, pWin->csrApp);
+ sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2);
+ }
+ sqlite3VdbeJumpHere(v, addrIsNull);
+ }else if( pWin->regApp ){
+ assert( pWin->pFunc->zName==nth_valueName
+ || pWin->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{
+ 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;
+ }
+ addrIf = sqlite3VdbeAddOp3(v, OP_IfNot, regTmp, 0, 1);
+ VdbeCoverage(v);
+ if( csr>0 ){
+ sqlite3ReleaseTempReg(pParse, regTmp);
+ }
+ }
+ if( pWin->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){
+ CollSeq *pColl;
+ assert( nArg>0 );
+ pColl = sqlite3ExprNNCollSeq(pParse, pWin->pOwner->x.pList->a[0].pExpr);
+ sqlite3VdbeAddOp4(v, OP_CollSeq, 0,0,0, (const char*)pColl, P4_COLLSEQ);
+ }
+ sqlite3VdbeAddOp3(v, bInverse? OP_AggInverse : OP_AggStep,
+ bInverse, regArg, pWin->regAccum);
+ sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF);
+ sqlite3VdbeChangeP5(v, (u8)nArg);
+ if( addrIf ) sqlite3VdbeJumpHere(v, addrIf);
+ }
+ }
+}
+
+/*
+** Generate VM code to invoke either xValue() (bFinal==0) or xFinalize()
+** (bFinal==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){
+ Vdbe *v = sqlite3GetVdbe(pParse);
+ Window *pWin;
+
+ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
+ if( (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 ){
+ }else{
+ if( bFinal ){
+ sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, windowArgCount(pWin));
+ 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);
+ sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF);
+ }
+ }
+ }
+}
+
+/*
+** 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.
+*/
+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;
+
+ int reg = pParse->nMem+1;
+ int regRecord = reg+nSub;
+ int regRowid = regRecord+1;
+
+ *pRegSize = regRowid;
+ pParse->nMem += nSub + 2;
+
+ /* Load the column values for the row returned by the sub-select
+ ** into an array of registers starting at reg. */
+ for(k=0; k<nSub; k++){
+ sqlite3VdbeAddOp3(v, OP_Column, iSubCsr, k, reg+k);
+ }
+ 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 ){
+ int addr;
+ ExprList *pPart = pMWin->pPartition;
+ int nPart = pPart->nExpr;
+ 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);
+ 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"));
+ }
+
+ /* Buffer the current row in the ephemeral table. */
+ sqlite3VdbeAddOp2(v, OP_NewRowid, pMWin->iEphCsr, regRowid);
+ sqlite3VdbeAddOp3(v, OP_Insert, pMWin->iEphCsr, regRecord, regRowid);
+
+ /* End of the input loop */
+ sqlite3WhereEnd(pWInfo);
+
+ /* Invoke "flush_partition" to deal with the final (or only) partition */
+ sqlite3VdbeAddOp2(v, OP_Gosub, regFlushPart, lblFlushPart);
+ VdbeComment((v, "call flush_partition"));
+}
+
+/*
+** Invoke the sub-routine at regGosub (generated by code in select.c) to
+** return the current row of Window.iEphCsr. If all window functions are
+** aggregate window functions that use the standard API, a single
+** OP_Gosub instruction is all that this routine generates. Extra VM code
+** for per-row processing is only generated for the following built-in window
+** functions:
+**
+** nth_value()
+** first_value()
+** 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);
+
+ 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( 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);
+ }
+ }
+ 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 */
+}
+
+/*
+** Generate code to set the accumulator register for each window function
+** in the linked list passed as the second argument to NULL. And perform
+** any equivalent initialization required by any built-in window functions
+** in the list.
+*/
+static int windowInitAccum(Parse *pParse, Window *pMWin){
+ Vdbe *v = sqlite3GetVdbe(pParse);
+ int regArg;
+ int nArg = 0;
+ Window *pWin;
+ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
+ 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( (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;
+ pParse->nMem += nArg;
+ 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 <expr1> PRECEDING AND <expr2> 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 = <expr1> // PRECEDING expression
+** regEnd = <expr2> // 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 <expr> PRECEDING AND CURRENT ROW
+** ROWS BETWEEN CURRENT ROW AND <expr> FOLLOWING
+** ROWS BETWEEN UNBOUNDED PRECEDING AND <expr> FOLLOWING
+**
+** These are similar to the above. For "CURRENT ROW", intialize the
+** register to 0. For "UNBOUNDED PRECEDING" to infinity.
+**
+** ROWS BETWEEN <expr> 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 <expr> FOLLOWING AND <expr> 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 <expr> PRECEDING AND <expr> 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)
+** }
+**
+*/
+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 <expr> PRECEDING */
+ int regEnd; /* Value of <expr> 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, &regSize);
+
+ 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 <expr1> FOLLOWING AND ROWS <expr2> FOLLOWING", do:
+ **
+ ** if( regEnd<regStart ){
+ ** // The frame always consists of 0 rows
+ ** regStart = regSize;
+ ** }
+ ** regEnd = regEnd - regStart;
+ */
+ if( pMWin->pEnd && 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);
+ }
+ }
+
+ 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);
+}
+
+/*
+** 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.
+**
+** 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<ctr; i++){
+** Gosub addrGosub
+** Next iEphCsr
+** }
+** Integer ctr 0
+** }
+** AggStep (csrLead)
+** Incr ctr
+** }
+**
+** AggFinal (xFinalize)
+** for(i=0; i<ctr; i++){
+** Gosub addrGosub
+** Next iEphCsr
+** }
+**
+** ResetSorter (csr)
+** Return
+**
+** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+**
+** As above, except that the "if( new peer )" branch is always taken.
+**
+** RANGE BETWEEN CURRENT ROW AND CURRENT ROW
+**
+** As above, except that each of the for() loops becomes:
+**
+** for(i=0; i<ctr; i++){
+** Gosub addrGosub
+** AggInverse (iEphCsr)
+** Next iEphCsr
+** }
+**
+** RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
+**
+** flush_partition:
+** Once {
+** OpenDup (iEphCsr -> 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; i<ctr; i++){
+** Gosub addrGosub
+** AggInverse (iEphCsr)
+** Next iEphCsr
+** }
+** Integer ctr 0
+** }
+** Incr ctr
+** }
+**
+** AggFinal (xFinalize)
+** for(i=0; i<ctr; i++){
+** Gosub addrGosub
+** Next iEphCsr
+** }
+**
+** ResetSorter (csr)
+** Return
+*/
+static void windowCodeCacheStep(
+ Parse *pParse,
+ Select *p,
+ WhereInfo *pWInfo,
+ int regGosub,
+ int addrGosub
+){
+ Window *pMWin = p->pWin;
+ 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, &regSize);
+ 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; k<nPeer; k++){
+ sqlite3VdbeAddOp3(v, OP_Column, csrLead, iOff+k, regNewPeer+k);
+ }
+ 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);
+ sqlite3VdbeAddOp3(v, OP_Copy, regNewPeer, regPeer, nPeer-1);
+ }
+
+ windowReturnRows(pParse, pMWin, regCtr, regGosub, addrGosub,
+ (bCurrent ? regArg : 0), (bCurrent ? regSize : 0)
+ );
+ if( addrJump ) sqlite3VdbeJumpHere(v, addrJump);
+ }
+
+ 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);
+}
+
+
+/*
+** 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".
+*/
+static void windowCodeDefaultStep(
+ Parse *pParse,
+ Select *p,
+ WhereInfo *pWInfo,
+ int regGosub,
+ int addrGosub
+){
+ 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;
+
+ assert( pMWin->eType==TK_RANGE
+ || (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_CURRENT)
+ );
+
+ 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;
+ }
+
+ 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; k<nSub; k++){
+ sqlite3VdbeAddOp3(v, OP_Column, iSubCsr, k, reg+k);
+ }
+
+ /* Check if this is the start of a new partition or peer group. */
+ if( pPart || pOrderBy ){
+ int nPart = (pPart ? pPart->nExpr : 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);
+ }else{
+ addrJump = 0;
+ }
+ windowAggFinal(pParse, pMWin, pMWin->eStart==TK_CURRENT);
+ if( addrGoto ) sqlite3VdbeJumpHere(v, addrGoto);
+ }
+
+ 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);
+
+ /* Buffer the current row in the ephemeral table. */
+ if( pMWin->nBufferCol>0 ){
+ sqlite3VdbeAddOp3(v, OP_MakeRecord, reg, pMWin->nBufferCol, regRecord);
+ }else{
+ sqlite3VdbeAddOp2(v, OP_Blob, 0, regRecord);
+ sqlite3VdbeAppendP4(v, (void*)"", 0);
+ }
+ sqlite3VdbeAddOp2(v, OP_NewRowid, pMWin->iEphCsr, regRowid);
+ sqlite3VdbeAddOp3(v, OP_Insert, pMWin->iEphCsr, regRecord, regRowid);
+
+ /* End the database scan loop. */
+ sqlite3WhereEnd(pWInfo);
+
+ 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);
+}
+
+/*
+** Allocate and return a duplicate of the Window object indicated by the
+** third argument. Set the Window.pOwner field of the new object to
+** pOwner.
+*/
+SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){
+ Window *pNew = 0;
+ if( ALWAYS(p) ){
+ pNew = sqlite3DbMallocZero(db, sizeof(Window));
+ if( pNew ){
+ pNew->zName = sqlite3DbStrDup(db, p->zName);
+ pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0);
+ pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0);
+ pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0);
+ pNew->eType = p->eType;
+ pNew->eEnd = p->eEnd;
+ pNew->eStart = p->eStart;
+ pNew->pStart = sqlite3ExprDup(db, p->pStart, 0);
+ pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0);
+ pNew->pOwner = pOwner;
+ }
+ }
+ return pNew;
+}
+
+/*
+** Return a copy of the linked list of Window objects passed as the
+** second argument.
+*/
+SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p){
+ Window *pWin;
+ Window *pRet = 0;
+ Window **pp = &pRet;
+
+ for(pWin=p; pWin; pWin=pWin->pNextWin){
+ *pp = sqlite3WindowDup(db, 0, pWin);
+ if( *pp==0 ) break;
+ pp = &((*pp)->pNextWin);
+ }
+
+ return pRet;
+}
+
+/*
+** 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.
+*/
+SQLITE_PRIVATE void sqlite3WindowCodeStep(
+ Parse *pParse, /* Parse context */
+ Select *p, /* Rewritten SELECT statement */
+ WhereInfo *pWInfo, /* Context returned by sqlite3WhereBegin() */
+ int regGosub, /* Register for OP_Gosub */
+ int addrGosub /* OP_Gosub here to return each row */
+){
+ Window *pMWin = p->pWin;
+
+ /* 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() */
+
+ 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;
+ }
+ }
+ }
+
+ /* 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);
+ }
+ }
+}
+
+#endif /* SQLITE_OMIT_WINDOWFUNC */
+
+/************** End of window.c **********************************************/
/************** Begin file parse.c *******************************************/
/*
** 2000-05-29
@@ -136929,6 +146829,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
** input grammar file:
*/
/* #include <stdio.h> */
+/* #include <assert.h> */
/************ Begin %include sections from the grammar ************************/
/* #include "sqliteInt.h" */
@@ -136970,15 +146871,6 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
#define YYMALLOCARGTYPE u64
/*
-** An instance of this structure holds information about the
-** LIMIT clause of a SELECT statement.
-*/
-struct LimitVal {
- Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */
- Expr *pOffset; /* The OFFSET expression. NULL if there is none */
-};
-
-/*
** An instance of the following structure describes the event of a
** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT,
** TK_DELETE, or TK_INSTEAD. If the event is of the form
@@ -136989,6 +146881,8 @@ struct LimitVal {
*/
struct TrigEvent { int a; IdList * b; };
+struct FrameBound { int eType; Expr *pExpr; };
+
/*
** Disable lookaside memory allocation for objects that might be
** shared across database connections.
@@ -137021,26 +146915,26 @@ static void disableLookaside(Parse *pParse){
}
}
- /* This is a utility routine used to set the ExprSpan.zStart and
- ** ExprSpan.zEnd values of pOut so that the span covers the complete
- ** range of text beginning with pStart and going to the end of pEnd.
- */
- static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
- pOut->zStart = pStart->z;
- pOut->zEnd = &pEnd->z[pEnd->n];
- }
/* Construct a new Expr object from a single identifier. Use the
** new Expr to populate pOut. Set the span of pOut to be the identifier
** that created the expression.
*/
- static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token t){
+ static Expr *tokenExpr(Parse *pParse, int op, Token t){
Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
if( p ){
- memset(p, 0, sizeof(Expr));
+ /* memset(p, 0, sizeof(Expr)); */
p->op = (u8)op;
+ p->affinity = 0;
p->flags = EP_Leaf;
p->iAgg = -1;
+ p->pLeft = p->pRight = 0;
+ p->x.pList = 0;
+ p->pAggInfo = 0;
+ p->y.pTab = 0;
+ p->op2 = 0;
+ p->iTable = 0;
+ p->iColumn = 0;
p->u.zToken = (char*)&p[1];
memcpy(p->u.zToken, t.z, t.n);
p->u.zToken[t.n] = 0;
@@ -137051,71 +146945,25 @@ static void disableLookaside(Parse *pParse){
#if SQLITE_MAX_EXPR_DEPTH>0
p->nHeight = 1;
#endif
+ if( IN_RENAME_OBJECT ){
+ return (Expr*)sqlite3RenameTokenMap(pParse, (void*)p, &t);
+ }
}
- pOut->pExpr = p;
- pOut->zStart = t.z;
- pOut->zEnd = &t.z[t.n];
- }
-
- /* This routine constructs a binary expression node out of two ExprSpan
- ** objects and uses the result to populate a new ExprSpan object.
- */
- static void spanBinaryExpr(
- Parse *pParse, /* The parsing context. Errors accumulate here */
- int op, /* The binary operation */
- ExprSpan *pLeft, /* The left operand, and output */
- ExprSpan *pRight /* The right operand */
- ){
- pLeft->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr);
- pLeft->zEnd = pRight->zEnd;
- }
-
- /* If doNot is true, then add a TK_NOT Expr-node wrapper around the
- ** outside of *ppExpr.
- */
- static void exprNot(Parse *pParse, int doNot, ExprSpan *pSpan){
- if( doNot ){
- pSpan->pExpr = sqlite3PExpr(pParse, TK_NOT, pSpan->pExpr, 0);
- }
+ return p;
}
- /* Construct an expression node for a unary postfix operator
- */
- static void spanUnaryPostfix(
- Parse *pParse, /* Parsing context to record errors */
- int op, /* The operator */
- ExprSpan *pOperand, /* The operand, and output */
- Token *pPostOp /* The operand token for setting the span */
- ){
- pOperand->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0);
- pOperand->zEnd = &pPostOp->z[pPostOp->n];
- }
/* A routine to convert a binary TK_IS or TK_ISNOT expression into a
** unary TK_ISNULL or TK_NOTNULL expression. */
static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
sqlite3 *db = pParse->db;
- if( pA && pY && pY->op==TK_NULL ){
+ if( pA && pY && pY->op==TK_NULL && !IN_RENAME_OBJECT ){
pA->op = (u8)op;
sqlite3ExprDelete(db, pA->pRight);
pA->pRight = 0;
}
}
- /* Construct an expression node for a unary prefix operator
- */
- static void spanUnaryPrefix(
- ExprSpan *pOut, /* Write the new expression node here */
- Parse *pParse, /* Parsing context to record errors */
- int op, /* The operator */
- ExprSpan *pOperand, /* The operand */
- Token *pPreOp /* The operand token for setting the span */
- ){
- pOut->zStart = pPreOp->z;
- pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0);
- pOut->zEnd = pOperand->zEnd;
- }
-
/* Add a single new term to an ExprList that is used to store a
** list of identifiers. Report an error if the ID list contains
** a COLLATE clause or an ASC or DESC keyword, except ignore the
@@ -137178,65 +147026,78 @@ static void disableLookaside(Parse *pParse){
** zero the stack is dynamically sized using realloc()
** sqlite3ParserARG_SDECL A static variable declaration for the %extra_argument
** sqlite3ParserARG_PDECL A parameter declaration for the %extra_argument
+** sqlite3ParserARG_PARAM Code to pass %extra_argument as a subroutine parameter
** sqlite3ParserARG_STORE Code to store %extra_argument into yypParser
** sqlite3ParserARG_FETCH Code to extract %extra_argument from yypParser
+** sqlite3ParserCTX_* As sqlite3ParserARG_ except for %extra_context
** YYERRORSYMBOL is the code number of the error symbol. If not
** defined, then do no error processing.
** YYNSTATE the combined number of states.
** YYNRULE the number of rules in the grammar
+** YYNTOKEN Number of terminal symbols
** YY_MAX_SHIFT Maximum value for shift actions
** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions
** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions
-** YY_MIN_REDUCE Minimum value for reduce actions
-** YY_MAX_REDUCE Maximum value for reduce actions
** YY_ERROR_ACTION The yy_action[] code for syntax error
** YY_ACCEPT_ACTION The yy_action[] code for accept
** YY_NO_ACTION The yy_action[] code for no-op
+** YY_MIN_REDUCE Minimum value for reduce actions
+** YY_MAX_REDUCE Maximum value for reduce actions
*/
#ifndef INTERFACE
# define INTERFACE 1
#endif
/************* Begin control #defines *****************************************/
-#define YYCODETYPE unsigned char
-#define YYNOCODE 252
+#define YYCODETYPE unsigned short int
+#define YYNOCODE 277
#define YYACTIONTYPE unsigned short int
-#define YYWILDCARD 83
+#define YYWILDCARD 91
#define sqlite3ParserTOKENTYPE Token
typedef union {
int yyinit;
sqlite3ParserTOKENTYPE yy0;
- Expr* yy72;
- TriggerStep* yy145;
- ExprList* yy148;
- SrcList* yy185;
- ExprSpan yy190;
- int yy194;
- Select* yy243;
- IdList* yy254;
- With* yy285;
- struct TrigEvent yy332;
- struct LimitVal yy354;
- struct {int value; int mask;} yy497;
+ 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;
} YYMINORTYPE;
#ifndef YYSTACKDEPTH
#define YYSTACKDEPTH 100
#endif
-#define sqlite3ParserARG_SDECL Parse *pParse;
-#define sqlite3ParserARG_PDECL ,Parse *pParse
-#define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse
-#define sqlite3ParserARG_STORE yypParser->pParse = pParse
+#define sqlite3ParserARG_SDECL
+#define sqlite3ParserARG_PDECL
+#define sqlite3ParserARG_PARAM
+#define sqlite3ParserARG_FETCH
+#define sqlite3ParserARG_STORE
+#define sqlite3ParserCTX_SDECL Parse *pParse;
+#define sqlite3ParserCTX_PDECL ,Parse *pParse
+#define sqlite3ParserCTX_PARAM ,pParse
+#define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse;
+#define sqlite3ParserCTX_STORE yypParser->pParse=pParse;
#define YYFALLBACK 1
-#define YYNSTATE 455
-#define YYNRULE 329
-#define YY_MAX_SHIFT 454
-#define YY_MIN_SHIFTREDUCE 664
-#define YY_MAX_SHIFTREDUCE 992
-#define YY_MIN_REDUCE 993
-#define YY_MAX_REDUCE 1321
-#define YY_ERROR_ACTION 1322
-#define YY_ACCEPT_ACTION 1323
-#define YY_NO_ACTION 1324
+#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
/************* End control #defines *******************************************/
+#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])))
/* Define the yytestcase() macro to be a no-op if is not already defined
** otherwise.
@@ -137265,9 +147126,6 @@ typedef union {
** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then
** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE.
**
-** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE
-** and YY_MAX_REDUCE
-**
** N == YY_ERROR_ACTION A syntax error has occurred.
**
** N == YY_ACCEPT_ACTION The parser accepts its input.
@@ -137275,25 +147133,22 @@ typedef union {
** N == YY_NO_ACTION No such action. Denotes unused
** slots in the yy_action[] table.
**
+** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE
+** and YY_MAX_REDUCE
+**
** The action table is constructed as a single large table named yy_action[].
** Given state S and lookahead X, the action is computed as either:
**
** (A) N = yy_action[ yy_shift_ofst[S] + X ]
** (B) N = yy_default[S]
**
-** The (A) formula is preferred. The B formula is used instead if:
-** (1) The yy_shift_ofst[S]+X value is out of range, or
-** (2) yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or
-** (3) yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT.
-** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that
-** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X.
-** Hence only tests (1) and (2) need to be evaluated.)
+** The (A) formula is preferred. The B formula is used instead if
+** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X.
**
** The formulas above are for computing the action when the lookahead is
** a terminal symbol. If the lookahead is a non-terminal (as occurs after
** a reduce action) then the yy_reduce_ofst[] array is used in place of
-** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of
-** YY_SHIFT_USE_DFLT.
+** the yy_shift_ofst[] array.
**
** The following are the tables generated in this section:
**
@@ -137307,463 +147162,568 @@ typedef union {
** yy_default[] Default action for each state.
**
*********** Begin parsing tables **********************************************/
-#define YY_ACTTAB_COUNT (1566)
+#define YY_ACTTAB_COUNT (2009)
static const YYACTIONTYPE yy_action[] = {
- /* 0 */ 324, 1323, 155, 155, 2, 203, 94, 94, 94, 93,
- /* 10 */ 350, 98, 98, 98, 98, 91, 95, 95, 94, 94,
- /* 20 */ 94, 93, 350, 268, 99, 100, 90, 971, 971, 847,
- /* 30 */ 850, 839, 839, 97, 97, 98, 98, 98, 98, 350,
- /* 40 */ 969, 96, 96, 96, 96, 95, 95, 94, 94, 94,
- /* 50 */ 93, 350, 950, 96, 96, 96, 96, 95, 95, 94,
- /* 60 */ 94, 94, 93, 350, 250, 96, 96, 96, 96, 95,
- /* 70 */ 95, 94, 94, 94, 93, 350, 224, 224, 969, 132,
- /* 80 */ 888, 348, 347, 415, 172, 324, 1286, 449, 414, 950,
- /* 90 */ 951, 952, 808, 977, 1032, 950, 300, 786, 428, 132,
- /* 100 */ 975, 362, 976, 9, 9, 787, 132, 52, 52, 99,
- /* 110 */ 100, 90, 971, 971, 847, 850, 839, 839, 97, 97,
- /* 120 */ 98, 98, 98, 98, 372, 978, 241, 978, 262, 369,
- /* 130 */ 261, 120, 950, 951, 952, 194, 58, 324, 401, 398,
- /* 140 */ 397, 808, 427, 429, 75, 808, 1260, 1260, 132, 396,
- /* 150 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93,
- /* 160 */ 350, 99, 100, 90, 971, 971, 847, 850, 839, 839,
- /* 170 */ 97, 97, 98, 98, 98, 98, 786, 262, 369, 261,
- /* 180 */ 826, 262, 364, 251, 787, 1084, 101, 1114, 72, 324,
- /* 190 */ 227, 1113, 242, 411, 442, 819, 92, 89, 178, 818,
- /* 200 */ 1022, 268, 96, 96, 96, 96, 95, 95, 94, 94,
- /* 210 */ 94, 93, 350, 99, 100, 90, 971, 971, 847, 850,
- /* 220 */ 839, 839, 97, 97, 98, 98, 98, 98, 449, 372,
- /* 230 */ 818, 818, 820, 92, 89, 178, 60, 92, 89, 178,
- /* 240 */ 1025, 324, 357, 930, 1316, 300, 61, 1316, 52, 52,
- /* 250 */ 836, 836, 848, 851, 96, 96, 96, 96, 95, 95,
- /* 260 */ 94, 94, 94, 93, 350, 99, 100, 90, 971, 971,
- /* 270 */ 847, 850, 839, 839, 97, 97, 98, 98, 98, 98,
- /* 280 */ 92, 89, 178, 427, 412, 198, 930, 1317, 454, 995,
- /* 290 */ 1317, 355, 1024, 324, 243, 231, 114, 277, 348, 347,
- /* 300 */ 1242, 950, 416, 1071, 928, 840, 96, 96, 96, 96,
- /* 310 */ 95, 95, 94, 94, 94, 93, 350, 99, 100, 90,
- /* 320 */ 971, 971, 847, 850, 839, 839, 97, 97, 98, 98,
- /* 330 */ 98, 98, 449, 328, 449, 120, 23, 256, 950, 951,
- /* 340 */ 952, 968, 978, 438, 978, 324, 329, 928, 954, 701,
- /* 350 */ 200, 175, 52, 52, 52, 52, 939, 353, 96, 96,
- /* 360 */ 96, 96, 95, 95, 94, 94, 94, 93, 350, 99,
- /* 370 */ 100, 90, 971, 971, 847, 850, 839, 839, 97, 97,
- /* 380 */ 98, 98, 98, 98, 354, 449, 954, 427, 417, 427,
- /* 390 */ 426, 1290, 92, 89, 178, 268, 253, 324, 255, 1058,
- /* 400 */ 1037, 694, 93, 350, 383, 52, 52, 380, 1058, 374,
- /* 410 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93,
- /* 420 */ 350, 99, 100, 90, 971, 971, 847, 850, 839, 839,
- /* 430 */ 97, 97, 98, 98, 98, 98, 228, 449, 167, 449,
- /* 440 */ 427, 407, 157, 446, 446, 446, 349, 349, 349, 324,
- /* 450 */ 310, 316, 991, 827, 320, 242, 411, 51, 51, 36,
- /* 460 */ 36, 254, 96, 96, 96, 96, 95, 95, 94, 94,
- /* 470 */ 94, 93, 350, 99, 100, 90, 971, 971, 847, 850,
- /* 480 */ 839, 839, 97, 97, 98, 98, 98, 98, 194, 316,
- /* 490 */ 929, 401, 398, 397, 224, 224, 1265, 939, 353, 1318,
- /* 500 */ 317, 324, 396, 1063, 1063, 813, 414, 1061, 1061, 950,
- /* 510 */ 299, 448, 992, 268, 96, 96, 96, 96, 95, 95,
- /* 520 */ 94, 94, 94, 93, 350, 99, 100, 90, 971, 971,
- /* 530 */ 847, 850, 839, 839, 97, 97, 98, 98, 98, 98,
- /* 540 */ 757, 1041, 449, 893, 893, 386, 950, 951, 952, 410,
- /* 550 */ 992, 747, 747, 324, 229, 268, 221, 296, 268, 771,
- /* 560 */ 890, 378, 52, 52, 890, 421, 96, 96, 96, 96,
- /* 570 */ 95, 95, 94, 94, 94, 93, 350, 99, 100, 90,
- /* 580 */ 971, 971, 847, 850, 839, 839, 97, 97, 98, 98,
- /* 590 */ 98, 98, 103, 449, 275, 384, 1241, 343, 157, 1207,
- /* 600 */ 909, 669, 670, 671, 176, 197, 196, 195, 324, 298,
- /* 610 */ 319, 1266, 2, 37, 37, 910, 1134, 1040, 96, 96,
- /* 620 */ 96, 96, 95, 95, 94, 94, 94, 93, 350, 697,
- /* 630 */ 911, 177, 99, 100, 90, 971, 971, 847, 850, 839,
- /* 640 */ 839, 97, 97, 98, 98, 98, 98, 230, 146, 120,
- /* 650 */ 735, 1235, 826, 270, 1141, 273, 1141, 771, 171, 170,
- /* 660 */ 736, 1141, 82, 324, 80, 268, 697, 819, 158, 268,
- /* 670 */ 378, 818, 78, 96, 96, 96, 96, 95, 95, 94,
- /* 680 */ 94, 94, 93, 350, 120, 950, 393, 99, 100, 90,
- /* 690 */ 971, 971, 847, 850, 839, 839, 97, 97, 98, 98,
- /* 700 */ 98, 98, 818, 818, 820, 1141, 1070, 370, 331, 133,
- /* 710 */ 1066, 1141, 1250, 198, 268, 324, 1016, 330, 245, 333,
- /* 720 */ 24, 334, 950, 951, 952, 368, 335, 81, 96, 96,
- /* 730 */ 96, 96, 95, 95, 94, 94, 94, 93, 350, 99,
- /* 740 */ 100, 90, 971, 971, 847, 850, 839, 839, 97, 97,
- /* 750 */ 98, 98, 98, 98, 132, 267, 260, 445, 330, 223,
- /* 760 */ 175, 1289, 925, 752, 724, 318, 1073, 324, 751, 246,
- /* 770 */ 385, 301, 301, 378, 329, 361, 344, 414, 1233, 280,
- /* 780 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93,
- /* 790 */ 350, 99, 88, 90, 971, 971, 847, 850, 839, 839,
- /* 800 */ 97, 97, 98, 98, 98, 98, 337, 346, 721, 722,
- /* 810 */ 449, 120, 118, 887, 162, 887, 810, 371, 324, 202,
- /* 820 */ 202, 373, 249, 263, 202, 394, 74, 704, 208, 1069,
- /* 830 */ 12, 12, 96, 96, 96, 96, 95, 95, 94, 94,
- /* 840 */ 94, 93, 350, 100, 90, 971, 971, 847, 850, 839,
- /* 850 */ 839, 97, 97, 98, 98, 98, 98, 449, 771, 232,
- /* 860 */ 449, 278, 120, 286, 74, 704, 714, 713, 324, 342,
- /* 870 */ 749, 877, 1209, 77, 285, 1255, 780, 52, 52, 202,
- /* 880 */ 27, 27, 418, 96, 96, 96, 96, 95, 95, 94,
- /* 890 */ 94, 94, 93, 350, 90, 971, 971, 847, 850, 839,
- /* 900 */ 839, 97, 97, 98, 98, 98, 98, 86, 444, 877,
- /* 910 */ 3, 1193, 422, 1013, 873, 435, 886, 208, 886, 689,
- /* 920 */ 1091, 257, 116, 822, 447, 1230, 117, 1229, 86, 444,
- /* 930 */ 177, 3, 381, 96, 96, 96, 96, 95, 95, 94,
- /* 940 */ 94, 94, 93, 350, 339, 447, 120, 351, 120, 212,
- /* 950 */ 169, 287, 404, 282, 403, 199, 771, 950, 433, 419,
- /* 960 */ 439, 822, 280, 691, 1039, 264, 269, 132, 351, 153,
- /* 970 */ 826, 376, 74, 272, 274, 276, 83, 84, 1054, 433,
- /* 980 */ 147, 1038, 443, 85, 351, 451, 450, 281, 132, 818,
- /* 990 */ 25, 826, 449, 120, 950, 951, 952, 83, 84, 86,
- /* 1000 */ 444, 691, 3, 408, 85, 351, 451, 450, 449, 5,
- /* 1010 */ 818, 203, 32, 32, 1107, 120, 447, 950, 225, 1140,
- /* 1020 */ 818, 818, 820, 821, 19, 203, 226, 950, 38, 38,
- /* 1030 */ 1087, 314, 314, 313, 215, 311, 120, 449, 678, 351,
- /* 1040 */ 237, 818, 818, 820, 821, 19, 969, 409, 377, 1,
- /* 1050 */ 433, 180, 706, 248, 950, 951, 952, 10, 10, 449,
- /* 1060 */ 969, 247, 826, 1098, 950, 951, 952, 430, 83, 84,
- /* 1070 */ 756, 336, 950, 20, 431, 85, 351, 451, 450, 10,
- /* 1080 */ 10, 818, 86, 444, 969, 3, 950, 449, 302, 303,
- /* 1090 */ 182, 950, 1146, 338, 1021, 1015, 1004, 183, 969, 447,
- /* 1100 */ 132, 181, 76, 444, 21, 3, 449, 10, 10, 950,
- /* 1110 */ 951, 952, 818, 818, 820, 821, 19, 715, 1279, 447,
- /* 1120 */ 389, 233, 351, 950, 951, 952, 10, 10, 950, 951,
- /* 1130 */ 952, 1003, 218, 433, 1005, 325, 1273, 773, 289, 291,
- /* 1140 */ 424, 293, 351, 7, 159, 826, 363, 402, 315, 360,
- /* 1150 */ 1129, 83, 84, 433, 1232, 716, 772, 259, 85, 351,
- /* 1160 */ 451, 450, 358, 375, 818, 826, 360, 359, 399, 1211,
- /* 1170 */ 157, 83, 84, 681, 98, 98, 98, 98, 85, 351,
- /* 1180 */ 451, 450, 323, 252, 818, 295, 1211, 1213, 1235, 173,
- /* 1190 */ 1037, 284, 434, 340, 1204, 818, 818, 820, 821, 19,
- /* 1200 */ 308, 234, 449, 234, 96, 96, 96, 96, 95, 95,
- /* 1210 */ 94, 94, 94, 93, 350, 818, 818, 820, 821, 19,
- /* 1220 */ 909, 120, 39, 39, 1203, 449, 168, 360, 449, 1276,
- /* 1230 */ 367, 449, 135, 449, 986, 910, 449, 1249, 449, 1247,
- /* 1240 */ 449, 205, 983, 449, 370, 40, 40, 1211, 41, 41,
- /* 1250 */ 911, 42, 42, 28, 28, 870, 29, 29, 31, 31,
- /* 1260 */ 43, 43, 379, 44, 44, 449, 59, 449, 332, 449,
- /* 1270 */ 432, 62, 144, 156, 449, 130, 449, 72, 449, 137,
- /* 1280 */ 449, 365, 449, 392, 139, 45, 45, 11, 11, 46,
- /* 1290 */ 46, 140, 1200, 449, 105, 105, 47, 47, 48, 48,
- /* 1300 */ 33, 33, 49, 49, 1126, 449, 141, 366, 449, 185,
- /* 1310 */ 142, 449, 1234, 50, 50, 449, 160, 449, 148, 449,
- /* 1320 */ 1136, 382, 449, 67, 449, 34, 34, 449, 122, 122,
- /* 1330 */ 449, 123, 123, 449, 1198, 124, 124, 56, 56, 35,
- /* 1340 */ 35, 449, 106, 106, 53, 53, 449, 107, 107, 449,
- /* 1350 */ 108, 108, 449, 104, 104, 449, 406, 449, 388, 449,
- /* 1360 */ 189, 121, 121, 449, 190, 449, 119, 119, 449, 112,
- /* 1370 */ 112, 449, 111, 111, 1218, 109, 109, 110, 110, 55,
- /* 1380 */ 55, 266, 752, 57, 57, 54, 54, 751, 26, 26,
- /* 1390 */ 1099, 30, 30, 219, 154, 390, 271, 191, 321, 1006,
- /* 1400 */ 192, 405, 1057, 1056, 1055, 341, 1048, 706, 1047, 1029,
- /* 1410 */ 322, 420, 1028, 71, 1095, 283, 288, 1027, 1288, 204,
- /* 1420 */ 6, 297, 79, 1184, 437, 1096, 1094, 290, 345, 292,
- /* 1430 */ 441, 1093, 294, 102, 425, 73, 423, 213, 1012, 22,
- /* 1440 */ 452, 945, 214, 1077, 216, 217, 238, 453, 306, 304,
- /* 1450 */ 307, 239, 240, 1001, 305, 125, 996, 126, 115, 235,
- /* 1460 */ 127, 665, 352, 166, 244, 179, 356, 113, 885, 883,
- /* 1470 */ 806, 136, 128, 738, 326, 138, 327, 258, 184, 899,
- /* 1480 */ 143, 129, 145, 63, 64, 65, 66, 902, 186, 187,
- /* 1490 */ 898, 8, 13, 188, 134, 265, 891, 202, 980, 387,
- /* 1500 */ 150, 149, 680, 161, 391, 193, 285, 279, 395, 151,
- /* 1510 */ 68, 717, 14, 15, 400, 69, 16, 131, 236, 825,
- /* 1520 */ 824, 853, 746, 750, 4, 70, 174, 413, 220, 222,
- /* 1530 */ 152, 779, 774, 77, 868, 74, 854, 201, 17, 852,
- /* 1540 */ 908, 206, 907, 207, 18, 857, 934, 163, 436, 210,
- /* 1550 */ 935, 164, 209, 165, 440, 856, 823, 312, 690, 87,
- /* 1560 */ 211, 309, 1281, 940, 995, 1280,
+ /* 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,
};
static const YYCODETYPE yy_lookahead[] = {
- /* 0 */ 19, 144, 145, 146, 147, 24, 90, 91, 92, 93,
- /* 10 */ 94, 54, 55, 56, 57, 58, 88, 89, 90, 91,
- /* 20 */ 92, 93, 94, 152, 43, 44, 45, 46, 47, 48,
- /* 30 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 94,
- /* 40 */ 59, 84, 85, 86, 87, 88, 89, 90, 91, 92,
- /* 50 */ 93, 94, 59, 84, 85, 86, 87, 88, 89, 90,
- /* 60 */ 91, 92, 93, 94, 193, 84, 85, 86, 87, 88,
- /* 70 */ 89, 90, 91, 92, 93, 94, 194, 195, 97, 79,
- /* 80 */ 11, 88, 89, 152, 26, 19, 171, 152, 206, 96,
- /* 90 */ 97, 98, 72, 100, 179, 59, 152, 31, 163, 79,
- /* 100 */ 107, 219, 109, 172, 173, 39, 79, 172, 173, 43,
- /* 110 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- /* 120 */ 54, 55, 56, 57, 152, 132, 199, 134, 108, 109,
- /* 130 */ 110, 196, 96, 97, 98, 99, 209, 19, 102, 103,
- /* 140 */ 104, 72, 207, 208, 26, 72, 119, 120, 79, 113,
- /* 150 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
- /* 160 */ 94, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- /* 170 */ 52, 53, 54, 55, 56, 57, 31, 108, 109, 110,
- /* 180 */ 82, 108, 109, 110, 39, 210, 68, 175, 130, 19,
- /* 190 */ 218, 175, 119, 120, 250, 97, 221, 222, 223, 101,
- /* 200 */ 172, 152, 84, 85, 86, 87, 88, 89, 90, 91,
- /* 210 */ 92, 93, 94, 43, 44, 45, 46, 47, 48, 49,
- /* 220 */ 50, 51, 52, 53, 54, 55, 56, 57, 152, 152,
- /* 230 */ 132, 133, 134, 221, 222, 223, 66, 221, 222, 223,
- /* 240 */ 172, 19, 193, 22, 23, 152, 24, 26, 172, 173,
- /* 250 */ 46, 47, 48, 49, 84, 85, 86, 87, 88, 89,
- /* 260 */ 90, 91, 92, 93, 94, 43, 44, 45, 46, 47,
- /* 270 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
- /* 280 */ 221, 222, 223, 207, 208, 46, 22, 23, 148, 149,
- /* 290 */ 26, 242, 172, 19, 154, 218, 156, 23, 88, 89,
- /* 300 */ 241, 59, 163, 163, 83, 101, 84, 85, 86, 87,
- /* 310 */ 88, 89, 90, 91, 92, 93, 94, 43, 44, 45,
- /* 320 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
- /* 330 */ 56, 57, 152, 157, 152, 196, 196, 16, 96, 97,
- /* 340 */ 98, 26, 132, 250, 134, 19, 107, 83, 59, 23,
- /* 350 */ 211, 212, 172, 173, 172, 173, 1, 2, 84, 85,
- /* 360 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 43,
- /* 370 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- /* 380 */ 54, 55, 56, 57, 244, 152, 97, 207, 208, 207,
- /* 390 */ 208, 185, 221, 222, 223, 152, 75, 19, 77, 179,
- /* 400 */ 180, 23, 93, 94, 228, 172, 173, 231, 188, 152,
- /* 410 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
- /* 420 */ 94, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- /* 430 */ 52, 53, 54, 55, 56, 57, 193, 152, 123, 152,
- /* 440 */ 207, 208, 152, 168, 169, 170, 168, 169, 170, 19,
- /* 450 */ 160, 22, 23, 23, 164, 119, 120, 172, 173, 172,
- /* 460 */ 173, 140, 84, 85, 86, 87, 88, 89, 90, 91,
- /* 470 */ 92, 93, 94, 43, 44, 45, 46, 47, 48, 49,
- /* 480 */ 50, 51, 52, 53, 54, 55, 56, 57, 99, 22,
- /* 490 */ 23, 102, 103, 104, 194, 195, 0, 1, 2, 247,
- /* 500 */ 248, 19, 113, 190, 191, 23, 206, 190, 191, 59,
- /* 510 */ 225, 152, 83, 152, 84, 85, 86, 87, 88, 89,
- /* 520 */ 90, 91, 92, 93, 94, 43, 44, 45, 46, 47,
- /* 530 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
- /* 540 */ 90, 181, 152, 108, 109, 110, 96, 97, 98, 115,
- /* 550 */ 83, 117, 118, 19, 193, 152, 23, 152, 152, 26,
- /* 560 */ 29, 152, 172, 173, 33, 152, 84, 85, 86, 87,
- /* 570 */ 88, 89, 90, 91, 92, 93, 94, 43, 44, 45,
- /* 580 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
- /* 590 */ 56, 57, 22, 152, 16, 64, 193, 207, 152, 193,
- /* 600 */ 12, 7, 8, 9, 152, 108, 109, 110, 19, 152,
- /* 610 */ 164, 146, 147, 172, 173, 27, 163, 181, 84, 85,
- /* 620 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 59,
- /* 630 */ 42, 98, 43, 44, 45, 46, 47, 48, 49, 50,
- /* 640 */ 51, 52, 53, 54, 55, 56, 57, 238, 22, 196,
- /* 650 */ 62, 163, 82, 75, 152, 77, 152, 124, 88, 89,
- /* 660 */ 72, 152, 137, 19, 139, 152, 96, 97, 24, 152,
- /* 670 */ 152, 101, 138, 84, 85, 86, 87, 88, 89, 90,
- /* 680 */ 91, 92, 93, 94, 196, 59, 19, 43, 44, 45,
- /* 690 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
- /* 700 */ 56, 57, 132, 133, 134, 152, 193, 219, 245, 246,
- /* 710 */ 193, 152, 152, 46, 152, 19, 166, 167, 152, 217,
- /* 720 */ 232, 217, 96, 97, 98, 237, 217, 138, 84, 85,
- /* 730 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 43,
- /* 740 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- /* 750 */ 54, 55, 56, 57, 79, 193, 238, 166, 167, 211,
- /* 760 */ 212, 23, 23, 116, 26, 26, 195, 19, 121, 152,
- /* 770 */ 217, 152, 152, 152, 107, 100, 217, 206, 163, 112,
- /* 780 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
- /* 790 */ 94, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- /* 800 */ 52, 53, 54, 55, 56, 57, 187, 187, 7, 8,
- /* 810 */ 152, 196, 22, 132, 24, 134, 23, 23, 19, 26,
- /* 820 */ 26, 23, 152, 23, 26, 23, 26, 59, 26, 163,
- /* 830 */ 172, 173, 84, 85, 86, 87, 88, 89, 90, 91,
- /* 840 */ 92, 93, 94, 44, 45, 46, 47, 48, 49, 50,
- /* 850 */ 51, 52, 53, 54, 55, 56, 57, 152, 26, 238,
- /* 860 */ 152, 23, 196, 101, 26, 97, 100, 101, 19, 19,
- /* 870 */ 23, 59, 152, 26, 112, 152, 23, 172, 173, 26,
- /* 880 */ 172, 173, 19, 84, 85, 86, 87, 88, 89, 90,
- /* 890 */ 91, 92, 93, 94, 45, 46, 47, 48, 49, 50,
- /* 900 */ 51, 52, 53, 54, 55, 56, 57, 19, 20, 97,
- /* 910 */ 22, 23, 207, 163, 23, 163, 132, 26, 134, 23,
- /* 920 */ 213, 152, 26, 59, 36, 152, 22, 152, 19, 20,
- /* 930 */ 98, 22, 152, 84, 85, 86, 87, 88, 89, 90,
- /* 940 */ 91, 92, 93, 94, 94, 36, 196, 59, 196, 99,
- /* 950 */ 100, 101, 102, 103, 104, 105, 124, 59, 70, 96,
- /* 960 */ 163, 97, 112, 59, 181, 152, 152, 79, 59, 71,
- /* 970 */ 82, 19, 26, 152, 152, 152, 88, 89, 152, 70,
- /* 980 */ 22, 152, 163, 95, 96, 97, 98, 152, 79, 101,
- /* 990 */ 22, 82, 152, 196, 96, 97, 98, 88, 89, 19,
- /* 1000 */ 20, 97, 22, 163, 95, 96, 97, 98, 152, 22,
- /* 1010 */ 101, 24, 172, 173, 152, 196, 36, 59, 22, 152,
- /* 1020 */ 132, 133, 134, 135, 136, 24, 5, 59, 172, 173,
- /* 1030 */ 152, 10, 11, 12, 13, 14, 196, 152, 17, 59,
- /* 1040 */ 210, 132, 133, 134, 135, 136, 59, 207, 96, 22,
- /* 1050 */ 70, 30, 106, 32, 96, 97, 98, 172, 173, 152,
- /* 1060 */ 59, 40, 82, 152, 96, 97, 98, 152, 88, 89,
- /* 1070 */ 90, 186, 59, 22, 191, 95, 96, 97, 98, 172,
- /* 1080 */ 173, 101, 19, 20, 97, 22, 59, 152, 152, 152,
- /* 1090 */ 69, 59, 152, 186, 152, 152, 152, 76, 97, 36,
- /* 1100 */ 79, 80, 19, 20, 53, 22, 152, 172, 173, 96,
- /* 1110 */ 97, 98, 132, 133, 134, 135, 136, 35, 122, 36,
- /* 1120 */ 234, 186, 59, 96, 97, 98, 172, 173, 96, 97,
- /* 1130 */ 98, 152, 233, 70, 152, 114, 152, 124, 210, 210,
- /* 1140 */ 186, 210, 59, 198, 197, 82, 214, 65, 150, 152,
- /* 1150 */ 201, 88, 89, 70, 201, 73, 124, 239, 95, 96,
- /* 1160 */ 97, 98, 141, 239, 101, 82, 169, 170, 176, 152,
- /* 1170 */ 152, 88, 89, 21, 54, 55, 56, 57, 95, 96,
- /* 1180 */ 97, 98, 164, 214, 101, 214, 169, 170, 163, 184,
- /* 1190 */ 180, 175, 227, 111, 175, 132, 133, 134, 135, 136,
- /* 1200 */ 200, 183, 152, 185, 84, 85, 86, 87, 88, 89,
- /* 1210 */ 90, 91, 92, 93, 94, 132, 133, 134, 135, 136,
- /* 1220 */ 12, 196, 172, 173, 175, 152, 198, 230, 152, 155,
- /* 1230 */ 78, 152, 243, 152, 60, 27, 152, 159, 152, 159,
- /* 1240 */ 152, 122, 38, 152, 219, 172, 173, 230, 172, 173,
- /* 1250 */ 42, 172, 173, 172, 173, 103, 172, 173, 172, 173,
- /* 1260 */ 172, 173, 237, 172, 173, 152, 240, 152, 159, 152,
- /* 1270 */ 62, 240, 22, 220, 152, 43, 152, 130, 152, 189,
- /* 1280 */ 152, 18, 152, 18, 192, 172, 173, 172, 173, 172,
- /* 1290 */ 173, 192, 140, 152, 172, 173, 172, 173, 172, 173,
- /* 1300 */ 172, 173, 172, 173, 201, 152, 192, 159, 152, 158,
- /* 1310 */ 192, 152, 201, 172, 173, 152, 220, 152, 189, 152,
- /* 1320 */ 189, 159, 152, 137, 152, 172, 173, 152, 172, 173,
- /* 1330 */ 152, 172, 173, 152, 201, 172, 173, 172, 173, 172,
- /* 1340 */ 173, 152, 172, 173, 172, 173, 152, 172, 173, 152,
- /* 1350 */ 172, 173, 152, 172, 173, 152, 90, 152, 61, 152,
- /* 1360 */ 158, 172, 173, 152, 158, 152, 172, 173, 152, 172,
- /* 1370 */ 173, 152, 172, 173, 236, 172, 173, 172, 173, 172,
- /* 1380 */ 173, 235, 116, 172, 173, 172, 173, 121, 172, 173,
- /* 1390 */ 159, 172, 173, 159, 22, 177, 159, 158, 177, 159,
- /* 1400 */ 158, 107, 174, 174, 174, 63, 182, 106, 182, 174,
- /* 1410 */ 177, 125, 176, 107, 216, 174, 215, 174, 174, 159,
- /* 1420 */ 22, 159, 137, 224, 177, 216, 216, 215, 94, 215,
- /* 1430 */ 177, 216, 215, 129, 126, 128, 127, 25, 162, 26,
- /* 1440 */ 161, 13, 153, 205, 153, 6, 226, 151, 202, 204,
- /* 1450 */ 201, 229, 229, 151, 203, 165, 151, 165, 178, 178,
- /* 1460 */ 165, 4, 3, 22, 142, 15, 81, 16, 23, 23,
- /* 1470 */ 120, 131, 111, 20, 249, 123, 249, 16, 125, 1,
- /* 1480 */ 123, 111, 131, 53, 53, 53, 53, 96, 34, 122,
- /* 1490 */ 1, 5, 22, 107, 246, 140, 67, 26, 74, 41,
- /* 1500 */ 107, 67, 20, 24, 19, 105, 112, 23, 66, 22,
- /* 1510 */ 22, 28, 22, 22, 66, 22, 22, 37, 66, 23,
- /* 1520 */ 23, 23, 116, 23, 22, 26, 122, 26, 23, 23,
- /* 1530 */ 22, 96, 124, 26, 23, 26, 23, 34, 34, 23,
- /* 1540 */ 23, 26, 23, 22, 34, 11, 23, 22, 24, 122,
- /* 1550 */ 23, 22, 26, 22, 24, 23, 23, 15, 23, 22,
- /* 1560 */ 122, 23, 122, 1, 251, 122,
+ /* 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,
};
-#define YY_SHIFT_USE_DFLT (1566)
-#define YY_SHIFT_COUNT (454)
-#define YY_SHIFT_MIN (-84)
-#define YY_SHIFT_MAX (1562)
-static const short yy_shift_ofst[] = {
- /* 0 */ 355, 888, 1021, 909, 1063, 1063, 1063, 1063, 20, -19,
- /* 10 */ 66, 66, 170, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- /* 20 */ -7, -7, 36, 73, 69, 27, 118, 222, 274, 326,
- /* 30 */ 378, 430, 482, 534, 589, 644, 696, 696, 696, 696,
- /* 40 */ 696, 696, 696, 696, 696, 696, 696, 696, 696, 696,
- /* 50 */ 696, 696, 696, 748, 696, 799, 849, 849, 980, 1063,
- /* 60 */ 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- /* 70 */ 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- /* 80 */ 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- /* 90 */ 1083, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
- /* 100 */ 1063, 1063, 1063, 1063, -43, 1120, 1120, 1120, 1120, 1120,
- /* 110 */ -31, -72, -84, 242, 1152, 667, 210, 210, 242, 309,
- /* 120 */ 336, -55, 1566, 1566, 1566, 850, 850, 850, 626, 626,
- /* 130 */ 588, 588, 898, 221, 264, 242, 242, 242, 242, 242,
- /* 140 */ 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
- /* 150 */ 242, 242, 242, 242, 242, 496, 675, 289, 289, 336,
- /* 160 */ 0, 0, 0, 0, 0, 0, 1566, 1566, 1566, 570,
- /* 170 */ 98, 98, 958, 389, 450, 968, 1013, 1032, 1027, 242,
- /* 180 */ 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
- /* 190 */ 242, 242, 242, 242, 242, 1082, 1082, 1082, 242, 242,
- /* 200 */ 533, 242, 242, 242, 987, 242, 242, 1208, 242, 242,
- /* 210 */ 242, 242, 242, 242, 242, 242, 242, 242, 435, 531,
- /* 220 */ 1001, 1001, 1001, 832, 434, 1266, 594, 58, 863, 863,
- /* 230 */ 952, 58, 952, 946, 738, 239, 145, 863, 525, 145,
- /* 240 */ 145, 315, 647, 790, 1174, 1119, 1119, 1204, 1204, 1119,
- /* 250 */ 1250, 1232, 1147, 1263, 1263, 1263, 1263, 1119, 1265, 1147,
- /* 260 */ 1250, 1232, 1232, 1147, 1119, 1265, 1186, 1297, 1119, 1119,
- /* 270 */ 1265, 1372, 1119, 1265, 1119, 1265, 1372, 1294, 1294, 1294,
- /* 280 */ 1342, 1372, 1294, 1301, 1294, 1342, 1294, 1294, 1286, 1306,
- /* 290 */ 1286, 1306, 1286, 1306, 1286, 1306, 1119, 1398, 1119, 1285,
- /* 300 */ 1372, 1334, 1334, 1372, 1304, 1308, 1307, 1309, 1147, 1412,
- /* 310 */ 1413, 1428, 1428, 1439, 1439, 1439, 1566, 1566, 1566, 1566,
- /* 320 */ 1566, 1566, 1566, 1566, 204, 321, 429, 467, 578, 497,
- /* 330 */ 904, 739, 1051, 793, 794, 798, 800, 802, 838, 768,
- /* 340 */ 766, 801, 762, 847, 853, 812, 891, 681, 784, 896,
- /* 350 */ 864, 996, 1457, 1459, 1441, 1322, 1450, 1385, 1451, 1445,
- /* 360 */ 1446, 1350, 1340, 1361, 1352, 1453, 1353, 1461, 1478, 1357,
- /* 370 */ 1351, 1430, 1431, 1432, 1433, 1370, 1391, 1454, 1367, 1489,
- /* 380 */ 1486, 1470, 1386, 1355, 1429, 1471, 1434, 1424, 1458, 1393,
- /* 390 */ 1479, 1482, 1485, 1394, 1400, 1487, 1442, 1488, 1490, 1484,
- /* 400 */ 1491, 1448, 1483, 1493, 1452, 1480, 1496, 1497, 1498, 1499,
- /* 410 */ 1406, 1494, 1500, 1502, 1501, 1404, 1505, 1506, 1435, 1503,
- /* 420 */ 1508, 1408, 1507, 1504, 1509, 1510, 1511, 1507, 1513, 1516,
- /* 430 */ 1517, 1515, 1519, 1521, 1534, 1523, 1525, 1524, 1526, 1527,
- /* 440 */ 1529, 1530, 1526, 1532, 1531, 1533, 1535, 1537, 1427, 1438,
- /* 450 */ 1440, 1443, 1538, 1542, 1562,
+#define YY_SHIFT_COUNT (520)
+#define YY_SHIFT_MIN (0)
+#define YY_SHIFT_MAX (1858)
+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,
};
-#define YY_REDUCE_USE_DFLT (-144)
-#define YY_REDUCE_COUNT (323)
-#define YY_REDUCE_MIN (-143)
-#define YY_REDUCE_MAX (1305)
+#define YY_REDUCE_COUNT (369)
+#define YY_REDUCE_MIN (-237)
+#define YY_REDUCE_MAX (1424)
static const short yy_reduce_ofst[] = {
- /* 0 */ -143, -65, 140, 840, 76, 180, 182, 233, 488, -25,
- /* 10 */ 12, 16, 59, 885, 907, 935, 390, 705, 954, 285,
- /* 20 */ 997, 1017, 1018, -118, 1025, 139, 171, 171, 171, 171,
- /* 30 */ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- /* 40 */ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- /* 50 */ 171, 171, 171, 171, 171, 171, 171, 171, -69, 287,
- /* 60 */ 441, 658, 708, 856, 1050, 1073, 1076, 1079, 1081, 1084,
- /* 70 */ 1086, 1088, 1091, 1113, 1115, 1117, 1122, 1124, 1126, 1128,
- /* 80 */ 1130, 1141, 1153, 1156, 1159, 1163, 1165, 1167, 1170, 1172,
- /* 90 */ 1175, 1178, 1181, 1189, 1194, 1197, 1200, 1203, 1205, 1207,
- /* 100 */ 1211, 1213, 1216, 1219, 171, 171, 171, 171, 171, 171,
- /* 110 */ 171, 171, 171, 49, 176, 220, 275, 278, 290, 171,
- /* 120 */ 300, 171, 171, 171, 171, -85, -85, -85, -28, 77,
- /* 130 */ 313, 317, -56, 252, 252, 446, -129, 243, 361, 403,
- /* 140 */ 406, 513, 517, 409, 502, 518, 504, 509, 621, 553,
- /* 150 */ 562, 619, 559, 93, 620, 465, 453, 550, 591, 571,
- /* 160 */ 615, 666, 750, 752, 797, 819, 463, 548, -73, 28,
- /* 170 */ 68, 120, 257, 206, 359, 405, 413, 452, 457, 560,
- /* 180 */ 566, 617, 670, 720, 723, 769, 773, 775, 780, 813,
- /* 190 */ 814, 821, 822, 823, 826, 360, 436, 783, 829, 835,
- /* 200 */ 707, 862, 867, 878, 830, 911, 915, 883, 936, 937,
- /* 210 */ 940, 359, 942, 943, 944, 979, 982, 984, 886, 899,
- /* 220 */ 928, 929, 931, 707, 947, 945, 998, 949, 932, 969,
- /* 230 */ 918, 953, 924, 992, 1005, 1010, 1016, 971, 965, 1019,
- /* 240 */ 1049, 1000, 1028, 1074, 989, 1078, 1080, 1026, 1031, 1109,
- /* 250 */ 1053, 1090, 1103, 1092, 1099, 1114, 1118, 1148, 1151, 1111,
- /* 260 */ 1096, 1129, 1131, 1133, 1162, 1202, 1138, 1146, 1231, 1234,
- /* 270 */ 1206, 1218, 1237, 1239, 1240, 1242, 1221, 1228, 1229, 1230,
- /* 280 */ 1224, 1233, 1235, 1236, 1241, 1226, 1243, 1244, 1198, 1201,
- /* 290 */ 1209, 1212, 1210, 1214, 1215, 1217, 1260, 1199, 1262, 1220,
- /* 300 */ 1247, 1222, 1223, 1253, 1238, 1245, 1251, 1246, 1249, 1276,
- /* 310 */ 1279, 1289, 1291, 1296, 1302, 1305, 1225, 1227, 1248, 1290,
- /* 320 */ 1292, 1280, 1281, 1295,
+ /* 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,
};
static const YYACTIONTYPE yy_default[] = {
- /* 0 */ 1270, 1260, 1260, 1260, 1193, 1193, 1193, 1193, 1260, 1088,
- /* 10 */ 1117, 1117, 1244, 1322, 1322, 1322, 1322, 1322, 1322, 1192,
- /* 20 */ 1322, 1322, 1322, 1322, 1260, 1092, 1123, 1322, 1322, 1322,
- /* 30 */ 1322, 1194, 1195, 1322, 1322, 1322, 1243, 1245, 1133, 1132,
- /* 40 */ 1131, 1130, 1226, 1104, 1128, 1121, 1125, 1194, 1188, 1189,
- /* 50 */ 1187, 1191, 1195, 1322, 1124, 1158, 1172, 1157, 1322, 1322,
- /* 60 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 70 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 80 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 90 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 100 */ 1322, 1322, 1322, 1322, 1166, 1171, 1178, 1170, 1167, 1160,
- /* 110 */ 1159, 1161, 1162, 1322, 1011, 1059, 1322, 1322, 1322, 1163,
- /* 120 */ 1322, 1164, 1175, 1174, 1173, 1251, 1278, 1277, 1322, 1322,
- /* 130 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 140 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 150 */ 1322, 1322, 1322, 1322, 1322, 1270, 1260, 1017, 1017, 1322,
- /* 160 */ 1260, 1260, 1260, 1260, 1260, 1260, 1256, 1092, 1083, 1322,
- /* 170 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 180 */ 1248, 1246, 1322, 1208, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 190 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 200 */ 1322, 1322, 1322, 1322, 1088, 1322, 1322, 1322, 1322, 1322,
- /* 210 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1272, 1322, 1221,
- /* 220 */ 1088, 1088, 1088, 1090, 1072, 1082, 997, 1127, 1106, 1106,
- /* 230 */ 1311, 1127, 1311, 1034, 1292, 1031, 1117, 1106, 1190, 1117,
- /* 240 */ 1117, 1089, 1082, 1322, 1314, 1097, 1097, 1313, 1313, 1097,
- /* 250 */ 1138, 1062, 1127, 1068, 1068, 1068, 1068, 1097, 1008, 1127,
- /* 260 */ 1138, 1062, 1062, 1127, 1097, 1008, 1225, 1308, 1097, 1097,
- /* 270 */ 1008, 1201, 1097, 1008, 1097, 1008, 1201, 1060, 1060, 1060,
- /* 280 */ 1049, 1201, 1060, 1034, 1060, 1049, 1060, 1060, 1110, 1105,
- /* 290 */ 1110, 1105, 1110, 1105, 1110, 1105, 1097, 1196, 1097, 1322,
- /* 300 */ 1201, 1205, 1205, 1201, 1122, 1111, 1120, 1118, 1127, 1014,
- /* 310 */ 1052, 1275, 1275, 1271, 1271, 1271, 1319, 1319, 1256, 1287,
- /* 320 */ 1287, 1036, 1036, 1287, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 330 */ 1282, 1322, 1210, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 340 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 350 */ 1322, 1143, 1322, 993, 1253, 1322, 1322, 1252, 1322, 1322,
- /* 360 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 370 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1310, 1322,
- /* 380 */ 1322, 1322, 1322, 1322, 1322, 1224, 1223, 1322, 1322, 1322,
- /* 390 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 400 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
- /* 410 */ 1074, 1322, 1322, 1322, 1296, 1322, 1322, 1322, 1322, 1322,
- /* 420 */ 1322, 1322, 1119, 1322, 1112, 1322, 1322, 1301, 1322, 1322,
- /* 430 */ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1262, 1322,
- /* 440 */ 1322, 1322, 1261, 1322, 1322, 1322, 1322, 1322, 1145, 1322,
- /* 450 */ 1144, 1148, 1322, 1002, 1322,
+ /* 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,
};
/********** End of lemon-generated parsing tables *****************************/
@@ -137844,6 +147804,7 @@ static const YYCODETYPE yyFallback[] = {
0, /* ESCAPE => nothing */
0, /* ID => nothing */
59, /* COLUMNKW => ID */
+ 59, /* DO => ID */
59, /* FOR => ID */
59, /* IGNORE => ID */
59, /* INITIALLY => ID */
@@ -137858,11 +147819,18 @@ static const YYCODETYPE yyFallback[] = {
59, /* REPLACE => ID */
59, /* RESTRICT => ID */
59, /* ROW => ID */
+ 59, /* ROWS => ID */
59, /* TRIGGER => ID */
59, /* VACUUM => ID */
59, /* VIEW => ID */
59, /* VIRTUAL => ID */
59, /* WITH => ID */
+ 59, /* CURRENT => ID */
+ 59, /* FOLLOWING => ID */
+ 59, /* PARTITION => ID */
+ 59, /* PRECEDING => ID */
+ 59, /* RANGE => ID */
+ 59, /* UNBOUNDED => ID */
59, /* REINDEX => ID */
59, /* RENAME => ID */
59, /* CTIME_KW => ID */
@@ -137905,6 +147873,7 @@ struct yyParser {
int yyerrcnt; /* Shifts left before out of the error */
#endif
sqlite3ParserARG_SDECL /* A place to hold %extra_argument */
+ sqlite3ParserCTX_SDECL /* A place to hold %extra_context */
#if YYSTACKDEPTH<=0
int yystksz; /* Current side of the stack */
yyStackEntry *yystack; /* The parser's stack */
@@ -137948,75 +147917,289 @@ SQLITE_PRIVATE void sqlite3ParserTrace(FILE *TraceFILE, char *zTracePrompt){
}
#endif /* NDEBUG */
-#ifndef NDEBUG
+#if defined(YYCOVERAGE) || !defined(NDEBUG)
/* For tracing shifts, the names of all terminals and nonterminals
** are required. The following table supplies these names */
static const char *const yyTokenName[] = {
- "$", "SEMI", "EXPLAIN", "QUERY",
- "PLAN", "BEGIN", "TRANSACTION", "DEFERRED",
- "IMMEDIATE", "EXCLUSIVE", "COMMIT", "END",
- "ROLLBACK", "SAVEPOINT", "RELEASE", "TO",
- "TABLE", "CREATE", "IF", "NOT",
- "EXISTS", "TEMP", "LP", "RP",
- "AS", "WITHOUT", "COMMA", "ABORT",
- "ACTION", "AFTER", "ANALYZE", "ASC",
- "ATTACH", "BEFORE", "BY", "CASCADE",
- "CAST", "CONFLICT", "DATABASE", "DESC",
- "DETACH", "EACH", "FAIL", "OR",
- "AND", "IS", "MATCH", "LIKE_KW",
- "BETWEEN", "IN", "ISNULL", "NOTNULL",
- "NE", "EQ", "GT", "LE",
- "LT", "GE", "ESCAPE", "ID",
- "COLUMNKW", "FOR", "IGNORE", "INITIALLY",
- "INSTEAD", "NO", "KEY", "OF",
- "OFFSET", "PRAGMA", "RAISE", "RECURSIVE",
- "REPLACE", "RESTRICT", "ROW", "TRIGGER",
- "VACUUM", "VIEW", "VIRTUAL", "WITH",
- "REINDEX", "RENAME", "CTIME_KW", "ANY",
- "BITAND", "BITOR", "LSHIFT", "RSHIFT",
- "PLUS", "MINUS", "STAR", "SLASH",
- "REM", "CONCAT", "COLLATE", "BITNOT",
- "INDEXED", "STRING", "JOIN_KW", "CONSTRAINT",
- "DEFAULT", "NULL", "PRIMARY", "UNIQUE",
- "CHECK", "REFERENCES", "AUTOINCR", "ON",
- "INSERT", "DELETE", "UPDATE", "SET",
- "DEFERRABLE", "FOREIGN", "DROP", "UNION",
- "ALL", "EXCEPT", "INTERSECT", "SELECT",
- "VALUES", "DISTINCT", "DOT", "FROM",
- "JOIN", "USING", "ORDER", "GROUP",
- "HAVING", "LIMIT", "WHERE", "INTO",
- "FLOAT", "BLOB", "INTEGER", "VARIABLE",
- "CASE", "WHEN", "THEN", "ELSE",
- "INDEX", "ALTER", "ADD", "error",
- "input", "cmdlist", "ecmd", "explain",
- "cmdx", "cmd", "transtype", "trans_opt",
- "nm", "savepoint_opt", "create_table", "create_table_args",
- "createkw", "temp", "ifnotexists", "dbnm",
- "columnlist", "conslist_opt", "table_options", "select",
- "columnname", "carglist", "typetoken", "typename",
- "signed", "plus_num", "minus_num", "ccons",
- "term", "expr", "onconf", "sortorder",
- "autoinc", "eidlist_opt", "refargs", "defer_subclause",
- "refarg", "refact", "init_deferred_pred_opt", "conslist",
- "tconscomma", "tcons", "sortlist", "eidlist",
- "defer_subclause_opt", "orconf", "resolvetype", "raisetype",
- "ifexists", "fullname", "selectnowith", "oneselect",
- "with", "multiselect_op", "distinct", "selcollist",
- "from", "where_opt", "groupby_opt", "having_opt",
- "orderby_opt", "limit_opt", "values", "nexprlist",
- "exprlist", "sclp", "as", "seltablist",
- "stl_prefix", "joinop", "indexed_opt", "on_opt",
- "using_opt", "idlist", "setlist", "insert_cmd",
- "idlist_opt", "likeop", "between_op", "in_op",
- "paren_exprlist", "case_operand", "case_exprlist", "case_else",
- "uniqueflag", "collate", "nmnum", "trigger_decl",
- "trigger_cmd_list", "trigger_time", "trigger_event", "foreach_clause",
- "when_clause", "trigger_cmd", "trnm", "tridxby",
- "database_kw_opt", "key_opt", "add_column_fullname", "kwcolumn_opt",
- "create_vtab", "vtabarglist", "vtabarg", "vtabargtoken",
- "lp", "anylist", "wqlist",
+ /* 0 */ "$",
+ /* 1 */ "SEMI",
+ /* 2 */ "EXPLAIN",
+ /* 3 */ "QUERY",
+ /* 4 */ "PLAN",
+ /* 5 */ "BEGIN",
+ /* 6 */ "TRANSACTION",
+ /* 7 */ "DEFERRED",
+ /* 8 */ "IMMEDIATE",
+ /* 9 */ "EXCLUSIVE",
+ /* 10 */ "COMMIT",
+ /* 11 */ "END",
+ /* 12 */ "ROLLBACK",
+ /* 13 */ "SAVEPOINT",
+ /* 14 */ "RELEASE",
+ /* 15 */ "TO",
+ /* 16 */ "TABLE",
+ /* 17 */ "CREATE",
+ /* 18 */ "IF",
+ /* 19 */ "NOT",
+ /* 20 */ "EXISTS",
+ /* 21 */ "TEMP",
+ /* 22 */ "LP",
+ /* 23 */ "RP",
+ /* 24 */ "AS",
+ /* 25 */ "WITHOUT",
+ /* 26 */ "COMMA",
+ /* 27 */ "ABORT",
+ /* 28 */ "ACTION",
+ /* 29 */ "AFTER",
+ /* 30 */ "ANALYZE",
+ /* 31 */ "ASC",
+ /* 32 */ "ATTACH",
+ /* 33 */ "BEFORE",
+ /* 34 */ "BY",
+ /* 35 */ "CASCADE",
+ /* 36 */ "CAST",
+ /* 37 */ "CONFLICT",
+ /* 38 */ "DATABASE",
+ /* 39 */ "DESC",
+ /* 40 */ "DETACH",
+ /* 41 */ "EACH",
+ /* 42 */ "FAIL",
+ /* 43 */ "OR",
+ /* 44 */ "AND",
+ /* 45 */ "IS",
+ /* 46 */ "MATCH",
+ /* 47 */ "LIKE_KW",
+ /* 48 */ "BETWEEN",
+ /* 49 */ "IN",
+ /* 50 */ "ISNULL",
+ /* 51 */ "NOTNULL",
+ /* 52 */ "NE",
+ /* 53 */ "EQ",
+ /* 54 */ "GT",
+ /* 55 */ "LE",
+ /* 56 */ "LT",
+ /* 57 */ "GE",
+ /* 58 */ "ESCAPE",
+ /* 59 */ "ID",
+ /* 60 */ "COLUMNKW",
+ /* 61 */ "DO",
+ /* 62 */ "FOR",
+ /* 63 */ "IGNORE",
+ /* 64 */ "INITIALLY",
+ /* 65 */ "INSTEAD",
+ /* 66 */ "NO",
+ /* 67 */ "KEY",
+ /* 68 */ "OF",
+ /* 69 */ "OFFSET",
+ /* 70 */ "PRAGMA",
+ /* 71 */ "RAISE",
+ /* 72 */ "RECURSIVE",
+ /* 73 */ "REPLACE",
+ /* 74 */ "RESTRICT",
+ /* 75 */ "ROW",
+ /* 76 */ "ROWS",
+ /* 77 */ "TRIGGER",
+ /* 78 */ "VACUUM",
+ /* 79 */ "VIEW",
+ /* 80 */ "VIRTUAL",
+ /* 81 */ "WITH",
+ /* 82 */ "CURRENT",
+ /* 83 */ "FOLLOWING",
+ /* 84 */ "PARTITION",
+ /* 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",
};
-#endif /* NDEBUG */
+#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
#ifndef NDEBUG
/* For tracing reduce actions, the names of all rules are required.
@@ -138050,307 +148233,345 @@ static const char *const yyRuleName[] = {
/* 25 */ "typetoken ::= typename LP signed RP",
/* 26 */ "typetoken ::= typename LP signed COMMA signed RP",
/* 27 */ "typename ::= typename ID|STRING",
- /* 28 */ "ccons ::= CONSTRAINT nm",
- /* 29 */ "ccons ::= DEFAULT term",
- /* 30 */ "ccons ::= DEFAULT LP expr RP",
- /* 31 */ "ccons ::= DEFAULT PLUS term",
- /* 32 */ "ccons ::= DEFAULT MINUS term",
- /* 33 */ "ccons ::= DEFAULT ID|INDEXED",
- /* 34 */ "ccons ::= NOT NULL onconf",
- /* 35 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
- /* 36 */ "ccons ::= UNIQUE onconf",
- /* 37 */ "ccons ::= CHECK LP expr RP",
- /* 38 */ "ccons ::= REFERENCES nm eidlist_opt refargs",
- /* 39 */ "ccons ::= defer_subclause",
- /* 40 */ "ccons ::= COLLATE ID|STRING",
- /* 41 */ "autoinc ::=",
- /* 42 */ "autoinc ::= AUTOINCR",
- /* 43 */ "refargs ::=",
- /* 44 */ "refargs ::= refargs refarg",
- /* 45 */ "refarg ::= MATCH nm",
- /* 46 */ "refarg ::= ON INSERT refact",
- /* 47 */ "refarg ::= ON DELETE refact",
- /* 48 */ "refarg ::= ON UPDATE refact",
- /* 49 */ "refact ::= SET NULL",
- /* 50 */ "refact ::= SET DEFAULT",
- /* 51 */ "refact ::= CASCADE",
- /* 52 */ "refact ::= RESTRICT",
- /* 53 */ "refact ::= NO ACTION",
- /* 54 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
- /* 55 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
- /* 56 */ "init_deferred_pred_opt ::=",
- /* 57 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
- /* 58 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
- /* 59 */ "conslist_opt ::=",
- /* 60 */ "tconscomma ::= COMMA",
- /* 61 */ "tcons ::= CONSTRAINT nm",
- /* 62 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf",
- /* 63 */ "tcons ::= UNIQUE LP sortlist RP onconf",
- /* 64 */ "tcons ::= CHECK LP expr RP onconf",
- /* 65 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt",
- /* 66 */ "defer_subclause_opt ::=",
- /* 67 */ "onconf ::=",
- /* 68 */ "onconf ::= ON CONFLICT resolvetype",
- /* 69 */ "orconf ::=",
- /* 70 */ "orconf ::= OR resolvetype",
- /* 71 */ "resolvetype ::= IGNORE",
- /* 72 */ "resolvetype ::= REPLACE",
- /* 73 */ "cmd ::= DROP TABLE ifexists fullname",
- /* 74 */ "ifexists ::= IF EXISTS",
- /* 75 */ "ifexists ::=",
- /* 76 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select",
- /* 77 */ "cmd ::= DROP VIEW ifexists fullname",
- /* 78 */ "cmd ::= select",
- /* 79 */ "select ::= with selectnowith",
- /* 80 */ "selectnowith ::= selectnowith multiselect_op oneselect",
- /* 81 */ "multiselect_op ::= UNION",
- /* 82 */ "multiselect_op ::= UNION ALL",
- /* 83 */ "multiselect_op ::= EXCEPT|INTERSECT",
- /* 84 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
- /* 85 */ "values ::= VALUES LP nexprlist RP",
- /* 86 */ "values ::= values COMMA LP exprlist RP",
- /* 87 */ "distinct ::= DISTINCT",
- /* 88 */ "distinct ::= ALL",
- /* 89 */ "distinct ::=",
- /* 90 */ "sclp ::=",
- /* 91 */ "selcollist ::= sclp expr as",
- /* 92 */ "selcollist ::= sclp STAR",
- /* 93 */ "selcollist ::= sclp nm DOT STAR",
- /* 94 */ "as ::= AS nm",
- /* 95 */ "as ::=",
- /* 96 */ "from ::=",
- /* 97 */ "from ::= FROM seltablist",
- /* 98 */ "stl_prefix ::= seltablist joinop",
- /* 99 */ "stl_prefix ::=",
- /* 100 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
- /* 101 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt",
- /* 102 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
- /* 103 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
- /* 104 */ "dbnm ::=",
- /* 105 */ "dbnm ::= DOT nm",
- /* 106 */ "fullname ::= nm dbnm",
- /* 107 */ "joinop ::= COMMA|JOIN",
- /* 108 */ "joinop ::= JOIN_KW JOIN",
- /* 109 */ "joinop ::= JOIN_KW nm JOIN",
- /* 110 */ "joinop ::= JOIN_KW nm nm JOIN",
- /* 111 */ "on_opt ::= ON expr",
- /* 112 */ "on_opt ::=",
- /* 113 */ "indexed_opt ::=",
- /* 114 */ "indexed_opt ::= INDEXED BY nm",
- /* 115 */ "indexed_opt ::= NOT INDEXED",
- /* 116 */ "using_opt ::= USING LP idlist RP",
- /* 117 */ "using_opt ::=",
- /* 118 */ "orderby_opt ::=",
- /* 119 */ "orderby_opt ::= ORDER BY sortlist",
- /* 120 */ "sortlist ::= sortlist COMMA expr sortorder",
- /* 121 */ "sortlist ::= expr sortorder",
- /* 122 */ "sortorder ::= ASC",
- /* 123 */ "sortorder ::= DESC",
- /* 124 */ "sortorder ::=",
- /* 125 */ "groupby_opt ::=",
- /* 126 */ "groupby_opt ::= GROUP BY nexprlist",
- /* 127 */ "having_opt ::=",
- /* 128 */ "having_opt ::= HAVING expr",
- /* 129 */ "limit_opt ::=",
- /* 130 */ "limit_opt ::= LIMIT expr",
- /* 131 */ "limit_opt ::= LIMIT expr OFFSET expr",
- /* 132 */ "limit_opt ::= LIMIT expr COMMA expr",
- /* 133 */ "cmd ::= with DELETE FROM fullname indexed_opt where_opt",
- /* 134 */ "where_opt ::=",
- /* 135 */ "where_opt ::= WHERE expr",
- /* 136 */ "cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt",
- /* 137 */ "setlist ::= setlist COMMA nm EQ expr",
- /* 138 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
- /* 139 */ "setlist ::= nm EQ expr",
- /* 140 */ "setlist ::= LP idlist RP EQ expr",
- /* 141 */ "cmd ::= with insert_cmd INTO fullname idlist_opt select",
- /* 142 */ "cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES",
- /* 143 */ "insert_cmd ::= INSERT orconf",
- /* 144 */ "insert_cmd ::= REPLACE",
- /* 145 */ "idlist_opt ::=",
- /* 146 */ "idlist_opt ::= LP idlist RP",
- /* 147 */ "idlist ::= idlist COMMA nm",
- /* 148 */ "idlist ::= nm",
- /* 149 */ "expr ::= LP expr RP",
- /* 150 */ "expr ::= ID|INDEXED",
- /* 151 */ "expr ::= JOIN_KW",
- /* 152 */ "expr ::= nm DOT nm",
- /* 153 */ "expr ::= nm DOT nm DOT nm",
- /* 154 */ "term ::= NULL|FLOAT|BLOB",
- /* 155 */ "term ::= STRING",
- /* 156 */ "term ::= INTEGER",
- /* 157 */ "expr ::= VARIABLE",
- /* 158 */ "expr ::= expr COLLATE ID|STRING",
- /* 159 */ "expr ::= CAST LP expr AS typetoken RP",
- /* 160 */ "expr ::= ID|INDEXED LP distinct exprlist RP",
- /* 161 */ "expr ::= ID|INDEXED LP STAR RP",
- /* 162 */ "term ::= CTIME_KW",
- /* 163 */ "expr ::= LP nexprlist COMMA expr RP",
- /* 164 */ "expr ::= expr AND expr",
- /* 165 */ "expr ::= expr OR expr",
- /* 166 */ "expr ::= expr LT|GT|GE|LE expr",
- /* 167 */ "expr ::= expr EQ|NE expr",
- /* 168 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
- /* 169 */ "expr ::= expr PLUS|MINUS expr",
- /* 170 */ "expr ::= expr STAR|SLASH|REM expr",
- /* 171 */ "expr ::= expr CONCAT expr",
- /* 172 */ "likeop ::= NOT LIKE_KW|MATCH",
- /* 173 */ "expr ::= expr likeop expr",
- /* 174 */ "expr ::= expr likeop expr ESCAPE expr",
- /* 175 */ "expr ::= expr ISNULL|NOTNULL",
- /* 176 */ "expr ::= expr NOT NULL",
- /* 177 */ "expr ::= expr IS expr",
- /* 178 */ "expr ::= expr IS NOT expr",
- /* 179 */ "expr ::= NOT expr",
- /* 180 */ "expr ::= BITNOT expr",
- /* 181 */ "expr ::= MINUS expr",
- /* 182 */ "expr ::= PLUS expr",
- /* 183 */ "between_op ::= BETWEEN",
- /* 184 */ "between_op ::= NOT BETWEEN",
- /* 185 */ "expr ::= expr between_op expr AND expr",
- /* 186 */ "in_op ::= IN",
- /* 187 */ "in_op ::= NOT IN",
- /* 188 */ "expr ::= expr in_op LP exprlist RP",
- /* 189 */ "expr ::= LP select RP",
- /* 190 */ "expr ::= expr in_op LP select RP",
- /* 191 */ "expr ::= expr in_op nm dbnm paren_exprlist",
- /* 192 */ "expr ::= EXISTS LP select RP",
- /* 193 */ "expr ::= CASE case_operand case_exprlist case_else END",
- /* 194 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
- /* 195 */ "case_exprlist ::= WHEN expr THEN expr",
- /* 196 */ "case_else ::= ELSE expr",
- /* 197 */ "case_else ::=",
- /* 198 */ "case_operand ::= expr",
- /* 199 */ "case_operand ::=",
- /* 200 */ "exprlist ::=",
- /* 201 */ "nexprlist ::= nexprlist COMMA expr",
- /* 202 */ "nexprlist ::= expr",
- /* 203 */ "paren_exprlist ::=",
- /* 204 */ "paren_exprlist ::= LP exprlist RP",
- /* 205 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt",
- /* 206 */ "uniqueflag ::= UNIQUE",
- /* 207 */ "uniqueflag ::=",
- /* 208 */ "eidlist_opt ::=",
- /* 209 */ "eidlist_opt ::= LP eidlist RP",
- /* 210 */ "eidlist ::= eidlist COMMA nm collate sortorder",
- /* 211 */ "eidlist ::= nm collate sortorder",
- /* 212 */ "collate ::=",
- /* 213 */ "collate ::= COLLATE ID|STRING",
- /* 214 */ "cmd ::= DROP INDEX ifexists fullname",
- /* 215 */ "cmd ::= VACUUM",
- /* 216 */ "cmd ::= VACUUM nm",
- /* 217 */ "cmd ::= PRAGMA nm dbnm",
- /* 218 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
- /* 219 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
- /* 220 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
- /* 221 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
- /* 222 */ "plus_num ::= PLUS INTEGER|FLOAT",
- /* 223 */ "minus_num ::= MINUS INTEGER|FLOAT",
- /* 224 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
- /* 225 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
- /* 226 */ "trigger_time ::= BEFORE|AFTER",
- /* 227 */ "trigger_time ::= INSTEAD OF",
- /* 228 */ "trigger_time ::=",
- /* 229 */ "trigger_event ::= DELETE|INSERT",
- /* 230 */ "trigger_event ::= UPDATE",
- /* 231 */ "trigger_event ::= UPDATE OF idlist",
- /* 232 */ "when_clause ::=",
- /* 233 */ "when_clause ::= WHEN expr",
- /* 234 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
- /* 235 */ "trigger_cmd_list ::= trigger_cmd SEMI",
- /* 236 */ "trnm ::= nm DOT nm",
- /* 237 */ "tridxby ::= INDEXED BY nm",
- /* 238 */ "tridxby ::= NOT INDEXED",
- /* 239 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt",
- /* 240 */ "trigger_cmd ::= insert_cmd INTO trnm idlist_opt select",
- /* 241 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt",
- /* 242 */ "trigger_cmd ::= select",
- /* 243 */ "expr ::= RAISE LP IGNORE RP",
- /* 244 */ "expr ::= RAISE LP raisetype COMMA nm RP",
- /* 245 */ "raisetype ::= ROLLBACK",
- /* 246 */ "raisetype ::= ABORT",
- /* 247 */ "raisetype ::= FAIL",
- /* 248 */ "cmd ::= DROP TRIGGER ifexists fullname",
- /* 249 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
- /* 250 */ "cmd ::= DETACH database_kw_opt expr",
- /* 251 */ "key_opt ::=",
- /* 252 */ "key_opt ::= KEY expr",
- /* 253 */ "cmd ::= REINDEX",
- /* 254 */ "cmd ::= REINDEX nm dbnm",
- /* 255 */ "cmd ::= ANALYZE",
- /* 256 */ "cmd ::= ANALYZE nm dbnm",
- /* 257 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
- /* 258 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist",
- /* 259 */ "add_column_fullname ::= fullname",
- /* 260 */ "cmd ::= create_vtab",
- /* 261 */ "cmd ::= create_vtab LP vtabarglist RP",
- /* 262 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm",
- /* 263 */ "vtabarg ::=",
- /* 264 */ "vtabargtoken ::= ANY",
- /* 265 */ "vtabargtoken ::= lp anylist RP",
- /* 266 */ "lp ::= LP",
- /* 267 */ "with ::=",
- /* 268 */ "with ::= WITH wqlist",
- /* 269 */ "with ::= WITH RECURSIVE wqlist",
- /* 270 */ "wqlist ::= nm eidlist_opt AS LP select RP",
- /* 271 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP",
- /* 272 */ "input ::= cmdlist",
- /* 273 */ "cmdlist ::= cmdlist ecmd",
- /* 274 */ "cmdlist ::= ecmd",
- /* 275 */ "ecmd ::= SEMI",
- /* 276 */ "ecmd ::= explain cmdx SEMI",
- /* 277 */ "explain ::=",
- /* 278 */ "trans_opt ::=",
- /* 279 */ "trans_opt ::= TRANSACTION",
- /* 280 */ "trans_opt ::= TRANSACTION nm",
- /* 281 */ "savepoint_opt ::= SAVEPOINT",
- /* 282 */ "savepoint_opt ::=",
- /* 283 */ "cmd ::= create_table create_table_args",
- /* 284 */ "columnlist ::= columnlist COMMA columnname carglist",
- /* 285 */ "columnlist ::= columnname carglist",
- /* 286 */ "nm ::= ID|INDEXED",
- /* 287 */ "nm ::= STRING",
- /* 288 */ "nm ::= JOIN_KW",
- /* 289 */ "typetoken ::= typename",
- /* 290 */ "typename ::= ID|STRING",
- /* 291 */ "signed ::= plus_num",
- /* 292 */ "signed ::= minus_num",
- /* 293 */ "carglist ::= carglist ccons",
- /* 294 */ "carglist ::=",
- /* 295 */ "ccons ::= NULL onconf",
- /* 296 */ "conslist_opt ::= COMMA conslist",
- /* 297 */ "conslist ::= conslist tconscomma tcons",
- /* 298 */ "conslist ::= tcons",
- /* 299 */ "tconscomma ::=",
- /* 300 */ "defer_subclause_opt ::= defer_subclause",
- /* 301 */ "resolvetype ::= raisetype",
- /* 302 */ "selectnowith ::= oneselect",
- /* 303 */ "oneselect ::= values",
- /* 304 */ "sclp ::= selcollist COMMA",
- /* 305 */ "as ::= ID|STRING",
- /* 306 */ "expr ::= term",
- /* 307 */ "likeop ::= LIKE_KW|MATCH",
- /* 308 */ "exprlist ::= nexprlist",
- /* 309 */ "nmnum ::= plus_num",
- /* 310 */ "nmnum ::= nm",
- /* 311 */ "nmnum ::= ON",
- /* 312 */ "nmnum ::= DELETE",
- /* 313 */ "nmnum ::= DEFAULT",
- /* 314 */ "plus_num ::= INTEGER|FLOAT",
- /* 315 */ "foreach_clause ::=",
- /* 316 */ "foreach_clause ::= FOR EACH ROW",
- /* 317 */ "trnm ::= nm",
- /* 318 */ "tridxby ::=",
- /* 319 */ "database_kw_opt ::= DATABASE",
- /* 320 */ "database_kw_opt ::=",
- /* 321 */ "kwcolumn_opt ::=",
- /* 322 */ "kwcolumn_opt ::= COLUMNKW",
- /* 323 */ "vtabarglist ::= vtabarg",
- /* 324 */ "vtabarglist ::= vtabarglist COMMA vtabarg",
- /* 325 */ "vtabarg ::= vtabarg vtabargtoken",
- /* 326 */ "anylist ::=",
- /* 327 */ "anylist ::= anylist LP anylist RP",
- /* 328 */ "anylist ::= anylist ANY",
+ /* 28 */ "scanpt ::=",
+ /* 29 */ "ccons ::= CONSTRAINT nm",
+ /* 30 */ "ccons ::= DEFAULT scanpt term scanpt",
+ /* 31 */ "ccons ::= DEFAULT LP expr RP",
+ /* 32 */ "ccons ::= DEFAULT PLUS term scanpt",
+ /* 33 */ "ccons ::= DEFAULT MINUS term scanpt",
+ /* 34 */ "ccons ::= DEFAULT scanpt ID|INDEXED",
+ /* 35 */ "ccons ::= NOT NULL onconf",
+ /* 36 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
+ /* 37 */ "ccons ::= UNIQUE onconf",
+ /* 38 */ "ccons ::= CHECK LP expr RP",
+ /* 39 */ "ccons ::= REFERENCES nm eidlist_opt refargs",
+ /* 40 */ "ccons ::= defer_subclause",
+ /* 41 */ "ccons ::= COLLATE ID|STRING",
+ /* 42 */ "autoinc ::=",
+ /* 43 */ "autoinc ::= AUTOINCR",
+ /* 44 */ "refargs ::=",
+ /* 45 */ "refargs ::= refargs refarg",
+ /* 46 */ "refarg ::= MATCH nm",
+ /* 47 */ "refarg ::= ON INSERT refact",
+ /* 48 */ "refarg ::= ON DELETE refact",
+ /* 49 */ "refarg ::= ON UPDATE refact",
+ /* 50 */ "refact ::= SET NULL",
+ /* 51 */ "refact ::= SET DEFAULT",
+ /* 52 */ "refact ::= CASCADE",
+ /* 53 */ "refact ::= RESTRICT",
+ /* 54 */ "refact ::= NO ACTION",
+ /* 55 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
+ /* 56 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
+ /* 57 */ "init_deferred_pred_opt ::=",
+ /* 58 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
+ /* 59 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
+ /* 60 */ "conslist_opt ::=",
+ /* 61 */ "tconscomma ::= COMMA",
+ /* 62 */ "tcons ::= CONSTRAINT nm",
+ /* 63 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf",
+ /* 64 */ "tcons ::= UNIQUE LP sortlist RP onconf",
+ /* 65 */ "tcons ::= CHECK LP expr RP onconf",
+ /* 66 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt",
+ /* 67 */ "defer_subclause_opt ::=",
+ /* 68 */ "onconf ::=",
+ /* 69 */ "onconf ::= ON CONFLICT resolvetype",
+ /* 70 */ "orconf ::=",
+ /* 71 */ "orconf ::= OR resolvetype",
+ /* 72 */ "resolvetype ::= IGNORE",
+ /* 73 */ "resolvetype ::= REPLACE",
+ /* 74 */ "cmd ::= DROP TABLE ifexists fullname",
+ /* 75 */ "ifexists ::= IF EXISTS",
+ /* 76 */ "ifexists ::=",
+ /* 77 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select",
+ /* 78 */ "cmd ::= DROP VIEW ifexists fullname",
+ /* 79 */ "cmd ::= select",
+ /* 80 */ "select ::= WITH wqlist selectnowith",
+ /* 81 */ "select ::= WITH RECURSIVE wqlist selectnowith",
+ /* 82 */ "select ::= selectnowith",
+ /* 83 */ "selectnowith ::= selectnowith multiselect_op oneselect",
+ /* 84 */ "multiselect_op ::= UNION",
+ /* 85 */ "multiselect_op ::= UNION ALL",
+ /* 86 */ "multiselect_op ::= EXCEPT|INTERSECT",
+ /* 87 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
+ /* 88 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt",
+ /* 89 */ "values ::= VALUES LP nexprlist RP",
+ /* 90 */ "values ::= values COMMA LP nexprlist RP",
+ /* 91 */ "distinct ::= DISTINCT",
+ /* 92 */ "distinct ::= ALL",
+ /* 93 */ "distinct ::=",
+ /* 94 */ "sclp ::=",
+ /* 95 */ "selcollist ::= sclp scanpt expr scanpt as",
+ /* 96 */ "selcollist ::= sclp scanpt STAR",
+ /* 97 */ "selcollist ::= sclp scanpt nm DOT STAR",
+ /* 98 */ "as ::= AS nm",
+ /* 99 */ "as ::=",
+ /* 100 */ "from ::=",
+ /* 101 */ "from ::= FROM seltablist",
+ /* 102 */ "stl_prefix ::= seltablist joinop",
+ /* 103 */ "stl_prefix ::=",
+ /* 104 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
+ /* 105 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt",
+ /* 106 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
+ /* 107 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
+ /* 108 */ "dbnm ::=",
+ /* 109 */ "dbnm ::= DOT nm",
+ /* 110 */ "fullname ::= nm",
+ /* 111 */ "fullname ::= nm DOT nm",
+ /* 112 */ "xfullname ::= nm",
+ /* 113 */ "xfullname ::= nm DOT nm",
+ /* 114 */ "xfullname ::= nm DOT nm AS nm",
+ /* 115 */ "xfullname ::= nm AS nm",
+ /* 116 */ "joinop ::= COMMA|JOIN",
+ /* 117 */ "joinop ::= JOIN_KW JOIN",
+ /* 118 */ "joinop ::= JOIN_KW nm JOIN",
+ /* 119 */ "joinop ::= JOIN_KW nm nm JOIN",
+ /* 120 */ "on_opt ::= ON expr",
+ /* 121 */ "on_opt ::=",
+ /* 122 */ "indexed_opt ::=",
+ /* 123 */ "indexed_opt ::= INDEXED BY nm",
+ /* 124 */ "indexed_opt ::= NOT INDEXED",
+ /* 125 */ "using_opt ::= USING LP idlist RP",
+ /* 126 */ "using_opt ::=",
+ /* 127 */ "orderby_opt ::=",
+ /* 128 */ "orderby_opt ::= ORDER BY sortlist",
+ /* 129 */ "sortlist ::= sortlist COMMA expr sortorder",
+ /* 130 */ "sortlist ::= expr sortorder",
+ /* 131 */ "sortorder ::= ASC",
+ /* 132 */ "sortorder ::= DESC",
+ /* 133 */ "sortorder ::=",
+ /* 134 */ "groupby_opt ::=",
+ /* 135 */ "groupby_opt ::= GROUP BY nexprlist",
+ /* 136 */ "having_opt ::=",
+ /* 137 */ "having_opt ::= HAVING expr",
+ /* 138 */ "limit_opt ::=",
+ /* 139 */ "limit_opt ::= LIMIT expr",
+ /* 140 */ "limit_opt ::= LIMIT expr OFFSET expr",
+ /* 141 */ "limit_opt ::= LIMIT expr COMMA expr",
+ /* 142 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt",
+ /* 143 */ "where_opt ::=",
+ /* 144 */ "where_opt ::= WHERE expr",
+ /* 145 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt",
+ /* 146 */ "setlist ::= setlist COMMA nm EQ expr",
+ /* 147 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
+ /* 148 */ "setlist ::= nm EQ expr",
+ /* 149 */ "setlist ::= LP idlist RP EQ expr",
+ /* 150 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert",
+ /* 151 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES",
+ /* 152 */ "upsert ::=",
+ /* 153 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt",
+ /* 154 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING",
+ /* 155 */ "upsert ::= ON CONFLICT DO NOTHING",
+ /* 156 */ "insert_cmd ::= INSERT orconf",
+ /* 157 */ "insert_cmd ::= REPLACE",
+ /* 158 */ "idlist_opt ::=",
+ /* 159 */ "idlist_opt ::= LP idlist RP",
+ /* 160 */ "idlist ::= idlist COMMA nm",
+ /* 161 */ "idlist ::= nm",
+ /* 162 */ "expr ::= LP expr RP",
+ /* 163 */ "expr ::= ID|INDEXED",
+ /* 164 */ "expr ::= JOIN_KW",
+ /* 165 */ "expr ::= nm DOT nm",
+ /* 166 */ "expr ::= nm DOT nm DOT nm",
+ /* 167 */ "term ::= NULL|FLOAT|BLOB",
+ /* 168 */ "term ::= STRING",
+ /* 169 */ "term ::= INTEGER",
+ /* 170 */ "expr ::= VARIABLE",
+ /* 171 */ "expr ::= expr COLLATE ID|STRING",
+ /* 172 */ "expr ::= CAST LP expr AS typetoken RP",
+ /* 173 */ "expr ::= ID|INDEXED LP distinct exprlist RP",
+ /* 174 */ "expr ::= ID|INDEXED LP STAR RP",
+ /* 175 */ "expr ::= ID|INDEXED LP distinct exprlist RP over_clause",
+ /* 176 */ "expr ::= ID|INDEXED LP STAR RP over_clause",
+ /* 177 */ "term ::= CTIME_KW",
+ /* 178 */ "expr ::= LP nexprlist COMMA expr RP",
+ /* 179 */ "expr ::= expr AND expr",
+ /* 180 */ "expr ::= expr OR expr",
+ /* 181 */ "expr ::= expr LT|GT|GE|LE expr",
+ /* 182 */ "expr ::= expr EQ|NE expr",
+ /* 183 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
+ /* 184 */ "expr ::= expr PLUS|MINUS expr",
+ /* 185 */ "expr ::= expr STAR|SLASH|REM expr",
+ /* 186 */ "expr ::= expr CONCAT expr",
+ /* 187 */ "likeop ::= NOT LIKE_KW|MATCH",
+ /* 188 */ "expr ::= expr likeop expr",
+ /* 189 */ "expr ::= expr likeop expr ESCAPE expr",
+ /* 190 */ "expr ::= expr ISNULL|NOTNULL",
+ /* 191 */ "expr ::= expr NOT NULL",
+ /* 192 */ "expr ::= expr IS expr",
+ /* 193 */ "expr ::= expr IS NOT expr",
+ /* 194 */ "expr ::= NOT expr",
+ /* 195 */ "expr ::= BITNOT expr",
+ /* 196 */ "expr ::= PLUS|MINUS expr",
+ /* 197 */ "between_op ::= BETWEEN",
+ /* 198 */ "between_op ::= NOT BETWEEN",
+ /* 199 */ "expr ::= expr between_op expr AND expr",
+ /* 200 */ "in_op ::= IN",
+ /* 201 */ "in_op ::= NOT IN",
+ /* 202 */ "expr ::= expr in_op LP exprlist RP",
+ /* 203 */ "expr ::= LP select RP",
+ /* 204 */ "expr ::= expr in_op LP select RP",
+ /* 205 */ "expr ::= expr in_op nm dbnm paren_exprlist",
+ /* 206 */ "expr ::= EXISTS LP select RP",
+ /* 207 */ "expr ::= CASE case_operand case_exprlist case_else END",
+ /* 208 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
+ /* 209 */ "case_exprlist ::= WHEN expr THEN expr",
+ /* 210 */ "case_else ::= ELSE expr",
+ /* 211 */ "case_else ::=",
+ /* 212 */ "case_operand ::= expr",
+ /* 213 */ "case_operand ::=",
+ /* 214 */ "exprlist ::=",
+ /* 215 */ "nexprlist ::= nexprlist COMMA expr",
+ /* 216 */ "nexprlist ::= expr",
+ /* 217 */ "paren_exprlist ::=",
+ /* 218 */ "paren_exprlist ::= LP exprlist RP",
+ /* 219 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt",
+ /* 220 */ "uniqueflag ::= UNIQUE",
+ /* 221 */ "uniqueflag ::=",
+ /* 222 */ "eidlist_opt ::=",
+ /* 223 */ "eidlist_opt ::= LP eidlist RP",
+ /* 224 */ "eidlist ::= eidlist COMMA nm collate sortorder",
+ /* 225 */ "eidlist ::= nm collate sortorder",
+ /* 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 ::=",
};
#endif /* NDEBUG */
@@ -138399,28 +148620,29 @@ static int yyGrowStack(yyParser *p){
/* Initialize a new parser that has already been allocated.
*/
-SQLITE_PRIVATE void sqlite3ParserInit(void *yypParser){
- yyParser *pParser = (yyParser*)yypParser;
+SQLITE_PRIVATE void sqlite3ParserInit(void *yypRawParser sqlite3ParserCTX_PDECL){
+ yyParser *yypParser = (yyParser*)yypRawParser;
+ sqlite3ParserCTX_STORE
#ifdef YYTRACKMAXSTACKDEPTH
- pParser->yyhwm = 0;
+ yypParser->yyhwm = 0;
#endif
#if YYSTACKDEPTH<=0
- pParser->yytos = NULL;
- pParser->yystack = NULL;
- pParser->yystksz = 0;
- if( yyGrowStack(pParser) ){
- pParser->yystack = &pParser->yystk0;
- pParser->yystksz = 1;
+ yypParser->yytos = NULL;
+ yypParser->yystack = NULL;
+ yypParser->yystksz = 0;
+ if( yyGrowStack(yypParser) ){
+ yypParser->yystack = &yypParser->yystk0;
+ yypParser->yystksz = 1;
}
#endif
#ifndef YYNOERRORRECOVERY
- pParser->yyerrcnt = -1;
+ yypParser->yyerrcnt = -1;
#endif
- pParser->yytos = pParser->yystack;
- pParser->yystack[0].stateno = 0;
- pParser->yystack[0].major = 0;
+ yypParser->yytos = yypParser->yystack;
+ yypParser->yystack[0].stateno = 0;
+ yypParser->yystack[0].major = 0;
#if YYSTACKDEPTH>0
- pParser->yystackEnd = &pParser->yystack[YYSTACKDEPTH-1];
+ yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1];
#endif
}
@@ -138437,11 +148659,14 @@ SQLITE_PRIVATE void sqlite3ParserInit(void *yypParser){
** A pointer to a parser. This pointer is used in subsequent calls
** to sqlite3Parser and sqlite3ParserFree.
*/
-SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){
- yyParser *pParser;
- pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) );
- if( pParser ) sqlite3ParserInit(pParser);
- return pParser;
+SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE) sqlite3ParserCTX_PDECL){
+ yyParser *yypParser;
+ yypParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) );
+ if( yypParser ){
+ sqlite3ParserCTX_STORE
+ sqlite3ParserInit(yypParser sqlite3ParserCTX_PARAM);
+ }
+ return (void*)yypParser;
}
#endif /* sqlite3Parser_ENGINEALWAYSONSTACK */
@@ -138458,7 +148683,8 @@ static void yy_destructor(
YYCODETYPE yymajor, /* Type code for object to destroy */
YYMINORTYPE *yypminor /* The object to be destroyed */
){
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ sqlite3ParserCTX_FETCH
switch( yymajor ){
/* Here is inserted the actions which take place when a
** terminal or non-terminal is destroyed. This can happen
@@ -138471,77 +148697,96 @@ static void yy_destructor(
** inside the C code.
*/
/********* Begin destructor definitions ***************************************/
- case 163: /* select */
- case 194: /* selectnowith */
- case 195: /* oneselect */
- case 206: /* values */
+ case 174: /* select */
+ case 206: /* selectnowith */
+ case 207: /* oneselect */
+ case 219: /* values */
+{
+sqlite3SelectDelete(pParse->db, (yypminor->yy489));
+}
+ 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 */
{
-sqlite3SelectDelete(pParse->db, (yypminor->yy243));
+sqlite3ExprDelete(pParse->db, (yypminor->yy18));
}
break;
- case 172: /* term */
- case 173: /* expr */
+ 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 */
{
-sqlite3ExprDelete(pParse->db, (yypminor->yy190).pExpr);
+sqlite3ExprListDelete(pParse->db, (yypminor->yy420));
}
break;
- case 177: /* eidlist_opt */
- case 186: /* sortlist */
- case 187: /* eidlist */
- case 199: /* selcollist */
- case 202: /* groupby_opt */
- case 204: /* orderby_opt */
- case 207: /* nexprlist */
- case 208: /* exprlist */
- case 209: /* sclp */
- case 218: /* setlist */
- case 224: /* paren_exprlist */
- case 226: /* case_exprlist */
+ case 205: /* fullname */
+ case 212: /* from */
+ case 223: /* seltablist */
+ case 224: /* stl_prefix */
+ case 230: /* xfullname */
{
-sqlite3ExprListDelete(pParse->db, (yypminor->yy148));
+sqlite3SrcListDelete(pParse->db, (yypminor->yy135));
}
break;
- case 193: /* fullname */
- case 200: /* from */
- case 211: /* seltablist */
- case 212: /* stl_prefix */
+ case 208: /* wqlist */
{
-sqlite3SrcListDelete(pParse->db, (yypminor->yy185));
+sqlite3WithDelete(pParse->db, (yypminor->yy449));
}
break;
- case 196: /* with */
- case 250: /* wqlist */
+ case 218: /* window_clause */
+ case 267: /* windowdefn_list */
{
-sqlite3WithDelete(pParse->db, (yypminor->yy285));
+sqlite3WindowListDelete(pParse->db, (yypminor->yy327));
}
break;
- case 201: /* where_opt */
- case 203: /* having_opt */
- case 215: /* on_opt */
- case 225: /* case_operand */
- case 227: /* case_else */
- case 236: /* when_clause */
- case 241: /* key_opt */
+ case 228: /* using_opt */
+ case 231: /* idlist */
+ case 235: /* idlist_opt */
{
-sqlite3ExprDelete(pParse->db, (yypminor->yy72));
+sqlite3IdListDelete(pParse->db, (yypminor->yy48));
}
break;
- case 216: /* using_opt */
- case 217: /* idlist */
- case 220: /* idlist_opt */
+ case 237: /* over_clause */
+ case 268: /* windowdefn */
+ case 269: /* window */
+ case 270: /* frame_opt */
{
-sqlite3IdListDelete(pParse->db, (yypminor->yy254));
+sqlite3WindowDelete(pParse->db, (yypminor->yy327));
}
break;
- case 232: /* trigger_cmd_list */
- case 237: /* trigger_cmd */
+ case 249: /* trigger_cmd_list */
+ case 254: /* trigger_cmd */
{
-sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy145));
+sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy207));
}
break;
- case 234: /* trigger_event */
+ case 251: /* trigger_event */
{
-sqlite3IdListDelete(pParse->db, (yypminor->yy332).b);
+sqlite3IdListDelete(pParse->db, (yypminor->yy34).b);
+}
+ break;
+ case 274: /* frame_bound */
+ case 275: /* frame_bound_s */
+ case 276: /* frame_bound_e */
+{
+sqlite3ExprDelete(pParse->db, (yypminor->yy119).pExpr);
}
break;
/********* End destructor definitions *****************************************/
@@ -138612,24 +148857,66 @@ SQLITE_PRIVATE int sqlite3ParserStackPeak(void *p){
}
#endif
+/* This array of booleans keeps track of the parser statement
+** coverage. The element yycoverage[X][Y] is set when the parser
+** is in state X and has a lookahead token Y. In a well-tested
+** systems, every element of this matrix should end up being set.
+*/
+#if defined(YYCOVERAGE)
+static unsigned char yycoverage[YYNSTATE][YYNTOKEN];
+#endif
+
+/*
+** Write into out a description of every state/lookahead combination that
+**
+** (1) has not been used by the parser, and
+** (2) is not a syntax error.
+**
+** Return the number of missed state/lookahead combinations.
+*/
+#if defined(YYCOVERAGE)
+SQLITE_PRIVATE int sqlite3ParserCoverage(FILE *out){
+ int stateno, iLookAhead, i;
+ int nMissed = 0;
+ for(stateno=0; stateno<YYNSTATE; stateno++){
+ i = yy_shift_ofst[stateno];
+ for(iLookAhead=0; iLookAhead<YYNTOKEN; iLookAhead++){
+ if( yy_lookahead[i+iLookAhead]!=iLookAhead ) continue;
+ if( yycoverage[stateno][iLookAhead]==0 ) nMissed++;
+ if( out ){
+ fprintf(out,"State %d lookahead %s %s\n", stateno,
+ yyTokenName[iLookAhead],
+ yycoverage[stateno][iLookAhead] ? "ok" : "missed");
+ }
+ }
+ }
+ return nMissed;
+}
+#endif
+
/*
** Find the appropriate action for a parser given the terminal
** look-ahead token iLookAhead.
*/
-static unsigned int yy_find_shift_action(
- yyParser *pParser, /* The parser */
- YYCODETYPE iLookAhead /* The look-ahead token */
+static YYACTIONTYPE yy_find_shift_action(
+ YYCODETYPE iLookAhead, /* The look-ahead token */
+ YYACTIONTYPE stateno /* Current state number */
){
int i;
- int stateno = pParser->yytos->stateno;
-
- if( stateno>=YY_MIN_REDUCE ) return stateno;
+
+ if( stateno>YY_MAX_SHIFT ) return stateno;
assert( stateno <= YY_SHIFT_COUNT );
+#if defined(YYCOVERAGE)
+ yycoverage[stateno][iLookAhead] = 1;
+#endif
do{
i = yy_shift_ofst[stateno];
+ assert( i>=0 );
+ /* assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); */
assert( iLookAhead!=YYNOCODE );
+ assert( iLookAhead < YYNTOKEN );
i += iLookAhead;
- if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
+ if( i>=YY_NLOOKAHEAD || yy_lookahead[i]!=iLookAhead ){
#ifdef YYFALLBACK
YYCODETYPE iFallback; /* Fallback token */
if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
@@ -138655,6 +148942,7 @@ static unsigned int yy_find_shift_action(
#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT
j<YY_ACTTAB_COUNT &&
#endif
+ j<(int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])) &&
yy_lookahead[j]==YYWILDCARD && iLookAhead>0
){
#ifndef NDEBUG
@@ -138679,8 +148967,8 @@ static unsigned int yy_find_shift_action(
** Find the appropriate action for a parser given the non-terminal
** look-ahead token iLookAhead.
*/
-static int yy_find_reduce_action(
- int stateno, /* Current state number */
+static YYACTIONTYPE yy_find_reduce_action(
+ YYACTIONTYPE stateno, /* Current state number */
YYCODETYPE iLookAhead /* The look-ahead token */
){
int i;
@@ -138692,7 +148980,6 @@ static int yy_find_reduce_action(
assert( stateno<=YY_REDUCE_COUNT );
#endif
i = yy_reduce_ofst[stateno];
- assert( i!=YY_REDUCE_USE_DFLT );
assert( iLookAhead!=YYNOCODE );
i += iLookAhead;
#ifdef YYERRORSYMBOL
@@ -138710,7 +148997,8 @@ static int yy_find_reduce_action(
** The following routine is called if the stack overflows.
*/
static void yyStackOverflow(yyParser *yypParser){
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ sqlite3ParserCTX_FETCH
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
@@ -138723,27 +149011,29 @@ static void yyStackOverflow(yyParser *yypParser){
sqlite3ErrorMsg(pParse, "parser stack overflow");
/******** End %stack_overflow code ********************************************/
- sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument var */
+ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument var */
+ sqlite3ParserCTX_STORE
}
/*
** Print tracing information for a SHIFT action
*/
#ifndef NDEBUG
-static void yyTraceShift(yyParser *yypParser, int yyNewState){
+static void yyTraceShift(yyParser *yypParser, int yyNewState, const char *zTag){
if( yyTraceFILE ){
if( yyNewState<YYNSTATE ){
- fprintf(yyTraceFILE,"%sShift '%s', go to state %d\n",
- yyTracePrompt,yyTokenName[yypParser->yytos->major],
+ fprintf(yyTraceFILE,"%s%s '%s', go to state %d\n",
+ yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major],
yyNewState);
}else{
- fprintf(yyTraceFILE,"%sShift '%s'\n",
- yyTracePrompt,yyTokenName[yypParser->yytos->major]);
+ fprintf(yyTraceFILE,"%s%s '%s', pending reduce %d\n",
+ yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major],
+ yyNewState - YY_MIN_REDUCE);
}
}
}
#else
-# define yyTraceShift(X,Y)
+# define yyTraceShift(X,Y,Z)
#endif
/*
@@ -138751,8 +149041,8 @@ static void yyTraceShift(yyParser *yypParser, int yyNewState){
*/
static void yy_shift(
yyParser *yypParser, /* The parser to be shifted */
- int yyNewState, /* The new state to shift in */
- int yyMajor, /* The major token to shift in */
+ YYACTIONTYPE yyNewState, /* The new state to shift in */
+ YYCODETYPE yyMajor, /* The major token to shift in */
sqlite3ParserTOKENTYPE yyMinor /* The minor token to shift in */
){
yyStackEntry *yytos;
@@ -138782,10 +149072,10 @@ static void yy_shift(
yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE;
}
yytos = yypParser->yytos;
- yytos->stateno = (YYACTIONTYPE)yyNewState;
- yytos->major = (YYCODETYPE)yyMajor;
+ yytos->stateno = yyNewState;
+ yytos->major = yyMajor;
yytos->minor.yy0 = yyMinor;
- yyTraceShift(yypParser, yyNewState);
+ yyTraceShift(yypParser, yyNewState, "Shift");
}
/* The following table contains information about every rule that
@@ -138795,335 +149085,373 @@ 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[] = {
- { 147, -1 },
- { 147, -3 },
- { 148, -1 },
- { 149, -3 },
- { 150, 0 },
- { 150, -1 },
- { 150, -1 },
- { 150, -1 },
- { 149, -2 },
- { 149, -2 },
- { 149, -2 },
- { 149, -3 },
- { 149, -5 },
- { 154, -6 },
- { 156, -1 },
- { 158, 0 },
- { 158, -3 },
- { 157, -1 },
- { 157, 0 },
- { 155, -5 },
- { 155, -2 },
- { 162, 0 },
- { 162, -2 },
- { 164, -2 },
- { 166, 0 },
- { 166, -4 },
- { 166, -6 },
- { 167, -2 },
- { 171, -2 },
- { 171, -2 },
- { 171, -4 },
- { 171, -3 },
- { 171, -3 },
- { 171, -2 },
- { 171, -3 },
- { 171, -5 },
- { 171, -2 },
- { 171, -4 },
- { 171, -4 },
- { 171, -1 },
- { 171, -2 },
- { 176, 0 },
- { 176, -1 },
- { 178, 0 },
- { 178, -2 },
- { 180, -2 },
- { 180, -3 },
- { 180, -3 },
- { 180, -3 },
- { 181, -2 },
- { 181, -2 },
- { 181, -1 },
- { 181, -1 },
- { 181, -2 },
- { 179, -3 },
- { 179, -2 },
- { 182, 0 },
- { 182, -2 },
- { 182, -2 },
- { 161, 0 },
- { 184, -1 },
- { 185, -2 },
- { 185, -7 },
- { 185, -5 },
- { 185, -5 },
- { 185, -10 },
- { 188, 0 },
- { 174, 0 },
- { 174, -3 },
- { 189, 0 },
- { 189, -2 },
- { 190, -1 },
- { 190, -1 },
- { 149, -4 },
- { 192, -2 },
- { 192, 0 },
- { 149, -9 },
- { 149, -4 },
- { 149, -1 },
- { 163, -2 },
- { 194, -3 },
- { 197, -1 },
- { 197, -2 },
- { 197, -1 },
- { 195, -9 },
- { 206, -4 },
- { 206, -5 },
- { 198, -1 },
- { 198, -1 },
- { 198, 0 },
- { 209, 0 },
- { 199, -3 },
- { 199, -2 },
- { 199, -4 },
- { 210, -2 },
- { 210, 0 },
- { 200, 0 },
- { 200, -2 },
- { 212, -2 },
- { 212, 0 },
- { 211, -7 },
- { 211, -9 },
- { 211, -7 },
- { 211, -7 },
- { 159, 0 },
- { 159, -2 },
- { 193, -2 },
- { 213, -1 },
- { 213, -2 },
- { 213, -3 },
- { 213, -4 },
- { 215, -2 },
- { 215, 0 },
- { 214, 0 },
- { 214, -3 },
- { 214, -2 },
- { 216, -4 },
- { 216, 0 },
- { 204, 0 },
- { 204, -3 },
- { 186, -4 },
- { 186, -2 },
- { 175, -1 },
- { 175, -1 },
- { 175, 0 },
- { 202, 0 },
- { 202, -3 },
- { 203, 0 },
- { 203, -2 },
- { 205, 0 },
- { 205, -2 },
- { 205, -4 },
- { 205, -4 },
- { 149, -6 },
- { 201, 0 },
- { 201, -2 },
- { 149, -8 },
- { 218, -5 },
- { 218, -7 },
- { 218, -3 },
- { 218, -5 },
- { 149, -6 },
- { 149, -7 },
- { 219, -2 },
- { 219, -1 },
- { 220, 0 },
- { 220, -3 },
- { 217, -3 },
- { 217, -1 },
- { 173, -3 },
- { 173, -1 },
- { 173, -1 },
- { 173, -3 },
- { 173, -5 },
- { 172, -1 },
- { 172, -1 },
- { 172, -1 },
- { 173, -1 },
- { 173, -3 },
- { 173, -6 },
- { 173, -5 },
- { 173, -4 },
- { 172, -1 },
- { 173, -5 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 173, -3 },
- { 221, -2 },
- { 173, -3 },
- { 173, -5 },
- { 173, -2 },
- { 173, -3 },
- { 173, -3 },
- { 173, -4 },
- { 173, -2 },
- { 173, -2 },
- { 173, -2 },
- { 173, -2 },
- { 222, -1 },
- { 222, -2 },
- { 173, -5 },
- { 223, -1 },
- { 223, -2 },
- { 173, -5 },
- { 173, -3 },
- { 173, -5 },
- { 173, -5 },
- { 173, -4 },
- { 173, -5 },
- { 226, -5 },
- { 226, -4 },
- { 227, -2 },
- { 227, 0 },
- { 225, -1 },
- { 225, 0 },
- { 208, 0 },
- { 207, -3 },
- { 207, -1 },
- { 224, 0 },
- { 224, -3 },
- { 149, -12 },
- { 228, -1 },
- { 228, 0 },
- { 177, 0 },
- { 177, -3 },
- { 187, -5 },
- { 187, -3 },
- { 229, 0 },
- { 229, -2 },
- { 149, -4 },
- { 149, -1 },
- { 149, -2 },
- { 149, -3 },
- { 149, -5 },
- { 149, -6 },
- { 149, -5 },
- { 149, -6 },
- { 169, -2 },
- { 170, -2 },
- { 149, -5 },
- { 231, -11 },
- { 233, -1 },
- { 233, -2 },
- { 233, 0 },
- { 234, -1 },
- { 234, -1 },
- { 234, -3 },
- { 236, 0 },
- { 236, -2 },
- { 232, -3 },
- { 232, -2 },
- { 238, -3 },
- { 239, -3 },
- { 239, -2 },
- { 237, -7 },
- { 237, -5 },
- { 237, -5 },
- { 237, -1 },
- { 173, -4 },
- { 173, -6 },
- { 191, -1 },
- { 191, -1 },
- { 191, -1 },
- { 149, -4 },
- { 149, -6 },
- { 149, -3 },
- { 241, 0 },
- { 241, -2 },
- { 149, -1 },
- { 149, -3 },
- { 149, -1 },
- { 149, -3 },
- { 149, -6 },
- { 149, -7 },
- { 242, -1 },
- { 149, -1 },
- { 149, -4 },
- { 244, -8 },
- { 246, 0 },
- { 247, -1 },
- { 247, -3 },
- { 248, -1 },
- { 196, 0 },
- { 196, -2 },
- { 196, -3 },
- { 250, -6 },
- { 250, -8 },
- { 144, -1 },
- { 145, -2 },
- { 145, -1 },
- { 146, -1 },
- { 146, -3 },
- { 147, 0 },
- { 151, 0 },
- { 151, -1 },
- { 151, -2 },
- { 153, -1 },
- { 153, 0 },
- { 149, -2 },
- { 160, -4 },
- { 160, -2 },
- { 152, -1 },
- { 152, -1 },
- { 152, -1 },
- { 166, -1 },
- { 167, -1 },
- { 168, -1 },
- { 168, -1 },
- { 165, -2 },
- { 165, 0 },
- { 171, -2 },
- { 161, -2 },
- { 183, -3 },
- { 183, -1 },
- { 184, 0 },
- { 188, -1 },
- { 190, -1 },
- { 194, -1 },
- { 195, -1 },
- { 209, -2 },
- { 210, -1 },
- { 173, -1 },
- { 221, -1 },
- { 208, -1 },
- { 230, -1 },
- { 230, -1 },
- { 230, -1 },
- { 230, -1 },
- { 230, -1 },
- { 169, -1 },
- { 235, 0 },
- { 235, -3 },
- { 238, -1 },
- { 239, 0 },
- { 240, -1 },
- { 240, 0 },
- { 243, 0 },
- { 243, -1 },
- { 245, -1 },
- { 245, -3 },
- { 246, -2 },
- { 249, 0 },
- { 249, -4 },
- { 249, -2 },
+ { 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 ::= */
};
static void yy_accept(yyParser*); /* Forward Declaration */
@@ -139131,22 +149459,39 @@ static void yy_accept(yyParser*); /* Forward Declaration */
/*
** Perform a reduce action and the shift that must immediately
** follow the reduce.
+**
+** The yyLookahead and yyLookaheadToken parameters provide reduce actions
+** access to the lookahead token (if any). The yyLookahead will be YYNOCODE
+** if the lookahead token has already been consumed. As this procedure is
+** only called from one place, optimizing compilers will in-line it, which
+** means that the extra parameters have no performance impact.
*/
-static void yy_reduce(
+static YYACTIONTYPE yy_reduce(
yyParser *yypParser, /* The parser */
- unsigned int yyruleno /* Number of the rule by which to reduce */
+ unsigned int yyruleno, /* Number of the rule by which to reduce */
+ int yyLookahead, /* Lookahead token, or YYNOCODE if none */
+ sqlite3ParserTOKENTYPE yyLookaheadToken /* Value of the lookahead token */
+ sqlite3ParserCTX_PDECL /* %extra_context */
){
int yygoto; /* The next state */
- int yyact; /* The next action */
+ YYACTIONTYPE yyact; /* The next action */
yyStackEntry *yymsp; /* The top of the parser's stack */
int yysize; /* Amount to pop the stack */
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ (void)yyLookahead;
+ (void)yyLookaheadToken;
yymsp = yypParser->yytos;
#ifndef NDEBUG
if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){
yysize = yyRuleInfo[yyruleno].nrhs;
- fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt,
- yyRuleName[yyruleno], yymsp[yysize].stateno);
+ if( yysize ){
+ fprintf(yyTraceFILE, "%sReduce %d [%s], go to state %d.\n",
+ yyTracePrompt,
+ yyruleno, yyRuleName[yyruleno], yymsp[yysize].stateno);
+ }else{
+ fprintf(yyTraceFILE, "%sReduce %d [%s].\n",
+ yyTracePrompt, yyruleno, yyRuleName[yyruleno]);
+ }
}
#endif /* NDEBUG */
@@ -139163,13 +149508,19 @@ static void yy_reduce(
#if YYSTACKDEPTH>0
if( yypParser->yytos>=yypParser->yystackEnd ){
yyStackOverflow(yypParser);
- return;
+ /* The call to yyStackOverflow() above pops the stack until it is
+ ** empty, causing the main parser loop to exit. So the return value
+ ** is never used and does not matter. */
+ return 0;
}
#else
if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){
if( yyGrowStack(yypParser) ){
yyStackOverflow(yypParser);
- return;
+ /* The call to yyStackOverflow() above pops the stack until it is
+ ** empty, causing the main parser loop to exit. So the return value
+ ** is never used and does not matter. */
+ return 0;
}
yymsp = yypParser->yytos;
}
@@ -139197,15 +149548,15 @@ static void yy_reduce(
{ sqlite3FinishCoding(pParse); }
break;
case 3: /* cmd ::= BEGIN transtype trans_opt */
-{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy194);}
+{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy70);}
break;
case 4: /* transtype ::= */
-{yymsp[1].minor.yy194 = TK_DEFERRED;}
+{yymsp[1].minor.yy70 = TK_DEFERRED;}
break;
case 5: /* transtype ::= DEFERRED */
case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6);
case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7);
-{yymsp[0].minor.yy194 = yymsp[0].major; /*A-overwrites-X*/}
+{yymsp[0].minor.yy70 = yymsp[0].major; /*A-overwrites-X*/}
break;
case 8: /* cmd ::= COMMIT|END trans_opt */
case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9);
@@ -139228,7 +149579,7 @@ static void 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.yy194,0,0,yymsp[-2].minor.yy194);
+ sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy70,0,0,yymsp[-2].minor.yy70);
}
break;
case 14: /* createkw ::= CREATE */
@@ -139237,38 +149588,38 @@ static void yy_reduce(
case 15: /* ifnotexists ::= */
case 18: /* temp ::= */ yytestcase(yyruleno==18);
case 21: /* table_options ::= */ yytestcase(yyruleno==21);
- case 41: /* autoinc ::= */ yytestcase(yyruleno==41);
- case 56: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==56);
- case 66: /* defer_subclause_opt ::= */ yytestcase(yyruleno==66);
- case 75: /* ifexists ::= */ yytestcase(yyruleno==75);
- case 89: /* distinct ::= */ yytestcase(yyruleno==89);
- case 212: /* collate ::= */ yytestcase(yyruleno==212);
-{yymsp[1].minor.yy194 = 0;}
+ case 42: /* autoinc ::= */ yytestcase(yyruleno==42);
+ case 57: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==57);
+ case 67: /* defer_subclause_opt ::= */ yytestcase(yyruleno==67);
+ case 76: /* ifexists ::= */ yytestcase(yyruleno==76);
+ case 93: /* distinct ::= */ yytestcase(yyruleno==93);
+ case 226: /* collate ::= */ yytestcase(yyruleno==226);
+{yymsp[1].minor.yy70 = 0;}
break;
case 16: /* ifnotexists ::= IF NOT EXISTS */
-{yymsp[-2].minor.yy194 = 1;}
+{yymsp[-2].minor.yy70 = 1;}
break;
case 17: /* temp ::= TEMP */
- case 42: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==42);
-{yymsp[0].minor.yy194 = 1;}
+ case 43: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==43);
+{yymsp[0].minor.yy70 = 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.yy194,0);
+ sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy70,0);
}
break;
case 20: /* create_table_args ::= AS select */
{
- sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy243);
- sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy243);
+ sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy489);
+ sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy489);
}
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.yy194 = TF_WithoutRowid | TF_NoVisibleRowid;
+ yymsp[-1].minor.yy70 = TF_WithoutRowid | TF_NoVisibleRowid;
}else{
- yymsp[-1].minor.yy194 = 0;
+ yymsp[-1].minor.yy70 = 0;
sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z);
}
}
@@ -139277,8 +149628,8 @@ static void yy_reduce(
{sqlite3AddColumn(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
break;
case 24: /* typetoken ::= */
- case 59: /* conslist_opt ::= */ yytestcase(yyruleno==59);
- case 95: /* as ::= */ yytestcase(yyruleno==95);
+ case 60: /* conslist_opt ::= */ yytestcase(yyruleno==60);
+ case 99: /* as ::= */ yytestcase(yyruleno==99);
{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;}
break;
case 25: /* typetoken ::= typename LP signed RP */
@@ -139294,697 +149645,747 @@ static void yy_reduce(
case 27: /* typename ::= typename ID|STRING */
{yymsp[-1].minor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);}
break;
- case 28: /* ccons ::= CONSTRAINT nm */
- case 61: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==61);
+ case 28: /* scanpt ::= */
+{
+ assert( yyLookahead!=YYNOCODE );
+ yymsp[1].minor.yy392 = yyLookaheadToken.z;
+}
+ break;
+ case 29: /* ccons ::= CONSTRAINT nm */
+ case 62: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==62);
{pParse->constraintName = yymsp[0].minor.yy0;}
break;
- case 29: /* ccons ::= DEFAULT term */
- case 31: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==31);
-{sqlite3AddDefaultValue(pParse,&yymsp[0].minor.yy190);}
+ case 30: /* ccons ::= DEFAULT scanpt term scanpt */
+{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy18,yymsp[-2].minor.yy392,yymsp[0].minor.yy392);}
+ 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);}
break;
- case 30: /* ccons ::= DEFAULT LP expr RP */
-{sqlite3AddDefaultValue(pParse,&yymsp[-1].minor.yy190);}
+ case 32: /* ccons ::= DEFAULT PLUS term scanpt */
+{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy18,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy392);}
break;
- case 32: /* ccons ::= DEFAULT MINUS term */
+ case 33: /* ccons ::= DEFAULT MINUS term scanpt */
{
- ExprSpan v;
- v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy190.pExpr, 0);
- v.zStart = yymsp[-1].minor.yy0.z;
- v.zEnd = yymsp[0].minor.yy190.zEnd;
- sqlite3AddDefaultValue(pParse,&v);
+ Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[-1].minor.yy18, 0);
+ sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy392);
}
break;
- case 33: /* ccons ::= DEFAULT ID|INDEXED */
+ case 34: /* ccons ::= DEFAULT scanpt ID|INDEXED */
{
- ExprSpan v;
- spanExpr(&v, pParse, TK_STRING, yymsp[0].minor.yy0);
- sqlite3AddDefaultValue(pParse,&v);
+ Expr *p = tokenExpr(pParse, TK_STRING, yymsp[0].minor.yy0);
+ if( p ){
+ sqlite3ExprIdToTrueFalse(p);
+ testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) );
+ }
+ sqlite3AddDefaultValue(pParse,p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.z+yymsp[0].minor.yy0.n);
}
break;
- case 34: /* ccons ::= NOT NULL onconf */
-{sqlite3AddNotNull(pParse, yymsp[0].minor.yy194);}
+ case 35: /* ccons ::= NOT NULL onconf */
+{sqlite3AddNotNull(pParse, yymsp[0].minor.yy70);}
break;
- case 35: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
-{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy194,yymsp[0].minor.yy194,yymsp[-2].minor.yy194);}
+ case 36: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
+{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy70,yymsp[0].minor.yy70,yymsp[-2].minor.yy70);}
break;
- case 36: /* ccons ::= UNIQUE onconf */
-{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy194,0,0,0,0,
+ case 37: /* ccons ::= UNIQUE onconf */
+{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy70,0,0,0,0,
SQLITE_IDXTYPE_UNIQUE);}
break;
- case 37: /* ccons ::= CHECK LP expr RP */
-{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy190.pExpr);}
+ case 38: /* ccons ::= CHECK LP expr RP */
+{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy18);}
break;
- case 38: /* ccons ::= REFERENCES nm eidlist_opt refargs */
-{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy148,yymsp[0].minor.yy194);}
+ case 39: /* ccons ::= REFERENCES nm eidlist_opt refargs */
+{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy420,yymsp[0].minor.yy70);}
break;
- case 39: /* ccons ::= defer_subclause */
-{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy194);}
+ case 40: /* ccons ::= defer_subclause */
+{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy70);}
break;
- case 40: /* ccons ::= COLLATE ID|STRING */
+ case 41: /* ccons ::= COLLATE ID|STRING */
{sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);}
break;
- case 43: /* refargs ::= */
-{ yymsp[1].minor.yy194 = OE_None*0x0101; /* EV: R-19803-45884 */}
+ case 44: /* refargs ::= */
+{ yymsp[1].minor.yy70 = OE_None*0x0101; /* EV: R-19803-45884 */}
break;
- case 44: /* refargs ::= refargs refarg */
-{ yymsp[-1].minor.yy194 = (yymsp[-1].minor.yy194 & ~yymsp[0].minor.yy497.mask) | yymsp[0].minor.yy497.value; }
+ case 45: /* refargs ::= refargs refarg */
+{ yymsp[-1].minor.yy70 = (yymsp[-1].minor.yy70 & ~yymsp[0].minor.yy111.mask) | yymsp[0].minor.yy111.value; }
break;
- case 45: /* refarg ::= MATCH nm */
-{ yymsp[-1].minor.yy497.value = 0; yymsp[-1].minor.yy497.mask = 0x000000; }
+ case 46: /* refarg ::= MATCH nm */
+{ yymsp[-1].minor.yy111.value = 0; yymsp[-1].minor.yy111.mask = 0x000000; }
break;
- case 46: /* refarg ::= ON INSERT refact */
-{ yymsp[-2].minor.yy497.value = 0; yymsp[-2].minor.yy497.mask = 0x000000; }
+ case 47: /* refarg ::= ON INSERT refact */
+{ yymsp[-2].minor.yy111.value = 0; yymsp[-2].minor.yy111.mask = 0x000000; }
break;
- case 47: /* refarg ::= ON DELETE refact */
-{ yymsp[-2].minor.yy497.value = yymsp[0].minor.yy194; yymsp[-2].minor.yy497.mask = 0x0000ff; }
+ case 48: /* refarg ::= ON DELETE refact */
+{ yymsp[-2].minor.yy111.value = yymsp[0].minor.yy70; yymsp[-2].minor.yy111.mask = 0x0000ff; }
break;
- case 48: /* refarg ::= ON UPDATE refact */
-{ yymsp[-2].minor.yy497.value = yymsp[0].minor.yy194<<8; yymsp[-2].minor.yy497.mask = 0x00ff00; }
+ case 49: /* refarg ::= ON UPDATE refact */
+{ yymsp[-2].minor.yy111.value = yymsp[0].minor.yy70<<8; yymsp[-2].minor.yy111.mask = 0x00ff00; }
break;
- case 49: /* refact ::= SET NULL */
-{ yymsp[-1].minor.yy194 = OE_SetNull; /* EV: R-33326-45252 */}
+ case 50: /* refact ::= SET NULL */
+{ yymsp[-1].minor.yy70 = OE_SetNull; /* EV: R-33326-45252 */}
break;
- case 50: /* refact ::= SET DEFAULT */
-{ yymsp[-1].minor.yy194 = OE_SetDflt; /* EV: R-33326-45252 */}
+ case 51: /* refact ::= SET DEFAULT */
+{ yymsp[-1].minor.yy70 = OE_SetDflt; /* EV: R-33326-45252 */}
break;
- case 51: /* refact ::= CASCADE */
-{ yymsp[0].minor.yy194 = OE_Cascade; /* EV: R-33326-45252 */}
+ case 52: /* refact ::= CASCADE */
+{ yymsp[0].minor.yy70 = OE_Cascade; /* EV: R-33326-45252 */}
break;
- case 52: /* refact ::= RESTRICT */
-{ yymsp[0].minor.yy194 = OE_Restrict; /* EV: R-33326-45252 */}
+ case 53: /* refact ::= RESTRICT */
+{ yymsp[0].minor.yy70 = OE_Restrict; /* EV: R-33326-45252 */}
break;
- case 53: /* refact ::= NO ACTION */
-{ yymsp[-1].minor.yy194 = OE_None; /* EV: R-33326-45252 */}
+ case 54: /* refact ::= NO ACTION */
+{ yymsp[-1].minor.yy70 = OE_None; /* EV: R-33326-45252 */}
break;
- case 54: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
-{yymsp[-2].minor.yy194 = 0;}
+ case 55: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
+{yymsp[-2].minor.yy70 = 0;}
break;
- case 55: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
- case 70: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==70);
- case 143: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==143);
-{yymsp[-1].minor.yy194 = yymsp[0].minor.yy194;}
+ 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;}
break;
- case 57: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
- case 74: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==74);
- case 184: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==184);
- case 187: /* in_op ::= NOT IN */ yytestcase(yyruleno==187);
- case 213: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==213);
-{yymsp[-1].minor.yy194 = 1;}
+ 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;}
break;
- case 58: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
-{yymsp[-1].minor.yy194 = 0;}
+ case 59: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
+{yymsp[-1].minor.yy70 = 0;}
break;
- case 60: /* tconscomma ::= COMMA */
+ case 61: /* tconscomma ::= COMMA */
{pParse->constraintName.n = 0;}
break;
- case 62: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
-{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy148,yymsp[0].minor.yy194,yymsp[-2].minor.yy194,0);}
+ 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);}
break;
- case 63: /* tcons ::= UNIQUE LP sortlist RP onconf */
-{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy148,yymsp[0].minor.yy194,0,0,0,0,
+ 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,
SQLITE_IDXTYPE_UNIQUE);}
break;
- case 64: /* tcons ::= CHECK LP expr RP onconf */
-{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy190.pExpr);}
+ case 65: /* tcons ::= CHECK LP expr RP onconf */
+{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy18);}
break;
- case 65: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
+ case 66: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
{
- sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy148, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy148, yymsp[-1].minor.yy194);
- sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy194);
+ sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy420, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy420, yymsp[-1].minor.yy70);
+ sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy70);
}
break;
- case 67: /* onconf ::= */
- case 69: /* orconf ::= */ yytestcase(yyruleno==69);
-{yymsp[1].minor.yy194 = OE_Default;}
+ case 68: /* onconf ::= */
+ case 70: /* orconf ::= */ yytestcase(yyruleno==70);
+{yymsp[1].minor.yy70 = OE_Default;}
break;
- case 68: /* onconf ::= ON CONFLICT resolvetype */
-{yymsp[-2].minor.yy194 = yymsp[0].minor.yy194;}
+ case 69: /* onconf ::= ON CONFLICT resolvetype */
+{yymsp[-2].minor.yy70 = yymsp[0].minor.yy70;}
break;
- case 71: /* resolvetype ::= IGNORE */
-{yymsp[0].minor.yy194 = OE_Ignore;}
+ case 72: /* resolvetype ::= IGNORE */
+{yymsp[0].minor.yy70 = OE_Ignore;}
break;
- case 72: /* resolvetype ::= REPLACE */
- case 144: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==144);
-{yymsp[0].minor.yy194 = OE_Replace;}
+ case 73: /* resolvetype ::= REPLACE */
+ case 157: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==157);
+{yymsp[0].minor.yy70 = OE_Replace;}
break;
- case 73: /* cmd ::= DROP TABLE ifexists fullname */
+ case 74: /* cmd ::= DROP TABLE ifexists fullname */
{
- sqlite3DropTable(pParse, yymsp[0].minor.yy185, 0, yymsp[-1].minor.yy194);
+ sqlite3DropTable(pParse, yymsp[0].minor.yy135, 0, yymsp[-1].minor.yy70);
}
break;
- case 76: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
+ 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.yy148, yymsp[0].minor.yy243, yymsp[-7].minor.yy194, yymsp[-5].minor.yy194);
+ 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);
}
break;
- case 77: /* cmd ::= DROP VIEW ifexists fullname */
+ case 78: /* cmd ::= DROP VIEW ifexists fullname */
{
- sqlite3DropTable(pParse, yymsp[0].minor.yy185, 1, yymsp[-1].minor.yy194);
+ sqlite3DropTable(pParse, yymsp[0].minor.yy135, 1, yymsp[-1].minor.yy70);
}
break;
- case 78: /* cmd ::= select */
+ case 79: /* cmd ::= select */
{
SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
- sqlite3Select(pParse, yymsp[0].minor.yy243, &dest);
- sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy243);
+ sqlite3Select(pParse, yymsp[0].minor.yy489, &dest);
+ sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy489);
}
break;
- case 79: /* select ::= with selectnowith */
+ case 80: /* select ::= WITH wqlist selectnowith */
{
- Select *p = yymsp[0].minor.yy243;
+ Select *p = yymsp[0].minor.yy489;
if( p ){
- p->pWith = yymsp[-1].minor.yy285;
+ p->pWith = yymsp[-1].minor.yy449;
parserDoubleLinkSelect(pParse, p);
}else{
- sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy285);
+ sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy449);
}
- yymsp[-1].minor.yy243 = p; /*A-overwrites-W*/
+ yymsp[-2].minor.yy489 = p;
}
break;
- case 80: /* selectnowith ::= selectnowith multiselect_op oneselect */
+ case 81: /* select ::= WITH RECURSIVE wqlist selectnowith */
{
- Select *pRhs = yymsp[0].minor.yy243;
- Select *pLhs = yymsp[-2].minor.yy243;
+ Select *p = yymsp[0].minor.yy489;
+ if( p ){
+ p->pWith = yymsp[-1].minor.yy449;
+ parserDoubleLinkSelect(pParse, p);
+ }else{
+ sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy449);
+ }
+ yymsp[-3].minor.yy489 = p;
+}
+ break;
+ case 82: /* select ::= selectnowith */
+{
+ Select *p = yymsp[0].minor.yy489;
+ if( p ){
+ parserDoubleLinkSelect(pParse, p);
+ }
+ yymsp[0].minor.yy489 = p; /*A-overwrites-X*/
+}
+ break;
+ case 83: /* selectnowith ::= selectnowith multiselect_op oneselect */
+{
+ Select *pRhs = yymsp[0].minor.yy489;
+ Select *pLhs = yymsp[-2].minor.yy489;
if( pRhs && pRhs->pPrior ){
SrcList *pFrom;
Token x;
x.n = 0;
parserDoubleLinkSelect(pParse, pRhs);
pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
- pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0);
+ pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
}
if( pRhs ){
- pRhs->op = (u8)yymsp[-1].minor.yy194;
+ pRhs->op = (u8)yymsp[-1].minor.yy70;
pRhs->pPrior = pLhs;
if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
pRhs->selFlags &= ~SF_MultiValue;
- if( yymsp[-1].minor.yy194!=TK_ALL ) pParse->hasCompound = 1;
+ if( yymsp[-1].minor.yy70!=TK_ALL ) pParse->hasCompound = 1;
}else{
sqlite3SelectDelete(pParse->db, pLhs);
}
- yymsp[-2].minor.yy243 = pRhs;
+ yymsp[-2].minor.yy489 = pRhs;
}
break;
- case 81: /* multiselect_op ::= UNION */
- case 83: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==83);
-{yymsp[0].minor.yy194 = yymsp[0].major; /*A-overwrites-OP*/}
+ case 84: /* multiselect_op ::= UNION */
+ case 86: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==86);
+{yymsp[0].minor.yy70 = yymsp[0].major; /*A-overwrites-OP*/}
break;
- case 82: /* multiselect_op ::= UNION ALL */
-{yymsp[-1].minor.yy194 = TK_ALL;}
+ case 85: /* multiselect_op ::= UNION ALL */
+{yymsp[-1].minor.yy70 = TK_ALL;}
break;
- case 84: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+ case 87: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
{
-#if SELECTTRACE_ENABLED
- Token s = yymsp[-8].minor.yy0; /*A-overwrites-S*/
-#endif
- yymsp[-8].minor.yy243 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy148,yymsp[-5].minor.yy185,yymsp[-4].minor.yy72,yymsp[-3].minor.yy148,yymsp[-2].minor.yy72,yymsp[-1].minor.yy148,yymsp[-7].minor.yy194,yymsp[0].minor.yy354.pLimit,yymsp[0].minor.yy354.pOffset);
-#if SELECTTRACE_ENABLED
- /* Populate the Select.zSelName[] string that is used to help with
- ** query planner debugging, to differentiate between multiple Select
- ** objects in a complex query.
- **
- ** If the SELECT keyword is immediately followed by a C-style comment
- ** then extract the first few alphanumeric characters from within that
- ** comment to be the zSelName value. Otherwise, the label is #N where
- ** is an integer that is incremented with each SELECT statement seen.
- */
- if( yymsp[-8].minor.yy243!=0 ){
- const char *z = s.z+6;
- int i;
- sqlite3_snprintf(sizeof(yymsp[-8].minor.yy243->zSelName), yymsp[-8].minor.yy243->zSelName, "#%d",
- ++pParse->nSelect);
- while( z[0]==' ' ) z++;
- if( z[0]=='/' && z[1]=='*' ){
- z += 2;
- while( z[0]==' ' ) z++;
- for(i=0; sqlite3Isalnum(z[i]); i++){}
- sqlite3_snprintf(sizeof(yymsp[-8].minor.yy243->zSelName), yymsp[-8].minor.yy243->zSelName, "%.*s", i, z);
- }
+ 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);
+}
+ 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;
+ }else{
+ sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy327);
}
-#endif /* SELECTRACE_ENABLED */
}
break;
- case 85: /* values ::= VALUES LP nexprlist RP */
+ case 89: /* values ::= VALUES LP nexprlist RP */
{
- yymsp[-3].minor.yy243 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy148,0,0,0,0,0,SF_Values,0,0);
+ yymsp[-3].minor.yy489 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy420,0,0,0,0,0,SF_Values,0);
}
break;
- case 86: /* values ::= values COMMA LP exprlist RP */
+ case 90: /* values ::= values COMMA LP nexprlist RP */
{
- Select *pRight, *pLeft = yymsp[-4].minor.yy243;
- pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy148,0,0,0,0,0,SF_Values|SF_MultiValue,0,0);
+ Select *pRight, *pLeft = yymsp[-4].minor.yy489;
+ pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy420,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.yy243 = pRight;
+ yymsp[-4].minor.yy489 = pRight;
}else{
- yymsp[-4].minor.yy243 = pLeft;
+ yymsp[-4].minor.yy489 = pLeft;
}
}
break;
- case 87: /* distinct ::= DISTINCT */
-{yymsp[0].minor.yy194 = SF_Distinct;}
+ case 91: /* distinct ::= DISTINCT */
+{yymsp[0].minor.yy70 = SF_Distinct;}
break;
- case 88: /* distinct ::= ALL */
-{yymsp[0].minor.yy194 = SF_All;}
+ case 92: /* distinct ::= ALL */
+{yymsp[0].minor.yy70 = SF_All;}
break;
- case 90: /* sclp ::= */
- case 118: /* orderby_opt ::= */ yytestcase(yyruleno==118);
- case 125: /* groupby_opt ::= */ yytestcase(yyruleno==125);
- case 200: /* exprlist ::= */ yytestcase(yyruleno==200);
- case 203: /* paren_exprlist ::= */ yytestcase(yyruleno==203);
- case 208: /* eidlist_opt ::= */ yytestcase(yyruleno==208);
-{yymsp[1].minor.yy148 = 0;}
+ case 94: /* sclp ::= */
+ case 127: /* orderby_opt ::= */ yytestcase(yyruleno==127);
+ case 134: /* groupby_opt ::= */ yytestcase(yyruleno==134);
+ 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;}
break;
- case 91: /* selcollist ::= sclp expr as */
+ case 95: /* selcollist ::= sclp scanpt expr scanpt as */
{
- yymsp[-2].minor.yy148 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy148, yymsp[-1].minor.yy190.pExpr);
- if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-2].minor.yy148, &yymsp[0].minor.yy0, 1);
- sqlite3ExprListSetSpan(pParse,yymsp[-2].minor.yy148,&yymsp[-1].minor.yy190);
+ 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);
}
break;
- case 92: /* selcollist ::= sclp STAR */
+ case 96: /* selcollist ::= sclp scanpt STAR */
{
Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
- yymsp[-1].minor.yy148 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy148, p);
+ yymsp[-2].minor.yy420 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy420, p);
}
break;
- case 93: /* selcollist ::= sclp nm DOT STAR */
+ case 97: /* selcollist ::= sclp scanpt nm DOT STAR */
{
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[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148, pDot);
+ yymsp[-4].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy420, pDot);
}
break;
- case 94: /* as ::= AS nm */
- case 105: /* dbnm ::= DOT nm */ yytestcase(yyruleno==105);
- case 222: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==222);
- case 223: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==223);
+ 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);
{yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;}
break;
- case 96: /* from ::= */
-{yymsp[1].minor.yy185 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy185));}
+ case 100: /* from ::= */
+{yymsp[1].minor.yy135 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy135));}
break;
- case 97: /* from ::= FROM seltablist */
+ case 101: /* from ::= FROM seltablist */
{
- yymsp[-1].minor.yy185 = yymsp[0].minor.yy185;
- sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy185);
+ yymsp[-1].minor.yy135 = yymsp[0].minor.yy135;
+ sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy135);
}
break;
- case 98: /* stl_prefix ::= seltablist joinop */
+ case 102: /* stl_prefix ::= seltablist joinop */
{
- if( ALWAYS(yymsp[-1].minor.yy185 && yymsp[-1].minor.yy185->nSrc>0) ) yymsp[-1].minor.yy185->a[yymsp[-1].minor.yy185->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy194;
+ 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;
}
break;
- case 99: /* stl_prefix ::= */
-{yymsp[1].minor.yy185 = 0;}
+ case 103: /* stl_prefix ::= */
+{yymsp[1].minor.yy135 = 0;}
break;
- case 100: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
+ case 104: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
{
- yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy72,yymsp[0].minor.yy254);
- sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy185, &yymsp[-2].minor.yy0);
+ 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);
}
break;
- case 101: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
+ case 105: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
{
- yymsp[-8].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy185,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy72,yymsp[0].minor.yy254);
- sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy185, yymsp[-4].minor.yy148);
+ 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);
}
break;
- case 102: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
+ case 106: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
{
- yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy243,yymsp[-1].minor.yy72,yymsp[0].minor.yy254);
+ 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);
}
break;
- case 103: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
+ case 107: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
{
- if( yymsp[-6].minor.yy185==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy72==0 && yymsp[0].minor.yy254==0 ){
- yymsp[-6].minor.yy185 = yymsp[-4].minor.yy185;
- }else if( yymsp[-4].minor.yy185->nSrc==1 ){
- yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy72,yymsp[0].minor.yy254);
- if( yymsp[-6].minor.yy185 ){
- struct SrcList_item *pNew = &yymsp[-6].minor.yy185->a[yymsp[-6].minor.yy185->nSrc-1];
- struct SrcList_item *pOld = yymsp[-4].minor.yy185->a;
+ 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;
pNew->zName = pOld->zName;
pNew->zDatabase = pOld->zDatabase;
pNew->pSelect = pOld->pSelect;
pOld->zName = pOld->zDatabase = 0;
pOld->pSelect = 0;
}
- sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy185);
+ sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy135);
}else{
Select *pSubquery;
- sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy185);
- pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy185,0,0,0,0,SF_NestedFrom,0,0);
- yymsp[-6].minor.yy185 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy185,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy72,yymsp[0].minor.yy254);
+ 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);
}
}
break;
- case 104: /* dbnm ::= */
- case 113: /* indexed_opt ::= */ yytestcase(yyruleno==113);
+ case 108: /* dbnm ::= */
+ case 122: /* indexed_opt ::= */ yytestcase(yyruleno==122);
{yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;}
break;
- case 106: /* fullname ::= nm dbnm */
-{yymsp[-1].minor.yy185 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ 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);
+}
+ yymsp[0].minor.yy135 = yylhsminor.yy135;
break;
- case 107: /* joinop ::= COMMA|JOIN */
-{ yymsp[0].minor.yy194 = JT_INNER; }
+ 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);
+}
+ yymsp[-2].minor.yy135 = yylhsminor.yy135;
+ break;
+ case 112: /* xfullname ::= nm */
+{yymsp[0].minor.yy135 = sqlite3SrcListAppend(pParse->db,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*/}
break;
- case 108: /* joinop ::= JOIN_KW JOIN */
-{yymsp[-1].minor.yy194 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/}
+ 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);
+}
break;
- case 109: /* joinop ::= JOIN_KW nm JOIN */
-{yymsp[-2].minor.yy194 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/}
+ 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);
+}
break;
- case 110: /* joinop ::= JOIN_KW nm nm JOIN */
-{yymsp[-3].minor.yy194 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/}
+ case 116: /* joinop ::= COMMA|JOIN */
+{ yymsp[0].minor.yy70 = JT_INNER; }
break;
- case 111: /* on_opt ::= ON expr */
- case 128: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==128);
- case 135: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==135);
- case 196: /* case_else ::= ELSE expr */ yytestcase(yyruleno==196);
-{yymsp[-1].minor.yy72 = yymsp[0].minor.yy190.pExpr;}
+ case 117: /* joinop ::= JOIN_KW JOIN */
+{yymsp[-1].minor.yy70 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/}
break;
- case 112: /* on_opt ::= */
- case 127: /* having_opt ::= */ yytestcase(yyruleno==127);
- case 134: /* where_opt ::= */ yytestcase(yyruleno==134);
- case 197: /* case_else ::= */ yytestcase(yyruleno==197);
- case 199: /* case_operand ::= */ yytestcase(yyruleno==199);
-{yymsp[1].minor.yy72 = 0;}
+ 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*/}
break;
- case 114: /* indexed_opt ::= INDEXED BY nm */
+ 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*/}
+ 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;}
+ break;
+ case 121: /* on_opt ::= */
+ case 136: /* having_opt ::= */ yytestcase(yyruleno==136);
+ case 138: /* limit_opt ::= */ yytestcase(yyruleno==138);
+ 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;}
+ break;
+ case 123: /* indexed_opt ::= INDEXED BY nm */
{yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;}
break;
- case 115: /* indexed_opt ::= NOT INDEXED */
+ case 124: /* indexed_opt ::= NOT INDEXED */
{yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;}
break;
- case 116: /* using_opt ::= USING LP idlist RP */
-{yymsp[-3].minor.yy254 = yymsp[-1].minor.yy254;}
+ case 125: /* using_opt ::= USING LP idlist RP */
+{yymsp[-3].minor.yy48 = yymsp[-1].minor.yy48;}
break;
- case 117: /* using_opt ::= */
- case 145: /* idlist_opt ::= */ yytestcase(yyruleno==145);
-{yymsp[1].minor.yy254 = 0;}
+ case 126: /* using_opt ::= */
+ case 158: /* idlist_opt ::= */ yytestcase(yyruleno==158);
+{yymsp[1].minor.yy48 = 0;}
break;
- case 119: /* orderby_opt ::= ORDER BY sortlist */
- case 126: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==126);
-{yymsp[-2].minor.yy148 = yymsp[0].minor.yy148;}
+ 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;}
break;
- case 120: /* sortlist ::= sortlist COMMA expr sortorder */
+ case 129: /* sortlist ::= sortlist COMMA expr sortorder */
{
- yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148,yymsp[-1].minor.yy190.pExpr);
- sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy148,yymsp[0].minor.yy194);
+ yymsp[-3].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy420,yymsp[-1].minor.yy18);
+ sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy420,yymsp[0].minor.yy70);
}
break;
- case 121: /* sortlist ::= expr sortorder */
+ case 130: /* sortlist ::= expr sortorder */
{
- yymsp[-1].minor.yy148 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy190.pExpr); /*A-overwrites-Y*/
- sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy148,yymsp[0].minor.yy194);
+ yymsp[-1].minor.yy420 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy18); /*A-overwrites-Y*/
+ sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy420,yymsp[0].minor.yy70);
}
break;
- case 122: /* sortorder ::= ASC */
-{yymsp[0].minor.yy194 = SQLITE_SO_ASC;}
+ case 131: /* sortorder ::= ASC */
+{yymsp[0].minor.yy70 = SQLITE_SO_ASC;}
break;
- case 123: /* sortorder ::= DESC */
-{yymsp[0].minor.yy194 = SQLITE_SO_DESC;}
+ case 132: /* sortorder ::= DESC */
+{yymsp[0].minor.yy70 = SQLITE_SO_DESC;}
break;
- case 124: /* sortorder ::= */
-{yymsp[1].minor.yy194 = SQLITE_SO_UNDEFINED;}
+ case 133: /* sortorder ::= */
+{yymsp[1].minor.yy70 = SQLITE_SO_UNDEFINED;}
break;
- case 129: /* limit_opt ::= */
-{yymsp[1].minor.yy354.pLimit = 0; yymsp[1].minor.yy354.pOffset = 0;}
+ case 139: /* limit_opt ::= LIMIT expr */
+{yymsp[-1].minor.yy18 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy18,0);}
break;
- case 130: /* limit_opt ::= LIMIT expr */
-{yymsp[-1].minor.yy354.pLimit = yymsp[0].minor.yy190.pExpr; yymsp[-1].minor.yy354.pOffset = 0;}
+ case 140: /* limit_opt ::= LIMIT expr OFFSET expr */
+{yymsp[-3].minor.yy18 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy18,yymsp[0].minor.yy18);}
break;
- case 131: /* limit_opt ::= LIMIT expr OFFSET expr */
-{yymsp[-3].minor.yy354.pLimit = yymsp[-2].minor.yy190.pExpr; yymsp[-3].minor.yy354.pOffset = yymsp[0].minor.yy190.pExpr;}
+ case 141: /* limit_opt ::= LIMIT expr COMMA expr */
+{yymsp[-3].minor.yy18 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy18,yymsp[-2].minor.yy18);}
break;
- case 132: /* limit_opt ::= LIMIT expr COMMA expr */
-{yymsp[-3].minor.yy354.pOffset = yymsp[-2].minor.yy190.pExpr; yymsp[-3].minor.yy354.pLimit = yymsp[0].minor.yy190.pExpr;}
- break;
- case 133: /* cmd ::= with DELETE FROM fullname indexed_opt where_opt */
+ case 142: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt */
{
- sqlite3WithPush(pParse, yymsp[-5].minor.yy285, 1);
- sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy185, &yymsp[-1].minor.yy0);
- sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy185,yymsp[0].minor.yy72);
+ sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy135, &yymsp[-1].minor.yy0);
+ sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy135,yymsp[0].minor.yy18,0,0);
}
break;
- case 136: /* cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */
+ case 145: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */
{
- sqlite3WithPush(pParse, yymsp[-7].minor.yy285, 1);
- sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy185, &yymsp[-3].minor.yy0);
- sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy148,"set list");
- sqlite3Update(pParse,yymsp[-4].minor.yy185,yymsp[-1].minor.yy148,yymsp[0].minor.yy72,yymsp[-5].minor.yy194);
+ 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);
}
break;
- case 137: /* setlist ::= setlist COMMA nm EQ expr */
+ case 146: /* setlist ::= setlist COMMA nm EQ expr */
{
- yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy148, yymsp[0].minor.yy190.pExpr);
- sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy148, &yymsp[-2].minor.yy0, 1);
+ 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);
}
break;
- case 138: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
+ case 147: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
{
- yymsp[-6].minor.yy148 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy148, yymsp[-3].minor.yy254, yymsp[0].minor.yy190.pExpr);
+ yymsp[-6].minor.yy420 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy420, yymsp[-3].minor.yy48, yymsp[0].minor.yy18);
}
break;
- case 139: /* setlist ::= nm EQ expr */
+ case 148: /* setlist ::= nm EQ expr */
{
- yylhsminor.yy148 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy190.pExpr);
- sqlite3ExprListSetName(pParse, yylhsminor.yy148, &yymsp[-2].minor.yy0, 1);
+ yylhsminor.yy420 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy18);
+ sqlite3ExprListSetName(pParse, yylhsminor.yy420, &yymsp[-2].minor.yy0, 1);
}
- yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ yymsp[-2].minor.yy420 = yylhsminor.yy420;
break;
- case 140: /* setlist ::= LP idlist RP EQ expr */
+ case 149: /* setlist ::= LP idlist RP EQ expr */
{
- yymsp[-4].minor.yy148 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy254, yymsp[0].minor.yy190.pExpr);
+ yymsp[-4].minor.yy420 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy48, yymsp[0].minor.yy18);
}
break;
- case 141: /* cmd ::= with insert_cmd INTO fullname idlist_opt select */
+ case 150: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */
{
- sqlite3WithPush(pParse, yymsp[-5].minor.yy285, 1);
- sqlite3Insert(pParse, yymsp[-2].minor.yy185, yymsp[0].minor.yy243, yymsp[-1].minor.yy254, yymsp[-4].minor.yy194);
+ sqlite3Insert(pParse, yymsp[-3].minor.yy135, yymsp[-1].minor.yy489, yymsp[-2].minor.yy48, yymsp[-5].minor.yy70, yymsp[0].minor.yy340);
}
break;
- case 142: /* cmd ::= with insert_cmd INTO fullname idlist_opt DEFAULT VALUES */
+ case 151: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */
{
- sqlite3WithPush(pParse, yymsp[-6].minor.yy285, 1);
- sqlite3Insert(pParse, yymsp[-3].minor.yy185, 0, yymsp[-2].minor.yy254, yymsp[-5].minor.yy194);
+ sqlite3Insert(pParse, yymsp[-3].minor.yy135, 0, yymsp[-2].minor.yy48, yymsp[-5].minor.yy70, 0);
}
break;
- case 146: /* idlist_opt ::= LP idlist RP */
-{yymsp[-2].minor.yy254 = yymsp[-1].minor.yy254;}
+ case 152: /* upsert ::= */
+{ yymsp[1].minor.yy340 = 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);}
+ 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); }
break;
- case 147: /* idlist ::= idlist COMMA nm */
-{yymsp[-2].minor.yy254 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
+ case 155: /* upsert ::= ON CONFLICT DO NOTHING */
+{ yymsp[-3].minor.yy340 = sqlite3UpsertNew(pParse->db,0,0,0,0); }
break;
- case 148: /* idlist ::= nm */
-{yymsp[0].minor.yy254 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/}
+ case 159: /* idlist_opt ::= LP idlist RP */
+{yymsp[-2].minor.yy48 = yymsp[-1].minor.yy48;}
break;
- case 149: /* expr ::= LP expr RP */
-{spanSet(&yymsp[-2].minor.yy190,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/ yymsp[-2].minor.yy190.pExpr = yymsp[-1].minor.yy190.pExpr;}
+ case 160: /* idlist ::= idlist COMMA nm */
+{yymsp[-2].minor.yy48 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy48,&yymsp[0].minor.yy0);}
break;
- case 150: /* expr ::= ID|INDEXED */
- case 151: /* expr ::= JOIN_KW */ yytestcase(yyruleno==151);
-{spanExpr(&yymsp[0].minor.yy190,pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ case 161: /* idlist ::= nm */
+{yymsp[0].minor.yy48 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/}
break;
- case 152: /* expr ::= nm DOT nm */
+ case 162: /* expr ::= LP expr RP */
+{yymsp[-2].minor.yy18 = yymsp[-1].minor.yy18;}
+ 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*/}
+ break;
+ case 165: /* expr ::= nm DOT nm */
{
Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1);
- spanSet(&yymsp[-2].minor.yy190,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
- yymsp[-2].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[0].minor.yy0);
+ sqlite3RenameTokenMap(pParse, (void*)temp1, &yymsp[-2].minor.yy0);
+ }
+ yylhsminor.yy18 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
}
+ yymsp[-2].minor.yy18 = yylhsminor.yy18;
break;
- case 153: /* expr ::= nm DOT nm DOT nm */
+ case 166: /* expr ::= nm DOT nm DOT nm */
{
Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1);
Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1);
Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
- spanSet(&yymsp[-4].minor.yy190,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
+ if( IN_RENAME_OBJECT ){
+ sqlite3RenameTokenMap(pParse, (void*)temp3, &yymsp[0].minor.yy0);
+ sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[-2].minor.yy0);
+ }
+ yylhsminor.yy18 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
}
+ yymsp[-4].minor.yy18 = yylhsminor.yy18;
break;
- case 154: /* term ::= NULL|FLOAT|BLOB */
- case 155: /* term ::= STRING */ yytestcase(yyruleno==155);
-{spanExpr(&yymsp[0].minor.yy190,pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ 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*/}
break;
- case 156: /* term ::= INTEGER */
+ case 169: /* term ::= INTEGER */
{
- yylhsminor.yy190.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1);
- yylhsminor.yy190.zStart = yymsp[0].minor.yy0.z;
- yylhsminor.yy190.zEnd = yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n;
+ yylhsminor.yy18 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1);
}
- yymsp[0].minor.yy190 = yylhsminor.yy190;
+ yymsp[0].minor.yy18 = yylhsminor.yy18;
break;
- case 157: /* expr ::= VARIABLE */
+ 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;
- spanExpr(&yymsp[0].minor.yy190, pParse, TK_VARIABLE, yymsp[0].minor.yy0);
- sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy190.pExpr, n);
+ yymsp[0].minor.yy18 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0);
+ sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy18, 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
** in the virtual machine. #N is the N-th register. */
Token t = yymsp[0].minor.yy0; /*A-overwrites-X*/
assert( t.n>=2 );
- spanSet(&yymsp[0].minor.yy190, &t, &t);
if( pParse->nested==0 ){
sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
- yymsp[0].minor.yy190.pExpr = 0;
+ yymsp[0].minor.yy18 = 0;
}else{
- yymsp[0].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
- if( yymsp[0].minor.yy190.pExpr ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy190.pExpr->iTable);
+ yymsp[0].minor.yy18 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
+ if( yymsp[0].minor.yy18 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy18->iTable);
}
}
}
break;
- case 158: /* expr ::= expr COLLATE ID|STRING */
+ case 171: /* expr ::= expr COLLATE ID|STRING */
{
- yymsp[-2].minor.yy190.pExpr = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy190.pExpr, &yymsp[0].minor.yy0, 1);
- yymsp[-2].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
+ yymsp[-2].minor.yy18 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy18, &yymsp[0].minor.yy0, 1);
}
break;
- case 159: /* expr ::= CAST LP expr AS typetoken RP */
+ case 172: /* expr ::= CAST LP expr AS typetoken RP */
{
- spanSet(&yymsp[-5].minor.yy190,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
- yymsp[-5].minor.yy190.pExpr = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1);
- sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy190.pExpr, yymsp[-3].minor.yy190.pExpr, 0);
+ 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);
}
break;
- case 160: /* expr ::= ID|INDEXED LP distinct exprlist RP */
+ case 173: /* expr ::= ID|INDEXED LP distinct exprlist RP */
{
- if( yymsp[-1].minor.yy148 && yymsp[-1].minor.yy148->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
- sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0);
- }
- yylhsminor.yy190.pExpr = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy148, &yymsp[-4].minor.yy0);
- spanSet(&yylhsminor.yy190,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0);
- if( yymsp[-2].minor.yy194==SF_Distinct && yylhsminor.yy190.pExpr ){
- yylhsminor.yy190.pExpr->flags |= EP_Distinct;
- }
+ yylhsminor.yy18 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy420, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy70);
}
- yymsp[-4].minor.yy190 = yylhsminor.yy190;
+ yymsp[-4].minor.yy18 = yylhsminor.yy18;
break;
- case 161: /* expr ::= ID|INDEXED LP STAR RP */
+ case 174: /* expr ::= ID|INDEXED LP STAR RP */
{
- yylhsminor.yy190.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0);
- spanSet(&yylhsminor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0);
+ yylhsminor.yy18 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0);
}
- yymsp[-3].minor.yy190 = yylhsminor.yy190;
+ yymsp[-3].minor.yy18 = yylhsminor.yy18;
break;
- case 162: /* term ::= CTIME_KW */
+ case 175: /* expr ::= ID|INDEXED LP distinct exprlist RP over_clause */
{
- yylhsminor.yy190.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0);
- spanSet(&yylhsminor.yy190, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0);
+ yylhsminor.yy18 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy420, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy70);
+ sqlite3WindowAttach(pParse, yylhsminor.yy18, yymsp[0].minor.yy327);
}
- yymsp[0].minor.yy190 = yylhsminor.yy190;
+ yymsp[-5].minor.yy18 = yylhsminor.yy18;
break;
- case 163: /* expr ::= LP nexprlist COMMA expr RP */
+ case 176: /* expr ::= ID|INDEXED LP STAR RP over_clause */
{
- ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy148, yymsp[-1].minor.yy190.pExpr);
- yylhsminor.yy190.pExpr = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
- if( yylhsminor.yy190.pExpr ){
- yylhsminor.yy190.pExpr->x.pList = pList;
- spanSet(&yylhsminor.yy190, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0);
+ yylhsminor.yy18 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0);
+ sqlite3WindowAttach(pParse, yylhsminor.yy18, yymsp[0].minor.yy327);
+}
+ yymsp[-4].minor.yy18 = yylhsminor.yy18;
+ break;
+ case 177: /* term ::= CTIME_KW */
+{
+ yylhsminor.yy18 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0);
+}
+ yymsp[0].minor.yy18 = yylhsminor.yy18;
+ 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;
}else{
sqlite3ExprListDelete(pParse->db, pList);
}
}
- yymsp[-4].minor.yy190 = yylhsminor.yy190;
break;
- case 164: /* expr ::= expr AND expr */
- case 165: /* expr ::= expr OR expr */ yytestcase(yyruleno==165);
- case 166: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==166);
- case 167: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==167);
- case 168: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==168);
- case 169: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==169);
- case 170: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==170);
- case 171: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==171);
-{spanBinaryExpr(pParse,yymsp[-1].major,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy190);}
+ case 179: /* expr ::= expr AND expr */
+ case 180: /* expr ::= expr OR expr */ yytestcase(yyruleno==180);
+ case 181: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==181);
+ case 182: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==182);
+ case 183: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==183);
+ 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);}
break;
- case 172: /* likeop ::= NOT LIKE_KW|MATCH */
+ 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*/}
break;
- case 173: /* expr ::= expr likeop expr */
+ case 188: /* expr ::= expr likeop expr */
{
ExprList *pList;
int bNot = yymsp[-1].minor.yy0.n & 0x80000000;
yymsp[-1].minor.yy0.n &= 0x7fffffff;
- pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy190.pExpr);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy190.pExpr);
- yymsp[-2].minor.yy190.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0);
- exprNot(pParse, bNot, &yymsp[-2].minor.yy190);
- yymsp[-2].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd;
- if( yymsp[-2].minor.yy190.pExpr ) yymsp[-2].minor.yy190.pExpr->flags |= EP_InfixFunc;
+ 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;
}
break;
- case 174: /* expr ::= expr likeop expr ESCAPE expr */
+ case 189: /* expr ::= expr likeop expr ESCAPE expr */
{
ExprList *pList;
int bNot = yymsp[-3].minor.yy0.n & 0x80000000;
yymsp[-3].minor.yy0.n &= 0x7fffffff;
- pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy190.pExpr);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy190.pExpr);
- yymsp[-4].minor.yy190.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0);
- exprNot(pParse, bNot, &yymsp[-4].minor.yy190);
- yymsp[-4].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd;
- if( yymsp[-4].minor.yy190.pExpr ) yymsp[-4].minor.yy190.pExpr->flags |= EP_InfixFunc;
+ 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;
}
break;
- case 175: /* expr ::= expr ISNULL|NOTNULL */
-{spanUnaryPostfix(pParse,yymsp[0].major,&yymsp[-1].minor.yy190,&yymsp[0].minor.yy0);}
+ case 190: /* expr ::= expr ISNULL|NOTNULL */
+{yymsp[-1].minor.yy18 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy18,0);}
break;
- case 176: /* expr ::= expr NOT NULL */
-{spanUnaryPostfix(pParse,TK_NOTNULL,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy0);}
+ case 191: /* expr ::= expr NOT NULL */
+{yymsp[-2].minor.yy18 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy18,0);}
break;
- case 177: /* expr ::= expr IS expr */
+ case 192: /* expr ::= expr IS expr */
{
- spanBinaryExpr(pParse,TK_IS,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy190);
- binaryToUnaryIfNull(pParse, yymsp[0].minor.yy190.pExpr, yymsp[-2].minor.yy190.pExpr, TK_ISNULL);
+ 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);
}
break;
- case 178: /* expr ::= expr IS NOT expr */
+ case 193: /* expr ::= expr IS NOT expr */
{
- spanBinaryExpr(pParse,TK_ISNOT,&yymsp[-3].minor.yy190,&yymsp[0].minor.yy190);
- binaryToUnaryIfNull(pParse, yymsp[0].minor.yy190.pExpr, yymsp[-3].minor.yy190.pExpr, TK_NOTNULL);
+ 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);
}
break;
- case 179: /* expr ::= NOT expr */
- case 180: /* expr ::= BITNOT expr */ yytestcase(yyruleno==180);
-{spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,yymsp[-1].major,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
- break;
- case 181: /* expr ::= MINUS expr */
-{spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,TK_UMINUS,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
+ 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*/}
break;
- case 182: /* expr ::= PLUS expr */
-{spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,TK_UPLUS,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/}
+ 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);
+ /*A-overwrites-B*/
+}
break;
- case 183: /* between_op ::= BETWEEN */
- case 186: /* in_op ::= IN */ yytestcase(yyruleno==186);
-{yymsp[0].minor.yy194 = 0;}
+ case 197: /* between_op ::= BETWEEN */
+ case 200: /* in_op ::= IN */ yytestcase(yyruleno==200);
+{yymsp[0].minor.yy70 = 0;}
break;
- case 185: /* expr ::= expr between_op expr AND expr */
+ case 199: /* expr ::= expr between_op expr AND expr */
{
- ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy190.pExpr);
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy190.pExpr, 0);
- if( yymsp[-4].minor.yy190.pExpr ){
- yymsp[-4].minor.yy190.pExpr->x.pList = pList;
+ 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;
}else{
sqlite3ExprListDelete(pParse->db, pList);
}
- exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190);
- yymsp[-4].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd;
+ if( yymsp[-3].minor.yy70 ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0);
}
break;
- case 188: /* expr ::= expr in_op LP exprlist RP */
+ case 202: /* expr ::= expr in_op LP exprlist RP */
{
- if( yymsp[-1].minor.yy148==0 ){
+ if( yymsp[-1].minor.yy420==0 ){
/* Expressions of the form
**
** expr1 IN ()
@@ -139993,9 +150394,9 @@ static void yy_reduce(
** simplify to constants 0 (false) and 1 (true), respectively,
** regardless of the value of expr1.
*/
- sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy190.pExpr);
- yymsp[-4].minor.yy190.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[yymsp[-3].minor.yy194],1);
- }else if( yymsp[-1].minor.yy148->nExpr==1 ){
+ 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 ){
/* Expressions of the form:
**
** expr1 IN (?1)
@@ -140012,201 +150413,199 @@ static void 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.yy148->a[0].pExpr;
- yymsp[-1].minor.yy148->a[0].pExpr = 0;
- sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy148);
+ Expr *pRHS = yymsp[-1].minor.yy420->a[0].pExpr;
+ yymsp[-1].minor.yy420->a[0].pExpr = 0;
+ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy420);
/* 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.yy190.pExpr = sqlite3PExpr(pParse, yymsp[-3].minor.yy194 ? TK_NE : TK_EQ, yymsp[-4].minor.yy190.pExpr, pRHS);
+ yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, yymsp[-3].minor.yy70 ? TK_NE : TK_EQ, yymsp[-4].minor.yy18, pRHS);
}else{
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0);
- if( yymsp[-4].minor.yy190.pExpr ){
- yymsp[-4].minor.yy190.pExpr->x.pList = yymsp[-1].minor.yy148;
- sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy190.pExpr);
+ 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);
}else{
- sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy148);
+ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy420);
}
- exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190);
+ if( yymsp[-3].minor.yy70 ) yymsp[-4].minor.yy18 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy18, 0);
}
- yymsp[-4].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
}
break;
- case 189: /* expr ::= LP select RP */
+ case 203: /* expr ::= LP select RP */
{
- spanSet(&yymsp[-2].minor.yy190,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/
- yymsp[-2].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
- sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy190.pExpr, yymsp[-1].minor.yy243);
+ yymsp[-2].minor.yy18 = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
+ sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy18, yymsp[-1].minor.yy489);
}
break;
- case 190: /* expr ::= expr in_op LP select RP */
+ case 204: /* expr ::= expr in_op LP select RP */
{
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0);
- sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy190.pExpr, yymsp[-1].minor.yy243);
- exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190);
- yymsp[-4].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
+ 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);
}
break;
- case 191: /* expr ::= expr in_op nm dbnm paren_exprlist */
+ case 205: /* expr ::= expr in_op nm dbnm paren_exprlist */
{
SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);
- Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
- if( yymsp[0].minor.yy148 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy148);
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0);
- sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy190.pExpr, pSelect);
- exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190);
- yymsp[-4].minor.yy190.zEnd = yymsp[-1].minor.yy0.z ? &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n] : &yymsp[-2].minor.yy0.z[yymsp[-2].minor.yy0.n];
+ 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);
}
break;
- case 192: /* expr ::= EXISTS LP select RP */
+ case 206: /* expr ::= EXISTS LP select RP */
{
Expr *p;
- spanSet(&yymsp[-3].minor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/
- p = yymsp[-3].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
- sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy243);
+ p = yymsp[-3].minor.yy18 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
+ sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy489);
}
break;
- case 193: /* expr ::= CASE case_operand case_exprlist case_else END */
+ case 207: /* expr ::= CASE case_operand case_exprlist case_else END */
{
- spanSet(&yymsp[-4].minor.yy190,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-C*/
- yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy72, 0);
- if( yymsp[-4].minor.yy190.pExpr ){
- yymsp[-4].minor.yy190.pExpr->x.pList = yymsp[-1].minor.yy72 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy148,yymsp[-1].minor.yy72) : yymsp[-2].minor.yy148;
- sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy190.pExpr);
+ 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);
}else{
- sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy148);
- sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy72);
+ sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy420);
+ sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy18);
}
}
break;
- case 194: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
+ case 208: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
{
- yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy148, yymsp[-2].minor.yy190.pExpr);
- yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy148, yymsp[0].minor.yy190.pExpr);
+ 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);
}
break;
- case 195: /* case_exprlist ::= WHEN expr THEN expr */
+ case 209: /* case_exprlist ::= WHEN expr THEN expr */
{
- yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr);
- yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148, yymsp[0].minor.yy190.pExpr);
+ 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);
}
break;
- case 198: /* case_operand ::= expr */
-{yymsp[0].minor.yy72 = yymsp[0].minor.yy190.pExpr; /*A-overwrites-X*/}
+ case 212: /* case_operand ::= expr */
+{yymsp[0].minor.yy18 = yymsp[0].minor.yy18; /*A-overwrites-X*/}
break;
- case 201: /* nexprlist ::= nexprlist COMMA expr */
-{yymsp[-2].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy148,yymsp[0].minor.yy190.pExpr);}
+ case 215: /* nexprlist ::= nexprlist COMMA expr */
+{yymsp[-2].minor.yy420 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy420,yymsp[0].minor.yy18);}
break;
- case 202: /* nexprlist ::= expr */
-{yymsp[0].minor.yy148 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy190.pExpr); /*A-overwrites-Y*/}
+ case 216: /* nexprlist ::= expr */
+{yymsp[0].minor.yy420 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy18); /*A-overwrites-Y*/}
break;
- case 204: /* paren_exprlist ::= LP exprlist RP */
- case 209: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==209);
-{yymsp[-2].minor.yy148 = yymsp[-1].minor.yy148;}
+ 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;}
break;
- case 205: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
+ 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.yy148, yymsp[-10].minor.yy194,
- &yymsp[-11].minor.yy0, yymsp[0].minor.yy72, SQLITE_SO_ASC, yymsp[-8].minor.yy194, SQLITE_IDXTYPE_APPDEF);
+ 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);
+ if( IN_RENAME_OBJECT && pParse->pNewIndex ){
+ sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &yymsp[-4].minor.yy0);
+ }
}
break;
- case 206: /* uniqueflag ::= UNIQUE */
- case 246: /* raisetype ::= ABORT */ yytestcase(yyruleno==246);
-{yymsp[0].minor.yy194 = OE_Abort;}
+ case 220: /* uniqueflag ::= UNIQUE */
+ case 260: /* raisetype ::= ABORT */ yytestcase(yyruleno==260);
+{yymsp[0].minor.yy70 = OE_Abort;}
break;
- case 207: /* uniqueflag ::= */
-{yymsp[1].minor.yy194 = OE_None;}
+ case 221: /* uniqueflag ::= */
+{yymsp[1].minor.yy70 = OE_None;}
break;
- case 210: /* eidlist ::= eidlist COMMA nm collate sortorder */
+ case 224: /* eidlist ::= eidlist COMMA nm collate sortorder */
{
- yymsp[-4].minor.yy148 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy148, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy194, yymsp[0].minor.yy194);
+ yymsp[-4].minor.yy420 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy420, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy70, yymsp[0].minor.yy70);
}
break;
- case 211: /* eidlist ::= nm collate sortorder */
+ case 225: /* eidlist ::= nm collate sortorder */
{
- yymsp[-2].minor.yy148 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy194, yymsp[0].minor.yy194); /*A-overwrites-Y*/
+ yymsp[-2].minor.yy420 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy70, yymsp[0].minor.yy70); /*A-overwrites-Y*/
}
break;
- case 214: /* cmd ::= DROP INDEX ifexists fullname */
-{sqlite3DropIndex(pParse, yymsp[0].minor.yy185, yymsp[-1].minor.yy194);}
+ case 228: /* cmd ::= DROP INDEX ifexists fullname */
+{sqlite3DropIndex(pParse, yymsp[0].minor.yy135, yymsp[-1].minor.yy70);}
break;
- case 215: /* cmd ::= VACUUM */
+ case 229: /* cmd ::= VACUUM */
{sqlite3Vacuum(pParse,0);}
break;
- case 216: /* cmd ::= VACUUM nm */
+ case 230: /* cmd ::= VACUUM nm */
{sqlite3Vacuum(pParse,&yymsp[0].minor.yy0);}
break;
- case 217: /* cmd ::= PRAGMA nm dbnm */
+ case 231: /* cmd ::= PRAGMA nm dbnm */
{sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);}
break;
- case 218: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
+ case 232: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);}
break;
- case 219: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
+ case 233: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);}
break;
- case 220: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
+ case 234: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);}
break;
- case 221: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
+ case 235: /* 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 224: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
+ case 238: /* 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.yy145, &all);
+ sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy207, &all);
}
break;
- case 225: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
+ case 239: /* 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.yy194, yymsp[-4].minor.yy332.a, yymsp[-4].minor.yy332.b, yymsp[-2].minor.yy185, yymsp[0].minor.yy72, yymsp[-10].minor.yy194, yymsp[-8].minor.yy194);
+ 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);
yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/
}
break;
- case 226: /* trigger_time ::= BEFORE|AFTER */
-{ yymsp[0].minor.yy194 = yymsp[0].major; /*A-overwrites-X*/ }
+ case 240: /* trigger_time ::= BEFORE|AFTER */
+{ yymsp[0].minor.yy70 = yymsp[0].major; /*A-overwrites-X*/ }
break;
- case 227: /* trigger_time ::= INSTEAD OF */
-{ yymsp[-1].minor.yy194 = TK_INSTEAD;}
+ case 241: /* trigger_time ::= INSTEAD OF */
+{ yymsp[-1].minor.yy70 = TK_INSTEAD;}
break;
- case 228: /* trigger_time ::= */
-{ yymsp[1].minor.yy194 = TK_BEFORE; }
+ case 242: /* trigger_time ::= */
+{ yymsp[1].minor.yy70 = TK_BEFORE; }
break;
- case 229: /* trigger_event ::= DELETE|INSERT */
- case 230: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==230);
-{yymsp[0].minor.yy332.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy332.b = 0;}
+ 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;}
break;
- case 231: /* trigger_event ::= UPDATE OF idlist */
-{yymsp[-2].minor.yy332.a = TK_UPDATE; yymsp[-2].minor.yy332.b = yymsp[0].minor.yy254;}
+ case 245: /* trigger_event ::= UPDATE OF idlist */
+{yymsp[-2].minor.yy34.a = TK_UPDATE; yymsp[-2].minor.yy34.b = yymsp[0].minor.yy48;}
break;
- case 232: /* when_clause ::= */
- case 251: /* key_opt ::= */ yytestcase(yyruleno==251);
-{ yymsp[1].minor.yy72 = 0; }
+ case 246: /* when_clause ::= */
+ case 265: /* key_opt ::= */ yytestcase(yyruleno==265);
+ case 307: /* filter_opt ::= */ yytestcase(yyruleno==307);
+{ yymsp[1].minor.yy18 = 0; }
break;
- case 233: /* when_clause ::= WHEN expr */
- case 252: /* key_opt ::= KEY expr */ yytestcase(yyruleno==252);
-{ yymsp[-1].minor.yy72 = yymsp[0].minor.yy190.pExpr; }
+ case 247: /* when_clause ::= WHEN expr */
+ case 266: /* key_opt ::= KEY expr */ yytestcase(yyruleno==266);
+{ yymsp[-1].minor.yy18 = yymsp[0].minor.yy18; }
break;
- case 234: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+ case 248: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
{
- assert( yymsp[-2].minor.yy145!=0 );
- yymsp[-2].minor.yy145->pLast->pNext = yymsp[-1].minor.yy145;
- yymsp[-2].minor.yy145->pLast = yymsp[-1].minor.yy145;
+ 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;
}
break;
- case 235: /* trigger_cmd_list ::= trigger_cmd SEMI */
+ case 249: /* trigger_cmd_list ::= trigger_cmd SEMI */
{
- assert( yymsp[-1].minor.yy145!=0 );
- yymsp[-1].minor.yy145->pLast = yymsp[-1].minor.yy145;
+ assert( yymsp[-1].minor.yy207!=0 );
+ yymsp[-1].minor.yy207->pLast = yymsp[-1].minor.yy207;
}
break;
- case 236: /* trnm ::= nm DOT nm */
+ case 250: /* trnm ::= nm DOT nm */
{
yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;
sqlite3ErrorMsg(pParse,
@@ -140214,196 +150613,306 @@ static void yy_reduce(
"statements within triggers");
}
break;
- case 237: /* tridxby ::= INDEXED BY nm */
+ case 251: /* tridxby ::= INDEXED BY nm */
{
sqlite3ErrorMsg(pParse,
"the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
"within triggers");
}
break;
- case 238: /* tridxby ::= NOT INDEXED */
+ case 252: /* tridxby ::= NOT INDEXED */
{
sqlite3ErrorMsg(pParse,
"the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
"within triggers");
}
break;
- case 239: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */
-{yymsp[-6].minor.yy145 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy148, yymsp[0].minor.yy72, yymsp[-5].minor.yy194);}
+ 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;
break;
- case 240: /* trigger_cmd ::= insert_cmd INTO trnm idlist_opt select */
-{yymsp[-4].minor.yy145 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy254, yymsp[0].minor.yy243, yymsp[-4].minor.yy194);/*A-overwrites-R*/}
+ case 254: /* 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*/
+}
+ yymsp[-7].minor.yy207 = yylhsminor.yy207;
break;
- case 241: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */
-{yymsp[-4].minor.yy145 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy72);}
+ 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;
break;
- case 242: /* trigger_cmd ::= select */
-{yymsp[0].minor.yy145 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy243); /*A-overwrites-X*/}
+ 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;
break;
- case 243: /* expr ::= RAISE LP IGNORE RP */
+ case 257: /* expr ::= RAISE LP IGNORE RP */
{
- spanSet(&yymsp[-3].minor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
- yymsp[-3].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
- if( yymsp[-3].minor.yy190.pExpr ){
- yymsp[-3].minor.yy190.pExpr->affinity = OE_Ignore;
+ yymsp[-3].minor.yy18 = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
+ if( yymsp[-3].minor.yy18 ){
+ yymsp[-3].minor.yy18->affinity = OE_Ignore;
}
}
break;
- case 244: /* expr ::= RAISE LP raisetype COMMA nm RP */
+ case 258: /* expr ::= RAISE LP raisetype COMMA nm RP */
{
- spanSet(&yymsp[-5].minor.yy190,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/
- yymsp[-5].minor.yy190.pExpr = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1);
- if( yymsp[-5].minor.yy190.pExpr ) {
- yymsp[-5].minor.yy190.pExpr->affinity = (char)yymsp[-3].minor.yy194;
+ 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;
}
}
break;
- case 245: /* raisetype ::= ROLLBACK */
-{yymsp[0].minor.yy194 = OE_Rollback;}
+ case 259: /* raisetype ::= ROLLBACK */
+{yymsp[0].minor.yy70 = OE_Rollback;}
break;
- case 247: /* raisetype ::= FAIL */
-{yymsp[0].minor.yy194 = OE_Fail;}
+ case 261: /* raisetype ::= FAIL */
+{yymsp[0].minor.yy70 = OE_Fail;}
break;
- case 248: /* cmd ::= DROP TRIGGER ifexists fullname */
+ case 262: /* cmd ::= DROP TRIGGER ifexists fullname */
{
- sqlite3DropTrigger(pParse,yymsp[0].minor.yy185,yymsp[-1].minor.yy194);
+ sqlite3DropTrigger(pParse,yymsp[0].minor.yy135,yymsp[-1].minor.yy70);
}
break;
- case 249: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
+ case 263: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
{
- sqlite3Attach(pParse, yymsp[-3].minor.yy190.pExpr, yymsp[-1].minor.yy190.pExpr, yymsp[0].minor.yy72);
+ sqlite3Attach(pParse, yymsp[-3].minor.yy18, yymsp[-1].minor.yy18, yymsp[0].minor.yy18);
}
break;
- case 250: /* cmd ::= DETACH database_kw_opt expr */
+ case 264: /* cmd ::= DETACH database_kw_opt expr */
{
- sqlite3Detach(pParse, yymsp[0].minor.yy190.pExpr);
+ sqlite3Detach(pParse, yymsp[0].minor.yy18);
}
break;
- case 253: /* cmd ::= REINDEX */
+ case 267: /* cmd ::= REINDEX */
{sqlite3Reindex(pParse, 0, 0);}
break;
- case 254: /* cmd ::= REINDEX nm dbnm */
+ case 268: /* cmd ::= REINDEX nm dbnm */
{sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
break;
- case 255: /* cmd ::= ANALYZE */
+ case 269: /* cmd ::= ANALYZE */
{sqlite3Analyze(pParse, 0, 0);}
break;
- case 256: /* cmd ::= ANALYZE nm dbnm */
+ case 270: /* cmd ::= ANALYZE nm dbnm */
{sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
break;
- case 257: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
+ case 271: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
{
- sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy185,&yymsp[0].minor.yy0);
+ sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy135,&yymsp[0].minor.yy0);
}
break;
- case 258: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
+ case 272: /* 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 259: /* add_column_fullname ::= fullname */
+ case 273: /* add_column_fullname ::= fullname */
{
disableLookaside(pParse);
- sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy185);
+ sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy135);
}
break;
- case 260: /* cmd ::= create_vtab */
+ case 274: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */
+{
+ sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy135, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);
+}
+ break;
+ case 275: /* cmd ::= create_vtab */
{sqlite3VtabFinishParse(pParse,0);}
break;
- case 261: /* cmd ::= create_vtab LP vtabarglist RP */
+ case 276: /* cmd ::= create_vtab LP vtabarglist RP */
{sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);}
break;
- case 262: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
+ case 277: /* 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.yy194);
+ sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy70);
}
break;
- case 263: /* vtabarg ::= */
+ case 278: /* vtabarg ::= */
{sqlite3VtabArgInit(pParse);}
break;
- case 264: /* vtabargtoken ::= ANY */
- case 265: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==265);
- case 266: /* lp ::= LP */ yytestcase(yyruleno==266);
+ case 279: /* vtabargtoken ::= ANY */
+ case 280: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==280);
+ case 281: /* lp ::= LP */ yytestcase(yyruleno==281);
{sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);}
break;
- case 267: /* with ::= */
-{yymsp[1].minor.yy285 = 0;}
+ case 282: /* with ::= WITH wqlist */
+ case 283: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==283);
+{ sqlite3WithPush(pParse, yymsp[0].minor.yy449, 1); }
+ break;
+ case 284: /* 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*/
+}
+ break;
+ case 285: /* 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);
+}
break;
- case 268: /* with ::= WITH wqlist */
-{ yymsp[-1].minor.yy285 = yymsp[0].minor.yy285; }
+ case 286: /* windowdefn_list ::= windowdefn */
+{ yylhsminor.yy327 = yymsp[0].minor.yy327; }
+ yymsp[0].minor.yy327 = yylhsminor.yy327;
break;
- case 269: /* with ::= WITH RECURSIVE wqlist */
-{ yymsp[-2].minor.yy285 = yymsp[0].minor.yy285; }
+ case 287: /* 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;
+}
+ yymsp[-2].minor.yy327 = yylhsminor.yy327;
break;
- case 270: /* wqlist ::= nm eidlist_opt AS LP select RP */
+ case 288: /* windowdefn ::= nm AS window */
{
- yymsp[-5].minor.yy285 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy148, yymsp[-1].minor.yy243); /*A-overwrites-X*/
+ if( ALWAYS(yymsp[0].minor.yy327) ){
+ yymsp[0].minor.yy327->zName = sqlite3DbStrNDup(pParse->db, yymsp[-2].minor.yy0.z, yymsp[-2].minor.yy0.n);
+ }
+ yylhsminor.yy327 = yymsp[0].minor.yy327;
}
+ yymsp[-2].minor.yy327 = yylhsminor.yy327;
break;
- case 271: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */
+ case 289: /* window ::= LP part_opt orderby_opt frame_opt RP */
{
- yymsp[-7].minor.yy285 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy285, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy148, yymsp[-1].minor.yy243);
+ 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;
+ }
}
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 */
+{
+ yylhsminor.yy327 = yymsp[0].minor.yy327;
+ assert( yylhsminor.yy327!=0 );
+ yylhsminor.yy327->pFilter = yymsp[-2].minor.yy18;
+}
+ yymsp[-2].minor.yy327 = yylhsminor.yy327;
+ break;
+ case 306: /* over_clause ::= filter_opt OVER nm */
+{
+ 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;
+ }else{
+ sqlite3ExprDelete(pParse->db, yymsp[-2].minor.yy18);
+ }
+}
+ yymsp[-2].minor.yy327 = yylhsminor.yy327;
+ break;
+ case 308: /* filter_opt ::= FILTER LP WHERE expr RP */
+{ yymsp[-4].minor.yy18 = yymsp[-1].minor.yy18; }
+ break;
default:
- /* (272) input ::= cmdlist */ yytestcase(yyruleno==272);
- /* (273) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==273);
- /* (274) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=274);
- /* (275) ecmd ::= SEMI */ yytestcase(yyruleno==275);
- /* (276) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==276);
- /* (277) explain ::= */ yytestcase(yyruleno==277);
- /* (278) trans_opt ::= */ yytestcase(yyruleno==278);
- /* (279) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==279);
- /* (280) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==280);
- /* (281) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==281);
- /* (282) savepoint_opt ::= */ yytestcase(yyruleno==282);
- /* (283) cmd ::= create_table create_table_args */ yytestcase(yyruleno==283);
- /* (284) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==284);
- /* (285) columnlist ::= columnname carglist */ yytestcase(yyruleno==285);
- /* (286) nm ::= ID|INDEXED */ yytestcase(yyruleno==286);
- /* (287) nm ::= STRING */ yytestcase(yyruleno==287);
- /* (288) nm ::= JOIN_KW */ yytestcase(yyruleno==288);
- /* (289) typetoken ::= typename */ yytestcase(yyruleno==289);
- /* (290) typename ::= ID|STRING */ yytestcase(yyruleno==290);
- /* (291) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=291);
- /* (292) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=292);
- /* (293) carglist ::= carglist ccons */ yytestcase(yyruleno==293);
- /* (294) carglist ::= */ yytestcase(yyruleno==294);
- /* (295) ccons ::= NULL onconf */ yytestcase(yyruleno==295);
- /* (296) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==296);
- /* (297) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==297);
- /* (298) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=298);
- /* (299) tconscomma ::= */ yytestcase(yyruleno==299);
- /* (300) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=300);
- /* (301) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=301);
- /* (302) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=302);
- /* (303) oneselect ::= values */ yytestcase(yyruleno==303);
- /* (304) sclp ::= selcollist COMMA */ yytestcase(yyruleno==304);
- /* (305) as ::= ID|STRING */ yytestcase(yyruleno==305);
- /* (306) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=306);
- /* (307) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==307);
- /* (308) exprlist ::= nexprlist */ yytestcase(yyruleno==308);
- /* (309) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=309);
- /* (310) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=310);
- /* (311) nmnum ::= ON */ yytestcase(yyruleno==311);
- /* (312) nmnum ::= DELETE */ yytestcase(yyruleno==312);
- /* (313) nmnum ::= DEFAULT */ yytestcase(yyruleno==313);
- /* (314) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==314);
- /* (315) foreach_clause ::= */ yytestcase(yyruleno==315);
- /* (316) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==316);
- /* (317) trnm ::= nm */ yytestcase(yyruleno==317);
- /* (318) tridxby ::= */ yytestcase(yyruleno==318);
- /* (319) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==319);
- /* (320) database_kw_opt ::= */ yytestcase(yyruleno==320);
- /* (321) kwcolumn_opt ::= */ yytestcase(yyruleno==321);
- /* (322) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==322);
- /* (323) vtabarglist ::= vtabarg */ yytestcase(yyruleno==323);
- /* (324) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==324);
- /* (325) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==325);
- /* (326) anylist ::= */ yytestcase(yyruleno==326);
- /* (327) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==327);
- /* (328) anylist ::= anylist ANY */ yytestcase(yyruleno==328);
+ /* (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);
break;
/********** End reduce actions ************************************************/
};
@@ -140419,16 +150928,12 @@ static void yy_reduce(
/* It is not possible for a REDUCE to be followed by an error */
assert( yyact!=YY_ERROR_ACTION );
- if( yyact==YY_ACCEPT_ACTION ){
- yypParser->yytos += yysize;
- yy_accept(yypParser);
- }else{
- yymsp += yysize+1;
- yypParser->yytos = yymsp;
- yymsp->stateno = (YYACTIONTYPE)yyact;
- yymsp->major = (YYCODETYPE)yygoto;
- yyTraceShift(yypParser, yyact);
- }
+ yymsp += yysize+1;
+ yypParser->yytos = yymsp;
+ yymsp->stateno = (YYACTIONTYPE)yyact;
+ yymsp->major = (YYCODETYPE)yygoto;
+ yyTraceShift(yypParser, yyact, "... then shift");
+ return yyact;
}
/*
@@ -140438,7 +150943,8 @@ static void yy_reduce(
static void yy_parse_failed(
yyParser *yypParser /* The parser */
){
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ sqlite3ParserCTX_FETCH
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);
@@ -140449,7 +150955,8 @@ static void yy_parse_failed(
** parser fails */
/************ Begin %parse_failure code ***************************************/
/************ End %parse_failure code *****************************************/
- sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserCTX_STORE
}
#endif /* YYNOERRORRECOVERY */
@@ -140461,15 +150968,20 @@ static void yy_syntax_error(
int yymajor, /* The major type of the error token */
sqlite3ParserTOKENTYPE yyminor /* The minor type of the error token */
){
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ sqlite3ParserCTX_FETCH
#define TOKEN yyminor
/************ Begin %syntax_error code ****************************************/
UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */
- assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */
- sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
+ if( TOKEN.z[0] ){
+ sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
+ }else{
+ sqlite3ErrorMsg(pParse, "incomplete input");
+ }
/************ End %syntax_error code ******************************************/
- sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserCTX_STORE
}
/*
@@ -140478,7 +150990,8 @@ static void yy_syntax_error(
static void yy_accept(
yyParser *yypParser /* The parser */
){
- sqlite3ParserARG_FETCH;
+ sqlite3ParserARG_FETCH
+ sqlite3ParserCTX_FETCH
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);
@@ -140492,7 +151005,8 @@ static void yy_accept(
** parser accepts */
/*********** Begin %parse_accept code *****************************************/
/*********** End %parse_accept code *******************************************/
- sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3ParserCTX_STORE
}
/* The main parser program.
@@ -140521,38 +151035,51 @@ SQLITE_PRIVATE void sqlite3Parser(
sqlite3ParserARG_PDECL /* Optional %extra_argument parameter */
){
YYMINORTYPE yyminorunion;
- unsigned int yyact; /* The parser action. */
+ YYACTIONTYPE yyact; /* The parser action. */
#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
int yyendofinput; /* True if we are at the end of input */
#endif
#ifdef YYERRORSYMBOL
int yyerrorhit = 0; /* True if yymajor has invoked an error */
#endif
- yyParser *yypParser; /* The parser */
+ yyParser *yypParser = (yyParser*)yyp; /* The parser */
+ sqlite3ParserCTX_FETCH
+ sqlite3ParserARG_STORE
- yypParser = (yyParser*)yyp;
assert( yypParser->yytos!=0 );
#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
yyendofinput = (yymajor==0);
#endif
- sqlite3ParserARG_STORE;
+ yyact = yypParser->yytos->stateno;
#ifndef NDEBUG
if( yyTraceFILE ){
- fprintf(yyTraceFILE,"%sInput '%s'\n",yyTracePrompt,yyTokenName[yymajor]);
+ if( yyact < YY_MIN_REDUCE ){
+ fprintf(yyTraceFILE,"%sInput '%s' in state %d\n",
+ yyTracePrompt,yyTokenName[yymajor],yyact);
+ }else{
+ fprintf(yyTraceFILE,"%sInput '%s' with pending reduce %d\n",
+ yyTracePrompt,yyTokenName[yymajor],yyact-YY_MIN_REDUCE);
+ }
}
#endif
do{
- yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
- if( yyact <= YY_MAX_SHIFTREDUCE ){
- yy_shift(yypParser,yyact,yymajor,yyminor);
+ assert( yyact==yypParser->yytos->stateno );
+ yyact = yy_find_shift_action((YYCODETYPE)yymajor,yyact);
+ if( yyact >= YY_MIN_REDUCE ){
+ yyact = yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor,
+ yyminor sqlite3ParserCTX_PARAM);
+ }else if( yyact <= YY_MAX_SHIFTREDUCE ){
+ yy_shift(yypParser,yyact,(YYCODETYPE)yymajor,yyminor);
#ifndef YYNOERRORRECOVERY
yypParser->yyerrcnt--;
#endif
- yymajor = YYNOCODE;
- }else if( yyact <= YY_MAX_REDUCE ){
- yy_reduce(yypParser,yyact-YY_MIN_REDUCE);
+ break;
+ }else if( yyact==YY_ACCEPT_ACTION ){
+ yypParser->yytos--;
+ yy_accept(yypParser);
+ return;
}else{
assert( yyact == YY_ERROR_ACTION );
yyminorunion.yy0 = yyminor;
@@ -140599,10 +151126,9 @@ SQLITE_PRIVATE void sqlite3Parser(
yymajor = YYNOCODE;
}else{
while( yypParser->yytos >= yypParser->yystack
- && yymx != YYERRORSYMBOL
&& (yyact = yy_find_reduce_action(
yypParser->yytos->stateno,
- YYERRORSYMBOL)) >= YY_MIN_REDUCE
+ YYERRORSYMBOL)) > YY_MAX_SHIFTREDUCE
){
yy_pop_parser_stack(yypParser);
}
@@ -140619,6 +151145,8 @@ SQLITE_PRIVATE void sqlite3Parser(
}
yypParser->yyerrcnt = 3;
yyerrorhit = 1;
+ if( yymajor==YYNOCODE ) break;
+ yyact = yypParser->yytos->stateno;
#elif defined(YYNOERRORRECOVERY)
/* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
** do any kind of error recovery. Instead, simply invoke the syntax
@@ -140629,8 +151157,7 @@ SQLITE_PRIVATE void sqlite3Parser(
*/
yy_syntax_error(yypParser,yymajor, yyminor);
yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
- yymajor = YYNOCODE;
-
+ break;
#else /* YYERRORSYMBOL is not defined */
/* This is what we do if the grammar does not define ERROR:
**
@@ -140652,10 +151179,10 @@ SQLITE_PRIVATE void sqlite3Parser(
yypParser->yyerrcnt = -1;
#endif
}
- yymajor = YYNOCODE;
+ break;
#endif
}
- }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack );
+ }while( yypParser->yytos>yypParser->yystack );
#ifndef NDEBUG
if( yyTraceFILE ){
yyStackEntry *i;
@@ -140671,6 +151198,21 @@ SQLITE_PRIVATE void sqlite3Parser(
return;
}
+/*
+** Return the fallback token corresponding to canonical token iToken, or
+** 0 if iToken has no fallback.
+*/
+SQLITE_PRIVATE int sqlite3ParserFallback(int iToken){
+#ifdef YYFALLBACK
+ if( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ){
+ return yyFallback[iToken];
+ }
+#else
+ (void)iToken;
+#endif
+ return 0;
+}
+
/************** End of parse.c ***********************************************/
/************** Begin file tokenize.c ****************************************/
/*
@@ -140729,11 +151271,12 @@ SQLITE_PRIVATE void sqlite3Parser(
#define CC_TILDA 25 /* '~' */
#define CC_DOT 26 /* '.' */
#define CC_ILLEGAL 27 /* Illegal character */
+#define CC_NUL 28 /* 0x00 */
static const unsigned char aiClass[] = {
#ifdef SQLITE_ASCII
/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */
-/* 0x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 7, 27, 7, 7, 27, 27,
+/* 0x */ 28, 27, 27, 27, 27, 27, 27, 27, 27, 7, 7, 27, 7, 7, 27, 27,
/* 1x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
/* 2x */ 7, 15, 8, 5, 4, 22, 24, 8, 17, 18, 21, 20, 23, 11, 26, 16,
/* 3x */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 19, 12, 14, 13, 6,
@@ -140832,19 +151375,20 @@ const unsigned char ebcdicToAscii[] = {
** is substantially reduced. This is important for embedded applications
** on platforms with limited memory.
*/
-/* Hash score: 182 */
-/* zKWText[] encodes 834 bytes of keyword text in 554 bytes */
+/* Hash score: 208 */
+/* zKWText[] encodes 923 bytes of keyword text in 614 bytes */
/* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */
/* ABLEFTHENDEFERRABLELSEXCEPTRANSACTIONATURALTERAISEXCLUSIVE */
/* XISTSAVEPOINTERSECTRIGGEREFERENCESCONSTRAINTOFFSETEMPORARY */
-/* UNIQUERYWITHOUTERELEASEATTACHAVINGROUPDATEBEGINNERECURSIVE */
-/* BETWEENOTNULLIKECASCADELETECASECOLLATECREATECURRENT_DATEDETACH */
-/* IMMEDIATEJOINSERTMATCHPLANALYZEPRAGMABORTVALUESVIRTUALIMITWHEN */
-/* WHERENAMEAFTEREPLACEANDEFAULTAUTOINCREMENTCASTCOLUMNCOMMIT */
-/* CONFLICTCROSSCURRENT_TIMESTAMPRIMARYDEFERREDISTINCTDROPFAIL */
-/* FROMFULLGLOBYIFISNULLORDERESTRICTRIGHTROLLBACKROWUNIONUSING */
-/* VACUUMVIEWINITIALLY */
-static const char zKWText[553] = {
+/* UNIQUERYWITHOUTERELEASEATTACHAVINGROUPDATEBEGINNERANGEBETWEEN */
+/* OTHINGLOBYCASCADELETECASECOLLATECREATECURRENT_DATEDETACH */
+/* IMMEDIATEJOINSERTLIKEMATCHPLANALYZEPRAGMABORTVALUESVIRTUALIMIT */
+/* WHENOTNULLWHERECURSIVEAFTERENAMEANDEFAULTAUTOINCREMENTCAST */
+/* COLUMNCOMMITCONFLICTCROSSCURRENT_TIMESTAMPARTITIONDEFERRED */
+/* ISTINCTDROPRECEDINGFAILFILTEREPLACEFOLLOWINGFROMFULLIFISNULL */
+/* ORDERESTRICTOVERIGHTROLLBACKROWSUNBOUNDEDUNIONUSINGVACUUMVIEW */
+/* INDOWINITIALLYPRIMARY */
+static const char zKWText[613] = {
'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H',
'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G',
'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A',
@@ -140857,83 +151401,90 @@ static const char zKWText[553] = {
'O','F','F','S','E','T','E','M','P','O','R','A','R','Y','U','N','I','Q',
'U','E','R','Y','W','I','T','H','O','U','T','E','R','E','L','E','A','S',
'E','A','T','T','A','C','H','A','V','I','N','G','R','O','U','P','D','A',
- 'T','E','B','E','G','I','N','N','E','R','E','C','U','R','S','I','V','E',
- 'B','E','T','W','E','E','N','O','T','N','U','L','L','I','K','E','C','A',
- 'S','C','A','D','E','L','E','T','E','C','A','S','E','C','O','L','L','A',
- 'T','E','C','R','E','A','T','E','C','U','R','R','E','N','T','_','D','A',
- 'T','E','D','E','T','A','C','H','I','M','M','E','D','I','A','T','E','J',
- 'O','I','N','S','E','R','T','M','A','T','C','H','P','L','A','N','A','L',
- 'Y','Z','E','P','R','A','G','M','A','B','O','R','T','V','A','L','U','E',
- 'S','V','I','R','T','U','A','L','I','M','I','T','W','H','E','N','W','H',
- 'E','R','E','N','A','M','E','A','F','T','E','R','E','P','L','A','C','E',
- 'A','N','D','E','F','A','U','L','T','A','U','T','O','I','N','C','R','E',
- 'M','E','N','T','C','A','S','T','C','O','L','U','M','N','C','O','M','M',
- 'I','T','C','O','N','F','L','I','C','T','C','R','O','S','S','C','U','R',
- 'R','E','N','T','_','T','I','M','E','S','T','A','M','P','R','I','M','A',
- 'R','Y','D','E','F','E','R','R','E','D','I','S','T','I','N','C','T','D',
- 'R','O','P','F','A','I','L','F','R','O','M','F','U','L','L','G','L','O',
- 'B','Y','I','F','I','S','N','U','L','L','O','R','D','E','R','E','S','T',
- 'R','I','C','T','R','I','G','H','T','R','O','L','L','B','A','C','K','R',
- 'O','W','U','N','I','O','N','U','S','I','N','G','V','A','C','U','U','M',
- 'V','I','E','W','I','N','I','T','I','A','L','L','Y',
+ 'T','E','B','E','G','I','N','N','E','R','A','N','G','E','B','E','T','W',
+ 'E','E','N','O','T','H','I','N','G','L','O','B','Y','C','A','S','C','A',
+ 'D','E','L','E','T','E','C','A','S','E','C','O','L','L','A','T','E','C',
+ 'R','E','A','T','E','C','U','R','R','E','N','T','_','D','A','T','E','D',
+ 'E','T','A','C','H','I','M','M','E','D','I','A','T','E','J','O','I','N',
+ 'S','E','R','T','L','I','K','E','M','A','T','C','H','P','L','A','N','A',
+ 'L','Y','Z','E','P','R','A','G','M','A','B','O','R','T','V','A','L','U',
+ 'E','S','V','I','R','T','U','A','L','I','M','I','T','W','H','E','N','O',
+ 'T','N','U','L','L','W','H','E','R','E','C','U','R','S','I','V','E','A',
+ 'F','T','E','R','E','N','A','M','E','A','N','D','E','F','A','U','L','T',
+ 'A','U','T','O','I','N','C','R','E','M','E','N','T','C','A','S','T','C',
+ 'O','L','U','M','N','C','O','M','M','I','T','C','O','N','F','L','I','C',
+ 'T','C','R','O','S','S','C','U','R','R','E','N','T','_','T','I','M','E',
+ 'S','T','A','M','P','A','R','T','I','T','I','O','N','D','E','F','E','R',
+ 'R','E','D','I','S','T','I','N','C','T','D','R','O','P','R','E','C','E',
+ 'D','I','N','G','F','A','I','L','F','I','L','T','E','R','E','P','L','A',
+ 'C','E','F','O','L','L','O','W','I','N','G','F','R','O','M','F','U','L',
+ 'L','I','F','I','S','N','U','L','L','O','R','D','E','R','E','S','T','R',
+ 'I','C','T','O','V','E','R','I','G','H','T','R','O','L','L','B','A','C',
+ 'K','R','O','W','S','U','N','B','O','U','N','D','E','D','U','N','I','O',
+ 'N','U','S','I','N','G','V','A','C','U','U','M','V','I','E','W','I','N',
+ 'D','O','W','I','N','I','T','I','A','L','L','Y','P','R','I','M','A','R',
+ 'Y',
};
/* aKWHash[i] is the hash value for the i-th keyword */
static const unsigned char aKWHash[127] = {
- 76, 105, 117, 74, 0, 45, 0, 0, 82, 0, 77, 0, 0,
- 42, 12, 78, 15, 0, 116, 85, 54, 112, 0, 19, 0, 0,
- 121, 0, 119, 115, 0, 22, 93, 0, 9, 0, 0, 70, 71,
- 0, 69, 6, 0, 48, 90, 102, 0, 118, 101, 0, 0, 44,
- 0, 103, 24, 0, 17, 0, 122, 53, 23, 0, 5, 110, 25,
- 96, 0, 0, 124, 106, 60, 123, 57, 28, 55, 0, 91, 0,
- 100, 26, 0, 99, 0, 0, 0, 95, 92, 97, 88, 109, 14,
- 39, 108, 0, 81, 0, 18, 89, 111, 32, 0, 120, 80, 113,
- 62, 46, 84, 0, 0, 94, 40, 59, 114, 0, 36, 0, 0,
- 29, 0, 86, 63, 64, 0, 20, 61, 0, 56,
+ 74, 109, 124, 72, 106, 45, 0, 0, 81, 0, 76, 61, 0,
+ 42, 12, 77, 15, 0, 123, 84, 54, 118, 125, 19, 0, 0,
+ 130, 0, 128, 121, 0, 22, 96, 0, 9, 0, 0, 115, 69,
+ 0, 67, 6, 0, 48, 93, 136, 0, 126, 104, 0, 0, 44,
+ 0, 107, 24, 0, 17, 0, 131, 53, 23, 0, 5, 62, 132,
+ 99, 0, 0, 135, 110, 60, 134, 57, 113, 55, 0, 94, 0,
+ 103, 26, 0, 102, 0, 0, 0, 98, 95, 100, 105, 117, 14,
+ 39, 116, 0, 80, 0, 133, 114, 92, 59, 0, 129, 79, 119,
+ 86, 46, 83, 0, 0, 97, 40, 122, 120, 0, 127, 0, 0,
+ 29, 0, 89, 87, 88, 0, 20, 85, 111, 56,
};
/* aKWNext[] forms the hash collision chain. If aKWHash[i]==0
** then the i-th keyword has no more hash collisions. Otherwise,
** the next keyword with the same hash is aKWHash[i]-1. */
-static const unsigned char aKWNext[124] = {
+static const unsigned char aKWNext[136] = {
0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
0, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,
0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 33, 0, 21, 0, 0, 0, 0, 0, 50,
- 0, 43, 3, 47, 0, 0, 0, 0, 30, 0, 58, 0, 38,
- 0, 0, 0, 1, 66, 0, 0, 67, 0, 41, 0, 0, 0,
- 0, 0, 0, 49, 65, 0, 0, 0, 0, 31, 52, 16, 34,
- 10, 0, 0, 0, 0, 0, 0, 0, 11, 72, 79, 0, 8,
- 0, 104, 98, 0, 107, 0, 87, 0, 75, 51, 0, 27, 37,
- 73, 83, 0, 35, 68, 0, 0,
+ 0, 43, 3, 47, 0, 0, 32, 0, 0, 0, 0, 0, 0,
+ 0, 1, 64, 0, 0, 65, 0, 41, 0, 38, 0, 0, 0,
+ 0, 0, 49, 75, 0, 0, 30, 0, 58, 0, 0, 0, 31,
+ 63, 16, 34, 10, 0, 0, 0, 0, 0, 0, 0, 11, 70,
+ 91, 0, 0, 8, 0, 108, 0, 101, 28, 52, 68, 0, 112,
+ 0, 73, 51, 0, 90, 27, 37, 0, 71, 36, 82, 0, 35,
+ 66, 25, 18, 0, 0, 78,
};
/* aKWLen[i] is the length (in bytes) of the i-th keyword */
-static const unsigned char aKWLen[124] = {
+static const unsigned char aKWLen[136] = {
7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6,
7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 6,
11, 6, 2, 7, 5, 5, 9, 6, 9, 9, 7, 10, 10,
4, 6, 2, 3, 9, 4, 2, 6, 5, 7, 4, 5, 7,
- 6, 6, 5, 6, 5, 5, 9, 7, 7, 3, 2, 4, 4,
- 7, 3, 6, 4, 7, 6, 12, 6, 9, 4, 6, 5, 4,
- 7, 6, 5, 6, 7, 5, 4, 5, 6, 5, 7, 3, 7,
- 13, 2, 2, 4, 6, 6, 8, 5, 17, 12, 7, 8, 8,
- 2, 4, 4, 4, 4, 4, 2, 2, 6, 5, 8, 5, 8,
- 3, 5, 5, 6, 4, 9, 3,
+ 6, 6, 5, 6, 5, 5, 5, 7, 7, 4, 2, 7, 3,
+ 6, 4, 7, 6, 12, 6, 9, 4, 6, 4, 5, 4, 7,
+ 6, 5, 6, 7, 5, 4, 7, 3, 2, 4, 5, 9, 5,
+ 6, 3, 7, 13, 2, 2, 4, 6, 6, 8, 5, 17, 12,
+ 7, 9, 8, 8, 2, 4, 9, 4, 6, 7, 9, 4, 4,
+ 2, 6, 5, 8, 4, 5, 8, 4, 3, 9, 5, 5, 6,
+ 4, 6, 2, 9, 3, 7,
};
/* aKWOffset[i] is the index into zKWText[] of the start of
** the text for the i-th keyword. */
-static const unsigned short int aKWOffset[124] = {
+static const unsigned short int aKWOffset[136] = {
0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33,
36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81,
86, 91, 95, 96, 101, 105, 109, 117, 122, 128, 136, 142, 152,
159, 162, 162, 165, 167, 167, 171, 176, 179, 184, 184, 188, 192,
- 199, 204, 209, 212, 218, 221, 225, 234, 240, 240, 240, 243, 246,
- 250, 251, 255, 261, 265, 272, 278, 290, 296, 305, 307, 313, 318,
- 320, 327, 332, 337, 343, 349, 354, 358, 361, 367, 371, 378, 380,
- 387, 389, 391, 400, 404, 410, 416, 424, 429, 429, 445, 452, 459,
- 460, 467, 471, 475, 479, 483, 486, 488, 490, 496, 500, 508, 513,
- 521, 524, 529, 534, 540, 544, 549,
+ 199, 204, 209, 212, 218, 221, 225, 230, 236, 242, 245, 247, 248,
+ 252, 258, 262, 269, 275, 287, 293, 302, 304, 310, 314, 319, 321,
+ 328, 333, 338, 344, 350, 355, 358, 358, 358, 361, 365, 368, 377,
+ 381, 387, 389, 396, 398, 400, 409, 413, 419, 425, 433, 438, 438,
+ 438, 454, 463, 470, 471, 478, 481, 490, 494, 499, 506, 515, 519,
+ 523, 525, 531, 535, 543, 546, 551, 559, 559, 563, 572, 577, 582,
+ 588, 591, 594, 597, 602, 606,
};
/* aKWCode[i] is the parser symbol code for the i-th keyword */
-static const unsigned char aKWCode[124] = {
+static const unsigned char aKWCode[136] = {
TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE,
TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN,
TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD,
@@ -140945,20 +151496,23 @@ static const unsigned char aKWCode[124] = {
TK_OFFSET, TK_OF, TK_SET, TK_TEMP, TK_TEMP,
TK_OR, TK_UNIQUE, TK_QUERY, TK_WITHOUT, TK_WITH,
TK_JOIN_KW, TK_RELEASE, TK_ATTACH, TK_HAVING, TK_GROUP,
- TK_UPDATE, TK_BEGIN, TK_JOIN_KW, TK_RECURSIVE, TK_BETWEEN,
- TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, TK_LIKE_KW,
- TK_CASCADE, TK_ASC, TK_DELETE, TK_CASE, TK_COLLATE,
- TK_CREATE, TK_CTIME_KW, TK_DETACH, TK_IMMEDIATE, TK_JOIN,
- TK_INSERT, TK_MATCH, TK_PLAN, TK_ANALYZE, TK_PRAGMA,
- TK_ABORT, TK_VALUES, TK_VIRTUAL, TK_LIMIT, TK_WHEN,
- TK_WHERE, TK_RENAME, TK_AFTER, TK_REPLACE, TK_AND,
- TK_DEFAULT, TK_AUTOINCR, TK_TO, TK_IN, TK_CAST,
- TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, TK_JOIN_KW, TK_CTIME_KW,
- TK_CTIME_KW, TK_PRIMARY, TK_DEFERRED, TK_DISTINCT, TK_IS,
- TK_DROP, TK_FAIL, TK_FROM, TK_JOIN_KW, TK_LIKE_KW,
- TK_BY, TK_IF, TK_ISNULL, TK_ORDER, TK_RESTRICT,
- TK_JOIN_KW, TK_ROLLBACK, TK_ROW, TK_UNION, TK_USING,
- TK_VACUUM, TK_VIEW, TK_INITIALLY, TK_ALL,
+ TK_UPDATE, TK_BEGIN, TK_JOIN_KW, TK_RANGE, TK_BETWEEN,
+ TK_NOTHING, TK_LIKE_KW, TK_BY, TK_CASCADE, TK_ASC,
+ TK_DELETE, TK_CASE, TK_COLLATE, TK_CREATE, TK_CTIME_KW,
+ TK_DETACH, TK_IMMEDIATE, TK_JOIN, TK_INSERT, TK_LIKE_KW,
+ TK_MATCH, TK_PLAN, TK_ANALYZE, TK_PRAGMA, TK_ABORT,
+ TK_VALUES, TK_VIRTUAL, TK_LIMIT, TK_WHEN, TK_NOTNULL,
+ TK_NOT, TK_NO, TK_NULL, TK_WHERE, TK_RECURSIVE,
+ TK_AFTER, TK_RENAME, TK_AND, TK_DEFAULT, TK_AUTOINCR,
+ TK_TO, TK_IN, TK_CAST, TK_COLUMNKW, TK_COMMIT,
+ TK_CONFLICT, TK_JOIN_KW, TK_CTIME_KW, TK_CTIME_KW, TK_CURRENT,
+ TK_PARTITION, TK_DEFERRED, TK_DISTINCT, TK_IS, TK_DROP,
+ TK_PRECEDING, TK_FAIL, TK_FILTER, TK_REPLACE, TK_FOLLOWING,
+ TK_FROM, TK_JOIN_KW, TK_IF, TK_ISNULL, TK_ORDER,
+ TK_RESTRICT, TK_OVER, TK_JOIN_KW, TK_ROLLBACK, TK_ROWS,
+ TK_ROW, TK_UNBOUNDED, TK_UNION, TK_USING, TK_VACUUM,
+ TK_VIEW, TK_WINDOW, TK_DO, TK_INITIALLY, TK_ALL,
+ TK_PRIMARY,
};
/* Check to see if z[0..n-1] is a keyword. If it is, write the
** parser symbol code for that keyword into *pType. Always
@@ -141037,72 +151591,84 @@ static int keywordCode(const char *z, int n, int *pType){
testcase( i==55 ); /* UPDATE */
testcase( i==56 ); /* BEGIN */
testcase( i==57 ); /* INNER */
- testcase( i==58 ); /* RECURSIVE */
+ testcase( i==58 ); /* RANGE */
testcase( i==59 ); /* BETWEEN */
- testcase( i==60 ); /* NOTNULL */
- testcase( i==61 ); /* NOT */
- testcase( i==62 ); /* NO */
- testcase( i==63 ); /* NULL */
- testcase( i==64 ); /* LIKE */
- testcase( i==65 ); /* CASCADE */
- testcase( i==66 ); /* ASC */
- testcase( i==67 ); /* DELETE */
- testcase( i==68 ); /* CASE */
- testcase( i==69 ); /* COLLATE */
- testcase( i==70 ); /* CREATE */
- testcase( i==71 ); /* CURRENT_DATE */
- testcase( i==72 ); /* DETACH */
- testcase( i==73 ); /* IMMEDIATE */
- testcase( i==74 ); /* JOIN */
- testcase( i==75 ); /* INSERT */
- testcase( i==76 ); /* MATCH */
- testcase( i==77 ); /* PLAN */
- testcase( i==78 ); /* ANALYZE */
- testcase( i==79 ); /* PRAGMA */
- testcase( i==80 ); /* ABORT */
- testcase( i==81 ); /* VALUES */
- testcase( i==82 ); /* VIRTUAL */
- testcase( i==83 ); /* LIMIT */
- testcase( i==84 ); /* WHEN */
- testcase( i==85 ); /* WHERE */
- testcase( i==86 ); /* RENAME */
- testcase( i==87 ); /* AFTER */
- testcase( i==88 ); /* REPLACE */
- testcase( i==89 ); /* AND */
- testcase( i==90 ); /* DEFAULT */
- testcase( i==91 ); /* AUTOINCREMENT */
- testcase( i==92 ); /* TO */
- testcase( i==93 ); /* IN */
- testcase( i==94 ); /* CAST */
- testcase( i==95 ); /* COLUMN */
- testcase( i==96 ); /* COMMIT */
- testcase( i==97 ); /* CONFLICT */
- testcase( i==98 ); /* CROSS */
- testcase( i==99 ); /* CURRENT_TIMESTAMP */
- testcase( i==100 ); /* CURRENT_TIME */
- testcase( i==101 ); /* PRIMARY */
- testcase( i==102 ); /* DEFERRED */
- testcase( i==103 ); /* DISTINCT */
- testcase( i==104 ); /* IS */
- testcase( i==105 ); /* DROP */
- testcase( i==106 ); /* FAIL */
- testcase( i==107 ); /* FROM */
- testcase( i==108 ); /* FULL */
- testcase( i==109 ); /* GLOB */
- testcase( i==110 ); /* BY */
- testcase( i==111 ); /* IF */
- testcase( i==112 ); /* ISNULL */
- testcase( i==113 ); /* ORDER */
- testcase( i==114 ); /* RESTRICT */
- testcase( i==115 ); /* RIGHT */
- testcase( i==116 ); /* ROLLBACK */
- testcase( i==117 ); /* ROW */
- testcase( i==118 ); /* UNION */
- testcase( i==119 ); /* USING */
- testcase( i==120 ); /* VACUUM */
- testcase( i==121 ); /* VIEW */
- testcase( i==122 ); /* INITIALLY */
- testcase( i==123 ); /* ALL */
+ testcase( i==60 ); /* NOTHING */
+ testcase( i==61 ); /* GLOB */
+ testcase( i==62 ); /* BY */
+ testcase( i==63 ); /* CASCADE */
+ testcase( i==64 ); /* ASC */
+ testcase( i==65 ); /* DELETE */
+ testcase( i==66 ); /* CASE */
+ testcase( i==67 ); /* COLLATE */
+ testcase( i==68 ); /* CREATE */
+ testcase( i==69 ); /* CURRENT_DATE */
+ testcase( i==70 ); /* DETACH */
+ testcase( i==71 ); /* IMMEDIATE */
+ testcase( i==72 ); /* JOIN */
+ testcase( i==73 ); /* INSERT */
+ testcase( i==74 ); /* LIKE */
+ testcase( i==75 ); /* MATCH */
+ testcase( i==76 ); /* PLAN */
+ testcase( i==77 ); /* ANALYZE */
+ testcase( i==78 ); /* PRAGMA */
+ testcase( i==79 ); /* ABORT */
+ testcase( i==80 ); /* VALUES */
+ testcase( i==81 ); /* VIRTUAL */
+ testcase( i==82 ); /* LIMIT */
+ testcase( i==83 ); /* WHEN */
+ testcase( i==84 ); /* NOTNULL */
+ testcase( i==85 ); /* NOT */
+ testcase( i==86 ); /* NO */
+ testcase( i==87 ); /* NULL */
+ testcase( i==88 ); /* WHERE */
+ testcase( i==89 ); /* RECURSIVE */
+ testcase( i==90 ); /* AFTER */
+ testcase( i==91 ); /* RENAME */
+ testcase( i==92 ); /* AND */
+ testcase( i==93 ); /* DEFAULT */
+ testcase( i==94 ); /* AUTOINCREMENT */
+ testcase( i==95 ); /* TO */
+ testcase( i==96 ); /* IN */
+ testcase( i==97 ); /* CAST */
+ testcase( i==98 ); /* COLUMN */
+ testcase( i==99 ); /* COMMIT */
+ testcase( i==100 ); /* CONFLICT */
+ testcase( i==101 ); /* CROSS */
+ testcase( i==102 ); /* CURRENT_TIMESTAMP */
+ testcase( i==103 ); /* CURRENT_TIME */
+ testcase( i==104 ); /* CURRENT */
+ testcase( i==105 ); /* PARTITION */
+ testcase( i==106 ); /* DEFERRED */
+ testcase( i==107 ); /* DISTINCT */
+ testcase( i==108 ); /* IS */
+ testcase( i==109 ); /* DROP */
+ testcase( i==110 ); /* PRECEDING */
+ testcase( i==111 ); /* FAIL */
+ testcase( i==112 ); /* FILTER */
+ testcase( i==113 ); /* REPLACE */
+ testcase( i==114 ); /* FOLLOWING */
+ testcase( i==115 ); /* FROM */
+ testcase( i==116 ); /* FULL */
+ testcase( i==117 ); /* IF */
+ testcase( i==118 ); /* ISNULL */
+ testcase( i==119 ); /* ORDER */
+ testcase( i==120 ); /* RESTRICT */
+ testcase( i==121 ); /* OVER */
+ testcase( i==122 ); /* RIGHT */
+ testcase( i==123 ); /* ROLLBACK */
+ testcase( i==124 ); /* ROWS */
+ testcase( i==125 ); /* ROW */
+ testcase( i==126 ); /* UNBOUNDED */
+ testcase( i==127 ); /* UNION */
+ testcase( i==128 ); /* USING */
+ testcase( i==129 ); /* VACUUM */
+ testcase( i==130 ); /* VIEW */
+ testcase( i==131 ); /* WINDOW */
+ testcase( i==132 ); /* DO */
+ testcase( i==133 ); /* INITIALLY */
+ testcase( i==134 ); /* ALL */
+ testcase( i==135 ); /* PRIMARY */
*pType = aKWCode[i];
break;
}
@@ -141114,7 +151680,17 @@ SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char *z, int n){
keywordCode((char*)z, n, &id);
return id;
}
-#define SQLITE_N_KEYWORD 124
+#define SQLITE_N_KEYWORD 136
+SQLITE_API int sqlite3_keyword_name(int i,const char **pzName,int *pnName){
+ if( i<0 || i>=SQLITE_N_KEYWORD ) return SQLITE_ERROR;
+ *pzName = zKWText + aKWOffset[i];
+ *pnName = aKWLen[i];
+ return SQLITE_OK;
+}
+SQLITE_API int sqlite3_keyword_count(void){ return SQLITE_N_KEYWORD; }
+SQLITE_API int sqlite3_keyword_check(const char *zName, int nName){
+ return TK_ID!=sqlite3KeywordCode((const u8*)zName, nName);
+}
/************** End of keywordhash.h *****************************************/
/************** Continuing where we left off in tokenize.c *******************/
@@ -141158,11 +151734,85 @@ SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[] = {
#define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40]))
#endif
-/* Make the IdChar function accessible from ctime.c */
-#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
+/* Make the IdChar function accessible from ctime.c and alter.c */
SQLITE_PRIVATE int sqlite3IsIdChar(u8 c){ return IdChar(c); }
-#endif
+#ifndef SQLITE_OMIT_WINDOWFUNC
+/*
+** Return the id of the next token in string (*pz). Before returning, set
+** (*pz) to point to the byte following the parsed token.
+*/
+static int getToken(const unsigned char **pz){
+ const unsigned char *z = *pz;
+ int t; /* Token type to return */
+ do {
+ z += sqlite3GetToken(z, &t);
+ }while( t==TK_SPACE );
+ if( t==TK_ID
+ || t==TK_STRING
+ || t==TK_JOIN_KW
+ || t==TK_WINDOW
+ || t==TK_OVER
+ || sqlite3ParserFallback(t)==TK_ID
+ ){
+ t = TK_ID;
+ }
+ *pz = z;
+ return t;
+}
+
+/*
+** The following three functions are called immediately after the tokenizer
+** reads the keywords WINDOW, OVER and FILTER, respectively, to determine
+** whether the token should be treated as a keyword or an SQL identifier.
+** This cannot be handled by the usual lemon %fallback method, due to
+** the ambiguity in some constructions. e.g.
+**
+** SELECT sum(x) OVER ...
+**
+** In the above, "OVER" might be a keyword, or it might be an alias for the
+** sum(x) expression. If a "%fallback ID OVER" directive were added to
+** grammar, then SQLite would always treat "OVER" as an alias, making it
+** impossible to call a window-function without a FILTER clause.
+**
+** WINDOW is treated as a keyword if:
+**
+** * the following token is an identifier, or a keyword that can fallback
+** to being an identifier, and
+** * the token after than one is TK_AS.
+**
+** OVER is a keyword if:
+**
+** * the previous token was TK_RP, and
+** * the next token is either TK_LP or an identifier.
+**
+** FILTER is a keyword if:
+**
+** * the previous token was TK_RP, and
+** * the next token is TK_LP.
+*/
+static int analyzeWindowKeyword(const unsigned char *z){
+ int t;
+ t = getToken(&z);
+ if( t!=TK_ID ) return TK_ID;
+ t = getToken(&z);
+ if( t!=TK_AS ) return TK_ID;
+ return TK_WINDOW;
+}
+static int analyzeOverKeyword(const unsigned char *z, int lastToken){
+ if( lastToken==TK_RP ){
+ int t = getToken(&z);
+ if( t==TK_LP || t==TK_ID ) return TK_OVER;
+ }
+ return TK_ID;
+}
+static int analyzeFilterKeyword(const unsigned char *z, int lastToken){
+ if( lastToken==TK_RP && getToken(&z)==TK_LP ){
+ return TK_FILTER;
+ }
+ return TK_ID;
+}
+#endif /* SQLITE_OMIT_WINDOWFUNC */
/*
** Return the length (in bytes) of the token that begins at z[0].
@@ -141431,6 +152081,10 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
i = 1;
break;
}
+ case CC_NUL: {
+ *tokenType = TK_ILLEGAL;
+ return 0;
+ }
default: {
*tokenType = TK_ILLEGAL;
return 1;
@@ -141441,6 +152095,73 @@ 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
@@ -141471,9 +152192,9 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
/* sqlite3ParserTrace(stdout, "parser: "); */
#ifdef sqlite3Parser_ENGINEALWAYSONSTACK
pEngine = &sEngine;
- sqlite3ParserInit(pEngine);
+ sqlite3ParserInit(pEngine, pParse);
#else
- pEngine = sqlite3ParserAlloc(sqlite3Malloc);
+ pEngine = sqlite3ParserAlloc(sqlite3Malloc, pParse);
if( pEngine==0 ){
sqlite3OomFault(db);
return SQLITE_NOMEM_BKPT;
@@ -141484,47 +152205,64 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
assert( pParse->nVar==0 );
assert( pParse->pVList==0 );
while( 1 ){
- if( zSql[0]!=0 ){
- n = sqlite3GetToken((u8*)zSql, &tokenType);
- mxSqlLen -= n;
- if( mxSqlLen<0 ){
- pParse->rc = SQLITE_TOOBIG;
- break;
- }
- }else{
- /* Upon reaching the end of input, call the parser two more times
- ** with tokens TK_SEMI and 0, in that order. */
- if( lastTokenParsed==TK_SEMI ){
- tokenType = 0;
- }else if( lastTokenParsed==0 ){
- break;
- }else{
- tokenType = TK_SEMI;
- }
- zSql -= n;
+ n = sqlite3GetToken((u8*)zSql, &tokenType);
+ mxSqlLen -= n;
+ if( mxSqlLen<0 ){
+ pParse->rc = SQLITE_TOOBIG;
+ break;
}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( tokenType>=TK_WINDOW ){
+ assert( tokenType==TK_SPACE || tokenType==TK_OVER || tokenType==TK_FILTER
+ || tokenType==TK_ILLEGAL || tokenType==TK_WINDOW
+ );
+#else
if( tokenType>=TK_SPACE ){
assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL );
+#endif /* SQLITE_OMIT_WINDOWFUNC */
if( db->u1.isInterrupted ){
pParse->rc = SQLITE_INTERRUPT;
break;
}
- if( tokenType==TK_ILLEGAL ){
+ if( tokenType==TK_SPACE ){
+ zSql += n;
+ continue;
+ }
+ if( zSql[0]==0 ){
+ /* Upon reaching the end of input, call the parser two more times
+ ** with tokens TK_SEMI and 0, in that order. */
+ if( lastTokenParsed==TK_SEMI ){
+ tokenType = 0;
+ }else if( lastTokenParsed==0 ){
+ break;
+ }else{
+ tokenType = TK_SEMI;
+ }
+ n = 0;
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ }else if( tokenType==TK_WINDOW ){
+ assert( n==6 );
+ tokenType = analyzeWindowKeyword((const u8*)&zSql[6]);
+ }else if( tokenType==TK_OVER ){
+ assert( n==4 );
+ tokenType = analyzeOverKeyword((const u8*)&zSql[4], lastTokenParsed);
+ }else if( tokenType==TK_FILTER ){
+ assert( n==6 );
+ tokenType = analyzeFilterKeyword((const u8*)&zSql[6], lastTokenParsed);
+#endif /* SQLITE_OMIT_WINDOWFUNC */
+ }else{
sqlite3ErrorMsg(pParse, "unrecognized token: \"%.*s\"", n, zSql);
break;
}
- zSql += n;
- }else{
- pParse->sLastToken.z = zSql;
- pParse->sLastToken.n = n;
- sqlite3Parser(pEngine, tokenType, pParse->sLastToken, pParse);
- lastTokenParsed = tokenType;
- zSql += n;
- if( pParse->rc!=SQLITE_OK || db->mallocFailed ) break;
}
+ pParse->sLastToken.z = zSql;
+ pParse->sLastToken.n = n;
+ sqlite3Parser(pEngine, tokenType, pParse->sLastToken);
+ lastTokenParsed = tokenType;
+ zSql += n;
+ if( pParse->rc!=SQLITE_OK || db->mallocFailed ) break;
}
assert( nErr==0 );
- pParse->zTail = zSql;
#ifdef YYTRACKMAXSTACKDEPTH
sqlite3_mutex_enter(sqlite3MallocMutex());
sqlite3StatusHighwater(SQLITE_STATUS_PARSER_STACK,
@@ -141546,10 +152284,12 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
assert( pzErrMsg!=0 );
if( pParse->zErrMsg ){
*pzErrMsg = pParse->zErrMsg;
- sqlite3_log(pParse->rc, "%s", *pzErrMsg);
+ sqlite3_log(pParse->rc, "%s in \"%s\"",
+ *pzErrMsg, pParse->zTail);
pParse->zErrMsg = 0;
nErr++;
}
+ pParse->zTail = zSql;
if( pParse->pVdbe && pParse->nErr>0 && pParse->nested==0 ){
sqlite3VdbeDelete(pParse->pVdbe);
pParse->pVdbe = 0;
@@ -141565,16 +152305,18 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
sqlite3_free(pParse->apVtabLock);
#endif
- if( !IN_DECLARE_VTAB ){
+ if( !IN_SPECIAL_PARSE ){
/* If the pParse->declareVtab flag is set, do not delete any table
** structure built up in pParse->pNewTable. The calling code (see vtab.c)
** will take responsibility for freeing the Table structure.
*/
sqlite3DeleteTable(db, pParse->pNewTable);
}
+ if( !IN_RENAME_OBJECT ){
+ sqlite3DeleteTrigger(db, pParse->pNewTrigger);
+ }
if( pParse->pWithToFree ) sqlite3WithDelete(db, pParse->pWithToFree);
- sqlite3DeleteTrigger(db, pParse->pNewTrigger);
sqlite3DbFree(db, pParse->pVList);
while( pParse->pAinc ){
AutoincInfo *p = pParse->pAinc;
@@ -141956,6 +152698,10 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db);
*/
/* #include "sqlite3.h" */
+#ifdef SQLITE_OMIT_VIRTUALTABLE
+# undef SQLITE_ENABLE_RTREE
+#endif
+
#if 0
extern "C" {
#endif /* __cplusplus */
@@ -141969,7 +152715,7 @@ SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db);
/************** End of rtree.h ***********************************************/
/************** Continuing where we left off in main.c ***********************/
#endif
-#ifdef SQLITE_ENABLE_ICU
+#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS)
/************** Include sqliteicu.h in the middle of main.c ******************/
/************** Begin file sqliteicu.h ***************************************/
/*
@@ -142217,6 +152963,11 @@ SQLITE_API int sqlite3_initialize(void){
sqlite3GlobalConfig.isPCacheInit = 1;
rc = sqlite3OsInit();
}
+#ifdef SQLITE_ENABLE_DESERIALIZE
+ if( rc==SQLITE_OK ){
+ rc = sqlite3MemdbInit();
+ }
+#endif
if( rc==SQLITE_OK ){
sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage,
sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage);
@@ -142249,7 +153000,7 @@ SQLITE_API int sqlite3_initialize(void){
#ifndef NDEBUG
#ifndef SQLITE_OMIT_FLOATING_POINT
/* This section of code's only "output" is via assert() statements. */
- if ( rc==SQLITE_OK ){
+ if( rc==SQLITE_OK ){
u64 x = (((u64)1)<<63)-1;
double y;
assert(sizeof(x)==8);
@@ -142615,6 +153366,17 @@ SQLITE_API int sqlite3_config(int op, ...){
break;
}
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ case SQLITE_CONFIG_SORTERREF_SIZE: {
+ int iVal = va_arg(ap, int);
+ if( iVal<0 ){
+ iVal = SQLITE_DEFAULT_SORTERREF_SIZE;
+ }
+ sqlite3GlobalConfig.szSorterRef = (u32)iVal;
+ break;
+ }
+#endif /* SQLITE_ENABLE_SORTER_REFERENCES */
+
default: {
rc = SQLITE_ERROR;
break;
@@ -142795,6 +153557,9 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){
{ SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension },
{ SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose },
{ SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_EnableQPSG },
+ { SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_TriggerEQP },
+ { SQLITE_DBCONFIG_RESET_DATABASE, SQLITE_ResetDatabase },
+ { SQLITE_DBCONFIG_DEFENSIVE, SQLITE_Defensive },
};
unsigned int i;
rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
@@ -142809,7 +153574,7 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){
db->flags &= ~aFlagOp[i].mask;
}
if( oldFlags!=db->flags ){
- sqlite3ExpirePreparedStatements(db);
+ sqlite3ExpirePreparedStatements(db, 0);
}
if( pRes ){
*pRes = (db->flags & aFlagOp[i].mask)!=0;
@@ -142871,6 +153636,15 @@ static int binCollFunc(
}
/*
+** Return true if CollSeq is the default built-in BINARY.
+*/
+SQLITE_PRIVATE int sqlite3IsBinary(const CollSeq *p){
+ assert( p==0 || p->xCmp!=binCollFunc || p->pUser!=0
+ || strcmp(p->zName,"BINARY")==0 );
+ return p==0 || (p->xCmp==binCollFunc && p->pUser==0);
+}
+
+/*
** Another built-in collating sequence: NOCASE.
**
** This collating sequence is intended to be used for "case independent
@@ -142991,7 +153765,7 @@ static void disconnectAllVtab(sqlite3 *db){
sqlite3BtreeEnterAll(db);
for(i=0; i<db->nDb; i++){
Schema *pSchema = db->aDb[i].pSchema;
- if( db->aDb[i].pSchema ){
+ if( pSchema ){
for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){
Table *pTab = (Table *)sqliteHashData(p);
if( IsVirtual(pTab) ) sqlite3VtabDisconnect(db, pTab);
@@ -143251,8 +154025,8 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){
sqlite3VtabRollback(db);
sqlite3EndBenignMalloc();
- if( (db->mDbFlags&DBFLAG_SchemaChange)!=0 && db->init.busy==0 ){
- sqlite3ExpirePreparedStatements(db);
+ if( schemaChange ){
+ sqlite3ExpirePreparedStatements(db, 0);
sqlite3ResetAllSchemasOfConnection(db);
}
sqlite3BtreeLeaveAll(db);
@@ -143280,6 +154054,7 @@ SQLITE_PRIVATE const char *sqlite3ErrName(int rc){
switch( rc ){
case SQLITE_OK: zName = "SQLITE_OK"; break;
case SQLITE_ERROR: zName = "SQLITE_ERROR"; break;
+ case SQLITE_ERROR_SNAPSHOT: zName = "SQLITE_ERROR_SNAPSHOT"; break;
case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break;
case SQLITE_PERM: zName = "SQLITE_PERM"; break;
case SQLITE_ABORT: zName = "SQLITE_ABORT"; break;
@@ -143292,9 +154067,10 @@ SQLITE_PRIVATE const char *sqlite3ErrName(int rc){
case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break;
case SQLITE_READONLY: zName = "SQLITE_READONLY"; break;
case SQLITE_READONLY_RECOVERY: zName = "SQLITE_READONLY_RECOVERY"; break;
- case SQLITE_READONLY_CANTLOCK: zName = "SQLITE_READONLY_CANTLOCK"; break;
+ case SQLITE_READONLY_CANTINIT: zName = "SQLITE_READONLY_CANTINIT"; break;
case SQLITE_READONLY_ROLLBACK: zName = "SQLITE_READONLY_ROLLBACK"; break;
case SQLITE_READONLY_DBMOVED: zName = "SQLITE_READONLY_DBMOVED"; break;
+ case SQLITE_READONLY_DIRECTORY: zName = "SQLITE_READONLY_DIRECTORY";break;
case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break;
case SQLITE_IOERR: zName = "SQLITE_IOERR"; break;
case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break;
@@ -143414,6 +154190,8 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){
/* SQLITE_FORMAT */ 0,
/* SQLITE_RANGE */ "column index out of range",
/* SQLITE_NOTADB */ "file is not a database",
+ /* SQLITE_NOTICE */ "notification message",
+ /* SQLITE_WARNING */ "warning message",
};
const char *zErr = "unknown error";
switch( rc ){
@@ -143421,6 +154199,14 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){
zErr = "abort due to ROLLBACK";
break;
}
+ case SQLITE_ROW: {
+ zErr = "another row available";
+ break;
+ }
+ case SQLITE_DONE: {
+ zErr = "no more rows available";
+ break;
+ }
default: {
rc &= 0xff;
if( ALWAYS(rc>=0) && rc<ArraySize(aMsg) && aMsg[rc]!=0 ){
@@ -143437,21 +154223,40 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){
** again until a timeout value is reached. The timeout value is
** an integer number of milliseconds passed in as the first
** argument.
+**
+** Return non-zero to retry the lock. Return zero to stop trying
+** and cause SQLite to return SQLITE_BUSY.
*/
static int sqliteDefaultBusyCallback(
- void *ptr, /* Database connection */
- int count /* Number of times table has been busy */
+ void *ptr, /* Database connection */
+ int count, /* Number of times table has been busy */
+ sqlite3_file *pFile /* The file on which the lock occurred */
){
#if SQLITE_OS_WIN || HAVE_USLEEP
+ /* This case is for systems that have support for sleeping for fractions of
+ ** a second. Examples: All windows systems, unix systems with usleep() */
static const u8 delays[] =
{ 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 };
static const u8 totals[] =
{ 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 };
# define NDELAY ArraySize(delays)
sqlite3 *db = (sqlite3 *)ptr;
- int timeout = db->busyTimeout;
+ int tmout = db->busyTimeout;
int delay, prior;
+#ifdef SQLITE_ENABLE_SETLK_TIMEOUT
+ if( sqlite3OsFileControl(pFile,SQLITE_FCNTL_LOCK_TIMEOUT,&tmout)==SQLITE_OK ){
+ if( count ){
+ tmout = 0;
+ sqlite3OsFileControl(pFile, SQLITE_FCNTL_LOCK_TIMEOUT, &tmout);
+ return 0;
+ }else{
+ return 1;
+ }
+ }
+#else
+ UNUSED_PARAMETER(pFile);
+#endif
assert( count>=0 );
if( count < NDELAY ){
delay = delays[count];
@@ -143460,16 +154265,19 @@ static int sqliteDefaultBusyCallback(
delay = delays[NDELAY-1];
prior = totals[NDELAY-1] + delay*(count-(NDELAY-1));
}
- if( prior + delay > timeout ){
- delay = timeout - prior;
+ if( prior + delay > tmout ){
+ delay = tmout - prior;
if( delay<=0 ) return 0;
}
sqlite3OsSleep(db->pVfs, delay*1000);
return 1;
#else
+ /* This case for unix systems that lack usleep() support. Sleeping
+ ** must be done in increments of whole seconds */
sqlite3 *db = (sqlite3 *)ptr;
- int timeout = ((sqlite3 *)ptr)->busyTimeout;
- if( (count+1)*1000 > timeout ){
+ int tmout = ((sqlite3 *)ptr)->busyTimeout;
+ UNUSED_PARAMETER(pFile);
+ if( (count+1)*1000 > tmout ){
return 0;
}
sqlite3OsSleep(db->pVfs, 1000000);
@@ -143480,14 +154288,25 @@ static int sqliteDefaultBusyCallback(
/*
** Invoke the given busy handler.
**
-** This routine is called when an operation failed with a lock.
+** This routine is called when an operation failed to acquire a
+** lock on VFS file pFile.
+**
** If this routine returns non-zero, the lock is retried. If it
** returns 0, the operation aborts with an SQLITE_BUSY error.
*/
-SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p){
+SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p, sqlite3_file *pFile){
int rc;
- if( NEVER(p==0) || p->xFunc==0 || p->nBusy<0 ) return 0;
- rc = p->xFunc(p->pArg, p->nBusy);
+ if( p->xBusyHandler==0 || p->nBusy<0 ) return 0;
+ if( p->bExtraFileArg ){
+ /* Add an extra parameter with the pFile pointer to the end of the
+ ** callback argument list */
+ int (*xTra)(void*,int,sqlite3_file*);
+ xTra = (int(*)(void*,int,sqlite3_file*))p->xBusyHandler;
+ rc = xTra(p->pBusyArg, p->nBusy, pFile);
+ }else{
+ /* Legacy style busy handler callback */
+ rc = p->xBusyHandler(p->pBusyArg, p->nBusy);
+ }
if( rc==0 ){
p->nBusy = -1;
}else{
@@ -143509,9 +154328,10 @@ SQLITE_API int sqlite3_busy_handler(
if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
#endif
sqlite3_mutex_enter(db->mutex);
- db->busyHandler.xFunc = xBusy;
- db->busyHandler.pArg = pArg;
+ db->busyHandler.xBusyHandler = xBusy;
+ db->busyHandler.pBusyArg = pArg;
db->busyHandler.nBusy = 0;
+ db->busyHandler.bExtraFileArg = 0;
db->busyTimeout = 0;
sqlite3_mutex_leave(db->mutex);
return SQLITE_OK;
@@ -143559,8 +154379,10 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){
if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
#endif
if( ms>0 ){
- sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db);
+ sqlite3_busy_handler(db, (int(*)(void*,int))sqliteDefaultBusyCallback,
+ (void*)db);
db->busyTimeout = ms;
+ db->busyHandler.bExtraFileArg = 1;
}else{
sqlite3_busy_handler(db, 0, 0);
}
@@ -143596,6 +154418,8 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
void (*xSFunc)(sqlite3_context*,int,sqlite3_value **),
void (*xStep)(sqlite3_context*,int,sqlite3_value **),
void (*xFinal)(sqlite3_context*),
+ void (*xValue)(sqlite3_context*),
+ void (*xInverse)(sqlite3_context*,int,sqlite3_value **),
FuncDestructor *pDestructor
){
FuncDef *p;
@@ -143603,12 +154427,14 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
int extraFlags;
assert( sqlite3_mutex_held(db->mutex) );
- if( zFunctionName==0 ||
- (xSFunc && (xFinal || xStep)) ||
- (!xSFunc && (xFinal && !xStep)) ||
- (!xSFunc && (!xFinal && xStep)) ||
- (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) ||
- (255<(nName = sqlite3Strlen30( zFunctionName))) ){
+ assert( xValue==0 || xSFunc==0 );
+ if( zFunctionName==0 /* Must have a valid name */
+ || (xSFunc!=0 && xFinal!=0) /* Not both xSFunc and xFinal */
+ || ((xFinal==0)!=(xStep==0)) /* Both or neither of xFinal and xStep */
+ || ((xValue==0)!=(xInverse==0)) /* Both or neither of xValue, xInverse */
+ || (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG)
+ || (255<(nName = sqlite3Strlen30( zFunctionName)))
+ ){
return SQLITE_MISUSE_BKPT;
}
@@ -143629,10 +154455,10 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
}else if( enc==SQLITE_ANY ){
int rc;
rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8|extraFlags,
- pUserData, xSFunc, xStep, xFinal, pDestructor);
+ pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor);
if( rc==SQLITE_OK ){
rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE|extraFlags,
- pUserData, xSFunc, xStep, xFinal, pDestructor);
+ pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor);
}
if( rc!=SQLITE_OK ){
return rc;
@@ -143649,14 +154475,14 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
** operation to continue but invalidate all precompiled statements.
*/
p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 0);
- if( p && (p->funcFlags & SQLITE_FUNC_ENCMASK)==enc && p->nArg==nArg ){
+ if( p && (p->funcFlags & SQLITE_FUNC_ENCMASK)==(u32)enc && p->nArg==nArg ){
if( db->nVdbeActive ){
sqlite3ErrorWithMsg(db, SQLITE_BUSY,
"unable to delete/modify user-function due to active statements");
assert( !db->mallocFailed );
return SQLITE_BUSY;
}else{
- sqlite3ExpirePreparedStatements(db);
+ sqlite3ExpirePreparedStatements(db, 0);
}
}
@@ -143678,38 +154504,32 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
testcase( p->funcFlags & SQLITE_DETERMINISTIC );
p->xSFunc = xSFunc ? xSFunc : xStep;
p->xFinalize = xFinal;
+ p->xValue = xValue;
+ p->xInverse = xInverse;
p->pUserData = pUserData;
p->nArg = (u16)nArg;
return SQLITE_OK;
}
/*
-** Create new user functions.
+** Worker function used by utf-8 APIs that create new functions:
+**
+** sqlite3_create_function()
+** sqlite3_create_function_v2()
+** sqlite3_create_window_function()
*/
-SQLITE_API int sqlite3_create_function(
+static int createFunctionApi(
sqlite3 *db,
const char *zFunc,
int nArg,
int enc,
void *p,
- void (*xSFunc)(sqlite3_context*,int,sqlite3_value **),
- void (*xStep)(sqlite3_context*,int,sqlite3_value **),
- void (*xFinal)(sqlite3_context*)
-){
- return sqlite3_create_function_v2(db, zFunc, nArg, enc, p, xSFunc, xStep,
- xFinal, 0);
-}
-
-SQLITE_API int sqlite3_create_function_v2(
- sqlite3 *db,
- const char *zFunc,
- int nArg,
- int enc,
- void *p,
- void (*xSFunc)(sqlite3_context*,int,sqlite3_value **),
- void (*xStep)(sqlite3_context*,int,sqlite3_value **),
+ void (*xSFunc)(sqlite3_context*,int,sqlite3_value**),
+ void (*xStep)(sqlite3_context*,int,sqlite3_value**),
void (*xFinal)(sqlite3_context*),
- void (*xDestroy)(void *)
+ void (*xValue)(sqlite3_context*),
+ void (*xInverse)(sqlite3_context*,int,sqlite3_value**),
+ void(*xDestroy)(void*)
){
int rc = SQLITE_ERROR;
FuncDestructor *pArg = 0;
@@ -143721,19 +154541,23 @@ SQLITE_API int sqlite3_create_function_v2(
#endif
sqlite3_mutex_enter(db->mutex);
if( xDestroy ){
- pArg = (FuncDestructor *)sqlite3DbMallocZero(db, sizeof(FuncDestructor));
+ pArg = (FuncDestructor *)sqlite3Malloc(sizeof(FuncDestructor));
if( !pArg ){
+ sqlite3OomFault(db);
xDestroy(p);
goto out;
}
+ pArg->nRef = 0;
pArg->xDestroy = xDestroy;
pArg->pUserData = p;
}
- rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, xSFunc, xStep, xFinal, pArg);
+ rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p,
+ xSFunc, xStep, xFinal, xValue, xInverse, pArg
+ );
if( pArg && pArg->nRef==0 ){
assert( rc!=SQLITE_OK );
xDestroy(p);
- sqlite3DbFree(db, pArg);
+ sqlite3_free(pArg);
}
out:
@@ -143742,6 +154566,52 @@ SQLITE_API int sqlite3_create_function_v2(
return rc;
}
+/*
+** Create new user functions.
+*/
+SQLITE_API int sqlite3_create_function(
+ sqlite3 *db,
+ const char *zFunc,
+ int nArg,
+ int enc,
+ void *p,
+ void (*xSFunc)(sqlite3_context*,int,sqlite3_value **),
+ void (*xStep)(sqlite3_context*,int,sqlite3_value **),
+ void (*xFinal)(sqlite3_context*)
+){
+ return createFunctionApi(db, zFunc, nArg, enc, p, xSFunc, xStep,
+ xFinal, 0, 0, 0);
+}
+SQLITE_API int sqlite3_create_function_v2(
+ sqlite3 *db,
+ const char *zFunc,
+ int nArg,
+ int enc,
+ void *p,
+ void (*xSFunc)(sqlite3_context*,int,sqlite3_value **),
+ void (*xStep)(sqlite3_context*,int,sqlite3_value **),
+ void (*xFinal)(sqlite3_context*),
+ void (*xDestroy)(void *)
+){
+ return createFunctionApi(db, zFunc, nArg, enc, p, xSFunc, xStep,
+ xFinal, 0, 0, xDestroy);
+}
+SQLITE_API int sqlite3_create_window_function(
+ sqlite3 *db,
+ const char *zFunc,
+ int nArg,
+ int enc,
+ void *p,
+ void (*xStep)(sqlite3_context*,int,sqlite3_value **),
+ void (*xFinal)(sqlite3_context*),
+ void (*xValue)(sqlite3_context*),
+ void (*xInverse)(sqlite3_context*,int,sqlite3_value **),
+ void (*xDestroy)(void *)
+){
+ return createFunctionApi(db, zFunc, nArg, enc, p, 0, xStep,
+ xFinal, xValue, xInverse, xDestroy);
+}
+
#ifndef SQLITE_OMIT_UTF16
SQLITE_API int sqlite3_create_function16(
sqlite3 *db,
@@ -143762,7 +154632,7 @@ SQLITE_API int sqlite3_create_function16(
sqlite3_mutex_enter(db->mutex);
assert( !db->mallocFailed );
zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1, SQLITE_UTF16NATIVE);
- rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xSFunc,xStep,xFinal,0);
+ rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xSFunc,xStep,xFinal,0,0,0);
sqlite3DbFree(db, zFunc8);
rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex);
@@ -143772,6 +154642,28 @@ SQLITE_API int sqlite3_create_function16(
/*
+** The following is the implementation of an SQL function that always
+** fails with an error message stating that the function is used in the
+** wrong context. The sqlite3_overload_function() API might construct
+** SQL function that use this routine so that the functions will exist
+** for name resolution but are actually overloaded by the xFindFunction
+** method of virtual tables.
+*/
+static void sqlite3InvalidFunction(
+ sqlite3_context *context, /* The function calling context */
+ int NotUsed, /* Number of arguments to the function */
+ sqlite3_value **NotUsed2 /* Value of each argument */
+){
+ const char *zName = (const char*)sqlite3_user_data(context);
+ char *zErr;
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
+ zErr = sqlite3_mprintf(
+ "unable to use function %s in the requested context", zName);
+ sqlite3_result_error(context, zErr, -1);
+ sqlite3_free(zErr);
+}
+
+/*
** Declare that a function has been overloaded by a virtual table.
**
** If the function already exists as a regular global function, then
@@ -143788,7 +154680,8 @@ SQLITE_API int sqlite3_overload_function(
const char *zName,
int nArg
){
- int rc = SQLITE_OK;
+ int rc;
+ char *zCopy;
#ifdef SQLITE_ENABLE_API_ARMOR
if( !sqlite3SafetyCheckOk(db) || zName==0 || nArg<-2 ){
@@ -143796,13 +154689,13 @@ SQLITE_API int sqlite3_overload_function(
}
#endif
sqlite3_mutex_enter(db->mutex);
- if( sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)==0 ){
- rc = sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8,
- 0, sqlite3InvalidFunction, 0, 0, 0);
- }
- rc = sqlite3ApiExit(db, rc);
+ rc = sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)!=0;
sqlite3_mutex_leave(db->mutex);
- return rc;
+ if( rc ) return SQLITE_OK;
+ zCopy = sqlite3_mprintf(zName);
+ if( zCopy==0 ) return SQLITE_NOMEM;
+ return sqlite3_create_function_v2(db, zName, nArg, SQLITE_UTF8,
+ zCopy, sqlite3InvalidFunction, 0, 0, sqlite3_free);
}
#ifndef SQLITE_OMIT_TRACE
@@ -144364,7 +155257,7 @@ static int createCollation(
"unable to delete/modify collation sequence due to active statements");
return SQLITE_BUSY;
}
- sqlite3ExpirePreparedStatements(db);
+ sqlite3ExpirePreparedStatements(db, 0);
/* If collation sequence pColl was created directly by a call to
** sqlite3_create_collation, and not generated by synthCollSeq(),
@@ -144800,6 +155693,7 @@ static int openDatabase(
}else{
isThreadsafe = sqlite3GlobalConfig.bFullMutex;
}
+
if( flags & SQLITE_OPEN_PRIVATECACHE ){
flags &= ~SQLITE_OPEN_SHAREDCACHE;
}else if( sqlite3GlobalConfig.sharedCacheEnabled ){
@@ -144832,19 +155726,27 @@ static int openDatabase(
/* Allocate the sqlite data structure */
db = sqlite3MallocZero( sizeof(sqlite3) );
if( db==0 ) goto opendb_out;
- if( isThreadsafe ){
+ if( isThreadsafe
+#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS
+ || sqlite3GlobalConfig.bCoreMutex
+#endif
+ ){
db->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
if( db->mutex==0 ){
sqlite3_free(db);
db = 0;
goto opendb_out;
}
+ if( isThreadsafe==0 ){
+ sqlite3MutexWarnOnContention(db->mutex);
+ }
}
sqlite3_mutex_enter(db->mutex);
db->errMask = 0xff;
db->nDb = 2;
db->magic = SQLITE_MAGIC_BUSY;
db->aDb = db->aDbStatic;
+ db->lookaside.bDisable = 1;
assert( sizeof(db->aLimit)==sizeof(aHardLimit) );
memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit));
@@ -144885,6 +155787,9 @@ static int openDatabase(
#if defined(SQLITE_ENABLE_QPSG)
| SQLITE_EnableQPSG
#endif
+#if defined(SQLITE_DEFAULT_DEFENSIVE)
+ | SQLITE_Defensive
+#endif
;
sqlite3HashInit(&db->aCollSeq);
#ifndef SQLITE_OMIT_VIRTUALTABLE
@@ -145020,7 +155925,7 @@ static int openDatabase(
}
#endif
-#ifdef SQLITE_ENABLE_ICU
+#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS)
if( !db->mallocFailed && rc==SQLITE_OK ){
rc = sqlite3IcuInit(db);
}
@@ -145322,37 +156227,37 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3 *db){
** 2. Invoke sqlite3_log() to provide the source code location where
** a low-level error is first detected.
*/
-static int reportError(int iErr, int lineno, const char *zType){
+SQLITE_PRIVATE int sqlite3ReportError(int iErr, int lineno, const char *zType){
sqlite3_log(iErr, "%s at line %d of [%.10s]",
zType, lineno, 20+sqlite3_sourceid());
return iErr;
}
SQLITE_PRIVATE int sqlite3CorruptError(int lineno){
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_CORRUPT, lineno, "database corruption");
+ return sqlite3ReportError(SQLITE_CORRUPT, lineno, "database corruption");
}
SQLITE_PRIVATE int sqlite3MisuseError(int lineno){
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_MISUSE, lineno, "misuse");
+ return sqlite3ReportError(SQLITE_MISUSE, lineno, "misuse");
}
SQLITE_PRIVATE int sqlite3CantopenError(int lineno){
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_CANTOPEN, lineno, "cannot open file");
+ return sqlite3ReportError(SQLITE_CANTOPEN, lineno, "cannot open file");
}
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3CorruptPgnoError(int lineno, Pgno pgno){
char zMsg[100];
sqlite3_snprintf(sizeof(zMsg), zMsg, "database corruption page %d", pgno);
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_CORRUPT, lineno, zMsg);
+ return sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg);
}
SQLITE_PRIVATE int sqlite3NomemError(int lineno){
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_NOMEM, lineno, "OOM");
+ return sqlite3ReportError(SQLITE_NOMEM, lineno, "OOM");
}
SQLITE_PRIVATE int sqlite3IoerrnomemError(int lineno){
testcase( sqlite3GlobalConfig.xLog!=0 );
- return reportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error");
+ return sqlite3ReportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error");
}
#endif
@@ -145545,10 +156450,11 @@ SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, vo
}else if( op==SQLITE_FCNTL_JOURNAL_POINTER ){
*(sqlite3_file**)pArg = sqlite3PagerJrnlFile(pPager);
rc = SQLITE_OK;
- }else if( fd->pMethods ){
- rc = sqlite3OsFileControl(fd, op, pArg);
+ }else if( op==SQLITE_FCNTL_DATA_VERSION ){
+ *(unsigned int*)pArg = sqlite3PagerDataVersion(pPager);
+ rc = SQLITE_OK;
}else{
- rc = SQLITE_NOTFOUND;
+ rc = sqlite3OsFileControl(fd, op, pArg);
}
sqlite3BtreeLeave(pBtree);
}
@@ -145769,32 +156675,25 @@ SQLITE_API int sqlite3_test_control(int op, ...){
break;
}
-#ifdef SQLITE_N_KEYWORD
- /* sqlite3_test_control(SQLITE_TESTCTRL_ISKEYWORD, const char *zWord)
+ /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff);
**
- ** If zWord is a keyword recognized by the parser, then return the
- ** number of keywords. Or if zWord is not a keyword, return 0.
- **
- ** This test feature is only available in the amalgamation since
- ** the SQLITE_N_KEYWORD macro is not defined in this file if SQLite
- ** is built using separate source files.
+ ** If parameter onoff is non-zero, subsequent calls to localtime()
+ ** and its variants fail. If onoff is zero, undo this setting.
*/
- case SQLITE_TESTCTRL_ISKEYWORD: {
- const char *zWord = va_arg(ap, const char*);
- int n = sqlite3Strlen30(zWord);
- rc = (sqlite3KeywordCode((u8*)zWord, n)!=TK_ID) ? SQLITE_N_KEYWORD : 0;
+ case SQLITE_TESTCTRL_LOCALTIME_FAULT: {
+ sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int);
break;
}
-#endif
- /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff);
+ /* sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCS, int onoff);
**
- ** If parameter onoff is non-zero, configure the wrappers so that all
- ** subsequent calls to localtime() and variants fail. If onoff is zero,
- ** undo this setting.
+ ** If parameter onoff is non-zero, internal-use-only SQL functions
+ ** are visible to ordinary SQL. This is useful for testing but is
+ ** unsafe because invalid parameters to those internal-use-only functions
+ ** can result in crashes or segfaults.
*/
- case SQLITE_TESTCTRL_LOCALTIME_FAULT: {
- sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int);
+ case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: {
+ sqlite3GlobalConfig.bInternalFunctions = va_arg(ap, int);
break;
}
@@ -145828,7 +156727,8 @@ SQLITE_API int sqlite3_test_control(int op, ...){
*/
case SQLITE_TESTCTRL_VDBE_COVERAGE: {
#ifdef SQLITE_VDBE_COVERAGE
- typedef void (*branch_callback)(void*,int,u8,u8);
+ typedef void (*branch_callback)(void*,unsigned int,
+ unsigned char,unsigned char);
sqlite3GlobalConfig.xVdbeBranch = va_arg(ap,branch_callback);
sqlite3GlobalConfig.pVdbeBranchArg = va_arg(ap,void*);
#endif
@@ -145880,6 +156780,22 @@ SQLITE_API int sqlite3_test_control(int op, ...){
sqlite3_mutex_leave(db->mutex);
break;
}
+
+#if defined(YYCOVERAGE)
+ /* sqlite3_test_control(SQLITE_TESTCTRL_PARSER_COVERAGE, FILE *out)
+ **
+ ** This test control (only available when SQLite is compiled with
+ ** -DYYCOVERAGE) writes a report onto "out" that shows all
+ ** state/lookahead combinations in the parser state machine
+ ** which are never exercised. If any state is missed, make the
+ ** return code SQLITE_ERROR.
+ */
+ case SQLITE_TESTCTRL_PARSER_COVERAGE: {
+ FILE *out = va_arg(ap, FILE*);
+ if( sqlite3ParserCoverage(out) ) rc = SQLITE_ERROR;
+ break;
+ }
+#endif /* defined(YYCOVERAGE) */
}
va_end(ap);
#endif /* SQLITE_UNTESTABLE */
@@ -145999,7 +156915,7 @@ SQLITE_API int sqlite3_snapshot_get(
if( iDb==0 || iDb>1 ){
Btree *pBt = db->aDb[iDb].pBt;
if( 0==sqlite3BtreeIsInTrans(pBt) ){
- rc = sqlite3BtreeBeginTrans(pBt, 0);
+ rc = sqlite3BtreeBeginTrans(pBt, 0, 0);
if( rc==SQLITE_OK ){
rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot);
}
@@ -146034,11 +156950,29 @@ SQLITE_API int sqlite3_snapshot_open(
iDb = sqlite3FindDbName(db, zDb);
if( iDb==0 || iDb>1 ){
Btree *pBt = db->aDb[iDb].pBt;
- if( 0==sqlite3BtreeIsInReadTrans(pBt) ){
- rc = sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), pSnapshot);
+ if( sqlite3BtreeIsInTrans(pBt)==0 ){
+ Pager *pPager = sqlite3BtreePager(pBt);
+ int bUnlock = 0;
+ if( sqlite3BtreeIsInReadTrans(pBt) ){
+ if( db->nVdbeActive==0 ){
+ rc = sqlite3PagerSnapshotCheck(pPager, pSnapshot);
+ if( rc==SQLITE_OK ){
+ bUnlock = 1;
+ rc = sqlite3BtreeCommit(pBt);
+ }
+ }
+ }else{
+ rc = SQLITE_OK;
+ }
if( rc==SQLITE_OK ){
- rc = sqlite3BtreeBeginTrans(pBt, 0);
- sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), 0);
+ rc = sqlite3PagerSnapshotOpen(pPager, pSnapshot);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sqlite3BtreeBeginTrans(pBt, 0, 0);
+ sqlite3PagerSnapshotOpen(pPager, 0);
+ }
+ if( bUnlock ){
+ sqlite3PagerSnapshotUnlock(pPager);
}
}
}
@@ -146069,7 +157003,7 @@ SQLITE_API int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb){
if( iDb==0 || iDb>1 ){
Btree *pBt = db->aDb[iDb].pBt;
if( 0==sqlite3BtreeIsInReadTrans(pBt) ){
- rc = sqlite3BtreeBeginTrans(pBt, 0);
+ rc = sqlite3BtreeBeginTrans(pBt, 0, 0);
if( rc==SQLITE_OK ){
rc = sqlite3PagerSnapshotRecover(sqlite3BtreePager(pBt));
sqlite3BtreeCommit(pBt);
@@ -147637,7 +158571,7 @@ SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int,
);
SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *);
#ifdef SQLITE_TEST
-SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db);
+SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash*);
SQLITE_PRIVATE int sqlite3Fts3InitTerm(sqlite3 *db);
#endif
@@ -149205,7 +160139,7 @@ static int fts3ScanInteriorNode(
const char *zCsr = zNode; /* Cursor to iterate through node */
const char *zEnd = &zCsr[nNode];/* End of interior node buffer */
char *zBuffer = 0; /* Buffer to load terms into */
- int nAlloc = 0; /* Size of allocated buffer */
+ i64 nAlloc = 0; /* Size of allocated buffer */
int isFirstTerm = 1; /* True when processing first term on page */
sqlite3_int64 iChild; /* Block id of child node to descend to */
@@ -149243,14 +160177,14 @@ static int fts3ScanInteriorNode(
zCsr += fts3GetVarint32(zCsr, &nSuffix);
assert( nPrefix>=0 && nSuffix>=0 );
- if( &zCsr[nSuffix]>zEnd ){
+ if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr ){
rc = FTS_CORRUPT_VTAB;
goto finish_scan;
}
- if( nPrefix+nSuffix>nAlloc ){
+ if( (i64)nPrefix+nSuffix>nAlloc ){
char *zNew;
- nAlloc = (nPrefix+nSuffix) * 2;
- zNew = (char *)sqlite3_realloc(zBuffer, nAlloc);
+ nAlloc = ((i64)nPrefix+nSuffix) * 2;
+ zNew = (char *)sqlite3_realloc64(zBuffer, nAlloc);
if( !zNew ){
rc = SQLITE_NOMEM;
goto finish_scan;
@@ -151192,7 +162126,7 @@ static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){
int rc = SQLITE_OK;
UNUSED_PARAMETER(iSavepoint);
assert( ((Fts3Table *)pVtab)->inTransaction );
- assert( ((Fts3Table *)pVtab)->mxSavepoint < iSavepoint );
+ assert( ((Fts3Table *)pVtab)->mxSavepoint <= iSavepoint );
TESTONLY( ((Fts3Table *)pVtab)->mxSavepoint = iSavepoint );
if( ((Fts3Table *)pVtab)->bIgnoreSavepoint==0 ){
rc = fts3SyncMethod(pVtab);
@@ -151230,8 +162164,23 @@ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){
return SQLITE_OK;
}
+/*
+** Return true if zName is the extension on one of the shadow tables used
+** by this module.
+*/
+static int fts3ShadowName(const char *zName){
+ static const char *azName[] = {
+ "content", "docsize", "segdir", "segments", "stat",
+ };
+ unsigned int i;
+ for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
+ if( sqlite3_stricmp(zName, azName[i])==0 ) return 1;
+ }
+ return 0;
+}
+
static const sqlite3_module fts3Module = {
- /* iVersion */ 2,
+ /* iVersion */ 3,
/* xCreate */ fts3CreateMethod,
/* xConnect */ fts3ConnectMethod,
/* xBestIndex */ fts3BestIndexMethod,
@@ -151254,6 +162203,7 @@ static const sqlite3_module fts3Module = {
/* xSavepoint */ fts3SavepointMethod,
/* xRelease */ fts3ReleaseMethod,
/* xRollbackTo */ fts3RollbackToMethod,
+ /* xShadowName */ fts3ShadowName,
};
/*
@@ -151347,7 +162297,7 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
#ifdef SQLITE_TEST
if( rc==SQLITE_OK ){
- rc = sqlite3Fts3ExprInitTestInterface(db);
+ rc = sqlite3Fts3ExprInitTestInterface(db, pHash);
}
#endif
@@ -151534,6 +162484,7 @@ static int fts3EvalPhraseLoad(
return rc;
}
+#ifndef SQLITE_DISABLE_FTS4_DEFERRED
/*
** This function is called on each phrase after the position lists for
** any deferred tokens have been loaded into memory. It updates the phrases
@@ -151637,6 +162588,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
return SQLITE_OK;
}
+#endif /* SQLITE_DISABLE_FTS4_DEFERRED */
/*
** Maximum number of tokens a phrase may have to be considered for the
@@ -153885,7 +164837,8 @@ SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){
0, /* xRename */
0, /* xSavepoint */
0, /* xRelease */
- 0 /* xRollbackTo */
+ 0, /* xRollbackTo */
+ 0 /* xShadowName */
};
int rc; /* Return code */
@@ -155008,34 +165961,6 @@ SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *pDel){
/* #include <stdio.h> */
/*
-** Function to query the hash-table of tokenizers (see README.tokenizers).
-*/
-static int queryTestTokenizer(
- sqlite3 *db,
- const char *zName,
- const sqlite3_tokenizer_module **pp
-){
- int rc;
- sqlite3_stmt *pStmt;
- const char zSql[] = "SELECT fts3_tokenizer(?)";
-
- *pp = 0;
- rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
- if( rc!=SQLITE_OK ){
- return rc;
- }
-
- sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC);
- if( SQLITE_ROW==sqlite3_step(pStmt) ){
- if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){
- memcpy((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp));
- }
- }
-
- return sqlite3_finalize(pStmt);
-}
-
-/*
** Return a pointer to a buffer containing a text representation of the
** expression passed as the first argument. The buffer is obtained from
** sqlite3_malloc(). It is the responsibility of the caller to use
@@ -155102,12 +166027,12 @@ static char *exprToString(Fts3Expr *pExpr, char *zBuf){
**
** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2');
*/
-static void fts3ExprTest(
+static void fts3ExprTestCommon(
+ int bRebalance,
sqlite3_context *context,
int argc,
sqlite3_value **argv
){
- sqlite3_tokenizer_module const *pModule = 0;
sqlite3_tokenizer *pTokenizer = 0;
int rc;
char **azCol = 0;
@@ -155117,7 +166042,9 @@ static void fts3ExprTest(
int ii;
Fts3Expr *pExpr;
char *zBuf = 0;
- sqlite3 *db = sqlite3_context_db_handle(context);
+ Fts3Hash *pHash = (Fts3Hash*)sqlite3_user_data(context);
+ const char *zTokenizer = 0;
+ char *zErr = 0;
if( argc<3 ){
sqlite3_result_error(context,
@@ -155126,23 +166053,17 @@ static void fts3ExprTest(
return;
}
- rc = queryTestTokenizer(db,
- (const char *)sqlite3_value_text(argv[0]), &pModule);
- if( rc==SQLITE_NOMEM ){
- sqlite3_result_error_nomem(context);
- goto exprtest_out;
- }else if( !pModule ){
- sqlite3_result_error(context, "No such tokenizer module", -1);
- goto exprtest_out;
- }
-
- rc = pModule->xCreate(0, 0, &pTokenizer);
- assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
- if( rc==SQLITE_NOMEM ){
- sqlite3_result_error_nomem(context);
- goto exprtest_out;
+ zTokenizer = (const char*)sqlite3_value_text(argv[0]);
+ rc = sqlite3Fts3InitTokenizer(pHash, zTokenizer, &pTokenizer, &zErr);
+ if( rc!=SQLITE_OK ){
+ if( rc==SQLITE_NOMEM ){
+ sqlite3_result_error_nomem(context);
+ }else{
+ sqlite3_result_error(context, zErr, -1);
+ }
+ sqlite3_free(zErr);
+ return;
}
- pTokenizer->pModule = pModule;
zExpr = (const char *)sqlite3_value_text(argv[1]);
nExpr = sqlite3_value_bytes(argv[1]);
@@ -155156,7 +166077,7 @@ static void fts3ExprTest(
azCol[ii] = (char *)sqlite3_value_text(argv[ii+2]);
}
- if( sqlite3_user_data(context) ){
+ if( bRebalance ){
char *zDummy = 0;
rc = sqlite3Fts3ExprParse(
pTokenizer, 0, azCol, 0, nCol, nCol, zExpr, nExpr, &pExpr, &zDummy
@@ -155182,23 +166103,38 @@ static void fts3ExprTest(
sqlite3Fts3ExprFree(pExpr);
exprtest_out:
- if( pModule && pTokenizer ){
- rc = pModule->xDestroy(pTokenizer);
+ if( pTokenizer ){
+ rc = pTokenizer->pModule->xDestroy(pTokenizer);
}
sqlite3_free(azCol);
}
+static void fts3ExprTest(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ fts3ExprTestCommon(0, context, argc, argv);
+}
+static void fts3ExprTestRebalance(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ fts3ExprTestCommon(1, context, argc, argv);
+}
+
/*
** Register the query expression parser test function fts3_exprtest()
** with database connection db.
*/
-SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3* db){
+SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash *pHash){
int rc = sqlite3_create_function(
- db, "fts3_exprtest", -1, SQLITE_UTF8, 0, fts3ExprTest, 0, 0
+ db, "fts3_exprtest", -1, SQLITE_UTF8, (void*)pHash, fts3ExprTest, 0, 0
);
if( rc==SQLITE_OK ){
rc = sqlite3_create_function(db, "fts3_exprtest_rebalance",
- -1, SQLITE_UTF8, (void *)1, fts3ExprTest, 0, 0
+ -1, SQLITE_UTF8, (void*)pHash, fts3ExprTestRebalance, 0, 0
);
}
return rc;
@@ -157461,7 +168397,8 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){
0, /* xRename */
0, /* xSavepoint */
0, /* xRelease */
- 0 /* xRollbackTo */
+ 0, /* xRollbackTo */
+ 0 /* xShadowName */
};
int rc; /* Return code */
@@ -158849,15 +169786,19 @@ static int fts3SegReaderNext(
** safe (no risk of overread) even if the node data is corrupted. */
pNext += fts3GetVarint32(pNext, &nPrefix);
pNext += fts3GetVarint32(pNext, &nSuffix);
- if( nPrefix<0 || nSuffix<=0
- || &pNext[nSuffix]>&pReader->aNode[pReader->nNode]
+ if( nSuffix<=0
+ || (&pReader->aNode[pReader->nNode] - pNext)<nSuffix
+ || nPrefix>pReader->nTermAlloc
){
return FTS_CORRUPT_VTAB;
}
- if( nPrefix+nSuffix>pReader->nTermAlloc ){
- int nNew = (nPrefix+nSuffix)*2;
- char *zNew = sqlite3_realloc(pReader->zTerm, nNew);
+ /* Both nPrefix and nSuffix were read by fts3GetVarint32() and so are
+ ** between 0 and 0x7FFFFFFF. But the sum of the two may cause integer
+ ** overflow - hence the (i64) casts. */
+ if( (i64)nPrefix+nSuffix>(i64)pReader->nTermAlloc ){
+ i64 nNew = ((i64)nPrefix+nSuffix)*2;
+ char *zNew = sqlite3_realloc64(pReader->zTerm, nNew);
if( !zNew ){
return SQLITE_NOMEM;
}
@@ -158879,7 +169820,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->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode]
+ if( (&pReader->aNode[pReader->nNode] - pReader->aDoclist)<pReader->nDoclist
|| (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1])
){
return FTS_CORRUPT_VTAB;
@@ -159383,6 +170324,7 @@ static int fts3WriteSegment(
sqlite3_bind_blob(pStmt, 2, z, n, SQLITE_STATIC);
sqlite3_step(pStmt);
rc = sqlite3_reset(pStmt);
+ sqlite3_bind_null(pStmt, 2);
}
return rc;
}
@@ -159439,6 +170381,7 @@ static int fts3WriteSegdir(
sqlite3_bind_blob(pStmt, 6, zRoot, nRoot, SQLITE_STATIC);
sqlite3_step(pStmt);
rc = sqlite3_reset(pStmt);
+ sqlite3_bind_null(pStmt, 6);
}
return rc;
}
@@ -160918,6 +171861,7 @@ static void fts3UpdateDocTotals(
sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, SQLITE_STATIC);
sqlite3_step(pStmt);
*pRC = sqlite3_reset(pStmt);
+ sqlite3_bind_null(pStmt, 2);
sqlite3_free(a);
}
@@ -161202,6 +172146,9 @@ 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;
+ }
blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc);
if( rc==SQLITE_OK ){
memcpy(&p->term.a[nPrefix], &p->aNode[p->iOff], nSuffix);
@@ -161209,6 +172156,9 @@ static int nodeReaderNext(NodeReader *p){
p->iOff += nSuffix;
if( p->iChild==0 ){
p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist);
+ if( (p->nNode-p->iOff)<p->nDoclist ){
+ return SQLITE_CORRUPT_VTAB;
+ }
p->aDoclist = &p->aNode[p->iOff];
p->iOff += p->nDoclist;
}
@@ -161216,7 +172166,6 @@ static int nodeReaderNext(NodeReader *p){
}
assert( p->iOff<=p->nNode );
-
return rc;
}
@@ -162106,6 +173055,7 @@ static int fts3TruncateSegment(
sqlite3_bind_int(pChomp, 4, iIdx);
sqlite3_step(pChomp);
rc = sqlite3_reset(pChomp);
+ sqlite3_bind_null(pChomp, 2);
}
}
@@ -162185,6 +173135,7 @@ static int fts3IncrmergeHintStore(Fts3Table *p, Blob *pHint){
sqlite3_bind_blob(pReplace, 2, pHint->a, pHint->n, SQLITE_STATIC);
sqlite3_step(pReplace);
rc = sqlite3_reset(pReplace);
+ sqlite3_bind_null(pReplace, 2);
}
return rc;
@@ -162999,7 +173950,6 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(
){
Fts3Table *p = (Fts3Table *)pVtab;
int rc = SQLITE_OK; /* Return Code */
- int isRemove = 0; /* True for an UPDATE or DELETE */
u32 *aSzIns = 0; /* Sizes of inserted documents */
u32 *aSzDel = 0; /* Sizes of deleted documents */
int nChng = 0; /* Net change in number of documents */
@@ -163097,7 +174047,6 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(
if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER );
rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel);
- isRemove = 1;
}
/* If this is an INSERT or UPDATE operation, insert the new record. */
@@ -163109,7 +174058,7 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(
rc = FTS_CORRUPT_VTAB;
}
}
- if( rc==SQLITE_OK && (!isRemove || *pRowid!=p->iPrevDocid ) ){
+ if( rc==SQLITE_OK ){
rc = fts3PendingTermsDocid(p, 0, iLangid, *pRowid);
}
if( rc==SQLITE_OK ){
@@ -165629,6 +176578,2550 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){
#endif /* !defined(SQLITE_DISABLE_FTS3_UNICODE) */
/************** End of fts3_unicode2.c ***************************************/
+/************** Begin file json1.c *******************************************/
+/*
+** 2015-08-12
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This SQLite extension implements JSON functions. The interface is
+** modeled after MySQL JSON functions:
+**
+** https://dev.mysql.com/doc/refman/5.7/en/json.html
+**
+** For the time being, all JSON is stored as pure text. (We might add
+** a JSONB type in the future which stores a binary encoding of JSON in
+** a BLOB, but there is no support for JSONB in the current implementation.
+** This implementation parses JSON text at 250 MB/s, so it is hard to see
+** how JSONB might improve on that.)
+*/
+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1)
+#if !defined(SQLITEINT_H)
+/* #include "sqlite3ext.h" */
+#endif
+SQLITE_EXTENSION_INIT1
+/* #include <assert.h> */
+/* #include <string.h> */
+/* #include <stdlib.h> */
+/* #include <stdarg.h> */
+
+/* Mark a function parameter as unused, to suppress nuisance compiler
+** warnings. */
+#ifndef UNUSED_PARAM
+# define UNUSED_PARAM(X) (void)(X)
+#endif
+
+#ifndef LARGEST_INT64
+# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32))
+# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64)
+#endif
+
+/*
+** Versions of isspace(), isalnum() and isdigit() to which it is safe
+** to pass signed char values.
+*/
+#ifdef sqlite3Isdigit
+ /* Use the SQLite core versions if this routine is part of the
+ ** SQLite amalgamation */
+# define safe_isdigit(x) sqlite3Isdigit(x)
+# define safe_isalnum(x) sqlite3Isalnum(x)
+# define safe_isxdigit(x) sqlite3Isxdigit(x)
+#else
+ /* Use the standard library for separate compilation */
+#include <ctype.h> /* amalgamator: keep */
+# define safe_isdigit(x) isdigit((unsigned char)(x))
+# define safe_isalnum(x) isalnum((unsigned char)(x))
+# define safe_isxdigit(x) isxdigit((unsigned char)(x))
+#endif
+
+/*
+** Growing our own isspace() routine this way is twice as fast as
+** the library isspace() function, resulting in a 7% overall performance
+** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os).
+*/
+static const char jsonIsSpace[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+#define safe_isspace(x) (jsonIsSpace[(unsigned char)x])
+
+#ifndef SQLITE_AMALGAMATION
+ /* Unsigned integer types. These are already defined in the sqliteInt.h,
+ ** but the definitions need to be repeated for separate compilation. */
+ typedef sqlite3_uint64 u64;
+ typedef unsigned int u32;
+ typedef unsigned short int u16;
+ typedef unsigned char u8;
+#endif
+
+/* Objects */
+typedef struct JsonString JsonString;
+typedef struct JsonNode JsonNode;
+typedef struct JsonParse JsonParse;
+
+/* An instance of this object represents a JSON string
+** under construction. Really, this is a generic string accumulator
+** that can be and is used to create strings other than JSON.
+*/
+struct JsonString {
+ sqlite3_context *pCtx; /* Function context - put error messages here */
+ char *zBuf; /* Append JSON content here */
+ u64 nAlloc; /* Bytes of storage available in zBuf[] */
+ u64 nUsed; /* Bytes of zBuf[] currently used */
+ u8 bStatic; /* True if zBuf is static space */
+ u8 bErr; /* True if an error has been encountered */
+ char zSpace[100]; /* Initial static space */
+};
+
+/* JSON type values
+*/
+#define JSON_NULL 0
+#define JSON_TRUE 1
+#define JSON_FALSE 2
+#define JSON_INT 3
+#define JSON_REAL 4
+#define JSON_STRING 5
+#define JSON_ARRAY 6
+#define JSON_OBJECT 7
+
+/* The "subtype" set for JSON values */
+#define JSON_SUBTYPE 74 /* Ascii for "J" */
+
+/*
+** Names of the various JSON types:
+*/
+static const char * const jsonType[] = {
+ "null", "true", "false", "integer", "real", "text", "array", "object"
+};
+
+/* Bit values for the JsonNode.jnFlag field
+*/
+#define JNODE_RAW 0x01 /* Content is raw, not JSON encoded */
+#define JNODE_ESCAPE 0x02 /* Content is text with \ escapes */
+#define JNODE_REMOVE 0x04 /* Do not output */
+#define JNODE_REPLACE 0x08 /* Replace with JsonNode.u.iReplace */
+#define JNODE_PATCH 0x10 /* Patch with JsonNode.u.pPatch */
+#define JNODE_APPEND 0x20 /* More ARRAY/OBJECT entries at u.iAppend */
+#define JNODE_LABEL 0x40 /* Is a label of an object */
+
+
+/* A single node of parsed JSON
+*/
+struct JsonNode {
+ u8 eType; /* One of the JSON_ type values */
+ u8 jnFlags; /* JNODE flags */
+ u32 n; /* Bytes of content, or number of sub-nodes */
+ union {
+ const char *zJContent; /* Content for INT, REAL, and STRING */
+ u32 iAppend; /* More terms for ARRAY and OBJECT */
+ u32 iKey; /* Key for ARRAY objects in json_tree() */
+ u32 iReplace; /* Replacement content for JNODE_REPLACE */
+ JsonNode *pPatch; /* Node chain of patch for JNODE_PATCH */
+ } u;
+};
+
+/* A completely parsed JSON string
+*/
+struct JsonParse {
+ u32 nNode; /* Number of slots of aNode[] used */
+ u32 nAlloc; /* Number of slots of aNode[] allocated */
+ JsonNode *aNode; /* Array of nodes containing the parse */
+ const char *zJson; /* Original JSON string */
+ u32 *aUp; /* Index of parent of each node */
+ u8 oom; /* Set to true if out of memory */
+ u8 nErr; /* Number of errors seen */
+ u16 iDepth; /* Nesting depth */
+ int nJson; /* Length of the zJson string in bytes */
+ u32 iHold; /* Replace cache line with the lowest iHold value */
+};
+
+/*
+** Maximum nesting depth of JSON for this implementation.
+**
+** This limit is needed to avoid a stack overflow in the recursive
+** descent parser. A depth of 2000 is far deeper than any sane JSON
+** should go.
+*/
+#define JSON_MAX_DEPTH 2000
+
+/**************************************************************************
+** Utility routines for dealing with JsonString objects
+**************************************************************************/
+
+/* Set the JsonString object to an empty string
+*/
+static void jsonZero(JsonString *p){
+ p->zBuf = p->zSpace;
+ p->nAlloc = sizeof(p->zSpace);
+ p->nUsed = 0;
+ p->bStatic = 1;
+}
+
+/* Initialize the JsonString object
+*/
+static void jsonInit(JsonString *p, sqlite3_context *pCtx){
+ p->pCtx = pCtx;
+ p->bErr = 0;
+ jsonZero(p);
+}
+
+
+/* Free all allocated memory and reset the JsonString object back to its
+** initial state.
+*/
+static void jsonReset(JsonString *p){
+ if( !p->bStatic ) sqlite3_free(p->zBuf);
+ jsonZero(p);
+}
+
+
+/* Report an out-of-memory (OOM) condition
+*/
+static void jsonOom(JsonString *p){
+ p->bErr = 1;
+ sqlite3_result_error_nomem(p->pCtx);
+ jsonReset(p);
+}
+
+/* Enlarge pJson->zBuf so that it can hold at least N more bytes.
+** Return zero on success. Return non-zero on an OOM error
+*/
+static int jsonGrow(JsonString *p, u32 N){
+ u64 nTotal = N<p->nAlloc ? p->nAlloc*2 : p->nAlloc+N+10;
+ char *zNew;
+ if( p->bStatic ){
+ if( p->bErr ) return 1;
+ zNew = sqlite3_malloc64(nTotal);
+ if( zNew==0 ){
+ jsonOom(p);
+ return SQLITE_NOMEM;
+ }
+ memcpy(zNew, p->zBuf, (size_t)p->nUsed);
+ p->zBuf = zNew;
+ p->bStatic = 0;
+ }else{
+ zNew = sqlite3_realloc64(p->zBuf, nTotal);
+ if( zNew==0 ){
+ jsonOom(p);
+ return SQLITE_NOMEM;
+ }
+ p->zBuf = zNew;
+ }
+ p->nAlloc = nTotal;
+ return SQLITE_OK;
+}
+
+/* Append N bytes from zIn onto the end of the JsonString string.
+*/
+static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){
+ if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return;
+ memcpy(p->zBuf+p->nUsed, zIn, N);
+ p->nUsed += N;
+}
+
+/* Append formatted text (not to exceed N bytes) to the JsonString.
+*/
+static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){
+ va_list ap;
+ if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return;
+ va_start(ap, zFormat);
+ sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap);
+ va_end(ap);
+ p->nUsed += (int)strlen(p->zBuf+p->nUsed);
+}
+
+/* Append a single character
+*/
+static void jsonAppendChar(JsonString *p, char c){
+ if( p->nUsed>=p->nAlloc && jsonGrow(p,1)!=0 ) return;
+ p->zBuf[p->nUsed++] = c;
+}
+
+/* Append a comma separator to the output buffer, if the previous
+** character is not '[' or '{'.
+*/
+static void jsonAppendSeparator(JsonString *p){
+ char c;
+ if( p->nUsed==0 ) return;
+ c = p->zBuf[p->nUsed-1];
+ if( c!='[' && c!='{' ) jsonAppendChar(p, ',');
+}
+
+/* Append the N-byte string in zIn to the end of the JsonString string
+** under construction. Enclose the string in "..." and escape
+** any double-quotes or backslash characters contained within the
+** string.
+*/
+static void jsonAppendString(JsonString *p, const char *zIn, u32 N){
+ u32 i;
+ if( (N+p->nUsed+2 >= p->nAlloc) && jsonGrow(p,N+2)!=0 ) return;
+ p->zBuf[p->nUsed++] = '"';
+ for(i=0; i<N; i++){
+ unsigned char c = ((unsigned const char*)zIn)[i];
+ if( c=='"' || c=='\\' ){
+ json_simple_escape:
+ if( (p->nUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return;
+ p->zBuf[p->nUsed++] = '\\';
+ }else if( c<=0x1f ){
+ static const char aSpecial[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ };
+ assert( sizeof(aSpecial)==32 );
+ assert( aSpecial['\b']=='b' );
+ assert( aSpecial['\f']=='f' );
+ assert( aSpecial['\n']=='n' );
+ assert( aSpecial['\r']=='r' );
+ assert( aSpecial['\t']=='t' );
+ if( aSpecial[c] ){
+ c = aSpecial[c];
+ goto json_simple_escape;
+ }
+ if( (p->nUsed+N+7+i > p->nAlloc) && jsonGrow(p,N+7-i)!=0 ) return;
+ p->zBuf[p->nUsed++] = '\\';
+ p->zBuf[p->nUsed++] = 'u';
+ p->zBuf[p->nUsed++] = '0';
+ p->zBuf[p->nUsed++] = '0';
+ p->zBuf[p->nUsed++] = '0' + (c>>4);
+ c = "0123456789abcdef"[c&0xf];
+ }
+ p->zBuf[p->nUsed++] = c;
+ }
+ p->zBuf[p->nUsed++] = '"';
+ assert( p->nUsed<p->nAlloc );
+}
+
+/*
+** Append a function parameter value to the JSON string under
+** construction.
+*/
+static void jsonAppendValue(
+ JsonString *p, /* Append to this JSON string */
+ sqlite3_value *pValue /* Value to append */
+){
+ switch( sqlite3_value_type(pValue) ){
+ case SQLITE_NULL: {
+ jsonAppendRaw(p, "null", 4);
+ break;
+ }
+ case SQLITE_INTEGER:
+ case SQLITE_FLOAT: {
+ const char *z = (const char*)sqlite3_value_text(pValue);
+ u32 n = (u32)sqlite3_value_bytes(pValue);
+ jsonAppendRaw(p, z, n);
+ break;
+ }
+ case SQLITE_TEXT: {
+ const char *z = (const char*)sqlite3_value_text(pValue);
+ u32 n = (u32)sqlite3_value_bytes(pValue);
+ if( sqlite3_value_subtype(pValue)==JSON_SUBTYPE ){
+ jsonAppendRaw(p, z, n);
+ }else{
+ jsonAppendString(p, z, n);
+ }
+ break;
+ }
+ default: {
+ if( p->bErr==0 ){
+ sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1);
+ p->bErr = 2;
+ jsonReset(p);
+ }
+ break;
+ }
+ }
+}
+
+
+/* Make the JSON in p the result of the SQL function.
+*/
+static void jsonResult(JsonString *p){
+ if( p->bErr==0 ){
+ sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed,
+ p->bStatic ? SQLITE_TRANSIENT : sqlite3_free,
+ SQLITE_UTF8);
+ jsonZero(p);
+ }
+ assert( p->bStatic );
+}
+
+/**************************************************************************
+** Utility routines for dealing with JsonNode and JsonParse objects
+**************************************************************************/
+
+/*
+** Return the number of consecutive JsonNode slots need to represent
+** the parsed JSON at pNode. The minimum answer is 1. For ARRAY and
+** OBJECT types, the number might be larger.
+**
+** Appended elements are not counted. The value returned is the number
+** by which the JsonNode counter should increment in order to go to the
+** next peer value.
+*/
+static u32 jsonNodeSize(JsonNode *pNode){
+ return pNode->eType>=JSON_ARRAY ? pNode->n+1 : 1;
+}
+
+/*
+** Reclaim all memory allocated by a JsonParse object. But do not
+** delete the JsonParse object itself.
+*/
+static void jsonParseReset(JsonParse *pParse){
+ sqlite3_free(pParse->aNode);
+ pParse->aNode = 0;
+ pParse->nNode = 0;
+ pParse->nAlloc = 0;
+ sqlite3_free(pParse->aUp);
+ pParse->aUp = 0;
+}
+
+/*
+** Free a JsonParse object that was obtained from sqlite3_malloc().
+*/
+static void jsonParseFree(JsonParse *pParse){
+ jsonParseReset(pParse);
+ sqlite3_free(pParse);
+}
+
+/*
+** Convert the JsonNode pNode into a pure JSON string and
+** append to pOut. Subsubstructure is also included. Return
+** the number of JsonNode objects that are encoded.
+*/
+static void jsonRenderNode(
+ JsonNode *pNode, /* The node to render */
+ JsonString *pOut, /* Write JSON here */
+ sqlite3_value **aReplace /* Replacement values */
+){
+ if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){
+ if( pNode->jnFlags & JNODE_REPLACE ){
+ jsonAppendValue(pOut, aReplace[pNode->u.iReplace]);
+ return;
+ }
+ pNode = pNode->u.pPatch;
+ }
+ switch( pNode->eType ){
+ default: {
+ assert( pNode->eType==JSON_NULL );
+ jsonAppendRaw(pOut, "null", 4);
+ break;
+ }
+ case JSON_TRUE: {
+ jsonAppendRaw(pOut, "true", 4);
+ break;
+ }
+ case JSON_FALSE: {
+ jsonAppendRaw(pOut, "false", 5);
+ break;
+ }
+ case JSON_STRING: {
+ if( pNode->jnFlags & JNODE_RAW ){
+ jsonAppendString(pOut, pNode->u.zJContent, pNode->n);
+ break;
+ }
+ /* Fall through into the next case */
+ }
+ case JSON_REAL:
+ case JSON_INT: {
+ jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
+ break;
+ }
+ case JSON_ARRAY: {
+ u32 j = 1;
+ jsonAppendChar(pOut, '[');
+ for(;;){
+ while( j<=pNode->n ){
+ if( (pNode[j].jnFlags & JNODE_REMOVE)==0 ){
+ jsonAppendSeparator(pOut);
+ jsonRenderNode(&pNode[j], pOut, aReplace);
+ }
+ j += jsonNodeSize(&pNode[j]);
+ }
+ if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
+ pNode = &pNode[pNode->u.iAppend];
+ j = 1;
+ }
+ jsonAppendChar(pOut, ']');
+ break;
+ }
+ case JSON_OBJECT: {
+ u32 j = 1;
+ jsonAppendChar(pOut, '{');
+ for(;;){
+ while( j<=pNode->n ){
+ if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){
+ jsonAppendSeparator(pOut);
+ jsonRenderNode(&pNode[j], pOut, aReplace);
+ jsonAppendChar(pOut, ':');
+ jsonRenderNode(&pNode[j+1], pOut, aReplace);
+ }
+ j += 1 + jsonNodeSize(&pNode[j+1]);
+ }
+ if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
+ pNode = &pNode[pNode->u.iAppend];
+ j = 1;
+ }
+ jsonAppendChar(pOut, '}');
+ break;
+ }
+ }
+}
+
+/*
+** Return a JsonNode and all its descendents as a JSON string.
+*/
+static void jsonReturnJson(
+ JsonNode *pNode, /* Node to return */
+ sqlite3_context *pCtx, /* Return value for this function */
+ sqlite3_value **aReplace /* Array of replacement values */
+){
+ JsonString s;
+ jsonInit(&s, pCtx);
+ jsonRenderNode(pNode, &s, aReplace);
+ jsonResult(&s);
+ sqlite3_result_subtype(pCtx, JSON_SUBTYPE);
+}
+
+/*
+** Make the JsonNode the return value of the function.
+*/
+static void jsonReturn(
+ JsonNode *pNode, /* Node to return */
+ sqlite3_context *pCtx, /* Return value for this function */
+ sqlite3_value **aReplace /* Array of replacement values */
+){
+ switch( pNode->eType ){
+ default: {
+ assert( pNode->eType==JSON_NULL );
+ sqlite3_result_null(pCtx);
+ break;
+ }
+ case JSON_TRUE: {
+ sqlite3_result_int(pCtx, 1);
+ break;
+ }
+ case JSON_FALSE: {
+ sqlite3_result_int(pCtx, 0);
+ break;
+ }
+ case JSON_INT: {
+ sqlite3_int64 i = 0;
+ const char *z = pNode->u.zJContent;
+ if( z[0]=='-' ){ z++; }
+ while( z[0]>='0' && z[0]<='9' ){
+ unsigned v = *(z++) - '0';
+ if( i>=LARGEST_INT64/10 ){
+ if( i>LARGEST_INT64/10 ) goto int_as_real;
+ if( z[0]>='0' && z[0]<='9' ) goto int_as_real;
+ if( v==9 ) goto int_as_real;
+ if( v==8 ){
+ if( pNode->u.zJContent[0]=='-' ){
+ sqlite3_result_int64(pCtx, SMALLEST_INT64);
+ goto int_done;
+ }else{
+ goto int_as_real;
+ }
+ }
+ }
+ i = i*10 + v;
+ }
+ if( pNode->u.zJContent[0]=='-' ){ i = -i; }
+ sqlite3_result_int64(pCtx, i);
+ int_done:
+ break;
+ int_as_real: /* fall through to real */;
+ }
+ case JSON_REAL: {
+ double r;
+#ifdef SQLITE_AMALGAMATION
+ const char *z = pNode->u.zJContent;
+ sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8);
+#else
+ r = strtod(pNode->u.zJContent, 0);
+#endif
+ sqlite3_result_double(pCtx, r);
+ break;
+ }
+ case JSON_STRING: {
+#if 0 /* Never happens because JNODE_RAW is only set by json_set(),
+ ** json_insert() and json_replace() and those routines do not
+ ** call jsonReturn() */
+ if( pNode->jnFlags & JNODE_RAW ){
+ sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n,
+ SQLITE_TRANSIENT);
+ }else
+#endif
+ assert( (pNode->jnFlags & JNODE_RAW)==0 );
+ if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){
+ /* JSON formatted without any backslash-escapes */
+ sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2,
+ SQLITE_TRANSIENT);
+ }else{
+ /* Translate JSON formatted string into raw text */
+ u32 i;
+ u32 n = pNode->n;
+ const char *z = pNode->u.zJContent;
+ char *zOut;
+ u32 j;
+ zOut = sqlite3_malloc( n+1 );
+ if( zOut==0 ){
+ sqlite3_result_error_nomem(pCtx);
+ break;
+ }
+ for(i=1, j=0; i<n-1; i++){
+ char c = z[i];
+ if( c!='\\' ){
+ zOut[j++] = c;
+ }else{
+ c = z[++i];
+ if( c=='u' ){
+ u32 v = 0, k;
+ for(k=0; k<4; i++, k++){
+ assert( i<n-2 );
+ c = z[i+1];
+ assert( safe_isxdigit(c) );
+ if( c<='9' ) v = v*16 + c - '0';
+ else if( c<='F' ) v = v*16 + c - 'A' + 10;
+ else v = v*16 + c - 'a' + 10;
+ }
+ if( v==0 ) break;
+ if( v<=0x7f ){
+ zOut[j++] = (char)v;
+ }else if( v<=0x7ff ){
+ zOut[j++] = (char)(0xc0 | (v>>6));
+ zOut[j++] = 0x80 | (v&0x3f);
+ }else{
+ zOut[j++] = (char)(0xe0 | (v>>12));
+ zOut[j++] = 0x80 | ((v>>6)&0x3f);
+ zOut[j++] = 0x80 | (v&0x3f);
+ }
+ }else{
+ if( c=='b' ){
+ c = '\b';
+ }else if( c=='f' ){
+ c = '\f';
+ }else if( c=='n' ){
+ c = '\n';
+ }else if( c=='r' ){
+ c = '\r';
+ }else if( c=='t' ){
+ c = '\t';
+ }
+ zOut[j++] = c;
+ }
+ }
+ }
+ zOut[j] = 0;
+ sqlite3_result_text(pCtx, zOut, j, sqlite3_free);
+ }
+ break;
+ }
+ case JSON_ARRAY:
+ case JSON_OBJECT: {
+ jsonReturnJson(pNode, pCtx, aReplace);
+ break;
+ }
+ }
+}
+
+/* Forward reference */
+static int jsonParseAddNode(JsonParse*,u32,u32,const char*);
+
+/*
+** A macro to hint to the compiler that a function should not be
+** inlined.
+*/
+#if defined(__GNUC__)
+# define JSON_NOINLINE __attribute__((noinline))
+#elif defined(_MSC_VER) && _MSC_VER>=1310
+# define JSON_NOINLINE __declspec(noinline)
+#else
+# define JSON_NOINLINE
+#endif
+
+
+static JSON_NOINLINE int jsonParseAddNodeExpand(
+ JsonParse *pParse, /* Append the node to this object */
+ u32 eType, /* Node type */
+ u32 n, /* Content size or sub-node count */
+ const char *zContent /* Content */
+){
+ u32 nNew;
+ JsonNode *pNew;
+ assert( pParse->nNode>=pParse->nAlloc );
+ if( pParse->oom ) return -1;
+ nNew = pParse->nAlloc*2 + 10;
+ pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew);
+ if( pNew==0 ){
+ pParse->oom = 1;
+ return -1;
+ }
+ pParse->nAlloc = nNew;
+ pParse->aNode = pNew;
+ assert( pParse->nNode<pParse->nAlloc );
+ return jsonParseAddNode(pParse, eType, n, zContent);
+}
+
+/*
+** Create a new JsonNode instance based on the arguments and append that
+** instance to the JsonParse. Return the index in pParse->aNode[] of the
+** new node, or -1 if a memory allocation fails.
+*/
+static int jsonParseAddNode(
+ JsonParse *pParse, /* Append the node to this object */
+ u32 eType, /* Node type */
+ u32 n, /* Content size or sub-node count */
+ const char *zContent /* Content */
+){
+ JsonNode *p;
+ if( pParse->nNode>=pParse->nAlloc ){
+ return jsonParseAddNodeExpand(pParse, eType, n, zContent);
+ }
+ p = &pParse->aNode[pParse->nNode];
+ p->eType = (u8)eType;
+ p->jnFlags = 0;
+ p->n = n;
+ p->u.zJContent = zContent;
+ return pParse->nNode++;
+}
+
+/*
+** Return true if z[] begins with 4 (or more) hexadecimal digits
+*/
+static int jsonIs4Hex(const char *z){
+ int i;
+ for(i=0; i<4; i++) if( !safe_isxdigit(z[i]) ) return 0;
+ return 1;
+}
+
+/*
+** Parse a single JSON value which begins at pParse->zJson[i]. Return the
+** index of the first character past the end of the value parsed.
+**
+** Return negative for a syntax error. Special cases: return -2 if the
+** first non-whitespace character is '}' and return -3 if the first
+** non-whitespace character is ']'.
+*/
+static int jsonParseValue(JsonParse *pParse, u32 i){
+ char c;
+ u32 j;
+ int iThis;
+ int x;
+ JsonNode *pNode;
+ const char *z = pParse->zJson;
+ while( safe_isspace(z[i]) ){ i++; }
+ if( (c = z[i])=='{' ){
+ /* Parse object */
+ iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
+ if( iThis<0 ) return -1;
+ for(j=i+1;;j++){
+ while( safe_isspace(z[j]) ){ j++; }
+ if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1;
+ x = jsonParseValue(pParse, j);
+ if( x<0 ){
+ pParse->iDepth--;
+ if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1;
+ return -1;
+ }
+ if( pParse->oom ) return -1;
+ pNode = &pParse->aNode[pParse->nNode-1];
+ if( pNode->eType!=JSON_STRING ) return -1;
+ pNode->jnFlags |= JNODE_LABEL;
+ j = x;
+ while( safe_isspace(z[j]) ){ j++; }
+ if( z[j]!=':' ) return -1;
+ j++;
+ x = jsonParseValue(pParse, j);
+ pParse->iDepth--;
+ if( x<0 ) return -1;
+ j = x;
+ while( safe_isspace(z[j]) ){ j++; }
+ c = z[j];
+ if( c==',' ) continue;
+ if( c!='}' ) return -1;
+ break;
+ }
+ pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
+ return j+1;
+ }else if( c=='[' ){
+ /* Parse array */
+ iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
+ if( iThis<0 ) return -1;
+ for(j=i+1;;j++){
+ while( safe_isspace(z[j]) ){ j++; }
+ if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1;
+ x = jsonParseValue(pParse, j);
+ pParse->iDepth--;
+ if( x<0 ){
+ if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1;
+ return -1;
+ }
+ j = x;
+ while( safe_isspace(z[j]) ){ j++; }
+ c = z[j];
+ if( c==',' ) continue;
+ if( c!=']' ) return -1;
+ break;
+ }
+ pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
+ return j+1;
+ }else if( c=='"' ){
+ /* Parse string */
+ u8 jnFlags = 0;
+ j = i+1;
+ for(;;){
+ c = z[j];
+ if( (c & ~0x1f)==0 ){
+ /* Control characters are not allowed in strings */
+ return -1;
+ }
+ if( c=='\\' ){
+ c = z[++j];
+ if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f'
+ || c=='n' || c=='r' || c=='t'
+ || (c=='u' && jsonIs4Hex(z+j+1)) ){
+ jnFlags = JNODE_ESCAPE;
+ }else{
+ return -1;
+ }
+ }else if( c=='"' ){
+ break;
+ }
+ j++;
+ }
+ jsonParseAddNode(pParse, JSON_STRING, j+1-i, &z[i]);
+ if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags;
+ return j+1;
+ }else if( c=='n'
+ && strncmp(z+i,"null",4)==0
+ && !safe_isalnum(z[i+4]) ){
+ jsonParseAddNode(pParse, JSON_NULL, 0, 0);
+ return i+4;
+ }else if( c=='t'
+ && strncmp(z+i,"true",4)==0
+ && !safe_isalnum(z[i+4]) ){
+ jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
+ return i+4;
+ }else if( c=='f'
+ && strncmp(z+i,"false",5)==0
+ && !safe_isalnum(z[i+5]) ){
+ jsonParseAddNode(pParse, JSON_FALSE, 0, 0);
+ return i+5;
+ }else if( c=='-' || (c>='0' && c<='9') ){
+ /* Parse number */
+ u8 seenDP = 0;
+ u8 seenE = 0;
+ assert( '-' < '0' );
+ if( c<='0' ){
+ j = c=='-' ? i+1 : i;
+ if( z[j]=='0' && z[j+1]>='0' && z[j+1]<='9' ) return -1;
+ }
+ j = i+1;
+ for(;; j++){
+ c = z[j];
+ if( c>='0' && c<='9' ) continue;
+ if( c=='.' ){
+ if( z[j-1]=='-' ) return -1;
+ if( seenDP ) return -1;
+ seenDP = 1;
+ continue;
+ }
+ if( c=='e' || c=='E' ){
+ if( z[j-1]<'0' ) return -1;
+ if( seenE ) return -1;
+ seenDP = seenE = 1;
+ c = z[j+1];
+ if( c=='+' || c=='-' ){
+ j++;
+ c = z[j+1];
+ }
+ if( c<'0' || c>'9' ) return -1;
+ continue;
+ }
+ break;
+ }
+ if( z[j-1]<'0' ) return -1;
+ jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT,
+ j - i, &z[i]);
+ return j;
+ }else if( c=='}' ){
+ return -2; /* End of {...} */
+ }else if( c==']' ){
+ return -3; /* End of [...] */
+ }else if( c==0 ){
+ return 0; /* End of file */
+ }else{
+ return -1; /* Syntax error */
+ }
+}
+
+/*
+** Parse a complete JSON string. Return 0 on success or non-zero if there
+** are any errors. If an error occurs, free all memory associated with
+** pParse.
+**
+** pParse is uninitialized when this routine is called.
+*/
+static int jsonParse(
+ JsonParse *pParse, /* Initialize and fill this JsonParse object */
+ sqlite3_context *pCtx, /* Report errors here */
+ const char *zJson /* Input JSON text to be parsed */
+){
+ int i;
+ memset(pParse, 0, sizeof(*pParse));
+ if( zJson==0 ) return 1;
+ pParse->zJson = zJson;
+ i = jsonParseValue(pParse, 0);
+ if( pParse->oom ) i = -1;
+ if( i>0 ){
+ assert( pParse->iDepth==0 );
+ while( safe_isspace(zJson[i]) ) i++;
+ if( zJson[i] ) i = -1;
+ }
+ if( i<=0 ){
+ if( pCtx!=0 ){
+ if( pParse->oom ){
+ sqlite3_result_error_nomem(pCtx);
+ }else{
+ sqlite3_result_error(pCtx, "malformed JSON", -1);
+ }
+ }
+ jsonParseReset(pParse);
+ return 1;
+ }
+ return 0;
+}
+
+/* Mark node i of pParse as being a child of iParent. Call recursively
+** to fill in all the descendants of node i.
+*/
+static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){
+ JsonNode *pNode = &pParse->aNode[i];
+ u32 j;
+ pParse->aUp[i] = iParent;
+ switch( pNode->eType ){
+ case JSON_ARRAY: {
+ for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){
+ jsonParseFillInParentage(pParse, i+j, i);
+ }
+ break;
+ }
+ case JSON_OBJECT: {
+ for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j+1)+1){
+ pParse->aUp[i+j] = i;
+ jsonParseFillInParentage(pParse, i+j+1, i);
+ }
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+}
+
+/*
+** Compute the parentage of all nodes in a completed parse.
+*/
+static int jsonParseFindParents(JsonParse *pParse){
+ u32 *aUp;
+ assert( pParse->aUp==0 );
+ aUp = pParse->aUp = sqlite3_malloc( sizeof(u32)*pParse->nNode );
+ if( aUp==0 ){
+ pParse->oom = 1;
+ return SQLITE_NOMEM;
+ }
+ jsonParseFillInParentage(pParse, 0, 0);
+ return SQLITE_OK;
+}
+
+/*
+** Magic number used for the JSON parse cache in sqlite3_get_auxdata()
+*/
+#define JSON_CACHE_ID (-429938) /* First cache entry */
+#define JSON_CACHE_SZ 4 /* Max number of cache entries */
+
+/*
+** Obtain a complete parse of the JSON found in the first argument
+** of the argv array. Use the sqlite3_get_auxdata() cache for this
+** parse if it is available. If the cache is not available or if it
+** is no longer valid, parse the JSON again and return the new parse,
+** and also register the new parse so that it will be available for
+** future sqlite3_get_auxdata() calls.
+*/
+static JsonParse *jsonParseCached(
+ sqlite3_context *pCtx,
+ sqlite3_value **argv,
+ sqlite3_context *pErrCtx
+){
+ const char *zJson = (const char*)sqlite3_value_text(argv[0]);
+ int nJson = sqlite3_value_bytes(argv[0]);
+ JsonParse *p;
+ JsonParse *pMatch = 0;
+ int iKey;
+ int iMinKey = 0;
+ u32 iMinHold = 0xffffffff;
+ u32 iMaxHold = 0;
+ if( zJson==0 ) return 0;
+ for(iKey=0; iKey<JSON_CACHE_SZ; iKey++){
+ p = (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID+iKey);
+ if( p==0 ){
+ iMinKey = iKey;
+ break;
+ }
+ if( pMatch==0
+ && p->nJson==nJson
+ && memcmp(p->zJson,zJson,nJson)==0
+ ){
+ p->nErr = 0;
+ pMatch = p;
+ }else if( p->iHold<iMinHold ){
+ iMinHold = p->iHold;
+ iMinKey = iKey;
+ }
+ if( p->iHold>iMaxHold ){
+ iMaxHold = p->iHold;
+ }
+ }
+ if( pMatch ){
+ pMatch->nErr = 0;
+ pMatch->iHold = iMaxHold+1;
+ return pMatch;
+ }
+ p = sqlite3_malloc( sizeof(*p) + nJson + 1 );
+ if( p==0 ){
+ sqlite3_result_error_nomem(pCtx);
+ return 0;
+ }
+ memset(p, 0, sizeof(*p));
+ p->zJson = (char*)&p[1];
+ memcpy((char*)p->zJson, zJson, nJson+1);
+ if( jsonParse(p, pErrCtx, p->zJson) ){
+ sqlite3_free(p);
+ return 0;
+ }
+ p->nJson = nJson;
+ p->iHold = iMaxHold+1;
+ sqlite3_set_auxdata(pCtx, JSON_CACHE_ID+iMinKey, p,
+ (void(*)(void*))jsonParseFree);
+ return (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID+iMinKey);
+}
+
+/*
+** Compare the OBJECT label at pNode against zKey,nKey. Return true on
+** a match.
+*/
+static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){
+ if( pNode->jnFlags & JNODE_RAW ){
+ if( pNode->n!=nKey ) return 0;
+ return strncmp(pNode->u.zJContent, zKey, nKey)==0;
+ }else{
+ if( pNode->n!=nKey+2 ) return 0;
+ return strncmp(pNode->u.zJContent+1, zKey, nKey)==0;
+ }
+}
+
+/* forward declaration */
+static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**);
+
+/*
+** Search along zPath to find the node specified. Return a pointer
+** to that node, or NULL if zPath is malformed or if there is no such
+** node.
+**
+** If pApnd!=0, then try to append new nodes to complete zPath if it is
+** possible to do so and if no existing node corresponds to zPath. If
+** new nodes are appended *pApnd is set to 1.
+*/
+static JsonNode *jsonLookupStep(
+ JsonParse *pParse, /* The JSON to search */
+ u32 iRoot, /* Begin the search at this node */
+ const char *zPath, /* The path to search */
+ int *pApnd, /* Append nodes to complete path if not NULL */
+ const char **pzErr /* Make *pzErr point to any syntax error in zPath */
+){
+ u32 i, j, nKey;
+ const char *zKey;
+ JsonNode *pRoot = &pParse->aNode[iRoot];
+ if( zPath[0]==0 ) return pRoot;
+ if( zPath[0]=='.' ){
+ if( pRoot->eType!=JSON_OBJECT ) return 0;
+ zPath++;
+ if( zPath[0]=='"' ){
+ zKey = zPath + 1;
+ for(i=1; zPath[i] && zPath[i]!='"'; i++){}
+ nKey = i-1;
+ if( zPath[i] ){
+ i++;
+ }else{
+ *pzErr = zPath;
+ return 0;
+ }
+ }else{
+ zKey = zPath;
+ for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){}
+ nKey = i;
+ }
+ if( nKey==0 ){
+ *pzErr = zPath;
+ return 0;
+ }
+ j = 1;
+ for(;;){
+ while( j<=pRoot->n ){
+ if( jsonLabelCompare(pRoot+j, zKey, nKey) ){
+ return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr);
+ }
+ j++;
+ j += jsonNodeSize(&pRoot[j]);
+ }
+ if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
+ iRoot += pRoot->u.iAppend;
+ pRoot = &pParse->aNode[iRoot];
+ j = 1;
+ }
+ if( pApnd ){
+ u32 iStart, iLabel;
+ JsonNode *pNode;
+ iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
+ iLabel = jsonParseAddNode(pParse, JSON_STRING, i, zPath);
+ zPath += i;
+ pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
+ if( pParse->oom ) return 0;
+ if( pNode ){
+ pRoot = &pParse->aNode[iRoot];
+ pRoot->u.iAppend = iStart - iRoot;
+ pRoot->jnFlags |= JNODE_APPEND;
+ pParse->aNode[iLabel].jnFlags |= JNODE_RAW;
+ }
+ return pNode;
+ }
+ }else if( zPath[0]=='[' && safe_isdigit(zPath[1]) ){
+ if( pRoot->eType!=JSON_ARRAY ) return 0;
+ i = 0;
+ j = 1;
+ while( safe_isdigit(zPath[j]) ){
+ i = i*10 + zPath[j] - '0';
+ j++;
+ }
+ if( zPath[j]!=']' ){
+ *pzErr = zPath;
+ return 0;
+ }
+ zPath += j + 1;
+ j = 1;
+ for(;;){
+ while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){
+ if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 ) i--;
+ j += jsonNodeSize(&pRoot[j]);
+ }
+ if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
+ iRoot += pRoot->u.iAppend;
+ pRoot = &pParse->aNode[iRoot];
+ j = 1;
+ }
+ if( j<=pRoot->n ){
+ return jsonLookupStep(pParse, iRoot+j, zPath, pApnd, pzErr);
+ }
+ if( i==0 && pApnd ){
+ u32 iStart;
+ JsonNode *pNode;
+ iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0);
+ pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
+ if( pParse->oom ) return 0;
+ if( pNode ){
+ pRoot = &pParse->aNode[iRoot];
+ pRoot->u.iAppend = iStart - iRoot;
+ pRoot->jnFlags |= JNODE_APPEND;
+ }
+ return pNode;
+ }
+ }else{
+ *pzErr = zPath;
+ }
+ return 0;
+}
+
+/*
+** Append content to pParse that will complete zPath. Return a pointer
+** to the inserted node, or return NULL if the append fails.
+*/
+static JsonNode *jsonLookupAppend(
+ JsonParse *pParse, /* Append content to the JSON parse */
+ const char *zPath, /* Description of content to append */
+ int *pApnd, /* Set this flag to 1 */
+ const char **pzErr /* Make this point to any syntax error */
+){
+ *pApnd = 1;
+ if( zPath[0]==0 ){
+ jsonParseAddNode(pParse, JSON_NULL, 0, 0);
+ return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1];
+ }
+ if( zPath[0]=='.' ){
+ jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
+ }else if( strncmp(zPath,"[0]",3)==0 ){
+ jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
+ }else{
+ return 0;
+ }
+ if( pParse->oom ) return 0;
+ return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr);
+}
+
+/*
+** Return the text of a syntax error message on a JSON path. Space is
+** obtained from sqlite3_malloc().
+*/
+static char *jsonPathSyntaxError(const char *zErr){
+ return sqlite3_mprintf("JSON path error near '%q'", zErr);
+}
+
+/*
+** Do a node lookup using zPath. Return a pointer to the node on success.
+** Return NULL if not found or if there is an error.
+**
+** On an error, write an error message into pCtx and increment the
+** pParse->nErr counter.
+**
+** If pApnd!=NULL then try to append missing nodes and set *pApnd = 1 if
+** nodes are appended.
+*/
+static JsonNode *jsonLookup(
+ JsonParse *pParse, /* The JSON to search */
+ const char *zPath, /* The path to search */
+ int *pApnd, /* Append nodes to complete path if not NULL */
+ sqlite3_context *pCtx /* Report errors here, if not NULL */
+){
+ const char *zErr = 0;
+ JsonNode *pNode = 0;
+ char *zMsg;
+
+ if( zPath==0 ) return 0;
+ if( zPath[0]!='$' ){
+ zErr = zPath;
+ goto lookup_err;
+ }
+ zPath++;
+ pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr);
+ if( zErr==0 ) return pNode;
+
+lookup_err:
+ pParse->nErr++;
+ assert( zErr!=0 && pCtx!=0 );
+ zMsg = jsonPathSyntaxError(zErr);
+ if( zMsg ){
+ sqlite3_result_error(pCtx, zMsg, -1);
+ sqlite3_free(zMsg);
+ }else{
+ sqlite3_result_error_nomem(pCtx);
+ }
+ return 0;
+}
+
+
+/*
+** Report the wrong number of arguments for json_insert(), json_replace()
+** or json_set().
+*/
+static void jsonWrongNumArgs(
+ sqlite3_context *pCtx,
+ const char *zFuncName
+){
+ char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments",
+ zFuncName);
+ sqlite3_result_error(pCtx, zMsg, -1);
+ sqlite3_free(zMsg);
+}
+
+/*
+** Mark all NULL entries in the Object passed in as JNODE_REMOVE.
+*/
+static void jsonRemoveAllNulls(JsonNode *pNode){
+ int i, n;
+ assert( pNode->eType==JSON_OBJECT );
+ n = pNode->n;
+ for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){
+ switch( pNode[i].eType ){
+ case JSON_NULL:
+ pNode[i].jnFlags |= JNODE_REMOVE;
+ break;
+ case JSON_OBJECT:
+ jsonRemoveAllNulls(&pNode[i]);
+ break;
+ }
+ }
+}
+
+
+/****************************************************************************
+** SQL functions used for testing and debugging
+****************************************************************************/
+
+#ifdef SQLITE_DEBUG
+/*
+** The json_parse(JSON) function returns a string which describes
+** a parse of the JSON provided. Or it returns NULL if JSON is not
+** well-formed.
+*/
+static void jsonParseFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonString s; /* Output string - not real JSON */
+ JsonParse x; /* The parse */
+ u32 i;
+
+ assert( argc==1 );
+ if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
+ jsonParseFindParents(&x);
+ jsonInit(&s, ctx);
+ for(i=0; i<x.nNode; i++){
+ const char *zType;
+ if( x.aNode[i].jnFlags & JNODE_LABEL ){
+ assert( x.aNode[i].eType==JSON_STRING );
+ zType = "label";
+ }else{
+ zType = jsonType[x.aNode[i].eType];
+ }
+ jsonPrintf(100, &s,"node %3u: %7s n=%-4d up=%-4d",
+ i, zType, x.aNode[i].n, x.aUp[i]);
+ if( x.aNode[i].u.zJContent!=0 ){
+ jsonAppendRaw(&s, " ", 1);
+ jsonAppendRaw(&s, x.aNode[i].u.zJContent, x.aNode[i].n);
+ }
+ jsonAppendRaw(&s, "\n", 1);
+ }
+ jsonParseReset(&x);
+ jsonResult(&s);
+}
+
+/*
+** The json_test1(JSON) function return true (1) if the input is JSON
+** text generated by another json function. It returns (0) if the input
+** is not known to be JSON.
+*/
+static void jsonTest1Func(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ UNUSED_PARAM(argc);
+ sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE);
+}
+#endif /* SQLITE_DEBUG */
+
+/****************************************************************************
+** Scalar SQL function implementations
+****************************************************************************/
+
+/*
+** Implementation of the json_QUOTE(VALUE) function. Return a JSON value
+** corresponding to the SQL value input. Mostly this means putting
+** double-quotes around strings and returning the unquoted string "null"
+** when given a NULL input.
+*/
+static void jsonQuoteFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonString jx;
+ UNUSED_PARAM(argc);
+
+ jsonInit(&jx, ctx);
+ jsonAppendValue(&jx, argv[0]);
+ jsonResult(&jx);
+ sqlite3_result_subtype(ctx, JSON_SUBTYPE);
+}
+
+/*
+** Implementation of the json_array(VALUE,...) function. Return a JSON
+** array that contains all values given in arguments. Or if any argument
+** is a BLOB, throw an error.
+*/
+static void jsonArrayFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ int i;
+ JsonString jx;
+
+ jsonInit(&jx, ctx);
+ jsonAppendChar(&jx, '[');
+ for(i=0; i<argc; i++){
+ jsonAppendSeparator(&jx);
+ jsonAppendValue(&jx, argv[i]);
+ }
+ jsonAppendChar(&jx, ']');
+ jsonResult(&jx);
+ sqlite3_result_subtype(ctx, JSON_SUBTYPE);
+}
+
+
+/*
+** json_array_length(JSON)
+** json_array_length(JSON, PATH)
+**
+** Return the number of elements in the top-level JSON array.
+** Return 0 if the input is not a well-formed JSON array.
+*/
+static void jsonArrayLengthFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonParse *p; /* The parse */
+ sqlite3_int64 n = 0;
+ u32 i;
+ JsonNode *pNode;
+
+ p = jsonParseCached(ctx, argv, ctx);
+ if( p==0 ) return;
+ assert( p->nNode );
+ if( argc==2 ){
+ const char *zPath = (const char*)sqlite3_value_text(argv[1]);
+ pNode = jsonLookup(p, zPath, 0, ctx);
+ }else{
+ pNode = p->aNode;
+ }
+ if( pNode==0 ){
+ return;
+ }
+ if( pNode->eType==JSON_ARRAY ){
+ assert( (pNode->jnFlags & JNODE_APPEND)==0 );
+ for(i=1; i<=pNode->n; n++){
+ i += jsonNodeSize(&pNode[i]);
+ }
+ }
+ sqlite3_result_int64(ctx, n);
+}
+
+/*
+** json_extract(JSON, PATH, ...)
+**
+** Return the element described by PATH. Return NULL if there is no
+** PATH element. If there are multiple PATHs, then return a JSON array
+** with the result from each path. Throw an error if the JSON or any PATH
+** is malformed.
+*/
+static void jsonExtractFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonParse *p; /* The parse */
+ JsonNode *pNode;
+ const char *zPath;
+ JsonString jx;
+ int i;
+
+ if( argc<2 ) return;
+ p = jsonParseCached(ctx, argv, ctx);
+ if( p==0 ) return;
+ jsonInit(&jx, ctx);
+ jsonAppendChar(&jx, '[');
+ for(i=1; i<argc; i++){
+ zPath = (const char*)sqlite3_value_text(argv[i]);
+ pNode = jsonLookup(p, zPath, 0, ctx);
+ if( p->nErr ) break;
+ if( argc>2 ){
+ jsonAppendSeparator(&jx);
+ if( pNode ){
+ jsonRenderNode(pNode, &jx, 0);
+ }else{
+ jsonAppendRaw(&jx, "null", 4);
+ }
+ }else if( pNode ){
+ jsonReturn(pNode, ctx, 0);
+ }
+ }
+ if( argc>2 && i==argc ){
+ jsonAppendChar(&jx, ']');
+ jsonResult(&jx);
+ sqlite3_result_subtype(ctx, JSON_SUBTYPE);
+ }
+ jsonReset(&jx);
+}
+
+/* This is the RFC 7396 MergePatch algorithm.
+*/
+static JsonNode *jsonMergePatch(
+ JsonParse *pParse, /* The JSON parser that contains the TARGET */
+ u32 iTarget, /* Node of the TARGET in pParse */
+ JsonNode *pPatch /* The PATCH */
+){
+ u32 i, j;
+ u32 iRoot;
+ JsonNode *pTarget;
+ if( pPatch->eType!=JSON_OBJECT ){
+ return pPatch;
+ }
+ assert( iTarget>=0 && iTarget<pParse->nNode );
+ pTarget = &pParse->aNode[iTarget];
+ assert( (pPatch->jnFlags & JNODE_APPEND)==0 );
+ if( pTarget->eType!=JSON_OBJECT ){
+ jsonRemoveAllNulls(pPatch);
+ return pPatch;
+ }
+ iRoot = iTarget;
+ for(i=1; i<pPatch->n; i += jsonNodeSize(&pPatch[i+1])+1){
+ u32 nKey;
+ const char *zKey;
+ assert( pPatch[i].eType==JSON_STRING );
+ assert( pPatch[i].jnFlags & JNODE_LABEL );
+ nKey = pPatch[i].n;
+ zKey = pPatch[i].u.zJContent;
+ assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
+ for(j=1; j<pTarget->n; j += jsonNodeSize(&pTarget[j+1])+1 ){
+ assert( pTarget[j].eType==JSON_STRING );
+ assert( pTarget[j].jnFlags & JNODE_LABEL );
+ assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
+ if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){
+ if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break;
+ if( pPatch[i+1].eType==JSON_NULL ){
+ pTarget[j+1].jnFlags |= JNODE_REMOVE;
+ }else{
+ JsonNode *pNew = jsonMergePatch(pParse, iTarget+j+1, &pPatch[i+1]);
+ if( pNew==0 ) return 0;
+ pTarget = &pParse->aNode[iTarget];
+ if( pNew!=&pTarget[j+1] ){
+ pTarget[j+1].u.pPatch = pNew;
+ pTarget[j+1].jnFlags |= JNODE_PATCH;
+ }
+ }
+ break;
+ }
+ }
+ if( j>=pTarget->n && pPatch[i+1].eType!=JSON_NULL ){
+ int iStart, iPatch;
+ iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
+ jsonParseAddNode(pParse, JSON_STRING, nKey, zKey);
+ iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
+ if( pParse->oom ) return 0;
+ jsonRemoveAllNulls(pPatch);
+ pTarget = &pParse->aNode[iTarget];
+ pParse->aNode[iRoot].jnFlags |= JNODE_APPEND;
+ pParse->aNode[iRoot].u.iAppend = iStart - iRoot;
+ iRoot = iStart;
+ pParse->aNode[iPatch].jnFlags |= JNODE_PATCH;
+ pParse->aNode[iPatch].u.pPatch = &pPatch[i+1];
+ }
+ }
+ return pTarget;
+}
+
+/*
+** Implementation of the json_mergepatch(JSON1,JSON2) function. Return a JSON
+** object that is the result of running the RFC 7396 MergePatch() algorithm
+** on the two arguments.
+*/
+static void jsonPatchFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonParse x; /* The JSON that is being patched */
+ JsonParse y; /* The patch */
+ JsonNode *pResult; /* The result of the merge */
+
+ UNUSED_PARAM(argc);
+ if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
+ if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){
+ jsonParseReset(&x);
+ return;
+ }
+ pResult = jsonMergePatch(&x, 0, y.aNode);
+ assert( pResult!=0 || x.oom );
+ if( pResult ){
+ jsonReturnJson(pResult, ctx, 0);
+ }else{
+ sqlite3_result_error_nomem(ctx);
+ }
+ jsonParseReset(&x);
+ jsonParseReset(&y);
+}
+
+
+/*
+** Implementation of the json_object(NAME,VALUE,...) function. Return a JSON
+** object that contains all name/value given in arguments. Or if any name
+** is not a string or if any value is a BLOB, throw an error.
+*/
+static void jsonObjectFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ int i;
+ JsonString jx;
+ const char *z;
+ u32 n;
+
+ if( argc&1 ){
+ sqlite3_result_error(ctx, "json_object() requires an even number "
+ "of arguments", -1);
+ return;
+ }
+ jsonInit(&jx, ctx);
+ jsonAppendChar(&jx, '{');
+ for(i=0; i<argc; i+=2){
+ if( sqlite3_value_type(argv[i])!=SQLITE_TEXT ){
+ sqlite3_result_error(ctx, "json_object() labels must be TEXT", -1);
+ jsonReset(&jx);
+ return;
+ }
+ jsonAppendSeparator(&jx);
+ z = (const char*)sqlite3_value_text(argv[i]);
+ n = (u32)sqlite3_value_bytes(argv[i]);
+ jsonAppendString(&jx, z, n);
+ jsonAppendChar(&jx, ':');
+ jsonAppendValue(&jx, argv[i+1]);
+ }
+ jsonAppendChar(&jx, '}');
+ jsonResult(&jx);
+ sqlite3_result_subtype(ctx, JSON_SUBTYPE);
+}
+
+
+/*
+** json_remove(JSON, PATH, ...)
+**
+** Remove the named elements from JSON and return the result. malformed
+** JSON or PATH arguments result in an error.
+*/
+static void jsonRemoveFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonParse x; /* The parse */
+ JsonNode *pNode;
+ const char *zPath;
+ u32 i;
+
+ if( argc<1 ) return;
+ if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
+ assert( x.nNode );
+ for(i=1; i<(u32)argc; i++){
+ zPath = (const char*)sqlite3_value_text(argv[i]);
+ if( zPath==0 ) goto remove_done;
+ pNode = jsonLookup(&x, zPath, 0, ctx);
+ if( x.nErr ) goto remove_done;
+ if( pNode ) pNode->jnFlags |= JNODE_REMOVE;
+ }
+ if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){
+ jsonReturnJson(x.aNode, ctx, 0);
+ }
+remove_done:
+ jsonParseReset(&x);
+}
+
+/*
+** json_replace(JSON, PATH, VALUE, ...)
+**
+** Replace the value at PATH with VALUE. If PATH does not already exist,
+** this routine is a no-op. If JSON or PATH is malformed, throw an error.
+*/
+static void jsonReplaceFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonParse x; /* The parse */
+ JsonNode *pNode;
+ const char *zPath;
+ u32 i;
+
+ if( argc<1 ) return;
+ if( (argc&1)==0 ) {
+ jsonWrongNumArgs(ctx, "replace");
+ return;
+ }
+ if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
+ assert( x.nNode );
+ for(i=1; i<(u32)argc; i+=2){
+ zPath = (const char*)sqlite3_value_text(argv[i]);
+ pNode = jsonLookup(&x, zPath, 0, ctx);
+ if( x.nErr ) goto replace_err;
+ if( pNode ){
+ pNode->jnFlags |= (u8)JNODE_REPLACE;
+ pNode->u.iReplace = i + 1;
+ }
+ }
+ if( x.aNode[0].jnFlags & JNODE_REPLACE ){
+ sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
+ }else{
+ jsonReturnJson(x.aNode, ctx, argv);
+ }
+replace_err:
+ jsonParseReset(&x);
+}
+
+/*
+** json_set(JSON, PATH, VALUE, ...)
+**
+** Set the value at PATH to VALUE. Create the PATH if it does not already
+** exist. Overwrite existing values that do exist.
+** If JSON or PATH is malformed, throw an error.
+**
+** json_insert(JSON, PATH, VALUE, ...)
+**
+** Create PATH and initialize it to VALUE. If PATH already exists, this
+** routine is a no-op. If JSON or PATH is malformed, throw an error.
+*/
+static void jsonSetFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonParse x; /* The parse */
+ JsonNode *pNode;
+ const char *zPath;
+ u32 i;
+ int bApnd;
+ int bIsSet = *(int*)sqlite3_user_data(ctx);
+
+ if( argc<1 ) return;
+ if( (argc&1)==0 ) {
+ jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert");
+ return;
+ }
+ if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
+ assert( x.nNode );
+ for(i=1; i<(u32)argc; i+=2){
+ zPath = (const char*)sqlite3_value_text(argv[i]);
+ bApnd = 0;
+ pNode = jsonLookup(&x, zPath, &bApnd, ctx);
+ if( x.oom ){
+ sqlite3_result_error_nomem(ctx);
+ goto jsonSetDone;
+ }else if( x.nErr ){
+ goto jsonSetDone;
+ }else if( pNode && (bApnd || bIsSet) ){
+ pNode->jnFlags |= (u8)JNODE_REPLACE;
+ pNode->u.iReplace = i + 1;
+ }
+ }
+ if( x.aNode[0].jnFlags & JNODE_REPLACE ){
+ sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
+ }else{
+ jsonReturnJson(x.aNode, ctx, argv);
+ }
+jsonSetDone:
+ jsonParseReset(&x);
+}
+
+/*
+** json_type(JSON)
+** json_type(JSON, PATH)
+**
+** Return the top-level "type" of a JSON string. Throw an error if
+** either the JSON or PATH inputs are not well-formed.
+*/
+static void jsonTypeFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonParse *p; /* The parse */
+ const char *zPath;
+ JsonNode *pNode;
+
+ p = jsonParseCached(ctx, argv, ctx);
+ if( p==0 ) return;
+ if( argc==2 ){
+ zPath = (const char*)sqlite3_value_text(argv[1]);
+ pNode = jsonLookup(p, zPath, 0, ctx);
+ }else{
+ pNode = p->aNode;
+ }
+ if( pNode ){
+ sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC);
+ }
+}
+
+/*
+** json_valid(JSON)
+**
+** Return 1 if JSON is a well-formed JSON string according to RFC-7159.
+** Return 0 otherwise.
+*/
+static void jsonValidFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonParse *p; /* The parse */
+ UNUSED_PARAM(argc);
+ p = jsonParseCached(ctx, argv, 0);
+ sqlite3_result_int(ctx, p!=0);
+}
+
+
+/****************************************************************************
+** Aggregate SQL function implementations
+****************************************************************************/
+/*
+** json_group_array(VALUE)
+**
+** Return a JSON array composed of all values in the aggregate.
+*/
+static void jsonArrayStep(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonString *pStr;
+ UNUSED_PARAM(argc);
+ pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
+ if( pStr ){
+ if( pStr->zBuf==0 ){
+ jsonInit(pStr, ctx);
+ jsonAppendChar(pStr, '[');
+ }else{
+ jsonAppendChar(pStr, ',');
+ pStr->pCtx = ctx;
+ }
+ jsonAppendValue(pStr, argv[0]);
+ }
+}
+static void jsonArrayCompute(sqlite3_context *ctx, int isFinal){
+ JsonString *pStr;
+ pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
+ if( pStr ){
+ pStr->pCtx = ctx;
+ jsonAppendChar(pStr, ']');
+ if( pStr->bErr ){
+ if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
+ assert( pStr->bStatic );
+ }else if( isFinal ){
+ sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed,
+ pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
+ pStr->bStatic = 1;
+ }else{
+ sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT);
+ pStr->nUsed--;
+ }
+ }else{
+ sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC);
+ }
+ sqlite3_result_subtype(ctx, JSON_SUBTYPE);
+}
+static void jsonArrayValue(sqlite3_context *ctx){
+ jsonArrayCompute(ctx, 0);
+}
+static void jsonArrayFinal(sqlite3_context *ctx){
+ jsonArrayCompute(ctx, 1);
+}
+
+#ifndef SQLITE_OMIT_WINDOWFUNC
+/*
+** This method works for both json_group_array() and json_group_object().
+** It works by removing the first element of the group by searching forward
+** to the first comma (",") that is not within a string and deleting all
+** text through that comma.
+*/
+static void jsonGroupInverse(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ int i;
+ int inStr = 0;
+ char *z;
+ JsonString *pStr;
+ UNUSED_PARAM(argc);
+ UNUSED_PARAM(argv);
+ pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
+#ifdef NEVER
+ /* pStr is always non-NULL since jsonArrayStep() or jsonObjectStep() will
+ ** always have been called to initalize it */
+ if( NEVER(!pStr) ) return;
+#endif
+ z = pStr->zBuf;
+ for(i=1; z[i]!=',' || inStr; i++){
+ assert( i<pStr->nUsed );
+ if( z[i]=='"' ){
+ inStr = !inStr;
+ }else if( z[i]=='\\' ){
+ i++;
+ }
+ }
+ pStr->nUsed -= i;
+ memmove(&z[1], &z[i+1], (size_t)pStr->nUsed-1);
+}
+#else
+# define jsonGroupInverse 0
+#endif
+
+
+/*
+** json_group_obj(NAME,VALUE)
+**
+** Return a JSON object composed of all names and values in the aggregate.
+*/
+static void jsonObjectStep(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonString *pStr;
+ const char *z;
+ u32 n;
+ UNUSED_PARAM(argc);
+ pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
+ if( pStr ){
+ if( pStr->zBuf==0 ){
+ jsonInit(pStr, ctx);
+ jsonAppendChar(pStr, '{');
+ }else{
+ jsonAppendChar(pStr, ',');
+ pStr->pCtx = ctx;
+ }
+ z = (const char*)sqlite3_value_text(argv[0]);
+ n = (u32)sqlite3_value_bytes(argv[0]);
+ jsonAppendString(pStr, z, n);
+ jsonAppendChar(pStr, ':');
+ jsonAppendValue(pStr, argv[1]);
+ }
+}
+static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){
+ JsonString *pStr;
+ pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
+ if( pStr ){
+ jsonAppendChar(pStr, '}');
+ if( pStr->bErr ){
+ if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
+ assert( pStr->bStatic );
+ }else if( isFinal ){
+ sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed,
+ pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
+ pStr->bStatic = 1;
+ }else{
+ sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT);
+ pStr->nUsed--;
+ }
+ }else{
+ sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC);
+ }
+ sqlite3_result_subtype(ctx, JSON_SUBTYPE);
+}
+static void jsonObjectValue(sqlite3_context *ctx){
+ jsonObjectCompute(ctx, 0);
+}
+static void jsonObjectFinal(sqlite3_context *ctx){
+ jsonObjectCompute(ctx, 1);
+}
+
+
+
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+/****************************************************************************
+** The json_each virtual table
+****************************************************************************/
+typedef struct JsonEachCursor JsonEachCursor;
+struct JsonEachCursor {
+ sqlite3_vtab_cursor base; /* Base class - must be first */
+ u32 iRowid; /* The rowid */
+ u32 iBegin; /* The first node of the scan */
+ u32 i; /* Index in sParse.aNode[] of current row */
+ u32 iEnd; /* EOF when i equals or exceeds this value */
+ u8 eType; /* Type of top-level element */
+ u8 bRecursive; /* True for json_tree(). False for json_each() */
+ char *zJson; /* Input JSON */
+ char *zRoot; /* Path by which to filter zJson */
+ JsonParse sParse; /* Parse of the input JSON */
+};
+
+/* Constructor for the json_each virtual table */
+static int jsonEachConnect(
+ sqlite3 *db,
+ void *pAux,
+ int argc, const char *const*argv,
+ sqlite3_vtab **ppVtab,
+ char **pzErr
+){
+ sqlite3_vtab *pNew;
+ int rc;
+
+/* Column numbers */
+#define JEACH_KEY 0
+#define JEACH_VALUE 1
+#define JEACH_TYPE 2
+#define JEACH_ATOM 3
+#define JEACH_ID 4
+#define JEACH_PARENT 5
+#define JEACH_FULLKEY 6
+#define JEACH_PATH 7
+/* The xBestIndex method assumes that the JSON and ROOT columns are
+** the last two columns in the table. Should this ever changes, be
+** sure to update the xBestIndex method. */
+#define JEACH_JSON 8
+#define JEACH_ROOT 9
+
+ UNUSED_PARAM(pzErr);
+ UNUSED_PARAM(argv);
+ UNUSED_PARAM(argc);
+ UNUSED_PARAM(pAux);
+ rc = sqlite3_declare_vtab(db,
+ "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path,"
+ "json HIDDEN,root HIDDEN)");
+ if( rc==SQLITE_OK ){
+ pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
+ if( pNew==0 ) return SQLITE_NOMEM;
+ memset(pNew, 0, sizeof(*pNew));
+ }
+ return rc;
+}
+
+/* destructor for json_each virtual table */
+static int jsonEachDisconnect(sqlite3_vtab *pVtab){
+ sqlite3_free(pVtab);
+ return SQLITE_OK;
+}
+
+/* constructor for a JsonEachCursor object for json_each(). */
+static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
+ JsonEachCursor *pCur;
+
+ UNUSED_PARAM(p);
+ pCur = sqlite3_malloc( sizeof(*pCur) );
+ if( pCur==0 ) return SQLITE_NOMEM;
+ memset(pCur, 0, sizeof(*pCur));
+ *ppCursor = &pCur->base;
+ return SQLITE_OK;
+}
+
+/* constructor for a JsonEachCursor object for json_tree(). */
+static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
+ int rc = jsonEachOpenEach(p, ppCursor);
+ if( rc==SQLITE_OK ){
+ JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor;
+ pCur->bRecursive = 1;
+ }
+ return rc;
+}
+
+/* Reset a JsonEachCursor back to its original state. Free any memory
+** held. */
+static void jsonEachCursorReset(JsonEachCursor *p){
+ sqlite3_free(p->zJson);
+ sqlite3_free(p->zRoot);
+ jsonParseReset(&p->sParse);
+ p->iRowid = 0;
+ p->i = 0;
+ p->iEnd = 0;
+ p->eType = 0;
+ p->zJson = 0;
+ p->zRoot = 0;
+}
+
+/* Destructor for a jsonEachCursor object */
+static int jsonEachClose(sqlite3_vtab_cursor *cur){
+ JsonEachCursor *p = (JsonEachCursor*)cur;
+ jsonEachCursorReset(p);
+ sqlite3_free(cur);
+ return SQLITE_OK;
+}
+
+/* Return TRUE if the jsonEachCursor object has been advanced off the end
+** of the JSON object */
+static int jsonEachEof(sqlite3_vtab_cursor *cur){
+ JsonEachCursor *p = (JsonEachCursor*)cur;
+ return p->i >= p->iEnd;
+}
+
+/* Advance the cursor to the next element for json_tree() */
+static int jsonEachNext(sqlite3_vtab_cursor *cur){
+ JsonEachCursor *p = (JsonEachCursor*)cur;
+ if( p->bRecursive ){
+ if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++;
+ p->i++;
+ p->iRowid++;
+ if( p->i<p->iEnd ){
+ u32 iUp = p->sParse.aUp[p->i];
+ JsonNode *pUp = &p->sParse.aNode[iUp];
+ p->eType = pUp->eType;
+ if( pUp->eType==JSON_ARRAY ){
+ if( iUp==p->i-1 ){
+ pUp->u.iKey = 0;
+ }else{
+ pUp->u.iKey++;
+ }
+ }
+ }
+ }else{
+ switch( p->eType ){
+ case JSON_ARRAY: {
+ p->i += jsonNodeSize(&p->sParse.aNode[p->i]);
+ p->iRowid++;
+ break;
+ }
+ case JSON_OBJECT: {
+ p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]);
+ p->iRowid++;
+ break;
+ }
+ default: {
+ p->i = p->iEnd;
+ break;
+ }
+ }
+ }
+ return SQLITE_OK;
+}
+
+/* Append the name of the path for element i to pStr
+*/
+static void jsonEachComputePath(
+ JsonEachCursor *p, /* The cursor */
+ JsonString *pStr, /* Write the path here */
+ u32 i /* Path to this element */
+){
+ JsonNode *pNode, *pUp;
+ u32 iUp;
+ if( i==0 ){
+ jsonAppendChar(pStr, '$');
+ return;
+ }
+ iUp = p->sParse.aUp[i];
+ jsonEachComputePath(p, pStr, iUp);
+ pNode = &p->sParse.aNode[i];
+ pUp = &p->sParse.aNode[iUp];
+ if( pUp->eType==JSON_ARRAY ){
+ jsonPrintf(30, pStr, "[%d]", pUp->u.iKey);
+ }else{
+ assert( pUp->eType==JSON_OBJECT );
+ if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--;
+ assert( pNode->eType==JSON_STRING );
+ assert( pNode->jnFlags & JNODE_LABEL );
+ jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1);
+ }
+}
+
+/* Return the value of a column */
+static int jsonEachColumn(
+ sqlite3_vtab_cursor *cur, /* The cursor */
+ sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
+ int i /* Which column to return */
+){
+ JsonEachCursor *p = (JsonEachCursor*)cur;
+ JsonNode *pThis = &p->sParse.aNode[p->i];
+ switch( i ){
+ case JEACH_KEY: {
+ if( p->i==0 ) break;
+ if( p->eType==JSON_OBJECT ){
+ jsonReturn(pThis, ctx, 0);
+ }else if( p->eType==JSON_ARRAY ){
+ u32 iKey;
+ if( p->bRecursive ){
+ if( p->iRowid==0 ) break;
+ iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey;
+ }else{
+ iKey = p->iRowid;
+ }
+ sqlite3_result_int64(ctx, (sqlite3_int64)iKey);
+ }
+ break;
+ }
+ case JEACH_VALUE: {
+ if( pThis->jnFlags & JNODE_LABEL ) pThis++;
+ jsonReturn(pThis, ctx, 0);
+ break;
+ }
+ case JEACH_TYPE: {
+ if( pThis->jnFlags & JNODE_LABEL ) pThis++;
+ sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC);
+ break;
+ }
+ case JEACH_ATOM: {
+ if( pThis->jnFlags & JNODE_LABEL ) pThis++;
+ if( pThis->eType>=JSON_ARRAY ) break;
+ jsonReturn(pThis, ctx, 0);
+ break;
+ }
+ case JEACH_ID: {
+ sqlite3_result_int64(ctx,
+ (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0));
+ break;
+ }
+ case JEACH_PARENT: {
+ if( p->i>p->iBegin && p->bRecursive ){
+ sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]);
+ }
+ break;
+ }
+ case JEACH_FULLKEY: {
+ JsonString x;
+ jsonInit(&x, ctx);
+ if( p->bRecursive ){
+ jsonEachComputePath(p, &x, p->i);
+ }else{
+ if( p->zRoot ){
+ jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot));
+ }else{
+ jsonAppendChar(&x, '$');
+ }
+ if( p->eType==JSON_ARRAY ){
+ jsonPrintf(30, &x, "[%d]", p->iRowid);
+ }else if( p->eType==JSON_OBJECT ){
+ jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1);
+ }
+ }
+ jsonResult(&x);
+ break;
+ }
+ case JEACH_PATH: {
+ if( p->bRecursive ){
+ JsonString x;
+ jsonInit(&x, ctx);
+ jsonEachComputePath(p, &x, p->sParse.aUp[p->i]);
+ jsonResult(&x);
+ break;
+ }
+ /* For json_each() path and root are the same so fall through
+ ** into the root case */
+ }
+ default: {
+ const char *zRoot = p->zRoot;
+ if( zRoot==0 ) zRoot = "$";
+ sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC);
+ break;
+ }
+ case JEACH_JSON: {
+ assert( i==JEACH_JSON );
+ sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC);
+ break;
+ }
+ }
+ return SQLITE_OK;
+}
+
+/* Return the current rowid value */
+static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
+ JsonEachCursor *p = (JsonEachCursor*)cur;
+ *pRowid = p->iRowid;
+ return SQLITE_OK;
+}
+
+/* The query strategy is to look for an equality constraint on the json
+** column. Without such a constraint, the table cannot operate. idxNum is
+** 1 if the constraint is found, 3 if the constraint and zRoot are found,
+** and 0 otherwise.
+*/
+static int jsonEachBestIndex(
+ sqlite3_vtab *tab,
+ sqlite3_index_info *pIdxInfo
+){
+ int i; /* Loop counter or computed array index */
+ int aIdx[2]; /* Index of constraints for JSON and ROOT */
+ int unusableMask = 0; /* Mask of unusable JSON and ROOT constraints */
+ int idxMask = 0; /* Mask of usable == constraints JSON and ROOT */
+ const struct sqlite3_index_constraint *pConstraint;
+
+ /* This implementation assumes that JSON and ROOT are the last two
+ ** columns in the table */
+ assert( JEACH_ROOT == JEACH_JSON+1 );
+ UNUSED_PARAM(tab);
+ aIdx[0] = aIdx[1] = -1;
+ pConstraint = pIdxInfo->aConstraint;
+ for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
+ int iCol;
+ int iMask;
+ if( pConstraint->iColumn < JEACH_JSON ) continue;
+ iCol = pConstraint->iColumn - JEACH_JSON;
+ assert( iCol==0 || iCol==1 );
+ iMask = 1 << iCol;
+ if( pConstraint->usable==0 ){
+ unusableMask |= iMask;
+ }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){
+ aIdx[iCol] = i;
+ idxMask |= iMask;
+ }
+ }
+ if( (unusableMask & ~idxMask)!=0 ){
+ /* If there are any unusable constraints on JSON or ROOT, then reject
+ ** this entire plan */
+ return SQLITE_CONSTRAINT;
+ }
+ if( aIdx[0]<0 ){
+ /* No JSON input. Leave estimatedCost at the huge value that it was
+ ** initialized to to discourage the query planner from selecting this
+ ** plan. */
+ pIdxInfo->idxNum = 0;
+ }else{
+ pIdxInfo->estimatedCost = 1.0;
+ i = aIdx[0];
+ pIdxInfo->aConstraintUsage[i].argvIndex = 1;
+ pIdxInfo->aConstraintUsage[i].omit = 1;
+ if( aIdx[1]<0 ){
+ pIdxInfo->idxNum = 1; /* Only JSON supplied. Plan 1 */
+ }else{
+ i = aIdx[1];
+ pIdxInfo->aConstraintUsage[i].argvIndex = 2;
+ pIdxInfo->aConstraintUsage[i].omit = 1;
+ pIdxInfo->idxNum = 3; /* Both JSON and ROOT are supplied. Plan 3 */
+ }
+ }
+ return SQLITE_OK;
+}
+
+/* Start a search on a new JSON string */
+static int jsonEachFilter(
+ sqlite3_vtab_cursor *cur,
+ int idxNum, const char *idxStr,
+ int argc, sqlite3_value **argv
+){
+ JsonEachCursor *p = (JsonEachCursor*)cur;
+ const char *z;
+ const char *zRoot = 0;
+ sqlite3_int64 n;
+
+ UNUSED_PARAM(idxStr);
+ UNUSED_PARAM(argc);
+ jsonEachCursorReset(p);
+ if( idxNum==0 ) return SQLITE_OK;
+ z = (const char*)sqlite3_value_text(argv[0]);
+ if( z==0 ) return SQLITE_OK;
+ n = sqlite3_value_bytes(argv[0]);
+ p->zJson = sqlite3_malloc64( n+1 );
+ if( p->zJson==0 ) return SQLITE_NOMEM;
+ memcpy(p->zJson, z, (size_t)n+1);
+ if( jsonParse(&p->sParse, 0, p->zJson) ){
+ int rc = SQLITE_NOMEM;
+ if( p->sParse.oom==0 ){
+ sqlite3_free(cur->pVtab->zErrMsg);
+ cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON");
+ if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR;
+ }
+ jsonEachCursorReset(p);
+ return rc;
+ }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){
+ jsonEachCursorReset(p);
+ return SQLITE_NOMEM;
+ }else{
+ JsonNode *pNode = 0;
+ if( idxNum==3 ){
+ const char *zErr = 0;
+ zRoot = (const char*)sqlite3_value_text(argv[1]);
+ if( zRoot==0 ) return SQLITE_OK;
+ n = sqlite3_value_bytes(argv[1]);
+ p->zRoot = sqlite3_malloc64( n+1 );
+ if( p->zRoot==0 ) return SQLITE_NOMEM;
+ memcpy(p->zRoot, zRoot, (size_t)n+1);
+ if( zRoot[0]!='$' ){
+ zErr = zRoot;
+ }else{
+ pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr);
+ }
+ if( zErr ){
+ sqlite3_free(cur->pVtab->zErrMsg);
+ cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr);
+ jsonEachCursorReset(p);
+ return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM;
+ }else if( pNode==0 ){
+ return SQLITE_OK;
+ }
+ }else{
+ pNode = p->sParse.aNode;
+ }
+ p->iBegin = p->i = (int)(pNode - p->sParse.aNode);
+ p->eType = pNode->eType;
+ if( p->eType>=JSON_ARRAY ){
+ pNode->u.iKey = 0;
+ p->iEnd = p->i + pNode->n + 1;
+ if( p->bRecursive ){
+ p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType;
+ if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){
+ p->i--;
+ }
+ }else{
+ p->i++;
+ }
+ }else{
+ p->iEnd = p->i+1;
+ }
+ }
+ return SQLITE_OK;
+}
+
+/* The methods of the json_each virtual table */
+static sqlite3_module jsonEachModule = {
+ 0, /* iVersion */
+ 0, /* xCreate */
+ jsonEachConnect, /* xConnect */
+ jsonEachBestIndex, /* xBestIndex */
+ jsonEachDisconnect, /* xDisconnect */
+ 0, /* xDestroy */
+ jsonEachOpenEach, /* xOpen - open a cursor */
+ jsonEachClose, /* xClose - close a cursor */
+ jsonEachFilter, /* xFilter - configure scan constraints */
+ jsonEachNext, /* xNext - advance a cursor */
+ jsonEachEof, /* xEof - check for end of scan */
+ jsonEachColumn, /* xColumn - read data */
+ jsonEachRowid, /* xRowid - read data */
+ 0, /* xUpdate */
+ 0, /* xBegin */
+ 0, /* xSync */
+ 0, /* xCommit */
+ 0, /* xRollback */
+ 0, /* xFindMethod */
+ 0, /* xRename */
+ 0, /* xSavepoint */
+ 0, /* xRelease */
+ 0, /* xRollbackTo */
+ 0 /* xShadowName */
+};
+
+/* The methods of the json_tree virtual table. */
+static sqlite3_module jsonTreeModule = {
+ 0, /* iVersion */
+ 0, /* xCreate */
+ jsonEachConnect, /* xConnect */
+ jsonEachBestIndex, /* xBestIndex */
+ jsonEachDisconnect, /* xDisconnect */
+ 0, /* xDestroy */
+ jsonEachOpenTree, /* xOpen - open a cursor */
+ jsonEachClose, /* xClose - close a cursor */
+ jsonEachFilter, /* xFilter - configure scan constraints */
+ jsonEachNext, /* xNext - advance a cursor */
+ jsonEachEof, /* xEof - check for end of scan */
+ jsonEachColumn, /* xColumn - read data */
+ jsonEachRowid, /* xRowid - read data */
+ 0, /* xUpdate */
+ 0, /* xBegin */
+ 0, /* xSync */
+ 0, /* xCommit */
+ 0, /* xRollback */
+ 0, /* xFindMethod */
+ 0, /* xRename */
+ 0, /* xSavepoint */
+ 0, /* xRelease */
+ 0, /* xRollbackTo */
+ 0 /* xShadowName */
+};
+#endif /* SQLITE_OMIT_VIRTUALTABLE */
+
+/****************************************************************************
+** The following routines are the only publically visible identifiers in this
+** file. Call the following routines in order to register the various SQL
+** functions and the virtual table implemented by this file.
+****************************************************************************/
+
+SQLITE_PRIVATE int sqlite3Json1Init(sqlite3 *db){
+ int rc = SQLITE_OK;
+ unsigned int i;
+ static const struct {
+ const char *zName;
+ int nArg;
+ int flag;
+ void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
+ } aFunc[] = {
+ { "json", 1, 0, jsonRemoveFunc },
+ { "json_array", -1, 0, jsonArrayFunc },
+ { "json_array_length", 1, 0, jsonArrayLengthFunc },
+ { "json_array_length", 2, 0, jsonArrayLengthFunc },
+ { "json_extract", -1, 0, jsonExtractFunc },
+ { "json_insert", -1, 0, jsonSetFunc },
+ { "json_object", -1, 0, jsonObjectFunc },
+ { "json_patch", 2, 0, jsonPatchFunc },
+ { "json_quote", 1, 0, jsonQuoteFunc },
+ { "json_remove", -1, 0, jsonRemoveFunc },
+ { "json_replace", -1, 0, jsonReplaceFunc },
+ { "json_set", -1, 1, jsonSetFunc },
+ { "json_type", 1, 0, jsonTypeFunc },
+ { "json_type", 2, 0, jsonTypeFunc },
+ { "json_valid", 1, 0, jsonValidFunc },
+
+#if SQLITE_DEBUG
+ /* DEBUG and TESTING functions */
+ { "json_parse", 1, 0, jsonParseFunc },
+ { "json_test1", 1, 0, jsonTest1Func },
+#endif
+ };
+ static const struct {
+ const char *zName;
+ int nArg;
+ void (*xStep)(sqlite3_context*,int,sqlite3_value**);
+ void (*xFinal)(sqlite3_context*);
+ void (*xValue)(sqlite3_context*);
+ } aAgg[] = {
+ { "json_group_array", 1,
+ jsonArrayStep, jsonArrayFinal, jsonArrayValue },
+ { "json_group_object", 2,
+ jsonObjectStep, jsonObjectFinal, jsonObjectValue },
+ };
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ static const struct {
+ const char *zName;
+ sqlite3_module *pModule;
+ } aMod[] = {
+ { "json_each", &jsonEachModule },
+ { "json_tree", &jsonTreeModule },
+ };
+#endif
+ for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
+ rc = sqlite3_create_function(db, aFunc[i].zName, aFunc[i].nArg,
+ SQLITE_UTF8 | SQLITE_DETERMINISTIC,
+ (void*)&aFunc[i].flag,
+ aFunc[i].xFunc, 0, 0);
+ }
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ for(i=0; i<sizeof(aAgg)/sizeof(aAgg[0]) && rc==SQLITE_OK; i++){
+ rc = sqlite3_create_window_function(db, aAgg[i].zName, aAgg[i].nArg,
+ SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
+ aAgg[i].xStep, aAgg[i].xFinal,
+ aAgg[i].xValue, jsonGroupInverse, 0);
+ }
+#endif
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ for(i=0; i<sizeof(aMod)/sizeof(aMod[0]) && rc==SQLITE_OK; i++){
+ rc = sqlite3_create_module(db, aMod[i].zName, aMod[i].pModule, 0);
+ }
+#endif
+ return rc;
+}
+
+
+#ifndef SQLITE_CORE
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+SQLITE_API int sqlite3_json_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3Json1Init(db);
+}
+#endif
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) */
+
+/************** End of json1.c ***********************************************/
/************** Begin file rtree.c *******************************************/
/*
** 2001 September 15
@@ -165656,14 +179149,15 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){
**
** CREATE TABLE %_node(nodeno INTEGER PRIMARY KEY, data BLOB)
** CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)
-** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER)
+** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER, ...)
**
** The data for each node of the r-tree structure is stored in the %_node
** table. For each node that is not the root node of the r-tree, there is
** an entry in the %_parent table associating the node with its parent.
** And for each row of data in the table, there is an entry in the %_rowid
** table that maps from the entries rowid to the id of the node that it
-** is stored on.
+** is stored on. If the r-tree contains auxiliary columns, those are stored
+** on the end of the %_rowid table.
**
** The root node of an r-tree always exists, even if the r-tree table is
** empty. The nodeno of the root node is always 1. All other nodes in the
@@ -165684,7 +179178,8 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){
** child page.
*/
-#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RTREE)
+#if !defined(SQLITE_CORE) \
+ || (defined(SQLITE_ENABLE_RTREE) && !defined(SQLITE_OMIT_VIRTUALTABLE))
#ifndef SQLITE_CORE
/* #include "sqlite3ext.h" */
@@ -165725,6 +179220,9 @@ typedef struct RtreeSearchPoint RtreeSearchPoint;
/* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */
#define RTREE_MAX_DIMENSIONS 5
+/* Maximum number of auxiliary columns */
+#define RTREE_MAX_AUX_COLUMN 100
+
/* Size of hash table Rtree.aHash. This hash table is not expected to
** ever contain very many entries, so a fixed number of buckets is
** used.
@@ -165753,12 +179251,16 @@ struct Rtree {
u8 eCoordType; /* RTREE_COORD_REAL32 or RTREE_COORD_INT32 */
u8 nBytesPerCell; /* Bytes consumed per cell */
u8 inWrTrans; /* True if inside write transaction */
+ u8 nAux; /* # of auxiliary columns in %_rowid */
+ u8 nAuxNotNull; /* Number of initial not-null aux columns */
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 */
u32 nBusy; /* Current number of users of this structure */
i64 nRowEst; /* Estimated number of rows in this table */
u32 nCursor; /* Number of open cursors */
+ u32 nNodeRef; /* Number RtreeNodes with positive nRef */
+ char *zReadAuxSql; /* SQL for statement to read aux data */
/* List of nodes removed during a CondenseTree operation. List is
** linked together via the pointer normally used for hash chains -
@@ -165785,6 +179287,9 @@ struct Rtree {
sqlite3_stmt *pWriteParent;
sqlite3_stmt *pDeleteParent;
+ /* Statement for writing to the "aux:" fields, if there are any */
+ sqlite3_stmt *pWriteAux;
+
RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */
};
@@ -165841,7 +179346,7 @@ struct RtreeSearchPoint {
** The smallest possible node-size is (512-64)==448 bytes. And the largest
** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates).
** Therefore all non-root nodes must contain at least 3 entries. Since
-** 2^40 is greater than 2^64, an r-tree structure always has a depth of
+** 3^40 is greater than 2^64, an r-tree structure always has a depth of
** 40 or less.
*/
#define RTREE_MAX_DEPTH 40
@@ -165861,6 +179366,7 @@ struct RtreeCursor {
sqlite3_vtab_cursor base; /* Base class. Must be first */
u8 atEOF; /* True if at end of search */
u8 bPoint; /* True if sPoint is valid */
+ u8 bAuxValid; /* True if pReadAux is valid */
int iStrategy; /* Copy of idxNum search parameter */
int nConstraint; /* Number of entries in aConstraint */
RtreeConstraint *aConstraint; /* Search constraints. */
@@ -165868,6 +179374,7 @@ struct RtreeCursor {
int nPoint; /* Number of slots used in aPoint[] */
int mxLevel; /* iLevel value for root of the tree */
RtreeSearchPoint *aPoint; /* Priority queue for search points */
+ sqlite3_stmt *pReadAux; /* Statement to read aux-data */
RtreeSearchPoint sPoint; /* Cached next search point */
RtreeNode *aNode[RTREE_CACHE_SZ]; /* Rtree node cache */
u32 anQueue[RTREE_MAX_DEPTH+1]; /* Number of queued entries by iLevel */
@@ -166154,6 +179661,7 @@ static int writeInt64(u8 *p, i64 i){
*/
static void nodeReference(RtreeNode *p){
if( p ){
+ assert( p->nRef>0 );
p->nRef++;
}
}
@@ -166221,6 +179729,7 @@ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){
memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize);
pNode->zData = (u8 *)&pNode[1];
pNode->nRef = 1;
+ pRtree->nNodeRef++;
pNode->pParent = pParent;
pNode->isDirty = 1;
nodeReference(pParent);
@@ -166254,10 +179763,10 @@ static int nodeAcquire(
/* Check if the requested node is already in the hash table. If so,
** increase its reference count and return it.
*/
- if( (pNode = nodeHashLookup(pRtree, iNode)) ){
+ if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){
assert( !pParent || !pNode->pParent || pNode->pParent==pParent );
if( pParent && !pNode->pParent ){
- nodeReference(pParent);
+ pParent->nRef++;
pNode->pParent = pParent;
}
pNode->nRef++;
@@ -166296,6 +179805,7 @@ static int nodeAcquire(
pNode->pParent = pParent;
pNode->zData = (u8 *)&pNode[1];
pNode->nRef = 1;
+ pRtree->nNodeRef++;
pNode->iNode = iNode;
pNode->isDirty = 0;
pNode->pNext = 0;
@@ -166336,7 +179846,10 @@ static int nodeAcquire(
}
*ppNode = pNode;
}else{
- sqlite3_free(pNode);
+ if( pNode ){
+ pRtree->nNodeRef--;
+ sqlite3_free(pNode);
+ }
*ppNode = 0;
}
@@ -166416,6 +179929,7 @@ static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){
sqlite3_step(p);
pNode->isDirty = 0;
rc = sqlite3_reset(p);
+ sqlite3_bind_null(p, 2);
if( pNode->iNode==0 && rc==SQLITE_OK ){
pNode->iNode = sqlite3_last_insert_rowid(pRtree->db);
nodeHashInsert(pRtree, pNode);
@@ -166432,8 +179946,10 @@ static int nodeRelease(Rtree *pRtree, RtreeNode *pNode){
int rc = SQLITE_OK;
if( pNode ){
assert( pNode->nRef>0 );
+ assert( pRtree->nNodeRef>0 );
pNode->nRef--;
if( pNode->nRef==0 ){
+ pRtree->nNodeRef--;
if( pNode->iNode==1 ){
pRtree->iDepth = -1;
}
@@ -166550,8 +180066,9 @@ static void rtreeRelease(Rtree *pRtree){
pRtree->nBusy--;
if( pRtree->nBusy==0 ){
pRtree->inWrTrans = 0;
- pRtree->nCursor = 0;
+ assert( pRtree->nCursor==0 );
nodeBlobReset(pRtree);
+ assert( pRtree->nNodeRef==0 );
sqlite3_finalize(pRtree->pWriteNode);
sqlite3_finalize(pRtree->pDeleteNode);
sqlite3_finalize(pRtree->pReadRowid);
@@ -166560,6 +180077,8 @@ static void rtreeRelease(Rtree *pRtree){
sqlite3_finalize(pRtree->pReadParent);
sqlite3_finalize(pRtree->pWriteParent);
sqlite3_finalize(pRtree->pDeleteParent);
+ sqlite3_finalize(pRtree->pWriteAux);
+ sqlite3_free(pRtree->zReadAuxSql);
sqlite3_free(pRtree);
}
}
@@ -166648,6 +180167,7 @@ static int rtreeClose(sqlite3_vtab_cursor *cur){
RtreeCursor *pCsr = (RtreeCursor *)cur;
assert( pRtree->nCursor>0 );
freeCursorConstraints(pCsr);
+ sqlite3_finalize(pCsr->pReadAux);
sqlite3_free(pCsr->aPoint);
for(ii=0; ii<RTREE_CACHE_SZ; ii++) nodeRelease(pRtree, pCsr->aNode[ii]);
sqlite3_free(pCsr);
@@ -167019,7 +180539,7 @@ static RtreeSearchPoint *rtreeSearchPointNew(
if( ii<RTREE_CACHE_SZ ){
assert( pCur->aNode[ii]==0 );
pCur->aNode[ii] = pCur->aNode[0];
- }else{
+ }else{
nodeRelease(RTREE_OF_CURSOR(pCur), pCur->aNode[0]);
}
pCur->aNode[0] = 0;
@@ -167190,6 +180710,10 @@ static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){
/* Move to the next entry that matches the configured constraints. */
RTREE_QUEUE_TRACE(pCsr, "POP-Nx:");
+ if( pCsr->bAuxValid ){
+ pCsr->bAuxValid = 0;
+ sqlite3_reset(pCsr->pReadAux);
+ }
rtreeSearchPointPop(pCsr);
rc = rtreeStepToLeaf(pCsr);
return rc;
@@ -167224,7 +180748,7 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
if( p==0 ) return SQLITE_OK;
if( i==0 ){
sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell));
- }else{
+ }else if( i<=pRtree->nDim2 ){
nodeGetCoord(pRtree, pNode, p->iCell, i-1, &c);
#ifndef SQLITE_RTREE_INT_ONLY
if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
@@ -167235,7 +180759,27 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
assert( pRtree->eCoordType==RTREE_COORD_INT32 );
sqlite3_result_int(ctx, c.i);
}
- }
+ }else{
+ if( !pCsr->bAuxValid ){
+ if( pCsr->pReadAux==0 ){
+ rc = sqlite3_prepare_v3(pRtree->db, pRtree->zReadAuxSql, -1, 0,
+ &pCsr->pReadAux, 0);
+ if( rc ) return rc;
+ }
+ sqlite3_bind_int64(pCsr->pReadAux, 1,
+ nodeGetRowid(pRtree, pNode, p->iCell));
+ rc = sqlite3_step(pCsr->pReadAux);
+ if( rc==SQLITE_ROW ){
+ pCsr->bAuxValid = 1;
+ }else{
+ sqlite3_reset(pCsr->pReadAux);
+ if( rc==SQLITE_DONE ) rc = SQLITE_OK;
+ return rc;
+ }
+ }
+ sqlite3_result_value(ctx,
+ sqlite3_column_value(pCsr->pReadAux, i - pRtree->nDim2 + 1));
+ }
return SQLITE_OK;
}
@@ -167313,14 +180857,17 @@ static int rtreeFilter(
int ii;
int rc = SQLITE_OK;
int iCell = 0;
+ sqlite3_stmt *pStmt;
rtreeReference(pRtree);
/* Reset the cursor to the same state as rtreeOpen() leaves it in. */
freeCursorConstraints(pCsr);
sqlite3_free(pCsr->aPoint);
+ pStmt = pCsr->pReadAux;
memset(pCsr, 0, sizeof(RtreeCursor));
pCsr->base.pVtab = (sqlite3_vtab*)pRtree;
+ pCsr->pReadAux = pStmt;
pCsr->iStrategy = idxNum;
if( idxNum==1 ){
@@ -167483,10 +181030,14 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
*/
pIdxInfo->estimatedCost = 30.0;
pIdxInfo->estimatedRows = 1;
+ pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE;
return SQLITE_OK;
}
- if( p->usable && (p->iColumn>0 || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) ){
+ if( p->usable
+ && ((p->iColumn>0 && p->iColumn<=pRtree->nDim2)
+ || p->op==SQLITE_INDEX_CONSTRAINT_MATCH)
+ ){
u8 op;
switch( p->op ){
case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break;
@@ -167653,7 +181204,7 @@ static int ChooseLeaf(
){
int rc;
int ii;
- RtreeNode *pNode;
+ RtreeNode *pNode = 0;
rc = nodeAcquire(pRtree, 1, 0, &pNode);
for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){
@@ -168059,7 +181610,7 @@ static int SplitNode(
}else{
pLeft = pNode;
pRight = nodeNew(pRtree, pLeft->pParent);
- nodeReference(pLeft);
+ pLeft->nRef++;
}
if( !pLeft || !pRight ){
@@ -168468,7 +182019,7 @@ static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){
/*
** Select a currently unused rowid for a new r-tree record.
*/
-static int newRowid(Rtree *pRtree, i64 *piRowid){
+static int rtreeNewRowid(Rtree *pRtree, i64 *piRowid){
int rc;
sqlite3_bind_null(pRtree->pWriteRowid, 1);
sqlite3_bind_null(pRtree->pWriteRowid, 2);
@@ -168528,7 +182079,7 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){
*/
if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){
int rc2;
- RtreeNode *pChild;
+ RtreeNode *pChild = 0;
i64 iChild = nodeGetRowid(pRtree, pRoot, 0);
rc = nodeAcquire(pRtree, iChild, pRoot, &pChild);
if( rc==SQLITE_OK ){
@@ -168549,6 +182100,7 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){
rc = reinsertNodeContent(pRtree, pLeaf);
}
pRtree->pDeleted = pLeaf->pNext;
+ pRtree->nNodeRef--;
sqlite3_free(pLeaf);
}
@@ -168645,7 +182197,7 @@ static int rtreeConstraintError(Rtree *pRtree, int iCol){
static int rtreeUpdate(
sqlite3_vtab *pVtab,
int nData,
- sqlite3_value **azData,
+ sqlite3_value **aData,
sqlite_int64 *pRowid
){
Rtree *pRtree = (Rtree *)pVtab;
@@ -168653,6 +182205,12 @@ static int rtreeUpdate(
RtreeCell cell; /* New cell to insert if nData>1 */
int bHaveRowid = 0; /* Set to 1 after new rowid is determined */
+ if( pRtree->nNodeRef ){
+ /* Unable to write to the btree while another cursor is reading from it,
+ ** since the write might do a rebalance which would disrupt the read
+ ** cursor. */
+ return SQLITE_LOCKED_VTAB;
+ }
rtreeReference(pRtree);
assert(nData>=1);
@@ -168671,8 +182229,10 @@ static int rtreeUpdate(
*/
if( nData>1 ){
int ii;
+ int nn = nData - 4;
- /* Populate the cell.aCoord[] array. The first coordinate is azData[3].
+ if( nn > pRtree->nDim2 ) nn = pRtree->nDim2;
+ /* Populate the cell.aCoord[] array. The first coordinate is aData[3].
**
** NB: nData can only be less than nDim*2+3 if the rtree is mis-declared
** with "column" that are interpreted as table constraints.
@@ -168680,13 +182240,12 @@ static int rtreeUpdate(
** This problem was discovered after years of use, so we silently ignore
** these kinds of misdeclared tables to avoid breaking any legacy.
*/
- assert( nData<=(pRtree->nDim2 + 3) );
#ifndef SQLITE_RTREE_INT_ONLY
if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
- for(ii=0; ii<nData-4; ii+=2){
- cell.aCoord[ii].f = rtreeValueDown(azData[ii+3]);
- cell.aCoord[ii+1].f = rtreeValueUp(azData[ii+4]);
+ for(ii=0; ii<nn; ii+=2){
+ cell.aCoord[ii].f = rtreeValueDown(aData[ii+3]);
+ cell.aCoord[ii+1].f = rtreeValueUp(aData[ii+4]);
if( cell.aCoord[ii].f>cell.aCoord[ii+1].f ){
rc = rtreeConstraintError(pRtree, ii+1);
goto constraint;
@@ -168695,9 +182254,9 @@ static int rtreeUpdate(
}else
#endif
{
- for(ii=0; ii<nData-4; ii+=2){
- cell.aCoord[ii].i = sqlite3_value_int(azData[ii+3]);
- cell.aCoord[ii+1].i = sqlite3_value_int(azData[ii+4]);
+ for(ii=0; ii<nn; ii+=2){
+ cell.aCoord[ii].i = sqlite3_value_int(aData[ii+3]);
+ cell.aCoord[ii+1].i = sqlite3_value_int(aData[ii+4]);
if( cell.aCoord[ii].i>cell.aCoord[ii+1].i ){
rc = rtreeConstraintError(pRtree, ii+1);
goto constraint;
@@ -168707,10 +182266,10 @@ static int rtreeUpdate(
/* If a rowid value was supplied, check if it is already present in
** the table. If so, the constraint has failed. */
- if( sqlite3_value_type(azData[2])!=SQLITE_NULL ){
- cell.iRowid = sqlite3_value_int64(azData[2]);
- if( sqlite3_value_type(azData[0])==SQLITE_NULL
- || sqlite3_value_int64(azData[0])!=cell.iRowid
+ if( sqlite3_value_type(aData[2])!=SQLITE_NULL ){
+ cell.iRowid = sqlite3_value_int64(aData[2]);
+ if( sqlite3_value_type(aData[0])==SQLITE_NULL
+ || sqlite3_value_int64(aData[0])!=cell.iRowid
){
int steprc;
sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid);
@@ -168729,16 +182288,16 @@ static int rtreeUpdate(
}
}
- /* If azData[0] is not an SQL NULL value, it is the rowid of a
+ /* If aData[0] is not an SQL NULL value, it is the rowid of a
** record to delete from the r-tree table. The following block does
** just that.
*/
- if( sqlite3_value_type(azData[0])!=SQLITE_NULL ){
- rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(azData[0]));
+ if( sqlite3_value_type(aData[0])!=SQLITE_NULL ){
+ rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(aData[0]));
}
- /* If the azData[] array contains more than one element, elements
- ** (azData[2]..azData[argc-1]) contain a new record to insert into
+ /* If the aData[] array contains more than one element, elements
+ ** (aData[2]..aData[argc-1]) contain a new record to insert into
** the r-tree structure.
*/
if( rc==SQLITE_OK && nData>1 ){
@@ -168747,7 +182306,7 @@ static int rtreeUpdate(
/* Figure out the rowid of the new row. */
if( bHaveRowid==0 ){
- rc = newRowid(pRtree, &cell.iRowid);
+ rc = rtreeNewRowid(pRtree, &cell.iRowid);
}
*pRowid = cell.iRowid;
@@ -168763,6 +182322,16 @@ static int rtreeUpdate(
rc = rc2;
}
}
+ if( pRtree->nAux ){
+ sqlite3_stmt *pUp = pRtree->pWriteAux;
+ int jj;
+ sqlite3_bind_int64(pUp, 1, *pRowid);
+ for(jj=0; jj<pRtree->nAux; jj++){
+ sqlite3_bind_value(pUp, jj+2, aData[pRtree->nDim2+3+jj]);
+ }
+ sqlite3_step(pUp);
+ rc = sqlite3_reset(pUp);
+ }
}
constraint:
@@ -168829,7 +182398,7 @@ static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){
*/
static int rtreeSavepoint(sqlite3_vtab *pVtab, int iSavepoint){
Rtree *pRtree = (Rtree *)pVtab;
- int iwt = pRtree->inWrTrans;
+ u8 iwt = pRtree->inWrTrans;
UNUSED_PARAMETER(iSavepoint);
pRtree->inWrTrans = 0;
nodeBlobReset(pRtree);
@@ -168881,8 +182450,24 @@ static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){
return rc;
}
+
+/*
+** Return true if zName is the extension on one of the shadow tables used
+** by this module.
+*/
+static int rtreeShadowName(const char *zName){
+ static const char *azName[] = {
+ "node", "parent", "rowid"
+ };
+ unsigned int i;
+ for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
+ if( sqlite3_stricmp(zName, azName[i])==0 ) return 1;
+ }
+ return 0;
+}
+
static sqlite3_module rtreeModule = {
- 2, /* iVersion */
+ 3, /* iVersion */
rtreeCreate, /* xCreate - create a table */
rtreeConnect, /* xConnect - connect to an existing table */
rtreeBestIndex, /* xBestIndex - Determine search strategy */
@@ -168905,6 +182490,7 @@ static sqlite3_module rtreeModule = {
rtreeSavepoint, /* xSavepoint */
0, /* xRelease */
0, /* xRollbackTo */
+ rtreeShadowName /* xShadowName */
};
static int rtreeSqlInit(
@@ -168919,18 +182505,18 @@ static int rtreeSqlInit(
#define N_STATEMENT 8
static const char *azSql[N_STATEMENT] = {
/* Write the xxx_node table */
- "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(:1, :2)",
- "DELETE FROM '%q'.'%q_node' WHERE nodeno = :1",
+ "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(?1, ?2)",
+ "DELETE FROM '%q'.'%q_node' WHERE nodeno = ?1",
/* Read and write the xxx_rowid table */
- "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = :1",
- "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(:1, :2)",
- "DELETE FROM '%q'.'%q_rowid' WHERE rowid = :1",
+ "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = ?1",
+ "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(?1, ?2)",
+ "DELETE FROM '%q'.'%q_rowid' WHERE rowid = ?1",
/* Read and write the xxx_parent table */
- "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = :1",
- "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(:1, :2)",
- "DELETE FROM '%q'.'%q_parent' WHERE nodeno = :1"
+ "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = ?1",
+ "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(?1, ?2)",
+ "DELETE FROM '%q'.'%q_parent' WHERE nodeno = ?1"
};
sqlite3_stmt **appStmt[N_STATEMENT];
int i;
@@ -168938,14 +182524,25 @@ static int rtreeSqlInit(
pRtree->db = db;
if( isCreate ){
- char *zCreate = sqlite3_mprintf(
-"CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY, data BLOB);"
-"CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY, nodeno INTEGER);"
-"CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY,"
- " parentnode INTEGER);"
-"INSERT INTO '%q'.'%q_node' VALUES(1, zeroblob(%d))",
- zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, pRtree->iNodeSize
- );
+ char *zCreate;
+ sqlite3_str *p = sqlite3_str_new(db);
+ int ii;
+ sqlite3_str_appendf(p,
+ "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY,nodeno",
+ zDb, zPrefix);
+ for(ii=0; ii<pRtree->nAux; ii++){
+ sqlite3_str_appendf(p,",a%d",ii);
+ }
+ sqlite3_str_appendf(p,
+ ");CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY,data);",
+ zDb, zPrefix);
+ sqlite3_str_appendf(p,
+ "CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY,parentnode);",
+ zDb, zPrefix);
+ sqlite3_str_appendf(p,
+ "INSERT INTO \"%w\".\"%w_node\"VALUES(1,zeroblob(%d))",
+ zDb, zPrefix, pRtree->iNodeSize);
+ zCreate = sqlite3_str_finish(p);
if( !zCreate ){
return SQLITE_NOMEM;
}
@@ -168967,7 +182564,17 @@ static int rtreeSqlInit(
rc = rtreeQueryStat1(db, pRtree);
for(i=0; i<N_STATEMENT && rc==SQLITE_OK; i++){
- char *zSql = sqlite3_mprintf(azSql[i], zDb, zPrefix);
+ char *zSql;
+ const char *zFormat;
+ if( i!=3 || pRtree->nAux==0 ){
+ zFormat = azSql[i];
+ }else {
+ /* An UPSERT is very slightly slower than REPLACE, but it is needed
+ ** if there are auxiliary columns */
+ zFormat = "INSERT INTO\"%w\".\"%w_rowid\"(rowid,nodeno)VALUES(?1,?2)"
+ "ON CONFLICT(rowid)DO UPDATE SET nodeno=excluded.nodeno";
+ }
+ zSql = sqlite3_mprintf(zFormat, zDb, zPrefix);
if( zSql ){
rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT,
appStmt[i], 0);
@@ -168976,6 +182583,36 @@ static int rtreeSqlInit(
}
sqlite3_free(zSql);
}
+ if( pRtree->nAux ){
+ pRtree->zReadAuxSql = sqlite3_mprintf(
+ "SELECT * FROM \"%w\".\"%w_rowid\" WHERE rowid=?1",
+ zDb, zPrefix);
+ if( pRtree->zReadAuxSql==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ sqlite3_str *p = sqlite3_str_new(db);
+ int ii;
+ char *zSql;
+ sqlite3_str_appendf(p, "UPDATE \"%w\".\"%w_rowid\"SET ", zDb, zPrefix);
+ for(ii=0; ii<pRtree->nAux; ii++){
+ if( ii ) sqlite3_str_append(p, ",", 1);
+ if( ii<pRtree->nAuxNotNull ){
+ sqlite3_str_appendf(p,"a%d=coalesce(?%d,a%d)",ii,ii+2,ii);
+ }else{
+ sqlite3_str_appendf(p,"a%d=?%d",ii,ii+2);
+ }
+ }
+ sqlite3_str_appendf(p, " WHERE rowid=?1");
+ zSql = sqlite3_str_finish(p);
+ if( zSql==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT,
+ &pRtree->pWriteAux, 0);
+ sqlite3_free(zSql);
+ }
+ }
+ }
return rc;
}
@@ -169078,17 +182715,22 @@ static int rtreeInit(
int nDb; /* Length of string argv[1] */
int nName; /* Length of string argv[2] */
int eCoordType = (pAux ? RTREE_COORD_INT32 : RTREE_COORD_REAL32);
+ sqlite3_str *pSql;
+ char *zSql;
+ int ii = 4;
+ int iErr;
const char *aErrMsg[] = {
0, /* 0 */
"Wrong number of columns for an rtree table", /* 1 */
"Too few columns for an rtree table", /* 2 */
- "Too many columns for an rtree table" /* 3 */
+ "Too many columns for an rtree table", /* 3 */
+ "Auxiliary rtree columns must be last" /* 4 */
};
- int iErr = (argc<6) ? 2 : argc>(RTREE_MAX_DIMENSIONS*2+4) ? 3 : argc%2;
- if( aErrMsg[iErr] ){
- *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]);
+ assert( RTREE_MAX_AUX_COLUMN<256 ); /* Aux columns counted by a u8 */
+ if( argc>RTREE_MAX_AUX_COLUMN+3 ){
+ *pzErr = sqlite3_mprintf("%s", aErrMsg[3]);
return SQLITE_ERROR;
}
@@ -169106,53 +182748,73 @@ static int rtreeInit(
pRtree->base.pModule = &rtreeModule;
pRtree->zDb = (char *)&pRtree[1];
pRtree->zName = &pRtree->zDb[nDb+1];
- pRtree->nDim = (u8)((argc-4)/2);
- pRtree->nDim2 = pRtree->nDim*2;
- pRtree->nBytesPerCell = 8 + pRtree->nDim2*4;
pRtree->eCoordType = (u8)eCoordType;
memcpy(pRtree->zDb, argv[1], nDb);
memcpy(pRtree->zName, argv[2], nName);
- /* Figure out the node size to use. */
- rc = getNodeSize(db, pRtree, isCreate, pzErr);
/* Create/Connect to the underlying relational database schema. If
** that is successful, call sqlite3_declare_vtab() to configure
** the r-tree table schema.
*/
- if( rc==SQLITE_OK ){
- if( (rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate)) ){
- *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
+ pSql = sqlite3_str_new(db);
+ sqlite3_str_appendf(pSql, "CREATE TABLE x(%s", argv[3]);
+ for(ii=4; ii<argc; ii++){
+ if( argv[ii][0]=='+' ){
+ pRtree->nAux++;
+ sqlite3_str_appendf(pSql, ",%s", argv[ii]+1);
+ }else if( pRtree->nAux>0 ){
+ break;
}else{
- char *zSql = sqlite3_mprintf("CREATE TABLE x(%s", argv[3]);
- char *zTmp;
- int ii;
- for(ii=4; zSql && ii<argc; ii++){
- zTmp = zSql;
- zSql = sqlite3_mprintf("%s, %s", zTmp, argv[ii]);
- sqlite3_free(zTmp);
- }
- if( zSql ){
- zTmp = zSql;
- zSql = sqlite3_mprintf("%s);", zTmp);
- sqlite3_free(zTmp);
- }
- if( !zSql ){
- rc = SQLITE_NOMEM;
- }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){
- *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
- }
- sqlite3_free(zSql);
+ pRtree->nDim2++;
+ sqlite3_str_appendf(pSql, ",%s", argv[ii]);
}
}
+ sqlite3_str_appendf(pSql, ");");
+ zSql = sqlite3_str_finish(pSql);
+ if( !zSql ){
+ rc = SQLITE_NOMEM;
+ }else if( ii<argc ){
+ *pzErr = sqlite3_mprintf("%s", aErrMsg[4]);
+ rc = SQLITE_ERROR;
+ }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){
+ *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
+ }
+ sqlite3_free(zSql);
+ if( rc ) goto rtreeInit_fail;
+ pRtree->nDim = pRtree->nDim2/2;
+ if( pRtree->nDim<1 ){
+ iErr = 2;
+ }else if( pRtree->nDim2>RTREE_MAX_DIMENSIONS*2 ){
+ iErr = 3;
+ }else if( pRtree->nDim2 % 2 ){
+ iErr = 1;
+ }else{
+ iErr = 0;
+ }
+ if( iErr ){
+ *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]);
+ goto rtreeInit_fail;
+ }
+ pRtree->nBytesPerCell = 8 + pRtree->nDim2*4;
- if( rc==SQLITE_OK ){
- *ppVtab = (sqlite3_vtab *)pRtree;
- }else{
- assert( *ppVtab==0 );
- assert( pRtree->nBusy==1 );
- rtreeRelease(pRtree);
+ /* Figure out the node size to use. */
+ rc = getNodeSize(db, pRtree, isCreate, pzErr);
+ if( rc ) goto rtreeInit_fail;
+ rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate);
+ if( rc ){
+ *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
+ goto rtreeInit_fail;
}
+
+ *ppVtab = (sqlite3_vtab *)pRtree;
+ return SQLITE_OK;
+
+rtreeInit_fail:
+ if( rc==SQLITE_OK ) rc = SQLITE_ERROR;
+ assert( *ppVtab==0 );
+ assert( pRtree->nBusy==1 );
+ rtreeRelease(pRtree);
return rc;
}
@@ -169241,6 +182903,2279 @@ static void rtreedepth(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
}
/*
+** Context object passed between the various routines that make up the
+** implementation of integrity-check function rtreecheck().
+*/
+typedef struct RtreeCheck RtreeCheck;
+struct RtreeCheck {
+ sqlite3 *db; /* Database handle */
+ const char *zDb; /* Database containing rtree table */
+ const char *zTab; /* Name of rtree table */
+ int bInt; /* True for rtree_i32 table */
+ int nDim; /* Number of dimensions for this rtree tbl */
+ sqlite3_stmt *pGetNode; /* Statement used to retrieve nodes */
+ sqlite3_stmt *aCheckMapping[2]; /* Statements to query %_parent/%_rowid */
+ int nLeaf; /* Number of leaf cells in table */
+ int nNonLeaf; /* Number of non-leaf cells in table */
+ int rc; /* Return code */
+ char *zReport; /* Message to report */
+ int nErr; /* Number of lines in zReport */
+};
+
+#define RTREE_CHECK_MAX_ERROR 100
+
+/*
+** Reset SQL statement pStmt. If the sqlite3_reset() call returns an error,
+** and RtreeCheck.rc==SQLITE_OK, set RtreeCheck.rc to the error code.
+*/
+static void rtreeCheckReset(RtreeCheck *pCheck, sqlite3_stmt *pStmt){
+ int rc = sqlite3_reset(pStmt);
+ if( pCheck->rc==SQLITE_OK ) pCheck->rc = rc;
+}
+
+/*
+** The second and subsequent arguments to this function are a format string
+** and printf style arguments. This function formats the string and attempts
+** to compile it as an SQL statement.
+**
+** If successful, a pointer to the new SQL statement is returned. Otherwise,
+** NULL is returned and an error code left in RtreeCheck.rc.
+*/
+static sqlite3_stmt *rtreeCheckPrepare(
+ RtreeCheck *pCheck, /* RtreeCheck object */
+ const char *zFmt, ... /* Format string and trailing args */
+){
+ va_list ap;
+ char *z;
+ sqlite3_stmt *pRet = 0;
+
+ va_start(ap, zFmt);
+ z = sqlite3_vmprintf(zFmt, ap);
+
+ if( pCheck->rc==SQLITE_OK ){
+ if( z==0 ){
+ pCheck->rc = SQLITE_NOMEM;
+ }else{
+ pCheck->rc = sqlite3_prepare_v2(pCheck->db, z, -1, &pRet, 0);
+ }
+ }
+
+ sqlite3_free(z);
+ va_end(ap);
+ return pRet;
+}
+
+/*
+** The second and subsequent arguments to this function are a printf()
+** style format string and arguments. This function formats the string and
+** appends it to the report being accumuated in pCheck.
+*/
+static void rtreeCheckAppendMsg(RtreeCheck *pCheck, const char *zFmt, ...){
+ va_list ap;
+ va_start(ap, zFmt);
+ if( pCheck->rc==SQLITE_OK && pCheck->nErr<RTREE_CHECK_MAX_ERROR ){
+ char *z = sqlite3_vmprintf(zFmt, ap);
+ if( z==0 ){
+ pCheck->rc = SQLITE_NOMEM;
+ }else{
+ pCheck->zReport = sqlite3_mprintf("%z%s%z",
+ pCheck->zReport, (pCheck->zReport ? "\n" : ""), z
+ );
+ if( pCheck->zReport==0 ){
+ pCheck->rc = SQLITE_NOMEM;
+ }
+ }
+ pCheck->nErr++;
+ }
+ va_end(ap);
+}
+
+/*
+** This function is a no-op if there is already an error code stored
+** in the RtreeCheck object indicated by the first argument. NULL is
+** returned in this case.
+**
+** Otherwise, the contents of rtree table node iNode are loaded from
+** the database and copied into a buffer obtained from sqlite3_malloc().
+** If no error occurs, a pointer to the buffer is returned and (*pnNode)
+** is set to the size of the buffer in bytes.
+**
+** Or, if an error does occur, NULL is returned and an error code left
+** in the RtreeCheck object. The final value of *pnNode is undefined in
+** this case.
+*/
+static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){
+ u8 *pRet = 0; /* Return value */
+
+ assert( pCheck->rc==SQLITE_OK );
+ if( pCheck->pGetNode==0 ){
+ pCheck->pGetNode = rtreeCheckPrepare(pCheck,
+ "SELECT data FROM %Q.'%q_node' WHERE nodeno=?",
+ pCheck->zDb, pCheck->zTab
+ );
+ }
+
+ if( pCheck->rc==SQLITE_OK ){
+ sqlite3_bind_int64(pCheck->pGetNode, 1, iNode);
+ 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);
+ if( pRet==0 ){
+ pCheck->rc = SQLITE_NOMEM;
+ }else{
+ memcpy(pRet, pNode, nNode);
+ *pnNode = nNode;
+ }
+ }
+ rtreeCheckReset(pCheck, pCheck->pGetNode);
+ if( pCheck->rc==SQLITE_OK && pRet==0 ){
+ rtreeCheckAppendMsg(pCheck, "Node %lld missing from database", iNode);
+ }
+ }
+
+ return pRet;
+}
+
+/*
+** This function is used to check that the %_parent (if bLeaf==0) or %_rowid
+** (if bLeaf==1) table contains a specified entry. The schemas of the
+** two tables are:
+**
+** CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)
+** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER, ...)
+**
+** In both cases, this function checks that there exists an entry with
+** IPK value iKey and the second column set to iVal.
+**
+*/
+static void rtreeCheckMapping(
+ RtreeCheck *pCheck, /* RtreeCheck object */
+ int bLeaf, /* True for a leaf cell, false for interior */
+ i64 iKey, /* Key for mapping */
+ i64 iVal /* Expected value for mapping */
+){
+ int rc;
+ sqlite3_stmt *pStmt;
+ const char *azSql[2] = {
+ "SELECT parentnode FROM %Q.'%q_parent' WHERE nodeno=?1",
+ "SELECT nodeno FROM %Q.'%q_rowid' WHERE rowid=?1"
+ };
+
+ assert( bLeaf==0 || bLeaf==1 );
+ if( pCheck->aCheckMapping[bLeaf]==0 ){
+ pCheck->aCheckMapping[bLeaf] = rtreeCheckPrepare(pCheck,
+ azSql[bLeaf], pCheck->zDb, pCheck->zTab
+ );
+ }
+ if( pCheck->rc!=SQLITE_OK ) return;
+
+ pStmt = pCheck->aCheckMapping[bLeaf];
+ sqlite3_bind_int64(pStmt, 1, iKey);
+ rc = sqlite3_step(pStmt);
+ if( rc==SQLITE_DONE ){
+ rtreeCheckAppendMsg(pCheck, "Mapping (%lld -> %lld) missing from %s table",
+ iKey, iVal, (bLeaf ? "%_rowid" : "%_parent")
+ );
+ }else if( rc==SQLITE_ROW ){
+ i64 ii = sqlite3_column_int64(pStmt, 0);
+ if( ii!=iVal ){
+ rtreeCheckAppendMsg(pCheck,
+ "Found (%lld -> %lld) in %s table, expected (%lld -> %lld)",
+ iKey, ii, (bLeaf ? "%_rowid" : "%_parent"), iKey, iVal
+ );
+ }
+ }
+ rtreeCheckReset(pCheck, pStmt);
+}
+
+/*
+** Argument pCell points to an array of coordinates stored on an rtree page.
+** This function checks that the coordinates are internally consistent (no
+** x1>x2 conditions) and adds an error message to the RtreeCheck object
+** if they are not.
+**
+** Additionally, if pParent is not NULL, then it is assumed to point to
+** the array of coordinates on the parent page that bound the page
+** containing pCell. In this case it is also verified that the two
+** sets of coordinates are mutually consistent and an error message added
+** to the RtreeCheck object if they are not.
+*/
+static void rtreeCheckCellCoord(
+ RtreeCheck *pCheck,
+ i64 iNode, /* Node id to use in error messages */
+ int iCell, /* Cell number to use in error messages */
+ u8 *pCell, /* Pointer to cell coordinates */
+ u8 *pParent /* Pointer to parent coordinates */
+){
+ RtreeCoord c1, c2;
+ RtreeCoord p1, p2;
+ int i;
+
+ for(i=0; i<pCheck->nDim; i++){
+ readCoord(&pCell[4*2*i], &c1);
+ readCoord(&pCell[4*(2*i + 1)], &c2);
+
+ /* printf("%e, %e\n", c1.u.f, c2.u.f); */
+ if( pCheck->bInt ? c1.i>c2.i : c1.f>c2.f ){
+ rtreeCheckAppendMsg(pCheck,
+ "Dimension %d of cell %d on node %lld is corrupt", i, iCell, iNode
+ );
+ }
+
+ if( pParent ){
+ readCoord(&pParent[4*2*i], &p1);
+ readCoord(&pParent[4*(2*i + 1)], &p2);
+
+ if( (pCheck->bInt ? c1.i<p1.i : c1.f<p1.f)
+ || (pCheck->bInt ? c2.i>p2.i : c2.f>p2.f)
+ ){
+ rtreeCheckAppendMsg(pCheck,
+ "Dimension %d of cell %d on node %lld is corrupt relative to parent"
+ , i, iCell, iNode
+ );
+ }
+ }
+ }
+}
+
+/*
+** Run rtreecheck() checks on node iNode, which is at depth iDepth within
+** the r-tree structure. Argument aParent points to the array of coordinates
+** that bound node iNode on the parent node.
+**
+** If any problems are discovered, an error message is appended to the
+** report accumulated in the RtreeCheck object.
+*/
+static void rtreeCheckNode(
+ RtreeCheck *pCheck,
+ int iDepth, /* Depth of iNode (0==leaf) */
+ u8 *aParent, /* Buffer containing parent coords */
+ i64 iNode /* Node to check */
+){
+ u8 *aNode = 0;
+ int nNode = 0;
+
+ assert( iNode==1 || aParent!=0 );
+ assert( pCheck->nDim>0 );
+
+ aNode = rtreeCheckGetNode(pCheck, iNode, &nNode);
+ if( aNode ){
+ if( nNode<4 ){
+ rtreeCheckAppendMsg(pCheck,
+ "Node %lld is too small (%d bytes)", iNode, nNode
+ );
+ }else{
+ int nCell; /* Number of cells on page */
+ int i; /* Used to iterate through cells */
+ if( aParent==0 ){
+ iDepth = readInt16(aNode);
+ if( iDepth>RTREE_MAX_DEPTH ){
+ rtreeCheckAppendMsg(pCheck, "Rtree depth out of range (%d)", iDepth);
+ sqlite3_free(aNode);
+ return;
+ }
+ }
+ nCell = readInt16(&aNode[2]);
+ if( (4 + nCell*(8 + pCheck->nDim*2*4))>nNode ){
+ rtreeCheckAppendMsg(pCheck,
+ "Node %lld is too small for cell count of %d (%d bytes)",
+ iNode, nCell, nNode
+ );
+ }else{
+ for(i=0; i<nCell; i++){
+ u8 *pCell = &aNode[4 + i*(8 + pCheck->nDim*2*4)];
+ i64 iVal = readInt64(pCell);
+ rtreeCheckCellCoord(pCheck, iNode, i, &pCell[8], aParent);
+
+ if( iDepth>0 ){
+ rtreeCheckMapping(pCheck, 0, iVal, iNode);
+ rtreeCheckNode(pCheck, iDepth-1, &pCell[8], iVal);
+ pCheck->nNonLeaf++;
+ }else{
+ rtreeCheckMapping(pCheck, 1, iVal, iNode);
+ pCheck->nLeaf++;
+ }
+ }
+ }
+ }
+ sqlite3_free(aNode);
+ }
+}
+
+/*
+** The second argument to this function must be either "_rowid" or
+** "_parent". This function checks that the number of entries in the
+** %_rowid or %_parent table is exactly nExpect. If not, it adds
+** an error message to the report in the RtreeCheck object indicated
+** by the first argument.
+*/
+static void rtreeCheckCount(RtreeCheck *pCheck, const char *zTbl, i64 nExpect){
+ if( pCheck->rc==SQLITE_OK ){
+ sqlite3_stmt *pCount;
+ pCount = rtreeCheckPrepare(pCheck, "SELECT count(*) FROM %Q.'%q%s'",
+ pCheck->zDb, pCheck->zTab, zTbl
+ );
+ if( pCount ){
+ if( sqlite3_step(pCount)==SQLITE_ROW ){
+ i64 nActual = sqlite3_column_int64(pCount, 0);
+ if( nActual!=nExpect ){
+ rtreeCheckAppendMsg(pCheck, "Wrong number of entries in %%%s table"
+ " - expected %lld, actual %lld" , zTbl, nExpect, nActual
+ );
+ }
+ }
+ pCheck->rc = sqlite3_finalize(pCount);
+ }
+ }
+}
+
+/*
+** This function does the bulk of the work for the rtree integrity-check.
+** It is called by rtreecheck(), which is the SQL function implementation.
+*/
+static int rtreeCheckTable(
+ sqlite3 *db, /* Database handle to access db through */
+ const char *zDb, /* Name of db ("main", "temp" etc.) */
+ const char *zTab, /* Name of rtree table to check */
+ char **pzReport /* OUT: sqlite3_malloc'd report text */
+){
+ RtreeCheck check; /* Common context for various routines */
+ sqlite3_stmt *pStmt = 0; /* Used to find column count of rtree table */
+ int bEnd = 0; /* True if transaction should be closed */
+ int nAux = 0; /* Number of extra columns. */
+
+ /* Initialize the context object */
+ memset(&check, 0, sizeof(check));
+ check.db = db;
+ check.zDb = zDb;
+ check.zTab = zTab;
+
+ /* If there is not already an open transaction, open one now. This is
+ ** to ensure that the queries run as part of this integrity-check operate
+ ** on a consistent snapshot. */
+ if( sqlite3_get_autocommit(db) ){
+ check.rc = sqlite3_exec(db, "BEGIN", 0, 0, 0);
+ bEnd = 1;
+ }
+
+ /* Find the number of auxiliary columns */
+ if( check.rc==SQLITE_OK ){
+ pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.'%q_rowid'", zDb, zTab);
+ if( pStmt ){
+ nAux = sqlite3_column_count(pStmt) - 2;
+ sqlite3_finalize(pStmt);
+ }
+ check.rc = SQLITE_OK;
+ }
+
+ /* Find number of dimensions in the rtree table. */
+ pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.%Q", zDb, zTab);
+ if( pStmt ){
+ int rc;
+ check.nDim = (sqlite3_column_count(pStmt) - 1 - nAux) / 2;
+ if( check.nDim<1 ){
+ rtreeCheckAppendMsg(&check, "Schema corrupt or not an rtree");
+ }else if( SQLITE_ROW==sqlite3_step(pStmt) ){
+ check.bInt = (sqlite3_column_type(pStmt, 1)==SQLITE_INTEGER);
+ }
+ rc = sqlite3_finalize(pStmt);
+ if( rc!=SQLITE_CORRUPT ) check.rc = rc;
+ }
+
+ /* Do the actual integrity-check */
+ if( check.nDim>=1 ){
+ if( check.rc==SQLITE_OK ){
+ rtreeCheckNode(&check, 0, 0, 1);
+ }
+ rtreeCheckCount(&check, "_rowid", check.nLeaf);
+ rtreeCheckCount(&check, "_parent", check.nNonLeaf);
+ }
+
+ /* Finalize SQL statements used by the integrity-check */
+ sqlite3_finalize(check.pGetNode);
+ sqlite3_finalize(check.aCheckMapping[0]);
+ sqlite3_finalize(check.aCheckMapping[1]);
+
+ /* If one was opened, close the transaction */
+ if( bEnd ){
+ int rc = sqlite3_exec(db, "END", 0, 0, 0);
+ if( check.rc==SQLITE_OK ) check.rc = rc;
+ }
+ *pzReport = check.zReport;
+ return check.rc;
+}
+
+/*
+** Usage:
+**
+** rtreecheck(<rtree-table>);
+** rtreecheck(<database>, <rtree-table>);
+**
+** Invoking this SQL function runs an integrity-check on the named rtree
+** table. The integrity-check verifies the following:
+**
+** 1. For each cell in the r-tree structure (%_node table), that:
+**
+** a) for each dimension, (coord1 <= coord2).
+**
+** b) unless the cell is on the root node, that the cell is bounded
+** by the parent cell on the parent node.
+**
+** c) for leaf nodes, that there is an entry in the %_rowid
+** table corresponding to the cell's rowid value that
+** points to the correct node.
+**
+** d) for cells on non-leaf nodes, that there is an entry in the
+** %_parent table mapping from the cell's child node to the
+** node that it resides on.
+**
+** 2. That there are the same number of entries in the %_rowid table
+** as there are leaf cells in the r-tree structure, and that there
+** is a leaf cell that corresponds to each entry in the %_rowid table.
+**
+** 3. That there are the same number of entries in the %_parent table
+** as there are non-leaf cells in the r-tree structure, and that
+** there is a non-leaf cell that corresponds to each entry in the
+** %_parent table.
+*/
+static void rtreecheck(
+ sqlite3_context *ctx,
+ int nArg,
+ sqlite3_value **apArg
+){
+ if( nArg!=1 && nArg!=2 ){
+ sqlite3_result_error(ctx,
+ "wrong number of arguments to function rtreecheck()", -1
+ );
+ }else{
+ int rc;
+ char *zReport = 0;
+ const char *zDb = (const char*)sqlite3_value_text(apArg[0]);
+ const char *zTab;
+ if( nArg==1 ){
+ zTab = zDb;
+ zDb = "main";
+ }else{
+ zTab = (const char*)sqlite3_value_text(apArg[1]);
+ }
+ rc = rtreeCheckTable(sqlite3_context_db_handle(ctx), zDb, zTab, &zReport);
+ if( rc==SQLITE_OK ){
+ sqlite3_result_text(ctx, zReport ? zReport : "ok", -1, SQLITE_TRANSIENT);
+ }else{
+ sqlite3_result_error_code(ctx, rc);
+ }
+ sqlite3_free(zReport);
+ }
+}
+
+/* Conditionally include the geopoly code */
+#ifdef SQLITE_ENABLE_GEOPOLY
+/************** Include geopoly.c in the middle of rtree.c *******************/
+/************** Begin file geopoly.c *****************************************/
+/*
+** 2018-05-25
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file implements an alternative R-Tree virtual table that
+** uses polygons to express the boundaries of 2-dimensional objects.
+**
+** This file is #include-ed onto the end of "rtree.c" so that it has
+** access to all of the R-Tree internals.
+*/
+/* #include <stdlib.h> */
+
+/* Enable -DGEOPOLY_ENABLE_DEBUG for debugging facilities */
+#ifdef GEOPOLY_ENABLE_DEBUG
+ static int geo_debug = 0;
+# define GEODEBUG(X) if(geo_debug)printf X
+#else
+# define GEODEBUG(X)
+#endif
+
+#ifndef JSON_NULL /* The following stuff repeats things found in json1 */
+/*
+** Versions of isspace(), isalnum() and isdigit() to which it is safe
+** to pass signed char values.
+*/
+#ifdef sqlite3Isdigit
+ /* Use the SQLite core versions if this routine is part of the
+ ** SQLite amalgamation */
+# define safe_isdigit(x) sqlite3Isdigit(x)
+# define safe_isalnum(x) sqlite3Isalnum(x)
+# define safe_isxdigit(x) sqlite3Isxdigit(x)
+#else
+ /* Use the standard library for separate compilation */
+#include <ctype.h> /* amalgamator: keep */
+# define safe_isdigit(x) isdigit((unsigned char)(x))
+# define safe_isalnum(x) isalnum((unsigned char)(x))
+# define safe_isxdigit(x) isxdigit((unsigned char)(x))
+#endif
+
+/*
+** Growing our own isspace() routine this way is twice as fast as
+** the library isspace() function.
+*/
+static const char geopolyIsSpace[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+#define safe_isspace(x) (geopolyIsSpace[(unsigned char)x])
+#endif /* JSON NULL - back to original code */
+
+/* Compiler and version */
+#ifndef GCC_VERSION
+#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC)
+# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__)
+#else
+# define GCC_VERSION 0
+#endif
+#endif
+#ifndef MSVC_VERSION
+#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC)
+# define MSVC_VERSION _MSC_VER
+#else
+# define MSVC_VERSION 0
+#endif
+#endif
+
+/* Datatype for coordinates
+*/
+typedef float GeoCoord;
+
+/*
+** Internal representation of a polygon.
+**
+** The polygon consists of a sequence of vertexes. There is a line
+** segment between each pair of vertexes, and one final segment from
+** the last vertex back to the first. (This differs from the GeoJSON
+** standard in which the final vertex is a repeat of the first.)
+**
+** The polygon follows the right-hand rule. The area to the right of
+** each segment is "outside" and the area to the left is "inside".
+**
+** The on-disk representation consists of a 4-byte header followed by
+** the values. The 4-byte header is:
+**
+** encoding (1 byte) 0=big-endian, 1=little-endian
+** nvertex (3 bytes) Number of vertexes as a big-endian integer
+**
+** Enough space is allocated for 4 coordinates, to work around over-zealous
+** warnings coming from some compiler (notably, clang). In reality, the size
+** of each GeoPoly memory allocate is adjusted as necessary so that the
+** GeoPoly.a[] array at the end is the appropriate size.
+*/
+typedef struct GeoPoly GeoPoly;
+struct GeoPoly {
+ int nVertex; /* Number of vertexes */
+ unsigned char hdr[4]; /* Header for on-disk representation */
+ GeoCoord a[8]; /* 2*nVertex values. X (longitude) first, then Y */
+};
+
+/* The size of a memory allocation needed for a GeoPoly object sufficient
+** to hold N coordinate pairs.
+*/
+#define GEOPOLY_SZ(N) (sizeof(GeoPoly) + sizeof(GeoCoord)*2*((N)-4))
+
+/*
+** State of a parse of a GeoJSON input.
+*/
+typedef struct GeoParse GeoParse;
+struct GeoParse {
+ const unsigned char *z; /* Unparsed input */
+ int nVertex; /* Number of vertexes in a[] */
+ int nAlloc; /* Space allocated to a[] */
+ int nErr; /* Number of errors encountered */
+ GeoCoord *a; /* Array of vertexes. From sqlite3_malloc64() */
+};
+
+/* Do a 4-byte byte swap */
+static void geopolySwab32(unsigned char *a){
+ unsigned char t = a[0];
+ a[0] = a[3];
+ a[3] = t;
+ t = a[1];
+ a[1] = a[2];
+ a[2] = t;
+}
+
+/* Skip whitespace. Return the next non-whitespace character. */
+static char geopolySkipSpace(GeoParse *p){
+ while( safe_isspace(p->z[0]) ) p->z++;
+ return p->z[0];
+}
+
+/* Parse out a number. Write the value into *pVal if pVal!=0.
+** return non-zero on success and zero if the next token is not a number.
+*/
+static int geopolyParseNumber(GeoParse *p, GeoCoord *pVal){
+ char c = geopolySkipSpace(p);
+ const unsigned char *z = p->z;
+ int j = 0;
+ int seenDP = 0;
+ int seenE = 0;
+ if( c=='-' ){
+ j = 1;
+ c = z[j];
+ }
+ if( c=='0' && z[j+1]>='0' && z[j+1]<='9' ) return 0;
+ for(;; j++){
+ c = z[j];
+ if( safe_isdigit(c) ) continue;
+ if( c=='.' ){
+ if( z[j-1]=='-' ) return 0;
+ if( seenDP ) return 0;
+ seenDP = 1;
+ continue;
+ }
+ if( c=='e' || c=='E' ){
+ if( z[j-1]<'0' ) return 0;
+ if( seenE ) return -1;
+ seenDP = seenE = 1;
+ c = z[j+1];
+ if( c=='+' || c=='-' ){
+ j++;
+ c = z[j+1];
+ }
+ if( c<'0' || c>'9' ) return 0;
+ continue;
+ }
+ break;
+ }
+ if( z[j-1]<'0' ) return 0;
+ if( pVal ){
+#ifdef SQLITE_AMALGAMATION
+ /* The sqlite3AtoF() routine is much much faster than atof(), if it
+ ** is available */
+ double r;
+ (void)sqlite3AtoF((const char*)p->z, &r, j, SQLITE_UTF8);
+ *pVal = r;
+#else
+ *pVal = (GeoCoord)atof((const char*)p->z);
+#endif
+ }
+ p->z += j;
+ return 1;
+}
+
+/*
+** If the input is a well-formed JSON array of coordinates with at least
+** four coordinates and where each coordinate is itself a two-value array,
+** then convert the JSON into a GeoPoly object and return a pointer to
+** that object.
+**
+** If any error occurs, return NULL.
+*/
+static GeoPoly *geopolyParseJson(const unsigned char *z, int *pRc){
+ GeoParse s;
+ int rc = SQLITE_OK;
+ memset(&s, 0, sizeof(s));
+ s.z = z;
+ if( geopolySkipSpace(&s)=='[' ){
+ s.z++;
+ while( geopolySkipSpace(&s)=='[' ){
+ int ii = 0;
+ char c;
+ s.z++;
+ if( s.nVertex>=s.nAlloc ){
+ GeoCoord *aNew;
+ s.nAlloc = s.nAlloc*2 + 16;
+ aNew = sqlite3_realloc64(s.a, s.nAlloc*sizeof(GeoCoord)*2 );
+ if( aNew==0 ){
+ rc = SQLITE_NOMEM;
+ s.nErr++;
+ break;
+ }
+ s.a = aNew;
+ }
+ while( geopolyParseNumber(&s, ii<=1 ? &s.a[s.nVertex*2+ii] : 0) ){
+ ii++;
+ if( ii==2 ) s.nVertex++;
+ c = geopolySkipSpace(&s);
+ s.z++;
+ if( c==',' ) continue;
+ if( c==']' && ii>=2 ) break;
+ s.nErr++;
+ rc = SQLITE_ERROR;
+ goto parse_json_err;
+ }
+ if( geopolySkipSpace(&s)==',' ){
+ s.z++;
+ continue;
+ }
+ break;
+ }
+ if( geopolySkipSpace(&s)==']'
+ && s.nVertex>=4
+ && s.a[0]==s.a[s.nVertex*2-2]
+ && s.a[1]==s.a[s.nVertex*2-1]
+ && (s.z++, geopolySkipSpace(&s)==0)
+ ){
+ GeoPoly *pOut;
+ int x = 1;
+ s.nVertex--; /* Remove the redundant vertex at the end */
+ pOut = sqlite3_malloc64( GEOPOLY_SZ(s.nVertex) );
+ x = 1;
+ if( pOut==0 ) goto parse_json_err;
+ pOut->nVertex = s.nVertex;
+ memcpy(pOut->a, s.a, s.nVertex*2*sizeof(GeoCoord));
+ pOut->hdr[0] = *(unsigned char*)&x;
+ pOut->hdr[1] = (s.nVertex>>16)&0xff;
+ pOut->hdr[2] = (s.nVertex>>8)&0xff;
+ pOut->hdr[3] = s.nVertex&0xff;
+ sqlite3_free(s.a);
+ if( pRc ) *pRc = SQLITE_OK;
+ return pOut;
+ }else{
+ s.nErr++;
+ rc = SQLITE_ERROR;
+ }
+ }
+parse_json_err:
+ if( pRc ) *pRc = rc;
+ sqlite3_free(s.a);
+ return 0;
+}
+
+/*
+** Given a function parameter, try to interpret it as a polygon, either
+** in the binary format or JSON text. Compute a GeoPoly object and
+** return a pointer to that object. Or if the input is not a well-formed
+** polygon, put an error message in sqlite3_context and return NULL.
+*/
+static GeoPoly *geopolyFuncParam(
+ sqlite3_context *pCtx, /* Context for error messages */
+ sqlite3_value *pVal, /* The value to decode */
+ int *pRc /* Write error here */
+){
+ GeoPoly *p = 0;
+ int nByte;
+ if( sqlite3_value_type(pVal)==SQLITE_BLOB
+ && (nByte = sqlite3_value_bytes(pVal))>=(4+6*sizeof(GeoCoord))
+ ){
+ const unsigned char *a = sqlite3_value_blob(pVal);
+ int nVertex;
+ nVertex = (a[1]<<16) + (a[2]<<8) + a[3];
+ if( (a[0]==0 || a[0]==1)
+ && (nVertex*2*sizeof(GeoCoord) + 4)==(unsigned int)nByte
+ ){
+ p = sqlite3_malloc64( sizeof(*p) + (nVertex-1)*2*sizeof(GeoCoord) );
+ if( p==0 ){
+ if( pRc ) *pRc = SQLITE_NOMEM;
+ if( pCtx ) sqlite3_result_error_nomem(pCtx);
+ }else{
+ int x = 1;
+ p->nVertex = nVertex;
+ memcpy(p->hdr, a, nByte);
+ if( a[0] != *(unsigned char*)&x ){
+ int ii;
+ for(ii=0; ii<nVertex*2; ii++){
+ geopolySwab32((unsigned char*)&p->a[ii]);
+ }
+ p->hdr[0] ^= 1;
+ }
+ }
+ }
+ if( pRc ) *pRc = SQLITE_OK;
+ return p;
+ }else if( sqlite3_value_type(pVal)==SQLITE_TEXT ){
+ const unsigned char *zJson = sqlite3_value_text(pVal);
+ if( zJson==0 ){
+ if( pRc ) *pRc = SQLITE_NOMEM;
+ return 0;
+ }
+ return geopolyParseJson(zJson, pRc);
+ }else{
+ if( pRc ) *pRc = SQLITE_ERROR;
+ return 0;
+ }
+}
+
+/*
+** Implementation of the geopoly_blob(X) function.
+**
+** If the input is a well-formed Geopoly BLOB or JSON string
+** then return the BLOB representation of the polygon. Otherwise
+** return NULL.
+*/
+static void geopolyBlobFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ GeoPoly *p = geopolyFuncParam(context, argv[0], 0);
+ if( p ){
+ sqlite3_result_blob(context, p->hdr,
+ 4+8*p->nVertex, SQLITE_TRANSIENT);
+ sqlite3_free(p);
+ }
+}
+
+/*
+** SQL function: geopoly_json(X)
+**
+** Interpret X as a polygon and render it as a JSON array
+** of coordinates. Or, if X is not a valid polygon, return NULL.
+*/
+static void geopolyJsonFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ GeoPoly *p = geopolyFuncParam(context, argv[0], 0);
+ if( p ){
+ sqlite3 *db = sqlite3_context_db_handle(context);
+ sqlite3_str *x = sqlite3_str_new(db);
+ int i;
+ sqlite3_str_append(x, "[", 1);
+ for(i=0; i<p->nVertex; i++){
+ sqlite3_str_appendf(x, "[%!g,%!g],", p->a[i*2], p->a[i*2+1]);
+ }
+ sqlite3_str_appendf(x, "[%!g,%!g]]", p->a[0], p->a[1]);
+ sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free);
+ sqlite3_free(p);
+ }
+}
+
+/*
+** SQL function: geopoly_svg(X, ....)
+**
+** Interpret X as a polygon and render it as a SVG <polyline>.
+** Additional arguments are added as attributes to the <polyline>.
+*/
+static void geopolySvgFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ GeoPoly *p = geopolyFuncParam(context, argv[0], 0);
+ if( p ){
+ sqlite3 *db = sqlite3_context_db_handle(context);
+ sqlite3_str *x = sqlite3_str_new(db);
+ int i;
+ char cSep = '\'';
+ sqlite3_str_appendf(x, "<polyline points=");
+ for(i=0; i<p->nVertex; i++){
+ sqlite3_str_appendf(x, "%c%g,%g", cSep, p->a[i*2], p->a[i*2+1]);
+ cSep = ' ';
+ }
+ sqlite3_str_appendf(x, " %g,%g'", p->a[0], p->a[1]);
+ for(i=1; i<argc; i++){
+ const char *z = (const char*)sqlite3_value_text(argv[i]);
+ if( z && z[0] ){
+ sqlite3_str_appendf(x, " %s", z);
+ }
+ }
+ sqlite3_str_appendf(x, "></polyline>");
+ sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free);
+ sqlite3_free(p);
+ }
+}
+
+/*
+** SQL Function: geopoly_xform(poly, A, B, C, D, E, F)
+**
+** Transform and/or translate a polygon as follows:
+**
+** x1 = A*x0 + B*y0 + E
+** y1 = C*x0 + D*y0 + F
+**
+** For a translation:
+**
+** geopoly_xform(poly, 1, 0, 0, 1, x-offset, y-offset)
+**
+** Rotate by R around the point (0,0):
+**
+** geopoly_xform(poly, cos(R), sin(R), -sin(R), cos(R), 0, 0)
+*/
+static void geopolyXformFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ GeoPoly *p = geopolyFuncParam(context, argv[0], 0);
+ double A = sqlite3_value_double(argv[1]);
+ double B = sqlite3_value_double(argv[2]);
+ double C = sqlite3_value_double(argv[3]);
+ double D = sqlite3_value_double(argv[4]);
+ double E = sqlite3_value_double(argv[5]);
+ double F = sqlite3_value_double(argv[6]);
+ GeoCoord x1, y1, x0, y0;
+ int ii;
+ if( p ){
+ for(ii=0; ii<p->nVertex; ii++){
+ x0 = p->a[ii*2];
+ y0 = p->a[ii*2+1];
+ 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;
+ }
+ sqlite3_result_blob(context, p->hdr,
+ 4+8*p->nVertex, SQLITE_TRANSIENT);
+ sqlite3_free(p);
+ }
+}
+
+/*
+** Compute the area enclosed by the polygon.
+**
+** This routine can also be used to detect polygons that rotate in
+** the wrong direction. Polygons are suppose to be counter-clockwise (CCW).
+** This routine returns a negative value for clockwise (CW) polygons.
+*/
+static double geopolyArea(GeoPoly *p){
+ double rArea = 0.0;
+ int ii;
+ for(ii=0; ii<p->nVertex-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) */
+ * 0.5;
+ }
+ rArea += (p->a[ii*2] - p->a[0]) /* (xN - x0) */
+ * (p->a[ii*2+1] + p->a[1]) /* (yN + y0) */
+ * 0.5;
+ return rArea;
+}
+
+/*
+** Implementation of the geopoly_area(X) function.
+**
+** If the input is a well-formed Geopoly BLOB then return the area
+** enclosed by the polygon. If the polygon circulates clockwise instead
+** of counterclockwise (as it should) then return the negative of the
+** enclosed area. Otherwise return NULL.
+*/
+static void geopolyAreaFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ GeoPoly *p = geopolyFuncParam(context, argv[0], 0);
+ if( p ){
+ sqlite3_result_double(context, geopolyArea(p));
+ sqlite3_free(p);
+ }
+}
+
+/*
+** Implementation of the geopoly_ccw(X) function.
+**
+** If the rotation of polygon X is clockwise (incorrect) instead of
+** counter-clockwise (the correct winding order according to RFC7946)
+** then reverse the order of the vertexes in polygon X.
+**
+** In other words, this routine returns a CCW polygon regardless of the
+** winding order of its input.
+**
+** Use this routine to sanitize historical inputs that that sometimes
+** contain polygons that wind in the wrong direction.
+*/
+static void geopolyCcwFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ GeoPoly *p = geopolyFuncParam(context, argv[0], 0);
+ if( p ){
+ if( geopolyArea(p)<0.0 ){
+ int ii, jj;
+ for(ii=2, jj=p->nVertex*2 - 2; ii<jj; ii+=2, jj-=2){
+ GeoCoord t = p->a[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;
+ }
+ }
+ sqlite3_result_blob(context, p->hdr,
+ 4+8*p->nVertex, SQLITE_TRANSIENT);
+ sqlite3_free(p);
+ }
+}
+
+#define GEOPOLY_PI 3.1415926535897932385
+
+/* Fast approximation for sine(X) for X between -0.5*pi and 2*pi
+*/
+static double geopolySine(double r){
+ assert( r>=-0.5*GEOPOLY_PI && r<=2.0*GEOPOLY_PI );
+ if( r>=1.5*GEOPOLY_PI ){
+ r -= 2.0*GEOPOLY_PI;
+ }
+ if( r>=0.5*GEOPOLY_PI ){
+ return -geopolySine(r-GEOPOLY_PI);
+ }else{
+ double r2 = r*r;
+ double r3 = r2*r;
+ double r5 = r3*r2;
+ return 0.9996949*r - 0.1656700*r3 + 0.0075134*r5;
+ }
+}
+
+/*
+** Function: geopoly_regular(X,Y,R,N)
+**
+** Construct a simple, convex, regular polygon centered at X, Y
+** with circumradius R and with N sides.
+*/
+static void geopolyRegularFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ double x = sqlite3_value_double(argv[0]);
+ double y = sqlite3_value_double(argv[1]);
+ double r = sqlite3_value_double(argv[2]);
+ int n = sqlite3_value_int(argv[3]);
+ int i;
+ GeoPoly *p;
+
+ if( n<3 || r<=0.0 ) return;
+ if( n>1000 ) n = 1000;
+ p = sqlite3_malloc64( sizeof(*p) + (n-1)*2*sizeof(GeoCoord) );
+ if( p==0 ){
+ sqlite3_result_error_nomem(context);
+ return;
+ }
+ i = 1;
+ p->hdr[0] = *(unsigned char*)&i;
+ p->hdr[1] = 0;
+ p->hdr[2] = (n>>8)&0xff;
+ p->hdr[3] = n&0xff;
+ for(i=0; i<n; i++){
+ double rAngle = 2.0*GEOPOLY_PI*i/n;
+ p->a[i*2] = x - r*geopolySine(rAngle-0.5*GEOPOLY_PI);
+ p->a[i*2+1] = y + r*geopolySine(rAngle);
+ }
+ sqlite3_result_blob(context, p->hdr, 4+8*n, SQLITE_TRANSIENT);
+ sqlite3_free(p);
+}
+
+/*
+** If pPoly is a polygon, compute its bounding box. Then:
+**
+** (1) if aCoord!=0 store the bounding box in aCoord, returning NULL
+** (2) otherwise, compute a GeoPoly for the bounding box and return the
+** new GeoPoly
+**
+** If pPoly is NULL but aCoord is not NULL, then compute a new GeoPoly from
+** the bounding box in aCoord and return a pointer to that GeoPoly.
+*/
+static GeoPoly *geopolyBBox(
+ sqlite3_context *context, /* For recording the error */
+ sqlite3_value *pPoly, /* The polygon */
+ RtreeCoord *aCoord, /* Results here */
+ int *pRc /* Error code here */
+){
+ GeoPoly *pOut = 0;
+ GeoPoly *p;
+ float mnX, mxX, mnY, mxY;
+ if( pPoly==0 && aCoord!=0 ){
+ p = 0;
+ mnX = aCoord[0].f;
+ mxX = aCoord[1].f;
+ mnY = aCoord[2].f;
+ mxY = aCoord[3].f;
+ goto geopolyBboxFill;
+ }else{
+ p = geopolyFuncParam(context, pPoly, pRc);
+ }
+ if( p ){
+ int ii;
+ mnX = mxX = p->a[0];
+ mnY = mxY = p->a[1];
+ for(ii=1; ii<p->nVertex; ii++){
+ double r = p->a[ii*2];
+ if( r<mnX ) mnX = (float)r;
+ else if( r>mxX ) mxX = (float)r;
+ r = p->a[ii*2+1];
+ if( r<mnY ) mnY = (float)r;
+ else if( r>mxY ) mxY = (float)r;
+ }
+ if( pRc ) *pRc = SQLITE_OK;
+ if( aCoord==0 ){
+ geopolyBboxFill:
+ pOut = sqlite3_realloc(p, GEOPOLY_SZ(4));
+ if( pOut==0 ){
+ sqlite3_free(p);
+ if( context ) sqlite3_result_error_nomem(context);
+ if( pRc ) *pRc = SQLITE_NOMEM;
+ return 0;
+ }
+ pOut->nVertex = 4;
+ ii = 1;
+ pOut->hdr[0] = *(unsigned char*)&ii;
+ 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;
+ }else{
+ sqlite3_free(p);
+ aCoord[0].f = mnX;
+ aCoord[1].f = mxX;
+ aCoord[2].f = mnY;
+ aCoord[3].f = mxY;
+ }
+ }
+ return pOut;
+}
+
+/*
+** Implementation of the geopoly_bbox(X) SQL function.
+*/
+static void geopolyBBoxFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ GeoPoly *p = geopolyBBox(context, argv[0], 0, 0);
+ if( p ){
+ sqlite3_result_blob(context, p->hdr,
+ 4+8*p->nVertex, SQLITE_TRANSIENT);
+ sqlite3_free(p);
+ }
+}
+
+/*
+** State vector for the geopoly_group_bbox() aggregate function.
+*/
+typedef struct GeoBBox GeoBBox;
+struct GeoBBox {
+ int isInit;
+ RtreeCoord a[4];
+};
+
+
+/*
+** Implementation of the geopoly_group_bbox(X) aggregate SQL function.
+*/
+static void geopolyBBoxStep(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ RtreeCoord a[4];
+ int rc = SQLITE_OK;
+ (void)geopolyBBox(context, argv[0], a, &rc);
+ if( rc==SQLITE_OK ){
+ GeoBBox *pBBox;
+ pBBox = (GeoBBox*)sqlite3_aggregate_context(context, sizeof(*pBBox));
+ if( pBBox==0 ) return;
+ if( pBBox->isInit==0 ){
+ pBBox->isInit = 1;
+ memcpy(pBBox->a, a, sizeof(RtreeCoord)*4);
+ }else{
+ if( a[0].f < pBBox->a[0].f ) pBBox->a[0] = a[0];
+ if( a[1].f > pBBox->a[1].f ) pBBox->a[1] = a[1];
+ if( a[2].f < pBBox->a[2].f ) pBBox->a[2] = a[2];
+ if( a[3].f > pBBox->a[3].f ) pBBox->a[3] = a[3];
+ }
+ }
+}
+static void geopolyBBoxFinal(
+ sqlite3_context *context
+){
+ GeoPoly *p;
+ GeoBBox *pBBox;
+ pBBox = (GeoBBox*)sqlite3_aggregate_context(context, 0);
+ if( pBBox==0 ) return;
+ p = geopolyBBox(context, 0, pBBox->a, 0);
+ if( p ){
+ sqlite3_result_blob(context, p->hdr,
+ 4+8*p->nVertex, SQLITE_TRANSIENT);
+ sqlite3_free(p);
+ }
+}
+
+
+/*
+** Determine if point (x0,y0) is beneath line segment (x1,y1)->(x2,y2).
+** Returns:
+**
+** +2 x0,y0 is on the line segement
+**
+** +1 x0,y0 is beneath line segment
+**
+** 0 x0,y0 is not on or beneath the line segment or the line segment
+** is vertical and x0,y0 is not on the line segment
+**
+** The left-most coordinate min(x1,x2) is not considered to be part of
+** the line segment for the purposes of this analysis.
+*/
+static int pointBeneathLine(
+ double x0, double y0,
+ double x1, double y1,
+ double x2, double y2
+){
+ double y;
+ if( x0==x1 && y0==y1 ) return 2;
+ if( x1<x2 ){
+ if( x0<=x1 || x0>x2 ) return 0;
+ }else if( x1>x2 ){
+ if( x0<=x2 || x0>x1 ) return 0;
+ }else{
+ /* Vertical line segment */
+ if( x0!=x1 ) return 0;
+ if( y0<y1 && y0<y2 ) return 0;
+ if( y0>y1 && y0>y2 ) return 0;
+ return 2;
+ }
+ y = y1 + (y2-y1)*(x0-x1)/(x2-x1);
+ if( y0==y ) return 2;
+ if( y0<y ) return 1;
+ return 0;
+}
+
+/*
+** SQL function: geopoly_contains_point(P,X,Y)
+**
+** Return +2 if point X,Y is within polygon P.
+** Return +1 if point X,Y is on the polygon boundary.
+** Return 0 if point X,Y is outside the polygon
+*/
+static void geopolyContainsPointFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ GeoPoly *p1 = geopolyFuncParam(context, argv[0], 0);
+ double x0 = sqlite3_value_double(argv[1]);
+ double y0 = sqlite3_value_double(argv[2]);
+ int v = 0;
+ int cnt = 0;
+ int ii;
+ if( p1==0 ) return;
+ for(ii=0; ii<p1->nVertex-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]);
+ 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]);
+ }
+ if( v==2 ){
+ sqlite3_result_int(context, 1);
+ }else if( ((v+cnt)&1)==0 ){
+ sqlite3_result_int(context, 0);
+ }else{
+ sqlite3_result_int(context, 2);
+ }
+ sqlite3_free(p1);
+}
+
+/* Forward declaration */
+static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2);
+
+/*
+** SQL function: geopoly_within(P1,P2)
+**
+** Return +2 if P1 and P2 are the same polygon
+** Return +1 if P2 is contained within P1
+** Return 0 if any part of P2 is on the outside of P1
+**
+*/
+static void geopolyWithinFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ GeoPoly *p1 = geopolyFuncParam(context, argv[0], 0);
+ GeoPoly *p2 = geopolyFuncParam(context, argv[1], 0);
+ if( p1 && p2 ){
+ int x = geopolyOverlap(p1, p2);
+ if( x<0 ){
+ sqlite3_result_error_nomem(context);
+ }else{
+ sqlite3_result_int(context, x==2 ? 1 : x==4 ? 2 : 0);
+ }
+ }
+ sqlite3_free(p1);
+ sqlite3_free(p2);
+}
+
+/* Objects used by the overlap algorihm. */
+typedef struct GeoEvent GeoEvent;
+typedef struct GeoSegment GeoSegment;
+typedef struct GeoOverlap GeoOverlap;
+struct GeoEvent {
+ double x; /* X coordinate at which event occurs */
+ int eType; /* 0 for ADD, 1 for REMOVE */
+ GeoSegment *pSeg; /* The segment to be added or removed */
+ GeoEvent *pNext; /* Next event in the sorted list */
+};
+struct GeoSegment {
+ double C, B; /* y = C*x + B */
+ double y; /* Current y value */
+ float y0; /* Initial y value */
+ unsigned char side; /* 1 for p1, 2 for p2 */
+ unsigned int idx; /* Which segment within the side */
+ GeoSegment *pNext; /* Next segment in a list sorted by y */
+};
+struct GeoOverlap {
+ GeoEvent *aEvent; /* Array of all events */
+ GeoSegment *aSegment; /* Array of all segments */
+ int nEvent; /* Number of events */
+ int nSegment; /* Number of segments */
+};
+
+/*
+** Add a single segment and its associated events.
+*/
+static void geopolyAddOneSegment(
+ GeoOverlap *p,
+ GeoCoord x0,
+ GeoCoord y0,
+ GeoCoord x1,
+ GeoCoord y1,
+ unsigned char side,
+ unsigned int idx
+){
+ GeoSegment *pSeg;
+ GeoEvent *pEvent;
+ if( x0==x1 ) return; /* Ignore vertical segments */
+ if( x0>x1 ){
+ GeoCoord t = x0;
+ x0 = x1;
+ x1 = t;
+ t = y0;
+ y0 = y1;
+ y1 = t;
+ }
+ pSeg = p->aSegment + p->nSegment;
+ p->nSegment++;
+ pSeg->C = (y1-y0)/(x1-x0);
+ pSeg->B = y1 - x1*pSeg->C;
+ pSeg->y0 = y0;
+ pSeg->side = side;
+ pSeg->idx = idx;
+ pEvent = p->aEvent + p->nEvent;
+ p->nEvent++;
+ pEvent->x = x0;
+ pEvent->eType = 0;
+ pEvent->pSeg = pSeg;
+ pEvent = p->aEvent + p->nEvent;
+ p->nEvent++;
+ pEvent->x = x1;
+ pEvent->eType = 1;
+ pEvent->pSeg = pSeg;
+}
+
+
+
+/*
+** Insert all segments and events for polygon pPoly.
+*/
+static void geopolyAddSegments(
+ GeoOverlap *p, /* Add segments to this Overlap object */
+ GeoPoly *pPoly, /* Take all segments from this polygon */
+ unsigned char side /* The side of pPoly */
+){
+ unsigned int i;
+ GeoCoord *x;
+ for(i=0; i<(unsigned)pPoly->nVertex-1; i++){
+ x = pPoly->a + (i*2);
+ geopolyAddOneSegment(p, x[0], x[1], x[2], x[3], side, i);
+ }
+ x = pPoly->a + (i*2);
+ geopolyAddOneSegment(p, x[0], x[1], pPoly->a[0], pPoly->a[1], side, i);
+}
+
+/*
+** Merge two lists of sorted events by X coordinate
+*/
+static GeoEvent *geopolyEventMerge(GeoEvent *pLeft, GeoEvent *pRight){
+ GeoEvent head, *pLast;
+ head.pNext = 0;
+ pLast = &head;
+ while( pRight && pLeft ){
+ if( pRight->x <= pLeft->x ){
+ pLast->pNext = pRight;
+ pLast = pRight;
+ pRight = pRight->pNext;
+ }else{
+ pLast->pNext = pLeft;
+ pLast = pLeft;
+ pLeft = pLeft->pNext;
+ }
+ }
+ pLast->pNext = pRight ? pRight : pLeft;
+ return head.pNext;
+}
+
+/*
+** Sort an array of nEvent event objects into a list.
+*/
+static GeoEvent *geopolySortEventsByX(GeoEvent *aEvent, int nEvent){
+ int mx = 0;
+ int i, j;
+ GeoEvent *p;
+ GeoEvent *a[50];
+ for(i=0; i<nEvent; i++){
+ p = &aEvent[i];
+ p->pNext = 0;
+ for(j=0; j<mx && a[j]; j++){
+ p = geopolyEventMerge(a[j], p);
+ a[j] = 0;
+ }
+ a[j] = p;
+ if( j>=mx ) mx = j+1;
+ }
+ p = 0;
+ for(i=0; i<mx; i++){
+ p = geopolyEventMerge(a[i], p);
+ }
+ return p;
+}
+
+/*
+** Merge two lists of sorted segments by Y, and then by C.
+*/
+static GeoSegment *geopolySegmentMerge(GeoSegment *pLeft, GeoSegment *pRight){
+ GeoSegment head, *pLast;
+ head.pNext = 0;
+ pLast = &head;
+ while( pRight && pLeft ){
+ double r = pRight->y - pLeft->y;
+ if( r==0.0 ) r = pRight->C - pLeft->C;
+ if( r<0.0 ){
+ pLast->pNext = pRight;
+ pLast = pRight;
+ pRight = pRight->pNext;
+ }else{
+ pLast->pNext = pLeft;
+ pLast = pLeft;
+ pLeft = pLeft->pNext;
+ }
+ }
+ pLast->pNext = pRight ? pRight : pLeft;
+ return head.pNext;
+}
+
+/*
+** Sort a list of GeoSegments in order of increasing Y and in the event of
+** a tie, increasing C (slope).
+*/
+static GeoSegment *geopolySortSegmentsByYAndC(GeoSegment *pList){
+ int mx = 0;
+ int i;
+ GeoSegment *p;
+ GeoSegment *a[50];
+ while( pList ){
+ p = pList;
+ pList = pList->pNext;
+ p->pNext = 0;
+ for(i=0; i<mx && a[i]; i++){
+ p = geopolySegmentMerge(a[i], p);
+ a[i] = 0;
+ }
+ a[i] = p;
+ if( i>=mx ) mx = i+1;
+ }
+ p = 0;
+ for(i=0; i<mx; i++){
+ p = geopolySegmentMerge(a[i], p);
+ }
+ return p;
+}
+
+/*
+** Determine the overlap between two polygons
+*/
+static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){
+ int nVertex = p1->nVertex + p2->nVertex + 2;
+ GeoOverlap *p;
+ int nByte;
+ GeoEvent *pThisEvent;
+ double rX;
+ int rc = 0;
+ int needSort = 0;
+ GeoSegment *pActive = 0;
+ GeoSegment *pSeg;
+ unsigned char aOverlap[4];
+
+ nByte = sizeof(GeoEvent)*nVertex*2
+ + sizeof(GeoSegment)*nVertex
+ + sizeof(GeoOverlap);
+ p = sqlite3_malloc( nByte );
+ if( p==0 ) return -1;
+ p->aEvent = (GeoEvent*)&p[1];
+ p->aSegment = (GeoSegment*)&p->aEvent[nVertex*2];
+ p->nEvent = p->nSegment = 0;
+ geopolyAddSegments(p, p1, 1);
+ geopolyAddSegments(p, p2, 2);
+ pThisEvent = geopolySortEventsByX(p->aEvent, p->nEvent);
+ rX = pThisEvent->x==0.0 ? -1.0 : 0.0;
+ memset(aOverlap, 0, sizeof(aOverlap));
+ while( pThisEvent ){
+ if( pThisEvent->x!=rX ){
+ GeoSegment *pPrev = 0;
+ int iMask = 0;
+ GEODEBUG(("Distinct X: %g\n", pThisEvent->x));
+ rX = pThisEvent->x;
+ if( needSort ){
+ GEODEBUG(("SORT\n"));
+ pActive = geopolySortSegmentsByYAndC(pActive);
+ needSort = 0;
+ }
+ for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){
+ if( pPrev ){
+ if( pPrev->y!=pSeg->y ){
+ GEODEBUG(("MASK: %d\n", iMask));
+ aOverlap[iMask] = 1;
+ }
+ }
+ iMask ^= pSeg->side;
+ pPrev = pSeg;
+ }
+ pPrev = 0;
+ for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){
+ double y = pSeg->C*rX + pSeg->B;
+ GEODEBUG(("Segment %d.%d %g->%g\n", pSeg->side, pSeg->idx, pSeg->y, y));
+ pSeg->y = y;
+ if( pPrev ){
+ if( pPrev->y>pSeg->y && pPrev->side!=pSeg->side ){
+ rc = 1;
+ GEODEBUG(("Crossing: %d.%d and %d.%d\n",
+ pPrev->side, pPrev->idx,
+ pSeg->side, pSeg->idx));
+ goto geopolyOverlapDone;
+ }else if( pPrev->y!=pSeg->y ){
+ GEODEBUG(("MASK: %d\n", iMask));
+ aOverlap[iMask] = 1;
+ }
+ }
+ iMask ^= pSeg->side;
+ pPrev = pSeg;
+ }
+ }
+ GEODEBUG(("%s %d.%d C=%g B=%g\n",
+ pThisEvent->eType ? "RM " : "ADD",
+ pThisEvent->pSeg->side, pThisEvent->pSeg->idx,
+ pThisEvent->pSeg->C,
+ pThisEvent->pSeg->B));
+ if( pThisEvent->eType==0 ){
+ /* Add a segment */
+ pSeg = pThisEvent->pSeg;
+ pSeg->y = pSeg->y0;
+ pSeg->pNext = pActive;
+ pActive = pSeg;
+ needSort = 1;
+ }else{
+ /* Remove a segment */
+ if( pActive==pThisEvent->pSeg ){
+ pActive = pActive->pNext;
+ }else{
+ for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){
+ if( pSeg->pNext==pThisEvent->pSeg ){
+ pSeg->pNext = pSeg->pNext->pNext;
+ break;
+ }
+ }
+ }
+ }
+ pThisEvent = pThisEvent->pNext;
+ }
+ if( aOverlap[3]==0 ){
+ rc = 0;
+ }else if( aOverlap[1]!=0 && aOverlap[2]==0 ){
+ rc = 3;
+ }else if( aOverlap[1]==0 && aOverlap[2]!=0 ){
+ rc = 2;
+ }else if( aOverlap[1]==0 && aOverlap[2]==0 ){
+ rc = 4;
+ }else{
+ rc = 1;
+ }
+
+geopolyOverlapDone:
+ sqlite3_free(p);
+ return rc;
+}
+
+/*
+** SQL function: geopoly_overlap(P1,P2)
+**
+** Determine whether or not P1 and P2 overlap. Return value:
+**
+** 0 The two polygons are disjoint
+** 1 They overlap
+** 2 P1 is completely contained within P2
+** 3 P2 is completely contained within P1
+** 4 P1 and P2 are the same polygon
+** NULL Either P1 or P2 or both are not valid polygons
+*/
+static void geopolyOverlapFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ GeoPoly *p1 = geopolyFuncParam(context, argv[0], 0);
+ GeoPoly *p2 = geopolyFuncParam(context, argv[1], 0);
+ if( p1 && p2 ){
+ int x = geopolyOverlap(p1, p2);
+ if( x<0 ){
+ sqlite3_result_error_nomem(context);
+ }else{
+ sqlite3_result_int(context, x);
+ }
+ }
+ sqlite3_free(p1);
+ sqlite3_free(p2);
+}
+
+/*
+** Enable or disable debugging output
+*/
+static void geopolyDebugFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+#ifdef GEOPOLY_ENABLE_DEBUG
+ geo_debug = sqlite3_value_int(argv[0]);
+#endif
+}
+
+/*
+** This function is the implementation of both the xConnect and xCreate
+** methods of the geopoly virtual table.
+**
+** argv[0] -> module name
+** argv[1] -> database name
+** argv[2] -> table name
+** argv[...] -> column names...
+*/
+static int geopolyInit(
+ sqlite3 *db, /* Database connection */
+ void *pAux, /* One of the RTREE_COORD_* constants */
+ int argc, const char *const*argv, /* Parameters to CREATE TABLE statement */
+ sqlite3_vtab **ppVtab, /* OUT: New virtual table */
+ char **pzErr, /* OUT: Error message, if any */
+ int isCreate /* True for xCreate, false for xConnect */
+){
+ int rc = SQLITE_OK;
+ Rtree *pRtree;
+ int nDb; /* Length of string argv[1] */
+ int nName; /* Length of string argv[2] */
+ sqlite3_str *pSql;
+ char *zSql;
+ int ii;
+
+ 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);
+ if( !pRtree ){
+ return SQLITE_NOMEM;
+ }
+ memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2);
+ pRtree->nBusy = 1;
+ pRtree->base.pModule = &rtreeModule;
+ pRtree->zDb = (char *)&pRtree[1];
+ pRtree->zName = &pRtree->zDb[nDb+1];
+ pRtree->eCoordType = RTREE_COORD_REAL32;
+ pRtree->nDim = 2;
+ pRtree->nDim2 = 4;
+ memcpy(pRtree->zDb, argv[1], nDb);
+ memcpy(pRtree->zName, argv[2], nName);
+
+
+ /* Create/Connect to the underlying relational database schema. If
+ ** that is successful, call sqlite3_declare_vtab() to configure
+ ** the r-tree table schema.
+ */
+ pSql = sqlite3_str_new(db);
+ sqlite3_str_appendf(pSql, "CREATE TABLE x(_shape");
+ pRtree->nAux = 1; /* Add one for _shape */
+ pRtree->nAuxNotNull = 1; /* The _shape column is always not-null */
+ for(ii=3; ii<argc; ii++){
+ pRtree->nAux++;
+ sqlite3_str_appendf(pSql, ",%s", argv[ii]);
+ }
+ sqlite3_str_appendf(pSql, ");");
+ zSql = sqlite3_str_finish(pSql);
+ if( !zSql ){
+ rc = SQLITE_NOMEM;
+ }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){
+ *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
+ }
+ sqlite3_free(zSql);
+ if( rc ) goto geopolyInit_fail;
+ pRtree->nBytesPerCell = 8 + pRtree->nDim2*4;
+
+ /* Figure out the node size to use. */
+ rc = getNodeSize(db, pRtree, isCreate, pzErr);
+ if( rc ) goto geopolyInit_fail;
+ rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate);
+ if( rc ){
+ *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
+ goto geopolyInit_fail;
+ }
+
+ *ppVtab = (sqlite3_vtab *)pRtree;
+ return SQLITE_OK;
+
+geopolyInit_fail:
+ if( rc==SQLITE_OK ) rc = SQLITE_ERROR;
+ assert( *ppVtab==0 );
+ assert( pRtree->nBusy==1 );
+ rtreeRelease(pRtree);
+ return rc;
+}
+
+
+/*
+** GEOPOLY virtual table module xCreate method.
+*/
+static int geopolyCreate(
+ sqlite3 *db,
+ void *pAux,
+ int argc, const char *const*argv,
+ sqlite3_vtab **ppVtab,
+ char **pzErr
+){
+ return geopolyInit(db, pAux, argc, argv, ppVtab, pzErr, 1);
+}
+
+/*
+** GEOPOLY virtual table module xConnect method.
+*/
+static int geopolyConnect(
+ sqlite3 *db,
+ void *pAux,
+ int argc, const char *const*argv,
+ sqlite3_vtab **ppVtab,
+ char **pzErr
+){
+ return geopolyInit(db, pAux, argc, argv, ppVtab, pzErr, 0);
+}
+
+
+/*
+** GEOPOLY virtual table module xFilter method.
+**
+** Query plans:
+**
+** 1 rowid lookup
+** 2 search for objects overlapping the same bounding box
+** that contains polygon argv[0]
+** 3 search for objects overlapping the same bounding box
+** that contains polygon argv[0]
+** 4 full table scan
+*/
+static int geopolyFilter(
+ sqlite3_vtab_cursor *pVtabCursor, /* The cursor to initialize */
+ int idxNum, /* Query plan */
+ const char *idxStr, /* Not Used */
+ int argc, sqlite3_value **argv /* Parameters to the query plan */
+){
+ Rtree *pRtree = (Rtree *)pVtabCursor->pVtab;
+ RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
+ RtreeNode *pRoot = 0;
+ int rc = SQLITE_OK;
+ int iCell = 0;
+ sqlite3_stmt *pStmt;
+
+ rtreeReference(pRtree);
+
+ /* Reset the cursor to the same state as rtreeOpen() leaves it in. */
+ freeCursorConstraints(pCsr);
+ sqlite3_free(pCsr->aPoint);
+ pStmt = pCsr->pReadAux;
+ memset(pCsr, 0, sizeof(RtreeCursor));
+ pCsr->base.pVtab = (sqlite3_vtab*)pRtree;
+ pCsr->pReadAux = pStmt;
+
+ pCsr->iStrategy = idxNum;
+ if( idxNum==1 ){
+ /* Special case - lookup by rowid. */
+ RtreeNode *pLeaf; /* Leaf on which the required cell resides */
+ RtreeSearchPoint *p; /* Search point for the leaf */
+ i64 iRowid = sqlite3_value_int64(argv[0]);
+ i64 iNode = 0;
+ rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode);
+ if( rc==SQLITE_OK && pLeaf!=0 ){
+ p = rtreeSearchPointNew(pCsr, RTREE_ZERO, 0);
+ assert( p!=0 ); /* Always returns pCsr->sPoint */
+ pCsr->aNode[0] = pLeaf;
+ p->id = iNode;
+ p->eWithin = PARTLY_WITHIN;
+ rc = nodeRowidIndex(pRtree, pLeaf, iRowid, &iCell);
+ p->iCell = (u8)iCell;
+ RTREE_QUEUE_TRACE(pCsr, "PUSH-F1:");
+ }else{
+ pCsr->atEOF = 1;
+ }
+ }else{
+ /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array
+ ** with the configured constraints.
+ */
+ rc = nodeAcquire(pRtree, 1, 0, &pRoot);
+ if( rc==SQLITE_OK && idxNum<=3 ){
+ RtreeCoord bbox[4];
+ RtreeConstraint *p;
+ assert( argc==1 );
+ geopolyBBox(0, argv[0], bbox, &rc);
+ if( rc ){
+ goto geopoly_filter_end;
+ }
+ pCsr->aConstraint = p = sqlite3_malloc(sizeof(RtreeConstraint)*4);
+ pCsr->nConstraint = 4;
+ if( p==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*4);
+ memset(pCsr->anQueue, 0, sizeof(u32)*(pRtree->iDepth + 1));
+ if( idxNum==2 ){
+ /* Overlap query */
+ p->op = 'B';
+ p->iCoord = 0;
+ p->u.rValue = bbox[1].f;
+ p++;
+ p->op = 'D';
+ p->iCoord = 1;
+ p->u.rValue = bbox[0].f;
+ p++;
+ p->op = 'B';
+ p->iCoord = 2;
+ p->u.rValue = bbox[3].f;
+ p++;
+ p->op = 'D';
+ p->iCoord = 3;
+ p->u.rValue = bbox[2].f;
+ }else{
+ /* Within query */
+ p->op = 'D';
+ p->iCoord = 0;
+ p->u.rValue = bbox[0].f;
+ p++;
+ p->op = 'B';
+ p->iCoord = 1;
+ p->u.rValue = bbox[1].f;
+ p++;
+ p->op = 'D';
+ p->iCoord = 2;
+ p->u.rValue = bbox[2].f;
+ p++;
+ p->op = 'B';
+ p->iCoord = 3;
+ p->u.rValue = bbox[3].f;
+ }
+ }
+ }
+ if( rc==SQLITE_OK ){
+ RtreeSearchPoint *pNew;
+ pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, (u8)(pRtree->iDepth+1));
+ if( pNew==0 ){
+ rc = SQLITE_NOMEM;
+ goto geopoly_filter_end;
+ }
+ pNew->id = 1;
+ pNew->iCell = 0;
+ pNew->eWithin = PARTLY_WITHIN;
+ assert( pCsr->bPoint==1 );
+ pCsr->aNode[0] = pRoot;
+ pRoot = 0;
+ RTREE_QUEUE_TRACE(pCsr, "PUSH-Fm:");
+ rc = rtreeStepToLeaf(pCsr);
+ }
+ }
+
+geopoly_filter_end:
+ nodeRelease(pRtree, pRoot);
+ rtreeRelease(pRtree);
+ return rc;
+}
+
+/*
+** Rtree virtual table module xBestIndex method. There are three
+** table scan strategies to choose from (in order from most to
+** least desirable):
+**
+** idxNum idxStr Strategy
+** ------------------------------------------------
+** 1 "rowid" Direct lookup by rowid.
+** 2 "rtree" R-tree overlap query using geopoly_overlap()
+** 3 "rtree" R-tree within query using geopoly_within()
+** 4 "fullscan" full-table scan.
+** ------------------------------------------------
+*/
+static int geopolyBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
+ int ii;
+ int iRowidTerm = -1;
+ int iFuncTerm = -1;
+ int idxNum = 0;
+
+ for(ii=0; ii<pIdxInfo->nConstraint; ii++){
+ struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii];
+ if( !p->usable ) continue;
+ if( p->iColumn<0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
+ iRowidTerm = ii;
+ break;
+ }
+ if( p->iColumn==0 && p->op>=SQLITE_INDEX_CONSTRAINT_FUNCTION ){
+ /* p->op==SQLITE_INDEX_CONSTRAINT_FUNCTION for geopoly_overlap()
+ ** p->op==(SQLITE_INDEX_CONTRAINT_FUNCTION+1) for geopoly_within().
+ ** See geopolyFindFunction() */
+ iFuncTerm = ii;
+ idxNum = p->op - SQLITE_INDEX_CONSTRAINT_FUNCTION + 2;
+ }
+ }
+
+ if( iRowidTerm>=0 ){
+ pIdxInfo->idxNum = 1;
+ pIdxInfo->idxStr = "rowid";
+ pIdxInfo->aConstraintUsage[iRowidTerm].argvIndex = 1;
+ pIdxInfo->aConstraintUsage[iRowidTerm].omit = 1;
+ pIdxInfo->estimatedCost = 30.0;
+ pIdxInfo->estimatedRows = 1;
+ pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE;
+ return SQLITE_OK;
+ }
+ if( iFuncTerm>=0 ){
+ pIdxInfo->idxNum = idxNum;
+ pIdxInfo->idxStr = "rtree";
+ pIdxInfo->aConstraintUsage[iFuncTerm].argvIndex = 1;
+ pIdxInfo->aConstraintUsage[iFuncTerm].omit = 0;
+ pIdxInfo->estimatedCost = 300.0;
+ pIdxInfo->estimatedRows = 10;
+ return SQLITE_OK;
+ }
+ pIdxInfo->idxNum = 4;
+ pIdxInfo->idxStr = "fullscan";
+ pIdxInfo->estimatedCost = 3000000.0;
+ pIdxInfo->estimatedRows = 100000;
+ return SQLITE_OK;
+}
+
+
+/*
+** GEOPOLY virtual table module xColumn method.
+*/
+static int geopolyColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
+ Rtree *pRtree = (Rtree *)cur->pVtab;
+ RtreeCursor *pCsr = (RtreeCursor *)cur;
+ RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr);
+ int rc = SQLITE_OK;
+ RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc);
+
+ if( rc ) return rc;
+ if( p==0 ) return SQLITE_OK;
+ if( i==0 && sqlite3_vtab_nochange(ctx) ) return SQLITE_OK;
+ if( i<=pRtree->nAux ){
+ if( !pCsr->bAuxValid ){
+ if( pCsr->pReadAux==0 ){
+ rc = sqlite3_prepare_v3(pRtree->db, pRtree->zReadAuxSql, -1, 0,
+ &pCsr->pReadAux, 0);
+ if( rc ) return rc;
+ }
+ sqlite3_bind_int64(pCsr->pReadAux, 1,
+ nodeGetRowid(pRtree, pNode, p->iCell));
+ rc = sqlite3_step(pCsr->pReadAux);
+ if( rc==SQLITE_ROW ){
+ pCsr->bAuxValid = 1;
+ }else{
+ sqlite3_reset(pCsr->pReadAux);
+ if( rc==SQLITE_DONE ) rc = SQLITE_OK;
+ return rc;
+ }
+ }
+ sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pReadAux, i+2));
+ }
+ return SQLITE_OK;
+}
+
+
+/*
+** The xUpdate method for GEOPOLY module virtual tables.
+**
+** For DELETE:
+**
+** argv[0] = the rowid to be deleted
+**
+** For INSERT:
+**
+** argv[0] = SQL NULL
+** argv[1] = rowid to insert, or an SQL NULL to select automatically
+** argv[2] = _shape column
+** argv[3] = first application-defined column....
+**
+** For UPDATE:
+**
+** argv[0] = rowid to modify. Never NULL
+** argv[1] = rowid after the change. Never NULL
+** argv[2] = new value for _shape
+** argv[3] = new value for first application-defined column....
+*/
+static int geopolyUpdate(
+ sqlite3_vtab *pVtab,
+ int nData,
+ sqlite3_value **aData,
+ sqlite_int64 *pRowid
+){
+ Rtree *pRtree = (Rtree *)pVtab;
+ int rc = SQLITE_OK;
+ RtreeCell cell; /* New cell to insert if nData>1 */
+ i64 oldRowid; /* The old rowid */
+ int oldRowidValid; /* True if oldRowid is valid */
+ i64 newRowid; /* The new rowid */
+ int newRowidValid; /* True if newRowid is valid */
+ int coordChange = 0; /* Change in coordinates */
+
+ if( pRtree->nNodeRef ){
+ /* Unable to write to the btree while another cursor is reading from it,
+ ** since the write might do a rebalance which would disrupt the read
+ ** cursor. */
+ return SQLITE_LOCKED_VTAB;
+ }
+ rtreeReference(pRtree);
+ assert(nData>=1);
+
+ oldRowidValid = sqlite3_value_type(aData[0])!=SQLITE_NULL;;
+ oldRowid = oldRowidValid ? sqlite3_value_int64(aData[0]) : 0;
+ newRowidValid = nData>1 && sqlite3_value_type(aData[1])!=SQLITE_NULL;
+ newRowid = newRowidValid ? sqlite3_value_int64(aData[1]) : 0;
+ cell.iRowid = newRowid;
+
+ if( nData>1 /* not a DELETE */
+ && (!oldRowidValid /* INSERT */
+ || !sqlite3_value_nochange(aData[2]) /* UPDATE _shape */
+ || oldRowid!=newRowid) /* Rowid change */
+ ){
+ geopolyBBox(0, aData[2], cell.aCoord, &rc);
+ if( rc ){
+ if( rc==SQLITE_ERROR ){
+ pVtab->zErrMsg =
+ sqlite3_mprintf("_shape does not contain a valid polygon");
+ }
+ goto geopoly_update_end;
+ }
+ coordChange = 1;
+
+ /* If a rowid value was supplied, check if it is already present in
+ ** the table. If so, the constraint has failed. */
+ if( newRowidValid && (!oldRowidValid || oldRowid!=newRowid) ){
+ int steprc;
+ sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid);
+ steprc = sqlite3_step(pRtree->pReadRowid);
+ rc = sqlite3_reset(pRtree->pReadRowid);
+ if( SQLITE_ROW==steprc ){
+ if( sqlite3_vtab_on_conflict(pRtree->db)==SQLITE_REPLACE ){
+ rc = rtreeDeleteRowid(pRtree, cell.iRowid);
+ }else{
+ rc = rtreeConstraintError(pRtree, 0);
+ }
+ }
+ }
+ }
+
+ /* If aData[0] is not an SQL NULL value, it is the rowid of a
+ ** record to delete from the r-tree table. The following block does
+ ** just that.
+ */
+ if( rc==SQLITE_OK && (nData==1 || (coordChange && oldRowidValid)) ){
+ rc = rtreeDeleteRowid(pRtree, oldRowid);
+ }
+
+ /* If the aData[] array contains more than one element, elements
+ ** (aData[2]..aData[argc-1]) contain a new record to insert into
+ ** the r-tree structure.
+ */
+ if( rc==SQLITE_OK && nData>1 && coordChange ){
+ /* Insert the new record into the r-tree */
+ RtreeNode *pLeaf = 0;
+ if( !newRowidValid ){
+ rc = rtreeNewRowid(pRtree, &cell.iRowid);
+ }
+ *pRowid = cell.iRowid;
+ if( rc==SQLITE_OK ){
+ rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf);
+ }
+ if( rc==SQLITE_OK ){
+ int rc2;
+ pRtree->iReinsertHeight = -1;
+ rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0);
+ rc2 = nodeRelease(pRtree, pLeaf);
+ if( rc==SQLITE_OK ){
+ rc = rc2;
+ }
+ }
+ }
+
+ /* Change the data */
+ if( rc==SQLITE_OK && nData>1 ){
+ sqlite3_stmt *pUp = pRtree->pWriteAux;
+ int jj;
+ int nChange = 0;
+ sqlite3_bind_int64(pUp, 1, cell.iRowid);
+ assert( pRtree->nAux>=1 );
+ if( sqlite3_value_nochange(aData[2]) ){
+ sqlite3_bind_null(pUp, 2);
+ }else{
+ GeoPoly *p = 0;
+ if( sqlite3_value_type(aData[2])==SQLITE_TEXT
+ && (p = geopolyFuncParam(0, aData[2], &rc))!=0
+ && rc==SQLITE_OK
+ ){
+ sqlite3_bind_blob(pUp, 2, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT);
+ }else{
+ sqlite3_bind_value(pUp, 2, aData[2]);
+ }
+ sqlite3_free(p);
+ nChange = 1;
+ }
+ for(jj=1; jj<pRtree->nAux; jj++){
+ nChange++;
+ sqlite3_bind_value(pUp, jj+2, aData[jj+2]);
+ }
+ if( nChange ){
+ sqlite3_step(pUp);
+ rc = sqlite3_reset(pUp);
+ }
+ }
+
+geopoly_update_end:
+ rtreeRelease(pRtree);
+ return rc;
+}
+
+/*
+** Report that geopoly_overlap() is an overloaded function suitable
+** for use in xBestIndex.
+*/
+static int geopolyFindFunction(
+ sqlite3_vtab *pVtab,
+ int nArg,
+ const char *zName,
+ void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
+ void **ppArg
+){
+ if( sqlite3_stricmp(zName, "geopoly_overlap")==0 ){
+ *pxFunc = geopolyOverlapFunc;
+ *ppArg = 0;
+ return SQLITE_INDEX_CONSTRAINT_FUNCTION;
+ }
+ if( sqlite3_stricmp(zName, "geopoly_within")==0 ){
+ *pxFunc = geopolyWithinFunc;
+ *ppArg = 0;
+ return SQLITE_INDEX_CONSTRAINT_FUNCTION+1;
+ }
+ return 0;
+}
+
+
+static sqlite3_module geopolyModule = {
+ 3, /* iVersion */
+ geopolyCreate, /* xCreate - create a table */
+ geopolyConnect, /* xConnect - connect to an existing table */
+ geopolyBestIndex, /* xBestIndex - Determine search strategy */
+ rtreeDisconnect, /* xDisconnect - Disconnect from a table */
+ rtreeDestroy, /* xDestroy - Drop a table */
+ rtreeOpen, /* xOpen - open a cursor */
+ rtreeClose, /* xClose - close a cursor */
+ geopolyFilter, /* xFilter - configure scan constraints */
+ rtreeNext, /* xNext - advance a cursor */
+ rtreeEof, /* xEof */
+ geopolyColumn, /* xColumn - read data */
+ rtreeRowid, /* xRowid - read data */
+ geopolyUpdate, /* xUpdate - write data */
+ rtreeBeginTransaction, /* xBegin - begin transaction */
+ rtreeEndTransaction, /* xSync - sync transaction */
+ rtreeEndTransaction, /* xCommit - commit transaction */
+ rtreeEndTransaction, /* xRollback - rollback transaction */
+ geopolyFindFunction, /* xFindFunction - function overloading */
+ rtreeRename, /* xRename - rename the table */
+ rtreeSavepoint, /* xSavepoint */
+ 0, /* xRelease */
+ 0, /* xRollbackTo */
+ rtreeShadowName /* xShadowName */
+};
+
+static int sqlite3_geopoly_init(sqlite3 *db){
+ int rc = SQLITE_OK;
+ static const struct {
+ void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
+ signed char nArg;
+ unsigned char bPure;
+ const char *zName;
+ } aFunc[] = {
+ { geopolyAreaFunc, 1, 1, "geopoly_area" },
+ { geopolyBlobFunc, 1, 1, "geopoly_blob" },
+ { geopolyJsonFunc, 1, 1, "geopoly_json" },
+ { geopolySvgFunc, -1, 1, "geopoly_svg" },
+ { geopolyWithinFunc, 2, 1, "geopoly_within" },
+ { geopolyContainsPointFunc, 3, 1, "geopoly_contains_point" },
+ { geopolyOverlapFunc, 2, 1, "geopoly_overlap" },
+ { geopolyDebugFunc, 1, 0, "geopoly_debug" },
+ { geopolyBBoxFunc, 1, 1, "geopoly_bbox" },
+ { geopolyXformFunc, 7, 1, "geopoly_xform" },
+ { geopolyRegularFunc, 4, 1, "geopoly_regular" },
+ { geopolyCcwFunc, 1, 1, "geopoly_ccw" },
+ };
+ static const struct {
+ void (*xStep)(sqlite3_context*,int,sqlite3_value**);
+ void (*xFinal)(sqlite3_context*);
+ const char *zName;
+ } aAgg[] = {
+ { geopolyBBoxStep, geopolyBBoxFinal, "geopoly_group_bbox" },
+ };
+ int i;
+ for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
+ int enc = aFunc[i].bPure ? SQLITE_UTF8|SQLITE_DETERMINISTIC : SQLITE_UTF8;
+ rc = sqlite3_create_function(db, aFunc[i].zName, aFunc[i].nArg,
+ enc, 0,
+ aFunc[i].xFunc, 0, 0);
+ }
+ for(i=0; i<sizeof(aAgg)/sizeof(aAgg[0]) && rc==SQLITE_OK; i++){
+ rc = sqlite3_create_function(db, aAgg[i].zName, 1, SQLITE_UTF8, 0,
+ 0, aAgg[i].xStep, aAgg[i].xFinal);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_create_module_v2(db, "geopoly", &geopolyModule, 0, 0);
+ }
+ return rc;
+}
+
+/************** End of geopoly.c *********************************************/
+/************** Continuing where we left off in rtree.c **********************/
+#endif
+
+/*
** Register the r-tree module with database handle db. This creates the
** virtual table module "rtree" and the debugging/analysis scalar
** function "rtreenode".
@@ -169254,6 +185189,9 @@ SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db){
rc = sqlite3_create_function(db, "rtreedepth", 1, utf8, 0,rtreedepth, 0, 0);
}
if( rc==SQLITE_OK ){
+ rc = sqlite3_create_function(db, "rtreecheck", -1, utf8, 0,rtreecheck, 0,0);
+ }
+ if( rc==SQLITE_OK ){
#ifdef SQLITE_RTREE_INT_ONLY
void *c = (void *)RTREE_COORD_INT32;
#else
@@ -169265,6 +185203,11 @@ SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db){
void *c = (void *)RTREE_COORD_INT32;
rc = sqlite3_create_module_v2(db, "rtree_i32", &rtreeModule, c, 0);
}
+#ifdef SQLITE_ENABLE_GEOPOLY
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_geopoly_init(db);
+ }
+#endif
return rc;
}
@@ -169439,7 +185382,9 @@ SQLITE_API int sqlite3_rtree_init(
** provide case-independent matching.
*/
-#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU)
+#if !defined(SQLITE_CORE) \
+ || defined(SQLITE_ENABLE_ICU) \
+ || defined(SQLITE_ENABLE_ICU_COLLATIONS)
/* Include ICU headers */
#include <unicode/utypes.h>
@@ -169457,6 +185402,26 @@ SQLITE_API int sqlite3_rtree_init(
#endif
/*
+** This function is called when an ICU function called from within
+** the implementation of an SQL scalar function returns an error.
+**
+** The scalar function context passed as the first argument is
+** loaded with an error message based on the following two args.
+*/
+static void icuFunctionError(
+ sqlite3_context *pCtx, /* SQLite scalar function context */
+ const char *zName, /* Name of ICU function that failed */
+ UErrorCode e /* Error code returned by ICU function */
+){
+ char zBuf[128];
+ sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e));
+ zBuf[127] = '\0';
+ sqlite3_result_error(pCtx, zBuf, -1);
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU)
+
+/*
** Maximum length (in bytes) of the pattern in a LIKE or GLOB
** operator.
*/
@@ -169636,24 +185601,6 @@ static void icuLikeFunc(
}
/*
-** This function is called when an ICU function called from within
-** the implementation of an SQL scalar function returns an error.
-**
-** The scalar function context passed as the first argument is
-** loaded with an error message based on the following two args.
-*/
-static void icuFunctionError(
- sqlite3_context *pCtx, /* SQLite scalar function context */
- const char *zName, /* Name of ICU function that failed */
- UErrorCode e /* Error code returned by ICU function */
-){
- char zBuf[128];
- sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e));
- zBuf[127] = '\0';
- sqlite3_result_error(pCtx, zBuf, -1);
-}
-
-/*
** Function to delete compiled regexp objects. Registered as
** a destructor function with sqlite3_set_auxdata().
*/
@@ -169818,6 +185765,8 @@ static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){
assert( 0 ); /* Unreachable */
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */
+
/*
** Collation sequence destructor function. The pCtx argument points to
** a UCollator structure previously allocated using ucol_open().
@@ -169912,6 +185861,7 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){
void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
} scalars[] = {
{"icu_load_collation", 2, SQLITE_UTF8, 1, icuLoadCollation},
+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU)
{"regexp", 2, SQLITE_ANY|SQLITE_DETERMINISTIC, 0, icuRegexpFunc},
{"lower", 1, SQLITE_UTF16|SQLITE_DETERMINISTIC, 0, icuCaseFunc16},
{"lower", 2, SQLITE_UTF16|SQLITE_DETERMINISTIC, 0, icuCaseFunc16},
@@ -169923,10 +185873,10 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){
{"upper", 2, SQLITE_UTF8|SQLITE_DETERMINISTIC, 1, icuCaseFunc16},
{"like", 2, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuLikeFunc},
{"like", 3, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuLikeFunc},
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */
};
int rc = SQLITE_OK;
int i;
-
for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){
const struct IcuScalar *p = &scalars[i];
@@ -170983,6 +186933,10 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName);
**
** RBU_STATE_OALSZ:
** Valid if STAGE==1. The size in bytes of the *-oal file.
+**
+** RBU_STATE_DATATBL:
+** Only valid if STAGE==1. The RBU database name of the table
+** currently being read.
*/
#define RBU_STATE_STAGE 1
#define RBU_STATE_TBL 2
@@ -170993,6 +186947,7 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName);
#define RBU_STATE_COOKIE 7
#define RBU_STATE_OALSZ 8
#define RBU_STATE_PHASEONESTEP 9
+#define RBU_STATE_DATATBL 10
#define RBU_STAGE_OAL 1
#define RBU_STAGE_MOVE 2
@@ -171035,6 +186990,7 @@ typedef sqlite3_int64 i64;
struct RbuState {
int eStage;
char *zTbl;
+ char *zDataTbl;
char *zIdx;
i64 iWalCksum;
int nRow;
@@ -171229,7 +187185,8 @@ struct rbu_vfs {
sqlite3_vfs *pRealVfs; /* Underlying VFS */
sqlite3_mutex *mutex; /* Mutex to protect pMain */
sqlite3rbu *pRbu; /* Owner RBU object */
- rbu_file *pMain; /* Linked list of main db files */
+ rbu_file *pMain; /* List of main db files */
+ rbu_file *pMainRbu; /* List of main db files with pRbu!=0 */
};
/*
@@ -171258,6 +187215,7 @@ struct rbu_file {
const char *zWal; /* Wal filename for this main db file */
rbu_file *pWalFd; /* Wal file descriptor for this main db */
rbu_file *pMainNext; /* Next MAIN_DB file */
+ rbu_file *pMainRbuNext; /* Next MAIN_DB file with pRbu!=0 */
};
/*
@@ -172636,7 +188594,7 @@ static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){
int iCid = sqlite3_column_int(pXInfo, 1);
int bDesc = sqlite3_column_int(pXInfo, 3);
const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4);
- zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %s", zCols, zComma,
+ zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %Q", zCols, zComma,
iCid, pIter->azTblType[iCid], zCollate
);
zPk = rbuMPrintf(p, "%z%sc%d%s", zPk, zComma, iCid, bDesc?" DESC":"");
@@ -172697,7 +188655,7 @@ static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){
** "PRIMARY KEY" to the imposter table column declaration. */
zPk = "PRIMARY KEY ";
}
- zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %s%s",
+ zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %Q%s",
zSql, zComma, zCol, pIter->azTblType[iCol], zPk, zColl,
(pIter->abNotNull[iCol] ? " NOT NULL" : "")
);
@@ -173098,6 +189056,7 @@ static sqlite3 *rbuOpenDbhandle(
static void rbuFreeState(RbuState *p){
if( p ){
sqlite3_free(p->zTbl);
+ sqlite3_free(p->zDataTbl);
sqlite3_free(p->zIdx);
sqlite3_free(p);
}
@@ -173168,6 +189127,10 @@ static RbuState *rbuLoadState(sqlite3rbu *p){
pRet->nPhaseOneStep = sqlite3_column_int64(pStmt, 1);
break;
+ case RBU_STATE_DATATBL:
+ pRet->zDataTbl = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc);
+ break;
+
default:
rc = SQLITE_CORRUPT;
break;
@@ -173942,7 +189905,8 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){
"(%d, %lld), "
"(%d, %lld), "
"(%d, %lld), "
- "(%d, %lld) ",
+ "(%d, %lld), "
+ "(%d, %Q) ",
p->zStateDb,
RBU_STATE_STAGE, eStage,
RBU_STATE_TBL, p->objiter.zTbl,
@@ -173952,7 +189916,8 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){
RBU_STATE_CKPT, p->iWalCksum,
RBU_STATE_COOKIE, (i64)pFd->iCookie,
RBU_STATE_OALSZ, p->iOalSz,
- RBU_STATE_PHASEONESTEP, p->nPhaseOneStep
+ RBU_STATE_PHASEONESTEP, p->nPhaseOneStep,
+ RBU_STATE_DATATBL, p->objiter.zDataTbl
)
);
assert( pInsert==0 || rc==SQLITE_OK );
@@ -174208,7 +190173,8 @@ static void rbuSetupOal(sqlite3rbu *p, RbuState *pState){
while( rc==SQLITE_OK && pIter->zTbl && (pIter->bCleanup
|| rbuStrCompare(pIter->zIdx, pState->zIdx)
- || rbuStrCompare(pIter->zTbl, pState->zTbl)
+ || (pState->zDataTbl==0 && rbuStrCompare(pIter->zTbl, pState->zTbl))
+ || (pState->zDataTbl && rbuStrCompare(pIter->zDataTbl, pState->zDataTbl))
)){
rc = rbuObjIterNext(p, pIter);
}
@@ -174847,6 +190813,69 @@ static int rbuUpdateTempSize(rbu_file *pFd, sqlite3_int64 nNew){
}
/*
+** Add an item to the main-db lists, if it is not already present.
+**
+** There are two main-db lists. One for all file descriptors, and one
+** for all file descriptors with rbu_file.pDb!=0. If the argument has
+** rbu_file.pDb!=0, then it is assumed to already be present on the
+** main list and is only added to the pDb!=0 list.
+*/
+static void rbuMainlistAdd(rbu_file *p){
+ rbu_vfs *pRbuVfs = p->pRbuVfs;
+ rbu_file *pIter;
+ assert( (p->openFlags & SQLITE_OPEN_MAIN_DB) );
+ sqlite3_mutex_enter(pRbuVfs->mutex);
+ if( p->pRbu==0 ){
+ for(pIter=pRbuVfs->pMain; pIter; pIter=pIter->pMainNext);
+ p->pMainNext = pRbuVfs->pMain;
+ pRbuVfs->pMain = p;
+ }else{
+ for(pIter=pRbuVfs->pMainRbu; pIter && pIter!=p; pIter=pIter->pMainRbuNext){}
+ if( pIter==0 ){
+ p->pMainRbuNext = pRbuVfs->pMainRbu;
+ pRbuVfs->pMainRbu = p;
+ }
+ }
+ sqlite3_mutex_leave(pRbuVfs->mutex);
+}
+
+/*
+** Remove an item from the main-db lists.
+*/
+static void rbuMainlistRemove(rbu_file *p){
+ rbu_file **pp;
+ sqlite3_mutex_enter(p->pRbuVfs->mutex);
+ for(pp=&p->pRbuVfs->pMain; *pp && *pp!=p; pp=&((*pp)->pMainNext)){}
+ if( *pp ) *pp = p->pMainNext;
+ p->pMainNext = 0;
+ for(pp=&p->pRbuVfs->pMainRbu; *pp && *pp!=p; pp=&((*pp)->pMainRbuNext)){}
+ if( *pp ) *pp = p->pMainRbuNext;
+ p->pMainRbuNext = 0;
+ sqlite3_mutex_leave(p->pRbuVfs->mutex);
+}
+
+/*
+** Given that zWal points to a buffer containing a wal file name passed to
+** either the xOpen() or xAccess() VFS method, search the main-db list for
+** a file-handle opened by the same database connection on the corresponding
+** database file.
+**
+** If parameter bRbu is true, only search for file-descriptors with
+** rbu_file.pDb!=0.
+*/
+static rbu_file *rbuFindMaindb(rbu_vfs *pRbuVfs, const char *zWal, int bRbu){
+ rbu_file *pDb;
+ sqlite3_mutex_enter(pRbuVfs->mutex);
+ if( bRbu ){
+ for(pDb=pRbuVfs->pMainRbu; pDb && pDb->zWal!=zWal; pDb=pDb->pMainRbuNext){}
+ }else{
+ for(pDb=pRbuVfs->pMain; pDb && pDb->zWal!=zWal; pDb=pDb->pMainNext){}
+ }
+ sqlite3_mutex_leave(pRbuVfs->mutex);
+ return pDb;
+}
+
+/*
** Close an rbu file.
*/
static int rbuVfsClose(sqlite3_file *pFile){
@@ -174863,17 +190892,14 @@ static int rbuVfsClose(sqlite3_file *pFile){
sqlite3_free(p->zDel);
if( p->openFlags & SQLITE_OPEN_MAIN_DB ){
- rbu_file **pp;
- sqlite3_mutex_enter(p->pRbuVfs->mutex);
- for(pp=&p->pRbuVfs->pMain; *pp!=p; pp=&((*pp)->pMainNext));
- *pp = p->pMainNext;
- sqlite3_mutex_leave(p->pRbuVfs->mutex);
+ rbuMainlistRemove(p);
rbuUnlockShm(p);
p->pReal->pMethods->xShmUnmap(p->pReal, 0);
}
else if( (p->openFlags & SQLITE_OPEN_DELETEONCLOSE) && p->pRbu ){
rbuUpdateTempSize(p, 0);
}
+ assert( p->pMainNext==0 && p->pRbuVfs->pMain!=p );
/* Close the underlying file handle */
rc = p->pReal->pMethods->xClose(p->pReal);
@@ -175132,6 +191158,9 @@ static int rbuVfsFileControl(sqlite3_file *pFile, int op, void *pArg){
}else if( rc==SQLITE_NOTFOUND ){
pRbu->pTargetFd = p;
p->pRbu = pRbu;
+ if( p->openFlags & SQLITE_OPEN_MAIN_DB ){
+ rbuMainlistAdd(p);
+ }
if( p->pWalFd ) p->pWalFd->pRbu = pRbu;
rc = SQLITE_OK;
}
@@ -175293,20 +191322,6 @@ static int rbuVfsShmUnmap(sqlite3_file *pFile, int delFlag){
return rc;
}
-/*
-** Given that zWal points to a buffer containing a wal file name passed to
-** either the xOpen() or xAccess() VFS method, return a pointer to the
-** file-handle opened by the same database connection on the corresponding
-** database file.
-*/
-static rbu_file *rbuFindMaindb(rbu_vfs *pRbuVfs, const char *zWal){
- rbu_file *pDb;
- sqlite3_mutex_enter(pRbuVfs->mutex);
- for(pDb=pRbuVfs->pMain; pDb && pDb->zWal!=zWal; pDb=pDb->pMainNext){}
- sqlite3_mutex_leave(pRbuVfs->mutex);
- return pDb;
-}
-
/*
** A main database named zName has just been opened. The following
** function returns a pointer to a buffer owned by SQLite that contains
@@ -175385,7 +191400,7 @@ static int rbuVfsOpen(
pFd->zWal = rbuMainToWal(zName, flags);
}
else if( flags & SQLITE_OPEN_WAL ){
- rbu_file *pDb = rbuFindMaindb(pRbuVfs, zName);
+ rbu_file *pDb = rbuFindMaindb(pRbuVfs, zName, 0);
if( pDb ){
if( pDb->pRbu && pDb->pRbu->eStage==RBU_STAGE_OAL ){
/* This call is to open a *-wal file. Intead, open the *-oal. This
@@ -175437,10 +191452,7 @@ static int rbuVfsOpen(
** mutex protected linked list of all such files. */
pFile->pMethods = &rbuvfs_io_methods;
if( flags & SQLITE_OPEN_MAIN_DB ){
- sqlite3_mutex_enter(pRbuVfs->mutex);
- pFd->pMainNext = pRbuVfs->pMain;
- pRbuVfs->pMain = pFd;
- sqlite3_mutex_leave(pRbuVfs->mutex);
+ rbuMainlistAdd(pFd);
}
}else{
sqlite3_free(pFd->zDel);
@@ -175488,7 +191500,7 @@ static int rbuVfsAccess(
** file opened instead.
*/
if( rc==SQLITE_OK && flags==SQLITE_ACCESS_EXISTS ){
- rbu_file *pDb = rbuFindMaindb(pRbuVfs, zPath);
+ rbu_file *pDb = rbuFindMaindb(pRbuVfs, zPath, 1);
if( pDb && pDb->pRbu && pDb->pRbu->eStage==RBU_STAGE_OAL ){
if( *pResOut ){
rc = SQLITE_CANTOPEN;
@@ -175901,17 +191913,15 @@ static int statDisconnect(sqlite3_vtab *pVtab){
static int statBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
int i;
- pIdxInfo->estimatedCost = 1.0e6; /* Initial cost estimate */
-
/* Look for a valid schema=? constraint. If found, change the idxNum to
** 1 and request the value of that constraint be sent to xFilter. And
** lower the cost estimate to encourage the constrained version to be
** used.
*/
for(i=0; i<pIdxInfo->nConstraint; i++){
- if( pIdxInfo->aConstraint[i].usable==0 ) continue;
- if( pIdxInfo->aConstraint[i].op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
if( pIdxInfo->aConstraint[i].iColumn!=10 ) continue;
+ if( pIdxInfo->aConstraint[i].usable==0 ) return SQLITE_CONSTRAINT;
+ if( pIdxInfo->aConstraint[i].op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
pIdxInfo->idxNum = 1;
pIdxInfo->estimatedCost = 1.0;
pIdxInfo->aConstraintUsage[i].argvIndex = 1;
@@ -175961,7 +191971,7 @@ static int statOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
return SQLITE_OK;
}
-static void statClearPage(StatPage *p){
+static void statClearCells(StatPage *p){
int i;
if( p->aCell ){
for(i=0; i<p->nCell; i++){
@@ -175969,6 +191979,12 @@ static void statClearPage(StatPage *p){
}
sqlite3_free(p->aCell);
}
+ p->nCell = 0;
+ p->aCell = 0;
+}
+
+static void statClearPage(StatPage *p){
+ statClearCells(p);
sqlite3PagerUnref(p->pPg);
sqlite3_free(p->zPath);
memset(p, 0, sizeof(StatPage));
@@ -176031,22 +192047,33 @@ static int statDecodePage(Btree *pBt, StatPage *p){
u8 *aHdr = &aData[p->iPgno==1 ? 100 : 0];
p->flags = aHdr[0];
+ if( p->flags==0x0A || p->flags==0x0D ){
+ isLeaf = 1;
+ nHdr = 8;
+ }else if( p->flags==0x05 || p->flags==0x02 ){
+ isLeaf = 0;
+ nHdr = 12;
+ }else{
+ goto statPageIsCorrupt;
+ }
+ if( p->iPgno==1 ) nHdr += 100;
p->nCell = get2byte(&aHdr[3]);
p->nMxPayload = 0;
-
- isLeaf = (p->flags==0x0A || p->flags==0x0D);
- nHdr = 12 - isLeaf*4 + (p->iPgno==1)*100;
+ szPage = sqlite3BtreeGetPageSize(pBt);
nUnused = get2byte(&aHdr[5]) - nHdr - 2*p->nCell;
nUnused += (int)aHdr[7];
iOff = get2byte(&aHdr[1]);
while( iOff ){
+ int iNext;
+ if( iOff>=szPage ) goto statPageIsCorrupt;
nUnused += get2byte(&aData[iOff+2]);
- iOff = get2byte(&aData[iOff]);
+ iNext = get2byte(&aData[iOff]);
+ if( iNext<iOff+4 && iNext>0 ) goto statPageIsCorrupt;
+ iOff = iNext;
}
p->nUnused = nUnused;
p->iRightChildPg = isLeaf ? 0 : sqlite3Get4byte(&aHdr[8]);
- szPage = sqlite3BtreeGetPageSize(pBt);
if( p->nCell ){
int i; /* Used to iterate through cells */
@@ -176063,6 +192090,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){
StatCell *pCell = &p->aCell[i];
iOff = get2byte(&aData[nHdr+i*2]);
+ if( iOff<nHdr || iOff>=szPage ) goto statPageIsCorrupt;
if( !isLeaf ){
pCell->iChildPg = sqlite3Get4byte(&aData[iOff]);
iOff += 4;
@@ -176079,13 +192107,14 @@ static int statDecodePage(Btree *pBt, StatPage *p){
}
if( nPayload>(u32)p->nMxPayload ) p->nMxPayload = nPayload;
getLocalPayload(nUsable, p->flags, nPayload, &nLocal);
+ if( nLocal<0 ) goto statPageIsCorrupt;
pCell->nLocal = nLocal;
- assert( nLocal>=0 );
assert( nPayload>=(u32)nLocal );
assert( nLocal<=(nUsable-35) );
if( nPayload>(u32)nLocal ){
int j;
int nOvfl = ((nPayload - nLocal) + nUsable-4 - 1) / (nUsable - 4);
+ if( iOff+nLocal>nUsable ) goto statPageIsCorrupt;
pCell->nLastOvfl = (nPayload-nLocal) - (nOvfl-1) * (nUsable-4);
pCell->nOvfl = nOvfl;
pCell->aOvfl = sqlite3_malloc64(sizeof(u32)*nOvfl);
@@ -176109,6 +192138,11 @@ static int statDecodePage(Btree *pBt, StatPage *p){
}
return SQLITE_OK;
+
+statPageIsCorrupt:
+ p->flags = 0;
+ statClearCells(p);
+ return SQLITE_OK;
}
/*
@@ -176131,7 +192165,7 @@ static void statSizeAndOffset(StatCursor *pCsr){
*/
fd = sqlite3PagerFile(pPager);
x[0] = pCsr->iPageno;
- if( fd->pMethods!=0 && sqlite3OsFileControl(fd, 230440, &x)==SQLITE_OK ){
+ if( sqlite3OsFileControl(fd, 230440, &x)==SQLITE_OK ){
pCsr->iOffset = x[0];
pCsr->szPage = (int)x[1];
}
@@ -176404,6 +192438,7 @@ SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3 *db){
0, /* xSavepoint */
0, /* xRelease */
0, /* xRollbackTo */
+ 0 /* xShadowName */
};
return sqlite3_create_module(db, "dbstat", &dbstat_module, 0);
}
@@ -176457,17 +192492,24 @@ struct DbpageCursor {
sqlite3_vtab_cursor base; /* Base class. Must be first */
int pgno; /* Current page number */
int mxPgno; /* Last page to visit on this scan */
+ Pager *pPager; /* Pager being read/written */
+ DbPage *pPage1; /* Page 1 of the database */
+ int iDb; /* Index of database to analyze */
+ int szPage; /* Size of each page in bytes */
};
struct DbpageTable {
sqlite3_vtab base; /* Base class. Must be first */
sqlite3 *db; /* The database */
- Pager *pPager; /* Pager being read/written */
- int iDb; /* Index of database to analyze */
- int szPage; /* Size of each page in bytes */
- int nPage; /* Number of pages in the file */
};
+/* Columns */
+#define DBPAGE_COLUMN_PGNO 0
+#define DBPAGE_COLUMN_DATA 1
+#define DBPAGE_COLUMN_SCHEMA 2
+
+
+
/*
** Connect to or create a dbpagevfs virtual table.
*/
@@ -176480,19 +192522,7 @@ static int dbpageConnect(
){
DbpageTable *pTab = 0;
int rc = SQLITE_OK;
- int iDb;
- if( argc>=4 ){
- Token nm;
- sqlite3TokenInit(&nm, (char*)argv[3]);
- iDb = sqlite3FindDb(db, &nm);
- if( iDb<0 ){
- *pzErr = sqlite3_mprintf("no such schema: %s", argv[3]);
- return SQLITE_ERROR;
- }
- }else{
- iDb = 0;
- }
rc = sqlite3_declare_vtab(db,
"CREATE TABLE x(pgno INTEGER PRIMARY KEY, data BLOB, schema HIDDEN)");
if( rc==SQLITE_OK ){
@@ -176502,11 +192532,8 @@ static int dbpageConnect(
assert( rc==SQLITE_OK || pTab==0 );
if( rc==SQLITE_OK ){
- Btree *pBt = db->aDb[iDb].pBt;
memset(pTab, 0, sizeof(DbpageTable));
pTab->db = db;
- pTab->iDb = iDb;
- pTab->pPager = pBt ? sqlite3BtreePager(pBt) : 0;
}
*ppVtab = (sqlite3_vtab*)pTab;
@@ -176524,24 +192551,54 @@ static int dbpageDisconnect(sqlite3_vtab *pVtab){
/*
** idxNum:
**
-** 0 full table scan
-** 1 pgno=?1
+** 0 schema=main, full table scan
+** 1 schema=main, pgno=?1
+** 2 schema=?1, full table scan
+** 3 schema=?1, pgno=?2
*/
static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
int i;
- pIdxInfo->estimatedCost = 1.0e6; /* Initial cost estimate */
+ int iPlan = 0;
+
+ /* If there is a schema= constraint, it must be honored. Report a
+ ** ridiculously large estimated cost if the schema= constraint is
+ ** unavailable
+ */
+ for(i=0; i<pIdxInfo->nConstraint; i++){
+ struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[i];
+ if( p->iColumn!=DBPAGE_COLUMN_SCHEMA ) continue;
+ if( p->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
+ if( !p->usable ){
+ /* No solution. */
+ return SQLITE_CONSTRAINT;
+ }
+ iPlan = 2;
+ pIdxInfo->aConstraintUsage[i].argvIndex = 1;
+ pIdxInfo->aConstraintUsage[i].omit = 1;
+ break;
+ }
+
+ /* If we reach this point, it means that either there is no schema=
+ ** constraint (in which case we use the "main" schema) or else the
+ ** schema constraint was accepted. Lower the estimated cost accordingly
+ */
+ pIdxInfo->estimatedCost = 1.0e6;
+
+ /* Check for constraints against pgno */
for(i=0; i<pIdxInfo->nConstraint; i++){
struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[i];
if( p->usable && p->iColumn<=0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
pIdxInfo->estimatedRows = 1;
pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE;
pIdxInfo->estimatedCost = 1.0;
- pIdxInfo->idxNum = 1;
- pIdxInfo->aConstraintUsage[i].argvIndex = 1;
+ pIdxInfo->aConstraintUsage[i].argvIndex = iPlan ? 2 : 1;
pIdxInfo->aConstraintUsage[i].omit = 1;
+ iPlan |= 1;
break;
}
}
+ pIdxInfo->idxNum = iPlan;
+
if( pIdxInfo->nOrderBy>=1
&& pIdxInfo->aOrderBy[0].iColumn<=0
&& pIdxInfo->aOrderBy[0].desc==0
@@ -176575,6 +192632,7 @@ static int dbpageOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
*/
static int dbpageClose(sqlite3_vtab_cursor *pCursor){
DbpageCursor *pCsr = (DbpageCursor *)pCursor;
+ if( pCsr->pPage1 ) sqlite3PagerUnrefPageOne(pCsr->pPage1);
sqlite3_free(pCsr);
return SQLITE_OK;
}
@@ -176594,6 +192652,16 @@ static int dbpageEof(sqlite3_vtab_cursor *pCursor){
return pCsr->pgno > pCsr->mxPgno;
}
+/*
+** idxNum:
+**
+** 0 schema=main, full table scan
+** 1 schema=main, pgno=?1
+** 2 schema=?1, full table scan
+** 3 schema=?1, pgno=?2
+**
+** idxStr is not used
+*/
static int dbpageFilter(
sqlite3_vtab_cursor *pCursor,
int idxNum, const char *idxStr,
@@ -176601,23 +192669,42 @@ static int dbpageFilter(
){
DbpageCursor *pCsr = (DbpageCursor *)pCursor;
DbpageTable *pTab = (DbpageTable *)pCursor->pVtab;
- int rc = SQLITE_OK;
- Btree *pBt = pTab->db->aDb[pTab->iDb].pBt;
+ int rc;
+ sqlite3 *db = pTab->db;
+ Btree *pBt;
- pTab->szPage = sqlite3BtreeGetPageSize(pBt);
- pTab->nPage = sqlite3BtreeLastPage(pBt);
- if( idxNum==1 ){
- pCsr->pgno = sqlite3_value_int(argv[0]);
- if( pCsr->pgno<1 || pCsr->pgno>pTab->nPage ){
+ /* Default setting is no rows of result */
+ pCsr->pgno = 1;
+ pCsr->mxPgno = 0;
+
+ if( idxNum & 2 ){
+ const char *zSchema;
+ assert( argc>=1 );
+ zSchema = (const char*)sqlite3_value_text(argv[0]);
+ pCsr->iDb = sqlite3FindDbName(db, zSchema);
+ if( pCsr->iDb<0 ) return SQLITE_OK;
+ }else{
+ pCsr->iDb = 0;
+ }
+ pBt = db->aDb[pCsr->iDb].pBt;
+ if( pBt==0 ) return SQLITE_OK;
+ pCsr->pPager = sqlite3BtreePager(pBt);
+ pCsr->szPage = sqlite3BtreeGetPageSize(pBt);
+ pCsr->mxPgno = sqlite3BtreeLastPage(pBt);
+ if( idxNum & 1 ){
+ assert( argc>(idxNum>>1) );
+ pCsr->pgno = sqlite3_value_int(argv[idxNum>>1]);
+ if( pCsr->pgno<1 || pCsr->pgno>pCsr->mxPgno ){
pCsr->pgno = 1;
pCsr->mxPgno = 0;
}else{
pCsr->mxPgno = pCsr->pgno;
}
}else{
- pCsr->pgno = 1;
- pCsr->mxPgno = pTab->nPage;
+ assert( pCsr->pgno==1 );
}
+ if( pCsr->pPage1 ) sqlite3PagerUnrefPageOne(pCsr->pPage1);
+ rc = sqlite3PagerGet(pCsr->pPager, 1, &pCsr->pPage1, 0);
return rc;
}
@@ -176627,7 +192714,6 @@ static int dbpageColumn(
int i
){
DbpageCursor *pCsr = (DbpageCursor *)pCursor;
- DbpageTable *pTab = (DbpageTable *)pCursor->pVtab;
int rc = SQLITE_OK;
switch( i ){
case 0: { /* pgno */
@@ -176636,9 +192722,9 @@ static int dbpageColumn(
}
case 1: { /* data */
DbPage *pDbPage = 0;
- rc = sqlite3PagerGet(pTab->pPager, pCsr->pgno, (DbPage**)&pDbPage, 0);
+ rc = sqlite3PagerGet(pCsr->pPager, pCsr->pgno, (DbPage**)&pDbPage, 0);
if( rc==SQLITE_OK ){
- sqlite3_result_blob(ctx, sqlite3PagerGetData(pDbPage), pTab->szPage,
+ sqlite3_result_blob(ctx, sqlite3PagerGetData(pDbPage), pCsr->szPage,
SQLITE_TRANSIENT);
}
sqlite3PagerUnref(pDbPage);
@@ -176646,7 +192732,7 @@ static int dbpageColumn(
}
default: { /* schema */
sqlite3 *db = sqlite3_context_db_handle(ctx);
- sqlite3_result_text(ctx, db->aDb[pTab->iDb].zDbSName, -1, SQLITE_STATIC);
+ sqlite3_result_text(ctx, db->aDb[pCsr->iDb].zDbSName, -1, SQLITE_STATIC);
break;
}
}
@@ -176666,37 +192752,55 @@ static int dbpageUpdate(
sqlite_int64 *pRowid
){
DbpageTable *pTab = (DbpageTable *)pVtab;
- int pgno;
+ Pgno pgno;
DbPage *pDbPage = 0;
int rc = SQLITE_OK;
char *zErr = 0;
+ const char *zSchema;
+ int iDb;
+ Btree *pBt;
+ Pager *pPager;
+ int szPage;
+ if( pTab->db->flags & SQLITE_Defensive ){
+ zErr = "read-only";
+ goto update_fail;
+ }
if( argc==1 ){
zErr = "cannot delete";
goto update_fail;
}
pgno = sqlite3_value_int(argv[0]);
- if( pgno<1 || pgno>pTab->nPage ){
- zErr = "bad page number";
+ if( (Pgno)sqlite3_value_int(argv[1])!=pgno ){
+ zErr = "cannot insert";
goto update_fail;
}
- if( sqlite3_value_int(argv[1])!=pgno ){
- zErr = "cannot insert";
+ zSchema = (const char*)sqlite3_value_text(argv[4]);
+ iDb = zSchema ? sqlite3FindDbName(pTab->db, zSchema) : -1;
+ if( iDb<0 ){
+ zErr = "no such schema";
+ goto update_fail;
+ }
+ pBt = pTab->db->aDb[iDb].pBt;
+ if( pgno<1 || pBt==0 || pgno>(int)sqlite3BtreeLastPage(pBt) ){
+ zErr = "bad page number";
goto update_fail;
}
+ szPage = sqlite3BtreeGetPageSize(pBt);
if( sqlite3_value_type(argv[3])!=SQLITE_BLOB
- || sqlite3_value_bytes(argv[3])!=pTab->szPage
+ || sqlite3_value_bytes(argv[3])!=szPage
){
zErr = "bad page value";
goto update_fail;
}
- rc = sqlite3PagerGet(pTab->pPager, pgno, (DbPage**)&pDbPage, 0);
+ pPager = sqlite3BtreePager(pBt);
+ rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pDbPage, 0);
if( rc==SQLITE_OK ){
rc = sqlite3PagerWrite(pDbPage);
if( rc==SQLITE_OK ){
memcpy(sqlite3PagerGetData(pDbPage),
sqlite3_value_blob(argv[3]),
- pTab->szPage);
+ szPage);
}
}
sqlite3PagerUnref(pDbPage);
@@ -176708,6 +192812,22 @@ update_fail:
return SQLITE_ERROR;
}
+/* Since we do not know in advance which database files will be
+** written by the sqlite_dbpage virtual table, start a write transaction
+** on them all.
+*/
+static int dbpageBegin(sqlite3_vtab *pVtab){
+ DbpageTable *pTab = (DbpageTable *)pVtab;
+ sqlite3 *db = pTab->db;
+ int i;
+ for(i=0; i<db->nDb; i++){
+ Btree *pBt = db->aDb[i].pBt;
+ if( pBt ) sqlite3BtreeBeginTrans(pBt, 1, 0);
+ }
+ return SQLITE_OK;
+}
+
+
/*
** Invoke this routine to register the "dbpage" virtual table module
*/
@@ -176727,7 +192847,7 @@ SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3 *db){
dbpageColumn, /* xColumn - read data */
dbpageRowid, /* xRowid - read data */
dbpageUpdate, /* xUpdate */
- 0, /* xBegin */
+ dbpageBegin, /* xBegin */
0, /* xSync */
0, /* xCommit */
0, /* xRollback */
@@ -176736,6 +192856,7 @@ SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3 *db){
0, /* xSavepoint */
0, /* xRelease */
0, /* xRollbackTo */
+ 0 /* xShadowName */
};
return sqlite3_create_module(db, "sqlite_dbpage", &dbpage_module, 0);
}
@@ -176772,6 +192893,8 @@ typedef struct SessionInput SessionInput;
# endif
#endif
+static int sessions_strm_chunk_size = SESSIONS_STRM_CHUNK_SIZE;
+
typedef struct SessionHook SessionHook;
struct SessionHook {
void *pCtx;
@@ -176793,6 +192916,7 @@ struct sqlite3_session {
int rc; /* Non-zero if an error has occurred */
void *pFilterCtx; /* First argument to pass to xTableFilter */
int (*xTableFilter)(void *pCtx, const char *zTab);
+ sqlite3_value *pZeroBlob; /* Value containing X'' */
sqlite3_session *pNext; /* Next session object on same db. */
SessionTable *pTable; /* List of attached tables */
SessionHook hook; /* APIs to grab new and old data with */
@@ -176814,7 +192938,7 @@ struct SessionBuffer {
** sqlite3changeset_start_strm()).
*/
struct SessionInput {
- int bNoDiscard; /* If true, discard no data */
+ int bNoDiscard; /* If true, do not discard in InputBuffer() */
int iCurrent; /* Offset in aData[] of current change */
int iNext; /* Offset in aData[] of next change */
u8 *aData; /* Pointer to buffer containing changeset */
@@ -176833,6 +192957,7 @@ struct sqlite3_changeset_iter {
SessionInput in; /* Input buffer or stream */
SessionBuffer tblhdr; /* Buffer to hold apValue/zTab/abPK/ */
int bPatchset; /* True if this is a patchset */
+ int bInvert; /* True to invert changeset */
int rc; /* Iterator error code */
sqlite3_stmt *pConflict; /* Points to conflicting row, if any */
char *zTab; /* Current table */
@@ -176860,6 +192985,7 @@ struct SessionTable {
SessionTable *pNext;
char *zName; /* Local name of table */
int nCol; /* Number of columns in table zName */
+ int bStat1; /* True if this is sqlite_stat1 */
const char **azCol; /* Column names */
u8 *abPK; /* Array of primary key flags */
int nEntry; /* Total number of entries in hash table */
@@ -176977,8 +193103,8 @@ struct SessionTable {
** statement.
**
** For a DELETE change, all fields within the record except those associated
-** with PRIMARY KEY columns are set to "undefined". The PRIMARY KEY fields
-** contain the values identifying the row to delete.
+** with PRIMARY KEY columns are omitted. The PRIMARY KEY fields contain the
+** values identifying the row to delete.
**
** For an UPDATE change, all fields except those associated with PRIMARY KEY
** columns and columns that are modified by the UPDATE are set to "undefined".
@@ -176988,6 +193114,42 @@ struct SessionTable {
** The records associated with INSERT changes are in the same format as for
** changesets. It is not possible for a record associated with an INSERT
** change to contain a field set to "undefined".
+**
+** REBASE BLOB FORMAT:
+**
+** A rebase blob may be output by sqlite3changeset_apply_v2() and its
+** streaming equivalent for use with the sqlite3_rebaser APIs to rebase
+** existing changesets. A rebase blob contains one entry for each conflict
+** resolved using either the OMIT or REPLACE strategies within the apply_v2()
+** call.
+**
+** The format used for a rebase blob is very similar to that used for
+** changesets. All entries related to a single table are grouped together.
+**
+** Each group of entries begins with a table header in changeset format:
+**
+** 1 byte: Constant 0x54 (capital 'T')
+** Varint: Number of columns in the table.
+** nCol bytes: 0x01 for PK columns, 0x00 otherwise.
+** N bytes: Unqualified table name (encoded using UTF-8). Nul-terminated.
+**
+** Followed by one or more entries associated with the table.
+**
+** 1 byte: Either SQLITE_INSERT (0x12), DELETE (0x09).
+** 1 byte: Flag. 0x01 for REPLACE, 0x00 for OMIT.
+** record: (in the record format defined above).
+**
+** In a rebase blob, the first field is set to SQLITE_INSERT if the change
+** that caused the conflict was an INSERT or UPDATE, or to SQLITE_DELETE if
+** it was a DELETE. The second field is set to 0x01 if the conflict
+** resolution strategy was REPLACE, or 0x00 if it was OMIT.
+**
+** If the change that caused the conflict was a DELETE, then the single
+** record is a copy of the old.* record from the original changeset. If it
+** was an INSERT, then the single record is a copy of the new.* record. If
+** the conflicting change was an UPDATE, then the single record is a copy
+** of the new.* record with the PK fields filled in based on the original
+** old.* record.
*/
/*
@@ -177243,6 +193405,7 @@ static int sessionPreupdateHash(
h = sessionHashAppendBlob(h, n, z);
}else{
assert( eType==SQLITE_NULL );
+ assert( pTab->bStat1==0 || i!=1 );
*pbNullPK = 1;
}
}
@@ -177260,7 +193423,7 @@ static int sessionPreupdateHash(
static int sessionSerialLen(u8 *a){
int e = *a;
int n;
- if( e==0 ) return 1;
+ if( e==0 || e==0xFF ) return 1;
if( e==SQLITE_NULL ) return 1;
if( e==SQLITE_INTEGER || e==SQLITE_FLOAT ) return 9;
return sessionVarintGet(&a[1], &n) + 1 + n;
@@ -177340,7 +193503,7 @@ static int sessionChangeEqual(
int n1 = sessionSerialLen(a1);
int n2 = sessionSerialLen(a2);
- if( pTab->abPK[iCol] && (n1!=n2 || memcmp(a1, a2, n1)) ){
+ if( n1!=n2 || memcmp(a1, a2, n1) ){
return 0;
}
a1 += n1;
@@ -177583,9 +193746,8 @@ static int sessionPreupdateEqual(
}else{
z = sqlite3_value_blob(pVal);
}
- if( memcmp(a, z, n) ) return 0;
+ if( n>0 && memcmp(a, z, n) ) return 0;
a += n;
- break;
}
}
}
@@ -177641,9 +193803,7 @@ static int sessionGrowHash(int bPatchset, SessionTable *pTab){
/*
** This function queries the database for the names of the columns of table
-** zThis, in schema zDb. It is expected that the table has nCol columns. If
-** not, SQLITE_SCHEMA is returned and none of the output variables are
-** populated.
+** zThis, in schema zDb.
**
** Otherwise, if they are not NULL, variable *pnCol is set to the number
** of columns in the database table and variable *pzTab is set to point to a
@@ -177664,9 +193824,7 @@ static int sessionGrowHash(int bPatchset, SessionTable *pTab){
** *pabPK = {1, 0, 0, 1}
**
** All returned buffers are part of the same single allocation, which must
-** be freed using sqlite3_free() by the caller. If pazCol was not NULL, then
-** pointer *pazCol should be freed to release all memory. Otherwise, pointer
-** *pabPK. It is illegal for both pazCol and pabPK to be NULL.
+** be freed using sqlite3_free() by the caller
*/
static int sessionTableInfo(
sqlite3 *db, /* Database connection */
@@ -177691,7 +193849,23 @@ static int sessionTableInfo(
assert( pazCol && pabPK );
nThis = sqlite3Strlen30(zThis);
- zPragma = sqlite3_mprintf("PRAGMA '%q'.table_info('%q')", zDb, zThis);
+ if( nThis==12 && 0==sqlite3_stricmp("sqlite_stat1", zThis) ){
+ rc = sqlite3_table_column_metadata(db, zDb, zThis, 0, 0, 0, 0, 0, 0);
+ if( rc==SQLITE_OK ){
+ /* For sqlite_stat1, pretend that (tbl,idx) is the PRIMARY KEY. */
+ zPragma = sqlite3_mprintf(
+ "SELECT 0, 'tbl', '', 0, '', 1 UNION ALL "
+ "SELECT 1, 'idx', '', 0, '', 2 UNION ALL "
+ "SELECT 2, 'stat', '', 0, '', 0"
+ );
+ }else if( rc==SQLITE_ERROR ){
+ zPragma = sqlite3_mprintf("");
+ }else{
+ return rc;
+ }
+ }else{
+ zPragma = sqlite3_mprintf("PRAGMA '%q'.table_info('%q')", zDb, zThis);
+ }
if( !zPragma ) return SQLITE_NOMEM;
rc = sqlite3_prepare_v2(db, zPragma, -1, &pStmt, 0);
@@ -177783,12 +193957,56 @@ static int sessionInitTable(sqlite3_session *pSession, SessionTable *pTab){
break;
}
}
+ if( 0==sqlite3_stricmp("sqlite_stat1", pTab->zName) ){
+ pTab->bStat1 = 1;
+ }
}
}
return (pSession->rc || pTab->abPK==0);
}
/*
+** Versions of the four methods in object SessionHook for use with the
+** sqlite_stat1 table. The purpose of this is to substitute a zero-length
+** blob each time a NULL value is read from the "idx" column of the
+** sqlite_stat1 table.
+*/
+typedef struct SessionStat1Ctx SessionStat1Ctx;
+struct SessionStat1Ctx {
+ SessionHook hook;
+ sqlite3_session *pSession;
+};
+static int sessionStat1Old(void *pCtx, int iCol, sqlite3_value **ppVal){
+ SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx;
+ sqlite3_value *pVal = 0;
+ int rc = p->hook.xOld(p->hook.pCtx, iCol, &pVal);
+ if( rc==SQLITE_OK && iCol==1 && sqlite3_value_type(pVal)==SQLITE_NULL ){
+ pVal = p->pSession->pZeroBlob;
+ }
+ *ppVal = pVal;
+ return rc;
+}
+static int sessionStat1New(void *pCtx, int iCol, sqlite3_value **ppVal){
+ SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx;
+ sqlite3_value *pVal = 0;
+ int rc = p->hook.xNew(p->hook.pCtx, iCol, &pVal);
+ if( rc==SQLITE_OK && iCol==1 && sqlite3_value_type(pVal)==SQLITE_NULL ){
+ pVal = p->pSession->pZeroBlob;
+ }
+ *ppVal = pVal;
+ return rc;
+}
+static int sessionStat1Count(void *pCtx){
+ SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx;
+ return p->hook.xCount(p->hook.pCtx);
+}
+static int sessionStat1Depth(void *pCtx){
+ SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx;
+ return p->hook.xDepth(p->hook.pCtx);
+}
+
+
+/*
** This function is only called from with a pre-update-hook reporting a
** change on table pTab (attached to session pSession). The type of change
** (UPDATE, INSERT, DELETE) is specified by the first argument.
@@ -177804,6 +194022,7 @@ static void sessionPreupdateOneChange(
int iHash;
int bNull = 0;
int rc = SQLITE_OK;
+ SessionStat1Ctx stat1 = {0};
if( pSession->rc ) return;
@@ -177823,6 +194042,25 @@ static void sessionPreupdateOneChange(
return;
}
+ if( pTab->bStat1 ){
+ stat1.hook = pSession->hook;
+ stat1.pSession = pSession;
+ pSession->hook.pCtx = (void*)&stat1;
+ pSession->hook.xNew = sessionStat1New;
+ pSession->hook.xOld = sessionStat1Old;
+ pSession->hook.xCount = sessionStat1Count;
+ pSession->hook.xDepth = sessionStat1Depth;
+ if( pSession->pZeroBlob==0 ){
+ sqlite3_value *p = sqlite3ValueNew(0);
+ if( p==0 ){
+ rc = SQLITE_NOMEM;
+ goto error_out;
+ }
+ sqlite3ValueSetStr(p, 0, "", 0, SQLITE_STATIC);
+ pSession->pZeroBlob = p;
+ }
+ }
+
/* Calculate the hash-key for this change. If the primary key of the row
** includes a NULL value, exit early. Such changes are ignored by the
** session module. */
@@ -177912,6 +194150,9 @@ static void sessionPreupdateOneChange(
/* If an error has occurred, mark the session object as failed. */
error_out:
+ if( pTab->bStat1 ){
+ pSession->hook = stat1.hook;
+ }
if( rc!=SQLITE_OK ){
pSession->rc = rc;
}
@@ -178248,7 +194489,6 @@ SQLITE_API int sqlite3session_diff(
if( abPK[i] ) bHasPk = 1;
}
}
-
}
sqlite3_free((char*)azCol);
if( bMismatch ){
@@ -178374,6 +194614,7 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession){
}
}
sqlite3_mutex_leave(sqlite3_db_mutex(db));
+ sqlite3ValueFree(pSession->pZeroBlob);
/* Delete all attached table objects. And the contents of their
** associated hash-tables. */
@@ -178459,12 +194700,12 @@ SQLITE_API int sqlite3session_attach(
static int sessionBufferGrow(SessionBuffer *p, int nByte, int *pRc){
if( *pRc==SQLITE_OK && p->nAlloc-p->nBuf<nByte ){
u8 *aNew;
- int nNew = p->nAlloc ? p->nAlloc : 128;
+ i64 nNew = p->nAlloc ? p->nAlloc : 128;
do {
nNew = nNew*2;
- }while( nNew<(p->nBuf+nByte) );
+ }while( (nNew-p->nBuf)<nByte );
- aNew = (u8 *)sqlite3_realloc(p->aBuf, nNew);
+ aNew = (u8 *)sqlite3_realloc64(p->aBuf, nNew);
if( 0==aNew ){
*pRc = SQLITE_NOMEM;
}else{
@@ -178841,28 +195082,42 @@ static int sessionSelectStmt(
sqlite3_stmt **ppStmt /* OUT: Prepared SELECT statement */
){
int rc = SQLITE_OK;
- int i;
- const char *zSep = "";
- SessionBuffer buf = {0, 0, 0};
+ char *zSql = 0;
+ int nSql = -1;
- sessionAppendStr(&buf, "SELECT * FROM ", &rc);
- sessionAppendIdent(&buf, zDb, &rc);
- sessionAppendStr(&buf, ".", &rc);
- sessionAppendIdent(&buf, zTab, &rc);
- sessionAppendStr(&buf, " WHERE ", &rc);
- for(i=0; i<nCol; i++){
- if( abPK[i] ){
- sessionAppendStr(&buf, zSep, &rc);
- sessionAppendIdent(&buf, azCol[i], &rc);
- sessionAppendStr(&buf, " = ?", &rc);
- sessionAppendInteger(&buf, i+1, &rc);
- zSep = " AND ";
+ if( 0==sqlite3_stricmp("sqlite_stat1", zTab) ){
+ zSql = sqlite3_mprintf(
+ "SELECT tbl, ?2, stat FROM %Q.sqlite_stat1 WHERE tbl IS ?1 AND "
+ "idx IS (CASE WHEN ?2=X'' THEN NULL ELSE ?2 END)", zDb
+ );
+ if( zSql==0 ) rc = SQLITE_NOMEM;
+ }else{
+ int i;
+ const char *zSep = "";
+ SessionBuffer buf = {0, 0, 0};
+
+ sessionAppendStr(&buf, "SELECT * FROM ", &rc);
+ sessionAppendIdent(&buf, zDb, &rc);
+ sessionAppendStr(&buf, ".", &rc);
+ sessionAppendIdent(&buf, zTab, &rc);
+ sessionAppendStr(&buf, " WHERE ", &rc);
+ for(i=0; i<nCol; i++){
+ if( abPK[i] ){
+ sessionAppendStr(&buf, zSep, &rc);
+ sessionAppendIdent(&buf, azCol[i], &rc);
+ sessionAppendStr(&buf, " IS ?", &rc);
+ sessionAppendInteger(&buf, i+1, &rc);
+ zSep = " AND ";
+ }
}
+ zSql = (char*)buf.aBuf;
+ nSql = buf.nBuf;
}
+
if( rc==SQLITE_OK ){
- rc = sqlite3_prepare_v2(db, (char *)buf.aBuf, buf.nBuf, ppStmt, 0);
+ rc = sqlite3_prepare_v2(db, zSql, nSql, ppStmt, 0);
}
- sqlite3_free(buf.aBuf);
+ sqlite3_free(zSql);
return rc;
}
@@ -179048,12 +195303,12 @@ static int sessionGenerateChangeset(
rc = sqlite3_reset(pSel);
}
- /* If the buffer is now larger than SESSIONS_STRM_CHUNK_SIZE, pass
+ /* If the buffer is now larger than sessions_strm_chunk_size, pass
** its contents to the xOutput() callback. */
if( xOutput
&& rc==SQLITE_OK
&& buf.nBuf>nNoop
- && buf.nBuf>SESSIONS_STRM_CHUNK_SIZE
+ && buf.nBuf>sessions_strm_chunk_size
){
rc = xOutput(pOut, (void*)buf.aBuf, buf.nBuf);
nNoop = -1;
@@ -179192,7 +195447,8 @@ static int sessionChangesetStart(
int (*xInput)(void *pIn, void *pData, int *pnData),
void *pIn,
int nChangeset, /* Size of buffer pChangeset in bytes */
- void *pChangeset /* Pointer to buffer containing changeset */
+ void *pChangeset, /* Pointer to buffer containing changeset */
+ int bInvert /* True to invert changeset */
){
sqlite3_changeset_iter *pRet; /* Iterator to return */
int nByte; /* Number of bytes to allocate for iterator */
@@ -179212,6 +195468,7 @@ static int sessionChangesetStart(
pRet->in.xInput = xInput;
pRet->in.pIn = pIn;
pRet->in.bEof = (xInput ? 0 : 1);
+ pRet->bInvert = bInvert;
/* Populate the output variable and return success. */
*pp = pRet;
@@ -179226,7 +195483,16 @@ SQLITE_API int sqlite3changeset_start(
int nChangeset, /* Size of buffer pChangeset in bytes */
void *pChangeset /* Pointer to buffer containing changeset */
){
- return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset);
+ return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset, 0);
+}
+SQLITE_API int sqlite3changeset_start_v2(
+ sqlite3_changeset_iter **pp, /* OUT: Changeset iterator handle */
+ int nChangeset, /* Size of buffer pChangeset in bytes */
+ void *pChangeset, /* Pointer to buffer containing changeset */
+ int flags
+){
+ int bInvert = !!(flags & SQLITE_CHANGESETSTART_INVERT);
+ return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset, bInvert);
}
/*
@@ -179237,7 +195503,16 @@ SQLITE_API int sqlite3changeset_start_strm(
int (*xInput)(void *pIn, void *pData, int *pnData),
void *pIn
){
- return sessionChangesetStart(pp, xInput, pIn, 0, 0);
+ return sessionChangesetStart(pp, xInput, pIn, 0, 0, 0);
+}
+SQLITE_API int sqlite3changeset_start_v2_strm(
+ sqlite3_changeset_iter **pp, /* OUT: Changeset iterator handle */
+ int (*xInput)(void *pIn, void *pData, int *pnData),
+ void *pIn,
+ int flags
+){
+ int bInvert = !!(flags & SQLITE_CHANGESETSTART_INVERT);
+ return sessionChangesetStart(pp, xInput, pIn, 0, 0, bInvert);
}
/*
@@ -179245,7 +195520,7 @@ SQLITE_API int sqlite3changeset_start_strm(
** object and the buffer is full, discard some data to free up space.
*/
static void sessionDiscardData(SessionInput *pIn){
- if( pIn->bEof && pIn->xInput && pIn->iNext>=SESSIONS_STRM_CHUNK_SIZE ){
+ if( pIn->xInput && pIn->iNext>=sessions_strm_chunk_size ){
int nMove = pIn->buf.nBuf - pIn->iNext;
assert( nMove>=0 );
if( nMove>0 ){
@@ -179268,7 +195543,7 @@ static int sessionInputBuffer(SessionInput *pIn, int nByte){
int rc = SQLITE_OK;
if( pIn->xInput ){
while( !pIn->bEof && (pIn->iNext+nByte)>=pIn->nData && rc==SQLITE_OK ){
- int nNew = SESSIONS_STRM_CHUNK_SIZE;
+ int nNew = sessions_strm_chunk_size;
if( pIn->bNoDiscard==0 ) sessionDiscardData(pIn);
if( SQLITE_OK==sessionBufferGrow(&pIn->buf, nNew, &rc) ){
@@ -179373,13 +195648,16 @@ static int sessionReadRecord(
if( abPK && abPK[i]==0 ) continue;
rc = sessionInputBuffer(pIn, 9);
if( rc==SQLITE_OK ){
- eType = pIn->aData[pIn->iNext++];
- }
-
- assert( apOut[i]==0 );
- if( eType ){
- apOut[i] = sqlite3ValueNew(0);
- if( !apOut[i] ) rc = SQLITE_NOMEM;
+ if( pIn->iNext>=pIn->nData ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ eType = pIn->aData[pIn->iNext++];
+ assert( apOut[i]==0 );
+ if( eType ){
+ apOut[i] = sqlite3ValueNew(0);
+ if( !apOut[i] ) rc = SQLITE_NOMEM;
+ }
+ }
}
if( rc==SQLITE_OK ){
@@ -179389,10 +195667,14 @@ static int sessionReadRecord(
pIn->iNext += sessionVarintGet(aVal, &nByte);
rc = sessionInputBuffer(pIn, nByte);
if( rc==SQLITE_OK ){
- u8 enc = (eType==SQLITE_TEXT ? SQLITE_UTF8 : 0);
- rc = sessionValueSetStr(apOut[i],&pIn->aData[pIn->iNext],nByte,enc);
+ if( nByte<0 || nByte>pIn->nData-pIn->iNext ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ u8 enc = (eType==SQLITE_TEXT ? SQLITE_UTF8 : 0);
+ rc = sessionValueSetStr(apOut[i],&pIn->aData[pIn->iNext],nByte,enc);
+ pIn->iNext += nByte;
+ }
}
- pIn->iNext += nByte;
}
if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
sqlite3_int64 v = sessionGetI64(aVal);
@@ -179432,8 +195714,19 @@ static int sessionChangesetBufferTblhdr(SessionInput *pIn, int *pnByte){
rc = sessionInputBuffer(pIn, 9);
if( rc==SQLITE_OK ){
nRead += sessionVarintGet(&pIn->aData[pIn->iNext + nRead], &nCol);
- rc = sessionInputBuffer(pIn, nRead+nCol+100);
- nRead += nCol;
+ /* The hard upper limit for the number of columns in an SQLite
+ ** database table is, according to sqliteLimit.h, 32676. So
+ ** consider any table-header that purports to have more than 65536
+ ** columns to be corrupt. This is convenient because otherwise,
+ ** if the (nCol>65536) condition below were omitted, a sufficiently
+ ** large value for nCol may cause nRead to wrap around and become
+ ** negative. Leading to a crash. */
+ if( nCol<0 || nCol>65536 ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ rc = sessionInputBuffer(pIn, nRead+nCol+100);
+ nRead += nCol;
+ }
}
while( rc==SQLITE_OK ){
@@ -179510,11 +195803,15 @@ static int sessionChangesetReadTblhdr(sqlite3_changeset_iter *p){
int nByte;
int nVarint;
nVarint = sessionVarintGet(&p->in.aData[p->in.iNext], &p->nCol);
- nCopy -= nVarint;
- p->in.iNext += nVarint;
- nByte = p->nCol * sizeof(sqlite3_value*) * 2 + nCopy;
- p->tblhdr.nBuf = 0;
- sessionBufferGrow(&p->tblhdr, nByte, &rc);
+ if( p->nCol>0 ){
+ nCopy -= nVarint;
+ p->in.iNext += nVarint;
+ nByte = p->nCol * sizeof(sqlite3_value*) * 2 + nCopy;
+ p->tblhdr.nBuf = 0;
+ sessionBufferGrow(&p->tblhdr, nByte, &rc);
+ }else{
+ rc = SQLITE_CORRUPT_BKPT;
+ }
}
if( rc==SQLITE_OK ){
@@ -179549,7 +195846,8 @@ static int sessionChangesetReadTblhdr(sqlite3_changeset_iter *p){
static int sessionChangesetNext(
sqlite3_changeset_iter *p, /* Changeset iterator */
u8 **paRec, /* If non-NULL, store record pointer here */
- int *pnRec /* If non-NULL, store size of record here */
+ int *pnRec, /* If non-NULL, store size of record here */
+ int *pbNew /* If non-NULL, true if new table */
){
int i;
u8 op;
@@ -179584,6 +195882,7 @@ static int sessionChangesetNext(
op = p->in.aData[p->in.iNext++];
while( op=='T' || op=='P' ){
+ if( pbNew ) *pbNew = 1;
p->bPatchset = (op=='P');
if( sessionChangesetReadTblhdr(p) ) return p->rc;
if( (p->rc = sessionInputBuffer(&p->in, 2)) ) return p->rc;
@@ -179592,6 +195891,13 @@ static int sessionChangesetNext(
op = p->in.aData[p->in.iNext++];
}
+ if( p->zTab==0 || (p->bPatchset && p->bInvert) ){
+ /* The first record in the changeset is not a table header. Must be a
+ ** corrupt changeset. */
+ assert( p->in.iNext==1 || p->zTab );
+ return (p->rc = SQLITE_CORRUPT_BKPT);
+ }
+
p->op = op;
p->bIndirect = p->in.aData[p->in.iNext++];
if( p->op!=SQLITE_UPDATE && p->op!=SQLITE_DELETE && p->op!=SQLITE_INSERT ){
@@ -179613,33 +195919,39 @@ static int sessionChangesetNext(
*paRec = &p->in.aData[p->in.iNext];
p->in.iNext += *pnRec;
}else{
+ sqlite3_value **apOld = (p->bInvert ? &p->apValue[p->nCol] : p->apValue);
+ sqlite3_value **apNew = (p->bInvert ? p->apValue : &p->apValue[p->nCol]);
/* If this is an UPDATE or DELETE, read the old.* record. */
if( p->op!=SQLITE_INSERT && (p->bPatchset==0 || p->op==SQLITE_DELETE) ){
u8 *abPK = p->bPatchset ? p->abPK : 0;
- p->rc = sessionReadRecord(&p->in, p->nCol, abPK, p->apValue);
+ p->rc = sessionReadRecord(&p->in, p->nCol, abPK, apOld);
if( p->rc!=SQLITE_OK ) return p->rc;
}
/* If this is an INSERT or UPDATE, read the new.* record. */
if( p->op!=SQLITE_DELETE ){
- p->rc = sessionReadRecord(&p->in, p->nCol, 0, &p->apValue[p->nCol]);
+ p->rc = sessionReadRecord(&p->in, p->nCol, 0, apNew);
if( p->rc!=SQLITE_OK ) return p->rc;
}
- if( p->bPatchset && p->op==SQLITE_UPDATE ){
+ if( (p->bPatchset || p->bInvert) && p->op==SQLITE_UPDATE ){
/* If this is an UPDATE that is part of a patchset, then all PK and
** modified fields are present in the new.* record. The old.* record
** is currently completely empty. This block shifts the PK fields from
** new.* to old.*, to accommodate the code that reads these arrays. */
for(i=0; i<p->nCol; i++){
- assert( p->apValue[i]==0 );
- assert( p->abPK[i]==0 || p->apValue[i+p->nCol] );
+ assert( p->bPatchset==0 || p->apValue[i]==0 );
if( p->abPK[i] ){
+ assert( p->apValue[i]==0 );
p->apValue[i] = p->apValue[i+p->nCol];
+ if( p->apValue[i]==0 ) return (p->rc = SQLITE_CORRUPT_BKPT);
p->apValue[i+p->nCol] = 0;
}
}
+ }else if( p->bInvert ){
+ if( p->op==SQLITE_INSERT ) p->op = SQLITE_DELETE;
+ else if( p->op==SQLITE_DELETE ) p->op = SQLITE_INSERT;
}
}
@@ -179655,7 +195967,7 @@ static int sessionChangesetNext(
** callback by changeset_apply().
*/
SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *p){
- return sessionChangesetNext(p, 0, 0);
+ return sessionChangesetNext(p, 0, 0, 0);
}
/*
@@ -179956,7 +196268,7 @@ static int sessionChangesetInvert(
}
assert( rc==SQLITE_OK );
- if( xOutput && sOut.nBuf>=SESSIONS_STRM_CHUNK_SIZE ){
+ if( xOutput && sOut.nBuf>=sessions_strm_chunk_size ){
rc = xOutput(pOut, sOut.aBuf, sOut.nBuf);
sOut.nBuf = 0;
if( rc!=SQLITE_OK ) goto finished_invert;
@@ -180031,9 +196343,12 @@ struct SessionApplyCtx {
int nCol; /* Size of azCol[] and abPK[] arrays */
const char **azCol; /* Array of column names */
u8 *abPK; /* Boolean array - true if column is in PK */
-
+ int bStat1; /* True if table is sqlite_stat1 */
int bDeferConstraints; /* True to defer constraints */
SessionBuffer constraints; /* Deferred constraints are stored here */
+ SessionBuffer rebase; /* Rebase information (if any) here */
+ u8 bRebaseStarted; /* If table header is already in rebase */
+ u8 bRebase; /* True to collect rebase information */
};
/*
@@ -180201,6 +196516,7 @@ static int sessionUpdateRow(
return rc;
}
+
/*
** Formulate and prepare an SQL statement to query table zTab by primary
** key. Assuming the following table structure:
@@ -180262,6 +196578,46 @@ static int sessionInsertRow(
return rc;
}
+static int sessionPrepare(sqlite3 *db, sqlite3_stmt **pp, const char *zSql){
+ return sqlite3_prepare_v2(db, zSql, -1, pp, 0);
+}
+
+/*
+** Prepare statements for applying changes to the sqlite_stat1 table.
+** These are similar to those created by sessionSelectRow(),
+** sessionInsertRow(), sessionUpdateRow() and sessionDeleteRow() for
+** other tables.
+*/
+static int sessionStat1Sql(sqlite3 *db, SessionApplyCtx *p){
+ int rc = sessionSelectRow(db, "sqlite_stat1", p);
+ if( rc==SQLITE_OK ){
+ rc = sessionPrepare(db, &p->pInsert,
+ "INSERT INTO main.sqlite_stat1 VALUES(?1, "
+ "CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END, "
+ "?3)"
+ );
+ }
+ if( rc==SQLITE_OK ){
+ rc = sessionPrepare(db, &p->pUpdate,
+ "UPDATE main.sqlite_stat1 SET "
+ "tbl = CASE WHEN ?2 THEN ?3 ELSE tbl END, "
+ "idx = CASE WHEN ?5 THEN ?6 ELSE idx END, "
+ "stat = CASE WHEN ?8 THEN ?9 ELSE stat END "
+ "WHERE tbl=?1 AND idx IS "
+ "CASE WHEN length(?4)=0 AND typeof(?4)='blob' THEN NULL ELSE ?4 END "
+ "AND (?10 OR ?8=0 OR stat IS ?7)"
+ );
+ }
+ if( rc==SQLITE_OK ){
+ rc = sessionPrepare(db, &p->pDelete,
+ "DELETE FROM main.sqlite_stat1 WHERE tbl=?1 AND idx IS "
+ "CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END "
+ "AND (?4 OR stat IS ?3)"
+ );
+ }
+ return rc;
+}
+
/*
** A wrapper around sqlite3_bind_value() that detects an extra problem.
** See comments in the body of this function for details.
@@ -180319,7 +196675,13 @@ static int sessionBindRow(
if( !abPK || abPK[i] ){
sqlite3_value *pVal;
(void)xValue(pIter, i, &pVal);
- rc = sessionBindValue(pStmt, i+1, pVal);
+ if( pVal==0 ){
+ /* The value in the changeset was "undefined". This indicates a
+ ** corrupt changeset blob. */
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ rc = sessionBindValue(pStmt, i+1, pVal);
+ }
}
}
return rc;
@@ -180368,6 +196730,55 @@ static int sessionSeekToRow(
}
/*
+** This function is called from within sqlite3changset_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
+** SessionApplyCtx.rebase, which will eventually be returned to the caller
+** of apply_v2() as the "rebase" buffer.
+**
+** Return SQLITE_OK if successful, or an SQLite error code otherwise.
+*/
+static int sessionRebaseAdd(
+ SessionApplyCtx *p, /* Apply context */
+ int eType, /* Conflict resolution (OMIT or REPLACE) */
+ sqlite3_changeset_iter *pIter /* Iterator pointing at current change */
+){
+ int rc = SQLITE_OK;
+ if( p->bRebase ){
+ int i;
+ int eOp = pIter->op;
+ if( p->bRebaseStarted==0 ){
+ /* Append a table-header to the rebase buffer */
+ const char *zTab = pIter->zTab;
+ sessionAppendByte(&p->rebase, 'T', &rc);
+ sessionAppendVarint(&p->rebase, p->nCol, &rc);
+ sessionAppendBlob(&p->rebase, p->abPK, p->nCol, &rc);
+ sessionAppendBlob(&p->rebase, (u8*)zTab, (int)strlen(zTab)+1, &rc);
+ p->bRebaseStarted = 1;
+ }
+
+ assert( eType==SQLITE_CHANGESET_REPLACE||eType==SQLITE_CHANGESET_OMIT );
+ assert( eOp==SQLITE_DELETE || eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE );
+
+ sessionAppendByte(&p->rebase,
+ (eOp==SQLITE_DELETE ? SQLITE_DELETE : SQLITE_INSERT), &rc
+ );
+ sessionAppendByte(&p->rebase, (eType==SQLITE_CHANGESET_REPLACE), &rc);
+ for(i=0; i<p->nCol; i++){
+ sqlite3_value *pVal = 0;
+ if( eOp==SQLITE_DELETE || (eOp==SQLITE_UPDATE && p->abPK[i]) ){
+ sqlite3changeset_old(pIter, i, &pVal);
+ }else{
+ sqlite3changeset_new(pIter, i, &pVal);
+ }
+ sessionAppendValue(&p->rebase, pVal, &rc);
+ }
+ }
+ return rc;
+}
+
+/*
** Invoke the conflict handler for the change that the changeset iterator
** currently points to.
**
@@ -180442,7 +196853,7 @@ static int sessionConflictHandler(
u8 *aBlob = &pIter->in.aData[pIter->in.iCurrent];
int nBlob = pIter->in.iNext - pIter->in.iCurrent;
sessionAppendBlob(&p->constraints, aBlob, nBlob, &rc);
- res = SQLITE_CHANGESET_OMIT;
+ return SQLITE_OK;
}else{
/* No other row with the new.* primary key. */
res = xConflict(pCtx, eType+1, pIter);
@@ -180468,6 +196879,9 @@ static int sessionConflictHandler(
rc = SQLITE_MISUSE;
break;
}
+ if( rc==SQLITE_OK ){
+ rc = sessionRebaseAdd(p, res, pIter);
+ }
}
return rc;
@@ -180592,11 +197006,25 @@ static int sessionApplyOneOp(
}else{
assert( op==SQLITE_INSERT );
- rc = sessionBindRow(pIter, sqlite3changeset_new, nCol, 0, p->pInsert);
- if( rc!=SQLITE_OK ) return rc;
+ if( p->bStat1 ){
+ /* Check if there is a conflicting row. For sqlite_stat1, this needs
+ ** to be done using a SELECT, as there is no PRIMARY KEY in the
+ ** database schema to throw an exception if a duplicate is inserted. */
+ rc = sessionSeekToRow(p->db, pIter, p->abPK, p->pSelect);
+ if( rc==SQLITE_ROW ){
+ rc = SQLITE_CONSTRAINT;
+ sqlite3_reset(p->pSelect);
+ }
+ }
+
+ if( rc==SQLITE_OK ){
+ rc = sessionBindRow(pIter, sqlite3changeset_new, nCol, 0, p->pInsert);
+ if( rc!=SQLITE_OK ) return rc;
+
+ sqlite3_step(p->pInsert);
+ rc = sqlite3_reset(p->pInsert);
+ }
- sqlite3_step(p->pInsert);
- rc = sqlite3_reset(p->pInsert);
if( (rc&0xff)==SQLITE_CONSTRAINT ){
rc = sessionConflictHandler(
SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, pbReplace
@@ -180629,42 +197057,42 @@ static int sessionApplyOneWithRetry(
int rc;
rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, &bReplace, &bRetry);
- assert( rc==SQLITE_OK || (bRetry==0 && bReplace==0) );
-
- /* If the bRetry flag is set, the change has not been applied due to an
- ** SQLITE_CHANGESET_DATA problem (i.e. this is an UPDATE or DELETE and
- ** a row with the correct PK is present in the db, but one or more other
- ** fields do not contain the expected values) and the conflict handler
- ** returned SQLITE_CHANGESET_REPLACE. In this case retry the operation,
- ** but pass NULL as the final argument so that sessionApplyOneOp() ignores
- ** the SQLITE_CHANGESET_DATA problem. */
- if( bRetry ){
- assert( pIter->op==SQLITE_UPDATE || pIter->op==SQLITE_DELETE );
- rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0);
- }
-
- /* If the bReplace flag is set, the change is an INSERT that has not
- ** been performed because the database already contains a row with the
- ** specified primary key and the conflict handler returned
- ** SQLITE_CHANGESET_REPLACE. In this case remove the conflicting row
- ** before reattempting the INSERT. */
- else if( bReplace ){
- assert( pIter->op==SQLITE_INSERT );
- rc = sqlite3_exec(db, "SAVEPOINT replace_op", 0, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sessionBindRow(pIter,
- sqlite3changeset_new, pApply->nCol, pApply->abPK, pApply->pDelete);
- sqlite3_bind_int(pApply->pDelete, pApply->nCol+1, 1);
- }
- if( rc==SQLITE_OK ){
- sqlite3_step(pApply->pDelete);
- rc = sqlite3_reset(pApply->pDelete);
- }
- if( rc==SQLITE_OK ){
+ if( rc==SQLITE_OK ){
+ /* If the bRetry flag is set, the change has not been applied due to an
+ ** SQLITE_CHANGESET_DATA problem (i.e. this is an UPDATE or DELETE and
+ ** a row with the correct PK is present in the db, but one or more other
+ ** fields do not contain the expected values) and the conflict handler
+ ** returned SQLITE_CHANGESET_REPLACE. In this case retry the operation,
+ ** but pass NULL as the final argument so that sessionApplyOneOp() ignores
+ ** the SQLITE_CHANGESET_DATA problem. */
+ if( bRetry ){
+ assert( pIter->op==SQLITE_UPDATE || pIter->op==SQLITE_DELETE );
rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0);
}
- if( rc==SQLITE_OK ){
- rc = sqlite3_exec(db, "RELEASE replace_op", 0, 0, 0);
+
+ /* If the bReplace flag is set, the change is an INSERT that has not
+ ** been performed because the database already contains a row with the
+ ** specified primary key and the conflict handler returned
+ ** SQLITE_CHANGESET_REPLACE. In this case remove the conflicting row
+ ** before reattempting the INSERT. */
+ else if( bReplace ){
+ assert( pIter->op==SQLITE_INSERT );
+ rc = sqlite3_exec(db, "SAVEPOINT replace_op", 0, 0, 0);
+ if( rc==SQLITE_OK ){
+ rc = sessionBindRow(pIter,
+ sqlite3changeset_new, pApply->nCol, pApply->abPK, pApply->pDelete);
+ sqlite3_bind_int(pApply->pDelete, pApply->nCol+1, 1);
+ }
+ if( rc==SQLITE_OK ){
+ sqlite3_step(pApply->pDelete);
+ rc = sqlite3_reset(pApply->pDelete);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_exec(db, "RELEASE replace_op", 0, 0, 0);
+ }
}
}
@@ -180689,7 +197117,7 @@ static int sessionRetryConstraints(
SessionBuffer cons = pApply->constraints;
memset(&pApply->constraints, 0, sizeof(SessionBuffer));
- rc = sessionChangesetStart(&pIter2, 0, 0, cons.nBuf, cons.aBuf);
+ rc = sessionChangesetStart(&pIter2, 0, 0, cons.nBuf, cons.aBuf, 0);
if( rc==SQLITE_OK ){
int nByte = 2*pApply->nCol*sizeof(sqlite3_value*);
int rc2;
@@ -180740,10 +197168,12 @@ static int sessionChangesetApply(
int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
sqlite3_changeset_iter *p /* Handle describing change and conflict */
),
- void *pCtx /* First argument passed to xConflict */
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase, /* OUT: Rebase information */
+ int flags /* SESSION_APPLY_XXX flags */
){
int schemaMismatch = 0;
- int rc; /* Return code */
+ int rc = SQLITE_OK; /* Return code */
const char *zTab = 0; /* Name of current table */
int nTab = 0; /* Result of sqlite3Strlen30(zTab) */
SessionApplyCtx sApply; /* changeset_apply() context object */
@@ -180753,8 +197183,11 @@ static int sessionChangesetApply(
pIter->in.bNoDiscard = 1;
memset(&sApply, 0, sizeof(sApply));
+ sApply.bRebase = (ppRebase && pnRebase);
sqlite3_mutex_enter(sqlite3_db_mutex(db));
- rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0);
+ if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){
+ rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0);
+ }
if( rc==SQLITE_OK ){
rc = sqlite3_exec(db, "PRAGMA defer_foreign_keys = 1", 0, 0, 0);
}
@@ -180778,9 +197211,18 @@ static int sessionChangesetApply(
sqlite3_finalize(sApply.pUpdate);
sqlite3_finalize(sApply.pInsert);
sqlite3_finalize(sApply.pSelect);
- memset(&sApply, 0, sizeof(sApply));
sApply.db = db;
+ sApply.pDelete = 0;
+ sApply.pUpdate = 0;
+ sApply.pInsert = 0;
+ sApply.pSelect = 0;
+ sApply.nCol = 0;
+ sApply.azCol = 0;
+ sApply.abPK = 0;
+ sApply.bStat1 = 0;
sApply.bDeferConstraints = 1;
+ sApply.bRebaseStarted = 0;
+ memset(&sApply.constraints, 0, sizeof(SessionBuffer));
/* If an xFilter() callback was specified, invoke it now. If the
** xFilter callback returns zero, skip this table. If it returns
@@ -180829,12 +197271,20 @@ static int sessionChangesetApply(
}
else{
sApply.nCol = nCol;
- if((rc = sessionSelectRow(db, zTab, &sApply))
- || (rc = sessionUpdateRow(db, zTab, &sApply))
- || (rc = sessionDeleteRow(db, zTab, &sApply))
- || (rc = sessionInsertRow(db, zTab, &sApply))
- ){
- break;
+ if( 0==sqlite3_stricmp(zTab, "sqlite_stat1") ){
+ if( (rc = sessionStat1Sql(db, &sApply) ) ){
+ break;
+ }
+ sApply.bStat1 = 1;
+ }else{
+ if((rc = sessionSelectRow(db, zTab, &sApply))
+ || (rc = sessionUpdateRow(db, zTab, &sApply))
+ || (rc = sessionDeleteRow(db, zTab, &sApply))
+ || (rc = sessionInsertRow(db, zTab, &sApply))
+ ){
+ break;
+ }
+ sApply.bStat1 = 0;
}
}
nTab = sqlite3Strlen30(zTab);
@@ -180875,24 +197325,65 @@ static int sessionChangesetApply(
}
sqlite3_exec(db, "PRAGMA defer_foreign_keys = 0", 0, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
- }else{
- sqlite3_exec(db, "ROLLBACK TO changeset_apply", 0, 0, 0);
- sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
+ if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
+ }else{
+ sqlite3_exec(db, "ROLLBACK TO changeset_apply", 0, 0, 0);
+ sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0);
+ }
}
+ assert( sApply.bRebase || sApply.rebase.nBuf==0 );
+ if( rc==SQLITE_OK && bPatchset==0 && sApply.bRebase ){
+ *ppRebase = (void*)sApply.rebase.aBuf;
+ *pnRebase = sApply.rebase.nBuf;
+ sApply.rebase.aBuf = 0;
+ }
sqlite3_finalize(sApply.pInsert);
sqlite3_finalize(sApply.pDelete);
sqlite3_finalize(sApply.pUpdate);
sqlite3_finalize(sApply.pSelect);
sqlite3_free((char*)sApply.azCol); /* cast works around VC++ bug */
sqlite3_free((char*)sApply.constraints.aBuf);
+ sqlite3_free((char*)sApply.rebase.aBuf);
sqlite3_mutex_leave(sqlite3_db_mutex(db));
return rc;
}
/*
+** Apply the changeset passed via pChangeset/nChangeset to the main
+** database attached to handle "db".
+*/
+SQLITE_API int sqlite3changeset_apply_v2(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int nChangeset, /* Size of changeset in bytes */
+ void *pChangeset, /* Changeset blob */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase,
+ int flags
+){
+ sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */
+ int bInverse = !!(flags & SQLITE_CHANGESETAPPLY_INVERT);
+ int rc = sessionChangesetStart(&pIter, 0, 0, nChangeset, pChangeset,bInverse);
+ if( rc==SQLITE_OK ){
+ rc = sessionChangesetApply(
+ db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags
+ );
+ }
+ return rc;
+}
+
+/*
** Apply the changeset passed via pChangeset/nChangeset to the main database
** attached to handle "db". Invoke the supplied conflict handler callback
** to resolve any conflicts encountered while applying the change.
@@ -180912,12 +197403,9 @@ SQLITE_API int sqlite3changeset_apply(
),
void *pCtx /* First argument passed to xConflict */
){
- sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */
- int rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset);
- if( rc==SQLITE_OK ){
- rc = sessionChangesetApply(db, pIter, xFilter, xConflict, pCtx);
- }
- return rc;
+ return sqlite3changeset_apply_v2(
+ db, nChangeset, pChangeset, xFilter, xConflict, pCtx, 0, 0, 0
+ );
}
/*
@@ -180925,7 +197413,7 @@ SQLITE_API int sqlite3changeset_apply(
** attached to handle "db". Invoke the supplied conflict handler callback
** to resolve any conflicts encountered while applying the change.
*/
-SQLITE_API int sqlite3changeset_apply_strm(
+SQLITE_API int sqlite3changeset_apply_v2_strm(
sqlite3 *db, /* Apply change to "main" db of this handle */
int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
void *pIn, /* First arg for xInput */
@@ -180938,15 +197426,39 @@ SQLITE_API int sqlite3changeset_apply_strm(
int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
sqlite3_changeset_iter *p /* Handle describing change and conflict */
),
- void *pCtx /* First argument passed to xConflict */
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase,
+ int flags
){
sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */
- int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn);
+ int bInverse = !!(flags & SQLITE_CHANGESETAPPLY_INVERT);
+ int rc = sessionChangesetStart(&pIter, xInput, pIn, 0, 0, bInverse);
if( rc==SQLITE_OK ){
- rc = sessionChangesetApply(db, pIter, xFilter, xConflict, pCtx);
+ rc = sessionChangesetApply(
+ db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags
+ );
}
return rc;
}
+SQLITE_API int sqlite3changeset_apply_strm(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
+ void *pIn, /* First arg for xInput */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx /* First argument passed to xConflict */
+){
+ return sqlite3changeset_apply_v2_strm(
+ db, xInput, pIn, xFilter, xConflict, pCtx, 0, 0, 0
+ );
+}
/*
** sqlite3_changegroup handle.
@@ -180964,6 +197476,7 @@ struct sqlite3_changegroup {
*/
static int sessionChangeMerge(
SessionTable *pTab, /* Table structure */
+ int bRebase, /* True for a rebase hash-table */
int bPatchset, /* True for patchsets */
SessionChange *pExist, /* Existing change */
int op2, /* Second change operation */
@@ -180973,6 +197486,7 @@ static int sessionChangeMerge(
SessionChange **ppNew /* OUT: Merged change */
){
SessionChange *pNew = 0;
+ int rc = SQLITE_OK;
if( !pExist ){
pNew = (SessionChange *)sqlite3_malloc(sizeof(SessionChange) + nRec);
@@ -180982,9 +197496,66 @@ static int sessionChangeMerge(
memset(pNew, 0, sizeof(SessionChange));
pNew->op = op2;
pNew->bIndirect = bIndirect;
- pNew->nRecord = nRec;
pNew->aRecord = (u8*)&pNew[1];
- memcpy(pNew->aRecord, aRec, nRec);
+ if( bIndirect==0 || bRebase==0 ){
+ pNew->nRecord = nRec;
+ memcpy(pNew->aRecord, aRec, nRec);
+ }else{
+ int i;
+ u8 *pIn = aRec;
+ u8 *pOut = pNew->aRecord;
+ for(i=0; i<pTab->nCol; i++){
+ int nIn = sessionSerialLen(pIn);
+ if( *pIn==0 ){
+ *pOut++ = 0;
+ }else if( pTab->abPK[i]==0 ){
+ *pOut++ = 0xFF;
+ }else{
+ memcpy(pOut, pIn, nIn);
+ pOut += nIn;
+ }
+ pIn += nIn;
+ }
+ pNew->nRecord = pOut - pNew->aRecord;
+ }
+ }else if( bRebase ){
+ if( pExist->op==SQLITE_DELETE && pExist->bIndirect ){
+ *ppNew = pExist;
+ }else{
+ int nByte = nRec + pExist->nRecord + sizeof(SessionChange);
+ pNew = (SessionChange*)sqlite3_malloc(nByte);
+ if( pNew==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ int i;
+ u8 *a1 = pExist->aRecord;
+ u8 *a2 = aRec;
+ u8 *pOut;
+
+ memset(pNew, 0, nByte);
+ pNew->bIndirect = bIndirect || pExist->bIndirect;
+ pNew->op = op2;
+ pOut = pNew->aRecord = (u8*)&pNew[1];
+
+ for(i=0; i<pTab->nCol; i++){
+ int n1 = sessionSerialLen(a1);
+ int n2 = sessionSerialLen(a2);
+ if( *a1==0xFF || (pTab->abPK[i]==0 && bIndirect) ){
+ *pOut++ = 0xFF;
+ }else if( *a2==0 ){
+ memcpy(pOut, a1, n1);
+ pOut += n1;
+ }else{
+ memcpy(pOut, a2, n2);
+ pOut += n2;
+ }
+ a1 += n1;
+ a2 += n2;
+ }
+ pNew->nRecord = pOut - pNew->aRecord;
+ }
+ sqlite3_free(pExist);
+ }
}else{
int op1 = pExist->op;
@@ -181078,7 +197649,7 @@ static int sessionChangeMerge(
}
*ppNew = pNew;
- return SQLITE_OK;
+ return rc;
}
/*
@@ -181087,15 +197658,15 @@ static int sessionChangeMerge(
*/
static int sessionChangesetToHash(
sqlite3_changeset_iter *pIter, /* Iterator to read from */
- sqlite3_changegroup *pGrp /* Changegroup object to add changeset to */
+ sqlite3_changegroup *pGrp, /* Changegroup object to add changeset to */
+ int bRebase /* True if hash table is for rebasing */
){
u8 *aRec;
int nRec;
int rc = SQLITE_OK;
SessionTable *pTab = 0;
-
- while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec) ){
+ while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, 0) ){
const char *zNew;
int nCol;
int op;
@@ -181175,7 +197746,7 @@ static int sessionChangesetToHash(
}
}
- rc = sessionChangeMerge(pTab,
+ rc = sessionChangeMerge(pTab, bRebase,
pIter->bPatchset, pExist, op, bIndirect, aRec, nRec, &pChange
);
if( rc ) break;
@@ -181234,13 +197805,12 @@ static int sessionChangegroupOutput(
sessionAppendByte(&buf, p->op, &rc);
sessionAppendByte(&buf, p->bIndirect, &rc);
sessionAppendBlob(&buf, p->aRecord, p->nRecord, &rc);
+ if( rc==SQLITE_OK && xOutput && buf.nBuf>=sessions_strm_chunk_size ){
+ rc = xOutput(pOut, buf.aBuf, buf.nBuf);
+ buf.nBuf = 0;
+ }
}
}
-
- if( rc==SQLITE_OK && xOutput && buf.nBuf>=SESSIONS_STRM_CHUNK_SIZE ){
- rc = xOutput(pOut, buf.aBuf, buf.nBuf);
- buf.nBuf = 0;
- }
}
if( rc==SQLITE_OK ){
@@ -181283,7 +197853,7 @@ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup *pGrp, int nData, void
rc = sqlite3changeset_start(&pIter, nData, pData);
if( rc==SQLITE_OK ){
- rc = sessionChangesetToHash(pIter, pGrp);
+ rc = sessionChangesetToHash(pIter, pGrp, 0);
}
sqlite3changeset_finalize(pIter);
return rc;
@@ -181314,7 +197884,7 @@ SQLITE_API int sqlite3changegroup_add_strm(
rc = sqlite3changeset_start_strm(&pIter, xInput, pIn);
if( rc==SQLITE_OK ){
- rc = sessionChangesetToHash(pIter, pGrp);
+ rc = sessionChangesetToHash(pIter, pGrp, 0);
}
sqlite3changeset_finalize(pIter);
return rc;
@@ -181399,2439 +197969,373 @@ SQLITE_API int sqlite3changeset_concat_strm(
return rc;
}
-#endif /* SQLITE_ENABLE_SESSION && SQLITE_ENABLE_PREUPDATE_HOOK */
-
-/************** End of sqlite3session.c **************************************/
-/************** Begin file json1.c *******************************************/
-/*
-** 2015-08-12
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-******************************************************************************
-**
-** This SQLite extension implements JSON functions. The interface is
-** modeled after MySQL JSON functions:
-**
-** https://dev.mysql.com/doc/refman/5.7/en/json.html
-**
-** For the time being, all JSON is stored as pure text. (We might add
-** a JSONB type in the future which stores a binary encoding of JSON in
-** a BLOB, but there is no support for JSONB in the current implementation.
-** This implementation parses JSON text at 250 MB/s, so it is hard to see
-** how JSONB might improve on that.)
-*/
-#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1)
-#if !defined(SQLITEINT_H)
-/* #include "sqlite3ext.h" */
-#endif
-SQLITE_EXTENSION_INIT1
-/* #include <assert.h> */
-/* #include <string.h> */
-/* #include <stdlib.h> */
-/* #include <stdarg.h> */
-
-/* Mark a function parameter as unused, to suppress nuisance compiler
-** warnings. */
-#ifndef UNUSED_PARAM
-# define UNUSED_PARAM(X) (void)(X)
-#endif
-
-#ifndef LARGEST_INT64
-# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32))
-# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64)
-#endif
-
/*
-** Versions of isspace(), isalnum() and isdigit() to which it is safe
-** to pass signed char values.
+** Changeset rebaser handle.
*/
-#ifdef sqlite3Isdigit
- /* Use the SQLite core versions if this routine is part of the
- ** SQLite amalgamation */
-# define safe_isdigit(x) sqlite3Isdigit(x)
-# define safe_isalnum(x) sqlite3Isalnum(x)
-# define safe_isxdigit(x) sqlite3Isxdigit(x)
-#else
- /* Use the standard library for separate compilation */
-#include <ctype.h> /* amalgamator: keep */
-# define safe_isdigit(x) isdigit((unsigned char)(x))
-# define safe_isalnum(x) isalnum((unsigned char)(x))
-# define safe_isxdigit(x) isxdigit((unsigned char)(x))
-#endif
-
-/*
-** Growing our own isspace() routine this way is twice as fast as
-** the library isspace() function, resulting in a 7% overall performance
-** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os).
-*/
-static const char jsonIsSpace[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+struct sqlite3_rebaser {
+ sqlite3_changegroup grp; /* Hash table */
};
-#define safe_isspace(x) (jsonIsSpace[(unsigned char)x])
-
-#ifndef SQLITE_AMALGAMATION
- /* Unsigned integer types. These are already defined in the sqliteInt.h,
- ** but the definitions need to be repeated for separate compilation. */
- typedef sqlite3_uint64 u64;
- typedef unsigned int u32;
- typedef unsigned short int u16;
- typedef unsigned char u8;
-#endif
-
-/* Objects */
-typedef struct JsonString JsonString;
-typedef struct JsonNode JsonNode;
-typedef struct JsonParse JsonParse;
-
-/* An instance of this object represents a JSON string
-** under construction. Really, this is a generic string accumulator
-** that can be and is used to create strings other than JSON.
-*/
-struct JsonString {
- sqlite3_context *pCtx; /* Function context - put error messages here */
- char *zBuf; /* Append JSON content here */
- u64 nAlloc; /* Bytes of storage available in zBuf[] */
- u64 nUsed; /* Bytes of zBuf[] currently used */
- u8 bStatic; /* True if zBuf is static space */
- u8 bErr; /* True if an error has been encountered */
- char zSpace[100]; /* Initial static space */
-};
-
-/* JSON type values
-*/
-#define JSON_NULL 0
-#define JSON_TRUE 1
-#define JSON_FALSE 2
-#define JSON_INT 3
-#define JSON_REAL 4
-#define JSON_STRING 5
-#define JSON_ARRAY 6
-#define JSON_OBJECT 7
-
-/* The "subtype" set for JSON values */
-#define JSON_SUBTYPE 74 /* Ascii for "J" */
-
-/*
-** Names of the various JSON types:
-*/
-static const char * const jsonType[] = {
- "null", "true", "false", "integer", "real", "text", "array", "object"
-};
-
-/* Bit values for the JsonNode.jnFlag field
-*/
-#define JNODE_RAW 0x01 /* Content is raw, not JSON encoded */
-#define JNODE_ESCAPE 0x02 /* Content is text with \ escapes */
-#define JNODE_REMOVE 0x04 /* Do not output */
-#define JNODE_REPLACE 0x08 /* Replace with JsonNode.u.iReplace */
-#define JNODE_PATCH 0x10 /* Patch with JsonNode.u.pPatch */
-#define JNODE_APPEND 0x20 /* More ARRAY/OBJECT entries at u.iAppend */
-#define JNODE_LABEL 0x40 /* Is a label of an object */
-
-
-/* A single node of parsed JSON
-*/
-struct JsonNode {
- u8 eType; /* One of the JSON_ type values */
- u8 jnFlags; /* JNODE flags */
- u32 n; /* Bytes of content, or number of sub-nodes */
- union {
- const char *zJContent; /* Content for INT, REAL, and STRING */
- u32 iAppend; /* More terms for ARRAY and OBJECT */
- u32 iKey; /* Key for ARRAY objects in json_tree() */
- u32 iReplace; /* Replacement content for JNODE_REPLACE */
- JsonNode *pPatch; /* Node chain of patch for JNODE_PATCH */
- } u;
-};
-
-/* A completely parsed JSON string
-*/
-struct JsonParse {
- u32 nNode; /* Number of slots of aNode[] used */
- u32 nAlloc; /* Number of slots of aNode[] allocated */
- JsonNode *aNode; /* Array of nodes containing the parse */
- const char *zJson; /* Original JSON string */
- u32 *aUp; /* Index of parent of each node */
- u8 oom; /* Set to true if out of memory */
- u8 nErr; /* Number of errors seen */
- u16 iDepth; /* Nesting depth */
- int nJson; /* Length of the zJson string in bytes */
-};
-
-/*
-** Maximum nesting depth of JSON for this implementation.
-**
-** This limit is needed to avoid a stack overflow in the recursive
-** descent parser. A depth of 2000 is far deeper than any sane JSON
-** should go.
-*/
-#define JSON_MAX_DEPTH 2000
-
-/**************************************************************************
-** Utility routines for dealing with JsonString objects
-**************************************************************************/
-
-/* Set the JsonString object to an empty string
-*/
-static void jsonZero(JsonString *p){
- p->zBuf = p->zSpace;
- p->nAlloc = sizeof(p->zSpace);
- p->nUsed = 0;
- p->bStatic = 1;
-}
-
-/* Initialize the JsonString object
-*/
-static void jsonInit(JsonString *p, sqlite3_context *pCtx){
- p->pCtx = pCtx;
- p->bErr = 0;
- jsonZero(p);
-}
-
-
-/* Free all allocated memory and reset the JsonString object back to its
-** initial state.
-*/
-static void jsonReset(JsonString *p){
- if( !p->bStatic ) sqlite3_free(p->zBuf);
- jsonZero(p);
-}
-
-
-/* Report an out-of-memory (OOM) condition
-*/
-static void jsonOom(JsonString *p){
- p->bErr = 1;
- sqlite3_result_error_nomem(p->pCtx);
- jsonReset(p);
-}
-
-/* Enlarge pJson->zBuf so that it can hold at least N more bytes.
-** Return zero on success. Return non-zero on an OOM error
-*/
-static int jsonGrow(JsonString *p, u32 N){
- u64 nTotal = N<p->nAlloc ? p->nAlloc*2 : p->nAlloc+N+10;
- char *zNew;
- if( p->bStatic ){
- if( p->bErr ) return 1;
- zNew = sqlite3_malloc64(nTotal);
- if( zNew==0 ){
- jsonOom(p);
- return SQLITE_NOMEM;
- }
- memcpy(zNew, p->zBuf, (size_t)p->nUsed);
- p->zBuf = zNew;
- p->bStatic = 0;
- }else{
- zNew = sqlite3_realloc64(p->zBuf, nTotal);
- if( zNew==0 ){
- jsonOom(p);
- return SQLITE_NOMEM;
- }
- p->zBuf = zNew;
- }
- p->nAlloc = nTotal;
- return SQLITE_OK;
-}
-
-/* Append N bytes from zIn onto the end of the JsonString string.
-*/
-static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){
- if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return;
- memcpy(p->zBuf+p->nUsed, zIn, N);
- p->nUsed += N;
-}
-
-/* Append formatted text (not to exceed N bytes) to the JsonString.
-*/
-static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){
- va_list ap;
- if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return;
- va_start(ap, zFormat);
- sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap);
- va_end(ap);
- p->nUsed += (int)strlen(p->zBuf+p->nUsed);
-}
-
-/* Append a single character
-*/
-static void jsonAppendChar(JsonString *p, char c){
- if( p->nUsed>=p->nAlloc && jsonGrow(p,1)!=0 ) return;
- p->zBuf[p->nUsed++] = c;
-}
-
-/* Append a comma separator to the output buffer, if the previous
-** character is not '[' or '{'.
-*/
-static void jsonAppendSeparator(JsonString *p){
- char c;
- if( p->nUsed==0 ) return;
- c = p->zBuf[p->nUsed-1];
- if( c!='[' && c!='{' ) jsonAppendChar(p, ',');
-}
-
-/* Append the N-byte string in zIn to the end of the JsonString string
-** under construction. Enclose the string in "..." and escape
-** any double-quotes or backslash characters contained within the
-** string.
-*/
-static void jsonAppendString(JsonString *p, const char *zIn, u32 N){
- u32 i;
- if( (N+p->nUsed+2 >= p->nAlloc) && jsonGrow(p,N+2)!=0 ) return;
- p->zBuf[p->nUsed++] = '"';
- for(i=0; i<N; i++){
- unsigned char c = ((unsigned const char*)zIn)[i];
- if( c=='"' || c=='\\' ){
- json_simple_escape:
- if( (p->nUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return;
- p->zBuf[p->nUsed++] = '\\';
- }else if( c<=0x1f ){
- static const char aSpecial[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- };
- assert( sizeof(aSpecial)==32 );
- assert( aSpecial['\b']=='b' );
- assert( aSpecial['\f']=='f' );
- assert( aSpecial['\n']=='n' );
- assert( aSpecial['\r']=='r' );
- assert( aSpecial['\t']=='t' );
- if( aSpecial[c] ){
- c = aSpecial[c];
- goto json_simple_escape;
- }
- if( (p->nUsed+N+7+i > p->nAlloc) && jsonGrow(p,N+7-i)!=0 ) return;
- p->zBuf[p->nUsed++] = '\\';
- p->zBuf[p->nUsed++] = 'u';
- p->zBuf[p->nUsed++] = '0';
- p->zBuf[p->nUsed++] = '0';
- p->zBuf[p->nUsed++] = '0' + (c>>4);
- c = "0123456789abcdef"[c&0xf];
- }
- p->zBuf[p->nUsed++] = c;
- }
- p->zBuf[p->nUsed++] = '"';
- assert( p->nUsed<p->nAlloc );
-}
/*
-** Append a function parameter value to the JSON string under
-** construction.
+** Buffers a1 and a2 must both contain a sessions module record nCol
+** fields in size. This function appends an nCol sessions module
+** record to buffer pBuf that is a copy of a1, except that for
+** each field that is undefined in a1[], swap in the field from a2[].
*/
-static void jsonAppendValue(
- JsonString *p, /* Append to this JSON string */
- sqlite3_value *pValue /* Value to append */
+static void sessionAppendRecordMerge(
+ SessionBuffer *pBuf, /* Buffer to append to */
+ int nCol, /* Number of columns in each record */
+ u8 *a1, int n1, /* Record 1 */
+ u8 *a2, int n2, /* Record 2 */
+ int *pRc /* IN/OUT: error code */
){
- switch( sqlite3_value_type(pValue) ){
- case SQLITE_NULL: {
- jsonAppendRaw(p, "null", 4);
- break;
- }
- case SQLITE_INTEGER:
- case SQLITE_FLOAT: {
- const char *z = (const char*)sqlite3_value_text(pValue);
- u32 n = (u32)sqlite3_value_bytes(pValue);
- jsonAppendRaw(p, z, n);
- break;
- }
- case SQLITE_TEXT: {
- const char *z = (const char*)sqlite3_value_text(pValue);
- u32 n = (u32)sqlite3_value_bytes(pValue);
- if( sqlite3_value_subtype(pValue)==JSON_SUBTYPE ){
- jsonAppendRaw(p, z, n);
+ sessionBufferGrow(pBuf, n1+n2, pRc);
+ if( *pRc==SQLITE_OK ){
+ int i;
+ u8 *pOut = &pBuf->aBuf[pBuf->nBuf];
+ for(i=0; i<nCol; i++){
+ int nn1 = sessionSerialLen(a1);
+ int nn2 = sessionSerialLen(a2);
+ if( *a1==0 || *a1==0xFF ){
+ memcpy(pOut, a2, nn2);
+ pOut += nn2;
}else{
- jsonAppendString(p, z, n);
+ memcpy(pOut, a1, nn1);
+ pOut += nn1;
}
- break;
+ a1 += nn1;
+ a2 += nn2;
}
- default: {
- if( p->bErr==0 ){
- sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1);
- p->bErr = 2;
- jsonReset(p);
- }
- break;
- }
- }
-}
-
-/* Make the JSON in p the result of the SQL function.
-*/
-static void jsonResult(JsonString *p){
- if( p->bErr==0 ){
- sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed,
- p->bStatic ? SQLITE_TRANSIENT : sqlite3_free,
- SQLITE_UTF8);
- jsonZero(p);
+ pBuf->nBuf = pOut-pBuf->aBuf;
+ assert( pBuf->nBuf<=pBuf->nAlloc );
}
- assert( p->bStatic );
}
-/**************************************************************************
-** Utility routines for dealing with JsonNode and JsonParse objects
-**************************************************************************/
-
/*
-** Return the number of consecutive JsonNode slots need to represent
-** the parsed JSON at pNode. The minimum answer is 1. For ARRAY and
-** OBJECT types, the number might be larger.
+** This function is called when rebasing a local UPDATE change against one
+** or more remote UPDATE changes. The aRec/nRec buffer contains the current
+** old.* and new.* records for the change. The rebase buffer (a single
+** record) is in aChange/nChange. The rebased change is appended to buffer
+** pBuf.
**
-** Appended elements are not counted. The value returned is the number
-** by which the JsonNode counter should increment in order to go to the
-** next peer value.
-*/
-static u32 jsonNodeSize(JsonNode *pNode){
- return pNode->eType>=JSON_ARRAY ? pNode->n+1 : 1;
-}
-
-/*
-** Reclaim all memory allocated by a JsonParse object. But do not
-** delete the JsonParse object itself.
-*/
-static void jsonParseReset(JsonParse *pParse){
- sqlite3_free(pParse->aNode);
- pParse->aNode = 0;
- pParse->nNode = 0;
- pParse->nAlloc = 0;
- sqlite3_free(pParse->aUp);
- pParse->aUp = 0;
-}
-
-/*
-** Free a JsonParse object that was obtained from sqlite3_malloc().
-*/
-static void jsonParseFree(JsonParse *pParse){
- jsonParseReset(pParse);
- sqlite3_free(pParse);
-}
-
-/*
-** Convert the JsonNode pNode into a pure JSON string and
-** append to pOut. Subsubstructure is also included. Return
-** the number of JsonNode objects that are encoded.
-*/
-static void jsonRenderNode(
- JsonNode *pNode, /* The node to render */
- JsonString *pOut, /* Write JSON here */
- sqlite3_value **aReplace /* Replacement values */
-){
- if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){
- if( pNode->jnFlags & JNODE_REPLACE ){
- jsonAppendValue(pOut, aReplace[pNode->u.iReplace]);
- return;
- }
- pNode = pNode->u.pPatch;
- }
- switch( pNode->eType ){
- default: {
- assert( pNode->eType==JSON_NULL );
- jsonAppendRaw(pOut, "null", 4);
- break;
- }
- case JSON_TRUE: {
- jsonAppendRaw(pOut, "true", 4);
- break;
- }
- case JSON_FALSE: {
- jsonAppendRaw(pOut, "false", 5);
- break;
- }
- case JSON_STRING: {
- if( pNode->jnFlags & JNODE_RAW ){
- jsonAppendString(pOut, pNode->u.zJContent, pNode->n);
- break;
- }
- /* Fall through into the next case */
- }
- case JSON_REAL:
- case JSON_INT: {
- jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
- break;
- }
- case JSON_ARRAY: {
- u32 j = 1;
- jsonAppendChar(pOut, '[');
- for(;;){
- while( j<=pNode->n ){
- if( (pNode[j].jnFlags & JNODE_REMOVE)==0 ){
- jsonAppendSeparator(pOut);
- jsonRenderNode(&pNode[j], pOut, aReplace);
- }
- j += jsonNodeSize(&pNode[j]);
- }
- if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
- pNode = &pNode[pNode->u.iAppend];
- j = 1;
- }
- jsonAppendChar(pOut, ']');
- break;
- }
- case JSON_OBJECT: {
- u32 j = 1;
- jsonAppendChar(pOut, '{');
- for(;;){
- while( j<=pNode->n ){
- if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){
- jsonAppendSeparator(pOut);
- jsonRenderNode(&pNode[j], pOut, aReplace);
- jsonAppendChar(pOut, ':');
- jsonRenderNode(&pNode[j+1], pOut, aReplace);
- }
- j += 1 + jsonNodeSize(&pNode[j+1]);
- }
- if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
- pNode = &pNode[pNode->u.iAppend];
- j = 1;
- }
- jsonAppendChar(pOut, '}');
- break;
- }
- }
-}
-
-/*
-** Return a JsonNode and all its descendents as a JSON string.
-*/
-static void jsonReturnJson(
- JsonNode *pNode, /* Node to return */
- sqlite3_context *pCtx, /* Return value for this function */
- sqlite3_value **aReplace /* Array of replacement values */
-){
- JsonString s;
- jsonInit(&s, pCtx);
- jsonRenderNode(pNode, &s, aReplace);
- jsonResult(&s);
- sqlite3_result_subtype(pCtx, JSON_SUBTYPE);
-}
-
-/*
-** Make the JsonNode the return value of the function.
-*/
-static void jsonReturn(
- JsonNode *pNode, /* Node to return */
- sqlite3_context *pCtx, /* Return value for this function */
- sqlite3_value **aReplace /* Array of replacement values */
-){
- switch( pNode->eType ){
- default: {
- assert( pNode->eType==JSON_NULL );
- sqlite3_result_null(pCtx);
- break;
- }
- case JSON_TRUE: {
- sqlite3_result_int(pCtx, 1);
- break;
- }
- case JSON_FALSE: {
- sqlite3_result_int(pCtx, 0);
- break;
- }
- case JSON_INT: {
- sqlite3_int64 i = 0;
- const char *z = pNode->u.zJContent;
- if( z[0]=='-' ){ z++; }
- while( z[0]>='0' && z[0]<='9' ){
- unsigned v = *(z++) - '0';
- if( i>=LARGEST_INT64/10 ){
- if( i>LARGEST_INT64/10 ) goto int_as_real;
- if( z[0]>='0' && z[0]<='9' ) goto int_as_real;
- if( v==9 ) goto int_as_real;
- if( v==8 ){
- if( pNode->u.zJContent[0]=='-' ){
- sqlite3_result_int64(pCtx, SMALLEST_INT64);
- goto int_done;
- }else{
- goto int_as_real;
- }
- }
- }
- i = i*10 + v;
- }
- if( pNode->u.zJContent[0]=='-' ){ i = -i; }
- sqlite3_result_int64(pCtx, i);
- int_done:
- break;
- int_as_real: /* fall through to real */;
- }
- case JSON_REAL: {
- double r;
-#ifdef SQLITE_AMALGAMATION
- const char *z = pNode->u.zJContent;
- sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8);
-#else
- r = strtod(pNode->u.zJContent, 0);
-#endif
- sqlite3_result_double(pCtx, r);
- break;
- }
- case JSON_STRING: {
-#if 0 /* Never happens because JNODE_RAW is only set by json_set(),
- ** json_insert() and json_replace() and those routines do not
- ** call jsonReturn() */
- if( pNode->jnFlags & JNODE_RAW ){
- sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n,
- SQLITE_TRANSIENT);
- }else
-#endif
- assert( (pNode->jnFlags & JNODE_RAW)==0 );
- if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){
- /* JSON formatted without any backslash-escapes */
- sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2,
- SQLITE_TRANSIENT);
- }else{
- /* Translate JSON formatted string into raw text */
- u32 i;
- u32 n = pNode->n;
- const char *z = pNode->u.zJContent;
- char *zOut;
- u32 j;
- zOut = sqlite3_malloc( n+1 );
- if( zOut==0 ){
- sqlite3_result_error_nomem(pCtx);
- break;
- }
- for(i=1, j=0; i<n-1; i++){
- char c = z[i];
- if( c!='\\' ){
- zOut[j++] = c;
- }else{
- c = z[++i];
- if( c=='u' ){
- u32 v = 0, k;
- for(k=0; k<4; i++, k++){
- assert( i<n-2 );
- c = z[i+1];
- assert( safe_isxdigit(c) );
- if( c<='9' ) v = v*16 + c - '0';
- else if( c<='F' ) v = v*16 + c - 'A' + 10;
- else v = v*16 + c - 'a' + 10;
- }
- if( v==0 ) break;
- if( v<=0x7f ){
- zOut[j++] = (char)v;
- }else if( v<=0x7ff ){
- zOut[j++] = (char)(0xc0 | (v>>6));
- zOut[j++] = 0x80 | (v&0x3f);
- }else{
- zOut[j++] = (char)(0xe0 | (v>>12));
- zOut[j++] = 0x80 | ((v>>6)&0x3f);
- zOut[j++] = 0x80 | (v&0x3f);
- }
- }else{
- if( c=='b' ){
- c = '\b';
- }else if( c=='f' ){
- c = '\f';
- }else if( c=='n' ){
- c = '\n';
- }else if( c=='r' ){
- c = '\r';
- }else if( c=='t' ){
- c = '\t';
- }
- zOut[j++] = c;
- }
- }
- }
- zOut[j] = 0;
- sqlite3_result_text(pCtx, zOut, j, sqlite3_free);
- }
- break;
- }
- case JSON_ARRAY:
- case JSON_OBJECT: {
- jsonReturnJson(pNode, pCtx, aReplace);
- break;
- }
- }
-}
-
-/* Forward reference */
-static int jsonParseAddNode(JsonParse*,u32,u32,const char*);
-
-/*
-** A macro to hint to the compiler that a function should not be
-** inlined.
-*/
-#if defined(__GNUC__)
-# define JSON_NOINLINE __attribute__((noinline))
-#elif defined(_MSC_VER) && _MSC_VER>=1310
-# define JSON_NOINLINE __declspec(noinline)
-#else
-# define JSON_NOINLINE
-#endif
-
-
-static JSON_NOINLINE int jsonParseAddNodeExpand(
- JsonParse *pParse, /* Append the node to this object */
- u32 eType, /* Node type */
- u32 n, /* Content size or sub-node count */
- const char *zContent /* Content */
-){
- u32 nNew;
- JsonNode *pNew;
- assert( pParse->nNode>=pParse->nAlloc );
- if( pParse->oom ) return -1;
- nNew = pParse->nAlloc*2 + 10;
- pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew);
- if( pNew==0 ){
- pParse->oom = 1;
- return -1;
- }
- pParse->nAlloc = nNew;
- pParse->aNode = pNew;
- assert( pParse->nNode<pParse->nAlloc );
- return jsonParseAddNode(pParse, eType, n, zContent);
-}
-
-/*
-** Create a new JsonNode instance based on the arguments and append that
-** instance to the JsonParse. Return the index in pParse->aNode[] of the
-** new node, or -1 if a memory allocation fails.
-*/
-static int jsonParseAddNode(
- JsonParse *pParse, /* Append the node to this object */
- u32 eType, /* Node type */
- u32 n, /* Content size or sub-node count */
- const char *zContent /* Content */
-){
- JsonNode *p;
- if( pParse->nNode>=pParse->nAlloc ){
- return jsonParseAddNodeExpand(pParse, eType, n, zContent);
- }
- p = &pParse->aNode[pParse->nNode];
- p->eType = (u8)eType;
- p->jnFlags = 0;
- p->n = n;
- p->u.zJContent = zContent;
- return pParse->nNode++;
-}
-
-/*
-** Return true if z[] begins with 4 (or more) hexadecimal digits
-*/
-static int jsonIs4Hex(const char *z){
- int i;
- for(i=0; i<4; i++) if( !safe_isxdigit(z[i]) ) return 0;
- return 1;
-}
-
-/*
-** Parse a single JSON value which begins at pParse->zJson[i]. Return the
-** index of the first character past the end of the value parsed.
+** Rebasing the UPDATE involves:
**
-** Return negative for a syntax error. Special cases: return -2 if the
-** first non-whitespace character is '}' and return -3 if the first
-** non-whitespace character is ']'.
-*/
-static int jsonParseValue(JsonParse *pParse, u32 i){
- char c;
- u32 j;
- int iThis;
- int x;
- JsonNode *pNode;
- const char *z = pParse->zJson;
- while( safe_isspace(z[i]) ){ i++; }
- if( (c = z[i])=='{' ){
- /* Parse object */
- iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
- if( iThis<0 ) return -1;
- for(j=i+1;;j++){
- while( safe_isspace(z[j]) ){ j++; }
- if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1;
- x = jsonParseValue(pParse, j);
- if( x<0 ){
- pParse->iDepth--;
- if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1;
- return -1;
- }
- if( pParse->oom ) return -1;
- pNode = &pParse->aNode[pParse->nNode-1];
- if( pNode->eType!=JSON_STRING ) return -1;
- pNode->jnFlags |= JNODE_LABEL;
- j = x;
- while( safe_isspace(z[j]) ){ j++; }
- if( z[j]!=':' ) return -1;
- j++;
- x = jsonParseValue(pParse, j);
- pParse->iDepth--;
- if( x<0 ) return -1;
- j = x;
- while( safe_isspace(z[j]) ){ j++; }
- c = z[j];
- if( c==',' ) continue;
- if( c!='}' ) return -1;
- break;
- }
- pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
- return j+1;
- }else if( c=='[' ){
- /* Parse array */
- iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
- if( iThis<0 ) return -1;
- for(j=i+1;;j++){
- while( safe_isspace(z[j]) ){ j++; }
- if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1;
- x = jsonParseValue(pParse, j);
- pParse->iDepth--;
- if( x<0 ){
- if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1;
- return -1;
- }
- j = x;
- while( safe_isspace(z[j]) ){ j++; }
- c = z[j];
- if( c==',' ) continue;
- if( c!=']' ) return -1;
- break;
- }
- pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
- return j+1;
- }else if( c=='"' ){
- /* Parse string */
- u8 jnFlags = 0;
- j = i+1;
- for(;;){
- c = z[j];
- if( (c & ~0x1f)==0 ){
- /* Control characters are not allowed in strings */
- return -1;
- }
- if( c=='\\' ){
- c = z[++j];
- if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f'
- || c=='n' || c=='r' || c=='t'
- || (c=='u' && jsonIs4Hex(z+j+1)) ){
- jnFlags = JNODE_ESCAPE;
- }else{
- return -1;
- }
- }else if( c=='"' ){
- break;
- }
- j++;
- }
- jsonParseAddNode(pParse, JSON_STRING, j+1-i, &z[i]);
- if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags;
- return j+1;
- }else if( c=='n'
- && strncmp(z+i,"null",4)==0
- && !safe_isalnum(z[i+4]) ){
- jsonParseAddNode(pParse, JSON_NULL, 0, 0);
- return i+4;
- }else if( c=='t'
- && strncmp(z+i,"true",4)==0
- && !safe_isalnum(z[i+4]) ){
- jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
- return i+4;
- }else if( c=='f'
- && strncmp(z+i,"false",5)==0
- && !safe_isalnum(z[i+5]) ){
- jsonParseAddNode(pParse, JSON_FALSE, 0, 0);
- return i+5;
- }else if( c=='-' || (c>='0' && c<='9') ){
- /* Parse number */
- u8 seenDP = 0;
- u8 seenE = 0;
- assert( '-' < '0' );
- if( c<='0' ){
- j = c=='-' ? i+1 : i;
- if( z[j]=='0' && z[j+1]>='0' && z[j+1]<='9' ) return -1;
- }
- j = i+1;
- for(;; j++){
- c = z[j];
- if( c>='0' && c<='9' ) continue;
- if( c=='.' ){
- if( z[j-1]=='-' ) return -1;
- if( seenDP ) return -1;
- seenDP = 1;
- continue;
- }
- if( c=='e' || c=='E' ){
- if( z[j-1]<'0' ) return -1;
- if( seenE ) return -1;
- seenDP = seenE = 1;
- c = z[j+1];
- if( c=='+' || c=='-' ){
- j++;
- c = z[j+1];
- }
- if( c<'0' || c>'9' ) return -1;
- continue;
- }
- break;
- }
- if( z[j-1]<'0' ) return -1;
- jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT,
- j - i, &z[i]);
- return j;
- }else if( c=='}' ){
- return -2; /* End of {...} */
- }else if( c==']' ){
- return -3; /* End of [...] */
- }else if( c==0 ){
- return 0; /* End of file */
- }else{
- return -1; /* Syntax error */
- }
-}
-
-/*
-** Parse a complete JSON string. Return 0 on success or non-zero if there
-** are any errors. If an error occurs, free all memory associated with
-** pParse.
+** * Removing any changes to fields for which the corresponding field
+** in the rebase buffer is set to "replaced" (type 0xFF). If this
+** means the UPDATE change updates no fields, nothing is appended
+** to the output buffer.
**
-** pParse is uninitialized when this routine is called.
+** * For each field modified by the local change for which the
+** corresponding field in the rebase buffer is not "undefined" (0x00)
+** or "replaced" (0xFF), the old.* value is replaced by the value
+** in the rebase buffer.
*/
-static int jsonParse(
- JsonParse *pParse, /* Initialize and fill this JsonParse object */
- sqlite3_context *pCtx, /* Report errors here */
- const char *zJson /* Input JSON text to be parsed */
+static void sessionAppendPartialUpdate(
+ SessionBuffer *pBuf, /* Append record here */
+ sqlite3_changeset_iter *pIter, /* Iterator pointed at local change */
+ u8 *aRec, int nRec, /* Local change */
+ u8 *aChange, int nChange, /* Record to rebase against */
+ int *pRc /* IN/OUT: Return Code */
){
- int i;
- memset(pParse, 0, sizeof(*pParse));
- if( zJson==0 ) return 1;
- pParse->zJson = zJson;
- i = jsonParseValue(pParse, 0);
- if( pParse->oom ) i = -1;
- if( i>0 ){
- assert( pParse->iDepth==0 );
- while( safe_isspace(zJson[i]) ) i++;
- if( zJson[i] ) i = -1;
- }
- if( i<=0 ){
- if( pCtx!=0 ){
- if( pParse->oom ){
- sqlite3_result_error_nomem(pCtx);
- }else{
- sqlite3_result_error(pCtx, "malformed JSON", -1);
- }
- }
- jsonParseReset(pParse);
- return 1;
- }
- return 0;
-}
-
-/* Mark node i of pParse as being a child of iParent. Call recursively
-** to fill in all the descendants of node i.
-*/
-static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){
- JsonNode *pNode = &pParse->aNode[i];
- u32 j;
- pParse->aUp[i] = iParent;
- switch( pNode->eType ){
- case JSON_ARRAY: {
- for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){
- jsonParseFillInParentage(pParse, i+j, i);
- }
- break;
- }
- case JSON_OBJECT: {
- for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j+1)+1){
- pParse->aUp[i+j] = i;
- jsonParseFillInParentage(pParse, i+j+1, i);
- }
- break;
- }
- default: {
- break;
- }
- }
-}
-
-/*
-** Compute the parentage of all nodes in a completed parse.
-*/
-static int jsonParseFindParents(JsonParse *pParse){
- u32 *aUp;
- assert( pParse->aUp==0 );
- aUp = pParse->aUp = sqlite3_malloc( sizeof(u32)*pParse->nNode );
- if( aUp==0 ){
- pParse->oom = 1;
- return SQLITE_NOMEM;
- }
- jsonParseFillInParentage(pParse, 0, 0);
- return SQLITE_OK;
-}
-
-/*
-** Magic number used for the JSON parse cache in sqlite3_get_auxdata()
-*/
-#define JSON_CACHE_ID (-429938)
-
-/*
-** Obtain a complete parse of the JSON found in the first argument
-** of the argv array. Use the sqlite3_get_auxdata() cache for this
-** parse if it is available. If the cache is not available or if it
-** is no longer valid, parse the JSON again and return the new parse,
-** and also register the new parse so that it will be available for
-** future sqlite3_get_auxdata() calls.
-*/
-static JsonParse *jsonParseCached(
- sqlite3_context *pCtx,
- sqlite3_value **argv
-){
- const char *zJson = (const char*)sqlite3_value_text(argv[0]);
- int nJson = sqlite3_value_bytes(argv[0]);
- JsonParse *p;
- if( zJson==0 ) return 0;
- p = (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID);
- if( p && p->nJson==nJson && memcmp(p->zJson,zJson,nJson)==0 ){
- p->nErr = 0;
- return p; /* The cached entry matches, so return it */
- }
- p = sqlite3_malloc( sizeof(*p) + nJson + 1 );
- if( p==0 ){
- sqlite3_result_error_nomem(pCtx);
- return 0;
- }
- memset(p, 0, sizeof(*p));
- p->zJson = (char*)&p[1];
- memcpy((char*)p->zJson, zJson, nJson+1);
- if( jsonParse(p, pCtx, p->zJson) ){
- sqlite3_free(p);
- return 0;
- }
- p->nJson = nJson;
- sqlite3_set_auxdata(pCtx, JSON_CACHE_ID, p, (void(*)(void*))jsonParseFree);
- return (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID);
-}
-
-/*
-** Compare the OBJECT label at pNode against zKey,nKey. Return true on
-** a match.
-*/
-static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){
- if( pNode->jnFlags & JNODE_RAW ){
- if( pNode->n!=nKey ) return 0;
- return strncmp(pNode->u.zJContent, zKey, nKey)==0;
- }else{
- if( pNode->n!=nKey+2 ) return 0;
- return strncmp(pNode->u.zJContent+1, zKey, nKey)==0;
- }
-}
-
-/* forward declaration */
-static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**);
+ sessionBufferGrow(pBuf, 2+nRec+nChange, pRc);
+ if( *pRc==SQLITE_OK ){
+ int bData = 0;
+ u8 *pOut = &pBuf->aBuf[pBuf->nBuf];
+ int i;
+ u8 *a1 = aRec;
+ u8 *a2 = aChange;
-/*
-** Search along zPath to find the node specified. Return a pointer
-** to that node, or NULL if zPath is malformed or if there is no such
-** node.
-**
-** If pApnd!=0, then try to append new nodes to complete zPath if it is
-** possible to do so and if no existing node corresponds to zPath. If
-** new nodes are appended *pApnd is set to 1.
-*/
-static JsonNode *jsonLookupStep(
- JsonParse *pParse, /* The JSON to search */
- u32 iRoot, /* Begin the search at this node */
- const char *zPath, /* The path to search */
- int *pApnd, /* Append nodes to complete path if not NULL */
- const char **pzErr /* Make *pzErr point to any syntax error in zPath */
-){
- u32 i, j, nKey;
- const char *zKey;
- JsonNode *pRoot = &pParse->aNode[iRoot];
- if( zPath[0]==0 ) return pRoot;
- if( zPath[0]=='.' ){
- if( pRoot->eType!=JSON_OBJECT ) return 0;
- zPath++;
- if( zPath[0]=='"' ){
- zKey = zPath + 1;
- for(i=1; zPath[i] && zPath[i]!='"'; i++){}
- nKey = i-1;
- if( zPath[i] ){
- i++;
+ *pOut++ = SQLITE_UPDATE;
+ *pOut++ = pIter->bIndirect;
+ for(i=0; i<pIter->nCol; i++){
+ int n1 = sessionSerialLen(a1);
+ int n2 = sessionSerialLen(a2);
+ if( pIter->abPK[i] || a2[0]==0 ){
+ if( !pIter->abPK[i] ) bData = 1;
+ memcpy(pOut, a1, n1);
+ pOut += n1;
+ }else if( a2[0]!=0xFF ){
+ bData = 1;
+ memcpy(pOut, a2, n2);
+ pOut += n2;
}else{
- *pzErr = zPath;
- return 0;
+ *pOut++ = '\0';
}
- }else{
- zKey = zPath;
- for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){}
- nKey = i;
- }
- if( nKey==0 ){
- *pzErr = zPath;
- return 0;
+ a1 += n1;
+ a2 += n2;
}
- j = 1;
- for(;;){
- while( j<=pRoot->n ){
- if( jsonLabelCompare(pRoot+j, zKey, nKey) ){
- return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr);
+ if( bData ){
+ a2 = aChange;
+ for(i=0; i<pIter->nCol; i++){
+ int n1 = sessionSerialLen(a1);
+ int n2 = sessionSerialLen(a2);
+ if( pIter->abPK[i] || a2[0]!=0xFF ){
+ memcpy(pOut, a1, n1);
+ pOut += n1;
+ }else{
+ *pOut++ = '\0';
}
- j++;
- j += jsonNodeSize(&pRoot[j]);
- }
- if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
- iRoot += pRoot->u.iAppend;
- pRoot = &pParse->aNode[iRoot];
- j = 1;
- }
- if( pApnd ){
- u32 iStart, iLabel;
- JsonNode *pNode;
- iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
- iLabel = jsonParseAddNode(pParse, JSON_STRING, i, zPath);
- zPath += i;
- pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
- if( pParse->oom ) return 0;
- if( pNode ){
- pRoot = &pParse->aNode[iRoot];
- pRoot->u.iAppend = iStart - iRoot;
- pRoot->jnFlags |= JNODE_APPEND;
- pParse->aNode[iLabel].jnFlags |= JNODE_RAW;
- }
- return pNode;
- }
- }else if( zPath[0]=='[' && safe_isdigit(zPath[1]) ){
- if( pRoot->eType!=JSON_ARRAY ) return 0;
- i = 0;
- j = 1;
- while( safe_isdigit(zPath[j]) ){
- i = i*10 + zPath[j] - '0';
- j++;
- }
- if( zPath[j]!=']' ){
- *pzErr = zPath;
- return 0;
- }
- zPath += j + 1;
- j = 1;
- for(;;){
- while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){
- if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 ) i--;
- j += jsonNodeSize(&pRoot[j]);
- }
- if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
- iRoot += pRoot->u.iAppend;
- pRoot = &pParse->aNode[iRoot];
- j = 1;
- }
- if( j<=pRoot->n ){
- return jsonLookupStep(pParse, iRoot+j, zPath, pApnd, pzErr);
- }
- if( i==0 && pApnd ){
- u32 iStart;
- JsonNode *pNode;
- iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0);
- pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
- if( pParse->oom ) return 0;
- if( pNode ){
- pRoot = &pParse->aNode[iRoot];
- pRoot->u.iAppend = iStart - iRoot;
- pRoot->jnFlags |= JNODE_APPEND;
+ a1 += n1;
+ a2 += n2;
}
- return pNode;
+ pBuf->nBuf = (pOut - pBuf->aBuf);
}
- }else{
- *pzErr = zPath;
- }
- return 0;
-}
-
-/*
-** Append content to pParse that will complete zPath. Return a pointer
-** to the inserted node, or return NULL if the append fails.
-*/
-static JsonNode *jsonLookupAppend(
- JsonParse *pParse, /* Append content to the JSON parse */
- const char *zPath, /* Description of content to append */
- int *pApnd, /* Set this flag to 1 */
- const char **pzErr /* Make this point to any syntax error */
-){
- *pApnd = 1;
- if( zPath[0]==0 ){
- jsonParseAddNode(pParse, JSON_NULL, 0, 0);
- return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1];
}
- if( zPath[0]=='.' ){
- jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
- }else if( strncmp(zPath,"[0]",3)==0 ){
- jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
- }else{
- return 0;
- }
- if( pParse->oom ) return 0;
- return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr);
}
/*
-** Return the text of a syntax error message on a JSON path. Space is
-** obtained from sqlite3_malloc().
-*/
-static char *jsonPathSyntaxError(const char *zErr){
- return sqlite3_mprintf("JSON path error near '%q'", zErr);
-}
-
-/*
-** Do a node lookup using zPath. Return a pointer to the node on success.
-** Return NULL if not found or if there is an error.
-**
-** On an error, write an error message into pCtx and increment the
-** pParse->nErr counter.
+** pIter is configured to iterate through a changeset. This function rebases
+** that changeset according to the current configuration of the rebaser
+** object passed as the first argument. If no error occurs and argument xOutput
+** is not NULL, then the changeset is returned to the caller by invoking
+** xOutput zero or more times and SQLITE_OK returned. Or, if xOutput is NULL,
+** then (*ppOut) is set to point to a buffer containing the rebased changeset
+** before this function returns. In this case (*pnOut) is set to the size of
+** the buffer in bytes. It is the responsibility of the caller to eventually
+** free the (*ppOut) buffer using sqlite3_free().
**
-** If pApnd!=NULL then try to append missing nodes and set *pApnd = 1 if
-** nodes are appended.
-*/
-static JsonNode *jsonLookup(
- JsonParse *pParse, /* The JSON to search */
- const char *zPath, /* The path to search */
- int *pApnd, /* Append nodes to complete path if not NULL */
- sqlite3_context *pCtx /* Report errors here, if not NULL */
-){
- const char *zErr = 0;
- JsonNode *pNode = 0;
- char *zMsg;
-
- if( zPath==0 ) return 0;
- if( zPath[0]!='$' ){
- zErr = zPath;
- goto lookup_err;
- }
- zPath++;
- pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr);
- if( zErr==0 ) return pNode;
-
-lookup_err:
- pParse->nErr++;
- assert( zErr!=0 && pCtx!=0 );
- zMsg = jsonPathSyntaxError(zErr);
- if( zMsg ){
- sqlite3_result_error(pCtx, zMsg, -1);
- sqlite3_free(zMsg);
- }else{
- sqlite3_result_error_nomem(pCtx);
- }
- return 0;
-}
-
-
-/*
-** Report the wrong number of arguments for json_insert(), json_replace()
-** or json_set().
+** If an error occurs, an SQLite error code is returned. If ppOut and
+** pnOut are not NULL, then the two output parameters are set to 0 before
+** returning.
*/
-static void jsonWrongNumArgs(
- sqlite3_context *pCtx,
- const char *zFuncName
+static int sessionRebase(
+ sqlite3_rebaser *p, /* Rebaser hash table */
+ sqlite3_changeset_iter *pIter, /* Input data */
+ int (*xOutput)(void *pOut, const void *pData, int nData),
+ void *pOut, /* Context for xOutput callback */
+ int *pnOut, /* OUT: Number of bytes in output changeset */
+ void **ppOut /* OUT: Inverse of pChangeset */
){
- char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments",
- zFuncName);
- sqlite3_result_error(pCtx, zMsg, -1);
- sqlite3_free(zMsg);
-}
-
-/*
-** Mark all NULL entries in the Object passed in as JNODE_REMOVE.
-*/
-static void jsonRemoveAllNulls(JsonNode *pNode){
- int i, n;
- assert( pNode->eType==JSON_OBJECT );
- n = pNode->n;
- for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){
- switch( pNode[i].eType ){
- case JSON_NULL:
- pNode[i].jnFlags |= JNODE_REMOVE;
- break;
- case JSON_OBJECT:
- jsonRemoveAllNulls(&pNode[i]);
- break;
- }
- }
-}
+ int rc = SQLITE_OK;
+ u8 *aRec = 0;
+ int nRec = 0;
+ int bNew = 0;
+ SessionTable *pTab = 0;
+ SessionBuffer sOut = {0,0,0};
+ while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, &bNew) ){
+ SessionChange *pChange = 0;
+ int bDone = 0;
-/****************************************************************************
-** SQL functions used for testing and debugging
-****************************************************************************/
+ if( bNew ){
+ const char *zTab = pIter->zTab;
+ for(pTab=p->grp.pList; pTab; pTab=pTab->pNext){
+ if( 0==sqlite3_stricmp(pTab->zName, zTab) ) break;
+ }
+ bNew = 0;
-#ifdef SQLITE_DEBUG
-/*
-** The json_parse(JSON) function returns a string which describes
-** a parse of the JSON provided. Or it returns NULL if JSON is not
-** well-formed.
-*/
-static void jsonParseFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- JsonString s; /* Output string - not real JSON */
- JsonParse x; /* The parse */
- u32 i;
+ /* A patchset may not be rebased */
+ if( pIter->bPatchset ){
+ rc = SQLITE_ERROR;
+ }
- assert( argc==1 );
- if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
- jsonParseFindParents(&x);
- jsonInit(&s, ctx);
- for(i=0; i<x.nNode; i++){
- const char *zType;
- if( x.aNode[i].jnFlags & JNODE_LABEL ){
- assert( x.aNode[i].eType==JSON_STRING );
- zType = "label";
- }else{
- zType = jsonType[x.aNode[i].eType];
- }
- jsonPrintf(100, &s,"node %3u: %7s n=%-4d up=%-4d",
- i, zType, x.aNode[i].n, x.aUp[i]);
- if( x.aNode[i].u.zJContent!=0 ){
- jsonAppendRaw(&s, " ", 1);
- jsonAppendRaw(&s, x.aNode[i].u.zJContent, x.aNode[i].n);
+ /* Append a table header to the output for this new table */
+ sessionAppendByte(&sOut, pIter->bPatchset ? 'P' : 'T', &rc);
+ sessionAppendVarint(&sOut, pIter->nCol, &rc);
+ sessionAppendBlob(&sOut, pIter->abPK, pIter->nCol, &rc);
+ sessionAppendBlob(&sOut,(u8*)pIter->zTab,(int)strlen(pIter->zTab)+1,&rc);
}
- jsonAppendRaw(&s, "\n", 1);
- }
- jsonParseReset(&x);
- jsonResult(&s);
-}
-
-/*
-** The json_test1(JSON) function return true (1) if the input is JSON
-** text generated by another json function. It returns (0) if the input
-** is not known to be JSON.
-*/
-static void jsonTest1Func(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- UNUSED_PARAM(argc);
- sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE);
-}
-#endif /* SQLITE_DEBUG */
-
-/****************************************************************************
-** Scalar SQL function implementations
-****************************************************************************/
-
-/*
-** Implementation of the json_QUOTE(VALUE) function. Return a JSON value
-** corresponding to the SQL value input. Mostly this means putting
-** double-quotes around strings and returning the unquoted string "null"
-** when given a NULL input.
-*/
-static void jsonQuoteFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- JsonString jx;
- UNUSED_PARAM(argc);
-
- jsonInit(&jx, ctx);
- jsonAppendValue(&jx, argv[0]);
- jsonResult(&jx);
- sqlite3_result_subtype(ctx, JSON_SUBTYPE);
-}
-
-/*
-** Implementation of the json_array(VALUE,...) function. Return a JSON
-** array that contains all values given in arguments. Or if any argument
-** is a BLOB, throw an error.
-*/
-static void jsonArrayFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- int i;
- JsonString jx;
-
- jsonInit(&jx, ctx);
- jsonAppendChar(&jx, '[');
- for(i=0; i<argc; i++){
- jsonAppendSeparator(&jx);
- jsonAppendValue(&jx, argv[i]);
- }
- jsonAppendChar(&jx, ']');
- jsonResult(&jx);
- sqlite3_result_subtype(ctx, JSON_SUBTYPE);
-}
+ if( pTab && rc==SQLITE_OK ){
+ int iHash = sessionChangeHash(pTab, 0, aRec, pTab->nChange);
-/*
-** json_array_length(JSON)
-** json_array_length(JSON, PATH)
-**
-** Return the number of elements in the top-level JSON array.
-** Return 0 if the input is not a well-formed JSON array.
-*/
-static void jsonArrayLengthFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- JsonParse *p; /* The parse */
- sqlite3_int64 n = 0;
- u32 i;
- JsonNode *pNode;
-
- p = jsonParseCached(ctx, argv);
- if( p==0 ) return;
- assert( p->nNode );
- if( argc==2 ){
- const char *zPath = (const char*)sqlite3_value_text(argv[1]);
- pNode = jsonLookup(p, zPath, 0, ctx);
- }else{
- pNode = p->aNode;
- }
- if( pNode==0 ){
- return;
- }
- if( pNode->eType==JSON_ARRAY ){
- assert( (pNode->jnFlags & JNODE_APPEND)==0 );
- for(i=1; i<=pNode->n; n++){
- i += jsonNodeSize(&pNode[i]);
+ for(pChange=pTab->apChange[iHash]; pChange; pChange=pChange->pNext){
+ if( sessionChangeEqual(pTab, 0, aRec, 0, pChange->aRecord) ){
+ break;
+ }
+ }
}
- }
- sqlite3_result_int64(ctx, n);
-}
-/*
-** json_extract(JSON, PATH, ...)
-**
-** Return the element described by PATH. Return NULL if there is no
-** PATH element. If there are multiple PATHs, then return a JSON array
-** with the result from each path. Throw an error if the JSON or any PATH
-** is malformed.
-*/
-static void jsonExtractFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- JsonParse *p; /* The parse */
- JsonNode *pNode;
- const char *zPath;
- JsonString jx;
- int i;
+ if( pChange ){
+ assert( pChange->op==SQLITE_DELETE || pChange->op==SQLITE_INSERT );
+ switch( pIter->op ){
+ case SQLITE_INSERT:
+ if( pChange->op==SQLITE_INSERT ){
+ bDone = 1;
+ if( pChange->bIndirect==0 ){
+ sessionAppendByte(&sOut, SQLITE_UPDATE, &rc);
+ sessionAppendByte(&sOut, pIter->bIndirect, &rc);
+ sessionAppendBlob(&sOut, pChange->aRecord, pChange->nRecord, &rc);
+ sessionAppendBlob(&sOut, aRec, nRec, &rc);
+ }
+ }
+ break;
- if( argc<2 ) return;
- p = jsonParseCached(ctx, argv);
- if( p==0 ) return;
- jsonInit(&jx, ctx);
- jsonAppendChar(&jx, '[');
- for(i=1; i<argc; i++){
- zPath = (const char*)sqlite3_value_text(argv[i]);
- pNode = jsonLookup(p, zPath, 0, ctx);
- if( p->nErr ) break;
- if( argc>2 ){
- jsonAppendSeparator(&jx);
- if( pNode ){
- jsonRenderNode(pNode, &jx, 0);
- }else{
- jsonAppendRaw(&jx, "null", 4);
- }
- }else if( pNode ){
- jsonReturn(pNode, ctx, 0);
- }
- }
- if( argc>2 && i==argc ){
- jsonAppendChar(&jx, ']');
- jsonResult(&jx);
- sqlite3_result_subtype(ctx, JSON_SUBTYPE);
- }
- jsonReset(&jx);
-}
+ case SQLITE_UPDATE:
+ bDone = 1;
+ if( pChange->op==SQLITE_DELETE ){
+ if( pChange->bIndirect==0 ){
+ u8 *pCsr = aRec;
+ sessionSkipRecord(&pCsr, pIter->nCol);
+ sessionAppendByte(&sOut, SQLITE_INSERT, &rc);
+ sessionAppendByte(&sOut, pIter->bIndirect, &rc);
+ sessionAppendRecordMerge(&sOut, pIter->nCol,
+ pCsr, nRec-(pCsr-aRec),
+ pChange->aRecord, pChange->nRecord, &rc
+ );
+ }
+ }else{
+ sessionAppendPartialUpdate(&sOut, pIter,
+ aRec, nRec, pChange->aRecord, pChange->nRecord, &rc
+ );
+ }
+ break;
-/* This is the RFC 7396 MergePatch algorithm.
-*/
-static JsonNode *jsonMergePatch(
- JsonParse *pParse, /* The JSON parser that contains the TARGET */
- u32 iTarget, /* Node of the TARGET in pParse */
- JsonNode *pPatch /* The PATCH */
-){
- u32 i, j;
- u32 iRoot;
- JsonNode *pTarget;
- if( pPatch->eType!=JSON_OBJECT ){
- return pPatch;
- }
- assert( iTarget>=0 && iTarget<pParse->nNode );
- pTarget = &pParse->aNode[iTarget];
- assert( (pPatch->jnFlags & JNODE_APPEND)==0 );
- if( pTarget->eType!=JSON_OBJECT ){
- jsonRemoveAllNulls(pPatch);
- return pPatch;
- }
- iRoot = iTarget;
- for(i=1; i<pPatch->n; i += jsonNodeSize(&pPatch[i+1])+1){
- u32 nKey;
- const char *zKey;
- assert( pPatch[i].eType==JSON_STRING );
- assert( pPatch[i].jnFlags & JNODE_LABEL );
- nKey = pPatch[i].n;
- zKey = pPatch[i].u.zJContent;
- assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
- for(j=1; j<pTarget->n; j += jsonNodeSize(&pTarget[j+1])+1 ){
- assert( pTarget[j].eType==JSON_STRING );
- assert( pTarget[j].jnFlags & JNODE_LABEL );
- assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
- if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){
- if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break;
- if( pPatch[i+1].eType==JSON_NULL ){
- pTarget[j+1].jnFlags |= JNODE_REMOVE;
- }else{
- JsonNode *pNew = jsonMergePatch(pParse, iTarget+j+1, &pPatch[i+1]);
- if( pNew==0 ) return 0;
- pTarget = &pParse->aNode[iTarget];
- if( pNew!=&pTarget[j+1] ){
- pTarget[j+1].u.pPatch = pNew;
- pTarget[j+1].jnFlags |= JNODE_PATCH;
+ default:
+ assert( pIter->op==SQLITE_DELETE );
+ bDone = 1;
+ if( pChange->op==SQLITE_INSERT ){
+ sessionAppendByte(&sOut, SQLITE_DELETE, &rc);
+ sessionAppendByte(&sOut, pIter->bIndirect, &rc);
+ sessionAppendRecordMerge(&sOut, pIter->nCol,
+ pChange->aRecord, pChange->nRecord, aRec, nRec, &rc
+ );
}
- }
- break;
+ break;
}
}
- if( j>=pTarget->n && pPatch[i+1].eType!=JSON_NULL ){
- int iStart, iPatch;
- iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
- jsonParseAddNode(pParse, JSON_STRING, nKey, zKey);
- iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
- if( pParse->oom ) return 0;
- jsonRemoveAllNulls(pPatch);
- pTarget = &pParse->aNode[iTarget];
- pParse->aNode[iRoot].jnFlags |= JNODE_APPEND;
- pParse->aNode[iRoot].u.iAppend = iStart - iRoot;
- iRoot = iStart;
- pParse->aNode[iPatch].jnFlags |= JNODE_PATCH;
- pParse->aNode[iPatch].u.pPatch = &pPatch[i+1];
- }
- }
- return pTarget;
-}
-
-/*
-** Implementation of the json_mergepatch(JSON1,JSON2) function. Return a JSON
-** object that is the result of running the RFC 7396 MergePatch() algorithm
-** on the two arguments.
-*/
-static void jsonPatchFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- JsonParse x; /* The JSON that is being patched */
- JsonParse y; /* The patch */
- JsonNode *pResult; /* The result of the merge */
-
- UNUSED_PARAM(argc);
- if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
- if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){
- jsonParseReset(&x);
- return;
- }
- pResult = jsonMergePatch(&x, 0, y.aNode);
- assert( pResult!=0 || x.oom );
- if( pResult ){
- jsonReturnJson(pResult, ctx, 0);
- }else{
- sqlite3_result_error_nomem(ctx);
- }
- jsonParseReset(&x);
- jsonParseReset(&y);
-}
-
-
-/*
-** Implementation of the json_object(NAME,VALUE,...) function. Return a JSON
-** object that contains all name/value given in arguments. Or if any name
-** is not a string or if any value is a BLOB, throw an error.
-*/
-static void jsonObjectFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- int i;
- JsonString jx;
- const char *z;
- u32 n;
- if( argc&1 ){
- sqlite3_result_error(ctx, "json_object() requires an even number "
- "of arguments", -1);
- return;
- }
- jsonInit(&jx, ctx);
- jsonAppendChar(&jx, '{');
- for(i=0; i<argc; i+=2){
- if( sqlite3_value_type(argv[i])!=SQLITE_TEXT ){
- sqlite3_result_error(ctx, "json_object() labels must be TEXT", -1);
- jsonReset(&jx);
- return;
+ if( bDone==0 ){
+ sessionAppendByte(&sOut, pIter->op, &rc);
+ sessionAppendByte(&sOut, pIter->bIndirect, &rc);
+ sessionAppendBlob(&sOut, aRec, nRec, &rc);
}
- jsonAppendSeparator(&jx);
- z = (const char*)sqlite3_value_text(argv[i]);
- n = (u32)sqlite3_value_bytes(argv[i]);
- jsonAppendString(&jx, z, n);
- jsonAppendChar(&jx, ':');
- jsonAppendValue(&jx, argv[i+1]);
+ if( rc==SQLITE_OK && xOutput && sOut.nBuf>sessions_strm_chunk_size ){
+ rc = xOutput(pOut, sOut.aBuf, sOut.nBuf);
+ sOut.nBuf = 0;
+ }
+ if( rc ) break;
}
- jsonAppendChar(&jx, '}');
- jsonResult(&jx);
- sqlite3_result_subtype(ctx, JSON_SUBTYPE);
-}
-
-/*
-** json_remove(JSON, PATH, ...)
-**
-** Remove the named elements from JSON and return the result. malformed
-** JSON or PATH arguments result in an error.
-*/
-static void jsonRemoveFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- JsonParse x; /* The parse */
- JsonNode *pNode;
- const char *zPath;
- u32 i;
-
- if( argc<1 ) return;
- if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
- assert( x.nNode );
- for(i=1; i<(u32)argc; i++){
- zPath = (const char*)sqlite3_value_text(argv[i]);
- if( zPath==0 ) goto remove_done;
- pNode = jsonLookup(&x, zPath, 0, ctx);
- if( x.nErr ) goto remove_done;
- if( pNode ) pNode->jnFlags |= JNODE_REMOVE;
- }
- if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){
- jsonReturnJson(x.aNode, ctx, 0);
+ if( rc!=SQLITE_OK ){
+ sqlite3_free(sOut.aBuf);
+ memset(&sOut, 0, sizeof(sOut));
}
-remove_done:
- jsonParseReset(&x);
-}
-
-/*
-** json_replace(JSON, PATH, VALUE, ...)
-**
-** Replace the value at PATH with VALUE. If PATH does not already exist,
-** this routine is a no-op. If JSON or PATH is malformed, throw an error.
-*/
-static void jsonReplaceFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- JsonParse x; /* The parse */
- JsonNode *pNode;
- const char *zPath;
- u32 i;
- if( argc<1 ) return;
- if( (argc&1)==0 ) {
- jsonWrongNumArgs(ctx, "replace");
- return;
- }
- if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
- assert( x.nNode );
- for(i=1; i<(u32)argc; i+=2){
- zPath = (const char*)sqlite3_value_text(argv[i]);
- pNode = jsonLookup(&x, zPath, 0, ctx);
- if( x.nErr ) goto replace_err;
- if( pNode ){
- pNode->jnFlags |= (u8)JNODE_REPLACE;
- pNode->u.iReplace = i + 1;
+ if( rc==SQLITE_OK ){
+ if( xOutput ){
+ if( sOut.nBuf>0 ){
+ rc = xOutput(pOut, sOut.aBuf, sOut.nBuf);
+ }
+ }else{
+ *ppOut = (void*)sOut.aBuf;
+ *pnOut = sOut.nBuf;
+ sOut.aBuf = 0;
}
}
- if( x.aNode[0].jnFlags & JNODE_REPLACE ){
- sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
- }else{
- jsonReturnJson(x.aNode, ctx, argv);
- }
-replace_err:
- jsonParseReset(&x);
+ sqlite3_free(sOut.aBuf);
+ return rc;
}
-/*
-** json_set(JSON, PATH, VALUE, ...)
-**
-** Set the value at PATH to VALUE. Create the PATH if it does not already
-** exist. Overwrite existing values that do exist.
-** If JSON or PATH is malformed, throw an error.
-**
-** json_insert(JSON, PATH, VALUE, ...)
-**
-** Create PATH and initialize it to VALUE. If PATH already exists, this
-** routine is a no-op. If JSON or PATH is malformed, throw an error.
+/*
+** Create a new rebaser object.
*/
-static void jsonSetFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- JsonParse x; /* The parse */
- JsonNode *pNode;
- const char *zPath;
- u32 i;
- int bApnd;
- int bIsSet = *(int*)sqlite3_user_data(ctx);
+SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew){
+ int rc = SQLITE_OK;
+ sqlite3_rebaser *pNew;
- if( argc<1 ) return;
- if( (argc&1)==0 ) {
- jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert");
- return;
- }
- if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
- assert( x.nNode );
- for(i=1; i<(u32)argc; i+=2){
- zPath = (const char*)sqlite3_value_text(argv[i]);
- bApnd = 0;
- pNode = jsonLookup(&x, zPath, &bApnd, ctx);
- if( x.oom ){
- sqlite3_result_error_nomem(ctx);
- goto jsonSetDone;
- }else if( x.nErr ){
- goto jsonSetDone;
- }else if( pNode && (bApnd || bIsSet) ){
- pNode->jnFlags |= (u8)JNODE_REPLACE;
- pNode->u.iReplace = i + 1;
- }
- }
- if( x.aNode[0].jnFlags & JNODE_REPLACE ){
- sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
+ pNew = sqlite3_malloc(sizeof(sqlite3_rebaser));
+ if( pNew==0 ){
+ rc = SQLITE_NOMEM;
}else{
- jsonReturnJson(x.aNode, ctx, argv);
+ memset(pNew, 0, sizeof(sqlite3_rebaser));
}
-jsonSetDone:
- jsonParseReset(&x);
+ *ppNew = pNew;
+ return rc;
}
-/*
-** json_type(JSON)
-** json_type(JSON, PATH)
-**
-** Return the top-level "type" of a JSON string. Throw an error if
-** either the JSON or PATH inputs are not well-formed.
+/*
+** Call this one or more times to configure a rebaser.
*/
-static void jsonTypeFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
+SQLITE_API int sqlite3rebaser_configure(
+ sqlite3_rebaser *p,
+ int nRebase, const void *pRebase
){
- JsonParse x; /* The parse */
- const char *zPath;
- JsonNode *pNode;
-
- if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
- assert( x.nNode );
- if( argc==2 ){
- zPath = (const char*)sqlite3_value_text(argv[1]);
- pNode = jsonLookup(&x, zPath, 0, ctx);
- }else{
- pNode = x.aNode;
- }
- if( pNode ){
- sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC);
+ sqlite3_changeset_iter *pIter = 0; /* Iterator opened on pData/nData */
+ int rc; /* Return code */
+ rc = sqlite3changeset_start(&pIter, nRebase, (void*)pRebase);
+ if( rc==SQLITE_OK ){
+ rc = sessionChangesetToHash(pIter, &p->grp, 1);
}
- jsonParseReset(&x);
+ sqlite3changeset_finalize(pIter);
+ return rc;
}
-/*
-** json_valid(JSON)
-**
-** Return 1 if JSON is a well-formed JSON string according to RFC-7159.
-** Return 0 otherwise.
+/*
+** Rebase a changeset according to current rebaser configuration
*/
-static void jsonValidFunc(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
+SQLITE_API int sqlite3rebaser_rebase(
+ sqlite3_rebaser *p,
+ int nIn, const void *pIn,
+ int *pnOut, void **ppOut
){
- JsonParse x; /* The parse */
- int rc = 0;
+ sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */
+ int rc = sqlite3changeset_start(&pIter, nIn, (void*)pIn);
- UNUSED_PARAM(argc);
- if( jsonParse(&x, 0, (const char*)sqlite3_value_text(argv[0]))==0 ){
- rc = 1;
+ if( rc==SQLITE_OK ){
+ rc = sessionRebase(p, pIter, 0, 0, pnOut, ppOut);
+ sqlite3changeset_finalize(pIter);
}
- jsonParseReset(&x);
- sqlite3_result_int(ctx, rc);
-}
-
-/****************************************************************************
-** Aggregate SQL function implementations
-****************************************************************************/
-/*
-** json_group_array(VALUE)
-**
-** Return a JSON array composed of all values in the aggregate.
-*/
-static void jsonArrayStep(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- JsonString *pStr;
- UNUSED_PARAM(argc);
- pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
- if( pStr ){
- if( pStr->zBuf==0 ){
- jsonInit(pStr, ctx);
- jsonAppendChar(pStr, '[');
- }else{
- jsonAppendChar(pStr, ',');
- pStr->pCtx = ctx;
- }
- jsonAppendValue(pStr, argv[0]);
- }
-}
-static void jsonArrayFinal(sqlite3_context *ctx){
- JsonString *pStr;
- pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
- if( pStr ){
- pStr->pCtx = ctx;
- jsonAppendChar(pStr, ']');
- if( pStr->bErr ){
- if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
- assert( pStr->bStatic );
- }else{
- sqlite3_result_text(ctx, pStr->zBuf, pStr->nUsed,
- pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
- pStr->bStatic = 1;
- }
- }else{
- sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC);
- }
- sqlite3_result_subtype(ctx, JSON_SUBTYPE);
+ return rc;
}
-/*
-** json_group_obj(NAME,VALUE)
-**
-** Return a JSON object composed of all names and values in the aggregate.
+/*
+** Rebase a changeset according to current rebaser configuration
*/
-static void jsonObjectStep(
- sqlite3_context *ctx,
- int argc,
- sqlite3_value **argv
-){
- JsonString *pStr;
- const char *z;
- u32 n;
- UNUSED_PARAM(argc);
- pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
- if( pStr ){
- if( pStr->zBuf==0 ){
- jsonInit(pStr, ctx);
- jsonAppendChar(pStr, '{');
- }else{
- jsonAppendChar(pStr, ',');
- pStr->pCtx = ctx;
- }
- z = (const char*)sqlite3_value_text(argv[0]);
- n = (u32)sqlite3_value_bytes(argv[0]);
- jsonAppendString(pStr, z, n);
- jsonAppendChar(pStr, ':');
- jsonAppendValue(pStr, argv[1]);
- }
-}
-static void jsonObjectFinal(sqlite3_context *ctx){
- JsonString *pStr;
- pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
- if( pStr ){
- jsonAppendChar(pStr, '}');
- if( pStr->bErr ){
- if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
- assert( pStr->bStatic );
- }else{
- sqlite3_result_text(ctx, pStr->zBuf, pStr->nUsed,
- pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
- pStr->bStatic = 1;
- }
- }else{
- sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC);
- }
- sqlite3_result_subtype(ctx, JSON_SUBTYPE);
-}
-
-
-#ifndef SQLITE_OMIT_VIRTUALTABLE
-/****************************************************************************
-** The json_each virtual table
-****************************************************************************/
-typedef struct JsonEachCursor JsonEachCursor;
-struct JsonEachCursor {
- sqlite3_vtab_cursor base; /* Base class - must be first */
- u32 iRowid; /* The rowid */
- u32 iBegin; /* The first node of the scan */
- u32 i; /* Index in sParse.aNode[] of current row */
- u32 iEnd; /* EOF when i equals or exceeds this value */
- u8 eType; /* Type of top-level element */
- u8 bRecursive; /* True for json_tree(). False for json_each() */
- char *zJson; /* Input JSON */
- char *zRoot; /* Path by which to filter zJson */
- JsonParse sParse; /* Parse of the input JSON */
-};
-
-/* Constructor for the json_each virtual table */
-static int jsonEachConnect(
- sqlite3 *db,
- void *pAux,
- int argc, const char *const*argv,
- sqlite3_vtab **ppVtab,
- char **pzErr
+SQLITE_API int sqlite3rebaser_rebase_strm(
+ sqlite3_rebaser *p,
+ int (*xInput)(void *pIn, void *pData, int *pnData),
+ void *pIn,
+ int (*xOutput)(void *pOut, const void *pData, int nData),
+ void *pOut
){
- sqlite3_vtab *pNew;
- int rc;
-
-/* Column numbers */
-#define JEACH_KEY 0
-#define JEACH_VALUE 1
-#define JEACH_TYPE 2
-#define JEACH_ATOM 3
-#define JEACH_ID 4
-#define JEACH_PARENT 5
-#define JEACH_FULLKEY 6
-#define JEACH_PATH 7
-#define JEACH_JSON 8
-#define JEACH_ROOT 9
+ sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */
+ int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn);
- UNUSED_PARAM(pzErr);
- UNUSED_PARAM(argv);
- UNUSED_PARAM(argc);
- UNUSED_PARAM(pAux);
- rc = sqlite3_declare_vtab(db,
- "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path,"
- "json HIDDEN,root HIDDEN)");
if( rc==SQLITE_OK ){
- pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
- if( pNew==0 ) return SQLITE_NOMEM;
- memset(pNew, 0, sizeof(*pNew));
+ rc = sessionRebase(p, pIter, xOutput, pOut, 0, 0);
+ sqlite3changeset_finalize(pIter);
}
- return rc;
-}
-
-/* destructor for json_each virtual table */
-static int jsonEachDisconnect(sqlite3_vtab *pVtab){
- sqlite3_free(pVtab);
- return SQLITE_OK;
-}
-
-/* constructor for a JsonEachCursor object for json_each(). */
-static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
- JsonEachCursor *pCur;
- UNUSED_PARAM(p);
- pCur = sqlite3_malloc( sizeof(*pCur) );
- if( pCur==0 ) return SQLITE_NOMEM;
- memset(pCur, 0, sizeof(*pCur));
- *ppCursor = &pCur->base;
- return SQLITE_OK;
-}
-
-/* constructor for a JsonEachCursor object for json_tree(). */
-static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
- int rc = jsonEachOpenEach(p, ppCursor);
- if( rc==SQLITE_OK ){
- JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor;
- pCur->bRecursive = 1;
- }
return rc;
}
-/* Reset a JsonEachCursor back to its original state. Free any memory
-** held. */
-static void jsonEachCursorReset(JsonEachCursor *p){
- sqlite3_free(p->zJson);
- sqlite3_free(p->zRoot);
- jsonParseReset(&p->sParse);
- p->iRowid = 0;
- p->i = 0;
- p->iEnd = 0;
- p->eType = 0;
- p->zJson = 0;
- p->zRoot = 0;
-}
-
-/* Destructor for a jsonEachCursor object */
-static int jsonEachClose(sqlite3_vtab_cursor *cur){
- JsonEachCursor *p = (JsonEachCursor*)cur;
- jsonEachCursorReset(p);
- sqlite3_free(cur);
- return SQLITE_OK;
-}
-
-/* Return TRUE if the jsonEachCursor object has been advanced off the end
-** of the JSON object */
-static int jsonEachEof(sqlite3_vtab_cursor *cur){
- JsonEachCursor *p = (JsonEachCursor*)cur;
- return p->i >= p->iEnd;
-}
-
-/* Advance the cursor to the next element for json_tree() */
-static int jsonEachNext(sqlite3_vtab_cursor *cur){
- JsonEachCursor *p = (JsonEachCursor*)cur;
- if( p->bRecursive ){
- if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++;
- p->i++;
- p->iRowid++;
- if( p->i<p->iEnd ){
- u32 iUp = p->sParse.aUp[p->i];
- JsonNode *pUp = &p->sParse.aNode[iUp];
- p->eType = pUp->eType;
- if( pUp->eType==JSON_ARRAY ){
- if( iUp==p->i-1 ){
- pUp->u.iKey = 0;
- }else{
- pUp->u.iKey++;
- }
- }
- }
- }else{
- switch( p->eType ){
- case JSON_ARRAY: {
- p->i += jsonNodeSize(&p->sParse.aNode[p->i]);
- p->iRowid++;
- break;
- }
- case JSON_OBJECT: {
- p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]);
- p->iRowid++;
- break;
- }
- default: {
- p->i = p->iEnd;
- break;
- }
- }
- }
- return SQLITE_OK;
-}
-
-/* Append the name of the path for element i to pStr
+/*
+** Destroy a rebaser object
*/
-static void jsonEachComputePath(
- JsonEachCursor *p, /* The cursor */
- JsonString *pStr, /* Write the path here */
- u32 i /* Path to this element */
-){
- JsonNode *pNode, *pUp;
- u32 iUp;
- if( i==0 ){
- jsonAppendChar(pStr, '$');
- return;
- }
- iUp = p->sParse.aUp[i];
- jsonEachComputePath(p, pStr, iUp);
- pNode = &p->sParse.aNode[i];
- pUp = &p->sParse.aNode[iUp];
- if( pUp->eType==JSON_ARRAY ){
- jsonPrintf(30, pStr, "[%d]", pUp->u.iKey);
- }else{
- assert( pUp->eType==JSON_OBJECT );
- if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--;
- assert( pNode->eType==JSON_STRING );
- assert( pNode->jnFlags & JNODE_LABEL );
- jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1);
+SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p){
+ if( p ){
+ sessionDeleteTable(p->grp.pList);
+ sqlite3_free(p);
}
}
-/* Return the value of a column */
-static int jsonEachColumn(
- sqlite3_vtab_cursor *cur, /* The cursor */
- sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
- int i /* Which column to return */
-){
- JsonEachCursor *p = (JsonEachCursor*)cur;
- JsonNode *pThis = &p->sParse.aNode[p->i];
- switch( i ){
- case JEACH_KEY: {
- if( p->i==0 ) break;
- if( p->eType==JSON_OBJECT ){
- jsonReturn(pThis, ctx, 0);
- }else if( p->eType==JSON_ARRAY ){
- u32 iKey;
- if( p->bRecursive ){
- if( p->iRowid==0 ) break;
- iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey;
- }else{
- iKey = p->iRowid;
- }
- sqlite3_result_int64(ctx, (sqlite3_int64)iKey);
- }
- break;
- }
- case JEACH_VALUE: {
- if( pThis->jnFlags & JNODE_LABEL ) pThis++;
- jsonReturn(pThis, ctx, 0);
- break;
- }
- case JEACH_TYPE: {
- if( pThis->jnFlags & JNODE_LABEL ) pThis++;
- sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC);
- break;
- }
- case JEACH_ATOM: {
- if( pThis->jnFlags & JNODE_LABEL ) pThis++;
- if( pThis->eType>=JSON_ARRAY ) break;
- jsonReturn(pThis, ctx, 0);
- break;
- }
- case JEACH_ID: {
- sqlite3_result_int64(ctx,
- (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0));
- break;
- }
- case JEACH_PARENT: {
- if( p->i>p->iBegin && p->bRecursive ){
- sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]);
- }
- break;
- }
- case JEACH_FULLKEY: {
- JsonString x;
- jsonInit(&x, ctx);
- if( p->bRecursive ){
- jsonEachComputePath(p, &x, p->i);
- }else{
- if( p->zRoot ){
- jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot));
- }else{
- jsonAppendChar(&x, '$');
- }
- if( p->eType==JSON_ARRAY ){
- jsonPrintf(30, &x, "[%d]", p->iRowid);
- }else{
- jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1);
- }
- }
- jsonResult(&x);
- break;
- }
- case JEACH_PATH: {
- if( p->bRecursive ){
- JsonString x;
- jsonInit(&x, ctx);
- jsonEachComputePath(p, &x, p->sParse.aUp[p->i]);
- jsonResult(&x);
- break;
+/*
+** Global configuration
+*/
+SQLITE_API int sqlite3session_config(int op, void *pArg){
+ int rc = SQLITE_OK;
+ switch( op ){
+ case SQLITE_SESSION_CONFIG_STRMSIZE: {
+ int *pInt = (int*)pArg;
+ if( *pInt>0 ){
+ sessions_strm_chunk_size = *pInt;
}
- /* For json_each() path and root are the same so fall through
- ** into the root case */
- }
- default: {
- const char *zRoot = p->zRoot;
- if( zRoot==0 ) zRoot = "$";
- sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC);
+ *pInt = sessions_strm_chunk_size;
break;
}
- case JEACH_JSON: {
- assert( i==JEACH_JSON );
- sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC);
+ default:
+ rc = SQLITE_MISUSE;
break;
- }
- }
- return SQLITE_OK;
-}
-
-/* Return the current rowid value */
-static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
- JsonEachCursor *p = (JsonEachCursor*)cur;
- *pRowid = p->iRowid;
- return SQLITE_OK;
-}
-
-/* The query strategy is to look for an equality constraint on the json
-** column. Without such a constraint, the table cannot operate. idxNum is
-** 1 if the constraint is found, 3 if the constraint and zRoot are found,
-** and 0 otherwise.
-*/
-static int jsonEachBestIndex(
- sqlite3_vtab *tab,
- sqlite3_index_info *pIdxInfo
-){
- int i;
- int jsonIdx = -1;
- int rootIdx = -1;
- const struct sqlite3_index_constraint *pConstraint;
-
- UNUSED_PARAM(tab);
- pConstraint = pIdxInfo->aConstraint;
- for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
- if( pConstraint->usable==0 ) continue;
- if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
- switch( pConstraint->iColumn ){
- case JEACH_JSON: jsonIdx = i; break;
- case JEACH_ROOT: rootIdx = i; break;
- default: /* no-op */ break;
- }
}
- if( jsonIdx<0 ){
- pIdxInfo->idxNum = 0;
- pIdxInfo->estimatedCost = 1e99;
- }else{
- pIdxInfo->estimatedCost = 1.0;
- pIdxInfo->aConstraintUsage[jsonIdx].argvIndex = 1;
- pIdxInfo->aConstraintUsage[jsonIdx].omit = 1;
- if( rootIdx<0 ){
- pIdxInfo->idxNum = 1;
- }else{
- pIdxInfo->aConstraintUsage[rootIdx].argvIndex = 2;
- pIdxInfo->aConstraintUsage[rootIdx].omit = 1;
- pIdxInfo->idxNum = 3;
- }
- }
- return SQLITE_OK;
-}
-
-/* Start a search on a new JSON string */
-static int jsonEachFilter(
- sqlite3_vtab_cursor *cur,
- int idxNum, const char *idxStr,
- int argc, sqlite3_value **argv
-){
- JsonEachCursor *p = (JsonEachCursor*)cur;
- const char *z;
- const char *zRoot = 0;
- sqlite3_int64 n;
-
- UNUSED_PARAM(idxStr);
- UNUSED_PARAM(argc);
- jsonEachCursorReset(p);
- if( idxNum==0 ) return SQLITE_OK;
- z = (const char*)sqlite3_value_text(argv[0]);
- if( z==0 ) return SQLITE_OK;
- n = sqlite3_value_bytes(argv[0]);
- p->zJson = sqlite3_malloc64( n+1 );
- if( p->zJson==0 ) return SQLITE_NOMEM;
- memcpy(p->zJson, z, (size_t)n+1);
- if( jsonParse(&p->sParse, 0, p->zJson) ){
- int rc = SQLITE_NOMEM;
- if( p->sParse.oom==0 ){
- sqlite3_free(cur->pVtab->zErrMsg);
- cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON");
- if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR;
- }
- jsonEachCursorReset(p);
- return rc;
- }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){
- jsonEachCursorReset(p);
- return SQLITE_NOMEM;
- }else{
- JsonNode *pNode = 0;
- if( idxNum==3 ){
- const char *zErr = 0;
- zRoot = (const char*)sqlite3_value_text(argv[1]);
- if( zRoot==0 ) return SQLITE_OK;
- n = sqlite3_value_bytes(argv[1]);
- p->zRoot = sqlite3_malloc64( n+1 );
- if( p->zRoot==0 ) return SQLITE_NOMEM;
- memcpy(p->zRoot, zRoot, (size_t)n+1);
- if( zRoot[0]!='$' ){
- zErr = zRoot;
- }else{
- pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr);
- }
- if( zErr ){
- sqlite3_free(cur->pVtab->zErrMsg);
- cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr);
- jsonEachCursorReset(p);
- return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM;
- }else if( pNode==0 ){
- return SQLITE_OK;
- }
- }else{
- pNode = p->sParse.aNode;
- }
- p->iBegin = p->i = (int)(pNode - p->sParse.aNode);
- p->eType = pNode->eType;
- if( p->eType>=JSON_ARRAY ){
- pNode->u.iKey = 0;
- p->iEnd = p->i + pNode->n + 1;
- if( p->bRecursive ){
- p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType;
- if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){
- p->i--;
- }
- }else{
- p->i++;
- }
- }else{
- p->iEnd = p->i+1;
- }
- }
- return SQLITE_OK;
-}
-
-/* The methods of the json_each virtual table */
-static sqlite3_module jsonEachModule = {
- 0, /* iVersion */
- 0, /* xCreate */
- jsonEachConnect, /* xConnect */
- jsonEachBestIndex, /* xBestIndex */
- jsonEachDisconnect, /* xDisconnect */
- 0, /* xDestroy */
- jsonEachOpenEach, /* xOpen - open a cursor */
- jsonEachClose, /* xClose - close a cursor */
- jsonEachFilter, /* xFilter - configure scan constraints */
- jsonEachNext, /* xNext - advance a cursor */
- jsonEachEof, /* xEof - check for end of scan */
- jsonEachColumn, /* xColumn - read data */
- jsonEachRowid, /* xRowid - read data */
- 0, /* xUpdate */
- 0, /* xBegin */
- 0, /* xSync */
- 0, /* xCommit */
- 0, /* xRollback */
- 0, /* xFindMethod */
- 0, /* xRename */
- 0, /* xSavepoint */
- 0, /* xRelease */
- 0 /* xRollbackTo */
-};
-
-/* The methods of the json_tree virtual table. */
-static sqlite3_module jsonTreeModule = {
- 0, /* iVersion */
- 0, /* xCreate */
- jsonEachConnect, /* xConnect */
- jsonEachBestIndex, /* xBestIndex */
- jsonEachDisconnect, /* xDisconnect */
- 0, /* xDestroy */
- jsonEachOpenTree, /* xOpen - open a cursor */
- jsonEachClose, /* xClose - close a cursor */
- jsonEachFilter, /* xFilter - configure scan constraints */
- jsonEachNext, /* xNext - advance a cursor */
- jsonEachEof, /* xEof - check for end of scan */
- jsonEachColumn, /* xColumn - read data */
- jsonEachRowid, /* xRowid - read data */
- 0, /* xUpdate */
- 0, /* xBegin */
- 0, /* xSync */
- 0, /* xCommit */
- 0, /* xRollback */
- 0, /* xFindMethod */
- 0, /* xRename */
- 0, /* xSavepoint */
- 0, /* xRelease */
- 0 /* xRollbackTo */
-};
-#endif /* SQLITE_OMIT_VIRTUALTABLE */
-
-/****************************************************************************
-** The following routines are the only publically visible identifiers in this
-** file. Call the following routines in order to register the various SQL
-** functions and the virtual table implemented by this file.
-****************************************************************************/
-
-SQLITE_PRIVATE int sqlite3Json1Init(sqlite3 *db){
- int rc = SQLITE_OK;
- unsigned int i;
- static const struct {
- const char *zName;
- int nArg;
- int flag;
- void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
- } aFunc[] = {
- { "json", 1, 0, jsonRemoveFunc },
- { "json_array", -1, 0, jsonArrayFunc },
- { "json_array_length", 1, 0, jsonArrayLengthFunc },
- { "json_array_length", 2, 0, jsonArrayLengthFunc },
- { "json_extract", -1, 0, jsonExtractFunc },
- { "json_insert", -1, 0, jsonSetFunc },
- { "json_object", -1, 0, jsonObjectFunc },
- { "json_patch", 2, 0, jsonPatchFunc },
- { "json_quote", 1, 0, jsonQuoteFunc },
- { "json_remove", -1, 0, jsonRemoveFunc },
- { "json_replace", -1, 0, jsonReplaceFunc },
- { "json_set", -1, 1, jsonSetFunc },
- { "json_type", 1, 0, jsonTypeFunc },
- { "json_type", 2, 0, jsonTypeFunc },
- { "json_valid", 1, 0, jsonValidFunc },
-
-#if SQLITE_DEBUG
- /* DEBUG and TESTING functions */
- { "json_parse", 1, 0, jsonParseFunc },
- { "json_test1", 1, 0, jsonTest1Func },
-#endif
- };
- static const struct {
- const char *zName;
- int nArg;
- void (*xStep)(sqlite3_context*,int,sqlite3_value**);
- void (*xFinal)(sqlite3_context*);
- } aAgg[] = {
- { "json_group_array", 1, jsonArrayStep, jsonArrayFinal },
- { "json_group_object", 2, jsonObjectStep, jsonObjectFinal },
- };
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- static const struct {
- const char *zName;
- sqlite3_module *pModule;
- } aMod[] = {
- { "json_each", &jsonEachModule },
- { "json_tree", &jsonTreeModule },
- };
-#endif
- for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
- rc = sqlite3_create_function(db, aFunc[i].zName, aFunc[i].nArg,
- SQLITE_UTF8 | SQLITE_DETERMINISTIC,
- (void*)&aFunc[i].flag,
- aFunc[i].xFunc, 0, 0);
- }
- for(i=0; i<sizeof(aAgg)/sizeof(aAgg[0]) && rc==SQLITE_OK; i++){
- rc = sqlite3_create_function(db, aAgg[i].zName, aAgg[i].nArg,
- SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
- 0, aAgg[i].xStep, aAgg[i].xFinal);
- }
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- for(i=0; i<sizeof(aMod)/sizeof(aMod[0]) && rc==SQLITE_OK; i++){
- rc = sqlite3_create_module(db, aMod[i].zName, aMod[i].pModule, 0);
- }
-#endif
return rc;
}
+#endif /* SQLITE_ENABLE_SESSION && SQLITE_ENABLE_PREUPDATE_HOOK */
-#ifndef SQLITE_CORE
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-SQLITE_API int sqlite3_json_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
- return sqlite3Json1Init(db);
-}
-#endif
-#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) */
-
-/************** End of json1.c ***********************************************/
+/************** End of sqlite3session.c **************************************/
/************** Begin file fts5.c ********************************************/
@@ -184290,7 +198794,7 @@ struct Fts5ExtensionApi {
** This way, even if the tokenizer does not provide synonyms
** when tokenizing query text (it should not - to do would be
** inefficient), it doesn't matter if the user queries for
-** 'first + place' or '1st + place', as there are entires in the
+** 'first + place' or '1st + place', as there are entries in the
** FTS index corresponding to both forms of the first token.
** </ol>
**
@@ -184318,7 +198822,7 @@ struct Fts5ExtensionApi {
** extra data to the FTS index or require FTS5 to query for multiple terms,
** so it is efficient in terms of disk space and query speed. However, it
** does not support prefix queries very well. If, as suggested above, the
-** token "first" is subsituted for "1st" by the tokenizer, then the query:
+** token "first" is substituted for "1st" by the tokenizer, then the query:
**
** <codeblock>
** ... MATCH '1s*'</codeblock>
@@ -185148,6 +199652,8 @@ static Fts5ExprPhrase *sqlite3Fts5ParseTerm(
int bPrefix
);
+static void sqlite3Fts5ParseSetCaret(Fts5ExprPhrase*);
+
static Fts5ExprNearset *sqlite3Fts5ParseNearset(
Fts5Parse*,
Fts5ExprNearset*,
@@ -185208,9 +199714,12 @@ static int sqlite3Fts5VocabInit(Fts5Global*, sqlite3*);
/**************************************************************************
** Interface to automatically generated code in fts5_unicode2.c.
*/
-static int sqlite3Fts5UnicodeIsalnum(int c);
static int sqlite3Fts5UnicodeIsdiacritic(int c);
static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic);
+
+static int sqlite3Fts5UnicodeCatParse(const char*, u8*);
+static int sqlite3Fts5UnicodeCategory(int iCode);
+static void sqlite3Fts5UnicodeAscii(u8*, u8*);
/*
** End of interface to code in fts5_unicode2.c.
**************************************************************************/
@@ -185228,9 +199737,10 @@ static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic);
#define FTS5_STRING 9
#define FTS5_LP 10
#define FTS5_RP 11
-#define FTS5_COMMA 12
-#define FTS5_PLUS 13
-#define FTS5_STAR 14
+#define FTS5_CARET 12
+#define FTS5_COMMA 13
+#define FTS5_PLUS 14
+#define FTS5_STAR 15
/*
** 2000-05-29
@@ -185257,6 +199767,7 @@ static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic);
** input grammar file:
*/
/* #include <stdio.h> */
+/* #include <assert.h> */
/************ Begin %include sections from the grammar ************************/
/* #include "fts5Int.h" */
@@ -185325,27 +199836,30 @@ static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic);
** zero the stack is dynamically sized using realloc()
** sqlite3Fts5ParserARG_SDECL A static variable declaration for the %extra_argument
** sqlite3Fts5ParserARG_PDECL A parameter declaration for the %extra_argument
+** sqlite3Fts5ParserARG_PARAM Code to pass %extra_argument as a subroutine parameter
** sqlite3Fts5ParserARG_STORE Code to store %extra_argument into fts5yypParser
** sqlite3Fts5ParserARG_FETCH Code to extract %extra_argument from fts5yypParser
+** sqlite3Fts5ParserCTX_* As sqlite3Fts5ParserARG_ except for %extra_context
** fts5YYERRORSYMBOL is the code number of the error symbol. If not
** defined, then do no error processing.
** fts5YYNSTATE the combined number of states.
** fts5YYNRULE the number of rules in the grammar
+** fts5YYNFTS5TOKEN Number of terminal symbols
** fts5YY_MAX_SHIFT Maximum value for shift actions
** fts5YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions
** fts5YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions
-** fts5YY_MIN_REDUCE Minimum value for reduce actions
-** fts5YY_MAX_REDUCE Maximum value for reduce actions
** fts5YY_ERROR_ACTION The fts5yy_action[] code for syntax error
** fts5YY_ACCEPT_ACTION The fts5yy_action[] code for accept
** fts5YY_NO_ACTION The fts5yy_action[] code for no-op
+** fts5YY_MIN_REDUCE Minimum value for reduce actions
+** fts5YY_MAX_REDUCE Maximum value for reduce actions
*/
#ifndef INTERFACE
# define INTERFACE 1
#endif
/************* Begin control #defines *****************************************/
#define fts5YYCODETYPE unsigned char
-#define fts5YYNOCODE 28
+#define fts5YYNOCODE 27
#define fts5YYACTIONTYPE unsigned char
#define sqlite3Fts5ParserFTS5TOKENTYPE Fts5Token
typedef union {
@@ -185362,19 +199876,27 @@ typedef union {
#endif
#define sqlite3Fts5ParserARG_SDECL Fts5Parse *pParse;
#define sqlite3Fts5ParserARG_PDECL ,Fts5Parse *pParse
-#define sqlite3Fts5ParserARG_FETCH Fts5Parse *pParse = fts5yypParser->pParse
-#define sqlite3Fts5ParserARG_STORE fts5yypParser->pParse = pParse
-#define fts5YYNSTATE 33
-#define fts5YYNRULE 27
-#define fts5YY_MAX_SHIFT 32
-#define fts5YY_MIN_SHIFTREDUCE 50
-#define fts5YY_MAX_SHIFTREDUCE 76
-#define fts5YY_MIN_REDUCE 77
-#define fts5YY_MAX_REDUCE 103
-#define fts5YY_ERROR_ACTION 104
-#define fts5YY_ACCEPT_ACTION 105
-#define fts5YY_NO_ACTION 106
+#define sqlite3Fts5ParserARG_PARAM ,pParse
+#define sqlite3Fts5ParserARG_FETCH Fts5Parse *pParse=fts5yypParser->pParse;
+#define sqlite3Fts5ParserARG_STORE fts5yypParser->pParse=pParse;
+#define sqlite3Fts5ParserCTX_SDECL
+#define sqlite3Fts5ParserCTX_PDECL
+#define sqlite3Fts5ParserCTX_PARAM
+#define sqlite3Fts5ParserCTX_FETCH
+#define sqlite3Fts5ParserCTX_STORE
+#define fts5YYNSTATE 35
+#define fts5YYNRULE 28
+#define fts5YYNFTS5TOKEN 16
+#define fts5YY_MAX_SHIFT 34
+#define fts5YY_MIN_SHIFTREDUCE 52
+#define fts5YY_MAX_SHIFTREDUCE 79
+#define fts5YY_ERROR_ACTION 80
+#define fts5YY_ACCEPT_ACTION 81
+#define fts5YY_NO_ACTION 82
+#define fts5YY_MIN_REDUCE 83
+#define fts5YY_MAX_REDUCE 110
/************* End control #defines *******************************************/
+#define fts5YY_NLOOKAHEAD ((int)(sizeof(fts5yy_lookahead)/sizeof(fts5yy_lookahead[0])))
/* Define the fts5yytestcase() macro to be a no-op if is not already defined
** otherwise.
@@ -185403,9 +199925,6 @@ typedef union {
** N between fts5YY_MIN_SHIFTREDUCE Shift to an arbitrary state then
** and fts5YY_MAX_SHIFTREDUCE reduce by rule N-fts5YY_MIN_SHIFTREDUCE.
**
-** N between fts5YY_MIN_REDUCE Reduce by rule N-fts5YY_MIN_REDUCE
-** and fts5YY_MAX_REDUCE
-**
** N == fts5YY_ERROR_ACTION A syntax error has occurred.
**
** N == fts5YY_ACCEPT_ACTION The parser accepts its input.
@@ -185413,25 +199932,22 @@ typedef union {
** N == fts5YY_NO_ACTION No such action. Denotes unused
** slots in the fts5yy_action[] table.
**
+** N between fts5YY_MIN_REDUCE Reduce by rule N-fts5YY_MIN_REDUCE
+** and fts5YY_MAX_REDUCE
+**
** The action table is constructed as a single large table named fts5yy_action[].
** Given state S and lookahead X, the action is computed as either:
**
** (A) N = fts5yy_action[ fts5yy_shift_ofst[S] + X ]
** (B) N = fts5yy_default[S]
**
-** The (A) formula is preferred. The B formula is used instead if:
-** (1) The fts5yy_shift_ofst[S]+X value is out of range, or
-** (2) fts5yy_lookahead[fts5yy_shift_ofst[S]+X] is not equal to X, or
-** (3) fts5yy_shift_ofst[S] equal fts5YY_SHIFT_USE_DFLT.
-** (Implementation note: fts5YY_SHIFT_USE_DFLT is chosen so that
-** fts5YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X.
-** Hence only tests (1) and (2) need to be evaluated.)
+** The (A) formula is preferred. The B formula is used instead if
+** fts5yy_lookahead[fts5yy_shift_ofst[S]+X] is not equal to X.
**
** The formulas above are for computing the action when the lookahead is
** a terminal symbol. If the lookahead is a non-terminal (as occurs after
** a reduce action) then the fts5yy_reduce_ofst[] array is used in place of
-** the fts5yy_shift_ofst[] array and fts5YY_REDUCE_USE_DFLT is used in place of
-** fts5YY_SHIFT_USE_DFLT.
+** the fts5yy_shift_ofst[] array.
**
** The following are the tables generated in this section:
**
@@ -185445,54 +199961,56 @@ typedef union {
** fts5yy_default[] Default action for each state.
**
*********** Begin parsing tables **********************************************/
-#define fts5YY_ACTTAB_COUNT (98)
+#define fts5YY_ACTTAB_COUNT (105)
static const fts5YYACTIONTYPE fts5yy_action[] = {
- /* 0 */ 105, 19, 90, 6, 26, 93, 92, 24, 24, 17,
- /* 10 */ 90, 6, 26, 16, 92, 54, 24, 18, 90, 6,
- /* 20 */ 26, 10, 92, 12, 24, 75, 86, 90, 6, 26,
- /* 30 */ 13, 92, 75, 24, 20, 90, 6, 26, 101, 92,
- /* 40 */ 56, 24, 27, 90, 6, 26, 100, 92, 21, 24,
- /* 50 */ 23, 15, 30, 11, 1, 91, 22, 25, 9, 92,
- /* 60 */ 7, 24, 3, 4, 5, 3, 4, 5, 3, 77,
- /* 70 */ 4, 5, 3, 61, 23, 15, 60, 11, 80, 12,
- /* 80 */ 2, 13, 68, 10, 29, 52, 55, 75, 31, 32,
- /* 90 */ 8, 28, 5, 3, 51, 55, 72, 14,
+ /* 0 */ 81, 20, 96, 6, 28, 99, 98, 26, 26, 18,
+ /* 10 */ 96, 6, 28, 17, 98, 56, 26, 19, 96, 6,
+ /* 20 */ 28, 14, 98, 14, 26, 31, 92, 96, 6, 28,
+ /* 30 */ 108, 98, 25, 26, 21, 96, 6, 28, 78, 98,
+ /* 40 */ 58, 26, 29, 96, 6, 28, 107, 98, 22, 26,
+ /* 50 */ 24, 16, 12, 11, 1, 13, 13, 24, 16, 23,
+ /* 60 */ 11, 33, 34, 13, 97, 8, 27, 32, 98, 7,
+ /* 70 */ 26, 3, 4, 5, 3, 4, 5, 3, 83, 4,
+ /* 80 */ 5, 3, 63, 5, 3, 62, 12, 2, 86, 13,
+ /* 90 */ 9, 30, 10, 10, 54, 57, 75, 78, 78, 53,
+ /* 100 */ 57, 15, 82, 82, 71,
};
static const fts5YYCODETYPE fts5yy_lookahead[] = {
/* 0 */ 16, 17, 18, 19, 20, 22, 22, 24, 24, 17,
/* 10 */ 18, 19, 20, 7, 22, 9, 24, 17, 18, 19,
- /* 20 */ 20, 10, 22, 9, 24, 14, 17, 18, 19, 20,
- /* 30 */ 9, 22, 14, 24, 17, 18, 19, 20, 26, 22,
+ /* 20 */ 20, 9, 22, 9, 24, 13, 17, 18, 19, 20,
+ /* 30 */ 26, 22, 24, 24, 17, 18, 19, 20, 15, 22,
/* 40 */ 9, 24, 17, 18, 19, 20, 26, 22, 21, 24,
- /* 50 */ 6, 7, 13, 9, 10, 18, 21, 20, 5, 22,
- /* 60 */ 5, 24, 3, 1, 2, 3, 1, 2, 3, 0,
- /* 70 */ 1, 2, 3, 11, 6, 7, 11, 9, 5, 9,
- /* 80 */ 10, 9, 11, 10, 12, 8, 9, 14, 24, 25,
- /* 90 */ 23, 24, 2, 3, 8, 9, 9, 9,
+ /* 50 */ 6, 7, 9, 9, 10, 12, 12, 6, 7, 21,
+ /* 60 */ 9, 24, 25, 12, 18, 5, 20, 14, 22, 5,
+ /* 70 */ 24, 3, 1, 2, 3, 1, 2, 3, 0, 1,
+ /* 80 */ 2, 3, 11, 2, 3, 11, 9, 10, 5, 12,
+ /* 90 */ 23, 24, 10, 10, 8, 9, 9, 15, 15, 8,
+ /* 100 */ 9, 9, 27, 27, 11, 27, 27, 27, 27, 27,
+ /* 110 */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ /* 120 */ 27,
};
-#define fts5YY_SHIFT_USE_DFLT (98)
-#define fts5YY_SHIFT_COUNT (32)
+#define fts5YY_SHIFT_COUNT (34)
#define fts5YY_SHIFT_MIN (0)
-#define fts5YY_SHIFT_MAX (90)
+#define fts5YY_SHIFT_MAX (93)
static const unsigned char fts5yy_shift_ofst[] = {
- /* 0 */ 44, 44, 44, 44, 44, 44, 68, 70, 72, 14,
- /* 10 */ 21, 73, 11, 18, 18, 31, 31, 62, 65, 69,
- /* 20 */ 90, 77, 86, 6, 39, 53, 55, 59, 39, 87,
- /* 30 */ 88, 39, 71,
+ /* 0 */ 44, 44, 44, 44, 44, 44, 51, 77, 43, 12,
+ /* 10 */ 14, 83, 82, 14, 23, 23, 31, 31, 71, 74,
+ /* 20 */ 78, 81, 86, 91, 6, 53, 53, 60, 64, 68,
+ /* 30 */ 53, 87, 92, 53, 93,
};
-#define fts5YY_REDUCE_USE_DFLT (-18)
-#define fts5YY_REDUCE_COUNT (16)
+#define fts5YY_REDUCE_COUNT (17)
#define fts5YY_REDUCE_MIN (-17)
#define fts5YY_REDUCE_MAX (67)
static const signed char fts5yy_reduce_ofst[] = {
- /* 0 */ -16, -8, 0, 9, 17, 25, 37, -17, 64, -17,
- /* 10 */ 67, 12, 12, 12, 20, 27, 35,
+ /* 0 */ -16, -8, 0, 9, 17, 25, 46, -17, -17, 37,
+ /* 10 */ 67, 4, 4, 8, 4, 20, 27, 38,
};
static const fts5YYACTIONTYPE fts5yy_default[] = {
- /* 0 */ 104, 104, 104, 104, 104, 104, 89, 104, 98, 104,
- /* 10 */ 104, 103, 103, 103, 103, 104, 104, 104, 104, 104,
- /* 20 */ 85, 104, 104, 104, 94, 104, 104, 84, 96, 104,
- /* 30 */ 104, 97, 104,
+ /* 0 */ 80, 80, 80, 80, 80, 80, 95, 80, 80, 105,
+ /* 10 */ 80, 110, 110, 80, 110, 110, 80, 80, 80, 80,
+ /* 20 */ 80, 91, 80, 80, 80, 101, 100, 80, 80, 90,
+ /* 30 */ 103, 80, 80, 104, 80,
};
/********** End of lemon-generated parsing tables *****************************/
@@ -185551,6 +200069,7 @@ struct fts5yyParser {
int fts5yyerrcnt; /* Shifts left before out of the error */
#endif
sqlite3Fts5ParserARG_SDECL /* A place to hold %extra_argument */
+ sqlite3Fts5ParserCTX_SDECL /* A place to hold %extra_context */
#if fts5YYSTACKDEPTH<=0
int fts5yystksz; /* Current side of the stack */
fts5yyStackEntry *fts5yystack; /* The parser's stack */
@@ -185594,19 +200113,39 @@ static void sqlite3Fts5ParserTrace(FILE *TraceFILE, char *zTracePrompt){
}
#endif /* NDEBUG */
-#ifndef NDEBUG
+#if defined(fts5YYCOVERAGE) || !defined(NDEBUG)
/* For tracing shifts, the names of all terminals and nonterminals
** are required. The following table supplies these names */
static const char *const fts5yyTokenName[] = {
- "$", "OR", "AND", "NOT",
- "TERM", "COLON", "MINUS", "LCP",
- "RCP", "STRING", "LP", "RP",
- "COMMA", "PLUS", "STAR", "error",
- "input", "expr", "cnearset", "exprlist",
- "colset", "colsetlist", "nearset", "nearphrases",
- "phrase", "neardist_opt", "star_opt",
+ /* 0 */ "$",
+ /* 1 */ "OR",
+ /* 2 */ "AND",
+ /* 3 */ "NOT",
+ /* 4 */ "TERM",
+ /* 5 */ "COLON",
+ /* 6 */ "MINUS",
+ /* 7 */ "LCP",
+ /* 8 */ "RCP",
+ /* 9 */ "STRING",
+ /* 10 */ "LP",
+ /* 11 */ "RP",
+ /* 12 */ "CARET",
+ /* 13 */ "COMMA",
+ /* 14 */ "PLUS",
+ /* 15 */ "STAR",
+ /* 16 */ "input",
+ /* 17 */ "expr",
+ /* 18 */ "cnearset",
+ /* 19 */ "exprlist",
+ /* 20 */ "colset",
+ /* 21 */ "colsetlist",
+ /* 22 */ "nearset",
+ /* 23 */ "nearphrases",
+ /* 24 */ "phrase",
+ /* 25 */ "neardist_opt",
+ /* 26 */ "star_opt",
};
-#endif /* NDEBUG */
+#endif /* defined(fts5YYCOVERAGE) || !defined(NDEBUG) */
#ifndef NDEBUG
/* For tracing reduce actions, the names of all rules are required.
@@ -185630,15 +200169,16 @@ static const char *const fts5yyRuleName[] = {
/* 15 */ "cnearset ::= nearset",
/* 16 */ "cnearset ::= colset COLON nearset",
/* 17 */ "nearset ::= phrase",
- /* 18 */ "nearset ::= STRING LP nearphrases neardist_opt RP",
- /* 19 */ "nearphrases ::= phrase",
- /* 20 */ "nearphrases ::= nearphrases phrase",
- /* 21 */ "neardist_opt ::=",
- /* 22 */ "neardist_opt ::= COMMA STRING",
- /* 23 */ "phrase ::= phrase PLUS STRING star_opt",
- /* 24 */ "phrase ::= STRING star_opt",
- /* 25 */ "star_opt ::= STAR",
- /* 26 */ "star_opt ::=",
+ /* 18 */ "nearset ::= CARET phrase",
+ /* 19 */ "nearset ::= STRING LP nearphrases neardist_opt RP",
+ /* 20 */ "nearphrases ::= phrase",
+ /* 21 */ "nearphrases ::= nearphrases phrase",
+ /* 22 */ "neardist_opt ::=",
+ /* 23 */ "neardist_opt ::= COMMA STRING",
+ /* 24 */ "phrase ::= phrase PLUS STRING star_opt",
+ /* 25 */ "phrase ::= STRING star_opt",
+ /* 26 */ "star_opt ::= STAR",
+ /* 27 */ "star_opt ::=",
};
#endif /* NDEBUG */
@@ -185687,28 +200227,29 @@ static int fts5yyGrowStack(fts5yyParser *p){
/* Initialize a new parser that has already been allocated.
*/
-static void sqlite3Fts5ParserInit(void *fts5yypParser){
- fts5yyParser *pParser = (fts5yyParser*)fts5yypParser;
+static void sqlite3Fts5ParserInit(void *fts5yypRawParser sqlite3Fts5ParserCTX_PDECL){
+ fts5yyParser *fts5yypParser = (fts5yyParser*)fts5yypRawParser;
+ sqlite3Fts5ParserCTX_STORE
#ifdef fts5YYTRACKMAXSTACKDEPTH
- pParser->fts5yyhwm = 0;
+ fts5yypParser->fts5yyhwm = 0;
#endif
#if fts5YYSTACKDEPTH<=0
- pParser->fts5yytos = NULL;
- pParser->fts5yystack = NULL;
- pParser->fts5yystksz = 0;
- if( fts5yyGrowStack(pParser) ){
- pParser->fts5yystack = &pParser->fts5yystk0;
- pParser->fts5yystksz = 1;
+ fts5yypParser->fts5yytos = NULL;
+ fts5yypParser->fts5yystack = NULL;
+ fts5yypParser->fts5yystksz = 0;
+ if( fts5yyGrowStack(fts5yypParser) ){
+ fts5yypParser->fts5yystack = &fts5yypParser->fts5yystk0;
+ fts5yypParser->fts5yystksz = 1;
}
#endif
#ifndef fts5YYNOERRORRECOVERY
- pParser->fts5yyerrcnt = -1;
+ fts5yypParser->fts5yyerrcnt = -1;
#endif
- pParser->fts5yytos = pParser->fts5yystack;
- pParser->fts5yystack[0].stateno = 0;
- pParser->fts5yystack[0].major = 0;
+ fts5yypParser->fts5yytos = fts5yypParser->fts5yystack;
+ fts5yypParser->fts5yystack[0].stateno = 0;
+ fts5yypParser->fts5yystack[0].major = 0;
#if fts5YYSTACKDEPTH>0
- pParser->fts5yystackEnd = &pParser->fts5yystack[fts5YYSTACKDEPTH-1];
+ fts5yypParser->fts5yystackEnd = &fts5yypParser->fts5yystack[fts5YYSTACKDEPTH-1];
#endif
}
@@ -185725,11 +200266,14 @@ static void sqlite3Fts5ParserInit(void *fts5yypParser){
** A pointer to a parser. This pointer is used in subsequent calls
** to sqlite3Fts5Parser and sqlite3Fts5ParserFree.
*/
-static void *sqlite3Fts5ParserAlloc(void *(*mallocProc)(fts5YYMALLOCARGTYPE)){
- fts5yyParser *pParser;
- pParser = (fts5yyParser*)(*mallocProc)( (fts5YYMALLOCARGTYPE)sizeof(fts5yyParser) );
- if( pParser ) sqlite3Fts5ParserInit(pParser);
- return pParser;
+static void *sqlite3Fts5ParserAlloc(void *(*mallocProc)(fts5YYMALLOCARGTYPE) sqlite3Fts5ParserCTX_PDECL){
+ fts5yyParser *fts5yypParser;
+ fts5yypParser = (fts5yyParser*)(*mallocProc)( (fts5YYMALLOCARGTYPE)sizeof(fts5yyParser) );
+ if( fts5yypParser ){
+ sqlite3Fts5ParserCTX_STORE
+ sqlite3Fts5ParserInit(fts5yypParser sqlite3Fts5ParserCTX_PARAM);
+ }
+ return (void*)fts5yypParser;
}
#endif /* sqlite3Fts5Parser_ENGINEALWAYSONSTACK */
@@ -185746,7 +200290,8 @@ static void fts5yy_destructor(
fts5YYCODETYPE fts5yymajor, /* Type code for object to destroy */
fts5YYMINORTYPE *fts5yypminor /* The object to be destroyed */
){
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ sqlite3Fts5ParserCTX_FETCH
switch( fts5yymajor ){
/* Here is inserted the actions which take place when a
** terminal or non-terminal is destroyed. This can happen
@@ -185856,24 +200401,66 @@ static int sqlite3Fts5ParserStackPeak(void *p){
}
#endif
+/* This array of booleans keeps track of the parser statement
+** coverage. The element fts5yycoverage[X][Y] is set when the parser
+** is in state X and has a lookahead token Y. In a well-tested
+** systems, every element of this matrix should end up being set.
+*/
+#if defined(fts5YYCOVERAGE)
+static unsigned char fts5yycoverage[fts5YYNSTATE][fts5YYNFTS5TOKEN];
+#endif
+
+/*
+** Write into out a description of every state/lookahead combination that
+**
+** (1) has not been used by the parser, and
+** (2) is not a syntax error.
+**
+** Return the number of missed state/lookahead combinations.
+*/
+#if defined(fts5YYCOVERAGE)
+static int sqlite3Fts5ParserCoverage(FILE *out){
+ int stateno, iLookAhead, i;
+ int nMissed = 0;
+ for(stateno=0; stateno<fts5YYNSTATE; stateno++){
+ i = fts5yy_shift_ofst[stateno];
+ for(iLookAhead=0; iLookAhead<fts5YYNFTS5TOKEN; iLookAhead++){
+ if( fts5yy_lookahead[i+iLookAhead]!=iLookAhead ) continue;
+ if( fts5yycoverage[stateno][iLookAhead]==0 ) nMissed++;
+ if( out ){
+ fprintf(out,"State %d lookahead %s %s\n", stateno,
+ fts5yyTokenName[iLookAhead],
+ fts5yycoverage[stateno][iLookAhead] ? "ok" : "missed");
+ }
+ }
+ }
+ return nMissed;
+}
+#endif
+
/*
** Find the appropriate action for a parser given the terminal
** look-ahead token iLookAhead.
*/
-static unsigned int fts5yy_find_shift_action(
- fts5yyParser *pParser, /* The parser */
- fts5YYCODETYPE iLookAhead /* The look-ahead token */
+static fts5YYACTIONTYPE fts5yy_find_shift_action(
+ fts5YYCODETYPE iLookAhead, /* The look-ahead token */
+ fts5YYACTIONTYPE stateno /* Current state number */
){
int i;
- int stateno = pParser->fts5yytos->stateno;
-
- if( stateno>=fts5YY_MIN_REDUCE ) return stateno;
+
+ if( stateno>fts5YY_MAX_SHIFT ) return stateno;
assert( stateno <= fts5YY_SHIFT_COUNT );
+#if defined(fts5YYCOVERAGE)
+ fts5yycoverage[stateno][iLookAhead] = 1;
+#endif
do{
i = fts5yy_shift_ofst[stateno];
+ assert( i>=0 );
+ /* assert( i+fts5YYNFTS5TOKEN<=(int)fts5YY_NLOOKAHEAD ); */
assert( iLookAhead!=fts5YYNOCODE );
+ assert( iLookAhead < fts5YYNFTS5TOKEN );
i += iLookAhead;
- if( i<0 || i>=fts5YY_ACTTAB_COUNT || fts5yy_lookahead[i]!=iLookAhead ){
+ if( i>=fts5YY_NLOOKAHEAD || fts5yy_lookahead[i]!=iLookAhead ){
#ifdef fts5YYFALLBACK
fts5YYCODETYPE iFallback; /* Fallback token */
if( iLookAhead<sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0])
@@ -185899,6 +200486,7 @@ static unsigned int fts5yy_find_shift_action(
#if fts5YY_SHIFT_MAX+fts5YYWILDCARD>=fts5YY_ACTTAB_COUNT
j<fts5YY_ACTTAB_COUNT &&
#endif
+ j<(int)(sizeof(fts5yy_lookahead)/sizeof(fts5yy_lookahead[0])) &&
fts5yy_lookahead[j]==fts5YYWILDCARD && iLookAhead>0
){
#ifndef NDEBUG
@@ -185923,8 +200511,8 @@ static unsigned int fts5yy_find_shift_action(
** Find the appropriate action for a parser given the non-terminal
** look-ahead token iLookAhead.
*/
-static int fts5yy_find_reduce_action(
- int stateno, /* Current state number */
+static fts5YYACTIONTYPE fts5yy_find_reduce_action(
+ fts5YYACTIONTYPE stateno, /* Current state number */
fts5YYCODETYPE iLookAhead /* The look-ahead token */
){
int i;
@@ -185936,7 +200524,6 @@ static int fts5yy_find_reduce_action(
assert( stateno<=fts5YY_REDUCE_COUNT );
#endif
i = fts5yy_reduce_ofst[stateno];
- assert( i!=fts5YY_REDUCE_USE_DFLT );
assert( iLookAhead!=fts5YYNOCODE );
i += iLookAhead;
#ifdef fts5YYERRORSYMBOL
@@ -185954,7 +200541,8 @@ static int fts5yy_find_reduce_action(
** The following routine is called if the stack overflows.
*/
static void fts5yyStackOverflow(fts5yyParser *fts5yypParser){
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ sqlite3Fts5ParserCTX_FETCH
#ifndef NDEBUG
if( fts5yyTraceFILE ){
fprintf(fts5yyTraceFILE,"%sStack Overflow!\n",fts5yyTracePrompt);
@@ -185967,27 +200555,29 @@ static void fts5yyStackOverflow(fts5yyParser *fts5yypParser){
sqlite3Fts5ParseError(pParse, "fts5: parser stack overflow");
/******** End %stack_overflow code ********************************************/
- sqlite3Fts5ParserARG_STORE; /* Suppress warning about unused %extra_argument var */
+ sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument var */
+ sqlite3Fts5ParserCTX_STORE
}
/*
** Print tracing information for a SHIFT action
*/
#ifndef NDEBUG
-static void fts5yyTraceShift(fts5yyParser *fts5yypParser, int fts5yyNewState){
+static void fts5yyTraceShift(fts5yyParser *fts5yypParser, int fts5yyNewState, const char *zTag){
if( fts5yyTraceFILE ){
if( fts5yyNewState<fts5YYNSTATE ){
- fprintf(fts5yyTraceFILE,"%sShift '%s', go to state %d\n",
- fts5yyTracePrompt,fts5yyTokenName[fts5yypParser->fts5yytos->major],
+ fprintf(fts5yyTraceFILE,"%s%s '%s', go to state %d\n",
+ fts5yyTracePrompt, zTag, fts5yyTokenName[fts5yypParser->fts5yytos->major],
fts5yyNewState);
}else{
- fprintf(fts5yyTraceFILE,"%sShift '%s'\n",
- fts5yyTracePrompt,fts5yyTokenName[fts5yypParser->fts5yytos->major]);
+ fprintf(fts5yyTraceFILE,"%s%s '%s', pending reduce %d\n",
+ fts5yyTracePrompt, zTag, fts5yyTokenName[fts5yypParser->fts5yytos->major],
+ fts5yyNewState - fts5YY_MIN_REDUCE);
}
}
}
#else
-# define fts5yyTraceShift(X,Y)
+# define fts5yyTraceShift(X,Y,Z)
#endif
/*
@@ -185995,8 +200585,8 @@ static void fts5yyTraceShift(fts5yyParser *fts5yypParser, int fts5yyNewState){
*/
static void fts5yy_shift(
fts5yyParser *fts5yypParser, /* The parser to be shifted */
- int fts5yyNewState, /* The new state to shift in */
- int fts5yyMajor, /* The major token to shift in */
+ fts5YYACTIONTYPE fts5yyNewState, /* The new state to shift in */
+ fts5YYCODETYPE fts5yyMajor, /* The major token to shift in */
sqlite3Fts5ParserFTS5TOKENTYPE fts5yyMinor /* The minor token to shift in */
){
fts5yyStackEntry *fts5yytos;
@@ -186026,10 +200616,10 @@ static void fts5yy_shift(
fts5yyNewState += fts5YY_MIN_REDUCE - fts5YY_MIN_SHIFTREDUCE;
}
fts5yytos = fts5yypParser->fts5yytos;
- fts5yytos->stateno = (fts5YYACTIONTYPE)fts5yyNewState;
- fts5yytos->major = (fts5YYCODETYPE)fts5yyMajor;
+ fts5yytos->stateno = fts5yyNewState;
+ fts5yytos->major = fts5yyMajor;
fts5yytos->minor.fts5yy0 = fts5yyMinor;
- fts5yyTraceShift(fts5yypParser, fts5yyNewState);
+ fts5yyTraceShift(fts5yypParser, fts5yyNewState, "Shift");
}
/* The following table contains information about every rule that
@@ -186039,33 +200629,34 @@ 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 },
- { 20, -4 },
- { 20, -3 },
- { 20, -1 },
- { 20, -2 },
- { 21, -2 },
- { 21, -1 },
- { 17, -3 },
- { 17, -3 },
- { 17, -3 },
- { 17, -5 },
- { 17, -3 },
- { 17, -1 },
- { 19, -1 },
- { 19, -2 },
- { 18, -1 },
- { 18, -3 },
- { 22, -1 },
- { 22, -5 },
- { 23, -1 },
- { 23, -2 },
- { 25, 0 },
- { 25, -2 },
- { 24, -4 },
- { 24, -2 },
- { 26, -1 },
- { 26, 0 },
+ { 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 ::= */
};
static void fts5yy_accept(fts5yyParser*); /* Forward Declaration */
@@ -186073,22 +200664,39 @@ static void fts5yy_accept(fts5yyParser*); /* Forward Declaration */
/*
** Perform a reduce action and the shift that must immediately
** follow the reduce.
+**
+** The fts5yyLookahead and fts5yyLookaheadToken parameters provide reduce actions
+** access to the lookahead token (if any). The fts5yyLookahead will be fts5YYNOCODE
+** if the lookahead token has already been consumed. As this procedure is
+** only called from one place, optimizing compilers will in-line it, which
+** means that the extra parameters have no performance impact.
*/
-static void fts5yy_reduce(
+static fts5YYACTIONTYPE fts5yy_reduce(
fts5yyParser *fts5yypParser, /* The parser */
- unsigned int fts5yyruleno /* Number of the rule by which to reduce */
+ unsigned int fts5yyruleno, /* Number of the rule by which to reduce */
+ int fts5yyLookahead, /* Lookahead token, or fts5YYNOCODE if none */
+ sqlite3Fts5ParserFTS5TOKENTYPE fts5yyLookaheadToken /* Value of the lookahead token */
+ sqlite3Fts5ParserCTX_PDECL /* %extra_context */
){
int fts5yygoto; /* The next state */
- int fts5yyact; /* The next action */
+ fts5YYACTIONTYPE fts5yyact; /* The next action */
fts5yyStackEntry *fts5yymsp; /* The top of the parser's stack */
int fts5yysize; /* Amount to pop the stack */
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ (void)fts5yyLookahead;
+ (void)fts5yyLookaheadToken;
fts5yymsp = fts5yypParser->fts5yytos;
#ifndef NDEBUG
if( fts5yyTraceFILE && fts5yyruleno<(int)(sizeof(fts5yyRuleName)/sizeof(fts5yyRuleName[0])) ){
fts5yysize = fts5yyRuleInfo[fts5yyruleno].nrhs;
- fprintf(fts5yyTraceFILE, "%sReduce [%s], go to state %d.\n", fts5yyTracePrompt,
- fts5yyRuleName[fts5yyruleno], fts5yymsp[fts5yysize].stateno);
+ if( fts5yysize ){
+ fprintf(fts5yyTraceFILE, "%sReduce %d [%s], go to state %d.\n",
+ fts5yyTracePrompt,
+ fts5yyruleno, fts5yyRuleName[fts5yyruleno], fts5yymsp[fts5yysize].stateno);
+ }else{
+ fprintf(fts5yyTraceFILE, "%sReduce %d [%s].\n",
+ fts5yyTracePrompt, fts5yyruleno, fts5yyRuleName[fts5yyruleno]);
+ }
}
#endif /* NDEBUG */
@@ -186105,13 +200713,19 @@ static void fts5yy_reduce(
#if fts5YYSTACKDEPTH>0
if( fts5yypParser->fts5yytos>=fts5yypParser->fts5yystackEnd ){
fts5yyStackOverflow(fts5yypParser);
- return;
+ /* The call to fts5yyStackOverflow() above pops the stack until it is
+ ** empty, causing the main parser loop to exit. So the return value
+ ** is never used and does not matter. */
+ return 0;
}
#else
if( fts5yypParser->fts5yytos>=&fts5yypParser->fts5yystack[fts5yypParser->fts5yystksz-1] ){
if( fts5yyGrowStack(fts5yypParser) ){
fts5yyStackOverflow(fts5yypParser);
- return;
+ /* The call to fts5yyStackOverflow() above pops the stack until it is
+ ** empty, causing the main parser loop to exit. So the return value
+ ** is never used and does not matter. */
+ return 0;
}
fts5yymsp = fts5yypParser->fts5yytos;
}
@@ -186219,7 +200833,13 @@ static void fts5yy_reduce(
{ fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); }
fts5yymsp[0].minor.fts5yy46 = fts5yylhsminor.fts5yy46;
break;
- case 18: /* nearset ::= STRING LP nearphrases neardist_opt RP */
+ case 18: /* nearset ::= CARET phrase */
+{
+ sqlite3Fts5ParseSetCaret(fts5yymsp[0].minor.fts5yy53);
+ fts5yymsp[-1].minor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53);
+}
+ break;
+ case 19: /* nearset ::= STRING LP nearphrases neardist_opt RP */
{
sqlite3Fts5ParseNear(pParse, &fts5yymsp[-4].minor.fts5yy0);
sqlite3Fts5ParseSetDistance(pParse, fts5yymsp[-2].minor.fts5yy46, &fts5yymsp[-1].minor.fts5yy0);
@@ -186227,40 +200847,40 @@ static void fts5yy_reduce(
}
fts5yymsp[-4].minor.fts5yy46 = fts5yylhsminor.fts5yy46;
break;
- case 19: /* nearphrases ::= phrase */
+ case 20: /* nearphrases ::= phrase */
{
fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53);
}
fts5yymsp[0].minor.fts5yy46 = fts5yylhsminor.fts5yy46;
break;
- case 20: /* nearphrases ::= nearphrases phrase */
+ case 21: /* nearphrases ::= nearphrases phrase */
{
fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, fts5yymsp[-1].minor.fts5yy46, fts5yymsp[0].minor.fts5yy53);
}
fts5yymsp[-1].minor.fts5yy46 = fts5yylhsminor.fts5yy46;
break;
- case 21: /* neardist_opt ::= */
+ case 22: /* neardist_opt ::= */
{ fts5yymsp[1].minor.fts5yy0.p = 0; fts5yymsp[1].minor.fts5yy0.n = 0; }
break;
- case 22: /* neardist_opt ::= COMMA STRING */
+ case 23: /* neardist_opt ::= COMMA STRING */
{ fts5yymsp[-1].minor.fts5yy0 = fts5yymsp[0].minor.fts5yy0; }
break;
- case 23: /* phrase ::= phrase PLUS STRING star_opt */
+ case 24: /* phrase ::= phrase PLUS STRING star_opt */
{
fts5yylhsminor.fts5yy53 = sqlite3Fts5ParseTerm(pParse, fts5yymsp[-3].minor.fts5yy53, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy4);
}
fts5yymsp[-3].minor.fts5yy53 = fts5yylhsminor.fts5yy53;
break;
- case 24: /* phrase ::= STRING star_opt */
+ case 25: /* phrase ::= STRING star_opt */
{
fts5yylhsminor.fts5yy53 = sqlite3Fts5ParseTerm(pParse, 0, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy4);
}
fts5yymsp[-1].minor.fts5yy53 = fts5yylhsminor.fts5yy53;
break;
- case 25: /* star_opt ::= STAR */
+ case 26: /* star_opt ::= STAR */
{ fts5yymsp[0].minor.fts5yy4 = 1; }
break;
- case 26: /* star_opt ::= */
+ case 27: /* star_opt ::= */
{ fts5yymsp[1].minor.fts5yy4 = 0; }
break;
default:
@@ -186279,16 +200899,12 @@ static void fts5yy_reduce(
/* It is not possible for a REDUCE to be followed by an error */
assert( fts5yyact!=fts5YY_ERROR_ACTION );
- if( fts5yyact==fts5YY_ACCEPT_ACTION ){
- fts5yypParser->fts5yytos += fts5yysize;
- fts5yy_accept(fts5yypParser);
- }else{
- fts5yymsp += fts5yysize+1;
- fts5yypParser->fts5yytos = fts5yymsp;
- fts5yymsp->stateno = (fts5YYACTIONTYPE)fts5yyact;
- fts5yymsp->major = (fts5YYCODETYPE)fts5yygoto;
- fts5yyTraceShift(fts5yypParser, fts5yyact);
- }
+ fts5yymsp += fts5yysize+1;
+ fts5yypParser->fts5yytos = fts5yymsp;
+ fts5yymsp->stateno = (fts5YYACTIONTYPE)fts5yyact;
+ fts5yymsp->major = (fts5YYCODETYPE)fts5yygoto;
+ fts5yyTraceShift(fts5yypParser, fts5yyact, "... then shift");
+ return fts5yyact;
}
/*
@@ -186298,7 +200914,8 @@ static void fts5yy_reduce(
static void fts5yy_parse_failed(
fts5yyParser *fts5yypParser /* The parser */
){
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ sqlite3Fts5ParserCTX_FETCH
#ifndef NDEBUG
if( fts5yyTraceFILE ){
fprintf(fts5yyTraceFILE,"%sFail!\n",fts5yyTracePrompt);
@@ -186309,7 +200926,8 @@ static void fts5yy_parse_failed(
** parser fails */
/************ Begin %parse_failure code ***************************************/
/************ End %parse_failure code *****************************************/
- sqlite3Fts5ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserCTX_STORE
}
#endif /* fts5YYNOERRORRECOVERY */
@@ -186321,7 +200939,8 @@ static void fts5yy_syntax_error(
int fts5yymajor, /* The major type of the error token */
sqlite3Fts5ParserFTS5TOKENTYPE fts5yyminor /* The minor type of the error token */
){
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ sqlite3Fts5ParserCTX_FETCH
#define FTS5TOKEN fts5yyminor
/************ Begin %syntax_error code ****************************************/
@@ -186330,7 +200949,8 @@ static void fts5yy_syntax_error(
pParse, "fts5: syntax error near \"%.*s\"",FTS5TOKEN.n,FTS5TOKEN.p
);
/************ End %syntax_error code ******************************************/
- sqlite3Fts5ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserCTX_STORE
}
/*
@@ -186339,7 +200959,8 @@ static void fts5yy_syntax_error(
static void fts5yy_accept(
fts5yyParser *fts5yypParser /* The parser */
){
- sqlite3Fts5ParserARG_FETCH;
+ sqlite3Fts5ParserARG_FETCH
+ sqlite3Fts5ParserCTX_FETCH
#ifndef NDEBUG
if( fts5yyTraceFILE ){
fprintf(fts5yyTraceFILE,"%sAccept!\n",fts5yyTracePrompt);
@@ -186353,7 +200974,8 @@ static void fts5yy_accept(
** parser accepts */
/*********** Begin %parse_accept code *****************************************/
/*********** End %parse_accept code *******************************************/
- sqlite3Fts5ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument variable */
+ sqlite3Fts5ParserCTX_STORE
}
/* The main parser program.
@@ -186382,38 +201004,51 @@ static void sqlite3Fts5Parser(
sqlite3Fts5ParserARG_PDECL /* Optional %extra_argument parameter */
){
fts5YYMINORTYPE fts5yyminorunion;
- unsigned int fts5yyact; /* The parser action. */
+ fts5YYACTIONTYPE fts5yyact; /* The parser action. */
#if !defined(fts5YYERRORSYMBOL) && !defined(fts5YYNOERRORRECOVERY)
int fts5yyendofinput; /* True if we are at the end of input */
#endif
#ifdef fts5YYERRORSYMBOL
int fts5yyerrorhit = 0; /* True if fts5yymajor has invoked an error */
#endif
- fts5yyParser *fts5yypParser; /* The parser */
+ fts5yyParser *fts5yypParser = (fts5yyParser*)fts5yyp; /* The parser */
+ sqlite3Fts5ParserCTX_FETCH
+ sqlite3Fts5ParserARG_STORE
- fts5yypParser = (fts5yyParser*)fts5yyp;
assert( fts5yypParser->fts5yytos!=0 );
#if !defined(fts5YYERRORSYMBOL) && !defined(fts5YYNOERRORRECOVERY)
fts5yyendofinput = (fts5yymajor==0);
#endif
- sqlite3Fts5ParserARG_STORE;
+ fts5yyact = fts5yypParser->fts5yytos->stateno;
#ifndef NDEBUG
if( fts5yyTraceFILE ){
- fprintf(fts5yyTraceFILE,"%sInput '%s'\n",fts5yyTracePrompt,fts5yyTokenName[fts5yymajor]);
+ if( fts5yyact < fts5YY_MIN_REDUCE ){
+ fprintf(fts5yyTraceFILE,"%sInput '%s' in state %d\n",
+ fts5yyTracePrompt,fts5yyTokenName[fts5yymajor],fts5yyact);
+ }else{
+ fprintf(fts5yyTraceFILE,"%sInput '%s' with pending reduce %d\n",
+ fts5yyTracePrompt,fts5yyTokenName[fts5yymajor],fts5yyact-fts5YY_MIN_REDUCE);
+ }
}
#endif
do{
- fts5yyact = fts5yy_find_shift_action(fts5yypParser,(fts5YYCODETYPE)fts5yymajor);
- if( fts5yyact <= fts5YY_MAX_SHIFTREDUCE ){
- fts5yy_shift(fts5yypParser,fts5yyact,fts5yymajor,fts5yyminor);
+ assert( fts5yyact==fts5yypParser->fts5yytos->stateno );
+ fts5yyact = fts5yy_find_shift_action((fts5YYCODETYPE)fts5yymajor,fts5yyact);
+ if( fts5yyact >= fts5YY_MIN_REDUCE ){
+ fts5yyact = fts5yy_reduce(fts5yypParser,fts5yyact-fts5YY_MIN_REDUCE,fts5yymajor,
+ fts5yyminor sqlite3Fts5ParserCTX_PARAM);
+ }else if( fts5yyact <= fts5YY_MAX_SHIFTREDUCE ){
+ fts5yy_shift(fts5yypParser,fts5yyact,(fts5YYCODETYPE)fts5yymajor,fts5yyminor);
#ifndef fts5YYNOERRORRECOVERY
fts5yypParser->fts5yyerrcnt--;
#endif
- fts5yymajor = fts5YYNOCODE;
- }else if( fts5yyact <= fts5YY_MAX_REDUCE ){
- fts5yy_reduce(fts5yypParser,fts5yyact-fts5YY_MIN_REDUCE);
+ break;
+ }else if( fts5yyact==fts5YY_ACCEPT_ACTION ){
+ fts5yypParser->fts5yytos--;
+ fts5yy_accept(fts5yypParser);
+ return;
}else{
assert( fts5yyact == fts5YY_ERROR_ACTION );
fts5yyminorunion.fts5yy0 = fts5yyminor;
@@ -186460,10 +201095,9 @@ static void sqlite3Fts5Parser(
fts5yymajor = fts5YYNOCODE;
}else{
while( fts5yypParser->fts5yytos >= fts5yypParser->fts5yystack
- && fts5yymx != fts5YYERRORSYMBOL
&& (fts5yyact = fts5yy_find_reduce_action(
fts5yypParser->fts5yytos->stateno,
- fts5YYERRORSYMBOL)) >= fts5YY_MIN_REDUCE
+ fts5YYERRORSYMBOL)) > fts5YY_MAX_SHIFTREDUCE
){
fts5yy_pop_parser_stack(fts5yypParser);
}
@@ -186480,6 +201114,8 @@ static void sqlite3Fts5Parser(
}
fts5yypParser->fts5yyerrcnt = 3;
fts5yyerrorhit = 1;
+ if( fts5yymajor==fts5YYNOCODE ) break;
+ fts5yyact = fts5yypParser->fts5yytos->stateno;
#elif defined(fts5YYNOERRORRECOVERY)
/* If the fts5YYNOERRORRECOVERY macro is defined, then do not attempt to
** do any kind of error recovery. Instead, simply invoke the syntax
@@ -186490,8 +201126,7 @@ static void sqlite3Fts5Parser(
*/
fts5yy_syntax_error(fts5yypParser,fts5yymajor, fts5yyminor);
fts5yy_destructor(fts5yypParser,(fts5YYCODETYPE)fts5yymajor,&fts5yyminorunion);
- fts5yymajor = fts5YYNOCODE;
-
+ break;
#else /* fts5YYERRORSYMBOL is not defined */
/* This is what we do if the grammar does not define ERROR:
**
@@ -186513,10 +201148,10 @@ static void sqlite3Fts5Parser(
fts5yypParser->fts5yyerrcnt = -1;
#endif
}
- fts5yymajor = fts5YYNOCODE;
+ break;
#endif
}
- }while( fts5yymajor!=fts5YYNOCODE && fts5yypParser->fts5yytos>fts5yypParser->fts5yystack );
+ }while( fts5yypParser->fts5yytos>fts5yypParser->fts5yystack );
#ifndef NDEBUG
if( fts5yyTraceFILE ){
fts5yyStackEntry *i;
@@ -186533,6 +201168,21 @@ static void sqlite3Fts5Parser(
}
/*
+** Return the fallback token corresponding to canonical token iToken, or
+** 0 if iToken has no fallback.
+*/
+static int sqlite3Fts5ParserFallback(int iToken){
+#ifdef fts5YYFALLBACK
+ if( iToken<(int)(sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0])) ){
+ return fts5yyFallback[iToken];
+ }
+#else
+ (void)iToken;
+#endif
+ return 0;
+}
+
+/*
** 2014 May 31
**
** The author disclaims copyright to this source code. In place of
@@ -186893,6 +201543,16 @@ static int fts5SnippetScore(
}
/*
+** Return the value in pVal interpreted as utf-8 text. Except, if pVal
+** contains a NULL value, return a pointer to a static string zero
+** bytes in length instead of a NULL pointer.
+*/
+static const char *fts5ValueToText(sqlite3_value *pVal){
+ const char *zRet = (const char*)sqlite3_value_text(pVal);
+ return zRet ? zRet : "";
+}
+
+/*
** Implementation of snippet() function.
*/
static void fts5SnippetFunction(
@@ -186927,9 +201587,9 @@ static void fts5SnippetFunction(
nCol = pApi->xColumnCount(pFts);
memset(&ctx, 0, sizeof(HighlightContext));
iCol = sqlite3_value_int(apVal[0]);
- ctx.zOpen = (const char*)sqlite3_value_text(apVal[1]);
- ctx.zClose = (const char*)sqlite3_value_text(apVal[2]);
- zEllips = (const char*)sqlite3_value_text(apVal[3]);
+ ctx.zOpen = fts5ValueToText(apVal[1]);
+ ctx.zClose = fts5ValueToText(apVal[2]);
+ zEllips = fts5ValueToText(apVal[3]);
nToken = sqlite3_value_int(apVal[4]);
iBestCol = (iCol>=0 ? iCol : 0);
@@ -188632,6 +203292,7 @@ static void sqlite3Fts5Parser(void*, int, Fts5Token, Fts5Parse*);
/* #include <stdio.h> */
static void sqlite3Fts5ParserTrace(FILE*, char*);
#endif
+static int sqlite3Fts5ParserFallback(int);
struct Fts5Expr {
@@ -188683,7 +203344,8 @@ struct Fts5ExprNode {
** or term prefix.
*/
struct Fts5ExprTerm {
- int bPrefix; /* True for a prefix term */
+ u8 bPrefix; /* True for a prefix term */
+ u8 bFirst; /* True if token must be first in column */
char *zTerm; /* nul-terminated term */
Fts5IndexIter *pIter; /* Iterator for this term */
Fts5ExprTerm *pSynonym; /* Pointer to first in list of synonyms */
@@ -188764,6 +203426,7 @@ static int fts5ExprGetToken(
case '+': tok = FTS5_PLUS; break;
case '*': tok = FTS5_STAR; break;
case '-': tok = FTS5_MINUS; break;
+ case '^': tok = FTS5_CARET; break;
case '\0': tok = FTS5_EOF; break;
case '"': {
@@ -189023,6 +203686,7 @@ static int fts5ExprPhraseIsMatch(
Fts5PoslistReader *aIter = aStatic;
int i;
int rc = SQLITE_OK;
+ int bFirst = pPhrase->aTerm[0].bFirst;
fts5BufferZero(&pPhrase->poslist);
@@ -189077,8 +203741,10 @@ static int fts5ExprPhraseIsMatch(
}while( bMatch==0 );
/* Append position iPos to the output */
- rc = sqlite3Fts5PoslistWriterAppend(&pPhrase->poslist, &writer, iPos);
- if( rc!=SQLITE_OK ) goto ismatch_out;
+ if( bFirst==0 || FTS5_POS2OFFSET(iPos)==0 ){
+ rc = sqlite3Fts5PoslistWriterAppend(&pPhrase->poslist, &writer, iPos);
+ if( rc!=SQLITE_OK ) goto ismatch_out;
+ }
for(i=0; i<pPhrase->nTerm; i++){
if( sqlite3Fts5PoslistReaderNext(&aIter[i]) ) goto ismatch_out;
@@ -189332,7 +203998,9 @@ static int fts5ExprNearTest(
** phrase is not a match, break out of the loop early. */
for(i=0; rc==SQLITE_OK && i<pNear->nPhrase; i++){
Fts5ExprPhrase *pPhrase = pNear->apPhrase[i];
- if( pPhrase->nTerm>1 || pPhrase->aTerm[0].pSynonym || pNear->pColset ){
+ if( pPhrase->nTerm>1 || pPhrase->aTerm[0].pSynonym
+ || pNear->pColset || pPhrase->aTerm[0].bFirst
+ ){
int bMatch = 0;
rc = fts5ExprPhraseIsMatch(pNode, pPhrase, &bMatch);
if( bMatch==0 ) break;
@@ -189513,6 +204181,7 @@ static int fts5ExprNodeTest_STRING(
assert( pNear->nPhrase>1
|| pNear->apPhrase[0]->nTerm>1
|| pNear->apPhrase[0]->aTerm[0].pSynonym
+ || pNear->apPhrase[0]->aTerm[0].bFirst
);
/* Initialize iLast, the "lastest" rowid any iterator points to. If the
@@ -190038,6 +204707,16 @@ static void fts5ExprPhraseFree(Fts5ExprPhrase *pPhrase){
}
/*
+** Set the "bFirst" flag on the first token of the phrase passed as the
+** only argument.
+*/
+static void sqlite3Fts5ParseSetCaret(Fts5ExprPhrase *pPhrase){
+ if( pPhrase && pPhrase->nTerm ){
+ pPhrase->aTerm[0].bFirst = 1;
+ }
+}
+
+/*
** If argument pNear is NULL, then a new Fts5ExprNearset object is allocated
** and populated with pPhrase. Or, if pNear is not NULL, phrase pPhrase is
** appended to it and the results returned.
@@ -190254,7 +204933,7 @@ static Fts5ExprPhrase *sqlite3Fts5ParseTerm(
** no token characters at all. (e.g ... MATCH '""'). */
sCtx.pPhrase = sqlite3Fts5MallocZero(&pParse->rc, sizeof(Fts5ExprPhrase));
}else if( sCtx.pPhrase->nTerm ){
- sCtx.pPhrase->aTerm[sCtx.pPhrase->nTerm-1].bPrefix = bPrefix;
+ sCtx.pPhrase->aTerm[sCtx.pPhrase->nTerm-1].bPrefix = (u8)bPrefix;
}
pParse->apPhrase[pParse->nPhrase-1] = sCtx.pPhrase;
}
@@ -190315,6 +204994,7 @@ static int sqlite3Fts5ExprClonePhrase(
}
if( rc==SQLITE_OK ){
sCtx.pPhrase->aTerm[i].bPrefix = pOrig->aTerm[i].bPrefix;
+ sCtx.pPhrase->aTerm[i].bFirst = pOrig->aTerm[i].bFirst;
}
}
}else{
@@ -190333,7 +205013,10 @@ static int sqlite3Fts5ExprClonePhrase(
pNew->pRoot->pNear->nPhrase = 1;
sCtx.pPhrase->pNode = pNew->pRoot;
- if( pOrig->nTerm==1 && pOrig->aTerm[0].pSynonym==0 ){
+ if( pOrig->nTerm==1
+ && pOrig->aTerm[0].pSynonym==0
+ && pOrig->aTerm[0].bFirst==0
+ ){
pNew->pRoot->eType = FTS5_TERM;
pNew->pRoot->xNext = fts5ExprNodeNext_TERM;
}else{
@@ -190607,6 +205290,7 @@ static void fts5ExprAssignXNext(Fts5ExprNode *pNode){
Fts5ExprNearset *pNear = pNode->pNear;
if( pNear->nPhrase==1 && pNear->apPhrase[0]->nTerm==1
&& pNear->apPhrase[0]->aTerm[0].pSynonym==0
+ && pNear->apPhrase[0]->aTerm[0].bFirst==0
){
pNode->eType = FTS5_TERM;
pNode->xNext = fts5ExprNodeNext_TERM;
@@ -190693,20 +205377,23 @@ static Fts5ExprNode *sqlite3Fts5ParseNode(
}
}
- if( pParse->pConfig->eDetail!=FTS5_DETAIL_FULL
- && (pNear->nPhrase!=1 || pNear->apPhrase[0]->nTerm>1)
- ){
- assert( pParse->rc==SQLITE_OK );
- pParse->rc = SQLITE_ERROR;
- assert( pParse->zErr==0 );
- pParse->zErr = sqlite3_mprintf(
- "fts5: %s queries are not supported (detail!=full)",
- pNear->nPhrase==1 ? "phrase": "NEAR"
- );
- sqlite3_free(pRet);
- pRet = 0;
+ if( pParse->pConfig->eDetail!=FTS5_DETAIL_FULL ){
+ Fts5ExprPhrase *pPhrase = pNear->apPhrase[0];
+ if( pNear->nPhrase!=1
+ || pPhrase->nTerm>1
+ || (pPhrase->nTerm>0 && pPhrase->aTerm[0].bFirst)
+ ){
+ assert( pParse->rc==SQLITE_OK );
+ pParse->rc = SQLITE_ERROR;
+ assert( pParse->zErr==0 );
+ pParse->zErr = sqlite3_mprintf(
+ "fts5: %s queries are not supported (detail!=full)",
+ pNear->nPhrase==1 ? "phrase": "NEAR"
+ );
+ sqlite3_free(pRet);
+ pRet = 0;
+ }
}
-
}else{
fts5ExprAddChildren(pRet, pLeft);
fts5ExprAddChildren(pRet, pRight);
@@ -191110,14 +205797,19 @@ static void fts5ExprIsAlnum(
sqlite3_value **apVal /* Function arguments */
){
int iCode;
+ u8 aArr[32];
if( nArg!=1 ){
sqlite3_result_error(pCtx,
"wrong number of arguments to function fts5_isalnum", -1
);
return;
}
+ memset(aArr, 0, sizeof(aArr));
+ sqlite3Fts5UnicodeCatParse("L*", aArr);
+ sqlite3Fts5UnicodeCatParse("N*", aArr);
+ sqlite3Fts5UnicodeCatParse("Co", aArr);
iCode = sqlite3_value_int(apVal[0]);
- sqlite3_result_int(pCtx, sqlite3Fts5UnicodeIsalnum(iCode));
+ sqlite3_result_int(pCtx, aArr[sqlite3Fts5UnicodeCategory(iCode)]);
}
static void fts5ExprFold(
@@ -191161,10 +205853,12 @@ static int sqlite3Fts5ExprInit(Fts5Global *pGlobal, sqlite3 *db){
rc = sqlite3_create_function(db, p->z, -1, SQLITE_UTF8, pCtx, p->x, 0, 0);
}
- /* Avoid a warning indicating that sqlite3Fts5ParserTrace() is unused */
+ /* Avoid warnings indicating that sqlite3Fts5ParserTrace() and
+ ** sqlite3Fts5ParserFallback() are unused */
#ifndef NDEBUG
(void)sqlite3Fts5ParserTrace;
#endif
+ (void)sqlite3Fts5ParserFallback;
return rc;
}
@@ -192709,6 +207403,7 @@ static void fts5DataWrite(Fts5Index *p, i64 iRowid, const u8 *pData, int nData){
sqlite3_bind_blob(p->pWriter, 2, pData, nData, SQLITE_STATIC);
sqlite3_step(p->pWriter);
p->rc = sqlite3_reset(p->pWriter);
+ sqlite3_bind_null(p->pWriter, 2);
}
/*
@@ -194337,6 +209032,7 @@ static void fts5SegIterSeekInit(
bDlidx = (val & 0x0001);
}
p->rc = sqlite3_reset(pIdxSelect);
+ sqlite3_bind_null(pIdxSelect, 2);
if( iPg<pSeg->pgnoFirst ){
iPg = pSeg->pgnoFirst;
@@ -195549,6 +210245,7 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){
sqlite3_bind_blob(pIdxSelect, 2, aBlob, 2, SQLITE_STATIC);
assert( sqlite3_step(pIdxSelect)!=SQLITE_ROW );
p->rc = sqlite3_reset(pIdxSelect);
+ sqlite3_bind_null(pIdxSelect, 2);
}
}
#endif
@@ -195675,6 +210372,7 @@ static void fts5WriteFlushBtree(Fts5Index *p, Fts5SegWriter *pWriter){
sqlite3_bind_int64(p->pIdxWriter, 3, bFlag + ((i64)pWriter->iBtPage<<1));
sqlite3_step(p->pIdxWriter);
p->rc = sqlite3_reset(p->pIdxWriter);
+ sqlite3_bind_null(p->pIdxWriter, 2);
}
pWriter->iBtPage = 0;
}
@@ -196860,7 +211558,13 @@ static void fts5MergePrefixLists(
Fts5Buffer out = {0, 0, 0};
Fts5Buffer tmp = {0, 0, 0};
- if( sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n) ) return;
+ /* The maximum size of the output is equal to the sum of the two
+ ** input sizes + 1 varint (9 bytes). The extra varint is because if the
+ ** first rowid in one input is a large negative number, and the first in
+ ** the other a non-negative number, the delta for the non-negative
+ ** number will be larger on disk than the literal integer value
+ ** was. */
+ if( sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n + 9) ) return;
fts5DoclistIterInit(p1, &i1);
fts5DoclistIterInit(p2, &i2);
@@ -196954,6 +211658,7 @@ static void fts5MergePrefixLists(
fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.aEof - i2.aPoslist);
}
+ assert( out.n<=(p1->n+p2->n+9) );
fts5BufferSet(&p->rc, p1, out.n, out.p);
fts5BufferFree(&tmp);
@@ -197201,7 +211906,10 @@ static int sqlite3Fts5IndexCharlenToBytelen(
for(i=0; i<nChar; i++){
if( n>=nByte ) return 0; /* Input contains fewer than nChar chars */
if( (unsigned char)p[n++]>=0xc0 ){
- while( (p[n] & 0xc0)==0x80 ) n++;
+ while( (p[n] & 0xc0)==0x80 ){
+ n++;
+ if( n>=nByte ) break;
+ }
}
}
return n;
@@ -197339,7 +212047,7 @@ static int sqlite3Fts5IndexQuery(
fts5CloseReader(p);
}
- *ppIter = &pRet->base;
+ *ppIter = (Fts5IndexIter*)pRet;
sqlite3Fts5BufferFree(&buf);
}
return fts5IndexReturn(p);
@@ -198726,7 +213434,7 @@ static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){
case FTS5_SAVEPOINT:
assert( p->ts.eState==1 );
assert( iSavepoint>=0 );
- assert( iSavepoint>p->ts.iSavepoint );
+ assert( iSavepoint>=p->ts.iSavepoint );
p->ts.iSavepoint = iSavepoint;
break;
@@ -198981,6 +213689,12 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){
aColMap[1] = nCol;
aColMap[2] = nCol+1;
+ assert( SQLITE_INDEX_CONSTRAINT_EQ<SQLITE_INDEX_CONSTRAINT_MATCH );
+ assert( SQLITE_INDEX_CONSTRAINT_GT<SQLITE_INDEX_CONSTRAINT_MATCH );
+ assert( SQLITE_INDEX_CONSTRAINT_LE<SQLITE_INDEX_CONSTRAINT_MATCH );
+ assert( SQLITE_INDEX_CONSTRAINT_GE<SQLITE_INDEX_CONSTRAINT_MATCH );
+ assert( SQLITE_INDEX_CONSTRAINT_LE<SQLITE_INDEX_CONSTRAINT_MATCH );
+
/* Set idxFlags flags for all WHERE clause terms that will be used. */
for(i=0; i<pInfo->nConstraint; i++){
struct sqlite3_index_constraint *p = &pInfo->aConstraint[i];
@@ -198999,11 +213713,11 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){
pInfo->estimatedCost = 1e50;
return SQLITE_OK;
}
- }else{
+ }else if( p->op<=SQLITE_INDEX_CONSTRAINT_MATCH ){
int j;
for(j=1; j<ArraySize(aConstraint); j++){
struct Constraint *pC = &aConstraint[j];
- if( iCol==aColMap[pC->iCol] && p->op & pC->op && p->usable ){
+ if( iCol==aColMap[pC->iCol] && (p->op & pC->op) && p->usable ){
pC->iConsIndex = i;
idxFlags |= pC->fts5op;
}
@@ -199645,6 +214359,13 @@ static int fts5FilterMethod(
assert( nVal==0 && pMatch==0 && bOrderByRank==0 && bDesc==0 );
assert( pCsr->iLastRowid==LARGEST_INT64 );
assert( pCsr->iFirstRowid==SMALLEST_INT64 );
+ if( pTab->pSortCsr->bDesc ){
+ pCsr->iLastRowid = pTab->pSortCsr->iFirstRowid;
+ pCsr->iFirstRowid = pTab->pSortCsr->iLastRowid;
+ }else{
+ pCsr->iLastRowid = pTab->pSortCsr->iLastRowid;
+ pCsr->iFirstRowid = pTab->pSortCsr->iFirstRowid;
+ }
pCsr->ePlan = FTS5_PLAN_SOURCE;
pCsr->pExpr = pTab->pSortCsr->pExpr;
rc = fts5CursorFirst(pTab, pCsr, bDesc);
@@ -201075,12 +215796,27 @@ static void fts5SourceIdFunc(
){
assert( nArg==0 );
UNUSED_PARAM2(nArg, apUnused);
- sqlite3_result_text(pCtx, "fts5: 2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827", -1, SQLITE_TRANSIENT);
+ sqlite3_result_text(pCtx, "fts5: 2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9", -1, SQLITE_TRANSIENT);
+}
+
+/*
+** Return true if zName is the extension on one of the shadow tables used
+** by this module.
+*/
+static int fts5ShadowName(const char *zName){
+ static const char *azName[] = {
+ "config", "content", "data", "docsize", "idx"
+ };
+ unsigned int i;
+ for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
+ if( sqlite3_stricmp(zName, azName[i])==0 ) return 1;
+ }
+ return 0;
}
static int fts5Init(sqlite3 *db){
static const sqlite3_module fts5Mod = {
- /* iVersion */ 2,
+ /* iVersion */ 3,
/* xCreate */ fts5CreateMethod,
/* xConnect */ fts5ConnectMethod,
/* xBestIndex */ fts5BestIndexMethod,
@@ -201103,6 +215839,7 @@ static int fts5Init(sqlite3 *db){
/* xSavepoint */ fts5SavepointMethod,
/* xRelease */ fts5ReleaseMethod,
/* xRollbackTo */ fts5RollbackToMethod,
+ /* xShadowName */ fts5ShadowName
};
int rc;
@@ -201651,6 +216388,7 @@ static int fts5StorageInsertDocsize(
sqlite3_bind_blob(pReplace, 2, pBuf->p, pBuf->n, SQLITE_STATIC);
sqlite3_step(pReplace);
rc = sqlite3_reset(pReplace);
+ sqlite3_bind_null(pReplace, 2);
}
}
return rc;
@@ -202311,6 +217049,7 @@ static int sqlite3Fts5StorageConfigValue(
}
sqlite3_step(pReplace);
rc = sqlite3_reset(pReplace);
+ sqlite3_bind_null(pReplace, 1);
}
if( rc==SQLITE_OK && pVal ){
int iNew = p->pConfig->iCookie + 1;
@@ -202561,6 +217300,8 @@ struct Unicode61Tokenizer {
int bRemoveDiacritic; /* True if remove_diacritics=1 is set */
int nException;
int *aiException;
+
+ unsigned char aCategory[32]; /* True for token char categories */
};
static int fts5UnicodeAddExceptions(
@@ -202585,7 +217326,7 @@ static int fts5UnicodeAddExceptions(
if( iCode<128 ){
p->aTokenChar[iCode] = (unsigned char)bTokenChars;
}else{
- bToken = sqlite3Fts5UnicodeIsalnum(iCode);
+ bToken = p->aCategory[sqlite3Fts5UnicodeCategory(iCode)];
assert( (bToken==0 || bToken==1) );
assert( (bTokenChars==0 || bTokenChars==1) );
if( bToken!=bTokenChars && sqlite3Fts5UnicodeIsdiacritic(iCode)==0 ){
@@ -202646,6 +217387,21 @@ static void fts5UnicodeDelete(Fts5Tokenizer *pTok){
return;
}
+static int unicodeSetCategories(Unicode61Tokenizer *p, const char *zCat){
+ const char *z = zCat;
+
+ while( *z ){
+ while( *z==' ' || *z=='\t' ) z++;
+ if( *z && sqlite3Fts5UnicodeCatParse(z, p->aCategory) ){
+ return SQLITE_ERROR;
+ }
+ while( *z!=' ' && *z!='\t' && *z!='\0' ) z++;
+ }
+
+ sqlite3Fts5UnicodeAscii(p->aCategory, p->aTokenChar);
+ return SQLITE_OK;
+}
+
/*
** Create a "unicode61" tokenizer.
*/
@@ -202664,15 +217420,28 @@ static int fts5UnicodeCreate(
}else{
p = (Unicode61Tokenizer*)sqlite3_malloc(sizeof(Unicode61Tokenizer));
if( p ){
+ const char *zCat = "L* N* Co";
int i;
memset(p, 0, sizeof(Unicode61Tokenizer));
- memcpy(p->aTokenChar, aAsciiTokenChar, sizeof(aAsciiTokenChar));
+
p->bRemoveDiacritic = 1;
p->nFold = 64;
p->aFold = sqlite3_malloc(p->nFold * sizeof(char));
if( p->aFold==0 ){
rc = SQLITE_NOMEM;
}
+
+ /* Search for a "categories" argument */
+ for(i=0; rc==SQLITE_OK && i<nArg; i+=2){
+ if( 0==sqlite3_stricmp(azArg[i], "categories") ){
+ zCat = azArg[i+1];
+ }
+ }
+
+ if( rc==SQLITE_OK ){
+ rc = unicodeSetCategories(p, zCat);
+ }
+
for(i=0; rc==SQLITE_OK && i<nArg; i+=2){
const char *zArg = azArg[i+1];
if( 0==sqlite3_stricmp(azArg[i], "remove_diacritics") ){
@@ -202686,10 +217455,14 @@ static int fts5UnicodeCreate(
}else
if( 0==sqlite3_stricmp(azArg[i], "separators") ){
rc = fts5UnicodeAddExceptions(p, zArg, 0);
+ }else
+ if( 0==sqlite3_stricmp(azArg[i], "categories") ){
+ /* no-op */
}else{
rc = SQLITE_ERROR;
}
}
+
}else{
rc = SQLITE_NOMEM;
}
@@ -202708,8 +217481,10 @@ static int fts5UnicodeCreate(
** character (not a separator).
*/
static int fts5UnicodeIsAlnum(Unicode61Tokenizer *p, int iCode){
- assert( (sqlite3Fts5UnicodeIsalnum(iCode) & 0xFFFFFFFE)==0 );
- return sqlite3Fts5UnicodeIsalnum(iCode) ^ fts5UnicodeIsException(p, iCode);
+ return (
+ p->aCategory[sqlite3Fts5UnicodeCategory(iCode)]
+ ^ fts5UnicodeIsException(p, iCode)
+ );
}
static int fts5UnicodeTokenize(
@@ -203585,135 +218360,6 @@ static int sqlite3Fts5TokenizerInit(fts5_api *pApi){
/* #include <assert.h> */
-/*
-** Return true if the argument corresponds to a unicode codepoint
-** classified as either a letter or a number. Otherwise false.
-**
-** The results are undefined if the value passed to this function
-** is less than zero.
-*/
-static int sqlite3Fts5UnicodeIsalnum(int c){
- /* Each unsigned integer in the following array corresponds to a contiguous
- ** range of unicode codepoints that are not either letters or numbers (i.e.
- ** codepoints for which this function should return 0).
- **
- ** The most significant 22 bits in each 32-bit value contain the first
- ** codepoint in the range. The least significant 10 bits are used to store
- ** the size of the range (always at least 1). In other words, the value
- ** ((C<<22) + N) represents a range of N codepoints starting with codepoint
- ** C. It is not possible to represent a range larger than 1023 codepoints
- ** using this format.
- */
- static const unsigned int aEntry[] = {
- 0x00000030, 0x0000E807, 0x00016C06, 0x0001EC2F, 0x0002AC07,
- 0x0002D001, 0x0002D803, 0x0002EC01, 0x0002FC01, 0x00035C01,
- 0x0003DC01, 0x000B0804, 0x000B480E, 0x000B9407, 0x000BB401,
- 0x000BBC81, 0x000DD401, 0x000DF801, 0x000E1002, 0x000E1C01,
- 0x000FD801, 0x00120808, 0x00156806, 0x00162402, 0x00163C01,
- 0x00164437, 0x0017CC02, 0x00180005, 0x00181816, 0x00187802,
- 0x00192C15, 0x0019A804, 0x0019C001, 0x001B5001, 0x001B580F,
- 0x001B9C07, 0x001BF402, 0x001C000E, 0x001C3C01, 0x001C4401,
- 0x001CC01B, 0x001E980B, 0x001FAC09, 0x001FD804, 0x00205804,
- 0x00206C09, 0x00209403, 0x0020A405, 0x0020C00F, 0x00216403,
- 0x00217801, 0x0023901B, 0x00240004, 0x0024E803, 0x0024F812,
- 0x00254407, 0x00258804, 0x0025C001, 0x00260403, 0x0026F001,
- 0x0026F807, 0x00271C02, 0x00272C03, 0x00275C01, 0x00278802,
- 0x0027C802, 0x0027E802, 0x00280403, 0x0028F001, 0x0028F805,
- 0x00291C02, 0x00292C03, 0x00294401, 0x0029C002, 0x0029D401,
- 0x002A0403, 0x002AF001, 0x002AF808, 0x002B1C03, 0x002B2C03,
- 0x002B8802, 0x002BC002, 0x002C0403, 0x002CF001, 0x002CF807,
- 0x002D1C02, 0x002D2C03, 0x002D5802, 0x002D8802, 0x002DC001,
- 0x002E0801, 0x002EF805, 0x002F1803, 0x002F2804, 0x002F5C01,
- 0x002FCC08, 0x00300403, 0x0030F807, 0x00311803, 0x00312804,
- 0x00315402, 0x00318802, 0x0031FC01, 0x00320802, 0x0032F001,
- 0x0032F807, 0x00331803, 0x00332804, 0x00335402, 0x00338802,
- 0x00340802, 0x0034F807, 0x00351803, 0x00352804, 0x00355C01,
- 0x00358802, 0x0035E401, 0x00360802, 0x00372801, 0x00373C06,
- 0x00375801, 0x00376008, 0x0037C803, 0x0038C401, 0x0038D007,
- 0x0038FC01, 0x00391C09, 0x00396802, 0x003AC401, 0x003AD006,
- 0x003AEC02, 0x003B2006, 0x003C041F, 0x003CD00C, 0x003DC417,
- 0x003E340B, 0x003E6424, 0x003EF80F, 0x003F380D, 0x0040AC14,
- 0x00412806, 0x00415804, 0x00417803, 0x00418803, 0x00419C07,
- 0x0041C404, 0x0042080C, 0x00423C01, 0x00426806, 0x0043EC01,
- 0x004D740C, 0x004E400A, 0x00500001, 0x0059B402, 0x005A0001,
- 0x005A6C02, 0x005BAC03, 0x005C4803, 0x005CC805, 0x005D4802,
- 0x005DC802, 0x005ED023, 0x005F6004, 0x005F7401, 0x0060000F,
- 0x0062A401, 0x0064800C, 0x0064C00C, 0x00650001, 0x00651002,
- 0x0066C011, 0x00672002, 0x00677822, 0x00685C05, 0x00687802,
- 0x0069540A, 0x0069801D, 0x0069FC01, 0x006A8007, 0x006AA006,
- 0x006C0005, 0x006CD011, 0x006D6823, 0x006E0003, 0x006E840D,
- 0x006F980E, 0x006FF004, 0x00709014, 0x0070EC05, 0x0071F802,
- 0x00730008, 0x00734019, 0x0073B401, 0x0073C803, 0x00770027,
- 0x0077F004, 0x007EF401, 0x007EFC03, 0x007F3403, 0x007F7403,
- 0x007FB403, 0x007FF402, 0x00800065, 0x0081A806, 0x0081E805,
- 0x00822805, 0x0082801A, 0x00834021, 0x00840002, 0x00840C04,
- 0x00842002, 0x00845001, 0x00845803, 0x00847806, 0x00849401,
- 0x00849C01, 0x0084A401, 0x0084B801, 0x0084E802, 0x00850005,
- 0x00852804, 0x00853C01, 0x00864264, 0x00900027, 0x0091000B,
- 0x0092704E, 0x00940200, 0x009C0475, 0x009E53B9, 0x00AD400A,
- 0x00B39406, 0x00B3BC03, 0x00B3E404, 0x00B3F802, 0x00B5C001,
- 0x00B5FC01, 0x00B7804F, 0x00B8C00C, 0x00BA001A, 0x00BA6C59,
- 0x00BC00D6, 0x00BFC00C, 0x00C00005, 0x00C02019, 0x00C0A807,
- 0x00C0D802, 0x00C0F403, 0x00C26404, 0x00C28001, 0x00C3EC01,
- 0x00C64002, 0x00C6580A, 0x00C70024, 0x00C8001F, 0x00C8A81E,
- 0x00C94001, 0x00C98020, 0x00CA2827, 0x00CB003F, 0x00CC0100,
- 0x01370040, 0x02924037, 0x0293F802, 0x02983403, 0x0299BC10,
- 0x029A7C01, 0x029BC008, 0x029C0017, 0x029C8002, 0x029E2402,
- 0x02A00801, 0x02A01801, 0x02A02C01, 0x02A08C09, 0x02A0D804,
- 0x02A1D004, 0x02A20002, 0x02A2D011, 0x02A33802, 0x02A38012,
- 0x02A3E003, 0x02A4980A, 0x02A51C0D, 0x02A57C01, 0x02A60004,
- 0x02A6CC1B, 0x02A77802, 0x02A8A40E, 0x02A90C01, 0x02A93002,
- 0x02A97004, 0x02A9DC03, 0x02A9EC01, 0x02AAC001, 0x02AAC803,
- 0x02AADC02, 0x02AAF802, 0x02AB0401, 0x02AB7802, 0x02ABAC07,
- 0x02ABD402, 0x02AF8C0B, 0x03600001, 0x036DFC02, 0x036FFC02,
- 0x037FFC01, 0x03EC7801, 0x03ECA401, 0x03EEC810, 0x03F4F802,
- 0x03F7F002, 0x03F8001A, 0x03F88007, 0x03F8C023, 0x03F95013,
- 0x03F9A004, 0x03FBFC01, 0x03FC040F, 0x03FC6807, 0x03FCEC06,
- 0x03FD6C0B, 0x03FF8007, 0x03FFA007, 0x03FFE405, 0x04040003,
- 0x0404DC09, 0x0405E411, 0x0406400C, 0x0407402E, 0x040E7C01,
- 0x040F4001, 0x04215C01, 0x04247C01, 0x0424FC01, 0x04280403,
- 0x04281402, 0x04283004, 0x0428E003, 0x0428FC01, 0x04294009,
- 0x0429FC01, 0x042CE407, 0x04400003, 0x0440E016, 0x04420003,
- 0x0442C012, 0x04440003, 0x04449C0E, 0x04450004, 0x04460003,
- 0x0446CC0E, 0x04471404, 0x045AAC0D, 0x0491C004, 0x05BD442E,
- 0x05BE3C04, 0x074000F6, 0x07440027, 0x0744A4B5, 0x07480046,
- 0x074C0057, 0x075B0401, 0x075B6C01, 0x075BEC01, 0x075C5401,
- 0x075CD401, 0x075D3C01, 0x075DBC01, 0x075E2401, 0x075EA401,
- 0x075F0C01, 0x07BBC002, 0x07C0002C, 0x07C0C064, 0x07C2800F,
- 0x07C2C40E, 0x07C3040F, 0x07C3440F, 0x07C4401F, 0x07C4C03C,
- 0x07C5C02B, 0x07C7981D, 0x07C8402B, 0x07C90009, 0x07C94002,
- 0x07CC0021, 0x07CCC006, 0x07CCDC46, 0x07CE0014, 0x07CE8025,
- 0x07CF1805, 0x07CF8011, 0x07D0003F, 0x07D10001, 0x07D108B6,
- 0x07D3E404, 0x07D4003E, 0x07D50004, 0x07D54018, 0x07D7EC46,
- 0x07D9140B, 0x07DA0046, 0x07DC0074, 0x38000401, 0x38008060,
- 0x380400F0,
- };
- static const unsigned int aAscii[4] = {
- 0xFFFFFFFF, 0xFC00FFFF, 0xF8000001, 0xF8000001,
- };
-
- if( (unsigned int)c<128 ){
- return ( (aAscii[c >> 5] & (1 << (c & 0x001F)))==0 );
- }else if( (unsigned int)c<(1<<22) ){
- unsigned int key = (((unsigned int)c)<<10) | 0x000003FF;
- int iRes = 0;
- int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1;
- int iLo = 0;
- while( iHi>=iLo ){
- int iTest = (iHi + iLo) / 2;
- if( key >= aEntry[iTest] ){
- iRes = iTest;
- iLo = iTest+1;
- }else{
- iHi = iTest-1;
- }
- }
- assert( aEntry[0]<key );
- assert( key>=aEntry[iRes] );
- return (((unsigned int)c) >= ((aEntry[iRes]>>10) + (aEntry[iRes]&0x3FF)));
- }
- return 1;
-}
/*
@@ -203926,6 +218572,539 @@ static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){
return ret;
}
+
+#if 0
+static int sqlite3Fts5UnicodeNCat(void) {
+ return 32;
+}
+#endif
+
+static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){
+ aArray[0] = 1;
+ switch( zCat[0] ){
+ case 'C':
+ switch( zCat[1] ){
+ case 'c': aArray[1] = 1; break;
+ case 'f': aArray[2] = 1; break;
+ case 'n': aArray[3] = 1; break;
+ case 's': aArray[4] = 1; break;
+ case 'o': aArray[31] = 1; break;
+ case '*':
+ aArray[1] = 1;
+ aArray[2] = 1;
+ aArray[3] = 1;
+ aArray[4] = 1;
+ aArray[31] = 1;
+ break;
+ default: return 1; }
+ break;
+
+ case 'L':
+ switch( zCat[1] ){
+ case 'l': aArray[5] = 1; break;
+ case 'm': aArray[6] = 1; break;
+ case 'o': aArray[7] = 1; break;
+ case 't': aArray[8] = 1; break;
+ case 'u': aArray[9] = 1; break;
+ case 'C': aArray[30] = 1; break;
+ case '*':
+ aArray[5] = 1;
+ aArray[6] = 1;
+ aArray[7] = 1;
+ aArray[8] = 1;
+ aArray[9] = 1;
+ aArray[30] = 1;
+ break;
+ default: return 1; }
+ break;
+
+ case 'M':
+ switch( zCat[1] ){
+ case 'c': aArray[10] = 1; break;
+ case 'e': aArray[11] = 1; break;
+ case 'n': aArray[12] = 1; break;
+ case '*':
+ aArray[10] = 1;
+ aArray[11] = 1;
+ aArray[12] = 1;
+ break;
+ default: return 1; }
+ break;
+
+ case 'N':
+ switch( zCat[1] ){
+ case 'd': aArray[13] = 1; break;
+ case 'l': aArray[14] = 1; break;
+ case 'o': aArray[15] = 1; break;
+ case '*':
+ aArray[13] = 1;
+ aArray[14] = 1;
+ aArray[15] = 1;
+ break;
+ default: return 1; }
+ break;
+
+ case 'P':
+ switch( zCat[1] ){
+ case 'c': aArray[16] = 1; break;
+ case 'd': aArray[17] = 1; break;
+ case 'e': aArray[18] = 1; break;
+ case 'f': aArray[19] = 1; break;
+ case 'i': aArray[20] = 1; break;
+ case 'o': aArray[21] = 1; break;
+ case 's': aArray[22] = 1; break;
+ case '*':
+ aArray[16] = 1;
+ aArray[17] = 1;
+ aArray[18] = 1;
+ aArray[19] = 1;
+ aArray[20] = 1;
+ aArray[21] = 1;
+ aArray[22] = 1;
+ break;
+ default: return 1; }
+ break;
+
+ case 'S':
+ switch( zCat[1] ){
+ case 'c': aArray[23] = 1; break;
+ case 'k': aArray[24] = 1; break;
+ case 'm': aArray[25] = 1; break;
+ case 'o': aArray[26] = 1; break;
+ case '*':
+ aArray[23] = 1;
+ aArray[24] = 1;
+ aArray[25] = 1;
+ aArray[26] = 1;
+ break;
+ default: return 1; }
+ break;
+
+ case 'Z':
+ switch( zCat[1] ){
+ case 'l': aArray[27] = 1; break;
+ case 'p': aArray[28] = 1; break;
+ case 's': aArray[29] = 1; break;
+ case '*':
+ aArray[27] = 1;
+ aArray[28] = 1;
+ aArray[29] = 1;
+ break;
+ default: return 1; }
+ break;
+
+ }
+ return 0;
+}
+
+static u16 aFts5UnicodeBlock[] = {
+ 0, 1471, 1753, 1760, 1760, 1760, 1760, 1760, 1760, 1760,
+ 1760, 1760, 1760, 1760, 1760, 1763, 1765,
+ };
+static u16 aFts5UnicodeMap[] = {
+ 0, 32, 33, 36, 37, 40, 41, 42, 43, 44,
+ 45, 46, 48, 58, 60, 63, 65, 91, 92, 93,
+ 94, 95, 96, 97, 123, 124, 125, 126, 127, 160,
+ 161, 162, 166, 167, 168, 169, 170, 171, 172, 173,
+ 174, 175, 176, 177, 178, 180, 181, 182, 184, 185,
+ 186, 187, 188, 191, 192, 215, 216, 223, 247, 248,
+ 256, 312, 313, 329, 330, 377, 383, 385, 387, 388,
+ 391, 394, 396, 398, 402, 403, 405, 406, 409, 412,
+ 414, 415, 417, 418, 423, 427, 428, 431, 434, 436,
+ 437, 440, 442, 443, 444, 446, 448, 452, 453, 454,
+ 455, 456, 457, 458, 459, 460, 461, 477, 478, 496,
+ 497, 498, 499, 500, 503, 505, 506, 564, 570, 572,
+ 573, 575, 577, 580, 583, 584, 592, 660, 661, 688,
+ 706, 710, 722, 736, 741, 748, 749, 750, 751, 768,
+ 880, 884, 885, 886, 890, 891, 894, 900, 902, 903,
+ 904, 908, 910, 912, 913, 931, 940, 975, 977, 978,
+ 981, 984, 1008, 1012, 1014, 1015, 1018, 1020, 1021, 1072,
+ 1120, 1154, 1155, 1160, 1162, 1217, 1231, 1232, 1329, 1369,
+ 1370, 1377, 1417, 1418, 1423, 1425, 1470, 1471, 1472, 1473,
+ 1475, 1476, 1478, 1479, 1488, 1520, 1523, 1536, 1542, 1545,
+ 1547, 1548, 1550, 1552, 1563, 1566, 1568, 1600, 1601, 1611,
+ 1632, 1642, 1646, 1648, 1649, 1748, 1749, 1750, 1757, 1758,
+ 1759, 1765, 1767, 1769, 1770, 1774, 1776, 1786, 1789, 1791,
+ 1792, 1807, 1808, 1809, 1810, 1840, 1869, 1958, 1969, 1984,
+ 1994, 2027, 2036, 2038, 2039, 2042, 2048, 2070, 2074, 2075,
+ 2084, 2085, 2088, 2089, 2096, 2112, 2137, 2142, 2208, 2210,
+ 2276, 2304, 2307, 2308, 2362, 2363, 2364, 2365, 2366, 2369,
+ 2377, 2381, 2382, 2384, 2385, 2392, 2402, 2404, 2406, 2416,
+ 2417, 2418, 2425, 2433, 2434, 2437, 2447, 2451, 2474, 2482,
+ 2486, 2492, 2493, 2494, 2497, 2503, 2507, 2509, 2510, 2519,
+ 2524, 2527, 2530, 2534, 2544, 2546, 2548, 2554, 2555, 2561,
+ 2563, 2565, 2575, 2579, 2602, 2610, 2613, 2616, 2620, 2622,
+ 2625, 2631, 2635, 2641, 2649, 2654, 2662, 2672, 2674, 2677,
+ 2689, 2691, 2693, 2703, 2707, 2730, 2738, 2741, 2748, 2749,
+ 2750, 2753, 2759, 2761, 2763, 2765, 2768, 2784, 2786, 2790,
+ 2800, 2801, 2817, 2818, 2821, 2831, 2835, 2858, 2866, 2869,
+ 2876, 2877, 2878, 2879, 2880, 2881, 2887, 2891, 2893, 2902,
+ 2903, 2908, 2911, 2914, 2918, 2928, 2929, 2930, 2946, 2947,
+ 2949, 2958, 2962, 2969, 2972, 2974, 2979, 2984, 2990, 3006,
+ 3008, 3009, 3014, 3018, 3021, 3024, 3031, 3046, 3056, 3059,
+ 3065, 3066, 3073, 3077, 3086, 3090, 3114, 3125, 3133, 3134,
+ 3137, 3142, 3146, 3157, 3160, 3168, 3170, 3174, 3192, 3199,
+ 3202, 3205, 3214, 3218, 3242, 3253, 3260, 3261, 3262, 3263,
+ 3264, 3270, 3271, 3274, 3276, 3285, 3294, 3296, 3298, 3302,
+ 3313, 3330, 3333, 3342, 3346, 3389, 3390, 3393, 3398, 3402,
+ 3405, 3406, 3415, 3424, 3426, 3430, 3440, 3449, 3450, 3458,
+ 3461, 3482, 3507, 3517, 3520, 3530, 3535, 3538, 3542, 3544,
+ 3570, 3572, 3585, 3633, 3634, 3636, 3647, 3648, 3654, 3655,
+ 3663, 3664, 3674, 3713, 3716, 3719, 3722, 3725, 3732, 3737,
+ 3745, 3749, 3751, 3754, 3757, 3761, 3762, 3764, 3771, 3773,
+ 3776, 3782, 3784, 3792, 3804, 3840, 3841, 3844, 3859, 3860,
+ 3861, 3864, 3866, 3872, 3882, 3892, 3893, 3894, 3895, 3896,
+ 3897, 3898, 3899, 3900, 3901, 3902, 3904, 3913, 3953, 3967,
+ 3968, 3973, 3974, 3976, 3981, 3993, 4030, 4038, 4039, 4046,
+ 4048, 4053, 4057, 4096, 4139, 4141, 4145, 4146, 4152, 4153,
+ 4155, 4157, 4159, 4160, 4170, 4176, 4182, 4184, 4186, 4190,
+ 4193, 4194, 4197, 4199, 4206, 4209, 4213, 4226, 4227, 4229,
+ 4231, 4237, 4238, 4239, 4240, 4250, 4253, 4254, 4256, 4295,
+ 4301, 4304, 4347, 4348, 4349, 4682, 4688, 4696, 4698, 4704,
+ 4746, 4752, 4786, 4792, 4800, 4802, 4808, 4824, 4882, 4888,
+ 4957, 4960, 4969, 4992, 5008, 5024, 5120, 5121, 5741, 5743,
+ 5760, 5761, 5787, 5788, 5792, 5867, 5870, 5888, 5902, 5906,
+ 5920, 5938, 5941, 5952, 5970, 5984, 5998, 6002, 6016, 6068,
+ 6070, 6071, 6078, 6086, 6087, 6089, 6100, 6103, 6104, 6107,
+ 6108, 6109, 6112, 6128, 6144, 6150, 6151, 6155, 6158, 6160,
+ 6176, 6211, 6212, 6272, 6313, 6314, 6320, 6400, 6432, 6435,
+ 6439, 6441, 6448, 6450, 6451, 6457, 6464, 6468, 6470, 6480,
+ 6512, 6528, 6576, 6593, 6600, 6608, 6618, 6622, 6656, 6679,
+ 6681, 6686, 6688, 6741, 6742, 6743, 6744, 6752, 6753, 6754,
+ 6755, 6757, 6765, 6771, 6783, 6784, 6800, 6816, 6823, 6824,
+ 6912, 6916, 6917, 6964, 6965, 6966, 6971, 6972, 6973, 6978,
+ 6979, 6981, 6992, 7002, 7009, 7019, 7028, 7040, 7042, 7043,
+ 7073, 7074, 7078, 7080, 7082, 7083, 7084, 7086, 7088, 7098,
+ 7142, 7143, 7144, 7146, 7149, 7150, 7151, 7154, 7164, 7168,
+ 7204, 7212, 7220, 7222, 7227, 7232, 7245, 7248, 7258, 7288,
+ 7294, 7360, 7376, 7379, 7380, 7393, 7394, 7401, 7405, 7406,
+ 7410, 7412, 7413, 7424, 7468, 7531, 7544, 7545, 7579, 7616,
+ 7676, 7680, 7830, 7838, 7936, 7944, 7952, 7960, 7968, 7976,
+ 7984, 7992, 8000, 8008, 8016, 8025, 8027, 8029, 8031, 8033,
+ 8040, 8048, 8064, 8072, 8080, 8088, 8096, 8104, 8112, 8118,
+ 8120, 8124, 8125, 8126, 8127, 8130, 8134, 8136, 8140, 8141,
+ 8144, 8150, 8152, 8157, 8160, 8168, 8173, 8178, 8182, 8184,
+ 8188, 8189, 8192, 8203, 8208, 8214, 8216, 8217, 8218, 8219,
+ 8221, 8222, 8223, 8224, 8232, 8233, 8234, 8239, 8240, 8249,
+ 8250, 8251, 8255, 8257, 8260, 8261, 8262, 8263, 8274, 8275,
+ 8276, 8277, 8287, 8288, 8298, 8304, 8305, 8308, 8314, 8317,
+ 8318, 8319, 8320, 8330, 8333, 8334, 8336, 8352, 8400, 8413,
+ 8417, 8418, 8421, 8448, 8450, 8451, 8455, 8456, 8458, 8459,
+ 8462, 8464, 8467, 8468, 8469, 8470, 8472, 8473, 8478, 8484,
+ 8485, 8486, 8487, 8488, 8489, 8490, 8494, 8495, 8496, 8500,
+ 8501, 8505, 8506, 8508, 8510, 8512, 8517, 8519, 8522, 8523,
+ 8524, 8526, 8527, 8528, 8544, 8579, 8581, 8585, 8592, 8597,
+ 8602, 8604, 8608, 8609, 8611, 8612, 8614, 8615, 8622, 8623,
+ 8654, 8656, 8658, 8659, 8660, 8661, 8692, 8960, 8968, 8972,
+ 8992, 8994, 9001, 9002, 9003, 9084, 9085, 9115, 9140, 9180,
+ 9186, 9216, 9280, 9312, 9372, 9450, 9472, 9655, 9656, 9665,
+ 9666, 9720, 9728, 9839, 9840, 9985, 10088, 10089, 10090, 10091,
+ 10092, 10093, 10094, 10095, 10096, 10097, 10098, 10099, 10100, 10101,
+ 10102, 10132, 10176, 10181, 10182, 10183, 10214, 10215, 10216, 10217,
+ 10218, 10219, 10220, 10221, 10222, 10223, 10224, 10240, 10496, 10627,
+ 10628, 10629, 10630, 10631, 10632, 10633, 10634, 10635, 10636, 10637,
+ 10638, 10639, 10640, 10641, 10642, 10643, 10644, 10645, 10646, 10647,
+ 10648, 10649, 10712, 10713, 10714, 10715, 10716, 10748, 10749, 10750,
+ 11008, 11056, 11077, 11079, 11088, 11264, 11312, 11360, 11363, 11365,
+ 11367, 11374, 11377, 11378, 11380, 11381, 11383, 11388, 11390, 11393,
+ 11394, 11492, 11493, 11499, 11503, 11506, 11513, 11517, 11518, 11520,
+ 11559, 11565, 11568, 11631, 11632, 11647, 11648, 11680, 11688, 11696,
+ 11704, 11712, 11720, 11728, 11736, 11744, 11776, 11778, 11779, 11780,
+ 11781, 11782, 11785, 11786, 11787, 11788, 11789, 11790, 11799, 11800,
+ 11802, 11803, 11804, 11805, 11806, 11808, 11809, 11810, 11811, 11812,
+ 11813, 11814, 11815, 11816, 11817, 11818, 11823, 11824, 11834, 11904,
+ 11931, 12032, 12272, 12288, 12289, 12292, 12293, 12294, 12295, 12296,
+ 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 12306,
+ 12308, 12309, 12310, 12311, 12312, 12313, 12314, 12315, 12316, 12317,
+ 12318, 12320, 12321, 12330, 12334, 12336, 12337, 12342, 12344, 12347,
+ 12348, 12349, 12350, 12353, 12441, 12443, 12445, 12447, 12448, 12449,
+ 12539, 12540, 12543, 12549, 12593, 12688, 12690, 12694, 12704, 12736,
+ 12784, 12800, 12832, 12842, 12872, 12880, 12881, 12896, 12928, 12938,
+ 12977, 12992, 13056, 13312, 19893, 19904, 19968, 40908, 40960, 40981,
+ 40982, 42128, 42192, 42232, 42238, 42240, 42508, 42509, 42512, 42528,
+ 42538, 42560, 42606, 42607, 42608, 42611, 42612, 42622, 42623, 42624,
+ 42655, 42656, 42726, 42736, 42738, 42752, 42775, 42784, 42786, 42800,
+ 42802, 42864, 42865, 42873, 42878, 42888, 42889, 42891, 42896, 42912,
+ 43000, 43002, 43003, 43010, 43011, 43014, 43015, 43019, 43020, 43043,
+ 43045, 43047, 43048, 43056, 43062, 43064, 43065, 43072, 43124, 43136,
+ 43138, 43188, 43204, 43214, 43216, 43232, 43250, 43256, 43259, 43264,
+ 43274, 43302, 43310, 43312, 43335, 43346, 43359, 43360, 43392, 43395,
+ 43396, 43443, 43444, 43446, 43450, 43452, 43453, 43457, 43471, 43472,
+ 43486, 43520, 43561, 43567, 43569, 43571, 43573, 43584, 43587, 43588,
+ 43596, 43597, 43600, 43612, 43616, 43632, 43633, 43639, 43642, 43643,
+ 43648, 43696, 43697, 43698, 43701, 43703, 43705, 43710, 43712, 43713,
+ 43714, 43739, 43741, 43742, 43744, 43755, 43756, 43758, 43760, 43762,
+ 43763, 43765, 43766, 43777, 43785, 43793, 43808, 43816, 43968, 44003,
+ 44005, 44006, 44008, 44009, 44011, 44012, 44013, 44016, 44032, 55203,
+ 55216, 55243, 55296, 56191, 56319, 57343, 57344, 63743, 63744, 64112,
+ 64256, 64275, 64285, 64286, 64287, 64297, 64298, 64312, 64318, 64320,
+ 64323, 64326, 64434, 64467, 64830, 64831, 64848, 64914, 65008, 65020,
+ 65021, 65024, 65040, 65047, 65048, 65049, 65056, 65072, 65073, 65075,
+ 65077, 65078, 65079, 65080, 65081, 65082, 65083, 65084, 65085, 65086,
+ 65087, 65088, 65089, 65090, 65091, 65092, 65093, 65095, 65096, 65097,
+ 65101, 65104, 65108, 65112, 65113, 65114, 65115, 65116, 65117, 65118,
+ 65119, 65122, 65123, 65124, 65128, 65129, 65130, 65136, 65142, 65279,
+ 65281, 65284, 65285, 65288, 65289, 65290, 65291, 65292, 65293, 65294,
+ 65296, 65306, 65308, 65311, 65313, 65339, 65340, 65341, 65342, 65343,
+ 65344, 65345, 65371, 65372, 65373, 65374, 65375, 65376, 65377, 65378,
+ 65379, 65380, 65382, 65392, 65393, 65438, 65440, 65474, 65482, 65490,
+ 65498, 65504, 65506, 65507, 65508, 65509, 65512, 65513, 65517, 65529,
+ 65532, 0, 13, 40, 60, 63, 80, 128, 256, 263,
+ 311, 320, 373, 377, 394, 400, 464, 509, 640, 672,
+ 768, 800, 816, 833, 834, 842, 896, 927, 928, 968,
+ 976, 977, 1024, 1064, 1104, 1184, 2048, 2056, 2058, 2103,
+ 2108, 2111, 2135, 2136, 2304, 2326, 2335, 2336, 2367, 2432,
+ 2494, 2560, 2561, 2565, 2572, 2576, 2581, 2585, 2616, 2623,
+ 2624, 2640, 2656, 2685, 2687, 2816, 2873, 2880, 2904, 2912,
+ 2936, 3072, 3680, 4096, 4097, 4098, 4099, 4152, 4167, 4178,
+ 4198, 4224, 4226, 4227, 4272, 4275, 4279, 4281, 4283, 4285,
+ 4286, 4304, 4336, 4352, 4355, 4391, 4396, 4397, 4406, 4416,
+ 4480, 4482, 4483, 4531, 4534, 4543, 4545, 4549, 4560, 5760,
+ 5803, 5804, 5805, 5806, 5808, 5814, 5815, 5824, 8192, 9216,
+ 9328, 12288, 26624, 28416, 28496, 28497, 28559, 28563, 45056, 53248,
+ 53504, 53545, 53605, 53607, 53610, 53613, 53619, 53627, 53635, 53637,
+ 53644, 53674, 53678, 53760, 53826, 53829, 54016, 54112, 54272, 54298,
+ 54324, 54350, 54358, 54376, 54402, 54428, 54430, 54434, 54437, 54441,
+ 54446, 54454, 54459, 54461, 54469, 54480, 54506, 54532, 54535, 54541,
+ 54550, 54558, 54584, 54587, 54592, 54598, 54602, 54610, 54636, 54662,
+ 54688, 54714, 54740, 54766, 54792, 54818, 54844, 54870, 54896, 54922,
+ 54952, 54977, 54978, 55003, 55004, 55010, 55035, 55036, 55061, 55062,
+ 55068, 55093, 55094, 55119, 55120, 55126, 55151, 55152, 55177, 55178,
+ 55184, 55209, 55210, 55235, 55236, 55242, 55246, 60928, 60933, 60961,
+ 60964, 60967, 60969, 60980, 60985, 60987, 60994, 60999, 61001, 61003,
+ 61005, 61009, 61012, 61015, 61017, 61019, 61021, 61023, 61025, 61028,
+ 61031, 61036, 61044, 61049, 61054, 61056, 61067, 61089, 61093, 61099,
+ 61168, 61440, 61488, 61600, 61617, 61633, 61649, 61696, 61712, 61744,
+ 61808, 61926, 61968, 62016, 62032, 62208, 62256, 62263, 62336, 62368,
+ 62406, 62432, 62464, 62528, 62530, 62713, 62720, 62784, 62800, 62971,
+ 63045, 63104, 63232, 0, 42710, 42752, 46900, 46912, 47133, 63488,
+ 1, 32, 256, 0, 65533,
+ };
+static u16 aFts5UnicodeData[] = {
+ 1025, 61, 117, 55, 117, 54, 50, 53, 57, 53,
+ 49, 85, 333, 85, 121, 85, 841, 54, 53, 50,
+ 56, 48, 56, 837, 54, 57, 50, 57, 1057, 61,
+ 53, 151, 58, 53, 56, 58, 39, 52, 57, 34,
+ 58, 56, 58, 57, 79, 56, 37, 85, 56, 47,
+ 39, 51, 111, 53, 745, 57, 233, 773, 57, 261,
+ 1822, 37, 542, 37, 1534, 222, 69, 73, 37, 126,
+ 126, 73, 69, 137, 37, 73, 37, 105, 101, 73,
+ 37, 73, 37, 190, 158, 37, 126, 126, 73, 37,
+ 126, 94, 37, 39, 94, 69, 135, 41, 40, 37,
+ 41, 40, 37, 41, 40, 37, 542, 37, 606, 37,
+ 41, 40, 37, 126, 73, 37, 1886, 197, 73, 37,
+ 73, 69, 126, 105, 37, 286, 2181, 39, 869, 582,
+ 152, 390, 472, 166, 248, 38, 56, 38, 568, 3596,
+ 158, 38, 56, 94, 38, 101, 53, 88, 41, 53,
+ 105, 41, 73, 37, 553, 297, 1125, 94, 37, 105,
+ 101, 798, 133, 94, 57, 126, 94, 37, 1641, 1541,
+ 1118, 58, 172, 75, 1790, 478, 37, 2846, 1225, 38,
+ 213, 1253, 53, 49, 55, 1452, 49, 44, 53, 76,
+ 53, 76, 53, 44, 871, 103, 85, 162, 121, 85,
+ 55, 85, 90, 364, 53, 85, 1031, 38, 327, 684,
+ 333, 149, 71, 44, 3175, 53, 39, 236, 34, 58,
+ 204, 70, 76, 58, 140, 71, 333, 103, 90, 39,
+ 469, 34, 39, 44, 967, 876, 2855, 364, 39, 333,
+ 1063, 300, 70, 58, 117, 38, 711, 140, 38, 300,
+ 38, 108, 38, 172, 501, 807, 108, 53, 39, 359,
+ 876, 108, 42, 1735, 44, 42, 44, 39, 106, 268,
+ 138, 44, 74, 39, 236, 327, 76, 85, 333, 53,
+ 38, 199, 231, 44, 74, 263, 71, 711, 231, 39,
+ 135, 44, 39, 106, 140, 74, 74, 44, 39, 42,
+ 71, 103, 76, 333, 71, 87, 207, 58, 55, 76,
+ 42, 199, 71, 711, 231, 71, 71, 71, 44, 106,
+ 76, 76, 108, 44, 135, 39, 333, 76, 103, 44,
+ 76, 42, 295, 103, 711, 231, 71, 167, 44, 39,
+ 106, 172, 76, 42, 74, 44, 39, 71, 76, 333,
+ 53, 55, 44, 74, 263, 71, 711, 231, 71, 167,
+ 44, 39, 42, 44, 42, 140, 74, 74, 44, 44,
+ 42, 71, 103, 76, 333, 58, 39, 207, 44, 39,
+ 199, 103, 135, 71, 39, 71, 71, 103, 391, 74,
+ 44, 74, 106, 106, 44, 39, 42, 333, 111, 218,
+ 55, 58, 106, 263, 103, 743, 327, 167, 39, 108,
+ 138, 108, 140, 76, 71, 71, 76, 333, 239, 58,
+ 74, 263, 103, 743, 327, 167, 44, 39, 42, 44,
+ 170, 44, 74, 74, 76, 74, 39, 71, 76, 333,
+ 71, 74, 263, 103, 1319, 39, 106, 140, 106, 106,
+ 44, 39, 42, 71, 76, 333, 207, 58, 199, 74,
+ 583, 775, 295, 39, 231, 44, 106, 108, 44, 266,
+ 74, 53, 1543, 44, 71, 236, 55, 199, 38, 268,
+ 53, 333, 85, 71, 39, 71, 39, 39, 135, 231,
+ 103, 39, 39, 71, 135, 44, 71, 204, 76, 39,
+ 167, 38, 204, 333, 135, 39, 122, 501, 58, 53,
+ 122, 76, 218, 333, 335, 58, 44, 58, 44, 58,
+ 44, 54, 50, 54, 50, 74, 263, 1159, 460, 42,
+ 172, 53, 76, 167, 364, 1164, 282, 44, 218, 90,
+ 181, 154, 85, 1383, 74, 140, 42, 204, 42, 76,
+ 74, 76, 39, 333, 213, 199, 74, 76, 135, 108,
+ 39, 106, 71, 234, 103, 140, 423, 44, 74, 76,
+ 202, 44, 39, 42, 333, 106, 44, 90, 1225, 41,
+ 41, 1383, 53, 38, 10631, 135, 231, 39, 135, 1319,
+ 135, 1063, 135, 231, 39, 135, 487, 1831, 135, 2151,
+ 108, 309, 655, 519, 346, 2727, 49, 19847, 85, 551,
+ 61, 839, 54, 50, 2407, 117, 110, 423, 135, 108,
+ 583, 108, 85, 583, 76, 423, 103, 76, 1671, 76,
+ 42, 236, 266, 44, 74, 364, 117, 38, 117, 55,
+ 39, 44, 333, 335, 213, 49, 149, 108, 61, 333,
+ 1127, 38, 1671, 1319, 44, 39, 2247, 935, 108, 138,
+ 76, 106, 74, 44, 202, 108, 58, 85, 333, 967,
+ 167, 1415, 554, 231, 74, 333, 47, 1114, 743, 76,
+ 106, 85, 1703, 42, 44, 42, 236, 44, 42, 44,
+ 74, 268, 202, 332, 44, 333, 333, 245, 38, 213,
+ 140, 42, 1511, 44, 42, 172, 42, 44, 170, 44,
+ 74, 231, 333, 245, 346, 300, 314, 76, 42, 967,
+ 42, 140, 74, 76, 42, 44, 74, 71, 333, 1415,
+ 44, 42, 76, 106, 44, 42, 108, 74, 149, 1159,
+ 266, 268, 74, 76, 181, 333, 103, 333, 967, 198,
+ 85, 277, 108, 53, 428, 42, 236, 135, 44, 135,
+ 74, 44, 71, 1413, 2022, 421, 38, 1093, 1190, 1260,
+ 140, 4830, 261, 3166, 261, 265, 197, 201, 261, 265,
+ 261, 265, 197, 201, 261, 41, 41, 41, 94, 229,
+ 265, 453, 261, 264, 261, 264, 261, 264, 165, 69,
+ 137, 40, 56, 37, 120, 101, 69, 137, 40, 120,
+ 133, 69, 137, 120, 261, 169, 120, 101, 69, 137,
+ 40, 88, 381, 162, 209, 85, 52, 51, 54, 84,
+ 51, 54, 52, 277, 59, 60, 162, 61, 309, 52,
+ 51, 149, 80, 117, 57, 54, 50, 373, 57, 53,
+ 48, 341, 61, 162, 194, 47, 38, 207, 121, 54,
+ 50, 38, 335, 121, 54, 50, 422, 855, 428, 139,
+ 44, 107, 396, 90, 41, 154, 41, 90, 37, 105,
+ 69, 105, 37, 58, 41, 90, 57, 169, 218, 41,
+ 58, 41, 58, 41, 58, 137, 58, 37, 137, 37,
+ 135, 37, 90, 69, 73, 185, 94, 101, 58, 57,
+ 90, 37, 58, 527, 1134, 94, 142, 47, 185, 186,
+ 89, 154, 57, 90, 57, 90, 57, 250, 57, 1018,
+ 89, 90, 57, 58, 57, 1018, 8601, 282, 153, 666,
+ 89, 250, 54, 50, 2618, 57, 986, 825, 1306, 217,
+ 602, 1274, 378, 1935, 2522, 719, 5882, 57, 314, 57,
+ 1754, 281, 3578, 57, 4634, 3322, 54, 50, 54, 50,
+ 54, 50, 54, 50, 54, 50, 54, 50, 54, 50,
+ 975, 1434, 185, 54, 50, 1017, 54, 50, 54, 50,
+ 54, 50, 54, 50, 54, 50, 537, 8218, 4217, 54,
+ 50, 54, 50, 54, 50, 54, 50, 54, 50, 54,
+ 50, 54, 50, 54, 50, 54, 50, 54, 50, 54,
+ 50, 2041, 54, 50, 54, 50, 1049, 54, 50, 8281,
+ 1562, 697, 90, 217, 346, 1513, 1509, 126, 73, 69,
+ 254, 105, 37, 94, 37, 94, 165, 70, 105, 37,
+ 3166, 37, 218, 158, 108, 94, 149, 47, 85, 1221,
+ 37, 37, 1799, 38, 53, 44, 743, 231, 231, 231,
+ 231, 231, 231, 231, 231, 1036, 85, 52, 51, 52,
+ 51, 117, 52, 51, 53, 52, 51, 309, 49, 85,
+ 49, 53, 52, 51, 85, 52, 51, 54, 50, 54,
+ 50, 54, 50, 54, 50, 181, 38, 341, 81, 858,
+ 2874, 6874, 410, 61, 117, 58, 38, 39, 46, 54,
+ 50, 54, 50, 54, 50, 54, 50, 54, 50, 90,
+ 54, 50, 54, 50, 54, 50, 54, 50, 49, 54,
+ 82, 58, 302, 140, 74, 49, 166, 90, 110, 38,
+ 39, 53, 90, 2759, 76, 88, 70, 39, 49, 2887,
+ 53, 102, 39, 1319, 3015, 90, 143, 346, 871, 1178,
+ 519, 1018, 335, 986, 271, 58, 495, 1050, 335, 1274,
+ 495, 2042, 8218, 39, 39, 2074, 39, 39, 679, 38,
+ 36583, 1786, 1287, 198, 85, 8583, 38, 117, 519, 333,
+ 71, 1502, 39, 44, 107, 53, 332, 53, 38, 798,
+ 44, 2247, 334, 76, 213, 760, 294, 88, 478, 69,
+ 2014, 38, 261, 190, 350, 38, 88, 158, 158, 382,
+ 70, 37, 231, 44, 103, 44, 135, 44, 743, 74,
+ 76, 42, 154, 207, 90, 55, 58, 1671, 149, 74,
+ 1607, 522, 44, 85, 333, 588, 199, 117, 39, 333,
+ 903, 268, 85, 743, 364, 74, 53, 935, 108, 42,
+ 1511, 44, 74, 140, 74, 44, 138, 437, 38, 333,
+ 85, 1319, 204, 74, 76, 74, 76, 103, 44, 263,
+ 44, 42, 333, 149, 519, 38, 199, 122, 39, 42,
+ 1543, 44, 39, 108, 71, 76, 167, 76, 39, 44,
+ 39, 71, 38, 85, 359, 42, 76, 74, 85, 39,
+ 70, 42, 44, 199, 199, 199, 231, 231, 1127, 74,
+ 44, 74, 44, 74, 53, 42, 44, 333, 39, 39,
+ 743, 1575, 36, 68, 68, 36, 63, 63, 11719, 3399,
+ 229, 165, 39, 44, 327, 57, 423, 167, 39, 71,
+ 71, 3463, 536, 11623, 54, 50, 2055, 1735, 391, 55,
+ 58, 524, 245, 54, 50, 53, 236, 53, 81, 80,
+ 54, 50, 54, 50, 54, 50, 54, 50, 54, 50,
+ 54, 50, 54, 50, 54, 50, 85, 54, 50, 149,
+ 112, 117, 149, 49, 54, 50, 54, 50, 54, 50,
+ 117, 57, 49, 121, 53, 55, 85, 167, 4327, 34,
+ 117, 55, 117, 54, 50, 53, 57, 53, 49, 85,
+ 333, 85, 121, 85, 841, 54, 53, 50, 56, 48,
+ 56, 837, 54, 57, 50, 57, 54, 50, 53, 54,
+ 50, 85, 327, 38, 1447, 70, 999, 199, 199, 199,
+ 103, 87, 57, 56, 58, 87, 58, 153, 90, 98,
+ 90, 391, 839, 615, 71, 487, 455, 3943, 117, 1455,
+ 314, 1710, 143, 570, 47, 410, 1466, 44, 935, 1575,
+ 999, 143, 551, 46, 263, 46, 967, 53, 1159, 263,
+ 53, 174, 1289, 1285, 2503, 333, 199, 39, 1415, 71,
+ 39, 743, 53, 271, 711, 207, 53, 839, 53, 1799,
+ 71, 39, 108, 76, 140, 135, 103, 871, 108, 44,
+ 271, 309, 935, 79, 53, 1735, 245, 711, 271, 615,
+ 271, 2343, 1007, 42, 44, 42, 1703, 492, 245, 655,
+ 333, 76, 42, 1447, 106, 140, 74, 76, 85, 34,
+ 149, 807, 333, 108, 1159, 172, 42, 268, 333, 149,
+ 76, 42, 1543, 106, 300, 74, 135, 149, 333, 1383,
+ 44, 42, 44, 74, 204, 42, 44, 333, 28135, 3182,
+ 149, 34279, 18215, 2215, 39, 1482, 140, 422, 71, 7898,
+ 1274, 1946, 74, 108, 122, 202, 258, 268, 90, 236,
+ 986, 140, 1562, 2138, 108, 58, 2810, 591, 841, 837,
+ 841, 229, 581, 841, 837, 41, 73, 41, 73, 137,
+ 265, 133, 37, 229, 357, 841, 837, 73, 137, 265,
+ 233, 837, 73, 137, 169, 41, 233, 837, 841, 837,
+ 841, 837, 841, 837, 841, 837, 841, 837, 841, 901,
+ 809, 57, 805, 57, 197, 809, 57, 805, 57, 197,
+ 809, 57, 805, 57, 197, 809, 57, 805, 57, 197,
+ 809, 57, 805, 57, 197, 94, 1613, 135, 871, 71,
+ 39, 39, 327, 135, 39, 39, 39, 39, 39, 39,
+ 103, 71, 39, 39, 39, 39, 39, 39, 71, 39,
+ 135, 231, 135, 135, 39, 327, 551, 103, 167, 551,
+ 89, 1434, 3226, 506, 474, 506, 506, 367, 1018, 1946,
+ 1402, 954, 1402, 314, 90, 1082, 218, 2266, 666, 1210,
+ 186, 570, 2042, 58, 5850, 154, 2010, 154, 794, 2266,
+ 378, 2266, 3738, 39, 39, 39, 39, 39, 39, 17351,
+ 34, 3074, 7692, 63, 63,
+ };
+
+static int sqlite3Fts5UnicodeCategory(int iCode) {
+ int iRes = -1;
+ int iHi;
+ int iLo;
+ int ret;
+ u16 iKey;
+
+ if( iCode>=(1<<20) ){
+ return 0;
+ }
+ iLo = aFts5UnicodeBlock[(iCode>>16)];
+ iHi = aFts5UnicodeBlock[1+(iCode>>16)];
+ iKey = (iCode & 0xFFFF);
+ while( iHi>iLo ){
+ int iTest = (iHi + iLo) / 2;
+ assert( iTest>=iLo && iTest<iHi );
+ if( iKey>=aFts5UnicodeMap[iTest] ){
+ iRes = iTest;
+ iLo = iTest+1;
+ }else{
+ iHi = iTest;
+ }
+ }
+
+ if( iRes<0 ) return 0;
+ if( iKey>=(aFts5UnicodeMap[iRes]+(aFts5UnicodeData[iRes]>>5)) ) return 0;
+ ret = aFts5UnicodeData[iRes] & 0x1F;
+ if( ret!=30 ) return ret;
+ return ((iKey - aFts5UnicodeMap[iRes]) & 0x01) ? 5 : 9;
+}
+
+static void sqlite3Fts5UnicodeAscii(u8 *aArray, u8 *aAscii){
+ int i = 0;
+ int iTbl = 0;
+ while( i<128 ){
+ int bToken = aArray[ aFts5UnicodeData[iTbl] & 0x1F ];
+ int n = (aFts5UnicodeData[iTbl] >> 5) + i;
+ for(; i<128 && i<n; i++){
+ aAscii[i] = (u8)bToken;
+ }
+ iTbl++;
+ }
+}
+
+
/*
** 2015 May 30
**
@@ -204705,6 +219884,8 @@ static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){
i64 *pp = &pCsr->iInstPos;
int *po = &pCsr->iInstOff;
+ assert( sqlite3Fts5IterEof(pIter)==0 );
+ assert( pCsr->bEof==0 );
while( eDetail==FTS5_DETAIL_NONE
|| sqlite3Fts5PoslistNext64(pIter->pData, pIter->nData, po, pp)
){
@@ -204714,7 +219895,7 @@ static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){
rc = sqlite3Fts5IterNextScan(pCsr->pIter);
if( rc==SQLITE_OK ){
rc = fts5VocabInstanceNewTerm(pCsr);
- if( eDetail==FTS5_DETAIL_NONE ) break;
+ if( pCsr->bEof || eDetail==FTS5_DETAIL_NONE ) break;
}
if( rc ){
pCsr->bEof = 1;
@@ -205029,6 +220210,7 @@ static int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){
/* xSavepoint */ 0,
/* xRelease */ 0,
/* xRollbackTo */ 0,
+ /* xShadowName */ 0
};
void *p = (void*)pGlobal;
@@ -205036,8 +220218,6 @@ static int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){
}
-
-
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) */
@@ -205311,6 +220491,7 @@ static sqlite3_module stmtModule = {
0, /* xSavepoint */
0, /* xRelease */
0, /* xRollbackTo */
+ 0, /* xShadowName */
};
#endif /* SQLITE_OMIT_VIRTUALTABLE */
@@ -205343,9 +220524,9 @@ SQLITE_API int sqlite3_stmt_init(
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
/************** End of stmt.c ************************************************/
-#if __LINE__!=205346
+#if __LINE__!=220527
#undef SQLITE_SOURCE_ID
-#define SQLITE_SOURCE_ID "2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de4alt2"
+#define SQLITE_SOURCE_ID "2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238alt2"
#endif
/* Return the source-id for this library */
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
diff --git a/db/sqlite3/src/sqlite3.h b/db/sqlite3/src/sqlite3.h
index 5f28e036b..f36ae57a6 100644
--- a/db/sqlite3/src/sqlite3.h
+++ b/db/sqlite3/src/sqlite3.h
@@ -123,9 +123,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
-#define SQLITE_VERSION "3.21.0"
-#define SQLITE_VERSION_NUMBER 3021000
-#define SQLITE_SOURCE_ID "2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827"
+#define SQLITE_VERSION "3.26.0"
+#define SQLITE_VERSION_NUMBER 3026000
+#define SQLITE_SOURCE_ID "2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9"
/*
** CAPI3REF: Run-Time Library Version Numbers
@@ -470,6 +470,9 @@ SQLITE_API int sqlite3_exec(
** the most recent error can be obtained using
** [sqlite3_extended_errcode()].
*/
+#define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8))
+#define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8))
+#define SQLITE_ERROR_SNAPSHOT (SQLITE_ERROR | (3<<8))
#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
@@ -502,17 +505,22 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8))
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
+#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8))
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8))
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
+#define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
+#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8))
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8))
+#define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8))
+#define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8))
#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8))
#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8))
#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8))
@@ -880,7 +888,8 @@ struct sqlite3_io_methods {
** <li>[[SQLITE_FCNTL_PERSIST_WAL]]
** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the
** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary
-** write ahead log and shared memory files used for transaction control
+** write ahead log ([WAL file]) and shared memory
+** files used for transaction control
** are automatically deleted when the latest connection to the database
** closes. Setting persistent WAL mode causes those files to persist after
** close. Persisting the files is useful when other processes that do not
@@ -1060,6 +1069,32 @@ struct sqlite3_io_methods {
** so that all subsequent write operations are independent.
** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without
** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE].
+**
+** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]]
+** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode causes attempts to obtain
+** a file lock using the xLock or xShmLock methods of the VFS to wait
+** for up to M milliseconds before failing, where M is the single
+** unsigned integer parameter.
+**
+** <li>[[SQLITE_FCNTL_DATA_VERSION]]
+** The [SQLITE_FCNTL_DATA_VERSION] opcode is used to detect changes to
+** a database file. The argument is a pointer to a 32-bit unsigned integer.
+** The "data version" for the pager is written into the pointer. The
+** "data version" changes whenever any change occurs to the corresponding
+** database file, either through SQL statements on the same database
+** connection or through transactions committed by separate database
+** connections possibly in other processes. The [sqlite3_total_changes()]
+** interface can be used to find if any database on the connection has changed,
+** but that interface responds to changes on TEMP as well as MAIN and does
+** not provide a mechanism to detect changes to MAIN only. Also, the
+** [sqlite3_total_changes()] interface responds to internal changes only and
+** omits changes made by other database connections. The
+** [PRAGMA data_version] command provide a mechanism to detect changes to
+** a single attached database that occur due to other database connections,
+** but omits changes implemented by the database connection on which it is
+** called. This file control is the only mechanism to detect changes that
+** happen either internally or externally and that are associated with
+** a particular attached database.
** </ul>
*/
#define SQLITE_FCNTL_LOCKSTATE 1
@@ -1094,6 +1129,8 @@ struct sqlite3_io_methods {
#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31
#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32
#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33
+#define SQLITE_FCNTL_LOCK_TIMEOUT 34
+#define SQLITE_FCNTL_DATA_VERSION 35
/* deprecated names */
#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE
@@ -1131,12 +1168,18 @@ typedef struct sqlite3_api_routines sqlite3_api_routines;
** in the name of the object stands for "virtual file system". See
** the [VFS | VFS documentation] for further information.
**
-** The value of the iVersion field is initially 1 but may be larger in
-** future versions of SQLite. Additional fields may be appended to this
-** object when the iVersion value is increased. Note that the structure
-** of the sqlite3_vfs object changes in the transaction between
-** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not
-** modified.
+** The VFS interface is sometimes extended by adding new methods onto
+** the end. Each time such an extension occurs, the iVersion field
+** is incremented. The iVersion value started out as 1 in
+** SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2
+** with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased
+** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields
+** may be appended to the sqlite3_vfs object and the iVersion value
+** may increase again in future versions of SQLite.
+** Note that the structure
+** of the sqlite3_vfs object changes in the transition from
+** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0]
+** and yet the iVersion field was not modified.
**
** The szOsFile field is the size of the subclassed [sqlite3_file]
** structure used by this VFS. mxPathname is the maximum length of
@@ -1913,6 +1956,22 @@ struct sqlite3_mem_methods {
** I/O required to support statement rollback.
** The default value for this setting is controlled by the
** [SQLITE_STMTJRNL_SPILL] compile-time option.
+**
+** [[SQLITE_CONFIG_SORTERREF_SIZE]]
+** <dt>SQLITE_CONFIG_SORTERREF_SIZE
+** <dd>The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter
+** of type (int) - the new value of the sorter-reference size threshold.
+** Usually, when SQLite uses an external sort to order records according
+** to an ORDER BY clause, all fields required by the caller are present in the
+** sorted records. However, if SQLite determines based on the declared type
+** of a table column that its values are likely to be very large - larger
+** than the configured sorter-reference size threshold - then a reference
+** is stored in each sorted record and the required column values loaded
+** from the database as records are returned in sorted order. The default
+** value for this option is to never use this optimization. Specifying a
+** 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.
** </dl>
*/
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
@@ -1942,6 +2001,7 @@ struct sqlite3_mem_methods {
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
+#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */
/*
** CAPI3REF: Database Connection Configuration Options
@@ -1957,6 +2017,7 @@ struct sqlite3_mem_methods {
** is invoked.
**
** <dl>
+** [[SQLITE_DBCONFIG_LOOKASIDE]]
** <dt>SQLITE_DBCONFIG_LOOKASIDE</dt>
** <dd> ^This option takes three additional arguments that determine the
** [lookaside memory allocator] configuration for the [database connection].
@@ -1979,6 +2040,7 @@ struct sqlite3_mem_methods {
** memory is in use leaves the configuration unchanged and returns
** [SQLITE_BUSY].)^</dd>
**
+** [[SQLITE_DBCONFIG_ENABLE_FKEY]]
** <dt>SQLITE_DBCONFIG_ENABLE_FKEY</dt>
** <dd> ^This option is used to enable or disable the enforcement of
** [foreign key constraints]. There should be two additional arguments.
@@ -1989,6 +2051,7 @@ struct sqlite3_mem_methods {
** following this call. The second parameter may be a NULL pointer, in
** which case the FK enforcement setting is not reported back. </dd>
**
+** [[SQLITE_DBCONFIG_ENABLE_TRIGGER]]
** <dt>SQLITE_DBCONFIG_ENABLE_TRIGGER</dt>
** <dd> ^This option is used to enable or disable [CREATE TRIGGER | triggers].
** There should be two additional arguments.
@@ -1999,6 +2062,7 @@ struct sqlite3_mem_methods {
** following this call. The second parameter may be a NULL pointer, in
** which case the trigger setting is not reported back. </dd>
**
+** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]]
** <dt>SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</dt>
** <dd> ^This option is used to enable or disable the two-argument
** version of the [fts3_tokenizer()] function which is part of the
@@ -2012,6 +2076,7 @@ struct sqlite3_mem_methods {
** following this call. The second parameter may be a NULL pointer, in
** which case the new setting is not reported back. </dd>
**
+** [[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION]]
** <dt>SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION</dt>
** <dd> ^This option is used to enable or disable the [sqlite3_load_extension()]
** interface independently of the [load_extension()] SQL function.
@@ -2029,7 +2094,7 @@ struct sqlite3_mem_methods {
** be a NULL pointer, in which case the new setting is not reported back.
** </dd>
**
-** <dt>SQLITE_DBCONFIG_MAINDBNAME</dt>
+** [[SQLITE_DBCONFIG_MAINDBNAME]] <dt>SQLITE_DBCONFIG_MAINDBNAME</dt>
** <dd> ^This option is used to change the name of the "main" database
** schema. ^The sole argument is a pointer to a constant UTF8 string
** which will become the new schema name in place of "main". ^SQLite
@@ -2038,19 +2103,21 @@ struct sqlite3_mem_methods {
** until after the database connection closes.
** </dd>
**
+** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]]
** <dt>SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE</dt>
** <dd> Usually, when a database in wal mode is closed or detached from a
** database handle, SQLite checks if this will mean that there are now no
** connections at all to the database. If so, it performs a checkpoint
** operation before closing the connection. This option may be used to
** override this behaviour. The first parameter passed to this operation
-** is an integer - non-zero to disable checkpoints-on-close, or zero (the
-** default) to enable them. The second parameter is a pointer to an integer
+** is an integer - positive to disable checkpoints-on-close, or zero (the
+** default) to enable them, and 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 checkpoints-on-close
** have been disabled - 0 if they are not disabled, 1 if they are.
** </dd>
**
-** <dt>SQLITE_DBCONFIG_ENABLE_QPSG</dt>
+** [[SQLITE_DBCONFIG_ENABLE_QPSG]] <dt>SQLITE_DBCONFIG_ENABLE_QPSG</dt>
** <dd>^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates
** the [query planner stability guarantee] (QPSG). When the QPSG is active,
** a single SQL query statement will always use the same algorithm regardless
@@ -2059,8 +2126,57 @@ struct sqlite3_mem_methods {
** slower. But the QPSG has the advantage of more predictable behavior. With
** the QPSG active, SQLite will always use the same query plan in the field as
** was used during testing in the lab.
+** The first argument to this setting is an integer which is 0 to disable
+** the QPSG, positive to enable QPSG, 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 QPSG is disabled or enabled
+** following this call.
** </dd>
**
+** [[SQLITE_DBCONFIG_TRIGGER_EQP]] <dt>SQLITE_DBCONFIG_TRIGGER_EQP</dt>
+** <dd> By default, the output of EXPLAIN QUERY PLAN commands does not
+** include output for any operations performed by trigger programs. This
+** option is used to set or clear (the default) a flag that governs this
+** behavior. The first parameter passed to this operation is an integer -
+** positive to enable output for trigger programs, or zero to disable it,
+** 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 output-for-triggers has been disabled - 0 if
+** it is not disabled, 1 if it is.
+** </dd>
+**
+** [[SQLITE_DBCONFIG_RESET_DATABASE]] <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt>
+** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run
+** [VACUUM] in order to reset a database back to an empty database
+** with no schema and no content. The following process works even for
+** a badly corrupted database file:
+** <ol>
+** <li> If the database connection is newly opened, make sure it has read the
+** database schema by preparing then discarding some query against the
+** database, or calling sqlite3_table_column_metadata(), ignoring any
+** errors. This step is only necessary if the application desires to keep
+** the database in WAL mode after the reset if it was in WAL mode before
+** the reset.
+** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
+** <li> [sqlite3_exec](db, "[VACUUM]", 0, 0, 0);
+** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
+** </ol>
+** Because resetting a database is destructive and irreversible, the
+** process requires the use of this obscure API and multiple steps to help
+** ensure that it does not happen by accident.
+**
+** [[SQLITE_DBCONFIG_DEFENSIVE]] <dt>SQLITE_DBCONFIG_DEFENSIVE</dt>
+** <dd>The SQLITE_DBCONFIG_DEFENSIVE option activates or deactivates the
+** "defensive" flag for a database connection. When the defensive
+** flag is enabled, language features that allow ordinary SQL to
+** deliberately corrupt the database file are disabled. The disabled
+** features include but are not limited to the following:
+** <ul>
+** <li> The [PRAGMA writable_schema=ON] statement.
+** <li> Writes to the [sqlite_dbpage] virtual table.
+** <li> Direct writes to [shadow tables].
+** </ul>
+** </dd>
** </dl>
*/
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
@@ -2071,7 +2187,10 @@ struct sqlite3_mem_methods {
#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */
-
+#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 */
/*
** CAPI3REF: Enable Or Disable Extended Result Codes
@@ -2199,12 +2318,17 @@ SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64);
** program, the value returned reflects the number of rows modified by the
** previous INSERT, UPDATE or DELETE statement within the same trigger.
**
-** See also the [sqlite3_total_changes()] interface, the
-** [count_changes pragma], and the [changes() SQL function].
-**
** If a separate thread makes changes on the same database connection
** while [sqlite3_changes()] is running then the value returned
** is unpredictable and not meaningful.
+**
+** See also:
+** <ul>
+** <li> the [sqlite3_total_changes()] interface
+** <li> the [count_changes pragma]
+** <li> the [changes() SQL function]
+** <li> the [data_version pragma]
+** </ul>
*/
SQLITE_API int sqlite3_changes(sqlite3*);
@@ -2222,13 +2346,26 @@ SQLITE_API int sqlite3_changes(sqlite3*);
** count, but those made as part of REPLACE constraint resolution are
** not. ^Changes to a view that are intercepted by INSTEAD OF triggers
** are not counted.
-**
-** See also the [sqlite3_changes()] interface, the
-** [count_changes pragma], and the [total_changes() SQL function].
**
+** This 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
+** connections use the [PRAGMA data_version] command or the
+** [SQLITE_FCNTL_DATA_VERSION] [file control].
+**
** If a separate thread makes changes on the same database connection
** while [sqlite3_total_changes()] is running then the value
** returned is unpredictable and not meaningful.
+**
+** See also:
+** <ul>
+** <li> the [sqlite3_changes()] interface
+** <li> the [count_changes pragma]
+** <li> the [changes() SQL function]
+** <li> the [data_version pragma]
+** <li> the [SQLITE_FCNTL_DATA_VERSION] [file control]
+** </ul>
*/
SQLITE_API int sqlite3_total_changes(sqlite3*);
@@ -2477,16 +2614,16 @@ SQLITE_API void sqlite3_free_table(char **result);
**
** These routines are work-alikes of the "printf()" family of functions
** from the standard C library.
-** These routines understand most of the common K&R formatting options,
-** plus some additional non-standard formats, detailed below.
-** Note that some of the more obscure formatting options from recent
-** C-library standards are omitted from this implementation.
+** These routines understand most of the common formatting options from
+** the standard library printf()
+** plus some additional non-standard formats ([%q], [%Q], [%w], and [%z]).
+** See the [built-in printf()] documentation for details.
**
** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their
-** results into memory obtained from [sqlite3_malloc()].
+** results into memory obtained from [sqlite3_malloc64()].
** The strings returned by these two routines should be
** released by [sqlite3_free()]. ^Both routines return a
-** NULL pointer if [sqlite3_malloc()] is unable to allocate enough
+** NULL pointer if [sqlite3_malloc64()] is unable to allocate enough
** memory to hold the resulting string.
**
** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from
@@ -2510,71 +2647,7 @@ SQLITE_API void sqlite3_free_table(char **result);
**
** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf().
**
-** These routines all implement some additional formatting
-** options that are useful for constructing SQL statements.
-** All of the usual printf() formatting options apply. In addition, there
-** is are "%q", "%Q", "%w" and "%z" options.
-**
-** ^(The %q option works like %s in that it substitutes a nul-terminated
-** string from the argument list. But %q also doubles every '\'' character.
-** %q is designed for use inside a string literal.)^ By doubling each '\''
-** character it escapes that character and allows it to be inserted into
-** the string.
-**
-** For example, assume the string variable zText contains text as follows:
-**
-** <blockquote><pre>
-** char *zText = "It's a happy day!";
-** </pre></blockquote>
-**
-** One can use this text in an SQL statement as follows:
-**
-** <blockquote><pre>
-** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
-** sqlite3_exec(db, zSQL, 0, 0, 0);
-** sqlite3_free(zSQL);
-** </pre></blockquote>
-**
-** Because the %q format string is used, the '\'' character in zText
-** is escaped and the SQL generated is as follows:
-**
-** <blockquote><pre>
-** INSERT INTO table1 VALUES('It''s a happy day!')
-** </pre></blockquote>
-**
-** This is correct. Had we used %s instead of %q, the generated SQL
-** would have looked like this:
-**
-** <blockquote><pre>
-** INSERT INTO table1 VALUES('It's a happy day!');
-** </pre></blockquote>
-**
-** This second example is an SQL syntax error. As a general rule you should
-** always use %q instead of %s when inserting text into a string literal.
-**
-** ^(The %Q option works like %q except it also adds single quotes around
-** the outside of the total string. Additionally, if the parameter in the
-** argument list is a NULL pointer, %Q substitutes the text "NULL" (without
-** single quotes).)^ So, for example, one could say:
-**
-** <blockquote><pre>
-** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
-** sqlite3_exec(db, zSQL, 0, 0, 0);
-** sqlite3_free(zSQL);
-** </pre></blockquote>
-**
-** The code above will render a correct SQL statement in the zSQL
-** variable even if the zText variable is a NULL pointer.
-**
-** ^(The "%w" formatting option is like "%q" except that it expects to
-** be contained within double-quotes instead of single quotes, and it
-** escapes the double-quote character instead of the single-quote
-** character.)^ The "%w" formatting option is intended for safely inserting
-** table and column names into a constructed SQL statement.
-**
-** ^(The "%z" formatting option works like "%s" but with the
-** addition that after the string has been read and copied into
-** the result, [sqlite3_free()] is called on the input string.)^
+** See also: [built-in printf()], [printf() SQL function]
*/
SQLITE_API char *sqlite3_mprintf(const char*,...);
SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
@@ -2932,8 +3005,8 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*,
** KEYWORDS: SQLITE_TRACE
**
** These constants identify classes of events that can be monitored
-** using the [sqlite3_trace_v2()] tracing logic. The third argument
-** to [sqlite3_trace_v2()] is an OR-ed combination of one or more of
+** using the [sqlite3_trace_v2()] tracing logic. The M argument
+** to [sqlite3_trace_v2(D,M,X,P)] is an OR-ed combination of one or more of
** the following constants. ^The first argument to the trace callback
** is one of the following constants.
**
@@ -3348,13 +3421,24 @@ SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int
** [database connection] D failed, then the sqlite3_errcode(D) interface
** returns the numeric [result code] or [extended result code] for that
** API call.
-** If the most recent API call was successful,
-** then the return value from sqlite3_errcode() is undefined.
** ^The sqlite3_extended_errcode()
** interface is the same except that it always returns the
** [extended result code] even when extended result codes are
** disabled.
**
+** The values returned by sqlite3_errcode() and/or
+** sqlite3_extended_errcode() might change with each API call.
+** Except, there are some interfaces that are guaranteed to never
+** change the value of the error code. The error-code preserving
+** interfaces are:
+**
+** <ul>
+** <li> sqlite3_errcode()
+** <li> sqlite3_extended_errcode()
+** <li> sqlite3_errmsg()
+** <li> sqlite3_errmsg16()
+** </ul>
+**
** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
** text that describes the error, as either UTF-8 or UTF-16 respectively.
** ^(Memory to hold the error message string is managed internally.
@@ -3544,9 +3628,19 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
** on this hint by avoiding the use of [lookaside memory] so as not to
** deplete the limited store of lookaside memory. Future versions of
** SQLite may act on this hint differently.
+**
+** [[SQLITE_PREPARE_NORMALIZE]] ^(<dt>SQLITE_PREPARE_NORMALIZE</dt>
+** <dd>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.
** </dl>
*/
#define SQLITE_PREPARE_PERSISTENT 0x01
+#define SQLITE_PREPARE_NORMALIZE 0x02
/*
** CAPI3REF: Compiling An SQL Statement
@@ -3640,13 +3734,13 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
** or [GLOB] operator or if the parameter is compared to an indexed column
** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled.
** </li>
+** </ol>
**
** <p>^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having
** the extra prepFlags parameter, which is a bit array consisting of zero or
** more of the [SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_*] flags. ^The
** sqlite3_prepare_v2() interface works exactly the same as
** sqlite3_prepare_v3() with a zero prepFlags parameter.
-** </ol>
*/
SQLITE_API int sqlite3_prepare(
sqlite3 *db, /* Database handle */
@@ -3704,6 +3798,11 @@ SQLITE_API int sqlite3_prepare16_v3(
** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8
** string containing the SQL text of prepared statement P with
** [bound parameters] expanded.
+** ^The sqlite3_normalized_sql(P) interface returns a pointer to a UTF-8
+** string containing the normalized SQL text of prepared statement P. 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.
**
** ^(For example, if a prepared statement is created using the SQL
** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345
@@ -3719,14 +3818,16 @@ SQLITE_API int sqlite3_prepare16_v3(
** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time
** option causes sqlite3_expanded_sql() to always return NULL.
**
-** ^The string returned by sqlite3_sql(P) is managed by SQLite and is
-** automatically freed when the prepared statement is finalized.
+** ^The strings returned by sqlite3_sql(P) and sqlite3_normalized_sql(P)
+** are managed by SQLite and are automatically freed when the prepared
+** statement is finalized.
** ^The string returned by sqlite3_expanded_sql(P), on the other hand,
** is obtained from [sqlite3_malloc()] and must be free by the application
** by passing it to [sqlite3_free()].
*/
SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt);
SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt);
+SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt);
/*
** CAPI3REF: Determine If An SQL Statement Writes The Database
@@ -4508,11 +4609,25 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** from [sqlite3_column_blob()], [sqlite3_column_text()], etc. into
** [sqlite3_free()].
**
-** ^(If a memory allocation error occurs during the evaluation of any
-** of these routines, a default value is returned. The default value
-** is either the integer 0, the floating point number 0.0, or a NULL
-** pointer. Subsequent calls to [sqlite3_errcode()] will return
-** [SQLITE_NOMEM].)^
+** As long as the input parameters are correct, these routines will only
+** fail if an out-of-memory error occurs during a format conversion.
+** Only the following subset of interfaces are subject to out-of-memory
+** errors:
+**
+** <ul>
+** <li> sqlite3_column_blob()
+** <li> sqlite3_column_text()
+** <li> sqlite3_column_text16()
+** <li> sqlite3_column_bytes()
+** <li> sqlite3_column_bytes16()
+** </ul>
+**
+** If an out-of-memory error occurs, then the return value from these
+** routines is the same as if the column had contained an SQL NULL value.
+** Valid SQL NULL returns can be distinguished from out-of-memory errors
+** by invoking the [sqlite3_errcode()] immediately after the suspect
+** return value is obtained and before any
+** other SQLite interface is called on the same [database connection].
*/
SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
@@ -4589,11 +4704,13 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
**
** ^These functions (collectively known as "function creation routines")
** are used to add SQL functions or aggregates or to redefine the behavior
-** of existing SQL functions or aggregates. The only differences between
-** these routines are the text encoding expected for
-** the second parameter (the name of the function being created)
-** and the presence or absence of a destructor callback for
-** the application data pointer.
+** of existing SQL functions or aggregates. The only differences between
+** the three "sqlite3_create_function*" routines are the text encoding
+** expected for the second parameter (the name of the function being
+** created) and the presence or absence of a destructor callback for
+** the application data pointer. Function sqlite3_create_window_function()
+** is similar, but allows the user to supply the extra callback functions
+** needed by [aggregate window functions].
**
** ^The first parameter is the [database connection] to which the SQL
** function is to be added. ^If an application uses more than one database
@@ -4639,7 +4756,8 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
** ^(The fifth parameter is an arbitrary pointer. The implementation of the
** function can gain access to this pointer using [sqlite3_user_data()].)^
**
-** ^The sixth, seventh and eighth parameters, xFunc, xStep and xFinal, are
+** ^The sixth, seventh and eighth parameters passed to the three
+** "sqlite3_create_function*" functions, xFunc, xStep and xFinal, are
** pointers to C-language functions that implement the SQL function or
** aggregate. ^A scalar SQL function requires an implementation of the xFunc
** callback only; NULL pointers must be passed as the xStep and xFinal
@@ -4648,15 +4766,24 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
** SQL function or aggregate, pass NULL pointers for all three function
** callbacks.
**
-** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL,
-** then it is destructor for the application data pointer.
-** The destructor is invoked when the function is deleted, either by being
-** overloaded or when the database connection closes.)^
-** ^The destructor is also invoked if the call to
-** sqlite3_create_function_v2() fails.
-** ^When the destructor callback of the tenth parameter is invoked, it
-** is passed a single argument which is a copy of the application data
-** pointer which was the fifth parameter to sqlite3_create_function_v2().
+** ^The sixth, seventh, eighth and ninth parameters (xStep, xFinal, xValue
+** and xInverse) passed to sqlite3_create_window_function are pointers to
+** C-language callbacks that implement the new function. xStep and xFinal
+** must both be non-NULL. xValue and xInverse may either both be NULL, in
+** which case a regular aggregate function is created, or must both be
+** non-NULL, in which case the new function may be used as either an aggregate
+** or aggregate window function. More details regarding the implementation
+** of aggregate window functions are
+** [user-defined window functions|available here].
+**
+** ^(If the final parameter to sqlite3_create_function_v2() or
+** sqlite3_create_window_function() is not NULL, then it is destructor for
+** the application data pointer. The destructor is invoked when the function
+** is deleted, either by being overloaded or when the database connection
+** closes.)^ ^The destructor is also invoked if the call to
+** sqlite3_create_function_v2() fails. ^When the destructor callback is
+** invoked, it is passed a single argument which is a copy of the application
+** data pointer which was the fifth parameter to sqlite3_create_function_v2().
**
** ^It is permitted to register multiple implementations of the same
** functions with the same name but with either differing numbers of
@@ -4709,6 +4836,18 @@ SQLITE_API int sqlite3_create_function_v2(
void (*xFinal)(sqlite3_context*),
void(*xDestroy)(void*)
);
+SQLITE_API int sqlite3_create_window_function(
+ sqlite3 *db,
+ const char *zFunctionName,
+ int nArg,
+ int eTextRep,
+ void *pApp,
+ void (*xStep)(sqlite3_context*,int,sqlite3_value**),
+ void (*xFinal)(sqlite3_context*),
+ void (*xValue)(sqlite3_context*),
+ void (*xInverse)(sqlite3_context*,int,sqlite3_value**),
+ void(*xDestroy)(void*)
+);
/*
** CAPI3REF: Text Encodings
@@ -4779,6 +4918,9 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
** datatype of the value
** <tr><td><b>sqlite3_value_numeric_type&nbsp;&nbsp;</b>
** <td>&rarr;&nbsp;&nbsp;<td>Best numeric datatype of the value
+** <tr><td><b>sqlite3_value_nochange&nbsp;&nbsp;</b>
+** <td>&rarr;&nbsp;&nbsp;<td>True if the column is unchanged in an UPDATE
+** against a virtual table.
** </table></blockquote>
**
** <b>Details:</b>
@@ -4827,6 +4969,19 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
** then the conversion is performed. Otherwise no conversion occurs.
** The [SQLITE_INTEGER | datatype] after conversion is returned.)^
**
+** ^Within the [xUpdate] method of a [virtual table], the
+** sqlite3_value_nochange(X) interface returns true if and only if
+** the column corresponding to X is unchanged by the UPDATE operation
+** that the xUpdate method call was invoked to implement and if
+** and the prior [xColumn] method call that was invoked to extracted
+** the value for that column returned without setting a result (probably
+** because it queried [sqlite3_vtab_nochange()] and found that the column
+** was unchanging). ^Within an [xUpdate] method, any value for which
+** sqlite3_value_nochange(X) is true will in all other respects appear
+** to be a NULL value. If sqlite3_value_nochange(X) is invoked anywhere other
+** than within an [xUpdate] method call for an UPDATE statement, then
+** the return value is arbitrary and meaningless.
+**
** 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
@@ -4835,6 +4990,28 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6
**
** These routines must be called from the same thread as
** the SQL function that supplied the [sqlite3_value*] parameters.
+**
+** As long as the input parameter is correct, these routines can only
+** fail if an out-of-memory error occurs during a format conversion.
+** Only the following subset of interfaces are subject to out-of-memory
+** errors:
+**
+** <ul>
+** <li> sqlite3_value_blob()
+** <li> sqlite3_value_text()
+** <li> sqlite3_value_text16()
+** <li> sqlite3_value_text16le()
+** <li> sqlite3_value_text16be()
+** <li> sqlite3_value_bytes()
+** <li> sqlite3_value_bytes16()
+** </ul>
+**
+** If an out-of-memory error occurs, then the return value from these
+** routines is the same as if the column had contained an SQL NULL value.
+** Valid SQL NULL returns can be distinguished from out-of-memory errors
+** by invoking the [sqlite3_errcode()] immediately after the suspect
+** return value is obtained and before any
+** other SQLite interface is called on the same [database connection].
*/
SQLITE_API const void *sqlite3_value_blob(sqlite3_value*);
SQLITE_API double sqlite3_value_double(sqlite3_value*);
@@ -4849,6 +5026,7 @@ SQLITE_API int sqlite3_value_bytes(sqlite3_value*);
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*);
/*
** CAPI3REF: Finding The Subtype Of SQL Values
@@ -5505,6 +5683,41 @@ SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory;
SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory;
/*
+** CAPI3REF: Win32 Specific Interface
+**
+** These interfaces are available only on Windows. The
+** [sqlite3_win32_set_directory] interface is used to set the value associated
+** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to
+** zValue, depending on the value of the type parameter. The zValue parameter
+** should be NULL to cause the previous value to be freed via [sqlite3_free];
+** a non-NULL value will be copied into memory obtained from [sqlite3_malloc]
+** prior to being used. The [sqlite3_win32_set_directory] interface returns
+** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported,
+** or [SQLITE_NOMEM] if memory could not be allocated. The value of the
+** [sqlite3_data_directory] variable is intended to act as a replacement for
+** the current directory on the sub-platforms of Win32 where that concept is
+** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and
+** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the
+** sqlite3_win32_set_directory interface except the string parameter must be
+** UTF-8 or UTF-16, respectively.
+*/
+SQLITE_API int sqlite3_win32_set_directory(
+ unsigned long type, /* Identifier for directory being set or reset */
+ void *zValue /* New value for directory being set or reset */
+);
+SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue);
+SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue);
+
+/*
+** CAPI3REF: Win32 Directory Types
+**
+** These macros are only available on Windows. They define the allowed values
+** for the type argument to the [sqlite3_win32_set_directory] interface.
+*/
+#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1
+#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2
+
+/*
** CAPI3REF: Test For Auto-Commit Mode
** KEYWORDS: {autocommit mode}
** METHOD: sqlite3
@@ -6104,6 +6317,9 @@ struct sqlite3_module {
int (*xSavepoint)(sqlite3_vtab *pVTab, int);
int (*xRelease)(sqlite3_vtab *pVTab, int);
int (*xRollbackTo)(sqlite3_vtab *pVTab, int);
+ /* The methods above are in versions 1 and 2 of the sqlite_module object.
+ ** Those below are for version 3 and greater. */
+ int (*xShadowName)(const char*);
};
/*
@@ -6236,6 +6452,10 @@ struct sqlite3_index_info {
/*
** CAPI3REF: Virtual Table Scan Flags
+**
+** Virtual table implementations are allowed to set the
+** [sqlite3_index_info].idxFlags field to some combination of
+** these bits.
*/
#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */
@@ -6261,6 +6481,7 @@ struct sqlite3_index_info {
#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70
#define SQLITE_INDEX_CONSTRAINT_ISNULL 71
#define SQLITE_INDEX_CONSTRAINT_IS 72
+#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150
/*
** CAPI3REF: Register A Virtual Table Implementation
@@ -6937,6 +7158,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
/*
** CAPI3REF: Low-Level Control Of Database Files
** METHOD: sqlite3
+** KEYWORDS: {file control}
**
** ^The [sqlite3_file_control()] interface makes a direct call to the
** xFileControl method for the [sqlite3_io_methods] object associated
@@ -6951,11 +7173,18 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
** the xFileControl method. ^The return value of the xFileControl
** method becomes the return value of this routine.
**
-** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes
+** A few opcodes for [sqlite3_file_control()] are handled directly
+** by the SQLite core and never invoke the
+** sqlite3_io_methods.xFileControl method.
+** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes
** a pointer to the underlying [sqlite3_file] object to be written into
-** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER
-** case is a short-circuit path which does not actually invoke the
-** underlying sqlite3_io_methods.xFileControl method.
+** the space pointed to by the 4th parameter. The
+** [SQLITE_FCNTL_JOURNAL_POINTER] works similarly except that it returns
+** the [sqlite3_file] object associated with the journal file instead of
+** the main database. The [SQLITE_FCNTL_VFS_POINTER] opcode returns
+** a pointer to the underlying [sqlite3_vfs] object for the file.
+** The [SQLITE_FCNTL_DATA_VERSION] returns the data version counter
+** from the pager.
**
** ^If the second parameter (zDbName) does not match the name of any
** open database file, then SQLITE_ERROR is returned. ^This error
@@ -6965,7 +7194,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
** an incorrect zDbName and an SQLITE_ERROR return from the underlying
** xFileControl method.
**
-** See also: [SQLITE_FCNTL_LOCKSTATE]
+** See also: [file control opcodes]
*/
SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*);
@@ -7011,8 +7240,9 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_ALWAYS 13
#define SQLITE_TESTCTRL_RESERVE 14
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
-#define SQLITE_TESTCTRL_ISKEYWORD 16
+#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
+#define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17
#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */
#define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19
@@ -7022,7 +7252,191 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_ISINIT 23
#define SQLITE_TESTCTRL_SORTER_MMAP 24
#define SQLITE_TESTCTRL_IMPOSTER 25
-#define SQLITE_TESTCTRL_LAST 25
+#define SQLITE_TESTCTRL_PARSER_COVERAGE 26
+#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */
+
+/*
+** CAPI3REF: SQL Keyword Checking
+**
+** These routines provide access to the set of SQL language keywords
+** recognized by SQLite. Applications can uses these routines to determine
+** whether or not a specific identifier needs to be escaped (for example,
+** by enclosing in double-quotes) so as not to confuse the parser.
+**
+** The sqlite3_keyword_count() interface returns the number of distinct
+** keywords understood by SQLite.
+**
+** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and
+** makes *Z point to that keyword expressed as UTF8 and writes the number
+** of bytes in the keyword into *L. The string that *Z points to is not
+** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns
+** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z
+** or L are NULL or invalid pointers then calls to
+** sqlite3_keyword_name(N,Z,L) result in undefined behavior.
+**
+** The sqlite3_keyword_check(Z,L) interface checks to see whether or not
+** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero
+** if it is and zero if not.
+**
+** The parser used by SQLite is forgiving. It is often possible to use
+** a keyword as an identifier as long as such use does not result in a
+** parsing ambiguity. For example, the statement
+** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and
+** creates a new table named "BEGIN" with three columns named
+** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid
+** using keywords as identifiers. Common techniques used to avoid keyword
+** name collisions include:
+** <ul>
+** <li> Put all identifier names inside double-quotes. This is the official
+** SQL way to escape identifier names.
+** <li> Put identifier names inside &#91;...&#93;. This is not standard SQL,
+** but it is what SQL Server does and so lots of programmers use this
+** technique.
+** <li> Begin every identifier with the letter "Z" as no SQL keywords start
+** with "Z".
+** <li> Include a digit somewhere in every identifier name.
+** </ul>
+**
+** Note that the number of keywords understood by SQLite can depend on
+** compile-time options. For example, "VACUUM" is not a keyword if
+** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also,
+** new keywords may be added to future releases of SQLite.
+*/
+SQLITE_API int sqlite3_keyword_count(void);
+SQLITE_API int sqlite3_keyword_name(int,const char**,int*);
+SQLITE_API int sqlite3_keyword_check(const char*,int);
+
+/*
+** CAPI3REF: Dynamic String Object
+** KEYWORDS: {dynamic string}
+**
+** An instance of the sqlite3_str object contains a dynamically-sized
+** string under construction.
+**
+** The lifecycle of an sqlite3_str object is as follows:
+** <ol>
+** <li> ^The sqlite3_str object is created using [sqlite3_str_new()].
+** <li> ^Text is appended to the sqlite3_str object using various
+** methods, such as [sqlite3_str_appendf()].
+** <li> ^The sqlite3_str object is destroyed and the string it created
+** is returned using the [sqlite3_str_finish()] interface.
+** </ol>
+*/
+typedef struct sqlite3_str sqlite3_str;
+
+/*
+** CAPI3REF: Create A New Dynamic String Object
+** CONSTRUCTOR: sqlite3_str
+**
+** ^The [sqlite3_str_new(D)] interface allocates and initializes
+** a new [sqlite3_str] object. To avoid memory leaks, the object returned by
+** [sqlite3_str_new()] must be freed by a subsequent call to
+** [sqlite3_str_finish(X)].
+**
+** ^The [sqlite3_str_new(D)] interface always returns a pointer to a
+** valid [sqlite3_str] object, though in the event of an out-of-memory
+** error the returned object might be a special singleton that will
+** silently reject new text, always return SQLITE_NOMEM from
+** [sqlite3_str_errcode()], always return 0 for
+** [sqlite3_str_length()], and always return NULL from
+** [sqlite3_str_finish(X)]. It is always safe to use the value
+** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter
+** to any of the other [sqlite3_str] methods.
+**
+** The D parameter to [sqlite3_str_new(D)] may be NULL. If the
+** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum
+** length of the string contained in the [sqlite3_str] object will be
+** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead
+** of [SQLITE_MAX_LENGTH].
+*/
+SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*);
+
+/*
+** CAPI3REF: Finalize A Dynamic String
+** DESTRUCTOR: sqlite3_str
+**
+** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X
+** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()]
+** that contains the constructed string. The calling application should
+** pass the returned value to [sqlite3_free()] to avoid a memory leak.
+** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any
+** errors were encountered during construction of the string. ^The
+** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the
+** string in [sqlite3_str] object X is zero bytes long.
+*/
+SQLITE_API char *sqlite3_str_finish(sqlite3_str*);
+
+/*
+** CAPI3REF: Add Content To A Dynamic String
+** METHOD: sqlite3_str
+**
+** These interfaces add content to an sqlite3_str object previously obtained
+** from [sqlite3_str_new()].
+**
+** ^The [sqlite3_str_appendf(X,F,...)] and
+** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf]
+** functionality of SQLite to append formatted text onto the end of
+** [sqlite3_str] object X.
+**
+** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S
+** onto the end of the [sqlite3_str] object X. N must be non-negative.
+** S must contain at least N non-zero bytes of content. To append a
+** zero-terminated string in its entirety, use the [sqlite3_str_appendall()]
+** method instead.
+**
+** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of
+** zero-terminated string S onto the end of [sqlite3_str] object X.
+**
+** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the
+** single-byte character C onto the end of [sqlite3_str] object X.
+** ^This method can be used, for example, to add whitespace indentation.
+**
+** ^The [sqlite3_str_reset(X)] method resets the string under construction
+** inside [sqlite3_str] object X back to zero bytes in length.
+**
+** These methods do not return a result code. ^If an error occurs, that fact
+** is recorded in the [sqlite3_str] object and can be recovered by a
+** subsequent call to [sqlite3_str_errcode(X)].
+*/
+SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...);
+SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list);
+SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N);
+SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn);
+SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C);
+SQLITE_API void sqlite3_str_reset(sqlite3_str*);
+
+/*
+** CAPI3REF: Status Of A Dynamic String
+** METHOD: sqlite3_str
+**
+** These interfaces return the current status of an [sqlite3_str] object.
+**
+** ^If any prior errors have occurred while constructing the dynamic string
+** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return
+** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns
+** [SQLITE_NOMEM] following any out-of-memory error, or
+** [SQLITE_TOOBIG] if the size of the dynamic string exceeds
+** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors.
+**
+** ^The [sqlite3_str_length(X)] method returns the current length, in bytes,
+** of the dynamic string under construction in [sqlite3_str] object X.
+** ^The length returned by [sqlite3_str_length(X)] does not include the
+** zero-termination byte.
+**
+** ^The [sqlite3_str_value(X)] method returns a pointer to the current
+** content of the dynamic string under construction in X. The value
+** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X
+** and might be freed or altered by any subsequent method on the same
+** [sqlite3_str] object. Applications must not used the pointer returned
+** [sqlite3_str_value(X)] after any subsequent method call on the same
+** object. ^Applications may change the content of the string returned
+** by [sqlite3_str_value(X)] as long as they do not write into any bytes
+** outside the range of 0 to [sqlite3_str_length(X)] and do not read or
+** write any byte after any subsequent sqlite3_str method call.
+*/
+SQLITE_API int sqlite3_str_errcode(sqlite3_str*);
+SQLITE_API int sqlite3_str_length(sqlite3_str*);
+SQLITE_API char *sqlite3_str_value(sqlite3_str*);
/*
** CAPI3REF: SQLite Runtime Status
@@ -7257,6 +7671,15 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r
** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0.
** </dd>
**
+** [[SQLITE_DBSTATUS_CACHE_SPILL]] ^(<dt>SQLITE_DBSTATUS_CACHE_SPILL</dt>
+** <dd>This parameter returns the number of dirty cache entries that have
+** been written to disk in the middle of a transaction due to the page
+** cache overflowing. Transactions are more efficient if they are written
+** to disk all at once. When pages spill mid-transaction, that introduces
+** additional overhead. This parameter can be used help identify
+** inefficiencies that can be resolve by increasing the cache size.
+** </dd>
+**
** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(<dt>SQLITE_DBSTATUS_DEFERRED_FKS</dt>
** <dd>This parameter returns zero for the current value if and only if
** all foreign key constraints (deferred or immediate) have been
@@ -7276,7 +7699,8 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r
#define SQLITE_DBSTATUS_CACHE_WRITE 9
#define SQLITE_DBSTATUS_DEFERRED_FKS 10
#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11
-#define SQLITE_DBSTATUS_MAX 11 /* Largest defined DBSTATUS */
+#define SQLITE_DBSTATUS_CACHE_SPILL 12
+#define SQLITE_DBSTATUS_MAX 12 /* Largest defined DBSTATUS */
/*
@@ -8231,6 +8655,7 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...);
** can use to customize and optimize their behavior.
**
** <dl>
+** [[SQLITE_VTAB_CONSTRAINT_SUPPORT]]
** <dt>SQLITE_VTAB_CONSTRAINT_SUPPORT
** <dd>Calls of the form
** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported,
@@ -8277,6 +8702,40 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...);
SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *);
/*
+** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE
+**
+** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn]
+** method of a [virtual table], then it returns true if and only if the
+** column is being fetched as part of an UPDATE operation during which the
+** column value will not change. Applications might use this to substitute
+** a return value that is less expensive to compute and that the corresponding
+** [xUpdate] method understands as a "no-change" value.
+**
+** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that
+** the column is not changed by the UPDATE statement, then the xColumn
+** method can optionally return without setting a result, without calling
+** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
+** In that case, [sqlite3_value_nochange(X)] will return true for the
+** same column in the [xUpdate] method.
+*/
+SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*);
+
+/*
+** CAPI3REF: Determine The Collation For a Virtual Table Constraint
+**
+** This function may only be called from within a call to the [xBestIndex]
+** method of a [virtual table].
+**
+** The first argument must be the sqlite3_index_info object that is the
+** first parameter to the xBestIndex() method. The second argument must be
+** an index into the aConstraint[] array belonging to the sqlite3_index_info
+** structure passed to xBestIndex. This function returns a pointer to a buffer
+** containing the name of the collation sequence for the corresponding
+** constraint.
+*/
+SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int);
+
+/*
** CAPI3REF: Conflict resolution modes
** KEYWORDS: {conflict resolution mode}
**
@@ -8546,7 +9005,6 @@ SQLITE_API int sqlite3_system_errno(sqlite3*);
/*
** CAPI3REF: Database Snapshot
** KEYWORDS: {snapshot} {sqlite3_snapshot}
-** EXPERIMENTAL
**
** An instance of the snapshot object records the state of a [WAL mode]
** database for some specific point in history.
@@ -8563,11 +9021,6 @@ SQLITE_API int sqlite3_system_errno(sqlite3*);
** version of the database file so that it is possible to later open a new read
** transaction that sees that historical version of the database rather than
** the most recent version.
-**
-** The constructor for this object is [sqlite3_snapshot_get()]. The
-** [sqlite3_snapshot_open()] method causes a fresh read transaction to refer
-** to an historical snapshot (if possible). The destructor for
-** sqlite3_snapshot objects is [sqlite3_snapshot_free()].
*/
typedef struct sqlite3_snapshot {
unsigned char hidden[48];
@@ -8575,7 +9028,7 @@ typedef struct sqlite3_snapshot {
/*
** CAPI3REF: Record A Database Snapshot
-** EXPERIMENTAL
+** CONSTRUCTOR: sqlite3_snapshot
**
** ^The [sqlite3_snapshot_get(D,S,P)] interface attempts to make a
** new [sqlite3_snapshot] object that records the current state of
@@ -8591,7 +9044,7 @@ typedef struct sqlite3_snapshot {
** in this case.
**
** <ul>
-** <li> The database handle must be in [autocommit mode].
+** <li> The database handle must not be in [autocommit mode].
**
** <li> Schema S of [database connection] D must be a [WAL mode] database.
**
@@ -8614,7 +9067,7 @@ typedef struct sqlite3_snapshot {
** to avoid a memory leak.
**
** The [sqlite3_snapshot_get()] interface is only available when the
-** SQLITE_ENABLE_SNAPSHOT compile-time option is used.
+** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used.
*/
SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get(
sqlite3 *db,
@@ -8624,24 +9077,35 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get(
/*
** CAPI3REF: Start a read transaction on an historical snapshot
-** EXPERIMENTAL
+** METHOD: sqlite3_snapshot
+**
+** ^The [sqlite3_snapshot_open(D,S,P)] interface either starts a new read
+** transaction or upgrades an existing one for schema S of
+** [database connection] D such that the read transaction refers to
+** historical [snapshot] P, rather than the most recent change to the
+** database. ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK
+** on success or an appropriate [error code] if it fails.
+**
+** ^In order to succeed, the database connection must not be in
+** [autocommit mode] when [sqlite3_snapshot_open(D,S,P)] is called. If there
+** is already a read transaction open on schema S, then the database handle
+** must have no active statements (SELECT statements that have been passed
+** to sqlite3_step() but not sqlite3_reset() or sqlite3_finalize()).
+** SQLITE_ERROR is returned if either of these conditions is violated, or
+** if schema S does not exist, or if the snapshot object is invalid.
+**
+** ^A call to sqlite3_snapshot_open() will fail to open if the specified
+** snapshot has been overwritten by a [checkpoint]. In this case
+** SQLITE_ERROR_SNAPSHOT is returned.
+**
+** If there is already a read transaction open when this function is
+** invoked, then the same read transaction remains open (on the same
+** database snapshot) if SQLITE_ERROR, SQLITE_BUSY or SQLITE_ERROR_SNAPSHOT
+** is returned. If another error code - for example SQLITE_PROTOCOL or an
+** SQLITE_IOERR error code - is returned, then the final state of the
+** read transaction is undefined. If SQLITE_OK is returned, then the
+** read transaction is now open on database snapshot P.
**
-** ^The [sqlite3_snapshot_open(D,S,P)] interface starts a
-** read transaction for schema S of
-** [database connection] D such that the read transaction
-** refers to historical [snapshot] P, rather than the most
-** recent change to the database.
-** ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK on success
-** or an appropriate [error code] if it fails.
-**
-** ^In order to succeed, a call to [sqlite3_snapshot_open(D,S,P)] must be
-** the first operation following the [BEGIN] that takes the schema S
-** out of [autocommit mode].
-** ^In other words, schema S must not currently be in
-** a transaction for [sqlite3_snapshot_open(D,S,P)] to work, but the
-** database connection D must be out of [autocommit mode].
-** ^A [snapshot] will fail to open if it has been overwritten by a
-** [checkpoint].
** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the
** database connection D does not know that the database file for
** schema S is in [WAL mode]. A database connection might not know
@@ -8652,7 +9116,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get(
** database connection in order to make it ready to use snapshots.)
**
** The [sqlite3_snapshot_open()] interface is only available when the
-** SQLITE_ENABLE_SNAPSHOT compile-time option is used.
+** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used.
*/
SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open(
sqlite3 *db,
@@ -8662,20 +9126,20 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open(
/*
** CAPI3REF: Destroy a snapshot
-** EXPERIMENTAL
+** DESTRUCTOR: sqlite3_snapshot
**
** ^The [sqlite3_snapshot_free(P)] interface destroys [sqlite3_snapshot] P.
** The application must eventually free every [sqlite3_snapshot] object
** using this routine to avoid a memory leak.
**
** The [sqlite3_snapshot_free()] interface is only available when the
-** SQLITE_ENABLE_SNAPSHOT compile-time option is used.
+** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used.
*/
SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*);
/*
** CAPI3REF: Compare the ages of two snapshot handles.
-** EXPERIMENTAL
+** METHOD: sqlite3_snapshot
**
** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages
** of two valid snapshot handles.
@@ -8694,6 +9158,9 @@ SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*);
** Otherwise, this API returns a negative value if P1 refers to an older
** snapshot than P2, zero if the two handles refer to the same database
** snapshot, and a positive value if P1 is a newer snapshot than P2.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_SNAPSHOT] option.
*/
SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp(
sqlite3_snapshot *p1,
@@ -8702,27 +9169,152 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp(
/*
** CAPI3REF: Recover snapshots from a wal file
-** EXPERIMENTAL
+** METHOD: sqlite3_snapshot
**
-** If all connections disconnect from a database file but do not perform
-** a checkpoint, the existing wal file is opened along with the database
-** file the next time the database is opened. At this point it is only
-** possible to successfully call sqlite3_snapshot_open() to open the most
-** recent snapshot of the database (the one at the head of the wal file),
-** even though the wal file may contain other valid snapshots for which
-** clients have sqlite3_snapshot handles.
+** If a [WAL file] remains on disk after all database connections close
+** (either through the use of the [SQLITE_FCNTL_PERSIST_WAL] [file control]
+** or because the last process to have the database opened exited without
+** calling [sqlite3_close()]) and a new connection is subsequently opened
+** on that database and [WAL file], the [sqlite3_snapshot_open()] interface
+** will only be able to open the last transaction added to the WAL file
+** even though the WAL file contains other valid transactions.
**
-** This function attempts to scan the wal file associated with database zDb
+** This function attempts to scan the WAL file associated with database zDb
** of database handle db and make all valid snapshots available to
** sqlite3_snapshot_open(). It is an error if there is already a read
-** transaction open on the database, or if the database is not a wal mode
+** transaction open on the database, or if the database is not a WAL mode
** database.
**
** SQLITE_OK is returned if successful, or an SQLite error code otherwise.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_SNAPSHOT] option.
*/
SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb);
/*
+** CAPI3REF: Serialize a database
+**
+** The sqlite3_serialize(D,S,P,F) interface returns a pointer to memory
+** that is a serialization of the S database on [database connection] D.
+** If P is not a NULL pointer, then the size of the database in bytes
+** is written into *P.
+**
+** For an ordinary on-disk database file, the serialization is just a
+** copy of the disk file. For an in-memory database or a "TEMP" database,
+** the serialization is the same sequence of bytes which would be written
+** to disk if that database where backed up to disk.
+**
+** The usual case is that sqlite3_serialize() copies the serialization of
+** the database into memory obtained from [sqlite3_malloc64()] and returns
+** a pointer to that memory. The caller is responsible for freeing the
+** returned value to avoid a memory leak. However, if the F argument
+** contains the SQLITE_SERIALIZE_NOCOPY bit, then no memory allocations
+** are made, and the sqlite3_serialize() function will return a pointer
+** to the contiguous memory representation of the database that SQLite
+** is currently using for that database, or NULL if the no such contiguous
+** memory representation of the database exists. A contiguous memory
+** representation of the database will usually only exist if there has
+** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
+** values of D and S.
+** The size of the database is written into *P even if the
+** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy
+** of the database exists.
+**
+** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
+** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory
+** allocation error occurs.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_DESERIALIZE] option.
+*/
+SQLITE_API unsigned char *sqlite3_serialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which DB to serialize. ex: "main", "temp", ... */
+ sqlite3_int64 *piSize, /* Write size of the DB here, if not NULL */
+ unsigned int mFlags /* Zero or more SQLITE_SERIALIZE_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3_serialize
+**
+** Zero or more of the following constants can be OR-ed together for
+** the F argument to [sqlite3_serialize(D,S,P,F)].
+**
+** SQLITE_SERIALIZE_NOCOPY means that [sqlite3_serialize()] will return
+** a pointer to contiguous in-memory database that it is currently using,
+** without making a copy of the database. If SQLite is not currently using
+** a contiguous in-memory database, then this option causes
+** [sqlite3_serialize()] to return a NULL pointer. SQLite will only be
+** using a contiguous in-memory database if it has been initialized by a
+** prior call to [sqlite3_deserialize()].
+*/
+#define SQLITE_SERIALIZE_NOCOPY 0x001 /* Do no memory allocations */
+
+/*
+** CAPI3REF: Deserialize a database
+**
+** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the
+** [database connection] D to disconnect from database S and then
+** reopen S as an in-memory database based on the serialization contained
+** in P. The serialized database P is N bytes in size. M is the size of
+** the buffer P, which might be larger than N. If M is larger than N, and
+** the SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is
+** permitted to add content to the in-memory database as long as the total
+** size does not exceed M bytes.
+**
+** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will
+** invoke sqlite3_free() on the serialization buffer when the database
+** connection closes. If the SQLITE_DESERIALIZE_RESIZEABLE bit is set, then
+** SQLite will try to increase the buffer size using sqlite3_realloc64()
+** if writes on the database cause it to grow larger than M bytes.
+**
+** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the
+** database is currently in a read transaction or is involved in a backup
+** operation.
+**
+** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the
+** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then
+** [sqlite3_free()] is invoked on argument P prior to returning.
+**
+** This interface is only available if SQLite is compiled with the
+** [SQLITE_ENABLE_DESERIALIZE] option.
+*/
+SQLITE_API int sqlite3_deserialize(
+ sqlite3 *db, /* The database connection */
+ const char *zSchema, /* Which DB to reopen with the deserialization */
+ unsigned char *pData, /* The serialized database content */
+ sqlite3_int64 szDb, /* Number bytes in the deserialization */
+ sqlite3_int64 szBuf, /* Total size of buffer pData[] */
+ unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3_deserialize()
+**
+** The following are allowed values for 6th argument (the F argument) to
+** the [sqlite3_deserialize(D,S,P,N,M,F)] interface.
+**
+** The SQLITE_DESERIALIZE_FREEONCLOSE means that the database serialization
+** in the P argument is held in memory obtained from [sqlite3_malloc64()]
+** and that SQLite should take ownership of this memory and automatically
+** free it when it has finished using it. Without this flag, the caller
+** is responsible for freeing any dynamically allocated memory.
+**
+** The SQLITE_DESERIALIZE_RESIZEABLE flag means that SQLite is allowed to
+** grow the size of the database using calls to [sqlite3_realloc64()]. This
+** flag should only be used if SQLITE_DESERIALIZE_FREEONCLOSE is also used.
+** Without this flag, the deserialized database cannot increase in size beyond
+** the number of bytes specified by the M parameter.
+**
+** The SQLITE_DESERIALIZE_READONLY flag means that the deserialized database
+** should be treated as read-only.
+*/
+#define SQLITE_DESERIALIZE_FREEONCLOSE 1 /* Call sqlite3_free() on close */
+#define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */
+#define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */
+
+/*
** Undo the hack that converts floating point types to integer for
** builds on processors without floating point support.
*/
@@ -8833,7 +9425,7 @@ struct sqlite3_rtree_query_info {
sqlite3_int64 iRowid; /* Rowid for current entry */
sqlite3_rtree_dbl rParentScore; /* Score of parent node */
int eParentWithin; /* Visibility of parent node */
- int eWithin; /* OUT: Visiblity */
+ int eWithin; /* OUT: Visibility */
sqlite3_rtree_dbl rScore; /* OUT: Write the score here */
/* The following fields are only available in 3.8.11 and later */
sqlite3_value **apSqlParam; /* Original SQL values of parameters */
@@ -8869,16 +9461,23 @@ extern "C" {
/*
** CAPI3REF: Session Object Handle
+**
+** An instance of this object is a [session] that can be used to
+** record changes to a database.
*/
typedef struct sqlite3_session sqlite3_session;
/*
** CAPI3REF: Changeset Iterator Handle
+**
+** An instance of this object acts as a cursor for iterating
+** over the elements of a [changeset] or [patchset].
*/
typedef struct sqlite3_changeset_iter sqlite3_changeset_iter;
/*
** CAPI3REF: Create A New Session Object
+** CONSTRUCTOR: sqlite3_session
**
** Create a new session object attached to database handle db. If successful,
** a pointer to the new object is written to *ppSession and SQLITE_OK is
@@ -8915,6 +9514,7 @@ SQLITE_API int sqlite3session_create(
/*
** CAPI3REF: Delete A Session Object
+** DESTRUCTOR: sqlite3_session
**
** Delete a session object previously allocated using
** [sqlite3session_create()]. Once a session object has been deleted, the
@@ -8930,6 +9530,7 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession);
/*
** CAPI3REF: Enable Or Disable A Session Object
+** METHOD: sqlite3_session
**
** Enable or disable the recording of changes by a session object. When
** enabled, a session object records changes made to the database. When
@@ -8949,6 +9550,7 @@ SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable);
/*
** CAPI3REF: Set Or Clear the Indirect Change Flag
+** METHOD: sqlite3_session
**
** Each change recorded by a session object is marked as either direct or
** indirect. A change is marked as indirect if either:
@@ -8978,6 +9580,7 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect)
/*
** CAPI3REF: Attach A Table To A Session Object
+** METHOD: sqlite3_session
**
** If argument zTab is not NULL, then it is the name of a table to attach
** to the session object passed as the first argument. All subsequent changes
@@ -9003,6 +9606,35 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect)
**
** SQLITE_OK is returned if the call completes without error. Or, if an error
** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned.
+**
+** <h3>Special sqlite_stat1 Handling</h3>
+**
+** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to
+** some of the rules above. In SQLite, the schema of sqlite_stat1 is:
+** <pre>
+** &nbsp; CREATE TABLE sqlite_stat1(tbl,idx,stat)
+** </pre>
+**
+** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are
+** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes
+** are recorded for rows for which (idx IS NULL) is true. However, for such
+** rows a zero-length blob (SQL value X'') is stored in the changeset or
+** patchset instead of a NULL value. This allows such changesets to be
+** manipulated by legacy implementations of sqlite3changeset_invert(),
+** concat() and similar.
+**
+** The sqlite3changeset_apply() function automatically converts the
+** zero-length blob back to a NULL value when updating the sqlite_stat1
+** table. However, if the application calls sqlite3changeset_new(),
+** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset
+** iterator directly (including on a changeset iterator passed to a
+** conflict-handler callback) then the X'' value is returned. The application
+** must translate X'' to NULL itself if required.
+**
+** Legacy (older than 3.22.0) versions of the sessions module cannot capture
+** changes made to the sqlite_stat1 table. Legacy versions of the
+** sqlite3changeset_apply() function silently ignore any modifications to the
+** sqlite_stat1 table that are part of a changeset or patchset.
*/
SQLITE_API int sqlite3session_attach(
sqlite3_session *pSession, /* Session object */
@@ -9011,6 +9643,7 @@ SQLITE_API int sqlite3session_attach(
/*
** CAPI3REF: Set a table filter on a Session Object.
+** METHOD: sqlite3_session
**
** The second argument (xFilter) is the "filter callback". For changes to rows
** in tables that are not attached to the Session object, the filter is called
@@ -9029,6 +9662,7 @@ SQLITE_API void sqlite3session_table_filter(
/*
** CAPI3REF: Generate A Changeset From A Session Object
+** METHOD: sqlite3_session
**
** Obtain a changeset containing changes to the tables attached to the
** session object passed as the first argument. If successful,
@@ -9138,7 +9772,8 @@ SQLITE_API int sqlite3session_changeset(
);
/*
-** CAPI3REF: Load The Difference Between Tables Into A Session
+** CAPI3REF: Load The Difference Between Tables Into A Session
+** METHOD: sqlite3_session
**
** If it is not already attached to the session object passed as the first
** argument, this function attaches table zTbl in the same manner as the
@@ -9203,6 +9838,7 @@ SQLITE_API int sqlite3session_diff(
/*
** CAPI3REF: Generate A Patchset From A Session Object
+** METHOD: sqlite3_session
**
** The differences between a patchset and a changeset are that:
**
@@ -9254,6 +9890,7 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession);
/*
** CAPI3REF: Create An Iterator To Traverse A Changeset
+** CONSTRUCTOR: sqlite3_changeset_iter
**
** Create an iterator used to iterate through the contents of a changeset.
** If successful, *pp is set to point to the iterator handle and SQLITE_OK
@@ -9284,16 +9921,43 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession);
** consecutively. There is no chance that the iterator will visit a change
** the applies to table X, then one for table Y, and then later on visit
** another change for table X.
+**
+** The behavior of sqlite3changeset_start_v2() and its streaming equivalent
+** may be modified by passing a combination of
+** [SQLITE_CHANGESETSTART_INVERT | supported flags] as the 4th parameter.
+**
+** Note that the sqlite3changeset_start_v2() API is still <b>experimental</b>
+** and therefore subject to change.
*/
SQLITE_API int sqlite3changeset_start(
sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */
int nChangeset, /* Size of changeset blob in bytes */
void *pChangeset /* Pointer to blob containing changeset */
);
+SQLITE_API int sqlite3changeset_start_v2(
+ sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */
+ int nChangeset, /* Size of changeset blob in bytes */
+ void *pChangeset, /* Pointer to blob containing changeset */
+ int flags /* SESSION_CHANGESETSTART_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3changeset_start_v2
+**
+** The following flags may passed via the 4th parameter to
+** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]:
+**
+** <dt>SQLITE_CHANGESETAPPLY_INVERT <dd>
+** Invert the changeset while iterating through it. This is equivalent to
+** inverting a changeset using sqlite3changeset_invert() before applying it.
+** It is an error to specify this flag with a patchset.
+*/
+#define SQLITE_CHANGESETSTART_INVERT 0x0002
/*
** CAPI3REF: Advance A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function may only be used with iterators created by function
** [sqlite3changeset_start()]. If it is called on an iterator passed to
@@ -9318,6 +9982,7 @@ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter);
/*
** CAPI3REF: Obtain The Current Operation From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -9352,6 +10017,7 @@ SQLITE_API int sqlite3changeset_op(
/*
** CAPI3REF: Obtain The Primary Key Definition Of A Table
+** METHOD: sqlite3_changeset_iter
**
** For each modified table, a changeset includes the following:
**
@@ -9383,6 +10049,7 @@ SQLITE_API int sqlite3changeset_pk(
/*
** CAPI3REF: Obtain old.* Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -9413,6 +10080,7 @@ SQLITE_API int sqlite3changeset_old(
/*
** CAPI3REF: Obtain new.* Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** The pIter argument passed to this function may either be an iterator
** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator
@@ -9446,6 +10114,7 @@ SQLITE_API int sqlite3changeset_new(
/*
** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function should only be used with iterator objects passed to a
** conflict-handler callback by [sqlite3changeset_apply()] with either
@@ -9473,6 +10142,7 @@ SQLITE_API int sqlite3changeset_conflict(
/*
** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations
+** METHOD: sqlite3_changeset_iter
**
** This function may only be called with an iterator passed to an
** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case
@@ -9489,6 +10159,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
/*
** CAPI3REF: Finalize A Changeset Iterator
+** METHOD: sqlite3_changeset_iter
**
** This function is used to finalize an iterator allocated with
** [sqlite3changeset_start()].
@@ -9505,6 +10176,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
** to that error is returned by this function. Otherwise, SQLITE_OK is
** returned. This is to allow the following pattern (pseudo-code):
**
+** <pre>
** sqlite3changeset_start();
** while( SQLITE_ROW==sqlite3changeset_next() ){
** // Do something with change.
@@ -9513,6 +10185,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts(
** if( rc!=SQLITE_OK ){
** // An error has occurred
** }
+** </pre>
*/
SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter);
@@ -9560,6 +10233,7 @@ SQLITE_API int sqlite3changeset_invert(
** sqlite3_changegroup object. Calling it produces similar results as the
** following code fragment:
**
+** <pre>
** sqlite3_changegroup *pGrp;
** rc = sqlite3_changegroup_new(&pGrp);
** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA);
@@ -9570,6 +10244,7 @@ SQLITE_API int sqlite3changeset_invert(
** *ppOut = 0;
** *pnOut = 0;
** }
+** </pre>
**
** Refer to the sqlite3_changegroup documentation below for details.
*/
@@ -9585,11 +10260,15 @@ SQLITE_API int sqlite3changeset_concat(
/*
** CAPI3REF: Changegroup Handle
+**
+** A changegroup is an object used to combine two or more
+** [changesets] or [patchsets]
*/
typedef struct sqlite3_changegroup sqlite3_changegroup;
/*
** CAPI3REF: Create A New Changegroup Object
+** CONSTRUCTOR: sqlite3_changegroup
**
** An sqlite3_changegroup object is used to combine two or more changesets
** (or patchsets) into a single changeset (or patchset). A single changegroup
@@ -9627,6 +10306,7 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp);
/*
** CAPI3REF: Add A Changeset To A Changegroup
+** METHOD: sqlite3_changegroup
**
** Add all changes within the changeset (or patchset) in buffer pData (size
** nData bytes) to the changegroup.
@@ -9704,6 +10384,7 @@ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pDa
/*
** CAPI3REF: Obtain A Composite Changeset From A Changegroup
+** METHOD: sqlite3_changegroup
**
** Obtain a buffer containing a changeset (or patchset) representing the
** current contents of the changegroup. If the inputs to the changegroup
@@ -9734,25 +10415,25 @@ SQLITE_API int sqlite3changegroup_output(
/*
** CAPI3REF: Delete A Changegroup Object
+** DESTRUCTOR: sqlite3_changegroup
*/
SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
/*
** CAPI3REF: Apply A Changeset To A Database
**
-** Apply a changeset to a database. This function attempts to update the
-** "main" database attached to handle db with the changes found in the
-** changeset passed via the second and third arguments.
+** Apply a changeset or patchset to a database. These functions attempt to
+** update the "main" database attached to handle db with the changes found in
+** the changeset passed via the second and third arguments.
**
-** The fourth argument (xFilter) passed to this function is the "filter
+** The fourth argument (xFilter) passed to these functions is the "filter
** callback". If it is not NULL, then for each table affected by at least one
** change in the changeset, the filter callback is invoked with
** the table name as the second argument, and a copy of the context pointer
-** passed as the sixth argument to this function as the first. If the "filter
-** callback" returns zero, then no attempt is made to apply any changes to
-** the table. Otherwise, if the return value is non-zero or the xFilter
-** argument to this function is NULL, all changes related to the table are
-** attempted.
+** passed as the sixth argument as the first. If the "filter callback"
+** returns zero, then no attempt is made to apply any changes to the table.
+** Otherwise, if the return value is non-zero or the xFilter argument to
+** is NULL, all changes related to the table are attempted.
**
** For each table that is not excluded by the filter callback, this function
** tests that the target database contains a compatible table. A table is
@@ -9797,7 +10478,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
**
** <dl>
** <dt>DELETE Changes<dd>
-** For each DELETE change, this function checks if the target database
+** For each DELETE change, the function checks if the target database
** contains a row with the same primary key value (or values) as the
** original row values stored in the changeset. If it does, and the values
** stored in all non-primary key columns also match the values stored in
@@ -9842,7 +10523,7 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
** [SQLITE_CHANGESET_REPLACE].
**
** <dt>UPDATE Changes<dd>
-** For each UPDATE change, this function checks if the target database
+** For each UPDATE change, the function checks if the target database
** contains a row with the same primary key value (or values) as the
** original row values stored in the changeset. If it does, and the values
** stored in all modified non-primary key columns also match the values
@@ -9873,11 +10554,28 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*);
** This can be used to further customize the applications conflict
** resolution strategy.
**
-** All changes made by this function are enclosed in a savepoint transaction.
+** All changes made by these functions are enclosed in a savepoint transaction.
** If any other error (aside from a constraint failure when attempting to
** write to the target database) occurs, then the savepoint transaction is
** rolled back, restoring the target database to its original state, and an
** SQLite error code returned.
+**
+** If the output parameters (ppRebase) and (pnRebase) are non-NULL and
+** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2()
+** may set (*ppRebase) to point to a "rebase" that may be used with the
+** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase)
+** is set to the size of the buffer in bytes. It is the responsibility of the
+** caller to eventually free any such buffer using sqlite3_free(). The buffer
+** is only allocated and populated if one or more conflicts were encountered
+** while applying the patchset. See comments surrounding the sqlite3_rebaser
+** APIs for further details.
+**
+** The behavior of sqlite3changeset_apply_v2() and its streaming equivalent
+** may be modified by passing a combination of
+** [SQLITE_CHANGESETAPPLY_NOSAVEPOINT | supported flags] as the 9th parameter.
+**
+** Note that the sqlite3changeset_apply_v2() API is still <b>experimental</b>
+** and therefore subject to change.
*/
SQLITE_API int sqlite3changeset_apply(
sqlite3 *db, /* Apply change to "main" db of this handle */
@@ -9894,6 +10592,47 @@ SQLITE_API int sqlite3changeset_apply(
),
void *pCtx /* First argument passed to xConflict */
);
+SQLITE_API int sqlite3changeset_apply_v2(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int nChangeset, /* Size of changeset in bytes */
+ void *pChangeset, /* Changeset blob */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase, /* OUT: Rebase data */
+ int flags /* SESSION_CHANGESETAPPLY_* flags */
+);
+
+/*
+** CAPI3REF: Flags for sqlite3changeset_apply_v2
+**
+** The following flags may passed via the 9th parameter to
+** [sqlite3changeset_apply_v2] and [sqlite3changeset_apply_v2_strm]:
+**
+** <dl>
+** <dt>SQLITE_CHANGESETAPPLY_NOSAVEPOINT <dd>
+** Usually, the sessions module encloses all operations performed by
+** a single call to apply_v2() or apply_v2_strm() in a [SAVEPOINT]. The
+** SAVEPOINT is committed if the changeset or patchset is successfully
+** applied, or rolled back if an error occurs. Specifying this flag
+** causes the sessions module to omit this savepoint. In this case, if the
+** caller has an open transaction or savepoint when apply_v2() is called,
+** it may revert the partially applied changeset by rolling it back.
+**
+** <dt>SQLITE_CHANGESETAPPLY_INVERT <dd>
+** Invert the changeset before applying it. This is equivalent to inverting
+** a changeset using sqlite3changeset_invert() before applying it. It is
+** an error to specify this flag with a patchset.
+*/
+#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001
+#define SQLITE_CHANGESETAPPLY_INVERT 0x0002
/*
** CAPI3REF: Constants Passed To The Conflict Handler
@@ -9991,6 +10730,161 @@ SQLITE_API int sqlite3changeset_apply(
#define SQLITE_CHANGESET_REPLACE 1
#define SQLITE_CHANGESET_ABORT 2
+/*
+** CAPI3REF: Rebasing changesets
+** EXPERIMENTAL
+**
+** Suppose there is a site hosting a database in state S0. And that
+** modifications are made that move that database to state S1 and a
+** changeset recorded (the "local" changeset). Then, a changeset based
+** on S0 is received from another site (the "remote" changeset) and
+** applied to the database. The database is then in state
+** (S1+"remote"), where the exact state depends on any conflict
+** resolution decisions (OMIT or REPLACE) made while applying "remote".
+** Rebasing a changeset is to update it to take those conflict
+** resolution decisions into account, so that the same conflicts
+** do not have to be resolved elsewhere in the network.
+**
+** For example, if both the local and remote changesets contain an
+** INSERT of the same key on "CREATE TABLE t1(a PRIMARY KEY, b)":
+**
+** local: INSERT INTO t1 VALUES(1, 'v1');
+** remote: INSERT INTO t1 VALUES(1, 'v2');
+**
+** and the conflict resolution is REPLACE, then the INSERT change is
+** removed from the local changeset (it was overridden). Or, if the
+** conflict resolution was "OMIT", then the local changeset is modified
+** to instead contain:
+**
+** UPDATE t1 SET b = 'v2' WHERE a=1;
+**
+** Changes within the local changeset are rebased as follows:
+**
+** <dl>
+** <dt>Local INSERT<dd>
+** This may only conflict with a remote INSERT. If the conflict
+** resolution was OMIT, then add an UPDATE change to the rebased
+** changeset. Or, if the conflict resolution was REPLACE, add
+** nothing to the rebased changeset.
+**
+** <dt>Local DELETE<dd>
+** This may conflict with a remote UPDATE or DELETE. In both cases the
+** only possible resolution is OMIT. If the remote operation was a
+** DELETE, then add no change to the rebased changeset. If the remote
+** operation was an UPDATE, then the old.* fields of change are updated
+** to reflect the new.* values in the UPDATE.
+**
+** <dt>Local UPDATE<dd>
+** This may conflict with a remote UPDATE or DELETE. If it conflicts
+** with a DELETE, and the conflict resolution was OMIT, then the update
+** is changed into an INSERT. Any undefined values in the new.* record
+** from the update change are filled in using the old.* values from
+** the conflicting DELETE. Or, if the conflict resolution was REPLACE,
+** the UPDATE change is simply omitted from the rebased changeset.
+**
+** If conflict is with a remote UPDATE and the resolution is OMIT, then
+** the old.* values are rebased using the new.* values in the remote
+** change. Or, if the resolution is REPLACE, then the change is copied
+** into the rebased changeset with updates to columns also updated by
+** the conflicting remote UPDATE removed. If this means no columns would
+** be updated, the change is omitted.
+** </dl>
+**
+** A local change may be rebased against multiple remote changes
+** simultaneously. If a single key is modified by multiple remote
+** changesets, they are combined as follows before the local changeset
+** is rebased:
+**
+** <ul>
+** <li> If there has been one or more REPLACE resolutions on a
+** key, it is rebased according to a REPLACE.
+**
+** <li> If there have been no REPLACE resolutions on a key, then
+** the local changeset is rebased according to the most recent
+** of the OMIT resolutions.
+** </ul>
+**
+** Note that conflict resolutions from multiple remote changesets are
+** combined on a per-field basis, not per-row. This means that in the
+** case of multiple remote UPDATE operations, some fields of a single
+** local change may be rebased for REPLACE while others are rebased for
+** OMIT.
+**
+** In order to rebase a local changeset, the remote changeset must first
+** be applied to the local database using sqlite3changeset_apply_v2() and
+** the buffer of rebase information captured. Then:
+**
+** <ol>
+** <li> An sqlite3_rebaser object is created by calling
+** sqlite3rebaser_create().
+** <li> The new object is configured with the rebase buffer obtained from
+** sqlite3changeset_apply_v2() by calling sqlite3rebaser_configure().
+** If the local changeset is to be rebased against multiple remote
+** changesets, then sqlite3rebaser_configure() should be called
+** multiple times, in the same order that the multiple
+** sqlite3changeset_apply_v2() calls were made.
+** <li> Each local changeset is rebased by calling sqlite3rebaser_rebase().
+** <li> The sqlite3_rebaser object is deleted by calling
+** sqlite3rebaser_delete().
+** </ol>
+*/
+typedef struct sqlite3_rebaser sqlite3_rebaser;
+
+/*
+** CAPI3REF: Create a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Allocate a new changeset rebaser object. If successful, set (*ppNew) to
+** point to the new object and return SQLITE_OK. Otherwise, if an error
+** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew)
+** to NULL.
+*/
+SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew);
+
+/*
+** CAPI3REF: Configure a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Configure the changeset rebaser object to rebase changesets according
+** to the conflict resolutions described by buffer pRebase (size nRebase
+** bytes), which must have been obtained from a previous call to
+** sqlite3changeset_apply_v2().
+*/
+SQLITE_API int sqlite3rebaser_configure(
+ sqlite3_rebaser*,
+ int nRebase, const void *pRebase
+);
+
+/*
+** CAPI3REF: Rebase a changeset
+** EXPERIMENTAL
+**
+** Argument pIn must point to a buffer containing a changeset nIn bytes
+** 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
+** (*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)
+** are set to zero and an SQLite error code returned.
+*/
+SQLITE_API int sqlite3rebaser_rebase(
+ sqlite3_rebaser*,
+ int nIn, const void *pIn,
+ int *pnOut, void **ppOut
+);
+
+/*
+** CAPI3REF: Delete a changeset rebaser object.
+** EXPERIMENTAL
+**
+** Delete the changeset rebaser object and all associated resources. There
+** should be one call to this function for each successful invocation
+** of sqlite3rebaser_create().
+*/
+SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p);
+
/*
** CAPI3REF: Streaming Versions of API functions.
**
@@ -10000,6 +10894,7 @@ SQLITE_API int sqlite3changeset_apply(
** <table border=1 style="margin-left:8ex;margin-right:8ex">
** <tr><th>Streaming function<th>Non-streaming equivalent</th>
** <tr><td>sqlite3changeset_apply_strm<td>[sqlite3changeset_apply]
+** <tr><td>sqlite3changeset_apply_strm_v2<td>[sqlite3changeset_apply_v2]
** <tr><td>sqlite3changeset_concat_strm<td>[sqlite3changeset_concat]
** <tr><td>sqlite3changeset_invert_strm<td>[sqlite3changeset_invert]
** <tr><td>sqlite3changeset_start_strm<td>[sqlite3changeset_start]
@@ -10095,6 +10990,23 @@ SQLITE_API int sqlite3changeset_apply_strm(
),
void *pCtx /* First argument passed to xConflict */
);
+SQLITE_API int sqlite3changeset_apply_v2_strm(
+ sqlite3 *db, /* Apply change to "main" db of this handle */
+ int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
+ void *pIn, /* First arg for xInput */
+ int(*xFilter)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ const char *zTab /* Table name */
+ ),
+ int(*xConflict)(
+ void *pCtx, /* Copy of sixth arg to _apply() */
+ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */
+ sqlite3_changeset_iter *p /* Handle describing change and conflict */
+ ),
+ void *pCtx, /* First argument passed to xConflict */
+ void **ppRebase, int *pnRebase,
+ int flags
+);
SQLITE_API int sqlite3changeset_concat_strm(
int (*xInputA)(void *pIn, void *pData, int *pnData),
void *pInA,
@@ -10114,6 +11026,12 @@ SQLITE_API int sqlite3changeset_start_strm(
int (*xInput)(void *pIn, void *pData, int *pnData),
void *pIn
);
+SQLITE_API int sqlite3changeset_start_v2_strm(
+ sqlite3_changeset_iter **pp,
+ int (*xInput)(void *pIn, void *pData, int *pnData),
+ void *pIn,
+ int flags
+);
SQLITE_API int sqlite3session_changeset_strm(
sqlite3_session *pSession,
int (*xOutput)(void *pOut, const void *pData, int nData),
@@ -10132,7 +11050,53 @@ SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*,
int (*xOutput)(void *pOut, const void *pData, int nData),
void *pOut
);
+SQLITE_API int sqlite3rebaser_rebase_strm(
+ sqlite3_rebaser *pRebaser,
+ int (*xInput)(void *pIn, void *pData, int *pnData),
+ void *pIn,
+ int (*xOutput)(void *pOut, const void *pData, int nData),
+ void *pOut
+);
+/*
+** CAPI3REF: Configure global parameters
+**
+** The sqlite3session_config() interface is used to make global configuration
+** changes to the sessions module in order to tune it to the specific needs
+** of the application.
+**
+** The sqlite3session_config() interface is not threadsafe. If it is invoked
+** while any other thread is inside any other sessions method then the
+** results are undefined. Furthermore, if it is invoked after any sessions
+** related objects have been created, the results are also undefined.
+**
+** The first argument to the sqlite3session_config() function must be one
+** of the SQLITE_SESSION_CONFIG_XXX constants defined below. The
+** interpretation of the (void*) value passed as the second parameter and
+** the effect of calling this function depends on the value of the first
+** parameter.
+**
+** <dl>
+** <dt>SQLITE_SESSION_CONFIG_STRMSIZE<dd>
+** By default, the sessions module streaming interfaces attempt to input
+** and output data in approximately 1 KiB chunks. This operand may be used
+** to set and query the value of this configuration setting. The pointer
+** passed as the second argument must point to a value of type (int).
+** If this value is greater than 0, it is used as the new streaming data
+** chunk size for both input and output. Before returning, the (int) value
+** pointed to by pArg is set to the final value of the streaming interface
+** chunk size.
+** </dl>
+**
+** This function returns SQLITE_OK if successful, or an SQLite error code
+** otherwise.
+*/
+SQLITE_API int sqlite3session_config(int op, void *pArg);
+
+/*
+** CAPI3REF: Values for sqlite3session_config().
+*/
+#define SQLITE_SESSION_CONFIG_STRMSIZE 1
/*
** Make sure we can call this stuff from C++.
@@ -10590,7 +11554,7 @@ struct Fts5ExtensionApi {
** This way, even if the tokenizer does not provide synonyms
** when tokenizing query text (it should not - to do would be
** inefficient), it doesn't matter if the user queries for
-** 'first + place' or '1st + place', as there are entires in the
+** 'first + place' or '1st + place', as there are entries in the
** FTS index corresponding to both forms of the first token.
** </ol>
**
@@ -10618,7 +11582,7 @@ struct Fts5ExtensionApi {
** extra data to the FTS index or require FTS5 to query for multiple terms,
** so it is efficient in terms of disk space and query speed. However, it
** does not support prefix queries very well. If, as suggested above, the
-** token "first" is subsituted for "1st" by the tokenizer, then the query:
+** token "first" is substituted for "1st" by the tokenizer, then the query:
**
** <codeblock>
** ... MATCH '1s*'</codeblock>
diff --git a/devtools/shared/heapsnapshot/HeapSnapshot.cpp b/devtools/shared/heapsnapshot/HeapSnapshot.cpp
index b7b20dc17..299a96a9c 100644
--- a/devtools/shared/heapsnapshot/HeapSnapshot.cpp
+++ b/devtools/shared/heapsnapshot/HeapSnapshot.cpp
@@ -1351,10 +1351,6 @@ class MOZ_STACK_CLASS HeapSnapshotHandler
JS::CompartmentSet* compartments;
public:
- // For telemetry.
- uint32_t nodeCount;
- uint32_t edgeCount;
-
HeapSnapshotHandler(CoreDumpWriter& writer,
JS::CompartmentSet* compartments)
: writer(writer),
@@ -1371,8 +1367,6 @@ public:
NodeData*,
bool first)
{
- edgeCount++;
-
// We're only interested in the first time we reach edge.referent, not in
// every edge arriving at that node. "But, don't we want to serialize every
// edge in the heap graph?" you ask. Don't worry! This edge is still
@@ -1386,8 +1380,6 @@ public:
if (!ShouldIncludeEdge(compartments, origin, edge, &policy))
return true;
- nodeCount++;
-
if (policy == CoreDumpWriter::EXCLUDE_EDGES)
traversal.abandonReferent();
@@ -1402,9 +1394,7 @@ WriteHeapGraph(JSContext* cx,
CoreDumpWriter& writer,
bool wantNames,
JS::CompartmentSet* compartments,
- JS::AutoCheckCannotGC& noGC,
- uint32_t& outNodeCount,
- uint32_t& outEdgeCount)
+ JS::AutoCheckCannotGC& noGC)
{
// Serialize the starting node to the core dump.
@@ -1424,11 +1414,6 @@ WriteHeapGraph(JSContext* cx,
bool ok = traversal.addStartVisited(node) &&
traversal.traverse();
- if (ok) {
- outNodeCount = handler.nodeCount;
- outEdgeCount = handler.edgeCount;
- }
-
return ok;
}
@@ -1562,8 +1547,6 @@ ThreadSafeChromeUtils::SaveHeapSnapshot(GlobalObject& global,
bool wantNames = true;
CompartmentSet compartments;
- uint32_t nodeCount = 0;
- uint32_t edgeCount = 0;
nsCOMPtr<nsIOutputStream> outputStream = getCoreDumpOutputStream(rv, start, outFilePath);
if (NS_WARN_IF(rv.Failed()))
@@ -1599,9 +1582,7 @@ ThreadSafeChromeUtils::SaveHeapSnapshot(GlobalObject& global,
writer,
wantNames,
compartments.initialized() ? &compartments : nullptr,
- maybeNoGC.ref(),
- nodeCount,
- edgeCount))
+ maybeNoGC.ref()))
{
rv.Throw(zeroCopyStream.failed()
? zeroCopyStream.result()
diff --git a/devtools/shared/heapsnapshot/HeapSnapshot.h b/devtools/shared/heapsnapshot/HeapSnapshot.h
index 0428033f6..12dfa4c2b 100644
--- a/devtools/shared/heapsnapshot/HeapSnapshot.h
+++ b/devtools/shared/heapsnapshot/HeapSnapshot.h
@@ -213,22 +213,7 @@ WriteHeapGraph(JSContext* cx,
CoreDumpWriter& writer,
bool wantNames,
JS::CompartmentSet* compartments,
- JS::AutoCheckCannotGC& noGC,
- uint32_t& outNodeCount,
- uint32_t& outEdgeCount);
-inline bool
-WriteHeapGraph(JSContext* cx,
- const JS::ubi::Node& node,
- CoreDumpWriter& writer,
- bool wantNames,
- JS::CompartmentSet* compartments,
- JS::AutoCheckCannotGC& noGC)
-{
- uint32_t ignoreNodeCount;
- uint32_t ignoreEdgeCount;
- return WriteHeapGraph(cx, node, writer, wantNames, compartments, noGC,
- ignoreNodeCount, ignoreEdgeCount);
-}
+ JS::AutoCheckCannotGC& noGC);
// Get the mozilla::MallocSizeOf for the current thread's JSRuntime.
MallocSizeOf GetCurrentThreadDebuggerMallocSizeOf();
diff --git a/devtools/shared/jsinspector/nsJSInspector.cpp b/devtools/shared/jsinspector/nsJSInspector.cpp
index 6d717af5b..457e64c08 100644
--- a/devtools/shared/jsinspector/nsJSInspector.cpp
+++ b/devtools/shared/jsinspector/nsJSInspector.cpp
@@ -37,7 +37,6 @@ NS_IMPL_CYCLE_COLLECTING_ADDREF(nsJSInspector)
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsJSInspector)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsJSInspector)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsJSInspector)
diff --git a/docs/UXP Coding Style.md b/docs/UXP Coding Style.md
new file mode 100644
index 000000000..83f59c8b1
--- /dev/null
+++ b/docs/UXP Coding Style.md
@@ -0,0 +1,239 @@
+# UXP Coding Style Guide
+While our source tree is currently in a number of different Coding Styles and the general rule applies to adhere to style of surrounding code when you are making changes, it is our goal to unify the style of our source tree and making it adhere to a single style.
+This document describes the preferred style for new source code files and the preferred style to convert existing files to.
+
+This style guide will not apply to 3rd party libraries that are imported verbatim to our code (e.g. NSS, NSPR, SQLite, various media libs, etc.).
+
+Our own managed and maintained code should adhere to this guide where possible or feasible. It departs from the Mozilla Coding Style in some ways, but considering Mozilla has abandoned their code style in favor of Google code style, we are now defining our own preferred style.
+
+**Important**: if you touch a file to make it adhere to this code style, do not mix code changes with formatting changes. Always make formatting changes throughout a file a single, separate commit that does not touch code functionality!
+
+## General formatting rules
+The following formatting rules apply to all code:
+- Always use spaces for indentation, never use tabs!
+- Put a space between a keyword and parenthesis, e.g. `if (`.
+- Put a space between variables and operators, e.g. `a == b`.
+- Put a space after a comma or semicolon in variable lists, e.g. `function (a, b, c)` or `for (i = 1; i < 10; i++)`.
+- Indentation of scopes is 2 spaces.
+- Indentation of long lines is variable-aligned or expression-aligned (see "long line wrapping")
+- Conditional defines are always placed on column 1. This is also true for nested defines.
+- Maximum line length is 120 characters. This departs from the often-used 80-character limit which is rooted in the archaic use of 80-column text terminals and should no longer apply in this day. Github, our chief web VCS, has no issues dealing with 120 character lines either.
+- Variables passed to functions are passed on one line unless the line would exceed the maximum length, in which case variables will be passed 1-per-line, expression-aligned (see "long line wrapping").
+- Avoid trailing commas.
+- Comment blocks are line-quoted if they appear within functions.
+- Comment blocks are block-quoted if they appear outside of functions (e.g. as function definition headers).
+
+## C and C++
+Applies to `*.c`, `*.cc`, `*.cpp` and `*.h`. Potentially also `*.mm` for Mac code.
+### General formatting guidelines
+- Place function return types, including modifiers like `static` on the same line as the function signature.
+ ```C++
+ static bool somefunction(int var1, char* var2) {
+ ...
+ }
+ ```
+- When using templates, do not add spaces between the template name and its object.
+ ```C++
+ nsCOMPtr<nsISomeInterfaceType>
+ ```
+- Use braces, even for single-command lines. Avoid placing executed code on the expression line or using single-line indentation to indicate the scope. Always brace executed code.
+
+ WRONG:
+ ```C++
+ if (a == b) do_something();
+ if (a == b)
+ do_something();
+ if (a == b) { do_something(); }
+ ```
+ CORRECT:
+ ```C++
+ if (a == b) {
+ do_something();
+ }
+ ```
+- Pointer types: When declaring pointer types, place the `*` with the pointer type. When referencing pointer types, place `*` or `&` with the variable. Do not use `*` by itself with whitespace. Some existing modules still use the `int *myvar1;` style, these should be converted. Until conversion is done, follow existing, surrounding code style or convert it when you touch a file.
+
+ WRONG:
+ ```C++
+ int * myvar;
+ int *myvar1, *myvar2;
+ int* myvar1, *myvar2;
+ int* myvar1, myvar2; //myvar2 isn't a pointer!
+ ```
+ CORRECT:
+ ```C++
+ char* somePointer;
+ int* myvar1;
+ int* myvar2;
+ function a(char* somePointer) [...]
+ myString = *somePointer;
+ myPointer = &myString;
+ ```
+
+### Flow control
+Flow control expressions should follow the following guidelines:
+- Scopes have their opening braces on the expression line
+- Scopes have their closing braces on a separate line, indent-aligned with the flow control expression
+- Any alternative flow control paths are generally started with an expression on the closing brace line
+- Case statements are indented by 2 on a new line with the case expression on its own line.
+- Flow control default scopes are always placed at the bottom.
+#### if..else
+`if..else` statements example:
+```C++
+if (something == somethingelse) {
+ true_case_code here;
+} else {
+ false_case_code here;
+}
+
+if (case1) {
+ case1_code here;
+} else if (case2) {
+ case2_code here;
+} else {
+ other_case_code here;
+}
+
+if (case1) {
+ case1_code here;
+} else {
+ if (case2) {
+ case2_code here;
+ }
+ case2_and_other_code here;
+}
+```
+#### for
+`for` loop example:
+```C++
+for (i = 1; i < max; i++) {
+ loop_code here;
+}
+```
+#### while
+`while` loop example:
+```C++
+while (something == true) {
+ loop_code here;
+}
+```
+#### switch..case
+`switch..case` flow control example:
+```C++
+switch (variable) {
+ case value1:
+ // Comment describing 1
+ code_for_1;
+ code_for_1;
+ break;
+ case value2:
+ code_for_2;
+ code_for_2;
+ // fallthrough
+ case value3:
+ case value4:
+ code_for_3_and_4;
+ break;
+ default:
+ code_for_default;
+ code_for_default;
+}
+```
+### Classes
+Classes have some special formatting rules applied to them:
+- Classes follow the following sequence: CTOR, DTOR, methods, variables
+- Class CTOR variable initializers (in lieu of assignments in the CTOR body) are listed one-per-line with a leading comma (or colon for the first).
+- `public`, `private` and `protected` keywords are not indented and are at the same indentation level as the class identifier statement.
+
+Example class definition:
+```C++
+class FocusClassExample : public Runnable {
+public:
+ FocusClassExample(nsISupports* aTarget,
+ EventMessage aEventMessage,
+ nsPresContext* aContext,
+ nsPIDOMWindowOuter* aOriginalFocusedWindow,
+ nsIContent* aOriginalFocusedContent,
+ EventTarget* aRelatedTarget)
+ : mTarget(aTarget)
+ , mContext(aContext)
+ , mEventMessage(aEventMessage)
+ , mOriginalFocusedWindow(aOriginalFocusedWindow)
+ , mOriginalFocusedContent(aOriginalFocusedContent)
+ , mRelatedTarget(aRelatedTarget) {
+ CTOR_initializer_code here
+ }
+
+ ~FocusClassExample {
+ DTOR_code here
+ }
+
+ NS_IMETHOD Run() override {
+ nsCOMPtr<nsIContent> originalWindowFocus = mOriginalFocusedWindow ?
+ mOriginalFocusedWindow->GetFocusedNode() :
+ nullptr;
+ // Blink does not check that focus is the same after blur, but WebKit does.
+ // Opt to follow Blink's behavior (see bug 687787).
+ if (mEventMessage == eFocusOut || originalWindowFocus == mOriginalFocusedContent) {
+ InternalFocusEvent event(true, mEventMessage);
+ event.mFlags.mBubbles = true;
+ event.mFlags.mCancelable = false;
+ event.mRelatedTarget = mRelatedTarget;
+ return EventDispatcher::Dispatch(mTarget, mContext, &event);
+ }
+ return NS_OK;
+ }
+
+ nsCOMPtr<nsISupports> mTarget;
+ RefPtr<nsPresContext> mContext;
+private:
+ EventMessage mEventMessage;
+ nsCOMPtr<nsPIDOMWindowOuter> mOriginalFocusedWindow;
+ nsCOMPtr<nsIContent> mOriginalFocusedContent;
+ nsCOMPtr<EventTarget> mRelatedTarget;
+};
+```
+### Long line wrapping
+If statements on a single line become overly long, they should be split into multiple lines:
+- Binary operators (including ternary) must be left on their original lines if the line break happens around the operator. The second line should start in the same column as the start of the expression in the first line.
+- Lists of variables (e.g. when calling or declaring a function) should be split so variables are listed one-per-line, where second and subsequent lines start in the same column as the first variable listed, even if more than one variable would fit on the line segment until the wrapping column.
+
+WRONG:
+```C++
+somelongnamespace::somelongfunction(var1, var2, var3,
+ var4, var5);
+somelongnamespace::somelongfunction(
+ var1, var2, var3, var4, var5);
+if (somelongvariable == somelongothervariable
+ || somelongvariable2 == somelongothervariable2) {
+somelongvariable = somelongexpression ? somevalue1
+ : somevalue2;
+```
+CORRECT:
+```C++
+somelongnamespace::somelongfunction(var1,
+ var2,
+ var3,
+ var4,
+ var5);
+if (somelongvariable == somelongothervariable ||
+ somelongvariable2 == somelongothervariable2) {
+somelongvariable = somelongexpression ?
+ somevalue1 :
+ somevalue2;
+```
+
+## JavaScript
+Applies to `*.js` and `*.jsm`.
+## XUL and other XML-derivatives
+Applies to `*.xul`, `*.html`, `*.xhtml`.
+## IDL
+Applies to `*.idl`, `*.xpidl` and `*.webidl`.
+
+<!--stackedit_data:
+eyJoaXN0b3J5IjpbMjUzODYzMzMsMjg5MjUwODIsLTQzMjMzNz
+ExMSw4MzQ2MjYwNDksLTE5MDMyNzE5OTYsLTEwMTIwMjc3ODMs
+LTE4MzgzODM5MDIsODA5MjEzNTEyLC01Mzg0MjM4MDAsMzgyNj
+I3NDYzLDIwODYwMjIwODUsLTE1MjU5MjE2MjIsLTY1OTMzMTA0
+MCwtNzQwOTE5MDQ1LDE4Njc1NTQxNDJdfQ==
+--> \ No newline at end of file
diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
index e6fa5a200..7f8a693cc 100644
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -27,7 +27,6 @@
#include "mozilla/Preferences.h"
#include "mozilla/Services.h"
#include "mozilla/StartupTimeline.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/Unused.h"
#include "Navigator.h"
#include "URIUtils.h"
@@ -194,7 +193,6 @@
#include "nsSandboxFlags.h"
#include "nsXULAppAPI.h"
#include "nsDOMNavigationTiming.h"
-#include "nsISecurityUITelemetry.h"
#include "nsIAppsService.h"
#include "nsDSURIContentListener.h"
#include "nsDocShellLoadTypes.h"
@@ -4985,15 +4983,6 @@ nsDocShell::DisplayLoadError(nsresult aError, nsIURI* aURI,
cssClass.AssignLiteral("badStsCert");
}
- uint32_t bucketId;
- if (isStsHost) {
- // measuring STS separately allows us to measure click through
- // rates easily
- bucketId = nsISecurityUITelemetry::WARNING_BAD_CERT_TOP_STS;
- } else {
- bucketId = nsISecurityUITelemetry::WARNING_BAD_CERT_TOP;
- }
-
// See if an alternate cert error page is registered
nsAdoptingCString alternateErrorPage =
Preferences::GetCString("security.alternate_certificate_error_page");
@@ -5021,23 +5010,12 @@ nsDocShell::DisplayLoadError(nsresult aError, nsIURI* aURI,
errorPage.Assign(alternateErrorPage);
}
- uint32_t bucketId;
- bool sendTelemetry = false;
if (NS_ERROR_PHISHING_URI == aError) {
- sendTelemetry = true;
error.AssignLiteral("deceptiveBlocked");
- bucketId = IsFrame() ? nsISecurityUITelemetry::WARNING_PHISHING_PAGE_FRAME
- : nsISecurityUITelemetry::WARNING_PHISHING_PAGE_TOP;
} else if (NS_ERROR_MALWARE_URI == aError) {
- sendTelemetry = true;
error.AssignLiteral("malwareBlocked");
- bucketId = IsFrame() ? nsISecurityUITelemetry::WARNING_MALWARE_PAGE_FRAME
- : nsISecurityUITelemetry::WARNING_MALWARE_PAGE_TOP;
} else if (NS_ERROR_UNWANTED_URI == aError) {
- sendTelemetry = true;
error.AssignLiteral("unwantedBlocked");
- bucketId = IsFrame() ? nsISecurityUITelemetry::WARNING_UNWANTED_PAGE_FRAME
- : nsISecurityUITelemetry::WARNING_UNWANTED_PAGE_TOP;
}
cssClass.AssignLiteral("blacklist");
diff --git a/dom/animation/AnimationEffectReadOnly.cpp b/dom/animation/AnimationEffectReadOnly.cpp
index bf2e2197d..63d633c2f 100644
--- a/dom/animation/AnimationEffectReadOnly.cpp
+++ b/dom/animation/AnimationEffectReadOnly.cpp
@@ -23,7 +23,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(AnimationEffectReadOnly)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument, mTiming, mAnimation)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(AnimationEffectReadOnly)
diff --git a/dom/animation/AnimationTimeline.cpp b/dom/animation/AnimationTimeline.cpp
index 643106807..f4a1ecc9a 100644
--- a/dom/animation/AnimationTimeline.cpp
+++ b/dom/animation/AnimationTimeline.cpp
@@ -21,7 +21,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(AnimationTimeline)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow, mAnimations)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(AnimationTimeline)
diff --git a/dom/base/Attr.cpp b/dom/base/Attr.cpp
index 6eb3b49fd..71b559392 100644
--- a/dom/base/Attr.cpp
+++ b/dom/base/Attr.cpp
@@ -59,8 +59,6 @@ Attr::Attr(nsDOMAttributeMap *aAttrMap,
NS_IMPL_CYCLE_COLLECTION_CLASS(Attr)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Attr)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
-
if (!nsINode::Traverse(tmp, cb)) {
return NS_SUCCESS_INTERRUPTED_TRAVERSE;
}
diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp
index 00ee3d42f..3f202d33b 100644
--- a/dom/base/CustomElementRegistry.cpp
+++ b/dom/base/CustomElementRegistry.cpp
@@ -138,7 +138,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CustomElementRegistry)
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWhenDefinedPromiseMap)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(CustomElementRegistry)
diff --git a/dom/base/DOMException.cpp b/dom/base/DOMException.cpp
index dfda47316..9fbb2f242 100644
--- a/dom/base/DOMException.cpp
+++ b/dom/base/DOMException.cpp
@@ -165,7 +165,6 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(Exception)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Exception)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLocation)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mData)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(Exception)
diff --git a/dom/base/DOMIntersectionObserver.cpp b/dom/base/DOMIntersectionObserver.cpp
index e39abf1a6..389b93071 100644
--- a/dom/base/DOMIntersectionObserver.cpp
+++ b/dom/base/DOMIntersectionObserver.cpp
@@ -43,16 +43,17 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(DOMIntersectionObserver)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
+ tmp->Disconnect();
NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwner)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocument)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mCallback)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mRoot)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mQueuedEntries)
- tmp->Disconnect();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMIntersectionObserver)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCallback)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRoot)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mQueuedEntries)
@@ -153,30 +154,34 @@ DOMIntersectionObserver::Observe(Element& aTarget)
return;
}
aTarget.RegisterIntersectionObserver(this);
- mObservationTargets.PutEntry(&aTarget);
+ mObservationTargets.AppendElement(&aTarget);
Connect();
}
void
DOMIntersectionObserver::Unobserve(Element& aTarget)
{
- if (UnlinkTarget(aTarget)) {
- aTarget.UnregisterIntersectionObserver(this);
+ if (!mObservationTargets.Contains(&aTarget)) {
+ // You're not on the list, buddy!
+ return;
}
+
+ if (mObservationTargets.Length() == 1) {
+ Disconnect();
+ return;
+ }
+
+ mObservationTargets.RemoveElement(&aTarget);
+ aTarget.UnregisterIntersectionObserver(this);
}
-bool
+void
DOMIntersectionObserver::UnlinkTarget(Element& aTarget)
{
- if (!mObservationTargets.Contains(&aTarget)) {
- return false;
- }
- if (mObservationTargets.Count() == 1) {
- Disconnect();
- return false;
- }
- mObservationTargets.RemoveEntry(&aTarget);
- return true;
+ mObservationTargets.RemoveElement(&aTarget);
+ if (mObservationTargets.Length() == 0) {
+ Disconnect();
+ }
}
void
@@ -185,10 +190,11 @@ DOMIntersectionObserver::Connect()
if (mConnected) {
return;
}
+
mConnected = true;
-
- nsIDocument* document = mOwner->GetExtantDoc();
- document->AddIntersectionObserver(this);
+ if (mDocument) {
+ mDocument->AddIntersectionObserver(this);
+ }
}
void
@@ -197,18 +203,17 @@ DOMIntersectionObserver::Disconnect()
if (!mConnected) {
return;
}
- for (auto iter = mObservationTargets.Iter(); !iter.Done(); iter.Next()) {
- Element* target = iter.Get()->GetKey();
+
+ mConnected = false;
+
+ for (size_t i = 0; i < mObservationTargets.Length(); ++i) {
+ Element* target = mObservationTargets.ElementAt(i);
target->UnregisterIntersectionObserver(this);
}
mObservationTargets.Clear();
- if (mOwner) {
- nsIDocument* document = mOwner->GetExtantDoc();
- if (document) {
- document->RemoveIntersectionObserver(this);
- }
+ if (mDocument) {
+ mDocument->RemoveIntersectionObserver(this);
}
- mConnected = false;
}
void
@@ -269,17 +274,21 @@ DOMIntersectionObserver::Update(nsIDocument* aDocument, DOMHighResTimeStamp time
root = mRoot;
rootFrame = root->GetPrimaryFrame();
if (rootFrame) {
+ nsRect rootRectRelativeToRootFrame;
if (rootFrame->GetType() == nsGkAtoms::scrollFrame) {
+ // rootRectRelativeToRootFrame should be the content rect of rootFrame, not including the scrollbars.
nsIScrollableFrame* scrollFrame = do_QueryFrame(rootFrame);
- rootRect = nsLayoutUtils::TransformFrameRectToAncestor(
- rootFrame,
- rootFrame->GetContentRectRelativeToSelf(),
- scrollFrame->GetScrolledFrame());
+ rootRectRelativeToRootFrame = scrollFrame->GetScrollPortRect();
} else {
- rootRect = nsLayoutUtils::GetAllInFlowRectsUnion(rootFrame,
- nsLayoutUtils::GetContainingBlockForClientRect(rootFrame),
- nsLayoutUtils::RECTS_ACCOUNT_FOR_TRANSFORMS);
+ // rootRectRelativeToRootFrame should be the border rect of rootFrame.
+ rootRectRelativeToRootFrame = rootFrame->GetRectRelativeToSelf();
}
+ nsIFrame* containingBlock =
+ nsLayoutUtils::GetContainingBlockForClientRect(rootFrame);
+ rootRect =
+ nsLayoutUtils::TransformFrameRectToAncestor(rootFrame,
+ rootRectRelativeToRootFrame,
+ containingBlock);
}
} else {
nsCOMPtr<nsIPresShell> presShell = aDocument->GetShell();
@@ -288,12 +297,25 @@ DOMIntersectionObserver::Update(nsIDocument* aDocument, DOMHighResTimeStamp time
if (rootFrame) {
nsPresContext* presContext = rootFrame->PresContext();
while (!presContext->IsRootContentDocument()) {
- presContext = rootFrame->PresContext()->GetParentPresContext();
- rootFrame = presContext->PresShell()->GetRootScrollFrame();
+ // Walk up the tree
+ presContext = presContext->GetParentPresContext();
+ if (!presContext) {
+ break;
+ }
+ nsIFrame* rootScrollFrame = presContext->PresShell()->GetRootScrollFrame();
+ if (rootScrollFrame) {
+ rootFrame = rootScrollFrame;
+ } else {
+ break;
+ }
}
root = rootFrame->GetContent()->AsElement();
nsIScrollableFrame* scrollFrame = do_QueryFrame(rootFrame);
- rootRect = scrollFrame->GetScrollPortRect();
+ // If we end up with a null root frame for some reason, we'll proceed
+ // with an empty root intersection rect.
+ if (scrollFrame) {
+ rootRect = scrollFrame->GetScrollPortRect();
+ }
}
}
}
@@ -314,11 +336,12 @@ DOMIntersectionObserver::Update(nsIDocument* aDocument, DOMHighResTimeStamp time
rootMargin.Side(side) = nsLayoutUtils::ComputeCBDependentValue(basis, coord);
}
- for (auto iter = mObservationTargets.Iter(); !iter.Done(); iter.Next()) {
- Element* target = iter.Get()->GetKey();
+ for (size_t i = 0; i < mObservationTargets.Length(); ++i) {
+ Element* target = mObservationTargets.ElementAt(i);
nsIFrame* targetFrame = target->GetPrimaryFrame();
nsRect targetRect;
Maybe<nsRect> intersectionRect;
+ bool isSameDoc = root && root->GetComposedDoc() == target->GetComposedDoc();
if (rootFrame && targetFrame) {
// If mRoot is set we are testing intersection with a container element
@@ -327,7 +350,7 @@ DOMIntersectionObserver::Update(nsIDocument* aDocument, DOMHighResTimeStamp time
// Skip further processing of this target if it is not in the same
// Document as the intersection root, e.g. if root is an element of
// the main document and target an element from an embedded iframe.
- if (target->GetComposedDoc() != root->GetComposedDoc()) {
+ if (!isSameDoc) {
continue;
}
// Skip further processing of this target if is not a descendant of the
@@ -344,7 +367,7 @@ DOMIntersectionObserver::Update(nsIDocument* aDocument, DOMHighResTimeStamp time
nsLayoutUtils::GetContainingBlockForClientRect(targetFrame),
nsLayoutUtils::RECTS_ACCOUNT_FOR_TRANSFORMS
);
- intersectionRect = Some(targetFrame->GetVisualOverflowRect());
+ intersectionRect = Some(targetFrame->GetRectRelativeToSelf());
nsIFrame* containerFrame = nsLayoutUtils::GetCrossDocParentFrame(targetFrame);
while (containerFrame && containerFrame != rootFrame) {
@@ -399,29 +422,37 @@ DOMIntersectionObserver::Update(nsIDocument* aDocument, DOMHighResTimeStamp time
intersectionRectRelativeToRoot,
rootIntersectionRect
);
- if (intersectionRect.isSome()) {
- intersectionRect = Some(nsLayoutUtils::TransformFrameRectToAncestor(
- nsLayoutUtils::GetContainingBlockForClientRect(rootFrame),
- intersectionRect.value(),
- targetFrame->PresContext()->PresShell()->GetRootScrollFrame()
- ));
+ if (intersectionRect.isSome() && !isSameDoc) {
+ nsRect rect = intersectionRect.value();
+ nsPresContext* presContext = targetFrame->PresContext();
+ nsLayoutUtils::TransformRect(rootFrame,
+ presContext->PresShell()->GetRootScrollFrame(), rect);
+ intersectionRect = Some(rect);
}
}
- double targetArea = targetRect.width * targetRect.height;
- double intersectionArea = !intersectionRect ?
- 0 : intersectionRect->width * intersectionRect->height;
- double intersectionRatio = targetArea > 0.0 ? intersectionArea / targetArea : 0.0;
+ int64_t targetArea =
+ (int64_t) targetRect.Width() * (int64_t) targetRect.Height();
+ int64_t intersectionArea = !intersectionRect ? 0 :
+ (int64_t) intersectionRect->Width() *
+ (int64_t) intersectionRect->Height();
+
+ double intersectionRatio;
+ if (targetArea > 0.0) {
+ intersectionRatio = (double) intersectionArea / (double) targetArea;
+ } else {
+ intersectionRatio = intersectionRect.isSome() ? 1.0 : 0.0;
+ }
- size_t threshold = -1;
+ int32_t threshold = -1;
if (intersectionRatio > 0.0) {
if (intersectionRatio >= 1.0) {
intersectionRatio = 1.0;
- threshold = mThresholds.Length();
+ threshold = (int32_t)mThresholds.Length();
} else {
for (size_t k = 0; k < mThresholds.Length(); ++k) {
if (mThresholds[k] <= intersectionRatio) {
- threshold = k + 1;
+ threshold = (int32_t)k + 1;
} else {
break;
}
@@ -468,6 +499,7 @@ DOMIntersectionObserver::QueueIntersectionObserverEntry(Element* aTarget,
rootBounds.forget(),
boundingClientRect.forget(),
intersectionRect.forget(),
+ aIntersectionRect.isSome(),
aTarget, aIntersectionRatio);
mQueuedEntries.AppendElement(entry.forget());
}
@@ -480,7 +512,7 @@ DOMIntersectionObserver::Notify()
}
mozilla::dom::Sequence<mozilla::OwningNonNull<DOMIntersectionObserverEntry>> entries;
if (entries.SetCapacity(mQueuedEntries.Length(), mozilla::fallible)) {
- for (uint32_t i = 0; i < mQueuedEntries.Length(); ++i) {
+ for (size_t i = 0; i < mQueuedEntries.Length(); ++i) {
RefPtr<DOMIntersectionObserverEntry> next = mQueuedEntries[i];
*entries.AppendElement(mozilla::fallible) = next;
}
diff --git a/dom/base/DOMIntersectionObserver.h b/dom/base/DOMIntersectionObserver.h
index 8144fc5c5..8674fe25d 100644
--- a/dom/base/DOMIntersectionObserver.h
+++ b/dom/base/DOMIntersectionObserver.h
@@ -30,6 +30,7 @@ public:
RefPtr<DOMRect> aRootBounds,
RefPtr<DOMRect> aBoundingClientRect,
RefPtr<DOMRect> aIntersectionRect,
+ bool aIsIntersecting,
Element* aTarget,
double aIntersectionRatio)
: mOwner(aOwner),
@@ -37,6 +38,7 @@ public:
mRootBounds(aRootBounds),
mBoundingClientRect(aBoundingClientRect),
mIntersectionRect(aIntersectionRect),
+ mIsIntersecting(aIsIntersecting),
mTarget(aTarget),
mIntersectionRatio(aIntersectionRatio)
{
@@ -74,6 +76,11 @@ public:
return mIntersectionRect;
}
+ bool IsIntersecting()
+ {
+ return mIsIntersecting;
+ }
+
double IntersectionRatio()
{
return mIntersectionRatio;
@@ -90,6 +97,7 @@ protected:
RefPtr<DOMRect> mRootBounds;
RefPtr<DOMRect> mBoundingClientRect;
RefPtr<DOMRect> mIntersectionRect;
+ bool mIsIntersecting;
RefPtr<Element> mTarget;
double mIntersectionRatio;
};
@@ -101,12 +109,17 @@ protected:
class DOMIntersectionObserver final : public nsISupports,
public nsWrapperCache
{
- virtual ~DOMIntersectionObserver() { }
+ virtual ~DOMIntersectionObserver() {
+ Disconnect();
+ }
public:
DOMIntersectionObserver(already_AddRefed<nsPIDOMWindowInner>&& aOwner,
mozilla::dom::IntersectionCallback& aCb)
- : mOwner(aOwner), mCallback(&aCb), mConnected(false)
+ : mOwner(aOwner)
+ , mDocument(mOwner->GetExtantDoc())
+ , mCallback(&aCb)
+ , mConnected(false)
{
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
@@ -142,7 +155,7 @@ public:
void Observe(Element& aTarget);
void Unobserve(Element& aTarget);
- bool UnlinkTarget(Element& aTarget);
+ void UnlinkTarget(Element& aTarget);
void Disconnect();
void TakeRecords(nsTArray<RefPtr<DOMIntersectionObserverEntry>>& aRetVal);
@@ -164,11 +177,15 @@ protected:
double aIntersectionRatio);
nsCOMPtr<nsPIDOMWindowInner> mOwner;
+ RefPtr<nsIDocument> mDocument;
RefPtr<mozilla::dom::IntersectionCallback> mCallback;
RefPtr<Element> mRoot;
nsCSSRect mRootMargin;
nsTArray<double> mThresholds;
- nsTHashtable<nsPtrHashKey<Element>> mObservationTargets;
+
+ // Holds raw pointers which are explicitly cleared by UnlinkTarget().
+ nsTArray<Element*> mObservationTargets;
+
nsTArray<RefPtr<DOMIntersectionObserverEntry>> mQueuedEntries;
bool mConnected;
};
diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp
index 3760dc43f..5c3277e84 100644
--- a/dom/base/Element.cpp
+++ b/dom/base/Element.cpp
@@ -687,19 +687,23 @@ Element::GetScrollFrame(nsIFrame **aStyledFrame, bool aFlushLayout)
}
void
-Element::ScrollIntoView()
+Element::ScrollIntoView(const BooleanOrScrollIntoViewOptions& aObject)
{
- ScrollIntoView(ScrollIntoViewOptions());
-}
+ if (aObject.IsScrollIntoViewOptions()) {
+ return ScrollIntoView(aObject.GetAsScrollIntoViewOptions());
+ }
+
+ MOZ_DIAGNOSTIC_ASSERT(aObject.IsBoolean());
-void
-Element::ScrollIntoView(bool aTop)
-{
ScrollIntoViewOptions options;
- if (!aTop) {
+ if (aObject.GetAsBoolean()) {
+ options.mBlock = ScrollLogicalPosition::Start;
+ options.mInline = ScrollLogicalPosition::Nearest;
+ } else {
options.mBlock = ScrollLogicalPosition::End;
+ options.mInline = ScrollLogicalPosition::Nearest;
}
- ScrollIntoView(options);
+ return ScrollIntoView(options);
}
void
@@ -716,9 +720,41 @@ Element::ScrollIntoView(const ScrollIntoViewOptions &aOptions)
return;
}
- int16_t vpercent = (aOptions.mBlock == ScrollLogicalPosition::Start)
- ? nsIPresShell::SCROLL_TOP
- : nsIPresShell::SCROLL_BOTTOM;
+ int16_t vpercent = nsIPresShell::SCROLL_CENTER;
+ switch (aOptions.mBlock) {
+ case ScrollLogicalPosition::Start:
+ vpercent = nsIPresShell::SCROLL_TOP;
+ break;
+ case ScrollLogicalPosition::Center:
+ vpercent = nsIPresShell::SCROLL_CENTER;
+ break;
+ case ScrollLogicalPosition::End:
+ vpercent = nsIPresShell::SCROLL_BOTTOM;
+ break;
+ case ScrollLogicalPosition::Nearest:
+ vpercent = nsIPresShell::SCROLL_MINIMUM;
+ break;
+ default:
+ MOZ_ASSERT_UNREACHABLE("Unexpected ScrollLogicalPosition value");
+ }
+
+ int16_t hpercent = nsIPresShell::SCROLL_CENTER;
+ switch (aOptions.mInline) {
+ case ScrollLogicalPosition::Start:
+ hpercent = nsIPresShell::SCROLL_LEFT;
+ break;
+ case ScrollLogicalPosition::Center:
+ hpercent = nsIPresShell::SCROLL_CENTER;
+ break;
+ case ScrollLogicalPosition::End:
+ hpercent = nsIPresShell::SCROLL_RIGHT;
+ break;
+ case ScrollLogicalPosition::Nearest:
+ hpercent = nsIPresShell::SCROLL_MINIMUM;
+ break;
+ default:
+ MOZ_ASSERT_UNREACHABLE("Unexpected ScrollLogicalPosition value");
+ }
uint32_t flags = nsIPresShell::SCROLL_OVERFLOW_HIDDEN;
if (aOptions.mBehavior == ScrollBehavior::Smooth) {
@@ -731,7 +767,9 @@ Element::ScrollIntoView(const ScrollIntoViewOptions &aOptions)
nsIPresShell::ScrollAxis(
vpercent,
nsIPresShell::SCROLL_ALWAYS),
- nsIPresShell::ScrollAxis(),
+ nsIPresShell::ScrollAxis(
+ hpercent,
+ nsIPresShell::SCROLL_ALWAYS),
flags);
}
@@ -3947,7 +3985,7 @@ Element::ClearDataset()
slots->mDataset = nullptr;
}
-nsDataHashtable<nsPtrHashKey<DOMIntersectionObserver>, int32_t>*
+nsDataHashtable<nsRefPtrHashKey<DOMIntersectionObserver>, int32_t>*
Element::RegisteredIntersectionObservers()
{
nsDOMSlots* slots = DOMSlots();
@@ -3962,7 +4000,7 @@ enum nsPreviousIntersectionThreshold {
void
Element::RegisterIntersectionObserver(DOMIntersectionObserver* aObserver)
{
- nsDataHashtable<nsPtrHashKey<DOMIntersectionObserver>, int32_t>* observers =
+ nsDataHashtable<nsRefPtrHashKey<DOMIntersectionObserver>, int32_t>* observers =
RegisteredIntersectionObservers();
if (observers->Contains(aObserver)) {
return;
@@ -3979,7 +4017,7 @@ Element::RegisterIntersectionObserver(DOMIntersectionObserver* aObserver)
void
Element::UnregisterIntersectionObserver(DOMIntersectionObserver* aObserver)
{
- nsDataHashtable<nsPtrHashKey<DOMIntersectionObserver>, int32_t>* observers =
+ nsDataHashtable<nsRefPtrHashKey<DOMIntersectionObserver>, int32_t>* observers =
RegisteredIntersectionObservers();
observers->Remove(aObserver);
}
@@ -3987,7 +4025,7 @@ Element::UnregisterIntersectionObserver(DOMIntersectionObserver* aObserver)
bool
Element::UpdateIntersectionObservation(DOMIntersectionObserver* aObserver, int32_t aThreshold)
{
- nsDataHashtable<nsPtrHashKey<DOMIntersectionObserver>, int32_t>* observers =
+ nsDataHashtable<nsRefPtrHashKey<DOMIntersectionObserver>, int32_t>* observers =
RegisteredIntersectionObservers();
if (!observers->Contains(aObserver)) {
return false;
diff --git a/dom/base/Element.h b/dom/base/Element.h
index c269ab14a..ce84b74fb 100644
--- a/dom/base/Element.h
+++ b/dom/base/Element.h
@@ -818,9 +818,10 @@ public:
return slots ? slots->mShadowRoot.get() : nullptr;
}
- void ScrollIntoView();
- void ScrollIntoView(bool aTop);
+private:
void ScrollIntoView(const ScrollIntoViewOptions &aOptions);
+public:
+ void ScrollIntoView(const BooleanOrScrollIntoViewOptions& aObject);
void Scroll(double aXScroll, double aYScroll);
void Scroll(const ScrollToOptions& aOptions);
void ScrollTo(double aXScroll, double aYScroll);
@@ -1382,7 +1383,8 @@ protected:
nsDOMTokenList* GetTokenList(nsIAtom* aAtom,
const DOMTokenListSupportedTokenArray aSupportedTokens = nullptr);
- nsDataHashtable<nsPtrHashKey<DOMIntersectionObserver>, int32_t>* RegisteredIntersectionObservers();
+ nsDataHashtable<nsRefPtrHashKey<DOMIntersectionObserver>, int32_t>*
+ RegisteredIntersectionObservers();
private:
/**
diff --git a/dom/base/File.cpp b/dom/base/File.cpp
index 7d86dfe8a..1d5ab73e7 100755
--- a/dom/base/File.cpp
+++ b/dom/base/File.cpp
@@ -138,7 +138,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Blob)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mParent)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(Blob)
diff --git a/dom/base/FormData.cpp b/dom/base/FormData.cpp
index 6095286be..52bdd9210 100644
--- a/dom/base/FormData.cpp
+++ b/dom/base/FormData.cpp
@@ -84,7 +84,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(FormData)
"mFormData[i].GetAsBlob()", 0);
}
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(FormData)
diff --git a/dom/base/FragmentOrElement.cpp b/dom/base/FragmentOrElement.cpp
index fde983e7c..9106778df 100644
--- a/dom/base/FragmentOrElement.cpp
+++ b/dom/base/FragmentOrElement.cpp
@@ -585,6 +585,12 @@ FragmentOrElement::nsDOMSlots::Traverse(nsCycleCollectionTraversalCallback &cb,
mCustomElementData->mCallbackQueue[i]->Traverse(cb);
}
}
+
+ for (auto iter = mRegisteredIntersectionObservers.Iter(); !iter.Done(); iter.Next()) {
+ DOMIntersectionObserver* observer = iter.Key();
+ NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mSlots->mRegisteredIntersectionObservers[i]");
+ cb.NoteXPCOMChild(observer);
+ }
}
void
@@ -1872,10 +1878,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(FragmentOrElement)
NS_IMPL_CYCLE_COLLECTION_DESCRIBE(FragmentOrElement, tmp->mRefCnt.get())
}
- // Always need to traverse script objects, so do that before we check
- // if we're uncollectable.
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
-
if (!nsINode::Traverse(tmp, cb)) {
return NS_SUCCESS_INTERRUPTED_TRAVERSE;
}
diff --git a/dom/base/FragmentOrElement.h b/dom/base/FragmentOrElement.h
index 7c74e9cd4..f0cc29f22 100644
--- a/dom/base/FragmentOrElement.h
+++ b/dom/base/FragmentOrElement.h
@@ -354,7 +354,8 @@ public:
/**
* Registered Intersection Observers on the element.
*/
- nsDataHashtable<nsPtrHashKey<DOMIntersectionObserver>, int32_t> mRegisteredIntersectionObservers;
+ nsDataHashtable<nsRefPtrHashKey<DOMIntersectionObserver>, int32_t>
+ mRegisteredIntersectionObservers;
};
protected:
diff --git a/dom/base/Location.cpp b/dom/base/Location.cpp
index e312cffe0..3a39a9e66 100644
--- a/dom/base/Location.cpp
+++ b/dom/base/Location.cpp
@@ -80,7 +80,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Location)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mInnerWindow)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(Location)
diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp
index 286cd0e79..fdf151b6c 100644
--- a/dom/base/Navigator.cpp
+++ b/dom/base/Navigator.cpp
@@ -223,7 +223,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Navigator)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGamepadServiceTest)
#endif
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mVRGetDisplaysPromises)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(Navigator)
diff --git a/dom/base/Pose.cpp b/dom/base/Pose.cpp
index 1eab4c173..5bc4ca6de 100644
--- a/dom/base/Pose.cpp
+++ b/dom/base/Pose.cpp
@@ -26,7 +26,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Pose)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mParent)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(Pose)
diff --git a/dom/base/ProcessGlobal.cpp b/dom/base/ProcessGlobal.cpp
index 641f49f98..6cd29ab7c 100644
--- a/dom/base/ProcessGlobal.cpp
+++ b/dom/base/ProcessGlobal.cpp
@@ -52,7 +52,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(ProcessGlobal)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMessageManager)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal)
tmp->TraverseHostObjectURIs(cb);
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ProcessGlobal)
diff --git a/dom/base/nsContentList.cpp b/dom/base/nsContentList.cpp
index 43e65777d..c98859ee3 100644
--- a/dom/base/nsContentList.cpp
+++ b/dom/base/nsContentList.cpp
@@ -54,7 +54,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsBaseContentList)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsBaseContentList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mElements)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(nsBaseContentList)
diff --git a/dom/base/nsDOMAttributeMap.cpp b/dom/base/nsDOMAttributeMap.cpp
index 381f267cd..2a90df7e4 100644
--- a/dom/base/nsDOMAttributeMap.cpp
+++ b/dom/base/nsDOMAttributeMap.cpp
@@ -65,7 +65,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDOMAttributeMap)
for (auto iter = tmp->mAttributeCache.Iter(); !iter.Done(); iter.Next()) {
cb.NoteXPCOMChild(static_cast<nsINode*>(iter.Data().get()));
}
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mContent)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/base/nsDOMMutationObserver.cpp b/dom/base/nsDOMMutationObserver.cpp
index 024ce5e2e..858a30ce5 100644
--- a/dom/base/nsDOMMutationObserver.cpp
+++ b/dom/base/nsDOMMutationObserver.cpp
@@ -506,7 +506,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsDOMMutationObserver)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDOMMutationObserver)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mReceivers)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFirstPendingMutation)
diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp
index 291df5f27..2ab5937ac 100644
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -4033,8 +4033,6 @@ nsDOMWindowUtils::ForceUseCounterFlush(nsIDOMNode *aNode)
if (nsCOMPtr<nsIDocument> doc = do_QueryInterface(aNode)) {
mozilla::css::ImageLoader* loader = doc->StyleImageLoader();
loader->FlushUseCounters();
-
- static_cast<nsDocument*>(doc.get())->ReportUseCounters();
return NS_OK;
}
diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp
index ac9601caf..a6ed419df 100644
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -1395,63 +1395,6 @@ nsDocument::~nsDocument()
NS_ASSERTION(!mIsShowing, "Destroying a currently-showing document");
- if (IsTopLevelContentDocument()) {
- //don't report for about: pages
- if (!IsAboutPage()) {
- // Record the page load
- uint32_t pageLoaded = 1;
- Accumulate(Telemetry::MIXED_CONTENT_UNBLOCK_COUNTER, pageLoaded);
- // Record the mixed content status of the docshell in Telemetry
- enum {
- NO_MIXED_CONTENT = 0, // There is no Mixed Content on the page
- MIXED_DISPLAY_CONTENT = 1, // The page attempted to load Mixed Display Content
- MIXED_ACTIVE_CONTENT = 2, // The page attempted to load Mixed Active Content
- MIXED_DISPLAY_AND_ACTIVE_CONTENT = 3 // The page attempted to load Mixed Display & Mixed Active Content
- };
-
- bool mixedActiveLoaded = GetHasMixedActiveContentLoaded();
- bool mixedActiveBlocked = GetHasMixedActiveContentBlocked();
-
- bool mixedDisplayLoaded = GetHasMixedDisplayContentLoaded();
- bool mixedDisplayBlocked = GetHasMixedDisplayContentBlocked();
-
- bool hasMixedDisplay = (mixedDisplayBlocked || mixedDisplayLoaded);
- bool hasMixedActive = (mixedActiveBlocked || mixedActiveLoaded);
-
- uint32_t mixedContentLevel = NO_MIXED_CONTENT;
- if (hasMixedDisplay && hasMixedActive) {
- mixedContentLevel = MIXED_DISPLAY_AND_ACTIVE_CONTENT;
- } else if (hasMixedActive){
- mixedContentLevel = MIXED_ACTIVE_CONTENT;
- } else if (hasMixedDisplay) {
- mixedContentLevel = MIXED_DISPLAY_CONTENT;
- }
- Accumulate(Telemetry::MIXED_CONTENT_PAGE_LOAD, mixedContentLevel);
-
- // record mixed object subrequest telemetry
- if (mHasMixedContentObjectSubrequest) {
- /* mixed object subrequest loaded on page*/
- Accumulate(Telemetry::MIXED_CONTENT_OBJECT_SUBREQUEST, 1);
- } else {
- /* no mixed object subrequests loaded on page*/
- Accumulate(Telemetry::MIXED_CONTENT_OBJECT_SUBREQUEST, 0);
- }
-
- // record CSP telemetry on this document
- if (mHasCSP) {
- Accumulate(Telemetry::CSP_DOCUMENTS_COUNT, 1);
- }
- if (mHasUnsafeInlineCSP) {
- Accumulate(Telemetry::CSP_UNSAFE_INLINE_DOCUMENTS_COUNT, 1);
- }
- if (mHasUnsafeEvalCSP) {
- Accumulate(Telemetry::CSP_UNSAFE_EVAL_DOCUMENTS_COUNT, 1);
- }
- }
- }
-
- ReportUseCounters();
-
mInDestructor = true;
mInUnlinkOrDeletion = true;
@@ -1647,10 +1590,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsDocument)
NS_IMPL_CYCLE_COLLECTION_DESCRIBE(nsDocument, tmp->mRefCnt.get())
}
- // Always need to traverse script objects, so do that before we check
- // if we're uncollectable.
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
-
if (!nsINode::Traverse(tmp, cb)) {
return NS_SUCCESS_INTERRUPTED_TRAVERSE;
}
@@ -1736,8 +1675,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsDocument)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOnDemandBuiltInUASheets)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPreloadingImages)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mIntersectionObservers)
-
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSubImportLinks)
for (uint32_t i = 0; i < tmp->mFrameRequestCallbacks.Length(); ++i) {
@@ -12355,40 +12292,27 @@ nsIDocument::InlineScriptAllowedByCSP()
return allowsInlineScript;
}
-static bool
-MightBeAboutOrChromeScheme(nsIURI* aURI)
-{
- MOZ_ASSERT(aURI);
- bool isAbout = true;
- bool isChrome = true;
- aURI->SchemeIs("about", &isAbout);
- aURI->SchemeIs("chrome", &isChrome);
- return isAbout || isChrome;
-}
-
-void
-nsDocument::ReportUseCounters()
-{
-/* STUB */
-}
-
void
nsDocument::AddIntersectionObserver(DOMIntersectionObserver* aObserver)
{
- NS_ASSERTION(mIntersectionObservers.IndexOf(aObserver) == nsTArray<int>::NoIndex,
- "Intersection observer already in the list");
- mIntersectionObservers.AppendElement(aObserver);
+ MOZ_ASSERT(!mIntersectionObservers.Contains(aObserver),
+ "Intersection observer already in the list");
+ mIntersectionObservers.PutEntry(aObserver);
}
void
nsDocument::RemoveIntersectionObserver(DOMIntersectionObserver* aObserver)
{
- mIntersectionObservers.RemoveElement(aObserver);
+ mIntersectionObservers.RemoveEntry(aObserver);
}
void
nsDocument::UpdateIntersectionObservations()
{
+ if (mIntersectionObservers.IsEmpty()) {
+ return;
+ }
+
DOMHighResTimeStamp time = 0;
if (nsPIDOMWindowInner* window = GetInnerWindow()) {
Performance* perf = window->GetPerformance();
@@ -12396,25 +12320,42 @@ nsDocument::UpdateIntersectionObservations()
time = perf->Now();
}
}
- for (const auto& observer : mIntersectionObservers) {
- observer->Update(this, time);
+ nsTArray<RefPtr<DOMIntersectionObserver>> observers(mIntersectionObservers.Count());
+ for (auto iter = mIntersectionObservers.Iter(); !iter.Done(); iter.Next()) {
+ DOMIntersectionObserver* observer = iter.Get()->GetKey();
+ observers.AppendElement(observer);
+ }
+ for (const auto& observer : observers) {
+ if (observer) {
+ observer->Update(this, time);
+ }
}
}
void
nsDocument::ScheduleIntersectionObserverNotification()
{
+ if (mIntersectionObservers.IsEmpty()) {
+ return;
+ }
+
nsCOMPtr<nsIRunnable> notification = NewRunnableMethod(this,
&nsDocument::NotifyIntersectionObservers);
- NS_DispatchToCurrentThread(notification);
+ NS_DispatchToCurrentThread(notification.forget());
}
void
nsDocument::NotifyIntersectionObservers()
{
- nsTArray<RefPtr<DOMIntersectionObserver>> observers(mIntersectionObservers);
+ nsTArray<RefPtr<DOMIntersectionObserver>> observers(mIntersectionObservers.Count());
+ for (auto iter = mIntersectionObservers.Iter(); !iter.Done(); iter.Next()) {
+ DOMIntersectionObserver* observer = iter.Get()->GetKey();
+ observers.AppendElement(observer);
+ }
for (const auto& observer : observers) {
- observer->Notify();
+ if (observer) {
+ observer->Notify();
+ }
}
}
diff --git a/dom/base/nsDocument.h b/dom/base/nsDocument.h
index 3725b3c18..95fd57545 100644
--- a/dom/base/nsDocument.h
+++ b/dom/base/nsDocument.h
@@ -774,8 +774,6 @@ public:
virtual nsViewportInfo GetViewportInfo(const mozilla::ScreenIntSize& aDisplaySize) override;
- void ReportUseCounters();
-
virtual void AddIntersectionObserver(
mozilla::dom::DOMIntersectionObserver* aObserver) override;
virtual void RemoveIntersectionObserver(
@@ -1341,8 +1339,9 @@ protected:
// Array of observers
nsTObserverArray<nsIDocumentObserver*> mObservers;
- // Array of intersection observers
- nsTArray<RefPtr<mozilla::dom::DOMIntersectionObserver>> mIntersectionObservers;
+ // Hashtable of intersection observers
+ nsTHashtable<nsPtrHashKey<mozilla::dom::DOMIntersectionObserver>>
+ mIntersectionObservers;
// Tracker for animations that are waiting to start.
// nullptr until GetOrCreatePendingAnimationTracker is called.
@@ -1448,14 +1447,6 @@ public:
// 'style-sheet-applicable-state-changed' notification.
bool mSSApplicableStateNotificationPending:1;
- // Whether we have reported use counters for this document with Telemetry yet.
- // Normally this is only done at document destruction time, but for image
- // documents (SVG documents) that are not guaranteed to be destroyed, we
- // report use counters when the image cache no longer has any imgRequestProxys
- // pointing to them. We track whether we ever reported use counters so
- // that we only report them once for the document.
- bool mReportedUseCounters:1;
-
// Whether we have filled our pres shell's style set with the document's
// additional sheets and sheets from the nsStyleSheetService.
bool mStyleSetFilled:1;
diff --git a/dom/base/nsFrameMessageManager.cpp b/dom/base/nsFrameMessageManager.cpp
index f173678b7..bba4232aa 100644
--- a/dom/base/nsFrameMessageManager.cpp
+++ b/dom/base/nsFrameMessageManager.cpp
@@ -132,7 +132,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsFrameMessageManager)
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mChildManagers)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mParentManager)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsFrameMessageManager)
@@ -706,12 +705,6 @@ nsFrameMessageManager::SendRpcMessage(const nsAString& aMessageName,
static bool
AllowMessage(size_t aDataLength, const nsAString& aMessageName)
{
- static const size_t kMinTelemetryMessageSize = 8192;
-
- if (aDataLength < kMinTelemetryMessageSize) {
- return true;
- }
-
NS_ConvertUTF16toUTF8 messageName(aMessageName);
messageName.StripChars("0123456789");
diff --git a/dom/base/nsGenericDOMDataNode.cpp b/dom/base/nsGenericDOMDataNode.cpp
index 9688588e0..0ae15e09e 100644
--- a/dom/base/nsGenericDOMDataNode.cpp
+++ b/dom/base/nsGenericDOMDataNode.cpp
@@ -98,10 +98,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsGenericDOMDataNode)
NS_IMPL_CYCLE_COLLECTION_DESCRIBE(nsGenericDOMDataNode, tmp->mRefCnt.get())
}
- // Always need to traverse script objects, so do that before we check
- // if we're uncollectable.
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
-
if (!nsINode::Traverse(tmp, cb)) {
return NS_SUCCESS_INTERRUPTED_TRAVERSE;
}
diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp
index 677e1a0ea..ac85e34c0 100644
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -288,7 +288,6 @@ static bool gMouseDown = false;
static bool gDragServiceDisabled = false;
static FILE *gDumpFile = nullptr;
static uint32_t gSerialCounter = 0;
-static TimeStamp gLastRecordedRecentTimeouts;
#define STATISTICS_INTERVAL (30 * PR_MSEC_PER_SEC)
#ifdef DEBUG_jst
@@ -1518,7 +1517,6 @@ nsGlobalWindow::nsGlobalWindow(nsGlobalWindow *aOuterWindow)
mIsPopupSpam(false),
mBlockScriptedClosingFlag(false),
mWasOffline(false),
- mHasHadSlowScript(false),
mNotifyIdleObserversIdleOnThaw(false),
mNotifyIdleObserversActiveOnThaw(false),
mCreatingInnerWindow(false),
@@ -2286,7 +2284,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsGlobalWindow)
tmp->TraverseHostObjectURIs(cb);
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGlobalWindow)
@@ -11542,8 +11539,6 @@ nsGlobalWindow::ShowSlowScriptDialog()
unsigned lineno;
bool hasFrame = JS::DescribeScriptedCaller(cx, &filename, &lineno);
- mHasHadSlowScript = true;
-
if (XRE_IsContentProcess() &&
ProcessHangMonitor::Get()) {
ProcessHangMonitor::SlowScriptAction action;
@@ -13399,13 +13394,6 @@ nsGlobalWindow::RunTimeout(Timeout* aTimeout)
return;
}
- // Record telemetry information about timers set recently.
- TimeDuration recordingInterval = TimeDuration::FromMilliseconds(STATISTICS_INTERVAL);
- if (gLastRecordedRecentTimeouts.IsNull() ||
- now - gLastRecordedRecentTimeouts > recordingInterval) {
- gLastRecordedRecentTimeouts = now;
- }
-
// Insert a dummy timeout into the list of timeouts between the
// portion of the list that we are about to process now and those
// timeouts that will be processed in a future call to
diff --git a/dom/base/nsGlobalWindow.h b/dom/base/nsGlobalWindow.h
index 1cb825a77..1f420895c 100644
--- a/dom/base/nsGlobalWindow.h
+++ b/dom/base/nsGlobalWindow.h
@@ -1780,11 +1780,6 @@ protected:
// Window offline status. Checked to see if we need to fire offline event
bool mWasOffline : 1;
- // Represents whether the inner window's page has had a slow script notice.
- // Only used by inner windows; will always be false for outer windows.
- // This is used to implement Telemetry measures such as SLOW_SCRIPT_PAGE_COUNT.
- bool mHasHadSlowScript : 1;
-
// Track what sorts of events we need to fire when thawed
bool mNotifyIdleObserversIdleOnThaw : 1;
bool mNotifyIdleObserversActiveOnThaw : 1;
diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp
index 4a984d294..3f28533d3 100644
--- a/dom/base/nsJSEnvironment.cpp
+++ b/dom/base/nsJSEnvironment.cpp
@@ -126,13 +126,13 @@ static const uint32_t kMaxICCDuration = 2000; // ms
// Force a CC after this long if there's more than NS_CC_FORCED_PURPLE_LIMIT
// objects in the purple buffer.
#define NS_CC_FORCED (2 * 60 * PR_USEC_PER_SEC) // 2 min
-#define NS_CC_FORCED_PURPLE_LIMIT 10
+#define NS_CC_FORCED_PURPLE_LIMIT 100
// Don't allow an incremental GC to lock out the CC for too long.
#define NS_MAX_CC_LOCKEDOUT_TIME (30 * PR_USEC_PER_SEC) // 30 seconds
// Trigger a CC if the purple buffer exceeds this size when we check it.
-#define NS_CC_PURPLE_LIMIT 200
+#define NS_CC_PURPLE_LIMIT 2000
// Large value used to specify that a script should run essentially forever
#define NS_UNLIMITED_SCRIPT_RUNTIME (0x40000000LL << 32)
@@ -625,7 +625,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsJSContext)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsJSContext)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobalObjectRef)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsJSContext)
@@ -1356,9 +1355,20 @@ nsJSContext::RunCycleCollectorSlice()
TimeStamp now = TimeStamp::Now();
// Only run a limited slice if we're within the max running time.
- if (TimeBetween(gCCStats.mBeginTime, now) < kMaxICCDuration) {
- float sliceMultiplier = std::max(TimeBetween(gCCStats.mEndSliceTime, now) / (float)kICCIntersliceDelay, 1.0f);
- budget = js::SliceBudget(js::TimeBudget(kICCSliceBudget * sliceMultiplier));
+ uint32_t runningTime = TimeBetween(gCCStats.mBeginTime, now);
+ if (runningTime < kMaxICCDuration) {
+ // Try to make up for a delay in running this slice.
+ float sliceDelayMultiplier = TimeBetween(gCCStats.mEndSliceTime, now) / (float)kICCIntersliceDelay;
+ float delaySliceBudget = kICCSliceBudget * sliceDelayMultiplier;
+
+ // Increase slice budgets up to |maxLaterSlice| as we approach
+ // half way through the ICC, to avoid large sync CCs.
+ float percentToHalfDone = std::min(2.0f * runningTime / kMaxICCDuration, 1.0f);
+ const float maxLaterSlice = 40.0f;
+ float laterSliceBudget = maxLaterSlice * percentToHalfDone;
+
+ budget = js::SliceBudget(js::TimeBudget(std::max({delaySliceBudget,
+ laterSliceBudget, (float)kICCSliceBudget})));
}
}
}
@@ -2618,7 +2628,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsJSArgArray)
tmp->ReleaseJSObjects();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsJSArgArray)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsJSArgArray)
diff --git a/dom/base/nsJSTimeoutHandler.cpp b/dom/base/nsJSTimeoutHandler.cpp
index 8736cd1dd..ce5d58385 100644
--- a/dom/base/nsJSTimeoutHandler.cpp
+++ b/dom/base/nsJSTimeoutHandler.cpp
@@ -151,7 +151,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsJSScriptTimeoutHandler)
if (tmp->mFunction) {
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFunction)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/base/nsNodeUtils.cpp b/dom/base/nsNodeUtils.cpp
index ecea95dc1..75d408151 100644
--- a/dom/base/nsNodeUtils.cpp
+++ b/dom/base/nsNodeUtils.cpp
@@ -297,6 +297,16 @@ nsNodeUtils::LastRelease(nsINode* aNode)
NodeWillBeDestroyed, (aNode));
}
+ if (aNode->IsElement()) {
+ Element* elem = aNode->AsElement();
+ FragmentOrElement::nsDOMSlots* domSlots =
+ static_cast<FragmentOrElement::nsDOMSlots*>(slots);
+ for (auto iter = domSlots->mRegisteredIntersectionObservers.Iter(); !iter.Done(); iter.Next()) {
+ DOMIntersectionObserver* observer = iter.Key();
+ observer->UnlinkTarget(*elem);
+ }
+ }
+
delete slots;
aNode->mSlots = nullptr;
}
diff --git a/dom/base/nsObjectLoadingContent.cpp b/dom/base/nsObjectLoadingContent.cpp
index 709c7aa56..c1b732258 100644
--- a/dom/base/nsObjectLoadingContent.cpp
+++ b/dom/base/nsObjectLoadingContent.cpp
@@ -1582,7 +1582,6 @@ nsObjectLoadingContent::MaybeRewriteYoutubeEmbed(nsIURI* aURI, nsIURI* aBaseURI,
}
}
- // If we're pref'd off, return after telemetry has been logged.
if (!Preferences::GetBool(kPrefYoutubeRewrite)) {
return;
}
diff --git a/dom/base/nsRange.cpp b/dom/base/nsRange.cpp
index 4b4ce7885..d45a2c975 100644
--- a/dom/base/nsRange.cpp
+++ b/dom/base/nsRange.cpp
@@ -351,7 +351,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsRange)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mEndParent)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRoot)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSelection)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsRange)
diff --git a/dom/base/nsScriptLoader.cpp b/dom/base/nsScriptLoader.cpp
index 0eb5bbf31..1e23d6c5f 100644
--- a/dom/base/nsScriptLoader.cpp
+++ b/dom/base/nsScriptLoader.cpp
@@ -353,7 +353,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsModuleScript)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLoader)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsModuleScript)
diff --git a/dom/base/nsWrapperCache.cpp b/dom/base/nsWrapperCache.cpp
index b91d86598..c5993fe7b 100644
--- a/dom/base/nsWrapperCache.cpp
+++ b/dom/base/nsWrapperCache.cpp
@@ -133,7 +133,7 @@ nsWrapperCache::CheckCCWrapperTraversal(void* aScriptObjectHolder,
// see through the COM layer, so we use a suppression to help it.
JS::AutoSuppressGCAnalysis suppress;
- aTracer->Traverse(aScriptObjectHolder, callback);
+ aTracer->TraverseNativeAndJS(aScriptObjectHolder, callback);
MOZ_ASSERT(callback.mFound,
"Cycle collection participant didn't traverse to preserved "
"wrapper! This will probably crash.");
diff --git a/dom/base/nsWrapperCache.h b/dom/base/nsWrapperCache.h
index 3c69a7ec4..56cae89ed 100644
--- a/dom/base/nsWrapperCache.h
+++ b/dom/base/nsWrapperCache.h
@@ -331,8 +331,7 @@ private:
* causes between the native object and the JS object, so it is important that
* any native object that supports preserving of its wrapper
* traces/traverses/unlinks the cached JS object (see
- * NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER,
- * NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS and
+ * NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER and
* NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER).
*/
enum { WRAPPER_BIT_PRESERVED = 1 << 0 };
@@ -383,7 +382,6 @@ NS_DEFINE_STATIC_IID_ACCESSOR(nsWrapperCache, NS_WRAPPERCACHE_IID)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \
NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class)
@@ -395,7 +393,6 @@ NS_DEFINE_STATIC_IID_ACCESSOR(nsWrapperCache, NS_WRAPPERCACHE_IID)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_class) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(__VA_ARGS__) \
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(_class)
diff --git a/dom/bindings/CallbackObject.cpp b/dom/bindings/CallbackObject.cpp
index 7c7d2c6b4..bb01c804c 100644
--- a/dom/bindings/CallbackObject.cpp
+++ b/dom/bindings/CallbackObject.cpp
@@ -37,7 +37,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CallbackObject)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mIncumbentGlobal)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CallbackObject)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mIncumbentGlobal)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(CallbackObject)
diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py
index 7a6668687..cb93e4897 100644
--- a/dom/bindings/Codegen.py
+++ b/dom/bindings/Codegen.py
@@ -14994,7 +14994,6 @@ class CGJSImplClass(CGBindingImplClass):
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(${ifaceName})
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mImpl)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mParent)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(${ifaceName})
NS_IMPL_CYCLE_COLLECTING_ADDREF(${ifaceName})
diff --git a/dom/bindings/Exceptions.cpp b/dom/bindings/Exceptions.cpp
index a3f807688..8ace37051 100644
--- a/dom/bindings/Exceptions.cpp
+++ b/dom/bindings/Exceptions.cpp
@@ -305,7 +305,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(JSStackFrame)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCaller)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAsyncCaller)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(JSStackFrame)
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mStack)
diff --git a/dom/bindings/SimpleGlobalObject.cpp b/dom/bindings/SimpleGlobalObject.cpp
index 6ac397019..88710f7d9 100644
--- a/dom/bindings/SimpleGlobalObject.cpp
+++ b/dom/bindings/SimpleGlobalObject.cpp
@@ -29,8 +29,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(SimpleGlobalObject)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(SimpleGlobalObject)
-
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
tmp->TraverseHostObjectURIs(cb);
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp
index e3406fc02..b60ab239d 100644
--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -1047,7 +1047,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CanvasRenderingContext2D)
ImplCycleCollectionTraverse(cb, info.mElement, "Hit region fallback element");
}
}
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(CanvasRenderingContext2D)
diff --git a/dom/canvas/ImageData.cpp b/dom/canvas/ImageData.cpp
index b201fa279..d24fbca95 100644
--- a/dom/canvas/ImageData.cpp
+++ b/dom/canvas/ImageData.cpp
@@ -29,7 +29,6 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ImageData)
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(ImageData)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ImageData)
diff --git a/dom/console/Console.cpp b/dom/console/Console.cpp
index ff5a92167..b174172e0 100755
--- a/dom/console/Console.cpp
+++ b/dom/console/Console.cpp
@@ -797,7 +797,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Console)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mConsoleEventNotifier)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(Console)
diff --git a/dom/events/DOMEventTargetHelper.cpp b/dom/events/DOMEventTargetHelper.cpp
index f8a5227d6..dd9a01d8d 100644
--- a/dom/events/DOMEventTargetHelper.cpp
+++ b/dom/events/DOMEventTargetHelper.cpp
@@ -43,7 +43,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(DOMEventTargetHelper)
NS_IMPL_CYCLE_COLLECTION_DESCRIBE(DOMEventTargetHelper, tmp->mRefCnt.get())
}
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mListenerManager)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/events/DataTransfer.cpp b/dom/events/DataTransfer.cpp
index 45c72e662..40a0f42e6 100644
--- a/dom/events/DataTransfer.cpp
+++ b/dom/events/DataTransfer.cpp
@@ -57,7 +57,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DataTransfer)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mItems)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDragTarget)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDragImage)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(DataTransfer)
diff --git a/dom/events/Event.cpp b/dom/events/Event.cpp
index f33bfa5a8..280e40ad5 100755
--- a/dom/events/Event.cpp
+++ b/dom/events/Event.cpp
@@ -231,7 +231,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Event)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPresContext)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mExplicitOriginalTarget)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/events/JSEventHandler.cpp b/dom/events/JSEventHandler.cpp
index 4b1b33313..b9e7c4d84 100644
--- a/dom/events/JSEventHandler.cpp
+++ b/dom/events/JSEventHandler.cpp
@@ -63,7 +63,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(JSEventHandler)
NS_IMPL_CYCLE_COLLECTION_DESCRIBE(JSEventHandler, tmp->mRefCnt.get())
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(mTypedHandler.Ptr())
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(JSEventHandler)
diff --git a/dom/filesystem/Directory.cpp b/dom/filesystem/Directory.cpp
index 59c78fb2c..5e8a4a745 100644
--- a/dom/filesystem/Directory.cpp
+++ b/dom/filesystem/Directory.cpp
@@ -36,7 +36,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Directory)
tmp->mFileSystem->Traverse(cb);
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mParent)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(Directory)
diff --git a/dom/gamepad/GamepadServiceTest.cpp b/dom/gamepad/GamepadServiceTest.cpp
index a6fde58f0..89429b52a 100644
--- a/dom/gamepad/GamepadServiceTest.cpp
+++ b/dom/gamepad/GamepadServiceTest.cpp
@@ -35,7 +35,6 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(GamepadServiceTest)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(GamepadServiceTest,
DOMEventTargetHelper)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/geolocation/nsGeolocation.cpp b/dom/geolocation/nsGeolocation.cpp
index 244018ee8..846e7fff4 100644
--- a/dom/geolocation/nsGeolocation.cpp
+++ b/dom/geolocation/nsGeolocation.cpp
@@ -7,7 +7,6 @@
#include "nsXULAppAPI.h"
#include "mozilla/dom/ContentChild.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/UniquePtr.h"
#include "nsGeolocation.h"
@@ -70,7 +69,6 @@ class nsGeolocationRequest final
GeoPositionCallback aCallback,
GeoPositionErrorCallback aErrorCallback,
UniquePtr<PositionOptions>&& aOptions,
- uint8_t aProtocolType,
bool aWatchPositionRequest = false,
int32_t aWatchId = 0);
@@ -119,7 +117,6 @@ class nsGeolocationRequest final
int32_t mWatchId;
bool mShutdown;
nsCOMPtr<nsIContentPermissionRequester> mRequester;
- uint8_t mProtocolType;
};
static UniquePtr<PositionOptions>
@@ -287,7 +284,6 @@ nsGeolocationRequest::nsGeolocationRequest(Geolocation* aLocator,
GeoPositionCallback aCallback,
GeoPositionErrorCallback aErrorCallback,
UniquePtr<PositionOptions>&& aOptions,
- uint8_t aProtocolType,
bool aWatchPositionRequest,
int32_t aWatchId)
: mIsWatchPositionRequest(aWatchPositionRequest),
@@ -296,8 +292,7 @@ nsGeolocationRequest::nsGeolocationRequest(Geolocation* aLocator,
mOptions(Move(aOptions)),
mLocator(aLocator),
mWatchId(aWatchId),
- mShutdown(false),
- mProtocolType(aProtocolType)
+ mShutdown(false)
{
if (nsCOMPtr<nsPIDOMWindowInner> win =
do_QueryReferent(mLocator->GetOwner())) {
@@ -949,8 +944,7 @@ NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(Geolocation,
mPendingRequests)
Geolocation::Geolocation()
-: mProtocolType(ProtocolType::OTHER)
-, mLastWatchId(0)
+: mLastWatchId(0)
{
}
@@ -982,23 +976,6 @@ Geolocation::Init(nsPIDOMWindowInner* aContentDom)
nsCOMPtr<nsIURI> uri;
nsresult rv = mPrincipal->GetURI(getter_AddRefs(uri));
NS_ENSURE_SUCCESS(rv, rv);
-
- if (uri) {
- bool isHttp;
- rv = uri->SchemeIs("http", &isHttp);
- NS_ENSURE_SUCCESS(rv, rv);
-
- bool isHttps;
- rv = uri->SchemeIs("https", &isHttps);
- NS_ENSURE_SUCCESS(rv, rv);
-
- // Store the protocol to send via telemetry later.
- if (isHttp) {
- mProtocolType = ProtocolType::HTTP;
- } else if (isHttps) {
- mProtocolType = ProtocolType::HTTPS;
- }
- }
}
// If no aContentDom was passed into us, we are being used
@@ -1185,7 +1162,7 @@ Geolocation::GetCurrentPosition(GeoPositionCallback callback,
RefPtr<nsGeolocationRequest> request =
new nsGeolocationRequest(this, Move(callback), Move(errorCallback),
- Move(options), static_cast<uint8_t>(mProtocolType),
+ Move(options),
false);
if (!sGeoEnabled) {
@@ -1263,7 +1240,7 @@ Geolocation::WatchPosition(GeoPositionCallback aCallback,
RefPtr<nsGeolocationRequest> request =
new nsGeolocationRequest(this, Move(aCallback), Move(aErrorCallback),
Move(aOptions),
- static_cast<uint8_t>(mProtocolType), true, *aRv);
+ true, *aRv);
if (!sGeoEnabled) {
nsCOMPtr<nsIRunnable> ev = new RequestAllowEvent(false, request);
diff --git a/dom/geolocation/nsGeolocation.h b/dom/geolocation/nsGeolocation.h
index 0bc527e34..0bcc587e4 100644
--- a/dom/geolocation/nsGeolocation.h
+++ b/dom/geolocation/nsGeolocation.h
@@ -202,12 +202,6 @@ private:
// where the content was loaded from
nsCOMPtr<nsIPrincipal> mPrincipal;
- // the protocols we want to measure
- enum class ProtocolType: uint8_t { OTHER, HTTP, HTTPS };
-
- // the protocol used to load the content
- ProtocolType mProtocolType;
-
// owning back pointer.
RefPtr<nsGeolocationService> mService;
diff --git a/dom/html/HTMLFormControlsCollection.cpp b/dom/html/HTMLFormControlsCollection.cpp
index d91a6b5de..77fafae99 100644
--- a/dom/html/HTMLFormControlsCollection.cpp
+++ b/dom/html/HTMLFormControlsCollection.cpp
@@ -134,7 +134,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(HTMLFormControlsCollection)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(HTMLFormControlsCollection)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mNameLookupTable)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(HTMLFormControlsCollection)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
diff --git a/dom/html/HTMLFormElement.cpp b/dom/html/HTMLFormElement.cpp
index 0393ed3e0..6bea19a2b 100644
--- a/dom/html/HTMLFormElement.cpp
+++ b/dom/html/HTMLFormElement.cpp
@@ -51,7 +51,6 @@
#include "nsIWebProgress.h"
#include "nsIDocShell.h"
#include "nsIPrompt.h"
-#include "nsISecurityUITelemetry.h"
#include "nsIStringBundle.h"
// radio buttons
@@ -954,8 +953,6 @@ HTMLFormElement::DoSecureToInsecureSubmitCheck(nsIURI* aActionURL,
return rv;
}
*aCancelSubmit = (buttonPressed == 1);
- uint32_t telemetryBucket =
- nsISecurityUITelemetry::WARNING_CONFIRM_POST_TO_INSECURE_FROM_SECURE;
return NS_OK;
}
diff --git a/dom/html/HTMLImageElement.cpp b/dom/html/HTMLImageElement.cpp
index 4b2e7a07b..fab1cdef4 100644
--- a/dom/html/HTMLImageElement.cpp
+++ b/dom/html/HTMLImageElement.cpp
@@ -1345,8 +1345,6 @@ HTMLImageElement::FlushUseCounters()
nsCOMPtr<imgIContainer> container;
request->GetImage(getter_AddRefs(container));
-
- static_cast<image::Image*>(container.get())->ReportUseCounters();
}
} // namespace dom
diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp
index 6171e1766..050d1ac69 100644
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -1037,14 +1037,6 @@ void HTMLMediaElement::ShutdownDecoder()
void HTMLMediaElement::AbortExistingLoads()
{
-#ifdef MOZ_EME
- // If there is no existing decoder then we don't have anything to
- // report. This prevents reporting the initial load from an
- // empty video element as a failed EME load.
- if (mDecoder) {
- ReportEMETelemetry();
- }
-#endif
// Abort any already-running instance of the resource selection algorithm.
mLoadWaitStatus = NOT_WAITING;
@@ -1900,7 +1892,6 @@ NS_IMETHODIMP HTMLMediaElement::GetCurrentTime(double* aCurrentTime)
void
HTMLMediaElement::FastSeek(double aTime, ErrorResult& aRv)
{
- LOG(LogLevel::Debug, ("Reporting telemetry VIDEO_FASTSEEK_USED"));
RefPtr<Promise> tobeDropped = Seek(aTime, SeekTarget::PrevSyncPoint, aRv);
}
@@ -3154,10 +3145,6 @@ HTMLMediaElement::~HTMLMediaElement()
if (mProgressTimer) {
StopProgress();
}
- if (mVideoDecodeSuspendTimer) {
- mVideoDecodeSuspendTimer->Cancel();
- mVideoDecodeSuspendTimer = nullptr;
- }
if (mSrcStream) {
EndSrcMediaStreamPlayback();
}
@@ -3648,191 +3635,6 @@ nsresult HTMLMediaElement::BindToTree(nsIDocument* aDocument, nsIContent* aParen
return rv;
}
-/* static */
-void HTMLMediaElement::VideoDecodeSuspendTimerCallback(nsITimer* aTimer, void* aClosure)
-{
- MOZ_ASSERT(NS_IsMainThread());
- auto element = static_cast<HTMLMediaElement*>(aClosure);
- element->mVideoDecodeSuspendTime.Start();
- element->mVideoDecodeSuspendTimer = nullptr;
-}
-
-void HTMLMediaElement::HiddenVideoStart()
-{
- MOZ_ASSERT(NS_IsMainThread());
- mHiddenPlayTime.Start();
- if (mVideoDecodeSuspendTimer) {
- // Already started, just keep it running.
- return;
- }
- mVideoDecodeSuspendTimer = do_CreateInstance("@mozilla.org/timer;1");
- mVideoDecodeSuspendTimer->InitWithNamedFuncCallback(
- VideoDecodeSuspendTimerCallback, this,
- MediaPrefs::MDSMSuspendBackgroundVideoDelay(), nsITimer::TYPE_ONE_SHOT,
- "HTMLMediaElement::VideoDecodeSuspendTimerCallback");
-}
-
-void HTMLMediaElement::HiddenVideoStop()
-{
- MOZ_ASSERT(NS_IsMainThread());
- mHiddenPlayTime.Pause();
- mVideoDecodeSuspendTime.Pause();
- if (!mVideoDecodeSuspendTimer) {
- return;
- }
- mVideoDecodeSuspendTimer->Cancel();
- mVideoDecodeSuspendTimer = nullptr;
-}
-
-#ifdef MOZ_EME
-void
-HTMLMediaElement::ReportEMETelemetry()
-{
- // Report telemetry for EME videos when a page is unloaded.
- NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
- if (mIsEncrypted && Preferences::GetBool("media.eme.enabled")) {
- LOG(LogLevel::Debug, ("%p VIDEO_EME_PLAY_SUCCESS = %s",
- this, mLoadedDataFired ? "true" : "false"));
- }
-}
-#endif
-
-void
-HTMLMediaElement::ReportTelemetry()
-{
- // Report telemetry for videos when a page is unloaded. We
- // want to know data on what state the video is at when
- // the user has exited.
- enum UnloadedState {
- ENDED = 0,
- PAUSED = 1,
- STALLED = 2,
- SEEKING = 3,
- OTHER = 4
- };
-
- UnloadedState state = OTHER;
- if (Seeking()) {
- state = SEEKING;
- }
- else if (Ended()) {
- state = ENDED;
- }
- else if (Paused()) {
- state = PAUSED;
- }
- else {
- // For buffering we check if the current playback position is at the end
- // of a buffered range, within a margin of error. We also consider to be
- // buffering if the last frame status was buffering and the ready state is
- // HAVE_CURRENT_DATA to account for times where we are in a buffering state
- // regardless of what actual data we have buffered.
- bool stalled = false;
- RefPtr<TimeRanges> ranges = Buffered();
- const double errorMargin = 0.05;
- double t = CurrentTime();
- TimeRanges::index_type index = ranges->Find(t, errorMargin);
- ErrorResult ignore;
- stalled = index != TimeRanges::NoIndex &&
- (ranges->End(index, ignore) - t) < errorMargin;
- stalled |= mDecoder && NextFrameStatus() == MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_BUFFERING &&
- mReadyState == HTMLMediaElement::HAVE_CURRENT_DATA;
- if (stalled) {
- state = STALLED;
- }
- }
-
- LOG(LogLevel::Debug, ("%p VIDEO_UNLOAD_STATE = %d", this, state));
-
- FrameStatisticsData data;
-
- if (HTMLVideoElement* vid = HTMLVideoElement::FromContentOrNull(this)) {
- FrameStatistics* stats = vid->GetFrameStatistics();
- if (stats) {
- data = stats->GetFrameStatisticsData();
- if (data.mParsedFrames) {
- MOZ_ASSERT(data.mDroppedFrames <= data.mParsedFrames);
- // Dropped frames <= total frames, so 'percentage' cannot be higher than
- // 100 and therefore can fit in a uint32_t (that Telemetry takes).
- uint32_t percentage = 100 * data.mDroppedFrames / data.mParsedFrames;
- LOG(LogLevel::Debug,
- ("Reporting telemetry DROPPED_FRAMES_IN_VIDEO_PLAYBACK"));
- }
- }
- }
-
- if (mMediaInfo.HasVideo() &&
- mMediaInfo.mVideo.mImage.height > 0) {
- // We have a valid video.
- double playTime = mPlayTime.Total();
- double hiddenPlayTime = mHiddenPlayTime.Total();
- double videoDecodeSuspendTime = mVideoDecodeSuspendTime.Total();
-
- LOG(LogLevel::Debug, ("%p VIDEO_PLAY_TIME_MS = %f", this, playTime));
-
- LOG(LogLevel::Debug, ("%p VIDEO_HIDDEN_PLAY_TIME_MS = %f", this, hiddenPlayTime));
-
- if (playTime > 0.0) {
- // We have actually played something -> Report some valid-video telemetry.
-
- // Keyed by audio+video or video alone, and by a resolution range.
- nsCString key(mMediaInfo.HasAudio() ? "AV," : "V,");
- static const struct { int32_t mH; const char* mRes; } sResolutions[] = {
- { 240, "0<h<=240" },
- { 480, "240<h<=480" },
- { 576, "480<h<=576" },
- { 720, "576<h<=720" },
- { 1080, "720<h<=1080" },
- { 2160, "1080<h<=2160" }
- };
- const char* resolution = "h>2160";
- int32_t height = mMediaInfo.mVideo.mImage.height;
- for (const auto& res : sResolutions) {
- if (height <= res.mH) {
- resolution = res.mRes;
- break;
- }
- }
- key.AppendASCII(resolution);
-
- uint32_t hiddenPercentage = uint32_t(hiddenPlayTime / playTime * 100.0 + 0.5);
- LOG(LogLevel::Debug, ("%p VIDEO_HIDDEN_PLAY_TIME_PERCENTAGE = %u, keys: '%s' and 'All'",
- this, hiddenPercentage, key.get()));
-
- uint32_t videoDecodeSuspendPercentage =
- uint32_t(videoDecodeSuspendTime / playTime * 100.0 + 0.5);
- LOG(LogLevel::Debug, ("%p VIDEO_INFERRED_DECODE_SUSPEND_PERCENTAGE = %u, keys: '%s' and 'All'",
- this, videoDecodeSuspendPercentage, key.get()));
-
- if (data.mInterKeyframeCount != 0) {
- uint32_t average_ms =
- uint32_t(std::min<uint64_t>(double(data.mInterKeyframeSum_us)
- / double(data.mInterKeyframeCount)
- / 1000.0
- + 0.5,
- UINT32_MAX));
- LOG(LogLevel::Debug, ("%p VIDEO_INTER_KEYFRAME_AVERAGE_MS = %u, keys: '%s' and 'All'",
- this, average_ms, key.get()));
-
- uint32_t max_ms =
- uint32_t(std::min<uint64_t>((data.mInterKeyFrameMax_us + 500) / 1000,
- UINT32_MAX));
- LOG(LogLevel::Debug, ("%p VIDEO_INTER_KEYFRAME_MAX_MS = %u, keys: '%s' and 'All'",
- this, max_ms, key.get()));
- } else {
- // Here, we have played *some* of the video, but didn't get more than 1
- // keyframe. Report '0' if we have played for longer than the video-
- // decode-suspend delay (showing recovery would be difficult).
- uint32_t suspendDelay_ms = MediaPrefs::MDSMSuspendBackgroundVideoDelay();
- if (uint32_t(playTime * 1000.0) > suspendDelay_ms) {
- LOG(LogLevel::Debug, ("%p VIDEO_INTER_KEYFRAME_MAX_MS = 0 (only 1 keyframe), keys: '%s' and 'All'",
- this, key.get()));
- }
- }
- }
- }
-}
-
void HTMLMediaElement::UnbindFromTree(bool aDeep,
bool aNullParent)
{
@@ -5312,19 +5114,6 @@ nsresult HTMLMediaElement::DispatchAsyncEvent(const nsAString& aName)
nsCOMPtr<nsIRunnable> event = new nsAsyncEventRunner(aName, this);
NS_DispatchToMainThread(event);
- if ((aName.EqualsLiteral("play") || aName.EqualsLiteral("playing"))) {
- mPlayTime.Start();
- if (IsHidden()) {
- HiddenVideoStart();
- }
- } else if (aName.EqualsLiteral("waiting")) {
- mPlayTime.Pause();
- HiddenVideoStop();
- } else if (aName.EqualsLiteral("pause")) {
- mPlayTime.Pause();
- HiddenVideoStop();
- }
-
return NS_OK;
}
@@ -5450,11 +5239,6 @@ void HTMLMediaElement::SuspendOrResumeElement(bool aPauseElement, bool aSuspendE
UpdateSrcMediaStreamPlaying();
UpdateAudioChannelPlayingState();
if (aPauseElement) {
- ReportTelemetry();
-#ifdef MOZ_EME
- ReportEMETelemetry();
-#endif
-
#ifdef MOZ_EME
// For EME content, we may force destruction of the CDM client (and CDM
// instance if this is the last client for that CDM instance) and
@@ -5506,13 +5290,6 @@ bool HTMLMediaElement::IsBeingDestroyed()
void HTMLMediaElement::NotifyOwnerDocumentActivityChanged()
{
bool visible = !IsHidden();
- if (visible) {
- // Visible -> Just pause hidden play time (no-op if already paused).
- HiddenVideoStop();
- } else if (mPlayTime.IsStarted()) {
- // Not visible, play time is running -> Start hidden play time if needed.
- HiddenVideoStart();
- }
if (mDecoder && !IsBeingDestroyed()) {
mDecoder->NotifyOwnerActivityChanged(visible);
@@ -6288,18 +6065,10 @@ HTMLMediaElement::OnVisibilityChange(Visibility aNewVisibility)
break;
}
case Visibility::APPROXIMATELY_NONVISIBLE: {
- if (mPlayTime.IsStarted()) {
- // Not visible, play time is running -> Start hidden play time if needed.
- HiddenVideoStart();
- }
-
mDecoder->NotifyOwnerActivityChanged(false);
break;
}
case Visibility::APPROXIMATELY_VISIBLE: {
- // Visible -> Just pause hidden play time (no-op if already paused).
- HiddenVideoStop();
-
mDecoder->NotifyOwnerActivityChanged(true);
break;
}
diff --git a/dom/html/HTMLMediaElement.h b/dom/html/HTMLMediaElement.h
index af944a318..899e8449a 100644
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -1195,29 +1195,6 @@ protected:
return isPaused;
}
- /**
- * Video has been playing while hidden and, if feature was enabled, would
- * trigger suspending decoder.
- * Used to track hidden-video-decode-suspend telemetry.
- */
- static void VideoDecodeSuspendTimerCallback(nsITimer* aTimer, void* aClosure);
- /**
- * Video is now both: playing and hidden.
- * Used to track hidden-video telemetry.
- */
- void HiddenVideoStart();
- /**
- * Video is not playing anymore and/or has become visible.
- * Used to track hidden-video telemetry.
- */
- void HiddenVideoStop();
-
-#ifdef MOZ_EME
- void ReportEMETelemetry();
-#endif
-
- void ReportTelemetry();
-
// Check the permissions for audiochannel.
bool CheckAudioChannelPermissions(const nsAString& aType);
@@ -1484,9 +1461,6 @@ protected:
// Timer used for updating progress events.
nsCOMPtr<nsITimer> mProgressTimer;
- // Timer used to simulate video-suspend.
- nsCOMPtr<nsITimer> mVideoDecodeSuspendTimer;
-
#ifdef MOZ_EME
// Encrypted Media Extension media keys.
RefPtr<MediaKeys> mMediaKeys;
@@ -1688,65 +1662,7 @@ protected:
// before attaching to the DOM tree.
bool mUnboundFromTree = false;
-public:
- // Helper class to measure times for MSE telemetry stats
- class TimeDurationAccumulator
- {
- public:
- TimeDurationAccumulator()
- : mCount(0)
- {}
- void Start()
- {
- if (IsStarted()) {
- return;
- }
- mStartTime = TimeStamp::Now();
- }
- void Pause()
- {
- if (!IsStarted()) {
- return;
- }
- mSum += (TimeStamp::Now() - mStartTime);
- mCount++;
- mStartTime = TimeStamp();
- }
- bool IsStarted() const
- {
- return !mStartTime.IsNull();
- }
- double Total() const
- {
- if (!IsStarted()) {
- return mSum.ToSeconds();
- }
- // Add current running time until now, but keep it running.
- return (mSum + (TimeStamp::Now() - mStartTime)).ToSeconds();
- }
- uint32_t Count() const
- {
- if (!IsStarted()) {
- return mCount;
- }
- // Count current run in this report, without increasing the stored count.
- return mCount + 1;
- }
- private:
- TimeStamp mStartTime;
- TimeDuration mSum;
- uint32_t mCount;
- };
private:
- // Total time a video has spent playing.
- TimeDurationAccumulator mPlayTime;
-
- // Total time a video has spent playing while hidden.
- TimeDurationAccumulator mHiddenPlayTime;
-
- // Total time a video has (or would have) spent in video-decode-suspend mode.
- TimeDurationAccumulator mVideoDecodeSuspendTime;
-
// Indicates if user has interacted with the element.
// Used to block autoplay when disabled.
bool mHasUserInteraction;
diff --git a/dom/html/TextTrackManager.cpp b/dom/html/TextTrackManager.cpp
index cc14858b6..7f9d32794 100644
--- a/dom/html/TextTrackManager.cpp
+++ b/dom/html/TextTrackManager.cpp
@@ -118,7 +118,6 @@ TextTrackManager::TextTrackManager(HTMLMediaElement *aMediaElement)
, mTimeMarchesOnDispatched(false)
, mUpdateCueDisplayDispatched(false)
, performedTrackSelection(false)
- , mCueTelemetryReported(false)
, mShutdown(false)
{
nsISupports* parentObject =
@@ -170,7 +169,6 @@ TextTrackManager::AddTextTrack(TextTrackKind aKind, const nsAString& aLabel,
mTextTracks->AddTextTrack(aKind, aLabel, aLanguage, aMode, aReadyState,
aTextTrackSource, CompareTextTracks(mMediaElement));
AddCues(track);
- ReportTelemetryForTrack(track);
if (aTextTrackSource == TextTrackSource::Track) {
RefPtr<nsIRunnable> task =
@@ -190,7 +188,6 @@ TextTrackManager::AddTextTrack(TextTrack* aTextTrack)
WEBVTT_LOG("%p AddTextTrack TextTrack %p",this, aTextTrack);
mTextTracks->AddTextTrack(aTextTrack, CompareTextTracks(mMediaElement));
AddCues(aTextTrack);
- ReportTelemetryForTrack(aTextTrack);
if (aTextTrack->GetTextTrackSource() == TextTrackSource::Track) {
RefPtr<nsIRunnable> task =
@@ -309,7 +306,6 @@ TextTrackManager::NotifyCueAdded(TextTrackCue& aCue)
mNewCues->AddCue(aCue);
}
DispatchTimeMarchesOn();
- ReportTelemetryForCue();
}
void
@@ -827,17 +823,5 @@ TextTrackManager::NotifyReset()
mLastTimeMarchesOnCalled = 0.0;
}
-void
-TextTrackManager::ReportTelemetryForTrack(TextTrack* aTextTrack) const
-{
-/* STUB */
-}
-
-void
-TextTrackManager::ReportTelemetryForCue()
-{
-/* STUB */
-}
-
} // namespace dom
} // namespace mozilla
diff --git a/dom/html/TextTrackManager.h b/dom/html/TextTrackManager.h
index 4ad1a57a7..2375aa4bb 100644
--- a/dom/html/TextTrackManager.h
+++ b/dom/html/TextTrackManager.h
@@ -148,13 +148,6 @@ private:
nsTArray<TextTrack*>& aTextTracks);
bool TrackIsDefault(TextTrack* aTextTrack);
- void ReportTelemetryForTrack(TextTrack* aTextTrack) const;
- void ReportTelemetryForCue();
-
- // If there is at least one cue has been added to the cue list once, we would
- // report the usage of cue to Telemetry.
- bool mCueTelemetryReported;
-
class ShutdownObserverProxy final : public nsIObserver
{
NS_DECL_ISUPPORTS
diff --git a/dom/html/nsDOMStringMap.cpp b/dom/html/nsDOMStringMap.cpp
index 42725bc6f..6d2bc424d 100644
--- a/dom/html/nsDOMStringMap.cpp
+++ b/dom/html/nsDOMStringMap.cpp
@@ -19,7 +19,6 @@ using namespace mozilla::dom;
NS_IMPL_CYCLE_COLLECTION_CLASS(nsDOMStringMap)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDOMStringMap)
-NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mElement)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/html/nsGenericHTMLElement.h b/dom/html/nsGenericHTMLElement.h
index 0635c27e1..24a7a3652 100644
--- a/dom/html/nsGenericHTMLElement.h
+++ b/dom/html/nsGenericHTMLElement.h
@@ -396,13 +396,6 @@ public:
}
NS_IMETHOD InsertAdjacentHTML(const nsAString& position,
const nsAString& text) final override;
- NS_IMETHOD ScrollIntoView(bool top, uint8_t _argc) final override {
- if (!_argc) {
- top = true;
- }
- mozilla::dom::Element::ScrollIntoView(top);
- return NS_OK;
- }
NS_IMETHOD GetOffsetParent(nsIDOMElement** aOffsetParent)
final override {
mozilla::dom::Element* offsetParent = GetOffsetParent();
diff --git a/dom/indexedDB/ActorsChild.cpp b/dom/indexedDB/ActorsChild.cpp
index 3e8f97348..c4fcceb90 100644
--- a/dom/indexedDB/ActorsChild.cpp
+++ b/dom/indexedDB/ActorsChild.cpp
@@ -3456,6 +3456,8 @@ BackgroundCursorChild::RecvResponse(const CursorResponse& aResponse)
RefPtr<IDBCursor> cursor;
mStrongCursor.swap(cursor);
+
+ RefPtr<IDBTransaction> transaction = mTransaction;
switch (aResponse.type()) {
case CursorResponse::Tnsresult:
@@ -3486,7 +3488,7 @@ BackgroundCursorChild::RecvResponse(const CursorResponse& aResponse)
MOZ_CRASH("Should never get here!");
}
- mTransaction->OnRequestFinished(/* aActorDestroyedNormally */ true);
+ transaction->OnRequestFinished(/* aActorDestroyedNormally */ true);
return true;
}
diff --git a/dom/indexedDB/ActorsParent.cpp b/dom/indexedDB/ActorsParent.cpp
index 58c113058..38621cee3 100644
--- a/dom/indexedDB/ActorsParent.cpp
+++ b/dom/indexedDB/ActorsParent.cpp
@@ -4129,7 +4129,6 @@ GetDatabaseFileURL(nsIFile* aDatabaseFile,
PersistenceType aPersistenceType,
const nsACString& aGroup,
const nsACString& aOrigin,
- uint32_t aTelemetryId,
nsIFileURL** aResult)
{
MOZ_ASSERT(aDatabaseFile);
@@ -4161,18 +4160,10 @@ GetDatabaseFileURL(nsIFile* aDatabaseFile,
nsAutoCString type;
PersistenceTypeToText(aPersistenceType, type);
- nsAutoCString telemetryFilenameClause;
- if (aTelemetryId) {
- telemetryFilenameClause.AssignLiteral("&telemetryFilename=indexedDB-");
- telemetryFilenameClause.AppendInt(aTelemetryId);
- telemetryFilenameClause.AppendLiteral(".sqlite");
- }
-
rv = fileUrl->SetQuery(NS_LITERAL_CSTRING("persistenceType=") + type +
NS_LITERAL_CSTRING("&group=") + aGroup +
NS_LITERAL_CSTRING("&origin=") + aOrigin +
- NS_LITERAL_CSTRING("&cache=private") +
- telemetryFilenameClause);
+ NS_LITERAL_CSTRING("&cache=private"));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
@@ -4422,7 +4413,6 @@ CreateStorageConnection(nsIFile* aDBFile,
PersistenceType aPersistenceType,
const nsACString& aGroup,
const nsACString& aOrigin,
- uint32_t aTelemetryId,
mozIStorageConnection** aConnection)
{
AssertIsOnIOThread();
@@ -4454,7 +4444,6 @@ CreateStorageConnection(nsIFile* aDBFile,
aPersistenceType,
aGroup,
aOrigin,
- aTelemetryId,
getter_AddRefs(dbFileUrl));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
@@ -4890,7 +4879,6 @@ GetStorageConnection(nsIFile* aDatabaseFile,
PersistenceType aPersistenceType,
const nsACString& aGroup,
const nsACString& aOrigin,
- uint32_t aTelemetryId,
mozIStorageConnection** aConnection)
{
MOZ_ASSERT(!NS_IsMainThread());
@@ -4918,7 +4906,6 @@ GetStorageConnection(nsIFile* aDatabaseFile,
aPersistenceType,
aGroup,
aOrigin,
- aTelemetryId,
getter_AddRefs(dbFileUrl));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
@@ -4955,7 +4942,6 @@ GetStorageConnection(const nsAString& aDatabaseFilePath,
PersistenceType aPersistenceType,
const nsACString& aGroup,
const nsACString& aOrigin,
- uint32_t aTelemetryId,
mozIStorageConnection** aConnection)
{
MOZ_ASSERT(!NS_IsMainThread());
@@ -4974,7 +4960,6 @@ GetStorageConnection(const nsAString& aDatabaseFilePath,
aPersistenceType,
aGroup,
aOrigin,
- aTelemetryId,
aConnection);
}
@@ -6296,7 +6281,6 @@ private:
const nsCString mId;
const nsString mFilePath;
uint32_t mActiveMutableFileCount;
- const uint32_t mTelemetryId;
const PersistenceType mPersistenceType;
const bool mFileHandleDisabled;
const bool mChromeWriteAccessAllowed;
@@ -6313,7 +6297,6 @@ public:
const Maybe<ContentParentId>& aOptionalContentParentId,
const nsACString& aGroup,
const nsACString& aOrigin,
- uint32_t aTelemetryId,
FullDatabaseMetadata* aMetadata,
FileManager* aFileManager,
already_AddRefed<DirectoryLock> aDirectoryLock,
@@ -6372,12 +6355,6 @@ public:
return mId;
}
- uint32_t
- TelemetryId() const
- {
- return mTelemetryId;
- }
-
PersistenceType
Type() const
{
@@ -7673,8 +7650,6 @@ class OpenDatabaseOp final
// cycles.
VersionChangeOp* mVersionChangeOp;
- uint32_t mTelemetryId;
-
public:
OpenDatabaseOp(Factory* aFactory,
already_AddRefed<ContentParent> aContentParent,
@@ -10302,13 +10277,6 @@ typedef nsDataHashtable<nsIDHashKey, DatabaseLoggingInfo*>
StaticAutoPtr<DatabaseLoggingInfoHashtable> gLoggingInfoHashtable;
-typedef nsDataHashtable<nsUint32HashKey, uint32_t> TelemetryIdHashtable;
-
-StaticAutoPtr<TelemetryIdHashtable> gTelemetryIdHashtable;
-
-// Protects all reads and writes to gTelemetryIdHashtable.
-StaticAutoPtr<Mutex> gTelemetryIdMutex;
-
#ifdef DEBUG
StaticRefPtr<DEBUGThreadSlower> gDEBUGThreadSlower;
@@ -10404,88 +10372,6 @@ DecreaseBusyCount()
}
}
-uint32_t
-TelemetryIdForFile(nsIFile* aFile)
-{
- // May be called on any thread!
-
- MOZ_ASSERT(aFile);
- MOZ_ASSERT(gTelemetryIdMutex);
-
- // The storage directory is structured like this:
- //
- // <profile>/storage/<persistence>/<origin>/idb/<filename>.sqlite
- //
- // For the purposes of this function we're only concerned with the
- // <persistence>, <origin>, and <filename> pieces.
-
- nsString filename;
- MOZ_ALWAYS_SUCCEEDS(aFile->GetLeafName(filename));
-
- // Make sure we were given a database file.
- NS_NAMED_LITERAL_STRING(sqliteExtension, ".sqlite");
-
- MOZ_ASSERT(StringEndsWith(filename, sqliteExtension));
-
- filename.Truncate(filename.Length() - sqliteExtension.Length());
-
- // Get the "idb" directory.
- nsCOMPtr<nsIFile> idbDirectory;
- MOZ_ALWAYS_SUCCEEDS(aFile->GetParent(getter_AddRefs(idbDirectory)));
-
- DebugOnly<nsString> idbLeafName;
- MOZ_ASSERT(NS_SUCCEEDED(idbDirectory->GetLeafName(idbLeafName)));
- MOZ_ASSERT(static_cast<nsString&>(idbLeafName).EqualsLiteral("idb"));
-
- // Get the <origin> directory.
- nsCOMPtr<nsIFile> originDirectory;
- MOZ_ALWAYS_SUCCEEDS(
- idbDirectory->GetParent(getter_AddRefs(originDirectory)));
-
- nsString origin;
- MOZ_ALWAYS_SUCCEEDS(originDirectory->GetLeafName(origin));
-
- // Any databases in these directories are owned by the application and should
- // not have their filenames masked. Hopefully they also appear in the
- // Telemetry.cpp whitelist.
- if (origin.EqualsLiteral("chrome") ||
- origin.EqualsLiteral("moz-safe-about+home")) {
- return 0;
- }
-
- // Get the <persistence> directory.
- nsCOMPtr<nsIFile> persistenceDirectory;
- MOZ_ALWAYS_SUCCEEDS(
- originDirectory->GetParent(getter_AddRefs(persistenceDirectory)));
-
- nsString persistence;
- MOZ_ALWAYS_SUCCEEDS(persistenceDirectory->GetLeafName(persistence));
-
- NS_NAMED_LITERAL_STRING(separator, "*");
-
- uint32_t hashValue = HashString(persistence + separator +
- origin + separator +
- filename);
-
- MutexAutoLock lock(*gTelemetryIdMutex);
-
- if (!gTelemetryIdHashtable) {
- gTelemetryIdHashtable = new TelemetryIdHashtable();
- }
-
- uint32_t id;
- if (!gTelemetryIdHashtable->Get(hashValue, &id)) {
- static uint32_t sNextId = 1;
-
- // We're locked, no need for atomics.
- id = sNextId++;
-
- gTelemetryIdHashtable->Put(hashValue, id);
- }
-
- return id;
-}
-
} // namespace
/*******************************************************************************
@@ -12265,7 +12151,6 @@ ConnectionPool::GetOrCreateConnection(const Database* aDatabase,
aDatabase->Type(),
aDatabase->Group(),
aDatabase->Origin(),
- aDatabase->TelemetryId(),
getter_AddRefs(storageConnection));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
@@ -14134,7 +14019,6 @@ Database::Database(Factory* aFactory,
const Maybe<ContentParentId>& aOptionalContentParentId,
const nsACString& aGroup,
const nsACString& aOrigin,
- uint32_t aTelemetryId,
FullDatabaseMetadata* aMetadata,
FileManager* aFileManager,
already_AddRefed<DirectoryLock> aDirectoryLock,
@@ -14151,7 +14035,6 @@ Database::Database(Factory* aFactory,
, mId(aMetadata->mDatabaseId)
, mFilePath(aMetadata->mFilePath)
, mActiveMutableFileCount(0)
- , mTelemetryId(aTelemetryId)
, mPersistenceType(aMetadata->mCommonMetadata.persistenceType())
, mFileHandleDisabled(aFileHandleDisabled)
, mChromeWriteAccessAllowed(aChromeWriteAccessAllowed)
@@ -17391,8 +17274,7 @@ FileManager::InitDirectory(nsIFile* aDirectory,
nsIFile* aDatabaseFile,
PersistenceType aPersistenceType,
const nsACString& aGroup,
- const nsACString& aOrigin,
- uint32_t aTelemetryId)
+ const nsACString& aOrigin)
{
AssertIsOnIOThread();
MOZ_ASSERT(aDirectory);
@@ -17464,7 +17346,6 @@ FileManager::InitDirectory(nsIFile* aDirectory,
aPersistenceType,
aGroup,
aOrigin,
- aTelemetryId,
getter_AddRefs(connection));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
@@ -17648,11 +17529,6 @@ QuotaClient::QuotaClient()
{
AssertIsOnBackgroundThread();
MOZ_ASSERT(!sInstance, "We expect this to be a singleton!");
- MOZ_ASSERT(!gTelemetryIdMutex);
-
- // Always create this so that later access to gTelemetryIdHashtable can be
- // properly synchronized.
- gTelemetryIdMutex = new Mutex("IndexedDB gTelemetryIdMutex");
sInstance = this;
}
@@ -17661,14 +17537,8 @@ QuotaClient::~QuotaClient()
{
AssertIsOnBackgroundThread();
MOZ_ASSERT(sInstance == this, "We expect this to be a singleton!");
- MOZ_ASSERT(gTelemetryIdMutex);
MOZ_ASSERT(!mMaintenanceThreadPool);
- // No one else should be able to touch gTelemetryIdHashtable now that the
- // QuotaClient has gone away.
- gTelemetryIdHashtable = nullptr;
- gTelemetryIdMutex = nullptr;
-
sInstance = nullptr;
}
@@ -17942,8 +17812,7 @@ QuotaClient::InitOrigin(PersistenceType aPersistenceType,
initInfo.mDatabaseFile,
aPersistenceType,
aGroup,
- aOrigin,
- TelemetryIdForFile(initInfo.mDatabaseFile));
+ aOrigin);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
@@ -19036,7 +18905,6 @@ DatabaseMaintenance::PerformMaintenanceOnDatabase()
mPersistenceType,
mGroup,
mOrigin,
- TelemetryIdForFile(databaseFile),
getter_AddRefs(connection));
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
@@ -21653,7 +21521,6 @@ OpenDatabaseOp::OpenDatabaseOp(Factory* aFactory,
, mMetadata(new FullDatabaseMetadata(aParams.metadata()))
, mRequestedVersion(aParams.metadata().version())
, mVersionChangeOp(nullptr)
- , mTelemetryId(0)
{
if (mContentParent) {
// This is a little scary but it looks safe to call this off the main thread
@@ -21762,8 +21629,6 @@ OpenDatabaseOp::DoDatabaseWork()
return rv;
}
- mTelemetryId = TelemetryIdForFile(dbFile);
-
#ifdef DEBUG
nsString databaseFilePath;
rv = dbFile->GetPath(databaseFilePath);
@@ -21794,7 +21659,6 @@ OpenDatabaseOp::DoDatabaseWork()
persistenceType,
mGroup,
mOrigin,
- mTelemetryId,
getter_AddRefs(connection));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
@@ -22677,7 +22541,6 @@ OpenDatabaseOp::EnsureDatabaseActor()
mOptionalContentParentId,
mGroup,
mOrigin,
- mTelemetryId,
mMetadata,
mFileManager,
mDirectoryLock.forget(),
diff --git a/dom/indexedDB/FileManager.h b/dom/indexedDB/FileManager.h
index da917f431..0fba46ec0 100644
--- a/dom/indexedDB/FileManager.h
+++ b/dom/indexedDB/FileManager.h
@@ -58,8 +58,7 @@ public:
nsIFile* aDatabaseFile,
PersistenceType aPersistenceType,
const nsACString& aGroup,
- const nsACString& aOrigin,
- uint32_t aTelemetryId);
+ const nsACString& aOrigin);
static nsresult
GetUsage(nsIFile* aDirectory, uint64_t* aUsage);
diff --git a/dom/indexedDB/IDBCursor.cpp b/dom/indexedDB/IDBCursor.cpp
index 7ae35e981..af88742f0 100644
--- a/dom/indexedDB/IDBCursor.cpp
+++ b/dom/indexedDB/IDBCursor.cpp
@@ -948,7 +948,6 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_CLASS(IDBCursor)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(IDBCursor)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRequest)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSourceObjectStore)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSourceIndex)
diff --git a/dom/indexedDB/IDBFactory.cpp b/dom/indexedDB/IDBFactory.cpp
index 825d2ac36..c1ef6353d 100644
--- a/dom/indexedDB/IDBFactory.cpp
+++ b/dom/indexedDB/IDBFactory.cpp
@@ -865,7 +865,6 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_CLASS(IDBFactory)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(IDBFactory)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/indexedDB/IDBIndex.cpp b/dom/indexedDB/IDBIndex.cpp
index 657e744c9..af50926e6 100644
--- a/dom/indexedDB/IDBIndex.cpp
+++ b/dom/indexedDB/IDBIndex.cpp
@@ -652,7 +652,6 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(IDBIndex)
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(IDBIndex)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mObjectStore)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/indexedDB/IDBKeyRange.cpp b/dom/indexedDB/IDBKeyRange.cpp
index 2de48a70c..e61c80617 100644
--- a/dom/indexedDB/IDBKeyRange.cpp
+++ b/dom/indexedDB/IDBKeyRange.cpp
@@ -239,7 +239,6 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(IDBKeyRange)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(IDBKeyRange)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(IDBKeyRange)
diff --git a/dom/indexedDB/IDBObjectStore.cpp b/dom/indexedDB/IDBObjectStore.cpp
index 8a0b292ad..756792741 100644
--- a/dom/indexedDB/IDBObjectStore.cpp
+++ b/dom/indexedDB/IDBObjectStore.cpp
@@ -1758,7 +1758,6 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(IDBObjectStore)
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(IDBObjectStore)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTransaction)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mIndexes)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDeletedIndexes)
diff --git a/dom/indexedDB/IDBRequest.cpp b/dom/indexedDB/IDBRequest.cpp
index 919d3adc7..e0e318059 100644
--- a/dom/indexedDB/IDBRequest.cpp
+++ b/dom/indexedDB/IDBRequest.cpp
@@ -417,8 +417,6 @@ IDBRequest::GetError(ErrorResult& aRv)
NS_IMPL_CYCLE_COLLECTION_CLASS(IDBRequest)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IDBRequest, IDBWrapperCache)
- // Don't need NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS because
- // DOMEventTargetHelper does it for us.
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSourceAsObjectStore)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSourceAsIndex)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSourceAsCursor)
diff --git a/dom/indexedDB/IDBWrapperCache.cpp b/dom/indexedDB/IDBWrapperCache.cpp
index df62514c8..ccc2bb43e 100644
--- a/dom/indexedDB/IDBWrapperCache.cpp
+++ b/dom/indexedDB/IDBWrapperCache.cpp
@@ -18,8 +18,6 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(IDBWrapperCache)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IDBWrapperCache,
DOMEventTargetHelper)
- // Don't need NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS because
- // DOMEventTargetHelper does it for us.
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBWrapperCache,
diff --git a/dom/interfaces/html/nsIDOMHTMLElement.idl b/dom/interfaces/html/nsIDOMHTMLElement.idl
index 63a1f9572..686475f04 100644
--- a/dom/interfaces/html/nsIDOMHTMLElement.idl
+++ b/dom/interfaces/html/nsIDOMHTMLElement.idl
@@ -58,7 +58,6 @@ interface nsIDOMHTMLElement : nsIDOMElement
// CSSOM View
- [optional_argc] void scrollIntoView([optional] in boolean top);
readonly attribute nsIDOMElement offsetParent;
readonly attribute long offsetTop;
readonly attribute long offsetLeft;
diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp
index 417420ecb..79446151c 100644
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -84,7 +84,6 @@
#include "mozilla/ScopeExit.h"
#include "mozilla/Services.h"
#include "mozilla/StaticPtr.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/WebBrowserPersistDocumentParent.h"
#include "mozilla/Unused.h"
#include "nsAnonymousTemporaryFile.h"
@@ -3364,17 +3363,6 @@ ContentParent::RecvIsSecureURI(const uint32_t& type,
}
bool
-ContentParent::RecvAccumulateMixedContentHSTS(const URIParams& aURI, const bool& aActive)
-{
- nsCOMPtr<nsIURI> ourURI = DeserializeURI(aURI);
- if (!ourURI) {
- return false;
- }
- nsMixedContentBlocker::AccumulateMixedContentHSTS(ourURI, aActive);
- return true;
-}
-
-bool
ContentParent::RecvLoadURIExternal(const URIParams& uri,
PBrowserParent* windowContext)
{
@@ -4764,19 +4752,3 @@ ContentParent::ForceTabPaint(TabParent* aTabParent, uint64_t aLayerObserverEpoch
}
ProcessHangMonitor::ForcePaint(mHangMonitorActor, aTabParent, aLayerObserverEpoch);
}
-
-bool
-ContentParent::RecvAccumulateChildHistogram(
- InfallibleTArray<Accumulation>&& aAccumulations)
-{
- /* STUB */
- return true;
-}
-
-bool
-ContentParent::RecvAccumulateChildKeyedHistogram(
- InfallibleTArray<KeyedAccumulation>&& aAccumulations)
-{
- /* STUB */
- return true;
-}
diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h
index abcea0b65..26b5c44ac 100644
--- a/dom/ipc/ContentParent.h
+++ b/dom/ipc/ContentParent.h
@@ -741,9 +741,6 @@ private:
virtual bool RecvIsSecureURI(const uint32_t& aType, const URIParams& aURI,
const uint32_t& aFlags, bool* aIsSecureURI) override;
- virtual bool RecvAccumulateMixedContentHSTS(const URIParams& aURI,
- const bool& aActive) override;
-
virtual bool DeallocPHalParent(PHalParent*) override;
virtual bool
@@ -1044,10 +1041,6 @@ private:
virtual bool RecvDeleteGetFilesRequest(const nsID& aID) override;
- virtual bool RecvAccumulateChildHistogram(
- InfallibleTArray<Accumulation>&& aAccumulations) override;
- virtual bool RecvAccumulateChildKeyedHistogram(
- InfallibleTArray<KeyedAccumulation>&& aAccumulations) override;
public:
void SendGetFilesResponseAndForget(const nsID& aID,
const GetFilesResponseResult& aResult);
diff --git a/dom/ipc/PContent.ipdl b/dom/ipc/PContent.ipdl
index 9298f9d02..e8fb25aec 100644
--- a/dom/ipc/PContent.ipdl
+++ b/dom/ipc/PContent.ipdl
@@ -89,8 +89,6 @@ using mozilla::DataStorageType from "ipc/DataStorageIPCUtils.h";
using mozilla::DocShellOriginAttributes from "mozilla/ipc/BackgroundUtils.h";
using struct mozilla::layers::TextureFactoryIdentifier from "mozilla/layers/CompositorTypes.h";
using struct mozilla::dom::FlyWebPublishOptions from "mozilla/dom/FlyWebPublishOptionsIPCSerializer.h";
-using mozilla::Telemetry::Accumulation from "mozilla/TelemetryComms.h";
-using mozilla::Telemetry::KeyedAccumulation from "mozilla/TelemetryComms.h";
union ChromeRegistryItem
{
@@ -658,8 +656,6 @@ parent:
sync IsSecureURI(uint32_t type, URIParams uri, uint32_t flags)
returns (bool isSecureURI);
- async AccumulateMixedContentHSTS(URIParams uri, bool active);
-
sync GetLookAndFeelCache()
returns (LookAndFeelInt[] lookAndFeelIntCache);
@@ -1022,12 +1018,6 @@ parent:
async UnstoreAndBroadcastBlobURLUnregistration(nsCString url);
- /**
- * Messages for communicating child Telemetry to the parent process
- */
- async AccumulateChildHistogram(Accumulation[] accumulations);
- async AccumulateChildKeyedHistogram(KeyedAccumulation[] accumulations);
-
sync GetA11yContentId() returns (uint32_t aContentId);
both:
diff --git a/dom/ipc/TabChild.cpp b/dom/ipc/TabChild.cpp
index 3fe94001e..e1355adee 100644
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -176,7 +176,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(TabChildBase)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTabChildGlobal)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWebBrowserChrome)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/media/DecoderTraits.cpp b/dom/media/DecoderTraits.cpp
index f8cb4fd0e..6aa44f3e5 100644
--- a/dom/media/DecoderTraits.cpp
+++ b/dom/media/DecoderTraits.cpp
@@ -10,7 +10,6 @@
#include "nsCharSeparatedTokenizer.h"
#include "nsMimeTypes.h"
#include "mozilla/Preferences.h"
-#include "mozilla/Telemetry.h"
#include "OggDecoder.h"
#include "OggDemuxer.h"
@@ -85,22 +84,6 @@ DecoderTraits::IsWebMAudioType(const nsACString& aType)
return aType.EqualsASCII("audio/webm");
}
-static char const *const gHttpLiveStreamingTypes[] = {
- // For m3u8.
- // https://tools.ietf.org/html/draft-pantos-http-live-streaming-19#section-10
- "application/vnd.apple.mpegurl",
- // Some sites serve these as the informal m3u type.
- "application/x-mpegurl",
- "audio/x-mpegurl",
- nullptr
-};
-
-static bool
-IsHttpLiveStreamingType(const nsACString& aType)
-{
- return CodecListContains(gHttpLiveStreamingTypes, aType);
-}
-
#ifdef MOZ_FMP4
static bool
IsMP4SupportedType(const MediaContentType& aParsedType,
@@ -247,10 +230,6 @@ CanHandleMediaType(const MediaContentType& aType,
{
MOZ_ASSERT(NS_IsMainThread());
- if (IsHttpLiveStreamingType(aType.GetMIMEType())) {
- /* Telemetry STUB */
- }
-
if (aType.HaveCodecs()) {
CanPlayStatus result = CanHandleCodecsType(aType, aDiagnostics);
if (result == CANPLAY_NO || result == CANPLAY_YES) {
diff --git a/dom/media/GraphDriver.cpp b/dom/media/GraphDriver.cpp
index b60dfee9d..37c692a4b 100644
--- a/dom/media/GraphDriver.cpp
+++ b/dom/media/GraphDriver.cpp
@@ -629,7 +629,6 @@ AudioCallbackDriver::Init()
cubeb_stream_params output;
cubeb_stream_params input;
uint32_t latency_frames;
- bool firstStream = CubebUtils::GetFirstStream();
MOZ_ASSERT(!NS_IsMainThread(),
"This is blocking and should never run on the main thread.");
diff --git a/dom/media/MediaDecoder.cpp b/dom/media/MediaDecoder.cpp
index cf2266bf6..223c59c3b 100644
--- a/dom/media/MediaDecoder.cpp
+++ b/dom/media/MediaDecoder.cpp
@@ -30,7 +30,6 @@
#include "mozilla/dom/VideoTrack.h"
#include "mozilla/dom/VideoTrackList.h"
#include "nsPrintfCString.h"
-#include "mozilla/Telemetry.h"
#include "GMPService.h"
#include "Layers.h"
#include "mozilla/layers/ShadowLayers.h"
@@ -421,7 +420,6 @@ MediaDecoder::MediaDecoder(MediaDecoderOwner* aOwner)
, INIT_CANONICAL(mPlaybackRateReliable, true)
, INIT_CANONICAL(mDecoderPosition, 0)
, INIT_CANONICAL(mIsVisible, !aOwner->IsHidden())
- , mTelemetryReported(false)
{
MOZ_COUNT_CTOR(MediaDecoder);
MOZ_ASSERT(NS_IsMainThread());
@@ -841,41 +839,6 @@ MediaDecoder::MetadataLoaded(nsAutoPtr<MediaInfo> aInfo,
// So we call Invalidate() after calling mOwner->MetadataLoaded to ensure
// the media element has the latest dimensions.
Invalidate();
-
- EnsureTelemetryReported();
-}
-
-void
-MediaDecoder::EnsureTelemetryReported()
-{
- MOZ_ASSERT(NS_IsMainThread());
-
- if (mTelemetryReported || !mInfo) {
- // Note: sometimes we get multiple MetadataLoaded calls (for example
- // for chained ogg). So we ensure we don't report duplicate results for
- // these resources.
- return;
- }
-
- nsTArray<nsCString> codecs;
- if (mInfo->HasAudio() && !mInfo->mAudio.GetAsAudioInfo()->mMimeType.IsEmpty()) {
- codecs.AppendElement(mInfo->mAudio.GetAsAudioInfo()->mMimeType);
- }
- if (mInfo->HasVideo() && !mInfo->mVideo.GetAsVideoInfo()->mMimeType.IsEmpty()) {
- codecs.AppendElement(mInfo->mVideo.GetAsVideoInfo()->mMimeType);
- }
- if (codecs.IsEmpty()) {
- if (mResource->GetContentType().IsEmpty()) {
- NS_WARNING("Somehow the resource's content type is empty");
- return;
- }
- codecs.AppendElement(nsPrintfCString("resource; %s", mResource->GetContentType().get()));
- }
- for (const nsCString& codec : codecs) {
- DECODER_LOG("Telemetry MEDIA_CODEC_USED= '%s'", codec.get());
- }
-
- mTelemetryReported = true;
}
const char*
diff --git a/dom/media/MediaDecoder.h b/dom/media/MediaDecoder.h
index 7e93de044..05e88db8b 100644
--- a/dom/media/MediaDecoder.h
+++ b/dom/media/MediaDecoder.h
@@ -440,8 +440,6 @@ private:
void SetCDMProxy(CDMProxy* aProxy);
- void EnsureTelemetryReported();
-
static bool IsOggEnabled();
static bool IsOpusEnabled();
static bool IsWaveEnabled();
@@ -852,8 +850,6 @@ private:
// download has ended. Called on the main thread only. aStatus is
// the result from OnStopRequest.
void NotifyDownloadEnded(nsresult aStatus);
-
- bool mTelemetryReported;
};
} // namespace mozilla
diff --git a/dom/media/MediaDecoderStateMachine.cpp b/dom/media/MediaDecoderStateMachine.cpp
index 5bc1d95ef..2ed1956c9 100644
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1173,27 +1173,12 @@ StateObject::HandleShutdown()
return SetState<ShutdownState>();
}
-static void
-ReportRecoveryTelemetry(const TimeStamp& aRecoveryStart,
- const MediaInfo& aMediaInfo,
- bool aIsHardwareAccelerated)
-{
-/* STUB */
-}
-
void
MediaDecoderStateMachine::
StateObject::HandleResumeVideoDecoding()
{
MOZ_ASSERT(mMaster->mVideoDecodeSuspended);
- // Start counting recovery time from right now.
- TimeStamp start = TimeStamp::Now();
-
- // Local reference to mInfo, so that it will be copied in the lambda below.
- auto& info = Info();
- bool hw = Reader()->VideoIsHardwareAccelerated();
-
// Start video-only seek to the current time.
SeekJob seekJob;
@@ -1205,10 +1190,7 @@ StateObject::HandleResumeVideoDecoding()
type,
true /* aVideoOnly */);
- SetState<SeekingState>(Move(seekJob), EventVisibility::Suppressed)->Then(
- AbstractThread::MainThread(), __func__,
- [start, info, hw](){ ReportRecoveryTelemetry(start, info, hw); },
- [](){});
+ SetState<SeekingState>(Move(seekJob), EventVisibility::Suppressed);
}
void
diff --git a/dom/media/MediaFormatReader.cpp b/dom/media/MediaFormatReader.cpp
index 06e8b963b..773434710 100644
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -32,6 +32,10 @@ using mozilla::layers::Image;
using mozilla::layers::LayerManager;
using mozilla::layers::LayersBackend;
+// avoid redefined macro warning in unified builds
+#undef LOG
+#undef LOGV
+
static mozilla::LazyLogModule sFormatDecoderLog("MediaFormatReader");
mozilla::LazyLogModule gMediaDemuxerLog("MediaDemuxer");
diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp
index baaf45416..288f2e74d 100644
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -2033,7 +2033,6 @@ MediaManager::GetUserMedia(nsPIDOMWindowInner* aWindow,
}
// Determine permissions early (while we still have a stack).
-
nsIURI* docURI = aWindow->GetDocumentURI();
if (!docURI) {
return NS_ERROR_UNEXPECTED;
@@ -2043,22 +2042,9 @@ MediaManager::GetUserMedia(nsPIDOMWindowInner* aWindow,
Preferences::GetBool("media.navigator.permission.disabled", false);
bool isHTTPS = false;
docURI->SchemeIs("https", &isHTTPS);
- nsCString host;
- nsresult rv = docURI->GetHost(host);
- // Test for some other schemes that ServiceWorker recognizes
- bool isFile;
- docURI->SchemeIs("file", &isFile);
- bool isApp;
- docURI->SchemeIs("app", &isApp);
- // Same localhost check as ServiceWorkers uses
- // (see IsOriginPotentiallyTrustworthy())
- bool isLocalhost = NS_SUCCEEDED(rv) &&
- (host.LowerCaseEqualsLiteral("localhost") ||
- host.LowerCaseEqualsLiteral("127.0.0.1") ||
- host.LowerCaseEqualsLiteral("::1"));
nsCString origin;
- rv = nsPrincipal::GetOriginForURI(docURI, origin);
+ nsresult rv = nsPrincipal::GetOriginForURI(docURI, origin);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
diff --git a/dom/media/fmp4/MP4Demuxer.cpp b/dom/media/fmp4/MP4Demuxer.cpp
index 5a637b003..ef68d5dca 100644
--- a/dom/media/fmp4/MP4Demuxer.cpp
+++ b/dom/media/fmp4/MP4Demuxer.cpp
@@ -16,9 +16,6 @@
#include "mp4_demuxer/Index.h"
#include "nsPrintfCString.h"
-// Used for telemetry
-#include "mozilla/Telemetry.h"
-#include "mp4_demuxer/AnnexB.h"
#include "mp4_demuxer/H264.h"
#include "nsAutoPtr.h"
@@ -72,23 +69,10 @@ private:
// Queued samples extracted by the demuxer, but not yet returned.
RefPtr<MediaRawData> mQueuedSample;
bool mNeedReIndex;
- bool mNeedSPSForTelemetry;
bool mIsH264 = false;
};
-// Returns true if no SPS was found and search for it should continue.
-bool
-AccumulateSPSTelemetry(const MediaByteBuffer* aExtradata)
-{
- // XXX: Do we still need this without telemetry?
- mp4_demuxer::SPSData spsdata;
- if (mp4_demuxer::H264::DecodeSPSFromExtraData(aExtradata, spsdata)) {
- return false;
- }
- return true;
-}
-
MP4Demuxer::MP4Demuxer(MediaResource* aResource)
: mResource(aResource)
, mStream(new mp4_demuxer::ResourceStream(aResource))
@@ -219,25 +203,10 @@ MP4TrackDemuxer::MP4TrackDemuxer(MP4Demuxer* aParent,
EnsureUpToDateIndex(); // Force update of index
VideoInfo* videoInfo = mInfo->GetAsVideoInfo();
- // Collect telemetry from h264 AVCC SPS.
if (videoInfo &&
(mInfo->mMimeType.EqualsLiteral("video/mp4") ||
mInfo->mMimeType.EqualsLiteral("video/avc"))) {
mIsH264 = true;
- RefPtr<MediaByteBuffer> extraData = videoInfo->mExtraData;
- mNeedSPSForTelemetry = AccumulateSPSTelemetry(extraData);
- mp4_demuxer::SPSData spsdata;
- if (mp4_demuxer::H264::DecodeSPSFromExtraData(extraData, spsdata) &&
- spsdata.pic_width > 0 && spsdata.pic_height > 0 &&
- mp4_demuxer::H264::EnsureSPSIsSane(spsdata)) {
- videoInfo->mImage.width = spsdata.pic_width;
- videoInfo->mImage.height = spsdata.pic_height;
- videoInfo->mDisplay.width = spsdata.display_width;
- videoInfo->mDisplay.height = spsdata.display_height;
- }
- } else {
- // No SPS to be found.
- mNeedSPSForTelemetry = false;
}
}
@@ -364,15 +333,6 @@ MP4TrackDemuxer::GetSamples(int32_t aNumSamples)
if (samples->mSamples.IsEmpty()) {
return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
} else {
- for (const auto& sample : samples->mSamples) {
- // Collect telemetry from h264 Annex B SPS.
- if (mNeedSPSForTelemetry && mp4_demuxer::AnnexB::HasSPS(sample)) {
- RefPtr<MediaByteBuffer> extradata =
- mp4_demuxer::AnnexB::ExtractExtraData(sample);
- mNeedSPSForTelemetry = AccumulateSPSTelemetry(extradata);
- }
- }
-
if (mNextKeyframeTime.isNothing() ||
samples->mSamples.LastElement()->mTime >= mNextKeyframeTime.value().ToMicroseconds()) {
SetNextKeyFrameTime();
diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
index e1c326818..426e9f74b 100644
--- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
@@ -145,6 +145,8 @@ FFmpegLibWrapper::Link()
AV_FUNC(avcodec_alloc_frame, (AV_FUNC_53 | AV_FUNC_54))
AV_FUNC(avcodec_get_frame_defaults, (AV_FUNC_53 | AV_FUNC_54))
AV_FUNC(avcodec_free_frame, AV_FUNC_54)
+ AV_FUNC(avcodec_send_packet, AV_FUNC_58)
+ AV_FUNC(avcodec_receive_frame, AV_FUNC_58)
AV_FUNC(av_log_set_level, AV_FUNC_AVUTIL_ALL)
AV_FUNC(av_malloc, AV_FUNC_AVUTIL_ALL)
AV_FUNC(av_freep, AV_FUNC_AVUTIL_ALL)
diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
index c6c43a4ae..b968edd32 100644
--- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
@@ -71,6 +71,10 @@ struct FFmpegLibWrapper
// libavcodec v54 only
void (*avcodec_free_frame)(AVFrame** frame);
+ // libavcodec v58 and later only
+ int (*avcodec_send_packet)(AVCodecContext* avctx, const AVPacket* avpkt);
+ int (*avcodec_receive_frame)(AVCodecContext* avctx, AVFrame* frame);
+
// libavutil
void (*av_log_set_level)(int level);
void* (*av_malloc)(size_t size);
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
index aec1e9136..f3101e44c 100644
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
@@ -174,12 +174,15 @@ FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample, bool* aGotFrame)
uint8_t* inputData = const_cast<uint8_t*>(aSample->Data());
size_t inputSize = aSample->Size();
-#if LIBAVCODEC_VERSION_MAJOR >= 54
+#if LIBAVCODEC_VERSION_MAJOR >= 54 && LIBAVCODEC_VERSION_MAJOR < 58
if (inputSize && mCodecParser && (mCodecID == AV_CODEC_ID_VP8
-#if LIBAVCODEC_VERSION_MAJOR >= 55
+#if LIBAVCODEC_VERSION_MAJOR >= 55 && LIBAVCODEC_VERSION_MAJOR < 58
|| mCodecID == AV_CODEC_ID_VP9
#endif
- )) {
+ ))
+#endif
+#if LIBAVCODEC_VERSION_MAJOR >= 54
+ {
while (inputSize) {
uint8_t* data = inputData;
int size = inputSize;
@@ -224,6 +227,48 @@ FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample,
packet.flags = aSample->mKeyframe ? AV_PKT_FLAG_KEY : 0;
packet.pos = aSample->mOffset;
+#if LIBAVCODEC_VERSION_MAJOR >= 58
+ packet.duration = aSample->mDuration;
+ int res = mLib->avcodec_send_packet(mCodecContext, &packet);
+ if (res < 0) {
+ // In theory, avcodec_send_packet could sent -EAGAIN should its internal
+ // buffers be full. In practice this can't happen as we only feed one frame
+ // at a time, and we immediately call avcodec_receive_frame right after.
+ FFMPEG_LOG("avcodec_send_packet error: %d", res);
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("avcodec_send_packet error: %d", res));
+ }
+
+ if (aGotFrame) {
+ *aGotFrame = false;
+ }
+ do {
+ if (!PrepareFrame()) {
+ NS_WARNING("FFmpeg h264 decoder failed to allocate frame.");
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+ res = mLib->avcodec_receive_frame(mCodecContext, mFrame);
+ if (res == int(AVERROR_EOF)) {
+ return NS_ERROR_DOM_MEDIA_END_OF_STREAM;
+ }
+ if (res == AVERROR(EAGAIN)) {
+ return NS_OK;
+ }
+ if (res < 0) {
+ FFMPEG_LOG("avcodec_receive_frame error: %d", res);
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("avcodec_receive_frame error: %d", res));
+ }
+ MediaResult rv = CreateImage(mFrame->pkt_pos, mFrame->pkt_pts,
+ mFrame->pkt_duration);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ if (aGotFrame) {
+ *aGotFrame = true;
+ }
+ } while (true);
+#else
// LibAV provides no API to retrieve the decoded sample's duration.
// (FFmpeg >= 1.0 provides av_frame_get_pkt_duration)
// As such we instead use a map using the dts as key that we will retrieve
@@ -276,8 +321,21 @@ FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample,
// against the map becoming extremely big.
mDurationMap.Clear();
}
+
+ MediaResult rv = CreateImage(aSample->mOffset, pts, duration);
+ if (NS_SUCCEEDED(rv) && aGotFrame) {
+ *aGotFrame = true;
+ }
+ return rv;
+#endif
+}
+
+MediaResult
+FFmpegVideoDecoder<LIBAV_VER>::CreateImage(int64_t aOffset, int64_t aPts,
+ int64_t aDuration)
+{
FFMPEG_LOG("Got one frame output with pts=%lld dts=%lld duration=%lld opaque=%lld",
- pts, mFrame->pkt_dts, duration, mCodecContext->reordered_opaque);
+ aPts, mFrame->pkt_dts, aDuration, mCodecContext->reordered_opaque);
VideoData::YCbCrBuffer b;
b.mPlanes[0].mData = mFrame->data[0];
@@ -317,9 +375,9 @@ FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample,
RefPtr<VideoData> v =
VideoData::CreateAndCopyData(mInfo,
mImageContainer,
- aSample->mOffset,
- pts,
- duration,
+ aOffset,
+ aPts,
+ aDuration,
b,
!!mFrame->key_frame,
-1,
@@ -331,9 +389,6 @@ FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample,
RESULT_DETAIL("image allocation error"));
}
mCallback->Output(v);
- if (aGotFrame) {
- *aGotFrame = true;
- }
return NS_OK;
}
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
index 786df0da1..49a55e8a6 100644
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
@@ -49,6 +49,7 @@ private:
MediaResult DoDecode(MediaRawData* aSample) override;
MediaResult DoDecode(MediaRawData* aSample, bool* aGotFrame);
MediaResult DoDecode(MediaRawData* aSample, uint8_t* aData, int aSize, bool* aGotFrame);
+ MediaResult CreateImage(int64_t aOffset, int64_t aPts, int64_t aDuration);
void ProcessDrain() override;
void ProcessFlush() override;
void OutputDelayedFrames();
diff --git a/dom/media/platforms/wmf/WMFMediaDataDecoder.cpp b/dom/media/platforms/wmf/WMFMediaDataDecoder.cpp
index 15e2e1097..e6dd29c6d 100644
--- a/dom/media/platforms/wmf/WMFMediaDataDecoder.cpp
+++ b/dom/media/platforms/wmf/WMFMediaDataDecoder.cpp
@@ -38,39 +38,6 @@ WMFMediaDataDecoder::Init()
return InitPromise::CreateAndResolve(mMFTManager->GetType(), __func__);
}
-// A single telemetry sample is reported for each MediaDataDecoder object
-// that has detected error or produced output successfully.
-static void
-SendTelemetry(unsigned long hr)
-{
- // Collapse the error codes into a range of 0-0xff that can be viewed in
- // telemetry histograms. For most MF_E_* errors, unique samples are used,
- // retaining the least significant 7 or 8 bits. Other error codes are
- // bucketed.
- uint32_t sample;
- if (SUCCEEDED(hr)) {
- sample = 0;
- } else if (hr < 0xc00d36b0) {
- sample = 1; // low bucket
- } else if (hr < 0xc00d3700) {
- sample = hr & 0xffU; // MF_E_*
- } else if (hr <= 0xc00d3705) {
- sample = 0x80 + (hr & 0xfU); // more MF_E_*
- } else if (hr < 0xc00d6d60) {
- sample = 2; // mid bucket
- } else if (hr <= 0xc00d6d78) {
- sample = hr & 0xffU; // MF_E_TRANSFORM_*
- } else {
- sample = 3; // high bucket
- }
-
- nsCOMPtr<nsIRunnable> runnable = NS_NewRunnableFunction(
- [sample] {
- /* Telemetry STUB */
- });
- NS_DispatchToMainThread(runnable);
-}
-
void
WMFMediaDataDecoder::Shutdown()
{
@@ -90,9 +57,6 @@ WMFMediaDataDecoder::ProcessShutdown()
if (mMFTManager) {
mMFTManager->Shutdown();
mMFTManager = nullptr;
- if (!mRecordedError && mHasSuccessfulOutput) {
- SendTelemetry(S_OK);
- }
}
}
@@ -124,10 +88,6 @@ WMFMediaDataDecoder::ProcessDecode(MediaRawData* aSample)
NS_WARNING("MFTManager rejected sample");
mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
RESULT_DETAIL("MFTManager::Input:%x", hr)));
- if (!mRecordedError) {
- SendTelemetry(hr);
- mRecordedError = true;
- }
return;
}
@@ -143,7 +103,6 @@ WMFMediaDataDecoder::ProcessOutput()
HRESULT hr = S_OK;
while (SUCCEEDED(hr = mMFTManager->Output(mLastStreamOffset, output)) &&
output) {
- mHasSuccessfulOutput = true;
mCallback->Output(output);
}
if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) {
@@ -152,10 +111,6 @@ WMFMediaDataDecoder::ProcessOutput()
NS_WARNING("WMFMediaDataDecoder failed to output data");
mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
RESULT_DETAIL("MFTManager::Output:%x", hr)));
- if (!mRecordedError) {
- SendTelemetry(hr);
- mRecordedError = true;
- }
}
}
diff --git a/dom/media/platforms/wmf/WMFMediaDataDecoder.h b/dom/media/platforms/wmf/WMFMediaDataDecoder.h
index 75571d61e..f869012e7 100644
--- a/dom/media/platforms/wmf/WMFMediaDataDecoder.h
+++ b/dom/media/platforms/wmf/WMFMediaDataDecoder.h
@@ -136,10 +136,6 @@ private:
Atomic<bool> mIsFlushing;
bool mIsShutDown;
-
- // For telemetry
- bool mHasSuccessfulOutput = false;
- bool mRecordedError = false;
};
} // namespace mozilla
diff --git a/dom/media/test/crashtests/1228484.html b/dom/media/test/crashtests/1228484.html
deleted file mode 100644
index 2b2e9b0f9..000000000
--- a/dom/media/test/crashtests/1228484.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<script>
-
-var htmlAudio = new Audio(URL.createObjectURL(new window.MediaSource()));
-
-(new window.AudioContext("ringer")).createMediaElementSource(htmlAudio);
-(new window.AudioContext("alarm")).createMediaElementSource(htmlAudio);
-
-</script>
-</head>
-</html>
diff --git a/dom/media/test/crashtests/crashtests.list b/dom/media/test/crashtests/crashtests.list
index 496fe5ee5..e4f25ca8d 100644
--- a/dom/media/test/crashtests/crashtests.list
+++ b/dom/media/test/crashtests/crashtests.list
@@ -81,8 +81,6 @@ load 1157994.html
load 1158427.html
load 1185176.html
load 1185192.html
-load 1223670.html
-load 1228484.html
load 1304948.html
load 1319486.html
load 1291702.html
diff --git a/dom/media/webaudio/AudioBuffer.cpp b/dom/media/webaudio/AudioBuffer.cpp
index cb834f6a5..e7eba2d48 100644
--- a/dom/media/webaudio/AudioBuffer.cpp
+++ b/dom/media/webaudio/AudioBuffer.cpp
@@ -27,7 +27,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(AudioBuffer)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(AudioBuffer)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(AudioBuffer)
diff --git a/dom/media/webaudio/AudioContext.cpp b/dom/media/webaudio/AudioContext.cpp
index 85842c811..d58441309 100755
--- a/dom/media/webaudio/AudioContext.cpp
+++ b/dom/media/webaudio/AudioContext.cpp
@@ -179,23 +179,13 @@ AudioContext::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
AudioContext::Constructor(const GlobalObject& aGlobal,
ErrorResult& aRv)
{
- return AudioContext::Constructor(aGlobal,
- AudioChannelService::GetDefaultAudioChannel(),
- aRv);
-}
-
-/* static */ already_AddRefed<AudioContext>
-AudioContext::Constructor(const GlobalObject& aGlobal,
- AudioChannel aChannel,
- ErrorResult& aRv)
-{
nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
if (!window) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
- RefPtr<AudioContext> object = new AudioContext(window, false, aChannel);
+ RefPtr<AudioContext> object = new AudioContext(window, false, AudioChannelService::GetDefaultAudioChannel());
aRv = object->Init();
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
diff --git a/dom/media/webaudio/AudioContext.h b/dom/media/webaudio/AudioContext.h
index 069efa986..599debef8 100644
--- a/dom/media/webaudio/AudioContext.h
+++ b/dom/media/webaudio/AudioContext.h
@@ -151,12 +151,6 @@ public:
static already_AddRefed<AudioContext>
Constructor(const GlobalObject& aGlobal, ErrorResult& aRv);
- // Constructor for regular AudioContext. A default audio channel is needed.
- static already_AddRefed<AudioContext>
- Constructor(const GlobalObject& aGlobal,
- AudioChannel aChannel,
- ErrorResult& aRv);
-
// Constructor for offline AudioContext
static already_AddRefed<AudioContext>
Constructor(const GlobalObject& aGlobal,
diff --git a/dom/media/webaudio/AudioParam.cpp b/dom/media/webaudio/AudioParam.cpp
index 6f5574993..c1a874264 100644
--- a/dom/media/webaudio/AudioParam.cpp
+++ b/dom/media/webaudio/AudioParam.cpp
@@ -22,7 +22,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(AudioParam)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(AudioParam)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mNode)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(AudioParam)
diff --git a/dom/media/webaudio/MediaBufferDecoder.cpp b/dom/media/webaudio/MediaBufferDecoder.cpp
index 2ee11eacd..f3b75ca1a 100644
--- a/dom/media/webaudio/MediaBufferDecoder.cpp
+++ b/dom/media/webaudio/MediaBufferDecoder.cpp
@@ -44,7 +44,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(WebAudioDecodeJob)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOutput)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSuccessCallback)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFailureCallback)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(WebAudioDecodeJob)
diff --git a/dom/media/webaudio/WaveShaperNode.cpp b/dom/media/webaudio/WaveShaperNode.cpp
index d5c617dcd..4c50f2f1d 100644
--- a/dom/media/webaudio/WaveShaperNode.cpp
+++ b/dom/media/webaudio/WaveShaperNode.cpp
@@ -23,7 +23,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(WaveShaperNode, AudioNode)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(WaveShaperNode, AudioNode)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(WaveShaperNode)
diff --git a/dom/network/TCPSocketChild.cpp b/dom/network/TCPSocketChild.cpp
index 8eb19a1db..72581ca9d 100644
--- a/dom/network/TCPSocketChild.cpp
+++ b/dom/network/TCPSocketChild.cpp
@@ -50,7 +50,6 @@ namespace dom {
NS_IMPL_CYCLE_COLLECTION_CLASS(TCPSocketChildBase)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(TCPSocketChildBase)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSocket)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/notification/Notification.cpp b/dom/notification/Notification.cpp
index 71c4916b9..a5aa48b00 100644
--- a/dom/notification/Notification.cpp
+++ b/dom/notification/Notification.cpp
@@ -11,7 +11,6 @@
#include "mozilla/OwningNonNull.h"
#include "mozilla/Preferences.h"
#include "mozilla/Services.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/Unused.h"
#include "mozilla/dom/AppNotificationServiceOptionsBinding.h"
@@ -656,172 +655,6 @@ NotificationPermissionRequest::GetTypes(nsIArray** aTypes)
aTypes);
}
-NS_IMPL_ISUPPORTS(NotificationTelemetryService, nsIObserver)
-
-NotificationTelemetryService::NotificationTelemetryService()
- : mDNDRecorded(false)
-{}
-
-NotificationTelemetryService::~NotificationTelemetryService()
-{
- Unused << NS_WARN_IF(NS_FAILED(RemovePermissionChangeObserver()));
-}
-
-/* static */ already_AddRefed<NotificationTelemetryService>
-NotificationTelemetryService::GetInstance()
-{
- nsCOMPtr<nsISupports> telemetrySupports =
- do_GetService(NOTIFICATIONTELEMETRYSERVICE_CONTRACTID);
- if (!telemetrySupports) {
- return nullptr;
- }
- RefPtr<NotificationTelemetryService> telemetry =
- static_cast<NotificationTelemetryService*>(telemetrySupports.get());
- return telemetry.forget();
-}
-
-nsresult
-NotificationTelemetryService::Init()
-{
- nsresult rv = AddPermissionChangeObserver();
- NS_ENSURE_SUCCESS(rv, rv);
-
- RecordPermissions();
-
- return NS_OK;
-}
-
-nsresult
-NotificationTelemetryService::RemovePermissionChangeObserver()
-{
- nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
- if (!obs) {
- return NS_ERROR_OUT_OF_MEMORY;
- }
- return obs->RemoveObserver(this, "perm-changed");
-}
-
-nsresult
-NotificationTelemetryService::AddPermissionChangeObserver()
-{
- nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
- if (!obs) {
- return NS_ERROR_OUT_OF_MEMORY;
- }
- return obs->AddObserver(this, "perm-changed", false);
-}
-
-void
-NotificationTelemetryService::RecordPermissions()
-{
- if (!Telemetry::CanRecordBase() || !Telemetry::CanRecordExtended()) {
- return;
- }
-
- nsCOMPtr<nsIPermissionManager> permissionManager =
- services::GetPermissionManager();
- if (!permissionManager) {
- return;
- }
-
- nsCOMPtr<nsISimpleEnumerator> enumerator;
- nsresult rv = permissionManager->GetEnumerator(getter_AddRefs(enumerator));
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return;
- }
-
- for (;;) {
- bool hasMoreElements;
- nsresult rv = enumerator->HasMoreElements(&hasMoreElements);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return;
- }
- if (!hasMoreElements) {
- break;
- }
- nsCOMPtr<nsISupports> supportsPermission;
- rv = enumerator->GetNext(getter_AddRefs(supportsPermission));
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return;
- }
- uint32_t capability;
- if (!GetNotificationPermission(supportsPermission, &capability)) {
- continue;
- }
- }
-}
-
-bool
-NotificationTelemetryService::GetNotificationPermission(nsISupports* aSupports,
- uint32_t* aCapability)
-{
- nsCOMPtr<nsIPermission> permission = do_QueryInterface(aSupports);
- if (!permission) {
- return false;
- }
- nsAutoCString type;
- permission->GetType(type);
- if (!type.Equals("desktop-notification")) {
- return false;
- }
- permission->GetCapability(aCapability);
- return true;
-}
-
-void
-NotificationTelemetryService::RecordDNDSupported()
-{
- if (mDNDRecorded) {
- return;
- }
-
- nsCOMPtr<nsIAlertsService> alertService =
- do_GetService(NS_ALERTSERVICE_CONTRACTID);
- if (!alertService) {
- return;
- }
-
- nsCOMPtr<nsIAlertsDoNotDisturb> alertServiceDND =
- do_QueryInterface(alertService);
- if (!alertServiceDND) {
- return;
- }
-
- mDNDRecorded = true;
- bool isEnabled;
- nsresult rv = alertServiceDND->GetManualDoNotDisturb(&isEnabled);
- if (NS_FAILED(rv)) {
- return;
- }
-}
-
-nsresult
-NotificationTelemetryService::RecordSender(nsIPrincipal* aPrincipal)
-{
- if (!Telemetry::CanRecordBase() || !Telemetry::CanRecordExtended() ||
- !nsAlertsUtils::IsActionablePrincipal(aPrincipal)) {
- return NS_OK;
- }
- nsAutoString origin;
- nsresult rv = Notification::GetOrigin(aPrincipal, origin);
- if (NS_FAILED(rv)) {
- return rv;
- }
- if (!mOrigins.Contains(origin)) {
- mOrigins.PutEntry(origin);
- }
- return NS_OK;
-}
-
-NS_IMETHODIMP
-NotificationTelemetryService::Observe(nsISupports* aSubject,
- const char* aTopic,
- const char16_t* aData)
-{
- /* STUB */
- return NS_OK;
-}
-
// Observer that the alert service calls to do common tasks and/or dispatch to the
// specific observer for the context e.g. main thread, worker, or service worker.
class NotificationObserver final : public nsIObserver
@@ -1402,8 +1235,6 @@ NotificationObserver::Observe(nsISupports* aSubject, const char* aTopic,
return NS_OK;
} else if (!strcmp("alertshow", aTopic) ||
!strcmp("alertfinished", aTopic)) {
- RefPtr<NotificationTelemetryService> telemetry =
- NotificationTelemetryService::GetInstance();
Unused << NS_WARN_IF(NS_FAILED(AdjustPushQuota(aTopic)));
}
diff --git a/dom/notification/Notification.h b/dom/notification/Notification.h
index a2c4b5c68..11958f6ad 100644
--- a/dom/notification/Notification.h
+++ b/dom/notification/Notification.h
@@ -18,9 +18,6 @@
#include "nsTHashtable.h"
#include "nsWeakReference.h"
-#define NOTIFICATIONTELEMETRYSERVICE_CONTRACTID \
- "@mozilla.org/notificationTelemetryService;1"
-
class nsIPrincipal;
class nsIVariant;
@@ -49,36 +46,6 @@ public:
Notify(workers::Status aStatus) override;
};
-// Records telemetry probes at application startup, when a notification is
-// shown, and when the notification permission is revoked for a site.
-class NotificationTelemetryService final : public nsIObserver
-{
-public:
- NS_DECL_ISUPPORTS
- NS_DECL_NSIOBSERVER
-
- NotificationTelemetryService();
-
- static already_AddRefed<NotificationTelemetryService> GetInstance();
-
- nsresult Init();
- void RecordDNDSupported();
- void RecordPermissions();
- nsresult RecordSender(nsIPrincipal* aPrincipal);
-
-private:
- virtual ~NotificationTelemetryService();
-
- nsresult AddPermissionChangeObserver();
- nsresult RemovePermissionChangeObserver();
-
- bool GetNotificationPermission(nsISupports* aSupports,
- uint32_t* aCapability);
-
- bool mDNDRecorded;
- nsTHashtable<nsStringHashKey> mOrigins;
-};
-
/*
* Notifications on workers introduce some lifetime issues. The property we
* are trying to satisfy is:
@@ -143,7 +110,6 @@ class Notification : public DOMEventTargetHelper
friend class ServiceWorkerNotificationObserver;
friend class WorkerGetRunnable;
friend class WorkerNotificationObserver;
- friend class NotificationTelemetryService;
public:
IMPL_EVENT_HANDLER(click)
diff --git a/dom/performance/PerformanceMainThread.cpp b/dom/performance/PerformanceMainThread.cpp
index 64c06d3ea..5a84f5fb1 100644
--- a/dom/performance/PerformanceMainThread.cpp
+++ b/dom/performance/PerformanceMainThread.cpp
@@ -27,7 +27,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(PerformanceMainThread,
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTiming,
mNavigation,
mDocEntry)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(PerformanceMainThread,
diff --git a/dom/performance/PerformanceObserver.cpp b/dom/performance/PerformanceObserver.cpp
index d02acfb09..7bf194bb7 100644
--- a/dom/performance/PerformanceObserver.cpp
+++ b/dom/performance/PerformanceObserver.cpp
@@ -34,7 +34,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(PerformanceObserver)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCallback)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPerformance)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(PerformanceObserver)
diff --git a/dom/plugins/ipc/PluginModuleParent.cpp b/dom/plugins/ipc/PluginModuleParent.cpp
index 300c4f621..4a509676d 100755
--- a/dom/plugins/ipc/PluginModuleParent.cpp
+++ b/dom/plugins/ipc/PluginModuleParent.cpp
@@ -92,11 +92,6 @@ mozilla::plugins::SetupBridge(uint32_t aPluginId,
return true;
}
PluginModuleChromeParent* chromeParent = static_cast<PluginModuleChromeParent*>(plugin->GetLibrary());
- /*
- * We can't accumulate BLOCKED_ON_PLUGIN_MODULE_INIT_MS until here because
- * its histogram key is not available until *after* NP_Initialize.
- */
- chromeParent->AccumulateModuleInitBlockedTime();
*rv = chromeParent->GetRunID(runID);
if (NS_FAILED(*rv)) {
return true;
@@ -335,16 +330,13 @@ PluginModuleContentParent::LoadModule(uint32_t aPluginId,
dom::ContentChild* cp = dom::ContentChild::GetSingleton();
nsresult rv;
uint32_t runID;
- TimeStamp sendLoadPluginStart = TimeStamp::Now();
if (!cp->SendLoadPlugin(aPluginId, &rv, &runID) ||
NS_FAILED(rv)) {
return nullptr;
}
- TimeStamp sendLoadPluginEnd = TimeStamp::Now();
PluginModuleContentParent* parent = mapping->GetModule();
MOZ_ASSERT(parent);
- parent->mTimeBlocked += (sendLoadPluginEnd - sendLoadPluginStart);
if (!mapping->IsChannelOpened()) {
// mapping is linked into PluginModuleMapping::sModuleListHead and is
@@ -440,7 +432,6 @@ PluginModuleChromeParent::LoadModule(const char* aFilePath, uint32_t aPluginId,
aPluginTag->mSupportsAsyncInit));
UniquePtr<LaunchCompleteTask> onLaunchedRunnable(new LaunchedTask(parent));
parent->mSubprocess->SetCallRunnableImmediately(!parent->mIsStartingAsync);
- TimeStamp launchStart = TimeStamp::Now();
bool launched = parent->mSubprocess->Launch(Move(onLaunchedRunnable),
aPluginTag->mSandboxLevel);
if (!launched) {
@@ -459,8 +450,6 @@ PluginModuleChromeParent::LoadModule(const char* aFilePath, uint32_t aPluginId,
return nullptr;
}
}
- TimeStamp launchEnd = TimeStamp::Now();
- parent->mTimeBlocked = (launchEnd - launchStart);
return parent.forget();
}
@@ -1758,15 +1747,12 @@ PluginModuleChromeParent::NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs*
PluginSettings settings;
GetSettings(&settings);
- TimeStamp callNpInitStart = TimeStamp::Now();
// Asynchronous case
if (mIsStartingAsync) {
if (!SendAsyncNP_Initialize(settings)) {
Close();
return NS_ERROR_FAILURE;
}
- TimeStamp callNpInitEnd = TimeStamp::Now();
- mTimeBlocked += (callNpInitEnd - callNpInitStart);
return NS_OK;
}
@@ -1779,8 +1765,6 @@ PluginModuleChromeParent::NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs*
Close();
return NS_ERROR_FAILURE;
}
- TimeStamp callNpInitEnd = TimeStamp::Now();
- mTimeBlocked += (callNpInitEnd - callNpInitStart);
RecvNP_InitializeResult(*error);
@@ -1882,13 +1866,10 @@ PluginModuleChromeParent::NP_Initialize(NPNetscapeFuncs* bFuncs, NPError* error)
PluginSettings settings;
GetSettings(&settings);
- TimeStamp callNpInitStart = TimeStamp::Now();
if (mIsStartingAsync) {
if (!SendAsyncNP_Initialize(settings)) {
return NS_ERROR_FAILURE;
}
- TimeStamp callNpInitEnd = TimeStamp::Now();
- mTimeBlocked += (callNpInitEnd - callNpInitStart);
return NS_OK;
}
@@ -1896,8 +1877,6 @@ PluginModuleChromeParent::NP_Initialize(NPNetscapeFuncs* bFuncs, NPError* error)
Close();
return NS_ERROR_FAILURE;
}
- TimeStamp callNpInitEnd = TimeStamp::Now();
- mTimeBlocked += (callNpInitEnd - callNpInitStart);
RecvNP_InitializeResult(*error);
return NS_OK;
}
@@ -2194,14 +2173,6 @@ public:
}
};
-void
-PluginModuleParent::AccumulateModuleInitBlockedTime()
-{
- // XXX: mTimeBlocked can probably go if not used for anything besides
- // telemetry.
- mTimeBlocked = TimeDuration();
-}
-
nsresult
PluginModuleParent::NPP_NewInternal(NPMIMEType pluginType, NPP instance,
uint16_t mode,
@@ -2213,13 +2184,6 @@ PluginModuleParent::NPP_NewInternal(NPMIMEType pluginType, NPP instance,
if (mPluginName.IsEmpty()) {
GetPluginDetails();
InitQuirksModes(nsDependentCString(pluginType));
- /** mTimeBlocked measures the time that the main thread has been blocked
- * on plugin module initialization. As implemented, this is the sum of
- * plugin-container launch + toolhelp32 snapshot + NP_Initialize.
- * We don't accumulate its value until here because the plugin info
- * for its histogram key is not available until *after* NP_Initialize.
- */
- AccumulateModuleInitBlockedTime();
}
nsCaseInsensitiveUTF8StringArrayComparator comparator;
diff --git a/dom/plugins/ipc/PluginModuleParent.h b/dom/plugins/ipc/PluginModuleParent.h
index 0ceed6efd..909e8fe35 100644
--- a/dom/plugins/ipc/PluginModuleParent.h
+++ b/dom/plugins/ipc/PluginModuleParent.h
@@ -115,8 +115,6 @@ public:
return mPluginName + mPluginVersion;
}
- void AccumulateModuleInitBlockedTime();
-
virtual nsresult GetRunID(uint32_t* aRunID) override;
virtual void SetHasLocalInstance() override {
mHadLocalInstance = true;
@@ -315,7 +313,6 @@ protected:
nsString mBrowserDumpID;
nsString mHangID;
RefPtr<nsIObserver> mProfilerObserver;
- TimeDuration mTimeBlocked;
nsCString mPluginName;
nsCString mPluginVersion;
int32_t mSandboxLevel;
diff --git a/dom/promise/Promise.cpp b/dom/promise/Promise.cpp
index 557f3a1f9..f636a9101 100644
--- a/dom/promise/Promise.cpp
+++ b/dom/promise/Promise.cpp
@@ -413,7 +413,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Promise)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mResolveCallbacks)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRejectCallbacks)
#endif // SPIDERMONKEY_PROMISE
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(Promise)
@@ -1995,7 +1994,6 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(CountdownHolder)
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CountdownHolder)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPromise)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/dom/promise/PromiseCallback.cpp b/dom/promise/PromiseCallback.cpp
index 3f4a689ae..6ecf983b7 100644
--- a/dom/promise/PromiseCallback.cpp
+++ b/dom/promise/PromiseCallback.cpp
@@ -47,7 +47,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ResolvePromiseCallback,
PromiseCallback)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPromise)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ResolvePromiseCallback)
@@ -107,7 +106,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(RejectPromiseCallback,
PromiseCallback)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPromise)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(RejectPromiseCallback)
@@ -170,7 +168,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(InvokePromiseFuncCallback,
PromiseCallback)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPromiseFunc)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(InvokePromiseFuncCallback)
@@ -256,7 +253,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(WrapperPromiseCallback,
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mResolveFunc)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRejectFunc)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCallback)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(WrapperPromiseCallback)
diff --git a/dom/push/PushSubscriptionOptions.cpp b/dom/push/PushSubscriptionOptions.cpp
index bc4fead1e..39252e9e8 100644
--- a/dom/push/PushSubscriptionOptions.cpp
+++ b/dom/push/PushSubscriptionOptions.cpp
@@ -36,7 +36,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(PushSubscriptionOptions)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(PushSubscriptionOptions)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(PushSubscriptionOptions)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
diff --git a/dom/security/nsMixedContentBlocker.cpp b/dom/security/nsMixedContentBlocker.cpp
index 5f41f414d..543429aff 100644
--- a/dom/security/nsMixedContentBlocker.cpp
+++ b/dom/security/nsMixedContentBlocker.cpp
@@ -35,7 +35,6 @@
#include "nsISiteSecurityService.h"
#include "mozilla/Logging.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/dom/ContentChild.h"
#include "mozilla/ipc/URIUtils.h"
@@ -814,17 +813,13 @@ nsMixedContentBlocker::ShouldLoad(bool aHadInsecureImageRedirect,
//
// We do not count requests aHadInsecureImageRedirect=true, since these are
// just an artifact of the image caching system.
- bool active = (classification == eMixedScript);
if (!aHadInsecureImageRedirect) {
- if (XRE_IsParentProcess()) {
- AccumulateMixedContentHSTS(innerContentLocation, active);
- } else {
+ if (!XRE_IsParentProcess()) {
// Ask the parent process to do the same call
mozilla::dom::ContentChild* cc = mozilla::dom::ContentChild::GetSingleton();
if (cc) {
mozilla::ipc::URIParams uri;
SerializeURI(innerContentLocation, uri);
- cc->SendAccumulateMixedContentHSTS(uri, active);
}
}
}
@@ -977,11 +972,3 @@ enum MixedContentHSTSState {
MCB_HSTS_ACTIVE_NO_HSTS = 2,
MCB_HSTS_ACTIVE_WITH_HSTS = 3
};
-
-// Record information on when HSTS would have made mixed content not mixed
-// content (regardless of whether it was actually blocked)
-void
-nsMixedContentBlocker::AccumulateMixedContentHSTS(nsIURI* aURI, bool aActive)
-{
-/* STUB */
-} \ No newline at end of file
diff --git a/dom/security/nsMixedContentBlocker.h b/dom/security/nsMixedContentBlocker.h
index 56ab9621f..068068b25 100644
--- a/dom/security/nsMixedContentBlocker.h
+++ b/dom/security/nsMixedContentBlocker.h
@@ -61,9 +61,6 @@ public:
nsISupports* aExtra,
nsIPrincipal* aRequestPrincipal,
int16_t* aDecision);
- static void AccumulateMixedContentHSTS(nsIURI* aURI,
- bool aActive);
-
static bool sBlockMixedScript;
static bool sBlockMixedDisplay;
diff --git a/dom/storage/DOMStorageCache.cpp b/dom/storage/DOMStorageCache.cpp
index a6aa17424..a2b5a6f73 100644
--- a/dom/storage/DOMStorageCache.cpp
+++ b/dom/storage/DOMStorageCache.cpp
@@ -85,7 +85,6 @@ DOMStorageCache::DOMStorageCache(const nsACString* aOriginNoSuffix)
, mInitialized(false)
, mPersistent(false)
, mSessionOnlyDataSetActive(false)
-, mPreloadTelemetryRecorded(false)
{
MOZ_COUNT_CTOR(DOMStorageCache);
}
@@ -178,7 +177,7 @@ DOMStorageCache::DataSet(const DOMStorage* aStorage)
// Session only data set is demanded but not filled with
// current data set, copy to session only set now.
- WaitForPreload(Telemetry::LOCALDOMSTORAGE_SESSIONONLY_PRELOAD_BLOCKING_MS);
+ WaitForPreload();
Data& defaultSet = mData[kDefaultSet];
Data& sessionSet = mData[kSessionSet];
@@ -298,46 +297,18 @@ DOMStorageCache::KeepAlive()
mKeepAliveTimer.swap(timer);
}
-namespace {
-
-// The AutoTimer provided by telemetry headers is only using static,
-// i.e. compile time known ID, but here we know the ID only at run time.
-// Hence a new class.
-class TelemetryAutoTimer
-{
-public:
- explicit TelemetryAutoTimer(Telemetry::ID aId)
- : id(aId), start(TimeStamp::Now()) {}
- ~TelemetryAutoTimer()
- { /* STUB */ }
-private:
- Telemetry::ID id;
- const TimeStamp start;
-};
-
-} // namespace
-
void
-DOMStorageCache::WaitForPreload(Telemetry::ID aTelemetryID)
+DOMStorageCache::WaitForPreload()
{
if (!mPersistent) {
return;
}
bool loaded = mLoaded;
-
- // Telemetry of rates of pending preloads
- if (!mPreloadTelemetryRecorded) {
- mPreloadTelemetryRecorded = true;
- }
-
if (loaded) {
return;
}
- // Measure which operation blocks and for how long
- TelemetryAutoTimer timer(aTelemetryID);
-
// If preload already started (i.e. we got some first data, but not all)
// SyncPreload will just wait for it to finish rather then synchronously
// read from the database. It seems to me more optimal.
@@ -354,7 +325,7 @@ nsresult
DOMStorageCache::GetLength(const DOMStorage* aStorage, uint32_t* aRetval)
{
if (Persist(aStorage)) {
- WaitForPreload(Telemetry::LOCALDOMSTORAGE_GETLENGTH_BLOCKING_MS);
+ WaitForPreload();
if (NS_FAILED(mLoadResult)) {
return mLoadResult;
}
@@ -372,7 +343,7 @@ DOMStorageCache::GetKey(const DOMStorage* aStorage, uint32_t aIndex, nsAString&
// maybe we need to have a lazily populated key array here or
// something?
if (Persist(aStorage)) {
- WaitForPreload(Telemetry::LOCALDOMSTORAGE_GETKEY_BLOCKING_MS);
+ WaitForPreload();
if (NS_FAILED(mLoadResult)) {
return mLoadResult;
}
@@ -394,7 +365,7 @@ void
DOMStorageCache::GetKeys(const DOMStorage* aStorage, nsTArray<nsString>& aKeys)
{
if (Persist(aStorage)) {
- WaitForPreload(Telemetry::LOCALDOMSTORAGE_GETALLKEYS_BLOCKING_MS);
+ WaitForPreload();
}
if (NS_FAILED(mLoadResult)) {
@@ -411,7 +382,7 @@ DOMStorageCache::GetItem(const DOMStorage* aStorage, const nsAString& aKey,
nsAString& aRetval)
{
if (Persist(aStorage)) {
- WaitForPreload(Telemetry::LOCALDOMSTORAGE_GETVALUE_BLOCKING_MS);
+ WaitForPreload();
if (NS_FAILED(mLoadResult)) {
return mLoadResult;
}
@@ -436,7 +407,7 @@ DOMStorageCache::SetItem(const DOMStorage* aStorage, const nsAString& aKey,
int64_t delta = 0;
if (Persist(aStorage)) {
- WaitForPreload(Telemetry::LOCALDOMSTORAGE_SETVALUE_BLOCKING_MS);
+ WaitForPreload();
if (NS_FAILED(mLoadResult)) {
return mLoadResult;
}
@@ -485,7 +456,7 @@ DOMStorageCache::RemoveItem(const DOMStorage* aStorage, const nsAString& aKey,
nsString& aOld)
{
if (Persist(aStorage)) {
- WaitForPreload(Telemetry::LOCALDOMSTORAGE_REMOVEKEY_BLOCKING_MS);
+ WaitForPreload();
if (NS_FAILED(mLoadResult)) {
return mLoadResult;
}
@@ -524,9 +495,8 @@ DOMStorageCache::Clear(const DOMStorage* aStorage)
// We need to preload all data (know the size) before we can proceeed
// to correctly decrease cached usage number.
// XXX as in case of unload, this is not technically needed now, but
- // after super-scope quota introduction we have to do this. Get telemetry
- // right now.
- WaitForPreload(Telemetry::LOCALDOMSTORAGE_CLEAR_BLOCKING_MS);
+ // after super-scope quota introduction we have to do this.
+ WaitForPreload();
if (NS_FAILED(mLoadResult)) {
// When we failed to load data from the database, force delete of the
// scope data and make use of the storage possible again.
@@ -596,9 +566,8 @@ DOMStorageCache::UnloadItems(uint32_t aUnloadFlags)
// Must wait for preload to pass correct usage to ProcessUsageDelta
// XXX this is not technically needed right now since there is just
// per-origin isolated quota handling, but when we introduce super-
- // -scope quotas, we have to do this. Better to start getting
- // telemetry right now.
- WaitForPreload(Telemetry::LOCALDOMSTORAGE_UNLOAD_BLOCKING_MS);
+ // -scope quotas, we have to do this.
+ WaitForPreload();
mData[kDefaultSet].mKeys.Clear();
ProcessUsageDelta(kDefaultSet, -mData[kDefaultSet].mOriginQuotaUsage);
@@ -617,7 +586,7 @@ DOMStorageCache::UnloadItems(uint32_t aUnloadFlags)
#ifdef DOM_STORAGE_TESTS
if (aUnloadFlags & kTestReload) {
- WaitForPreload(Telemetry::LOCALDOMSTORAGE_UNLOAD_BLOCKING_MS);
+ WaitForPreload();
mData[kDefaultSet].mKeys.Clear();
mLoaded = false; // This is only used in testing code
diff --git a/dom/storage/DOMStorageCache.h b/dom/storage/DOMStorageCache.h
index 01cf6b3ea..4469152a2 100644
--- a/dom/storage/DOMStorageCache.h
+++ b/dom/storage/DOMStorageCache.h
@@ -14,7 +14,6 @@
#include "nsDataHashtable.h"
#include "nsHashKeys.h"
#include "mozilla/Monitor.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/Atomics.h"
namespace mozilla {
@@ -168,7 +167,7 @@ private:
private:
// Synchronously blocks until the cache is fully loaded from the database
- void WaitForPreload(mozilla::Telemetry::ID aTelemetryID);
+ void WaitForPreload();
// Helper to get one of the 3 data sets (regular, private, session)
Data& DataSet(const DOMStorage* aStorage);
@@ -241,9 +240,6 @@ private:
// Drops back to false when session-only data are cleared from chrome.
bool mSessionOnlyDataSetActive : 1;
- // Whether we have already captured state of the cache preload on our first access.
- bool mPreloadTelemetryRecorded : 1;
-
// DOMStorageDBThread on the parent or single process,
// DOMStorageDBChild on the child process.
static DOMStorageDBBridge* sDatabase;
diff --git a/dom/svg/DOMSVGLength.cpp b/dom/svg/DOMSVGLength.cpp
index 574617045..c72c3e383 100644
--- a/dom/svg/DOMSVGLength.cpp
+++ b/dom/svg/DOMSVGLength.cpp
@@ -43,7 +43,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMSVGLength)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSVGElement)
-NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(DOMSVGLength)
diff --git a/dom/svg/DOMSVGLengthList.cpp b/dom/svg/DOMSVGLengthList.cpp
index 9d93546d9..88ecd6007 100644
--- a/dom/svg/DOMSVGLengthList.cpp
+++ b/dom/svg/DOMSVGLengthList.cpp
@@ -55,7 +55,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(DOMSVGLengthList)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMSVGLengthList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAList)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(DOMSVGLengthList)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
diff --git a/dom/svg/DOMSVGNumber.cpp b/dom/svg/DOMSVGNumber.cpp
index 97d80d4d0..6b9528606 100644
--- a/dom/svg/DOMSVGNumber.cpp
+++ b/dom/svg/DOMSVGNumber.cpp
@@ -35,7 +35,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMSVGNumber)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mParent)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(DOMSVGNumber)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
diff --git a/dom/svg/DOMSVGNumberList.cpp b/dom/svg/DOMSVGNumberList.cpp
index 00fb7ba4d..85322688f 100644
--- a/dom/svg/DOMSVGNumberList.cpp
+++ b/dom/svg/DOMSVGNumberList.cpp
@@ -55,7 +55,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(DOMSVGNumberList)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMSVGNumberList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAList)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(DOMSVGNumberList)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
diff --git a/dom/svg/DOMSVGPathSeg.cpp b/dom/svg/DOMSVGPathSeg.cpp
index 95be3521e..a15bf42e9 100644
--- a/dom/svg/DOMSVGPathSeg.cpp
+++ b/dom/svg/DOMSVGPathSeg.cpp
@@ -31,7 +31,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMSVGPathSeg)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mList)
-NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(DOMSVGPathSeg)
diff --git a/dom/svg/DOMSVGPathSegList.cpp b/dom/svg/DOMSVGPathSegList.cpp
index 0b811cdb1..36768ea34 100644
--- a/dom/svg/DOMSVGPathSegList.cpp
+++ b/dom/svg/DOMSVGPathSegList.cpp
@@ -36,7 +36,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(DOMSVGPathSegList)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMSVGPathSegList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mElement)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(DOMSVGPathSegList)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
diff --git a/dom/svg/DOMSVGPointList.cpp b/dom/svg/DOMSVGPointList.cpp
index 966ef476e..ca06bd270 100644
--- a/dom/svg/DOMSVGPointList.cpp
+++ b/dom/svg/DOMSVGPointList.cpp
@@ -55,7 +55,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(DOMSVGPointList)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMSVGPointList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mElement)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(DOMSVGPointList)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
diff --git a/dom/svg/DOMSVGTransformList.cpp b/dom/svg/DOMSVGTransformList.cpp
index 30760bc6d..e4bde9aeb 100644
--- a/dom/svg/DOMSVGTransformList.cpp
+++ b/dom/svg/DOMSVGTransformList.cpp
@@ -54,7 +54,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(DOMSVGTransformList)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMSVGTransformList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAList)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(DOMSVGTransformList)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
diff --git a/dom/svg/SVGTransform.cpp b/dom/svg/SVGTransform.cpp
index b73018d1c..1cba997eb 100644
--- a/dom/svg/SVGTransform.cpp
+++ b/dom/svg/SVGTransform.cpp
@@ -51,7 +51,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mList)
SVGMatrix* matrix =
SVGMatrixTearoffTable().GetTearoff(tmp);
CycleCollectionNoteChild(cb, matrix, "matrix");
-NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(SVGTransform)
diff --git a/dom/svg/nsISVGPoint.cpp b/dom/svg/nsISVGPoint.cpp
index 1c1971004..f4fdb9dd0 100644
--- a/dom/svg/nsISVGPoint.cpp
+++ b/dom/svg/nsISVGPoint.cpp
@@ -32,7 +32,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsISVGPoint)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mList)
-NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsISVGPoint)
diff --git a/dom/svg/nsSVGElement.h b/dom/svg/nsSVGElement.h
index 42bc05746..257ed7a2e 100644
--- a/dom/svg/nsSVGElement.h
+++ b/dom/svg/nsSVGElement.h
@@ -715,7 +715,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \
NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_val) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_element) \
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(_val) \
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER \
diff --git a/dom/webidl/AudioContext.webidl b/dom/webidl/AudioContext.webidl
index c2f65abaf..9aa3d5567 100644
--- a/dom/webidl/AudioContext.webidl
+++ b/dom/webidl/AudioContext.webidl
@@ -24,7 +24,6 @@ dictionary PeriodicWaveConstraints {
};
[Constructor,
- Constructor(AudioChannel audioChannelType),
Pref="dom.webaudio.enabled"]
interface AudioContext : EventTarget {
diff --git a/dom/webidl/Element.webidl b/dom/webidl/Element.webidl
index 97eb4ffe0..cf17523a5 100644
--- a/dom/webidl/Element.webidl
+++ b/dom/webidl/Element.webidl
@@ -164,9 +164,10 @@ interface Element : Node {
};
// http://dev.w3.org/csswg/cssom-view/
-enum ScrollLogicalPosition { "start", "end" };
+enum ScrollLogicalPosition { "start", "center", "end", "nearest" };
dictionary ScrollIntoViewOptions : ScrollOptions {
ScrollLogicalPosition block = "start";
+ ScrollLogicalPosition inline = "nearest";
};
// http://dev.w3.org/csswg/cssom-view/#extensions-to-the-element-interface
@@ -175,8 +176,7 @@ partial interface Element {
DOMRect getBoundingClientRect();
// scrolling
- void scrollIntoView(boolean top);
- void scrollIntoView(optional ScrollIntoViewOptions options);
+ void scrollIntoView(optional (boolean or ScrollIntoViewOptions) arg);
// None of the CSSOM attributes are [Pure], because they flush
attribute long scrollTop; // scroll on setting
attribute long scrollLeft; // scroll on setting
diff --git a/dom/webidl/IntersectionObserver.webidl b/dom/webidl/IntersectionObserver.webidl
index dbe8f428d..83200d950 100644
--- a/dom/webidl/IntersectionObserver.webidl
+++ b/dom/webidl/IntersectionObserver.webidl
@@ -7,7 +7,7 @@
* https://wicg.github.io/IntersectionObserver/
*/
-[ProbablyShortLivingObject, Pref="dom.IntersectionObserver.enabled"]
+[ProbablyShortLivingObject, Pref="dom.intersectionObserver.enabled"]
interface IntersectionObserverEntry {
[Constant]
readonly attribute DOMHighResTimeStamp time;
@@ -18,6 +18,8 @@ interface IntersectionObserverEntry {
[Constant]
readonly attribute DOMRectReadOnly intersectionRect;
[Constant]
+ readonly attribute boolean isIntersecting;
+ [Constant]
readonly attribute double intersectionRatio;
[Constant]
readonly attribute Element target;
@@ -25,7 +27,7 @@ interface IntersectionObserverEntry {
[Constructor(IntersectionCallback intersectionCallback,
optional IntersectionObserverInit options),
- Pref="dom.IntersectionObserver.enabled"]
+ Pref="dom.intersectionObserver.enabled"]
interface IntersectionObserver {
[Constant]
readonly attribute Element? root;
diff --git a/dom/workers/RuntimeService.cpp b/dom/workers/RuntimeService.cpp
index 1f49e16dd..21f6d8ddf 100644
--- a/dom/workers/RuntimeService.cpp
+++ b/dom/workers/RuntimeService.cpp
@@ -1530,7 +1530,6 @@ RuntimeService::RegisterWorker(WorkerPrivate* aWorkerPrivate)
const bool isServiceWorker = aWorkerPrivate->IsServiceWorker();
const bool isSharedWorker = aWorkerPrivate->IsSharedWorker();
- const bool isDedicatedWorker = aWorkerPrivate->IsDedicatedWorker();
if (isServiceWorker) {
AssertIsOnMainThread();
}
diff --git a/dom/worklet/WorkletGlobalScope.cpp b/dom/worklet/WorkletGlobalScope.cpp
index 4caeae81a..8c05a0abe 100644
--- a/dom/worklet/WorkletGlobalScope.cpp
+++ b/dom/worklet/WorkletGlobalScope.cpp
@@ -22,8 +22,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(WorkletGlobalScope)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(WorkletGlobalScope)
-
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mConsole)
tmp->TraverseHostObjectURIs(cb);
diff --git a/dom/xbl/nsXBLDocumentInfo.cpp b/dom/xbl/nsXBLDocumentInfo.cpp
index 283775dc6..73b08d7e1 100644
--- a/dom/xbl/nsXBLDocumentInfo.cpp
+++ b/dom/xbl/nsXBLDocumentInfo.cpp
@@ -52,7 +52,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXBLDocumentInfo)
if (tmp->mDocument &&
nsCCUncollectableMarker::InGeneration(cb, tmp->mDocument->GetMarkedCCGeneration())) {
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
return NS_SUCCESS_INTERRUPTED_TRAVERSE;
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument)
@@ -62,7 +61,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXBLDocumentInfo)
iter.UserData()->Traverse(cb);
}
}
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsXBLDocumentInfo)
if (tmp->mBindingTable) {
diff --git a/dom/xslt/xpath/XPathResult.cpp b/dom/xslt/xpath/XPathResult.cpp
index 33315c942..07121347e 100644
--- a/dom/xslt/xpath/XPathResult.cpp
+++ b/dom/xslt/xpath/XPathResult.cpp
@@ -63,7 +63,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(XPathResult)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocument)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(XPathResult)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mParent)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mResultNodes)
diff --git a/dom/xul/nsXULElement.cpp b/dom/xul/nsXULElement.cpp
index 14fa898ab..e351a46eb 100644
--- a/dom/xul/nsXULElement.cpp
+++ b/dom/xul/nsXULElement.cpp
@@ -2173,7 +2173,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXULPrototypeNode)
}
ImplCycleCollectionTraverse(cb, elem->mChildren, "mChildren");
}
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsXULPrototypeNode)
if (tmp->mType == nsXULPrototypeNode::eType_Script) {
diff --git a/embedding/components/webbrowserpersist/nsWebBrowserPersist.cpp b/embedding/components/webbrowserpersist/nsWebBrowserPersist.cpp
index 437d21997..a31414e7f 100644
--- a/embedding/components/webbrowserpersist/nsWebBrowserPersist.cpp
+++ b/embedding/components/webbrowserpersist/nsWebBrowserPersist.cpp
@@ -2351,16 +2351,18 @@ nsWebBrowserPersist::EndDownload(nsresult aResult)
{
mPersistResult = aResult;
}
-
// mCompleted needs to be set before issuing the stop notification.
// (Bug 1224437)
mCompleted = true;
+
+#ifdef MOZ_JSDOWNLOADS
// State stop notification
if (mProgressListener) {
mProgressListener->OnStateChange(nullptr, nullptr,
nsIWebProgressListener::STATE_STOP
| nsIWebProgressListener::STATE_IS_NETWORK, mPersistResult);
}
+#endif
// Do file cleanup if required
if (NS_FAILED(aResult) && (mPersistFlags & PERSIST_FLAGS_CLEANUP_ON_FAILURE))
diff --git a/extensions/cookie/nsPermissionManager.cpp b/extensions/cookie/nsPermissionManager.cpp
index 2c2e2d79c..afdaea63f 100644
--- a/extensions/cookie/nsPermissionManager.cpp
+++ b/extensions/cookie/nsPermissionManager.cpp
@@ -37,7 +37,6 @@
#include "mozilla/net/NeckoMessageUtils.h"
#include "mozilla/Preferences.h"
#include "nsReadLine.h"
-#include "mozilla/Telemetry.h"
#include "nsIConsoleService.h"
#include "nsINavHistoryService.h"
#include "nsToolkitCompsCID.h"
@@ -1167,21 +1166,7 @@ nsPermissionManager::InitDB(bool aRemoveFile)
mDBConn->TableExists(NS_LITERAL_CSTRING("moz_perms"), &permsTableExists);
if (permsTableExists) {
// The user already had a moz_perms table, and we are performing a
- // re-migration. We count the rows in the old table for telemetry,
- // and then back up their old database as moz_perms_v6
-
- nsCOMPtr<mozIStorageStatement> countStmt;
- rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING("SELECT COUNT(*) FROM moz_perms"),
- getter_AddRefs(countStmt));
- bool hasResult = false;
- if (NS_SUCCEEDED(rv) &&
- NS_SUCCEEDED(countStmt->ExecuteStep(&hasResult)) &&
- hasResult) {
- // Telemetry STUB (count rows and report)
- } else {
- NS_WARNING("Could not count the rows in moz_perms");
- }
-
+ // re-migration.
// Back up the old moz_perms database as moz_perms_v6 before we
// move the new table into its position
rv = mDBConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
diff --git a/gfx/ipc/GPUChild.cpp b/gfx/ipc/GPUChild.cpp
index bfe2d56f7..ba6053f43 100644
--- a/gfx/ipc/GPUChild.cpp
+++ b/gfx/ipc/GPUChild.cpp
@@ -126,20 +126,6 @@ GPUChild::RecvNotifyUiObservers(const nsCString& aTopic)
}
bool
-GPUChild::RecvAccumulateChildHistogram(InfallibleTArray<Accumulation>&& aAccumulations)
-{
- /* Telemetry STUB */
- return true;
-}
-
-bool
-GPUChild::RecvAccumulateChildKeyedHistogram(InfallibleTArray<KeyedAccumulation>&& aAccumulations)
-{
- /* Telemetry STUB */
- return true;
-}
-
-bool
GPUChild::RecvNotifyDeviceReset()
{
mHost->mListener->OnProcessDeviceReset(mHost);
diff --git a/gfx/ipc/GPUChild.h b/gfx/ipc/GPUChild.h
index 888884ddf..fdb3931f7 100644
--- a/gfx/ipc/GPUChild.h
+++ b/gfx/ipc/GPUChild.h
@@ -34,8 +34,6 @@ public:
// PGPUChild overrides.
bool RecvInitComplete(const GPUDeviceData& aData) override;
bool RecvReportCheckerboard(const uint32_t& aSeverity, const nsCString& aLog) override;
- bool RecvAccumulateChildHistogram(InfallibleTArray<Accumulation>&& aAccumulations) override;
- bool RecvAccumulateChildKeyedHistogram(InfallibleTArray<KeyedAccumulation>&& aAccumulations) override;
void ActorDestroy(ActorDestroyReason aWhy) override;
bool RecvGraphicsError(const nsCString& aError) override;
bool RecvNotifyUiObservers(const nsCString& aTopic) override;
diff --git a/gfx/ipc/PGPU.ipdl b/gfx/ipc/PGPU.ipdl
index a2c035c75..db3f6e503 100644
--- a/gfx/ipc/PGPU.ipdl
+++ b/gfx/ipc/PGPU.ipdl
@@ -13,8 +13,6 @@ using base::ProcessId from "base/process.h";
using mozilla::TimeDuration from "mozilla/TimeStamp.h";
using mozilla::CSSToLayoutDeviceScale from "Units.h";
using mozilla::gfx::IntSize from "mozilla/gfx/2D.h";
-using mozilla::Telemetry::Accumulation from "mozilla/TelemetryComms.h";
-using mozilla::Telemetry::KeyedAccumulation from "mozilla/TelemetryComms.h";
namespace mozilla {
namespace gfx {
@@ -90,10 +88,6 @@ child:
// observer service.
async NotifyUiObservers(nsCString aTopic);
- // Messages for reporting telemetry to the UI process.
- async AccumulateChildHistogram(Accumulation[] accumulations);
- async AccumulateChildKeyedHistogram(KeyedAccumulation[] accumulations);
-
async NotifyDeviceReset();
};
diff --git a/gfx/layers/apz/src/AsyncPanZoomController.cpp b/gfx/layers/apz/src/AsyncPanZoomController.cpp
index e7574eeb7..3d4112395 100644
--- a/gfx/layers/apz/src/AsyncPanZoomController.cpp
+++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp
@@ -38,7 +38,6 @@
#include "mozilla/ReentrantMonitor.h" // for ReentrantMonitorAutoEnter, etc
#include "mozilla/RefPtr.h" // for RefPtr
#include "mozilla/StaticPtr.h" // for StaticAutoPtr
-#include "mozilla/Telemetry.h" // for Telemetry
#include "mozilla/TimeStamp.h" // for TimeDuration, TimeStamp
#include "mozilla/dom/CheckerboardReportService.h" // for CheckerboardEventStorage
// note: CheckerboardReportService.h actually lives in gfx/layers/apz/util/
@@ -1686,25 +1685,6 @@ void AsyncPanZoomController::DoDelayedRequestContentRepaint()
mPinchPaintTimerSet = false;
}
-static ScrollInputMethod
-ScrollInputMethodForWheelDeltaType(ScrollWheelInput::ScrollDeltaType aDeltaType)
-{
- switch (aDeltaType) {
- case ScrollWheelInput::SCROLLDELTA_LINE: {
- return ScrollInputMethod::ApzWheelLine;
- }
- case ScrollWheelInput::SCROLLDELTA_PAGE: {
- return ScrollInputMethod::ApzWheelPage;
- }
- case ScrollWheelInput::SCROLLDELTA_PIXEL: {
- return ScrollInputMethod::ApzWheelPixel;
- }
- default:
- MOZ_ASSERT_UNREACHABLE("unexpected scroll delta type");
- return ScrollInputMethod::ApzWheelLine;
- }
-}
-
nsEventStatus AsyncPanZoomController::OnScrollWheel(const ScrollWheelInput& aEvent)
{
ParentLayerPoint delta = GetScrollWheelDelta(aEvent);
@@ -3229,11 +3209,10 @@ AsyncPanZoomController::ReportCheckerboard(const TimeStamp& aSampleTime)
mLastCheckerboardReport = aSampleTime;
bool recordTrace = gfxPrefs::APZRecordCheckerboarding();
- bool forTelemetry = Telemetry::CanRecordExtended();
uint32_t magnitude = GetCheckerboardMagnitude();
MutexAutoLock lock(mCheckerboardEventLock);
- if (!mCheckerboardEvent && (recordTrace || forTelemetry)) {
+ if (!mCheckerboardEvent && recordTrace) {
mCheckerboardEvent = MakeUnique<CheckerboardEvent>(recordTrace);
}
mPotentialCheckerboardTracker.InTransform(IsTransformingState(mState));
diff --git a/gfx/layers/apz/src/PotentialCheckerboardDurationTracker.cpp b/gfx/layers/apz/src/PotentialCheckerboardDurationTracker.cpp
index e469421ad..3c62a1101 100644
--- a/gfx/layers/apz/src/PotentialCheckerboardDurationTracker.cpp
+++ b/gfx/layers/apz/src/PotentialCheckerboardDurationTracker.cpp
@@ -6,8 +6,6 @@
#include "PotentialCheckerboardDurationTracker.h"
-#include "mozilla/Telemetry.h" // for Telemetry
-
namespace mozilla {
namespace layers {
@@ -20,10 +18,6 @@ PotentialCheckerboardDurationTracker::PotentialCheckerboardDurationTracker()
void
PotentialCheckerboardDurationTracker::CheckerboardSeen()
{
- // This might get called while mInCheckerboard is already true
- if (!Tracking()) {
- mCurrentPeriodStart = TimeStamp::Now();
- }
mInCheckerboard = true;
}
@@ -32,9 +26,6 @@ PotentialCheckerboardDurationTracker::CheckerboardDone()
{
MOZ_ASSERT(Tracking());
mInCheckerboard = false;
- if (!Tracking()) {
- /* Telemetry STUB */
- }
}
void
@@ -50,19 +41,10 @@ PotentialCheckerboardDurationTracker::InTransform(bool aInTransform)
// must be true (or we would have early-exited this function already).
// Therefore, we are starting a potential checkerboard period.
mInTransform = aInTransform;
- mCurrentPeriodStart = TimeStamp::Now();
return;
}
mInTransform = aInTransform;
-
- if (!Tracking()) {
- // Tracking() must have been true at the start of this function, or we
- // would have taken the other !Tracking branch above. If it's false now,
- // it means we just stopped tracking, so we are ending a potential
- // checkerboard period.
- /* Telemetry STUB */
- }
}
bool
diff --git a/gfx/layers/apz/src/PotentialCheckerboardDurationTracker.h b/gfx/layers/apz/src/PotentialCheckerboardDurationTracker.h
index 6154003ad..bcba113d3 100644
--- a/gfx/layers/apz/src/PotentialCheckerboardDurationTracker.h
+++ b/gfx/layers/apz/src/PotentialCheckerboardDurationTracker.h
@@ -50,8 +50,6 @@ private:
private:
bool mInCheckerboard;
bool mInTransform;
-
- TimeStamp mCurrentPeriodStart;
};
} // namespace layers
diff --git a/gfx/layers/client/ClientLayerManager.cpp b/gfx/layers/client/ClientLayerManager.cpp
index 074807e8c..1e4369bce 100644
--- a/gfx/layers/client/ClientLayerManager.cpp
+++ b/gfx/layers/client/ClientLayerManager.cpp
@@ -289,8 +289,6 @@ ClientLayerManager::EndTransactionInternal(DrawPaintedLayerCallback aCallback,
void* aCallbackData,
EndTransactionFlags)
{
- PaintTelemetry::AutoRecord record(PaintTelemetry::Metric::Rasterization);
-
PROFILER_LABEL("ClientLayerManager", "EndTransactionInternal",
js::ProfileEntry::Category::GRAPHICS);
diff --git a/gfx/layers/ipc/CompositorBridgeParent.cpp b/gfx/layers/ipc/CompositorBridgeParent.cpp
index 87a19f5c0..97ea984db 100644
--- a/gfx/layers/ipc/CompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CompositorBridgeParent.cpp
@@ -51,7 +51,6 @@
#include "mozilla/layout/RenderFrameParent.h"
#include "mozilla/media/MediaSystemResourceService.h" // for MediaSystemResourceService
#include "mozilla/mozalloc.h" // for operator new, etc
-#include "mozilla/Telemetry.h"
#ifdef MOZ_WIDGET_GTK
#include "basic/X11BasicCompositor.h" // for X11BasicCompositor
#endif
@@ -72,7 +71,6 @@
#include "mozilla/Hal.h"
#include "mozilla/HalTypes.h"
#include "mozilla/StaticPtr.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/VsyncDispatcher.h"
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
#include "VsyncSource.h"
diff --git a/gfx/src/DriverCrashGuard.cpp b/gfx/src/DriverCrashGuard.cpp
index fd616575b..2303e9d66 100644
--- a/gfx/src/DriverCrashGuard.cpp
+++ b/gfx/src/DriverCrashGuard.cpp
@@ -411,10 +411,6 @@ D3D11LayersCrashGuard::Initialize()
}
DriverCrashGuard::Initialize();
-
- // If no telemetry states have been recorded, this will set the state to okay.
- // Otherwise, it will have no effect.
- RecordTelemetry(TelemetryState::Okay);
}
bool
@@ -447,30 +443,21 @@ D3D11LayersCrashGuard::UpdateEnvironment()
return false;
}
- RecordTelemetry(TelemetryState::EnvironmentChanged);
return true;
}
void
D3D11LayersCrashGuard::LogCrashRecovery()
{
- RecordTelemetry(TelemetryState::RecoveredFromCrash);
gfxCriticalNote << "D3D11 layers just crashed; D3D11 will be disabled.";
}
void
D3D11LayersCrashGuard::LogFeatureDisabled()
{
- RecordTelemetry(TelemetryState::FeatureDisabled);
gfxCriticalNote << "D3D11 layers disabled due to a prior crash.";
}
-void
-D3D11LayersCrashGuard::RecordTelemetry(TelemetryState aState)
-{
- /* STUB */
-}
-
D3D9VideoCrashGuard::D3D9VideoCrashGuard(dom::ContentParent* aContentParent)
: DriverCrashGuard(CrashGuardType::D3D9Video, aContentParent)
{
diff --git a/gfx/src/DriverCrashGuard.h b/gfx/src/DriverCrashGuard.h
index 9a0c5851a..8db9287c9 100644
--- a/gfx/src/DriverCrashGuard.h
+++ b/gfx/src/DriverCrashGuard.h
@@ -66,15 +66,6 @@ public:
bool Crashed();
void NotifyCrashed();
- // These are the values reported to Telemetry (GRAPHICS_DRIVER_STARTUP_TEST).
- // Values should not change; add new values to the end.
- enum class TelemetryState {
- Okay = 0,
- EnvironmentChanged = 1,
- RecoveredFromCrash = 2,
- FeatureDisabled = 3
- };
-
enum class Mode {
// Normal operation.
Normal,
@@ -136,9 +127,6 @@ class D3D11LayersCrashGuard final : public DriverCrashGuard
bool UpdateEnvironment() override;
void LogCrashRecovery() override;
void LogFeatureDisabled() override;
-
- private:
- void RecordTelemetry(TelemetryState aState);
};
class D3D9VideoCrashGuard final : public DriverCrashGuard
diff --git a/gfx/thebes/DeviceManagerDx.cpp b/gfx/thebes/DeviceManagerDx.cpp
index e1cfc5763..9f42974c3 100644
--- a/gfx/thebes/DeviceManagerDx.cpp
+++ b/gfx/thebes/DeviceManagerDx.cpp
@@ -455,13 +455,11 @@ DeviceManagerDx::CreateContentDevice()
: D3D_DRIVER_TYPE_UNKNOWN;
if (!CreateDevice(adapter, type, flags, hr, device)) {
gfxCriticalNote << "Recovered from crash while creating a D3D11 content device";
- gfxWindowsPlatform::RecordContentDeviceFailure(TelemetryDeviceCode::Content);
return FeatureStatus::CrashedInHandler;
}
if (FAILED(hr) || !device) {
gfxCriticalNote << "Failed to create a D3D11 content device: " << hexa(hr);
- gfxWindowsPlatform::RecordContentDeviceFailure(TelemetryDeviceCode::Content);
return FeatureStatus::Failed;
}
diff --git a/gfx/thebes/gfxFont.cpp b/gfx/thebes/gfxFont.cpp
index 8ccd721f8..490a866db 100644
--- a/gfx/thebes/gfxFont.cpp
+++ b/gfx/thebes/gfxFont.cpp
@@ -36,7 +36,6 @@
#include "mozilla/MemoryReporting.h"
#include "mozilla/Preferences.h"
#include "mozilla/Services.h"
-#include "mozilla/Telemetry.h"
#include "gfxMathTable.h"
#include "gfxSVGGlyphs.h"
#include "gfx2DGlue.h"
@@ -2573,8 +2572,6 @@ gfxFont::GetShapedWord(DrawTarget *aDrawTarget,
}
gfxShapedWord* sw = entry->mShapedWord.get();
- bool isContent = !mStyle.systemFont;
-
if (sw) {
sw->ResetAge();
#ifndef RELEASE_OR_BETA
diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp
index 70ba2fe6a..50d1fcb46 100644
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -11,7 +11,6 @@
#include "mozilla/gfx/GPUProcessManager.h"
#include "mozilla/gfx/GraphicsMessages.h"
#include "mozilla/ClearOnShutdown.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/Unused.h"
@@ -349,25 +348,6 @@ void CrashStatsLogForwarder::Log(const std::string& aString)
}
}
-class CrashTelemetryEvent : public Runnable
-{
- virtual ~CrashTelemetryEvent() {}
-
- NS_DECL_ISUPPORTS_INHERITED
-
- explicit CrashTelemetryEvent(uint32_t aReason) : mReason(aReason) {}
-
- NS_IMETHOD Run() override {
- MOZ_ASSERT(NS_IsMainThread());
- return NS_OK;
- }
-
-protected:
- uint32_t mReason;
-};
-
-NS_IMPL_ISUPPORTS_INHERITED0(CrashTelemetryEvent, Runnable);
-
void
CrashStatsLogForwarder::CrashAction(LogReason aReason)
{
@@ -2435,13 +2415,6 @@ gfxPlatform::NotifyCompositorCreated(LayersBackend aBackend)
// Set the backend before we notify so it's available immediately.
mCompositorBackend = aBackend;
-
- // Notify that we created a compositor, so telemetry can update.
- NS_DispatchToMainThread(NS_NewRunnableFunction([] {
- if (nsCOMPtr<nsIObserverService> obsvc = services::GetObserverService()) {
- obsvc->NotifyObservers(nullptr, "compositor:created", nullptr);
- }
- }));
}
void
diff --git a/gfx/thebes/gfxPlatformFontList.cpp b/gfx/thebes/gfxPlatformFontList.cpp
index 59df40666..5f7bbb832 100644
--- a/gfx/thebes/gfxPlatformFontList.cpp
+++ b/gfx/thebes/gfxPlatformFontList.cpp
@@ -21,7 +21,6 @@
#include "mozilla/Likely.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/Preferences.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/gfx/2D.h"
@@ -322,7 +321,6 @@ gfxPlatformFontList::InitOtherFamilyNames()
mOtherFamilyNamesInitialized = true;
}
TimeStamp end = TimeStamp::Now();
-
if (LOG_FONTINIT_ENABLED()) {
TimeDuration elapsed = end - start;
LOG_FONTINIT(("(fontinit) InitOtherFamilyNames took %8.2f ms %s",
@@ -470,7 +468,7 @@ gfxPlatformFontList::GetFontList(nsIAtom *aLangGroup,
{
for (auto iter = mFontFamilies.Iter(); !iter.Done(); iter.Next()) {
RefPtr<gfxFontFamily>& family = iter.Data();
- // use the first variation for now. This data should be the same
+ // use the first variation for now. This data should be the same
// for all the variations and should probably be moved up to
// the Family
gfxFontStyle style;
@@ -578,12 +576,6 @@ gfxPlatformFontList::SystemFindFontForChar(uint32_t aCh, uint32_t aNextCh,
} else if (aCh == 0xFFFD && fontEntry && fallbackFamily) {
mReplacementCharFallbackFamily = fallbackFamily;
}
-
- // track system fallback time
- static bool first = true;
- int32_t intElapsed = int32_t(first ? elapsed.ToMilliseconds() :
- elapsed.ToMicroseconds());
- first = false;
return fontEntry;
}
diff --git a/gfx/thebes/gfxWindowsPlatform.cpp b/gfx/thebes/gfxWindowsPlatform.cpp
index b1ede7ad2..82e36efe2 100755
--- a/gfx/thebes/gfxWindowsPlatform.cpp
+++ b/gfx/thebes/gfxWindowsPlatform.cpp
@@ -22,7 +22,6 @@
#include "nsIGfxInfo.h"
#include "nsServiceManagerUtils.h"
#include "nsTArray.h"
-#include "mozilla/Telemetry.h"
#include "GeckoProfiler.h"
#include "nsIWindowsRegKey.h"
@@ -1435,12 +1434,6 @@ gfxWindowsPlatform::InitializeD3D11Config()
}
}
-/* static */ void
-gfxWindowsPlatform::RecordContentDeviceFailure(TelemetryDeviceCode aDevice)
-{
- /* STUB */
-}
-
void
gfxWindowsPlatform::InitializeDevices()
{
@@ -1478,18 +1471,9 @@ gfxWindowsPlatform::InitializeDevices()
return;
}
- bool shouldUseD2D = gfxConfig::IsEnabled(Feature::DIRECT2D);
-
// First, initialize D3D11. If this succeeds we attempt to use Direct2D.
InitializeD3D11();
InitializeD2D();
-
- if (!gfxConfig::IsEnabled(Feature::DIRECT2D) &&
- XRE_IsContentProcess() &&
- shouldUseD2D)
- {
- RecordContentDeviceFailure(TelemetryDeviceCode::D2D1);
- }
}
void
diff --git a/gfx/thebes/gfxWindowsPlatform.h b/gfx/thebes/gfxWindowsPlatform.h
index f401038fc..129365f82 100644
--- a/gfx/thebes/gfxWindowsPlatform.h
+++ b/gfx/thebes/gfxWindowsPlatform.h
@@ -225,8 +225,6 @@ public:
}
bool SupportsPluginDirectDXGIDrawing();
- static void RecordContentDeviceFailure(mozilla::gfx::TelemetryDeviceCode aDevice);
-
protected:
bool AccelerateLayersByDefault() override {
return true;
diff --git a/image/IDecodingTask.cpp b/image/IDecodingTask.cpp
index a067e7a7d..6e2f039be 100644
--- a/image/IDecodingTask.cpp
+++ b/image/IDecodingTask.cpp
@@ -142,8 +142,10 @@ MetadataDecodingTask::Run()
// AnonymousDecodingTask implementation.
///////////////////////////////////////////////////////////////////////////////
-AnonymousDecodingTask::AnonymousDecodingTask(NotNull<Decoder*> aDecoder)
+AnonymousDecodingTask::AnonymousDecodingTask(NotNull<Decoder*> aDecoder,
+ bool aResumable)
: mDecoder(aDecoder)
+ , mResumable(aResumable)
{ }
void
@@ -168,5 +170,16 @@ AnonymousDecodingTask::Run()
}
}
+void
+AnonymousDecodingTask::Resume()
+{
+ // Anonymous decoders normally get all their data at once. We have some situations
+ // where they don't. If explicitly requested, resuming should be supported.
+ if (mResumable) {
+ RefPtr<AnonymousDecodingTask> self(this);
+ NS_DispatchToMainThread(NS_NewRunnableFunction([self]() -> void { self->Run(); }));
+ }
+}
+
} // namespace image
} // namespace mozilla
diff --git a/image/IDecodingTask.h b/image/IDecodingTask.h
index 196ce5fdc..3cbab5006 100644
--- a/image/IDecodingTask.h
+++ b/image/IDecodingTask.h
@@ -102,22 +102,20 @@ class AnonymousDecodingTask final : public IDecodingTask
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AnonymousDecodingTask, override)
- explicit AnonymousDecodingTask(NotNull<Decoder*> aDecoder);
+ explicit AnonymousDecodingTask(NotNull<Decoder*> aDecoder, bool aResumable);
void Run() override;
bool ShouldPreferSyncRun() const override { return true; }
TaskPriority Priority() const override { return TaskPriority::eLow; }
- // Anonymous decoders normally get all their data at once. We have tests where
- // they don't; in these situations, the test re-runs them manually. So no
- // matter what, we don't want to resume by posting a task to the DecodePool.
- void Resume() override { }
+ void Resume() override;
private:
virtual ~AnonymousDecodingTask() { }
NotNull<RefPtr<Decoder>> mDecoder;
+ bool mResumable;
};
} // namespace image
diff --git a/image/Image.h b/image/Image.h
index bcabd1cc7..98c5e8ca5 100644
--- a/image/Image.h
+++ b/image/Image.h
@@ -220,8 +220,6 @@ public:
virtual void SetHasError() = 0;
virtual ImageURL* GetURI() = 0;
-
- virtual void ReportUseCounters() { }
};
class ImageResource : public Image
diff --git a/image/ImageOps.cpp b/image/ImageOps.cpp
index addee7f15..ddd2f200e 100644
--- a/image/ImageOps.cpp
+++ b/image/ImageOps.cpp
@@ -126,7 +126,7 @@ ImageOps::DecodeToSurface(nsIInputStream* aInputStream,
}
// Run the decoder synchronously.
- RefPtr<IDecodingTask> task = new AnonymousDecodingTask(WrapNotNull(decoder));
+ RefPtr<IDecodingTask> task = new AnonymousDecodingTask(WrapNotNull(decoder), /* aResumable */ false);
task->Run();
if (!decoder->GetDecodeDone() || decoder->HasError()) {
return nullptr;
diff --git a/image/SourceBuffer.cpp b/image/SourceBuffer.cpp
index de0719d45..de066e29f 100644
--- a/image/SourceBuffer.cpp
+++ b/image/SourceBuffer.cpp
@@ -451,10 +451,18 @@ SourceBuffer::AppendFromInputStream(nsIInputStream* aInputStream,
uint32_t bytesRead;
nsresult rv = aInputStream->ReadSegments(AppendToSourceBuffer, this,
aCount, &bytesRead);
- if (!NS_WARN_IF(NS_FAILED(rv))) {
- MOZ_ASSERT(bytesRead == aCount,
- "AppendToSourceBuffer should consume everything");
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ if (bytesRead == 0) {
+ // The loading of the image has been canceled.
+ return NS_ERROR_FAILURE;
}
+
+ MOZ_ASSERT(bytesRead == aCount,
+ "AppendToSourceBuffer should consume everything");
+
return rv;
}
diff --git a/image/SourceBuffer.h b/image/SourceBuffer.h
index 64727e65e..6f2c74d33 100644
--- a/image/SourceBuffer.h
+++ b/image/SourceBuffer.h
@@ -174,6 +174,13 @@ public:
return mState == READY ? mData.mIterating.mNextReadLength : 0;
}
+ /// If we're ready to read, returns whether or not everything available thus
+ /// far has been in the same contiguous buffer.
+ bool IsContiguous() const {
+ MOZ_ASSERT(mState == READY, "Calling IsContiguous() in the wrong state");
+ return mState == READY ? mData.mIterating.mChunk == 0 : false;
+ }
+
/// @return a count of the chunks we've advanced through.
uint32_t ChunkCount() const { return mChunkCount; }
diff --git a/image/VectorImage.cpp b/image/VectorImage.cpp
index 1e59b13fa..3028c1c2e 100644
--- a/image/VectorImage.cpp
+++ b/image/VectorImage.cpp
@@ -1337,15 +1337,6 @@ VectorImage::PropagateUseCounters(nsIDocument* aParentDocument)
}
}
-void
-VectorImage::ReportUseCounters()
-{
- nsIDocument* doc = mSVGDocumentWrapper->GetDocument();
- if (doc) {
- static_cast<nsDocument*>(doc)->ReportUseCounters();
- }
-}
-
nsIntSize
VectorImage::OptimalImageSizeForDest(const gfxSize& aDest,
uint32_t aWhichFrame,
diff --git a/image/VectorImage.h b/image/VectorImage.h
index e19aa939f..bd4d393ed 100644
--- a/image/VectorImage.h
+++ b/image/VectorImage.h
@@ -68,8 +68,6 @@ public:
void OnSVGDocumentLoaded();
void OnSVGDocumentError();
- virtual void ReportUseCounters() override;
-
protected:
explicit VectorImage(ImageURL* aURI = nullptr);
virtual ~VectorImage();
diff --git a/image/decoders/nsWebPDecoder.cpp b/image/decoders/nsWebPDecoder.cpp
index 4f3cc8b2a..3181e3a3a 100644
--- a/image/decoders/nsWebPDecoder.cpp
+++ b/image/decoders/nsWebPDecoder.cpp
@@ -144,6 +144,10 @@ nsWebPDecoder::UpdateBuffer(SourceBufferIterator& aIterator,
switch (aState) {
case SourceBufferIterator::READY:
+ if(!aIterator.IsContiguous()) {
+ //We need to buffer. This should be rare, but expensive.
+ break;
+ }
if (!mData) {
// For as long as we hold onto an iterator, we know the data pointers
// to the chunks cannot change underneath us, so save the pointer to
diff --git a/ipc/glue/MessageChannel.cpp b/ipc/glue/MessageChannel.cpp
index a988fae53..eacb3041b 100644
--- a/ipc/glue/MessageChannel.cpp
+++ b/ipc/glue/MessageChannel.cpp
@@ -15,7 +15,6 @@
#include "mozilla/Move.h"
#include "mozilla/SizePrintfMacros.h"
#include "mozilla/Sprintf.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/Logging.h"
#include "nsAutoPtr.h"
#include "nsDebug.h"
@@ -116,8 +115,6 @@ static MessageChannel* gParentProcessBlocker;
namespace mozilla {
namespace ipc {
-static const uint32_t kMinTelemetryMessageSize = 8192;
-
const int32_t MessageChannel::kNoTimeout = INT32_MIN;
// static
@@ -1150,9 +1147,6 @@ MessageChannel::Send(Message* aMsg, Message* aReply)
IPC_LOG("Send seqno=%d, xid=%d", seqno, transaction);
- // msg will be destroyed soon, but name() is not owned by msg.
- const char* msgName = msg->name();
-
mLink->SendMessage(msg.forget());
while (true) {
diff --git a/js/public/GCAPI.h b/js/public/GCAPI.h
index 7a6675ca7..4ef2a8370 100644
--- a/js/public/GCAPI.h
+++ b/js/public/GCAPI.h
@@ -119,14 +119,6 @@ enum Reason {
#undef MAKE_REASON
NO_REASON,
NUM_REASONS,
-
- /*
- * For telemetry, we want to keep a fixed max bucket size over time so we
- * don't have to switch histograms. 100 is conservative; as of this writing
- * there are 52. But the cost of extra buckets seems to be low while the
- * cost of switching histograms is high.
- */
- NUM_TELEMETRY_REASONS = 100
};
/**
diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp
index 7bfab87a3..209265a58 100644
--- a/js/src/frontend/Parser.cpp
+++ b/js/src/frontend/Parser.cpp
@@ -3463,7 +3463,6 @@ Parser<ParseHandler>::functionFormalParametersAndBody(InHandling inHandling,
if (kind != Arrow) {
#if JS_HAS_EXPR_CLOSURES
- addTelemetry(JSCompartment::DeprecatedExpressionClosure);
if (!warnOnceAboutExprClosure())
return false;
#else
@@ -5545,7 +5544,6 @@ Parser<ParseHandler>::forStatement(YieldHandling yieldHandling)
if (matched) {
iflags = JSITER_FOREACH;
isForEach = true;
- addTelemetry(JSCompartment::DeprecatedForEach);
if (!warnOnceAboutForEach())
return null();
}
@@ -6077,7 +6075,6 @@ Parser<ParseHandler>::yieldExpression(InHandling inHandling)
}
pc->functionBox()->setGeneratorKind(LegacyGenerator);
- addTelemetry(JSCompartment::DeprecatedLegacyGenerator);
MOZ_FALLTHROUGH;
@@ -9589,16 +9586,6 @@ Parser<ParseHandler>::exprInParens(InHandling inHandling, YieldHandling yieldHan
}
template <typename ParseHandler>
-void
-Parser<ParseHandler>::addTelemetry(JSCompartment::DeprecatedLanguageExtension e)
-{
- JSContext* cx = context->maybeJSContext();
- if (!cx)
- return;
- cx->compartment()->addTelemetry(getFilename(), e);
-}
-
-template <typename ParseHandler>
bool
Parser<ParseHandler>::warnOnceAboutExprClosure()
{
diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h
index b58b021cd..12642fad8 100644
--- a/js/src/frontend/Parser.h
+++ b/js/src/frontend/Parser.h
@@ -1420,8 +1420,6 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter
bool asmJS(Node list);
- void addTelemetry(JSCompartment::DeprecatedLanguageExtension e);
-
bool warnOnceAboutExprClosure();
bool warnOnceAboutForEach();
};
diff --git a/js/src/gc/Nursery.cpp b/js/src/gc/Nursery.cpp
index 55ca5a059..ea4350fb8 100644
--- a/js/src/gc/Nursery.cpp
+++ b/js/src/gc/Nursery.cpp
@@ -530,7 +530,6 @@ js::Nursery::collect(JSRuntime* rt, JS::gcreason::Reason reason)
// the nursery is full, look for object groups that are getting promoted
// excessively and try to pretenure them.
maybeStartProfile(ProfileKey::Pretenure);
- uint32_t pretenureCount = 0;
if (promotionRate > 0.8 || reason == JS::gcreason::FULL_STORE_BUFFER) {
JSContext* cx = rt->contextFromMainThread();
for (auto& entry : tenureCounts.entries) {
@@ -539,7 +538,6 @@ js::Nursery::collect(JSRuntime* rt, JS::gcreason::Reason reason)
if (group->canPreTenure()) {
AutoCompartment ac(cx, group->compartment());
group->setShouldPreTenure(cx);
- pretenureCount++;
}
}
}
@@ -556,12 +554,6 @@ js::Nursery::collect(JSRuntime* rt, JS::gcreason::Reason reason)
minorGcCount_++;
int64_t totalTime = profileTimes_[ProfileKey::Total];
- rt->addTelemetry(JS_TELEMETRY_GC_MINOR_US, totalTime);
- rt->addTelemetry(JS_TELEMETRY_GC_MINOR_REASON, reason);
- if (totalTime > 1000)
- rt->addTelemetry(JS_TELEMETRY_GC_MINOR_REASON_LONG, reason);
- rt->addTelemetry(JS_TELEMETRY_GC_NURSERY_BYTES, sizeOfHeapCommitted());
- rt->addTelemetry(JS_TELEMETRY_GC_PRETENURE_COUNT, pretenureCount);
rt->gc.stats.endNurseryCollection(reason);
TraceMinorGCEnd();
diff --git a/js/src/gc/Statistics.cpp b/js/src/gc/Statistics.cpp
index 19f9986dd..8a9f4e135 100644
--- a/js/src/gc/Statistics.cpp
+++ b/js/src/gc/Statistics.cpp
@@ -34,13 +34,6 @@ using mozilla::MakeRange;
using mozilla::PodArrayZero;
using mozilla::PodZero;
-/*
- * If this fails, then you can either delete this assertion and allow all
- * larger-numbered reasons to pile up in the last telemetry bucket, or switch
- * to GC_REASON_3 and bump the max value.
- */
-JS_STATIC_ASSERT(JS::gcreason::NUM_TELEMETRY_REASONS >= JS::gcreason::NUM_REASONS);
-
const char*
js::gcstats::ExplainInvocationKind(JSGCInvocationKind gckind)
{
@@ -92,7 +85,6 @@ struct PhaseInfo
Phase index;
const char* name;
Phase parent;
- const uint8_t telemetryBucket;
};
// The zeroth entry in the timing arrays is used for phases that have a
@@ -134,78 +126,74 @@ struct DagChildEdge {
*/
static const PhaseInfo phases[] = {
- { PHASE_MUTATOR, "Mutator Running", PHASE_NO_PARENT, 0 },
- { PHASE_GC_BEGIN, "Begin Callback", PHASE_NO_PARENT, 1 },
- { PHASE_WAIT_BACKGROUND_THREAD, "Wait Background Thread", PHASE_NO_PARENT, 2 },
- { PHASE_MARK_DISCARD_CODE, "Mark Discard Code", PHASE_NO_PARENT, 3 },
- { PHASE_RELAZIFY_FUNCTIONS, "Relazify Functions", PHASE_NO_PARENT, 4 },
- { PHASE_PURGE, "Purge", PHASE_NO_PARENT, 5 },
- { PHASE_MARK, "Mark", PHASE_NO_PARENT, 6 },
- { PHASE_UNMARK, "Unmark", PHASE_MARK, 7 },
+ { PHASE_MUTATOR, "Mutator Running", PHASE_NO_PARENT },
+ { PHASE_GC_BEGIN, "Begin Callback", PHASE_NO_PARENT },
+ { PHASE_WAIT_BACKGROUND_THREAD, "Wait Background Thread", PHASE_NO_PARENT },
+ { PHASE_MARK_DISCARD_CODE, "Mark Discard Code", PHASE_NO_PARENT },
+ { PHASE_RELAZIFY_FUNCTIONS, "Relazify Functions", PHASE_NO_PARENT },
+ { PHASE_PURGE, "Purge", PHASE_NO_PARENT },
+ { PHASE_MARK, "Mark", PHASE_NO_PARENT },
+ { PHASE_UNMARK, "Unmark", PHASE_MARK },
/* PHASE_MARK_ROOTS */
- { PHASE_MARK_DELAYED, "Mark Delayed", PHASE_MARK, 8 },
- { PHASE_SWEEP, "Sweep", PHASE_NO_PARENT, 9 },
- { PHASE_SWEEP_MARK, "Mark During Sweeping", PHASE_SWEEP, 10 },
- { PHASE_SWEEP_MARK_TYPES, "Mark Types During Sweeping", PHASE_SWEEP_MARK, 11 },
- { PHASE_SWEEP_MARK_INCOMING_BLACK, "Mark Incoming Black Pointers", PHASE_SWEEP_MARK, 12 },
- { PHASE_SWEEP_MARK_WEAK, "Mark Weak", PHASE_SWEEP_MARK, 13 },
- { PHASE_SWEEP_MARK_INCOMING_GRAY, "Mark Incoming Gray Pointers", PHASE_SWEEP_MARK, 14 },
- { PHASE_SWEEP_MARK_GRAY, "Mark Gray", PHASE_SWEEP_MARK, 15 },
- { PHASE_SWEEP_MARK_GRAY_WEAK, "Mark Gray and Weak", PHASE_SWEEP_MARK, 16 },
- { PHASE_FINALIZE_START, "Finalize Start Callbacks", PHASE_SWEEP, 17 },
- { PHASE_WEAK_ZONEGROUP_CALLBACK, "Per-Slice Weak Callback", PHASE_FINALIZE_START, 57 },
- { PHASE_WEAK_COMPARTMENT_CALLBACK, "Per-Compartment Weak Callback", PHASE_FINALIZE_START, 58 },
- { PHASE_SWEEP_ATOMS, "Sweep Atoms", PHASE_SWEEP, 18 },
- { PHASE_SWEEP_SYMBOL_REGISTRY, "Sweep Symbol Registry", PHASE_SWEEP, 19 },
- { PHASE_SWEEP_COMPARTMENTS, "Sweep Compartments", PHASE_SWEEP, 20 },
- { PHASE_SWEEP_DISCARD_CODE, "Sweep Discard Code", PHASE_SWEEP_COMPARTMENTS, 21 },
- { PHASE_SWEEP_INNER_VIEWS, "Sweep Inner Views", PHASE_SWEEP_COMPARTMENTS, 22 },
- { PHASE_SWEEP_CC_WRAPPER, "Sweep Cross Compartment Wrappers", PHASE_SWEEP_COMPARTMENTS, 23 },
- { PHASE_SWEEP_BASE_SHAPE, "Sweep Base Shapes", PHASE_SWEEP_COMPARTMENTS, 24 },
- { PHASE_SWEEP_INITIAL_SHAPE, "Sweep Initial Shapes", PHASE_SWEEP_COMPARTMENTS, 25 },
- { PHASE_SWEEP_TYPE_OBJECT, "Sweep Type Objects", PHASE_SWEEP_COMPARTMENTS, 26 },
- { PHASE_SWEEP_BREAKPOINT, "Sweep Breakpoints", PHASE_SWEEP_COMPARTMENTS, 27 },
- { PHASE_SWEEP_REGEXP, "Sweep Regexps", PHASE_SWEEP_COMPARTMENTS, 28 },
- { PHASE_SWEEP_MISC, "Sweep Miscellaneous", PHASE_SWEEP_COMPARTMENTS, 29 },
- { PHASE_SWEEP_TYPES, "Sweep type information", PHASE_SWEEP_COMPARTMENTS, 30 },
- { PHASE_SWEEP_TYPES_BEGIN, "Sweep type tables and compilations", PHASE_SWEEP_TYPES, 31 },
- { PHASE_SWEEP_TYPES_END, "Free type arena", PHASE_SWEEP_TYPES, 32 },
- { PHASE_SWEEP_OBJECT, "Sweep Object", PHASE_SWEEP, 33 },
- { PHASE_SWEEP_STRING, "Sweep String", PHASE_SWEEP, 34 },
- { PHASE_SWEEP_SCRIPT, "Sweep Script", PHASE_SWEEP, 35 },
- { PHASE_SWEEP_SCOPE, "Sweep Scope", PHASE_SWEEP, 59 },
- { PHASE_SWEEP_SHAPE, "Sweep Shape", PHASE_SWEEP, 36 },
- { PHASE_SWEEP_JITCODE, "Sweep JIT code", PHASE_SWEEP, 37 },
- { PHASE_FINALIZE_END, "Finalize End Callback", PHASE_SWEEP, 38 },
- { PHASE_DESTROY, "Deallocate", PHASE_SWEEP, 39 },
- { PHASE_COMPACT, "Compact", PHASE_NO_PARENT, 40 },
- { PHASE_COMPACT_MOVE, "Compact Move", PHASE_COMPACT, 41 },
- { PHASE_COMPACT_UPDATE, "Compact Update", PHASE_COMPACT, 42 },
+ { PHASE_MARK_DELAYED, "Mark Delayed", PHASE_MARK },
+ { PHASE_SWEEP, "Sweep", PHASE_NO_PARENT },
+ { PHASE_SWEEP_MARK, "Mark During Sweeping", PHASE_SWEEP },
+ { PHASE_SWEEP_MARK_TYPES, "Mark Types During Sweeping", PHASE_SWEEP_MARK },
+ { PHASE_SWEEP_MARK_INCOMING_BLACK, "Mark Incoming Black Pointers", PHASE_SWEEP_MARK },
+ { PHASE_SWEEP_MARK_WEAK, "Mark Weak", PHASE_SWEEP_MARK },
+ { PHASE_SWEEP_MARK_INCOMING_GRAY, "Mark Incoming Gray Pointers", PHASE_SWEEP_MARK },
+ { PHASE_SWEEP_MARK_GRAY, "Mark Gray", PHASE_SWEEP_MARK },
+ { PHASE_SWEEP_MARK_GRAY_WEAK, "Mark Gray and Weak", PHASE_SWEEP_MARK },
+ { PHASE_FINALIZE_START, "Finalize Start Callbacks", PHASE_SWEEP },
+ { PHASE_WEAK_ZONEGROUP_CALLBACK, "Per-Slice Weak Callback", PHASE_FINALIZE_START },
+ { PHASE_WEAK_COMPARTMENT_CALLBACK, "Per-Compartment Weak Callback", PHASE_FINALIZE_START },
+ { PHASE_SWEEP_ATOMS, "Sweep Atoms", PHASE_SWEEP },
+ { PHASE_SWEEP_SYMBOL_REGISTRY, "Sweep Symbol Registry", PHASE_SWEEP },
+ { PHASE_SWEEP_COMPARTMENTS, "Sweep Compartments", PHASE_SWEEP },
+ { PHASE_SWEEP_DISCARD_CODE, "Sweep Discard Code", PHASE_SWEEP_COMPARTMENTS },
+ { PHASE_SWEEP_INNER_VIEWS, "Sweep Inner Views", PHASE_SWEEP_COMPARTMENTS },
+ { PHASE_SWEEP_CC_WRAPPER, "Sweep Cross Compartment Wrappers", PHASE_SWEEP_COMPARTMENTS },
+ { PHASE_SWEEP_BASE_SHAPE, "Sweep Base Shapes", PHASE_SWEEP_COMPARTMENTS },
+ { PHASE_SWEEP_INITIAL_SHAPE, "Sweep Initial Shapes", PHASE_SWEEP_COMPARTMENTS },
+ { PHASE_SWEEP_TYPE_OBJECT, "Sweep Type Objects", PHASE_SWEEP_COMPARTMENTS },
+ { PHASE_SWEEP_BREAKPOINT, "Sweep Breakpoints", PHASE_SWEEP_COMPARTMENTS },
+ { PHASE_SWEEP_REGEXP, "Sweep Regexps", PHASE_SWEEP_COMPARTMENTS },
+ { PHASE_SWEEP_MISC, "Sweep Miscellaneous", PHASE_SWEEP_COMPARTMENTS },
+ { PHASE_SWEEP_TYPES, "Sweep type information", PHASE_SWEEP_COMPARTMENTS },
+ { PHASE_SWEEP_TYPES_BEGIN, "Sweep type tables and compilations", PHASE_SWEEP_TYPES },
+ { PHASE_SWEEP_TYPES_END, "Free type arena", PHASE_SWEEP_TYPES },
+ { PHASE_SWEEP_OBJECT, "Sweep Object", PHASE_SWEEP },
+ { PHASE_SWEEP_STRING, "Sweep String", PHASE_SWEEP },
+ { PHASE_SWEEP_SCRIPT, "Sweep Script", PHASE_SWEEP },
+ { PHASE_SWEEP_SCOPE, "Sweep Scope", PHASE_SWEEP },
+ { PHASE_SWEEP_SHAPE, "Sweep Shape", PHASE_SWEEP },
+ { PHASE_SWEEP_JITCODE, "Sweep JIT code", PHASE_SWEEP },
+ { PHASE_FINALIZE_END, "Finalize End Callback", PHASE_SWEEP },
+ { PHASE_DESTROY, "Deallocate", PHASE_SWEEP },
+ { PHASE_COMPACT, "Compact", PHASE_NO_PARENT },
+ { PHASE_COMPACT_MOVE, "Compact Move", PHASE_COMPACT },
+ { PHASE_COMPACT_UPDATE, "Compact Update", PHASE_COMPACT },
/* PHASE_MARK_ROOTS */
- { PHASE_COMPACT_UPDATE_CELLS, "Compact Update Cells", PHASE_COMPACT_UPDATE, 43 },
- { PHASE_GC_END, "End Callback", PHASE_NO_PARENT, 44 },
- { PHASE_MINOR_GC, "All Minor GCs", PHASE_NO_PARENT, 45 },
+ { PHASE_COMPACT_UPDATE_CELLS, "Compact Update Cells", PHASE_COMPACT_UPDATE },
+ { PHASE_GC_END, "End Callback", PHASE_NO_PARENT },
+ { PHASE_MINOR_GC, "All Minor GCs", PHASE_NO_PARENT },
/* PHASE_MARK_ROOTS */
- { PHASE_EVICT_NURSERY, "Minor GCs to Evict Nursery", PHASE_NO_PARENT, 46 },
+ { PHASE_EVICT_NURSERY, "Minor GCs to Evict Nursery", PHASE_NO_PARENT },
/* PHASE_MARK_ROOTS */
- { PHASE_TRACE_HEAP, "Trace Heap", PHASE_NO_PARENT, 47 },
+ { PHASE_TRACE_HEAP, "Trace Heap", PHASE_NO_PARENT },
/* PHASE_MARK_ROOTS */
- { PHASE_BARRIER, "Barriers", PHASE_NO_PARENT, 55 },
- { PHASE_UNMARK_GRAY, "Unmark gray", PHASE_BARRIER, 56 },
- { PHASE_MARK_ROOTS, "Mark Roots", PHASE_MULTI_PARENTS, 48 },
- { PHASE_BUFFER_GRAY_ROOTS, "Buffer Gray Roots", PHASE_MARK_ROOTS, 49 },
- { PHASE_MARK_CCWS, "Mark Cross Compartment Wrappers", PHASE_MARK_ROOTS, 50 },
- { PHASE_MARK_STACK, "Mark C and JS stacks", PHASE_MARK_ROOTS, 51 },
- { PHASE_MARK_RUNTIME_DATA, "Mark Runtime-wide Data", PHASE_MARK_ROOTS, 52 },
- { PHASE_MARK_EMBEDDING, "Mark Embedding", PHASE_MARK_ROOTS, 53 },
- { PHASE_MARK_COMPARTMENTS, "Mark Compartments", PHASE_MARK_ROOTS, 54 },
- { PHASE_PURGE_SHAPE_TABLES, "Purge ShapeTables", PHASE_NO_PARENT, 60 },
-
- { PHASE_LIMIT, nullptr, PHASE_NO_PARENT, 60 }
-
- // Current number of telemetryBuckets is 60. If you insert new phases
- // somewhere, start at that number and count up. Do not change any existing
- // numbers.
+ { PHASE_BARRIER, "Barriers", PHASE_NO_PARENT },
+ { PHASE_UNMARK_GRAY, "Unmark gray", PHASE_BARRIER },
+ { PHASE_MARK_ROOTS, "Mark Roots", PHASE_MULTI_PARENTS },
+ { PHASE_BUFFER_GRAY_ROOTS, "Buffer Gray Roots", PHASE_MARK_ROOTS },
+ { PHASE_MARK_CCWS, "Mark Cross Compartment Wrappers", PHASE_MARK_ROOTS },
+ { PHASE_MARK_STACK, "Mark C and JS stacks", PHASE_MARK_ROOTS },
+ { PHASE_MARK_RUNTIME_DATA, "Mark Runtime-wide Data", PHASE_MARK_ROOTS },
+ { PHASE_MARK_EMBEDDING, "Mark Embedding", PHASE_MARK_ROOTS },
+ { PHASE_MARK_COMPARTMENTS, "Mark Compartments", PHASE_MARK_ROOTS },
+ { PHASE_PURGE_SHAPE_TABLES, "Purge ShapeTables", PHASE_NO_PARENT },
+
+ { PHASE_LIMIT, nullptr, PHASE_NO_PARENT }
};
static ExtraPhaseInfo phaseExtra[PHASE_LIMIT] = { { 0, 0 } };
@@ -845,12 +833,6 @@ Statistics::~Statistics()
/* static */ bool
Statistics::initialize()
{
- for (size_t i = 0; i < PHASE_LIMIT; i++) {
- MOZ_ASSERT(phases[i].index == i);
- for (size_t j = 0; j < PHASE_LIMIT; j++)
- MOZ_ASSERT_IF(i != j, phases[i].telemetryBucket != phases[j].telemetryBucket);
- }
-
// Create a static table of descendants for every phase with multiple
// children. This assumes that all descendants come linearly in the
// list, which is reasonable since full dags are not supported; any
@@ -925,32 +907,6 @@ Statistics::getMaxGCPauseSinceClear()
return maxPauseInInterval;
}
-// Sum up the time for a phase, including instances of the phase with different
-// parents.
-static int64_t
-SumPhase(Phase phase, const Statistics::PhaseTimeTable times)
-{
- int64_t sum = 0;
- for (auto i : MakeRange(Statistics::NumTimingArrays))
- sum += times[i][phase];
- return sum;
-}
-
-static Phase
-LongestPhase(const Statistics::PhaseTimeTable times)
-{
- int64_t longestTime = 0;
- Phase longestPhase = PHASE_NONE;
- for (size_t i = 0; i < PHASE_LIMIT; ++i) {
- int64_t phaseTime = SumPhase(Phase(i), times);
- if (phaseTime > longestTime) {
- longestTime = phaseTime;
- longestPhase = Phase(i);
- }
- }
- return longestPhase;
-}
-
void
Statistics::printStats()
{
@@ -985,34 +941,6 @@ Statistics::endGC()
int64_t total, longest;
gcDuration(&total, &longest);
- int64_t sccTotal, sccLongest;
- sccDurations(&sccTotal, &sccLongest);
-
- runtime->addTelemetry(JS_TELEMETRY_GC_IS_ZONE_GC, !zoneStats.isCollectingAllZones());
- runtime->addTelemetry(JS_TELEMETRY_GC_MS, t(total));
- runtime->addTelemetry(JS_TELEMETRY_GC_MAX_PAUSE_MS, t(longest));
- int64_t markTotal = SumPhase(PHASE_MARK, phaseTimes);
- int64_t markRootsTotal = SumPhase(PHASE_MARK_ROOTS, phaseTimes);
- runtime->addTelemetry(JS_TELEMETRY_GC_MARK_MS, t(markTotal));
- runtime->addTelemetry(JS_TELEMETRY_GC_SWEEP_MS, t(phaseTimes[PHASE_DAG_NONE][PHASE_SWEEP]));
- if (runtime->gc.isCompactingGc()) {
- runtime->addTelemetry(JS_TELEMETRY_GC_COMPACT_MS,
- t(phaseTimes[PHASE_DAG_NONE][PHASE_COMPACT]));
- }
- runtime->addTelemetry(JS_TELEMETRY_GC_MARK_ROOTS_MS, t(markRootsTotal));
- runtime->addTelemetry(JS_TELEMETRY_GC_MARK_GRAY_MS, t(phaseTimes[PHASE_DAG_NONE][PHASE_SWEEP_MARK_GRAY]));
- runtime->addTelemetry(JS_TELEMETRY_GC_NON_INCREMENTAL, nonincremental());
- if (nonincremental())
- runtime->addTelemetry(JS_TELEMETRY_GC_NON_INCREMENTAL_REASON, uint32_t(nonincrementalReason_));
- runtime->addTelemetry(JS_TELEMETRY_GC_INCREMENTAL_DISABLED, !runtime->gc.isIncrementalGCAllowed());
- runtime->addTelemetry(JS_TELEMETRY_GC_SCC_SWEEP_TOTAL_MS, t(sccTotal));
- runtime->addTelemetry(JS_TELEMETRY_GC_SCC_SWEEP_MAX_PAUSE_MS, t(sccLongest));
-
- if (!aborted) {
- double mmu50 = computeMMU(50 * PRMJ_USEC_PER_MSEC);
- runtime->addTelemetry(JS_TELEMETRY_GC_MMU_50, mmu50 * 100);
- }
-
if (fp)
printStats();
@@ -1061,8 +989,6 @@ Statistics::beginSlice(const ZoneGCStats& zoneStats, JSGCInvocationKind gckind,
return;
}
- runtime->addTelemetry(JS_TELEMETRY_GC_REASON, reason);
-
// Slice callbacks should only fire for the outermost level.
if (gcDepth == 1) {
bool wasFullGC = zoneStats.isCollectingAllZones();
@@ -1082,25 +1008,6 @@ Statistics::endSlice()
slices.back().endFaults = GetPageFaultCount();
slices.back().finalState = runtime->gc.state();
- int64_t sliceTime = slices.back().end - slices.back().start;
- runtime->addTelemetry(JS_TELEMETRY_GC_SLICE_MS, t(sliceTime));
- runtime->addTelemetry(JS_TELEMETRY_GC_RESET, slices.back().wasReset());
- if (slices.back().wasReset())
- runtime->addTelemetry(JS_TELEMETRY_GC_RESET_REASON, uint32_t(slices.back().resetReason));
-
- if (slices.back().budget.isTimeBudget()) {
- int64_t budget_ms = slices.back().budget.timeBudget.budget;
- runtime->addTelemetry(JS_TELEMETRY_GC_BUDGET_MS, budget_ms);
- if (budget_ms == runtime->gc.defaultSliceBudget())
- runtime->addTelemetry(JS_TELEMETRY_GC_ANIMATION_MS, t(sliceTime));
-
- // Record any phase that goes more than 2x over its budget.
- if (sliceTime > 2 * budget_ms * 1000) {
- Phase longest = LongestPhase(slices.back().phaseTimes);
- runtime->addTelemetry(JS_TELEMETRY_GC_SLOW_PHASE, phases[longest].telemetryBucket);
- }
- }
-
sliceCount_++;
}
diff --git a/js/src/jsapi.h b/js/src/jsapi.h
index 30c4a835a..005d2278e 100644
--- a/js/src/jsapi.h
+++ b/js/src/jsapi.h
@@ -2154,6 +2154,13 @@ namespace JS {
extern JS_PUBLIC_API(bool)
OrdinaryHasInstance(JSContext* cx, HandleObject objArg, HandleValue v, bool* bp);
+// Implementation of
+// https://www.ecma-international.org/ecma-262/6.0/#sec-instanceofoperator
+// This is almost identical to JS_HasInstance, except the latter may call a
+// custom hasInstance class op instead of InstanceofOperator.
+extern JS_PUBLIC_API(bool)
+InstanceofOperator(JSContext* cx, HandleObject obj, HandleValue v, bool* bp);
+
} // namespace JS
extern JS_PUBLIC_API(void*)
@@ -6566,7 +6573,7 @@ struct JS_PUBLIC_API(PerformanceGroup) {
uint64_t refCount_;
};
-using PerformanceGroupVector = mozilla::Vector<RefPtr<js::PerformanceGroup>, 0, SystemAllocPolicy>;
+using PerformanceGroupVector = mozilla::Vector<RefPtr<js::PerformanceGroup>, 8, SystemAllocPolicy>;
/**
* Commit any Performance Monitoring data.
@@ -6605,10 +6612,6 @@ SetStopwatchIsMonitoringJank(JSContext*, bool);
extern JS_PUBLIC_API(bool)
GetStopwatchIsMonitoringJank(JSContext*);
-// Extract the CPU rescheduling data.
-extern JS_PUBLIC_API(void)
-GetPerfMonitoringTestCpuRescheduling(JSContext*, uint64_t* stayed, uint64_t* moved);
-
/**
* Add a number of microseconds to the time spent waiting on CPOWs
diff --git a/js/src/jscompartment.cpp b/js/src/jscompartment.cpp
index 4e4ccdf2a..a48bb0ffe 100644
--- a/js/src/jscompartment.cpp
+++ b/js/src/jscompartment.cpp
@@ -41,7 +41,6 @@ using namespace js::gc;
using namespace js::jit;
using mozilla::DebugOnly;
-using mozilla::PodArrayZero;
JSCompartment::JSCompartment(Zone* zone, const JS::CompartmentOptions& options = JS::CompartmentOptions())
: creationOptions_(options.creationOptions()),
@@ -91,7 +90,6 @@ JSCompartment::JSCompartment(Zone* zone, const JS::CompartmentOptions& options =
unmappedArgumentsTemplate_(nullptr),
lcovOutput()
{
- PodArrayZero(sawDeprecatedLanguageExtension);
runtime_->numCompartments++;
MOZ_ASSERT_IF(creationOptions_.mergeable(),
creationOptions_.invisibleToDebugger());
@@ -99,8 +97,6 @@ JSCompartment::JSCompartment(Zone* zone, const JS::CompartmentOptions& options =
JSCompartment::~JSCompartment()
{
- reportTelemetry();
-
// Write the code coverage information in a file.
JSRuntime* rt = runtimeFromMainThread();
if (rt->lcovOutput.isEnabled())
@@ -1268,39 +1264,6 @@ JSCompartment::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf,
*privateData += callback(mallocSizeOf, this);
}
-void
-JSCompartment::reportTelemetry()
-{
- // Only report telemetry for web content and add-ons, not chrome JS.
- if (isSystem_)
- return;
-
- // Hazard analysis can't tell that the telemetry callbacks don't GC.
- JS::AutoSuppressGCAnalysis nogc;
-
- int id = creationOptions_.addonIdOrNull()
- ? JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_ADDONS
- : JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_CONTENT;
-
- // Call back into Firefox's Telemetry reporter.
- for (size_t i = 0; i < DeprecatedLanguageExtensionCount; i++) {
- if (sawDeprecatedLanguageExtension[i])
- runtime_->addTelemetry(id, i);
- }
-}
-
-void
-JSCompartment::addTelemetry(const char* filename, DeprecatedLanguageExtension e)
-{
- // Only report telemetry for web content and add-ons, not chrome JS.
- if (isSystem_)
- return;
- if (!creationOptions_.addonIdOrNull() && (!filename || strncmp(filename, "http", 4) != 0))
- return;
-
- sawDeprecatedLanguageExtension[e] = true;
-}
-
HashNumber
JSCompartment::randomHashCode()
{
diff --git a/js/src/jscompartment.h b/js/src/jscompartment.h
index 7bfeee1f6..98c8fe200 100644
--- a/js/src/jscompartment.h
+++ b/js/src/jscompartment.h
@@ -344,13 +344,6 @@ struct JSCompartment
isAtomsCompartment_ = true;
}
- // Used to approximate non-content code when reporting telemetry.
- inline bool isProbablySystemOrAddonCode() const {
- if (creationOptions_.addonIdOrNull())
- return true;
-
- return isSystem_;
- }
private:
JSPrincipals* principals_;
bool isSystem_;
@@ -879,34 +872,10 @@ struct JSCompartment
return jitCompartment_;
}
- enum DeprecatedLanguageExtension {
- DeprecatedForEach = 0, // JS 1.6+
- // NO LONGER USING 1
- DeprecatedLegacyGenerator = 2, // JS 1.7+
- DeprecatedExpressionClosure = 3, // Added in JS 1.8
- // NO LONGER USING 4
- // NO LONGER USING 5
- // NO LONGER USING 6
- // NO LONGER USING 7
- // NO LONGER USING 8
- // NO LONGER USING 9
- DeprecatedBlockScopeFunRedecl = 10,
- DeprecatedLanguageExtensionCount
- };
-
js::ArgumentsObject* getOrCreateArgumentsTemplateObject(JSContext* cx, bool mapped);
js::ArgumentsObject* maybeArgumentsTemplateObject(bool mapped) const;
- private:
- // Used for collecting telemetry on SpiderMonkey's deprecated language extensions.
- bool sawDeprecatedLanguageExtension[DeprecatedLanguageExtensionCount];
-
- void reportTelemetry();
-
- public:
- void addTelemetry(const char* filename, DeprecatedLanguageExtension e);
-
public:
// Aggregated output used to collect JSScript hit counts when code coverage
// is enabled.
diff --git a/js/src/jsexn.cpp b/js/src/jsexn.cpp
index 9a8e364ed..1e70a3890 100644
--- a/js/src/jsexn.cpp
+++ b/js/src/jsexn.cpp
@@ -707,67 +707,6 @@ ErrorReport::~ErrorReport()
{
}
-void
-ErrorReport::ReportAddonExceptionToTelementry(JSContext* cx)
-{
- MOZ_ASSERT(exnObject);
- RootedObject unwrapped(cx, UncheckedUnwrap(exnObject));
- MOZ_ASSERT(unwrapped, "UncheckedUnwrap failed?");
-
- // There is not much we can report if the exception is not an ErrorObject, let's ignore those.
- if (!unwrapped->is<ErrorObject>())
- return;
-
- Rooted<ErrorObject*> errObj(cx, &unwrapped->as<ErrorObject>());
- RootedObject stack(cx, errObj->stack());
-
- // Let's ignore TOP level exceptions. For regular add-ons those will not be reported anyway,
- // for SDK based once it should not be a valid case either.
- // At this point the frame stack is unwound but the exception object stored the stack so let's
- // use that for getting the function name.
- if (!stack)
- return;
-
- JSCompartment* comp = stack->compartment();
- JSAddonId* addonId = comp->creationOptions().addonIdOrNull();
-
- // We only want to send the report if the scope that just have thrown belongs to an add-on.
- // Let's check the compartment of the youngest function on the stack, to determine that.
- if (!addonId)
- return;
-
- RootedString funnameString(cx);
- JS::SavedFrameResult result = GetSavedFrameFunctionDisplayName(cx, stack, &funnameString);
- // AccessDenied should never be the case here for add-ons but let's not risk it.
- JSAutoByteString bytes;
- const char* funname = nullptr;
- bool denied = result == JS::SavedFrameResult::AccessDenied;
- funname = denied ? "unknown"
- : funnameString ? AtomToPrintableString(cx,
- &funnameString->asAtom(),
- &bytes)
- : "anonymous";
-
- UniqueChars addonIdChars(JS_EncodeString(cx, addonId));
-
- const char* filename = nullptr;
- if (reportp && reportp->filename) {
- filename = strrchr(reportp->filename, '/');
- if (filename)
- filename++;
- }
- if (!filename) {
- filename = "FILE_NOT_FOUND";
- }
- char histogramKey[64];
- SprintfLiteral(histogramKey, "%s %s %s %u",
- addonIdChars.get(),
- funname,
- filename,
- (reportp ? reportp->lineno : 0) );
- cx->runtime()->addTelemetry(JS_TELEMETRY_ADDON_EXCEPTIONS, 1, histogramKey);
-}
-
bool
ErrorReport::init(JSContext* cx, HandleValue exn,
SniffingBehavior sniffingBehavior)
@@ -786,10 +725,6 @@ ErrorReport::init(JSContext* cx, HandleValue exn,
JSMSG_ERR_DURING_THROW);
return false;
}
-
- // Let's see if the exception is from add-on code, if so, it should be reported
- // to telementry.
- ReportAddonExceptionToTelementry(cx);
}
diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp
index 595a21410..f5cd56a9b 100644
--- a/js/src/jsfriendapi.cpp
+++ b/js/src/jsfriendapi.cpp
@@ -543,11 +543,6 @@ js::SetPreserveWrapperCallback(JSContext* cx, PreserveWrapperCallback callback)
cx->preserveWrapperCallback = callback;
}
-/*
- * The below code is for temporary telemetry use. It can be removed when
- * sufficient data has been harvested.
- */
-
namespace js {
// Defined in vm/GlobalObject.cpp.
extern size_t sSetProtoCalled;
@@ -643,12 +638,6 @@ js::StringToLinearStringSlow(JSContext* cx, JSString* str)
return str->ensureLinear(cx);
}
-JS_FRIEND_API(void)
-JS_SetAccumulateTelemetryCallback(JSContext* cx, JSAccumulateTelemetryDataCallback callback)
-{
- cx->setTelemetryCallback(cx, callback);
-}
-
JS_FRIEND_API(JSObject*)
JS_CloneObject(JSContext* cx, HandleObject obj, HandleObject protoArg)
{
diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h
index 722085549..d29285483 100644
--- a/js/src/jsfriendapi.h
+++ b/js/src/jsfriendapi.h
@@ -105,46 +105,6 @@ JS_TraceShapeCycleCollectorChildren(JS::CallbackTracer* trc, JS::GCCellPtr shape
extern JS_FRIEND_API(void)
JS_TraceObjectGroupCycleCollectorChildren(JS::CallbackTracer* trc, JS::GCCellPtr group);
-enum {
- JS_TELEMETRY_GC_REASON,
- JS_TELEMETRY_GC_IS_ZONE_GC,
- JS_TELEMETRY_GC_MS,
- JS_TELEMETRY_GC_BUDGET_MS,
- JS_TELEMETRY_GC_ANIMATION_MS,
- JS_TELEMETRY_GC_MAX_PAUSE_MS,
- JS_TELEMETRY_GC_MARK_MS,
- JS_TELEMETRY_GC_SWEEP_MS,
- JS_TELEMETRY_GC_COMPACT_MS,
- JS_TELEMETRY_GC_MARK_ROOTS_MS,
- JS_TELEMETRY_GC_MARK_GRAY_MS,
- JS_TELEMETRY_GC_SLICE_MS,
- JS_TELEMETRY_GC_SLOW_PHASE,
- JS_TELEMETRY_GC_MMU_50,
- JS_TELEMETRY_GC_RESET,
- JS_TELEMETRY_GC_RESET_REASON,
- JS_TELEMETRY_GC_INCREMENTAL_DISABLED,
- JS_TELEMETRY_GC_NON_INCREMENTAL,
- JS_TELEMETRY_GC_NON_INCREMENTAL_REASON,
- JS_TELEMETRY_GC_SCC_SWEEP_TOTAL_MS,
- JS_TELEMETRY_GC_SCC_SWEEP_MAX_PAUSE_MS,
- JS_TELEMETRY_GC_MINOR_REASON,
- JS_TELEMETRY_GC_MINOR_REASON_LONG,
- JS_TELEMETRY_GC_MINOR_US,
- JS_TELEMETRY_GC_NURSERY_BYTES,
- JS_TELEMETRY_GC_PRETENURE_COUNT,
- JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_CONTENT,
- JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_ADDONS,
- JS_TELEMETRY_ADDON_EXCEPTIONS,
- JS_TELEMETRY_AOT_USAGE,
- JS_TELEMETRY_END
-};
-
-typedef void
-(*JSAccumulateTelemetryDataCallback)(int id, uint32_t sample, const char* key);
-
-extern JS_FRIEND_API(void)
-JS_SetAccumulateTelemetryCallback(JSContext* cx, JSAccumulateTelemetryDataCallback callback);
-
extern JS_FRIEND_API(bool)
JS_GetIsSecureContext(JSCompartment* compartment);
@@ -1456,9 +1416,6 @@ struct MOZ_STACK_CLASS JS_FRIEND_API(ErrorReport)
bool populateUncaughtExceptionReportUTF8(JSContext* cx, ...);
bool populateUncaughtExceptionReportUTF8VA(JSContext* cx, va_list ap);
- // Reports exceptions from add-on scopes to telementry.
- void ReportAddonExceptionToTelementry(JSContext* cx);
-
// We may have a provided JSErrorReport, so need a way to represent that.
JSErrorReport* reportp;
diff --git a/js/src/jsfun.cpp b/js/src/jsfun.cpp
index bcb0da80b..863871df9 100644
--- a/js/src/jsfun.cpp
+++ b/js/src/jsfun.cpp
@@ -690,7 +690,7 @@ js::fun_symbolHasInstance(JSContext* cx, unsigned argc, Value* vp)
}
/*
- * ES6 (4-25-16) 7.3.19 OrdinaryHasInstance
+ * ES6 7.3.19 OrdinaryHasInstance
*/
bool
JS::OrdinaryHasInstance(JSContext* cx, HandleObject objArg, HandleValue v, bool* bp)
@@ -707,7 +707,7 @@ JS::OrdinaryHasInstance(JSContext* cx, HandleObject objArg, HandleValue v, bool*
if (obj->is<JSFunction>() && obj->isBoundFunction()) {
/* Steps 2a-b. */
obj = obj->as<JSFunction>().getBoundFunctionTarget();
- return InstanceOfOperator(cx, obj, v, bp);
+ return InstanceofOperator(cx, obj, v, bp);
}
/* Step 3. */
@@ -716,12 +716,12 @@ JS::OrdinaryHasInstance(JSContext* cx, HandleObject objArg, HandleValue v, bool*
return true;
}
- /* Step 4. */
+ /* Step 4-5. */
RootedValue pval(cx);
if (!GetProperty(cx, obj, obj, cx->names().prototype, &pval))
return false;
- /* Step 5. */
+ /* Step 6. */
if (pval.isPrimitive()) {
/*
* Throw a runtime error if instanceof is called on a function that
@@ -732,7 +732,7 @@ JS::OrdinaryHasInstance(JSContext* cx, HandleObject objArg, HandleValue v, bool*
return false;
}
- /* Step 6. */
+ /* Step 7. */
RootedObject pobj(cx, &pval.toObject());
bool isDelegate;
if (!IsDelegate(cx, pobj, v, &isDelegate))
diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp
index 3d4dae9bb..8cee9ec09 100644
--- a/js/src/jsgc.cpp
+++ b/js/src/jsgc.cpp
@@ -2310,22 +2310,27 @@ GCRuntime::updateCellPointers(MovingTracer* trc, Zone* zone, AllocKinds kinds, s
// 2) typed object type descriptor objects
// 3) all other objects
//
+// Also, there can be data races calling IsForwarded() on the new location of a
+// cell that is being updated in parallel on another thread. This can be avoided
+// by updating some kinds of cells in different phases. This is done for JSScripts
+// and LazyScripts, and JSScripts and Scopes.
+//
// Since we want to minimize the number of phases, we put everything else into
// the first phase and label it the 'misc' phase.
static const AllocKinds UpdatePhaseMisc {
AllocKind::SCRIPT,
- AllocKind::LAZY_SCRIPT,
AllocKind::BASE_SHAPE,
AllocKind::SHAPE,
AllocKind::ACCESSOR_SHAPE,
AllocKind::OBJECT_GROUP,
AllocKind::STRING,
- AllocKind::JITCODE,
- AllocKind::SCOPE
+ AllocKind::JITCODE
};
static const AllocKinds UpdatePhaseObjects {
+ AllocKind::LAZY_SCRIPT,
+ AllocKind::SCOPE,
AllocKind::FUNCTION,
AllocKind::FUNCTION_EXTENDED,
AllocKind::OBJECT0,
diff --git a/js/src/jsstr.cpp b/js/src/jsstr.cpp
index 4151d012b..e3b5708ca 100644
--- a/js/src/jsstr.cpp
+++ b/js/src/jsstr.cpp
@@ -3070,8 +3070,11 @@ js::ValueToSource(JSContext* cx, HandleValue v)
return ToString<CanGC>(cx, v);
}
-
+#if JS_HAS_TOSOURCE
return ObjectToSource(cx, obj);
+#else
+ return ToString<CanGC>(cx, v);
+#endif
}
JSString*
diff --git a/js/src/jswrapper.h b/js/src/jswrapper.h
index 3c73979f8..84ebe2732 100644
--- a/js/src/jswrapper.h
+++ b/js/src/jswrapper.h
@@ -270,6 +270,8 @@ class JS_FRIEND_API(OpaqueCrossCompartmentWrapper) : public CrossCompartmentWrap
virtual bool getBuiltinClass(JSContext* cx, HandleObject wrapper, ESClass* cls) const override;
virtual bool isArray(JSContext* cx, HandleObject obj,
JS::IsArrayAnswer* answer) const override;
+ virtual bool hasInstance(JSContext* cx, HandleObject wrapper,
+ MutableHandleValue v, bool* bp) const override;
virtual const char* className(JSContext* cx, HandleObject wrapper) const override;
virtual JSString* fun_toString(JSContext* cx, HandleObject proxy, unsigned indent) const override;
diff --git a/js/src/proxy/OpaqueCrossCompartmentWrapper.cpp b/js/src/proxy/OpaqueCrossCompartmentWrapper.cpp
index ff3f4145c..02bf237ff 100644
--- a/js/src/proxy/OpaqueCrossCompartmentWrapper.cpp
+++ b/js/src/proxy/OpaqueCrossCompartmentWrapper.cpp
@@ -175,6 +175,14 @@ OpaqueCrossCompartmentWrapper::isArray(JSContext* cx, HandleObject obj,
return true;
}
+bool OpaqueCrossCompartmentWrapper::hasInstance(JSContext* cx,
+ HandleObject wrapper,
+ MutableHandleValue v,
+ bool* bp) const {
+ *bp = false;
+ return true;
+}
+
const char*
OpaqueCrossCompartmentWrapper::className(JSContext* cx,
HandleObject proxy) const
diff --git a/js/src/proxy/ScriptedProxyHandler.cpp b/js/src/proxy/ScriptedProxyHandler.cpp
index 776547337..0e25f470c 100644
--- a/js/src/proxy/ScriptedProxyHandler.cpp
+++ b/js/src/proxy/ScriptedProxyHandler.cpp
@@ -8,8 +8,6 @@
#include "jsapi.h"
-#include "vm/Interpreter.h" // For InstanceOfOperator
-
#include "jsobjinlines.h"
#include "vm/NativeObject-inl.h"
@@ -1230,7 +1228,7 @@ bool
ScriptedProxyHandler::hasInstance(JSContext* cx, HandleObject proxy, MutableHandleValue v,
bool* bp) const
{
- return InstanceOfOperator(cx, proxy, v, bp);
+ return InstanceofOperator(cx, proxy, v, bp);
}
bool
diff --git a/js/src/tests/user.js b/js/src/tests/user.js
index 732bbbd1a..e75593ab1 100755
--- a/js/src/tests/user.js
+++ b/js/src/tests/user.js
@@ -22,7 +22,6 @@ user_pref("javascript.options.strict", false);
user_pref("javascript.options.werror", false);
user_pref("toolkit.startup.max_resumed_crashes", -1);
user_pref("security.turn_off_all_security_so_that_viruses_can_take_over_this_computer", true);
-user_pref("toolkit.telemetry.enabled", false);
user_pref("browser.safebrowsing.phishing.enabled", false);
user_pref("browser.safebrowsing.malware.enabled", false);
user_pref("browser.safebrowsing.forbiddenURIs.enabled", false);
diff --git a/js/src/vm/Interpreter.cpp b/js/src/vm/Interpreter.cpp
index b747e4d7a..e6d6630c4 100644
--- a/js/src/vm/Interpreter.cpp
+++ b/js/src/vm/Interpreter.cpp
@@ -718,14 +718,14 @@ js::Execute(JSContext* cx, HandleScript script, JSObject& envChainArg, Value* rv
}
/*
- * ES6 (4-25-16) 12.10.4 InstanceofOperator
+ * ES6 12.9.4 InstanceofOperator
*/
extern bool
-js::InstanceOfOperator(JSContext* cx, HandleObject obj, HandleValue v, bool* bp)
+JS::InstanceofOperator(JSContext* cx, HandleObject obj, HandleValue v, bool* bp)
{
/* Step 1. is handled by caller. */
- /* Step 2. */
+ /* Step 2-3. */
RootedValue hasInstance(cx);
RootedId id(cx, SYMBOL_TO_JSID(cx->wellKnownSymbols().hasInstance));
if (!GetProperty(cx, obj, obj, id, &hasInstance))
@@ -735,7 +735,7 @@ js::InstanceOfOperator(JSContext* cx, HandleObject obj, HandleValue v, bool* bp)
if (!IsCallable(hasInstance))
return ReportIsNotFunction(cx, hasInstance);
- /* Step 3. */
+ /* Step 4. */
RootedValue rval(cx);
if (!Call(cx, hasInstance, obj, v, &rval))
return false;
@@ -743,13 +743,13 @@ js::InstanceOfOperator(JSContext* cx, HandleObject obj, HandleValue v, bool* bp)
return true;
}
- /* Step 4. */
+ /* Step 5. */
if (!obj->isCallable()) {
RootedValue val(cx, ObjectValue(*obj));
return ReportIsNotFunction(cx, val);
}
- /* Step 5. */
+ /* Step 6. */
return OrdinaryHasInstance(cx, obj, v, bp);
}
@@ -760,7 +760,7 @@ js::HasInstance(JSContext* cx, HandleObject obj, HandleValue v, bool* bp)
RootedValue local(cx, v);
if (JSHasInstanceOp hasInstance = clasp->getHasInstance())
return hasInstance(cx, obj, &local, bp);
- return js::InstanceOfOperator(cx, obj, local, bp);
+ return JS::InstanceofOperator(cx, obj, local, bp);
}
static inline bool
diff --git a/js/src/vm/Interpreter.h b/js/src/vm/Interpreter.h
index 330dbef5f..9fefd75cc 100644
--- a/js/src/vm/Interpreter.h
+++ b/js/src/vm/Interpreter.h
@@ -323,9 +323,6 @@ extern JSType
TypeOfValue(const Value& v);
extern bool
-InstanceOfOperator(JSContext* cx, HandleObject obj, HandleValue v, bool* bp);
-
-extern bool
HasInstance(JSContext* cx, HandleObject obj, HandleValue v, bool* bp);
// Unwind environment chain and iterator to match the scope corresponding to
diff --git a/js/src/vm/Runtime.cpp b/js/src/vm/Runtime.cpp
index 174e23594..8eb997c71 100644
--- a/js/src/vm/Runtime.cpp
+++ b/js/src/vm/Runtime.cpp
@@ -147,7 +147,6 @@ JSRuntime::JSRuntime(JSRuntime* parentRuntime)
updateChildRuntimeCount(parentRuntime),
#endif
interrupt_(false),
- telemetryCallback(nullptr),
handlingSegFault(false),
handlingJitInterrupt_(false),
interruptCallbackDisabled(false),
@@ -452,19 +451,6 @@ JSRuntime::destroyRuntime()
}
void
-JSRuntime::addTelemetry(int id, uint32_t sample, const char* key)
-{
- if (telemetryCallback)
- (*telemetryCallback)(id, sample, key);
-}
-
-void
-JSRuntime::setTelemetryCallback(JSRuntime* rt, JSAccumulateTelemetryDataCallback callback)
-{
- rt->telemetryCallback = callback;
-}
-
-void
JSRuntime::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::RuntimeSizes* rtSizes)
{
// Several tables in the runtime enumerated below can be used off thread.
diff --git a/js/src/vm/Runtime.h b/js/src/vm/Runtime.h
index f354d2069..e60371e38 100644
--- a/js/src/vm/Runtime.h
+++ b/js/src/vm/Runtime.h
@@ -577,17 +577,7 @@ struct JSRuntime : public JS::shadow::Runtime,
#endif
mozilla::Atomic<uint32_t, mozilla::Relaxed> interrupt_;
-
- /* Call this to accumulate telemetry data. */
- JSAccumulateTelemetryDataCallback telemetryCallback;
public:
- // Accumulates data for Firefox telemetry. |id| is the ID of a JS_TELEMETRY_*
- // histogram. |key| provides an additional key to identify the histogram.
- // |sample| is the data to add to the histogram.
- void addTelemetry(int id, uint32_t sample, const char* key = nullptr);
-
- void setTelemetryCallback(JSRuntime* rt, JSAccumulateTelemetryDataCallback callback);
-
enum InterruptMode {
RequestInterruptUrgent,
RequestInterruptCanWait
diff --git a/js/src/vm/SelfHosting.cpp b/js/src/vm/SelfHosting.cpp
index 08670c833..328a960b6 100644
--- a/js/src/vm/SelfHosting.cpp
+++ b/js/src/vm/SelfHosting.cpp
@@ -1904,23 +1904,6 @@ intrinsic_RuntimeDefaultLocale(JSContext* cx, unsigned argc, Value* vp)
}
static bool
-intrinsic_AddContentTelemetry(JSContext* cx, unsigned argc, Value* vp)
-{
- CallArgs args = CallArgsFromVp(argc, vp);
- MOZ_ASSERT(args.length() == 2);
-
- int id = args[0].toInt32();
- MOZ_ASSERT(id < JS_TELEMETRY_END);
- MOZ_ASSERT(id >= 0);
-
- if (!cx->compartment()->isProbablySystemOrAddonCode())
- cx->runtime()->addTelemetry(id, args[1].toInt32());
-
- args.rval().setUndefined();
- return true;
-}
-
-static bool
intrinsic_ConstructFunction(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
@@ -2273,7 +2256,6 @@ static const JSFunctionSpec intrinsic_functions[] = {
JS_FN("DecompileArg", intrinsic_DecompileArg, 2,0),
JS_FN("_FinishBoundFunctionInit", intrinsic_FinishBoundFunctionInit, 3,0),
JS_FN("RuntimeDefaultLocale", intrinsic_RuntimeDefaultLocale, 0,0),
- JS_FN("AddContentTelemetry", intrinsic_AddContentTelemetry, 2,0),
JS_INLINABLE_FN("_IsConstructing", intrinsic_IsConstructing, 0,0,
IntrinsicIsConstructing),
diff --git a/js/src/vm/Stopwatch.cpp b/js/src/vm/Stopwatch.cpp
index 28632c2a1..684846f00 100644
--- a/js/src/vm/Stopwatch.cpp
+++ b/js/src/vm/Stopwatch.cpp
@@ -20,6 +20,7 @@
#include "gc/Zone.h"
#include "vm/Runtime.h"
+
namespace js {
bool
@@ -136,6 +137,9 @@ PerformanceMonitoring::start()
bool
PerformanceMonitoring::commit()
{
+ // Maximal initialization size, in elements for the vector of groups.
+ static const size_t MAX_GROUPS_INIT_CAPACITY = 1024;
+
#if !defined(MOZ_HAVE_RDTSC)
// The AutoStopwatch is only executed if `MOZ_HAVE_RDTSC`.
return false;
@@ -152,13 +156,24 @@ PerformanceMonitoring::commit()
return true;
}
- PerformanceGroupVector recentGroups;
- recentGroups_.swap(recentGroups);
+ // The move operation is generally constant time, unless
+ // `recentGroups_.length()` is very small, in which case
+ // it's fast just because it's small.
+ PerformanceGroupVector recentGroups(Move(recentGroups_));
+ recentGroups_ = PerformanceGroupVector(); // Reconstruct after `Move`.
bool success = true;
if (stopwatchCommitCallback)
success = stopwatchCommitCallback(iteration_, recentGroups, stopwatchCommitClosure);
+ // Heuristic: we expect to have roughly the same number of groups as in
+ // the previous iteration.
+ const size_t capacity = recentGroups.capacity() < MAX_GROUPS_INIT_CAPACITY ?
+ recentGroups.capacity() :
+ MAX_GROUPS_INIT_CAPACITY;
+ success = recentGroups_.reserve(capacity)
+ && success;
+
// Reset immediately, to make sure that we're not hit by the end
// of a nested event loop (which would cause `commit` to be called
// twice in succession).
@@ -227,7 +242,7 @@ AutoStopwatch::AutoStopwatch(JSContext* cx MOZ_GUARD_OBJECT_NOTIFIER_PARAM_IN_IM
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
JSCompartment* compartment = cx_->compartment();
- if (compartment->scheduledForDestruction)
+ if (MOZ_UNLIKELY(compartment->scheduledForDestruction))
return;
JSRuntime* runtime = cx_->runtime();
@@ -266,11 +281,11 @@ AutoStopwatch::~AutoStopwatch()
}
JSCompartment* compartment = cx_->compartment();
- if (compartment->scheduledForDestruction)
+ if (MOZ_UNLIKELY(compartment->scheduledForDestruction))
return;
JSRuntime* runtime = cx_->runtime();
- if (iteration_ != runtime->performanceMonitoring.iteration()) {
+ if (MOZ_UNLIKELY(iteration_ != runtime->performanceMonitoring.iteration())) {
// We have entered a nested event loop at some point.
// Any information we may have is obsolete.
return;
@@ -319,11 +334,6 @@ AutoStopwatch::exit()
const uint64_t cyclesEnd = getCycles(runtime);
cyclesDelta = cyclesEnd - cyclesStart_; // Always >= 0 by definition of `getCycles`.
}
-#if WINVER >= 0x600
- updateTelemetry(cpuStart_, cpuEnd);
-#elif defined(__linux__)
- updateTelemetry(cpuStart_, cpuEnd);
-#endif // WINVER >= 0x600 || _linux__
}
uint64_t CPOWTimeDelta = 0;
@@ -335,17 +345,6 @@ AutoStopwatch::exit()
return addToGroups(cyclesDelta, CPOWTimeDelta);
}
-void
-AutoStopwatch::updateTelemetry(const cpuid_t& cpuStart_, const cpuid_t& cpuEnd)
-{
- JSRuntime* runtime = cx_->runtime();
-
- if (isSameCPU(cpuStart_, cpuEnd))
- runtime->performanceMonitoring.testCpuRescheduling.stayed += 1;
- else
- runtime->performanceMonitoring.testCpuRescheduling.moved += 1;
-}
-
PerformanceGroup*
AutoStopwatch::acquireGroup(PerformanceGroup* group)
{
@@ -638,13 +637,6 @@ GetStopwatchIsMonitoringCPOW(JSContext* cx)
}
JS_PUBLIC_API(void)
-GetPerfMonitoringTestCpuRescheduling(JSContext* cx, uint64_t* stayed, uint64_t* moved)
-{
- *stayed = cx->performanceMonitoring.testCpuRescheduling.stayed;
- *moved = cx->performanceMonitoring.testCpuRescheduling.moved;
-}
-
-JS_PUBLIC_API(void)
AddCPOWPerformanceDelta(JSContext* cx, uint64_t delta)
{
cx->performanceMonitoring.totalCPOWTime += delta;
diff --git a/js/src/vm/Stopwatch.h b/js/src/vm/Stopwatch.h
index 38a3eb801..d7f299594 100644
--- a/js/src/vm/Stopwatch.h
+++ b/js/src/vm/Stopwatch.h
@@ -217,33 +217,6 @@ struct PerformanceMonitoring {
*/
uint64_t monotonicReadTimestampCounter();
- /**
- * Data extracted by the AutoStopwatch to determine how often
- * we reschedule the process to a different CPU during the
- * execution of JS.
- *
- * Warning: These values are incremented *only* on platforms
- * that offer a syscall/libcall to check on which CPU a
- * process is currently executed.
- */
- struct TestCpuRescheduling
- {
- // Incremented once we have finished executing code
- // in a group, if the CPU on which we started
- // execution is the same as the CPU on which
- // we finished.
- uint64_t stayed;
- // Incremented once we have finished executing code
- // in a group, if the CPU on which we started
- // execution is different from the CPU on which
- // we finished.
- uint64_t moved;
- TestCpuRescheduling()
- : stayed(0),
- moved(0)
- { }
- };
- TestCpuRescheduling testCpuRescheduling;
private:
PerformanceMonitoring(const PerformanceMonitoring&) = delete;
PerformanceMonitoring& operator=(const PerformanceMonitoring&) = delete;
@@ -375,9 +348,6 @@ class AutoStopwatch final {
// Add recent changes to a single group. Mark the group as changed recently.
bool addToGroup(JSRuntime* runtime, uint64_t cyclesDelta, uint64_t CPOWTimeDelta, PerformanceGroup* group);
- // Update telemetry statistics.
- void updateTelemetry(const cpuid_t& a, const cpuid_t& b);
-
// Perform a subtraction for a quantity that should be monotonic
// but is not guaranteed to be so.
//
diff --git a/js/src/wasm/WasmBinaryConstants.h b/js/src/wasm/WasmBinaryConstants.h
index fd3bd1264..9aa5091f6 100644
--- a/js/src/wasm/WasmBinaryConstants.h
+++ b/js/src/wasm/WasmBinaryConstants.h
@@ -434,15 +434,6 @@ enum class Op
Limit
};
-// Telemetry sample values for the JS_AOT_USAGE key, indicating whether asm.js
-// or WebAssembly is used.
-
-enum class Telemetry
-{
- ASMJS = 0,
- WASM = 1
-};
-
} // namespace wasm
} // namespace js
diff --git a/js/src/wasm/WasmModule.cpp b/js/src/wasm/WasmModule.cpp
index b24e01a40..f1ecd8620 100644
--- a/js/src/wasm/WasmModule.cpp
+++ b/js/src/wasm/WasmModule.cpp
@@ -1066,8 +1066,5 @@ Module::instantiate(JSContext* cx,
return false;
}
- uint32_t mode = uint32_t(metadata().isAsmJS() ? Telemetry::ASMJS : Telemetry::WASM);
- cx->runtime()->addTelemetry(JS_TELEMETRY_AOT_USAGE, mode);
-
return true;
}
diff --git a/js/xpconnect/loader/mozJSSubScriptLoader.cpp b/js/xpconnect/loader/mozJSSubScriptLoader.cpp
index 9c8908ea4..f23e5833a 100644
--- a/js/xpconnect/loader/mozJSSubScriptLoader.cpp
+++ b/js/xpconnect/loader/mozJSSubScriptLoader.cpp
@@ -295,7 +295,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(AsyncScriptLoader)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPromise)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(AsyncScriptLoader)
diff --git a/js/xpconnect/src/Sandbox.cpp b/js/xpconnect/src/Sandbox.cpp
index 120772ed2..a516cf73f 100644
--- a/js/xpconnect/src/Sandbox.cpp
+++ b/js/xpconnect/src/Sandbox.cpp
@@ -66,7 +66,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(SandboxPrivate)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(SandboxPrivate)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
tmp->TraverseHostObjectURIs(cb);
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
diff --git a/js/xpconnect/src/XPCJSContext.cpp b/js/xpconnect/src/XPCJSContext.cpp
index 82af64520..0243d80e3 100644
--- a/js/xpconnect/src/XPCJSContext.cpp
+++ b/js/xpconnect/src/XPCJSContext.cpp
@@ -132,7 +132,6 @@ class AsyncFreeSnowWhite : public Runnable
public:
NS_IMETHOD Run() override
{
- TimeStamp start = TimeStamp::Now();
bool hadSnowWhiteObjects = nsCycleCollector_doDeferredDeletion();
if (hadSnowWhiteObjects && !mContinuation) {
mContinuation = true;
@@ -1235,8 +1234,6 @@ XPCJSContext::InterruptCallback(JSContext* cx)
if (self->mSlowScriptCheckpoint.IsNull()) {
self->mSlowScriptCheckpoint = TimeStamp::NowLoRes();
self->mSlowScriptSecondHalf = false;
- self->mSlowScriptActualWait = mozilla::TimeDuration();
- self->mTimeoutAccumulated = false;
return true;
}
@@ -1258,8 +1255,6 @@ XPCJSContext::InterruptCallback(JSContext* cx)
if (limit == 0 || duration.ToSeconds() < limit / 2.0)
return true;
- self->mSlowScriptActualWait += duration;
-
// In order to guard against time changes or laptops going to sleep, we
// don't trigger the slow script warning until (limit/2) seconds have
// elapsed twice.
@@ -1311,12 +1306,6 @@ XPCJSContext::InterruptCallback(JSContext* cx)
return false;
}
- // Accumulate slow script invokation delay.
- if (!chrome && !self->mTimeoutAccumulated) {
- uint32_t delay = uint32_t(self->mSlowScriptActualWait.ToMilliseconds() - (limit * 1000.0));
- self->mTimeoutAccumulated = true;
- }
-
// Show the prompt to the user, and kill if requested.
nsGlobalWindow::SlowScriptResponse response = win->ShowSlowScriptDialog();
if (response == nsGlobalWindow::KillSlowScript) {
@@ -2949,12 +2938,6 @@ JSSizeOfTab(JSObject* objArg, size_t* jsObjectsSize, size_t* jsStringsSize,
} // namespace xpc
static void
-AccumulateTelemetryCallback(int id, uint32_t sample, const char* key)
-{
-/* STUB */
-}
-
-static void
CompartmentNameCallback(JSContext* cx, JSCompartment* comp,
char* buf, size_t bufsize)
{
@@ -3113,7 +3096,6 @@ XPCJSContext::XPCJSContext()
mWatchdogManager(new WatchdogManager(this)),
mAsyncSnowWhiteFreer(new AsyncFreeSnowWhite()),
mSlowScriptSecondHalf(false),
- mTimeoutAccumulated(false),
mPendingResult(NS_OK)
{
}
@@ -3279,7 +3261,6 @@ XPCJSContext::Initialize()
JS_AddWeakPointerCompartmentCallback(cx, WeakPointerCompartmentCallback, this);
JS_SetWrapObjectCallbacks(cx, &WrapObjectCallbacks);
js::SetPreserveWrapperCallback(cx, PreserveWrapper);
- JS_SetAccumulateTelemetryCallback(cx, AccumulateTelemetryCallback);
js::SetActivityCallback(cx, ActivityCallback, this);
JS_AddInterruptCallback(cx, InterruptCallback);
js::SetWindowProxyClass(cx, &OuterWindowProxyClass);
@@ -3444,8 +3425,6 @@ XPCJSContext::BeforeProcessTask(bool aMightBlock)
// Start the slow script timer.
mSlowScriptCheckpoint = mozilla::TimeStamp::NowLoRes();
mSlowScriptSecondHalf = false;
- mSlowScriptActualWait = mozilla::TimeDuration();
- mTimeoutAccumulated = false;
// As we may be entering a nested event loop, we need to
// cancel any ongoing performance measurement.
diff --git a/js/xpconnect/src/nsScriptErrorWithStack.cpp b/js/xpconnect/src/nsScriptErrorWithStack.cpp
index edc12fa76..50407da23 100644
--- a/js/xpconnect/src/nsScriptErrorWithStack.cpp
+++ b/js/xpconnect/src/nsScriptErrorWithStack.cpp
@@ -45,7 +45,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsScriptErrorWithStack)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsScriptErrorWithStack)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsScriptErrorWithStack)
diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h
index d7d5586b8..347b406eb 100644
--- a/js/xpconnect/src/xpcprivate.h
+++ b/js/xpconnect/src/xpcprivate.h
@@ -634,9 +634,6 @@ private:
// (whichever comes later). We use it to determine whether the interrupt
// callback needs to do anything.
mozilla::TimeStamp mSlowScriptCheckpoint;
- // Accumulates total time we actually waited for telemetry
- mozilla::TimeDuration mSlowScriptActualWait;
- bool mTimeoutAccumulated;
// mPendingResult is used to implement Components.returnCode. Only really
// meaningful while calling through XPCWrappedJS.
diff --git a/js/xpconnect/wrappers/WaiveXrayWrapper.cpp b/js/xpconnect/wrappers/WaiveXrayWrapper.cpp
index 27c010d34..dca3daa58 100644
--- a/js/xpconnect/wrappers/WaiveXrayWrapper.cpp
+++ b/js/xpconnect/wrappers/WaiveXrayWrapper.cpp
@@ -88,6 +88,37 @@ WaiveXrayWrapper::nativeCall(JSContext* cx, JS::IsAcceptableThis test,
}
bool
+WaiveXrayWrapper::hasInstance(JSContext* cx, HandleObject wrapper,
+ MutableHandleValue v, bool* bp) const {
+ if (v.isObject() && WrapperFactory::IsXrayWrapper(&v.toObject())) {
+ // If |v| is an XrayWrapper and in the same compartment as the value
+ // wrapped by |wrapper|, then the Xrays of |v| would be waived upon
+ // calling CrossCompartmentWrapper::hasInstance. This may trigger
+ // getters and proxy traps of unwrapped |v|. To prevent that from
+ // happening, we exit early.
+
+ // |wrapper| is the right operand of "instanceof", and must either be
+ // a function or an object with a @@hasInstance method. We are not going
+ // to call @@hasInstance, so only check whether it is a function.
+ // This check is here for consistency with usual "instanceof" behavior,
+ // which throws if the right operand is not a function. Without this
+ // check, the "instanceof" operator would return false and potentially
+ // hide errors in the code that uses the "instanceof" operator.
+ if (!JS::IsCallable(wrapper)) {
+ RootedValue wrapperv(cx, JS::ObjectValue(*wrapper));
+ js::ReportIsNotFunction(cx, wrapperv);
+ return false;
+ }
+
+ *bp = false;
+ return true;
+ }
+
+ // Both |wrapper| and |v| have no Xrays here.
+ return CrossCompartmentWrapper::hasInstance(cx, wrapper, v, bp);
+}
+
+bool
WaiveXrayWrapper::getPrototype(JSContext* cx, HandleObject wrapper, MutableHandleObject protop) const
{
return CrossCompartmentWrapper::getPrototype(cx, wrapper, protop) &&
diff --git a/js/xpconnect/wrappers/WaiveXrayWrapper.h b/js/xpconnect/wrappers/WaiveXrayWrapper.h
index b0b447796..0f9675c17 100644
--- a/js/xpconnect/wrappers/WaiveXrayWrapper.h
+++ b/js/xpconnect/wrappers/WaiveXrayWrapper.h
@@ -36,6 +36,8 @@ class WaiveXrayWrapper : public js::CrossCompartmentWrapper {
JS::MutableHandle<JSObject*> objp) const override;
virtual bool nativeCall(JSContext* cx, JS::IsAcceptableThis test,
JS::NativeImpl impl, const JS::CallArgs& args) const override;
+ virtual bool hasInstance(JSContext* cx, JS::HandleObject wrapper,
+ JS::MutableHandleValue v, bool* bp) const override;
virtual bool getPropertyDescriptor(JSContext* cx, JS::Handle<JSObject*> wrapper,
JS::Handle<jsid> id,
JS::MutableHandle<JS::PropertyDescriptor> desc) const override;
diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp
index 48a9fdc68..6e5a2f5e5 100644
--- a/js/xpconnect/wrappers/XrayWrapper.cpp
+++ b/js/xpconnect/wrappers/XrayWrapper.cpp
@@ -2309,6 +2309,20 @@ XrayWrapper<Base, Traits>::getBuiltinClass(JSContext* cx, JS::HandleObject wrapp
}
template <typename Base, typename Traits>
+bool
+XrayWrapper<Base, Traits>::hasInstance(JSContext* cx,
+ JS::HandleObject wrapper,
+ JS::MutableHandleValue v,
+ bool* bp) const {
+ assertEnteredPolicy(cx, wrapper, JSID_VOID, BaseProxyHandler::GET);
+
+ // CrossCompartmentWrapper::hasInstance unwraps |wrapper|'s Xrays and enters
+ // its compartment. Any present XrayWrappers should be preserved, so the
+ // standard "instanceof" implementation is called without unwrapping first.
+ return JS::InstanceofOperator(cx, wrapper, v, bp);
+}
+
+template <typename Base, typename Traits>
const char*
XrayWrapper<Base, Traits>::className(JSContext* cx, HandleObject wrapper) const
{
diff --git a/js/xpconnect/wrappers/XrayWrapper.h b/js/xpconnect/wrappers/XrayWrapper.h
index 5630982c2..038d82390 100644
--- a/js/xpconnect/wrappers/XrayWrapper.h
+++ b/js/xpconnect/wrappers/XrayWrapper.h
@@ -482,6 +482,8 @@ class XrayWrapper : public Base {
JS::AutoIdVector& props) const override;
virtual bool getBuiltinClass(JSContext* cx, JS::HandleObject wapper, js::ESClass* cls) const override;
+ virtual bool hasInstance(JSContext* cx, JS::HandleObject wrapper,
+ JS::MutableHandleValue v, bool* bp) const override;
virtual const char* className(JSContext* cx, JS::HandleObject proxy) const override;
static const XrayWrapper singleton;
diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp
index 71ebfad22..ff9edf742 100644
--- a/layout/base/nsCSSRendering.cpp
+++ b/layout/base/nsCSSRendering.cpp
@@ -1803,6 +1803,44 @@ SetupDirtyRects(const nsRect& aBGClipArea, const nsRect& aCallerDirtyRect,
"second should be empty if first is");
}
+static bool
+IsSVGStyleGeometryBox(StyleGeometryBox aBox)
+{
+ return (aBox == StyleGeometryBox::Fill || aBox == StyleGeometryBox::Stroke ||
+ aBox == StyleGeometryBox::View);
+}
+
+static bool
+IsHTMLStyleGeometryBox(StyleGeometryBox aBox)
+{
+ return (aBox == StyleGeometryBox::Content ||
+ aBox == StyleGeometryBox::Padding ||
+ aBox == StyleGeometryBox::Border ||
+ aBox == StyleGeometryBox::Margin);
+}
+
+static StyleGeometryBox
+ComputeBoxValue(nsIFrame* aForFrame, StyleGeometryBox aBox)
+{
+ // Except <svg>, all svg elements are not associate with CSS layout box.
+ if (aForFrame->IsFrameOfType(nsIFrame::eSVG) &&
+ (aForFrame->GetType() != nsGkAtoms::svgOuterSVGFrame)) {
+ // For SVG elements without associated CSS layout box, the values
+ // content-box, padding-box, border-box and margin-box compute to fill-box.
+ if (IsHTMLStyleGeometryBox(aBox)) {
+ return StyleGeometryBox::Fill;
+ }
+ } else {
+ // For elements with associated CSS layout box, the values fill-box,
+ // stroke-box and view-box compute to the initial value of mask-clip.
+ if (IsSVGStyleGeometryBox(aBox)) {
+ return StyleGeometryBox::Border;
+ }
+ }
+
+ return aBox;
+}
+
/* static */ void
nsCSSRendering::GetImageLayerClip(const nsStyleImageLayers::Layer& aLayer,
nsIFrame* aForFrame, const nsStyleBorder& aBorder,
@@ -1810,6 +1848,55 @@ nsCSSRendering::GetImageLayerClip(const nsStyleImageLayers::Layer& aLayer,
bool aWillPaintBorder, nscoord aAppUnitsPerPixel,
/* out */ ImageLayerClipState* aClipState)
{
+ StyleGeometryBox layerClip = ComputeBoxValue(aForFrame, aLayer.mClip);
+
+ if (IsSVGStyleGeometryBox(layerClip)) {
+ MOZ_ASSERT(aForFrame->IsFrameOfType(nsIFrame::eSVG) &&
+ (aForFrame->GetType() != nsGkAtoms::svgOuterSVGFrame));
+
+ aClipState->mHasAdditionalBGClipArea = false;
+ aClipState->mCustomClip = false;
+
+ // The coordinate space of clipArea is svg user space.
+ nsRect clipArea =
+ nsLayoutUtils::ComputeGeometryBox(aForFrame, layerClip);
+
+ nsRect strokeBox = (layerClip == StyleGeometryBox::Stroke)
+ ? clipArea
+ : nsLayoutUtils::ComputeGeometryBox(aForFrame, StyleGeometryBox::Stroke);
+ nsRect clipAreaRelativeToStrokeBox = clipArea - strokeBox.TopLeft();
+
+ // aBorderArea is the stroke-box area in a coordinate space defined by
+ // the caller. This coordinate space can be svg user space of aForFrame,
+ // the space of aForFrame's reference-frame, or anything else.
+ //
+ // Which coordinate space chosen for aBorderArea is not matter. What
+ // matter is to ensure returning aClipState->mBGClipArea in the consistent
+ // coordiante space with aBorderArea. So we evaluate the position of clip
+ // area base on the position of aBorderArea here.
+ aClipState->mBGClipArea =
+ clipAreaRelativeToStrokeBox + aBorderArea.TopLeft();
+
+ SetupDirtyRects(aClipState->mBGClipArea, aCallerDirtyRect,
+ aAppUnitsPerPixel, &aClipState->mDirtyRect,
+ &aClipState->mDirtyRectGfx);
+ return;
+ }
+
+ if (layerClip == StyleGeometryBox::NoClip) {
+ aClipState->mBGClipArea = aCallerDirtyRect;
+ aClipState->mHasAdditionalBGClipArea = false;
+ aClipState->mCustomClip = false;
+
+ SetupDirtyRects(aClipState->mBGClipArea, aCallerDirtyRect,
+ aAppUnitsPerPixel, &aClipState->mDirtyRect,
+ &aClipState->mDirtyRectGfx);
+ return;
+ }
+
+ MOZ_ASSERT(!aForFrame->IsFrameOfType(nsIFrame::eSVG) ||
+ aForFrame->GetType() == nsGkAtoms::svgOuterSVGFrame);
+
// Compute the outermost boundary of the area that might be painted.
// Same coordinate space as aBorderArea.
Sides skipSides = aForFrame->GetSkipSides();
@@ -1819,16 +1906,15 @@ nsCSSRendering::GetImageLayerClip(const nsStyleImageLayers::Layer& aLayer,
bool haveRoundedCorners = GetRadii(aForFrame, aBorder, aBorderArea,
clipBorderArea, aClipState->mRadii);
- uint8_t backgroundClip = aLayer.mClip;
-
bool isSolidBorder =
aWillPaintBorder && IsOpaqueBorder(aBorder);
- if (isSolidBorder && backgroundClip == NS_STYLE_IMAGELAYER_CLIP_BORDER) {
+ if (isSolidBorder && layerClip == StyleGeometryBox::Border) {
// If we have rounded corners, we need to inflate the background
// drawing area a bit to avoid seams between the border and
// background.
- backgroundClip = haveRoundedCorners ?
- NS_STYLE_IMAGELAYER_CLIP_MOZ_ALMOST_PADDING : NS_STYLE_IMAGELAYER_CLIP_PADDING;
+ layerClip = haveRoundedCorners
+ ? StyleGeometryBox::MozAlmostPadding
+ : StyleGeometryBox::Padding;
}
aClipState->mBGClipArea = clipBorderArea;
@@ -1844,7 +1930,7 @@ nsCSSRendering::GetImageLayerClip(const nsStyleImageLayers::Layer& aLayer,
// but the background is also clipped at a non-scrolling 'padding-box'
// like the content. (See below.)
// Therefore, only 'content-box' makes a difference here.
- if (backgroundClip == NS_STYLE_IMAGELAYER_CLIP_CONTENT) {
+ if (layerClip == StyleGeometryBox::Content) {
nsIScrollableFrame* scrollableFrame = do_QueryFrame(aForFrame);
// Clip at a rectangle attached to the scrolled content.
aClipState->mHasAdditionalBGClipArea = true;
@@ -1864,22 +1950,30 @@ nsCSSRendering::GetImageLayerClip(const nsStyleImageLayers::Layer& aLayer,
// Also clip at a non-scrolling, rounded-corner 'padding-box',
// same as the scrolled content because of the 'overflow' property.
- backgroundClip = NS_STYLE_IMAGELAYER_CLIP_PADDING;
+ layerClip = StyleGeometryBox::Padding;
}
- if (backgroundClip != NS_STYLE_IMAGELAYER_CLIP_BORDER &&
- backgroundClip != NS_STYLE_IMAGELAYER_CLIP_TEXT) {
+ // See the comment of StyleGeometryBox::Margin.
+ // Hitting this assertion means we decide to turn on margin-box support for
+ // positioned mask from CSS parser and style system. In this case, you
+ // should *inflate* mBGClipArea by the margin returning from
+ // aForFrame->GetUsedMargin() in the code chunk bellow.
+ MOZ_ASSERT(layerClip != StyleGeometryBox::Margin,
+ "StyleGeometryBox::Margin rendering is not supported yet.\n");
+
+ if (layerClip != StyleGeometryBox::Border &&
+ layerClip != StyleGeometryBox::Text) {
nsMargin border = aForFrame->GetUsedBorder();
- if (backgroundClip == NS_STYLE_IMAGELAYER_CLIP_MOZ_ALMOST_PADDING) {
+ if (layerClip == StyleGeometryBox::MozAlmostPadding) {
// Reduce |border| by 1px (device pixels) on all sides, if
// possible, so that we don't get antialiasing seams between the
- // background and border.
+ // {background|mask} and border.
border.top = std::max(0, border.top - aAppUnitsPerPixel);
border.right = std::max(0, border.right - aAppUnitsPerPixel);
border.bottom = std::max(0, border.bottom - aAppUnitsPerPixel);
border.left = std::max(0, border.left - aAppUnitsPerPixel);
- } else if (backgroundClip != NS_STYLE_IMAGELAYER_CLIP_PADDING) {
- NS_ASSERTION(backgroundClip == NS_STYLE_IMAGELAYER_CLIP_CONTENT,
+ } else if (layerClip != StyleGeometryBox::Padding) {
+ NS_ASSERTION(layerClip == StyleGeometryBox::Content,
"unexpected background-clip");
border += aForFrame->GetUsedPadding();
}
@@ -3163,7 +3257,7 @@ nsCSSRendering::PaintBackgroundWithSC(const PaintBGParams& aParams,
if (drawBackgroundImage) {
bool clipSet = false;
- uint8_t currentBackgroundClip = NS_STYLE_IMAGELAYER_CLIP_BORDER;
+ StyleGeometryBox currentBackgroundClip = StyleGeometryBox::Border;
NS_FOR_VISIBLE_IMAGE_LAYERS_BACK_TO_FRONT_WITH_RANGE(i, layers, layers.mImageCount - 1,
nLayers + (layers.mImageCount -
startLayer - 1)) {
@@ -3239,16 +3333,43 @@ nsCSSRendering::ComputeImageLayerPositioningArea(nsPresContext* aPresContext,
nsIFrame** aAttachedToFrame,
bool* aOutIsTransformedFixed)
{
- // Compute background origin area relative to aBorderArea now as we may need
- // it to compute the effective image size for a CSS gradient.
- nsRect bgPositioningArea;
+ // Compute {background|mask} origin area relative to aBorderArea now as we
+ // may need it to compute the effective image size for a CSS gradient.
+ nsRect positionArea;
+
+ StyleGeometryBox layerOrigin =
+ ComputeBoxValue(aForFrame, aLayer.mOrigin);
+
+ if (IsSVGStyleGeometryBox(layerOrigin)) {
+ MOZ_ASSERT(aForFrame->IsFrameOfType(nsIFrame::eSVG) &&
+ (aForFrame->GetType() != nsGkAtoms::svgOuterSVGFrame));
+ *aAttachedToFrame = aForFrame;
+
+ positionArea =
+ nsLayoutUtils::ComputeGeometryBox(aForFrame, layerOrigin);
+
+ nsPoint toStrokeBoxOffset = nsPoint(0, 0);
+ if (layerOrigin != StyleGeometryBox::Stroke) {
+ nsRect strokeBox =
+ nsLayoutUtils::ComputeGeometryBox(aForFrame,
+ StyleGeometryBox::Stroke);
+ toStrokeBoxOffset = positionArea.TopLeft() - strokeBox.TopLeft();
+ }
+
+ // For SVG frames, the return value is relative to the stroke box
+ return nsRect(toStrokeBoxOffset, positionArea.Size());
+ }
+
+ MOZ_ASSERT(!aForFrame->IsFrameOfType(nsIFrame::eSVG) ||
+ aForFrame->GetType() == nsGkAtoms::svgOuterSVGFrame);
+
nsIAtom* frameType = aForFrame->GetType();
nsIFrame* geometryFrame = aForFrame;
if (MOZ_UNLIKELY(frameType == nsGkAtoms::scrollFrame &&
NS_STYLE_IMAGELAYER_ATTACHMENT_LOCAL == aLayer.mAttachment)) {
nsIScrollableFrame* scrollableFrame = do_QueryFrame(aForFrame);
- bgPositioningArea = nsRect(
+ positionArea = nsRect(
scrollableFrame->GetScrolledFrame()->GetPosition()
// For the dir=rtl case:
+ scrollableFrame->GetScrollRange().TopLeft(),
@@ -3256,20 +3377,20 @@ nsCSSRendering::ComputeImageLayerPositioningArea(nsPresContext* aPresContext,
// The ScrolledRect’s size does not include the borders or scrollbars,
// reverse the handling of background-origin
// compared to the common case below.
- if (aLayer.mOrigin == NS_STYLE_IMAGELAYER_ORIGIN_BORDER) {
+ if (layerOrigin == StyleGeometryBox::Border) {
nsMargin border = geometryFrame->GetUsedBorder();
border.ApplySkipSides(geometryFrame->GetSkipSides());
- bgPositioningArea.Inflate(border);
- bgPositioningArea.Inflate(scrollableFrame->GetActualScrollbarSizes());
- } else if (aLayer.mOrigin != NS_STYLE_IMAGELAYER_ORIGIN_PADDING) {
+ positionArea.Inflate(border);
+ positionArea.Inflate(scrollableFrame->GetActualScrollbarSizes());
+ } else if (layerOrigin != StyleGeometryBox::Padding) {
nsMargin padding = geometryFrame->GetUsedPadding();
padding.ApplySkipSides(geometryFrame->GetSkipSides());
- bgPositioningArea.Deflate(padding);
- NS_ASSERTION(aLayer.mOrigin == NS_STYLE_IMAGELAYER_ORIGIN_CONTENT,
+ positionArea.Deflate(padding);
+ NS_ASSERTION(layerOrigin == StyleGeometryBox::Content,
"unknown background-origin value");
}
*aAttachedToFrame = aForFrame;
- return bgPositioningArea;
+ return positionArea;
}
if (MOZ_UNLIKELY(frameType == nsGkAtoms::canvasFrame)) {
@@ -3279,25 +3400,31 @@ nsCSSRendering::ComputeImageLayerPositioningArea(nsPresContext* aPresContext,
// finished and this page only displays the continuations of
// absolutely positioned content).
if (geometryFrame) {
- bgPositioningArea = geometryFrame->GetRect();
+ positionArea = geometryFrame->GetRect();
}
} else {
- bgPositioningArea = nsRect(nsPoint(0,0), aBorderArea.Size());
+ positionArea = nsRect(nsPoint(0,0), aBorderArea.Size());
}
- // Background images are tiled over the 'background-clip' area
- // but the origin of the tiling is based on the 'background-origin' area
- // XXX: Bug 1303623 will bring in new origin value, we should iterate from
- // NS_STYLE_IMAGELAYER_ORIGIN_MARGIN instead of
- // NS_STYLE_IMAGELAYER_ORIGIN_BORDER.
- if (aLayer.mOrigin != NS_STYLE_IMAGELAYER_ORIGIN_BORDER && geometryFrame) {
+ // See the comment of StyleGeometryBox::Margin.
+ // Hitting this assertion means we decide to turn on margin-box support for
+ // positioned mask from CSS parser and style system. In this case, you
+ // should *inflate* positionArea by the margin returning from
+ // geometryFrame->GetUsedMargin() in the code chunk bellow.
+ MOZ_ASSERT(aLayer.mOrigin != StyleGeometryBox::Margin,
+ "StyleGeometryBox::Margin rendering is not supported yet.\n");
+
+ // {background|mask} images are tiled over the '{background|mask}-clip' area
+ // but the origin of the tiling is based on the '{background|mask}-origin'
+ // area.
+ if (layerOrigin != StyleGeometryBox::Border && geometryFrame) {
nsMargin border = geometryFrame->GetUsedBorder();
- if (aLayer.mOrigin != NS_STYLE_IMAGELAYER_ORIGIN_PADDING) {
+ if (layerOrigin != StyleGeometryBox::Padding) {
border += geometryFrame->GetUsedPadding();
- NS_ASSERTION(aLayer.mOrigin == NS_STYLE_IMAGELAYER_ORIGIN_CONTENT,
+ NS_ASSERTION(layerOrigin == StyleGeometryBox::Content,
"unknown background-origin value");
}
- bgPositioningArea.Deflate(border);
+ positionArea.Deflate(border);
}
nsIFrame* attachedToFrame = aForFrame;
@@ -3325,7 +3452,7 @@ nsCSSRendering::ComputeImageLayerPositioningArea(nsPresContext* aPresContext,
} else {
// Set the background positioning area to the viewport's area
// (relative to aForFrame)
- bgPositioningArea =
+ positionArea =
nsRect(-aForFrame->GetOffsetTo(attachedToFrame), attachedToFrame->GetSize());
if (!pageContentFrame) {
@@ -3334,14 +3461,14 @@ nsCSSRendering::ComputeImageLayerPositioningArea(nsPresContext* aPresContext,
aPresContext->PresShell()->GetRootScrollFrameAsScrollable();
if (scrollableFrame) {
nsMargin scrollbars = scrollableFrame->GetActualScrollbarSizes();
- bgPositioningArea.Deflate(scrollbars);
+ positionArea.Deflate(scrollbars);
}
}
}
}
*aAttachedToFrame = attachedToFrame;
- return bgPositioningArea;
+ return positionArea;
}
// Implementation of the formula for computation of background-repeat round
@@ -3569,7 +3696,7 @@ nsCSSRendering::PrepareImageLayer(nsPresContext* aPresContext,
bool transformedFixed = false;
// Compute background origin area relative to aBorderArea now as we may need
// it to compute the effective image size for a CSS gradient.
- nsRect bgPositioningArea =
+ nsRect positionArea =
ComputeImageLayerPositioningArea(aPresContext, aForFrame, aBorderArea,
aLayer, &attachedToFrame, &transformedFixed);
if (aOutIsTransformedFixed) {
@@ -3594,7 +3721,7 @@ nsCSSRendering::PrepareImageLayer(nsPresContext* aPresContext,
// not a pure optimization since it can affect the values of pixels at the
// edge of the viewport --- whether they're sampled from a putative "next
// tile" or not.)
- bgClipRect.IntersectRect(bgClipRect, bgPositioningArea + aBorderArea.TopLeft());
+ bgClipRect.IntersectRect(bgClipRect, positionArea + aBorderArea.TopLeft());
}
}
@@ -3605,7 +3732,7 @@ nsCSSRendering::PrepareImageLayer(nsPresContext* aPresContext,
// Also as required for proper background positioning when background-position
// is defined with percentages.
CSSSizeOrRatio intrinsicSize = state.mImageRenderer.ComputeIntrinsicSize();
- nsSize bgPositionSize = bgPositioningArea.Size();
+ nsSize bgPositionSize = positionArea.Size();
nsSize imageSize = ComputeDrawnSizeForBackground(intrinsicSize,
bgPositionSize,
aLayer.mSize,
@@ -3650,8 +3777,8 @@ nsCSSRendering::PrepareImageLayer(nsPresContext* aPresContext,
}
}
- imageTopLeft += bgPositioningArea.TopLeft();
- state.mAnchor += bgPositioningArea.TopLeft();
+ imageTopLeft += positionArea.TopLeft();
+ state.mAnchor += positionArea.TopLeft();
state.mDestArea = nsRect(imageTopLeft + aBorderArea.TopLeft(), imageSize);
state.mFillArea = state.mDestArea;
diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp
index 2bf20144a..d619576ba 100644
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -61,7 +61,6 @@
#include "mozilla/OperatorNewExtensions.h"
#include "mozilla/PendingAnimationTracker.h"
#include "mozilla/Preferences.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/Unused.h"
#include "mozilla/gfx/gfxVars.h"
@@ -1857,7 +1856,6 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(nsDisplayListBuilder* aB
RefPtr<ContainerLayer> root;
{
- PaintTelemetry::AutoRecord record(PaintTelemetry::Metric::Layerization);
root = layerBuilder->
BuildContainerLayerFor(aBuilder, layerManager, frame, nullptr, this,
containerParameters, nullptr);
@@ -3016,7 +3014,7 @@ nsDisplayBackgroundImage::ComputeVisibility(nsDisplayListBuilder* aBuilder,
/* static */ nsRegion
nsDisplayBackgroundImage::GetInsideClipRegion(nsDisplayItem* aItem,
- uint8_t aClip,
+ StyleGeometryBox aClip,
const nsRect& aRect,
const nsRect& aBackgroundRect)
{
@@ -3030,10 +3028,10 @@ nsDisplayBackgroundImage::GetInsideClipRegion(nsDisplayItem* aItem,
if (frame->GetType() == nsGkAtoms::canvasFrame) {
nsCanvasFrame* canvasFrame = static_cast<nsCanvasFrame*>(frame);
clipRect = canvasFrame->CanvasArea() + aItem->ToReferenceFrame();
- } else if (aClip == NS_STYLE_IMAGELAYER_CLIP_PADDING ||
- aClip == NS_STYLE_IMAGELAYER_CLIP_CONTENT) {
+ } else if (aClip == StyleGeometryBox::Padding ||
+ aClip == StyleGeometryBox::Content) {
nsMargin border = frame->GetUsedBorder();
- if (aClip == NS_STYLE_IMAGELAYER_CLIP_CONTENT) {
+ if (aClip == StyleGeometryBox::Content) {
border += frame->GetUsedPadding();
}
border.ApplySkipSides(frame->GetSkipSides());
@@ -3066,7 +3064,7 @@ nsDisplayBackgroundImage::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
if (layer.mImage.IsOpaque() && layer.mBlendMode == NS_STYLE_BLEND_NORMAL &&
layer.mRepeat.mXRepeat != NS_STYLE_IMAGELAYER_REPEAT_SPACE &&
layer.mRepeat.mYRepeat != NS_STYLE_IMAGELAYER_REPEAT_SPACE &&
- layer.mClip != NS_STYLE_IMAGELAYER_CLIP_TEXT) {
+ layer.mClip != StyleGeometryBox::Text) {
result = GetInsideClipRegion(this, layer.mClip, mBounds, mBackgroundRect);
}
}
@@ -3145,9 +3143,9 @@ nsDisplayBackgroundImage::PaintInternal(nsDisplayListBuilder* aBuilder,
CheckForBorderItem(this, flags);
gfxContext* ctx = aCtx->ThebesContext();
- uint8_t clip = mBackgroundStyle->mImage.mLayers[mLayer].mClip;
+ StyleGeometryBox clip = mBackgroundStyle->mImage.mLayers[mLayer].mClip;
- if (clip == NS_STYLE_IMAGELAYER_CLIP_TEXT) {
+ if (clip == StyleGeometryBox::Text) {
if (!GenerateAndPushTextMask(mFrame, aCtx, mBackgroundRect, aBuilder)) {
return;
}
@@ -3163,7 +3161,7 @@ nsDisplayBackgroundImage::PaintInternal(nsDisplayListBuilder* aBuilder,
image::DrawResult result =
nsCSSRendering::PaintBackground(params);
- if (clip == NS_STYLE_IMAGELAYER_CLIP_TEXT) {
+ if (clip == StyleGeometryBox::Text) {
ctx->PopGroupAndBlend();
}
@@ -3585,8 +3583,8 @@ nsDisplayBackgroundColor::Paint(nsDisplayListBuilder* aBuilder,
nsLayoutUtils::RectToGfxRect(mBackgroundRect,
mFrame->PresContext()->AppUnitsPerDevPixel());
- uint8_t clip = mBackgroundStyle->mImage.mLayers[0].mClip;
- if (clip == NS_STYLE_IMAGELAYER_CLIP_TEXT) {
+ StyleGeometryBox clip = mBackgroundStyle->mImage.mLayers[0].mClip;
+ if (clip == StyleGeometryBox::Text) {
if (!GenerateAndPushTextMask(mFrame, aCtx, mBackgroundRect, aBuilder)) {
return;
}
@@ -3620,7 +3618,7 @@ nsDisplayBackgroundColor::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
const nsStyleImageLayers::Layer& bottomLayer = mBackgroundStyle->BottomLayer();
- if (bottomLayer.mClip == NS_STYLE_IMAGELAYER_CLIP_TEXT) {
+ if (bottomLayer.mClip == StyleGeometryBox::Text) {
return nsRegion();
}
@@ -7453,100 +7451,3 @@ nsDisplayFilter::PrintEffects(nsACString& aTo)
aTo += ")";
}
#endif
-
-namespace mozilla {
-
-uint32_t PaintTelemetry::sPaintLevel = 0;
-uint32_t PaintTelemetry::sMetricLevel = 0;
-EnumeratedArray<PaintTelemetry::Metric,
- PaintTelemetry::Metric::COUNT,
- double> PaintTelemetry::sMetrics;
-
-PaintTelemetry::AutoRecordPaint::AutoRecordPaint()
-{
- // Don't record nested paints.
- if (sPaintLevel++ > 0) {
- return;
- }
-
- // Reset metrics for a new paint.
- for (auto& metric : sMetrics) {
- metric = 0.0;
- }
- mStart = TimeStamp::Now();
-}
-
-PaintTelemetry::AutoRecordPaint::~AutoRecordPaint()
-{
- MOZ_ASSERT(sPaintLevel != 0);
- if (--sPaintLevel > 0) {
- return;
- }
-
- // If we're in multi-process mode, don't include paint times for the parent
- // process.
- if (gfxVars::BrowserTabsRemoteAutostart() && XRE_IsParentProcess()) {
- return;
- }
-
- double totalMs = (TimeStamp::Now() - mStart).ToMilliseconds();
-
- // If the total time was >= 16ms, then it's likely we missed a frame due to
- // painting. In this case we'll gather some detailed metrics below.
- if (totalMs <= 16.0) {
- return;
- }
-
- auto record = [=](const char* aKey, double aDurationMs) -> void {
- MOZ_ASSERT(aDurationMs <= totalMs);
-
- uint32_t amount = static_cast<int32_t>((aDurationMs / totalMs) * 100.0);
- };
-
- double dlMs = sMetrics[Metric::DisplayList];
- double flbMs = sMetrics[Metric::Layerization];
- double rMs = sMetrics[Metric::Rasterization];
-
- // Record all permutations since aggregation makes it difficult to
- // correlate. For example we can't derive "flb+r" from "dl" because we
- // don't know the total time associated with a bucket entry. So we just
- // play it safe and include everything. We can however derive "other" time
- // from the final permutation.
- record("dl", dlMs);
- record("flb", flbMs);
- record("r", rMs);
- record("dl,flb", dlMs + flbMs);
- record("dl,r", dlMs + rMs);
- record("flb,r", flbMs + rMs);
- record("dl,flb,r", dlMs + flbMs + rMs);
-}
-
-PaintTelemetry::AutoRecord::AutoRecord(Metric aMetric)
- : mMetric(aMetric)
-{
- // Don't double-record anything nested.
- if (sMetricLevel++ > 0) {
- return;
- }
-
- // Don't record inside nested paints, or outside of paints.
- if (sPaintLevel != 1) {
- return;
- }
-
- mStart = TimeStamp::Now();
-}
-
-PaintTelemetry::AutoRecord::~AutoRecord()
-{
- MOZ_ASSERT(sMetricLevel != 0);
-
- sMetricLevel--;
- if (mStart.IsNull()) {
- return;
- }
-
- sMetrics[mMetric] += (TimeStamp::Now() - mStart).ToMilliseconds();
-}
-
-} // namespace mozilla
diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h
index df584b489..c9f773f5b 100644
--- a/layout/base/nsDisplayList.h
+++ b/layout/base/nsDisplayList.h
@@ -2713,6 +2713,8 @@ private:
*/
class nsDisplayBackgroundImage : public nsDisplayImageContainer {
public:
+ typedef mozilla::StyleGeometryBox StyleGeometryBox;
+
/**
* aLayer signifies which background layer this item represents.
* aIsThemed should be the value of aFrame->IsThemed.
@@ -2790,8 +2792,10 @@ public:
virtual already_AddRefed<imgIContainer> GetImage() override;
virtual nsRect GetDestRect() override;
- static nsRegion GetInsideClipRegion(nsDisplayItem* aItem, uint8_t aClip,
- const nsRect& aRect, const nsRect& aBackgroundRect);
+ static nsRegion GetInsideClipRegion(nsDisplayItem* aItem,
+ StyleGeometryBox aClip,
+ const nsRect& aRect,
+ const nsRect& aBackgroundRect);
virtual bool ShouldFixToViewport(nsDisplayListBuilder* aBuilder) override;
@@ -4508,43 +4512,4 @@ public:
mutable mozilla::Maybe<bool> mIsFrameSelected;
};
-namespace mozilla {
-
-class PaintTelemetry
-{
- public:
- enum class Metric {
- DisplayList,
- Layerization,
- Rasterization,
- COUNT,
- };
-
- class AutoRecord
- {
- public:
- explicit AutoRecord(Metric aMetric);
- ~AutoRecord();
- private:
- Metric mMetric;
- mozilla::TimeStamp mStart;
- };
-
- class AutoRecordPaint
- {
- public:
- AutoRecordPaint();
- ~AutoRecordPaint();
- private:
- mozilla::TimeStamp mStart;
- };
-
- private:
- static uint32_t sPaintLevel;
- static uint32_t sMetricLevel;
- static mozilla::EnumeratedArray<Metric, Metric::COUNT, double> sMetrics;
-};
-
-} // namespace mozilla
-
#endif /*NSDISPLAYLIST_H_*/
diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp
index c1f4ad372..f0341f9ef 100644
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -111,13 +111,13 @@
#include "FrameLayerBuilder.h"
#include "mozilla/layers/APZCTreeManager.h"
#include "mozilla/layers/CompositorBridgeChild.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/EventDispatcher.h"
#include "mozilla/EventStateManager.h"
#include "mozilla/RuleNodeCacheConditions.h"
#include "mozilla/StyleSetHandle.h"
#include "mozilla/StyleSetHandleInlines.h"
#include "RegionBuilder.h"
+#include "SVGSVGElement.h"
#ifdef MOZ_XUL
#include "nsXULPopupManager.h"
@@ -3534,8 +3534,6 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram
PROFILER_LABEL("nsLayoutUtils", "PaintFrame::BuildDisplayList",
js::ProfileEntry::Category::GRAPHICS);
-
- PaintTelemetry::AutoRecord record(PaintTelemetry::Metric::DisplayList);
aFrame->BuildDisplayListForStackingContext(&builder, dirtyRect, &list);
}
@@ -6938,7 +6936,7 @@ nsLayoutUtils::GetFrameTransparency(nsIFrame* aBackgroundFrame,
const nsStyleBackground* bg = bgSC->StyleBackground();
if (NS_GET_A(bg->mBackgroundColor) < 255 ||
// bottom layer's clip is used for the color
- bg->BottomLayer().mClip != NS_STYLE_IMAGELAYER_CLIP_BORDER)
+ bg->BottomLayer().mClip != StyleGeometryBox::Border)
return eTransparencyTransparent;
return eTransparencyOpaque;
}
@@ -9296,3 +9294,127 @@ nsLayoutUtils::IsInvisibleBreak(nsINode* aNode, nsIFrame** aNextLineFrame)
return lineNonEmpty;
}
+
+static nsRect
+ComputeSVGReferenceRect(nsIFrame* aFrame,
+ StyleGeometryBox aGeometryBox)
+{
+ MOZ_ASSERT(aFrame->GetContent()->IsSVGElement());
+ nsRect r;
+
+ // For SVG elements without associated CSS layout box, the used value for
+ // content-box, padding-box, border-box and margin-box is fill-box.
+ switch (aGeometryBox) {
+ case StyleGeometryBox::Stroke: {
+ // XXX Bug 1299876
+ // The size of srtoke-box is not correct if this graphic element has
+ // specific stroke-linejoin or stroke-linecap.
+ gfxRect bbox = nsSVGUtils::GetBBox(aFrame,
+ nsSVGUtils::eBBoxIncludeFill | nsSVGUtils::eBBoxIncludeStroke);
+ r = nsLayoutUtils::RoundGfxRectToAppRect(bbox,
+ nsPresContext::AppUnitsPerCSSPixel());
+ break;
+ }
+ case StyleGeometryBox::View: {
+ nsIContent* content = aFrame->GetContent();
+ nsSVGElement* element = static_cast<nsSVGElement*>(content);
+ SVGSVGElement* svgElement = element->GetCtx();
+ MOZ_ASSERT(svgElement);
+
+ if (svgElement && svgElement->HasViewBoxRect()) {
+ // If a ‘viewBox‘ attribute is specified for the SVG viewport creating
+ // element:
+ // 1. The reference box is positioned at the origin of the coordinate
+ // system established by the ‘viewBox‘ attribute.
+ // 2. The dimension of the reference box is set to the width and height
+ // values of the ‘viewBox‘ attribute.
+ nsSVGViewBox* viewBox = svgElement->GetViewBox();
+ const nsSVGViewBoxRect& value = viewBox->GetAnimValue();
+ r = nsRect(nsPresContext::CSSPixelsToAppUnits(value.x),
+ nsPresContext::CSSPixelsToAppUnits(value.y),
+ nsPresContext::CSSPixelsToAppUnits(value.width),
+ nsPresContext::CSSPixelsToAppUnits(value.height));
+ } else {
+ // No viewBox is specified, uses the nearest SVG viewport as reference
+ // box.
+ svgFloatSize viewportSize = svgElement->GetViewportSize();
+ r = nsRect(0, 0,
+ nsPresContext::CSSPixelsToAppUnits(viewportSize.width),
+ nsPresContext::CSSPixelsToAppUnits(viewportSize.height));
+ }
+
+ break;
+ }
+ case StyleGeometryBox::NoBox:
+ case StyleGeometryBox::Border:
+ case StyleGeometryBox::Content:
+ case StyleGeometryBox::Padding:
+ case StyleGeometryBox::Margin:
+ case StyleGeometryBox::Fill: {
+ gfxRect bbox = nsSVGUtils::GetBBox(aFrame,
+ nsSVGUtils::eBBoxIncludeFill);
+ r = nsLayoutUtils::RoundGfxRectToAppRect(bbox,
+ nsPresContext::AppUnitsPerCSSPixel());
+ break;
+ }
+ default:{
+ MOZ_ASSERT_UNREACHABLE("unknown StyleGeometryBox type");
+ gfxRect bbox = nsSVGUtils::GetBBox(aFrame,
+ nsSVGUtils::eBBoxIncludeFill);
+ r = nsLayoutUtils::RoundGfxRectToAppRect(bbox,
+ nsPresContext::AppUnitsPerCSSPixel());
+ break;
+ }
+ }
+
+ return r;
+}
+
+static nsRect
+ComputeHTMLReferenceRect(nsIFrame* aFrame,
+ StyleGeometryBox aGeometryBox)
+{
+ nsRect r;
+
+ // For elements with associated CSS layout box, the used value for fill-box,
+ // stroke-box and view-box is border-box.
+ switch (aGeometryBox) {
+ case StyleGeometryBox::Content:
+ r = aFrame->GetContentRectRelativeToSelf();
+ break;
+ case StyleGeometryBox::Padding:
+ r = aFrame->GetPaddingRectRelativeToSelf();
+ break;
+ case StyleGeometryBox::Margin:
+ r = aFrame->GetMarginRectRelativeToSelf();
+ break;
+ case StyleGeometryBox::NoBox:
+ case StyleGeometryBox::Border:
+ case StyleGeometryBox::Fill:
+ case StyleGeometryBox::Stroke:
+ case StyleGeometryBox::View:
+ r = aFrame->GetRectRelativeToSelf();
+ break;
+ default:
+ MOZ_ASSERT_UNREACHABLE("unknown StyleGeometryBox type");
+ r = aFrame->GetRectRelativeToSelf();
+ break;
+ }
+
+ return r;
+}
+
+/* static */ nsRect
+nsLayoutUtils::ComputeGeometryBox(nsIFrame* aFrame,
+ StyleGeometryBox aGeometryBox)
+{
+ // We use ComputeSVGReferenceRect for all SVG elements, except <svg>
+ // element, which does have an associated CSS layout box. In this case we
+ // should still use ComputeHTMLReferenceRect for region computing.
+ nsRect r = aFrame->IsFrameOfType(nsIFrame::eSVG) &&
+ (aFrame->GetType() != nsGkAtoms::svgOuterSVGFrame)
+ ? ComputeSVGReferenceRect(aFrame, aGeometryBox)
+ : ComputeHTMLReferenceRect(aFrame, aGeometryBox);
+
+ return r;
+}
diff --git a/layout/base/nsLayoutUtils.h b/layout/base/nsLayoutUtils.h
index 97fc410b0..63253fd10 100644
--- a/layout/base/nsLayoutUtils.h
+++ b/layout/base/nsLayoutUtils.h
@@ -30,6 +30,7 @@
#include "mozilla/ReflowOutput.h"
#include "ImageContainer.h"
#include "gfx2DGlue.h"
+#include "nsStyleConsts.h"
#include <limits>
#include <algorithm>
@@ -152,6 +153,7 @@ public:
typedef mozilla::CSSRect CSSRect;
typedef mozilla::ScreenMargin ScreenMargin;
typedef mozilla::LayoutDeviceIntSize LayoutDeviceIntSize;
+ typedef mozilla::StyleGeometryBox StyleGeometryBox;
/**
* Finds previously assigned ViewID for the given content element, if any.
@@ -2870,6 +2872,9 @@ public:
*/
static bool IsInvisibleBreak(nsINode* aNode, nsIFrame** aNextLineFrame = nullptr);
+ static nsRect ComputeGeometryBox(nsIFrame* aFrame,
+ StyleGeometryBox aGeometryBox);
+
private:
static uint32_t sFontSizeInflationEmPerLine;
static uint32_t sFontSizeInflationMinTwips;
diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp
index 340042b46..969ebc962 100644
--- a/layout/base/nsPresShell.cpp
+++ b/layout/base/nsPresShell.cpp
@@ -170,7 +170,6 @@
#include "mozilla/css/ImageLoader.h"
#include "mozilla/dom/DocumentTimeline.h"
#include "mozilla/Preferences.h"
-#include "mozilla/Telemetry.h"
#include "nsCanvasFrame.h"
#include "nsIImageLoadingContent.h"
#include "nsImageFrame.h"
@@ -9394,9 +9393,6 @@ PresShell::DoVerifyReflow()
}
#endif
-// used with Telemetry metrics
-#define NS_LONG_REFLOW_TIME_MS 5000
-
bool
PresShell::ProcessReflowCommands(bool aInterruptible)
{
diff --git a/layout/base/nsRefreshDriver.cpp b/layout/base/nsRefreshDriver.cpp
index b975a69dd..5ea7a0188 100644
--- a/layout/base/nsRefreshDriver.cpp
+++ b/layout/base/nsRefreshDriver.cpp
@@ -55,7 +55,6 @@
#include "nsDocShell.h"
#include "nsISimpleEnumerator.h"
#include "nsJSEnvironment.h"
-#include "mozilla/Telemetry.h"
#include "gfxPrefs.h"
#include "BackgroundChild.h"
#include "mozilla/ipc/PBackgroundChild.h"
@@ -524,46 +523,10 @@ private:
private:
~RefreshDriverVsyncObserver() = default;
- void RecordTelemetryProbes(TimeStamp aVsyncTimestamp)
- {
- MOZ_ASSERT(NS_IsMainThread());
- #ifndef ANDROID /* bug 1142079 */
- if (XRE_IsParentProcess()) {
- TimeDuration vsyncLatency = TimeStamp::Now() - aVsyncTimestamp;
- uint32_t sample = (uint32_t)vsyncLatency.ToMilliseconds();
- RecordJank(sample);
- } else if (mVsyncRate != TimeDuration::Forever()) {
- TimeDuration contentDelay = (TimeStamp::Now() - mLastChildTick) - mVsyncRate;
- if (contentDelay.ToMilliseconds() < 0 ){
- // Vsyncs are noisy and some can come at a rate quicker than
- // the reported hardware rate. In those cases, consider that we have 0 delay.
- contentDelay = TimeDuration::FromMilliseconds(0);
- }
- uint32_t sample = (uint32_t)contentDelay.ToMilliseconds();
- RecordJank(sample);
- } else {
- // Request the vsync rate from the parent process. Might be a few vsyncs
- // until the parent responds.
- mVsyncRate = mVsyncRefreshDriverTimer->mVsyncChild->GetVsyncRate();
- }
- #endif
- }
-
- void RecordJank(uint32_t aJankMS)
- {
- uint32_t duration = 1 /* ms */;
- for (size_t i = 0;
- i < mozilla::ArrayLength(sJankLevels) && duration < aJankMS;
- ++i, duration *= 2) {
- sJankLevels[i]++;
- }
- }
-
void TickRefreshDriver(TimeStamp aVsyncTimestamp)
{
MOZ_ASSERT(NS_IsMainThread());
- RecordTelemetryProbes(aVsyncTimestamp);
if (XRE_IsParentProcess()) {
MonitorAutoLock lock(mRefreshTickLock);
aVsyncTimestamp = mRecentVsync;
@@ -2006,7 +1969,6 @@ nsRefreshDriver::Tick(int64_t aNowEpoch, TimeStamp aNowTime)
mViewManagerFlushIsPending = false;
RefPtr<nsViewManager> vm = mPresContext->GetPresShell()->GetViewManager();
{
- PaintTelemetry::AutoRecordPaint record;
vm->ProcessPendingUpdates();
}
diff --git a/layout/build/nsLayoutCID.h b/layout/build/nsLayoutCID.h
index 47a90d7d8..1b43c7592 100644
--- a/layout/build/nsLayoutCID.h
+++ b/layout/build/nsLayoutCID.h
@@ -82,7 +82,4 @@
#define SERVICEWORKERMANAGER_CID \
{ 0xc74bde32, 0xbcc7, 0x4840, { 0x84, 0x30, 0xc7, 0x33, 0x35, 0x1b, 0x21, 0x2a } }
-#define NOTIFICATIONTELEMETRYSERVICE_CID \
-{ 0x5995b782, 0x6a0e, 0x4066, { 0xaa, 0xc5, 0x27, 0x6f, 0x0a, 0x9a, 0xd8, 0xcf } }
-
#endif /* nsLayoutCID_h__ */
diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp
index 748bc11d8..8bb70f85c 100644
--- a/layout/build/nsLayoutModule.cpp
+++ b/layout/build/nsLayoutModule.cpp
@@ -204,7 +204,6 @@ using mozilla::dom::UDPSocketChild;
using mozilla::dom::time::TimeService;
using mozilla::net::StreamingProtocolControllerService;
using mozilla::gmp::GeckoMediaPluginService;
-using mozilla::dom::NotificationTelemetryService;
#define NS_EDITORCOMMANDTABLE_CID \
{ 0x4f5e62b8, 0xd659, 0x4156, \
@@ -292,7 +291,6 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(TextInputProcessor)
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIPresentationService,
NS_CreatePresentationService)
NS_GENERIC_FACTORY_CONSTRUCTOR(PresentationTCPSessionTransport)
-NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(NotificationTelemetryService, Init)
NS_GENERIC_FACTORY_CONSTRUCTOR(PushNotifier)
//-----------------------------------------------------------------------------
@@ -657,7 +655,6 @@ NS_DEFINE_NAMED_CID(NS_TEXTEDITOR_CID);
NS_DEFINE_NAMED_CID(DOMREQUEST_SERVICE_CID);
NS_DEFINE_NAMED_CID(QUOTAMANAGER_SERVICE_CID);
NS_DEFINE_NAMED_CID(SERVICEWORKERMANAGER_CID);
-NS_DEFINE_NAMED_CID(NOTIFICATIONTELEMETRYSERVICE_CID);
NS_DEFINE_NAMED_CID(PUSHNOTIFIER_CID);
NS_DEFINE_NAMED_CID(WORKERDEBUGGERMANAGER_CID);
@@ -925,7 +922,6 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = {
{ &kDOMREQUEST_SERVICE_CID, false, nullptr, DOMRequestServiceConstructor },
{ &kQUOTAMANAGER_SERVICE_CID, false, nullptr, QuotaManagerServiceConstructor },
{ &kSERVICEWORKERMANAGER_CID, false, nullptr, ServiceWorkerManagerConstructor },
- { &kNOTIFICATIONTELEMETRYSERVICE_CID, false, nullptr, NotificationTelemetryServiceConstructor },
{ &kPUSHNOTIFIER_CID, false, nullptr, PushNotifierConstructor },
{ &kWORKERDEBUGGERMANAGER_CID, true, nullptr, WorkerDebuggerManagerConstructor },
{ &kNS_AUDIOCHANNELAGENT_CID, true, nullptr, AudioChannelAgentConstructor },
@@ -1057,7 +1053,6 @@ static const mozilla::Module::ContractIDEntry kLayoutContracts[] = {
{ DOMREQUEST_SERVICE_CONTRACTID, &kDOMREQUEST_SERVICE_CID },
{ QUOTAMANAGER_SERVICE_CONTRACTID, &kQUOTAMANAGER_SERVICE_CID },
{ SERVICEWORKERMANAGER_CONTRACTID, &kSERVICEWORKERMANAGER_CID },
- { NOTIFICATIONTELEMETRYSERVICE_CONTRACTID, &kNOTIFICATIONTELEMETRYSERVICE_CID },
{ PUSHNOTIFIER_CONTRACTID, &kPUSHNOTIFIER_CID },
{ WORKERDEBUGGERMANAGER_CONTRACTID, &kWORKERDEBUGGERMANAGER_CID },
{ NS_AUDIOCHANNELAGENT_CONTRACTID, &kNS_AUDIOCHANNELAGENT_CID },
@@ -1132,7 +1127,6 @@ static const mozilla::Module::CategoryEntry kLayoutCategories[] = {
CONTENTDLF_CATEGORIES
{ "profile-after-change", "PresentationDeviceManager", PRESENTATION_DEVICE_MANAGER_CONTRACTID },
{ "profile-after-change", "PresentationService", PRESENTATION_SERVICE_CONTRACTID },
- { "profile-after-change", "Notification Telemetry Service", NOTIFICATIONTELEMETRYSERVICE_CONTRACTID },
{ nullptr }
};
diff --git a/layout/generic/nsSelection.cpp b/layout/generic/nsSelection.cpp
index ec0fba308..ff75ab85d 100644
--- a/layout/generic/nsSelection.cpp
+++ b/layout/generic/nsSelection.cpp
@@ -3544,7 +3544,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Selection)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAnchorFocusRange)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFrameSelection)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSelectionListeners)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(Selection)
diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp
index fa31443fd..3288d3f2e 100644
--- a/layout/generic/nsTextFrame.cpp
+++ b/layout/generic/nsTextFrame.cpp
@@ -6715,7 +6715,7 @@ ShouldDrawSelection(const nsIFrame* aFrame)
const nsStyleBackground* bg = aFrame->StyleContext()->StyleBackground();
const nsStyleImageLayers& layers = bg->mImage;
NS_FOR_VISIBLE_IMAGE_LAYERS_BACK_TO_FRONT(i, layers) {
- if (layers.mLayers[i].mClip == NS_STYLE_IMAGELAYER_CLIP_TEXT) {
+ if (layers.mLayers[i].mClip == StyleGeometryBox::Text) {
return false;
}
}
diff --git a/layout/inspector/inDOMUtils.cpp b/layout/inspector/inDOMUtils.cpp
index 9f1dcaad3..e212e20df 100644
--- a/layout/inspector/inDOMUtils.cpp
+++ b/layout/inspector/inDOMUtils.cpp
@@ -784,12 +784,10 @@ PropertySupportsVariant(nsCSSPropertyID aPropertyID, uint32_t aVariant)
case eCSSProperty_background_position_x:
case eCSSProperty_background_position_y:
case eCSSProperty_background_size:
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
case eCSSProperty_mask_position:
case eCSSProperty_mask_position_x:
case eCSSProperty_mask_position_y:
case eCSSProperty_mask_size:
-#endif
case eCSSProperty_grid_auto_columns:
case eCSSProperty_grid_auto_rows:
case eCSSProperty_grid_template_columns:
diff --git a/layout/style/Declaration.cpp b/layout/style/Declaration.cpp
index c67f6b2a2..b2de159ed 100644
--- a/layout/style/Declaration.cpp
+++ b/layout/style/Declaration.cpp
@@ -395,28 +395,25 @@ Declaration::GetImageLayerValue(
origin->mValue.GetUnit() == eCSSUnit_Enumerated,
"should not have inherit/initial within list");
- int32_t originDefaultValue =
+ StyleGeometryBox originDefaultValue =
(aTable == nsStyleImageLayers::kBackgroundLayerTable)
- ? NS_STYLE_IMAGELAYER_ORIGIN_PADDING : NS_STYLE_IMAGELAYER_ORIGIN_BORDER;
- if (clip->mValue.GetIntValue() != NS_STYLE_IMAGELAYER_CLIP_BORDER ||
- origin->mValue.GetIntValue() != originDefaultValue) {
+ ? StyleGeometryBox::Padding : StyleGeometryBox::Border;
+ if (static_cast<StyleGeometryBox>(clip->mValue.GetIntValue()) !=
+ StyleGeometryBox::Border ||
+ static_cast<StyleGeometryBox>(origin->mValue.GetIntValue()) !=
+ originDefaultValue) {
#ifdef DEBUG
- for (size_t i = 0; nsCSSProps::kImageLayerOriginKTable[i].mValue != -1; i++) {
+ const nsCSSProps::KTableEntry* originTable =
+ nsCSSProps::kKeywordTableTable[aTable[nsStyleImageLayers::origin]];
+ const nsCSSProps::KTableEntry* clipTable =
+ nsCSSProps::kKeywordTableTable[aTable[nsStyleImageLayers::clip]];
+ for (size_t i = 0; originTable[i].mValue != -1; i++) {
// For each keyword & value in kOriginKTable, ensure that
// kBackgroundKTable has a matching entry at the same position.
- MOZ_ASSERT(nsCSSProps::kImageLayerOriginKTable[i].mKeyword ==
- nsCSSProps::kBackgroundClipKTable[i].mKeyword);
- MOZ_ASSERT(nsCSSProps::kImageLayerOriginKTable[i].mValue ==
- nsCSSProps::kBackgroundClipKTable[i].mValue);
+ MOZ_ASSERT(originTable[i].mKeyword == clipTable[i].mKeyword);
+ MOZ_ASSERT(originTable[i].mValue == clipTable[i].mValue);
}
#endif
- static_assert(NS_STYLE_IMAGELAYER_CLIP_BORDER ==
- NS_STYLE_IMAGELAYER_ORIGIN_BORDER &&
- NS_STYLE_IMAGELAYER_CLIP_PADDING ==
- NS_STYLE_IMAGELAYER_ORIGIN_PADDING &&
- NS_STYLE_IMAGELAYER_CLIP_CONTENT ==
- NS_STYLE_IMAGELAYER_ORIGIN_CONTENT,
- "mask-clip and mask-origin style constants must agree");
aValue.Append(char16_t(' '));
origin->mValue.AppendToString(aTable[nsStyleImageLayers::origin], aValue,
aSerialization);
@@ -462,11 +459,7 @@ Declaration::GetImageLayerValue(
}
// This layer is an mask layer
} else {
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
MOZ_ASSERT(aTable == nsStyleImageLayers::kMaskLayerTable);
-#else
- MOZ_ASSERT_UNREACHABLE("Should never get here when mask-as-shorthand is disable");
-#endif
if (repeat || positionX || positionY || clip || origin || size ||
composite || mode) {
// Uneven length lists, so can't be serialized as shorthand.
@@ -487,11 +480,7 @@ Declaration::GetImageLayerValue(
}
// This layer is an mask layer
} else {
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
MOZ_ASSERT(aTable == nsStyleImageLayers::kMaskLayerTable);
-#else
- MOZ_ASSERT_UNREACHABLE("Should never get here when mask-as-shorthand is disable");
-#endif
if (!repeat || !positionX || !positionY || !clip || !origin || !size ||
!composite || !mode) {
// Uneven length lists, so can't be serialized as shorthand.
@@ -817,7 +806,6 @@ Declaration::GetPropertyValueInternal(
nsStyleImageLayers::kBackgroundLayerTable);
break;
}
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
case eCSSProperty_mask: {
GetImageLayerValue(data, aValue, aSerialization,
nsStyleImageLayers::kMaskLayerTable);
@@ -828,7 +816,6 @@ Declaration::GetPropertyValueInternal(
nsStyleImageLayers::kMaskLayerTable);
break;
}
-#endif
case eCSSProperty_font: {
// systemFont might not be present; other values are guaranteed to be
// available based on the shorthand check at the beginning of the
diff --git a/layout/style/FontFace.cpp b/layout/style/FontFace.cpp
index 4558ab1a2..ab6781149 100644
--- a/layout/style/FontFace.cpp
+++ b/layout/style/FontFace.cpp
@@ -75,7 +75,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(FontFace)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRule)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFontFaceSet)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOtherFontFaceSets)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(FontFace)
diff --git a/layout/style/ImageLoader.cpp b/layout/style/ImageLoader.cpp
index 0a605abc9..a26a1741a 100644
--- a/layout/style/ImageLoader.cpp
+++ b/layout/style/ImageLoader.cpp
@@ -519,9 +519,6 @@ ImageLoader::FlushUseCounters()
nsCOMPtr<imgIContainer> container;
request->GetImage(getter_AddRefs(container));
- if (container) {
- static_cast<image::Image*>(container.get())->ReportUseCounters();
- }
}
}
diff --git a/layout/style/MediaQueryList.cpp b/layout/style/MediaQueryList.cpp
index 069e049c4..db3781b76 100644
--- a/layout/style/MediaQueryList.cpp
+++ b/layout/style/MediaQueryList.cpp
@@ -39,7 +39,6 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(MediaQueryList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(MediaQueryList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCallbacks)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(MediaQueryList)
diff --git a/layout/style/StyleAnimationValue.cpp b/layout/style/StyleAnimationValue.cpp
index eb34c3d83..a0f52b4ea 100644
--- a/layout/style/StyleAnimationValue.cpp
+++ b/layout/style/StyleAnimationValue.cpp
@@ -4255,7 +4255,6 @@ StyleAnimationValue::ExtractComputedValue(nsCSSPropertyID aProperty,
}
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
case eCSSProperty_mask_position_x: {
const nsStyleImageLayers& layers =
static_cast<const nsStyleSVGReset*>(styleStruct)->mMask;
@@ -4269,21 +4268,18 @@ StyleAnimationValue::ExtractComputedValue(nsCSSPropertyID aProperty,
break;
}
-#endif
case eCSSProperty_background_size: {
const nsStyleImageLayers& layers =
static_cast<const nsStyleBackground*>(styleStruct)->mImage;
ExtractImageLayerSizePairList(layers, aComputedValue);
break;
}
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
case eCSSProperty_mask_size: {
const nsStyleImageLayers& layers =
static_cast<const nsStyleSVGReset*>(styleStruct)->mMask;
ExtractImageLayerSizePairList(layers, aComputedValue);
break;
}
-#endif
case eCSSProperty_clip_path: {
const nsStyleSVGReset* svgReset =
diff --git a/layout/style/StyleRule.cpp b/layout/style/StyleRule.cpp
index 6aade8897..598cb7c74 100644
--- a/layout/style/StyleRule.cpp
+++ b/layout/style/StyleRule.cpp
@@ -1275,10 +1275,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(DOMCSSStyleRule)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMCSSStyleRule)
- // Just NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS here: that will call
- // into our Trace hook, where we do the right thing with declarations
- // already.
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMETHODIMP
diff --git a/layout/style/nsCSSDataBlock.cpp b/layout/style/nsCSSDataBlock.cpp
index fe2dc621a..1dfdaed0e 100644
--- a/layout/style/nsCSSDataBlock.cpp
+++ b/layout/style/nsCSSDataBlock.cpp
@@ -61,7 +61,6 @@ TryToStartImageLoadOnValue(const nsCSSValue& aValue, nsIDocument* aDocument,
MOZ_ASSERT(aDocument);
if (aValue.GetUnit() == eCSSUnit_URL) {
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
// The 'mask-image' property accepts local reference URIs.
// For example,
// mask-image: url(#mask_id); // refer to a SVG mask element, whose id is
@@ -94,7 +93,6 @@ TryToStartImageLoadOnValue(const nsCSSValue& aValue, nsIDocument* aDocument,
}
}
}
-#endif
aValue.StartImageLoad(aDocument);
if (aForTokenStream && aContext) {
CSSVariableImageTable::Add(aContext, aProperty,
diff --git a/layout/style/nsCSSKeywordList.h b/layout/style/nsCSSKeywordList.h
index 94968faca..34a46ffce 100644
--- a/layout/style/nsCSSKeywordList.h
+++ b/layout/style/nsCSSKeywordList.h
@@ -405,6 +405,7 @@ CSS_KEY(n-resize, n_resize)
CSS_KEY(narrower, narrower)
CSS_KEY(ne-resize, ne_resize)
CSS_KEY(nesw-resize, nesw_resize)
+CSS_KEY(no-clip, no_clip)
CSS_KEY(no-close-quote, no_close_quote)
CSS_KEY(no-common-ligatures, no_common_ligatures)
CSS_KEY(no-contextual, no_contextual)
diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp
index 33e5fe56d..a8309314f 100644
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -1551,7 +1551,7 @@ protected:
nsCSSExpandedDataBlock mData;
// Value to make sure our resolved variable results stay within sane limits.
- const int32_t MAX_CSS_VAR_LENGTH = 10240;
+ const uint32_t MAX_CSS_VAR_LENGTH = 10240;
public:
// Used from nsCSSParser constructors and destructors
@@ -12005,7 +12005,6 @@ CSSParserImpl::ParsePropertyByFunction(nsCSSPropertyID aPropID)
return ParsePaintOrder();
case eCSSProperty_scroll_snap_type:
return ParseScrollSnapType();
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
case eCSSProperty_mask:
return ParseImageLayers(nsStyleImageLayers::kMaskLayerTable);
case eCSSProperty_mask_repeat:
@@ -12018,7 +12017,6 @@ CSSParserImpl::ParsePropertyByFunction(nsCSSPropertyID aPropID)
aPropID == eCSSProperty_mask_position_x);
case eCSSProperty_mask_size:
return ParseImageLayerSize(eCSSProperty_mask_size);
-#endif
case eCSSProperty__webkit_text_stroke:
return ParseWebkitTextStroke();
case eCSSProperty_all:
@@ -12424,7 +12422,7 @@ CSSParserImpl::ParseImageLayersItem(
aState.mImage->mValue.SetNoneValue();
aState.mAttachment->mValue.SetIntValue(NS_STYLE_IMAGELAYER_ATTACHMENT_SCROLL,
eCSSUnit_Enumerated);
- aState.mClip->mValue.SetIntValue(NS_STYLE_IMAGELAYER_CLIP_BORDER,
+ aState.mClip->mValue.SetIntValue(StyleGeometryBox::Border,
eCSSUnit_Enumerated);
aState.mRepeat->mXValue.SetIntValue(NS_STYLE_IMAGELAYER_REPEAT_REPEAT,
@@ -12437,10 +12435,10 @@ CSSParserImpl::ParseImageLayersItem(
aState.mPositionY->mValue.SetArrayValue(positionYArr, eCSSUnit_Array);
if (eCSSProperty_mask == aTable[nsStyleImageLayers::shorthand]) {
- aState.mOrigin->mValue.SetIntValue(NS_STYLE_IMAGELAYER_ORIGIN_BORDER,
+ aState.mOrigin->mValue.SetIntValue(StyleGeometryBox::Border,
eCSSUnit_Enumerated);
} else {
- aState.mOrigin->mValue.SetIntValue(NS_STYLE_IMAGELAYER_ORIGIN_PADDING,
+ aState.mOrigin->mValue.SetIntValue(StyleGeometryBox::Padding,
eCSSUnit_Enumerated);
}
positionXArr->Item(1).SetPercentValue(0.0f);
@@ -12462,6 +12460,8 @@ CSSParserImpl::ParseImageLayersItem(
haveMode = false,
haveSomething = false;
+ const KTableEntry* originTable =
+ nsCSSProps::kKeywordTableTable[aTable[nsStyleImageLayers::origin]];
while (GetToken(true)) {
nsCSSTokenType tt = mToken.mType;
UngetToken(); // ...but we'll still cheat and use mToken
@@ -12531,8 +12531,7 @@ CSSParserImpl::ParseImageLayersItem(
aState.mSize->mXValue = scratch.mXValue;
aState.mSize->mYValue = scratch.mYValue;
}
- } else if (nsCSSProps::FindKeyword(keyword,
- nsCSSProps::kImageLayerOriginKTable, dummy)) {
+ } else if (nsCSSProps::FindKeyword(keyword, originTable, dummy)) {
if (haveOrigin)
return false;
haveOrigin = true;
@@ -12547,23 +12546,15 @@ CSSParserImpl::ParseImageLayersItem(
// immediately following the first one (for background-origin).
#ifdef DEBUG
- for (size_t i = 0; nsCSSProps::kImageLayerOriginKTable[i].mValue != -1; i++) {
+ const KTableEntry* clipTable =
+ nsCSSProps::kKeywordTableTable[aTable[nsStyleImageLayers::clip]];
+ for (size_t i = 0; originTable[i].mValue != -1; i++) {
// For each keyword & value in kOriginKTable, ensure that
// kBackgroundKTable has a matching entry at the same position.
- MOZ_ASSERT(nsCSSProps::kImageLayerOriginKTable[i].mKeyword ==
- nsCSSProps::kBackgroundClipKTable[i].mKeyword);
- MOZ_ASSERT(nsCSSProps::kImageLayerOriginKTable[i].mValue ==
- nsCSSProps::kBackgroundClipKTable[i].mValue);
+ MOZ_ASSERT(originTable[i].mKeyword == clipTable[i].mKeyword);
+ MOZ_ASSERT(originTable[i].mValue == clipTable[i].mValue);
}
#endif
- static_assert(NS_STYLE_IMAGELAYER_CLIP_BORDER ==
- NS_STYLE_IMAGELAYER_ORIGIN_BORDER &&
- NS_STYLE_IMAGELAYER_CLIP_PADDING ==
- NS_STYLE_IMAGELAYER_ORIGIN_PADDING &&
- NS_STYLE_IMAGELAYER_CLIP_CONTENT ==
- NS_STYLE_IMAGELAYER_ORIGIN_CONTENT,
- "bg-clip and bg-origin style constants must agree");
-
CSSParseResult result =
ParseSingleValueProperty(aState.mClip->mValue,
aTable[nsStyleImageLayers::clip]);
diff --git a/layout/style/nsCSSPropAliasList.h b/layout/style/nsCSSPropAliasList.h
index 2699549ff..f7938af9e 100644
--- a/layout/style/nsCSSPropAliasList.h
+++ b/layout/style/nsCSSPropAliasList.h
@@ -453,7 +453,6 @@ CSS_PROP_ALIAS(-webkit-user-select,
WebkitUserSelect,
WEBKIT_PREFIX_PREF)
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
CSS_PROP_ALIAS(-webkit-mask,
mask,
WebkitMask,
@@ -494,5 +493,4 @@ CSS_PROP_ALIAS(-webkit-mask-size,
mask_size,
WebkitMaskSize,
WEBKIT_PREFIX_PREF)
-#endif
#undef WEBKIT_PREFIX_PREF
diff --git a/layout/style/nsCSSPropList.h b/layout/style/nsCSSPropList.h
index b04921dcb..2049f70e8 100644
--- a/layout/style/nsCSSPropList.h
+++ b/layout/style/nsCSSPropList.h
@@ -564,7 +564,7 @@ CSS_PROP_BACKGROUND(
CSS_PROPERTY_VALUE_LIST_USES_COMMAS,
"",
VARIANT_KEYWORD, // used by list parsing
- kImageLayerOriginKTable,
+ kBackgroundOriginKTable,
CSS_PROP_NO_OFFSET,
eStyleAnimType_Discrete)
CSS_PROP_SHORTHAND(
@@ -2645,19 +2645,6 @@ CSS_PROP_SVG(
nullptr,
CSS_PROP_NO_OFFSET,
eStyleAnimType_Discrete)
-#ifndef MOZ_ENABLE_MASK_AS_SHORTHAND
-CSS_PROP_SVGRESET(
- mask,
- mask,
- Mask,
- CSS_PROPERTY_PARSE_VALUE |
- CSS_PROPERTY_CREATES_STACKING_CONTEXT,
- "",
- VARIANT_HUO,
- nullptr,
- CSS_PROP_NO_OFFSET,
- eStyleAnimType_Discrete)
-#else
CSS_PROP_SHORTHAND(
mask,
mask,
@@ -2672,7 +2659,7 @@ CSS_PROP_SVGRESET(
CSS_PROPERTY_VALUE_LIST_USES_COMMAS,
"",
VARIANT_KEYWORD, // used by list parsing
- kImageLayerOriginKTable,
+ kMaskClipKTable,
CSS_PROP_NO_OFFSET,
eStyleAnimType_Discrete)
CSS_PROP_SVGRESET(
@@ -2718,7 +2705,7 @@ CSS_PROP_SVGRESET(
CSS_PROPERTY_VALUE_LIST_USES_COMMAS,
"",
VARIANT_KEYWORD, // used by list parsing
- kImageLayerOriginKTable,
+ kMaskOriginKTable,
CSS_PROP_NO_OFFSET,
eStyleAnimType_Discrete)
CSS_PROP_SHORTHAND(
@@ -2776,7 +2763,6 @@ CSS_PROP_SVGRESET(
kImageLayerSizeKTable,
CSS_PROP_NO_OFFSET,
eStyleAnimType_Custom)
-#endif // MOZ_ENABLE_MASK_AS_SHORTHAND
CSS_PROP_SVGRESET(
mask-type,
mask_type,
diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp
index 9805eae14..ac2978c27 100644
--- a/layout/style/nsCSSProps.cpp
+++ b/layout/style/nsCSSProps.cpp
@@ -932,33 +932,43 @@ const KTableEntry nsCSSProps::kImageLayerAttachmentKTable[] = {
{ eCSSKeyword_UNKNOWN, -1 }
};
-static_assert(NS_STYLE_IMAGELAYER_CLIP_BORDER == NS_STYLE_IMAGELAYER_ORIGIN_BORDER &&
- NS_STYLE_IMAGELAYER_CLIP_PADDING == NS_STYLE_IMAGELAYER_ORIGIN_PADDING &&
- NS_STYLE_IMAGELAYER_CLIP_CONTENT == NS_STYLE_IMAGELAYER_ORIGIN_CONTENT,
- "Except background-clip:text, all {background,mask}-clip and "
- "{background,mask}-origin style constants must agree");
-
-const KTableEntry nsCSSProps::kImageLayerOriginKTable[] = {
- { eCSSKeyword_border_box, NS_STYLE_IMAGELAYER_ORIGIN_BORDER },
- { eCSSKeyword_padding_box, NS_STYLE_IMAGELAYER_ORIGIN_PADDING },
- { eCSSKeyword_content_box, NS_STYLE_IMAGELAYER_ORIGIN_CONTENT },
+const KTableEntry nsCSSProps::kBackgroundOriginKTable[] = {
+ { eCSSKeyword_border_box, StyleGeometryBox::Border },
+ { eCSSKeyword_padding_box, StyleGeometryBox::Padding },
+ { eCSSKeyword_content_box, StyleGeometryBox::Content },
{ eCSSKeyword_UNKNOWN, -1 }
};
KTableEntry nsCSSProps::kBackgroundClipKTable[] = {
- { eCSSKeyword_border_box, NS_STYLE_IMAGELAYER_CLIP_BORDER },
- { eCSSKeyword_padding_box, NS_STYLE_IMAGELAYER_CLIP_PADDING },
- { eCSSKeyword_content_box, NS_STYLE_IMAGELAYER_CLIP_CONTENT },
+ { eCSSKeyword_border_box, StyleGeometryBox::Border },
+ { eCSSKeyword_padding_box, StyleGeometryBox::Padding },
+ { eCSSKeyword_content_box, StyleGeometryBox::Content },
// The next entry is controlled by the layout.css.background-clip-text.enabled
// pref.
- { eCSSKeyword_text, NS_STYLE_IMAGELAYER_CLIP_TEXT },
+ { eCSSKeyword_text, StyleGeometryBox::Text },
{ eCSSKeyword_UNKNOWN, -1 }
};
-static_assert(MOZ_ARRAY_LENGTH(nsCSSProps::kImageLayerOriginKTable) ==
- MOZ_ARRAY_LENGTH(nsCSSProps::kBackgroundClipKTable) - 1,
- "background-clip has one extra value, which is text, compared"
- "to {background,mask}-origin");
+const KTableEntry nsCSSProps::kMaskOriginKTable[] = {
+ { eCSSKeyword_border_box, StyleGeometryBox::Border },
+ { eCSSKeyword_padding_box, StyleGeometryBox::Padding },
+ { eCSSKeyword_content_box, StyleGeometryBox::Content },
+ { eCSSKeyword_fill_box, StyleGeometryBox::Fill },
+ { eCSSKeyword_stroke_box, StyleGeometryBox::Stroke },
+ { eCSSKeyword_view_box, StyleGeometryBox::View },
+ { eCSSKeyword_UNKNOWN, -1 }
+};
+
+const KTableEntry nsCSSProps::kMaskClipKTable[] = {
+ { eCSSKeyword_border_box, StyleGeometryBox::Border },
+ { eCSSKeyword_padding_box, StyleGeometryBox::Padding },
+ { eCSSKeyword_content_box, StyleGeometryBox::Content },
+ { eCSSKeyword_fill_box, StyleGeometryBox::Fill },
+ { eCSSKeyword_stroke_box, StyleGeometryBox::Stroke },
+ { eCSSKeyword_view_box, StyleGeometryBox::View },
+ { eCSSKeyword_no_clip, StyleGeometryBox::NoClip },
+ { eCSSKeyword_UNKNOWN, -1 }
+};
// Note: Don't change this table unless you update
// ParseImageLayerPosition!
@@ -2346,13 +2356,13 @@ const KTableEntry nsCSSProps::kFillRuleKTable[] = {
};
const KTableEntry nsCSSProps::kClipPathGeometryBoxKTable[] = {
- { eCSSKeyword_content_box, StyleClipPathGeometryBox::Content },
- { eCSSKeyword_padding_box, StyleClipPathGeometryBox::Padding },
- { eCSSKeyword_border_box, StyleClipPathGeometryBox::Border },
- { eCSSKeyword_margin_box, StyleClipPathGeometryBox::Margin },
- { eCSSKeyword_fill_box, StyleClipPathGeometryBox::Fill },
- { eCSSKeyword_stroke_box, StyleClipPathGeometryBox::Stroke },
- { eCSSKeyword_view_box, StyleClipPathGeometryBox::View },
+ { eCSSKeyword_content_box, StyleGeometryBox::Content },
+ { eCSSKeyword_padding_box, StyleGeometryBox::Padding },
+ { eCSSKeyword_border_box, StyleGeometryBox::Border },
+ { eCSSKeyword_margin_box, StyleGeometryBox::Margin },
+ { eCSSKeyword_fill_box, StyleGeometryBox::Fill },
+ { eCSSKeyword_stroke_box, StyleGeometryBox::Stroke },
+ { eCSSKeyword_view_box, StyleGeometryBox::View },
{ eCSSKeyword_UNKNOWN, -1 }
};
@@ -3051,7 +3061,6 @@ static const nsCSSPropertyID gScrollSnapTypeSubpropTable[] = {
eCSSProperty_scroll_snap_type_y,
eCSSProperty_UNKNOWN
};
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
static const nsCSSPropertyID gMaskSubpropTable[] = {
eCSSProperty_mask_image,
eCSSProperty_mask_repeat,
@@ -3069,7 +3078,6 @@ static const nsCSSPropertyID gMaskPositionSubpropTable[] = {
eCSSProperty_mask_position_y,
eCSSProperty_UNKNOWN
};
-#endif
// FIXME: mask-border tables should be added when we implement
// mask-border properties.
diff --git a/layout/style/nsCSSProps.h b/layout/style/nsCSSProps.h
index dfe35afd8..e67e1d41d 100644
--- a/layout/style/nsCSSProps.h
+++ b/layout/style/nsCSSProps.h
@@ -717,6 +717,8 @@ public:
static const KTableEntry kTransformStyleKTable[];
static const KTableEntry kImageLayerAttachmentKTable[];
static const KTableEntry kImageLayerOriginKTable[];
+ static const KTableEntry kBackgroundOriginKTable[];
+ static const KTableEntry kMaskOriginKTable[];
static const KTableEntry kImageLayerPositionKTable[];
static const KTableEntry kImageLayerRepeatKTable[];
static const KTableEntry kImageLayerRepeatPartKTable[];
@@ -726,6 +728,7 @@ public:
// Not const because we modify its entries when the pref
// "layout.css.background-clip.text" changes:
static KTableEntry kBackgroundClipKTable[];
+ static const KTableEntry kMaskClipKTable[];
static const KTableEntry kBlendModeKTable[];
static const KTableEntry kBorderCollapseKTable[];
static const KTableEntry kBorderImageRepeatKTable[];
diff --git a/layout/style/nsCSSRules.cpp b/layout/style/nsCSSRules.cpp
index a08d8af34..4b90b6f0c 100644
--- a/layout/style/nsCSSRules.cpp
+++ b/layout/style/nsCSSRules.cpp
@@ -1552,9 +1552,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsCSSFontFaceRule)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsCSSFontFaceRule)
- // NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS will call into our
- // Trace hook, where we do the right thing with declarations already.
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
// QueryInterface implementation for nsCSSFontFaceRule
diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp
index 4f8d3edf6..65c1d698c 100644
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -74,6 +74,30 @@ NS_NewComputedDOMStyle(dom::Element* aElement, const nsAString& aPseudoElt,
return computedStyle.forget();
}
+static nsDOMCSSValueList*
+GetROCSSValueList(bool aCommaDelimited)
+{
+ return new nsDOMCSSValueList(aCommaDelimited, true);
+}
+
+template<typename T>
+already_AddRefed<CSSValue>
+GetBackgroundList(T nsStyleImageLayers::Layer::* aMember,
+ uint32_t nsStyleImageLayers::* aCount,
+ const nsStyleImageLayers& aLayers,
+ const KTableEntry aTable[])
+{
+ RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(true);
+
+ for (uint32_t i = 0, i_end = aLayers.*aCount; i < i_end; ++i) {
+ RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
+ val->SetIdent(nsCSSProps::ValueToKeywordEnum(aLayers.mLayers[i].*aMember, aTable));
+ valueList->AppendCSSValue(val.forget());
+ }
+
+ return valueList.forget();
+}
+
/**
* An object that represents the ordered set of properties that are exposed on
* an nsComputedDOMStyle object and how their computed values can be obtained.
@@ -280,7 +304,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsComputedDOMStyle)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mContent)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(nsComputedDOMStyle)
@@ -1803,24 +1826,6 @@ nsComputedDOMStyle::DoGetFontVariantPosition()
}
already_AddRefed<CSSValue>
-nsComputedDOMStyle::GetBackgroundList(uint8_t nsStyleImageLayers::Layer::* aMember,
- uint32_t nsStyleImageLayers::* aCount,
- const nsStyleImageLayers& aLayers,
- const KTableEntry aTable[])
-{
- RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(true);
-
- for (uint32_t i = 0, i_end = aLayers.*aCount; i < i_end; ++i) {
- RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
- val->SetIdent(nsCSSProps::ValueToKeywordEnum(aLayers.mLayers[i].*aMember,
- aTable));
- valueList->AppendCSSValue(val.forget());
- }
-
- return valueList.forget();
-}
-
-already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetBackgroundAttachment()
{
return GetBackgroundList(&nsStyleImageLayers::Layer::mAttachment,
@@ -2367,7 +2372,7 @@ nsComputedDOMStyle::DoGetBackgroundOrigin()
return GetBackgroundList(&nsStyleImageLayers::Layer::mOrigin,
&nsStyleImageLayers::mOriginCount,
StyleBackground()->mImage,
- nsCSSProps::kImageLayerOriginKTable);
+ nsCSSProps::kBackgroundOriginKTable);
}
void
@@ -5013,12 +5018,6 @@ nsComputedDOMStyle::DoGetTop()
return GetOffsetWidthFor(NS_SIDE_TOP);
}
-nsDOMCSSValueList*
-nsComputedDOMStyle::GetROCSSValueList(bool aCommaDelimited)
-{
- return new nsDOMCSSValueList(aCommaDelimited, true);
-}
-
already_AddRefed<CSSValue>
nsComputedDOMStyle::GetOffsetWidthFor(mozilla::css::Side aSide)
{
@@ -6180,8 +6179,8 @@ nsComputedDOMStyle::DoGetMask()
// need to support computed style for the cases where it used to be
// a longhand.
if (svg->mMask.mImageCount > 1 ||
- firstLayer.mClip != NS_STYLE_IMAGELAYER_CLIP_BORDER ||
- firstLayer.mOrigin != NS_STYLE_IMAGELAYER_ORIGIN_BORDER ||
+ firstLayer.mClip != StyleGeometryBox::Border ||
+ firstLayer.mOrigin != StyleGeometryBox::Border ||
firstLayer.mComposite != NS_STYLE_MASK_COMPOSITE_ADD ||
firstLayer.mMaskMode != NS_STYLE_MASK_MODE_MATCH_SOURCE ||
!nsStyleImageLayers::IsInitialPositionForLayerType(
@@ -6200,14 +6199,13 @@ nsComputedDOMStyle::DoGetMask()
return val.forget();
}
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetMaskClip()
{
return GetBackgroundList(&nsStyleImageLayers::Layer::mClip,
&nsStyleImageLayers::mClipCount,
StyleSVGReset()->mMask,
- nsCSSProps::kImageLayerOriginKTable);
+ nsCSSProps::kMaskClipKTable);
}
already_AddRefed<CSSValue>
@@ -6241,7 +6239,7 @@ nsComputedDOMStyle::DoGetMaskOrigin()
return GetBackgroundList(&nsStyleImageLayers::Layer::mOrigin,
&nsStyleImageLayers::mOriginCount,
StyleSVGReset()->mMask,
- nsCSSProps::kImageLayerOriginKTable);
+ nsCSSProps::kMaskOriginKTable);
}
already_AddRefed<CSSValue>
@@ -6278,7 +6276,6 @@ nsComputedDOMStyle::DoGetMaskSize()
const nsStyleImageLayers& layers = StyleSVGReset()->mMask;
return DoGetImageLayerSize(layers);
}
-#endif
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetMaskType()
diff --git a/layout/style/nsComputedDOMStyle.h b/layout/style/nsComputedDOMStyle.h
index 27e2086e9..77df71ec8 100644
--- a/layout/style/nsComputedDOMStyle.h
+++ b/layout/style/nsComputedDOMStyle.h
@@ -53,6 +53,7 @@ private:
// Convenience typedefs:
typedef nsCSSProps::KTableEntry KTableEntry;
typedef mozilla::dom::CSSValue CSSValue;
+ typedef mozilla::StyleGeometryBox StyleGeometryBox;
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
@@ -202,12 +203,6 @@ private:
const nscolor& aDefaultColor,
bool aIsBoxShadow);
- already_AddRefed<CSSValue> GetBackgroundList(
- uint8_t nsStyleImageLayers::Layer::* aMember,
- uint32_t nsStyleImageLayers::* aCount,
- const nsStyleImageLayers& aLayers,
- const KTableEntry aTable[]);
-
void GetCSSGradientString(const nsStyleGradient* aGradient,
nsAString& aString);
void GetImageRectString(nsIURI* aURI,
@@ -310,7 +305,6 @@ private:
/* Mask properties */
already_AddRefed<CSSValue> DoGetMask();
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
already_AddRefed<CSSValue> DoGetMaskImage();
already_AddRefed<CSSValue> DoGetMaskPosition();
already_AddRefed<CSSValue> DoGetMaskPositionX();
@@ -321,7 +315,7 @@ private:
already_AddRefed<CSSValue> DoGetMaskSize();
already_AddRefed<CSSValue> DoGetMaskMode();
already_AddRefed<CSSValue> DoGetMaskComposite();
-#endif
+
/* Padding properties */
already_AddRefed<CSSValue> DoGetPaddingTop();
already_AddRefed<CSSValue> DoGetPaddingBottom();
@@ -582,8 +576,6 @@ private:
/* Custom properties */
already_AddRefed<CSSValue> DoGetCustomProperty(const nsAString& aPropertyName);
- nsDOMCSSValueList* GetROCSSValueList(bool aCommaDelimited);
-
/* Helper functions */
void SetToRGBAColor(nsROCSSPrimitiveValue* aValue, nscolor aColor);
void SetValueFromComplexColor(nsROCSSPrimitiveValue* aValue,
diff --git a/layout/style/nsComputedDOMStylePropertyList.h b/layout/style/nsComputedDOMStylePropertyList.h
index 1983208ac..825976b58 100644
--- a/layout/style/nsComputedDOMStylePropertyList.h
+++ b/layout/style/nsComputedDOMStylePropertyList.h
@@ -332,7 +332,6 @@ COMPUTED_STYLE_PROP(marker_end, MarkerEnd)
COMPUTED_STYLE_PROP(marker_mid, MarkerMid)
COMPUTED_STYLE_PROP(marker_start, MarkerStart)
COMPUTED_STYLE_PROP(mask, Mask)
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
COMPUTED_STYLE_PROP(mask_clip, MaskClip)
COMPUTED_STYLE_PROP(mask_composite, MaskComposite)
COMPUTED_STYLE_PROP(mask_image, MaskImage)
@@ -343,7 +342,6 @@ COMPUTED_STYLE_PROP(mask_position_x, MaskPositionX)
COMPUTED_STYLE_PROP(mask_position_y, MaskPositionY)
COMPUTED_STYLE_PROP(mask_repeat, MaskRepeat)
COMPUTED_STYLE_PROP(mask_size, MaskSize)
-#endif
COMPUTED_STYLE_PROP(mask_type, MaskType)
COMPUTED_STYLE_PROP(paint_order, PaintOrder)
COMPUTED_STYLE_PROP(shape_rendering, ShapeRendering)
diff --git a/layout/style/nsROCSSPrimitiveValue.cpp b/layout/style/nsROCSSPrimitiveValue.cpp
index cbc715eb2..2721bd609 100644
--- a/layout/style/nsROCSSPrimitiveValue.cpp
+++ b/layout/style/nsROCSSPrimitiveValue.cpp
@@ -52,7 +52,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsROCSSPrimitiveValue)
} else if (tmp->mType == CSS_RECT) {
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(mValue.mRect)
}
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsROCSSPrimitiveValue)
diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp
index 9b9fc3948..6bcef02a0 100644
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -22,6 +22,7 @@
#include "mozilla/Unused.h"
#include "mozilla/css/Declaration.h"
+#include "mozilla/TypeTraits.h"
#include "nsAlgorithm.h" // for clamped()
#include "nsRuleNode.h"
@@ -6800,6 +6801,21 @@ struct BackgroundItemComputer<nsCSSValueList, RefPtr<css::URLValueData>>
}
};
+template <typename T>
+struct BackgroundItemComputer<nsCSSValueList, T>
+{
+ typedef typename EnableIf<IsEnum<T>::value, T>::Type ComputedType;
+
+ static void ComputeValue(nsStyleContext* aStyleContext,
+ const nsCSSValueList* aSpecifiedValue,
+ ComputedType& aComputedValue,
+ RuleNodeCacheConditions& aConditions)
+ {
+ aComputedValue =
+ static_cast<T>(aSpecifiedValue->mValue.GetIntValue());
+ }
+};
+
/* Helper function for ComputePositionValue.
* This function computes a single PositionCoord from two nsCSSValue objects,
* which represent an edge and an offset from that edge.
@@ -7353,7 +7369,7 @@ nsRuleNode::ComputeBackgroundData(void* aStartStruct,
bg->mImage.mLayers,
parentBG->mImage.mLayers,
&nsStyleImageLayers::Layer::mClip,
- uint8_t(NS_STYLE_IMAGELAYER_CLIP_BORDER),
+ StyleGeometryBox::Border,
parentBG->mImage.mClipCount,
bg->mImage.mClipCount, maxItemCount, rebuild, conditions);
@@ -7372,7 +7388,7 @@ nsRuleNode::ComputeBackgroundData(void* aStartStruct,
bg->mImage.mLayers,
parentBG->mImage.mLayers,
&nsStyleImageLayers::Layer::mOrigin,
- uint8_t(NS_STYLE_IMAGELAYER_ORIGIN_PADDING),
+ StyleGeometryBox::Padding,
parentBG->mImage.mOriginCount,
bg->mImage.mOriginCount, maxItemCount, rebuild,
conditions);
@@ -10005,7 +10021,6 @@ nsRuleNode::ComputeSVGResetData(void* aStartStruct,
parentSVGReset->mMaskType,
NS_STYLE_MASK_TYPE_LUMINANCE);
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
uint32_t maxItemCount = 1;
bool rebuild = false;
@@ -10043,7 +10058,7 @@ nsRuleNode::ComputeSVGResetData(void* aStartStruct,
svgReset->mMask.mLayers,
parentSVGReset->mMask.mLayers,
&nsStyleImageLayers::Layer::mClip,
- uint8_t(NS_STYLE_IMAGELAYER_CLIP_BORDER),
+ StyleGeometryBox::Border,
parentSVGReset->mMask.mClipCount,
svgReset->mMask.mClipCount, maxItemCount, rebuild,
conditions);
@@ -10053,7 +10068,7 @@ nsRuleNode::ComputeSVGResetData(void* aStartStruct,
svgReset->mMask.mLayers,
parentSVGReset->mMask.mLayers,
&nsStyleImageLayers::Layer::mOrigin,
- uint8_t(NS_STYLE_IMAGELAYER_ORIGIN_BORDER),
+ StyleGeometryBox::Border,
parentSVGReset->mMask.mOriginCount,
svgReset->mMask.mOriginCount, maxItemCount, rebuild,
conditions);
@@ -10113,21 +10128,6 @@ nsRuleNode::ComputeSVGResetData(void* aStartStruct,
if (rebuild) {
FillAllBackgroundLists(svgReset->mMask, maxItemCount);
}
-#else
- // mask: none | <url>
- const nsCSSValue* maskValue = aRuleData->ValueForMask();
- if (eCSSUnit_URL == maskValue->GetUnit()) {
- svgReset->mMask.mLayers[0].mSourceURI = maskValue->GetURLStructValue();
- } else if (eCSSUnit_None == maskValue->GetUnit() ||
- eCSSUnit_Initial == maskValue->GetUnit() ||
- eCSSUnit_Unset == maskValue->GetUnit()) {
- svgReset->mMask.mLayers[0].mSourceURI = nullptr;
- } else if (eCSSUnit_Inherit == maskValue->GetUnit()) {
- conditions.SetUncacheable();
- svgReset->mMask.mLayers[0].mSourceURI =
- parentSVGReset->mMask.mLayers[0].mSourceURI;
- }
-#endif
COMPUTE_END_RESET(SVGReset, svgReset)
}
diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h
index be588113e..6d207aec9 100644
--- a/layout/style/nsStyleConsts.h
+++ b/layout/style/nsStyleConsts.h
@@ -134,16 +134,35 @@ enum class StyleClear : uint8_t {
Max = 13 // Max = (Both | Line)
};
-// clip-path geometry box
-enum class StyleClipPathGeometryBox : uint8_t {
- NoBox,
+// Define geometry box for clip-path's reference-box, background-clip,
+// background-origin, mask-clip and mask-origin.
+enum class StyleGeometryBox : uint8_t {
Content,
Padding,
Border,
- Margin,
- Fill,
- Stroke,
- View,
+ Margin, // XXX Bug 1260094 comment 9.
+ // Although margin-box is required by mask-origin and mask-clip, we
+ // do not implement that due to lack of support in other browsers.
+ // clip-path reference-box only.
+ Fill, // mask-clip, mask-origin and clip-path reference-box only.
+ Stroke, // mask-clip, mask-origin and clip-path reference-box only.
+ View, // mask-clip, mask-origin and clip-path reference-box only.
+ NoClip, // mask-clip only.
+ Text, // background-clip only.
+ NoBox, // Depending on which kind of element this style value applied on,
+ // the default value of a reference-box can be different.
+ // For an HTML element, the default value of reference-box is
+ // border-box; for an SVG element, the default value is fill-box.
+ // Since we can not determine the default value at parsing time,
+ // set it as NoBox so that we make a decision later.
+ // clip-path reference-box only.
+ MozAlmostPadding = 127 // A magic value that we use for our "pretend that
+ // background-clip is 'padding' when we have a solid
+ // border" optimization. This isn't actually equal
+ // to StyleGeometryBox::Padding because using that
+ // causes antialiasing seams between the background
+ // and border.
+ // background-clip only.
};
// fill-rule
@@ -359,14 +378,6 @@ enum class FillMode : uint32_t;
#define NS_STYLE_IMAGELAYER_ATTACHMENT_FIXED 1
#define NS_STYLE_IMAGELAYER_ATTACHMENT_LOCAL 2
-// See nsStyleImageLayers
-// Code depends on these constants having the same values as IMAGELAYER_ORIGIN_*
-#define NS_STYLE_IMAGELAYER_CLIP_BORDER 0
-#define NS_STYLE_IMAGELAYER_CLIP_PADDING 1
-#define NS_STYLE_IMAGELAYER_CLIP_CONTENT 2
-// One extra constant which does not exist in IMAGELAYER_ORIGIN_*
-#define NS_STYLE_IMAGELAYER_CLIP_TEXT 3
-
// A magic value that we use for our "pretend that background-clip is
// 'padding' when we have a solid border" optimization. This isn't
// actually equal to NS_STYLE_IMAGELAYER_CLIP_PADDING because using that
@@ -375,12 +386,6 @@ enum class FillMode : uint32_t;
#define NS_STYLE_IMAGELAYER_CLIP_MOZ_ALMOST_PADDING 127
// See nsStyleImageLayers
-// Code depends on these constants having the same values as BG_CLIP_*
-#define NS_STYLE_IMAGELAYER_ORIGIN_BORDER 0
-#define NS_STYLE_IMAGELAYER_ORIGIN_PADDING 1
-#define NS_STYLE_IMAGELAYER_ORIGIN_CONTENT 2
-
-// See nsStyleImageLayers
// The parser code depends on |ing these values together.
#define NS_STYLE_IMAGELAYER_POSITION_CENTER (1<<0)
#define NS_STYLE_IMAGELAYER_POSITION_TOP (1<<1)
diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp
index 52491a288..72c103724 100644
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -2465,7 +2465,6 @@ const nsCSSPropertyID nsStyleImageLayers::kBackgroundLayerTable[] = {
eCSSProperty_UNKNOWN // composite
};
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
const nsCSSPropertyID nsStyleImageLayers::kMaskLayerTable[] = {
eCSSProperty_mask, // shorthand
eCSSProperty_UNKNOWN, // color
@@ -2480,7 +2479,6 @@ const nsCSSPropertyID nsStyleImageLayers::kMaskLayerTable[] = {
eCSSProperty_mask_mode, // maskMode
eCSSProperty_mask_composite // composite
};
-#endif
nsStyleImageLayers::nsStyleImageLayers(nsStyleImageLayers::LayerType aType)
: mAttachmentCount(1)
@@ -2787,7 +2785,7 @@ nsStyleImageLayers::Size::operator==(const Size& aOther) const
}
nsStyleImageLayers::Layer::Layer()
- : mClip(NS_STYLE_IMAGELAYER_CLIP_BORDER)
+ : mClip(StyleGeometryBox::Border)
, mAttachment(NS_STYLE_IMAGELAYER_ATTACHMENT_SCROLL)
, mBlendMode(NS_STYLE_BLEND_NORMAL)
, mComposite(NS_STYLE_MASK_COMPOSITE_ADD)
@@ -2809,10 +2807,10 @@ nsStyleImageLayers::Layer::Initialize(nsStyleImageLayers::LayerType aType)
mPosition.SetInitialPercentValues(0.0f);
if (aType == LayerType::Background) {
- mOrigin = NS_STYLE_IMAGELAYER_ORIGIN_PADDING;
+ mOrigin = StyleGeometryBox::Padding;
} else {
MOZ_ASSERT(aType == LayerType::Mask, "unsupported layer type.");
- mOrigin = NS_STYLE_IMAGELAYER_ORIGIN_BORDER;
+ mOrigin = StyleGeometryBox::Border;
}
}
diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h
index 1cadea840..c8182b8f1 100644
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -782,6 +782,8 @@ struct nsStyleImageLayers {
struct Layer;
friend struct Layer;
struct Layer {
+ typedef mozilla::StyleGeometryBox StyleGeometryBox;
+
nsStyleImage mImage; // [reset]
RefPtr<mozilla::css::URLValueData> mSourceURI; // [reset]
// mask-only property
@@ -793,9 +795,9 @@ struct nsStyleImageLayers {
// or an ImageValue.)
mozilla::Position mPosition; // [reset]
Size mSize; // [reset]
- uint8_t mClip; // [reset] See nsStyleConsts.h
+ StyleGeometryBox mClip; // [reset] See nsStyleConsts.h
MOZ_INIT_OUTSIDE_CTOR
- uint8_t mOrigin; // [reset] See nsStyleConsts.h
+ StyleGeometryBox mOrigin; // [reset] See nsStyleConsts.h
uint8_t mAttachment; // [reset] See nsStyleConsts.h
// background-only property
// This property is used for background layer
@@ -2755,7 +2757,7 @@ private:
ReferenceBox mReferenceBox = ReferenceBox::NoBox;
};
-using StyleClipPath = StyleShapeSource<StyleClipPathGeometryBox>;
+using StyleClipPath = StyleShapeSource<StyleGeometryBox>;
using StyleShapeOutside = StyleShapeSource<StyleShapeOutsideShapeBox>;
} // namespace mozilla
diff --git a/layout/svg/nsCSSClipPathInstance.cpp b/layout/svg/nsCSSClipPathInstance.cpp
index 828b10eac..01f7de248 100644
--- a/layout/svg/nsCSSClipPathInstance.cpp
+++ b/layout/svg/nsCSSClipPathInstance.cpp
@@ -62,122 +62,12 @@ nsCSSClipPathInstance::HitTestBasicShapeClip(nsIFrame* aFrame,
return path->ContainsPoint(ToPoint(aPoint) * pixelRatio, Matrix());
}
-nsRect
-nsCSSClipPathInstance::ComputeSVGReferenceRect()
-{
- MOZ_ASSERT(mTargetFrame->GetContent()->IsSVGElement());
- nsRect r;
-
- // For SVG elements without associated CSS layout box, the used value for
- // content-box, padding-box, border-box and margin-box is fill-box.
- switch (mClipPathStyle.GetReferenceBox()) {
- case StyleClipPathGeometryBox::Stroke: {
- // XXX Bug 1299876
- // The size of srtoke-box is not correct if this graphic element has
- // specific stroke-linejoin or stroke-linecap.
- gfxRect bbox = nsSVGUtils::GetBBox(mTargetFrame,
- nsSVGUtils::eBBoxIncludeFill | nsSVGUtils::eBBoxIncludeStroke);
- r = nsLayoutUtils::RoundGfxRectToAppRect(bbox,
- nsPresContext::AppUnitsPerCSSPixel());
- break;
- }
- case StyleClipPathGeometryBox::View: {
- nsIContent* content = mTargetFrame->GetContent();
- nsSVGElement* element = static_cast<nsSVGElement*>(content);
- SVGSVGElement* svgElement = element->GetCtx();
- MOZ_ASSERT(svgElement);
-
- if (svgElement && svgElement->HasViewBoxRect()) {
- // If a ‘viewBox‘ attribute is specified for the SVG viewport creating
- // element:
- // 1. The reference box is positioned at the origin of the coordinate
- // system established by the ‘viewBox‘ attribute.
- // 2. The dimension of the reference box is set to the width and height
- // values of the ‘viewBox‘ attribute.
- nsSVGViewBox* viewBox = svgElement->GetViewBox();
- const nsSVGViewBoxRect& value = viewBox->GetAnimValue();
- r = nsRect(nsPresContext::CSSPixelsToAppUnits(value.x),
- nsPresContext::CSSPixelsToAppUnits(value.y),
- nsPresContext::CSSPixelsToAppUnits(value.width),
- nsPresContext::CSSPixelsToAppUnits(value.height));
- } else {
- // No viewBox is specified, uses the nearest SVG viewport as reference
- // box.
- svgFloatSize viewportSize = svgElement->GetViewportSize();
- r = nsRect(0, 0,
- nsPresContext::CSSPixelsToAppUnits(viewportSize.width),
- nsPresContext::CSSPixelsToAppUnits(viewportSize.height));
- }
-
- break;
- }
- case StyleClipPathGeometryBox::NoBox:
- case StyleClipPathGeometryBox::Border:
- case StyleClipPathGeometryBox::Content:
- case StyleClipPathGeometryBox::Padding:
- case StyleClipPathGeometryBox::Margin:
- case StyleClipPathGeometryBox::Fill: {
- gfxRect bbox = nsSVGUtils::GetBBox(mTargetFrame,
- nsSVGUtils::eBBoxIncludeFill);
- r = nsLayoutUtils::RoundGfxRectToAppRect(bbox,
- nsPresContext::AppUnitsPerCSSPixel());
- break;
- }
- default:{
- MOZ_ASSERT_UNREACHABLE("unknown StyleClipPathGeometryBox type");
- gfxRect bbox = nsSVGUtils::GetBBox(mTargetFrame,
- nsSVGUtils::eBBoxIncludeFill);
- r = nsLayoutUtils::RoundGfxRectToAppRect(bbox,
- nsPresContext::AppUnitsPerCSSPixel());
- break;
- }
- }
-
- return r;
-}
-
-nsRect
-nsCSSClipPathInstance::ComputeHTMLReferenceRect()
-{
- nsRect r;
-
- // For elements with associated CSS layout box, the used value for fill-box,
- // stroke-box and view-box is border-box.
- switch (mClipPathStyle.GetReferenceBox()) {
- case StyleClipPathGeometryBox::Content:
- r = mTargetFrame->GetContentRectRelativeToSelf();
- break;
- case StyleClipPathGeometryBox::Padding:
- r = mTargetFrame->GetPaddingRectRelativeToSelf();
- break;
- case StyleClipPathGeometryBox::Margin:
- r = mTargetFrame->GetMarginRectRelativeToSelf();
- break;
- case StyleClipPathGeometryBox::NoBox:
- case StyleClipPathGeometryBox::Border:
- case StyleClipPathGeometryBox::Fill:
- case StyleClipPathGeometryBox::Stroke:
- case StyleClipPathGeometryBox::View:
- r = mTargetFrame->GetRectRelativeToSelf();
- break;
- default:
- MOZ_ASSERT_UNREACHABLE("unknown StyleClipPathGeometryBox type");
- r = mTargetFrame->GetRectRelativeToSelf();
- break;
- }
-
- return r;
-}
-
already_AddRefed<Path>
nsCSSClipPathInstance::CreateClipPath(DrawTarget* aDrawTarget)
{
- // We use ComputeSVGReferenceRect for all SVG elements, except <svg>
- // element, which does have an associated CSS layout box. In this case we
- // should still use ComputeHTMLReferenceRect for region computing.
- nsRect r = mTargetFrame->IsFrameOfType(nsIFrame::eSVG) &&
- (mTargetFrame->GetType() != nsGkAtoms::svgOuterSVGFrame)
- ? ComputeSVGReferenceRect() : ComputeHTMLReferenceRect();
+ nsRect r =
+ nsLayoutUtils::ComputeGeometryBox(mTargetFrame,
+ mClipPathStyle.GetReferenceBox());
if (mClipPathStyle.GetType() != StyleShapeSourceType::Shape) {
// TODO Clip to border-radius/reference box if no shape
diff --git a/layout/svg/nsCSSClipPathInstance.h b/layout/svg/nsCSSClipPathInstance.h
index 3b0724dbd..33d92e738 100644
--- a/layout/svg/nsCSSClipPathInstance.h
+++ b/layout/svg/nsCSSClipPathInstance.h
@@ -48,10 +48,6 @@ private:
already_AddRefed<Path> CreateClipPathInset(DrawTarget* aDrawTarget,
const nsRect& aRefBox);
-
- nsRect ComputeHTMLReferenceRect();
- nsRect ComputeSVGReferenceRect();
-
/**
* The frame for the element that is currently being clipped.
*/
diff --git a/layout/svg/nsSVGIntegrationUtils.cpp b/layout/svg/nsSVGIntegrationUtils.cpp
index 498f69393..0003e1a73 100644
--- a/layout/svg/nsSVGIntegrationUtils.cpp
+++ b/layout/svg/nsSVGIntegrationUtils.cpp
@@ -509,71 +509,108 @@ PaintMaskSurface(const PaintFramesParams& aParams,
return DrawResult::SUCCESS;
}
-static DrawResult
+struct MaskPaintResult {
+ RefPtr<SourceSurface> maskSurface;
+ Matrix maskTransform;
+ DrawResult result;
+ bool transparentBlackMask;
+ bool opacityApplied;
+
+ MaskPaintResult()
+ : result(DrawResult::SUCCESS), transparentBlackMask(false),
+ opacityApplied(false)
+ {}
+};
+
+static MaskPaintResult
CreateAndPaintMaskSurface(const PaintFramesParams& aParams,
float aOpacity, nsStyleContext* aSC,
const nsTArray<nsSVGMaskFrame*>& aMaskFrames,
- const nsPoint& aOffsetToUserSpace,
- Matrix& aOutMaskTransform,
- RefPtr<SourceSurface>& aOutMaskSurface,
- bool& aOpacityApplied)
+ const nsPoint& aOffsetToUserSpace)
{
const nsStyleSVGReset *svgReset = aSC->StyleSVGReset();
MOZ_ASSERT(aMaskFrames.Length() > 0);
+ MaskPaintResult paintResult;
gfxContext& ctx = aParams.ctx;
- // There is only one SVG mask.
+ // Optimization for single SVG mask.
if (((aMaskFrames.Length() == 1) && aMaskFrames[0])) {
gfxMatrix cssPxToDevPxMatrix =
nsSVGIntegrationUtils::GetCSSPxToDevPxMatrix(aParams.frame);
+ paintResult.opacityApplied = true;
- aOpacityApplied = true;
- aOutMaskSurface =
+ paintResult.maskSurface =
aMaskFrames[0]->GetMaskForMaskedFrame(&ctx, aParams.frame,
cssPxToDevPxMatrix, aOpacity,
- &aOutMaskTransform,
+ &paintResult.maskTransform,
svgReset->mMask.mLayers[0].mMaskMode);
- return DrawResult::SUCCESS;
+ if (!paintResult.maskSurface) {
+ paintResult.transparentBlackMask = true;
+ }
+
+ return paintResult;
}
const IntRect& maskSurfaceRect = aParams.maskRect;
if (maskSurfaceRect.IsEmpty()) {
- return DrawResult::SUCCESS;
+ paintResult.transparentBlackMask = true;
+ return paintResult;
}
RefPtr<DrawTarget> maskDT =
ctx.GetDrawTarget()->CreateSimilarDrawTarget(maskSurfaceRect.Size(),
SurfaceFormat::A8);
if (!maskDT || !maskDT->IsValid()) {
- return DrawResult::TEMPORARY_ERROR;
+ paintResult.result = DrawResult::TEMPORARY_ERROR;
+ return paintResult;
}
// Set aAppliedOpacity as true only if all mask layers are svg mask.
// In this case, we will apply opacity into the final mask surface, so the
// caller does not need to apply it again.
- aOpacityApplied = !HasNonSVGMask(aMaskFrames);
+ paintResult.opacityApplied = !HasNonSVGMask(aMaskFrames);
// Set context's matrix on maskContext, offset by the maskSurfaceRect's
// position. This makes sure that we combine the masks in device space.
gfxMatrix maskSurfaceMatrix =
ctx.CurrentMatrix() * gfxMatrix::Translation(-aParams.maskRect.TopLeft());
- DrawResult result = PaintMaskSurface(aParams, maskDT,
- aOpacityApplied ? aOpacity : 1.0,
- aSC, aMaskFrames, maskSurfaceMatrix,
- aOffsetToUserSpace);
- if (result != DrawResult::SUCCESS) {
- return result;
- }
-
- aOutMaskTransform = ToMatrix(maskSurfaceMatrix);
- if (!aOutMaskTransform.Invert()) {
- return DrawResult::SUCCESS;
+ paintResult.result = PaintMaskSurface(aParams, maskDT,
+ paintResult.opacityApplied
+ ? aOpacity : 1.0,
+ aSC, aMaskFrames, maskSurfaceMatrix,
+ aOffsetToUserSpace);
+ if (paintResult.result != DrawResult::SUCCESS) {
+ // Now we know the status of mask resource since we used it while painting.
+ // According to the return value of PaintMaskSurface, we know whether mask
+ // resource is resolvable or not.
+ //
+ // For a HTML doc:
+ // According to css-masking spec, always create a mask surface when
+ // we have any item in maskFrame even if all of those items are
+ // non-resolvable <mask-sources> or <images>.
+ // Set paintResult.transparentBlackMask as true, the caller should stop
+ // painting masked content as if this mask is a transparent black one.
+ // For a SVG doc:
+ // SVG 1.1 say that if we fail to resolve a mask, we should draw the
+ // object unmasked.
+ // Left patinResult.maskSurface empty, the caller should paint all
+ // masked content as if this mask is an opaque white one(no mask).
+ paintResult.transparentBlackMask =
+ !(aParams.frame->GetStateBits() & NS_FRAME_SVG_LAYOUT);
+
+ MOZ_ASSERT(!paintResult.maskSurface);
+ return paintResult;
+ }
+
+ paintResult.maskTransform = ToMatrix(maskSurfaceMatrix);
+ if (!paintResult.maskTransform.Invert()) {
+ return paintResult;
}
- aOutMaskSurface = maskDT->Snapshot();
- return DrawResult::SUCCESS;
+ paintResult.maskSurface = maskDT->Snapshot();
+ return paintResult;
}
static bool
@@ -783,6 +820,8 @@ nsSVGIntegrationUtils::PaintMaskAndClipPath(const PaintFramesParams& aParams)
maskUsage.shouldGenerateClipMaskLayer ||
maskUsage.shouldGenerateMaskLayer);
+ bool shouldPushMask = false;
+
/* Check if we need to do additional operations on this child's
* rendering, which necessitates rendering into another surface. */
if (shouldGenerateMask) {
@@ -800,14 +839,23 @@ nsSVGIntegrationUtils::PaintMaskAndClipPath(const PaintFramesParams& aParams)
// instead of the first continuation frame.
SetupContextMatrix(frame, aParams, offsetToBoundingBox,
offsetToUserSpace);
- result = CreateAndPaintMaskSurface(aParams, maskUsage.opacity,
- firstFrame->StyleContext(),
- maskFrames, offsetToUserSpace,
- maskTransform, maskSurface,
- opacityApplied);
- if (!maskSurface) {
- // Entire surface is clipped out.
- return result;
+ MaskPaintResult paintResult =
+ CreateAndPaintMaskSurface(aParams, maskUsage.opacity,
+ firstFrame->StyleContext(),
+ maskFrames, offsetToUserSpace);
+
+ if (paintResult.transparentBlackMask) {
+ MOZ_ASSERT(paintResult.result != DrawResult::SUCCESS);
+ return paintResult.result;
+ }
+
+ result &= paintResult.result;
+ maskSurface = paintResult.maskSurface;
+ if (maskSurface) {
+ MOZ_ASSERT(paintResult.result == DrawResult::SUCCESS);
+ shouldPushMask = true;
+ maskTransform = paintResult.maskTransform;
+ opacityApplied = paintResult.opacityApplied;
}
}
@@ -831,6 +879,8 @@ nsSVGIntegrationUtils::PaintMaskAndClipPath(const PaintFramesParams& aParams)
// failure in nsSVGClipPathFrame::GetClipMask.
return result;
}
+
+ shouldPushMask = true;
}
// opacity != 1.0f.
@@ -841,18 +891,22 @@ nsSVGIntegrationUtils::PaintMaskAndClipPath(const PaintFramesParams& aParams)
matSR.SetContext(&context);
SetupContextMatrix(firstFrame, aParams, offsetToBoundingBox,
offsetToUserSpace);
+ shouldPushMask = true;
}
- if (aParams.layerManager->GetRoot()->GetContentFlags() & Layer::CONTENT_COMPONENT_ALPHA) {
- context.PushGroupAndCopyBackground(gfxContentType::COLOR_ALPHA,
- opacityApplied
- ? 1.0
- : maskUsage.opacity,
- maskSurface, maskTransform);
- } else {
- context.PushGroupForBlendBack(gfxContentType::COLOR_ALPHA,
- opacityApplied ? 1.0 : maskUsage.opacity,
- maskSurface, maskTransform);
+ if (shouldPushMask) {
+ if (aParams.layerManager->GetRoot()->GetContentFlags() &
+ Layer::CONTENT_COMPONENT_ALPHA) {
+ context.PushGroupAndCopyBackground(gfxContentType::COLOR_ALPHA,
+ opacityApplied
+ ? 1.0
+ : maskUsage.opacity,
+ maskSurface, maskTransform);
+ } else {
+ context.PushGroupForBlendBack(gfxContentType::COLOR_ALPHA,
+ opacityApplied ? 1.0 : maskUsage.opacity,
+ maskSurface, maskTransform);
+ }
}
}
@@ -899,7 +953,7 @@ nsSVGIntegrationUtils::PaintMaskAndClipPath(const PaintFramesParams& aParams)
context.PopClip();
}
- if (shouldGenerateMask) {
+ if (shouldPushMask) {
context.PopGroupAndBlend();
}
diff --git a/layout/svg/nsSVGUtils.cpp b/layout/svg/nsSVGUtils.cpp
index 344ebf645..0bded21ff 100644
--- a/layout/svg/nsSVGUtils.cpp
+++ b/layout/svg/nsSVGUtils.cpp
@@ -514,26 +514,7 @@ nsSVGUtils::DetermineMaskUsage(nsIFrame* aFrame, bool aHandleOpacity,
nsTArray<nsSVGMaskFrame*> maskFrames = effectProperties.GetMaskFrames();
-#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
- // For a HTML doc:
- // According to css-masking spec, always create a mask surface when we
- // have any item in maskFrame even if all of those items are
- // non-resolvable <mask-sources> or <images>, we still need to create a
- // transparent black mask layer under this condition.
- // For a SVG doc:
- // SVG 1.1 say that if we fail to resolve a mask, we should draw the
- // object unmasked.
- aUsage.shouldGenerateMaskLayer =
- (aFrame->GetStateBits() & NS_FRAME_SVG_LAYOUT)
- ? maskFrames.Length() == 1 && maskFrames[0]
- : maskFrames.Length() > 0;
-#else
- // Since we do not support image mask so far, we should treat any
- // unresolvable mask as no mask. Otherwise, any object with a valid image
- // mask, e.g. url("xxx.png"), will become invisible just because we can not
- // handle image mask correctly. (See bug 1294171)
- aUsage.shouldGenerateMaskLayer = maskFrames.Length() == 1 && maskFrames[0];
-#endif
+ aUsage.shouldGenerateMaskLayer = (maskFrames.Length() > 0);
bool isOK = effectProperties.HasNoFilterOrHasValidFilter();
nsSVGClipPathFrame *clipPathFrame = effectProperties.GetClipPathFrame(&isOK);
diff --git a/layout/xul/BoxObject.cpp b/layout/xul/BoxObject.cpp
index 6636a6d62..347205fff 100644
--- a/layout/xul/BoxObject.cpp
+++ b/layout/xul/BoxObject.cpp
@@ -53,7 +53,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(BoxObject)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(BoxObject)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
if (tmp->mPropertyTable) {
for (auto iter = tmp->mPropertyTable->Iter(); !iter.Done(); iter.Next()) {
cb.NoteXPCOMChild(iter.UserData());
diff --git a/layout/xul/tree/nsTreeColumns.cpp b/layout/xul/tree/nsTreeColumns.cpp
index c6ee19342..ee8577f92 100644
--- a/layout/xul/tree/nsTreeColumns.cpp
+++ b/layout/xul/tree/nsTreeColumns.cpp
@@ -54,7 +54,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsTreeColumn)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mContent)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mNext)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(nsTreeColumn)
diff --git a/media/ffvpx/libavcodec/avcodec.symbols b/media/ffvpx/libavcodec/avcodec.symbols
index 0b7c21cca..8f135e523 100644
--- a/media/ffvpx/libavcodec/avcodec.symbols
+++ b/media/ffvpx/libavcodec/avcodec.symbols
@@ -99,3 +99,5 @@ avcodec_register_all
avcodec_string
avcodec_version
avsubtitle_free
+avcodec_send_packet
+avcodec_receive_frame
diff --git a/media/libstagefright/frameworks/av/media/libstagefright/SampleIterator.cpp b/media/libstagefright/frameworks/av/media/libstagefright/SampleIterator.cpp
index 37bb2b7a5..f1c797c9a 100644
--- a/media/libstagefright/frameworks/av/media/libstagefright/SampleIterator.cpp
+++ b/media/libstagefright/frameworks/av/media/libstagefright/SampleIterator.cpp
@@ -321,7 +321,18 @@ status_t SampleIterator::findSampleTime(
*time = mTTSSampleTime + mTTSDuration * (sampleIndex - mTTSSampleIndex);
- *time += mTable->getCompositionTimeOffset(sampleIndex);
+ int32_t offset = mTable->getCompositionTimeOffset(sampleIndex);
+ if ((offset < 0 && *time < (offset == INT32_MIN ?
+ INT32_MAX : uint32_t(-offset))) ||
+ (offset > 0 && *time > UINT32_MAX - offset)) {
+ ALOGE("%u + %d would overflow", *time, offset);
+ return ERROR_OUT_OF_RANGE;
+ }
+ if (offset > 0) {
+ *time += offset;
+ } else {
+ *time -= (offset == INT32_MIN ? INT32_MAX : (-offset));
+ }
return OK;
}
diff --git a/media/libstagefright/frameworks/av/media/libstagefright/SampleTable.cpp b/media/libstagefright/frameworks/av/media/libstagefright/SampleTable.cpp
index bbb2227e7..bc991e8e1 100644
--- a/media/libstagefright/frameworks/av/media/libstagefright/SampleTable.cpp
+++ b/media/libstagefright/frameworks/av/media/libstagefright/SampleTable.cpp
@@ -52,14 +52,14 @@ struct SampleTable::CompositionDeltaLookup {
CompositionDeltaLookup();
void setEntries(
- const uint32_t *deltaEntries, size_t numDeltaEntries);
+ const int32_t *deltaEntries, size_t numDeltaEntries);
- uint32_t getCompositionTimeOffset(uint32_t sampleIndex);
+ int32_t getCompositionTimeOffset(uint32_t sampleIndex);
private:
Mutex mLock;
- const uint32_t *mDeltaEntries;
+ const int32_t *mDeltaEntries;
size_t mNumDeltaEntries;
size_t mCurrentDeltaEntry;
@@ -76,7 +76,7 @@ SampleTable::CompositionDeltaLookup::CompositionDeltaLookup()
}
void SampleTable::CompositionDeltaLookup::setEntries(
- const uint32_t *deltaEntries, size_t numDeltaEntries) {
+ const int32_t *deltaEntries, size_t numDeltaEntries) {
Mutex::Autolock autolock(mLock);
mDeltaEntries = deltaEntries;
@@ -85,7 +85,7 @@ void SampleTable::CompositionDeltaLookup::setEntries(
mCurrentEntrySampleIndex = 0;
}
-uint32_t SampleTable::CompositionDeltaLookup::getCompositionTimeOffset(
+int32_t SampleTable::CompositionDeltaLookup::getCompositionTimeOffset(
uint32_t sampleIndex) {
Mutex::Autolock autolock(mLock);
@@ -381,6 +381,10 @@ status_t SampleTable::setTimeToSampleParams(
return OK;
}
+// NOTE: per 14996-12, version 0 ctts contains unsigned values, while version 1
+// contains signed values, however some software creates version 0 files that
+// contain signed values, so we're always treating the values as signed,
+// regardless of version.
status_t SampleTable::setCompositionTimeToSampleParams(
off64_t data_offset, size_t data_size) {
ALOGV("There are reordered frames present.");
@@ -398,8 +402,12 @@ status_t SampleTable::setCompositionTimeToSampleParams(
uint32_t numEntries = U32_AT(&header[4]);
- if (U32_AT(header) != 0 && numEntries) {
- // Expected version = 0, flags = 0.
+ uint32_t flags = U32_AT(header);
+ uint32_t version = flags >> 24;
+ flags &= 0xffffff;
+
+ if ((version != 0 && version != 1) || flags != 0) {
+ // Expected version = 0 or 1, flags = 0.
return ERROR_MALFORMED;
}
@@ -408,7 +416,7 @@ status_t SampleTable::setCompositionTimeToSampleParams(
}
mNumCompositionTimeDeltaEntries = numEntries;
- mCompositionTimeDeltaEntries = new (mozilla::fallible) uint32_t[2 * numEntries];
+ mCompositionTimeDeltaEntries = new (mozilla::fallible) int32_t[2 * numEntries];
if (!mCompositionTimeDeltaEntries) {
return ERROR_BUFFER_TOO_SMALL;
}
@@ -801,12 +809,28 @@ status_t SampleTable::buildSampleEntriesTable() {
mSampleTimeEntries[sampleIndex].mSampleIndex = sampleIndex;
- uint32_t compTimeDelta =
+ int32_t compTimeDelta =
mCompositionDeltaLookup->getCompositionTimeOffset(
sampleIndex);
+ if ((compTimeDelta < 0 && sampleTime <
+ (compTimeDelta == INT32_MIN ?
+ INT32_MAX : uint32_t(-compTimeDelta)))
+ || (compTimeDelta > 0 &&
+ sampleTime > UINT32_MAX - compTimeDelta)) {
+ ALOGE("%u + %d would overflow, clamping",
+ sampleTime, compTimeDelta);
+ if (compTimeDelta < 0) {
+ sampleTime = 0;
+ } else {
+ sampleTime = UINT32_MAX;
+ }
+ compTimeDelta = 0;
+ }
+
mSampleTimeEntries[sampleIndex].mCompositionTime =
- sampleTime + compTimeDelta;
+ compTimeDelta > 0 ? sampleTime + compTimeDelta:
+ sampleTime - (-compTimeDelta);
}
++sampleIndex;
@@ -1136,7 +1160,7 @@ status_t SampleTable::getMetaDataForSample(
return OK;
}
-uint32_t SampleTable::getCompositionTimeOffset(uint32_t sampleIndex) {
+int32_t SampleTable::getCompositionTimeOffset(uint32_t sampleIndex) {
return mCompositionDeltaLookup->getCompositionTimeOffset(sampleIndex);
}
diff --git a/media/libstagefright/frameworks/av/media/libstagefright/include/SampleTable.h b/media/libstagefright/frameworks/av/media/libstagefright/include/SampleTable.h
index e115c92bb..c235f281e 100644
--- a/media/libstagefright/frameworks/av/media/libstagefright/include/SampleTable.h
+++ b/media/libstagefright/frameworks/av/media/libstagefright/include/SampleTable.h
@@ -134,7 +134,7 @@ private:
};
SampleTimeEntry *mSampleTimeEntries;
- uint32_t *mCompositionTimeDeltaEntries;
+ int32_t *mCompositionTimeDeltaEntries;
size_t mNumCompositionTimeDeltaEntries;
CompositionDeltaLookup *mCompositionDeltaLookup;
@@ -171,7 +171,7 @@ private:
friend struct SampleIterator;
status_t getSampleSize_l(uint32_t sample_index, size_t *sample_size);
- uint32_t getCompositionTimeOffset(uint32_t sampleIndex);
+ int32_t getCompositionTimeOffset(uint32_t sampleIndex);
static int CompareIncreasingTime(const void *, const void *);
diff --git a/media/libwebp/AUTHORS b/media/libwebp/AUTHORS
index 83c7b9c5e..0d70b7fb2 100644
--- a/media/libwebp/AUTHORS
+++ b/media/libwebp/AUTHORS
@@ -1,4 +1,5 @@
Contributors:
+- Alan Browning (browning at google dot com)
- Charles Munger (clm at google dot com)
- Christian Duvivier (cduvivier at google dot com)
- Djordje Pesut (djordje dot pesut at imgtec dot com)
@@ -6,9 +7,10 @@ Contributors:
- James Zern (jzern at google dot com)
- Jan Engelhardt (jengelh at medozas dot de)
- Jehan (jehan at girinstud dot io)
-- Johann (johann dot koenig at duck dot com)
+- Johann Koenig (johann dot koenig at duck dot com)
- Jovan Zelincevic (jovan dot zelincevic at imgtec dot com)
- Jyrki Alakuijala (jyrki at google dot com)
+- Konstantin Ivlev (tomskside at gmail dot com)
- Lode Vandevenne (lode at google dot com)
- Lou Quillio (louquillio at google dot com)
- Mans Rullgard (mans at mansr dot com)
@@ -37,3 +39,4 @@ Contributors:
- Vincent Rabaud (vrabaud at google dot com)
- Vlad Tsyrklevich (vtsyrklevich at chromium dot org)
- Yang Zhang (yang dot zhang at arm dot com)
+- Yannis Guyon (yguyon at google dot com)
diff --git a/media/libwebp/NEWS b/media/libwebp/NEWS
index 480cb7d34..aa393c819 100644
--- a/media/libwebp/NEWS
+++ b/media/libwebp/NEWS
@@ -1,3 +1,23 @@
+- 1/14/2019: version 1.0.2
+ This is a binary compatible release.
+ * (Windows) unicode file support in the tools (linux and mac already had
+ support, issue #398)
+ * lossless encoder speedups
+ * lossy encoder speedup on ARM
+ * lossless multi-threaded security fix (chromium:917029)
+
+- 11/2/2018: version 1.0.1
+ This is a binary compatible release.
+ * lossless encoder speedups
+ * big-endian fix for alpha decoding (issue #393)
+ * gif2webp fix for loop count=65535 transcode (issue #382)
+ * further security related hardening in libwebp & libwebpmux
+ (issues #383, #385, #386, #387, #388, #391)
+ (oss-fuzz #9099, #9100, #9105, #9106, #9111, #9112, #9119, #9123, #9170,
+ #9178, #9179, #9183, #9186, #9191, #9364, #9417, #9496, #10349,
+ #10423, #10634, #10700, #10838, #10922, #11021, #11088, #11152)
+ * miscellaneous bug & build fixes (issues #381, #394, #396, #397, #400)
+
- 4/2/2018: version 1.0.0
This is a binary compatible release.
* lossy encoder improvements to avoid chroma shifts in various circumstances
diff --git a/media/libwebp/README b/media/libwebp/README
index a76b3787f..502a4c1c2 100644
--- a/media/libwebp/README
+++ b/media/libwebp/README
@@ -4,7 +4,7 @@
\__\__/\____/\_____/__/ ____ ___
/ _/ / \ \ / _ \/ _/
/ \_/ / / \ \ __/ \__
- \____/____/\_____/_____/____/v1.0.0
+ \____/____/\_____/_____/____/v1.0.2
Description:
============
@@ -136,6 +136,8 @@ cmake -DWEBP_BUILD_CWEBP=ON -DWEBP_BUILD_DWEBP=ON ../
or through your favorite interface (like ccmake or cmake-qt-gui).
+Use option -DWEBP_UNICODE=ON for Unicode support on Windows (with chcp 65001).
+
Finally, once installed, you can also use WebP in your CMake project by doing:
find_package(WebP)
@@ -402,12 +404,14 @@ Options are:
-nofilter .... disable in-loop filtering
-dither <int> dithering strength (0..100), default=50
-noalphadither disable alpha plane dithering
+ -usebgcolor .. display background color
-mt .......... use multi-threading
-info ........ print info
-h ........... this help message
Keyboard shortcuts:
'c' ................ toggle use of color profile
+ 'b' ................ toggle background color display
'i' ................ overlay file information
'd' ................ disable blending & disposal (debug)
'q' / 'Q' / ESC .... quit
@@ -470,6 +474,9 @@ Per-frame options (only used for subsequent images input):
example: img2webp -loop 2 in0.png -lossy in1.jpg
-d 80 in2.tiff -o out.webp
+Note: if a single file name is passed as the argument, the arguments will be
+tokenized from this file. The file name must not start with the character '-'.
+
Animated GIF conversion:
========================
Animated GIF files can be converted to WebP files with animation using the
diff --git a/media/libwebp/README.mux b/media/libwebp/README.mux
index bd4f92fa3..7e9c3c903 100644
--- a/media/libwebp/README.mux
+++ b/media/libwebp/README.mux
@@ -1,7 +1,7 @@
 __ __ ____ ____ ____ __ __ _ __ __
/ \\/ \/ _ \/ _ \/ _ \/ \ \/ \___/_ / _\
\ / __/ _ \ __/ / / (_/ /__
- \__\__/\_____/_____/__/ \__//_/\_____/__/___/v1.0.0
+ \__\__/\_____/_____/__/ \__//_/\_____/__/___/v1.0.2
Description:
@@ -211,6 +211,35 @@ Code example:
For a detailed AnimEncoder API reference, please refer to the header file
(src/webp/mux.h).
+AnimDecoder API:
+================
+This AnimDecoder API allows decoding (possibly) animated WebP images.
+
+Code Example:
+
+ WebPAnimDecoderOptions dec_options;
+ WebPAnimDecoderOptionsInit(&dec_options);
+ // Tune 'dec_options' as needed.
+ WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options);
+ WebPAnimInfo anim_info;
+ WebPAnimDecoderGetInfo(dec, &anim_info);
+ for (uint32_t i = 0; i < anim_info.loop_count; ++i) {
+ while (WebPAnimDecoderHasMoreFrames(dec)) {
+ uint8_t* buf;
+ int timestamp;
+ WebPAnimDecoderGetNext(dec, &buf, &timestamp);
+ // ... (Render 'buf' based on 'timestamp').
+ // ... (Do NOT free 'buf', as it is owned by 'dec').
+ }
+ WebPAnimDecoderReset(dec);
+ }
+ const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec);
+ // ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data).
+ WebPAnimDecoderDelete(dec);
+
+For a detailed AnimDecoder API reference, please refer to the header file
+(src/webp/demux.h).
+
Bugs:
=====
diff --git a/media/libwebp/UXPCHANGES b/media/libwebp/UXPCHANGES
index 8c3eb5ad2..78b7823c8 100644
--- a/media/libwebp/UXPCHANGES
+++ b/media/libwebp/UXPCHANGES
@@ -2,3 +2,4 @@ Changes made to pristine libwebp source by Moonchild Productions and mozilla.org
2017/01/27 -- Synced with libwebp-0.6.0 (BZ #1294490).
2018/06/29 -- Synced with libwebp-1.0.0 + BUG=webp:381,383,384.
+2019/01/21 -- Synced with libwebp-1.0.2
diff --git a/media/libwebp/dec/alphai_dec.h b/media/libwebp/dec/alphai_dec.h
index 3b40691b5..d2a404dc5 100644
--- a/media/libwebp/dec/alphai_dec.h
+++ b/media/libwebp/dec/alphai_dec.h
@@ -51,4 +51,4 @@ void WebPDeallocateAlphaMemory(VP8Decoder* const dec);
} // extern "C"
#endif
-#endif /* WEBP_DEC_ALPHAI_DEC_H_ */
+#endif // WEBP_DEC_ALPHAI_DEC_H_
diff --git a/media/libwebp/dec/common_dec.h b/media/libwebp/dec/common_dec.h
index 9995f1a51..b158550a8 100644
--- a/media/libwebp/dec/common_dec.h
+++ b/media/libwebp/dec/common_dec.h
@@ -51,4 +51,4 @@ enum { MB_FEATURE_TREE_PROBS = 3,
NUM_PROBAS = 11
};
-#endif // WEBP_DEC_COMMON_DEC_H_
+#endif // WEBP_DEC_COMMON_DEC_H_
diff --git a/media/libwebp/dec/frame_dec.c b/media/libwebp/dec/frame_dec.c
index 57e4d9669..3d1d66274 100644
--- a/media/libwebp/dec/frame_dec.c
+++ b/media/libwebp/dec/frame_dec.c
@@ -338,7 +338,6 @@ void VP8InitDithering(const WebPDecoderOptions* const options,
for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
VP8QuantMatrix* const dqm = &dec->dqm_[s];
if (dqm->uv_quant_ < DITHER_AMP_TAB_SIZE) {
- // TODO(skal): should we specially dither more for uv_quant_ < 0?
const int idx = (dqm->uv_quant_ < 0) ? 0 : dqm->uv_quant_;
dqm->dither_ = (f * kQuantToDitherAmp[idx]) >> 3;
}
@@ -669,15 +668,9 @@ int VP8GetThreadMethod(const WebPDecoderOptions* const options,
(void)height;
assert(headers == NULL || !headers->is_lossless);
#if defined(WEBP_USE_THREAD)
- if (width < MIN_WIDTH_FOR_THREADS) return 0;
- // TODO(skal): tune the heuristic further
-#if 0
- if (height < 2 * width) return 2;
+ if (width >= MIN_WIDTH_FOR_THREADS) return 2;
#endif
- return 2;
-#else // !WEBP_USE_THREAD
return 0;
-#endif
}
#undef MT_CACHE_LINES
diff --git a/media/libwebp/dec/idec_dec.c b/media/libwebp/dec/idec_dec.c
index c9506bc83..ee0d33eac 100644
--- a/media/libwebp/dec/idec_dec.c
+++ b/media/libwebp/dec/idec_dec.c
@@ -140,10 +140,9 @@ static void DoRemap(WebPIDecoder* const idec, ptrdiff_t offset) {
if (NeedCompressedAlpha(idec)) {
ALPHDecoder* const alph_dec = dec->alph_dec_;
dec->alpha_data_ += offset;
- if (alph_dec != NULL) {
+ if (alph_dec != NULL && alph_dec->vp8l_dec_ != NULL) {
if (alph_dec->method_ == ALPHA_LOSSLESS_COMPRESSION) {
VP8LDecoder* const alph_vp8l_dec = alph_dec->vp8l_dec_;
- assert(alph_vp8l_dec != NULL);
assert(dec->alpha_data_size_ >= ALPHA_HEADER_LEN);
VP8LBitReaderSetBuffer(&alph_vp8l_dec->br_,
dec->alpha_data_ + ALPHA_HEADER_LEN,
@@ -449,7 +448,10 @@ static VP8StatusCode DecodeRemaining(WebPIDecoder* const idec) {
VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
VP8Io* const io = &idec->io_;
- assert(dec->ready_);
+ // Make sure partition #0 has been read before, to set dec to ready_.
+ if (!dec->ready_) {
+ return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
+ }
for (; dec->mb_y_ < dec->mb_h_; ++dec->mb_y_) {
if (idec->last_mb_y_ != dec->mb_y_) {
if (!VP8ParseIntraModeRow(&dec->br_, dec)) {
@@ -471,6 +473,12 @@ static VP8StatusCode DecodeRemaining(WebPIDecoder* const idec) {
MemDataSize(&idec->mem_) > MAX_MB_SIZE) {
return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
}
+ // Synchronize the threads.
+ if (dec->mt_method_ > 0) {
+ if (!WebPGetWorkerInterface()->Sync(&dec->worker_)) {
+ return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
+ }
+ }
RestoreContext(&context, dec, token_br);
return VP8_STATUS_SUSPENDED;
}
@@ -489,6 +497,7 @@ static VP8StatusCode DecodeRemaining(WebPIDecoder* const idec) {
}
// Synchronize the thread and check for errors.
if (!VP8ExitCritical(dec, io)) {
+ idec->state_ = STATE_ERROR; // prevent re-entry in IDecError
return IDecError(idec, VP8_STATUS_USER_ABORT);
}
dec->ready_ = 0;
@@ -569,6 +578,10 @@ static VP8StatusCode IDecode(WebPIDecoder* idec) {
status = DecodePartition0(idec);
}
if (idec->state_ == STATE_VP8_DATA) {
+ const VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
+ if (dec == NULL) {
+ return VP8_STATUS_SUSPENDED; // can't continue if we have no decoder.
+ }
status = DecodeRemaining(idec);
}
if (idec->state_ == STATE_VP8L_HEADER) {
diff --git a/media/libwebp/dec/vp8_dec.h b/media/libwebp/dec/vp8_dec.h
index 7b4941d65..03f4415fb 100644
--- a/media/libwebp/dec/vp8_dec.h
+++ b/media/libwebp/dec/vp8_dec.h
@@ -182,4 +182,4 @@ WEBP_EXTERN int VP8LGetInfo(
} // extern "C"
#endif
-#endif /* WEBP_DEC_VP8_DEC_H_ */
+#endif // WEBP_DEC_VP8_DEC_H_
diff --git a/media/libwebp/dec/vp8i_dec.h b/media/libwebp/dec/vp8i_dec.h
index d0ef67b91..fabee44a0 100644
--- a/media/libwebp/dec/vp8i_dec.h
+++ b/media/libwebp/dec/vp8i_dec.h
@@ -32,7 +32,7 @@ extern "C" {
// version numbers
#define DEC_MAJ_VERSION 1
#define DEC_MIN_VERSION 0
-#define DEC_REV_VERSION 0
+#define DEC_REV_VERSION 2
// YUV-cache parameters. Cache is 32-bytes wide (= one cacheline).
// Constraints are: We need to store one 16x16 block of luma samples (y),
@@ -316,4 +316,4 @@ const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
} // extern "C"
#endif
-#endif /* WEBP_DEC_VP8I_DEC_H_ */
+#endif // WEBP_DEC_VP8I_DEC_H_
diff --git a/media/libwebp/dec/vp8l_dec.c b/media/libwebp/dec/vp8l_dec.c
index 3d303fb22..0502cb9a5 100644
--- a/media/libwebp/dec/vp8l_dec.c
+++ b/media/libwebp/dec/vp8l_dec.c
@@ -359,17 +359,22 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
int color_cache_bits, int allow_recursion) {
int i, j;
VP8LBitReader* const br = &dec->br_;
- VP8LBitReader br_tmp;
VP8LMetadata* const hdr = &dec->hdr_;
uint32_t* huffman_image = NULL;
HTreeGroup* htree_groups = NULL;
+ // When reading htrees, some might be unused, as the format allows it.
+ // We will still read them but put them in this htree_group_bogus.
+ HTreeGroup htree_group_bogus;
HuffmanCode* huffman_tables = NULL;
+ HuffmanCode* huffman_tables_bogus = NULL;
HuffmanCode* next = NULL;
int num_htree_groups = 1;
- int num_htree_groups_limit = 1;
+ int num_htree_groups_max = 1;
int max_alphabet_size = 0;
int* code_lengths = NULL;
const int table_size = kTableSize[color_cache_bits];
+ int* mapping = NULL;
+ int ok = 0;
if (allow_recursion && VP8LReadBits(br, 1)) {
// use meta Huffman codes.
@@ -386,21 +391,41 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
// The huffman data is stored in red and green bytes.
const int group = (huffman_image[i] >> 8) & 0xffff;
huffman_image[i] = group;
- if (group >= num_htree_groups) {
- num_htree_groups = group + 1;
+ if (group >= num_htree_groups_max) {
+ num_htree_groups_max = group + 1;
}
}
- // Check the validity of num_htree_groups. If it seems too big, use a
+ // Check the validity of num_htree_groups_max. If it seems too big, use a
// smaller value for later. This will prevent big memory allocations to end
// up with a bad bitstream anyway.
- // The value of 1000 is totally arbitrary. We know that num_htree_groups
+ // The value of 1000 is totally arbitrary. We know that num_htree_groups_max
// is smaller than (1 << 16) and should be smaller than the number of pixels
// (though the format allows it to be bigger).
- if (num_htree_groups > 1000 || num_htree_groups > xsize * ysize) {
- num_htree_groups_limit = (xsize * ysize > 1000) ? 1000 : xsize * ysize;
- br_tmp = dec->br_;
+ if (num_htree_groups_max > 1000 || num_htree_groups_max > xsize * ysize) {
+ // Create a mapping from the used indices to the minimal set of used
+ // values [0, num_htree_groups)
+ mapping = (int*)WebPSafeMalloc(num_htree_groups_max, sizeof(*mapping));
+ if (mapping == NULL) {
+ dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+ goto Error;
+ }
+ // -1 means a value is unmapped, and therefore unused in the Huffman
+ // image.
+ memset(mapping, 0xff, num_htree_groups_max * sizeof(*mapping));
+ for (num_htree_groups = 0, i = 0; i < huffman_pixs; ++i) {
+ // Get the current mapping for the group and remap the Huffman image.
+ int* const mapped_group = &mapping[huffman_image[i]];
+ if (*mapped_group == -1) *mapped_group = num_htree_groups++;
+ huffman_image[i] = *mapped_group;
+ }
+ huffman_tables_bogus = (HuffmanCode*)WebPSafeMalloc(
+ table_size, sizeof(*huffman_tables_bogus));
+ if (huffman_tables_bogus == NULL) {
+ dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+ goto Error;
+ }
} else {
- num_htree_groups_limit = num_htree_groups;
+ num_htree_groups = num_htree_groups_max;
}
}
@@ -419,99 +444,91 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size,
sizeof(*code_lengths));
- // If num_htree_groups_tmp == num_htree_groups, the following loop is executed
- // once.
- // If num_htree_groups_tmp != num_htree_groups, we execute the loop the first
- // time with little memory allocation in the hope that there is a bitstream
- // error. If after num_htree_groups_tmp iterations, no error appears,
- // num_htree_groups is probably the right value so try it out.
- do {
- huffman_tables = (HuffmanCode*)WebPSafeMalloc(
- num_htree_groups_limit * table_size, sizeof(*huffman_tables));
- htree_groups = VP8LHtreeGroupsNew(num_htree_groups_limit);
-
- if (htree_groups == NULL || code_lengths == NULL ||
- huffman_tables == NULL) {
- dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
- goto Error;
- }
+ huffman_tables = (HuffmanCode*)WebPSafeMalloc(num_htree_groups * table_size,
+ sizeof(*huffman_tables));
+ htree_groups = VP8LHtreeGroupsNew(num_htree_groups);
- next = huffman_tables;
- for (i = 0; i < num_htree_groups_limit; ++i) {
- HTreeGroup* const htree_group = &htree_groups[i];
- HuffmanCode** const htrees = htree_group->htrees;
- int size;
- int total_size = 0;
- int is_trivial_literal = 1;
- int max_bits = 0;
- for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
- int alphabet_size = kAlphabetSize[j];
- htrees[j] = next;
- if (j == 0 && color_cache_bits > 0) {
- alphabet_size += 1 << color_cache_bits;
- }
- size = ReadHuffmanCode(alphabet_size, dec, code_lengths, next);
- if (size == 0) {
- goto Error;
- }
- if (is_trivial_literal && kLiteralMap[j] == 1) {
- is_trivial_literal = (next->bits == 0);
- }
- total_size += next->bits;
- next += size;
- if (j <= ALPHA) {
- int local_max_bits = code_lengths[0];
- int k;
- for (k = 1; k < alphabet_size; ++k) {
- if (code_lengths[k] > local_max_bits) {
- local_max_bits = code_lengths[k];
- }
- }
- max_bits += local_max_bits;
- }
+ if (htree_groups == NULL || code_lengths == NULL || huffman_tables == NULL) {
+ dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+ goto Error;
+ }
+
+ next = huffman_tables;
+ for (i = 0; i < num_htree_groups_max; ++i) {
+ // If the index "i" is unused in the Huffman image, read the coefficients
+ // but store them to a bogus htree_group.
+ const int is_bogus = (mapping != NULL && mapping[i] == -1);
+ HTreeGroup* const htree_group =
+ is_bogus ? &htree_group_bogus :
+ &htree_groups[(mapping == NULL) ? i : mapping[i]];
+ HuffmanCode** const htrees = htree_group->htrees;
+ HuffmanCode* huffman_tables_i = is_bogus ? huffman_tables_bogus : next;
+ int size;
+ int total_size = 0;
+ int is_trivial_literal = 1;
+ int max_bits = 0;
+ for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
+ int alphabet_size = kAlphabetSize[j];
+ htrees[j] = huffman_tables_i;
+ if (j == 0 && color_cache_bits > 0) {
+ alphabet_size += 1 << color_cache_bits;
}
- htree_group->is_trivial_literal = is_trivial_literal;
- htree_group->is_trivial_code = 0;
- if (is_trivial_literal) {
- const int red = htrees[RED][0].value;
- const int blue = htrees[BLUE][0].value;
- const int alpha = htrees[ALPHA][0].value;
- htree_group->literal_arb = ((uint32_t)alpha << 24) | (red << 16) | blue;
- if (total_size == 0 && htrees[GREEN][0].value < NUM_LITERAL_CODES) {
- htree_group->is_trivial_code = 1;
- htree_group->literal_arb |= htrees[GREEN][0].value << 8;
+ size =
+ ReadHuffmanCode(alphabet_size, dec, code_lengths, huffman_tables_i);
+ if (size == 0) {
+ goto Error;
+ }
+ if (is_trivial_literal && kLiteralMap[j] == 1) {
+ is_trivial_literal = (huffman_tables_i->bits == 0);
+ }
+ total_size += huffman_tables_i->bits;
+ huffman_tables_i += size;
+ if (j <= ALPHA) {
+ int local_max_bits = code_lengths[0];
+ int k;
+ for (k = 1; k < alphabet_size; ++k) {
+ if (code_lengths[k] > local_max_bits) {
+ local_max_bits = code_lengths[k];
+ }
}
+ max_bits += local_max_bits;
}
- htree_group->use_packed_table =
- !htree_group->is_trivial_code && (max_bits < HUFFMAN_PACKED_BITS);
- if (htree_group->use_packed_table) BuildPackedTable(htree_group);
}
- // If we have survived up to here, num_htree_groups might actually be
- // that big so restart with a proper allocation.
- if (num_htree_groups != num_htree_groups_limit) {
- num_htree_groups_limit = num_htree_groups;
- WebPSafeFree(huffman_tables);
- VP8LHtreeGroupsFree(htree_groups);
- huffman_tables = NULL;
- htree_groups = NULL;
- dec->br_ = br_tmp;
+ if (!is_bogus) next = huffman_tables_i;
+ htree_group->is_trivial_literal = is_trivial_literal;
+ htree_group->is_trivial_code = 0;
+ if (is_trivial_literal) {
+ const int red = htrees[RED][0].value;
+ const int blue = htrees[BLUE][0].value;
+ const int alpha = htrees[ALPHA][0].value;
+ htree_group->literal_arb = ((uint32_t)alpha << 24) | (red << 16) | blue;
+ if (total_size == 0 && htrees[GREEN][0].value < NUM_LITERAL_CODES) {
+ htree_group->is_trivial_code = 1;
+ htree_group->literal_arb |= htrees[GREEN][0].value << 8;
+ }
}
- } while (i != num_htree_groups);
- WebPSafeFree(code_lengths);
+ htree_group->use_packed_table =
+ !htree_group->is_trivial_code && (max_bits < HUFFMAN_PACKED_BITS);
+ if (htree_group->use_packed_table) BuildPackedTable(htree_group);
+ }
+ ok = 1;
- // All OK. Finalize pointers and return.
+ // All OK. Finalize pointers.
hdr->huffman_image_ = huffman_image;
hdr->num_htree_groups_ = num_htree_groups;
hdr->htree_groups_ = htree_groups;
hdr->huffman_tables_ = huffman_tables;
- return 1;
Error:
WebPSafeFree(code_lengths);
- WebPSafeFree(huffman_image);
- WebPSafeFree(huffman_tables);
- VP8LHtreeGroupsFree(htree_groups);
- return 0;
+ WebPSafeFree(huffman_tables_bogus);
+ WebPSafeFree(mapping);
+ if (!ok) {
+ WebPSafeFree(huffman_image);
+ WebPSafeFree(huffman_tables);
+ VP8LHtreeGroupsFree(htree_groups);
+ }
+ return ok;
}
//------------------------------------------------------------------------------
@@ -916,7 +933,11 @@ static WEBP_INLINE void CopyBlock8b(uint8_t* const dst, int dist, int length) {
#endif
break;
case 2:
+#if !defined(WORDS_BIGENDIAN)
memcpy(&pattern, src, sizeof(uint16_t));
+#else
+ pattern = ((uint32_t)src[0] << 8) | src[1];
+#endif
#if defined(__arm__) || defined(_M_ARM)
pattern |= pattern << 16;
#elif defined(WEBP_USE_MIPS_DSP_R2)
@@ -1555,7 +1576,6 @@ int VP8LDecodeAlphaHeader(ALPHDecoder* const alph_dec,
if (dec == NULL) return 0;
assert(alph_dec != NULL);
- alph_dec->vp8l_dec_ = dec;
dec->width_ = alph_dec->width_;
dec->height_ = alph_dec->height_;
@@ -1587,11 +1607,12 @@ int VP8LDecodeAlphaHeader(ALPHDecoder* const alph_dec,
if (!ok) goto Err;
+ // Only set here, once we are sure it is valid (to avoid thread races).
+ alph_dec->vp8l_dec_ = dec;
return 1;
Err:
- VP8LDelete(alph_dec->vp8l_dec_);
- alph_dec->vp8l_dec_ = NULL;
+ VP8LDelete(dec);
return 0;
}
diff --git a/media/libwebp/dec/vp8li_dec.h b/media/libwebp/dec/vp8li_dec.h
index ed89a02a9..2b9c95a44 100644
--- a/media/libwebp/dec/vp8li_dec.h
+++ b/media/libwebp/dec/vp8li_dec.h
@@ -132,4 +132,4 @@ void VP8LDelete(VP8LDecoder* const dec);
} // extern "C"
#endif
-#endif /* WEBP_DEC_VP8LI_DEC_H_ */
+#endif // WEBP_DEC_VP8LI_DEC_H_
diff --git a/media/libwebp/dec/webpi_dec.h b/media/libwebp/dec/webpi_dec.h
index d0a045e70..83d7444e5 100644
--- a/media/libwebp/dec/webpi_dec.h
+++ b/media/libwebp/dec/webpi_dec.h
@@ -130,4 +130,4 @@ int WebPAvoidSlowMemory(const WebPDecBuffer* const output,
} // extern "C"
#endif
-#endif /* WEBP_DEC_WEBPI_DEC_H_ */
+#endif // WEBP_DEC_WEBPI_DEC_H_
diff --git a/media/libwebp/demux/demux.c b/media/libwebp/demux/demux.c
index aec2a0a2d..2034024d0 100644
--- a/media/libwebp/demux/demux.c
+++ b/media/libwebp/demux/demux.c
@@ -25,7 +25,7 @@
#define DMUX_MAJ_VERSION 1
#define DMUX_MIN_VERSION 0
-#define DMUX_REV_VERSION 0
+#define DMUX_REV_VERSION 2
typedef struct {
size_t start_; // start location of the data
diff --git a/media/libwebp/dsp/dsp.h b/media/libwebp/dsp/dsp.h
index 537ea2044..4e509bd2c 100644
--- a/media/libwebp/dsp/dsp.h
+++ b/media/libwebp/dsp/dsp.h
@@ -76,10 +76,6 @@ extern "C" {
#define WEBP_USE_SSE41
#endif
-#if defined(__AVX2__) || defined(WEBP_HAVE_AVX2)
-#define WEBP_USE_AVX2
-#endif
-
// The intrinsics currently cause compiler errors with arm-nacl-gcc and the
// inline assembly would need to be modified for use with Native Client.
#if (defined(__ARM_NEON__) || \
@@ -679,4 +675,4 @@ void VP8FiltersInit(void);
} // extern "C"
#endif
-#endif /* WEBP_DSP_DSP_H_ */
+#endif // WEBP_DSP_DSP_H_
diff --git a/media/libwebp/dsp/lossless.c b/media/libwebp/dsp/lossless.c
index 93ccecdfd..1a1523d22 100644
--- a/media/libwebp/dsp/lossless.c
+++ b/media/libwebp/dsp/lossless.c
@@ -23,8 +23,6 @@
#include "../dsp/lossless.h"
#include "../dsp/lossless_common.h"
-#define MAX_DIFF_COST (1e30f)
-
//------------------------------------------------------------------------------
// Image transforms.
diff --git a/media/libwebp/dsp/lossless.h b/media/libwebp/dsp/lossless.h
index 4a1d1e0dd..6db5fafc1 100644
--- a/media/libwebp/dsp/lossless.h
+++ b/media/libwebp/dsp/lossless.h
@@ -163,7 +163,7 @@ extern VP8LCostCombinedFunc VP8LExtraCostCombined;
extern VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
typedef struct { // small struct to hold counters
- int counts[2]; // index: 0=zero steak, 1=non-zero streak
+ int counts[2]; // index: 0=zero streak, 1=non-zero streak
int streaks[2][2]; // [zero/non-zero][streak<3 / streak>=3]
} VP8LStreaks;
@@ -194,10 +194,14 @@ extern VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
void VP8LBitsEntropyUnrefined(const uint32_t* const array, int n,
VP8LBitEntropy* const entropy);
-typedef void (*VP8LHistogramAddFunc)(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- VP8LHistogram* const out);
-extern VP8LHistogramAddFunc VP8LHistogramAdd;
+typedef void (*VP8LAddVectorFunc)(const uint32_t* a, const uint32_t* b,
+ uint32_t* out, int size);
+extern VP8LAddVectorFunc VP8LAddVector;
+typedef void (*VP8LAddVectorEqFunc)(const uint32_t* a, uint32_t* out, int size);
+extern VP8LAddVectorEqFunc VP8LAddVectorEq;
+void VP8LHistogramAdd(const VP8LHistogram* const a,
+ const VP8LHistogram* const b,
+ VP8LHistogram* const out);
// -----------------------------------------------------------------------------
// PrefixEncode()
diff --git a/media/libwebp/dsp/msa_macro.h b/media/libwebp/dsp/msa_macro.h
index dfacda6cc..de026a1d9 100644
--- a/media/libwebp/dsp/msa_macro.h
+++ b/media/libwebp/dsp/msa_macro.h
@@ -1389,4 +1389,4 @@ static WEBP_INLINE uint32_t func_hadd_uh_u32(v8u16 in) {
} while (0)
#define AVER_UB2_UB(...) AVER_UB2(v16u8, __VA_ARGS__)
-#endif /* WEBP_DSP_MSA_MACRO_H_ */
+#endif // WEBP_DSP_MSA_MACRO_H_
diff --git a/media/libwebp/dsp/quant.h b/media/libwebp/dsp/quant.h
new file mode 100644
index 000000000..b82e728a5
--- /dev/null
+++ b/media/libwebp/dsp/quant.h
@@ -0,0 +1,70 @@
+// Copyright 2018 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+
+#ifndef WEBP_DSP_QUANT_H_
+#define WEBP_DSP_QUANT_H_
+
+#include "../dsp/dsp.h"
+#include "../webp/types.h"
+
+#if defined(WEBP_USE_NEON) && !defined(WEBP_ANDROID_NEON) && \
+ !defined(WEBP_HAVE_NEON_RTCD)
+#include <arm_neon.h>
+
+#define IsFlat IsFlat_NEON
+
+static uint32x2_t horizontal_add_uint32x4(const uint32x4_t a) {
+ const uint64x2_t b = vpaddlq_u32(a);
+ return vadd_u32(vreinterpret_u32_u64(vget_low_u64(b)),
+ vreinterpret_u32_u64(vget_high_u64(b)));
+}
+
+static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks,
+ int thresh) {
+ const int16x8_t tst_ones = vdupq_n_s16(-1);
+ uint32x4_t sum = vdupq_n_u32(0);
+
+ for (int i = 0; i < num_blocks; ++i) {
+ // Set DC to zero.
+ const int16x8_t a_0 = vsetq_lane_s16(0, vld1q_s16(levels), 0);
+ const int16x8_t a_1 = vld1q_s16(levels + 8);
+
+ const uint16x8_t b_0 = vshrq_n_u16(vtstq_s16(a_0, tst_ones), 15);
+ const uint16x8_t b_1 = vshrq_n_u16(vtstq_s16(a_1, tst_ones), 15);
+
+ sum = vpadalq_u16(sum, b_0);
+ sum = vpadalq_u16(sum, b_1);
+
+ levels += 16;
+ }
+ return thresh >= (int32_t)vget_lane_u32(horizontal_add_uint32x4(sum), 0);
+}
+
+#else
+
+#define IsFlat IsFlat_C
+
+static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks,
+ int thresh) {
+ int score = 0;
+ while (num_blocks-- > 0) { // TODO(skal): refine positional scoring?
+ int i;
+ for (i = 1; i < 16; ++i) { // omit DC, we're only interested in AC
+ score += (levels[i] != 0);
+ if (score > thresh) return 0;
+ }
+ levels += 16;
+ }
+ return 1;
+}
+
+#endif // defined(WEBP_USE_NEON) && !defined(WEBP_ANDROID_NEON) &&
+ // !defined(WEBP_HAVE_NEON_RTCD)
+
+#endif // WEBP_DSP_QUANT_H_
diff --git a/media/libwebp/dsp/rescaler.c b/media/libwebp/dsp/rescaler.c
index f70e6beef..6bf387f8e 100644
--- a/media/libwebp/dsp/rescaler.c
+++ b/media/libwebp/dsp/rescaler.c
@@ -21,6 +21,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
//------------------------------------------------------------------------------
// Row import
@@ -138,7 +139,7 @@ void WebPRescalerExportRowShrink_C(WebPRescaler* const wrk) {
if (yscale) {
for (x_out = 0; x_out < x_out_max; ++x_out) {
const uint32_t frac = (uint32_t)MULT_FIX(frow[x_out], yscale);
- const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(irow[x_out] - frac, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac; // new fractional start
@@ -153,6 +154,7 @@ void WebPRescalerExportRowShrink_C(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR
#undef MULT_FIX
#undef ROUNDER
diff --git a/media/libwebp/dsp/rescaler_neon.c b/media/libwebp/dsp/rescaler_neon.c
index 835e646c1..b560d0cdc 100644
--- a/media/libwebp/dsp/rescaler_neon.c
+++ b/media/libwebp/dsp/rescaler_neon.c
@@ -22,6 +22,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX_C(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR_C(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
#define LOAD_32x4(SRC, DST) const uint32x4_t DST = vld1q_u32((SRC))
#define LOAD_32x8(SRC, DST0, DST1) \
@@ -35,8 +36,11 @@
#if (WEBP_RESCALER_RFIX == 32)
#define MAKE_HALF_CST(C) vdupq_n_s32((int32_t)((C) >> 1))
-#define MULT_FIX(A, B) /* note: B is actualy scale>>1. See MAKE_HALF_CST */ \
+// note: B is actualy scale>>1. See MAKE_HALF_CST
+#define MULT_FIX(A, B) \
vreinterpretq_u32_s32(vqrdmulhq_s32(vreinterpretq_s32_u32((A)), (B)))
+#define MULT_FIX_FLOOR(A, B) \
+ vreinterpretq_u32_s32(vqdmulhq_s32(vreinterpretq_s32_u32((A)), (B)))
#else
#error "MULT_FIX/WEBP_RESCALER_RFIX need some more work"
#endif
@@ -135,8 +139,8 @@ static void RescalerExportRowShrink_NEON(WebPRescaler* const wrk) {
const uint32x4_t A1 = MULT_FIX(in1, yscale_half);
const uint32x4_t B0 = vqsubq_u32(in2, A0);
const uint32x4_t B1 = vqsubq_u32(in3, A1);
- const uint32x4_t C0 = MULT_FIX(B0, fxy_scale_half);
- const uint32x4_t C1 = MULT_FIX(B1, fxy_scale_half);
+ const uint32x4_t C0 = MULT_FIX_FLOOR(B0, fxy_scale_half);
+ const uint32x4_t C1 = MULT_FIX_FLOOR(B1, fxy_scale_half);
const uint16x4_t D0 = vmovn_u32(C0);
const uint16x4_t D1 = vmovn_u32(C1);
const uint8x8_t E = vmovn_u16(vcombine_u16(D0, D1));
@@ -145,7 +149,7 @@ static void RescalerExportRowShrink_NEON(WebPRescaler* const wrk) {
}
for (; x_out < x_out_max; ++x_out) {
const uint32_t frac = (uint32_t)MULT_FIX_C(frow[x_out], yscale);
- const int v = (int)MULT_FIX_C(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR_C(irow[x_out] - frac, fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac; // new fractional start
@@ -170,6 +174,12 @@ static void RescalerExportRowShrink_NEON(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR_C
+#undef MULT_FIX_C
+#undef MULT_FIX_FLOOR
+#undef MULT_FIX
+#undef ROUNDER
+
//------------------------------------------------------------------------------
extern void WebPRescalerDspInitNEON(void);
diff --git a/media/libwebp/dsp/rescaler_sse2.c b/media/libwebp/dsp/rescaler_sse2.c
index 1306f8457..2d35f76ab 100644
--- a/media/libwebp/dsp/rescaler_sse2.c
+++ b/media/libwebp/dsp/rescaler_sse2.c
@@ -25,6 +25,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
// input: 8 bytes ABCDEFGH -> output: A0E0B0F0C0G0D0H0
static void LoadTwoPixels_SSE2(const uint8_t* const src, __m128i* out) {
@@ -224,6 +225,35 @@ static WEBP_INLINE void ProcessRow_SSE2(const __m128i* const A0,
_mm_storel_epi64((__m128i*)dst, G);
}
+static WEBP_INLINE void ProcessRow_Floor_SSE2(const __m128i* const A0,
+ const __m128i* const A1,
+ const __m128i* const A2,
+ const __m128i* const A3,
+ const __m128i* const mult,
+ uint8_t* const dst) {
+ const __m128i mask = _mm_set_epi32(0xffffffffu, 0, 0xffffffffu, 0);
+ const __m128i B0 = _mm_mul_epu32(*A0, *mult);
+ const __m128i B1 = _mm_mul_epu32(*A1, *mult);
+ const __m128i B2 = _mm_mul_epu32(*A2, *mult);
+ const __m128i B3 = _mm_mul_epu32(*A3, *mult);
+ const __m128i D0 = _mm_srli_epi64(B0, WEBP_RESCALER_RFIX);
+ const __m128i D1 = _mm_srli_epi64(B1, WEBP_RESCALER_RFIX);
+#if (WEBP_RESCALER_RFIX < 32)
+ const __m128i D2 =
+ _mm_and_si128(_mm_slli_epi64(B2, 32 - WEBP_RESCALER_RFIX), mask);
+ const __m128i D3 =
+ _mm_and_si128(_mm_slli_epi64(B3, 32 - WEBP_RESCALER_RFIX), mask);
+#else
+ const __m128i D2 = _mm_and_si128(B2, mask);
+ const __m128i D3 = _mm_and_si128(B3, mask);
+#endif
+ const __m128i E0 = _mm_or_si128(D0, D2);
+ const __m128i E1 = _mm_or_si128(D1, D3);
+ const __m128i F = _mm_packs_epi32(E0, E1);
+ const __m128i G = _mm_packus_epi16(F, F);
+ _mm_storel_epi64((__m128i*)dst, G);
+}
+
static void RescalerExportRowExpand_SSE2(WebPRescaler* const wrk) {
int x_out;
uint8_t* const dst = wrk->dst;
@@ -322,12 +352,12 @@ static void RescalerExportRowShrink_SSE2(WebPRescaler* const wrk) {
const __m128i G1 = _mm_or_si128(D1, F3);
_mm_storeu_si128((__m128i*)(irow + x_out + 0), G0);
_mm_storeu_si128((__m128i*)(irow + x_out + 4), G1);
- ProcessRow_SSE2(&E0, &E1, &E2, &E3, &mult_xy, dst + x_out);
+ ProcessRow_Floor_SSE2(&E0, &E1, &E2, &E3, &mult_xy, dst + x_out);
}
}
for (; x_out < x_out_max; ++x_out) {
const uint32_t frac = (int)MULT_FIX(frow[x_out], yscale);
- const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(irow[x_out] - frac, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac; // new fractional start
@@ -352,6 +382,7 @@ static void RescalerExportRowShrink_SSE2(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR
#undef MULT_FIX
#undef ROUNDER
diff --git a/media/libwebp/dsp/yuv.h b/media/libwebp/dsp/yuv.h
index b4c5d0b6c..947b89e13 100644
--- a/media/libwebp/dsp/yuv.h
+++ b/media/libwebp/dsp/yuv.h
@@ -207,4 +207,4 @@ static WEBP_INLINE int VP8RGBToV(int r, int g, int b, int rounding) {
} // extern "C"
#endif
-#endif /* WEBP_DSP_YUV_H_ */
+#endif // WEBP_DSP_YUV_H_
diff --git a/media/libwebp/enc/cost_enc.h b/media/libwebp/enc/cost_enc.h
index d731ee2fa..114823234 100644
--- a/media/libwebp/enc/cost_enc.h
+++ b/media/libwebp/enc/cost_enc.h
@@ -79,4 +79,4 @@ extern const uint16_t VP8FixedCostsI4[NUM_BMODES][NUM_BMODES][NUM_BMODES];
} // extern "C"
#endif
-#endif /* WEBP_ENC_COST_ENC_H_ */
+#endif // WEBP_ENC_COST_ENC_H_
diff --git a/media/libwebp/enc/histogram_enc.h b/media/libwebp/enc/histogram_enc.h
index 4fbb73702..ef39b7c6d 100644
--- a/media/libwebp/enc/histogram_enc.h
+++ b/media/libwebp/enc/histogram_enc.h
@@ -44,6 +44,7 @@ typedef struct {
double literal_cost_; // Cached values of dominant entropy costs:
double red_cost_; // literal, red & blue.
double blue_cost_;
+ uint8_t is_used_[5]; // 5 for literal, red, blue, alpha, distance
} VP8LHistogram;
// Collection of histograms with fixed capacity, allocated as one
@@ -67,7 +68,9 @@ void VP8LHistogramCreate(VP8LHistogram* const p,
int VP8LGetHistogramSize(int palette_code_bits);
// Set the palette_code_bits and reset the stats.
-void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits);
+// If init_arrays is true, the arrays are also filled with 0's.
+void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits,
+ int init_arrays);
// Collect all the references into a histogram (without reset)
void VP8LHistogramStoreRefs(const VP8LBackwardRefs* const refs,
@@ -83,6 +86,9 @@ void VP8LFreeHistogramSet(VP8LHistogramSet* const histo);
// using 'cache_bits'. Return NULL in case of memory error.
VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits);
+// Set the histograms in set to 0.
+void VP8LHistogramSetClear(VP8LHistogramSet* const set);
+
// Allocate and initialize histogram object with specified 'cache_bits'.
// Returns NULL in case of memory error.
// Special case of VP8LAllocateHistogramSet, with size equals 1.
@@ -113,7 +119,7 @@ double VP8LBitsEntropy(const uint32_t* const array, int n);
// Estimate how many bits the combined entropy of literals and distance
// approximately maps to.
-double VP8LHistogramEstimateBits(const VP8LHistogram* const p);
+double VP8LHistogramEstimateBits(VP8LHistogram* const p);
#ifdef __cplusplus
}
diff --git a/media/libwebp/enc/vp8i_enc.h b/media/libwebp/enc/vp8i_enc.h
index 8972d9f10..009ccf223 100644
--- a/media/libwebp/enc/vp8i_enc.h
+++ b/media/libwebp/enc/vp8i_enc.h
@@ -32,7 +32,7 @@ extern "C" {
// version numbers
#define ENC_MAJ_VERSION 1
#define ENC_MIN_VERSION 0
-#define ENC_REV_VERSION 0
+#define ENC_REV_VERSION 2
enum { MAX_LF_LEVELS = 64, // Maximum loop filter level
MAX_VARIABLE_LEVEL = 67, // last (inclusive) level with variable cost
@@ -278,7 +278,7 @@ int VP8IteratorIsDone(const VP8EncIterator* const it);
// Import uncompressed samples from source.
// If tmp_32 is not NULL, import boundary samples too.
// tmp_32 is a 32-bytes scratch buffer that must be aligned in memory.
-void VP8IteratorImport(VP8EncIterator* const it, uint8_t* tmp_32);
+void VP8IteratorImport(VP8EncIterator* const it, uint8_t* const tmp_32);
// export decimated samples
void VP8IteratorExport(const VP8EncIterator* const it);
// go to next macroblock. Returns false if not finished.
@@ -515,4 +515,4 @@ void WebPCleanupTransparentAreaLossless(WebPPicture* const pic);
} // extern "C"
#endif
-#endif /* WEBP_ENC_VP8I_ENC_H_ */
+#endif // WEBP_ENC_VP8I_ENC_H_
diff --git a/media/libwebp/enc/vp8li_enc.h b/media/libwebp/enc/vp8li_enc.h
index 5dcba9ef0..1e259eda7 100644
--- a/media/libwebp/enc/vp8li_enc.h
+++ b/media/libwebp/enc/vp8li_enc.h
@@ -115,4 +115,4 @@ void VP8LColorSpaceTransform(int width, int height, int bits, int quality,
} // extern "C"
#endif
-#endif /* WEBP_ENC_VP8LI_ENC_H_ */
+#endif // WEBP_ENC_VP8LI_ENC_H_
diff --git a/media/libwebp/utils/bit_reader_inl_utils.h b/media/libwebp/utils/bit_reader_inl_utils.h
index 2bb9a1918..8d1249ef9 100644
--- a/media/libwebp/utils/bit_reader_inl_utils.h
+++ b/media/libwebp/utils/bit_reader_inl_utils.h
@@ -187,4 +187,4 @@ static WEBP_INLINE int VP8GetBitAlt(VP8BitReader* const br, int prob) {
} // extern "C"
#endif
-#endif // WEBP_UTILS_BIT_READER_INL_UTILS_H_
+#endif // WEBP_UTILS_BIT_READER_INL_UTILS_H_
diff --git a/media/libwebp/utils/bit_reader_utils.h b/media/libwebp/utils/bit_reader_utils.h
index 53e9db6ad..377a7821a 100644
--- a/media/libwebp/utils/bit_reader_utils.h
+++ b/media/libwebp/utils/bit_reader_utils.h
@@ -172,4 +172,4 @@ static WEBP_INLINE void VP8LFillBitWindow(VP8LBitReader* const br) {
} // extern "C"
#endif
-#endif /* WEBP_UTILS_BIT_READER_UTILS_H_ */
+#endif // WEBP_UTILS_BIT_READER_UTILS_H_
diff --git a/media/libwebp/utils/bit_writer_utils.h b/media/libwebp/utils/bit_writer_utils.h
index 9e9c2b729..b854fae73 100644
--- a/media/libwebp/utils/bit_writer_utils.h
+++ b/media/libwebp/utils/bit_writer_utils.h
@@ -151,4 +151,4 @@ static WEBP_INLINE void VP8LPutBits(VP8LBitWriter* const bw,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_BIT_WRITER_UTILS_H_ */
+#endif // WEBP_UTILS_BIT_WRITER_UTILS_H_
diff --git a/media/libwebp/utils/filters_utils.h b/media/libwebp/utils/filters_utils.h
index 9466030e5..891771ddc 100644
--- a/media/libwebp/utils/filters_utils.h
+++ b/media/libwebp/utils/filters_utils.h
@@ -29,4 +29,4 @@ WEBP_FILTER_TYPE WebPEstimateBestFilter(const uint8_t* data,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_FILTERS_UTILS_H_ */
+#endif // WEBP_UTILS_FILTERS_UTILS_H_
diff --git a/media/libwebp/utils/quant_levels_dec_utils.c b/media/libwebp/utils/quant_levels_dec_utils.c
index 5c498382d..a60de3444 100644
--- a/media/libwebp/utils/quant_levels_dec_utils.c
+++ b/media/libwebp/utils/quant_levels_dec_utils.c
@@ -261,9 +261,15 @@ static void CleanupParams(SmoothParams* const p) {
int WebPDequantizeLevels(uint8_t* const data, int width, int height, int stride,
int strength) {
- const int radius = 4 * strength / 100;
+ int radius = 4 * strength / 100;
+
if (strength < 0 || strength > 100) return 0;
if (data == NULL || width <= 0 || height <= 0) return 0; // bad params
+
+ // limit the filter size to not exceed the image dimensions
+ if (2 * radius + 1 > width) radius = (width - 1) >> 1;
+ if (2 * radius + 1 > height) radius = (height - 1) >> 1;
+
if (radius > 0) {
SmoothParams p;
memset(&p, 0, sizeof(p));
diff --git a/media/libwebp/utils/quant_levels_dec_utils.h b/media/libwebp/utils/quant_levels_dec_utils.h
index 4a59e06fe..c05376c67 100644
--- a/media/libwebp/utils/quant_levels_dec_utils.h
+++ b/media/libwebp/utils/quant_levels_dec_utils.h
@@ -32,4 +32,4 @@ int WebPDequantizeLevels(uint8_t* const data, int width, int height, int stride,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_ */
+#endif // WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_
diff --git a/media/libwebp/utils/quant_levels_utils.h b/media/libwebp/utils/quant_levels_utils.h
index 837bd2730..52a25a5f9 100644
--- a/media/libwebp/utils/quant_levels_utils.h
+++ b/media/libwebp/utils/quant_levels_utils.h
@@ -33,4 +33,4 @@ int QuantizeLevels(uint8_t* const data, int width, int height, int num_levels,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_QUANT_LEVELS_UTILS_H_ */
+#endif // WEBP_UTILS_QUANT_LEVELS_UTILS_H_
diff --git a/media/libwebp/utils/random_utils.h b/media/libwebp/utils/random_utils.h
index 7b58de8c9..6688d2801 100644
--- a/media/libwebp/utils/random_utils.h
+++ b/media/libwebp/utils/random_utils.h
@@ -60,4 +60,4 @@ static WEBP_INLINE int VP8RandomBits(VP8Random* const rg, int num_bits) {
} // extern "C"
#endif
-#endif /* WEBP_UTILS_RANDOM_UTILS_H_ */
+#endif // WEBP_UTILS_RANDOM_UTILS_H_
diff --git a/media/libwebp/utils/rescaler_utils.h b/media/libwebp/utils/rescaler_utils.h
index 1c7b31d7f..b5d176ecf 100644
--- a/media/libwebp/utils/rescaler_utils.h
+++ b/media/libwebp/utils/rescaler_utils.h
@@ -98,4 +98,4 @@ int WebPRescalerHasPendingOutput(const WebPRescaler* const rescaler) {
} // extern "C"
#endif
-#endif /* WEBP_UTILS_RESCALER_UTILS_H_ */
+#endif // WEBP_UTILS_RESCALER_UTILS_H_
diff --git a/media/libwebp/utils/thread_utils.h b/media/libwebp/utils/thread_utils.h
index 0e88c2470..eb788f6e0 100644
--- a/media/libwebp/utils/thread_utils.h
+++ b/media/libwebp/utils/thread_utils.h
@@ -87,4 +87,4 @@ WEBP_EXTERN const WebPWorkerInterface* WebPGetWorkerInterface(void);
} // extern "C"
#endif
-#endif /* WEBP_UTILS_THREAD_UTILS_H_ */
+#endif // WEBP_UTILS_THREAD_UTILS_H_
diff --git a/media/libwebp/utils/utils.h b/media/libwebp/utils/utils.h
index 27dc7e090..d22151b0f 100644
--- a/media/libwebp/utils/utils.h
+++ b/media/libwebp/utils/utils.h
@@ -107,19 +107,6 @@ static WEBP_INLINE void PutLE32(uint8_t* const data, uint32_t val) {
PutLE16(data + 2, (int)(val >> 16));
}
-// Returns 31 ^ clz(n) = log2(n). This is the default C-implementation, either
-// based on table or not. Can be used as fallback if clz() is not available.
-#define WEBP_NEED_LOG_TABLE_8BIT
-extern const uint8_t WebPLogTable8bit[256];
-static WEBP_INLINE int WebPLog2FloorC(uint32_t n) {
- int log_value = 0;
- while (n >= 256) {
- log_value += 8;
- n >>= 8;
- }
- return log_value + WebPLogTable8bit[n];
-}
-
// Returns (int)floor(log2(n)). n must be > 0.
// use GNU builtins where available.
#if defined(__GNUC__) && \
@@ -138,6 +125,19 @@ static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
return first_set_bit;
}
#else // default: use the C-version.
+// Returns 31 ^ clz(n) = log2(n). This is the default C-implementation, either
+// based on table or not. Can be used as fallback if clz() is not available.
+#define WEBP_NEED_LOG_TABLE_8BIT
+extern const uint8_t WebPLogTable8bit[256];
+static WEBP_INLINE int WebPLog2FloorC(uint32_t n) {
+ int log_value = 0;
+ while (n >= 256) {
+ log_value += 8;
+ n >>= 8;
+ }
+ return log_value + WebPLogTable8bit[n];
+}
+
static WEBP_INLINE int BitsLog2Floor(uint32_t n) { return WebPLog2FloorC(n); }
#endif
@@ -175,4 +175,4 @@ WEBP_EXTERN int WebPGetColorPalette(const struct WebPPicture* const pic,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_UTILS_H_ */
+#endif // WEBP_UTILS_UTILS_H_
diff --git a/media/libwebp/webp/decode.h b/media/libwebp/webp/decode.h
index 2165e96c9..ae8bfe840 100644
--- a/media/libwebp/webp/decode.h
+++ b/media/libwebp/webp/decode.h
@@ -42,6 +42,12 @@ WEBP_EXTERN int WebPGetDecoderVersion(void);
// This function will also validate the header, returning true on success,
// false otherwise. '*width' and '*height' are only valid on successful return.
// Pointers 'width' and 'height' can be passed NULL if deemed irrelevant.
+// Note: The following chunk sequences (before the raw VP8/VP8L data) are
+// considered valid by this function:
+// RIFF + VP8(L)
+// RIFF + VP8X + (optional chunks) + VP8(L)
+// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose.
+// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose.
WEBP_EXTERN int WebPGetInfo(const uint8_t* data, size_t data_size,
int* width, int* height);
@@ -425,6 +431,12 @@ WEBP_EXTERN VP8StatusCode WebPGetFeaturesInternal(
// Returns VP8_STATUS_OK when the features are successfully retrieved. Returns
// VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the
// features from headers. Returns error in other cases.
+// Note: The following chunk sequences (before the raw VP8/VP8L data) are
+// considered valid by this function:
+// RIFF + VP8(L)
+// RIFF + VP8X + (optional chunks) + VP8(L)
+// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose.
+// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose.
static WEBP_INLINE VP8StatusCode WebPGetFeatures(
const uint8_t* data, size_t data_size,
WebPBitstreamFeatures* features) {
@@ -491,4 +503,4 @@ WEBP_EXTERN VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size,
} // extern "C"
#endif
-#endif /* WEBP_WEBP_DECODE_H_ */
+#endif // WEBP_WEBP_DECODE_H_
diff --git a/media/libwebp/webp/demux.h b/media/libwebp/webp/demux.h
index 555d64133..846eeb15a 100644
--- a/media/libwebp/webp/demux.h
+++ b/media/libwebp/webp/demux.h
@@ -360,4 +360,4 @@ WEBP_EXTERN void WebPAnimDecoderDelete(WebPAnimDecoder* dec);
} // extern "C"
#endif
-#endif /* WEBP_WEBP_DEMUX_H_ */
+#endif // WEBP_WEBP_DEMUX_H_
diff --git a/media/libwebp/webp/encode.h b/media/libwebp/webp/encode.h
index 7ec3543dc..549cf0773 100644
--- a/media/libwebp/webp/encode.h
+++ b/media/libwebp/webp/encode.h
@@ -542,4 +542,4 @@ WEBP_EXTERN int WebPEncode(const WebPConfig* config, WebPPicture* picture);
} // extern "C"
#endif
-#endif /* WEBP_WEBP_ENCODE_H_ */
+#endif // WEBP_WEBP_ENCODE_H_
diff --git a/media/libwebp/webp/format_constants.h b/media/libwebp/webp/format_constants.h
index 329fc8a3b..eca6981a4 100644
--- a/media/libwebp/webp/format_constants.h
+++ b/media/libwebp/webp/format_constants.h
@@ -84,4 +84,4 @@ typedef enum {
// overflow a uint32_t.
#define MAX_CHUNK_PAYLOAD (~0U - CHUNK_HEADER_SIZE - 1)
-#endif /* WEBP_WEBP_FORMAT_CONSTANTS_H_ */
+#endif // WEBP_WEBP_FORMAT_CONSTANTS_H_
diff --git a/media/libwebp/webp/mux.h b/media/libwebp/webp/mux.h
index 28bb4a41c..66096a92e 100644
--- a/media/libwebp/webp/mux.h
+++ b/media/libwebp/webp/mux.h
@@ -527,4 +527,4 @@ WEBP_EXTERN void WebPAnimEncoderDelete(WebPAnimEncoder* enc);
} // extern "C"
#endif
-#endif /* WEBP_WEBP_MUX_H_ */
+#endif // WEBP_WEBP_MUX_H_
diff --git a/media/libwebp/webp/mux_types.h b/media/libwebp/webp/mux_types.h
index b37e2c67a..ceea77dfc 100644
--- a/media/libwebp/webp/mux_types.h
+++ b/media/libwebp/webp/mux_types.h
@@ -95,4 +95,4 @@ static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {
} // extern "C"
#endif
-#endif /* WEBP_WEBP_MUX_TYPES_H_ */
+#endif // WEBP_WEBP_MUX_TYPES_H_
diff --git a/media/libwebp/webp/types.h b/media/libwebp/webp/types.h
index 989a763f0..0ce2622e4 100644
--- a/media/libwebp/webp/types.h
+++ b/media/libwebp/webp/types.h
@@ -49,4 +49,4 @@ typedef long long int int64_t;
// Macro to check ABI compatibility (same major revision number)
#define WEBP_ABI_IS_INCOMPATIBLE(a, b) (((a) >> 8) != ((b) >> 8))
-#endif /* WEBP_WEBP_TYPES_H_ */
+#endif // WEBP_WEBP_TYPES_H_
diff --git a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
index 43d10ca86..f31e2edb3 100644
--- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
+++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
@@ -62,7 +62,6 @@
#include "nsDOMDataChannel.h"
#include "mozilla/dom/Performance.h"
#include "mozilla/TimeStamp.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/Preferences.h"
#include "mozilla/PublicSSL.h"
#include "nsXULAppAPI.h"
@@ -2167,9 +2166,6 @@ PeerConnectionImpl::SetRemoteDescription(int32_t action, const char* aSDP)
RemoveOldRemoteTracks(pco);
pco->OnSetRemoteDescriptionSuccess(jrv);
-#if !defined(MOZILLA_EXTERNAL_LINKAGE)
- startCallTelem();
-#endif
}
UpdateSignalingState(sdpType == mozilla::kJsepSdpRollback);
@@ -2992,12 +2988,6 @@ PeerConnectionImpl::PluginCrash(uint32_t aPluginID,
return true;
}
-void
-PeerConnectionImpl::RecordEndOfCallTelemetry() const
-{
- /* STUB */
-}
-
nsresult
PeerConnectionImpl::CloseInt()
{
@@ -3014,7 +3004,6 @@ PeerConnectionImpl::CloseInt()
if (!mPrivateWindow) {
RecordLongtermICEStatistics();
}
- RecordEndOfCallTelemetry();
CSFLogInfo(logTag, "%s: Closing PeerConnectionImpl %s; "
"ending call", __FUNCTION__, mHandle.c_str());
if (mJsepSession) {
@@ -3110,9 +3099,6 @@ PeerConnectionImpl::SetSignalingState_m(PCImplSignalingState aSignalingState,
fireNegotiationNeeded = true;
}
- // Telemetry: record info on the current state of streams/renegotiations/etc
- // Note: this code gets run on rollbacks as well!
-
// Update the max channels used with each direction for each type
uint16_t receiving[SdpMediaSection::kMediaTypes];
uint16_t sending[SdpMediaSection::kMediaTypes];
@@ -3967,14 +3953,6 @@ PeerConnectionImpl::IceStreamReady(NrIceMediaStream *aStream)
CSFLogDebug(logTag, "%s: %s", __FUNCTION__, aStream->name().c_str());
}
-#if !defined(MOZILLA_EXTERNAL_LINKAGE)
-//Telemetry for when calls start
-void
-PeerConnectionImpl::startCallTelem() {
- /* STUB */
-}
-#endif
-
NS_IMETHODIMP
PeerConnectionImpl::GetLocalStreams(nsTArray<RefPtr<DOMMediaStream > >& result)
{
diff --git a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h
index c29d08180..1dcc70519 100644
--- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h
+++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h
@@ -594,8 +594,6 @@ public:
bool PluginCrash(uint32_t aPluginID,
const nsAString& aPluginName);
- void RecordEndOfCallTelemetry() const;
-
nsresult InitializeDataChannel();
NS_IMETHODIMP_TO_ERRORRESULT_RETREF(nsDOMDataChannel,
@@ -647,9 +645,6 @@ public:
bool HasMedia() const;
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
- // initialize telemetry for when calls start
- void startCallTelem();
-
nsresult BuildStatsQuery_m(
mozilla::dom::MediaStreamTrack *aSelector,
RTCStatsQuery *query);
diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js
index a841bde55..f6e90170e 100644
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -212,8 +212,8 @@ pref("dom.enable_performance_observer", false);
pref("dom.requestIdleCallback.enabled", true);
// Enable Intersection Observers
-// See WD https://w3c.github.io/IntersectionObserver/
-pref("dom.IntersectionObserver.enabled", false);
+// See WD https://www.w3.org/TR/intersection-observer/
+pref("dom.intersectionObserver.enabled", true);
// Whether the Gamepad API is enabled
pref("dom.gamepad.enabled", true);
@@ -956,6 +956,9 @@ pref("toolkit.asyncshutdown.log", false);
// Enable deprecation warnings.
pref("devtools.errorconsole.deprecation_warnings", true);
+// Enable performance warnings.
+pref("devtools.errorconsole.performance_warnings", true);
+
// Disable debugging chrome
pref("devtools.chrome.enabled", false);
@@ -1288,7 +1291,7 @@ pref("javascript.options.mem.high_water_mark", 128);
pref("javascript.options.mem.max", -1);
pref("javascript.options.mem.gc_per_zone", true);
pref("javascript.options.mem.gc_incremental", true);
-pref("javascript.options.mem.gc_incremental_slice_ms", 10);
+pref("javascript.options.mem.gc_incremental_slice_ms", 20);
pref("javascript.options.mem.gc_generational", true);
pref("javascript.options.mem.gc_compacting", true);
pref("javascript.options.mem.log", false);
@@ -2035,6 +2038,8 @@ pref("network.proxy.autoconfig_url.include_path", false);
pref("network.proxy.autoconfig_retry_interval_min", 5); // 5 seconds
pref("network.proxy.autoconfig_retry_interval_max", 300); // 5 minutes
+// Master switch for HSTS usage (security <-> privacy tradeoff)
+pref("network.stricttransportsecurity.enabled", true);
// Use the HSTS preload list by default
pref("network.stricttransportsecurity.preloadlist", true);
diff --git a/mozglue/build/WindowsDllBlocklist.cpp b/mozglue/build/WindowsDllBlocklist.cpp
index 9b63d6673..c7d14041d 100644
--- a/mozglue/build/WindowsDllBlocklist.cpp
+++ b/mozglue/build/WindowsDllBlocklist.cpp
@@ -223,6 +223,9 @@ static DllBlockInfo sWindowsDllBlocklist[] = {
// K7TotalSecurity, bug 1339083.
{ "k7pswsen.dll", MAKE_VERSION(15, 2, 2, 95) },
+
+ // Comodo IS old versions, startup crash on 64-bit, bug 1140397
+ { "guard64.dll", MAKE_VERSION(6, 3, 0, 0) },
{ nullptr, 0 }
};
diff --git a/netwerk/base/BackgroundFileSaver.cpp b/netwerk/base/BackgroundFileSaver.cpp
index cfe94e35b..b338c2a08 100644
--- a/netwerk/base/BackgroundFileSaver.cpp
+++ b/netwerk/base/BackgroundFileSaver.cpp
@@ -9,7 +9,6 @@
#include "ScopedNSSTypes.h"
#include "mozilla/Casting.h"
#include "mozilla/Logging.h"
-#include "mozilla/Telemetry.h"
#include "nsCOMArray.h"
#include "nsIAsyncInputStream.h"
#include "nsIFile.h"
@@ -85,7 +84,6 @@ private:
//// BackgroundFileSaver
uint32_t BackgroundFileSaver::sThreadCount = 0;
-uint32_t BackgroundFileSaver::sTelemetryMaxThreadCount = 0;
BackgroundFileSaver::BackgroundFileSaver()
: mControlThread(nullptr)
@@ -156,9 +154,6 @@ BackgroundFileSaver::Init()
NS_ENSURE_SUCCESS(rv, rv);
sThreadCount++;
- if (sThreadCount > sTelemetryMaxThreadCount) {
- sTelemetryMaxThreadCount = sThreadCount;
- }
return NS_OK;
}
@@ -793,14 +788,6 @@ BackgroundFileSaver::NotifySaveComplete()
sThreadCount--;
- // When there are no more active downloads, we consider the download session
- // finished. We record the maximum number of concurrent downloads reached
- // during the session in a telemetry histogram, and we reset the maximum
- // thread counter for the next download session
- if (sThreadCount == 0) {
- sTelemetryMaxThreadCount = 0;
- }
-
return NS_OK;
}
diff --git a/netwerk/base/BackgroundFileSaver.h b/netwerk/base/BackgroundFileSaver.h
index 1fa9268f8..86d3a1ba7 100644
--- a/netwerk/base/BackgroundFileSaver.h
+++ b/netwerk/base/BackgroundFileSaver.h
@@ -61,15 +61,6 @@ public:
*/
static uint32_t sThreadCount;
- /**
- * Maximum number of worker threads reached during the current download session,
- * used for telemetry.
- *
- * When there are no more worker threads running, we consider the download
- * session finished, and this counter is reset.
- */
- static uint32_t sTelemetryMaxThreadCount;
-
protected:
virtual ~BackgroundFileSaver();
diff --git a/netwerk/base/nsIOService.cpp b/netwerk/base/nsIOService.cpp
index 435294315..e0dc7d8e8 100644
--- a/netwerk/base/nsIOService.cpp
+++ b/netwerk/base/nsIOService.cpp
@@ -48,7 +48,6 @@
#include "mozilla/LoadInfo.h"
#include "mozilla/net/NeckoCommon.h"
#include "mozilla/Services.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/net/DNS.h"
#include "mozilla/ipc/URIUtils.h"
#include "mozilla/net/NeckoChild.h"
@@ -166,8 +165,6 @@ static const char kProfileDoChange[] = "profile-do-change";
uint32_t nsIOService::gDefaultSegmentSize = 4096;
uint32_t nsIOService::gDefaultSegmentCount = 24;
-bool nsIOService::sTelemetryEnabled = false;
-
bool nsIOService::sBlockToplevelDataUriNavigations = false;
////////////////////////////////////////////////////////////////////////////////
@@ -185,9 +182,6 @@ nsIOService::nsIOService()
, mNetworkLinkServiceInitialized(false)
, mChannelEventSinks(NS_CHANNEL_EVENT_SINK_CATEGORY)
, mNetworkNotifyChanged(true)
- , mLastOfflineStateChange(PR_IntervalNow())
- , mLastConnectivityChange(PR_IntervalNow())
- , mLastNetworkLinkChange(PR_IntervalNow())
, mNetTearingDownStarted(0)
{
}
@@ -247,7 +241,6 @@ nsIOService::Init()
else
NS_WARNING("failed to get observer service");
- Preferences::AddBoolVarCache(&sTelemetryEnabled, "toolkit.telemetry.enabled", false);
Preferences::AddBoolVarCache(&sBlockToplevelDataUriNavigations,
"security.data_uri.block_toplevel_data_uri_navigations", false);
Preferences::AddBoolVarCache(&mOfflineMirrorsConnectivity, OFFLINE_MIRRORS_CONNECTIVITY, true);
@@ -1068,7 +1061,6 @@ nsIOService::SetOffline(bool offline)
if (mSocketTransportService)
mSocketTransportService->SetOffline(true);
- mLastOfflineStateChange = PR_IntervalNow();
if (observerService)
observerService->NotifyObservers(subject,
NS_IOSERVICE_OFFLINE_STATUS_TOPIC,
@@ -1088,7 +1080,6 @@ nsIOService::SetOffline(bool offline)
if (mProxyService)
mProxyService->ReloadPAC();
- mLastOfflineStateChange = PR_IntervalNow();
// don't care if notification fails
// Only send the ONLINE notification if there is connectivity
if (observerService && mConnectivity) {
@@ -1147,10 +1138,6 @@ nsIOService::SetConnectivityInternal(bool aConnectivity)
}
mConnectivity = aConnectivity;
- // This is used for PR_Connect PR_Close telemetry so it is important that
- // we have statistic about network change event even if we are offline.
- mLastConnectivityChange = PR_IntervalNow();
-
if (mCaptivePortalService) {
if (aConnectivity && !xpc::AreNonLocalConnectionsDisabled()) {
// This will also trigger a captive portal check for the new network
@@ -1621,7 +1608,6 @@ nsIOService::OnNetworkLinkEvent(const char *data)
bool isUp = true;
if (!strcmp(data, NS_NETWORK_LINK_DATA_CHANGED)) {
- mLastNetworkLinkChange = PR_IntervalNow();
// CHANGED means UP/DOWN didn't change
// but the status of the captive portal may have changed.
RecheckCaptivePortal();
diff --git a/netwerk/base/nsIOService.h b/netwerk/base/nsIOService.h
index e592c4d1c..19eed743a 100644
--- a/netwerk/base/nsIOService.h
+++ b/netwerk/base/nsIOService.h
@@ -79,9 +79,6 @@ public:
nsAsyncRedirectVerifyHelper *helper);
bool IsOffline() { return mOffline; }
- PRIntervalTime LastOfflineStateChange() { return mLastOfflineStateChange; }
- PRIntervalTime LastConnectivityChange() { return mLastConnectivityChange; }
- PRIntervalTime LastNetworkLinkChange() { return mLastNetworkLinkChange; }
bool IsNetTearingDown() { return mShutdown || mOfflineForProfileChange ||
mHttpHandlerAlreadyShutingDown; }
PRIntervalTime NetTearingDownStarted() { return mNetTearingDownStarted; }
@@ -176,18 +173,8 @@ private:
bool mNetworkNotifyChanged;
- static bool sTelemetryEnabled;
-
static bool sBlockToplevelDataUriNavigations;
- // These timestamps are needed for collecting telemetry on PR_Connect,
- // PR_ConnectContinue and PR_Close blocking time. If we spend very long
- // time in any of these functions we want to know if and what network
- // change has happened shortly before.
- mozilla::Atomic<PRIntervalTime> mLastOfflineStateChange;
- mozilla::Atomic<PRIntervalTime> mLastConnectivityChange;
- mozilla::Atomic<PRIntervalTime> mLastNetworkLinkChange;
-
// Time a network tearing down started.
mozilla::Atomic<PRIntervalTime> mNetTearingDownStarted;
public:
diff --git a/netwerk/base/nsLoadGroup.cpp b/netwerk/base/nsLoadGroup.cpp
index 9981bd698..48d9a6621 100644
--- a/netwerk/base/nsLoadGroup.cpp
+++ b/netwerk/base/nsLoadGroup.cpp
@@ -108,9 +108,6 @@ nsLoadGroup::nsLoadGroup(nsISupports* outer)
, mStatus(NS_OK)
, mPriority(PRIORITY_NORMAL)
, mIsCanceling(false)
- , mDefaultLoadIsTimed(false)
- , mTimedRequests(0)
- , mCachedRequests(0)
, mTimedNonCachedRequestsUntilOnEndPageLoad(0)
{
NS_INIT_AGGREGATED(outer);
@@ -431,13 +428,6 @@ nsLoadGroup::SetDefaultLoadRequest(nsIRequest *aRequest)
// in particular, nsIChannel::LOAD_DOCUMENT_URI...
//
mLoadFlags &= nsIRequest::LOAD_REQUESTMASK;
-
- nsCOMPtr<nsITimedChannel> timedChannel = do_QueryInterface(aRequest);
- mDefaultLoadIsTimed = timedChannel != nullptr;
- if (mDefaultLoadIsTimed) {
- timedChannel->GetChannelCreation(&mDefaultRequestCreationTime);
- timedChannel->SetTimingEnabled(true);
- }
}
// Else, do not change the group's load flags (see bug 95981)
return NS_OK;
@@ -492,10 +482,6 @@ nsLoadGroup::AddRequest(nsIRequest *request, nsISupports* ctxt)
if (mPriority != 0)
RescheduleRequest(request, mPriority);
- nsCOMPtr<nsITimedChannel> timedChannel = do_QueryInterface(request);
- if (timedChannel)
- timedChannel->SetTimingEnabled(true);
-
if (!(flags & nsIRequest::LOAD_BACKGROUND)) {
// Update the count of foreground URIs..
mForegroundCount += 1;
@@ -573,10 +559,6 @@ nsLoadGroup::RemoveRequest(nsIRequest *request, nsISupports* ctxt,
mRequests.RemoveEntry(entry);
- if (mRequests.EntryCount() == 0) {
- TelemetryReport();
- }
-
// Undo any group priority delta...
if (mPriority != 0)
RescheduleRequest(request, -mPriority);
@@ -777,82 +759,6 @@ nsLoadGroup::SetDefaultLoadFlags(uint32_t aFlags)
////////////////////////////////////////////////////////////////////////////////
-void
-nsLoadGroup::TelemetryReport()
-{
- /* STUB */
- mTimedRequests = 0;
- mCachedRequests = 0;
- mDefaultLoadIsTimed = false;
-}
-
-void
-nsLoadGroup::TelemetryReportChannel(nsITimedChannel *aTimedChannel,
- bool aDefaultRequest)
-{
- nsresult rv;
- bool timingEnabled;
- rv = aTimedChannel->GetTimingEnabled(&timingEnabled);
- if (NS_FAILED(rv) || !timingEnabled)
- return;
-
- TimeStamp asyncOpen;
- rv = aTimedChannel->GetAsyncOpen(&asyncOpen);
- // We do not check !asyncOpen.IsNull() bellow, prevent ASSERTIONs this way
- if (NS_FAILED(rv) || asyncOpen.IsNull())
- return;
-
- TimeStamp cacheReadStart;
- rv = aTimedChannel->GetCacheReadStart(&cacheReadStart);
- if (NS_FAILED(rv))
- return;
-
- TimeStamp cacheReadEnd;
- rv = aTimedChannel->GetCacheReadEnd(&cacheReadEnd);
- if (NS_FAILED(rv))
- return;
-
- TimeStamp domainLookupStart;
- rv = aTimedChannel->GetDomainLookupStart(&domainLookupStart);
- if (NS_FAILED(rv))
- return;
-
- TimeStamp domainLookupEnd;
- rv = aTimedChannel->GetDomainLookupEnd(&domainLookupEnd);
- if (NS_FAILED(rv))
- return;
-
- TimeStamp connectStart;
- rv = aTimedChannel->GetConnectStart(&connectStart);
- if (NS_FAILED(rv))
- return;
-
- TimeStamp secureConnectionStart;
- rv = aTimedChannel->GetSecureConnectionStart(&secureConnectionStart);
- if (NS_FAILED(rv))
- return;
-
- TimeStamp connectEnd;
- rv = aTimedChannel->GetConnectEnd(&connectEnd);
- if (NS_FAILED(rv))
- return;
-
- TimeStamp requestStart;
- rv = aTimedChannel->GetRequestStart(&requestStart);
- if (NS_FAILED(rv))
- return;
-
- TimeStamp responseStart;
- rv = aTimedChannel->GetResponseStart(&responseStart);
- if (NS_FAILED(rv))
- return;
-
- TimeStamp responseEnd;
- rv = aTimedChannel->GetResponseEnd(&responseEnd);
- if (NS_FAILED(rv))
- return;
-}
-
nsresult nsLoadGroup::MergeLoadFlags(nsIRequest *aRequest,
nsLoadFlags& outFlags)
{
diff --git a/netwerk/base/nsLoadGroup.h b/netwerk/base/nsLoadGroup.h
index 20dd94cf9..9b5e70868 100644
--- a/netwerk/base/nsLoadGroup.h
+++ b/netwerk/base/nsLoadGroup.h
@@ -62,11 +62,6 @@ protected:
nsresult MergeLoadFlags(nsIRequest *aRequest, nsLoadFlags& flags);
nsresult MergeDefaultLoadFlags(nsIRequest *aRequest, nsLoadFlags& flags);
-private:
- void TelemetryReport();
- void TelemetryReportChannel(nsITimedChannel *timedChannel,
- bool defaultRequest);
-
protected:
uint32_t mForegroundCount;
uint32_t mLoadFlags;
@@ -87,12 +82,6 @@ protected:
int32_t mPriority;
bool mIsCanceling;
- /* Telemetry */
- mozilla::TimeStamp mDefaultRequestCreationTime;
- bool mDefaultLoadIsTimed;
- uint32_t mTimedRequests;
- uint32_t mCachedRequests;
-
/* For nsPILoadGroupInternal */
uint32_t mTimedNonCachedRequestsUntilOnEndPageLoad;
};
diff --git a/netwerk/base/nsProtocolProxyService.cpp b/netwerk/base/nsProtocolProxyService.cpp
index 26eca0e88..237a2a3bd 100644
--- a/netwerk/base/nsProtocolProxyService.cpp
+++ b/netwerk/base/nsProtocolProxyService.cpp
@@ -1841,6 +1841,13 @@ nsProtocolProxyService::Resolve_Internal(nsIChannel *channel,
if (mPACMan && mPACMan->IsPACURI(uri))
return NS_OK;
+ // If proxies are enabled and this host:port combo is supposed to use a
+ // proxy, check for a proxy.
+ if ((mProxyConfig == PROXYCONFIG_DIRECT) ||
+ !CanUseProxy(uri, info.defaultPort)) {
+ return NS_OK;
+ }
+
bool mainThreadOnly;
if (mSystemProxySettings &&
mProxyConfig == PROXYCONFIG_SYSTEM &&
diff --git a/netwerk/base/nsSocketTransport2.cpp b/netwerk/base/nsSocketTransport2.cpp
index f9b55ead4..0c8434813 100644
--- a/netwerk/base/nsSocketTransport2.cpp
+++ b/netwerk/base/nsSocketTransport2.cpp
@@ -7,7 +7,6 @@
#include "nsSocketTransport2.h"
#include "mozilla/Attributes.h"
-#include "mozilla/Telemetry.h"
#include "nsIOService.h"
#include "nsStreamUtils.h"
#include "nsNetSegmentUtils.h"
@@ -1226,8 +1225,7 @@ nsSocketTransport::BuildSocket(PRFileDesc *&fd, bool &proxyTransparent, bool &us
if (NS_FAILED(rv)) {
SOCKET_LOG((" error pushing io layer [%u:%s rv=%x]\n", i, mTypes[i], rv));
if (fd) {
- CloseSocket(fd,
- mSocketTransportService->IsTelemetryEnabledAndNotSleepPhase());
+ CloseSocket(fd);
}
}
}
@@ -1395,8 +1393,7 @@ nsSocketTransport::InitiateSocket()
// inform socket transport about this newly created socket...
rv = mSocketTransportService->AttachSocket(fd, this);
if (NS_FAILED(rv)) {
- CloseSocket(fd,
- mSocketTransportService->IsTelemetryEnabledAndNotSleepPhase());
+ CloseSocket(fd);
return rv;
}
mAttached = true;
@@ -1453,26 +1450,8 @@ nsSocketTransport::InitiateSocket()
}
#endif
- // We use PRIntervalTime here because we need
- // nsIOService::LastOfflineStateChange time and
- // nsIOService::LastConectivityChange time to be atomic.
- PRIntervalTime connectStarted = 0;
- if (gSocketTransportService->IsTelemetryEnabledAndNotSleepPhase()) {
- connectStarted = PR_IntervalNow();
- }
-
status = PR_Connect(fd, &prAddr, NS_SOCKET_CONNECT_TIMEOUT);
- if (gSocketTransportService->IsTelemetryEnabledAndNotSleepPhase() &&
- connectStarted) {
- SendPRBlockingTelemetry(connectStarted,
- Telemetry::PRCONNECT_BLOCKING_TIME_NORMAL,
- Telemetry::PRCONNECT_BLOCKING_TIME_SHUTDOWN,
- Telemetry::PRCONNECT_BLOCKING_TIME_CONNECTIVITY_CHANGE,
- Telemetry::PRCONNECT_BLOCKING_TIME_LINK_CHANGE,
- Telemetry::PRCONNECT_BLOCKING_TIME_OFFLINE);
- }
-
if (status == PR_SUCCESS) {
//
// we are connected!
@@ -1531,16 +1510,6 @@ nsSocketTransport::InitiateSocket()
// The connection was refused...
//
else {
- if (gSocketTransportService->IsTelemetryEnabledAndNotSleepPhase() &&
- connectStarted) {
- SendPRBlockingTelemetry(connectStarted,
- Telemetry::PRCONNECT_FAIL_BLOCKING_TIME_NORMAL,
- Telemetry::PRCONNECT_FAIL_BLOCKING_TIME_SHUTDOWN,
- Telemetry::PRCONNECT_FAIL_BLOCKING_TIME_CONNECTIVITY_CHANGE,
- Telemetry::PRCONNECT_FAIL_BLOCKING_TIME_LINK_CHANGE,
- Telemetry::PRCONNECT_FAIL_BLOCKING_TIME_OFFLINE);
- }
-
rv = ErrorAccordingToNSPR(code);
if ((rv == NS_ERROR_CONNECTION_REFUSED) && !mProxyHost.IsEmpty())
rv = NS_ERROR_PROXY_CONNECTION_REFUSED;
@@ -1763,8 +1732,7 @@ public:
NS_IMETHOD Run() override
{
- nsSocketTransport::CloseSocket(mFD,
- gSocketTransportService->IsTelemetryEnabledAndNotSleepPhase());
+ nsSocketTransport::CloseSocket(mFD);
return NS_OK;
}
private:
@@ -1801,8 +1769,7 @@ nsSocketTransport::ReleaseFD_Locked(PRFileDesc *fd)
SOCKET_LOG(("Intentional leak"));
} else if (PR_GetCurrentThread() == gSocketThread) {
SOCKET_LOG(("nsSocketTransport: calling PR_Close [this=%p]\n", this));
- CloseSocket(mFD,
- mSocketTransportService->IsTelemetryEnabledAndNotSleepPhase());
+ CloseSocket(mFD);
} else {
// Can't PR_Close() a socket off STS thread. Thunk it to STS to die
STS_PRCloseOnSocketTransport(mFD);
@@ -1960,26 +1927,7 @@ nsSocketTransport::OnSocketReady(PRFileDesc *fd, int16_t outFlags)
// We do not need to do PR_ConnectContinue when we are already
// shutting down.
- // We use PRIntervalTime here because we need
- // nsIOService::LastOfflineStateChange time and
- // nsIOService::LastConectivityChange time to be atomic.
- PRIntervalTime connectStarted = 0;
- if (gSocketTransportService->IsTelemetryEnabledAndNotSleepPhase()) {
- connectStarted = PR_IntervalNow();
- }
-
PRStatus status = PR_ConnectContinue(fd, outFlags);
-
- if (gSocketTransportService->IsTelemetryEnabledAndNotSleepPhase() &&
- connectStarted) {
- SendPRBlockingTelemetry(connectStarted,
- Telemetry::PRCONNECTCONTINUE_BLOCKING_TIME_NORMAL,
- Telemetry::PRCONNECTCONTINUE_BLOCKING_TIME_SHUTDOWN,
- Telemetry::PRCONNECTCONTINUE_BLOCKING_TIME_CONNECTIVITY_CHANGE,
- Telemetry::PRCONNECTCONTINUE_BLOCKING_TIME_LINK_CHANGE,
- Telemetry::PRCONNECTCONTINUE_BLOCKING_TIME_OFFLINE);
- }
-
if (status == PR_SUCCESS) {
//
// we are connected!
@@ -3144,41 +3092,13 @@ nsSocketTransport::PRFileDescAutoLock::SetKeepaliveVals(bool aEnabled,
}
void
-nsSocketTransport::CloseSocket(PRFileDesc *aFd, bool aTelemetryEnabled)
+nsSocketTransport::CloseSocket(PRFileDesc *aFd)
{
#if defined(XP_WIN)
AttachShutdownLayer(aFd);
#endif
- // We use PRIntervalTime here because we need
- // nsIOService::LastOfflineStateChange time and
- // nsIOService::LastConectivityChange time to be atomic.
- PRIntervalTime closeStarted;
- if (aTelemetryEnabled) {
- closeStarted = PR_IntervalNow();
- }
-
PR_Close(aFd);
-
- if (aTelemetryEnabled) {
- SendPRBlockingTelemetry(closeStarted,
- Telemetry::PRCLOSE_TCP_BLOCKING_TIME_NORMAL,
- Telemetry::PRCLOSE_TCP_BLOCKING_TIME_SHUTDOWN,
- Telemetry::PRCLOSE_TCP_BLOCKING_TIME_CONNECTIVITY_CHANGE,
- Telemetry::PRCLOSE_TCP_BLOCKING_TIME_LINK_CHANGE,
- Telemetry::PRCLOSE_TCP_BLOCKING_TIME_OFFLINE);
- }
-}
-
-void
-nsSocketTransport::SendPRBlockingTelemetry(PRIntervalTime aStart,
- Telemetry::ID aIDNormal,
- Telemetry::ID aIDShutdown,
- Telemetry::ID aIDConnectivityChange,
- Telemetry::ID aIDLinkChange,
- Telemetry::ID aIDOffline)
-{
- /* STUB */
}
} // namespace net
diff --git a/netwerk/base/nsSocketTransport2.h b/netwerk/base/nsSocketTransport2.h
index 7c85ccdc4..310cc58d3 100644
--- a/netwerk/base/nsSocketTransport2.h
+++ b/netwerk/base/nsSocketTransport2.h
@@ -22,7 +22,6 @@
#include "nsIClassInfo.h"
#include "mozilla/net/DNS.h"
#include "nsASocketHandler.h"
-#include "mozilla/Telemetry.h"
#include "prerror.h"
#include "nsAutoPtr.h"
@@ -169,13 +168,7 @@ public:
uint64_t ByteCountReceived() override { return mInput.ByteCount(); }
uint64_t ByteCountSent() override { return mOutput.ByteCount(); }
- static void CloseSocket(PRFileDesc *aFd, bool aTelemetryEnabled);
- static void SendPRBlockingTelemetry(PRIntervalTime aStart,
- Telemetry::ID aIDNormal,
- Telemetry::ID aIDShutdown,
- Telemetry::ID aIDConnectivityChange,
- Telemetry::ID aIDLinkChange,
- Telemetry::ID aIDOffline);
+ static void CloseSocket(PRFileDesc *aFd);
protected:
virtual ~nsSocketTransport();
diff --git a/netwerk/base/nsSocketTransportService2.cpp b/netwerk/base/nsSocketTransportService2.cpp
index 739388b0f..af5742564 100644
--- a/netwerk/base/nsSocketTransportService2.cpp
+++ b/netwerk/base/nsSocketTransportService2.cpp
@@ -22,7 +22,6 @@
#include "mozilla/PublicSSL.h"
#include "mozilla/ChaosMode.h"
#include "mozilla/PodOperations.h"
-#include "mozilla/Telemetry.h"
#include "nsThreadUtils.h"
#include "nsIFile.h"
#include "nsIWidget.h"
@@ -47,7 +46,6 @@ Atomic<PRThread*, Relaxed> gSocketThread;
#define SOCKET_LIMIT_MIN 50U
#define BLIP_INTERVAL_PREF "network.activity.blipIntervalMilliseconds"
#define MAX_TIME_BETWEEN_TWO_POLLS "network.sts.max_time_for_events_between_two_polls"
-#define TELEMETRY_PREF "toolkit.telemetry.enabled"
#define MAX_TIME_FOR_PR_CLOSE_DURING_SHUTDOWN "network.sts.max_time_for_pr_close_during_shutdown"
#define REPAIR_POLLABLE_EVENT_TIME 10
@@ -79,9 +77,7 @@ nsSocketTransportService::nsSocketTransportService()
, mKeepaliveEnabledPref(false)
, mServingPendingQueue(false)
, mMaxTimePerPollIter(100)
- , mTelemetryEnabledPref(false)
, mMaxTimeForPrClosePref(PR_SecondsToInterval(5))
- , mSleepPhase(false)
, mProbedMaxCount(false)
#if defined(XP_WIN)
, mPolling(false)
@@ -211,16 +207,9 @@ nsSocketTransportService::AttachSocket(PRFileDesc *fd, nsASocketHandler *handler
bool
nsSocketTransportService::CanAttachSocket()
{
- static bool reported900FDLimit = false;
-
uint32_t total = mActiveCount + mIdleCount;
bool rv = total < gMaxCount;
- if (mTelemetryEnabledPref &&
- (((total >= 900) || !rv) && !reported900FDLimit)) {
- reported900FDLimit = true;
- }
-
return rv;
}
@@ -438,13 +427,11 @@ nsSocketTransportService::PollTimeout()
}
int32_t
-nsSocketTransportService::Poll(uint32_t *interval,
- TimeDuration *pollDuration)
+nsSocketTransportService::Poll(uint32_t *interval)
{
PRPollDesc *pollList;
uint32_t pollCount;
PRIntervalTime pollTimeout;
- *pollDuration = 0;
// If there are pending events for this thread then
// DoPollIteration() should service the network without blocking.
@@ -470,8 +457,6 @@ nsSocketTransportService::Poll(uint32_t *interval,
PRIntervalTime ts = PR_IntervalNow();
- TimeStamp pollStart;
-
SOCKET_LOG((" timeout = %i milliseconds\n",
PR_IntervalToMilliseconds(pollTimeout)));
int32_t rv = PR_Poll(pollList, pollCount, pollTimeout);
@@ -530,7 +515,6 @@ nsSocketTransportService::Init()
tmpPrefService->AddObserver(KEEPALIVE_RETRY_INTERVAL_PREF, this, false);
tmpPrefService->AddObserver(KEEPALIVE_PROBE_COUNT_PREF, this, false);
tmpPrefService->AddObserver(MAX_TIME_BETWEEN_TWO_POLLS, this, false);
- tmpPrefService->AddObserver(TELEMETRY_PREF, this, false);
tmpPrefService->AddObserver(MAX_TIME_FOR_PR_CLOSE_DURING_SHUTDOWN, this, false);
}
UpdatePrefs();
@@ -539,8 +523,6 @@ nsSocketTransportService::Init()
if (obsSvc) {
obsSvc->AddObserver(this, "profile-initial-state", false);
obsSvc->AddObserver(this, "last-pb-context-exited", false);
- obsSvc->AddObserver(this, NS_WIDGET_SLEEP_OBSERVER_TOPIC, true);
- obsSvc->AddObserver(this, NS_WIDGET_WAKE_OBSERVER_TOPIC, true);
obsSvc->AddObserver(this, "xpcom-shutdown-threads", false);
}
@@ -607,16 +589,9 @@ nsSocketTransportService::ShutdownThread()
if (obsSvc) {
obsSvc->RemoveObserver(this, "profile-initial-state");
obsSvc->RemoveObserver(this, "last-pb-context-exited");
- obsSvc->RemoveObserver(this, NS_WIDGET_SLEEP_OBSERVER_TOPIC);
- obsSvc->RemoveObserver(this, NS_WIDGET_WAKE_OBSERVER_TOPIC);
obsSvc->RemoveObserver(this, "xpcom-shutdown-threads");
}
- if (mAfterWakeUpTimer) {
- mAfterWakeUpTimer->Cancel();
- mAfterWakeUpTimer = nullptr;
- }
-
NetworkActivityMonitor::Shutdown();
mInitialized = false;
@@ -851,24 +826,16 @@ nsSocketTransportService::Run()
// make sure the pseudo random number generator is seeded on this thread
srand(static_cast<unsigned>(PR_Now()));
- // Time blocked in poll().
- TimeDuration singlePollDuration;
-
int numberOfPendingEvents;
// If there is too many pending events queued, we will run some poll()
- // between them and the following variable is cumulative time spent
- // blocking in poll().
- TimeDuration pollDuration;
-
+ // between them.
for (;;) {
bool pendingEvents = false;
-
numberOfPendingEvents = 0;
- pollDuration = 0;
do {
- DoPollIteration(&singlePollDuration);
+ DoPollIteration();
mRawThread->HasPendingEvents(&pendingEvents);
if (pendingEvents) {
@@ -959,7 +926,7 @@ nsSocketTransportService::Reset(bool aGuardLocals)
}
nsresult
-nsSocketTransportService::DoPollIteration(TimeDuration *pollDuration)
+nsSocketTransportService::DoPollIteration()
{
SOCKET_LOG(("STS poll iter\n"));
@@ -1019,13 +986,12 @@ nsSocketTransportService::DoPollIteration(TimeDuration *pollDuration)
// Measures seconds spent while blocked on PR_Poll
uint32_t pollInterval = 0;
int32_t n = 0;
- *pollDuration = 0;
if (!gIOService->IsNetTearingDown()) {
// Let's not do polling during shutdown.
#if defined(XP_WIN)
StartPolling();
#endif
- n = Poll(&pollInterval, pollDuration);
+ n = Poll(&pollInterval);
#if defined(XP_WIN)
EndPolling();
#endif
@@ -1171,13 +1137,6 @@ nsSocketTransportService::UpdatePrefs()
mMaxTimePerPollIter = maxTimePref;
}
- bool telemetryPref = false;
- rv = tmpPrefService->GetBoolPref(TELEMETRY_PREF,
- &telemetryPref);
- if (NS_SUCCEEDED(rv)) {
- mTelemetryEnabledPref = telemetryPref;
- }
-
int32_t maxTimeForPrClosePref;
rv = tmpPrefService->GetIntPref(MAX_TIME_FOR_PR_CLOSE_DURING_SHUTDOWN,
&maxTimeForPrClosePref);
@@ -1255,10 +1214,6 @@ nsSocketTransportService::Observe(nsISupports *subject,
if (!strcmp(topic, NS_TIMER_CALLBACK_TOPIC)) {
nsCOMPtr<nsITimer> timer = do_QueryInterface(subject);
- if (timer == mAfterWakeUpTimer) {
- mAfterWakeUpTimer = nullptr;
- mSleepPhase = false;
- }
#if defined(XP_WIN)
if (timer == mPollRepairTimer) {
@@ -1266,19 +1221,6 @@ nsSocketTransportService::Observe(nsISupports *subject,
}
#endif
- } else if (!strcmp(topic, NS_WIDGET_SLEEP_OBSERVER_TOPIC)) {
- mSleepPhase = true;
- if (mAfterWakeUpTimer) {
- mAfterWakeUpTimer->Cancel();
- mAfterWakeUpTimer = nullptr;
- }
- } else if (!strcmp(topic, NS_WIDGET_WAKE_OBSERVER_TOPIC)) {
- if (mSleepPhase && !mAfterWakeUpTimer) {
- mAfterWakeUpTimer = do_CreateInstance("@mozilla.org/timer;1");
- if (mAfterWakeUpTimer) {
- mAfterWakeUpTimer->Init(this, 2000, nsITimer::TYPE_ONE_SHOT);
- }
- }
} else if (!strcmp(topic, "xpcom-shutdown-threads")) {
ShutdownThread();
}
diff --git a/netwerk/base/nsSocketTransportService2.h b/netwerk/base/nsSocketTransportService2.h
index 81c806793..0b88a6535 100644
--- a/netwerk/base/nsSocketTransportService2.h
+++ b/netwerk/base/nsSocketTransportService2.h
@@ -118,8 +118,6 @@ public:
// Returns true if keepalives are enabled in prefs.
bool IsKeepaliveEnabled() { return mKeepaliveEnabledPref; }
- bool IsTelemetryEnabledAndNotSleepPhase() { return mTelemetryEnabledPref &&
- !mSleepPhase; }
PRIntervalTime MaxTimeForPrClosePref() {return mMaxTimeForPrClosePref; }
protected:
@@ -191,7 +189,7 @@ private:
bool GrowActiveList();
bool GrowIdleList();
- void InitMaxCount();
+ void InitMaxCount();
// Total bytes number transfered through all the sockets except active ones
uint64_t mSentBytesCount;
@@ -206,15 +204,12 @@ private:
PRPollDesc *mPollList; /* mListSize + 1 entries */
PRIntervalTime PollTimeout(); // computes ideal poll timeout
- nsresult DoPollIteration(TimeDuration *pollDuration);
+ nsresult DoPollIteration();
// perfoms a single poll iteration
- int32_t Poll(uint32_t *interval,
- TimeDuration *pollDuration);
+ int32_t Poll(uint32_t *interval);
// calls PR_Poll. the out param
// interval indicates the poll
// duration in seconds.
- // pollDuration is used only for
- // telemetry
//-------------------------------------------------------------------------
// pending socket queue - see NotifyWhenCanAttachSocket
@@ -236,14 +231,8 @@ private:
Atomic<bool> mServingPendingQueue;
Atomic<int32_t, Relaxed> mMaxTimePerPollIter;
- Atomic<bool, Relaxed> mTelemetryEnabledPref;
Atomic<PRIntervalTime, Relaxed> mMaxTimeForPrClosePref;
- // Between a computer going to sleep and waking up the PR_*** telemetry
- // will be corrupted - so do not record it.
- Atomic<bool, Relaxed> mSleepPhase;
- nsCOMPtr<nsITimer> mAfterWakeUpTimer;
-
void OnKeepaliveEnabledPrefChange();
void NotifyKeepaliveEnabledPrefChange(SocketContext *sock);
diff --git a/netwerk/base/nsUDPSocket.cpp b/netwerk/base/nsUDPSocket.cpp
index 445b62d9c..8b6a81bf5 100644
--- a/netwerk/base/nsUDPSocket.cpp
+++ b/netwerk/base/nsUDPSocket.cpp
@@ -7,7 +7,6 @@
#include "mozilla/EndianUtils.h"
#include "mozilla/dom/TypedArray.h"
#include "mozilla/HoldDropJSObjects.h"
-#include "mozilla/Telemetry.h"
#include "nsSocketTransport2.h"
#include "nsUDPSocket.h"
@@ -173,7 +172,6 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsUDPMessage)
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsUDPMessage)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsUDPMessage)
@@ -275,7 +273,6 @@ void
nsUDPSocket::AddOutputBytes(uint64_t aBytes)
{
mByteWriteCount += aBytes;
- SaveNetworkStats(false);
}
void
@@ -465,7 +462,6 @@ nsUDPSocket::OnSocketReady(PRFileDesc *fd, int16_t outFlags)
return;
}
mByteReadCount += count;
- SaveNetworkStats(false);
FallibleTArray<uint8_t> data;
if (!data.AppendElements(buff, count, fallible)) {
@@ -512,7 +508,6 @@ nsUDPSocket::OnSocketDetached(PRFileDesc *fd)
NS_ASSERTION(mFD == fd, "wrong file descriptor");
CloseSocket();
}
- SaveNetworkStats(true);
if (mListener)
{
@@ -726,7 +721,6 @@ nsUDPSocket::Close()
// expects this happen synchronously.
CloseSocket();
- SaveNetworkStats(true);
return NS_OK;
}
}
@@ -755,12 +749,6 @@ nsUDPSocket::GetLocalAddr(nsINetAddr * *aResult)
}
void
-nsUDPSocket::SaveNetworkStats(bool aEnforce)
-{
- /*** STUB ***/
-}
-
-void
nsUDPSocket::CloseSocket()
{
if (mFD) {
diff --git a/netwerk/base/nsUDPSocket.h b/netwerk/base/nsUDPSocket.h
index f8ae87cee..2910a49dd 100644
--- a/netwerk/base/nsUDPSocket.h
+++ b/netwerk/base/nsUDPSocket.h
@@ -53,8 +53,6 @@ private:
const PRNetAddr& aIface);
nsresult SetMulticastInterfaceInternal(const PRNetAddr& aIface);
- void SaveNetworkStats(bool aEnforce);
-
void CloseSocket();
// lock protects access to mListener;
diff --git a/netwerk/cache2/CacheStorageService.cpp b/netwerk/cache2/CacheStorageService.cpp
index 85f364e4e..3ee1e15cd 100644
--- a/netwerk/cache2/CacheStorageService.cpp
+++ b/netwerk/cache2/CacheStorageService.cpp
@@ -964,8 +964,6 @@ CacheStorageService::RegisterEntry(CacheEntry* aEntry)
if (mShutdown || !aEntry->CanRegister())
return;
- TelemetryRecordEntryCreation(aEntry);
-
LOG(("CacheStorageService::RegisterEntry [entry=%p]", aEntry));
MemoryPool& pool = Pool(aEntry->IsUsingDisk());
@@ -983,8 +981,6 @@ CacheStorageService::UnregisterEntry(CacheEntry* aEntry)
if (!aEntry->IsRegistered())
return;
- TelemetryRecordEntryRemoval(aEntry);
-
LOG(("CacheStorageService::UnregisterEntry [entry=%p]", aEntry));
MemoryPool& pool = Pool(aEntry->IsUsingDisk());
@@ -2018,100 +2014,6 @@ uint32_t CacheStorageService::CacheQueueSize(bool highPriority)
return thread->QueueSize(highPriority);
}
-// Telementry collection
-
-namespace {
-
-bool TelemetryEntryKey(CacheEntry const* entry, nsAutoCString& key)
-{
- nsAutoCString entryKey;
- nsresult rv = entry->HashingKey(entryKey);
- if (NS_FAILED(rv))
- return false;
-
- if (entry->GetStorageID().IsEmpty()) {
- // Hopefully this will be const-copied, saves some memory
- key = entryKey;
- } else {
- key.Assign(entry->GetStorageID());
- key.Append(':');
- key.Append(entryKey);
- }
-
- return true;
-}
-
-} // namespace
-
-void
-CacheStorageService::TelemetryPrune(TimeStamp &now)
-{
- static TimeDuration const oneMinute = TimeDuration::FromSeconds(60);
- static TimeStamp dontPruneUntil = now + oneMinute;
- if (now < dontPruneUntil)
- return;
-
- static TimeDuration const fifteenMinutes = TimeDuration::FromSeconds(900);
- for (auto iter = mPurgeTimeStamps.Iter(); !iter.Done(); iter.Next()) {
- if (now - iter.Data() > fifteenMinutes) {
- // We are not interested in resurrection of entries after 15 minutes
- // of time. This is also the limit for the telemetry.
- iter.Remove();
- }
- }
- dontPruneUntil = now + oneMinute;
-}
-
-void
-CacheStorageService::TelemetryRecordEntryCreation(CacheEntry const* entry)
-{
- MOZ_ASSERT(CacheStorageService::IsOnManagementThread());
-
- nsAutoCString key;
- if (!TelemetryEntryKey(entry, key))
- return;
-
- TimeStamp now = TimeStamp::NowLoRes();
- TelemetryPrune(now);
-
- // When an entry is craeted (registered actually) we check if there is
- // a timestamp marked when this very same cache entry has been removed
- // (deregistered) because of over-memory-limit purging. If there is such
- // a timestamp found accumulate telemetry on how long the entry was away.
- TimeStamp timeStamp;
- if (!mPurgeTimeStamps.Get(key, &timeStamp))
- return;
-
- mPurgeTimeStamps.Remove(key);
-
-}
-
-void
-CacheStorageService::TelemetryRecordEntryRemoval(CacheEntry const* entry)
-{
- MOZ_ASSERT(CacheStorageService::IsOnManagementThread());
-
- // Doomed entries must not be considered, we are only interested in purged
- // entries. Note that the mIsDoomed flag is always set before deregistration
- // happens.
- if (entry->IsDoomed())
- return;
-
- nsAutoCString key;
- if (!TelemetryEntryKey(entry, key))
- return;
-
- // When an entry is removed (deregistered actually) we put a timestamp for this
- // entry to the hashtable so that when the entry is created (registered) again
- // we know how long it was away. Also accumulate number of AsyncOpen calls on
- // the entry, this tells us how efficiently the pool actually works.
-
- TimeStamp now = TimeStamp::NowLoRes();
- TelemetryPrune(now);
- mPurgeTimeStamps.Put(key, now);
-
-}
-
// nsIMemoryReporter
size_t
diff --git a/netwerk/cache2/CacheStorageService.h b/netwerk/cache2/CacheStorageService.h
index f40459d84..7e968e359 100644
--- a/netwerk/cache2/CacheStorageService.h
+++ b/netwerk/cache2/CacheStorageService.h
@@ -188,12 +188,6 @@ private:
bool IsForcedValidEntry(nsACString const &aEntryKeyWithContext);
private:
- // These are helpers for telemetry monitoring of the memory pools.
- void TelemetryPrune(TimeStamp &now);
- void TelemetryRecordEntryCreation(CacheEntry const* entry);
- void TelemetryRecordEntryRemoval(CacheEntry const* entry);
-
-private:
// Following methods are thread safe to call.
friend class CacheStorage;
@@ -370,12 +364,6 @@ private:
uint32_t mWhat;
};
- // Used just for telemetry purposes, accessed only on the management thread.
- // Note: not included in the memory reporter, this is not expected to be huge
- // and also would be complicated to report since reporting happens on the main
- // thread but this table is manipulated on the management thread.
- nsDataHashtable<nsCStringHashKey, mozilla::TimeStamp> mPurgeTimeStamps;
-
// nsICacheTesting
class IOThreadSuspender : public Runnable
{
diff --git a/netwerk/cookie/nsCookieService.cpp b/netwerk/cookie/nsCookieService.cpp
index 7bc5abcd1..6740f7310 100644
--- a/netwerk/cookie/nsCookieService.cpp
+++ b/netwerk/cookie/nsCookieService.cpp
@@ -49,7 +49,6 @@
#include "mozilla/storage.h"
#include "mozilla/AutoRestore.h"
#include "mozilla/FileUtils.h"
-#include "mozilla/Telemetry.h"
#include "nsIAppsService.h"
#include "mozIApplication.h"
#include "mozIApplicationClearPrivateDataParams.h"
@@ -120,15 +119,6 @@ static const char kPrefCookiePurgeAge[] = "network.cookie.purgeAge";
static const char kPrefThirdPartySession[] = "network.cookie.thirdparty.sessionOnly";
static const char kCookieLeaveSecurityAlone[] = "network.cookie.leave-secure-alone";
-// For telemetry COOKIE_LEAVE_SECURE_ALONE
-#define BLOCKED_SECURE_SET_FROM_HTTP 0
-#define BLOCKED_DOWNGRADE_SECURE 1
-#define DOWNGRADE_SECURE_FROM_SECURE 2
-#define EVICTED_NEWER_INSECURE 3
-#define EVICTED_OLDEST_COOKIE 4
-#define EVICTED_PREFERRED_COOKIE 5
-#define EVICTING_SECURE_BLOCKED 6
-
static void
bindCookieParameters(mozIStorageBindingParamsArray *aParamsArray,
const nsCookieKey &aKey,
@@ -3592,9 +3582,6 @@ nsCookieService::AddInternal(const nsCookieKey &aKey,
MOZ_ASSERT(iter.entry);
oldCookie = iter.Cookie();
- if (oldestCookieTime > 0 && mLeaveSecureAlone) {
- TelemetryForEvictingStaleCookie(oldCookie, oldestCookieTime);
- }
// remove the oldest cookie from the domain
RemoveCookieFromList(iter);
@@ -4619,13 +4606,6 @@ nsCookieService::FindStaleCookie(nsCookieEntry *aEntry,
return actualOldestCookieTime;
}
-void
-nsCookieService::TelemetryForEvictingStaleCookie(nsCookie *aEvicted,
- int64_t oldestCookieTime)
-{
- /* STUB */
-}
-
// count the number of cookies stored by a particular host. this is provided by the
// nsICookieManager2 interface.
NS_IMETHODIMP
diff --git a/netwerk/cookie/nsCookieService.h b/netwerk/cookie/nsCookieService.h
index e3b2d3e8a..185f0b492 100644
--- a/netwerk/cookie/nsCookieService.h
+++ b/netwerk/cookie/nsCookieService.h
@@ -314,7 +314,6 @@ class nsCookieService final : public nsICookieService
bool FindCookie(const nsCookieKey& aKey, const nsAFlatCString &aHost, const nsAFlatCString &aName, const nsAFlatCString &aPath, nsListIter &aIter);
bool FindSecureCookie(const nsCookieKey& aKey, nsCookie* aCookie);
int64_t FindStaleCookie(nsCookieEntry *aEntry, int64_t aCurrentTime, nsIURI* aSource, mozilla::Maybe<bool> aIsSecure, nsListIter &aIter);
- void TelemetryForEvictingStaleCookie(nsCookie* aEvicted, int64_t oldestCookieTime);
void NotifyRejected(nsIURI *aHostURI);
void NotifyThirdParty(nsIURI *aHostURI, bool aAccepted, nsIChannel *aChannel);
void NotifyChanged(nsISupports *aSubject, const char16_t *aData);
diff --git a/netwerk/dns/nsHostResolver.cpp b/netwerk/dns/nsHostResolver.cpp
index c4883ab29..323470c34 100644
--- a/netwerk/dns/nsHostResolver.cpp
+++ b/netwerk/dns/nsHostResolver.cpp
@@ -32,7 +32,6 @@
#include "mozilla/HashFunctions.h"
#include "mozilla/TimeStamp.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/DebugOnly.h"
#include "mozilla/Preferences.h"
@@ -1419,7 +1418,6 @@ nsHostResolver::ThreadFunc(void *arg)
LOG(("DNS lookup thread - Calling getaddrinfo for host [%s%s%s].\n",
LOG_HOST(rec->host, rec->netInterface)));
- TimeStamp startTime = TimeStamp::Now();
#if TTL_AVAILABLE
bool getTtl = rec->mGetTtl;
#else
diff --git a/netwerk/protocol/http/Http2Stream.cpp b/netwerk/protocol/http/Http2Stream.cpp
index 3471985dd..581ebe016 100644
--- a/netwerk/protocol/http/Http2Stream.cpp
+++ b/netwerk/protocol/http/Http2Stream.cpp
@@ -657,12 +657,6 @@ Http2Stream::GenerateOpen()
outputOffset += frameLen;
}
- // The size of the input headers is approximate
- uint32_t ratio =
- compressedData.Length() * 100 /
- (11 + requestURI.Length() +
- mFlatHttpRequestHeaders.Length());
-
mFlatHttpRequestHeaders.Truncate();
return NS_OK;
}
@@ -980,7 +974,7 @@ Http2Stream::GenerateDataFrameHeader(uint32_t dataLength, bool lastFrame)
}
// ConvertResponseHeaders is used to convert the response headers
-// into HTTP/1 format and report some telemetry
+// into HTTP/1 format
nsresult
Http2Stream::ConvertResponseHeaders(Http2Decompressor *decompressor,
nsACString &aHeadersIn,
@@ -1036,7 +1030,7 @@ Http2Stream::ConvertResponseHeaders(Http2Decompressor *decompressor,
}
// ConvertPushHeaders is used to convert the pushed request headers
-// into HTTP/1 format and report some telemetry
+// into HTTP/1 format
nsresult
Http2Stream::ConvertPushHeaders(Http2Decompressor *decompressor,
nsACString &aHeadersIn,
diff --git a/netwerk/protocol/http/HttpBaseChannel.cpp b/netwerk/protocol/http/HttpBaseChannel.cpp
index 21b661c2b..9e43d89e0 100644
--- a/netwerk/protocol/http/HttpBaseChannel.cpp
+++ b/netwerk/protocol/http/HttpBaseChannel.cpp
@@ -996,16 +996,6 @@ HttpBaseChannel::DoApplyContentConversions(nsIStreamListener* aNextListener,
}
LOG(("converter removed '%s' content-encoding\n", val));
- if (gHttpHandler->IsTelemetryEnabled()) {
- int mode = 0;
- if (from.Equals("gzip") || from.Equals("x-gzip")) {
- mode = 1;
- } else if (from.Equals("deflate") || from.Equals("x-deflate")) {
- mode = 2;
- } else if (from.Equals("br")) {
- mode = 3;
- }
- }
nextListener = converter;
}
else {
diff --git a/netwerk/protocol/http/nsHttpChannel.cpp b/netwerk/protocol/http/nsHttpChannel.cpp
index be5539a02..a890c51b3 100644
--- a/netwerk/protocol/http/nsHttpChannel.cpp
+++ b/netwerk/protocol/http/nsHttpChannel.cpp
@@ -83,7 +83,6 @@
#include "nsCRT.h"
#include "CacheObserver.h"
#include "mozilla/dom/Performance.h"
-#include "mozilla/Telemetry.h"
#include "AlternateServices.h"
#include "InterceptedChannel.h"
#include "nsIHttpPushListener.h"
@@ -123,19 +122,6 @@ static NS_DEFINE_CID(kStreamListenerTeeCID, NS_STREAMLISTENERTEE_CID);
static NS_DEFINE_CID(kStreamTransportServiceCID,
NS_STREAMTRANSPORTSERVICE_CID);
-enum CacheDisposition {
- kCacheHit = 1,
- kCacheHitViaReval = 2,
- kCacheMissedViaReval = 3,
- kCacheMissed = 4
-};
-
-void
-AccumulateCacheHitTelemetry(CacheDisposition hitOrMiss)
-{
- /* STUB */
-}
-
// Computes and returns a SHA1 hash of the input buffer. The input buffer
// must be a null-terminated string.
nsresult
@@ -494,11 +480,6 @@ nsHttpChannel::ContinueConnect()
event->Revoke();
}
- // Don't accumulate the cache hit telemetry for intercepted channels.
- if (mInterceptCache != INTERCEPTED) {
- AccumulateCacheHitTelemetry(kCacheHit);
- }
-
return rv;
}
else if (mLoadFlags & LOAD_ONLY_FROM_CACHE) {
@@ -1085,10 +1066,8 @@ ProcessXCTO(nsIURI* aURI, nsHttpResponseHead* aResponseHead, nsILoadInfo* aLoadI
if (aLoadInfo->GetExternalContentPolicyType() == nsIContentPolicy::TYPE_IMAGE) {
if (StringBeginsWith(contentType, NS_LITERAL_CSTRING("image/"))) {
- Accumulate(Telemetry::XCTO_NOSNIFF_BLOCK_IMAGE, 0);
return NS_OK;
}
- Accumulate(Telemetry::XCTO_NOSNIFF_BLOCK_IMAGE, 1);
// Instead of consulting Preferences::GetBool() all the time we
// can cache the result to speed things up.
static bool sXCTONosniffBlockImages = false;
@@ -2116,29 +2095,6 @@ nsHttpChannel::ContinueProcessResponse2(nsresult rv)
break;
}
- if (gHttpHandler->IsTelemetryEnabled()) {
- CacheDisposition cacheDisposition;
- if (!mDidReval) {
- cacheDisposition = kCacheMissed;
- } else if (successfulReval) {
- cacheDisposition = kCacheHitViaReval;
- } else {
- cacheDisposition = kCacheMissedViaReval;
- }
- AccumulateCacheHitTelemetry(cacheDisposition);
-
- if (mResponseHead->Version() == NS_HTTP_VERSION_0_9) {
- // DefaultPortTopLevel = 0, DefaultPortSubResource = 1,
- // NonDefaultPortTopLevel = 2, NonDefaultPortSubResource = 3
- uint32_t v09Info = 0;
- if (!(mLoadFlags & LOAD_INITIAL_DOCUMENT_URI)) {
- v09Info += 1;
- }
- if (mConnectionInfo->OriginPort() != mConnectionInfo->DefaultPort()) {
- v09Info += 2;
- }
- }
- }
return rv;
}
@@ -3784,8 +3740,6 @@ nsHttpChannel::OnCacheEntryCheck(nsICacheEntry* entry, nsIApplicationCache* appC
(!mCachedResponseHead->ExpiresInPast() ||
!mCachedResponseHead->MustValidateIfExpired())) {
LOG(("NOT validating based on isForcedValid being true.\n"));
- Telemetry::AutoCounter<Telemetry::PREDICTOR_TOTAL_PREFETCHES_USED> used;
- ++used;
doValidation = false;
}
// If the LOAD_FROM_CACHE flag is set, any cached data can simply be used
@@ -6546,8 +6500,6 @@ nsHttpChannel::OnStopRequest(nsIRequest *request, nsISupports *ctxt, nsresult st
if (mTimingEnabled && request == mCachePump) {
mCacheReadEnd = TimeStamp::Now();
-
- ReportNetVSCacheTelemetry();
}
// allow content to be cached if it was loaded successfully (bug #482935)
@@ -8104,12 +8056,5 @@ nsHttpChannel::SetDoNotTrack()
}
}
-
-void
-nsHttpChannel::ReportNetVSCacheTelemetry()
-{
- /* STUB */
-}
-
} // namespace net
} // namespace mozilla
diff --git a/netwerk/protocol/http/nsHttpChannel.h b/netwerk/protocol/http/nsHttpChannel.h
index 152cf1503..554875b1c 100644
--- a/netwerk/protocol/http/nsHttpChannel.h
+++ b/netwerk/protocol/http/nsHttpChannel.h
@@ -431,9 +431,6 @@ private:
rv == NS_ERROR_MALFORMED_URI;
}
- // Report net vs cache time telemetry
- void ReportNetVSCacheTelemetry();
-
// Create a aggregate set of the current notification callbacks
// and ensure the transaction is updated to use it.
void UpdateAggregateCallbacks();
diff --git a/netwerk/protocol/http/nsHttpConnectionMgr.cpp b/netwerk/protocol/http/nsHttpConnectionMgr.cpp
index 731cdff39..907f33436 100644
--- a/netwerk/protocol/http/nsHttpConnectionMgr.cpp
+++ b/netwerk/protocol/http/nsHttpConnectionMgr.cpp
@@ -35,8 +35,6 @@
#include "mozilla/Unused.h"
#include "nsIURI.h"
-#include "mozilla/Telemetry.h"
-
namespace mozilla {
namespace net {
@@ -1186,14 +1184,6 @@ nsHttpConnectionMgr::MakeNewConnection(nsConnectionEntry *ent,
transport->SetConnectionFlags(flags);
}
- Telemetry::AutoCounter<Telemetry::HTTPCONNMGR_USED_SPECULATIVE_CONN> usedSpeculativeConn;
- ++usedSpeculativeConn;
-
- if (ent->mHalfOpens[i]->IsFromPredictor()) {
- Telemetry::AutoCounter<Telemetry::PREDICTOR_TOTAL_PRECONNECTS_USED> totalPreconnectsUsed;
- ++totalPreconnectsUsed;
- }
-
// return OK because we have essentially opened a new connection
// by converting a speculative half-open to general use
return NS_OK;
@@ -1387,14 +1377,6 @@ nsHttpConnectionMgr::AddToShortestPipeline(nsConnectionEntry *ent,
ent->SetYellowConnection(bestConn);
if (!trans->GetPendingTime().IsNull()) {
- if (trans->UsesPipelining())
- AccumulateTimeDelta(
- Telemetry::TRANSACTION_WAIT_TIME_HTTP_PIPELINES,
- trans->GetPendingTime(), TimeStamp::Now());
- else
- AccumulateTimeDelta(
- Telemetry::TRANSACTION_WAIT_TIME_HTTP,
- trans->GetPendingTime(), TimeStamp::Now());
trans->SetPendingTime(false);
}
return true;
@@ -1677,8 +1659,6 @@ nsHttpConnectionMgr::DispatchTransaction(nsConnectionEntry *ent,
rv = conn->Activate(trans, caps, priority);
MOZ_ASSERT(NS_SUCCEEDED(rv), "SPDY Cannot Fail Dispatch");
if (NS_SUCCEEDED(rv) && !trans->GetPendingTime().IsNull()) {
- AccumulateTimeDelta(Telemetry::TRANSACTION_WAIT_TIME_SPDY,
- trans->GetPendingTime(), TimeStamp::Now());
trans->SetPendingTime(false);
}
return rv;
@@ -1695,12 +1675,6 @@ nsHttpConnectionMgr::DispatchTransaction(nsConnectionEntry *ent,
rv = DispatchAbstractTransaction(ent, trans, caps, conn, priority);
if (NS_SUCCEEDED(rv) && !trans->GetPendingTime().IsNull()) {
- if (trans->UsesPipelining())
- AccumulateTimeDelta(Telemetry::TRANSACTION_WAIT_TIME_HTTP_PIPELINES,
- trans->GetPendingTime(), TimeStamp::Now());
- else
- AccumulateTimeDelta(Telemetry::TRANSACTION_WAIT_TIME_HTTP,
- trans->GetPendingTime(), TimeStamp::Now());
trans->SetPendingTime(false);
}
return rv;
@@ -1829,12 +1803,6 @@ nsHttpConnectionMgr::BuildPipeline(nsConnectionEntry *ent,
return NS_OK;
}
-void
-nsHttpConnectionMgr::ReportProxyTelemetry(nsConnectionEntry *ent)
-{
- /* STUB */
-}
-
nsresult
nsHttpConnectionMgr::ProcessNewTransaction(nsHttpTransaction *trans)
{
@@ -1878,8 +1846,6 @@ nsHttpConnectionMgr::ProcessNewTransaction(nsHttpTransaction *trans)
ent = preferredEntry;
}
- ReportProxyTelemetry(ent);
-
// Check if the transaction already has a sticky reference to a connection.
// If so, then we can just use it directly by transferring its reference
// to the new connection variable instead of searching for a new one
@@ -1976,13 +1942,9 @@ nsHttpConnectionMgr::CreateTransport(nsConnectionEntry *ent,
if (speculative) {
sock->SetSpeculative(true);
sock->SetAllow1918(allow1918);
- Telemetry::AutoCounter<Telemetry::HTTPCONNMGR_TOTAL_SPECULATIVE_CONN> totalSpeculativeConn;
- ++totalSpeculativeConn;
if (isFromPredictor) {
sock->SetIsFromPredictor(true);
- Telemetry::AutoCounter<Telemetry::PREDICTOR_TOTAL_PRECONNECTS_CREATED> totalPreconnectsCreated;
- ++totalPreconnectsCreated;
}
}
@@ -3894,16 +3856,6 @@ nsConnectionEntry::RemoveHalfOpen(nsHalfOpenSocket *halfOpen)
// will result in it not being present in the halfopen table. That's expected.
if (mHalfOpens.RemoveElement(halfOpen)) {
- if (halfOpen->IsSpeculative()) {
- Telemetry::AutoCounter<Telemetry::HTTPCONNMGR_UNUSED_SPECULATIVE_CONN> unusedSpeculativeConn;
- ++unusedSpeculativeConn;
-
- if (halfOpen->IsFromPredictor()) {
- Telemetry::AutoCounter<Telemetry::PREDICTOR_TOTAL_PRECONNECTS_UNUSED> totalPreconnectsUnused;
- ++totalPreconnectsUnused;
- }
- }
-
MOZ_ASSERT(gHttpHandler->ConnMgr()->mNumHalfOpenConns);
if (gHttpHandler->ConnMgr()->mNumHalfOpenConns) { // just in case
gHttpHandler->ConnMgr()->mNumHalfOpenConns--;
diff --git a/netwerk/protocol/http/nsHttpConnectionMgr.h b/netwerk/protocol/http/nsHttpConnectionMgr.h
index 7ca2a2b28..a2c88c402 100644
--- a/netwerk/protocol/http/nsHttpConnectionMgr.h
+++ b/netwerk/protocol/http/nsHttpConnectionMgr.h
@@ -529,7 +529,6 @@ private:
nsresult ProcessNewTransaction(nsHttpTransaction *);
nsresult EnsureSocketThreadTarget();
void ClosePersistentConnections(nsConnectionEntry *ent);
- void ReportProxyTelemetry(nsConnectionEntry *ent);
nsresult CreateTransport(nsConnectionEntry *, nsAHttpTransaction *,
uint32_t, bool, bool, bool);
void AddActiveConn(nsHttpConnection *, nsConnectionEntry *);
diff --git a/netwerk/protocol/http/nsHttpHandler.cpp b/netwerk/protocol/http/nsHttpHandler.cpp
index 6d58a7004..477961454 100644
--- a/netwerk/protocol/http/nsHttpHandler.cpp
+++ b/netwerk/protocol/http/nsHttpHandler.cpp
@@ -90,7 +90,6 @@
#define BROWSER_PREF_PREFIX "browser.cache."
#define DONOTTRACK_HEADER_ENABLED "privacy.donottrackheader.enabled"
#define H2MANDATORY_SUITE "security.ssl3.ecdhe_rsa_aes_128_gcm_sha256"
-#define TELEMETRY_ENABLED "toolkit.telemetry.enabled"
#define ALLOW_EXPERIMENTS "network.allow-experiments"
#define SAFE_HINT_HEADER_VALUE "safeHint.enabled"
#define SECURITY_PREFIX "security."
@@ -209,7 +208,6 @@ nsHttpHandler::nsHttpHandler()
, mSafeHintEnabled(false)
, mParentalControlEnabled(false)
, mHandlerActive(false)
- , mTelemetryEnabled(false)
, mAllowExperiments(true)
, mDebugObservations(false)
, mEnableSpdy(false)
@@ -305,7 +303,6 @@ nsHttpHandler::Init()
prefBranch->AddObserver(INTL_ACCEPT_LANGUAGES, this, true);
prefBranch->AddObserver(BROWSER_PREF("disk_cache_ssl"), this, true);
prefBranch->AddObserver(DONOTTRACK_HEADER_ENABLED, this, true);
- prefBranch->AddObserver(TELEMETRY_ENABLED, this, true);
prefBranch->AddObserver(H2MANDATORY_SUITE, this, true);
prefBranch->AddObserver(HTTP_PREF("tcp_keepalive.short_lived_connections"), this, true);
prefBranch->AddObserver(HTTP_PREF("tcp_keepalive.long_lived_connections"), this, true);
@@ -1547,19 +1544,6 @@ nsHttpHandler::PrefsChanged(nsIPrefBranch *prefs, const char *pref)
// includes telemetry and allow-experiments because of the abtest profile
bool requestTokenBucketUpdated = false;
- //
- // Telemetry
- //
-
- if (PREF_CHANGED(TELEMETRY_ENABLED)) {
- cVar = false;
- requestTokenBucketUpdated = true;
- rv = prefs->GetBoolPref(TELEMETRY_ENABLED, &cVar);
- if (NS_SUCCEEDED(rv)) {
- mTelemetryEnabled = cVar;
- }
- }
-
// "security.ssl3.ecdhe_rsa_aes_128_gcm_sha256" is the required h2 interop
// suite.
diff --git a/netwerk/protocol/http/nsHttpHandler.h b/netwerk/protocol/http/nsHttpHandler.h
index 848dd25b1..f1ec0f947 100644
--- a/netwerk/protocol/http/nsHttpHandler.h
+++ b/netwerk/protocol/http/nsHttpHandler.h
@@ -105,8 +105,10 @@ public:
bool EnforceAssocReq() { return mEnforceAssocReq; }
bool IsPersistentHttpsCachingEnabled() { return mEnablePersistentHttpsCaching; }
- bool IsTelemetryEnabled() { return mTelemetryEnabled; }
- bool AllowExperiments() { return mTelemetryEnabled && mAllowExperiments; }
+
+ // Since telemetry has been removed, experiments should also not be allowed.
+ // Making this function return `false` for now, it will be cleaned up later.
+ bool AllowExperiments() { return false; }
bool IsSpdyEnabled() { return mEnableSpdy; }
bool IsHttp2Enabled() { return mHttp2Enabled; }
@@ -509,9 +511,6 @@ private:
// true in between init and shutdown states
Atomic<bool, Relaxed> mHandlerActive;
- // Whether telemetry is reported or not
- uint32_t mTelemetryEnabled : 1;
-
// The value of network.allow-experiments
uint32_t mAllowExperiments : 1;
diff --git a/old-configure.in b/old-configure.in
index ba3b75ef3..eba476bd0 100644
--- a/old-configure.in
+++ b/old-configure.in
@@ -68,7 +68,7 @@ GNOMEUI_VERSION=2.2.0
GCONF_VERSION=1.2.1
STARTUP_NOTIFICATION_VERSION=0.8
DBUS_VERSION=0.60
-SQLITE_VERSION=3.21.0
+SQLITE_VERSION=3.26.0
dnl Set various checks
dnl ========================================================
@@ -5594,22 +5594,6 @@ fi
AC_SUBST(PREPROCESS_OPTION)
-dnl ========================================================
-dnl mask as shorthand property
-dnl ========================================================
-
-# The control structure code will be removed as soon as the feature is stable
-# Refer to bug 1281101 for more details.
-
-# Enable mask-as-shorthand property by default for nightly and aurora channels
-if test -z "$RELEASE_OR_BETA"; then
- dnl mask as shorthand property enabled
- MOZ_ENABLE_MASK_AS_SHORTHAND=1
- AC_DEFINE(MOZ_ENABLE_MASK_AS_SHORTHAND)
-fi
-
-AC_SUBST(MOZ_ENABLE_MASK_AS_SHORTHAND)
-
# Avoid using obsolete NSPR features
AC_DEFINE(NO_NSPR_10_SUPPORT)
diff --git a/python/mozbuild/mozbuild/mach_commands.py b/python/mozbuild/mozbuild/mach_commands.py
index 1bd5b8d34..a45656b37 100644
--- a/python/mozbuild/mozbuild/mach_commands.py
+++ b/python/mozbuild/mozbuild/mach_commands.py
@@ -546,7 +546,7 @@ class Build(MachCommandBase):
# We skip if, ifdef, ifndef, else, elif, elifdef and elifndef, because they are never used alone
grepcmd = 'grep -E -r "^(#|%)(define|endif|error|expand|filter|include|literal|undef|unfilter)" '\
+ '--include=\*.{css,dtd,html,js,jsm,xhtml,xml,xul,manifest,properties,rdf} '\
- + self.topobjdir + '/dist/bin | grep -v ".css:#"'
+ + self.topobjdir + '/dist/bin | awk "/\.css:%/ || (!/\.css/ && /:#/)"'
grepresult = subprocess.Popen(grepcmd, stdout=subprocess.PIPE, shell=True).communicate()[0]
if grepresult:
print('\nERROR: preprocessor was not applied to the following files:\n\n' + grepresult)
diff --git a/security/certverifier/CertVerifier.cpp b/security/certverifier/CertVerifier.cpp
index 2957a269f..1139ecae5 100644
--- a/security/certverifier/CertVerifier.cpp
+++ b/security/certverifier/CertVerifier.cpp
@@ -333,7 +333,6 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
/*optional out*/ OCSPStaplingStatus* ocspStaplingStatus,
/*optional out*/ KeySizeStatus* keySizeStatus,
/*optional out*/ SHA1ModeResult* sha1ModeResult,
- /*optional out*/ PinningTelemetryInfo* pinningTelemetryInfo,
/*optional out*/ CertificateTransparencyInfo* ctInfo)
{
MOZ_LOG(gCertVerifierLog, LogLevel::Debug, ("Top of VerifyCert\n"));
@@ -423,7 +422,7 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
SHA1Mode::Allowed,
NetscapeStepUpPolicy::NeverMatch,
originAttributes,
- builtChain, nullptr, nullptr);
+ builtChain, nullptr);
rv = BuildCertChain(trustDomain, certDER, time,
EndEntityOrCA::MustBeEndEntity,
KeyUsage::digitalSignature,
@@ -484,19 +483,13 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
continue;
}
- // Because of the try-strict and fallback approach, we have to clear any
- // previously noted telemetry information
- if (pinningTelemetryInfo) {
- pinningTelemetryInfo->Reset();
- }
-
NSSCertDBTrustDomain
trustDomain(trustSSL, evOCSPFetching,
mOCSPCache, pinArg, ocspGETConfig,
mCertShortLifetimeInDays, mPinningMode, MIN_RSA_BITS,
ValidityCheckingMode::CheckForEV,
sha1ModeConfigurations[i], mNetscapeStepUpPolicy,
- originAttributes, builtChain, pinningTelemetryInfo,
+ originAttributes, builtChain,
hostname);
rv = BuildCertChainForOneKeyUsage(trustDomain, certDER, time,
KeyUsage::digitalSignature,// (EC)DHE
@@ -572,11 +565,6 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
continue;
}
- // invalidate any telemetry info relating to failed chains
- if (pinningTelemetryInfo) {
- pinningTelemetryInfo->Reset();
- }
-
NSSCertDBTrustDomain trustDomain(trustSSL, defaultOCSPFetching,
mOCSPCache, pinArg, ocspGETConfig,
mCertShortLifetimeInDays,
@@ -585,7 +573,7 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
sha1ModeConfigurations[j],
mNetscapeStepUpPolicy,
originAttributes, builtChain,
- pinningTelemetryInfo, hostname);
+ hostname);
rv = BuildCertChainForOneKeyUsage(trustDomain, certDER, time,
KeyUsage::digitalSignature,//(EC)DHE
KeyUsage::keyEncipherment,//RSA
@@ -647,8 +635,7 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
pinningDisabled, MIN_RSA_BITS_WEAK,
ValidityCheckingMode::CheckingOff,
SHA1Mode::Allowed, mNetscapeStepUpPolicy,
- originAttributes, builtChain, nullptr,
- nullptr);
+ originAttributes, builtChain, nullptr);
rv = BuildCertChain(trustDomain, certDER, time,
EndEntityOrCA::MustBeCA, KeyUsage::keyCertSign,
KeyPurposeId::id_kp_serverAuth,
@@ -664,8 +651,7 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
ValidityCheckingMode::CheckingOff,
SHA1Mode::Allowed,
NetscapeStepUpPolicy::NeverMatch,
- originAttributes, builtChain, nullptr,
- nullptr);
+ originAttributes, builtChain, nullptr);
rv = BuildCertChain(trustDomain, certDER, time,
EndEntityOrCA::MustBeEndEntity,
KeyUsage::digitalSignature,
@@ -692,8 +678,7 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
ValidityCheckingMode::CheckingOff,
SHA1Mode::Allowed,
NetscapeStepUpPolicy::NeverMatch,
- originAttributes, builtChain, nullptr,
- nullptr);
+ originAttributes, builtChain, nullptr);
rv = BuildCertChain(trustDomain, certDER, time,
EndEntityOrCA::MustBeEndEntity,
KeyUsage::keyEncipherment, // RSA
@@ -717,8 +702,7 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
ValidityCheckingMode::CheckingOff,
SHA1Mode::Allowed,
NetscapeStepUpPolicy::NeverMatch,
- originAttributes, builtChain, nullptr,
- nullptr);
+ originAttributes, builtChain, nullptr);
rv = BuildCertChain(trustDomain, certDER, time,
EndEntityOrCA::MustBeEndEntity,
KeyUsage::digitalSignature,
@@ -751,8 +735,7 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
ValidityCheckingMode::CheckingOff,
SHA1Mode::Allowed,
NetscapeStepUpPolicy::NeverMatch,
- originAttributes, builtChain, nullptr,
- nullptr);
+ originAttributes, builtChain, nullptr);
rv = BuildCertChain(sslTrust, certDER, time, endEntityOrCA,
keyUsage, eku, CertPolicyId::anyPolicy,
stapledOCSPResponse);
@@ -764,8 +747,7 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
ValidityCheckingMode::CheckingOff,
SHA1Mode::Allowed,
NetscapeStepUpPolicy::NeverMatch,
- originAttributes, builtChain, nullptr,
- nullptr);
+ originAttributes, builtChain, nullptr);
rv = BuildCertChain(emailTrust, certDER, time, endEntityOrCA,
keyUsage, eku, CertPolicyId::anyPolicy,
stapledOCSPResponse);
@@ -780,7 +762,7 @@ CertVerifier::VerifyCert(CERTCertificate* cert, SECCertificateUsage usage,
SHA1Mode::Allowed,
NetscapeStepUpPolicy::NeverMatch,
originAttributes, builtChain,
- nullptr, nullptr);
+ nullptr);
rv = BuildCertChain(objectSigningTrust, certDER, time,
endEntityOrCA, keyUsage, eku,
CertPolicyId::anyPolicy, stapledOCSPResponse);
@@ -816,7 +798,6 @@ CertVerifier::VerifySSLServerCert(const UniqueCERTCertificate& peerCert,
/*optional out*/ OCSPStaplingStatus* ocspStaplingStatus,
/*optional out*/ KeySizeStatus* keySizeStatus,
/*optional out*/ SHA1ModeResult* sha1ModeResult,
- /*optional out*/ PinningTelemetryInfo* pinningTelemetryInfo,
/*optional out*/ CertificateTransparencyInfo* ctInfo)
{
PR_ASSERT(peerCert);
@@ -838,7 +819,7 @@ CertVerifier::VerifySSLServerCert(const UniqueCERTCertificate& peerCert,
pinarg, hostname, builtChain, flags,
stapledOCSPResponse, sctsFromTLS, originAttributes,
evOidPolicy, ocspStaplingStatus, keySizeStatus,
- sha1ModeResult, pinningTelemetryInfo, ctInfo);
+ sha1ModeResult, ctInfo);
if (rv != Success) {
return rv;
}
diff --git a/security/certverifier/CertVerifier.h b/security/certverifier/CertVerifier.h
index d88c3f33c..fbc3adab4 100644
--- a/security/certverifier/CertVerifier.h
+++ b/security/certverifier/CertVerifier.h
@@ -11,7 +11,6 @@
#include "CTVerifyResult.h"
#include "OCSPCache.h"
#include "ScopedNSSTypes.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/UniquePtr.h"
#include "pkix/pkixtypes.h"
@@ -66,22 +65,6 @@ enum class SHA1ModeResult {
enum class NetscapeStepUpPolicy : uint32_t;
-class PinningTelemetryInfo
-{
-public:
- PinningTelemetryInfo() { Reset(); }
-
- // Should we accumulate pinning telemetry for the result?
- bool accumulateResult;
- Telemetry::ID certPinningResultHistogram;
- int32_t certPinningResultBucket;
- // Should we accumulate telemetry for the root?
- bool accumulateForRoot;
- int32_t rootBucket;
-
- void Reset() { accumulateForRoot = false; accumulateResult = false; }
-};
-
class CertificateTransparencyInfo
{
public:
@@ -137,7 +120,6 @@ public:
/*optional out*/ OCSPStaplingStatus* ocspStaplingStatus = nullptr,
/*optional out*/ KeySizeStatus* keySizeStatus = nullptr,
/*optional out*/ SHA1ModeResult* sha1ModeResult = nullptr,
- /*optional out*/ PinningTelemetryInfo* pinningTelemetryInfo = nullptr,
/*optional out*/ CertificateTransparencyInfo* ctInfo = nullptr);
mozilla::pkix::Result VerifySSLServerCert(
@@ -156,7 +138,6 @@ public:
/*optional out*/ OCSPStaplingStatus* ocspStaplingStatus = nullptr,
/*optional out*/ KeySizeStatus* keySizeStatus = nullptr,
/*optional out*/ SHA1ModeResult* sha1ModeResult = nullptr,
- /*optional out*/ PinningTelemetryInfo* pinningTelemetryInfo = nullptr,
/*optional out*/ CertificateTransparencyInfo* ctInfo = nullptr);
enum PinningMode {
diff --git a/security/certverifier/NSSCertDBTrustDomain.cpp b/security/certverifier/NSSCertDBTrustDomain.cpp
index 39f7d3e9e..5e89c2484 100644
--- a/security/certverifier/NSSCertDBTrustDomain.cpp
+++ b/security/certverifier/NSSCertDBTrustDomain.cpp
@@ -60,7 +60,6 @@ NSSCertDBTrustDomain::NSSCertDBTrustDomain(SECTrustType certDBTrustType,
NetscapeStepUpPolicy netscapeStepUpPolicy,
const NeckoOriginAttributes& originAttributes,
UniqueCERTCertList& builtChain,
- /*optional*/ PinningTelemetryInfo* pinningTelemetryInfo,
/*optional*/ const char* hostname)
: mCertDBTrustType(certDBTrustType)
, mOCSPFetching(ocspFetching)
@@ -75,7 +74,6 @@ NSSCertDBTrustDomain::NSSCertDBTrustDomain(SECTrustType certDBTrustType,
, mNetscapeStepUpPolicy(netscapeStepUpPolicy)
, mOriginAttributes(originAttributes)
, mBuiltChain(builtChain)
- , mPinningTelemetryInfo(pinningTelemetryInfo)
, mHostname(hostname)
, mCertBlocklist(do_GetService(NS_CERTBLOCKLIST_CONTRACTID))
, mOCSPStaplingStatus(CertVerifier::OCSP_STAPLING_NEVER_CHECKED)
@@ -874,8 +872,7 @@ NSSCertDBTrustDomain::IsChainValid(const DERArray& certArray, Time time)
(mPinningMode == CertVerifier::pinningEnforceTestMode);
bool chainHasValidPins;
nsresult nsrv = PublicKeyPinningService::ChainHasValidPins(
- certList, mHostname, time, enforceTestMode, chainHasValidPins,
- mPinningTelemetryInfo);
+ certList, mHostname, time, enforceTestMode, chainHasValidPins);
if (NS_FAILED(nsrv)) {
return Result::FATAL_ERROR_LIBRARY_FAILURE;
}
diff --git a/security/certverifier/NSSCertDBTrustDomain.h b/security/certverifier/NSSCertDBTrustDomain.h
index 64827536c..becf29eee 100644
--- a/security/certverifier/NSSCertDBTrustDomain.h
+++ b/security/certverifier/NSSCertDBTrustDomain.h
@@ -84,7 +84,6 @@ public:
NetscapeStepUpPolicy netscapeStepUpPolicy,
const NeckoOriginAttributes& originAttributes,
UniqueCERTCertList& builtChain,
- /*optional*/ PinningTelemetryInfo* pinningTelemetryInfo = nullptr,
/*optional*/ const char* hostname = nullptr);
virtual Result FindIssuer(mozilla::pkix::Input encodedIssuerName,
@@ -188,7 +187,6 @@ private:
NetscapeStepUpPolicy mNetscapeStepUpPolicy;
const NeckoOriginAttributes& mOriginAttributes;
UniqueCERTCertList& mBuiltChain; // non-owning
- PinningTelemetryInfo* mPinningTelemetryInfo;
const char* mHostname; // non-owning - only used for pinning checks
nsCOMPtr<nsICertBlocklist> mCertBlocklist;
CertVerifier::OCSPStaplingStatus mOCSPStaplingStatus;
diff --git a/security/manager/ssl/PublicKeyPinningService.cpp b/security/manager/ssl/PublicKeyPinningService.cpp
index 1f34c880b..ffee8ba48 100644
--- a/security/manager/ssl/PublicKeyPinningService.cpp
+++ b/security/manager/ssl/PublicKeyPinningService.cpp
@@ -4,11 +4,9 @@
#include "PublicKeyPinningService.h"
-#include "RootCertificateTelemetryUtils.h"
#include "mozilla/Base64.h"
#include "mozilla/Casting.h"
#include "mozilla/Logging.h"
-#include "mozilla/Telemetry.h"
#include "nsISiteSecurityService.h"
#include "nsServiceManagerUtils.h"
#include "nsSiteSecurityService.h"
@@ -233,8 +231,7 @@ FindPinningInformation(const char* hostname, mozilla::pkix::Time time,
static nsresult
CheckPinsForHostname(const UniqueCERTCertList& certList, const char* hostname,
bool enforceTestMode, mozilla::pkix::Time time,
- /*out*/ bool& chainHasValidPins,
- /*optional out*/ PinningTelemetryInfo* pinningTelemetryInfo)
+ /*out*/ bool& chainHasValidPins)
{
chainHasValidPins = false;
if (!certList) {
@@ -265,47 +262,11 @@ CheckPinsForHostname(const UniqueCERTCertList& certList, const char* hostname,
return rv;
}
chainHasValidPins = enforceTestModeResult;
- Telemetry::ID histogram = staticFingerprints->mIsMoz
- ? Telemetry::CERT_PINNING_MOZ_RESULTS
- : Telemetry::CERT_PINNING_RESULTS;
if (staticFingerprints->mTestMode) {
- histogram = staticFingerprints->mIsMoz
- ? Telemetry::CERT_PINNING_MOZ_TEST_RESULTS
- : Telemetry::CERT_PINNING_TEST_RESULTS;
if (!enforceTestMode) {
chainHasValidPins = true;
}
}
- // We can collect per-host pinning violations for this host because it is
- // operationally critical to Firefox.
- if (pinningTelemetryInfo) {
- if (staticFingerprints->mId != kUnknownId) {
- int32_t bucket = staticFingerprints->mId * 2
- + (enforceTestModeResult ? 1 : 0);
- histogram = staticFingerprints->mTestMode
- ? Telemetry::CERT_PINNING_MOZ_TEST_RESULTS_BY_HOST
- : Telemetry::CERT_PINNING_MOZ_RESULTS_BY_HOST;
- pinningTelemetryInfo->certPinningResultBucket = bucket;
- } else {
- pinningTelemetryInfo->certPinningResultBucket =
- enforceTestModeResult ? 1 : 0;
- }
- pinningTelemetryInfo->accumulateResult = true;
- pinningTelemetryInfo->certPinningResultHistogram = histogram;
- }
-
- // We only collect per-CA pinning statistics upon failures.
- CERTCertListNode* rootNode = CERT_LIST_TAIL(certList);
- // Only log telemetry if the certificate list is non-empty.
- if (!CERT_LIST_END(rootNode, certList)) {
- if (!enforceTestModeResult && pinningTelemetryInfo) {
- int32_t binNumber = RootCABinNumber(&rootNode->cert->derCert);
- if (binNumber != ROOT_CERTIFICATE_UNKNOWN ) {
- pinningTelemetryInfo->accumulateForRoot = true;
- pinningTelemetryInfo->rootBucket = binNumber;
- }
- }
- }
MOZ_LOG(gPublicKeyPinningLog, LogLevel::Debug,
("pkpin: Pin check %s for %s host '%s' (mode=%s)\n",
@@ -322,8 +283,7 @@ PublicKeyPinningService::ChainHasValidPins(const UniqueCERTCertList& certList,
const char* hostname,
mozilla::pkix::Time time,
bool enforceTestMode,
- /*out*/ bool& chainHasValidPins,
- /*optional out*/ PinningTelemetryInfo* pinningTelemetryInfo)
+ /*out*/ bool& chainHasValidPins)
{
chainHasValidPins = false;
if (!certList) {
@@ -334,8 +294,7 @@ PublicKeyPinningService::ChainHasValidPins(const UniqueCERTCertList& certList,
}
nsAutoCString canonicalizedHostname(CanonicalizeHostname(hostname));
return CheckPinsForHostname(certList, canonicalizedHostname.get(),
- enforceTestMode, time, chainHasValidPins,
- pinningTelemetryInfo);
+ enforceTestMode, time, chainHasValidPins);
}
nsresult
diff --git a/security/manager/ssl/PublicKeyPinningService.h b/security/manager/ssl/PublicKeyPinningService.h
index f42376b52..09fdd8474 100644
--- a/security/manager/ssl/PublicKeyPinningService.h
+++ b/security/manager/ssl/PublicKeyPinningService.h
@@ -31,8 +31,7 @@ public:
const char* hostname,
mozilla::pkix::Time time,
bool enforceTestMode,
- /*out*/ bool& chainHasValidPins,
- /*optional out*/ PinningTelemetryInfo* pinningTelemetryInfo);
+ /*out*/ bool& chainHasValidPins);
/**
* Sets chainMatchesPinset to true if there is any intersection between the
* certificate list and the pins specified in the aSHA256keys array.
diff --git a/security/manager/ssl/RootCertificateTelemetryUtils.cpp b/security/manager/ssl/RootCertificateTelemetryUtils.cpp
deleted file mode 100644
index 3f9ea3eb6..000000000
--- a/security/manager/ssl/RootCertificateTelemetryUtils.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "RootCertificateTelemetryUtils.h"
-
-#include "mozilla/Logging.h"
-#include "RootHashes.inc" // Note: Generated by genRootCAHashes.js
-#include "ScopedNSSTypes.h"
-#include "mozilla/ArrayUtils.h"
-
-namespace mozilla { namespace psm {
-
-mozilla::LazyLogModule gPublicKeyPinningTelemetryLog("PublicKeyPinningTelemetryService");
-
-// Used in the BinarySearch method, this does a memcmp between the pointer
-// provided to its construtor and whatever the binary search is looking for.
-//
-// This implementation assumes everything to be of HASH_LEN, so it should not
-// be used generically.
-class BinaryHashSearchArrayComparator
-{
-public:
- explicit BinaryHashSearchArrayComparator(const uint8_t* aTarget, size_t len)
- : mTarget(aTarget)
- {
- NS_ASSERTION(len == HASH_LEN, "Hashes should be of the same length.");
- }
-
- int operator()(const CertAuthorityHash val) const {
- return memcmp(mTarget, val.hash, HASH_LEN);
- }
-
-private:
- const uint8_t* mTarget;
-};
-
-// Perform a hash of the provided cert, then search in the RootHashes.inc data
-// structure for a matching bin number.
-int32_t
-RootCABinNumber(const SECItem* cert)
-{
- Digest digest;
-
- // Compute SHA256 hash of the certificate
- nsresult rv = digest.DigestBuf(SEC_OID_SHA256, cert->data, cert->len);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return ROOT_CERTIFICATE_HASH_FAILURE;
- }
-
- // Compare against list of stored hashes
- size_t idx;
-
- MOZ_LOG(gPublicKeyPinningTelemetryLog, LogLevel::Debug,
- ("pkpinTelem: First bytes %02hx %02hx %02hx %02hx\n",
- digest.get().data[0], digest.get().data[1], digest.get().data[2], digest.get().data[3]));
-
- if (mozilla::BinarySearchIf(ROOT_TABLE, 0, ArrayLength(ROOT_TABLE),
- BinaryHashSearchArrayComparator(static_cast<uint8_t*>(digest.get().data),
- digest.get().len),
- &idx)) {
-
- MOZ_LOG(gPublicKeyPinningTelemetryLog, LogLevel::Debug,
- ("pkpinTelem: Telemetry index was %lu, bin is %d\n",
- idx, ROOT_TABLE[idx].binNumber));
- return (int32_t) ROOT_TABLE[idx].binNumber;
- }
-
- // Didn't match.
- return ROOT_CERTIFICATE_UNKNOWN;
-}
-
-
-// Attempt to increment the appropriate bin in the provided Telemetry probe ID. If
-// there was a hash failure, we do nothing.
-void
-AccumulateTelemetryForRootCA(mozilla::Telemetry::ID probe,
- const CERTCertificate* cert)
-{
- int32_t binId = RootCABinNumber(&cert->derCert);
-
- if (binId != ROOT_CERTIFICATE_HASH_FAILURE) {
- Accumulate(probe, binId);
- }
-}
-
-} // namespace psm
-} // namespace mozilla
diff --git a/security/manager/ssl/RootCertificateTelemetryUtils.h b/security/manager/ssl/RootCertificateTelemetryUtils.h
deleted file mode 100644
index 05dbb4e44..000000000
--- a/security/manager/ssl/RootCertificateTelemetryUtils.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef RootCertificateTelemetryUtils_h
-#define RootCertificateTelemetryUtils_h
-
-#include "mozilla/Telemetry.h"
-#include "certt.h"
-
-namespace mozilla { namespace psm {
-
-// Note: New CAs will show up as UNKNOWN_ROOT until
-// RootHashes.inc is updated to include them. 0 is reserved by
-// genRootCAHashes.js for the unknowns.
-#define ROOT_CERTIFICATE_UNKNOWN 0
-#define ROOT_CERTIFICATE_HASH_FAILURE -1
-
-int32_t
-RootCABinNumber(const SECItem* cert);
-
-void
-AccumulateTelemetryForRootCA(mozilla::Telemetry::ID probe, const CERTCertificate* cert);
-
-} // namespace psm
-} // namespace mozilla
-
-#endif // RootCertificateTelemetryUtils_h
diff --git a/security/manager/ssl/SSLServerCertVerification.cpp b/security/manager/ssl/SSLServerCertVerification.cpp
index 757534955..af985eb92 100644
--- a/security/manager/ssl/SSLServerCertVerification.cpp
+++ b/security/manager/ssl/SSLServerCertVerification.cpp
@@ -102,7 +102,6 @@
#include "ExtendedValidation.h"
#include "NSSCertDBTrustDomain.h"
#include "PSMRunnable.h"
-#include "RootCertificateTelemetryUtils.h"
#include "ScopedNSSTypes.h"
#include "SharedCertVerifier.h"
#include "SharedSSLState.h"
@@ -112,7 +111,6 @@
#include "mozilla/Casting.h"
#include "mozilla/Mutex.h"
#include "mozilla/RefPtr.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/Unused.h"
#include "mozilla/net/DNS.h"
@@ -150,11 +148,6 @@ namespace {
// do not use a nsCOMPtr to avoid static initializer/destructor
nsIThreadPool* gCertVerificationThreadPool = nullptr;
-// We avoid using a mutex for the success case to avoid lock-related
-// performance issues. However, we do use a lock in the error case to simplify
-// the code, since performance in the error case is not important.
-Mutex* gSSLVerificationTelemetryMutex = nullptr;
-
// We add a mutex to serialize PKCS11 database operations
Mutex* gSSLVerificationPK11Mutex = nullptr;
@@ -173,7 +166,6 @@ Mutex* gSSLVerificationPK11Mutex = nullptr;
void
InitializeSSLServerCertVerificationThreads()
{
- gSSLVerificationTelemetryMutex = new Mutex("SSLVerificationTelemetryMutex");
gSSLVerificationPK11Mutex = new Mutex("SSLVerificationPK11Mutex");
// TODO: tuning, make parameters preferences
// XXX: instantiate nsThreadPool directly, to make this more bulletproof.
@@ -207,10 +199,6 @@ void StopSSLServerCertVerificationThreads()
gCertVerificationThreadPool->Shutdown();
NS_RELEASE(gCertVerificationThreadPool);
}
- if (gSSLVerificationTelemetryMutex) {
- delete gSSLVerificationTelemetryMutex;
- gSSLVerificationTelemetryMutex = nullptr;
- }
if (gSSLVerificationPK11Mutex) {
delete gSSLVerificationPK11Mutex;
gSSLVerificationPK11Mutex = nullptr;
@@ -244,8 +232,6 @@ public:
SSLServerCertVerificationResult(nsNSSSocketInfo* infoObject,
PRErrorCode errorCode,
- Telemetry::ID telemetryID = Telemetry::HistogramCount,
- uint32_t telemetryValue = -1,
SSLErrorMessageType errorMessageType =
PlainErrorMessage);
@@ -255,8 +241,6 @@ private:
public:
const PRErrorCode mErrorCode;
const SSLErrorMessageType mErrorMessageType;
- const Telemetry::ID mTelemetryID;
- const uint32_t mTelemetryValue;
};
class CertErrorRunnable : public SyncRunnableBase
@@ -297,63 +281,6 @@ private:
const uint32_t mProviderFlags;
};
-// A probe value of 1 means "no error".
-uint32_t
-MapOverridableErrorToProbeValue(PRErrorCode errorCode)
-{
- switch (errorCode)
- {
- case SEC_ERROR_UNKNOWN_ISSUER: return 2;
- case SEC_ERROR_CA_CERT_INVALID: return 3;
- case SEC_ERROR_UNTRUSTED_ISSUER: return 4;
- case SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE: return 5;
- case SEC_ERROR_UNTRUSTED_CERT: return 6;
- case SEC_ERROR_INADEQUATE_KEY_USAGE: return 7;
- case SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED: return 8;
- case SSL_ERROR_BAD_CERT_DOMAIN: return 9;
- case SEC_ERROR_EXPIRED_CERTIFICATE: return 10;
- case mozilla::pkix::MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY: return 11;
- case mozilla::pkix::MOZILLA_PKIX_ERROR_V1_CERT_USED_AS_CA: return 12;
- case mozilla::pkix::MOZILLA_PKIX_ERROR_INADEQUATE_KEY_SIZE: return 13;
- case mozilla::pkix::MOZILLA_PKIX_ERROR_NOT_YET_VALID_CERTIFICATE: return 14;
- case mozilla::pkix::MOZILLA_PKIX_ERROR_NOT_YET_VALID_ISSUER_CERTIFICATE:
- return 15;
- case SEC_ERROR_INVALID_TIME: return 16;
- case mozilla::pkix::MOZILLA_PKIX_ERROR_EMPTY_ISSUER_NAME: return 17;
- }
- NS_WARNING("Unknown certificate error code. Does MapOverridableErrorToProbeValue "
- "handle everything in DetermineCertOverrideErrors?");
- return 0;
-}
-
-static uint32_t
-MapCertErrorToProbeValue(PRErrorCode errorCode)
-{
- uint32_t probeValue;
- switch (errorCode)
- {
- // see security/pkix/include/pkix/Result.h
-#define MOZILLA_PKIX_MAP(name, value, nss_name) case nss_name: probeValue = value; break;
- MOZILLA_PKIX_MAP_LIST
-#undef MOZILLA_PKIX_MAP
- default: return 0;
- }
-
- // Since FATAL_ERROR_FLAG is 0x800, fatal error values are much larger than
- // non-fatal error values. To conserve space, we remap these so they start at
- // (decimal) 90 instead of 0x800. Currently there are ~50 non-fatal errors
- // mozilla::pkix might return, so saving space for 90 should be sufficient
- // (similarly, there are 4 fatal errors, so saving space for 10 should also
- // be sufficient).
- static_assert(FATAL_ERROR_FLAG == 0x800,
- "mozilla::pkix::FATAL_ERROR_FLAG is not what we were expecting");
- if (probeValue & FATAL_ERROR_FLAG) {
- probeValue ^= FATAL_ERROR_FLAG;
- probeValue += 90;
- }
- return probeValue;
-}
-
SECStatus
DetermineCertOverrideErrors(const UniqueCERTCertificate& cert,
const char* hostName,
@@ -562,19 +489,6 @@ CertErrorRunnable::CheckCertOverrides()
}
if (!remaining_display_errors) {
- // This can double- or triple-count one certificate with multiple
- // different types of errors. Since this is telemetry and we just
- // want a ballpark answer, we don't care.
- if (mErrorCodeTrust != 0) {
- uint32_t probeValue = MapOverridableErrorToProbeValue(mErrorCodeTrust);
- }
- if (mErrorCodeMismatch != 0) {
- uint32_t probeValue = MapOverridableErrorToProbeValue(mErrorCodeMismatch);
- }
- if (mErrorCodeTime != 0) {
- uint32_t probeValue = MapOverridableErrorToProbeValue(mErrorCodeTime);
- }
-
// all errors are covered by override rules, so let's accept the cert
MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
("[%p][%p] All errors covered by override rules\n",
@@ -621,8 +535,6 @@ CertErrorRunnable::CheckCertOverrides()
SSLServerCertVerificationResult* result =
new SSLServerCertVerificationResult(mInfoObject,
errorCodeToReport,
- Telemetry::HistogramCount,
- -1,
OverridableCertErrorMessage);
LogInvalidCertError(mInfoObject,
@@ -656,8 +568,6 @@ CreateCertErrorRunnable(CertVerifier& certVerifier,
MOZ_ASSERT(infoObject);
MOZ_ASSERT(cert);
- uint32_t probeValue = MapCertErrorToProbeValue(defaultErrorCodeToReport);
-
uint32_t collected_errors = 0;
PRErrorCode errorCodeTrust = 0;
PRErrorCode errorCodeMismatch = 0;
@@ -861,334 +771,6 @@ BlockServerCertChangeForSpdy(nsNSSSocketInfo* infoObject,
return SECFailure;
}
-void
-AccumulateSubjectCommonNameTelemetry(const char* commonName,
- bool commonNameInSubjectAltNames)
-{
- if (!commonNameInSubjectAltNames) {
- MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
- ("BR telemetry: common name '%s' not in subject alt. names "
- "(or the subject alt. names extension is not present)\n",
- commonName));
- }
-}
-
-// Returns true if and only if commonName ends with altName (minus its leading
-// "*"). altName has already been checked to be of the form "*.<something>".
-// commonName may be NULL.
-static bool
-TryMatchingWildcardSubjectAltName(const char* commonName,
- const nsACString& altName)
-{
- return commonName &&
- StringEndsWith(nsDependentCString(commonName), Substring(altName, 1));
-}
-
-// Gathers telemetry on Baseline Requirements 9.2.1 (Subject Alternative
-// Names Extension) and 9.2.2 (Subject Common Name Field).
-// Specifically:
-// - whether or not the subject common name field is present
-// - whether or not the subject alternative names extension is present
-// - if there is a malformed entry in the subject alt. names extension
-// - if there is an entry in the subject alt. names extension corresponding
-// to the subject common name
-// Telemetry is only gathered for certificates that chain to a trusted root
-// in Mozilla's Root CA program.
-// certList consists of a validated certificate chain. The end-entity
-// certificate is first and the root (trust anchor) is last.
-void
-GatherBaselineRequirementsTelemetry(const UniqueCERTCertList& certList)
-{
- CERTCertListNode* endEntityNode = CERT_LIST_HEAD(certList);
- CERTCertListNode* rootNode = CERT_LIST_TAIL(certList);
- PR_ASSERT(!(CERT_LIST_END(endEntityNode, certList) ||
- CERT_LIST_END(rootNode, certList)));
- if (CERT_LIST_END(endEntityNode, certList) ||
- CERT_LIST_END(rootNode, certList)) {
- return;
- }
- CERTCertificate* cert = endEntityNode->cert;
- PR_ASSERT(cert);
- if (!cert) {
- return;
- }
- UniquePORTString commonName(CERT_GetCommonName(&cert->subject));
- // This only applies to certificates issued by authorities in our root
- // program.
- CERTCertificate* rootCert = rootNode->cert;
- PR_ASSERT(rootCert);
- if (!rootCert) {
- return;
- }
- bool isBuiltIn = false;
- Result result = IsCertBuiltInRoot(rootCert, isBuiltIn);
- if (result != Success || !isBuiltIn) {
- MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
- ("BR telemetry: root certificate for '%s' is not a built-in root "
- "(or IsCertBuiltInRoot failed)\n", commonName.get()));
- return;
- }
- ScopedAutoSECItem altNameExtension;
- SECStatus rv = CERT_FindCertExtension(cert, SEC_OID_X509_SUBJECT_ALT_NAME,
- &altNameExtension);
- if (rv != SECSuccess) {
- MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
- ("BR telemetry: no subject alt names extension for '%s'\n",
- commonName.get()));
- AccumulateSubjectCommonNameTelemetry(commonName.get(), false);
- return;
- }
-
- UniquePLArenaPool arena(PORT_NewArena(DER_DEFAULT_CHUNKSIZE));
- CERTGeneralName* subjectAltNames =
- CERT_DecodeAltNameExtension(arena.get(), &altNameExtension);
- if (!subjectAltNames) {
- MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
- ("BR telemetry: could not decode subject alt names for '%s'\n",
- commonName.get()));
- AccumulateSubjectCommonNameTelemetry(commonName.get(), false);
- return;
- }
-
- CERTGeneralName* currentName = subjectAltNames;
- bool commonNameInSubjectAltNames = false;
- bool nonDNSNameOrIPAddressPresent = false;
- bool malformedDNSNameOrIPAddressPresent = false;
- bool nonFQDNPresent = false;
- do {
- nsAutoCString altName;
- if (currentName->type == certDNSName) {
- altName.Assign(BitwiseCast<char*, unsigned char*>(
- currentName->name.other.data),
- currentName->name.other.len);
- nsDependentCString altNameWithoutWildcard(altName, 0);
- if (StringBeginsWith(altNameWithoutWildcard, NS_LITERAL_CSTRING("*."))) {
- altNameWithoutWildcard.Rebind(altName, 2);
- commonNameInSubjectAltNames |=
- TryMatchingWildcardSubjectAltName(commonName.get(), altName);
- }
- // net_IsValidHostName appears to return true for valid IP addresses,
- // which would be invalid for a DNS name.
- // Note that the net_IsValidHostName check will catch things like
- // "a.*.example.com".
- if (!net_IsValidHostName(altNameWithoutWildcard) ||
- net_IsValidIPv4Addr(altName.get(), altName.Length()) ||
- net_IsValidIPv6Addr(altName.get(), altName.Length())) {
- MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
- ("BR telemetry: DNSName '%s' not valid (for '%s')\n",
- altName.get(), commonName.get()));
- malformedDNSNameOrIPAddressPresent = true;
- }
- if (!altName.Contains('.')) {
- nonFQDNPresent = true;
- }
- } else if (currentName->type == certIPAddress) {
- // According to DNS.h, this includes space for the null-terminator
- char buf[net::kNetAddrMaxCStrBufSize] = { 0 };
- PRNetAddr addr;
- if (currentName->name.other.len == 4) {
- addr.inet.family = PR_AF_INET;
- memcpy(&addr.inet.ip, currentName->name.other.data,
- currentName->name.other.len);
- if (PR_NetAddrToString(&addr, buf, sizeof(buf) - 1) != PR_SUCCESS) {
- MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
- ("BR telemetry: IPAddress (v4) not valid (for '%s')\n",
- commonName.get()));
- malformedDNSNameOrIPAddressPresent = true;
- } else {
- altName.Assign(buf);
- }
- } else if (currentName->name.other.len == 16) {
- addr.inet.family = PR_AF_INET6;
- memcpy(&addr.ipv6.ip, currentName->name.other.data,
- currentName->name.other.len);
- if (PR_NetAddrToString(&addr, buf, sizeof(buf) - 1) != PR_SUCCESS) {
- MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
- ("BR telemetry: IPAddress (v6) not valid (for '%s')\n",
- commonName.get()));
- malformedDNSNameOrIPAddressPresent = true;
- } else {
- altName.Assign(buf);
- }
- } else {
- MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
- ("BR telemetry: IPAddress not valid (for '%s')\n",
- commonName.get()));
- malformedDNSNameOrIPAddressPresent = true;
- }
- } else {
- MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
- ("BR telemetry: non-DNSName, non-IPAddress present for '%s'\n",
- commonName.get()));
- nonDNSNameOrIPAddressPresent = true;
- }
- if (commonName && altName.Equals(commonName.get())) {
- commonNameInSubjectAltNames = true;
- }
- currentName = CERT_GetNextGeneralName(currentName);
- } while (currentName && currentName != subjectAltNames);
-
- AccumulateSubjectCommonNameTelemetry(commonName.get(),
- commonNameInSubjectAltNames);
-}
-
-// Gather telemetry on whether the end-entity cert for a server has the
-// required TLS Server Authentication EKU, or any others
-void
-GatherEKUTelemetry(const UniqueCERTCertList& certList)
-{
- CERTCertListNode* endEntityNode = CERT_LIST_HEAD(certList);
- CERTCertListNode* rootNode = CERT_LIST_TAIL(certList);
- PR_ASSERT(!(CERT_LIST_END(endEntityNode, certList) ||
- CERT_LIST_END(rootNode, certList)));
- if (CERT_LIST_END(endEntityNode, certList) ||
- CERT_LIST_END(rootNode, certList)) {
- return;
- }
- CERTCertificate* endEntityCert = endEntityNode->cert;
- PR_ASSERT(endEntityCert);
- if (!endEntityCert) {
- return;
- }
-
- // Only log telemetry if the root CA is built-in
- CERTCertificate* rootCert = rootNode->cert;
- PR_ASSERT(rootCert);
- if (!rootCert) {
- return;
- }
- bool isBuiltIn = false;
- Result rv = IsCertBuiltInRoot(rootCert, isBuiltIn);
- if (rv != Success || !isBuiltIn) {
- return;
- }
-
- // Find the EKU extension, if present
- bool foundEKU = false;
- SECOidTag oidTag;
- CERTCertExtension* ekuExtension = nullptr;
- for (size_t i = 0; endEntityCert->extensions && endEntityCert->extensions[i];
- i++) {
- oidTag = SECOID_FindOIDTag(&endEntityCert->extensions[i]->id);
- if (oidTag == SEC_OID_X509_EXT_KEY_USAGE) {
- foundEKU = true;
- ekuExtension = endEntityCert->extensions[i];
- }
- }
-
- if (!foundEKU) {
- return;
- }
-
- // Parse the EKU extension
- UniqueCERTOidSequence ekuSequence(
- CERT_DecodeOidSequence(&ekuExtension->value));
- if (!ekuSequence) {
- return;
- }
-
- // Search through the available EKUs
- bool foundServerAuth = false;
- bool foundOther = false;
- for (SECItem** oids = ekuSequence->oids; oids && *oids; oids++) {
- oidTag = SECOID_FindOIDTag(*oids);
- if (oidTag == SEC_OID_EXT_KEY_USAGE_SERVER_AUTH) {
- foundServerAuth = true;
- } else {
- foundOther = true;
- }
- }
-}
-
-// Gathers telemetry on which CA is the root of a given cert chain.
-// If the root is a built-in root, then the telemetry makes a count
-// by root. Roots that are not built-in are counted in one bin.
-void
-GatherRootCATelemetry(const UniqueCERTCertList& certList)
-{
- CERTCertListNode* rootNode = CERT_LIST_TAIL(certList);
- PR_ASSERT(rootNode);
- if (!rootNode) {
- return;
- }
- PR_ASSERT(!CERT_LIST_END(rootNode, certList));
- if (CERT_LIST_END(rootNode, certList)) {
- return;
- }
- CERTCertificate* rootCert = rootNode->cert;
- PR_ASSERT(rootCert);
- if (!rootCert) {
- return;
- }
- AccumulateTelemetryForRootCA(Telemetry::CERT_VALIDATION_SUCCESS_BY_CA,
- rootCert);
-}
-
-// These time are appoximate, i.e., doesn't account for leap seconds, etc
-const uint64_t ONE_WEEK_IN_SECONDS = (7 * (24 * 60 *60));
-const uint64_t ONE_YEAR_IN_WEEKS = 52;
-
-// Gathers telemetry on the certificate lifetimes we observe in the wild
-void
-GatherEndEntityTelemetry(const UniqueCERTCertList& certList)
-{
- CERTCertListNode* endEntityNode = CERT_LIST_HEAD(certList);
- MOZ_ASSERT(endEntityNode && !CERT_LIST_END(endEntityNode, certList));
- if (!endEntityNode || CERT_LIST_END(endEntityNode, certList)) {
- return;
- }
-
- CERTCertificate* endEntityCert = endEntityNode->cert;
- PR_ASSERT(endEntityCert);
- if (!endEntityCert) {
- return;
- }
-
- PRTime notBefore;
- PRTime notAfter;
-
- if (CERT_GetCertTimes(endEntityCert, &notBefore, &notAfter) != SECSuccess) {
- return;
- }
-
- PR_ASSERT(notAfter > notBefore);
- if (notAfter <= notBefore) {
- return;
- }
-
- uint64_t durationInWeeks = (notAfter - notBefore)
- / PR_USEC_PER_SEC
- / ONE_WEEK_IN_SECONDS;
-
- if (durationInWeeks > (2 * ONE_YEAR_IN_WEEKS)) {
- durationInWeeks = (2 * ONE_YEAR_IN_WEEKS) + 1;
- }
-}
-
-// There are various things that we want to measure about certificate
-// chains that we accept. This is a single entry point for all of them.
-void
-GatherSuccessfulValidationTelemetry(const UniqueCERTCertList& certList)
-{
- GatherBaselineRequirementsTelemetry(certList);
- GatherEKUTelemetry(certList);
- GatherRootCATelemetry(certList);
- GatherEndEntityTelemetry(certList);
-}
-
-void
-GatherTelemetryForSingleSCT(const ct::SignedCertificateTimestamp& sct)
-{
-/* STUB */
-}
-
-void
-GatherCertificateTransparencyTelemetry(const UniqueCERTCertList& certList,
- const CertificateTransparencyInfo& info)
-{
-/* STUB */
-}
-
// Note: Takes ownership of |peerCertChain| if SECSuccess is not returned.
SECStatus
AuthCertificate(CertVerifier& certVerifier,
@@ -1214,7 +796,6 @@ AuthCertificate(CertVerifier& certVerifier,
CertVerifier::OCSP_STAPLING_NEVER_CHECKED;
KeySizeStatus keySizeStatus = KeySizeStatus::NeverChecked;
SHA1ModeResult sha1ModeResult = SHA1ModeResult::NeverChecked;
- PinningTelemetryInfo pinningTelemetryInfo;
CertificateTransparencyInfo certificateTransparencyInfo;
int flags = 0;
@@ -1233,22 +814,14 @@ AuthCertificate(CertVerifier& certVerifier,
&evOidPolicy,
&ocspStaplingStatus,
&keySizeStatus, &sha1ModeResult,
- &pinningTelemetryInfo,
&certificateTransparencyInfo);
- uint32_t evStatus = (rv != Success) ? 0 // 0 = Failure
- : (evOidPolicy == SEC_OID_UNKNOWN) ? 1 // 1 = DV
- : 2; // 2 = EV
-
if (rv == Success) {
// Certificate verification succeeded. Delete any potential record of
// certificate error bits.
RememberCertErrorsTable::GetInstance().RememberCertHasError(infoObject,
nullptr,
SECSuccess);
- GatherSuccessfulValidationTelemetry(certList);
- GatherCertificateTransparencyTelemetry(certList,
- certificateTransparencyInfo);
// The connection may get terminated, for example, if the server requires
// a client cert. Let's provide a minimal SSLStatus
@@ -1363,11 +936,6 @@ SSLServerCertVerificationJob::Run()
if (mInfoObject->isAlreadyShutDown()) {
error = SEC_ERROR_USER_CANCELLED;
} else {
- Telemetry::ID successTelemetry
- = Telemetry::SSL_SUCCESFUL_CERT_VALIDATION_TIME_MOZILLAPKIX;
- Telemetry::ID failureTelemetry
- = Telemetry::SSL_INITIAL_FAILED_CERT_VALIDATION_TIME_MOZILLAPKIX;
-
// Reset the error code here so we can detect if AuthCertificate fails to
// set the error code if/when it fails.
PR_SetError(0, 0);
@@ -1378,21 +946,15 @@ SSLServerCertVerificationJob::Run()
MOZ_ASSERT(mPeerCertChain || rv != SECSuccess,
"AuthCertificate() should take ownership of chain on failure");
if (rv == SECSuccess) {
- uint32_t interval = (uint32_t) ((TimeStamp::Now() - mJobStartTime).ToMilliseconds());
RefPtr<SSLServerCertVerificationResult> restart(
- new SSLServerCertVerificationResult(mInfoObject, 0,
- successTelemetry, interval));
+ new SSLServerCertVerificationResult(mInfoObject, 0));
restart->Dispatch();
return NS_OK;
}
// Note: the interval is not calculated once as PR_GetError MUST be called
- // before any other function call
+ // before any other function call
error = PR_GetError();
- {
- TimeStamp now = TimeStamp::Now();
- MutexAutoLock telemetryMutex(*gSSLVerificationTelemetryMutex);
- }
if (error != 0) {
RefPtr<CertErrorRunnable> runnable(
CreateCertErrorRunnable(*mCertVerifier, error, mInfoObject, mCert,
@@ -1614,19 +1176,11 @@ AuthCertificateHook(void* arg, PRFileDesc* fd, PRBool checkSig, PRBool isServer)
SSLServerCertVerificationResult::SSLServerCertVerificationResult(
nsNSSSocketInfo* infoObject, PRErrorCode errorCode,
- Telemetry::ID telemetryID, uint32_t telemetryValue,
SSLErrorMessageType errorMessageType)
: mInfoObject(infoObject)
, mErrorCode(errorCode)
, mErrorMessageType(errorMessageType)
- , mTelemetryID(telemetryID)
- , mTelemetryValue(telemetryValue)
{
-// We accumulate telemetry for (only) successful validations on the main thread
-// to avoid adversely affecting performance by acquiring the mutex that we use
-// when accumulating the telemetry for unsuccessful validations. Unsuccessful
-// validations times are accumulated elsewhere.
-MOZ_ASSERT(telemetryID == Telemetry::HistogramCount || errorCode == 0);
}
void
diff --git a/security/manager/ssl/moz.build b/security/manager/ssl/moz.build
index 19e1b4f4b..8c8d25dcc 100644
--- a/security/manager/ssl/moz.build
+++ b/security/manager/ssl/moz.build
@@ -135,7 +135,6 @@ UNIFIED_SOURCES += [
'PSMContentListener.cpp',
'PSMRunnable.cpp',
'PublicKeyPinningService.cpp',
- 'RootCertificateTelemetryUtils.cpp',
'SecretDecoderRing.cpp',
'SharedSSLState.cpp',
'SSLServerCertVerification.cpp',
diff --git a/security/manager/ssl/nsKeygenHandler.cpp b/security/manager/ssl/nsKeygenHandler.cpp
index 9196e200c..0af761d7e 100644
--- a/security/manager/ssl/nsKeygenHandler.cpp
+++ b/security/manager/ssl/nsKeygenHandler.cpp
@@ -8,7 +8,6 @@
#include "cryptohi.h"
#include "keyhi.h"
#include "mozilla/Assertions.h"
-#include "mozilla/Telemetry.h"
#include "nsIContent.h"
#include "nsIDOMHTMLSelectElement.h"
#include "nsIGenKeypairInfoDlg.h"
@@ -395,13 +394,6 @@ loser:
return rv;
}
-
-void
-GatherKeygenTelemetry(uint32_t keyGenMechanism, int keysize, char* curve)
-{
-/* STUB */
-}
-
nsresult
nsKeygenFormProcessor::GetPublicKey(const nsAString& aValue,
const nsAString& aChallenge,
@@ -639,8 +631,6 @@ nsKeygenFormProcessor::GetPublicKey(const nsAString& aValue,
CopyASCIItoUTF16(keystring.get(), aOutPublicKey);
rv = NS_OK;
-
- GatherKeygenTelemetry(keyGenMechanism, keysize, keyparamsString);
loser:
if (srv != SECSuccess) {
if ( privateKey ) {
diff --git a/security/manager/ssl/nsNSSCallbacks.cpp b/security/manager/ssl/nsNSSCallbacks.cpp
index b8f1b0eb7..dda936d8c 100644
--- a/security/manager/ssl/nsNSSCallbacks.cpp
+++ b/security/manager/ssl/nsNSSCallbacks.cpp
@@ -14,7 +14,6 @@
#include "mozilla/Assertions.h"
#include "mozilla/Casting.h"
#include "mozilla/RefPtr.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/Unused.h"
#include "nsContentUtils.h"
@@ -1072,37 +1071,6 @@ CanFalseStartCallback(PRFileDesc* fd, void* client_data, PRBool *canFalseStart)
return SECSuccess;
}
-static void
-AccumulateNonECCKeySize(Telemetry::ID probe, uint32_t bits)
-{
- unsigned int value = bits < 512 ? 1 : bits == 512 ? 2
- : bits < 768 ? 3 : bits == 768 ? 4
- : bits < 1024 ? 5 : bits == 1024 ? 6
- : bits < 1280 ? 7 : bits == 1280 ? 8
- : bits < 1536 ? 9 : bits == 1536 ? 10
- : bits < 2048 ? 11 : bits == 2048 ? 12
- : bits < 3072 ? 13 : bits == 3072 ? 14
- : bits < 4096 ? 15 : bits == 4096 ? 16
- : bits < 8192 ? 17 : bits == 8192 ? 18
- : bits < 16384 ? 19 : bits == 16384 ? 20
- : 0;
-}
-
-// XXX: This attempts to map a bit count to an ECC named curve identifier. In
-// the vast majority of situations, we only have the Suite B curves available.
-// In that case, this mapping works fine. If we were to have more curves
-// available, the mapping would be ambiguous since there could be multiple
-// named curves for a given size (e.g. secp256k1 vs. secp256r1). We punt on
-// that for now. See also NSS bug 323674.
-static void
-AccumulateECCCurve(Telemetry::ID probe, uint32_t bits)
-{
- unsigned int value = bits == 256 ? 23 // P-256
- : bits == 384 ? 24 // P-384
- : bits == 521 ? 25 // P-521
- : 0; // Unknown
-}
-
// In the case of session resumption, the AuthCertificate hook has been bypassed
// (because we've previously successfully connected to our peer). That being the
// case, we unfortunately don't know if the peer's server certificate verified
@@ -1216,11 +1184,6 @@ void HandshakeCallback(PRFileDesc* fd, void* client_data) {
rv = SSL_GetChannelInfo(fd, &channelInfo, sizeof(channelInfo));
MOZ_ASSERT(rv == SECSuccess);
if (rv == SECSuccess) {
- // Get the protocol version for telemetry
- // 1=tls1, 2=tls1.1, 3=tls1.2
- unsigned int versionEnum = channelInfo.protocolVersion & 0xFF;
- MOZ_ASSERT(versionEnum > 0);
-
SSLCipherSuiteInfo cipherInfo;
rv = SSL_GetCipherSuiteInfo(channelInfo.cipherSuite, &cipherInfo,
sizeof cipherInfo);
@@ -1231,16 +1194,10 @@ void HandshakeCallback(PRFileDesc* fd, void* client_data) {
if (infoObject->IsFullHandshake()) {
switch (channelInfo.keaType) {
case ssl_kea_rsa:
- AccumulateNonECCKeySize(Telemetry::SSL_KEA_RSA_KEY_SIZE_FULL,
- channelInfo.keaKeyBits);
break;
case ssl_kea_dh:
- AccumulateNonECCKeySize(Telemetry::SSL_KEA_DHE_KEY_SIZE_FULL,
- channelInfo.keaKeyBits);
break;
case ssl_kea_ecdh:
- AccumulateECCCurve(Telemetry::SSL_KEA_ECDHE_CURVE_FULL,
- channelInfo.keaKeyBits);
break;
default:
MOZ_CRASH("impossible KEA");
@@ -1252,12 +1209,8 @@ void HandshakeCallback(PRFileDesc* fd, void* client_data) {
switch (channelInfo.authType) {
case ssl_auth_rsa:
case ssl_auth_rsa_sign:
- AccumulateNonECCKeySize(Telemetry::SSL_AUTH_RSA_KEY_SIZE_FULL,
- channelInfo.authKeyBits);
break;
case ssl_auth_ecdsa:
- AccumulateECCCurve(Telemetry::SSL_AUTH_ECDSA_CURVE_FULL,
- channelInfo.authKeyBits);
break;
default:
MOZ_CRASH("impossible auth algorithm");
diff --git a/security/manager/ssl/nsNSSComponent.cpp b/security/manager/ssl/nsNSSComponent.cpp
index f580f2bcb..4d6c3963f 100644
--- a/security/manager/ssl/nsNSSComponent.cpp
+++ b/security/manager/ssl/nsNSSComponent.cpp
@@ -19,7 +19,6 @@
#include "mozilla/Services.h"
#include "mozilla/StaticPtr.h"
#include "mozilla/SyncRunnable.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/Unused.h"
#include "nsAppDirectoryServiceDefs.h"
#include "nsCRT.h"
@@ -785,13 +784,6 @@ nsNSSComponent::UnloadFamilySafetyRoot()
// 2: detect Family Safety mode and import the root
const char* kFamilySafetyModePref = "security.family_safety.mode";
-// The telemetry gathered by this function is as follows:
-// 0-2: the value of the Family Safety mode pref
-// 3: detecting Family Safety mode failed
-// 4: Family Safety was not enabled
-// 5: Family Safety was enabled
-// 6: failed to import the Family Safety root
-// 7: successfully imported the root
void
nsNSSComponent::MaybeEnableFamilySafetyCompatibility()
{
@@ -1564,15 +1556,6 @@ CipherSuiteChangeObserver::Observe(nsISupports* aSubject,
void nsNSSComponent::setValidationOptions(bool isInitialSetting,
const MutexAutoLock& lock)
{
- // This preference controls whether we do OCSP fetching and does not affect
- // OCSP stapling.
- // 0 = disabled, 1 = enabled
- int32_t ocspEnabled = Preferences::GetInt("security.OCSP.enabled",
- OCSP_ENABLED_DEFAULT);
-
- bool ocspRequired = ocspEnabled &&
- Preferences::GetBool("security.OCSP.require", false);
-
bool ocspStaplingEnabled = Preferences::GetBool("security.ssl.enable_ocsp_stapling",
true);
PublicSSLState()->SetOCSPStaplingEnabled(ocspStaplingEnabled);
diff --git a/security/manager/ssl/nsNSSIOLayer.cpp b/security/manager/ssl/nsNSSIOLayer.cpp
index d2549c52d..337ef8b8e 100644
--- a/security/manager/ssl/nsNSSIOLayer.cpp
+++ b/security/manager/ssl/nsNSSIOLayer.cpp
@@ -20,7 +20,6 @@
#include "mozilla/Logging.h"
#include "mozilla/Move.h"
#include "mozilla/Preferences.h"
-#include "mozilla/Telemetry.h"
#include "nsArray.h"
#include "nsArrayUtils.h"
#include "nsCharSeparatedTokenizer.h"
@@ -244,21 +243,6 @@ nsNSSSocketInfo::NoteTimeUntilReady()
void
nsNSSSocketInfo::SetHandshakeCompleted()
{
- if (!mHandshakeCompleted) {
- enum HandshakeType {
- Resumption = 1,
- FalseStarted = 2,
- ChoseNotToFalseStart = 3,
- NotAllowedToFalseStart = 4,
- };
-
- HandshakeType handshakeType = !IsFullHandshake() ? Resumption
- : mFalseStarted ? FalseStarted
- : mFalseStartCallbackCalled ? ChoseNotToFalseStart
- : NotAllowedToFalseStart;
- }
-
-
// Remove the plain text layer as it is not needed anymore.
// The plain text layer is not always present - so its not a fatal error
// if it cannot be removed
@@ -1050,29 +1034,6 @@ class SSLErrorRunnable : public SyncRunnableBase
namespace {
-uint32_t tlsIntoleranceTelemetryBucket(PRErrorCode err)
-{
- // returns a numeric code for where we track various errors in telemetry
- // only errors that cause version fallback are tracked,
- // so this is also used to determine which errors can cause version fallback
- switch (err) {
- case SSL_ERROR_BAD_MAC_ALERT: return 1;
- case SSL_ERROR_BAD_MAC_READ: return 2;
- case SSL_ERROR_HANDSHAKE_FAILURE_ALERT: return 3;
- case SSL_ERROR_HANDSHAKE_UNEXPECTED_ALERT: return 4;
- case SSL_ERROR_ILLEGAL_PARAMETER_ALERT: return 6;
- case SSL_ERROR_NO_CYPHER_OVERLAP: return 7;
- case SSL_ERROR_UNSUPPORTED_VERSION: return 10;
- case SSL_ERROR_PROTOCOL_VERSION_ALERT: return 11;
- case SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE: return 13;
- case SSL_ERROR_DECODE_ERROR_ALERT: return 14;
- case PR_CONNECT_RESET_ERROR: return 16;
- case PR_END_OF_FILE_ERROR: return 17;
- case SSL_ERROR_INTERNAL_ERROR_ALERT: return 18;
- default: return 0;
- }
-}
-
bool
retryDueToTLSIntolerance(PRErrorCode err, nsNSSSocketInfo* socketInfo)
{
@@ -1097,13 +1058,6 @@ retryDueToTLSIntolerance(PRErrorCode err, nsNSSSocketInfo* socketInfo)
// this as a hard failure, but forget any intolerance so that later attempts
// don't use this version (i.e., range.max) and trigger the error again.
- // First, track the original cause of the version fallback. This uses the
- // same buckets as the telemetry below, except that bucket 0 will include
- // all cases where there wasn't an original reason.
- PRErrorCode originalReason =
- helpers.getIntoleranceReason(socketInfo->GetHostName(),
- socketInfo->GetPort());
-
helpers.forgetIntolerance(socketInfo->GetHostName(),
socketInfo->GetPort());
@@ -1139,35 +1093,6 @@ retryDueToTLSIntolerance(PRErrorCode err, nsNSSSocketInfo* socketInfo)
return false;
}
- uint32_t reason = tlsIntoleranceTelemetryBucket(err);
- if (reason == 0) {
- return false;
- }
-
- Telemetry::ID pre;
- Telemetry::ID post;
- switch (range.max) {
- case SSL_LIBRARY_VERSION_TLS_1_3:
- pre = Telemetry::SSL_TLS13_INTOLERANCE_REASON_PRE;
- post = Telemetry::SSL_TLS13_INTOLERANCE_REASON_POST;
- break;
- case SSL_LIBRARY_VERSION_TLS_1_2:
- pre = Telemetry::SSL_TLS12_INTOLERANCE_REASON_PRE;
- post = Telemetry::SSL_TLS12_INTOLERANCE_REASON_POST;
- break;
- case SSL_LIBRARY_VERSION_TLS_1_1:
- pre = Telemetry::SSL_TLS11_INTOLERANCE_REASON_PRE;
- post = Telemetry::SSL_TLS11_INTOLERANCE_REASON_POST;
- break;
- case SSL_LIBRARY_VERSION_TLS_1_0:
- pre = Telemetry::SSL_TLS10_INTOLERANCE_REASON_PRE;
- post = Telemetry::SSL_TLS10_INTOLERANCE_REASON_POST;
- break;
- default:
- MOZ_CRASH("impossible TLS version");
- return false;
- }
-
if (!helpers.rememberIntolerantAtVersion(socketInfo->GetHostName(),
socketInfo->GetPort(),
range.min, range.max, err)) {
@@ -1187,34 +1112,6 @@ static_assert((PR_MAX_ERROR - PR_NSPR_ERROR_BASE) <= 128,
static_assert((mozilla::pkix::ERROR_BASE - mozilla::pkix::END_OF_LIST) < 31,
"too many moz::pkix errors");
-static void
-reportHandshakeResult(int32_t bytesTransferred, bool wasReading, PRErrorCode err)
-{
- uint32_t bucket;
-
- // A negative bytesTransferred or a 0 read are errors.
- if (bytesTransferred > 0) {
- bucket = 0;
- } else if ((bytesTransferred == 0) && !wasReading) {
- // PR_Write() is defined to never return 0, but let's make sure.
- // https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSPR/Reference/PR_Write.
- MOZ_ASSERT(false);
- bucket = 671;
- } else if (IS_SSL_ERROR(err)) {
- bucket = err - SSL_ERROR_BASE;
- MOZ_ASSERT(bucket > 0); // SSL_ERROR_EXPORT_ONLY_SERVER isn't used.
- } else if (IS_SEC_ERROR(err)) {
- bucket = (err - SEC_ERROR_BASE) + 256;
- } else if ((err >= PR_NSPR_ERROR_BASE) && (err < PR_MAX_ERROR)) {
- bucket = (err - PR_NSPR_ERROR_BASE) + 512;
- } else if ((err >= mozilla::pkix::ERROR_BASE) &&
- (err < mozilla::pkix::ERROR_LIMIT)) {
- bucket = (err - mozilla::pkix::ERROR_BASE) + 640;
- } else {
- bucket = 671;
- }
-}
-
int32_t
checkHandshake(int32_t bytesTransfered, bool wasReading,
PRFileDesc* ssl_layer_fd, nsNSSSocketInfo* socketInfo)
@@ -1292,10 +1189,6 @@ checkHandshake(int32_t bytesTransfered, bool wasReading,
// set the HandshakePending attribute to false so that we don't try the logic
// above again in a subsequent transfer.
if (handleHandshakeResultNow) {
- // Report the result once for each handshake. Note that this does not
- // get handshakes which are cancelled before any reads or writes
- // happen.
- reportHandshakeResult(bytesTransfered, wasReading, originalError);
socketInfo->SetHandshakeNotPending();
}
diff --git a/security/manager/ssl/nsSTSPreloadList.errors b/security/manager/ssl/nsSTSPreloadList.errors
index 92e7ea00f..b50899521 100644
--- a/security/manager/ssl/nsSTSPreloadList.errors
+++ b/security/manager/ssl/nsSTSPreloadList.errors
@@ -1,10 +1,11 @@
0-1.party: could not connect to host
0.me.uk: did not receive HSTS header
00001.am: max-age too low: 129600
-0005.com: did not receive HSTS header
+0005.com: could not connect to host
0005aa.com: could not connect to host
0005pay.com: did not receive HSTS header
00100010.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+0010100.net: could not connect to host
00120012.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
00130013.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
00140014.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -39,6 +40,7 @@
0222aa.com: could not connect to host
023838.com: could not connect to host
023sec.com: could not connect to host
+02607.com: could not connect to host
028718.com: did not receive HSTS header
029978.com: did not receive HSTS header
029inno.com: could not connect to host
@@ -49,6 +51,7 @@
040fit.nl: did not receive HSTS header
040fitvitality.nl: did not receive HSTS header
048.ag: could not connect to host
+04911701.cn: could not connect to host
04sun.com: could not connect to host
050508.com: could not connect to host
055268.com: did not receive HSTS header
@@ -57,15 +60,18 @@
066718.com: did not receive HSTS header
066928.com: could not connect to host
066938.com: could not connect to host
+06se.com: could not connect to host
070709.net: could not connect to host
-07733.win: did not receive HSTS header
+07733.win: could not connect to host
078805.com: did not receive HSTS header
078810.com: did not receive HSTS header
078820.com: did not receive HSTS header
078860.com: did not receive HSTS header
-078890.com: did not receive HSTS header
+078890.com: could not connect to host
081638.com: did not receive HSTS header
086628.com: did not receive HSTS header
+08detaxe.fr: could not connect to host
+09115.com: could not connect to host
0c.eu: did not receive HSTS header
0cdn.ga: could not connect to host
0day.su: could not connect to host
@@ -73,10 +79,12 @@
0fl.com: did not receive HSTS header
0g.org.uk: could not connect to host
0i0.nl: could not connect to host
+0o0.edu.pl: could not connect to host
0o0.ooo: could not connect to host
0p.no: did not receive HSTS header
0vi.org: could not connect to host
0w0.vc: could not connect to host
+0x0.cloud: could not connect to host
0x0a.net: could not connect to host
0x1337.eu: could not connect to host
0x44.net: could not connect to host
@@ -92,7 +100,6 @@
0xaa55.me: could not connect to host
0xb612.org: could not connect to host
0xcafec0.de: did not receive HSTS header
-0xf00.ch: could not connect to host
1.0.0.1: max-age too low: 0
1000hats.com: did not receive HSTS header
1000serien.com: could not connect to host
@@ -104,28 +111,32 @@
1018hosting.nl: did not receive HSTS header
1022996493.rsc.cdn77.org: could not connect to host
10414.org: could not connect to host
-1066.io: could not connect to host
1091.jp: could not connect to host
10gbit.ovh: could not connect to host
10seos.com: did not receive HSTS header
10tacle.io: could not connect to host
-10v2.com: did not receive HSTS header
+10v2.com: could not connect to host
10x.ooo: could not connect to host
-10xiuxiu.com: did not receive HSTS header
+10xiuxiu.com: could not connect to host
1100.so: could not connect to host
110110110.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
1116pay.com: did not receive HSTS header
112112112.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+11221jz.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
113113113.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
118118118.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
11bt.cc: did not receive HSTS header
11recruitment.com.au: did not receive HSTS header
11scc.com: could not connect to host
120dayweightloss.com: could not connect to host
+123.gg: could not connect to host
123110.com: could not connect to host
-123djdrop.com: did not receive HSTS header
+1231212.com: did not receive HSTS header
+123123q.com: did not receive HSTS header
123movies.fyi: did not receive HSTS header
+123nutricion.es: could not connect to host
123pay.ir: did not receive HSTS header
+123plons.nl: could not connect to host
123share.org: did not receive HSTS header
123termpapers.com: could not connect to host
123test.com: did not receive HSTS header
@@ -136,6 +147,8 @@
126ium.moe: could not connect to host
127011-networks.ch: could not connect to host
1288366.com: could not connect to host
+1288fc.com: could not connect to host
+12photos.eu: max-age too low: 0
12vpn.org: could not connect to host
12vpnchina.com: could not connect to host
130978.com: did not receive HSTS header
@@ -146,6 +159,7 @@
1395kj.com: did not receive HSTS header
1396.cc: could not connect to host
1396.net: did not receive HSTS header
+13th-dover.uk: could not connect to host
1481481.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
1481481.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
1481482.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -157,6 +171,7 @@
1481486.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
1481486.net: could not connect to host
1536.cf: could not connect to host
+159cp.com: did not receive HSTS header
16164f.com: could not connect to host
163pwd.com: could not connect to host
166166.com: could not connect to host
@@ -165,7 +180,7 @@
168bo9.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
168bo9.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
168esb.com: could not connect to host
-16book.org: could not connect to host
+16book.org: did not receive HSTS header
16deza.com: did not receive HSTS header
16packets.com: could not connect to host
173vpn.cn: could not connect to host
@@ -175,18 +190,21 @@
174343.com: could not connect to host
17hats.com: did not receive HSTS header
188522.com: did not receive HSTS header
-18888msc.com: could not connect to host
1888zr.com: could not connect to host
188betwarriors.co.uk: could not connect to host
188trafalgar.ca: did not receive HSTS header
189dv.com: could not connect to host
+189fc.com: could not connect to host
+18celebration.com: did not receive HSTS header
+18celebration.org: did not receive HSTS header
1912x.com: could not connect to host
+192.io: could not connect to host
19216811.online: did not receive HSTS header
+192168ll.repair: could not connect to host
1921958389.rsc.cdn77.org: could not connect to host
195gm.com: could not connect to host
1a-jva.de: could not connect to host
1a-vermessung.at: did not receive HSTS header
-1a-werkstattgeraete.de: did not receive HSTS header
1aim.com: did not receive HSTS header
1atic.com: could not connect to host
1b1.pl: could not connect to host
@@ -198,8 +216,9 @@
1gsoft.com: could not connect to host
1item.co.il: did not receive HSTS header
1k8b.com: could not connect to host
-1m.duckdns.org: could not connect to host
+1m.duckdns.org: did not receive HSTS header
1nian.vip: could not connect to host
+1para.net: could not connect to host
1q2w.nl: could not connect to host
1q365a.com: could not connect to host
1s.tn: could not connect to host
@@ -210,7 +229,7 @@
1three1.net: did not receive HSTS header
1upinternet.com: could not connect to host
1xcess.com: did not receive HSTS header
-1years.cc: did not receive HSTS header
+1years.cc: could not connect to host
2-cpu.de: could not connect to host
200fcw.com: could not connect to host
2018.wales: could not connect to host
@@ -218,7 +237,6 @@
2048game.co.uk: could not connect to host
206rc.net: max-age too low: 2592000
208.es: did not receive HSTS header
-20denier.com: could not connect to host
20hs.cn: did not receive HSTS header
20zq.com: could not connect to host
21.co.uk: did not receive HSTS header
@@ -228,32 +246,33 @@
22digital.agency: could not connect to host
22scc.com: could not connect to host
2333.press: could not connect to host
+23333.link: did not receive HSTS header
+233abc.com: could not connect to host
247a.co.uk: could not connect to host
247quickbooks.com: did not receive HSTS header
2488.ch: did not receive HSTS header
249cq.com: could not connect to host
+24hourlocksmithshouston.com: did not receive HSTS header
24hourpaint.com: could not connect to host
24hrs.shopping: could not connect to host
24kbet.com: could not connect to host
24pcr.com: could not connect to host
24sihu.com: could not connect to host
-2566335.xyz: did not receive HSTS header
+2566335.xyz: could not connect to host
256k.me: could not connect to host
-258da.com: did not receive HSTS header
+258da.com: could not connect to host
25daysof.io: could not connect to host
-263.info: could not connect to host
27728522.com: could not connect to host
2859cc.com: could not connect to host
-286.com: did not receive HSTS header
288da.com: did not receive HSTS header
29227.com: could not connect to host
-298da.com: did not receive HSTS header
+298da.com: could not connect to host
2acbi-asso.fr: did not receive HSTS header
2b3b.com: could not connect to host
2bad2c0.de: did not receive HSTS header
2bitout.com: could not connect to host
2bizi.ru: could not connect to host
-2bouncy.com: did not receive HSTS header
+2bouncy.com: could not connect to host
2brokegirls.org: could not connect to host
2carpros.com: did not receive HSTS header
2fl.me: did not receive HSTS header
@@ -267,14 +286,17 @@
300mbmovies4u.cc: could not connect to host
301.website: did not receive HSTS header
302.nyc: could not connect to host
+304squadron.org: did not receive HSTS header
30yearmortgagerates.net: could not connect to host
3133780x.com: did not receive HSTS header
314166.com: could not connect to host
+314553.com: did not receive HSTS header
314chan.org: could not connect to host
31tv.ru: did not receive HSTS header
32ph.com: could not connect to host
330.net: could not connect to host
-33836.com: could not connect to host
+336yh.com: could not connect to host
+33836.com: did not receive HSTS header
338da.com: could not connect to host
33drugstore.com: could not connect to host
33scc.com: could not connect to host
@@ -285,6 +307,7 @@
35792.de: could not connect to host
360gradus.com: did not receive HSTS header
360woodworking.com: could not connect to host
+364553.com: did not receive HSTS header
365.or.jp: could not connect to host
365maya.com: did not receive HSTS header
368mibn.com: could not connect to host
@@ -293,8 +316,8 @@
3839.ca: could not connect to host
38888msc.com: could not connect to host
38blog.com: did not receive HSTS header
-38sihu.com: could not connect to host
-398.info: could not connect to host
+394553.com: did not receive HSTS header
+39sihu.com: could not connect to host
3candy.com: could not connect to host
3chit.cf: could not connect to host
3click-loan.com: could not connect to host
@@ -304,11 +327,11 @@
3dm.audio: could not connect to host
3dproteinimaging.com: did not receive HSTS header
3fl.com: did not receive HSTS header
-3hl0.net: could not connect to host
3ik.us: could not connect to host
3mbo.de: did not receive HSTS header
+3phase.pw: could not connect to host
3sreporting.com: did not receive HSTS header
-3vlnaeet.cz: could not connect to host
+3trees.tk: could not connect to host
3wecommerce.com.br: could not connect to host
3weekdietworks.com: did not receive HSTS header
3xx.link: could not connect to host
@@ -320,6 +343,7 @@
404.sh: could not connect to host
404404.info: could not connect to host
404forest.com: did not receive HSTS header
+414553.com: did not receive HSTS header
41844.de: could not connect to host
420dongstorm.com: could not connect to host
4237.com: could not connect to host
@@ -328,12 +352,12 @@
42t.ru: could not connect to host
439191.com: could not connect to host
440hz-radio.de: did not receive HSTS header
-440hz.radio: did not receive HSTS header
4455software.com: did not receive HSTS header
-448da.com: did not receive HSTS header
+448da.com: could not connect to host
44957.com: could not connect to host
44scc.com: could not connect to host
4500.co.il: did not receive HSTS header
+4553s.com: did not receive HSTS header
4553vip.com: could not connect to host
4679.space: did not receive HSTS header
4736666.com: could not connect to host
@@ -347,6 +371,7 @@
4cclothing.com: could not connect to host
4d2.xyz: could not connect to host
4decor.org: max-age too low: 0
+4everproxy.com: did not receive HSTS header
4hvac.com: did not receive HSTS header
4loc.us: could not connect to host
4miners.net: could not connect to host
@@ -356,44 +381,71 @@
4sqsu.eu: could not connect to host
4w-performers.link: could not connect to host
4web-hosting.com: could not connect to host
-4winds.pt: did not receive HSTS header
+4winds.pt: could not connect to host
5000yz.com: could not connect to host
500103.com: did not receive HSTS header
500108.com: did not receive HSTS header
+500a500.com: did not receive HSTS header
+500b500.com: did not receive HSTS header
+500c500.com: did not receive HSTS header
+500d500.com: did not receive HSTS header
+500e500.com: did not receive HSTS header
+500f500.com: did not receive HSTS header
500fcw.com: could not connect to host
+500g500.com: did not receive HSTS header
+500h500.com: did not receive HSTS header
+500i500.com: did not receive HSTS header
+500j500.com: did not receive HSTS header
+500k500.com: did not receive HSTS header
+500l500.com: did not receive HSTS header
+500m500.com: did not receive HSTS header
+500n500.com: did not receive HSTS header
+500o500.com: did not receive HSTS header
+500p500.com: did not receive HSTS header
+500pingtai.com: did not receive HSTS header
+500q500.com: did not receive HSTS header
+500r500.com: did not receive HSTS header
+500s500.com: did not receive HSTS header
+500t500.com: did not receive HSTS header
+500u500.com: did not receive HSTS header
+500y500.com: did not receive HSTS header
+500z500.com: did not receive HSTS header
+506pay.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
50ma.xyz: could not connect to host
50millionablaze.org: could not connect to host
50plusnet.nl: could not connect to host
513vpn.net: could not connect to host
517vpn.cn: could not connect to host
518maicai.com: could not connect to host
-51aifuli.com: could not connect to host
5214889.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
5214889.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
52b9.com: could not connect to host
52b9.net: could not connect to host
-52hentai.ml: could not connect to host
+52hentai.us: did not receive HSTS header
52kb.net: could not connect to host
52kb1.com: could not connect to host
52neptune.com: did not receive HSTS header
5310899.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
5310899.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+5364.com: could not connect to host
540.co: did not receive HSTS header
5432.cc: did not receive HSTS header
+545755.com: could not connect to host
54bf.com: could not connect to host
555xl.com: could not connect to host
-558da.com: could not connect to host
+55797.com: could not connect to host
+558da.com: did not receive HSTS header
55bt.cc: did not receive HSTS header
55scc.com: could not connect to host
56877.com: could not connect to host
56ct.com: could not connect to host
57aromas.com: did not receive HSTS header
-57he.com: could not connect to host
-593380.com: could not connect to host
-598380.com: could not connect to host
+57he.com: did not receive HSTS header
+588da.com: did not receive HSTS header
598598598.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
5986fc.com: could not connect to host
5chat.it: could not connect to host
+5crowd.com: did not receive HSTS header
5ece.de: could not connect to host
5piecesofadvice.com: could not connect to host
5starbouncycastlehire.co.uk: could not connect to host
@@ -402,7 +454,6 @@
605508.com: could not connect to host
60ych.net: did not receive HSTS header
6120.eu: did not receive HSTS header
-626380.com: could not connect to host
62755.com: did not receive HSTS header
645ds.cn: did not receive HSTS header
645ds.com: did not receive HSTS header
@@ -410,18 +461,23 @@
64970.com: did not receive HSTS header
64bitgaming.de: could not connect to host
64bitservers.net: could not connect to host
-65d88.com: could not connect to host
-660011.com: did not receive HSTS header
+660011.com: could not connect to host
6616fc.com: could not connect to host
66205.net: did not receive HSTS header
+6664553.com: did not receive HSTS header
+666omg.com: could not connect to host
6677.us: could not connect to host
668da.com: did not receive HSTS header
+66b.com: did not receive HSTS header
66bwf.com: could not connect to host
67899876.com: did not receive HSTS header
+680226.com: could not connect to host
688da.com: could not connect to host
692b8c32.de: could not connect to host
69mentor.com: could not connect to host
69square.com: could not connect to host
+6pm.com: did not receive HSTS header
+6t-montjoye.org: could not connect to host
6w6.la: could not connect to host
6z3.net: could not connect to host
7045.com: could not connect to host
@@ -433,15 +489,16 @@
72ty.net: could not connect to host
73223.com: did not receive HSTS header
7570.com: did not receive HSTS header
+758global.com: did not receive HSTS header
771122.tv: did not receive HSTS header
-7717a.com: did not receive HSTS header
772244.net: did not receive HSTS header
776573.net: did not receive HSTS header
7777av.co: could not connect to host
77890k.com: could not connect to host
778da.com: did not receive HSTS header
77book.cn: could not connect to host
-788da.com: did not receive HSTS header
+77dostavkaroz.ru: did not receive HSTS header
+788da.com: could not connect to host
789zr.com: could not connect to host
7f-wgg.cf: could not connect to host
7kovrikov.ru: did not receive HSTS header
@@ -454,16 +511,19 @@
808.lv: did not receive HSTS header
808phone.net: could not connect to host
818bwf.com: could not connect to host
+818da.com: could not connect to host
81uc.com: could not connect to host
8206688.com: did not receive HSTS header
826468.com: could not connect to host
826498.com: could not connect to host
82ty.com: could not connect to host
83i.net: could not connect to host
+850226.com: could not connect to host
8522.am: could not connect to host
8522cn.com: did not receive HSTS header
8522top.com: could not connect to host
8560.be: could not connect to host
+86286286.com: did not receive HSTS header
8649955.com: could not connect to host
8649966.com: could not connect to host
8649977.com: could not connect to host
@@ -472,6 +532,8 @@
87577.com: could not connect to host
88.to: did not receive HSTS header
8876205.com: did not receive HSTS header
+8880057.com: did not receive HSTS header
+8884553.com: could not connect to host
8887999.com: could not connect to host
8888av.co: could not connect to host
8888esb.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -479,7 +541,7 @@
888bwf.com: could not connect to host
888lu.co: could not connect to host
888msc.vip: could not connect to host
-88bwf.com: did not receive HSTS header
+88bwf.com: could not connect to host
88d.com: could not connect to host
88laohu.cc: could not connect to host
88laohu.com: could not connect to host
@@ -501,22 +563,28 @@
89he.com: could not connect to host
8azino777.ru: did not receive HSTS header
8ballbombom.uk: could not connect to host
+8da188.com: could not connect to host
8da2017.com: did not receive HSTS header
8da2018.com: could not connect to host
+8da88.com: could not connect to host
+8da999.com: could not connect to host
8mpay.com: did not receive HSTS header
8pecxstudios.com: could not connect to host
8shequapp.com: could not connect to host
8svn.com: did not receive HSTS header
8t88.biz: could not connect to host
+8ung.online: could not connect to host
8xx.bet: could not connect to host
8xx.io: could not connect to host
-8xx888.com: could not connect to host
+8xxbet.net: could not connect to host
8xxxxxxx.com: could not connect to host
+8yun.ga: could not connect to host
90smthng.com: could not connect to host
91-freedom.com: could not connect to host
9118b.com: could not connect to host
911911.pw: could not connect to host
915ers.com: could not connect to host
+918116.com: max-age too low: 2592000
918yy.com: could not connect to host
919945.com: did not receive HSTS header
91dh.cc: could not connect to host
@@ -532,20 +600,20 @@
9651678.ru: could not connect to host
9696178.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
9696178.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+97bros.com: did not receive HSTS header
9822.com: did not receive HSTS header
9822.info: did not receive HSTS header
987987.com: did not receive HSTS header
9906753.net: did not receive HSTS header
99511.fi: did not receive HSTS header
99599.net: could not connect to host
+9994553.com: did not receive HSTS header
99buffets.com: could not connect to host
9bingo.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-9iwan.net: did not receive HSTS header
9jadirect.com: could not connect to host
9jaxtreme.com.ng: did not receive HSTS header
9point6.com: could not connect to host
9ss6.com: could not connect to host
-9tolife.be: did not receive HSTS header
9vies.ca: could not connect to host
9won.kr: could not connect to host
a-intel.com: did not receive HSTS header
@@ -560,15 +628,15 @@ a1798.com: could not connect to host
a200k.xyz: did not receive HSTS header
a2c-co.net: could not connect to host
a2it.gr: max-age too low: 0
+a2os.club: did not receive HSTS header
a3.pm: did not receive HSTS header
a3workshop.swiss: could not connect to host
-a7m2.me: could not connect to host
a8q.org: could not connect to host
a9c.co: could not connect to host
-aa-tour.ru: could not connect to host
aa43d.cn: could not connect to host
aa6688.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
aa7733.com: could not connect to host
+aacfree.com: could not connect to host
aaeblog.com: did not receive HSTS header
aaeblog.net: did not receive HSTS header
aaeblog.org: did not receive HSTS header
@@ -578,22 +646,29 @@ aapp.space: could not connect to host
aardvarksolutions.co.za: did not receive HSTS header
aariefhaafiz.com: could not connect to host
aaron-gustafson.com: did not receive HSTS header
-aaronmcguire.me: could not connect to host
+aaronburt.co.uk: max-age too low: 7776000
+aaronmcguire.me: did not receive HSTS header
aarvinproperties.com: could not connect to host
-ab-bauservice-berlin.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+ab-bauservice-berlin.de: did not receive HSTS header
abacus-events.co.uk: did not receive HSTS header
+abaev.uk: could not connect to host
abareplace.com: did not receive HSTS header
abasky.net: could not connect to host
+abbradar.net: could not connect to host
+abcdef.be: could not connect to host
abcdentalcare.com: did not receive HSTS header
abcdobebe.com: did not receive HSTS header
abchelp.net: could not connect to host
+abdelsater.net: did not receive HSTS header
abdullah.pw: could not connect to host
abearofsoap.com: could not connect to host
abecodes.net: could not connect to host
+abeontech.com: could not connect to host
aberdeenalmeras.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
abi-fvs.de: could not connect to host
abigailstark.com: could not connect to host
abilitylist.org: did not receive HSTS header
+abinferis.com: could not connect to host
abioniere.de: could not connect to host
ablogagency.net: could not connect to host
abloop.com: could not connect to host
@@ -616,7 +691,6 @@ abtom.de: did not receive HSTS header
abury.fr: did not receive HSTS header
abury.me: did not receive HSTS header
abyssgaming.eu: could not connect to host
-ac.milan.it: did not receive HSTS header
acabadosboston.com: could not connect to host
academialowcost.com.br: did not receive HSTS header
academicenterprise.org: did not receive HSTS header
@@ -624,6 +698,7 @@ academy4.net: did not receive HSTS header
acadianapatios.com: did not receive HSTS header
acai51.net: could not connect to host
acaonegocios.com.br: could not connect to host
+acat.io: could not connect to host
acbc.ie: max-age too low: 0
accadoro.it: did not receive HSTS header
accbay.com: could not connect to host
@@ -632,22 +707,23 @@ accelerole.com: did not receive HSTS header
accelight.co.jp: did not receive HSTS header
accelight.jp: did not receive HSTS header
access-sofia.org: did not receive HSTS header
+accessibility.gov: did not receive HSTS header
accolade.com.br: could not connect to host
accoun.technology: could not connect to host
accounts-p.com: did not receive HSTS header
accountsuspended.club: could not connect to host
accwing.com: could not connect to host
aceadvisory.biz: did not receive HSTS header
-acelpb.com: could not connect to host
+acecerts.co.uk: did not receive HSTS header
acemypaper.com: could not connect to host
-acevik.de: could not connect to host
+acevik.de: did not receive HSTS header
acg.mn: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
acg.sb: could not connect to host
acg18.us: max-age too low: 0
acgaudio.com: could not connect to host
acgpiano.club: could not connect to host
acheirj.com.br: could not connect to host
-acheritage.co.uk: could not connect to host
+acheritage.co.uk: did not receive HSTS header
achmadfamily.com: could not connect to host
achow101.com: did not receive HSTS header
achterhoekseveiligheidsbeurs.nl: could not connect to host
@@ -662,9 +738,11 @@ acr.im: could not connect to host
acraft.org: could not connect to host
acrepairdrippingsprings.com: could not connect to host
acritelli.com: did not receive HSTS header
+acroso.me: could not connect to host
across.ml: could not connect to host
acrossgw.com: could not connect to host
-acsihostingsolutions.com: did not receive HSTS header
+acs-chantal.com: did not receive HSTS header
+acsihostingsolutions.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
acslimited.co.uk: did not receive HSTS header
actc81.fr: could not connect to host
actilove.ch: could not connect to host
@@ -676,17 +754,17 @@ activeweb.top: could not connect to host
activeworld.net: max-age too low: 2592000
activistasconstructivos.org: did not receive HSTS header
activiti.alfresco.com: did not receive HSTS header
+actorsroom.com: could not connect to host
actu-film.com: max-age too low: 0
actu-medias.com: could not connect to host
actualite-videos.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
acupofsalt.tv: could not connect to host
acuve.jp: could not connect to host
ad-disruptio.fr: could not connect to host
-ad13.in: could not connect to host
+ad13.in: did not receive HSTS header
ada.is: max-age too low: 2592000
adajwells.me: could not connect to host
adamcoffee.net: could not connect to host
-adamdixon.co.uk: could not connect to host
adamjoycegames.co.uk: could not connect to host
adamricheimer.com: could not connect to host
adamsfoundationrepair.com: did not receive HSTS header
@@ -696,12 +774,11 @@ adastra.re: could not connect to host
adblock.ovh: could not connect to host
adboos.com: could not connect to host
addaxpetroleum.com: could not connect to host
-addcrazy.com: did not receive HSTS header
-addiko.net: could not connect to host
addvocate.com: could not connect to host
adec-emsa.ae: could not connect to host
adelaides.com: did not receive HSTS header
adelevie.com: could not connect to host
+adelianz.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
adelinlydia-coach.com: did not receive HSTS header
adequatetechnology.com: could not connect to host
aderal.io: could not connect to host
@@ -733,7 +810,7 @@ adquisitio.in: could not connect to host
adrenaline-gaming.ru: could not connect to host
adrianajewelry.my: could not connect to host
adriancohea.ninja: did not receive HSTS header
-adrianseo.ro: did not receive HSTS header
+adrianseo.ro: could not connect to host
adrien.vin: max-age too low: 172800
adrinet.tk: could not connect to host
adrl.ca: could not connect to host
@@ -751,20 +828,25 @@ advancedstudio.ro: could not connect to host
advancedwriters.com: could not connect to host
advantagemechanicalinc.com: did not receive HSTS header
advelty.cz: could not connect to host
+adventaholdings.com: did not receive HSTS header
adventistdeploy.org: could not connect to host
adventures.is: did not receive HSTS header
-adver.top: could not connect to host
+adver.top: did not receive HSTS header
advertisemant.com: could not connect to host
advicepro.org.uk: did not receive HSTS header
adviespuntklokkenluiders.nl: could not connect to host
+adwokatkosterka.pl: did not receive HSTS header
adzie.xyz: could not connect to host
adzuna.co.uk: did not receive HSTS header
aegialis.com: did not receive HSTS header
+aegisinsight.com: did not receive HSTS header
aelisya.ch: could not connect to host
-aelurus.com: could not connect to host
aemoria.com: could not connect to host
aeon.wiki: could not connect to host
+aep-digital.com: did not receive HSTS header
+aerapass.io: did not receive HSTS header
aerialmediapro.net: could not connect to host
+aerobasegroup.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
aerolog.co: did not receive HSTS header
aeroparking.es: did not receive HSTS header
aerotheque.fr: did not receive HSTS header
@@ -782,8 +864,8 @@ afdkompakt.de: max-age too low: 86400
afeefzarapackages.com: did not receive HSTS header
affily.io: could not connect to host
affinity.vc: did not receive HSTS header
-affloc.com: could not connect to host
affordablebouncycastle.co.uk: did not receive HSTS header
+affordableenergyadvocates.com: could not connect to host
affordablepapers.com: could not connect to host
aficotroceni.ro: did not receive HSTS header
afiru.net: could not connect to host
@@ -794,6 +876,7 @@ africatravel.de: did not receive HSTS header
after.im: could not connect to host
afterskool.eu: could not connect to host
afterstack.net: could not connect to host
+afuh.de: could not connect to host
afvallendoeje.nu: could not connect to host
afyou.co.kr: could not connect to host
afzco.asia: did not receive HSTS header
@@ -801,6 +884,7 @@ agalaxyfarfaraway.co.uk: could not connect to host
agatheetraphael.fr: could not connect to host
agbremen.de: could not connect to host
agdalieso.com.ba: could not connect to host
+ageg.ca: could not connect to host
agelesscitizen.com: could not connect to host
agelesscitizens.com: could not connect to host
agenbettingasia.com: did not receive HSTS header
@@ -808,15 +892,19 @@ agenceactiv.immo: did not receive HSTS header
agenceklic.com: did not receive HSTS header
agenciagriff.com: did not receive HSTS header
agencymanager.be: could not connect to host
+agent6.com.au: did not receive HSTS header
agentseeker.ca: could not connect to host
agevio.com: could not connect to host
+agglo-sion.ch: could not connect to host
+aggr.pw: did not receive HSTS header
agiairini.cz: could not connect to host
+agic.io: could not connect to host
agilebits.net: could not connect to host
agingstop.net: could not connect to host
agonswim.com: did not receive HSTS header
agoravm.tk: could not connect to host
agowa.eu: did not receive HSTS header
-agowa338.de: did not receive HSTS header
+agracan.com: could not connect to host
agrafix.design: did not receive HSTS header
agrias.com.br: did not receive HSTS header
agrikulturchic.com: could not connect to host
@@ -844,22 +932,25 @@ aide-admin.com: did not receive HSTS header
aide-valais.ch: could not connect to host
aidikofflaw.com: did not receive HSTS header
aiesecarad.ro: could not connect to host
+aiforsocialmedia.com: could not connect to host
aifreeze.ru: could not connect to host
aify.eu: could not connect to host
-aiheisi.com: did not receive HSTS header
+aiheisi.com: could not connect to host
aikenorganics.com: could not connect to host
aim-consultants.com: did not receive HSTS header
+aimerworld.com: could not connect to host
aimrom.org: could not connect to host
ainrb.com: could not connect to host
+aintevenmad.ch: could not connect to host
aioboot.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
aip-marine.com: could not connect to host
aiphyron.com: could not connect to host
aiponne.com: could not connect to host
airbly.com: did not receive HSTS header
airconsalberton.co.za: did not receive HSTS header
-airconsboksburg.co.za: did not receive HSTS header
airconsfourways.co.za: did not receive HSTS header
airconsmidrand.co.za: did not receive HSTS header
+airconsrandburg.co.za: did not receive HSTS header
airconssandton.co.za: did not receive HSTS header
airedaleterrier.com.br: could not connect to host
airfax.io: could not connect to host
@@ -867,7 +958,6 @@ airlea.com: could not connect to host
airlinecheckins.com: did not receive HSTS header
airlinesettlement.com: did not receive HSTS header
airmazinginflatables.com: could not connect to host
-airportlimototoronto.com: did not receive HSTS header
airproto.com: did not receive HSTS header
airsick.guide: did not receive HSTS header
airtimefranchise.com: did not receive HSTS header
@@ -878,14 +968,12 @@ aiticon.de: did not receive HSTS header
aivene.com: could not connect to host
aiw-thkoeln.online: could not connect to host
aixxe.net: did not receive HSTS header
-aizxxs.com: could not connect to host
aizxxs.net: could not connect to host
ajetaci.cz: could not connect to host
ajibot.com: could not connect to host
ajmahal.com: could not connect to host
ajouin.com: could not connect to host
ajw-group.com: did not receive HSTS header
-ak-webit.de: could not connect to host
aka.my: did not receive HSTS header
akboy.pw: could not connect to host
akclinics.org: did not receive HSTS header
@@ -907,11 +995,11 @@ akselimedia.fi: could not connect to host
akstudentsfirst.org: could not connect to host
aktan.com.br: could not connect to host
aktivist.in: did not receive HSTS header
-aktuelle-uhrzeit.at: did not receive HSTS header
akul.co.in: could not connect to host
al-f.net: could not connect to host
al-shami.net: could not connect to host
-al3366.tech: could not connect to host
+alamgir.works: could not connect to host
+alanhuang.name: could not connect to host
alanlee.net: could not connect to host
alanrickmanflipstable.com: did not receive HSTS header
alanya.law: did not receive HSTS header
@@ -919,6 +1007,7 @@ alariel.de: did not receive HSTS header
alarme-gps.ch: could not connect to host
alarmegps.ch: could not connect to host
alarmsystemreviews.com: did not receive HSTS header
+alarna.de: could not connect to host
alasta.info: could not connect to host
alauda-home.de: could not connect to host
alaundeil.xyz: could not connect to host
@@ -927,6 +1016,7 @@ alberguecimballa.es: could not connect to host
albertify.xyz: could not connect to host
albertonplumber24-7.co.za: did not receive HSTS header
albertopimienta.com: did not receive HSTS header
+albinma.com: could not connect to host
albuic.tk: could not connect to host
alcantarafleuriste.com: did not receive HSTS header
alcatelonetouch.us: could not connect to host
@@ -938,18 +1028,21 @@ aldes.co.za: did not receive HSTS header
aldred.cloud: could not connect to host
aleax.me: could not connect to host
alecvannoten.be: did not receive HSTS header
-aledg.cl: could not connect to host
+aledg.cl: did not receive HSTS header
alenan.org: could not connect to host
-aleph.land: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
alertaenlinea.gov: did not receive HSTS header
-alessandro.pw: could not connect to host
+alessandro.pw: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
alessandroz.ddns.net: could not connect to host
alessandroz.pro: could not connect to host
-alethearose.com: did not receive HSTS header
+alethearose.com: could not connect to host
alexandernorth.ch: could not connect to host
+alexanderzinn.com: did not receive HSTS header
+alexandrastylist.com: could not connect to host
alexandre.sh: did not receive HSTS header
+alexandros.io: could not connect to host
alexdaulby.com: did not receive HSTS header
alexdodge.ca: did not receive HSTS header
+alexei.su: max-age too low: 7776000
alexfisherhealth.com.au: did not receive HSTS header
alexhaydock.co.uk: did not receive HSTS header
alexischaussy.xyz: could not connect to host
@@ -958,9 +1051,10 @@ alexismeza.com.mx: could not connect to host
alexismeza.dk: could not connect to host
alexismeza.es: could not connect to host
alexismeza.nl: could not connect to host
-alexkidd.de: did not receive HSTS header
+alexkidd.de: could not connect to host
alexmak.net: did not receive HSTS header
alexmol.tk: could not connect to host
+alexmroberts.net: could not connect to host
alexperry.io: could not connect to host
alexsinnott.me: could not connect to host
alfa24.pro: could not connect to host
@@ -968,6 +1062,7 @@ alfaperfumes.com.br: could not connect to host
alfaponny.se: could not connect to host
alfirous.com: could not connect to host
alfredxing.com: did not receive HSTS header
+alftrain.com: could not connect to host
algarmatic-automatismos.pt: could not connect to host
algebraaec.com: did not receive HSTS header
algercounty.gov: could not connect to host
@@ -976,6 +1071,7 @@ alibababee.com: could not connect to host
alibip.de: could not connect to host
alicialab.org: could not connect to host
alien.bz: did not receive HSTS header
+aliim.gdn: could not connect to host
alilialili.ga: could not connect to host
alinemaciel.adm.br: could not connect to host
alinode.com: could not connect to host
@@ -985,7 +1081,7 @@ alistairpialek.com: max-age too low: 86400
alisync.com: could not connect to host
alittlebitcheeky.com: did not receive HSTS header
aliwebstore.com: could not connect to host
-aljammaz.holdings: could not connect to host
+aljammaz.holdings: did not receive HSTS header
aljmz.com: did not receive HSTS header
alkami.com: max-age too low: 0
alkamitech.com: max-age too low: 0
@@ -995,6 +1091,7 @@ all.tf: could not connect to host
all4os.com: did not receive HSTS header
allaboutbelgaum.com: did not receive HSTS header
alldaymonitoring.com: could not connect to host
+alldigitalsolutions.com: did not receive HSTS header
alldm.ru: could not connect to host
allegro-inc.com: did not receive HSTS header
allemobieleproviders.nl: could not connect to host
@@ -1007,8 +1104,8 @@ allhard.org: could not connect to host
alliance-compacts.com: did not receive HSTS header
allinnote.com: could not connect to host
allinone-ranking150.com: did not receive HSTS header
-allinonecyprus.com: could not connect to host
-allkindzabeats.com: did not receive HSTS header
+allinonecyprus.com: did not receive HSTS header
+allkindzabeats.com: could not connect to host
allladyboys.com: could not connect to host
allmbw.com: could not connect to host
allmystery.de: did not receive HSTS header
@@ -1017,18 +1114,23 @@ allods-zone.ru: did not receive HSTS header
alloffice.com.ua: did not receive HSTS header
alloinformatique.net: could not connect to host
alloutatl.com: could not connect to host
+alloydevil.nl: did not receive HSTS header
+allplayer.tk: did not receive HSTS header
allpropertyservices.com: did not receive HSTS header
allprorisk.com: did not receive HSTS header
allrealty.co.za: could not connect to host
allscammers.exposed: could not connect to host
allseasons-cleaning.co.uk: could not connect to host
+allshousedesigns.com: did not receive HSTS header
allsortscastles.co.uk: could not connect to host
allstarautokiaparts.com: could not connect to host
+allstarpartyinflatables.co.uk: could not connect to host
allstarswithus.com: could not connect to host
allstorebrasil.com.br: could not connect to host
alltheducks.com: max-age too low: 43200
allthingsblogging.com: could not connect to host
allthingsfpl.com: could not connect to host
+allvips.ru: could not connect to host
almagalla.com: could not connect to host
almatinki.com: could not connect to host
aloalabs.com: did not receive HSTS header
@@ -1037,14 +1139,13 @@ alorenzi.eu: did not receive HSTS header
alp.net.cn: could not connect to host
alparque.com: did not receive HSTS header
alpe-d-or.dyn-o-saur.com: could not connect to host
-alpencam.com: could not connect to host
alpha.irccloud.com: could not connect to host
alphabit-secure.com: could not connect to host
-alphabrock.cn: could not connect to host
alphabuild.io: could not connect to host
-alphagamers.net: did not receive HSTS header
-alphahunks.com: could not connect to host
+alphagamers.net: could not connect to host
alphalabs.xyz: could not connect to host
+alqassam.net: did not receive HSTS header
+alquiladoramexico.com: did not receive HSTS header
als-hardware.co.za: did not receive HSTS header
alspolska.pl: max-age too low: 2592000
alt-tab-design.com: did not receive HSTS header
@@ -1052,14 +1153,14 @@ alt33c3.org: could not connect to host
altahrim.net: could not connect to host
altaide.com: did not receive HSTS header
altailife.ru: did not receive HSTS header
-altamarea.se: could not connect to host
+altamarea.se: did not receive HSTS header
altbinaries.com: could not connect to host
alteqnia.com: could not connect to host
altercpa.ru: max-age too low: 0
altered.network: could not connect to host
altfire.ca: could not connect to host
altiacaselight.com: could not connect to host
-altitudemoversdenver.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+altitudemoversdenver.com: max-age too low: 300
altoneum.com: could not connect to host
altporn.xyz: could not connect to host
altruistgroup.net: max-age too low: 300
@@ -1069,9 +1170,11 @@ alunjam.es: did not receive HSTS header
alunonaescola.com.br: did not receive HSTS header
aluoblog.pw: could not connect to host
aluoblog.top: could not connect to host
+aluroof.eu: could not connect to host
alusta.co: could not connect to host
alvis-audio.com: did not receive HSTS header
alvn.ga: could not connect to host
+alwaysonssl.com: could not connect to host
am8888.top: could not connect to host
amaderelectronics.com: max-age too low: 2592000
amadilo.de: could not connect to host
@@ -1079,7 +1182,6 @@ amadoraslindas.com: could not connect to host
amaforro.com: could not connect to host
amaforums.org: did not receive HSTS header
amalficoastchauffeur.com: could not connect to host
-amalfirock.it: could not connect to host
amandaonishi.com: could not connect to host
amandaworldstudies.com: could not connect to host
amaranthus.com.ph: could not connect to host
@@ -1088,17 +1190,19 @@ amatzen.dk: did not receive HSTS header
amavis.org: did not receive HSTS header
amazing-gaming.fr: could not connect to host
amazingbouncycastles.co.uk: did not receive HSTS header
-amazingfloridagulfhomes.com: did not receive HSTS header
+amazingfloridagulfhomes.com: could not connect to host
ambiancestudio.ro: did not receive HSTS header
+ambouncyhire.com: could not connect to host
ambrosius.io: could not connect to host
-amcvega.com: did not receive HSTS header
+amcvega.com: could not connect to host
amdouglas.uk: could not connect to host
amechancez.site: could not connect to host
+amelandadventure.nl: did not receive HSTS header
amerhd.com: could not connect to host
american-truck-simulator.de: could not connect to host
american-truck-simulator.net: could not connect to host
americanbio.com: did not receive HSTS header
-americandistribuidora.com: could not connect to host
+americandistribuidora.com: did not receive HSTS header
americanoutlawjeepparts.com: did not receive HSTS header
americansforcommunitydevelopment.org: did not receive HSTS header
americansportsinstitute.org: did not receive HSTS header
@@ -1122,7 +1226,7 @@ amin.ga: did not receive HSTS header
amin.one: could not connect to host
amisharingstuff.com: could not connect to host
amishsecurity.com: could not connect to host
-amitse.com: did not receive HSTS header
+amitse.com: could not connect to host
amitube.com: could not connect to host
amleeds.co.uk: did not receive HSTS header
amlvfs.net: could not connect to host
@@ -1147,22 +1251,28 @@ anaisypirueta.es: did not receive HSTS header
anajianu.ro: max-age too low: 2592000
anakros.me: could not connect to host
analangelsteen.com: could not connect to host
+analisilaica.it: did not receive HSTS header
analpantyhose.org: could not connect to host
analteengirls.net: could not connect to host
analytic-s.ml: could not connect to host
analyticsinmotion.net: could not connect to host
analyzemyfriends.com: could not connect to host
+anarchyrp.life: could not connect to host
+anassiriphotography.com: could not connect to host
anastasiafond.com: did not receive HSTS header
+anaveragehuman.eu.org: did not receive HSTS header
ancarda.net: could not connect to host
anchorgrounds.com: did not receive HSTS header
anchorinmarinainc.com: did not receive HSTS header
ancient-gates.de: could not connect to host
+ancientcraft.eu: could not connect to host
ancientkarma.com: could not connect to host
andbraiz.com: did not receive HSTS header
andere-gedanken.net: did not receive HSTS header
+anderskp.dk: did not receive HSTS header
anderslind.dk: could not connect to host
andiscyber.space: could not connect to host
-andreagobetti.com: did not receive HSTS header
+andre-ballensiefen.de: could not connect to host
andreas-kluge.eu: could not connect to host
andreasanti.net: did not receive HSTS header
andreasbasurto.com: could not connect to host
@@ -1173,10 +1283,11 @@ andreasr.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERR
andreastoneman.com: could not connect to host
andrefaber.nl: did not receive HSTS header
andrei-coman.com: did not receive HSTS header
-andreigec.net: did not receive HSTS header
+andreigec.net: could not connect to host
andrejstefanovski.com: did not receive HSTS header
andrepicard.de: could not connect to host
andrerose.ca: did not receive HSTS header
+andrespaz.com: max-age too low: 0
andrewbroekman.com: could not connect to host
andrewdavidwong.com: did not receive HSTS header
andrewdaws.co: could not connect to host
@@ -1187,23 +1298,21 @@ andrewmichaud.beer: could not connect to host
andrewrdaws.com: could not connect to host
andrewregan.me: could not connect to host
andrewtebert.com: did not receive HSTS header
-andrewthelott.net: could not connect to host
+andrewthelott.net: did not receive HSTS header
andrewvoce.com: did not receive HSTS header
-andrewx.net: could not connect to host
andrewyg.net: could not connect to host
andreypopp.com: could not connect to host
android: could not connect to host
androidprosmart.com: could not connect to host
androidsphone.com: did not receive HSTS header
androled.fr: max-age too low: 5184000
-andronika.net: could not connect to host
androoz.se: could not connect to host
andyclark.io: could not connect to host
andycloud.dynu.net: could not connect to host
andycraftz.eu: did not receive HSTS header
andymartin.cc: could not connect to host
andymelichar.com: max-age too low: 0
-andys-place.co.uk: could not connect to host
+andysroom.dynu.net: could not connect to host
andyuk.org: could not connect to host
anecuni-club.com: could not connect to host
anecuni-rec.com: could not connect to host
@@ -1215,6 +1324,7 @@ ange-de-bonheur444.com: could not connect to host
angelic47.com: could not connect to host
angeloroberto.ch: did not receive HSTS header
angeloventuri.com: did not receive HSTS header
+angelsgirl.eu.org: could not connect to host
angervillelorcher.fr: did not receive HSTS header
anghami.com: did not receive HSTS header
anglertanke.de: could not connect to host
@@ -1225,7 +1335,9 @@ angrylab.com: did not receive HSTS header
angryroute.com: could not connect to host
anguiao.com: did not receive HSTS header
aniaimichal.eu: could not connect to host
+aniforprez.net: could not connect to host
anim.ee: could not connect to host
+animal-nature-human.com: could not connect to host
animalnet.de: max-age too low: 7776000
animalstropic.com: could not connect to host
animatelluris.nl: max-age too low: 2628000
@@ -1245,7 +1357,7 @@ anitube-nocookie.ch: could not connect to host
anivar.net: could not connect to host
ankakaak.com: could not connect to host
ankaraprofesyonelnakliyat.com: did not receive HSTS header
-ankaraprofesyonelnakliyat.com.tr: could not connect to host
+ankaraprofesyonelnakliyat.com.tr: did not receive HSTS header
ankenbrand.me: did not receive HSTS header
ankitha.in: max-age too low: 0
ankya9.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -1260,39 +1372,41 @@ annicascakes.nl: could not connect to host
annotate.software: could not connect to host
annrusnak.com: did not receive HSTS header
annsbouncycastles.com: could not connect to host
-anohana.org: could not connect to host
anomaly.ws: did not receive HSTS header
anonboards.com: could not connect to host
anonrea.ch: could not connect to host
+anons.fr: could not connect to host
anonukradio.org: could not connect to host
anonymo.co.uk: could not connect to host
anonymo.uk: could not connect to host
anonymousstatecollegelulzsec.com: could not connect to host
anothermilan.net: could not connect to host
+anoxinon.de: max-age too low: 2628000
ansdell.info: could not connect to host
anseo.ninja: could not connect to host
ansermfg.com: max-age too low: 0
ansgar.tk: could not connect to host
anshuman-chatterjee.com: did not receive HSTS header
anshumanbiswas.com: could not connect to host
-ansibeast.net: did not receive HSTS header
answers-online.ru: could not connect to host
ant.land: could not connect to host
antecim.fr: could not connect to host
antenasmundosat.com.br: did not receive HSTS header
anthenor.co.uk: could not connect to host
-anthony-rouanet.com: could not connect to host
+anthony-rouanet.com: did not receive HSTS header
anthonyaires.com: did not receive HSTS header
anthonyavon.com: could not connect to host
anthonyloop.com: did not receive HSTS header
anthro.id: did not receive HSTS header
+antibioticshome.com: max-age too low: 604800
antifraud.net.ru: could not connect to host
+antiled.by: could not connect to host
antimatiere.space: did not receive HSTS header
antimine.kr: could not connect to host
antipa.ch: could not connect to host
-antirayapmalang.com: did not receive HSTS header
+antirayapmalang.com: max-age too low: 36000
antoine-roux.fr: did not receive HSTS header
-antoinebetas.be: max-age too low: 0
+antoinebetas.be: did not receive HSTS header
antoined.fr: did not receive HSTS header
antoinemary.io: did not receive HSTS header
antoineschaller.ch: did not receive HSTS header
@@ -1302,21 +1416,25 @@ antons.io: did not receive HSTS header
antraxx.ee: could not connect to host
antscript.com: did not receive HSTS header
anunayk.com: could not connect to host
-anycoin.me: did not receive HSTS header
+anycoin.me: could not connect to host
anyfood.fi: could not connect to host
anypool.fr: did not receive HSTS header
anypool.net: did not receive HSTS header
anyprime.net: could not connect to host
+anythingautowebster.com: did not receive HSTS header
anytonetech.com: did not receive HSTS header
anyways.at: could not connect to host
+ao-dev.com: could not connect to host
aobogo.com: could not connect to host
aocast.info: could not connect to host
aojao.cn: could not connect to host
aojf.fr: could not connect to host
+aoku3d.com: could not connect to host
aolabs.nz: did not receive HSTS header
aomberg.com: did not receive HSTS header
aomonk.com: did not receive HSTS header
aooobo.com: could not connect to host
+aosus.org: did not receive HSTS header
aov.io: could not connect to host
aovcentrum.nl: did not receive HSTS header
aozora.moe: could not connect to host
@@ -1325,12 +1443,9 @@ apaginastore.com.br: could not connect to host
apeasternpower.com: could not connect to host
aperim.com: max-age too low: 43200
aperture-laboratories.science: did not receive HSTS header
-apexitsolutions.ca: could not connect to host
api.mega.co.nz: could not connect to host
apibot.de: could not connect to host
apience.com: did not receive HSTS header
-apila.care: could not connect to host
-apila.us: could not connect to host
apiled.io: could not connect to host
apis.blue: could not connect to host
apis.google.com: did not receive HSTS header (error ignored - included regardless)
@@ -1339,20 +1454,23 @@ apivia.fr: did not receive HSTS header
apkdv.com: did not receive HSTS header
apkmod.id: did not receive HSTS header
apkoyunlar.club: could not connect to host
-apkriver.com: did not receive HSTS header
+apkriver.com: could not connect to host
apl2bits.net: did not receive HSTS header
apmg-certified.com: did not receive HSTS header
apmg-cyber.com: did not receive HSTS header
apmpproject.org: did not receive HSTS header
apnakliyat.com: did not receive HSTS header
apo-deutschland.biz: could not connect to host
+apoil.org: could not connect to host
apolloyl.com: did not receive HSTS header
apollyon.work: could not connect to host
aponkral.site: could not connect to host
aponkralsunucu.com: could not connect to host
aponow.de: did not receive HSTS header
+aporter.ddns.net: could not connect to host
apostilasaprovacao.com: could not connect to host
apotheek-nl.org: did not receive HSTS header
+apotheke-ch.org: could not connect to host
app: could not connect to host
app-arena.com: did not receive HSTS header
app.manilla.com: could not connect to host
@@ -1369,6 +1487,7 @@ appimlab.it: could not connect to host
apple-watch-zubehoer.de: could not connect to host
apple.ax: could not connect to host
applejacks-bouncy-castles.co.uk: could not connect to host
+applesana.es: could not connect to host
applewatch.co.nz: did not receive HSTS header
applez.xyz: could not connect to host
appliancerepairlosangeles.com: did not receive HSTS header
@@ -1380,14 +1499,14 @@ appreciationkards.com: did not receive HSTS header
approlys.fr: did not receive HSTS header
apps-for-fishing.com: could not connect to host
apps4all.sytes.net: could not connect to host
-appsbystudio.co.uk: did not receive HSTS header
+appsbystudio.co.uk: could not connect to host
appsdash.io: could not connect to host
appson.co.uk: did not receive HSTS header
apptoutou.com: could not connect to host
appuro.com: did not receive HSTS header
-appxcrypto.com: did not receive HSTS header
aprefix.com: could not connect to host
aprpullmanportermuseum.org: did not receive HSTS header
+aprsdroid.org: could not connect to host
aptitude9.com: could not connect to host
aqilacademy.com.au: could not connect to host
aqqrate.com: could not connect to host
@@ -1402,9 +1521,12 @@ arabsexi.info: could not connect to host
aradulconteaza.ro: could not connect to host
aran.me.uk: could not connect to host
aranel.me: could not connect to host
+arawaza.biz: could not connect to host
arawaza.info: could not connect to host
arboineuropa.nl: did not receive HSTS header
arboleda-hurtado.com: could not connect to host
+arboworks.com: could not connect to host
+arbu.eu: could not connect to host
arcadiaeng.com: did not receive HSTS header
arcbit.io: could not connect to host
archii.ca: did not receive HSTS header
@@ -1423,7 +1545,6 @@ arent.kz: did not receive HSTS header
arenzanaphotography.com: could not connect to host
arewedubstepyet.com: could not connect to host
areyouever.me: could not connect to host
-argama-nature.com: did not receive HSTS header
argennon.xyz: could not connect to host
argh.io: could not connect to host
arguggi.co.uk: could not connect to host
@@ -1441,11 +1562,11 @@ arizer.com: did not receive HSTS header
arka.gq: did not receive HSTS header
arkbyte.com: did not receive HSTS header
arknodejs.com: could not connect to host
+arlatools.com: could not connect to host
arlen.io: could not connect to host
arlen.se: could not connect to host
arlet.click: could not connect to host
arlingtonwine.net: could not connect to host
-arm.gov: could not connect to host
armazemdaminiatura.com.br: could not connect to host
armeni-jewellery.gr: did not receive HSTS header
armenians.online: could not connect to host
@@ -1461,9 +1582,10 @@ armytricka.cz: did not receive HSTS header
arnaudminable.net: could not connect to host
arne-petersen.net: did not receive HSTS header
arnesolutions.com: could not connect to host
+arnevankauter.com: could not connect to host
aromaclub.nl: did not receive HSTS header
around-the-blog.com: did not receive HSTS header
-aroundme.org: did not receive HSTS header
+aroundme.org: could not connect to host
arpa.ph: did not receive HSTS header
arpr.co: did not receive HSTS header
arrayify.com: could not connect to host
@@ -1478,18 +1600,17 @@ artansoft.com: could not connect to host
artaronquieres.com: did not receive HSTS header
artartefatos.com.br: could not connect to host
artbytik.ru: did not receive HSTS header
-arteequipamientos.com.uy: did not receive HSTS header
+artefakt.es: could not connect to host
artegusto.ru: did not receive HSTS header
artemicroway.com.br: could not connect to host
arteseideias.com.pt: did not receive HSTS header
artesupra.com: did not receive HSTS header
-arti-group.ml: max-age too low: 2592000
+arti-group.ml: did not receive HSTS header
articaexports.com: could not connect to host
artifex21.com: did not receive HSTS header
artifex21.fr: did not receive HSTS header
artiming.com: could not connect to host
artisanhd.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-artisavotins.com: could not connect to host
artisense.de: could not connect to host
artisphere.ch: did not receive HSTS header
artisticedgegranite.net: could not connect to host
@@ -1514,12 +1635,8 @@ asasuou.pw: could not connect to host
asc16.com: could not connect to host
aschaefer.net: could not connect to host
asdpress.cn: could not connect to host
-aseith.com: could not connect to host
aseko.gr: did not receive HSTS header
-asepms.com: max-age too low: 7776000
-ashd1.goip.de: could not connect to host
-ashd2.goip.de: could not connect to host
-ashd3.goip.de: could not connect to host
+asepms.com: could not connect to host
ashlane-cottages.com: could not connect to host
ashleakunowski.com: could not connect to host
ashleyadum.com: could not connect to host
@@ -1529,6 +1646,7 @@ ashleymedway.com: could not connect to host
asian-archi.com.tw: did not receive HSTS header
asianbet77.co: did not receive HSTS header
asianbet77.net: did not receive HSTS header
+asianodor.com: could not connect to host
asisee.co.il: could not connect to host
askfit.cz: did not receive HSTS header
askmagicconch.com: could not connect to host
@@ -1550,7 +1668,7 @@ assekuranzjobs.de: could not connect to host
asset-alive.com: did not receive HSTS header
asset-alive.net: could not connect to host
assetict.com: max-age too low: 0
-assetsupervision.com: could not connect to host
+assetsupervision.com: did not receive HSTS header
assindia.nl: did not receive HSTS header
assistance-personnes-agees.ch: could not connect to host
assistcart.com: could not connect to host
@@ -1559,20 +1677,21 @@ astaninki.com: could not connect to host
astenretail.com: could not connect to host
asthon.cn: could not connect to host
astraalivankila.net: could not connect to host
-astral.gq: did not receive HSTS header
+astral.gq: could not connect to host
astrath.net: could not connect to host
astrea-voetbal-groningen.nl: could not connect to host
astrolpost.com: could not connect to host
astromelody.com: did not receive HSTS header
astronomie-fulda.de: did not receive HSTS header
+astrosnail.pt.eu.org: could not connect to host
astutr.co: could not connect to host
+asucrews.com: could not connect to host
asuhe.cc: could not connect to host
asuhe.win: did not receive HSTS header
asuhe.xyz: could not connect to host
async.be: could not connect to host
at-one.ca: did not receive HSTS header
at1.co: could not connect to host
-ataber.pw: could not connect to host
atacadooptico.com.br: could not connect to host
atavio.at: could not connect to host
atavio.ch: could not connect to host
@@ -1584,8 +1703,9 @@ atelier-viennois-cannes.fr: could not connect to host
atelierhupsakee.nl: did not receive HSTS header
ateliernihongo.ch: did not receive HSTS header
ateliersantgervasi.com: did not receive HSTS header
-atg.soy: could not connect to host
+atendimentodelta.com.br: did not receive HSTS header
athaliasoft.com: could not connect to host
+athena-garage.co.uk: could not connect to host
athenelive.com: could not connect to host
athensbusinessresources.us: could not connect to host
atheoryofchange.com: could not connect to host
@@ -1599,34 +1719,37 @@ atlas-5.site: could not connect to host
atlas-staging.ml: could not connect to host
atlas.co: did not receive HSTS header
atlassian.net: did not receive HSTS header
+atlayo.com: did not receive HSTS header
atlex.nl: did not receive HSTS header
atlseccon.com: did not receive HSTS header
atmocdn.com: could not connect to host
atomic.menu: could not connect to host
atomic.red: could not connect to host
+atomicbounce.co.uk: could not connect to host
atomik.pro: did not receive HSTS header
atop.io: could not connect to host
atracaosexshop.com.br: could not connect to host
-atrevillot.com: could not connect to host
attelage.net: did not receive HSTS header
attic118.com: could not connect to host
attimidesigns.com: did not receive HSTS header
attogproductions.com: did not receive HSTS header
+atulhost.com: did not receive HSTS header
au-pair24.de: did not receive HSTS header
au.search.yahoo.com: max-age too low: 172800
au2pb.net: could not connect to host
aubiosales.com: could not connect to host
aucubin.moe: could not connect to host
-audiobookstudio.com: could not connect to host
+audiblox.co.za: did not receive HSTS header
audioonly.stream: could not connect to host
audiovisualdevices.com.au: did not receive HSTS header
-audividi.shop: did not receive HSTS header
+audividi.shop: could not connect to host
aufmerksamkeitsstudie.com: could not connect to host
aufprise.de: did not receive HSTS header
augaware.org: did not receive HSTS header
augenblicke-blog.de: could not connect to host
augias.org: could not connect to host
augrandinquisiteur.com: did not receive HSTS header
+august.black: did not receive HSTS header
aujapan.ru: could not connect to host
aulaschrank.gq: could not connect to host
auntieme.com: did not receive HSTS header
@@ -1638,29 +1761,31 @@ auraredeye.com: could not connect to host
auraredshield.com: could not connect to host
aurora-terraria.org: could not connect to host
aurorarecordings.com: could not connect to host
-auroratownshipfd.org: could not connect to host
+auroratownshipfd.org: did not receive HSTS header
+aurosa.cz: did not receive HSTS header
aurugs.com: did not receive HSTS header
ausec.ch: could not connect to host
-auskunftsbegehren.at: did not receive HSTS header
+auskunftsbegehren.at: could not connect to host
auslandsjahr-usa.de: did not receive HSTS header
ausnah.me: could not connect to host
-ausschreibungen-suedtirol.it: did not receive HSTS header
aussiecable.org: could not connect to host
+aussiegreenmarks.com.au: did not receive HSTS header
aussiehq.com.au: did not receive HSTS header
aussiewebmarketing.com.au: did not receive HSTS header
austinmobilemechanics.net: did not receive HSTS header
austinstore.com.br: could not connect to host
austinsutphin.com: could not connect to host
+australianarmedforces.org: did not receive HSTS header
australiancattle.dog: could not connect to host
australianfreebets.com.au: did not receive HSTS header
auth.mail.ru: did not receive HSTS header
-authenitech.com: did not receive HSTS header
+authenitech.com: could not connect to host
authentication.io: could not connect to host
authinfo-bestellen.de: could not connect to host
authint.com: could not connect to host
author24.ru: did not receive HSTS header
authoritynutrition.com: did not receive HSTS header
-authorsguild.in: did not receive HSTS header
+authorsguild.in: could not connect to host
authsrv.nl.eu.org: could not connect to host
auto-serwis.zgorzelec.pl: could not connect to host
auto3d.cn: could not connect to host
@@ -1672,7 +1797,7 @@ autodeploy.it: could not connect to host
autoecolebudget.ch: did not receive HSTS header
autoecoledumontblanc.com: could not connect to host
autoeet.cz: did not receive HSTS header
-autohaus-snater.de: did not receive HSTS header
+autoepc.ro: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
autojuhos.sk: could not connect to host
autokovrik-diskont.ru: did not receive HSTS header
automobiles5.com: could not connect to host
@@ -1684,6 +1809,7 @@ autostop-occasions.be: could not connect to host
autotsum.com: could not connect to host
autoxy.it: did not receive HSTS header
autumnwindsagility.com: could not connect to host
+auux.com: max-age too low: 2592000
auverbox.ovh: could not connect to host
auvious.com: did not receive HSTS header
auxetek.se: could not connect to host
@@ -1701,6 +1827,7 @@ avdelivers.com: did not receive HSTS header
avdh.top: could not connect to host
avec-ou-sans-ordonnance.fr: could not connect to host
aveling-adventure.co.uk: did not receive HSTS header
+avestawebbtjanst.se: could not connect to host
avg.club: did not receive HSTS header
avi9526.pp.ua: could not connect to host
aviacao.pt: did not receive HSTS header
@@ -1710,20 +1837,26 @@ avitres.com: could not connect to host
avmemo.com: could not connect to host
avmo.pw: could not connect to host
avmoo.com: could not connect to host
+avnet.ws: could not connect to host
+avocadooo.stream: could not connect to host
avonlearningcampus.com: could not connect to host
avotoma.com: could not connect to host
+avs-building-services.co.uk: did not receive HSTS header
avso.pw: could not connect to host
avspot.net: could not connect to host
avus-automobile.com: did not receive HSTS header
+avv.li: did not receive HSTS header
avxo.pw: could not connect to host
awan.tech: could not connect to host
awanderlustadventure.com: did not receive HSTS header
awccanadianpharmacy.com: could not connect to host
awei.pub: could not connect to host
awen.me: did not receive HSTS header
+awesomesit.es: could not connect to host
awf0.xyz: could not connect to host
awg-mode.de: did not receive HSTS header
-awin.la: did not receive HSTS header
+awin.la: could not connect to host
+awomaninherprime.com: could not connect to host
aww.moe: did not receive HSTS header
awxg.eu.org: could not connect to host
awxg.org: could not connect to host
@@ -1735,10 +1868,10 @@ axelchv.fr: could not connect to host
axem.co.jp: did not receive HSTS header
axeny.com: did not receive HSTS header
axg.io: did not receive HSTS header
-axialsports.com: did not receive HSTS header
+axialsports.com: could not connect to host
axis-stralis.co.uk: could not connect to host
axiumacademy.com: did not receive HSTS header
-axka.com: did not receive HSTS header
+axka.com: could not connect to host
axolsoft.com: max-age too low: 10540800
axtudo.com: did not receive HSTS header
axtux.tk: could not connect to host
@@ -1753,14 +1886,19 @@ ayor.tech: could not connect to host
ayuru.info: could not connect to host
az-vinyl-boden.de: could not connect to host
azamra.com: did not receive HSTS header
+azane.ga: did not receive HSTS header
azia.info: could not connect to host
+aziende.com.ar: could not connect to host
azirevpn.com: did not receive HSTS header
+azizfirat.com: did not receive HSTS header
azlo.com: did not receive HSTS header
+azmusica.com: did not receive HSTS header
azprep.us: could not connect to host
azun.pl: did not receive HSTS header
azuxul.fr: could not connect to host
azzag.co.uk: did not receive HSTS header
b-entropy.com: could not connect to host
+b-landia.net: did not receive HSTS header
b-pi.duckdns.org: could not connect to host
b-rickroll-e.pw: could not connect to host
b-space.de: could not connect to host
@@ -1776,13 +1914,14 @@ b1758.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_
b1768.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
b1768.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
b1788.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+b1rd.tk: could not connect to host
b2486.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
b2486.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
b2b-nestle.com.br: could not connect to host
b2bpromoteit.com: did not receive HSTS header
b3orion.com: could not connect to host
b422edu.com: could not connect to host
-b4r7.de: did not receive HSTS header
+b4r7.de: could not connect to host
b5189.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
b5189.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
b5289.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -1794,7 +1933,7 @@ b8591.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_
b8591.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
b8979.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
b8979.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-b8a.me: did not receive HSTS header
+b8a.me: could not connect to host
b9018.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
b9018.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
b9108.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -1901,7 +2040,7 @@ bacchanallia.com: could not connect to host
bacgrouppublishing.com: could not connect to host
bacimg.com: did not receive HSTS header
back-bone.nl: did not receive HSTS header
-backenmachtgluecklich.de: max-age too low: 2592000
+backenmachtgluecklich.de: max-age too low: 0
backgroundz.net: could not connect to host
backintomotionphysiotherapy.com: did not receive HSTS header
backlogapp.io: could not connect to host
@@ -1909,6 +2048,7 @@ backpacken.org: could not connect to host
backscattering.de: did not receive HSTS header
backyardbbqbash.com: did not receive HSTS header
baconate.com: did not receive HSTS header
+bad-wurzach.de: did not receive HSTS header
bad.show: could not connect to host
badai.at: could not connect to host
badbee.cc: could not connect to host
@@ -1919,36 +2059,43 @@ badkamergigant.com: could not connect to host
baff.lu: could not connect to host
baffinlee.com: did not receive HSTS header
bagiobella.com: max-age too low: 0
-baglu.com: could not connect to host
bagstage.de: did not receive HSTS header
baiduaccount.com: could not connect to host
baildonhottubs.co.uk: could not connect to host
bair.io: could not connect to host
bairdzhang.com: could not connect to host
baito-j.jp: did not receive HSTS header
+baitulongbaycruises.com: could not connect to host
baixoutudo.com: did not receive HSTS header
bajajfinserv.in: did not receive HSTS header
+baka.red: could not connect to host
bakabt.info: could not connect to host
bakanin.ru: could not connect to host
bakaweb.fr: could not connect to host
bakhansen.com: did not receive HSTS header
+bakim.li: could not connect to host
bakkerdesignandbuild.com: did not receive HSTS header
+bakongcondo.com: could not connect to host
bakxnet.com: could not connect to host
balatoni-nyar.hu: did not receive HSTS header
balcan-underground.net: could not connect to host
+balcarek.pl: could not connect to host
baldwinkoo.com: could not connect to host
baleares.party: could not connect to host
balenciaspa.com: did not receive HSTS header
balihai.com: did not receive HSTS header
balilingo.ooo: could not connect to host
+ball3d.es: did not receive HSTS header
ballbusting-cbt.com: could not connect to host
-balle.dk: could not connect to host
+balle.dk: did not receive HSTS header
ballitolocksmith.com: could not connect to host
balloonphp.com: could not connect to host
balnearionaturaspa.com: did not receive HSTS header
balonmano.co: could not connect to host
bals.org: did not receive HSTS header
+balticer.de: did not receive HSTS header
bambambaby.com.br: could not connect to host
+bambumania.com.br: could not connect to host
bamtoki.com: could not connect to host
bamtoki.se: could not connect to host
bananabandy.com: could not connect to host
@@ -1962,6 +2109,7 @@ bandar303.id: did not receive HSTS header
bandar303.win: did not receive HSTS header
bandarifamily.com: could not connect to host
bandb.xyz: did not receive HSTS header
+bandgap.io: could not connect to host
bandrcrafts.com: could not connect to host
banduhn.com: did not receive HSTS header
bangzafran.com: could not connect to host
@@ -1971,7 +2119,6 @@ bankersonline.com: could not connect to host
bankitt.network: could not connect to host
bankmilhas.com.br: did not receive HSTS header
bankofrealty.review: could not connect to host
-banksaround.com: did not receive HSTS header
bannisbierblog.de: could not connect to host
banoviny.sk: did not receive HSTS header
banqingdiao.com: could not connect to host
@@ -1979,12 +2126,12 @@ banri.me: could not connect to host
banxehoi.com: did not receive HSTS header
bao-in.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
bao-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+baobeiglass.com: could not connect to host
baodan666.com: could not connect to host
baosuckhoedoisong.net: could not connect to host
baptistboard.com: did not receive HSTS header
baptiste-destombes.fr: did not receive HSTS header
-baraxolka.ru: could not connect to host
-barbaros.info: could not connect to host
+barcoderealty.com: could not connect to host
barcouniforms.com: did not receive HSTS header
barely.sexy: did not receive HSTS header
barf-alarm.de: did not receive HSTS header
@@ -2001,11 +2148,11 @@ barrett.ag: did not receive HSTS header
barrut.me: did not receive HSTS header
barshout.co.uk: could not connect to host
barss.io: could not connect to host
-bartel.ws: could not connect to host
bartelldrugs.com: did not receive HSTS header
barunisystems.com: could not connect to host
bascht.com: did not receive HSTS header
basculasconfiables.com: could not connect to host
+basementdoctor.com: did not receive HSTS header
basercap.co.ke: could not connect to host
bashc.at: could not connect to host
bashcode.ninja: could not connect to host
@@ -2016,6 +2163,7 @@ basilm.co: could not connect to host
basketsbymaurice.com: did not receive HSTS header
baskettemple.com: did not receive HSTS header
basnieuwenhuizen.nl: did not receive HSTS header
+basnoslovno.com.ua: did not receive HSTS header
bassh.net: did not receive HSTS header
bastadigital.com: did not receive HSTS header
bastivmobile.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -2024,7 +2172,6 @@ bat909.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR
bat9vip.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
bat9vip.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
batfoundry.com: could not connect to host
-batipresta.ch: did not receive HSTS header
batonger.com: could not connect to host
batten.eu.org: could not connect to host
batteryservice.ru: did not receive HSTS header
@@ -2034,11 +2181,11 @@ baudairenergyservices.com: did not receive HSTS header
bauen-mit-ziegel.de: max-age too low: 604800
baum.ga: did not receive HSTS header
baumstark.ca: could not connect to host
-bautied.de: did not receive HSTS header
bayinstruments.com: could not connect to host
bayrisch-fuer-anfaenger.de: did not receive HSTS header
baysse.eu: did not receive HSTS header
bazarstupava.sk: could not connect to host
+bazinga-events.nl: did not receive HSTS header
bazisszoftver.hu: could not connect to host
bb-shiokaze.jp: did not receive HSTS header
bbb1991.me: could not connect to host
@@ -2074,15 +2221,13 @@ bcnet.hk: could not connect to host
bcodeur.com: did not receive HSTS header
bcradio.org: could not connect to host
bcs.adv.br: did not receive HSTS header
-bcsytv.com: could not connect to host
-bcvps.com: did not receive HSTS header
+bcsytv.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
bcweightlifting.ca: could not connect to host
bdata.cl: could not connect to host
bddemir.com: could not connect to host
bde-epitech.fr: could not connect to host
bdenzer.com: did not receive HSTS header
bdenzer.xyz: could not connect to host
-bdikaros-network.net: could not connect to host
bdsmxxxpics.com: could not connect to host
be9418.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
be9418.info: could not connect to host
@@ -2106,7 +2251,7 @@ beagreenbean.co.uk: could not connect to host
beamitapp.com: could not connect to host
beanbot.party: could not connect to host
beanworks.ca: did not receive HSTS header
-bearden.io: could not connect to host
+bearden.io: did not receive HSTS header
beardydave.com: did not receive HSTS header
beasel.biz: could not connect to host
beastlog.tk: could not connect to host
@@ -2115,6 +2260,7 @@ beautyconcept.co: did not receive HSTS header
beavers.io: could not connect to host
bebeefy.uk: could not connect to host
bebesurdoue.com: could not connect to host
+bebout.domains: could not connect to host
beccajoshwedding.com: could not connect to host
becklove.cn: could not connect to host
beckon.com: did not receive HSTS header
@@ -2123,20 +2269,23 @@ becubed.co: could not connect to host
bedabox.com: did not receive HSTS header
bedeta.de: could not connect to host
bedlingtonterrier.com.br: could not connect to host
+bednar.co: did not receive HSTS header
bedouille.com: could not connect to host
bedreid.dk: did not receive HSTS header
bedrijvenadministratie.nl: could not connect to host
bee.supply: could not connect to host
beerboutique.com.br: could not connect to host
-beermedlar.com: could not connect to host
beersandco.ch: could not connect to host
+beerview.ga: could not connect to host
beetgroup.id: could not connect to host
beetleroadstories.com: could not connect to host
beforesunrise.de: did not receive HSTS header
befundup.com: could not connect to host
+begabungsfoerderung.info: could not connect to host
begcykel.com: did not receive HSTS header
begoodny.co.il: max-age too low: 7889238
behere.be: could not connect to host
+behoerden-online-dienste.de: did not receive HSTS header
beholdthehurricane.com: could not connect to host
beier.io: could not connect to host
beikeil.de: did not receive HSTS header
@@ -2157,6 +2306,7 @@ belwederczykow.eu: could not connect to host
belyvly.com: did not receive HSTS header
bemvindoaolar.com.br: could not connect to host
bemyvictim.com: max-age too low: 2678400
+ben2.co.il: max-age too low: 2592000
benchcast.com: did not receive HSTS header
bendechrai.com: did not receive HSTS header
bendingtheending.com: did not receive HSTS header
@@ -2173,21 +2323,21 @@ benjakesjohnson.com: could not connect to host
benjamin-horvath.com: could not connect to host
benjamin-suess.de: could not connect to host
benjamindietrich.com: could not connect to host
+benjamindietrich.de: did not receive HSTS header
benjaminesims.com: did not receive HSTS header
benjaminjurke.net: did not receive HSTS header
benk.press: could not connect to host
benmorecentre.co.uk: did not receive HSTS header
-benny003.de: did not receive HSTS header
+bennythink.com: could not connect to host
benohead.com: did not receive HSTS header
bentphotos.se: could not connect to host
-benwattie.com: did not receive HSTS header
+benwattie.com: could not connect to host
benzkosmetik.de: did not receive HSTS header
benzou-space.com: could not connect to host
beourvictim.com: max-age too low: 2678400
bep.gov: did not receive HSTS header
bep362.vn: could not connect to host
beraru.tk: could not connect to host
-beraten-entwickeln-steuern.de: could not connect to host
berdaguermontes.eu: could not connect to host
berduri.com: did not receive HSTS header
beretech.fr: could not connect to host
@@ -2195,13 +2345,15 @@ berger.work: could not connect to host
bergfex.at: did not receive HSTS header
bergland-seefeld.at: did not receive HSTS header
berhampore-gateway.tk: could not connect to host
+beringsoegaard.dk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
berlatih.com: did not receive HSTS header
berliancom.com: did not receive HSTS header
berlin-kohlefrei.de: could not connect to host
berlinleaks.com: could not connect to host
bermytraq.bm: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+berna.fr: could not connect to host
+bernardfischer.fr: did not receive HSTS header
bernexskiclub.ch: did not receive HSTS header
-bernieware.de: could not connect to host
berrymark.be: did not receive HSTS header
berseb.se: could not connect to host
berthelier.me: could not connect to host
@@ -2219,6 +2371,7 @@ besola.de: could not connect to host
bespaarnu.click: could not connect to host
best-of-bounce.co.uk: could not connect to host
best-wedding-quotes.com: could not connect to host
+best66.me: did not receive HSTS header
bestattorney.com: did not receive HSTS header
bestbeards.ca: could not connect to host
bestbestbitcoin.com: could not connect to host
@@ -2230,12 +2383,15 @@ bestfitnesswatchreview.info: could not connect to host
besthost.cz: did not receive HSTS header
besthotsales.com: could not connect to host
bestiahosting.com: could not connect to host
+bestlashesandbrows.com: did not receive HSTS header
+bestlashesandbrows.hu: did not receive HSTS header
bestleftwild.com: could not connect to host
bestmodels.su: did not receive HSTS header
bestof1001.de: could not connect to host
bestorangeseo.com: could not connect to host
bestpaintings.nl: did not receive HSTS header
bestparking.xyz: could not connect to host
+bestpig.fr: could not connect to host
bestwarezone.com: could not connect to host
bet-99.cc: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
bet-99.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -2254,12 +2410,15 @@ betformular.com: could not connect to host
betgo9.cc: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
bethditto.com: did not receive HSTS header
betkoo.com: could not connect to host
+betleakbot.com: could not connect to host
betnet.fr: could not connect to host
betonmoney.com: could not connect to host
betplanning.it: did not receive HSTS header
bets.de: did not receive HSTS header
betshoot.com: could not connect to host
betsonlinefree.com.au: could not connect to host
+betterjapanese.com: could not connect to host
+betterjapanese.org: could not connect to host
betterlifemakers.com: max-age too low: 200
bettween.com: did not receive HSTS header
between.be: did not receive HSTS header
@@ -2268,7 +2427,6 @@ betwin9.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERRO
betz.ro: could not connect to host
beulahtabernacle.com: could not connect to host
bevapehappy.com: did not receive HSTS header
-bewerbungsfibel.de: did not receive HSTS header
bewertet.de: could not connect to host
bexit-hosting.nl: could not connect to host
bexit-security.eu: could not connect to host
@@ -2278,6 +2436,7 @@ bey.io: could not connect to host
beylikduzum.com: could not connect to host
beylikduzuvaillant.com: could not connect to host
beyond-edge.com: could not connect to host
+beyondtrust.com: did not receive HSTS header
beyuna.co.uk: did not receive HSTS header
beyuna.eu: did not receive HSTS header
beyuna.nl: did not receive HSTS header
@@ -2290,6 +2449,7 @@ bfd.vodka: did not receive HSTS header
bfear.com: could not connect to host
bfelob.gov: could not connect to host
bffm.biz: could not connect to host
+bfi.wien: did not receive HSTS header
bfrailwayclub.cf: could not connect to host
bg-sexologia.com: could not connect to host
bg16.de: could not connect to host
@@ -2308,7 +2468,6 @@ biaoqingfuhao.org: did not receive HSTS header
biapinheiro.com.br: max-age too low: 5184000
biblerhymes.com: did not receive HSTS header
bibliafeminina.com.br: could not connect to host
-biblio.wiki: could not connect to host
bichines.es: did not receive HSTS header
bichonfrise.com.br: could not connect to host
bichonmaltes.com.br: could not connect to host
@@ -2319,10 +2478,13 @@ biego.cn: did not receive HSTS header
biehl.co: did not receive HSTS header
bielsa.me: did not receive HSTS header
bienenblog.cc: could not connect to host
+biensenvue.com: could not connect to host
+bienstar.tv: could not connect to host
bier.jp: did not receive HSTS header
bierbringer.at: could not connect to host
bierochs.org: could not connect to host
biewen.me: did not receive HSTS header
+biftin.net: could not connect to host
big-black.de: did not receive HSTS header
bigbbqbrush.bid: could not connect to host
bigbounceentertainment.co.uk: could not connect to host
@@ -2332,13 +2494,13 @@ bigerbio.com: could not connect to host
bigfunbouncycastles.com: could not connect to host
bigjohn.ru: did not receive HSTS header
biglagoonrentals.com: did not receive HSTS header
+bignumworks.com: could not connect to host
bigshinylock.minazo.net: could not connect to host
bigshort.org: could not connect to host
biguixhe.net: could not connect to host
bijouxbrasil.com.br: did not receive HSTS header
bijouxdegriffe.com.br: could not connect to host
bijugeral.com.br: could not connect to host
-bijuteriicualint.ro: could not connect to host
bikelifetvkidsquads.co.uk: could not connect to host
bikermusic.net: could not connect to host
bikeshopitalia.com: could not connect to host
@@ -2346,17 +2508,20 @@ bilanligne.com: did not receive HSTS header
bildermachr.de: could not connect to host
biletru.net: could not connect to host
biletua.de: could not connect to host
+biletyplus.com: could not connect to host
biletyplus.ru: did not receive HSTS header
-bilibili.red: could not connect to host
bill-nye-the.science: could not connect to host
billdestler.com: did not receive HSTS header
billigssl.dk: did not receive HSTS header
-billkiss.com: could not connect to host
+billkiss.com: max-age too low: 0
billninja.com: did not receive HSTS header
billpro.com.au: could not connect to host
billrobinson.io: could not connect to host
billrusling.com: could not connect to host
+biloplysninger.dk: did not receive HSTS header
+bilsho.com: could not connect to host
binam.center: could not connect to host
+binarization.com: did not receive HSTS header
binarization.net: could not connect to host
binarization.org: did not receive HSTS header
binaryabstraction.com: could not connect to host
@@ -2372,7 +2537,6 @@ bingofriends.com: could not connect to host
bingostars.com: did not receive HSTS header
binimo.com: could not connect to host
binkanhada.biz: could not connect to host
-binsp.net: could not connect to host
bintelligence.nl: did not receive HSTS header
bioespuna.eu: did not receive HSTS header
biofam.ru: did not receive HSTS header
@@ -2387,6 +2551,7 @@ bip.gov.sa: could not connect to host
birchbarkfurniture.ch: could not connect to host
birdandbranchnyc.com: max-age too low: 43200
birkengarten.ch: could not connect to host
+birkhoff.me: did not receive HSTS header
birkman.com: did not receive HSTS header
biscuits-rec.com: could not connect to host
biscuits-shop.com: could not connect to host
@@ -2398,6 +2563,7 @@ bit.voyage: did not receive HSTS header
bitace.com: did not receive HSTS header
bitbit.org: did not receive HSTS header
bitbr.net: did not receive HSTS header
+bitcalt.eu.org: could not connect to host
bitcalt.ga: could not connect to host
bitcantor.com: did not receive HSTS header
bitchan.it: could not connect to host
@@ -2411,7 +2577,7 @@ bitcoinec.info: could not connect to host
bitcoinfo.jp: did not receive HSTS header
bitcoinhk.org: did not receive HSTS header
bitcoinjpn.com: could not connect to host
-bitcoinprivacy.net: did not receive HSTS header
+bitcoinprivacy.net: could not connect to host
bitcoinwalletscript.tk: could not connect to host
bitcoinworld.me: could not connect to host
bitconcepts.co.uk: could not connect to host
@@ -2423,12 +2589,13 @@ bitf.ly: could not connect to host
bitfactory.ws: could not connect to host
bitfarm-archiv.com: did not receive HSTS header
bitfarm-archiv.de: did not receive HSTS header
+bitfolio.org: did not receive HSTS header
bitheus.com: could not connect to host
bithosting.io: did not receive HSTS header
-bitk.co: did not receive HSTS header
-bitk.co.uk: did not receive HSTS header
-bitk.eu: did not receive HSTS header
-bitk.uk: did not receive HSTS header
+bitk.co: could not connect to host
+bitk.co.uk: could not connect to host
+bitk.eu: could not connect to host
+bitk.uk: could not connect to host
bitmain.com.ua: could not connect to host
bitmaincare.com.ua: could not connect to host
bitmaincare.ru: could not connect to host
@@ -2443,9 +2610,11 @@ bitpod.de: could not connect to host
bitrage.de: could not connect to host
bitraum.io: could not connect to host
bitroll.com: could not connect to host
-bitsafe.systems: did not receive HSTS header
+bitsafe.systems: could not connect to host
+bitsburg.ru: could not connect to host
bitsensor.io: did not receive HSTS header
bitshaker.net: did not receive HSTS header
+bitstep.ca: could not connect to host
bittervault.xyz: could not connect to host
bituptick.com: did not receive HSTS header
bitvegas.com: did not receive HSTS header
@@ -2464,27 +2633,27 @@ bizzybeebouncers.co.uk: could not connect to host
bjgongyi.com: did not receive HSTS header
bjl5689.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
bjl5689.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-bjolanta.pl: could not connect to host
bjrn.io: could not connect to host
bjtxl.cn: could not connect to host
bk-wife.com: could not connect to host
bkb-skandal.ch: could not connect to host
-bkhayes.com: did not receive HSTS header
-bl00.se: could not connect to host
blaauwgeers.travel: could not connect to host
black-armada.com: could not connect to host
black-armada.com.pl: could not connect to host
black-armada.pl: could not connect to host
black-gay-porn.biz: could not connect to host
black-octopus.ru: could not connect to host
+black-pool.net: could not connect to host
blackapron.com.br: could not connect to host
blackberrycentral.com: could not connect to host
blackberryforums.be: did not receive HSTS header
blackburn.link: could not connect to host
+blackcicada.com: could not connect to host
blackdesertsp.com: could not connect to host
blackdiam.net: did not receive HSTS header
blackdragoninc.org: could not connect to host
blackhell.xyz: could not connect to host
+blackkeg.ca: could not connect to host
blacklane.com: did not receive HSTS header
blackly.uk: max-age too low: 0
blackmagic.sk: could not connect to host
@@ -2493,10 +2662,10 @@ blackphantom.de: could not connect to host
blackroot.eu: max-age too low: 10368000
blackscreen.me: could not connect to host
blackunicorn.wtf: could not connect to host
-bladesmith.io: did not receive HSTS header
+bladesmith.io: could not connect to host
blakerandall.xyz: did not receive HSTS header
+blankersfamily.com: did not receive HSTS header
blantik.net: could not connect to host
-blantr.com: could not connect to host
blarg.co: could not connect to host
blauwwit.be: did not receive HSTS header
blazeit.io: could not connect to host
@@ -2505,10 +2674,12 @@ bleep.zone: could not connect to host
blendlecdn.com: could not connect to host
blenheimchalcot.com: did not receive HSTS header
blessedearth.com.au: max-age too low: 7889238
+blessedguy.net: did not receive HSTS header
blessnet.jp: did not receive HSTS header
bleutecmedia.com: did not receive HSTS header
blha303.com.au: could not connect to host
bliker.ga: could not connect to host
+blikund.swedbank.se: did not receive HSTS header
blindaryproduction.tk: could not connect to host
blindsexdate.nl: did not receive HSTS header
bling9.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -2530,9 +2701,6 @@ blog.torproject.org: max-age too low: 1000
blogabout.ru: could not connect to host
blogcuaviet.com: could not connect to host
blogdeyugioh.com: could not connect to host
-blogdieconomia.it: did not receive HSTS header
-blogdimoda.com: did not receive HSTS header
-blogdimotori.it: did not receive HSTS header
bloglife-bb.com: could not connect to host
bloglikepro.com: could not connect to host
blognone.com: did not receive HSTS header
@@ -2540,7 +2708,9 @@ blognr.com: could not connect to host
blogonblogspot.com: did not receive HSTS header
blokino.org: did not receive HSTS header
blokuhaka.fr: did not receive HSTS header
+blood4pets.tk: could not connect to host
bloodyexcellent.com: did not receive HSTS header
+bloogle.top: did not receive HSTS header
bloomnbud.com: did not receive HSTS header
bloomzoomy.ru: could not connect to host
blowjs.com: could not connect to host
@@ -2550,33 +2720,36 @@ blubbablasen.de: could not connect to host
blucas.org: did not receive HSTS header
bludnykoren.ml: could not connect to host
blue17.co.uk: did not receive HSTS header
-bluebahari.gq: could not connect to host
bluebill.net: did not receive HSTS header
bluecardlottery.eu: could not connect to host
+bluecards.eu: max-age too low: 0
bluecon.eu: could not connect to host
+bluedata.ltd: did not receive HSTS header
bluefinger.nl: did not receive HSTS header
blueglobalmedia.com: could not connect to host
bluehawk.cloud: could not connect to host
bluehelixmusic.com: could not connect to host
blueliv.com: did not receive HSTS header
bluemoonroleplaying.com: could not connect to host
-bluemosh.com: could not connect to host
+blueoceantech.us: did not receive HSTS header
bluepearl.tk: could not connect to host
bluepoint.foundation: could not connect to host
bluepoint.institute: could not connect to host
-blueprintloans.co.uk: did not receive HSTS header
+blueprintloans.co.uk: could not connect to host
blueridgesecuritycameras.com: did not receive HSTS header
+blues-and-pictures.com: could not connect to host
bluescloud.xyz: could not connect to host
bluesecure.com.br: could not connect to host
bluetenmeer.com: did not receive HSTS header
bluezonehealth.co.uk: did not receive HSTS header
blui.cf: max-age too low: 1209600
+blui.ml: could not connect to host
bluketing.com: did not receive HSTS header
blumen-binder.ch: did not receive HSTS header
-blumen-garage.de: could not connect to host
+blumen-garage.de: did not receive HSTS header
blumenwiese.xyz: did not receive HSTS header
blundell.wedding: could not connect to host
-blunderify.se: did not receive HSTS header
+blunderify.se: could not connect to host
bluop.com: did not receive HSTS header
bluserv.net: could not connect to host
bluteklab.com: did not receive HSTS header
@@ -2586,13 +2759,10 @@ blvdmb.com: did not receive HSTS header
bm-i.ch: could not connect to host
bm-trading.nl: did not receive HSTS header
bmet.de: did not receive HSTS header
-bmoattachments.org: did not receive HSTS header
-bmone.net: could not connect to host
-bn4t.me: did not receive HSTS header
bnb-buddy.nl: could not connect to host
bnboy.cn: could not connect to host
bngsecure.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-bnhlibrary.com: did not receive HSTS header
+bnhlibrary.com: could not connect to host
bo1689.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
bo1689.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
bo9club.cc: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -2604,6 +2774,7 @@ bo9game.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERRO
bo9game.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
bo9king.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
board-buy.ru: could not connect to host
+bobaobei.net: could not connect to host
bobaobei.org: could not connect to host
bobep.ru: could not connect to host
bobiji.com: could not connect to host
@@ -2622,27 +2793,26 @@ bohan.life: could not connect to host
bohyn.cz: could not connect to host
boiadeirodeberna.com: could not connect to host
boilesen.com: did not receive HSTS header
-bokeyy.com: could not connect to host
+bokeyy.com: did not receive HSTS header
bolainfoasia.com: did not receive HSTS header
-bolivarfm.com.ve: could not connect to host
-bollywood.uno: did not receive HSTS header
+bollywood.uno: could not connect to host
boltdata.io: could not connect to host
-boltn.uk: did not receive HSTS header
+boltn.uk: could not connect to host
bolwerk.com.br: did not receive HSTS header
bomberus.de: could not connect to host
bombsquad.studio: could not connect to host
bonamihome.ro: could not connect to host
bonapp.restaurant: could not connect to host
bondagefetishstore.com: could not connect to host
+bondtofte.dk: max-age too low: 2592000
boneko.de: did not receive HSTS header
+bonibuty.com: max-age too low: 2592000
bonigo.de: could not connect to host
bonita.com.br: could not connect to host
bonitabrazilian.co.nz: did not receive HSTS header
-bonniekitchen.com: could not connect to host
bonnin.fr: did not receive HSTS header
bonobo.cz: could not connect to host
-bonop.com: did not receive HSTS header
-bonsi.net: could not connect to host
+bonop.com: could not connect to host
bonta.one: could not connect to host
bonus-flexi.com: did not receive HSTS header
boobox.xyz: could not connect to host
@@ -2671,15 +2841,14 @@ bootikexpress.fr: did not receive HSTS header
boozinyan.com: could not connect to host
bopera.co.uk: could not connect to host
borchers-media.de: could not connect to host
-borchers.ninja: did not receive HSTS header
borderlinegroup.com: could not connect to host
borgmestervangen.xyz: could not connect to host
-borgodigatteraia.it: could not connect to host
boringsecurity.net: could not connect to host
boris.one: could not connect to host
borisavstankovic.rs: could not connect to host
borisbesemer.com: could not connect to host
born-to-learn.com: could not connect to host
+borowski.pw: did not receive HSTS header
borrelioz.com: did not receive HSTS header
borscheid-wenig.com: did not receive HSTS header
borzoi.com.br: could not connect to host
@@ -2687,9 +2856,8 @@ boschee.net: could not connect to host
bosworthdental.co.uk: did not receive HSTS header
botlab.ch: could not connect to host
botmanager.pl: could not connect to host
-botox.bz: did not receive HSTS header
bots.cat: could not connect to host
-botserver.de: could not connect to host
+botsindiscord.me: could not connect to host
botstack.host: could not connect to host
boueki.jp: did not receive HSTS header
boueki.org: did not receive HSTS header
@@ -2705,6 +2873,7 @@ bouncewithbovells.com: could not connect to host
bouncing4joy.co.uk: could not connect to host
bouncingbuzzybees.co.uk: could not connect to host
bouncycastleandparty.co.uk: could not connect to host
+bouncycastlehireauckland.co.nz: could not connect to host
bouncycastlehiremedway.com: did not receive HSTS header
bouncycastles.me: could not connect to host
bouncycastlesperth.net: could not connect to host
@@ -2729,12 +2898,14 @@ boypoint.de: could not connect to host
bozemancarpetcleaningservices.com: did not receive HSTS header
bp-wahl.at: did not receive HSTS header
bpadvisors.eu: could not connect to host
+bpaste.net: did not receive HSTS header
bqcp.net: could not connect to host
-bqtoolbox.com: could not connect to host
+bqtoolbox.com: did not receive HSTS header
bracoitaliano.com.br: could not connect to host
braemer-it-consulting.de: could not connect to host
bragasoft.com.br: did not receive HSTS header
bragaweb.com.br: could not connect to host
+brain-e.co: could not connect to host
brainbuxa.com: did not receive HSTS header
braineet.com: did not receive HSTS header
brainfork.ml: could not connect to host
@@ -2745,6 +2916,7 @@ braintm.com: could not connect to host
braintreebouncycastles.com: could not connect to host
braintreegateway.com: did not receive HSTS header
braintreepayments.com: did not receive HSTS header
+brakstad.org: could not connect to host
bramburek.net: could not connect to host
bran.cc: could not connect to host
bran.soy: could not connect to host
@@ -2760,21 +2932,22 @@ brandons.site: could not connect to host
brandontaylor-black.com: could not connect to host
brandred.net: could not connect to host
brandspray.com: could not connect to host
-brandtrapselfie.nl: could not connect to host
-brandweeruitgeest.nl: could not connect to host
brasilien.guide: could not connect to host
brasilmorar.com: did not receive HSTS header
bravz.de: could not connect to host
-brb.city: did not receive HSTS header
breatheav.com: did not receive HSTS header
breatheproduction.com: did not receive HSTS header
breeswish.org: did not receive HSTS header
bregnedalsystems.dk: did not receive HSTS header
+breitbild-beamer.de: max-age too low: 1209600
bremensaki.com: max-age too low: 2592000
brenden.net.au: could not connect to host
-bress.cloud: could not connect to host
+bress.cloud: did not receive HSTS header
+brettelliff.com: did not receive HSTS header
brettpemberton.xyz: did not receive HSTS header
bretz-hufer.de: did not receive HSTS header
+brewtrackr.com: did not receive HSTS header
+breznet.com: could not connect to host
brfvh24.se: could not connect to host
briangarcia.ga: could not connect to host
brianmwaters.net: did not receive HSTS header
@@ -2785,7 +2958,10 @@ brickyardbuffalo.com: did not receive HSTS header
brideandgroomdirect.ie: did not receive HSTS header
bridgeout.com: could not connect to host
bridholm.se: could not connect to host
+bridzius.lt: did not receive HSTS header
+briggsleroux.com: could not connect to host
brightfuturemadebyme.com: could not connect to host
+brightlifedirect.com: max-age too low: 7889238
brightstarkids.co.uk: did not receive HSTS header
brightstarkids.com.au: did not receive HSTS header
brightstarkids.net: did not receive HSTS header
@@ -2801,40 +2977,45 @@ brio-ukraine.store: could not connect to host
britishchronicles.com: could not connect to host
britishmeat.com: could not connect to host
britzer-toner.de: did not receive HSTS header
-brivadois.ovh: did not receive HSTS header
+brivadois.ovh: could not connect to host
brix.ninja: did not receive HSTS header
brks.xyz: could not connect to host
brmascots.com: could not connect to host
-brn.by: could not connect to host
broerweb.nl: could not connect to host
broken-oak.com: could not connect to host
brokenjoysticks.net: did not receive HSTS header
+brooke-fan.com: did not receive HSTS header
brookechase.com: did not receive HSTS header
brookframework.org: could not connect to host
brossman.it: could not connect to host
+brother-printsmart.nl: did not receive HSTS header
brouwerijkoelit.nl: could not connect to host
+brown-devost.com: did not receive HSTS header
brownlawoffice.us: did not receive HSTS header
browserid.org: could not connect to host
brplusdigital.com: could not connect to host
-bruckner.li: could not connect to host
brunix.net: did not receive HSTS header
brunoonline.co.uk: could not connect to host
+brunoramos.com: could not connect to host
brunoramos.org: could not connect to host
+brutus2.ga: could not connect to host
bryancastillo.site: could not connect to host
bryanshearer.accountant: did not receive HSTS header
bryn.xyz: could not connect to host
brynnan.nl: could not connect to host
-brztec.com: could not connect to host
+brztec.com: did not receive HSTS header
bsagan.fr: did not receive HSTS header
bsalyzer.com: could not connect to host
bsc01.dyndns.org: could not connect to host
bsd.com.ro: could not connect to host
+bsdlab.com: could not connect to host
bsdtips.com: could not connect to host
bsdug.org: could not connect to host
bsg-aok-muenchen.de: did not receive HSTS header
bsklabels.com: did not receive HSTS header
bsktweetup.info: could not connect to host
bsohoekvanholland.nl: could not connect to host
+bsquared.org: could not connect to host
bsuess.de: could not connect to host
bsuru.xyz: could not connect to host
bt78.cn: could not connect to host
@@ -2847,16 +3028,20 @@ btc-e.com: could not connect to host
btc2secure.com: could not connect to host
btcdlc.com: could not connect to host
btcgo.nl: did not receive HSTS header
+btcontract.com: could not connect to host
btcp.space: could not connect to host
btcpot.ltd: could not connect to host
+btcycle.org: did not receive HSTS header
btku.org: could not connect to host
btrb.ml: could not connect to host
btserv.de: did not receive HSTS header
+btth.live: could not connect to host
btth.xyz: could not connect to host
bturboo.com: could not connect to host
btxiaobai.com: did not receive HSTS header
bubba.cc: could not connect to host
-buben.tech: did not receive HSTS header
+buben.tech: could not connect to host
+bubhub.io: could not connect to host
buchheld.at: could not connect to host
buchverlag-scholz.de: did not receive HSTS header
buck.com: did not receive HSTS header
@@ -2873,6 +3058,7 @@ buenotour.ru: did not receive HSTS header
buergerdialog.net: could not connect to host
buergerhaushalt.com: did not receive HSTS header
buffalodrinkinggame.beer: did not receive HSTS header
+buffetbouc.com: could not connect to host
bugtrack.co.uk: did not receive HSTS header
bugtrack.io: could not connect to host
buhler.pro: did not receive HSTS header
@@ -2886,8 +3072,9 @@ buildingclouds.ch: could not connect to host
buildingclouds.es: could not connect to host
buildingclouds.eu: could not connect to host
buildingclouds.fr: could not connect to host
+buildrightbuildingservicesltd.co.uk: did not receive HSTS header
buildsaver.co.za: did not receive HSTS header
-builmaker.com: could not connect to host
+builmaker.com: did not receive HSTS header
built.by: did not receive HSTS header
buka.jp: could not connect to host
bukai.men: did not receive HSTS header
@@ -2896,22 +3083,24 @@ bulbgenie.com: could not connect to host
buldogueingles.com.br: could not connect to host
bulgarien.guide: could not connect to host
bulkbuy.tech: could not connect to host
+bull.id.au: could not connect to host
bullbits.com: max-age too low: 0
-bulldoghire.co.uk: did not receive HSTS header
bulletbabu.com: could not connect to host
-bulletpoint.cz: could not connect to host
bullpay.com: did not receive HSTS header
bullterrier.me: could not connect to host
bulmafox.com: could not connect to host
bulmastife.com.br: could not connect to host
-bumarkamoda.com: could not connect to host
+bumarkamoda.com: did not receive HSTS header
bumshow.ru: did not receive HSTS header
bunadarbankinn.is: could not connect to host
bunaken.asia: could not connect to host
bunbomenu.de: could not connect to host
+bunbun.be: could not connect to host
bundaberg.com: did not receive HSTS header
+bunny.tk: did not receive HSTS header
bunsenlabs.org: max-age too low: 2592000
buonventosbt.eu: did not receive HSTS header
+bupu.ml: could not connect to host
burckardtnet.de: did not receive HSTS header
bureaubolster.nl: did not receive HSTS header
bureaugravity.com: did not receive HSTS header
@@ -2923,11 +3112,12 @@ burpsuite.site: could not connect to host
burroughsid.com: could not connect to host
burrow.ovh: could not connect to host
burrowingsec.com: could not connect to host
-bursa3bydgoszcz.pl: did not receive HSTS header
+bursa3bydgoszcz.pl: could not connect to host
burtrum.top: could not connect to host
buryat-mongol.cf: could not connect to host
buryit.net: did not receive HSTS header
busanhs.bid: could not connect to host
+busanhs.win: did not receive HSTS header
buserror.cn: could not connect to host
bush41.org: did not receive HSTS header
bushcraftfriends.com: could not connect to host
@@ -2938,7 +3128,10 @@ businessamongus.com: could not connect to host
businessetmarketing.com: could not connect to host
businessfurs.info: could not connect to host
businesshosting.nl: did not receive HSTS header
-businessmodeler.se: could not connect to host
+businessimmigration-eu.com: could not connect to host
+businessimmigration-eu.ru: could not connect to host
+businessmodeler.se: did not receive HSTS header
+businessradar.com.au: could not connect to host
bustabit.com: could not connect to host
bustimes.org.uk: did not receive HSTS header
busybee360.com: could not connect to host
@@ -2950,6 +3143,7 @@ buttercoin.com: could not connect to host
buttercupstraining.co.uk: did not receive HSTS header
butterfieldstraining.com: could not connect to host
buttermilk.cf: could not connect to host
+buturyu.net: did not receive HSTS header
buturyu.org: did not receive HSTS header
buvinghausen.com: max-age too low: 86400
buy-thing.com: could not connect to host
@@ -2964,8 +3158,9 @@ buyharpoon.com: could not connect to host
buyingsellingflorida.com: could not connect to host
buynowdepot.com: did not receive HSTS header
buyshoe.org: could not connect to host
+buytheway.co.za: could not connect to host
buywood.shop: could not connect to host
-buzzconcert.com: could not connect to host
+buzzconcert.com: did not receive HSTS header
buzzconf.io: could not connect to host
buzzdeck.com: did not receive HSTS header
buzztelco.com.au: could not connect to host
@@ -2981,25 +3176,20 @@ bwf6.com: could not connect to host
bwf66.com: could not connect to host
bwf77.com: could not connect to host
bwf99.com: could not connect to host
-bwin86.com: did not receive HSTS header
-bwin8601.com: did not receive HSTS header
-bwin8602.com: did not receive HSTS header
-bwin8603.com: did not receive HSTS header
-bwin8604.com: did not receive HSTS header
-bwin8605.com: did not receive HSTS header
-bwin8606.com: did not receive HSTS header
+bwin86.com: could not connect to host
bwwb.nu: did not receive HSTS header
bx-web.com: did not receive HSTS header
+bxdev.me: could not connect to host
by.cx: did not receive HSTS header
by1896.com: could not connect to host
by1898.com: did not receive HSTS header
by1899.com: could not connect to host
by4cqb.cn: could not connect to host
-by77.com: could not connect to host
+by77.com: did not receive HSTS header
by777.com: did not receive HSTS header
bydisk.com: could not connect to host
-byhe.me: could not connect to host
byji.com: could not connect to host
+bynet.cz: could not connect to host
bypass.kr: could not connect to host
bypassed.bid: could not connect to host
bypassed.cc: could not connect to host
@@ -3021,11 +3211,13 @@ bypassed.works: could not connect to host
bypassed.world: could not connect to host
bypro.xyz: could not connect to host
byronprivaterehab.com.au: did not receive HSTS header
-byronr.com: did not receive HSTS header
-byronwade.com: did not receive HSTS header
+byronr.com: could not connect to host
+byronwade.com: could not connect to host
byte.chat: did not receive HSTS header
byte.wtf: did not receive HSTS header
bytelog.org: did not receive HSTS header
+byteowls.com: did not receive HSTS header
+bytepark.de: did not receive HSTS header
bytesatwork.eu: could not connect to host
byteshift.ca: could not connect to host
bytesofcode.de: could not connect to host
@@ -3039,29 +3231,30 @@ c0rn3j.com: could not connect to host
c12discountonline.com: did not receive HSTS header
c16t.uk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
c1yd3i.me: could not connect to host
-c2lab.net: did not receive HSTS header
c2o2.xyz: could not connect to host
c3-compose.com: could not connect to host
c3.pm: could not connect to host
+c376.site: could not connect to host
c3b.info: could not connect to host
c3bbs.com: could not connect to host
c3hv.cn: could not connect to host
c3ie.com: did not receive HSTS header
c4.hk: could not connect to host
-ca-terminal-multiservices.fr: did not receive HSTS header
+ca-terminal-multiservices.fr: could not connect to host
+cabarave.com: could not connect to host
cablehighspeed.net: could not connect to host
cabsites.com: could not connect to host
cabusar.fr: could not connect to host
cachethome.com: could not connect to host
cachethq.io: did not receive HSTS header
+cacn.pw: could not connect to host
caconnect.org: could not connect to host
cacr.pw: could not connect to host
+cadacoon.com: did not receive HSTS header
cadao.me: did not receive HSTS header
cadburymovies.in.net: did not receive HSTS header
-cadcreations.co.ke: could not connect to host
cadenadg.gr: did not receive HSTS header
cadra.nl: could not connect to host
-cadusilva.com: could not connect to host
caerostris.com: could not connect to host
caesreon.com: could not connect to host
cafe-murr.de: could not connect to host
@@ -3070,7 +3263,6 @@ cafe-service.ru: could not connect to host
cafechesscourt.com: could not connect to host
cafefresco.pe: did not receive HSTS header
cafesg.net: did not receive HSTS header
-caijunyi.net: did not receive HSTS header
caim.cz: did not receive HSTS header
caipai.fm: could not connect to host
cairnterrier.com.br: could not connect to host
@@ -3081,31 +3273,29 @@ cal.goip.de: could not connect to host
calcularpagerank.com.br: could not connect to host
calculatoaresecondhand.xyz: could not connect to host
caldecotevillagehall.co.uk: could not connect to host
-calebmorris.com: max-age too low: 60
+calebmorris.com: max-age too low: 900
calgaryconstructionjobs.com: did not receive HSTS header
calidoinvierno.com: could not connect to host
callabs.net: could not connect to host
callanbryant.co.uk: did not receive HSTS header
-callawayracing.se: could not connect to host
calleveryday.com: could not connect to host
callision.com: did not receive HSTS header
callmereda.com: could not connect to host
callsigns.ca: could not connect to host
calltrackingreports.com: could not connect to host
-calomel.org: max-age too low: 2764800
calories.org: could not connect to host
caltonnutrition.com: did not receive HSTS header
calvin.me: did not receive HSTS header
calypso-tour.net: could not connect to host
calypsogames.net: could not connect to host
camaya.net: did not receive HSTS header
-cambridge-security.com: could not connect to host
cambridgeanalytica.net: could not connect to host
cambridgeanalytica.org: did not receive HSTS header
camisadotorcedor.com.br: could not connect to host
camjackson.net: did not receive HSTS header
camjobs.net: did not receive HSTS header
cammarkets.com: could not connect to host
+camomile.desi: did not receive HSTS header
campaignelves.com: could not connect to host
campbellsoftware.co.uk: could not connect to host
campbrainybunch.com: did not receive HSTS header
@@ -3118,7 +3308,9 @@ campingdreams.com: did not receive HSTS header
campus-cybersecurity.team: did not receive HSTS header
campusportalng.com: did not receive HSTS header
camsanalytics.com: could not connect to host
+camshowdir.com: could not connect to host
camshowhub.com: could not connect to host
+canadianchristianity.com: did not receive HSTS header
canadiangamblingchoice.com: did not receive HSTS header
canarianlegalalliance.com: did not receive HSTS header
cancelmyprofile.com: could not connect to host
@@ -3128,9 +3320,8 @@ candratech.com: could not connect to host
candygirl.shop: could not connect to host
candykidsentertainment.co.uk: did not receive HSTS header
candylion.rocks: could not connect to host
-canerkorkmaz.com: could not connect to host
+canerkorkmaz.com: did not receive HSTS header
canfield.gov: did not receive HSTS header
-canglong.net: could not connect to host
canifis.net: did not receive HSTS header
cannarobotics.com: could not connect to host
canterberry.cc: did not receive HSTS header
@@ -3142,10 +3333,10 @@ caoyu.info: did not receive HSTS header
capacent.is: did not receive HSTS header
capacitacionyautoempleo.com: did not receive HSTS header
capecycles.co.za: did not receive HSTS header
-capeyorkfire.com.au: did not receive HSTS header
-capitalonecardservice.com: did not receive HSTS header
+capeyorkfire.com.au: could not connect to host
capitaltg.com: did not receive HSTS header
capogna.com: did not receive HSTS header
+capsule.org: did not receive HSTS header
captalize.com: could not connect to host
captchatheprize.com: could not connect to host
captianseb.de: could not connect to host
@@ -3153,14 +3344,17 @@ captivatedbytabrett.com: could not connect to host
captivationscience.com: could not connect to host
capturethepen.co.uk: could not connect to host
car-navi.ph: did not receive HSTS header
-car-rental24.com: did not receive HSTS header
+car-rental24.com: could not connect to host
carano-service.de: did not receive HSTS header
caraudio69.cz: did not receive HSTS header
carbonmonoxidelawyer.net: could not connect to host
-card-cashing.com: max-age too low: 0
+carck.co.uk: could not connect to host
+carck.uk: could not connect to host
+card-cashing.com: did not receive HSTS header
card-toka.jp: could not connect to host
cardloan-manual.net: could not connect to host
cardoni.net: did not receive HSTS header
+cardse.net: could not connect to host
cardstream.com: did not receive HSTS header
cardurl.com: did not receive HSTS header
cardwars.hu: could not connect to host
@@ -3169,8 +3363,11 @@ careerstuds.com: did not receive HSTS header
careplasticsurgery.com: did not receive HSTS header
carey.bio: did not receive HSTS header
carey.li: did not receive HSTS header
-carif-idf.net: could not connect to host
-carif-idf.org: could not connect to host
+carfinancehelp.com: could not connect to host
+carif-idf.net: did not receive HSTS header
+carif-idf.org: did not receive HSTS header
+carinsurance.es: could not connect to host
+carlandfaith.com: did not receive HSTS header
carlolly.co.uk: could not connect to host
carlosalves.info: could not connect to host
carloshmm.com: could not connect to host
@@ -3180,16 +3377,31 @@ carlsbouncycastlesandhottubs.co.uk: did not receive HSTS header
carlscatering.com: did not receive HSTS header
caroli.biz: could not connect to host
caroli.info: could not connect to host
-carpliyz.com: could not connect to host
+carpliyz.com: did not receive HSTS header
carrando.de: could not connect to host
carredejardin.com: did not receive HSTS header
-carrentalsathens.com: max-age too low: 0
carroarmato0.be: did not receive HSTS header
+carrollservicecompany.com: did not receive HSTS header
+carrosserie-dubois.com: did not receive HSTS header
carsforbackpackers.com: could not connect to host
carsten.pw: did not receive HSTS header
carstenfeuls.de: did not receive HSTS header
+cartadeviajes.cl: did not receive HSTS header
+cartadeviajes.co: did not receive HSTS header
+cartadeviajes.com: did not receive HSTS header
+cartadeviajes.com.ar: did not receive HSTS header
+cartadeviajes.com.ve: did not receive HSTS header
+cartadeviajes.de: did not receive HSTS header
+cartadeviajes.ec: did not receive HSTS header
+cartadeviajes.es: did not receive HSTS header
+cartadeviajes.fr: did not receive HSTS header
+cartadeviajes.mx: did not receive HSTS header
+cartadeviajes.pe: did not receive HSTS header
+cartadeviajes.uk: did not receive HSTS header
+cartelcircuit.com: did not receive HSTS header
carterorland.com: could not connect to host
cartesunicef.be: did not receive HSTS header
+cartoonhd.cc: could not connect to host
carwashvapeur.be: could not connect to host
casadellecose.com: did not receive HSTS header
casajardininsecticidas.com: did not receive HSTS header
@@ -3201,11 +3413,11 @@ casefall.com: could not connect to host
cash-pos.com: did not receive HSTS header
cashfortulsahouses.com: could not connect to host
cashless.fr: did not receive HSTS header
+cashlink.de: did not receive HSTS header
cashlink.io: did not receive HSTS header
cashmyphone.ch: could not connect to host
cashsector.ga: could not connect to host
-casinocashflow.ru: could not connect to host
-casinolegal.pt: did not receive HSTS header
+casinocashflow.ru: did not receive HSTS header
casinolistings.com: could not connect to host
casinoluck.com: could not connect to host
casinoreal.com: could not connect to host
@@ -3217,10 +3429,11 @@ casovi.cf: could not connect to host
castagnonavocats.com: did not receive HSTS header
castlejackpot.com: did not receive HSTS header
castleswa.com.au: could not connect to host
-cat-blum.com: could not connect to host
-cata.ga: could not connect to host
-catalin.pw: did not receive HSTS header
+cat-box.de: did not receive HSTS header
+cata.ga: did not receive HSTS header
+catalin.pw: could not connect to host
catarsisvr.com: could not connect to host
+catchfotografie.nl: did not receive HSTS header
catcontent.cloud: could not connect to host
caterkids.com: did not receive HSTS header
catgirl.me: did not receive HSTS header
@@ -3228,12 +3441,14 @@ catgirl.pics: could not connect to host
catharisme.org: could not connect to host
catherineidylle.com: max-age too low: 0
catherinesarasin.com: did not receive HSTS header
+catherinescastles.co.uk: did not receive HSTS header
cathosting.org: could not connect to host
catinmay.com: did not receive HSTS header
catnapstudios.com: could not connect to host
catnmeow.com: could not connect to host
catprog.org: did not receive HSTS header
catsmagic.pp.ua: could not connect to host
+caughtredhanded.co.nz: could not connect to host
causae-fincas.es: did not receive HSTS header
causae.es: did not receive HSTS header
cavaleria.ro: did not receive HSTS header
@@ -3243,10 +3458,11 @@ caveclan.org: did not receive HSTS header
cavedevs.de: could not connect to host
cavedroid.xyz: could not connect to host
cavern.tv: did not receive HSTS header
+cavevinsdefrance.fr: did not receive HSTS header
cayafashion.de: did not receive HSTS header
cayounglab.co.jp: did not receive HSTS header
cbamo.org: did not receive HSTS header
-cbdev.de: could not connect to host
+cbdcontact.pl: could not connect to host
cbi-epa.gov: could not connect to host
cc2729.com: did not receive HSTS header
ccayearbook.com: could not connect to host
@@ -3255,16 +3471,20 @@ ccgn.co: could not connect to host
ccja.ro: did not receive HSTS header
ccl-sti.ch: did not receive HSTS header
ccretreatandfarm.com: did not receive HSTS header
+ccsys.com: could not connect to host
cctech.ph: could not connect to host
cctld.com: could not connect to host
ccu.io: could not connect to host
+ccv-deutschland.de: did not receive HSTS header
+ccv.ch: did not receive HSTS header
ccv.eu: did not receive HSTS header
+ccv.nl: did not receive HSTS header
cd0.us: could not connect to host
cdcpartners.gov: could not connect to host
cdeck.net: could not connect to host
-cdkeyworld.de: did not receive HSTS header
cdlcenter.com: did not receive HSTS header
cdmhp.org.nz: could not connect to host
+cdmlb.net: could not connect to host
cdmon.tech: could not connect to host
cdn.sx.cn: could not connect to host
cdnb.co: could not connect to host
@@ -3272,7 +3492,6 @@ cdndepo.com: could not connect to host
cdnk39.com: could not connect to host
cdreporting.co.uk: did not receive HSTS header
cdt.org: did not receive HSTS header
-ce-agentur.de: did not receive HSTS header
ceagriproducts.com: did not receive HSTS header
cecilwalker.com.au: did not receive HSTS header
cee.io: could not connect to host
@@ -3293,19 +3512,18 @@ cem.pw: did not receive HSTS header
cencalvia.org: could not connect to host
centennialrewards.com: did not receive HSTS header
centerforpolicy.org: could not connect to host
-centerpoint.ovh: did not receive HSTS header
centillien.com: did not receive HSTS header
centos.pub: could not connect to host
central4.me: could not connect to host
centralcountiesservices.org: did not receive HSTS header
-centralfor.me: could not connect to host
centrallead.net: could not connect to host
-centralvacsunlimited.net: did not receive HSTS header
+centrallotus.com: did not receive HSTS header
+centralvacsunlimited.net: could not connect to host
centralvoice.org: could not connect to host
centralync.com: could not connect to host
centrepoint-community.com: could not connect to host
centricbeats.com: did not receive HSTS header
-centrolavoro.org: did not receive HSTS header
+centrym.top: did not receive HSTS header
centsforchange.net: could not connect to host
century-group.com: max-age too low: 2592000
ceoimon.com: did not receive HSTS header
@@ -3317,7 +3535,7 @@ ceritamalam.net: could not connect to host
cerize.love: could not connect to host
cernega.ro: did not receive HSTS header
cerpa.com.br: did not receive HSTS header
-cerstve-korenie.sk: did not receive HSTS header
+cerstve-korenie.sk: could not connect to host
cerstvekorenie.sk: did not receive HSTS header
cert.se: max-age too low: 2628001
certcenter.fr: could not connect to host
@@ -3329,12 +3547,14 @@ ceruleanmainbeach.com.au: did not receive HSTS header
cesal.net: could not connect to host
cesantias.co: could not connect to host
cesidianroot.eu: could not connect to host
-cespri.com.pe: did not receive HSTS header
+cespri.com.pe: could not connect to host
+cestunmetier.ch: could not connect to host
ceta.one: did not receive HSTS header
+cetangarana.com: did not receive HSTS header
cevrimici.com: could not connect to host
+cf-tm.net: could not connect to host
cf11.de: did not receive HSTS header
cfa.gov: did not receive HSTS header
-cfan.space: could not connect to host
cfcnexus.org: could not connect to host
cfcproperties.com: did not receive HSTS header
cfetengineering.com: could not connect to host
@@ -3348,8 +3568,8 @@ chabaojia.com: did not receive HSTS header
chadklass.com: could not connect to host
chadtaljaardt.com: could not connect to host
chahub.com: could not connect to host
+chainedunion.info: could not connect to host
chainmonitor.com: could not connect to host
-chaip.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
chairinstitute.com: did not receive HSTS header
chaldeen.pro: did not receive HSTS header
challengeskins.com: could not connect to host
@@ -3361,8 +3581,9 @@ championnat-romand-cuisiniers-amateurs.ch: could not connect to host
championsofregnum.com: did not receive HSTS header
chancat.blog: could not connect to host
chandlerredding.com: could not connect to host
-changelab.cc: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+changelab.cc: max-age too low: 0
changetip.com: did not receive HSTS header
+channeladam.com: did not receive HSTS header
channelcards.com: did not receive HSTS header
channellife.asia: did not receive HSTS header
channellife.co.nz: did not receive HSTS header
@@ -3371,7 +3592,6 @@ channyc.com: could not connect to host
chaos.fail: could not connect to host
chaoscastles.co.uk: did not receive HSTS header
chaoswebs.net: did not receive HSTS header
-chaotichive.com: could not connect to host
chaoticlaw.com: did not receive HSTS header
chaouby.com: could not connect to host
chapelaria.tf: could not connect to host
@@ -3380,22 +3600,23 @@ chargejuice.com: [Exception... "Component returned failure code: 0x80004005 (NS_
charityclear.com: could not connect to host
charitystreet.co.uk: could not connect to host
charl.eu: could not connect to host
-charlesjay.com: could not connect to host
+charlenevondell.com: could not connect to host
+charlesjay.com: did not receive HSTS header
charlestonsecuritysystems.net: did not receive HSTS header
charliemcneive.com: could not connect to host
charlimarie.com: did not receive HSTS header
charlipopkids.com.au: did not receive HSTS header
+charmanterelefant.at: did not receive HSTS header
charnleyhouse.co.uk: did not receive HSTS header
charonsecurity.com: could not connect to host
charp.eu: could not connect to host
-charr.xyz: could not connect to host
chartstoffarm.de: did not receive HSTS header
chasafilli.ch: could not connect to host
+chaseandzoey.de: could not connect to host
chaseganey.com: did not receive HSTS header
chasing-coins.com: did not receive HSTS header
chaska.co.za: could not connect to host
chasse-et-plaisir.com: did not receive HSTS header
-chat-porc.eu: did not receive HSTS header
chatbot.me: did not receive HSTS header
chatbot.one: could not connect to host
chatbotclic.com: could not connect to host
@@ -3404,16 +3625,16 @@ chatbots.email: could not connect to host
chateau-belvoir.com: could not connect to host
chateauconstellation.ch: did not receive HSTS header
chateaudevaugrigneuse.com: did not receive HSTS header
-chatnbook.com: could not connect to host
+chatnbook.com: did not receive HSTS header
chatup.cf: could not connect to host
chatxp.com: could not connect to host
chaulootz.com: did not receive HSTS header
chaverde.org: could not connect to host
-chaz6.com: did not receive HSTS header
chazgie.se: did not receive HSTS header
chcemvediet.sk: max-age too low: 1555200
+chci-web.cz: max-age too low: 0
chdgaming.xyz: could not connect to host
-cheah.xyz: could not connect to host
+cheah.xyz: did not receive HSTS header
cheapdns.org: could not connect to host
cheapwritinghelp.com: could not connect to host
cheapwritingservice.com: could not connect to host
@@ -3424,6 +3645,7 @@ checkhost.org: could not connect to host
checkmateshoes.com: did not receive HSTS header
checkmatewebsolutions.com: max-age too low: 0
checkout.google.com: could not connect to host (error ignored - included regardless)
+checkras.tk: could not connect to host
checkyourmeds.com: did not receive HSTS header
cheekylittlerascals.co.uk: did not receive HSTS header
cheerflow.com: could not connect to host
@@ -3447,11 +3669,12 @@ cherekerry.com: could not connect to host
cherrett.digital: did not receive HSTS header
cherrydropscandycarts.co.uk: could not connect to host
cherylsoleway.com: did not receive HSTS header
+chesscoders.com: did not receive HSTS header
chessreporter.nl: did not receive HSTS header
chesterbrass.uk: did not receive HSTS header
-chez-janine.de: could not connect to host
chhy.at: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
chiamata-aiuto.ch: could not connect to host
+chiaraiuola.com: could not connect to host
chiaramail.com: could not connect to host
chib.chat: could not connect to host
chicorycom.net: did not receive HSTS header
@@ -3472,7 +3695,7 @@ chinternet.xyz: could not connect to host
chiphell.com: did not receive HSTS header
chiralsoftware.com: could not connect to host
chirgui.eu: could not connect to host
-chloca.jp: did not receive HSTS header
+chloca.jp: could not connect to host
chloe.re: did not receive HSTS header
chloeallison.co.uk: could not connect to host
chloehorler.com: could not connect to host
@@ -3490,10 +3713,15 @@ chontalpa.pw: could not connect to host
choootto.club: did not receive HSTS header
chopperforums.com: could not connect to host
chordso.com: did not receive HSTS header
+chorkley.co.uk: could not connect to host
+chorkley.com: could not connect to host
chorkley.me: could not connect to host
+chorkley.uk: could not connect to host
chorleiterverband.de: did not receive HSTS header
choruscrowd.com: could not connect to host
+chotlo.com: did not receive HSTS header
chotu.net: could not connect to host
+chr0me.sh: could not connect to host
chris-web.info: could not connect to host
chrisandsarahinasia.com: could not connect to host
chrisbrakebill.com: did not receive HSTS header
@@ -3505,7 +3733,9 @@ chriskirchner.de: did not receive HSTS header
chriskyrouac.com: could not connect to host
chrisopperwall.com: could not connect to host
chrisself.xyz: could not connect to host
+christchurchbouncycastles.co.uk: could not connect to host
christiaandruif.nl: could not connect to host
+christian-fischer.pictures: did not receive HSTS header
christian-krug.website: did not receive HSTS header
christianbro.gq: could not connect to host
christianhoffmann.info: could not connect to host
@@ -3524,7 +3754,6 @@ chrisupjohn.xyz: could not connect to host
chrisvannooten.tk: could not connect to host
chrisvicmall.com: did not receive HSTS header
chromaryu.net: could not connect to host
-chromaxa.com: did not receive HSTS header
chrome: could not connect to host
chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless)
chrome.google.com: did not receive HSTS header (error ignored - included regardless)
@@ -3532,7 +3761,6 @@ chronic101.xyz: could not connect to host
chronogram.me: did not receive HSTS header
chronoproject.com: did not receive HSTS header
chrst.ph: could not connect to host
-chs.us: max-age too low: 0
chsh.moe: could not connect to host
chua.cf: did not receive HSTS header
chua.family: did not receive HSTS header
@@ -3542,12 +3770,12 @@ chundelac.com: could not connect to host
churchlinkpro.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
churchux.co: could not connect to host
churrasqueirafacil.com.br: could not connect to host
-chxdf.net: could not connect to host
+chxdf.net: did not receive HSTS header
cianmawhinney.xyz: could not connect to host
cidadedopoker.com.br: did not receive HSTS header
ciderclub.com: could not connect to host
cidr.ml: could not connect to host
-cienbeaute-lidl.fr: could not connect to host
+cienbeaute-lidl.fr: did not receive HSTS header
cigarblogs.net: could not connect to host
cigarterminal.com: could not connect to host
cigi.site: could not connect to host
@@ -3558,6 +3786,7 @@ cimalando.eu: could not connect to host
cinartelorgu.com: did not receive HSTS header
cinay.pw: could not connect to host
cindey.io: could not connect to host
+cindydudley.com: did not receive HSTS header
cinefilia.tk: could not connect to host
cinelite.club: could not connect to host
cinema5.ru: did not receive HSTS header
@@ -3576,7 +3805,7 @@ cira.email: could not connect to host
circ-logic.com: did not receive HSTS header
circlebox.rocks: could not connect to host
cirfi.com: could not connect to host
-cirope.com: could not connect to host
+cirope.com: did not receive HSTS header
cirrohost.com: did not receive HSTS header
cirugiasplasticas.com.mx: did not receive HSTS header
cirujanooral.com: could not connect to host
@@ -3589,11 +3818,11 @@ citroner.blog: did not receive HSTS header
citybusexpress.com: did not receive HSTS header
cityofeastpointemi.gov: could not connect to host
cityoflaurel.org: did not receive HSTS header
-cityoftitansmmo.com: could not connect to host
cityofwadley-ga.gov: did not receive HSTS header
citywalkr.com: could not connect to host
ciuciucadou.ro: could not connect to host
cium.ru: could not connect to host
+ciurcasdan.eu: did not receive HSTS header
civicunicorn.com: could not connect to host
civicunicorn.us: could not connect to host
cjcaron.org: could not connect to host
@@ -3605,7 +3834,6 @@ clacetandil.com.ar: could not connect to host
clad.cf: could not connect to host
claibornecountytn.gov: could not connect to host
claimit.ml: could not connect to host
-clan-ww.com: did not receive HSTS header
clanthor.com: did not receive HSTS header
clapping-rhymes.com: could not connect to host
clara-baumert.de: could not connect to host
@@ -3617,11 +3845,11 @@ clarksgaragedoorrepair.com: did not receive HSTS header
clash-movies.de: max-age too low: 172800
clashersrepublic.com: could not connect to host
classicday.nl: could not connect to host
-classics.io: did not receive HSTS header
classicsandexotics.com: could not connect to host
classicshop.ua: did not receive HSTS header
classicspublishing.com: could not connect to host
classifiedssa.co.za: could not connect to host
+claude-leveille.com: max-age too low: 86400
claudearpel.fr: did not receive HSTS header
claudio4.com: did not receive HSTS header
claytoncondon.com: could not connect to host
@@ -3630,23 +3858,22 @@ cleanbeautymarket.com.au: did not receive HSTS header
cleanexperts.co.uk: could not connect to host
cleaningsquad.ca: did not receive HSTS header
cleanmta.com: could not connect to host
-cleanstar.org: could not connect to host
+cleanstar.org: did not receive HSTS header
clear.ml: could not connect to host
clearc.tk: could not connect to host
clearchatsandbox.com: could not connect to host
+clearer.cloud: could not connect to host
+clearkonjac.com: did not receive HSTS header
clearsky.me: did not receive HSTS header
clearviewwealthprojector.com.au: could not connect to host
+clementfevrier.fr: could not connect to host
clemovementlaw.com: could not connect to host
clerkendweller.uk: could not connect to host
clevelandokla.com: could not connect to host
-cleververmarkten.com: could not connect to host
-cleververmarkten.de: could not connect to host
clic-music.com: could not connect to host
click-2-order.co.uk: did not receive HSTS header
-click2order.co.uk: did not receive HSTS header
clickandgo.com: did not receive HSTS header
clickandshoot.nl: could not connect to host
-clickclickphish.com: did not receive HSTS header
clickforclever.com: did not receive HSTS header
clickgram.biz: could not connect to host
clickomobile.com: did not receive HSTS header
@@ -3656,6 +3883,7 @@ clicn.bio: could not connect to host
clicnbio.com: could not connect to host
cliftons.com: did not receive HSTS header
climaencusco.com: could not connect to host
+clingout.com: could not connect to host
clinia.ca: did not receive HSTS header
clinicadelogopedia.net: did not receive HSTS header
clinicaferrusbratos.com: did not receive HSTS header
@@ -3668,10 +3896,11 @@ clintwilson.technology: max-age too low: 2592000
clip.ovh: did not receive HSTS header
clipped4u.com: could not connect to host
clnet.com.au: did not receive HSTS header
+clod-hacking.com: could not connect to host
cloghercastles.co.uk: did not receive HSTS header
clojurescript.ru: could not connect to host
clorik.com: could not connect to host
-closient.com: did not receive HSTS header
+closient.com: could not connect to host
closingholding.com: could not connect to host
cloturea.fr: could not connect to host
cloud-crowd.com.au: did not receive HSTS header
@@ -3682,7 +3911,7 @@ cloud58.org: did not receive HSTS header
cloudalice.com: could not connect to host
cloudalice.net: could not connect to host
cloudapi.vc: could not connect to host
-cloudbased.info: did not receive HSTS header
+cloudbased.info: could not connect to host
cloudbasedsite.com: did not receive HSTS header
cloudberlin.goip.de: could not connect to host
cloudbleed.info: could not connect to host
@@ -3696,6 +3925,7 @@ cloudfren.com: could not connect to host
cloudimag.es: could not connect to host
cloudimproved.com: could not connect to host
cloudimprovedtest.com: could not connect to host
+cloudkit.pro: did not receive HSTS header
cloudlink.club: did not receive HSTS header
cloudmigrator365.com: did not receive HSTS header
cloudns.com.au: could not connect to host
@@ -3709,7 +3939,7 @@ cloudspotterapp.com: did not receive HSTS header
cloudstoragemaus.com: could not connect to host
cloudstorm.me: could not connect to host
cloudstrike.co: could not connect to host
-cloudteam.de: could not connect to host
+cloudtocloud.tk: could not connect to host
cloudwalk.io: did not receive HSTS header
cloudwarez.xyz: could not connect to host
clounix.online: could not connect to host
@@ -3718,11 +3948,12 @@ clowde.in: could not connect to host
clownaroundbouncycastles.co.uk: did not receive HSTS header
clownish.co.il: could not connect to host
clsimplex.com: did not receive HSTS header
+club-duomo.com: could not connect to host
clubcall.com: did not receive HSTS header
clubdeslecteurs.net: could not connect to host
+clubmate.rocks: could not connect to host
clubmix.co.kr: could not connect to host
clubscannan.ie: did not receive HSTS header
-clueful.ca: max-age too low: 0
cluj.apartments: could not connect to host
clush.pw: did not receive HSTS header
cluster.id: could not connect to host
@@ -3731,19 +3962,19 @@ clvs7.com: did not receive HSTS header
clycat.ru: could not connect to host
clywedogmaths.co.uk: could not connect to host
cm3.pw: could not connect to host
-cmahy.be: could not connect to host
-cmangos.net: did not receive HSTS header
+cmahy.be: did not receive HSTS header
+cmangos.net: could not connect to host
cmc-versand.de: did not receive HSTS header
cmcc.network: could not connect to host
cmci.dk: did not receive HSTS header
cmdtelecom.net.br: did not receive HSTS header
-cmpr.es: could not connect to host
+cmpr.es: did not receive HSTS header
cmrss.com: could not connect to host
cmsbattle.com: could not connect to host
cmscafe.ru: did not receive HSTS header
cmskh.co.uk: could not connect to host
cmso-cal.com: could not connect to host
-cmusical.es: could not connect to host
+cmusical.es: did not receive HSTS header
cmweller.com: could not connect to host
cnam.net: did not receive HSTS header
cnaprograms.online: could not connect to host
@@ -3751,20 +3982,19 @@ cncfraises.fr: did not receive HSTS header
cncmachinemetal.com: did not receive HSTS header
cncn.us: did not receive HSTS header
cnetw.xyz: could not connect to host
-cnitdog.com: could not connect to host
cnlau.com: could not connect to host
cnlic.com: could not connect to host
-cnrd.me: did not receive HSTS header
+cnnet.in: could not connect to host
+cnrd.me: could not connect to host
cnsyear.com: did not receive HSTS header
cnwage.com: could not connect to host
cnwarn.com: could not connect to host
co-driversphoto.se: did not receive HSTS header
co-yutaka.com: could not connect to host
-co2eco.cn: did not receive HSTS header
coa.one: could not connect to host
-coach-sportif.paris: did not receive HSTS header
+coach-sportif.paris: could not connect to host
coachingconsultancy.com: did not receive HSTS header
-cobaltlp.com: could not connect to host
+coam.co: could not connect to host
cobcode.com: could not connect to host
cobrax.net: could not connect to host
coccinellaskitchen.com: could not connect to host
@@ -3794,31 +4024,32 @@ codejunkie.de: could not connect to host
codelayer.ca: could not connect to host
codelitmus.com: did not receive HSTS header
codeloop.pw: could not connect to host
-codelove.de: could not connect to host
-codemonkeyrawks.net: did not receive HSTS header
+codelove.de: did not receive HSTS header
+codemonkeyrawks.net: could not connect to host
codemperium.com: could not connect to host
codenlife.xyz: could not connect to host
codeofhonor.tech: could not connect to host
-codeplay.org: could not connect to host
+codeplay.org: did not receive HSTS header
codepoet.de: did not receive HSTS header
codeproxy.ddns.net: could not connect to host
codepx.com: could not connect to host
+codercross.com: could not connect to host
codercy.com: could not connect to host
coderhangout.com: could not connect to host
+coderme.com: could not connect to host
codersatlas.co: could not connect to host
codersatlas.com: could not connect to host
codersatlas.xyz: could not connect to host
-codersbistro.com: could not connect to host
+codersbase.org: could not connect to host
+codersbistro.com: did not receive HSTS header
+codesplain.in: could not connect to host
codestep.io: could not connect to host
codewiththepros.org: could not connect to host
codewiz.xyz: could not connect to host
-codimaker.com: did not receive HSTS header
-codymoniz.com: could not connect to host
coecrafters.com: could not connect to host
coffeedino.com: did not receive HSTS header
coffeeetc.co.uk: could not connect to host
coffeestrategies.com: max-age too low: 5184000
-coffeetocode.me: did not receive HSTS header
cogniflex.com: could not connect to host
cognixia.com: did not receive HSTS header
cogumelosmagicos.org: could not connect to host
@@ -3831,15 +4062,16 @@ coinessa.com: could not connect to host
coinjar-sandbox.com: could not connect to host
colarelli.ch: could not connect to host
coldaddy.com: could not connect to host
-coldawn.com: could not connect to host
coldlostsick.net: did not receive HSTS header
coldwatericecream.com: did not receive HSTS header
colearnr.com: could not connect to host
-colincampbell.me: could not connect to host
-collablynk.com: could not connect to host
+colegiocierp.com.br: did not receive HSTS header
+colincampbell.me: did not receive HSTS header
+collablynk.com: did not receive HSTS header
collabra.email: did not receive HSTS header
collard.tk: could not connect to host
collbox.co: did not receive HSTS header
+collectivesupply.com: could not connect to host
collectosaurus.com: could not connect to host
colleencornez.com: could not connect to host
collegepaperworld.com: could not connect to host
@@ -3851,13 +4083,15 @@ collins.press: could not connect to host
collinsartworks.com: did not receive HSTS header
collision.fyi: could not connect to host
colmexpro.com: did not receive HSTS header
-colo-tech.com: could not connect to host
colognegaming.net: could not connect to host
+coloppe.com: could not connect to host
coloradocomputernetworking.net: could not connect to host
colorcentertoner.com.br: did not receive HSTS header
coloringnotebook.com: did not receive HSTS header
colorlib.com: did not receive HSTS header
colorunhas.com.br: did not receive HSTS header
+colpatriaws.azurewebsites.net: did not receive HSTS header
+coltonrb.com: could not connect to host
com-news.io: could not connect to host
com.cc: could not connect to host
combatshield.cz: did not receive HSTS header
@@ -3875,6 +4109,7 @@ comfypc.com: could not connect to host
comico.info: could not connect to host
comicrelief.com: did not receive HSTS header
comicspines.com: could not connect to host
+comidasperuanas.net: did not receive HSTS header
comiq.io: could not connect to host
comitesaustria.at: could not connect to host
comiteshopping.com: could not connect to host
@@ -3883,10 +4118,13 @@ commerciallocker.com: could not connect to host
commercialplanet.eu: could not connect to host
commune-preuilly.fr: did not receive HSTS header
community-cupboard.org: did not receive HSTS header
-communityflow.info: could not connect to host
comocurarlashemorroides.org: did not receive HSTS header
comocurarlashemorroidesya.com: did not receive HSTS header
+comodormirmasrapido.com: did not receive HSTS header
+comoeliminarlaspapulasperladasenelglande.com: did not receive HSTS header
+comopuededejardefumar.net: did not receive HSTS header
comorecuperaratumujerpdf.com: could not connect to host
+comosatisfaceraunhombreenlacamaydejarloloco.com: did not receive HSTS header
comotalk.com: could not connect to host
compalytics.com: could not connect to host
comparamejor.com: did not receive HSTS header
@@ -3899,6 +4137,7 @@ compiledworks.com: could not connect to host
completesportperformance.com: did not receive HSTS header
completionist.audio: could not connect to host
complex-organization.com: could not connect to host
+complexorganizations.com: could not connect to host
complexsystems.fail: did not receive HSTS header
complt.xyz: could not connect to host
complymd.com: did not receive HSTS header
@@ -3908,14 +4147,13 @@ comprehensiveihc.com: could not connect to host
compromised.com: could not connect to host
compros.me: could not connect to host
compsmag.com: did not receive HSTS header
-compucastell.ch: could not connect to host
+compucastell.ch: did not receive HSTS header
compucorner.com.mx: could not connect to host
compusolve.nl: could not connect to host
-computeracademy.co.za: could not connect to host
computercraft.net: could not connect to host
computertal.de: could not connect to host
comssa.org.au: did not receive HSTS header
-comw.cc: could not connect to host
+comtily.com: could not connect to host
comyuno.com: did not receive HSTS header
concentrade.de: did not receive HSTS header
conceptatelier.de: could not connect to host
@@ -3925,6 +4163,7 @@ conclave.global: could not connect to host
conclinica.com.br: did not receive HSTS header
concord-group.co.jp: did not receive HSTS header
conectalmeria.com: did not receive HSTS header
+conectar.ru: did not receive HSTS header
confidential.network: could not connect to host
confirm365.com: could not connect to host
conflux.tw: did not receive HSTS header
@@ -3932,7 +4171,7 @@ conformal.com: could not connect to host
conformist.jp: could not connect to host
confucio.cl: could not connect to host
confuddledpenguin.com: did not receive HSTS header
-cong5.net: max-age too low: 0
+cong5.net: did not receive HSTS header
congz.me: did not receive HSTS header
conkret.ch: could not connect to host
conkret.co.uk: could not connect to host
@@ -3945,6 +4184,7 @@ connected-verhuurservice.nl: did not receive HSTS header
connectfss.com: could not connect to host
connectingconcepts.com: could not connect to host
conniesacademy.com: could not connect to host
+connorsmith.co: did not receive HSTS header
conocimientosdigitales.com: could not connect to host
conrad.am: could not connect to host
consciousandglamorous.com: could not connect to host
@@ -3956,7 +4196,8 @@ conseil-gli.fr: did not receive HSTS header
consejosdehogar.com: did not receive HSTS header
console.python.org: did not receive HSTS header
console.support: did not receive HSTS header
-construct-trust.com: could not connect to host
+construct-trust.com: did not receive HSTS header
+consultanta-in-afaceri.ro: max-age too low: 0
consultcelerity.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
consultingroupitaly.com: did not receive HSTS header
consultorcr.net: did not receive HSTS header
@@ -3972,18 +4213,23 @@ contentdesign.de: did not receive HSTS header
contents.ga: did not receive HSTS header
continuation.io: could not connect to host
continuumgaming.com: could not connect to host
-contractdigital.co.uk: did not receive HSTS header
contraout.com: could not connect to host
+controlarlaansiedad.com: did not receive HSTS header
controlcenter.gigahost.dk: did not receive HSTS header
contxt-agentur.de: did not receive HSTS header
convergemagazine.com: did not receive HSTS header
+convergence.fi: could not connect to host
+conversionsciences.com: did not receive HSTS header
convert.zone: could not connect to host
converter.ml: could not connect to host
-convertimg.com: could not connect to host
+convertimg.com: did not receive HSTS header
convoitises.com: did not receive HSTS header
cooink.net: could not connect to host
cookiestudies.cf: could not connect to host
cookingbazart.com: did not receive HSTS header
+cooksbookscorks.com: did not receive HSTS header
+cool110.tk: did not receive HSTS header
+cool110.xyz: did not receive HSTS header
coolaj86.com: did not receive HSTS header
coolbutbroken.com: did not receive HSTS header
coolchevy.org.ua: did not receive HSTS header
@@ -3991,21 +4237,23 @@ coole-meister.de: could not connect to host
cooljs.me: could not connect to host
coolkidsbouncycastles.co.uk: did not receive HSTS header
coolrc.me: did not receive HSTS header
-cooltang.ooo: did not receive HSTS header
coolviewthermostat.com: did not receive HSTS header
coolvox.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+coolwallet.io: did not receive HSTS header
coonelnel.net: did not receive HSTS header
-cooperativehandmade.com: did not receive HSTS header
+coopens.com: could not connect to host
cooperativehandmade.pe: did not receive HSTS header
+coor.fun: could not connect to host
cooxa.com: could not connect to host
copperhead.co: did not receive HSTS header
copshop.com.br: could not connect to host
coptic-treasures.com: max-age too low: 2592000
-copycaught.com: could not connect to host
+copycaught.co: could not connect to host
+copycaught.xyz: could not connect to host
copytrack.com: did not receive HSTS header
cor-ser.es: could not connect to host
coralproject.net: did not receive HSTS header
-coralrosado.com.br: could not connect to host
+coralrosado.com.br: did not receive HSTS header
coramcdaniel.com: could not connect to host
corbinhesse.com: did not receive HSTS header
corderoscleaning.com: did not receive HSTS header
@@ -4013,11 +4261,11 @@ cordial-restaurant.com: did not receive HSTS header
core4system.de: could not connect to host
coreapm.com: could not connect to host
corecdn.org: could not connect to host
+coredump.gr: did not receive HSTS header
coreinfrastructure.org: did not receive HSTS header
corenetworking.de: could not connect to host
coresos.com: could not connect to host
corex.io: could not connect to host
-corgi.party: could not connect to host
corgicloud.com: could not connect to host
corinnanese.de: could not connect to host
coriver.me: did not receive HSTS header
@@ -4031,21 +4279,26 @@ corozanu.ro: did not receive HSTS header
corpoatletico.com.br: could not connect to host
corporateencryption.com: could not connect to host
corporatesubscriptions.com.au: did not receive HSTS header
-correct.horse: did not receive HSTS header
+corporativoarval.info: did not receive HSTS header
+corpsepaint.life: could not connect to host
+correct.horse: could not connect to host
correctpaardbatterijnietje.nl: did not receive HSTS header
correiodovale.com.br: did not receive HSTS header
corruption-mc.net: could not connect to host
corruption-rsps.net: could not connect to host
corruption-server.net: could not connect to host
+coslinker.com: could not connect to host
cosmeticosdelivery.com.br: could not connect to host
cosmeticosnet.com.br: did not receive HSTS header
cosmiatria.pe: could not connect to host
cosmic-os.org: did not receive HSTS header
+cosmintataru.ro: did not receive HSTS header
cosmoluziluminacion.com: did not receive HSTS header
cosmoss-departure.com: could not connect to host
cosni.co: could not connect to host
costa-rica-reisen.ch: did not receive HSTS header
costcofinance.com: did not receive HSTS header
+costellofc.co.uk: could not connect to host
costow.club: did not receive HSTS header
cotonea.de: did not receive HSTS header
cougarsland.com: did not receive HSTS header
@@ -4053,7 +4306,6 @@ coughlan.de: did not receive HSTS header
counselling.network: could not connect to host
counsellingtime.co.uk: could not connect to host
count.sh: could not connect to host
-countryoutlaws.ca: did not receive HSTS header
coup-dun-soir.ch: could not connect to host
couponcodeq.com: could not connect to host
couragewhispers.ca: could not connect to host
@@ -4069,20 +4321,24 @@ covenantbank.net: could not connect to host
covenantmatrix.com: did not receive HSTS header
coverdat.com: could not connect to host
coverduck.ru: could not connect to host
-coworkingmanifesto.com: did not receive HSTS header
+cowo.group: did not receive HSTS header
+coworkingmanifesto.com: could not connect to host
+coxxs.moe: could not connect to host
cozitop.com.br: could not connect to host
cozmaadrian.ro: could not connect to host
cozy.io: did not receive HSTS header
cozycloud.cc: did not receive HSTS header
-cpahunt.com: did not receive HSTS header
cpaneltips.com: could not connect to host
-cpbanq.com: could not connect to host
+cplala.com: could not connect to host
+cptoon.com: could not connect to host
cpuvinf.eu.org: could not connect to host
cqchome.com: did not receive HSTS header
+crackers4cheese.com: could not connect to host
cracking.org: did not receive HSTS header
crackingking.com: could not connect to host
crackpfer.de: could not connect to host
craftbeerbarn.co.uk: could not connect to host
+craftcommerce.com: did not receive HSTS header
craftedge.xyz: could not connect to host
craftination.net: could not connect to host
craftmain.eu: could not connect to host
@@ -4097,14 +4353,14 @@ cranioschule.com: did not receive HSTS header
crashsec.com: did not receive HSTS header
crate.io: did not receive HSTS header
cravelyrics.com: could not connect to host
+crawcial.de: could not connect to host
crazifyngers.com: could not connect to host
crazy-crawler.de: did not receive HSTS header
crazycen.com: could not connect to host
crazycraftland.de: could not connect to host
-crazycraftland.net: could not connect to host
-crazyfamily11.de: did not receive HSTS header
+crazyfamily11.de: could not connect to host
crazyhotseeds.com: did not receive HSTS header
-crazyker.com: did not receive HSTS header
+crazyker.com: could not connect to host
crbug.com: did not receive HSTS header (error ignored - included regardless)
crc-online.nl: did not receive HSTS header
creaescola.com: did not receive HSTS header
@@ -4112,28 +4368,30 @@ creamybuild.com: could not connect to host
create-ls.jp: could not connect to host
create-test-publish.co.uk: could not connect to host
create-together.nl: did not receive HSTS header
+createcos.com: could not connect to host
creations-edita.com: could not connect to host
creativeapple.ltd: did not receive HSTS header
creativeartifice.com: did not receive HSTS header
creativecommons.cl: did not receive HSTS header
creativecommonscatpictures.com: could not connect to host
+creativeground.com.au: did not receive HSTS header
creativephysics.ml: could not connect to host
creativeplayuk.com: did not receive HSTS header
creativlabor.ch: did not receive HSTS header
creato.top: could not connect to host
creators.co: could not connect to host
-crecips.com: could not connect to host
crecket.me: could not connect to host
credia.jp: did not receive HSTS header
creditclear.com.au: did not receive HSTS header
-creditreporttips.net: did not receive HSTS header
+creditreporttips.net: could not connect to host
creepycraft.nl: could not connect to host
+crena.ch: could not connect to host
crendontech.com: did not receive HSTS header
creorin.com: did not receive HSTS header
+crescent.gr.jp: did not receive HSTS header
crestoncottage.com: could not connect to host
-creusalp.ch: did not receive HSTS header
crewplanner.eu: did not receive HSTS header
-crge.eu: could not connect to host
+crge.eu: did not receive HSTS header
criadorespet.com.br: could not connect to host
crickey.eu: could not connect to host
crimewatch.net.za: could not connect to host
@@ -4144,7 +4402,6 @@ cristiandeluxe.com: did not receive HSTS header
cristianhares.com: could not connect to host
critcola.com: could not connect to host
criticalaim.com: could not connect to host
-crizk.com: could not connect to host
crl-autos.com: could not connect to host
crmdemo.website: could not connect to host
croceverdevb.it: did not receive HSTS header
@@ -4161,7 +4418,6 @@ croquette.net: did not receive HSTS header
crosbug.com: did not receive HSTS header (error ignored - included regardless)
crosspeakoms.com: did not receive HSTS header
crosssec.com: did not receive HSTS header
-crow.tw: could not connect to host
crowdcurity.com: did not receive HSTS header
crowdjuris.com: could not connect to host
crowdwis.com: could not connect to host
@@ -4173,13 +4429,14 @@ crt.sh: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAI
crtvmgmt.com: could not connect to host
crudysql.com: could not connect to host
crufad.org: did not receive HSTS header
-cruikshank.com.au: did not receive HSTS header
+cruikshank.com.au: could not connect to host
crushroom.com: max-age too low: 43200
cruzadobalcazarabogados.com: could not connect to host
cruzeiropedia.org: did not receive HSTS header
cruzr.xyz: could not connect to host
crypalert.com: did not receive HSTS header
crypt.guru: did not receive HSTS header
+crypticshell.co.uk: did not receive HSTS header
cryptify.eu: could not connect to host
crypto-navi.org: did not receive HSTS header
crypto.tube: max-age too low: 2592000
@@ -4191,7 +4448,7 @@ cryptodyno.ninja: could not connect to host
cryptojar.io: could not connect to host
cryptolab.pro: could not connect to host
cryptolab.tk: could not connect to host
-cryptonom.org: could not connect to host
+cryptolosophy.io: did not receive HSTS header
cryptoparty.dk: could not connect to host
cryptopartyatx.org: could not connect to host
cryptopartynewcastle.org: could not connect to host
@@ -4237,6 +4494,7 @@ ct-status.org: could not connect to host
ct-watches.dk: did not receive HSTS header
cthomas.work: could not connect to host
cthulhuden.com: could not connect to host
+ctknight.me: could not connect to host
ctyi.me: could not connect to host
cuanhua3s.com: could not connect to host
cubecart.net: could not connect to host
@@ -4248,21 +4506,22 @@ cubewano.com: could not connect to host
cubix.host: could not connect to host
cucc.date: could not connect to host
cuecamania.com.br: could not connect to host
+cuisinezest.com: did not receive HSTS header
cujanovic.com: did not receive HSTS header
cujba.com: could not connect to host
culinae.nl: could not connect to host
cultureelbeleggen.nl: did not receive HSTS header
cultureroll.com: could not connect to host
-cumshots-video.ru: could not connect to host
+cumshots-video.ru: did not receive HSTS header
cunha.be: could not connect to host
cuni-cuni-club.com: did not receive HSTS header
cuni-rec.com: did not receive HSTS header
-cuntflaps.me: could not connect to host
cuongquach.com: did not receive HSTS header
cuongthach.com: did not receive HSTS header
cuonic.com: could not connect to host
cupcake.io: did not receive HSTS header
cupcake.is: did not receive HSTS header
+cupcakesandcrinoline.com: did not receive HSTS header
cupi.co: could not connect to host
cupidosshop.com: could not connect to host
cupofarchitects.net: could not connect to host
@@ -4272,9 +4531,11 @@ curia.fi: could not connect to host
curiouscat.me: max-age too low: 2592000
curlyroots.com: did not receive HSTS header
current.com: did not receive HSTS header
+currentobserver.com: could not connect to host
curroapp.com: could not connect to host
cursosdnc.cl: did not receive HSTS header
cursosgratuitos.com.br: did not receive HSTS header
+curvesandwords.com: did not receive HSTS header
curveweb.co.uk: did not receive HSTS header
cusfit.com: did not receive HSTS header
custe.rs: could not connect to host
@@ -4298,8 +4559,9 @@ cvninja.pl: did not receive HSTS header
cvps.top: did not receive HSTS header
cvsoftub.com: did not receive HSTS header
cvtparking.co.uk: did not receive HSTS header
+cvursache.com: could not connect to host
cw-bw.de: could not connect to host
-cwage.com: could not connect to host
+cwage.com: did not receive HSTS header
cwbw.network: could not connect to host
cwilson.ga: could not connect to host
cy.technology: did not receive HSTS header
@@ -4310,18 +4572,23 @@ cyber-konzept.de: did not receive HSTS header
cyber-perikarp.eu: could not connect to host
cyber.cafe: could not connect to host
cybercecurity.com: did not receive HSTS header
-cybercymru.co.uk: did not receive HSTS header
-cyberdyne-industries.net: did not receive HSTS header
+cybercloud.cc: did not receive HSTS header
+cyberdos.de: could not connect to host
+cyberdyne-industries.net: could not connect to host
cyberfrancais.ro: did not receive HSTS header
+cyberlab.kiev.ua: could not connect to host
cyberlab.team: did not receive HSTS header
cyberpeace.nl: could not connect to host
cyberphaze.com: did not receive HSTS header
cyberprey.com: did not receive HSTS header
cyberpunk.ca: could not connect to host
+cybersantri.com: could not connect to host
cyberserver.org: could not connect to host
cybershambles.com: could not connect to host
cybersmart.co.uk: did not receive HSTS header
cyberspace.today: could not connect to host
+cybertorsk.org: could not connect to host
+cybrary.it: did not receive HSTS header
cyclehackluxembourgcity.lu: could not connect to host
cyclingjunkies.com: could not connect to host
cydia-search.io: could not connect to host
@@ -4330,27 +4597,31 @@ cygu.ch: did not receive HSTS header
cymtech.net: could not connect to host
cynoshair.com: could not connect to host
cyoda.com: did not receive HSTS header
-cypad.cn: did not receive HSTS header
+cypad.cn: could not connect to host
cype.dedyn.io: could not connect to host
+cypherpunk.com: did not receive HSTS header
cypherpunk.ws: could not connect to host
cyphertite.com: could not connect to host
+cyson.tech: could not connect to host
cytadel.fr: did not receive HSTS header
-cyyzaid.cn: max-age too low: 0
czaw.org: did not receive HSTS header
czechamlp.com: could not connect to host
czirnich.org: did not receive HSTS header
czlx.co: could not connect to host
d-academia.com: did not receive HSTS header
d-garnier-delaunay.fr: did not receive HSTS header
-d-macindustries.com: did not receive HSTS header
+d-msg.com: could not connect to host
+d-quantum.com: did not receive HSTS header
d-rickroll-e.pw: could not connect to host
d.rip: max-age too low: 900
d00r.de: did not receive HSTS header
d0xq.net: could not connect to host
d1ves.io: did not receive HSTS header
+d2s.uk: could not connect to host
d3njjcbhbojbot.cloudfront.net: did not receive HSTS header
d3x.pw: could not connect to host
-d88688.com: could not connect to host
+d4rkdeagle.tk: could not connect to host
+d4wson.com: could not connect to host
d88871.com: could not connect to host
d8studio.net: could not connect to host
da-ist-kunst.de: could not connect to host
@@ -4362,6 +4633,7 @@ dad256.tk: could not connect to host
dadtheimpaler.com: could not connect to host
daemon.xin: could not connect to host
daemonslayer.net: did not receive HSTS header
+dafnik.me: did not receive HSTS header
dah5.com: did not receive HSTS header
dahl-pind.dk: did not receive HSTS header
dai-rin.co.jp: could not connect to host
@@ -4382,15 +4654,14 @@ dalingk.co: could not connect to host
dallas.gov: could not connect to host
daltonedwards.me: could not connect to host
dam74.com.ar: could not connect to host
-damedrogy.cz: could not connect to host
damianuv-blog.cz: could not connect to host
damienpontifex.com: did not receive HSTS header
damjanovic.work: could not connect to host
+damongant.de: did not receive HSTS header
dan.org.nz: could not connect to host
-danbarrett.com.au: could not connect to host
+danbarrett.com.au: did not receive HSTS header
dancebuzz.co.uk: did not receive HSTS header
dancerdates.net: did not receive HSTS header
-dancingshiva.at: could not connect to host
dandymrsb.com: could not connect to host
dango.in: could not connect to host
daniel-du.com: could not connect to host
@@ -4404,12 +4675,11 @@ danielgraziano.ca: could not connect to host
danieliancu.com: could not connect to host
danieljireh.com: did not receive HSTS header
danielkratz.com: max-age too low: 172800
-danielnaaman.net: could not connect to host
-danielnaaman.org: could not connect to host
danielt.co.uk: did not receive HSTS header
danielverlaan.nl: could not connect to host
danielworthy.com: did not receive HSTS header
danielzuzevich.com: could not connect to host
+danifabi.eu: could not connect to host
danijobs.com: could not connect to host
danishenanigans.com: could not connect to host
dankeblog.com: could not connect to host
@@ -4421,7 +4691,9 @@ danoz.net: could not connect to host
danrl.de: could not connect to host
danskringsporta.be: did not receive HSTS header
danwillenberg.com: did not receive HSTS header
+dao.spb.su: could not connect to host
daolerp.xyz: could not connect to host
+daplie.com: could not connect to host
dargasia.is: could not connect to host
darinjohnson.ca: did not receive HSTS header
dario.im: did not receive HSTS header
@@ -4435,37 +4707,39 @@ darkkeepers.dk: max-age too low: 172800
darknebula.space: could not connect to host
darknode.in: did not receive HSTS header
darkpony.ru: could not connect to host
+darkroomsaredead.com: could not connect to host
darksideof.it: could not connect to host
darkstance.org: could not connect to host
darktree.in: could not connect to host
darkwebkittens.xyz: could not connect to host
darlastudio66.com: did not receive HSTS header
-darlo.co.uk: could not connect to host
darrenellis.xyz: could not connect to host
darrenm.net: could not connect to host
dart-tanke.com: could not connect to host
dart-tanke.de: could not connect to host
+dartsdon.jp: did not receive HSTS header
+daryl.moe: could not connect to host
das-tyrol.at: did not receive HSTS header
dash-board.jp: did not receive HSTS header
dash.rocks: did not receive HSTS header
dashboard.yt: could not connect to host
dashburst.com: did not receive HSTS header
+dashcloud.co: could not connect to host
dashlane.com: did not receive HSTS header
dashnimorad.com: did not receive HSTS header
data-abundance.com: could not connect to host
data-detox.com: could not connect to host
data.haus: could not connect to host
data.qld.gov.au: did not receive HSTS header
-data.world: did not receive HSTS header
databeam.de: could not connect to host
datacave.is: could not connect to host
datacenternews.asia: did not receive HSTS header
datacenternews.co.nz: did not receive HSTS header
datacentrenews.eu: did not receive HSTS header
-datacool.tk: could not connect to host
datacubed.com: did not receive HSTS header
datahoarder.download: could not connect to host
-datahoarderschool.club: did not receive HSTS header
+datahoarder.xyz: could not connect to host
+datahoarderschool.club: could not connect to host
dataisme.com: did not receive HSTS header
datajapan.co.jp: did not receive HSTS header
datamatic.ru: could not connect to host
@@ -4473,7 +4747,6 @@ dataretention.solutions: could not connect to host
datascomemorativas.com.br: could not connect to host
datasharesystem.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
datasnitch.co.uk: could not connect to host
-datatekniikka.com: could not connect to host
datedeposit.com: could not connect to host
datengrab.ws: could not connect to host
datenlast.de: did not receive HSTS header
@@ -4503,9 +4776,11 @@ davidscherzer.at: could not connect to host
davimun.org: could not connect to host
davros.eu: could not connect to host
davros.ru: could not connect to host
+dawgs.ga: could not connect to host
dawnofeden.org: did not receive HSTS header
dawnson.is: could not connect to host
-dawnsonb.com: could not connect to host
+dawnsonb.com: did not receive HSTS header
+day-peak.com: did not receive HSTS header
day.vip: could not connect to host
daylightcompany.com: did not receive HSTS header
days.one: could not connect to host
@@ -4519,11 +4794,10 @@ dbpmedia.se: did not receive HSTS header
dbx.ovh: could not connect to host
dbyz.co.uk: max-age too low: 43200
dcaracing.nl: could not connect to host
-dcc.moe: could not connect to host
+dcc.cat: did not receive HSTS header
dccode.gov: could not connect to host
dccoffeeproducts.com: did not receive HSTS header
dccraft.net: could not connect to host
-dcl.re: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
dctxf.com: did not receive HSTS header
dcuofriends.net: could not connect to host
dd.art.pl: could not connect to host
@@ -4535,15 +4809,14 @@ ddns-anbieter.de: could not connect to host
ddocu.me: could not connect to host
ddos-mitigation.co.uk: could not connect to host
ddos-mitigation.info: could not connect to host
+ddoser.cn: could not connect to host
de-osopanda.com: could not connect to host
de-servers.de: could not connect to host
deadmann.com: could not connect to host
-deadsoul.net: could not connect to host
deai-life.biz: could not connect to host
debank.tv: did not receive HSTS header
debatch.se: could not connect to host
debian-vhost.de: could not connect to host
-debigare.com: did not receive HSTS header
debiton.dk: could not connect to host
debitoutil.com: did not receive HSTS header
debitpaie.com: did not receive HSTS header
@@ -4558,6 +4831,7 @@ decibelios.li: could not connect to host
decloverly.com: could not connect to host
deco.me: could not connect to host
decoboutique.com: did not receive HSTS header
+decoder.link: did not receive HSTS header
decofire.pl: did not receive HSTS header
decomplify.com: did not receive HSTS header
deconsolutions.com: did not receive HSTS header
@@ -4565,19 +4839,20 @@ decoraid.com: did not receive HSTS header
decorincasa.com.br: could not connect to host
decorland.com.ua: could not connect to host
decormiernissanparts.com: could not connect to host
-decoyrouting.com: could not connect to host
+decoyrouting.com: did not receive HSTS header
decstasy.de: did not receive HSTS header
dede.ml: could not connect to host
dedeo.tk: could not connect to host
dedicatutiempo.es: could not connect to host
-dedietrich-asia.com: did not receive HSTS header
+dedietrich-asia.com: could not connect to host
deeonix.eu: could not connect to host
-deep.club: could not connect to host
deep.social: did not receive HSTS header
deepaero.com: could not connect to host
deepcovelabs.net: could not connect to host
deepcreampie.com: could not connect to host
deepearth.uk: could not connect to host
+deeperxh.com: did not receive HSTS header
+deeployr.io: could not connect to host
deeprecce.com: could not connect to host
deeprecce.link: could not connect to host
deeprecce.tech: could not connect to host
@@ -4588,25 +4863,25 @@ deer.team: could not connect to host
deetz.nl: did not receive HSTS header
deetzen.de: did not receive HSTS header
deezeno.com: could not connect to host
-defi-metier.com: could not connect to host
-defi-metier.fr: could not connect to host
+defi-metier.com: did not receive HSTS header
+defi-metier.fr: did not receive HSTS header
defi-metier.org: could not connect to host
-defi-metiers.com: could not connect to host
+defi-metiers.com: did not receive HSTS header
defi-metiers.fr: did not receive HSTS header
-defi-metiers.org: could not connect to host
+defi-metiers.org: did not receive HSTS header
defiler.tk: could not connect to host
defimetier.fr: could not connect to host
-defimetier.org: could not connect to host
-defimetiers.com: could not connect to host
-defimetiers.fr: could not connect to host
+defimetier.org: did not receive HSTS header
+defimetiers.com: did not receive HSTS header
+defimetiers.fr: did not receive HSTS header
+defrax.de: did not receive HSTS header
+degestamptepot.nl: did not receive HSTS header
+degosoft.nl: did not receive HSTS header
degroetenvanrosaline.nl: could not connect to host
dehydrated.de: did not receive HSTS header
deight.co: could not connect to host
deight.in: could not connect to host
-dejan.media: could not connect to host
dekasan.ru: could not connect to host
-dekoh-shouyu.com: did not receive HSTS header
-delandalucia.com: did not receive HSTS header
delayrefunds.co.uk: could not connect to host
delcopa.gov: did not receive HSTS header
delf.co.jp: did not receive HSTS header
@@ -4614,6 +4889,7 @@ deliberatedigital.com: [Exception... "Component returned failure code: 0x8000400
delitto.top: could not connect to host
deliver.moe: did not receive HSTS header
deliverance.co.uk: could not connect to host
+delivery.co.at: could not connect to host
deloittequant.com: could not connect to host
deltaconcepts.de: could not connect to host
deltasmart.ch: did not receive HSTS header
@@ -4624,11 +4900,14 @@ demdis.org: could not connect to host
demilitarized.ninja: could not connect to host
demo-server.us: could not connect to host
demo.sb: could not connect to host
+demo.swedbank.se: did not receive HSTS header
democracy.io: did not receive HSTS header
democraticdifference.com: could not connect to host
-demomanca.com: did not receive HSTS header
demotops.com: could not connect to host
+demuzere.com: could not connect to host
demuzere.eu: could not connect to host
+demuzere.net: could not connect to host
+demuzere.org: could not connect to host
dengchangdong.com: did not receive HSTS header
denh.am: did not receive HSTS header
denimio.com: did not receive HSTS header
@@ -4641,11 +4920,8 @@ dentaldomain.ph: did not receive HSTS header
denvercybersecurity.com: did not receive HSTS header
denverphilharmonic.org: did not receive HSTS header
denverprophit.us: did not receive HSTS header
-depaco.com: did not receive HSTS header
deped.blog: could not connect to host
depedshs.com: could not connect to host
-depedtayo.com: did not receive HSTS header
-depedtayo.ph: did not receive HSTS header
depijl-mz.nl: did not receive HSTS header
depixion.agency: could not connect to host
depo.space: could not connect to host
@@ -4659,12 +4935,14 @@ derive.cc: could not connect to host
dermacarecomplex.com: could not connect to host
derpumpkinfuhrer.com: could not connect to host
derrickemery.com: did not receive HSTS header
+dersix.com: could not connect to host
derwaldschrat.net: did not receive HSTS header
derwolfe.net: did not receive HSTS header
desiccantpackets.com: did not receive HSTS header
design-fu.com: did not receive HSTS header
designandmore.it: did not receive HSTS header
designanyware.com.br: could not connect to host
+designdevs.eu: did not receive HSTS header
designgears.com: could not connect to host
designgraphic.fr: did not receive HSTS header
designsbykerrialee.co.uk: could not connect to host
@@ -4674,10 +4952,11 @@ despachomartinyasociados.com: could not connect to host
despora.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
despotika.de: could not connect to host
desserteagleselvenar.tk: could not connect to host
+destileria.net.br: could not connect to host
destinationbijoux.fr: could not connect to host
destinopiriapolis.com: did not receive HSTS header
destom.be: could not connect to host
-desuperheroes.co: could not connect to host
+desuperheroes.co: did not receive HSTS header
desveja.com.br: could not connect to host
detechnologiecooperatie.nl: did not receive HSTS header
detecte-fuite.ch: could not connect to host
@@ -4690,8 +4969,8 @@ detroitrocs.org: did not receive HSTS header
detteflies.com: max-age too low: 7889238
detuprovincia.cl: did not receive HSTS header
detutorial.com: max-age too low: 36000
-deusu.de: could not connect to host
-deusu.org: could not connect to host
+deusu.de: did not receive HSTS header
+deusu.org: did not receive HSTS header
deux.solutions: could not connect to host
deuxsol.co: could not connect to host
deuxsol.com: could not connect to host
@@ -4706,17 +4985,16 @@ devafterdark.com: could not connect to host
devdesco.com: could not connect to host
devdom.io: max-age too low: 172800
devdoodle.net: could not connect to host
-develop.cool: could not connect to host
develop.fitness: could not connect to host
developersclub.website: could not connect to host
devenney.io: did not receive HSTS header
devh.de: could not connect to host
-devh.net: could not connect to host
-deviltracks.net: did not receive HSTS header
+deviltracks.net: could not connect to host
deviltraxxx.de: could not connect to host
devin-balimuhac.de: did not receive HSTS header
devincrow.me: could not connect to host
devinpacker.com: could not connect to host
+deviser.wang: could not connect to host
devisonline.ch: could not connect to host
devistravaux.org: did not receive HSTS header
devjack.de: did not receive HSTS header
@@ -4728,20 +5006,24 @@ devopps.me: could not connect to host
devops.moe: could not connect to host
devopsconnected.com: could not connect to host
devpgsv.com: did not receive HSTS header
+devries.one: could not connect to host
+devstaff.gr: could not connect to host
devtestfan1.gov: could not connect to host
devtub.com: could not connect to host
devuan.org: did not receive HSTS header
+devyn.ca: could not connect to host
dewebwerf.nl: did not receive HSTS header
dewin.io: could not connect to host
dexonsoftware.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+dezintranet.com: max-age too low: 1
dfixit.com: could not connect to host
dfrance.com.br: did not receive HSTS header
dfviana.com.br: max-age too low: 2592000
dgby.org: did not receive HSTS header
dggwp.de: did not receive HSTS header
-dgx.io: could not connect to host
dharamkot.com: could not connect to host
dharma.ai: did not receive HSTS header
+dhbr.org: could not connect to host
dhl-smart.ch: could not connect to host
dhlcotizadorexpo-qa.azurewebsites.net: could not connect to host
dhpcs.com: did not receive HSTS header
@@ -4750,6 +5032,7 @@ dhub.xyz: could not connect to host
dhxxls.com: could not connect to host
diablotine.rocks: could not connect to host
diabolic.chat: could not connect to host
+diadorafitness.es: could not connect to host
diagnocentro.cl: could not connect to host
diagnosia.com: did not receive HSTS header
diagonale-deco.fr: did not receive HSTS header
@@ -4762,24 +5045,23 @@ dianlujitao.com: did not receive HSTS header
diannaobos.com: did not receive HSTS header
diasp.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
diavo.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-dicando.com: could not connect to host
+dicando.com: did not receive HSTS header
diceduels.com: could not connect to host
dicgaming.net: could not connect to host
dichgans-besserer.de: did not receive HSTS header
dichvudangkygiayphep.com: could not connect to host
dicio.com.br: did not receive HSTS header
dick.red: could not connect to host
-didierlaumen.be: did not receive HSTS header
+didierlaumen.be: could not connect to host
die-besten-weisheiten.de: could not connect to host
-die-gruenen-teufel.de: could not connect to host
dieb.photo: could not connect to host
+diebestengutscheine.de: did not receive HSTS header
diejanssens.net: did not receive HSTS header
diemogebhardt.com: could not connect to host
dierencompleet.nl: did not receive HSTS header
dierenkruiden.nl: did not receive HSTS header
dieser.me: could not connect to host
dietagespresse.com: did not receive HSTS header
-dietergreven.de: did not receive HSTS header
diewebstube.de: could not connect to host
diezel.com: could not connect to host
diferenca.com: did not receive HSTS header
@@ -4789,6 +5071,7 @@ digihyp.ch: did not receive HSTS header
digikol.net: could not connect to host
digimomedia.co.uk: did not receive HSTS header
diginota.com: did not receive HSTS header
+digipitch.com: did not receive HSTS header
digired.ro: could not connect to host
digired.xyz: could not connect to host
digital1world.com: could not connect to host
@@ -4824,6 +5107,7 @@ dimitrisotiropoulosbooks.com: max-age too low: 7889238
din-tools.com: did not receive HSTS header
dinamoelektrik.com: could not connect to host
dingcc.com: could not connect to host
+dingcc.me: could not connect to host
dingcc.org: could not connect to host
dingcc.xyz: could not connect to host
dinge.xyz: did not receive HSTS header
@@ -4848,9 +5132,11 @@ direnv.net: did not receive HSTS header
direwolfsoftware.ca: could not connect to host
dirips.com: did not receive HSTS header
dirtycat.ru: could not connect to host
+dirtygeek.ovh: did not receive HSTS header
disadattamentolavorativo.it: could not connect to host
-discipul.nl: did not receive HSTS header
-disclosure.io: did not receive HSTS header
+discha.net: did not receive HSTS header
+discipul.nl: could not connect to host
+disclosure.io: could not connect to host
disco-crazy-world.de: could not connect to host
discord-chan.net: could not connect to host
discountmania.eu: did not receive HSTS header
@@ -4862,8 +5148,12 @@ discoverucluelet.com: did not receive HSTS header
discoverwellness.center: could not connect to host
discovery.lookout.com: did not receive HSTS header
discoveryballoon.org: could not connect to host
+discoveryrom.org: could not connect to host
+dise-online.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
dislocated.de: did not receive HSTS header
disorderboutique.com: did not receive HSTS header
+dispatchitsolutions.com: did not receive HSTS header
+dispatchitsolutions.io: did not receive HSTS header
disruptivelabs.net: could not connect to host
disruptivelabs.org: could not connect to host
dissieux.com: did not receive HSTS header
@@ -4880,24 +5170,31 @@ dittvertshus.no: could not connect to host
diva-ey.com: could not connect to host
divegearexpress.com.cn: did not receive HSTS header
divenwa.com: did not receive HSTS header
+divergenz.org: did not receive HSTS header
diversity-spielzeug.de: did not receive HSTS header
+divinemercyparishvlds.com: did not receive HSTS header
divvi.co.nz: did not receive HSTS header
divvymonkey.com: did not receive HSTS header
-divvyradio.com: did not receive HSTS header
+divvyradio.com: could not connect to host
dixiediner.com: did not receive HSTS header
dixmag.com: could not connect to host
+diygod.me: did not receive HSTS header
diz.in.ua: could not connect to host
dizihocasi.com: could not connect to host
dizorg.net: could not connect to host
dj4et.de: could not connect to host
-djieno.com: could not connect to host
+djangogolf.com: could not connect to host
+djieno.com: did not receive HSTS header
+djleon.net: did not receive HSTS header
+djlive.pl: did not receive HSTS header
djsk.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
djul.net: could not connect to host
djursland-psykologen.dk: did not receive HSTS header
djxmmx.net: did not receive HSTS header
djz4music.com: did not receive HSTS header
-dkn.go.id: did not receive HSTS header
+dkn.go.id: could not connect to host
dkniss.de: could not connect to host
+dko-steiermark.ml: could not connect to host
dl.google.com: did not receive HSTS header (error ignored - included regardless)
dlbouncers.co.uk: could not connect to host
dlc.viasinc.com: could not connect to host
@@ -4911,9 +5208,8 @@ dmcglobaltravel.com.mx: did not receive HSTS header
dmcibulldog.com: did not receive HSTS header
dmdre.com: did not receive HSTS header
dmeevalumate.com: did not receive HSTS header
-dmenergy.ru: did not receive HSTS header
+dmenergy.ru: max-age too low: 0
dmfd.net: could not connect to host
-dmix.ca: could not connect to host
dmlogic.com: could not connect to host
dmtry.me: did not receive HSTS header
dmwall.cn: could not connect to host
@@ -4925,14 +5221,14 @@ dns-manager.info: did not receive HSTS header
dns.google.com: did not receive HSTS header (error ignored - included regardless)
dnsbird.net: could not connect to host
dnsbird.org: could not connect to host
-dnscrypt.nl: could not connect to host
dnscrypt.org: did not receive HSTS header
dnsknowledge.com: did not receive HSTS header
dnsql.io: could not connect to host
dnzz123.com: did not receive HSTS header
do-do.tk: could not connect to host
-do-it.cz: could not connect to host
+do-it.cz: did not receive HSTS header
doak.io: did not receive HSTS header
+doanhnhanplus.vn: max-age too low: 0
dobet.in: could not connect to host
doc-justice.com: did not receive HSTS header
docid.io: could not connect to host
@@ -4941,18 +5237,16 @@ dockerturkiye.com: could not connect to host
docket.news: could not connect to host
doclassworks.com: could not connect to host
doclot.io: could not connect to host
-docplexus.in: did not receive HSTS header
-docplexus.org: did not receive HSTS header
+docplexus.org: max-age too low: 0
docset.io: could not connect to host
-docsoc.org.uk: could not connect to host
docufiel.com: could not connect to host
doculus.io: could not connect to host
documentations-sociales.com: could not connect to host
docupet.com: did not receive HSTS header
docxtemplater.com: did not receive HSTS header
+dodomu.ddns.net: could not connect to host
doesmycodehavebugs.today: could not connect to host
doeswindowssuckforeveryoneorjustme.com: could not connect to host
-dog-blum.com: could not connect to host
dogbox.se: did not receive HSTS header
dogcratereview.info: could not connect to host
doge.town: could not connect to host
@@ -4966,33 +5260,31 @@ dohosting.ru: could not connect to host
dojifish.space: could not connect to host
dojin.nagoya: could not connect to host
dokan-e.com: did not receive HSTS header
-dokan.online: did not receive HSTS header
+dokan.online: could not connect to host
doked.io: could not connect to host
dokspot.cf: could not connect to host
dokspot.ga: could not connect to host
+doku-gilde.de: could not connect to host
dolarcanadense.com.br: could not connect to host
dolevik.com: could not connect to host
dollarstore24.com: could not connect to host
dollywiki.co.uk: could not connect to host
-dolphin-cloud.com: could not connect to host
-dolphin-hosting.com: could not connect to host
dolphincorp.co.uk: could not connect to host
dolphinswithlasers.com: could not connect to host
-dolt.xyz: did not receive HSTS header
+dolt.xyz: could not connect to host
domaine-aigoual-cevennes.com: did not receive HSTS header
domainelaremejeanne.com: did not receive HSTS header
+domainwatch.me: did not receive HSTS header
domaris.de: did not receive HSTS header
domasazu.pl: did not receive HSTS header
domen-reg.ru: could not connect to host
domengrad.ru: did not receive HSTS header
domenicocatelli.com: did not receive HSTS header
domfee.com: could not connect to host
-domian.cz: could not connect to host
dominikanskarepubliken.guide: could not connect to host
dominioanimal.com: could not connect to host
dominioanimal.com.br: could not connect to host
dominique-mueller.de: could not connect to host
-domwkwiatach.pl: did not receive HSTS header
domytermpaper.com: could not connect to host
don.yokohama: could not connect to host
dong8.top: could not connect to host
@@ -5009,7 +5301,7 @@ donsbach-edv.de: did not receive HSTS header
donthedragonwilson.com: could not connect to host
donttrustrobots.nl: could not connect to host
donzelot.co.uk: did not receive HSTS header
-donzool.es: could not connect to host
+donzool.es: did not receive HSTS header
doobydude.us: could not connect to host
doodledraw.ninja: could not connect to host
doodlefinder.de: max-age too low: 600000
@@ -5024,9 +5316,11 @@ doppenpost.nl: could not connect to host
doriginal.es: did not receive HSTS header
dorkfarm.com: did not receive HSTS header
dormebebe.com.br: could not connect to host
+dosenbierrepublik.com: could not connect to host
dosipe.com: could not connect to host
doska.kz: could not connect to host
dostavkakurierom.ru: could not connect to host
+dostrece.net: did not receive HSTS header
dotadata.me: could not connect to host
dotb.dn.ua: did not receive HSTS header
dotbrick.co.th: could not connect to host
@@ -5035,7 +5329,7 @@ dotnetsandbox.ca: could not connect to host
dotspaperie.com: could not connect to host
doublethink.online: could not connect to host
doubleyummy.uk: did not receive HSTS header
-dougferris.id.au: could not connect to host
+dougferris.id.au: did not receive HSTS header
douglas-ma.gov: did not receive HSTS header
douglasstafford.com: did not receive HSTS header
doujin-domain.cz: could not connect to host
@@ -5044,19 +5338,18 @@ doulasofgreaterkansascity.org: max-age too low: 300
dovecotadmin.org: could not connect to host
doveholesband.co.uk: did not receive HSTS header
dovetailnow.com: could not connect to host
-dovro.de: could not connect to host
dowc.org: did not receive HSTS header
download.jitsi.org: did not receive HSTS header
downsouthweddings.com.au: did not receive HSTS header
doxcelerate.com: could not connect to host
doyoulyft.com: could not connect to host
dpangerl.de: did not receive HSTS header
-dpsart.it: did not receive HSTS header
-dr-knirr.de: could not connect to host
+dpsart.it: could not connect to host
drabben.be: did not receive HSTS header
drabbin.com: could not connect to host
draghive.club: did not receive HSTS header
draghive.net: could not connect to host
+draghive.org: could not connect to host
draghive.photos: did not receive HSTS header
dragon-aspect.com: could not connect to host
dragoncityhack.tips: could not connect to host
@@ -5068,13 +5361,11 @@ dragonteam.ninja: could not connect to host
drahcro.uk: could not connect to host
drainagebuizen.nl: did not receive HSTS header
drakefortreasurer.sexy: could not connect to host
-drakensberg-tourism.com: did not receive HSTS header
drakfot.se: could not connect to host
dralexjimenez.com: did not receive HSTS header
drastosasports.com.br: could not connect to host
-drawvesly.ovh: could not connect to host
drbarnabus.com: could not connect to host
-drbethanybarnes.com: could not connect to host
+drbethanybarnes.com: did not receive HSTS header
drdavidgilpin.com: did not receive HSTS header
drdevil.ru: could not connect to host
drdim.ru: could not connect to host
@@ -5084,15 +5375,21 @@ dreamaholic.club: could not connect to host
dreamcatcherblog.de: could not connect to host
dreamersgiftshopec.com: could not connect to host
dreaming.solutions: could not connect to host
+dreamithost.com.au: did not receive HSTS header
+dreamkitchenbath.com: did not receive HSTS header
dreamlighteyeserum.com: could not connect to host
dreamsforabetterworld.com.au: did not receive HSTS header
+dreamstream.network: could not connect to host
dreamtechie.com: did not receive HSTS header
dreatho.com: did not receive HSTS header
dreax.win: could not connect to host
dredgepress.com: did not receive HSTS header
dreischneidiger.de: could not connect to host
dreizwosechs.de: could not connect to host
+dresdner-christstollen-von-reimann.de: could not connect to host
drewgle.net: could not connect to host
+drgn.li: could not connect to host
+drgn.no: could not connect to host
drhopeson.com: did not receive HSTS header
drillnation.com.au: could not connect to host
drinknaturespower.com: could not connect to host
@@ -5101,17 +5398,21 @@ drinkvabeer.com: could not connect to host
dripdoctors.com: did not receive HSTS header
drishti.guru: could not connect to host
drive.xyz: could not connect to host
-drivercopilot.com: did not receive HSTS header
drivewithstatetransit.com.au: did not receive HSTS header
driving-lessons.co.uk: could not connect to host
+drivingtestpro.com: did not receive HSTS header
drixn.info: could not connect to host
drixn.net: could not connect to host
+drjacquesmalan.com: could not connect to host
+drkmtrx.xyz: could not connect to host
drlazarina.net: did not receive HSTS header
+drnow.ru: did not receive HSTS header
drobniuch.pl: could not connect to host
drogoz.moe: could not connect to host
droidboss.com: did not receive HSTS header
+droidwiki.de: could not connect to host
droithxn.com: could not connect to host
-droncentrum.pl: could not connect to host
+droncentrum.pl: did not receive HSTS header
dronebotworkshop.com: did not receive HSTS header
dronexpertos.com: could not connect to host
droomhuis-in-brielle-kopen.nl: could not connect to host
@@ -5148,9 +5449,9 @@ drybasementkansas.com: did not receive HSTS header
drycreekapiary.com: could not connect to host
ds-christiansen.de: could not connect to host
dshiv.io: could not connect to host
-dsne.com.mx: could not connect to host
+dsmstainlessproducts.co.uk: did not receive HSTS header
+dsne.com.mx: did not receive HSTS header
dsouzamusic.com: did not receive HSTS header
-dsuinnovation.com: could not connect to host
dsyunmall.com: could not connect to host
dtechstore.com.br: did not receive HSTS header
dtub.co: could not connect to host
@@ -5161,66 +5462,80 @@ dubik.su: did not receive HSTS header
duchyoffeann.com: could not connect to host
ducius.net: could not connect to host
duckasylum.com: did not receive HSTS header
+duckyubuntu.tk: could not connect to host
ducohosting.com: did not receive HSTS header
-dudesunderwear.com.br: could not connect to host
duelsow.eu: could not connect to host
duelysthub.com: could not connect to host
-duerls.de: did not receive HSTS header
+duerls.de: could not connect to host
dugnet.tech: could not connect to host
dujsq.com: could not connect to host
dujsq.top: could not connect to host
dukec.me: could not connect to host
dukefox.com: could not connect to host
-duks.com.br: did not receive HSTS header
+duks.com.br: could not connect to host
dullsir.com: did not receive HSTS header
dum.moe: could not connect to host
dumbdemo.com: could not connect to host
+dumont.ovh: did not receive HSTS header
dunamiscommunity.com: could not connect to host
dunashoes.com: could not connect to host
dune.io: did not receive HSTS header
dunea.nl: did not receive HSTS header
+dunesadventure.net: could not connect to host
dung-massage.fr: did not receive HSTS header
duo.money: could not connect to host
duocircle.com: did not receive HSTS header
duole30.com: could not connect to host
-duonganhtuan.com: could not connect to host
duongpho.com: did not receive HSTS header
-duploclique.pt: did not receive HSTS header
durangoenergyllc.com: could not connect to host
dushu.cat: could not connect to host
duskopy.top: could not connect to host
-dustycloth.com: could not connect to host
+dusnan.com: could not connect to host
dutchessuganda.com: did not receive HSTS header
dutchrank.com: did not receive HSTS header
dutyfreeonboard.com: did not receive HSTS header
duuu.ch: could not connect to host
duyao.de: max-age too low: 86400
dvotx.org: did not receive HSTS header
-dwellstudio.com: did not receive HSTS header
+dwbtoftshit.com: did not receive HSTS header
+dwellstudio.com: could not connect to host
dwhd.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
dwnld.me: could not connect to host
-dxm.no-ip.biz: could not connect to host
dycem-ns.com: did not receive HSTS header
+dycoa.com: could not connect to host
dycontrol.de: could not connect to host
dylanscott.com.au: did not receive HSTS header
dynamic-innovations.net: could not connect to host
dynamic-networks.be: could not connect to host
dynamize.solutions: did not receive HSTS header
+dynastyarena.com: could not connect to host
+dynastycalculator.com: could not connect to host
+dynastycentral.com: could not connect to host
+dynastychalkboard.com: could not connect to host
+dynastyclubhouse.com: could not connect to host
+dynastycrate.com: could not connect to host
+dynastyduel.com: could not connect to host
+dynastyfan.com: could not connect to host
+dynastygoal.com: could not connect to host
+dynastylocker.com: could not connect to host
+dynastyredline.com: could not connect to host
dyncdn.me: could not connect to host
-dynts.pro: could not connect to host
-dyz.pw: could not connect to host
+dyz.pw: did not receive HSTS header
dziekonski.com: could not connect to host
dzimejl.sk: did not receive HSTS header
dzlibs.io: could not connect to host
dzndk.net: could not connect to host
dzndk.org: could not connect to host
+dzyabchenko.com: could not connect to host
dzytdl.com: did not receive HSTS header
e-apack.com.br: could not connect to host
e-aut.net: could not connect to host
e-baraxolka.ru: could not connect to host
e-deca2.org: did not receive HSTS header
e-gemeinde.at: could not connect to host
+e-imzo.uz: could not connect to host
e-isfa.eu: did not receive HSTS header
+e-kontakti.fi: did not receive HSTS header
e-mak.eu: could not connect to host
e-migration.ch: could not connect to host
e-newshub.com: could not connect to host
@@ -5228,7 +5543,6 @@ e-planetelec.fr: did not receive HSTS header
e-pokupki.eu: did not receive HSTS header
e-rickroll-r.pw: could not connect to host
e-sa.com: did not receive HSTS header
-e-tune-mt.net: could not connect to host
e-vau.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
e-vo-linka.cz: did not receive HSTS header
e-wishlist.net: could not connect to host
@@ -5252,33 +5566,34 @@ eagle-yard.de: could not connect to host
eagleridgecampground.com: could not connect to host
eam-gmbh.com: did not receive HSTS header
eames-clayton.us: could not connect to host
+eapestudioweb.com: did not receive HSTS header
earga.sm: could not connect to host
earlybirdsnacks.com: could not connect to host
earth-people.org: could not connect to host
earthrise16.com: could not connect to host
easew.com: could not connect to host
-easez.net: could not connect to host
-eason-yang.com: could not connect to host
east-line.su: could not connect to host
eastcoastbubbleandbounce.co.uk: could not connect to host
eastcoastinflatables.co.uk: did not receive HSTS header
easthokkaido-5airport.jp: did not receive HSTS header
+eastman.space: did not receive HSTS header
eastmidlandsstargazers.org.uk: did not receive HSTS header
eastmontgroup.com: did not receive HSTS header
eastpeoria-il.gov: could not connect to host
easy-factures.fr: could not connect to host
easychiller.org: could not connect to host
easycontentplan.com: could not connect to host
+easycup.com: max-age too low: 7889238
easykonto.de: could not connect to host
easyplane.it: did not receive HSTS header
easyreal.ru: could not connect to host
easyschools.org: did not receive HSTS header
easysimplecrm.com: could not connect to host
-eat-mine.ml: could not connect to host
eat-the-world.ch: could not connect to host
eat4happiness.com: did not receive HSTS header
eatfitoutlet.com.br: could not connect to host
eatlowcarb.de: did not receive HSTS header
+eats.soy: could not connect to host
eattherich.us: did not receive HSTS header
eatvisor.co.uk: could not connect to host
eauclairecommerce.com: could not connect to host
@@ -5289,11 +5604,11 @@ ebertek.com: did not receive HSTS header
ebiografias.com.br: could not connect to host
ebolsa.com.br: did not receive HSTS header
ebolsas.com.br: did not receive HSTS header
+ebooklaunchers.com: did not receive HSTS header
ebooksgratuits.org: could not connect to host
ebop.ch: could not connect to host
ebp2p.com: could not connect to host
ebraph.com: could not connect to host
-ebrnd.de: could not connect to host
ebrowz.com: could not connect to host
ec-baran.de: could not connect to host
ecake.in: could not connect to host
@@ -5305,10 +5620,12 @@ ecg.fr: could not connect to host
echipstore.com: did not receive HSTS header
echoactive.com: max-age too low: 7776000
echomanchester.net: did not receive HSTS header
-ecir.pro: could not connect to host
+echoteam.gq: could not connect to host
+echtes-hutzelbrot.de: could not connect to host
eckro.com: could not connect to host
eco-wiki.com: could not connect to host
ecobrain.be: max-age too low: 0
+ecococon.fr: could not connect to host
ecole-en-danger.fr: could not connect to host
ecole-iaf.fr: could not connect to host
ecole-maternelle-saint-joseph.be: could not connect to host
@@ -5327,6 +5644,7 @@ ecoskif.ru: could not connect to host
ecosoftconsult.com: could not connect to host
ecosystemmanager.azurewebsites.net: did not receive HSTS header
ecotruck-pooling.com: did not receive HSTS header
+ecp.ae: did not receive HSTS header
ecrimex.net: did not receive HSTS header
ectora.com: could not connect to host
ed-matters.org: did not receive HSTS header
@@ -5343,7 +5661,8 @@ edenmal.net: did not receive HSTS header
edenvaleplumber24-7.co.za: did not receive HSTS header
edenvalerubbleremovals.co.za: did not receive HSTS header
edgecustomersportal.com: could not connect to host
-edgereinvent.com: did not receive HSTS header
+edgedynasty.com: could not connect to host
+edgereinvent.com: could not connect to host
edh.email: did not receive HSTS header
edhrealtor.com: did not receive HSTS header
edisonchee.com: did not receive HSTS header
@@ -5359,17 +5678,18 @@ eduardnikolenko.com: could not connect to host
eduardnikolenko.ru: could not connect to host
educaid.be: did not receive HSTS header
educatio.tech: could not connect to host
+educator-one.com: could not connect to host
educators.co.nz: did not receive HSTS header
educatoys.com.br: could not connect to host
educatweb.de: did not receive HSTS header
educnum.fr: did not receive HSTS header
educourse.ga: could not connect to host
eduif.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+edusantorini.com: could not connect to host
eduvance.in: did not receive HSTS header
ee-terminals.com: could not connect to host
eeb98.com: could not connect to host
eeetrust.org: could not connect to host
-eemcevn.com: could not connect to host
eenekorea.com: could not connect to host
eengezinswoning-in-alphen-aan-den-rijn-kopen.nl: could not connect to host
eengezinswoning-in-de-friese-meren-kopen.nl: could not connect to host
@@ -5388,14 +5708,21 @@ eenhoorn.ga: could not connect to host
eeqj.com: did not receive HSTS header
eesistumine2017.ee: could not connect to host
eez.ee: could not connect to host
+efag.com: did not receive HSTS header
+eff-bee-eye.de: did not receive HSTS header
effectiveosgi.com: could not connect to host
effectivepapers.com: could not connect to host
efficienthealth.com: could not connect to host
effizienta.ch: did not receive HSTS header
+efflam.net: could not connect to host
eftcorp.biz: did not receive HSTS header
+egamespw.com: could not connect to host
+egbert.net: could not connect to host
egfl.org.uk: did not receive HSTS header
egge.com: max-age too low: 0
+eggqvq.com: could not connect to host
egit.co: could not connect to host
+eglek.com: did not receive HSTS header
ego-world.org: could not connect to host
egupova.ru: did not receive HSTS header
ehealthcounselor.com: could not connect to host
@@ -5404,13 +5731,15 @@ ehito.ovh: could not connect to host
ehr.gov: could not connect to host
ehrenamt-skpfcw.de: could not connect to host
ehrlichesbier.de: could not connect to host
+ehseller.com: did not receive HSTS header
ehsellert.com: did not receive HSTS header
ehuber.info: could not connect to host
eicfood.com: could not connect to host
+eichornenterprises.com: could not connect to host
eidolonhost.com: did not receive HSTS header
+eifelindex.de: could not connect to host
eiga-movie.com: max-age too low: 0
eigenbubi.de: could not connect to host
-eightyfour.ca: could not connect to host
eigo.work: did not receive HSTS header
eimanavicius.lt: did not receive HSTS header
einfachmaldiefressehalten.de: could not connect to host
@@ -5419,13 +5748,12 @@ einmonolog.de: could not connect to host
einsatzstiefel.info: could not connect to host
einsit.com: could not connect to host
einsitapis.com: could not connect to host
-ejgconsultancy.co.uk: did not receive HSTS header
+ejgconsultancy.co.uk: could not connect to host
ejuicelab.co.uk: did not receive HSTS header
ejusu.com: could not connect to host
ek.network: did not receive HSTS header
ekbanden.nl: could not connect to host
ekobudisantoso.net: could not connect to host
-ekodevices.com: could not connect to host
ekong366.com: could not connect to host
eksik.com: could not connect to host
el-soul.com: did not receive HSTS header
@@ -5437,9 +5765,9 @@ elanguest.ru: could not connect to host
elaxy-online.de: could not connect to host
elbaal.gov: did not receive HSTS header
elblein.de: did not receive HSTS header
-elblogdegoyo.mx: max-age too low: 2592000
elbohlyart.com: did not receive HSTS header
eldietista.es: could not connect to host
+eldisagjapi.com: did not receive HSTS header
eldisagjapi.de: could not connect to host
elearningpilot.com: did not receive HSTS header
eleaut.com.br: did not receive HSTS header
@@ -5449,9 +5777,7 @@ electricant.com: did not receive HSTS header
electricant.nl: did not receive HSTS header
electriccitysf.com: could not connect to host
electrician-umhlanga.co.za: did not receive HSTS header
-electrician-umhlangaridge.co.za: did not receive HSTS header
electricianforum.co.uk: did not receive HSTS header
-electricianlalucia.co.za: did not receive HSTS header
electricianumhlangarocks.co.za: did not receive HSTS header
electricoperaduo.com: did not receive HSTS header
electromc.com: could not connect to host
@@ -5462,25 +5788,27 @@ elementalict.com: did not receive HSTS header
elementalrobotics.com: could not connect to host
elemenx.com: did not receive HSTS header
elemprendedor.com.ve: could not connect to host
+elena-baykova.ru: could not connect to host
elenag.ga: could not connect to host
elenagherta.ga: could not connect to host
+elenatranslations.nl: could not connect to host
elenoon.ir: max-age too low: 1
elenorsmadness.org: could not connect to host
eleonorengland.com: did not receive HSTS header
elestanteliterario.com: max-age too low: 43200
elevateandprosper.com: could not connect to host
elevator.ee: could not connect to host
-elexel.ru: could not connect to host
elgacien.de: could not connect to host
elguillatun.cl: did not receive HSTS header
elhall.pro: did not receive HSTS header
elhall.ru: did not receive HSTS header
+elia.cloud: could not connect to host
eliasojala.me: did not receive HSTS header
-elielaloum.com: could not connect to host
+elielaloum.com: did not receive HSTS header
elimdengelen.com: did not receive HSTS header
eline168.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+eliolita.com: could not connect to host
eliott.be: could not connect to host
-elistor6100.xyz: did not receive HSTS header
elite-box.com: did not receive HSTS header
elite-box.org: did not receive HSTS header
elite-porno.ru: could not connect to host
@@ -5489,19 +5817,19 @@ elitefishtank.com: could not connect to host
elitehosting.de: did not receive HSTS header
elitesensual.com.br: did not receive HSTS header
elizeugomes.com.br: did not receive HSTS header
-ell-net.tokyo: could not connect to host
ellen-skye.de: max-age too low: 604800
elliff.net: did not receive HSTS header
-elliotgluck.com: did not receive HSTS header
+elliotgluck.com: could not connect to host
elliquiy.com: could not connect to host
elmar-kraamzorg.nl: did not receive HSTS header
elna-service.com.ua: did not receive HSTS header
elnutricionista.es: could not connect to host
elo.fyi: could not connect to host
+elodieclerc.ch: could not connect to host
+elohellp.com: could not connect to host
elohna.ch: did not receive HSTS header
elonbase.com: could not connect to host
elonm.ru: could not connect to host
-elosuite.com: could not connect to host
eloxt.com: could not connect to host
elpay.kz: did not receive HSTS header
elpo.xyz: could not connect to host
@@ -5513,6 +5841,7 @@ elsword.moe: could not connect to host
eltransportquevolem.org: could not connect to host
eltrox.me: could not connect to host
eluft.de: could not connect to host
+elvisripley.com: max-age too low: 0
elyisus.info: did not receive HSTS header
elytronsecurity.com: did not receive HSTS header
email.lookout.com: could not connect to host
@@ -5521,7 +5850,7 @@ emailalaperformance.fr: could not connect to host
emailcontrol.nl: did not receive HSTS header
emailing.alsace: could not connect to host
emanatepixels.com: could not connect to host
-emanga.su: did not receive HSTS header
+emanga.su: could not connect to host
emasex.es: could not connect to host
emavok.eu: could not connect to host
embellir-aroma.com: could not connect to host
@@ -5535,16 +5864,18 @@ emergencymedicinefoundations.com: did not receive HSTS header
emergentvisiontec.com: did not receive HSTS header
emesolutions.net: did not receive HSTS header
emiele.com.br: could not connect to host
-emiliendevos.be: could not connect to host
+emil-dein-baecker.com: could not connect to host
+emilreimann.de: could not connect to host
+emils-chemnitz.de: could not connect to host
+emils1910.de: could not connect to host
emilyhorsman.com: could not connect to host
emilyshepherd.me: did not receive HSTS header
eminhuseynov.com: could not connect to host
eminovic.me: could not connect to host
emjainteractive.com: did not receive HSTS header
-emjimadhu.com: could not connect to host
+emjimadhu.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
emma-o.com: could not connect to host
-emma.ca: did not receive HSTS header
-emmable.com: could not connect to host
+emmable.com: did not receive HSTS header
emmaliddell.com: did not receive HSTS header
emmanuelle-et-julien.ch: could not connect to host
emmdy.com: could not connect to host
@@ -5564,7 +5895,7 @@ empty-r.com: could not connect to host
emptypath.com: did not receive HSTS header
emupedia.net: did not receive HSTS header
emyself.info: could not connect to host
-emyself.org: could not connect to host
+emyself.org: did not receive HSTS header
en4u.org: could not connect to host
enaia.fr: did not receive HSTS header
enaim.de: max-age too low: 0
@@ -5582,25 +5913,29 @@ ende-x.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR
endlessdark.net: max-age too low: 600
endlesshorizon.net: max-age too low: 0
endlesstone.com: did not receive HSTS header
-endofinternet.goip.de: could not connect to host
+endofinternet.goip.de: did not receive HSTS header
endofnet.org: could not connect to host
+endofodo.goip.de: could not connect to host
endohaus.ca: could not connect to host
endohaus.com: could not connect to host
endohaus.eu: could not connect to host
endohaus.us: could not connect to host
endspamwith.us: could not connect to host
+eneamarcantoni.com: could not connect to host
enecoshop.nl: did not receive HSTS header
enefan.jp: could not connect to host
-enelacto.com: did not receive HSTS header
+enelacto.com: could not connect to host
energethik-tulln.at: did not receive HSTS header
energisammenslutningen.dk: could not connect to host
+energy.eu: max-age too low: 0
energyradio.mk: max-age too low: 0
enersaveapp.org: could not connect to host
enersec.co.uk: could not connect to host
enfoqueseguro.com: did not receive HSTS header
+enfu.se: could not connect to host
engineowning.com: did not receive HSTS header
-enginx.cn: could not connect to host
-enginx.net: could not connect to host
+enginepit.com: could not connect to host
+enginx.cn: did not receive HSTS header
englerts.de: did not receive HSTS header
englishclub.com: did not receive HSTS header
englishdirectory.de: could not connect to host
@@ -5612,7 +5947,6 @@ enjoymayfield.com: max-age too low: 0
enjoystudio.ro: did not receive HSTS header
enlatte.com: could not connect to host
enlazaresbueno.cl: could not connect to host
-enlighten10x.ga: could not connect to host
enlightened.si: did not receive HSTS header
enoou.com: could not connect to host
enpalmademallorca.info: could not connect to host
@@ -5625,19 +5959,21 @@ enteente.com: could not connect to host
enteente.space: could not connect to host
enteente.xyz: could not connect to host
enterdev.co: did not receive HSTS header
-enterprisecarclub.co.uk: could not connect to host
+enterprisecarclub.co.uk: did not receive HSTS header
enterprisechannel.asia: did not receive HSTS header
enterprivacy.com: did not receive HSTS header
entersynapse.com: could not connect to host
entheorie.net: did not receive HSTS header
entourneebeetle.com: could not connect to host
entrepreneur.or.id: could not connect to host
+entreprise-toiture-clement.fr: could not connect to host
enum.eu.org: could not connect to host
enumify.com: could not connect to host
-envelope.co.nz: could not connect to host
+envelope.co.nz: did not receive HSTS header
enviam.de: did not receive HSTS header
enviapresentes.com.br: could not connect to host
environment.ai: could not connect to host
+environmentkirklees.org: did not receive HSTS header
envoutement-desenvoutement.com: did not receive HSTS header
envoyglobal.com: did not receive HSTS header
envoyworld.com: did not receive HSTS header
@@ -5657,7 +5993,7 @@ ephe.be: could not connect to host
ephry.com: could not connect to host
epicbouncycastlehirenorwich.co.uk: could not connect to host
epicmc.games: could not connect to host
-epicpages.com: could not connect to host
+epo32.ru: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
eposcloud.net: could not connect to host
eposmidlands.co.uk: could not connect to host
eposnewport.co.uk: did not receive HSTS header
@@ -5667,10 +6003,10 @@ eposreview.co.uk: could not connect to host
epossurrey.co.uk: did not receive HSTS header
epossussex.co.uk: could not connect to host
eposwales.co.uk: could not connect to host
-epoxate.com: could not connect to host
+epoxate.com: did not receive HSTS header
eprofitacademy.com: did not receive HSTS header
epsorting.cz: did not receive HSTS header
-epulsar.ru: did not receive HSTS header
+epulsar.ru: could not connect to host
epvin.com: could not connect to host
eq8.net.au: could not connect to host
eqib.nl: did not receive HSTS header
@@ -5682,7 +6018,7 @@ equalparts.eu: could not connect to host
equate.net.au: did not receive HSTS header
equatetechnologies.com.au: did not receive HSTS header
equilibre-yoga-jennifer-will.com: could not connect to host
-equilime.com: did not receive HSTS header
+equilime.com: max-age too low: 7889238
equippers.de: did not receive HSTS header
equipsupply.com: did not receive HSTS header
equitee.co: did not receive HSTS header
@@ -5699,10 +6035,11 @@ ericbond.net: could not connect to host
erichalv.com: could not connect to host
ericloud.tk: could not connect to host
ericorporation.com: did not receive HSTS header
-eridanus.uk: could not connect to host
+ericschwartzlive.com: did not receive HSTS header
eriel.com.br: could not connect to host
erikwagner.de: did not receive HSTS header
erinlin.com: did not receive HSTS header
+erinn.io: could not connect to host
eriser.fr: did not receive HSTS header
ernaehrungsberatung-rapperswil.ch: did not receive HSTS header
ernaehrungsberatung-zurich.ch: could not connect to host
@@ -5711,6 +6048,7 @@ eroimatome.com: could not connect to host
eroma.com.au: did not receive HSTS header
eromixx.com: could not connect to host
eromon.net: could not connect to host
+eroskines.com: did not receive HSTS header
erotalia.es: could not connect to host
erotic4me.ch: did not receive HSTS header
eroticforce.com: could not connect to host
@@ -5721,13 +6059,14 @@ errolz.com: did not receive HSTS header
errors.zenpayroll.com: could not connect to host
erspro.net: could not connect to host
eruvalerts.com: did not receive HSTS header
+erwanlepape.com: did not receive HSTS header
erwinvanlonden.net: did not receive HSTS header
es888.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
es8888.net: could not connect to host
es888999.com: could not connect to host
es999.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
es9999.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-esaborit.ddns.net: could not connect to host
+esaborit.ddns.net: did not receive HSTS header
esb-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
esb-top.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
esb-top.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -5841,18 +6180,20 @@ escalate.eu: could not connect to host
escape2rooms.fr: did not receive HSTS header
escapees.com: did not receive HSTS header
escolaengenharia.com.br: did not receive HSTS header
-escort-byuro.net: could not connect to host
+escolibri.com: could not connect to host
+escort-byuro.net: did not receive HSTS header
escort-fashion.com: could not connect to host
escortdisplay.com: could not connect to host
escortshotsexy.com: did not receive HSTS header
escotour.com: did not receive HSTS header
escueladewordpress.com: did not receive HSTS header
+escxtra.com: did not receive HSTS header
esec.rs: did not receive HSTS header
eseth.de: did not receive HSTS header
esh.ink: could not connect to host
eshepperd.com: did not receive HSTS header
-eshobe.com: did not receive HSTS header
eshtapay.com: could not connect to host
+esibun.net: could not connect to host
esipublications.com: did not receive HSTS header
esko.bar: could not connect to host
esln.org: did not receive HSTS header
@@ -5873,12 +6214,14 @@ espressivo.com.br: did not receive HSTS header
esprit-cloture.fr: did not receive HSTS header
esquonic.com: could not connect to host
esrs.gov: could not connect to host
+ess-cert.ru: did not receive HSTS header
essayforum.com: could not connect to host
essayhave.com: could not connect to host
essaylib.com: could not connect to host
essayscam.org: could not connect to host
essayshark.com: could not connect to host
essaywebsite.com: did not receive HSTS header
+essca.fr: max-age too low: 0
essenceofvitalitydetox.com: could not connect to host
essencesdeprana.org: did not receive HSTS header
essential12.com: could not connect to host
@@ -5890,6 +6233,7 @@ essexghosthunters.co.uk: did not receive HSTS header
essplusmed.org: could not connect to host
estaciona.guru: could not connect to host
estan.cn: did not receive HSTS header
+estateczech-eu.ru: could not connect to host
estebanborges.com: did not receive HSTS header
estespr.com: did not receive HSTS header
estetistarimini.it: did not receive HSTS header
@@ -5903,15 +6247,15 @@ et180.com: could not connect to host
etalent.net: did not receive HSTS header
etangs-magazine.com: could not connect to host
etaoinwu.tk: could not connect to host
+etath.com: could not connect to host
etdonline.co.uk: did not receive HSTS header
eteapparel.com: did not receive HSTS header
etenendrinken.nu: did not receive HSTS header
eternalsymbols.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
eternitylove.us: could not connect to host
eth9.net: could not connect to host
-ethandelany.me: did not receive HSTS header
+ethandelany.me: could not connect to host
ethanfaust.com: did not receive HSTS header
-ethanlew.is: could not connect to host
ethantskinner.com: did not receive HSTS header
ether.school: could not connect to host
etherderbies.com: could not connect to host
@@ -5921,7 +6265,7 @@ ethicalexploiting.com: could not connect to host
ethicall.org.uk: did not receive HSTS header
ethicaltek.com: could not connect to host
ethil-faer.fr: could not connect to host
-ethiobaba.com: could not connect to host
+ethosinfo.com: could not connect to host
etidni.help: did not receive HSTS header
etincelle.ml: could not connect to host
etk2000.com: did not receive HSTS header
@@ -5935,7 +6279,7 @@ ettebiz.com: max-age too low: 0
etula.ga: did not receive HSTS header
etula.me: could not connect to host
etys.no: did not receive HSTS header
-etzi.myds.me: did not receive HSTS header
+etzi.myds.me: could not connect to host
euanbaines.com: did not receive HSTS header
eucl3d.com: could not connect to host
euclideanpostulates.xyz: could not connect to host
@@ -5951,26 +6295,31 @@ euph.eu: could not connect to host
eupho.me: could not connect to host
eupresidency2018.com: could not connect to host
euren.se: could not connect to host
+euro-servers.de: could not connect to host
eurocamping.se: could not connect to host
eurocomcompany.cz: could not connect to host
-euroconthr.ro: could not connect to host
euroescortguide.com: could not connect to host
-europapier.at: did not receive HSTS header
europapier.ba: did not receive HSTS header
europapier.bg: did not receive HSTS header
+europapier.com: did not receive HSTS header
europapier.cz: did not receive HSTS header
europapier.hr: did not receive HSTS header
+europapier.hu: did not receive HSTS header
europapier.rs: did not receive HSTS header
europapier.si: did not receive HSTS header
+europapier.sk: did not receive HSTS header
europapier.ua: did not receive HSTS header
europeanpreppers.com: could not connect to host
euroservice.com.gr: did not receive HSTS header
euroshop24.net: could not connect to host
eurospecautowerks.com: did not receive HSTS header
eurostrategy.vn.ua: could not connect to host
+eurotime.ua: could not connect to host
+eutram.com: did not receive HSTS header
euvo.tk: could not connect to host
evades.io: did not receive HSTS header
evadifranco.com: did not receive HSTS header
+evafojtova.cz: did not receive HSTS header
evanhandgraaf.nl: did not receive HSTS header
evankurniawan.com: did not receive HSTS header
evanreev.es: could not connect to host
@@ -5994,17 +6343,17 @@ everygayporn.xyz: could not connect to host
everylab.org: could not connect to host
everymove.org: could not connect to host
everything.place: could not connect to host
-everythingstech.com: could not connect to host
everytruckjob.com: did not receive HSTS header
eveseat.net: could not connect to host
eveshaiwu.com: could not connect to host
evi.be: did not receive HSTS header
-evilarmy.com: did not receive HSTS header
+evilarmy.com: could not connect to host
evilbeasts.ru: could not connect to host
evilcult.me: did not receive HSTS header
evilnerd.de: did not receive HSTS header
evilness.nl: could not connect to host
evilsay.com: could not connect to host
+evilsite.cf: could not connect to host
evilvolcanolairs.com: did not receive HSTS header
evin.ml: could not connect to host
evio.com: did not receive HSTS header
@@ -6018,16 +6367,18 @@ evossd.tk: could not connect to host
evowl.com: could not connect to host
ewallet-optimizer.com: did not receive HSTS header
ewex.org: could not connect to host
+ewizmo.com: did not receive HSTS header
eworksmedia.com: could not connect to host
ewuchuan.com: could not connect to host
exampleessays.com: could not connect to host
examplesu.com: could not connect to host
excelgum.ca: did not receive HSTS header
+exceltobarcode.com: could not connect to host
exceptionalbits.com: could not connect to host
exceptionalservices.us: could not connect to host
exchangecoordinator.com: could not connect to host
exchangeworks.co: did not receive HSTS header
-exclusivedesignz.com: could not connect to host
+exclusivedesignz.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
exebouncycastles.co.uk: did not receive HSTS header
exembit.com: did not receive HSTS header
exfiles.cz: could not connect to host
@@ -6035,8 +6386,6 @@ exgaywatch.com: could not connect to host
exgravitus.com: could not connect to host
exhaledayspa.com.au: did not receive HSTS header
exno.co: could not connect to host
-exnovin.co: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-exocen.com: could not connect to host
exoplatform.com: did not receive HSTS header
exoticads.com: could not connect to host
exousiakaidunamis.xyz: could not connect to host
@@ -6046,15 +6395,18 @@ expecting.com.br: could not connect to host
experticon.com: did not receive HSTS header
expertmile.com: did not receive HSTS header
experts-en-gestion.fr: did not receive HSTS header
-explodingcamera.com: did not receive HSTS header
-exploration.ga: did not receive HSTS header
+exploflex.com.br: could not connect to host
+exploration.ga: could not connect to host
+exploravacations.in: could not connect to host
expo-designers.com: did not receive HSTS header
expokohler.com: did not receive HSTS header
+exponentialnews.net: could not connect to host
expoort.com.br: could not connect to host
exporo.de: did not receive HSTS header
expoundite.net: did not receive HSTS header
expowerhps.com: did not receive HSTS header
expressfinance.co.za: did not receive HSTS header
+extendwings.com: could not connect to host
exteriorservices.io: could not connect to host
extramoney.cash: could not connect to host
extrathemeshowcase.net: could not connect to host
@@ -6067,16 +6419,14 @@ extratorrents.tech: could not connect to host
extremenetworking.net: could not connect to host
extremeservicesandrestoration.com: could not connect to host
exy.pw: could not connect to host
-eyasc.nl: could not connect to host
eyedarts.com: did not receive HSTS header
eyeglassuniverse.com: did not receive HSTS header
eyenote.gov: did not receive HSTS header
-eyes-of-universe.eu: could not connect to host
+eyes-of-universe.eu: did not receive HSTS header
eyesoccer-didikh.rhcloud.com: could not connect to host
eyesonly.cc: did not receive HSTS header
eytosh.net: could not connect to host
ez.fi: could not connect to host
-ezequiel-garzon.net: could not connect to host
ezgamble.com: did not receive HSTS header
ezimoeko.net: could not connect to host
ezmod.org: could not connect to host
@@ -6102,7 +6452,7 @@ fabianasantiago.com: could not connect to host
fabianfischer.de: did not receive HSTS header
fabianmunoz.com: did not receive HSTS header
fabienbaker.com: could not connect to host
-fabled.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+fabiocicerchia.it: could not connect to host
fabriko.fr: did not receive HSTS header
fabriziorocca.com: could not connect to host
fabulouslyyouthfulskin.com: could not connect to host
@@ -6134,7 +6484,7 @@ faircom.co.za: did not receive HSTS header
fairkey.dk: did not receive HSTS header
fairlyoddtreasures.com: did not receive HSTS header
faisalshuvo.com: did not receive HSTS header
-faizan.net: did not receive HSTS header
+faizan.net: could not connect to host
faizan.xyz: did not receive HSTS header
fakeletters.org: could not connect to host
faktura.pl: did not receive HSTS header
@@ -6159,13 +6509,17 @@ familie-zimmermann.at: could not connect to host
familiegrottendieck.de: max-age too low: 7776000
familletouret.fr: did not receive HSTS header
famio.cn: could not connect to host
+fander.it: could not connect to host
fanflow.com: could not connect to host
fansmade.art: could not connect to host
fant.dk: did not receive HSTS header
fantasticgardenersmelbourne.com.au: did not receive HSTS header
fantasticpestcontrolmelbourne.com.au: did not receive HSTS header
+fantasycdn.com: could not connect to host
+fantasydrop.com: could not connect to host
fantasyfootballpundit.com: did not receive HSTS header
fantasyprojections.com: could not connect to host
+fanvoice.com: could not connect to host
fanyl.cn: could not connect to host
fap.no: could not connect to host
faq.lookout.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -6181,9 +6535,8 @@ farmaciaformula.com.br: could not connect to host
farmaciamedicom.com.br: could not connect to host
farmmaximizer.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
farrel-f.id: could not connect to host
-farsil.eu: could not connect to host
-fascia.fit: could not connect to host
fashion.net: did not receive HSTS header
+fashion4ever.pl: could not connect to host
fashioncare.cz: did not receive HSTS header
fashiondays.bg: max-age too low: 0
fashiondays.hu: max-age too low: 0
@@ -6194,13 +6547,12 @@ fasset.jp: could not connect to host
fastaim.de: could not connect to host
fastbackmbg.be: could not connect to host
fastbackmbm.be: could not connect to host
-fastcomcorp.net: did not receive HSTS header
+fastcomcorp.net: could not connect to host
fastconfirm.com: could not connect to host
fastcp.top: could not connect to host
fastograph.com: could not connect to host
fastopen.ml: could not connect to host
fastwebsites.com.br: did not receive HSTS header
-fastworx.com: did not receive HSTS header
fatdoge.cn: did not receive HSTS header
fatgeekflix.net: could not connect to host
fatlossguide.xyz: could not connect to host
@@ -6211,10 +6563,11 @@ fatwin.pw: could not connect to host
fatzebra.com.au: max-age too low: 0
favorit.club: did not receive HSTS header
fawkex.me: did not receive HSTS header
+faxite.com: did not receive HSTS header
faxreader.net: could not connect to host
fayolle.info: did not receive HSTS header
fbf.gov: did not receive HSTS header
-fbi.pw: could not connect to host
+fbi.pw: did not receive HSTS header
fbook.top: could not connect to host
fbox.li: could not connect to host
fcapartsdb.com: could not connect to host
@@ -6238,20 +6591,22 @@ feegg.com.br: could not connect to host
feeriedesign-event.com: could not connect to host
fefore.com: did not receive HSTS header
fegans.org.uk: did not receive HSTS header
+fehnladen.de: did not receive HSTS header
feirlane.org: could not connect to host
feist.io: could not connect to host
feitobrasilcosmeticos.com.br: did not receive HSTS header
-fejes.house: could not connect to host
+feizhujianzhi.com: did not receive HSTS header
felger-times.fr: could not connect to host
felgitscher.xyz: max-age too low: 2592000
felisslovakia.sk: did not receive HSTS header
feliwyn.fr: did not receive HSTS header
felixhefner.de: did not receive HSTS header
-felixqu.com: did not receive HSTS header
felixrr.pro: could not connect to host
femaledom.xyz: could not connect to host
femdombbw.com: could not connect to host
+feminism.lgbt: could not connect to host
feminists.co: could not connect to host
+femradio.es: did not receive HSTS header
feng-in.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
feng-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
fengyadi.com: could not connect to host
@@ -6269,35 +6624,40 @@ fernseher-kauf.de: could not connect to host
ferrolatino.com: could not connect to host
feschiyan.com: could not connect to host
festember.com: did not receive HSTS header
-festival.house: did not receive HSTS header
+festival.house: could not connect to host
festivalxdentro.com: did not receive HSTS header
festrip.com: could not connect to host
-fetch.co.uk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+festx.co.za: did not receive HSTS header
fetclips.se: could not connect to host
fetlife.com: could not connect to host
fettbrot.tk: did not receive HSTS header
feudaltactics.com: could not connect to host
feuerwehr-dachaufsetzer.de: could not connect to host
-fexmen.com: could not connect to host
+feuerwehr-oberkotzau.de: could not connect to host
+feuerwehrbadwurzach.de: did not receive HSTS header
+fexmen.com: did not receive HSTS header
ff-bg.xyz: could not connect to host
ffbans.org: did not receive HSTS header
ffl123.com: did not receive HSTS header
fgequipamentos.com.br: did not receive HSTS header
-fhg90.com: did not receive HSTS header
+fhbnutrition.com: did not receive HSTS header
+fhg90.com: could not connect to host
fhsseniormens.club: could not connect to host
fi-sanki.co.jp: could not connect to host
-fibrasynormasdecolombia.com: did not receive HSTS header
+fialat.cz: could not connect to host
ficklenote.net: did not receive HSTS header
fics-twosigma.com: could not connect to host
fid.to: could not connect to host
fidel.uk: did not receive HSTS header
fideleslaici.com: did not receive HSTS header
+fidufinance.com: did not receive HSTS header
fieldclockapp.com: did not receive HSTS header
fieldtalk.co.uk: could not connect to host
fiendishmasterplan.com: did not receive HSTS header
fierman.eu: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
fierman.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
fierman.us: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+fiestagenial.com: could not connect to host
fiftyshadesofluca.ml: could not connect to host
fig.co: did not receive HSTS header
fig.ms: could not connect to host
@@ -6318,6 +6678,8 @@ filesense.com: could not connect to host
filewall.de: did not receive HSTS header
filey.co.uk: did not receive HSTS header
filhomes.ph: could not connect to host
+fili.org: could not connect to host
+filiosoft.cloud: did not receive HSTS header
fillitupchallenge.eu: did not receive HSTS header
fillmysuitca.se: did not receive HSTS header
film-storyboards.com: did not receive HSTS header
@@ -6328,9 +6690,11 @@ filme-online.eu.com: did not receive HSTS header
filmesubtitrate2017.online: could not connect to host
filo.xyz: did not receive HSTS header
filoitoupediou.gr: did not receive HSTS header
-filterflasche-kaufen.de: did not receive HSTS header
+filterflasche-kaufen.de: could not connect to host
finalgear.com: could not connect to host
+finalprice.net: could not connect to host
finalvpn.com: did not receive HSTS header
+financewithcromulent.com: could not connect to host
financier.io: did not receive HSTS header
financieringsportaal.nl: did not receive HSTS header
finanzkontor.net: could not connect to host
@@ -6342,7 +6706,7 @@ findthere.net: could not connect to host
findtutorsnearme.com: did not receive HSTS header
findyour.diet: could not connect to host
fine-services.paris: could not connect to host
-finer04.pw: could not connect to host
+finer04.pw: did not receive HSTS header
finewineonline.com: could not connect to host
fingent.com: did not receive HSTS header
fingerscrossed.style: could not connect to host
@@ -6350,6 +6714,7 @@ finiteheap.com: did not receive HSTS header
finkenberger.org: did not receive HSTS header
finstererlebnis.de: could not connect to host
finsterlebnis.de: did not receive HSTS header
+fintechnics.com: could not connect to host
fiodental.com.br: did not receive HSTS header
fiork.com: did not receive HSTS header
fire-wolf.com: could not connect to host
@@ -6360,6 +6725,7 @@ firebird.io: did not receive HSTS header
firefall.rocks: could not connect to host
firehost.com: did not receive HSTS header
fireinthedeep.com: could not connect to host
+firekoi.com: did not receive HSTS header
firemail.io: could not connect to host
fireorbit.de: did not receive HSTS header
firepeak.ru: could not connect to host
@@ -6367,12 +6733,12 @@ fireworkcoaching.com: did not receive HSTS header
firexarxa.de: could not connect to host
firmale.com: could not connect to host
firmenverzeichnis.nu: could not connect to host
+firmware.science: did not receive HSTS header
first-time-offender.com: could not connect to host
firstchoicepool.com: did not receive HSTS header
firstdogonthemoon.com.au: did not receive HSTS header
firstforex.co.uk: did not receive HSTS header
firstlook.org: did not receive HSTS header
-fischer-its.com: could not connect to host
fiscoeconti.it: did not receive HSTS header
fishfinders.info: did not receive HSTS header
fiskestang.com: did not receive HSTS header
@@ -6394,11 +6760,12 @@ fivezerocreative.com: did not receive HSTS header
fiws.net: did not receive HSTS header
fix-the-timeline.com: could not connect to host
fix-the-timeline.org: could not connect to host
-fixate.ru: could not connect to host
+fixate.ru: max-age too low: 3153600
fixeaide.com: did not receive HSTS header
fixeaider.com: did not receive HSTS header
fixico-staging.nl: could not connect to host
fixingdns.com: could not connect to host
+fixitfelix.us: did not receive HSTS header
fixmyglitch.com: could not connect to host
fixtectools.co.za: could not connect to host
fixthetimeline.com: could not connect to host
@@ -6425,6 +6792,7 @@ flam.io: could not connect to host
flamewall.net: could not connect to host
flamingcow.tv: could not connect to host
flamingkeys.com.au: could not connect to host
+flamingogroup.vn: did not receive HSTS header
flareon.net: could not connect to host
flaretechnologies.io: could not connect to host
flashbaggie.com: could not connect to host
@@ -6446,7 +6814,7 @@ flightschoolusa.com: did not receive HSTS header
flikmsg.co: could not connect to host
fling.dating: could not connect to host
flipagram.com: did not receive HSTS header
-flipbell.com: could not connect to host
+flipbell.com: did not receive HSTS header
flipkey.com: did not receive HSTS header
flirchi.com: did not receive HSTS header
flirtycourts.com: could not connect to host
@@ -6478,7 +6846,6 @@ floweslawncare.com: could not connect to host
flowlo.me: could not connect to host
flox.io: could not connect to host
floydm.com: did not receive HSTS header
-flucky.xyz: could not connect to host
flucto.com: did not receive HSTS header
flue-ducting.co.uk: did not receive HSTS header
flugplatz-edvc.de: could not connect to host
@@ -6489,12 +6856,15 @@ fluitbeurt.nl: could not connect to host
flukethoughts.com: did not receive HSTS header
flurrybridge.com: could not connect to host
flushstudios.com: did not receive HSTS header
+flux.by: did not receive HSTS header
flyaces.com: could not connect to host
+flyawayantennas.com: did not receive HSTS header
flybunnyfly.dk: did not receive HSTS header
flygpost.com: did not receive HSTS header
flyingdoggy.net: could not connect to host
flyingspaghettimonsterdonationsfund.nl: could not connect to host
flyingyoung.top: could not connect to host
+flyshe.co.uk: did not receive HSTS header
flyspace.ga: did not receive HSTS header
flyspace.ml: did not receive HSTS header
flyss.net: could not connect to host
@@ -6504,7 +6874,9 @@ fm992.com: could not connect to host
fmapplication.com: could not connect to host
fmi.gov: did not receive HSTS header
fmovies.fyi: did not receive HSTS header
-fmovies.life: did not receive HSTS header
+fmovies.life: could not connect to host
+fmstr.ml: could not connect to host
+fnb-griffinonline.com: did not receive HSTS header
fnfpt.co.uk: could not connect to host
fniephaus.com: did not receive HSTS header
fnncat.com: did not receive HSTS header
@@ -6519,6 +6891,7 @@ fol.tf: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAI
foliekonsulenten.dk: did not receive HSTS header
folioapp.io: could not connect to host
folkfests.org: did not receive HSTS header
+folwarkwiazy.pl: could not connect to host
fondanastasia.ru: did not receive HSTS header
fondy.ru: did not receive HSTS header
foneo.com: could not connect to host
@@ -6528,6 +6901,7 @@ foo: could not connect to host
food4health.guide: could not connect to host
foodacademy.capetown: max-age too low: 43200
foodbuddy.ch: could not connect to host
+foodcare.ml: could not connect to host
foodcowgirls.com: could not connect to host
foodiebox.no: did not receive HSTS header
foodies.my: did not receive HSTS header
@@ -6560,14 +6934,16 @@ formadmin.com: did not receive HSTS header
formaliteo.com: did not receive HSTS header
formasdemaquillarse.com: did not receive HSTS header
formazioneopen.it: could not connect to host
-formersessalaries.com: did not receive HSTS header
formkiq.com: could not connect to host
formula.cf: could not connect to host
+foro.io: could not connect to host
forpc.us: did not receive HSTS header
forplanetsake.com: could not connect to host
forplayers.pl: could not connect to host
-forquilhinhanoticias.com.br: did not receive HSTS header
+forquilhinhanoticias.com.br: could not connect to host
forsyththeatre.com: could not connect to host
+fort.eu: max-age too low: 0
+fortnitemagic.ga: could not connect to host
fortoglethorpega.gov: could not connect to host
fortricks.in: did not receive HSTS header
fortuna-loessnitz.de: could not connect to host
@@ -6575,13 +6951,15 @@ fortuna-s.com: [Exception... "Component returned failure code: 0x80004005 (NS_ER
fortworth.ch: did not receive HSTS header
forty2.eu: did not receive HSTS header
forum.linode.com: did not receive HSTS header
+forum3.ru: could not connect to host
forumjuridico.org: did not receive HSTS header
forus.be: could not connect to host
foryoucosmeticos.com.br: could not connect to host
+foshanshequ.com: could not connect to host
fossewayflowers.co.uk: could not connect to host
fossewayflowers.com: could not connect to host
fossewaygardencentre.co.uk: did not receive HSTS header
-fossgruppen.se: did not receive HSTS header
+fossgruppen.se: could not connect to host
fossguard.com: did not receive HSTS header
fotiu.com: could not connect to host
foto-pro.by: did not receive HSTS header
@@ -6606,22 +6984,26 @@ foxtrot.pw: did not receive HSTS header
foxyslut.com: could not connect to host
foyale.io: could not connect to host
fpki.sh: could not connect to host
+fq.mk: did not receive HSTS header
fr0zenbits.io: could not connect to host
fr33d0m.link: could not connect to host
+fr33tux.org: did not receive HSTS header
fragilesolar.cf: could not connect to host
-fragnic.com: did not receive HSTS header
+fragnic.com: could not connect to host
fralef.me: did not receive HSTS header
francesca-and-lucas.com: did not receive HSTS header
+francescoservida.ch: did not receive HSTS header
francevpn.xyz: could not connect to host
francois-vidit.com: did not receive HSTS header
-frangor.info: did not receive HSTS header
+francoise-paviot.com: could not connect to host
+frangor.info: could not connect to host
frankedier.com: did not receive HSTS header
frankfurt-am-start.de: did not receive HSTS header
+frankhaala.com: could not connect to host
franklinhua.com: could not connect to host
fransallen.com: did not receive HSTS header
franta.biz: did not receive HSTS header
franta.email: did not receive HSTS header
-franzt.de: could not connect to host
franzt.ovh: could not connect to host
frasesaniversarios.com.br: did not receive HSTS header
frasesdeamizade.pt: could not connect to host
@@ -6633,7 +7015,7 @@ freakyaweso.me: did not receive HSTS header
freakyawesome.blog: max-age too low: 86400
freakyawesome.club: did not receive HSTS header
freakyawesome.co: did not receive HSTS header
-freakyawesome.com: did not receive HSTS header
+freakyawesome.com: could not connect to host
freakyawesome.company: did not receive HSTS header
freakyawesome.dance: did not receive HSTS header
freakyawesome.design: could not connect to host
@@ -6642,15 +7024,12 @@ freakyawesome.email: did not receive HSTS header
freakyawesome.events: did not receive HSTS header
freakyawesome.fashion: did not receive HSTS header
freakyawesome.fitness: did not receive HSTS header
-freakyawesome.fm: did not receive HSTS header
freakyawesome.fun: did not receive HSTS header
freakyawesome.fyi: did not receive HSTS header
freakyawesome.games: did not receive HSTS header
freakyawesome.guide: did not receive HSTS header
freakyawesome.guru: did not receive HSTS header
freakyawesome.info: did not receive HSTS header
-freakyawesome.io: did not receive HSTS header
-freakyawesome.lgbt: did not receive HSTS header
freakyawesome.life: did not receive HSTS header
freakyawesome.live: did not receive HSTS header
freakyawesome.management: did not receive HSTS header
@@ -6703,15 +7082,12 @@ freakyawesometheme.com: could not connect to host
freakyawesomethemes.com: could not connect to host
freakyawesomewp.com: could not connect to host
frebi.org: could not connect to host
-frebib.co.uk: could not connect to host
-frebib.com: could not connect to host
frebib.me: could not connect to host
-frebib.net: could not connect to host
freddythechick.uk: could not connect to host
-fredericcote.com: could not connect to host
frederickalcantara.com: could not connect to host
fredliang.cn: could not connect to host
-fredriksslekt.se: did not receive HSTS header
+fredriksslekt.se: could not connect to host
+fredtec.ru: could not connect to host
free-your-pc.com: could not connect to host
free8.xyz: could not connect to host
freeasinlliure.org: did not receive HSTS header
@@ -6719,7 +7095,7 @@ freeben666.fr: could not connect to host
freebies.id: could not connect to host
freeblog.me: could not connect to host
freebookmakerbets.com.au: did not receive HSTS header
-freecookies.nl: did not receive HSTS header
+freecycleusa.com: did not receive HSTS header
freedomrealtyoftexas.com: did not receive HSTS header
freedomvote.nl: could not connect to host
freeexampapers.com: could not connect to host
@@ -6732,7 +7108,8 @@ freelanceshipping.com: did not receive HSTS header
freelandinnovation.com: did not receive HSTS header
freelansir.com: could not connect to host
freemanning.de: could not connect to host
-freematthale.net: did not receive HSTS header
+freematthale.net: could not connect to host
+freemomhugs.org: did not receive HSTS header
freepoints.us: could not connect to host
freeslots.guru: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
freesoftwaredriver.com: could not connect to host
@@ -6741,17 +7118,15 @@ freesounding.ru: did not receive HSTS header
freethought.org.au: could not connect to host
freeutopia.org: did not receive HSTS header
freevps.us: did not receive HSTS header
-freitasul.com.br: could not connect to host
-freitasul.io: could not connect to host
frenzel.dk: could not connect to host
freqlabs.com: did not receive HSTS header
freshfind.xyz: could not connect to host
freshkiss.com.au: did not receive HSTS header
-freshmaza.com: could not connect to host
freshmaza.io: did not receive HSTS header
frettboard.com: did not receive HSTS header
frezbo.com: could not connect to host
frforms.com: did not receive HSTS header
+fribourgviking.net: could not connect to host
frickenate.com: could not connect to host
fridaperfumaria.com.br: could not connect to host
friedhelm-wolf.de: could not connect to host
@@ -6768,9 +7143,9 @@ fromix.de: could not connect to host
fromlemaytoz.com: could not connect to host
fromthesoutherncross.com: could not connect to host
front-end.dog: could not connect to host
+frontier.bet: could not connect to host
frontierdiscount.com: did not receive HSTS header
frontisme.nl: did not receive HSTS header
-frontline.cloud: did not receive HSTS header
frontline6.com: did not receive HSTS header
frontmin.com: did not receive HSTS header
frost-ci.xyz: could not connect to host
@@ -6784,8 +7159,10 @@ frugal-millennial.com: did not receive HSTS header
fruitusers.com: could not connect to host
frumious.fyi: could not connect to host
frusky.net: could not connect to host
+fs-community.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
fs-fitness.eu: could not connect to host
fs-gamenet.de: did not receive HSTS header
+fsck.cz: could not connect to host
fsf.moe: could not connect to host
fsfi.is: could not connect to host
fsinf.at: did not receive HSTS header
@@ -6801,9 +7178,10 @@ ftctele.com: could not connect to host
fteproxy.org: did not receive HSTS header
ftgho.com: could not connect to host
ftpi.ml: could not connect to host
+ftv.re: could not connect to host
fu-li88.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
fu-li88.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-fu639.top: did not receive HSTS header
+fu639.top: could not connect to host
fuchsy.com: could not connect to host
fuckbilibili.com: could not connect to host
fuckcf.cf: could not connect to host
@@ -6838,12 +7216,12 @@ fundacionfranciscofiasco.org: could not connect to host
fundacionhijosdelsol.org: could not connect to host
fundayltd.com: could not connect to host
funderburg.me: did not receive HSTS header
-fundingempire.com: could not connect to host
funerariahogardecristo.cl: did not receive HSTS header
fungame.eu: did not receive HSTS header
-funi4u.com: could not connect to host
+funi4u.com: did not receive HSTS header
funideas.org: could not connect to host
funkes-ferien.de: did not receive HSTS header
+funkner.ru: could not connect to host
funkyweddingideas.com.au: could not connect to host
funnelweb.xyz: could not connect to host
funny-joke-pictures.com: did not receive HSTS header
@@ -6855,29 +7233,33 @@ funtimebourne.co.uk: did not receive HSTS header
fuorifuocogenova.it: could not connect to host
furaje-iasi.com: could not connect to host
furcity.me: could not connect to host
+furgetmeknot.org: did not receive HSTS header
furi.ga: could not connect to host
furiffic.com: did not receive HSTS header
-furikake.xyz: could not connect to host
furnation.com: could not connect to host
furnitureconcept.co.uk: could not connect to host
furry.agency: could not connect to host
furry.be: did not receive HSTS header
furry.zone: did not receive HSTS header
+furrybot.me: could not connect to host
furtherfood.com: did not receive HSTS header
furtivelook.com: did not receive HSTS header
fusedrops.com: did not receive HSTS header
fusionmate.com: could not connect to host
+fuszara.eu: could not connect to host
futa.agency: could not connect to host
futbol11.com: did not receive HSTS header
futbolvivo.tv: could not connect to host
futos.de: could not connect to host
futurefire.de: could not connect to host
futurefundapp.com: could not connect to host
+futurehack.io: could not connect to host
futuresonline.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
futurestarsusa.org: did not receive HSTS header
futuretechnologi.es: could not connect to host
futureyouhealth.com: did not receive HSTS header
futuristarchitecture.com: did not receive HSTS header
+fuvelis.com: could not connect to host
fuvpn.com: could not connect to host
fuxwerk.de: could not connect to host
fuzoku-sodan.com: could not connect to host
@@ -6888,13 +7270,13 @@ fwww7.com: could not connect to host
fxgame.online: could not connect to host
fxpig-ib.com: could not connect to host
fxwebstudio.com.au: max-age too low: 0
-fydjbsd.cn: could not connect to host
fyodorpi.com: did not receive HSTS header
fyol.pw: could not connect to host
fysiohaenraets.nl: did not receive HSTS header
+fzhyzamt.com: could not connect to host
fzn.io: did not receive HSTS header
fzslm.me: did not receive HSTS header
-g-i-s.vn: did not receive HSTS header
+g-i-s.vn: could not connect to host
g-marketing.ro: could not connect to host
g-o.pl: did not receive HSTS header
g-rickroll-o.pw: could not connect to host
@@ -6911,6 +7293,7 @@ g77.ca: could not connect to host
gaanbaksho.com.au: did not receive HSTS header
gaasuper6.com: could not connect to host
gabber.scot: could not connect to host
+gabemack.com: did not receive HSTS header
gabethebabetv.com: could not connect to host
gabi.com.es: could not connect to host
gabi.soy: did not receive HSTS header
@@ -6921,15 +7304,19 @@ gabrielsimonet.ch: could not connect to host
gaelleetarnaud.com: did not receive HSTS header
gafachi.com: could not connect to host
gagne-enterprises.com: did not receive HSTS header
+gaiavanderzeyp.com: could not connect to host
gaichanh.com: did not receive HSTS header
+gaichon.com: could not connect to host
gainesvillegoneaustin.org: did not receive HSTS header
-gaiserik.com: did not receive HSTS header
gaite.me: did not receive HSTS header
gajas18.com: could not connect to host
-gakkainavi-epsilon.jp: could not connect to host
+gakkainavi.jp: did not receive HSTS header
+gakkainavi.net: did not receive HSTS header
gakkainavi4.com: could not connect to host
-gala.kiev.ua: could not connect to host
+gakkainavi4.jp: did not receive HSTS header
+gakkainavi4.net: did not receive HSTS header
galardi.org: could not connect to host
+galecia.com: did not receive HSTS header
galena.io: could not connect to host
galenskap.eu: could not connect to host
galeriadobimba.com.br: could not connect to host
@@ -6939,14 +7326,17 @@ galgoafegao.com.br: could not connect to host
galgoingles.com.br: could not connect to host
galgopersa.com.br: could not connect to host
gali.review: did not receive HSTS header
+galilahiskye.com: did not receive HSTS header
galileomtz.com: did not receive HSTS header
-gallerify.eu: could not connect to host
gallery44.org: did not receive HSTS header
galoisvpn.xyz: could not connect to host
gam3rs.de: could not connect to host
gamajo.com: did not receive HSTS header
gambitcloud.net: could not connect to host
+gamblersgaming.eu: could not connect to host
+gamcore.com: could not connect to host
game-gentle.com: could not connect to host
+game-topic.ru: did not receive HSTS header
game.yt: could not connect to host
game88city.com: could not connect to host
gamebits.net: did not receive HSTS header
@@ -6955,6 +7345,7 @@ gamecdn.com: could not connect to host
gamechasm.com: could not connect to host
gamefund.me: could not connect to host
gamehacks.me: could not connect to host
+gameharbor.eu: could not connect to host
gameink.net: did not receive HSTS header
gamek.es: could not connect to host
gamenected.com: could not connect to host
@@ -6974,22 +7365,27 @@ gamerz-stream.com: did not receive HSTS header
gameserver-sponsor.de: did not receive HSTS header
gamesurferapp.com: could not connect to host
gameswitchers.uk: could not connect to host
+gametilt.com: could not connect to host
gametium.com: could not connect to host
gametium.es: could not connect to host
+gametowndev.tk: could not connect to host
gamhealth.net: could not connect to host
-gamingmedia.eu: did not receive HSTS header
+gamingmedia.eu: could not connect to host
gamingreinvented.com: did not receive HSTS header
+gamingwithcromulent.com: could not connect to host
+gamishijabsyari.com: could not connect to host
gamismodelbaru.com: did not receive HSTS header
-gamismu.com: did not receive HSTS header
gamoice.com: did not receive HSTS header
gampenhof.de: could not connect to host
gan.wtf: could not connect to host
+gandc.co: could not connect to host
gangnam-club.com: could not connect to host
gangnam-karaoke.com: did not receive HSTS header
ganhonet.com.br: did not receive HSTS header
ganyouxuan.com: could not connect to host
ganzgraph.de: did not receive HSTS header
gaon.network: could not connect to host
+gaphag.ddns.net: could not connect to host
gaptek.id: did not receive HSTS header
gar-nich.net: could not connect to host
garage-abri-chalet.fr: did not receive HSTS header
@@ -7001,16 +7397,15 @@ garcinia--cambogia.com: could not connect to host
garciniacambogiareviewed.co: did not receive HSTS header
garden-life.org: could not connect to host
garden.trade: could not connect to host
-gardencarezone.com: did not receive HSTS header
-garfieldairlines.net: did not receive HSTS header
+gardencarezone.com: could not connect to host
+garfieldairlines.net: could not connect to host
garten-bau.ch: did not receive HSTS header
garten-diy.de: could not connect to host
-gartenhauszentrum.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+gartenhauszentrum.de: did not receive HSTS header
gasbarkenora.com: could not connect to host
gasnews.net: could not connect to host
gasser-daniel.ch: did not receive HSTS header
gassouthkenticoqa.azurewebsites.net: could not connect to host
-gastauftritt.net: did not receive HSTS header
gastritisolucion.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
gatapro.net: could not connect to host
gatemotorsumhlanga.co.za: did not receive HSTS header
@@ -7022,10 +7417,12 @@ gatorsa.es: could not connect to host
gaussorgues.me: could not connect to host
gautham.pro: did not receive HSTS header
gavick.com: did not receive HSTS header
+gavinsblog.com: did not receive HSTS header
gay-jays.com: could not connect to host
gay-sissies.com: could not connect to host
-gaya-sa.org: could not connect to host
+gaya-sa.org: did not receive HSTS header
gayauthors.org: could not connect to host
+gaycc.cc: could not connect to host
gayforgenji.com: could not connect to host
gaygeeks.de: could not connect to host
gayjays.com: could not connect to host
@@ -7048,12 +7445,11 @@ gdz-otvety.com: could not connect to host
gdz.tv: could not connect to host
gear-acquisition-syndrome.community: could not connect to host
gearseo.com.br: did not receive HSTS header
-geaskb.nl: could not connect to host
+geaskb.nl: did not receive HSTS header
geass.xyz: could not connect to host
geblitzt.de: did not receive HSTS header
gedankenbude.info: could not connect to host
gedankenworks.com: could not connect to host
-geek.ch: could not connect to host
geek1.de: did not receive HSTS header
geekbaba.com: could not connect to host
geekcast.co.uk: could not connect to host
@@ -7062,7 +7458,6 @@ geekdt.com: could not connect to host
geekmind.org: max-age too low: 172800
geeks.berlin: could not connect to host
geeks.lgbt: could not connect to host
-geeks.one: did not receive HSTS header
geektimes.com: did not receive HSTS header
geeky.software: could not connect to host
geekystudios.us: could not connect to host
@@ -7072,11 +7467,11 @@ geigr.de: could not connect to host
geiser.io: did not receive HSTS header
gekosoft.eu: could not connect to host
geldteveel.eu: could not connect to host
-geli-graphics.com: did not receive HSTS header
+geluk.io: could not connect to host
+gemeentemolenwaard.nl: did not receive HSTS header
gemeinfreie-lieder.de: did not receive HSTS header
gemsoftheworld.org: could not connect to host
gemuplay.com: could not connect to host
-genbright.com: could not connect to host
genemesservwparts.com: could not connect to host
general-insurance.tk: could not connect to host
generalpants.com.au: did not receive HSTS header
@@ -7090,7 +7485,8 @@ genoog.com: could not connect to host
genossen.ru: could not connect to host
genshiken.org: could not connect to host
gensokyo.chat: could not connect to host
-genuu.com: did not receive HSTS header
+gentooblog.de: could not connect to host
+genuu.com: could not connect to host
genuxation.com: could not connect to host
genuxtsg.com: did not receive HSTS header
genxbeats.com: could not connect to host
@@ -7102,7 +7498,7 @@ geoffanderinmyers.com: did not receive HSTS header
geoffdev.com: could not connect to host
geoffmyers.com: did not receive HSTS header
geoffreyrichard.com: did not receive HSTS header
-geopals.net: did not receive HSTS header
+geopals.net: could not connect to host
georgehalachev.com: did not receive HSTS header
georgeperez.me: could not connect to host
georgesonarthurs.com.au: did not receive HSTS header
@@ -7113,13 +7509,15 @@ gereon.ch: could not connect to host
geri.be: could not connect to host
germancraft.net: could not connect to host
germansoldiers.net: could not connect to host
+germanticz.de: did not receive HSTS header
gers-authentique.com: could not connect to host
gerum.dynv6.net: did not receive HSTS header
-geschenkly.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+geschichtscheck.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
geschmackspiloten.de: did not receive HSTS header
gesiwista.net: did not receive HSTS header
gesunde-smoothies.de: did not receive HSTS header
gesundes-im-napf.de: did not receive HSTS header
+gesundheitszentrum-am-reischberg.de: did not receive HSTS header
get-asterisk.ru: could not connect to host
get-cctv.com: could not connect to host
get-link.info: could not connect to host
@@ -7130,13 +7528,15 @@ getcarefirst.com: could not connect to host
getcarina.com: could not connect to host
getcleartouch.com: did not receive HSTS header
getcolor.com: did not receive HSTS header
+getcolq.com: could not connect to host
getdigitized.net: could not connect to host
geteduroam.no: could not connect to host
getenergized2018.kpn: could not connect to host
+getenv.io: could not connect to host
getfestify.com: did not receive HSTS header
-getfilterlive.org: could not connect to host
getfirepress.com: could not connect to host
-getfuturama.com: max-age too low: 0
+getfittedstore.com: did not receive HSTS header
+getfuturama.com: could not connect to host
getgeek.dk: could not connect to host
getgeek.ee: could not connect to host
getgeek.eu: could not connect to host
@@ -7159,7 +7559,7 @@ getmondo.co.uk: could not connect to host
geto.ml: did not receive HSTS header
getpake.com: could not connect to host
getpop.org: did not receive HSTS header
-getpost.online: did not receive HSTS header
+getpost.online: could not connect to host
getremembrall.com: could not connect to host
getronics.care: could not connect to host
getsello.com: could not connect to host
@@ -7169,6 +7569,7 @@ getshifter.io: did not receive HSTS header
getspeaker.com: did not receive HSTS header
getspire.com: could not connect to host
getsubs.net: could not connect to host
+getts.ro: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
getwarden.net: could not connect to host
getwashdaddy.com: could not connect to host
getweloop.io: did not receive HSTS header
@@ -7176,12 +7577,14 @@ getyou.onl: could not connect to host
getyourphix.tk: could not connect to host
gevaulug.fr: could not connect to host
gfbouncycastles.co.uk: did not receive HSTS header
+gfedating.com: could not connect to host
gfhgiro.nl: did not receive HSTS header
gflclan.ru: could not connect to host
gfm.tech: could not connect to host
gfoss.gr: could not connect to host
+gfournier.ca: could not connect to host
gfw.moe: could not connect to host
-gfwno.win: could not connect to host
+gfwno.win: max-age too low: 15
gfwsb.ml: could not connect to host
gglks.com: could not connect to host
ggobbo.com: could not connect to host
@@ -7189,15 +7592,15 @@ ggrks-asano.com: could not connect to host
ggss.cf: could not connect to host
ggss.ml: could not connect to host
gh16.com.ar: could not connect to host
-ghcif.de: could not connect to host
+ghaglund.se: could not connect to host
+ghcif.de: did not receive HSTS header
gheorghe-sarcov.ga: could not connect to host
gheorghesarcov.ga: could not connect to host
gheorghesarcov.tk: could not connect to host
ghi.gov: could not connect to host
-ghibli.studio: could not connect to host
+ghibli.studio: did not receive HSTS header
ghid-pitesti.ro: did not receive HSTS header
ghkim.net: could not connect to host
-ghowell.io: could not connect to host
gianlucapartengo.photography: did not receive HSTS header
giant-powerfit.co.uk: did not receive HSTS header
gibraltar-firma.com: did not receive HSTS header
@@ -7206,30 +7609,33 @@ gicl.dk: could not connect to host
giddyaunt.net: could not connect to host
gidea.nu: could not connect to host
giduv.com: did not receive HSTS header
-giegler.software: could not connect to host
+giegler.software: did not receive HSTS header
giftbg.org: did not receive HSTS header
-giftedconsortium.com: could not connect to host
giftgofers.com: max-age too low: 2592000
giftservices.nl: could not connect to host
gifzilla.net: could not connect to host
gigacloud.org: could not connect to host
+gigantar.com: did not receive HSTS header
gigawattz.com: did not receive HSTS header
+gigime.com: could not connect to host
gigiscloud.servebeer.com: could not connect to host
gigolodavid.be: could not connect to host
gilcloud.com: could not connect to host
gilescountytn.gov: did not receive HSTS header
gilgaz.com: did not receive HSTS header
+gilium.com: could not connect to host
gillet-cros.fr: could not connect to host
gilly.berlin: did not receive HSTS header
+gilmourluna.com: could not connect to host
gilpinmanagement.com: did not receive HSTS header
gilpinrealty.com: did not receive HSTS header
gilroywestwood.org: did not receive HSTS header
+ginacat.de: did not receive HSTS header
gincher.net: did not receive HSTS header
gingali.de: did not receive HSTS header
ginie.de: did not receive HSTS header
ginijony.com: did not receive HSTS header
ginkel.com: did not receive HSTS header
-ginnegappen.nl: could not connect to host
gintenreiter-photography.com: did not receive HSTS header
giochistem.it: could not connect to host
giogadesign.com: did not receive HSTS header
@@ -7248,6 +7654,7 @@ git.ac.cn: could not connect to host
git.co: could not connect to host
gitar.io: could not connect to host
github.party: did not receive HSTS header
+givastar.com: did not receive HSTS header
givemyanswer.com: could not connect to host
giverang.biz: could not connect to host
giverang.com: could not connect to host
@@ -7257,10 +7664,9 @@ gixtools.co.uk: could not connect to host
gixtools.uk: could not connect to host
gizmo.ovh: could not connect to host
gizzo.sk: could not connect to host
-gkimanyar.org: did not receive HSTS header
+gkimanyar.org: could not connect to host
glabiatoren-kst.de: could not connect to host
gladystudio.com: did not receive HSTS header
-glahcks.com: could not connect to host
glaspe.com: could not connect to host
glass.google.com: did not receive HSTS header (error ignored - included regardless)
glasslikes.com: did not receive HSTS header
@@ -7274,7 +7680,7 @@ glicerina.online: could not connect to host
glittersjabloon.nl: did not receive HSTS header
glitzmirror.com: could not connect to host
glnpo.gov: could not connect to host
-global.hr: could not connect to host
+global.hr: did not receive HSTS header
globalado.com: could not connect to host
globalbridge-japan.com: did not receive HSTS header
globalelite.black: did not receive HSTS header
@@ -7295,6 +7701,7 @@ globalvisions-events.com: could not connect to host
globeinform.com: did not receive HSTS header
globuli-info.de: could not connect to host
gloomyspark.com: could not connect to host
+glossopnorthendafc.co.uk: could not connect to host
glotter.com: did not receive HSTS header
gloucesterphotographer.com: did not receive HSTS header
glubbforum.de: did not receive HSTS header
@@ -7308,20 +7715,22 @@ gmat.ovh: could not connect to host
gmoes.at: did not receive HSTS header
gmplab.com: did not receive HSTS header
gnaptracker.tk: could not connect to host
+gnhub.org: could not connect to host
gnom.me: could not connect to host
gnosticjade.net: did not receive HSTS header
+gnuplus.me: could not connect to host
gnylf.com: could not connect to host
go.ax: did not receive HSTS header
go2sh.de: did not receive HSTS header
go4it.solutions: did not receive HSTS header
-goabonga.com: could not connect to host
-goalsetup.com: did not receive HSTS header
+goabonga.com: did not receive HSTS header
+goalsetup.com: could not connect to host
goaltree.ch: did not receive HSTS header
-goapunks.net: did not receive HSTS header
+goapunks.net: could not connect to host
goat.chat: did not receive HSTS header
goat.xyz: could not connect to host
goben.ch: could not connect to host
-goblins.net: did not receive HSTS header
+goblins.net: could not connect to host
goblinsatwork.com: could not connect to host
goblintears.com: could not connect to host
gocardless.com: did not receive HSTS header
@@ -7332,24 +7741,27 @@ godbo9.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR
godesb.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
godofnea.com: could not connect to host
godrealms.com: could not connect to host
+godrive.ga: could not connect to host
godruoyi.com: did not receive HSTS header
goedeke.ml: could not connect to host
goerner.me: did not receive HSTS header
-goesta-hallenbau.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+goesta-hallenbau.de: did not receive HSTS header
goge.site: could not connect to host
gogenenglish.com: could not connect to host
gogetssl.com: did not receive HSTS header
goggs.eu: could not connect to host
gogold-g.com: could not connect to host
+gogonano.com: did not receive HSTS header
goguel.org: did not receive HSTS header
goiaspropaganda.com.br: could not connect to host
gold24.in: could not connect to host
goldclubcasino.com: could not connect to host
goldendata.io: could not connect to host
+goldeneggs.club: did not receive HSTS header
goldfelt.com: could not connect to host
goldminer.ga: could not connect to host
goldpros.com: did not receive HSTS header
-goldsky.com.au: did not receive HSTS header
+goldsky.com.au: could not connect to host
goldwater.gov: could not connect to host
goldwaterfoundation.gov: could not connect to host
goldwaterscholarship.gov: could not connect to host
@@ -7363,6 +7775,7 @@ gonzalesca.gov: did not receive HSTS header
gonzalosanchez.mx: did not receive HSTS header
gooddomainna.me: could not connect to host
goodeats.nyc: could not connect to host
+goodenough.nz: did not receive HSTS header
goodfeels.net: could not connect to host
goodfurday.ca: could not connect to host
goodmengroup.de: did not receive HSTS header
@@ -7374,10 +7787,13 @@ goodwin43.ru: could not connect to host
goodyearsotn.co.uk: could not connect to host
google: could not connect to host (error ignored - included regardless)
google.ax: could not connect to host
+googlehosts.org: could not connect to host
googlemail.com: did not receive HSTS header (error ignored - included regardless)
googleplex.com: did not receive HSTS header (error ignored - included regardless)
goolok.com: could not connect to host
+goontopia.com: could not connect to host
gootax.pro: did not receive HSTS header
+gootlijsten.nl: did not receive HSTS header
goozz.nl: did not receive HSTS header
gopay.cz: did not receive HSTS header
gopokego.cz: could not connect to host
@@ -7386,25 +7802,26 @@ gorgiaxx.com: could not connect to host
gorilla-gym.site: could not connect to host
gorillow.com: could not connect to host
gorognyelv.hu: could not connect to host
+gorschenin.com: could not connect to host
gosharewood.com: did not receive HSTS header
goshop.cz: did not receive HSTS header
goshow.tv: could not connect to host
+gostargazing.co.uk: did not receive HSTS header
gostream.asia: could not connect to host
gotgenes.com: could not connect to host
goto.google.com: did not receive HSTS header (error ignored - included regardless)
gotobrno.cz: did not receive HSTS header
gotocloud.ru: could not connect to host
-gotowned.org: could not connect to host
gotspot.com: could not connect to host
gottfriedfeyen.com: did not receive HSTS header
-goubi.me: did not receive HSTS header
+goubi.me: could not connect to host
goujianwen.com: did not receive HSTS header
goukon.ru: could not connect to host
gourmettia.com: did not receive HSTS header
gouthro-goteborg.se: did not receive HSTS header
gouv.ovh: did not receive HSTS header
gov.ax: could not connect to host
-goverage.org: could not connect to host
+goverage.org: did not receive HSTS header
govillemo.ca: did not receive HSTS header
gowin9.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
gowin9.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -7432,6 +7849,7 @@ gradenotify.com: could not connect to host
grads360.org: could not connect to host
gradsm-ci.net: could not connect to host
grafitec.ru: did not receive HSTS header
+grafmurr.de: could not connect to host
graftworld.pw: could not connect to host
grahamofthewheels.com: did not receive HSTS header
grana.com: did not receive HSTS header
@@ -7439,7 +7857,6 @@ grandchamproofing.com: did not receive HSTS header
grandlinecsk.ru: did not receive HSTS header
grandmascookieblog.com: could not connect to host
grandmasfridge.org: did not receive HSTS header
-grandwailea.com: did not receive HSTS header
granian.pro: could not connect to host
grantedby.me: max-age too low: 0
granth.io: could not connect to host
@@ -7449,6 +7866,7 @@ graphire.io: could not connect to host
graphite.org.uk: could not connect to host
graphsearchengine.com: could not connect to host
gratis-app.com: did not receive HSTS header
+gratis-lovecheck.de: did not receive HSTS header
gratisonlinesex.com: could not connect to host
gravitation.pro: could not connect to host
gravito.nl: did not receive HSTS header
@@ -7463,11 +7881,8 @@ greatideahub.com: did not receive HSTS header
greatlengthshairextensionssalon.com: did not receive HSTS header
greatnet.de: did not receive HSTS header
greatsong.net: max-age too low: 2592000
+greditsoft.com: did not receive HSTS header
greedbutt.com: max-age too low: 2592000
-green-light.cf: could not connect to host
-green-light.ga: could not connect to host
-green-light.gq: could not connect to host
-green-light.ml: could not connect to host
greenbaysecuritysolutions.com: did not receive HSTS header
greencardtalent.com: could not connect to host
greenconn.ca: could not connect to host
@@ -7478,7 +7893,7 @@ greenesting.com: could not connect to host
greenglam.biz: did not receive HSTS header
greengoblindev.com: could not connect to host
greengov.gov: could not connect to host
-greenhillantiques.co.uk: did not receive HSTS header
+greenhillantiques.co.uk: could not connect to host
greenitpark.net: did not receive HSTS header
greensolid.biz: could not connect to host
greenville.ag: did not receive HSTS header
@@ -7487,10 +7902,14 @@ greenvpn.ltd: could not connect to host
greenvpn.pro: did not receive HSTS header
greggsfoundation.org.uk: could not connect to host
gregmartyn.com: could not connect to host
+gregmarziomedia-dev.com: did not receive HSTS header
+gregmarziomedia.co.za: could not connect to host
+gregmarziomedia.com: did not receive HSTS header
gregmilton.org: could not connect to host
gregorytlee.me: could not connect to host
grekland.guide: could not connect to host
gremots.com: could not connect to host
+grengine.ch: could not connect to host
greplin.com: could not connect to host
gresb.com: did not receive HSTS header
gretchelizartistry.com: did not receive HSTS header
@@ -7498,11 +7917,11 @@ grettogeek.com: did not receive HSTS header
greuel.online: could not connect to host
greve.xyz: could not connect to host
grevesgarten.de: could not connect to host
+greyhash.se: could not connect to host
greyline.se: could not connect to host
grian-bam.at: did not receive HSTS header
gribani.com: could not connect to host
grid2osm.org: could not connect to host
-gridle.io: did not receive HSTS header
griecopelino.com: did not receive HSTS header
grifomarchetti.com: did not receive HSTS header
grigalanzsoftware.com: could not connect to host
@@ -7511,6 +7930,7 @@ gripnijmegen.rip: could not connect to host
gripopgriep.net: could not connect to host
gritte.net: could not connect to host
griyo.online: could not connect to host
+grizzlys.com: could not connect to host
groben-itsolutions.de: could not connect to host
groenders.nl: did not receive HSTS header
groenewoud.run: could not connect to host
@@ -7545,7 +7965,8 @@ gsnort.com: did not receive HSTS header
gtalife.net: did not receive HSTS header
gtamodshop.org: could not connect to host
gtanda.tk: could not connect to host
-gtdgo.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+gtchipsi.org: did not receive HSTS header
+gtcprojects.com: could not connect to host
gtech.work: did not receive HSTS header
gtldna.com: could not connect to host
gtraxapp.com: could not connect to host
@@ -7554,6 +7975,7 @@ gts-schulsoftware.de: did not receive HSTS header
gtts.space: did not receive HSTS header
guarajubaimoveis.com.br: did not receive HSTS header
guava.studio: did not receive HSTS header
+guchengf.me: max-age too low: 0
gudangpangan.id: could not connect to host
gudrun.ml: could not connect to host
guelphhydropool.com: could not connect to host
@@ -7563,11 +7985,13 @@ gufen.ga: could not connect to host
guffrits.com: could not connect to host
gugaltika-ipb.org: could not connect to host
guge.gq: could not connect to host
+gugert.net: could not connect to host
gugga.dk: could not connect to host
guguke.net: did not receive HSTS header
guidechecking.com: could not connect to host
guides-et-admin.com: did not receive HSTS header
guidesetc.com: did not receive HSTS header
+guildbase.de: did not receive HSTS header
guilde-vindicta.fr: could not connect to host
guildgearscore.cf: could not connect to host
guillaume-leduc.fr: did not receive HSTS header
@@ -7581,7 +8005,6 @@ gulenet.com: could not connect to host
gulfcoast-sandbox.com: could not connect to host
gulitsky.me: could not connect to host
gulleyperformancecenter.com: did not receive HSTS header
-gulshankumar.net: did not receive HSTS header
gumannp.de: did not receive HSTS header
gumballs.com: did not receive HSTS header
gummibande.noip.me: could not connect to host
@@ -7591,6 +8014,7 @@ gunnarhafdal.com: did not receive HSTS header
gunnaro.com: did not receive HSTS header
guntbert.net: could not connect to host
guoqiang.info: did not receive HSTS header
+guphi.net: did not receive HSTS header
gurochan.ch: could not connect to host
gurom.lv: could not connect to host
gurubetng.com: did not receive HSTS header
@@ -7601,8 +8025,10 @@ guso.gq: could not connect to host
guso.ml: could not connect to host
guso.site: could not connect to host
guso.tech: could not connect to host
-gussi.is: did not receive HSTS header
+gussi.is: could not connect to host
+gustiaux.com: did not receive HSTS header
guthabenkarten-billiger.de: could not connect to host
+gutuia.blue: could not connect to host
guvernalternativa.ro: could not connect to host
guyot-tech.com: did not receive HSTS header
gvchannel.xyz: could not connect to host
@@ -7618,11 +8044,13 @@ gwijaya.com: could not connect to host
gwtest.us: could not connect to host
gxgx.org: could not connect to host
gxlrx.net: could not connect to host
+gyakori.com: could not connect to host
gyboche.com: could not connect to host
gyboche.science: could not connect to host
gycis.me: did not receive HSTS header
gylauto.fr: could not connect to host
-gypsycatdreams.com: could not connect to host
+gymnasium-farmsen.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+gypsycatdreams.com: did not receive HSTS header
gypthecat.com: did not receive HSTS header
gyz.io: did not receive HSTS header
gzitech.com: could not connect to host
@@ -7643,15 +8071,13 @@ habeo.si: could not connect to host
hablemosdetecnologia.com.ve: could not connect to host
habtium.com: could not connect to host
hac30.com: could not connect to host
-hack.club: could not connect to host
-hack.cz: could not connect to host
+hack.cz: did not receive HSTS header
hack.li: could not connect to host
hackbubble.me: could not connect to host
-hacker.club: could not connect to host
hacker.deals: could not connect to host
hacker8.cn: could not connect to host
hackercat.ninja: max-age too low: 2592000
-hackerco.com: did not receive HSTS header
+hackerco.com: could not connect to host
hackerforever.com: did not receive HSTS header
hackerlite.xyz: max-age too low: 0
hackerone-ext-adroll.com: could not connect to host
@@ -7664,13 +8090,13 @@ hackit.im: could not connect to host
hackmeplz.com: could not connect to host
hackroyale.xyz: could not connect to host
hacksnack.io: could not connect to host
+hacktic.info: could not connect to host
hackyourfaceoff.com: could not connect to host
hackzogtum-coburg.de: did not receive HSTS header
-hadaf.pro: could not connect to host
+hadaf.pro: max-age too low: 300
hadret.com: did not receive HSTS header
hadret.sh: could not connect to host
hadzic.co: could not connect to host
-haeckdesign.com: did not receive HSTS header
haeckl.eu: did not receive HSTS header
haehnlein.at: could not connect to host
haemmerle.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -7690,22 +8116,28 @@ haktec.de: did not receive HSTS header
haku.moe: could not connect to host
hakugin.me: could not connect to host
hakugin.org: could not connect to host
-hakurei.moe: could not connect to host
+hakurei.moe: did not receive HSTS header
hal-9th.space: could not connect to host
+halbich.design: could not connect to host
halcyonsbastion.com: could not connect to host
half-logic.eu.org: could not connect to host
+halfco.de: could not connect to host
halfwaythere.eu: could not connect to host
+halkyon.net: could not connect to host
halledesprix.fr: did not receive HSTS header
+halletienne.fr: could not connect to host
halloweenthings.website: could not connect to host
+hallumlaw.com: did not receive HSTS header
halo.red: could not connect to host
+halongbaybackpackertour.com: could not connect to host
halta.info: did not receive HSTS header
-halyul.cc: did not receive HSTS header
-halyul.com: did not receive HSTS header
+halyul.cc: could not connect to host
haman.nl: could not connect to host
hamish.ca: did not receive HSTS header
hamking.tk: could not connect to host
hammamsayad.com: could not connect to host
hammer-corp.com: did not receive HSTS header
+hammer-schnaps.com: did not receive HSTS header
hamon.cc: did not receive HSTS header
hamu.blue: could not connect to host
hancatemc.com: did not receive HSTS header
@@ -7714,19 +8146,19 @@ handenafvanhetmedischdossier.nl: could not connect to host
handicapindeles.nl: did not receive HSTS header
handinhandfoundation.org.uk: did not receive HSTS header
handiworker.com: could not connect to host
-handmadegobelin.com: did not receive HSTS header
-handmadeshoes.pe: did not receive HSTS header
+handmadegobelin.com: could not connect to host
+handmadeshoes.pe: could not connect to host
handmadetutorials.ro: could not connect to host
handsandall.com: did not receive HSTS header
handyglas.com: could not connect to host
-handynummer.online: did not receive HSTS header
-hanfu.la: could not connect to host
-hang333.moe: could not connect to host
+hanfu.la: did not receive HSTS header
+hanfverband-erfurt.de: could not connect to host
hang333.pw: could not connect to host
hangar18-modelismo.com.br: could not connect to host
hanimalis.fr: could not connect to host
hanksservice.com: could not connect to host
hannes-speelgoedencadeautjes.nl: did not receive HSTS header
+hanoibuffet.com: could not connect to host
hans-natur.de: did not receive HSTS header
hansch.ventures: could not connect to host
hanxv.pw: did not receive HSTS header
@@ -7741,7 +8173,9 @@ haobo5555.com: could not connect to host
haobo6666.com: could not connect to host
haobo7777.com: could not connect to host
haomwei.com: could not connect to host
+haotown.cn: did not receive HSTS header
haoyugao.com: could not connect to host
+haozijing.com: could not connect to host
hapissl.com: could not connect to host
hapivm.com: could not connect to host
happist.com: did not receive HSTS header
@@ -7752,8 +8186,7 @@ happyheartsabode.com: did not receive HSTS header
happytiger.eu: could not connect to host
hapsfordmill.co.uk: could not connect to host
hapvm.com: could not connect to host
-haqaza.com.br: did not receive HSTS header
-harald-pfeiffer.de: could not connect to host
+haqaza.com.br: could not connect to host
harambe.site: could not connect to host
harbourweb.net: did not receive HSTS header
hardline.xyz: could not connect to host
@@ -7766,15 +8199,13 @@ harlentimberproducts.co.uk: did not receive HSTS header
harmonycosmetic.com: max-age too low: 300
harrisonsdirect.co.uk: did not receive HSTS header
harristony.com: could not connect to host
-harry-baker.com: could not connect to host
harryharrison.co: did not receive HSTS header
harrypottereditor.com: could not connect to host
harrypottereditor.net: could not connect to host
-harschnitz.nl: did not receive HSTS header
hartlep.eu: could not connect to host
hartmancpa.com: did not receive HSTS header
harvestrenewal.org: did not receive HSTS header
-harveymilton.com: max-age too low: 0
+harveymilton.com: did not receive HSTS header
harz.cloud: could not connect to host
has.vision: could not connect to host
hasabig.wang: could not connect to host
@@ -7796,6 +8227,8 @@ haurumcraft.net: could not connect to host
hausarzt-stader-str.de: did not receive HSTS header
hauswarteam.com: could not connect to host
hav.com: could not connect to host
+havarijna-sluzba-bratislava.sk: did not receive HSTS header
+havasuhomepage.com: did not receive HSTS header
haveeruexaminer.com: could not connect to host
haven-staging.cloud: could not connect to host
haven.cloud: did not receive HSTS header
@@ -7805,16 +8238,18 @@ hawk-la.com: could not connect to host
hawthornharpist.com: could not connect to host
haxoff.com: did not receive HSTS header
haxon.me: could not connect to host
-haxx.hu: did not receive HSTS header
+haxx.hu: could not connect to host
+hayden.one: did not receive HSTS header
haydenhill.us: could not connect to host
+haydentomas.com: did not receive HSTS header
hayleishop.fr: did not receive HSTS header
hayzepvp.us: did not receive HSTS header
hazcod.com: could not connect to host
haze-productions.com: could not connect to host
-haze.network: did not receive HSTS header
+haze.network: could not connect to host
haze.sucks: could not connect to host
hazeltime.com: could not connect to host
-hazeltime.se: did not receive HSTS header
+hazeltime.se: could not connect to host
hazyrom.net: could not connect to host
hb1111.com: could not connect to host
hb3333.com: could not connect to host
@@ -7835,7 +8270,8 @@ hcoe.fi: did not receive HSTS header
hcr.io: did not receive HSTS header
hcs-company.com: did not receive HSTS header
hcs-company.nl: could not connect to host
-hcstr.com: did not receive HSTS header
+hcstr.com: could not connect to host
+hd1tj.org: did not receive HSTS header
hda.me: did not receive HSTS header
hdm.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
hdrboundless.com: could not connect to host
@@ -7849,22 +8285,26 @@ hdy.nz: could not connect to host
head-shop.lt: could not connect to host
head-shop.lv: could not connect to host
headmates.xyz: could not connect to host
+healey.io: max-age too low: 2592000
+health-and-beauty-news.net: could not connect to host
health-match.com.au: could not connect to host
-health.gov: could not connect to host
healthcare6.com: did not receive HSTS header
-healthfinder.gov: could not connect to host
+healthiercompany.com: did not receive HSTS header
healthjoy.com: did not receive HSTS header
healthlabs.com: did not receive HSTS header
healthmatchapp.com: could not connect to host
healthyandnaturalliving.com: could not connect to host
healthycod.in: could not connect to host
+healthyfitfood.com: could not connect to host
healtious.com: could not connect to host
hearingshofar.com: could not connect to host
heart.ge: could not connect to host
heartlandrentals.com: did not receive HSTS header
+heartsucker.com: could not connect to host
hearty.cf: did not receive HSTS header
hearty.ink: could not connect to host
hearty.space: could not connect to host
+hearty.taipei: could not connect to host
hearty.tech: could not connect to host
hearty.us: could not connect to host
heartyapp.com: could not connect to host
@@ -7875,6 +8315,7 @@ heavenlysmokenc.com: could not connect to host
heavystresser.com: could not connect to host
heayao.com: could not connect to host
hebaus.com: could not connect to host
+hebergeurssd.com: could not connect to host
heberut.gov: did not receive HSTS header
hebriff.com: could not connect to host
hechamano.es: did not receive HSTS header
@@ -7884,25 +8325,25 @@ heeler.blue: could not connect to host
heeler.red: could not connect to host
heidilein.info: did not receive HSTS header
heimnetze.org: could not connect to host
-hejahanif.se: could not connect to host
hejsupport.se: could not connect to host
hekeki.com: could not connect to host
hele.cz: could not connect to host
helencrump.co.uk: did not receive HSTS header
helgakristoffer.com: could not connect to host
helgakristoffer.wedding: could not connect to host
+helgaschultz.de: could not connect to host
helicaldash.com: could not connect to host
helixflight.com: did not receive HSTS header
hellenicaward.com: did not receive HSTS header
-hellerup.net: could not connect to host
+hellerup.net: did not receive HSTS header
hello-nestor.com: did not receive HSTS header
-helloanselm.com: did not receive HSTS header
+helloanselm.com: max-age too low: 172800
hellofilters.com: could not connect to host
-hellomouse.cf: did not receive HSTS header
hellomouse.tk: could not connect to host
hellotandem.com: could not connect to host
hellothought.net: could not connect to host
hellscanyonraft.com: did not receive HSTS header
+helmut-a-binser.de: did not receive HSTS header
helpadmin.net: could not connect to host
helpantiaging.com: could not connect to host
helpdebit.com: did not receive HSTS header
@@ -7912,23 +8353,28 @@ helpfixe.com: did not receive HSTS header
helpflux.com: did not receive HSTS header
helpfute.com: did not receive HSTS header
helpgerer.com: did not receive HSTS header
+helpgoabroad.com: did not receive HSTS header
helpium.de: did not receive HSTS header
helpmebuild.com: did not receive HSTS header
+helpmij.cf: could not connect to host
helppresta.com: did not receive HSTS header
+helprocleaningservices.com: did not receive HSTS header
+helptasker.org: did not receive HSTS header
helpverif.com: did not receive HSTS header
helsingfors.guide: could not connect to host
helup.com: did not receive HSTS header
hemlockhillscabinrentals.com: did not receive HSTS header
hencagon.com: could not connect to host
-hendersonrealestatepros.com: did not receive HSTS header
hendyisaac.com: did not receive HSTS header
henhenlu.com: could not connect to host
henkbrink.com: did not receive HSTS header
+hennadesigns.org: did not receive HSTS header
henningkerstan.org: did not receive HSTS header
henriknoerr.com: could not connect to host
henrock.net: could not connect to host
hentai.design: did not receive HSTS header
hentaimaster.net: could not connect to host
+hentaiworld.cc: could not connect to host
hentaiz.net: could not connect to host
hepteract.us: could not connect to host
heptner24.de: could not connect to host
@@ -7937,7 +8383,7 @@ herbal-id.com: did not receive HSTS header
herbandpat.org: could not connect to host
herbertmouwen.nl: could not connect to host
here.ml: could not connect to host
-here4funpartysolutions.ie: could not connect to host
+here4funpartysolutions.ie: did not receive HSTS header
heribe-maruo.com: did not receive HSTS header
heritagedentistry.ca: did not receive HSTS header
hermann.in: could not connect to host
@@ -7946,9 +8392,9 @@ hermes.cat: could not connect to host
heroin.org.uk: could not connect to host
herpaderp.net: could not connect to host
herr-webdesign.de: could not connect to host
-herramientasbazarot.com: did not receive HSTS header
herrenfahrt.com: did not receive HSTS header
herrtxbias.org: could not connect to host
+hervespanneut.com: did not receive HSTS header
hetmeisjeachterpauw.nl: could not connect to host
hetmer.com: did not receive HSTS header
hetmer.net: did not receive HSTS header
@@ -7959,7 +8405,7 @@ hex.bz: could not connect to host
hex2013.com: did not receive HSTS header
hexacon.io: could not connect to host
hexadecimal.tech: could not connect to host
-hexe.net: could not connect to host
+hexe.net: did not receive HSTS header
hexhu.com: could not connect to host
hexieshe.com: could not connect to host
hexobind.com: could not connect to host
@@ -7985,6 +8431,7 @@ hiddenprocess.com: did not receive HSTS header
hiddenrefuge.eu.org: could not connect to host
hidedd.com: could not connect to host
hideftv.deals: could not connect to host
+hideo54.com: could not connect to host
hideout.agency: could not connect to host
hidrofire.com: did not receive HSTS header
hiexmerida-mailing.com: could not connect to host
@@ -7992,7 +8439,6 @@ hig.gov: could not connect to host
highgrove.org.uk: could not connect to host
highland-webcams.com: could not connect to host
highlandparkcog.org: did not receive HSTS header
-highlatitudestravel.com: did not receive HSTS header
highperformancehvac.com: did not receive HSTS header
highseer.com: did not receive HSTS header
highspeedinternetservices.ca: did not receive HSTS header
@@ -8017,6 +8463,7 @@ hillcity.org.nz: did not receive HSTS header
hillebrand.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
hilnu.tk: could not connect to host
hiltonhyland.com: did not receive HSTS header
+himens.com: did not receive HSTS header
hindmanfuneralhomes.com: did not receive HSTS header
hingle.me: could not connect to host
hinkel-sohn.de: did not receive HSTS header
@@ -8029,19 +8476,21 @@ hiphopconvention.nl: could not connect to host
hipi.jp: could not connect to host
hipnoseinstitute.org: did not receive HSTS header
hiqfleet.co.uk: did not receive HSTS header
-hiraku.me: could not connect to host
+hiraku.me: did not receive HSTS header
hirefitness.co.uk: did not receive HSTS header
hireprofs.com: could not connect to host
hiresuccessstaffing.com: did not receive HSTS header
hiretech.com: did not receive HSTS header
hirevets.gov: did not receive HSTS header
-hirokilog.com: could not connect to host
+hirokilog.com: did not receive HSTS header
hirte-digital.de: did not receive HSTS header
hisingenrunt.se: did not receive HSTS header
+histocamp.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
histoire-theatre.com: did not receive HSTS header
history.pe: could not connect to host
hitchunion.org: could not connect to host
hitoy.org: could not connect to host
+hitrek.ml: could not connect to host
hittipps.com: could not connect to host
hivatal-info.hu: could not connect to host
hj2999.com: did not receive HSTS header
@@ -8049,8 +8498,8 @@ hjes.com.ve: could not connect to host
hjf-immobilien.de: did not receive HSTS header
hjkhs.cn: did not receive HSTS header
hknet.at: did not receive HSTS header
+hl7999.com: did not receive HSTS header
hlacosedora.com: max-age too low: 7889238
-hloe0xff.ru: could not connect to host
hlpublicidad.com: could not connect to host
hlyue.com: did not receive HSTS header
hm1ch.com: could not connect to host
@@ -8076,9 +8525,11 @@ hohm.in: could not connect to host
hoiku-map.tokyo: could not connect to host
hoiku-navi.com: did not receive HSTS header
hokepon.com: did not receive HSTS header
+hokieprivacy.org: did not receive HSTS header
hokify.at: did not receive HSTS header
hokify.ch: did not receive HSTS header
hokify.de: did not receive HSTS header
+holad.de: did not receive HSTS header
holgerlehner.com: could not connect to host
holidayincotswolds.co.uk: could not connect to host
holifestival-freyung.de: could not connect to host
@@ -8098,11 +8549,13 @@ home-insurance-quotes.tk: could not connect to host
home-v.ind.in: could not connect to host
home-work-jobs.com: could not connect to host
homeandyarddetailing.com: could not connect to host
-homecarpetcleaning.co.uk: could not connect to host
+homeautomated.com: could not connect to host
+homecarpetcleaning.co.uk: did not receive HSTS header
homeclouding.de: could not connect to host
homecoming.city: could not connect to host
homedna.com: did not receive HSTS header
homeexx.com: did not receive HSTS header
+homehuntertoronto.com: could not connect to host
homehunting.pt: did not receive HSTS header
homeoesp.org: did not receive HSTS header
homeownersassociationmanagementla.com: could not connect to host
@@ -8113,6 +8566,7 @@ homesfordinner.ca: did not receive HSTS header
homeyantra.com: did not receive HSTS header
homezhi.com.tw: could not connect to host
homoglyph.net: could not connect to host
+homyremedies.com: could not connect to host
honeybeard.co.uk: did not receive HSTS header
honeytracks.com: could not connect to host
hongyd.online: could not connect to host
@@ -8127,18 +8581,22 @@ hoodiecrow.com: could not connect to host
hoodoo.io: could not connect to host
hoodoo.tech: could not connect to host
hookandloom.com: did not receive HSTS header
+hoooc.com: did not receive HSTS header
hoopsacademyusa.com: could not connect to host
+hopemeet.info: could not connect to host
hopesb.org: did not receive HSTS header
hopewellproperties.co.uk: did not receive HSTS header
hopglass.eu: could not connect to host
hopglass.net: could not connect to host
horace.li: did not receive HSTS header
horisonttimedia.fi: did not receive HSTS header
+horizonlawncare.tk: could not connect to host
horizonmoto.fr: did not receive HSTS header
+horizonresourcesinc.com: could not connect to host
horkel.cf: could not connect to host
horning.co: did not receive HSTS header
+hornyforhanzo.com: could not connect to host
horosho.in: could not connect to host
-horrendous-servers.com: could not connect to host
horrorserv.com: could not connect to host
horseboners.xxx: could not connect to host
hortifarm.ro: did not receive HSTS header
@@ -8146,7 +8604,7 @@ horvathtom.com: could not connect to host
horvatnyelvkonyv.hu: could not connect to host
host.black: could not connect to host
hostam.link: could not connect to host
-hostcoz.com: did not receive HSTS header
+hostcoz.com: could not connect to host
hosted-oswa.org: did not receive HSTS header
hostedbgp.net: did not receive HSTS header
hostedtalkgadget.google.com: did not receive HSTS header (error ignored - included regardless)
@@ -8157,6 +8615,7 @@ hostinaus.com.au: did not receive HSTS header
hostingfirst.nl: could not connect to host
hostingfj.com: could not connect to host
hostisan.com: could not connect to host
+hostma.ma: could not connect to host
hostserv.org: could not connect to host
hosyaku.gr.jp: did not receive HSTS header
hot-spa.ch: did not receive HSTS header
@@ -8164,7 +8623,6 @@ hotartup.com: could not connect to host
hotchillibox.co.za: could not connect to host
hotchoc.io: could not connect to host
hotel-huberhof.at: did not receive HSTS header
-hotel-tongruben.de: max-age too low: 0
hotelaustria-wien.at: did not receive HSTS header
hotello.io: could not connect to host
hotelmadhuwanvihar.com: could not connect to host
@@ -8202,6 +8660,7 @@ hppub.org: could not connect to host
hppub.site: could not connect to host
hqhost.net: did not receive HSTS header
hqq.tv: could not connect to host
+hqy.moe: did not receive HSTS header
hr-intranet.com: could not connect to host
hr-tech.store: could not connect to host
hr98.tk: could not connect to host
@@ -8213,7 +8672,6 @@ hrk.io: could not connect to host
hrtech.store: could not connect to host
hrtraining.com.au: did not receive HSTS header
hru.gov: could not connect to host
-hschen.top: could not connect to host
hserver.top: could not connect to host
hsex.tv: did not receive HSTS header
hsir.me: could not connect to host
@@ -8237,8 +8695,9 @@ hua-in.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR
hua-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
hua-li88.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
hua-li88.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-huang-haitao.com: could not connect to host
+huang-haitao.com: did not receive HSTS header
huangguancq.com: could not connect to host
+huangliangbo.com: did not receive HSTS header
huangting.me: did not receive HSTS header
huangzenghao.com: could not connect to host
huarongdao.com: did not receive HSTS header
@@ -8249,6 +8708,7 @@ hubrecht.at: could not connect to host
hubrick.com: could not connect to host
hudhaifahgoga.co.za: could not connect to host
hudingyuan.cn: could not connect to host
+hugizrecords.com: did not receive HSTS header
hugocollignon.fr: could not connect to host
hui-in.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
hui-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -8266,19 +8726,19 @@ humortuga.pt: did not receive HSTS header
hump.dk: could not connect to host
humpi.at: could not connect to host
humpteedumptee.in: did not receive HSTS header
-huniverse.co: could not connect to host
hunqz.com: could not connect to host
hunterjohnson.io: could not connect to host
huodongweb.com: could not connect to host
-huoduan.com: did not receive HSTS header
huongquynh.com: could not connect to host
-hup.blue: could not connect to host
+hup.blue: did not receive HSTS header
+hupp.se: could not connect to host
hurleyhomestead.com: could not connect to host
hurricanelabs.com: did not receive HSTS header
huskybutt.dog: could not connect to host
huskyduvercors.com: did not receive HSTS header
hustle.com: did not receive HSTS header
hustle.life: did not receive HSTS header
+huto.ml: could not connect to host
huwjones.me: could not connect to host
huzu.com: did not receive HSTS header
huzurmetal.net: could not connect to host
@@ -8293,12 +8753,12 @@ hybridklubben.fi: could not connect to host
hybridragon.net: could not connect to host
hybula.nl: could not connect to host
hydai.co: could not connect to host
-hydra.ws: could not connect to host
+hydra.ws: did not receive HSTS header
hydra.zone: could not connect to host
hydrabit.nl: did not receive HSTS header
hydrante.ch: could not connect to host
hydrocloud.net: could not connect to host
-hydrodipcenter.nl: could not connect to host
+hydrodipcenter.nl: did not receive HSTS header
hydronium.cf: could not connect to host
hydronium.ga: could not connect to host
hydronium.me: could not connect to host
@@ -8318,22 +8778,24 @@ hypnoresults.com.au: did not receive HSTS header
hypnos.hu: did not receive HSTS header
hypotheques24.ch: could not connect to host
hysg.me: could not connect to host
-hytzongxuan.com: did not receive HSTS header
hyvive.com: could not connect to host
hzh.pub: did not receive HSTS header
i-jp.net: could not connect to host
+i-meto.com: did not receive HSTS header
i-partners.sk: could not connect to host
i-rickroll-n.pw: could not connect to host
+i-scream.space: could not connect to host
i-stats.net: could not connect to host
i10z.com: could not connect to host
i28s.com: did not receive HSTS header
i496.eu: could not connect to host
i4m1k0su.com: could not connect to host
-i95.me: did not receive HSTS header
-i9multiequipamentos.com.br: did not receive HSTS header
+i66.me: could not connect to host
+i9multiequipamentos.com.br: could not connect to host
ia1000.com: could not connect to host
iadttaveras.com: could not connect to host
iain.tech: did not receive HSTS header
+iamcarrico.com: did not receive HSTS header
iamlbk.com: could not connect to host
iamlizu.com: did not receive HSTS header
iamlzh.com: did not receive HSTS header
@@ -8377,15 +8839,12 @@ icewoman.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERR
icfl.com.br: could not connect to host
ich-find-den-g.net: could not connect to host
ich-mach-druck.eu: did not receive HSTS header
-ichasco.com: did not receive HSTS header
ichnichtskaufmann.de: could not connect to host
ichoosebtec.com: did not receive HSTS header
ichronos.net: did not receive HSTS header
icity.ly: did not receive HSTS header
ickerseashop.com: could not connect to host
icloud.net: could not connect to host
-icmshoptrend.com: did not receive HSTS header
-icnsoft.ga: did not receive HSTS header
icnsoft.me: could not connect to host
icnsoft.org: could not connect to host
icntorrent.download: could not connect to host
@@ -8399,13 +8858,15 @@ icusignature.com: could not connect to host
icys2017.com: did not receive HSTS header
id-co.in: could not connect to host
id-conf.com: did not receive HSTS header
-idblab.tk: could not connect to host
+idaeus.eu: could not connect to host
+idafauziyah.com: did not receive HSTS header
+idblab.tk: did not receive HSTS header
idc.yn.cn: could not connect to host
idcrane.com: could not connect to host
iddconnect.com: could not connect to host
iddconnect.org: could not connect to host
ideadozz.hu: could not connect to host
-ideal-envelopes.co.uk: did not receive HSTS header
+idealinflatablehire.co.uk: did not receive HSTS header
idealmoto.com: did not receive HSTS header
idealmykonos.com: did not receive HSTS header
idealvenir.com: did not receive HSTS header
@@ -8425,28 +8886,34 @@ idiopolis.org: did not receive HSTS header
idisplay.es: could not connect to host
idlekernel.com: could not connect to host
idol-bikes.ru: could not connect to host
+idolshop.dk: could not connect to host
+idolshop.me: could not connect to host
idontexist.me: could not connect to host
idsafe.co.za: could not connect to host
idsoccer.com: did not receive HSTS header
-idvl.de: could not connect to host
+idyl.fr: did not receive HSTS header
iec.pe: could not connect to host
+ieedes.com: did not receive HSTS header
iemas.azurewebsites.net: did not receive HSTS header
iemb.cf: could not connect to host
ierna.com: did not receive HSTS header
ies.id.lv: could not connect to host
ietsdoenofferte.nl: did not receive HSTS header
ievgenialehner.com: did not receive HSTS header
+iewar.com: could not connect to host
iexpert9.com: did not receive HSTS header
if0.ru: could not connect to host
ifad.org: did not receive HSTS header
ifamily.top: did not receive HSTS header
ifan.ch: could not connect to host
ifastuniversity.com: did not receive HSTS header
+ifcfg.jp: could not connect to host
ifcfg.me: could not connect to host
ifconfig.co: did not receive HSTS header
+ifengge.cn: did not receive HSTS header
+ifengge.me: did not receive HSTS header
ifleurs.com: could not connect to host
ifly.pw: could not connect to host
-ifreetion.cn: did not receive HSTS header
ifroheweihnachten.net: did not receive HSTS header
ifx.ee: could not connect to host
ifxnet.com: could not connect to host
@@ -8456,14 +8923,15 @@ igaryhe.io: did not receive HSTS header
igd.chat: could not connect to host
igforums.com: did not receive HSTS header
igi.codes: could not connect to host
+igiftcards.de: did not receive HSTS header
igiftcards.nl: did not receive HSTS header
ignatisd.gr: did not receive HSTS header
igule.net: could not connect to host
iha6.com: could not connect to host
ihatethissh.it: could not connect to host
-ihc.im: did not receive HSTS header
ihcr.top: did not receive HSTS header
-ihls.xyz: did not receive HSTS header
+iheartmary.org: max-age too low: 604800
+ihls.xyz: could not connect to host
ihongzu.com: could not connect to host
ihrlotto.de: could not connect to host
ihrnationalrat.ch: could not connect to host
@@ -8475,23 +8943,23 @@ iideaz.org: could not connect to host
iilin.com: did not receive HSTS header
iispeed.com: did not receive HSTS header
ijn-dd.nl: could not connect to host
-ijoda.com: could not connect to host
+ijoda.com: did not receive HSTS header
ijr.com: did not receive HSTS header
ike.io: did not receive HSTS header
ikenmeyer.com: could not connect to host
ikenmeyer.eu: could not connect to host
+ikiler.com: could not connect to host
ikocik.sk: could not connect to host
ikon.name: could not connect to host
ikudo.top: could not connect to host
-ikuuuu.com: could not connect to host
ikwilguidobellen.nl: could not connect to host
ikzoekeengoedkopeauto.nl: could not connect to host
ikzoekjeugdhulp.nl: did not receive HSTS header
-ilazycat.com: could not connect to host
ilbuongiorno.it: did not receive HSTS header
ildomani.it: did not receive HSTS header
ileat.com: could not connect to host
ilgi.work: could not connect to host
+iliasdeli.nl: did not receive HSTS header
ilii.me: could not connect to host
ilikerainbows.co: did not receive HSTS header
ilikerainbows.co.uk: could not connect to host
@@ -8511,10 +8979,10 @@ imaginarymakings.me: could not connect to host
imakepoems.net: could not connect to host
imanhearts.com: max-age too low: 0
imanudin.net: did not receive HSTS header
-imaple.org: could not connect to host
imbrian.org: could not connect to host
imed.com.pt: did not receive HSTS header
imed.pt: did not receive HSTS header
+imedes.de: did not receive HSTS header
imedi.it: could not connect to host
imfromthefuture.com: did not receive HSTS header
imgencrypt.com: could not connect to host
@@ -8529,9 +8997,12 @@ imlinan.net: could not connect to host
imlonghao.com: did not receive HSTS header
immanuel60.hu: did not receive HSTS header
immaternity.com: could not connect to host
+immersionwealth.com: could not connect to host
immersivewebportal.com: could not connect to host
+immo-vk.de: did not receive HSTS header
immobiliarecapitani.com: did not receive HSTS header
immobilien-wallat.de: could not connect to host
+immobilier-nice.fr: could not connect to host
immoprotect.ca: did not receive HSTS header
immortals-co.com: did not receive HSTS header
immoverkauf24.at: did not receive HSTS header
@@ -8544,13 +9015,13 @@ immunicity.info: could not connect to host
immunicity.online: could not connect to host
immunicity.press: could not connect to host
immunicity.rocks: could not connect to host
-immunicity.st: could not connect to host
+immunicity.st: did not receive HSTS header
immunicity.today: could not connect to host
immunicity.top: could not connect to host
immunicity.win: could not connect to host
immunicity.works: could not connect to host
immunicity.world: could not connect to host
-imoe.ac.cn: did not receive HSTS header
+imoe.ac.cn: could not connect to host
imolug.org: did not receive HSTS header
imoner.com: could not connect to host
imoner.ga: could not connect to host
@@ -8563,11 +9034,11 @@ imperialwebsolutions.com: did not receive HSTS header
imprenta-es.com: did not receive HSTS header
improvingwp.com: could not connect to host
impulse-clan.de: could not connect to host
+imrejonk.nl: could not connect to host
imu.li: did not receive HSTS header
imusic.dk: did not receive HSTS header
imy.life: did not receive HSTS header
-imydl.com: could not connect to host
-imyjy.cn: could not connect to host
+imydl.com: max-age too low: 2592000
inandeyes.com: did not receive HSTS header
inb4.us: could not connect to host
inbox.li: did not receive HSTS header
@@ -8579,19 +9050,21 @@ inchomatic.com: did not receive HSTS header
increasetestosteronelevels.org: could not connect to host
inderagamono.net: could not connect to host
indesit-training.com: did not receive HSTS header
+index-games.com: could not connect to host
indexyz.me: could not connect to host
+indianapolislocksmithinc.com: did not receive HSTS header
indiawise.co.uk: could not connect to host
indiecert.net: did not receive HSTS header
indieethos.com: did not receive HSTS header
indiemods.com: did not receive HSTS header
indien.guide: could not connect to host
+indigitalagency.com: could not connect to host
indilens.com: did not receive HSTS header
indiraactive.com: could not connect to host
indiroyunu.com: did not receive HSTS header
-indochina.io: could not connect to host
-indogerman.de: did not receive HSTS header
+indogerman.de: could not connect to host
indogermantrade.de: could not connect to host
-indoorplantsexpert.com: could not connect to host
+indoorplantsexpert.com: did not receive HSTS header
indoorskiassen.nl: did not receive HSTS header
indostar303.com: did not receive HSTS header
indredouglas.me: could not connect to host
@@ -8601,13 +9074,13 @@ industreiler.com.br: could not connect to host
industriasrenova.com: could not connect to host
industrybazar.com: did not receive HSTS header
ineed.com.mt: could not connect to host
-inetpub.cn: could not connect to host
inevitavelbrasil.com.br: could not connect to host
inexlog.fr: could not connect to host
inexpensivecomputers.net: could not connect to host
infcof.com: did not receive HSTS header
infilock.com: could not connect to host
infinether.net: could not connect to host
+infinite.hosting: did not receive HSTS header
infinitiofmarinparts.com: could not connect to host
infinitude.me.uk: could not connect to host
infinitude.xyz: could not connect to host
@@ -8617,14 +9090,19 @@ infinity-freedom.com: could not connect to host
infinity-freedom.de: could not connect to host
infinity-lifestyle.de: could not connect to host
infinity.to: could not connect to host
+infinityengine.org: could not connect to host
inflate-a-bubbles.co.uk: did not receive HSTS header
inflation.ml: could not connect to host
+influencerchampions.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
influxus.com: could not connect to host
+infmed.com: could not connect to host
info-bay.com: could not connect to host
info-sys.tk: could not connect to host
infoamin.com: did not receive HSTS header
-infocoin.es: did not receive HSTS header
-infopagina.es: could not connect to host
+infobalkans.com: did not receive HSTS header
+infocity-tech.fr: could not connect to host
+infopagina.es: did not receive HSTS header
+inforaga.com: could not connect to host
inforichjapan.com: did not receive HSTS header
inforisposte.com: did not receive HSTS header
informaticapremium.com: did not receive HSTS header
@@ -8632,27 +9110,28 @@ informatik.zone: could not connect to host
infos-generation.com: did not receive HSTS header
infosec.rip: could not connect to host
infosimmo.com: did not receive HSTS header
-infosoph.org: could not connect to host
+infosoph.org: did not receive HSTS header
infotics.es: did not receive HSTS header
-infovae-idf.com: could not connect to host
+infovae-idf.com: did not receive HSTS header
infoworm.org: could not connect to host
infr.red: did not receive HSTS header
+infra.press: could not connect to host
infradio.am: could not connect to host
infranix.eu: max-age too low: 7360000
-infruction.com: could not connect to host
infura.co.th: could not connect to host
+ing-buero-junk.de: did not receive HSTS header
ing89.cc: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
ing89.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
ingalabs.hu: could not connect to host
ingalls.run: could not connect to host
+ingenium.si: did not receive HSTS header
ingesol.fr: did not receive HSTS header
ingresscode.cn: did not receive HSTS header
inhelix.com: could not connect to host
inhive.group: did not receive HSTS header
-iniiter.com: could not connect to host
+initrd.net: could not connect to host
injapan.nl: could not connect to host
injertoshorticolas.com: did not receive HSTS header
-injigo.com: did not receive HSTS header
injust.cf: could not connect to host
injust.eu.org: could not connect to host
injust.ga: could not connect to host
@@ -8669,6 +9148,7 @@ inku.ovh: did not receive HSTS header
inkvisual.tk: could not connect to host
inleaked.com: could not connect to host
inme.ga: did not receive HSTS header
+inmoodforsex.com: could not connect to host
innerform.com: could not connect to host
innit.be: could not connect to host
innobatics.com: did not receive HSTS header
@@ -8679,8 +9159,9 @@ innovativeideaz.org: could not connect to host
innoventure.de: could not connect to host
inondation.ch: could not connect to host
inorder.website: could not connect to host
+inovat.ma: did not receive HSTS header
inovatec.com: did not receive HSTS header
-inox.io: could not connect to host
+inox.io: did not receive HSTS header
inoxio.com: did not receive HSTS header
inoxio.de: did not receive HSTS header
inplacers.ru: did not receive HSTS header
@@ -8688,54 +9169,66 @@ inquisitive.io: could not connect to host
insane-bullets.com: could not connect to host
insane.zone: could not connect to host
inschrijfformulier.com: could not connect to host
-inscript.pl: did not receive HSTS header
+inscript.pl: could not connect to host
insideofgaming.de: could not connect to host
+insightera.co.th: did not receive HSTS header
insite-feedback.com: could not connect to host
insouciant.org: could not connect to host
+inspirationalquotesuk.co.uk: could not connect to host
inspirationconcepts.nl: did not receive HSTS header
inspire-av.com: did not receive HSTS header
+inspired-creations.co.za: did not receive HSTS header
inspiroinc.com: could not connect to host
inst.mobi: did not receive HSTS header
instacart.com: did not receive HSTS header
instant-hack.com: did not receive HSTS header
instant-hack.io: could not connect to host
instantdev.io: could not connect to host
-instantsubs.de: did not receive HSTS header
+instantluxe.cn: could not connect to host
+instantluxe.co.uk: could not connect to host
+instantluxe.com: could not connect to host
+instantluxe.de: could not connect to host
+instantluxe.it: could not connect to host
+instantsubs.de: could not connect to host
instaquiz.ru: could not connect to host
instasex.ch: could not connect to host
instawi.com: could not connect to host
+instinctive.io: did not receive HSTS header
institutoflordelavida.com: could not connect to host
+institutolancaster.com: could not connect to host
institutulcultural.ro: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
instruktor.io: could not connect to host
insurance: could not connect to host
insurethebox.tk: could not connect to host
int-ext-design.fr: could not connect to host
int-ma.in: did not receive HSTS header
+intae.it: did not receive HSTS header
integraelchen.de: could not connect to host
integrationinc.com: did not receive HSTS header
integraxor.com.tw: did not receive HSTS header
integrityingovernmentidaho.com: could not connect to host
intel.gov: did not receive HSTS header
-intel.li: could not connect to host
+intel.li: did not receive HSTS header
intelbet.es: did not receive HSTS header
intelbet.ro: did not receive HSTS header
intelhost.net: max-age too low: 0
intelldynamics.com: could not connect to host
intelliance.eu: did not receive HSTS header
-interabbit.com: could not connect to host
+interabbit.co: could not connect to host
interboursegeneva.ch: did not receive HSTS header
interchanges.io: max-age too low: 0
-intercom.com: did not receive HSTS header
-intercom.io: did not receive HSTS header
interference.io: did not receive HSTS header
+interfesse.net: could not connect to host
interfloraservices.co.uk: could not connect to host
intergenx.co.uk: could not connect to host
intergenx.com: could not connect to host
intergenx.org: could not connect to host
intergenx.org.uk: could not connect to host
+interguard.net: could not connect to host
interhosts.co.za: could not connect to host
interim-cto.de: could not connect to host
interiorcheapo.com: could not connect to host
+interiordesignsconcept.com: could not connect to host
interiortradingco.com.au: could not connect to host
interleucina.org: did not receive HSTS header
interlocal.co.uk: did not receive HSTS header
@@ -8755,12 +9248,14 @@ internshipandwork.com: did not receive HSTS header
internshipandwork.ru: did not receive HSTS header
interociter-enterprises.com: could not connect to host
intersectraven.net: did not receive HSTS header
+interserved.com: max-age too low: 0
interspot.nl: could not connect to host
-interstellarhyperdrive.com: did not receive HSTS header
+interstellarhyperdrive.com: could not connect to host
interviewpipeline.co.uk: could not connect to host
-intervisteperstrada.com: did not receive HSTS header
+intervisteperstrada.com: could not connect to host
intexplore.org: could not connect to host
intim-uslugi-kazan.net: could not connect to host
+intimastoreatacado.com.br: could not connect to host
intimateperrierjouet.com: could not connect to host
intimici.com.br: could not connect to host
intimtoy.com.ua: could not connect to host
@@ -8770,10 +9265,12 @@ intreaba.xyz: could not connect to host
intrigue3d.com: could not connect to host
introverted.ninja: did not receive HSTS header
introvertedtravel.space: max-age too low: 0
+intune.life: could not connect to host
invenio.software: could not connect to host
inventoryexpress.xyz: could not connect to host
inverselink.com: could not connect to host
-investcountry.com: could not connect to host
+inversioneseconomicas.com: could not connect to host
+investcountry.com: did not receive HSTS header
investingdiary.cn: could not connect to host
investingtrader.net: could not connect to host
investnext.com: max-age too low: 43200
@@ -8793,6 +9290,7 @@ ioiart.eu: could not connect to host
iolife.dk: could not connect to host
ionas-law.ro: did not receive HSTS header
ionc.ca: could not connect to host
+ionicisere.com: did not receive HSTS header
ionote.me: could not connect to host
iop.intuit.com: max-age too low: 86400
iora.fr: could not connect to host
@@ -8807,7 +9305,7 @@ ipawind.com: did not receive HSTS header
ipbill.org.uk: could not connect to host
ipcfg.me: could not connect to host
ipfp.pl: did not receive HSTS header
-iphonechina.net: could not connect to host
+iphonechina.net: did not receive HSTS header
iphoneportfolioapp.com: did not receive HSTS header
ipid.me: could not connect to host
iplabs.de: did not receive HSTS header
@@ -8829,7 +9327,7 @@ ipstoragesolutions.com: did not receive HSTS header
iptel.ro: could not connect to host
iptvmakedonija.mk: did not receive HSTS header
ipuservicedesign.com: could not connect to host
-ipv6.watch: did not receive HSTS header
+ipv6.watch: could not connect to host
ipv6cloud.club: could not connect to host
ipv6demo.de: could not connect to host
ipv6only.network: could not connect to host
@@ -8839,12 +9337,12 @@ iqcn.co: could not connect to host
iqualtech.com: max-age too low: 7889238
ir-saitama.com: could not connect to host
iran-geo.com: could not connect to host
-iran-poll.org: max-age too low: 0
+iran-poll.org: could not connect to host
irandp.net: could not connect to host
iranianlawschool.com: could not connect to host
iraqidinar.org: did not receive HSTS header
irasandi.com: could not connect to host
-irazimina.ru: did not receive HSTS header
+irazimina.ru: could not connect to host
irccloud.com: did not receive HSTS header
ircmett.de: did not receive HSTS header
iready.ro: could not connect to host
@@ -8854,9 +9352,9 @@ irische-segenswuensche.info: could not connect to host
irisdina.de: could not connect to host
irishmusic.nu: did not receive HSTS header
irland.guide: could not connect to host
-irmtrudjurke.de: did not receive HSTS header
-irodorinet.com: max-age too low: 0
+irmtrudjurke.de: could not connect to host
iron-guard.net: did not receive HSTS header
+ironbelly.pro: could not connect to host
irondaleirregulars.com: did not receive HSTS header
irstaxforumsonline.com: did not receive HSTS header
irugs.ch: did not receive HSTS header
@@ -8876,7 +9374,8 @@ isdecolaop.nl: could not connect to host
isdf.me: could not connect to host
isdown.cz: could not connect to host
isef-eg.com: did not receive HSTS header
-iserv.fr: did not receive HSTS header
+iserv.fr: could not connect to host
+iseulde.com: could not connect to host
isfff.com: could not connect to host
isfriday.com: could not connect to host
ishadowsocks.ltd: could not connect to host
@@ -8890,6 +9389,7 @@ isitnuclearwaryet.com: could not connect to host
iskai.net: did not receive HSTS header
iskkk.com: could not connect to host
iskkk.net: could not connect to host
+islamonline.net: did not receive HSTS header
islandinthenet.com: did not receive HSTS header
islandlakeil.gov: could not connect to host
islandoilsupply.com: max-age too low: 300
@@ -8897,10 +9397,10 @@ islandpumpandtank.com: did not receive HSTS header
islandzero.net: could not connect to host
islazia.fr: did not receive HSTS header
isntall.us: did not receive HSTS header
-isocom.eu: did not receive HSTS header
isoface33.fr: did not receive HSTS header
isogen5.com: could not connect to host
isogram.nl: did not receive HSTS header
+isondo.com: could not connect to host
isoroc-nidzica.pl: could not connect to host
ispringcloud.ru: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
ispweb.es: did not receive HSTS header
@@ -8913,15 +9413,16 @@ istaspirtslietas.lv: did not receive HSTS header
istgame.com: did not receive HSTS header
isthefieldcontrolsystemdown.com: could not connect to host
istherrienstillcoach.com: could not connect to host
-isv.online: did not receive HSTS header
+isthisus.org: could not connect to host
iszy.me: could not connect to host
it-cave.com: could not connect to host
it-enthusiasts.tech: could not connect to host
it-go.net: did not receive HSTS header
it-labor.info: did not receive HSTS header
it-schwerin.de: could not connect to host
+it-world.eu: could not connect to host
itad.top: could not connect to host
-itblog.pp.ua: did not receive HSTS header
+itblog.pp.ua: could not connect to host
itbrief.co.nz: did not receive HSTS header
itbrief.com.au: did not receive HSTS header
itchimes.com: did not receive HSTS header
@@ -8936,6 +9437,7 @@ iterasoft.de: did not receive HSTS header
itfaq.nl: did not receive HSTS header
itfensi.net: could not connect to host
itforcc.com: did not receive HSTS header
+itgirls.rs: could not connect to host
ithakama.com: could not connect to host
itinsight.hu: did not receive HSTS header
itiomassagem.com.br: did not receive HSTS header
@@ -8947,20 +9449,20 @@ itos.asia: did not receive HSTS header
itos.pl: did not receive HSTS header
itpol.dk: did not receive HSTS header
itpro-mg.de: could not connect to host
-itproject.guru: did not receive HSTS header
-itrack.in.th: did not receive HSTS header
+itproject.guru: could not connect to host
+itrack.in.th: could not connect to host
itriskltd.com: did not receive HSTS header
its-schindler.de: could not connect to host
its-v.de: could not connect to host
-its4living.com: could not connect to host
itsadog.co.uk: did not receive HSTS header
itsagadget.com: did not receive HSTS header
itsamurai.ru: max-age too low: 2592000
itsatrap.nl: could not connect to host
itsecurityassurance.pw: could not connect to host
itsg-faq.de: could not connect to host
-itshka.rv.ua: max-age too low: 604800
+itshka.rv.ua: could not connect to host
itshost.ru: could not connect to host
+itskayla.com: did not receive HSTS header
itsmejohn.org: could not connect to host
itspartytimesweetinflations.com: could not connect to host
itsupport-luzern.ch: could not connect to host
@@ -8971,8 +9473,17 @@ iuscommunity.org: did not receive HSTS header
ivanilla.org: could not connect to host
ivanpolchenko.com: could not connect to host
ivi-co.com: max-age too low: 0
+ivi-fertilite.fr: max-age too low: 0
ivi-fertility.com: max-age too low: 0
-ivi.es: max-age too low: 0
+ivi-fruchtbarkeit.de: max-age too low: 0
+ivi.com.ar: did not receive HSTS header
+ivi.com.pa: max-age too low: 0
+ivi.es: did not receive HSTS header
+ivi.mx: could not connect to host
+ivi.net.br: max-age too low: 0
+ivi.pt: max-age too low: 0
+ivinet.cl: did not receive HSTS header
+ivitalia.it: max-age too low: 0
ivk.website: could not connect to host
ivklombard.ru: did not receive HSTS header
ivoryonsunset.com: could not connect to host
@@ -8988,9 +9499,9 @@ ix8.ru: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAI
ixec2.tk: could not connect to host
ixh.me: did not receive HSTS header
ixio.cz: could not connect to host
+iyoumu.top: could not connect to host
+izaakbeekman.com: max-age too low: 2592000
izdiwho.com: could not connect to host
-izevg.ru: could not connect to host
-izhaojie.com: could not connect to host
izolight.ch: could not connect to host
izonemart.com: did not receive HSTS header
izoox.com: did not receive HSTS header
@@ -9007,17 +9518,22 @@ j2ee.cz: could not connect to host
j8y.de: did not receive HSTS header
ja-publications.agency: did not receive HSTS header
ja-publications.com: did not receive HSTS header
+ja.md: did not receive HSTS header
jaan.su: could not connect to host
jaaxypro.com: could not connect to host
+jabba.homelinux.org: could not connect to host
+jabbas.eu: could not connect to host
jability.ovh: could not connect to host
+jack2celebrities.com: could not connect to host
jackalworks.com: could not connect to host
jackdoan.com: did not receive HSTS header
jackfahnestock.com: could not connect to host
jackops.com: could not connect to host
jackrusselterrier.com.br: could not connect to host
-jackyyf.com: could not connect to host
jaco.by: could not connect to host
jacobparry.ca: did not receive HSTS header
+jacobphono.com: could not connect to host
+jacobsenarquitetura.com: max-age too low: 5184000
jadara.info: could not connect to host
jaepinformatica.com: did not receive HSTS header
jagido.de: did not receive HSTS header
@@ -9025,13 +9541,12 @@ jahliveradio.com: did not receive HSTS header
jaimechanaga.com: could not connect to host
jaion.ml: could not connect to host
jaion.tech: could not connect to host
-jak-na-les.cz: could not connect to host
+jak-na-les.cz: did not receive HSTS header
jakenbake.com: could not connect to host
jakeslab.tech: could not connect to host
-jakewalker.xyz: did not receive HSTS header
jakincode.army: could not connect to host
jaksel.id: could not connect to host
-jaksi.io: did not receive HSTS header
+jaksi.io: could not connect to host
jakubarbet.eu: could not connect to host
jamanji.com.ng: could not connect to host
jamaware.org: could not connect to host
@@ -9039,6 +9554,7 @@ jamberry.com.mx: could not connect to host
james-parker.com: did not receive HSTS header
james.je: could not connect to host
jamesandanneke.com: could not connect to host
+jamesandpame.la: could not connect to host
jamesbradach.com: did not receive HSTS header
jamesburton.london: could not connect to host
jamesbywater.co.uk: could not connect to host
@@ -9055,45 +9571,44 @@ jamesf.xyz: could not connect to host
jamesforman.co.nz: did not receive HSTS header
jameshale.me: did not receive HSTS header
jamesheald.com: could not connect to host
-jamesl.ml: did not receive HSTS header
+jamesl.ml: could not connect to host
jamesmaurer.com: did not receive HSTS header
jamesrains.com: could not connect to host
-jameswarp.com: could not connect to host
jami.am: max-age too low: 0
+jamiepeters.nl: did not receive HSTS header
+jamjestsimon.pl: could not connect to host
jamourtney.com: could not connect to host
jamyeprice.com: did not receive HSTS header
jan-cermak.cz: did not receive HSTS header
jan-daniels.de: did not receive HSTS header
jan27.org: did not receive HSTS header
janario.me: could not connect to host
+janduchene.ch: could not connect to host
janebondsurety.com: did not receive HSTS header
jangho.me: could not connect to host
-jangocloud.tk: could not connect to host
janheidler.dynv6.net: could not connect to host
-janhermann.cz: did not receive HSTS header
janking.de: could not connect to host
janmachynka.cz: could not connect to host
-janmg.com: could not connect to host
+janmg.com: did not receive HSTS header
janosh.com: did not receive HSTS header
janssen.fm: could not connect to host
-janssenwigman.nl: did not receive HSTS header
+janssenwigman.nl: could not connect to host
janus-engineering.de: did not receive HSTS header
janverlaan.nl: did not receive HSTS header
jap-nope.de: did not receive HSTS header
-japan4you.org: did not receive HSTS header
+japan4you.org: could not connect to host
japanbaths.com: did not receive HSTS header
-japaneseemoticons.org: could not connect to host
+japaneseemoticons.org: did not receive HSTS header
japanesenames.biz: did not receive HSTS header
-japangids.nl: max-age too low: 86400
japansm.com: could not connect to host
japanwide.net: did not receive HSTS header
japaripark.com: could not connect to host
jape.today: could not connect to host
japlex.com: could not connect to host
jaqen.ch: could not connect to host
+jardinderline.ch: could not connect to host
jardins-utopie.net: could not connect to host
jaredbates.net: did not receive HSTS header
-jaredfraser.com: could not connect to host
jarivisual.com: could not connect to host
jarl.ninja: could not connect to host
jarnail.ca: could not connect to host
@@ -9112,6 +9627,7 @@ jasonrobinson.me: [Exception... "Component returned failure code: 0x80004005 (NS
jasonroe.me: did not receive HSTS header
jasonsansone.com: could not connect to host
jasonwindholz.com: could not connect to host
+jasperhammink.com: did not receive HSTS header
jastoria.pl: did not receive HSTS header
jastrow.me: did not receive HSTS header
jateng.press: could not connect to host
@@ -9130,11 +9646,12 @@ jawnelodzkie.org.pl: could not connect to host
jaxageto.de: did not receive HSTS header
jayblock.com: did not receive HSTS header
jayharris.ca: could not connect to host
-jaylen.com.ar: could not connect to host
-jayna.design: did not receive HSTS header
+jaylen.com.ar: did not receive HSTS header
+jayna.design: could not connect to host
jayschulman.com: did not receive HSTS header
jayscoaching.com: could not connect to host
jayshao.com: did not receive HSTS header
+jazzfeet.co.uk: could not connect to host
jazzinutrecht.info: could not connect to host
jballelectronics.com: did not receive HSTS header
jbelien.be: did not receive HSTS header
@@ -9152,6 +9669,7 @@ jcolideles.com: could not connect to host
jcom-communication-system.biz: could not connect to host
jcor.me: could not connect to host
jcoscia.com: could not connect to host
+jcra.net: could not connect to host
jcraft.us: did not receive HSTS header
jctf.io: could not connect to host
jcyz.cf: could not connect to host
@@ -9160,20 +9678,21 @@ jdcdirectsales.com.ph: could not connect to host
jdfk.net: could not connect to host
jdgonzalez95.com: could not connect to host
jdh8.org: did not receive HSTS header
+jdieselmusic.com: did not receive HSTS header
jdsf.tk: could not connect to host
jean-remy.ch: could not connect to host
jebengotai.com: did not receive HSTS header
-jedayoshi.me: could not connect to host
+jedayoshi.me: did not receive HSTS header
jedayoshi.tk: could not connect to host
jeepmafia.com: did not receive HSTS header
-jeff.forsale: did not receive HSTS header
jeff.is: could not connect to host
jeff393.com: could not connect to host
jeffanderson.me: did not receive HSTS header
+jeffcasavant.com: did not receive HSTS header
jeffersonregan.org: could not connect to host
jeffhuxley.com: could not connect to host
-jeffmcneill.com: did not receive HSTS header
jeffreymagee.com: did not receive HSTS header
+jefrydco.id: could not connect to host
jeil-makes.co.kr: could not connect to host
jelewa.de: did not receive HSTS header
jellow.nl: did not receive HSTS header
@@ -9183,6 +9702,7 @@ jenjoit.de: could not connect to host
jennedebleser.com: did not receive HSTS header
jenniferchan.id.au: could not connect to host
jennifercherniack.com: did not receive HSTS header
+jennifermason.eu: could not connect to host
jennybeaned.com: did not receive HSTS header
jens-prangenberg.de: did not receive HSTS header
jens.hk: could not connect to host
@@ -9190,7 +9710,7 @@ jensenbanden.no: could not connect to host
jenssen.org: did not receive HSTS header
jeparamedia.com: did not receive HSTS header
jeremye77.com: did not receive HSTS header
-jeremymade.com: did not receive HSTS header
+jeremymade.com: could not connect to host
jeremywagner.me: did not receive HSTS header
jermann.biz: did not receive HSTS header
jeroenensanne.wedding: could not connect to host
@@ -9210,15 +9730,17 @@ jetmirshatri.com: did not receive HSTS header
jeton.com: did not receive HSTS header
jetsetcharge.com: could not connect to host
jetsetpay.com: could not connect to host
-jettlarue.com: could not connect to host
jettravel.com.mt: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
jettshome.org: could not connect to host
jetzt-elektromobil.de: could not connect to host
jevisite.ca: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
jewellerydesignstore.com: could not connect to host
jewellerymarvels.com: did not receive HSTS header
+jexler.net: could not connect to host
jez.nl: could not connect to host
+jf-fotos.de: could not connect to host
jfmel.com: did not receive HSTS header
+jfmhero.me: did not receive HSTS header
jfnllc.com: could not connect to host
jfx.space: did not receive HSTS header
jh-media.eu: could not connect to host
@@ -9227,6 +9749,7 @@ jhburton.uk: could not connect to host
jhcommunitysports.co.uk: could not connect to host
jhejderup.me: could not connect to host
jhermsmeier.de: could not connect to host
+jhf.io: could not connect to host
jhw-profiles.de: did not receive HSTS header
jia1hao.com: could not connect to host
jiacl.com: could not connect to host
@@ -9239,10 +9762,11 @@ jiazhao.ga: could not connect to host
jichi.me: could not connect to host
jie.dance: could not connect to host
jief.me: could not connect to host
+jieyang2016.com: could not connect to host
jigsawdevelopments.com: could not connect to host
jiid.ga: could not connect to host
jikegu.com: could not connect to host
-jikken.de: did not receive HSTS header
+jikken.de: could not connect to host
jimas.eu: did not receive HSTS header
jimenacocina.com: did not receive HSTS header
jimgao.tk: did not receive HSTS header
@@ -9255,29 +9779,37 @@ jing-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERRO
jingyuesi.com: could not connect to host
jinliming.ml: could not connect to host
jinmaguoji.com: could not connect to host
-jiosongs.com: did not receive HSTS header
+jiosongs.com: could not connect to host
jira.com: did not receive HSTS header
jirav.io: could not connect to host
jisaku-homepage.com: did not receive HSTS header
jitlab.org: could not connect to host
jitsi.org: did not receive HSTS header
jiveiaktivno.bg: did not receive HSTS header
-jiyue.com: did not receive HSTS header
jjf.org.au: did not receive HSTS header
+jjjconnection.com: could not connect to host
jka.io: did not receive HSTS header
jkb.pics: could not connect to host
jkbuster.com: could not connect to host
jkest.cc: could not connect to host
+jkirsche.com: max-age too low: 0
jkng.eu: could not connect to host
jko.works: could not connect to host
jkuvw.xyz: could not connect to host
jkyuan.tk: could not connect to host
+jl-dns.eu: could not connect to host
+jl-dns.nl: could not connect to host
+jl-exchange.nl: could not connect to host
+jl-mail.nl: could not connect to host
jldp.org: did not receive HSTS header
jlhmedia.com: did not receive HSTS header
jlot.org: did not receive HSTS header
+jlpn.eu: could not connect to host
+jlpn.nl: could not connect to host
jm06.com: did not receive HSTS header
jm22.com: could not connect to host
jmb.lc: could not connect to host
+jmoreau.ddns.net: could not connect to host
jmotion.co.uk: did not receive HSTS header
jmpmotorsport.co.uk: did not receive HSTS header
jmvbmx.ch: could not connect to host
@@ -9287,13 +9819,17 @@ jncde.de: did not receive HSTS header
jncie.de: did not receive HSTS header
jncie.eu: did not receive HSTS header
jncip.de: did not receive HSTS header
+joacimeldre.com: did not receive HSTS header
joakimalgroy.com: could not connect to host
+joaquimgoliveira.pt: did not receive HSTS header
+job-offer.de: could not connect to host
jobers.ch: did not receive HSTS header
jobers.pt: did not receive HSTS header
jobflyapp.com: could not connect to host
jobmedic.com: could not connect to host
jobmob.co.il: did not receive HSTS header
jobshq.com: did not receive HSTS header
+jobsnet.eu: could not connect to host
jobss.co.uk: could not connect to host
jobtestprep.de: max-age too low: 0
jobtestprep.dk: max-age too low: 0
@@ -9309,6 +9845,7 @@ joecod.es: could not connect to host
joefixit.co.uk: could not connect to host
joelgonewild.com: did not receive HSTS header
joerg-wellpott.de: did not receive HSTS header
+joerosca.com: could not connect to host
joetyson.io: could not connect to host
joeyfelix.com: could not connect to host
joeyvilaro.com: could not connect to host
@@ -9320,37 +9857,36 @@ johnbrownphotography.ch: did not receive HSTS header
johncardell.com: did not receive HSTS header
johners.me: could not connect to host
johngaltgroup.com: did not receive HSTS header
-johngo.tk: did not receive HSTS header
johnmorganpartnership.co.uk: did not receive HSTS header
johnrom.com: could not connect to host
+johnsanchez.io: could not connect to host
johntomasowa.com: could not connect to host
johnverkerk.com: could not connect to host
joinamericacorps.gov: could not connect to host
jointoweb.com: could not connect to host
+joker.menu: could not connect to host
jomp16.tk: did not receive HSTS header
jonarcher.info: did not receive HSTS header
jonas-keidel.de: did not receive HSTS header
jonasgroth.se: did not receive HSTS header
+jonathan-apps.com: could not connect to host
jonathan.ir: could not connect to host
-jonathancarter.org: could not connect to host
jonathandowning.uk: did not receive HSTS header
jonathanmassacand.ch: could not connect to host
-jonathanreyes.com: did not receive HSTS header
jonathansanchez.pro: could not connect to host
-jonathanselea.se: did not receive HSTS header
jonesopolis.xyz: could not connect to host
jonferwerda.net: could not connect to host
jonfor.net: could not connect to host
jongha.me: could not connect to host
jonn.me: could not connect to host
jonnichols.info: could not connect to host
-jons.org: could not connect to host
jonsno.ws: could not connect to host
-joostbovee.nl: did not receive HSTS header
+joostbovee.nl: could not connect to host
jooto.com: did not receive HSTS header
jopl.org: did not receive HSTS header
jordankirby.co.uk: could not connect to host
jordanp.engineer: could not connect to host
+jordanscorporatelaw.com: could not connect to host
jordanstrustcompany.cn: could not connect to host
jordanstrustcompany.ru: could not connect to host
jordikroon.nl: could not connect to host
@@ -9365,9 +9901,11 @@ joseaveleira.es: did not receive HSTS header
josecage.com: could not connect to host
josegerber.ch: did not receive HSTS header
josericaurte.com: could not connect to host
+joshhoffer.com: could not connect to host
joshi.su: could not connect to host
joshplant.co.uk: could not connect to host
joshstroup.me: could not connect to host
+joshuajohnson.ca: did not receive HSTS header
joto.de: did not receive HSTS header
jotpics.com: could not connect to host
jottit.com: could not connect to host
@@ -9377,7 +9915,6 @@ joworld.net: could not connect to host
joyceclerkx.com: could not connect to host
joyceseamone.com: did not receive HSTS header
joyjohnston.ca: did not receive HSTS header
-joyqi.com: did not receive HSTS header
jpaglier.com: could not connect to host
jpbike.cz: could not connect to host
jpcrochetapparel.com: could not connect to host
@@ -9385,7 +9922,9 @@ jpeaches.xyz: could not connect to host
jpgangbang.com: could not connect to host
jproxx.com: did not receive HSTS header
jptun.com: could not connect to host
+jreinert.com: could not connect to host
jrgold.me: could not connect to host
+jrlopezoficial.com: could not connect to host
jrmd.io: could not connect to host
jrvar.com: could not connect to host
js3311.com: could not connect to host
@@ -9397,17 +9936,14 @@ jsbevents.nl: could not connect to host
jsblights.nl: could not connect to host
jsc7776.com: could not connect to host
jsdelivr.net: could not connect to host
-jsevilleja.org: could not connect to host
jsg-technologies.de: did not receive HSTS header
jsjyhzy.cc: could not connect to host
-jslidong.top: did not receive HSTS header
+jslidong.top: could not connect to host
json-viewer.com: did not receive HSTS header
+jss.moe: did not receive HSTS header
jstelecom.com.br: did not receive HSTS header
jsuse.xyz: could not connect to host
-jsvr.tk: could not connect to host
jsxc.ch: could not connect to host
-jtcat.com: could not connect to host
-jtcjewelry.com: could not connect to host
ju1ro.de: could not connect to host
jualautoclave.com: did not receive HSTS header
jualssh.com: could not connect to host
@@ -9415,11 +9951,12 @@ juandesouza.com: did not receive HSTS header
juanhub.com: did not receive HSTS header
jubee.nl: did not receive HSTS header
juchheim-methode.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-jucktehkeinen.de: did not receive HSTS header
+judytka.cz: could not connect to host
+juelda.com: did not receive HSTS header
juiced.gs: did not receive HSTS header
juka.pp.ua: could not connect to host
+juku-info.top: did not receive HSTS header
julegoerke.de: did not receive HSTS header
-julenlanda.com: could not connect to host
juliamweber.de: could not connect to host
julian-kipka.de: did not receive HSTS header
julian-witusch.de: could not connect to host
@@ -9435,26 +9972,27 @@ jumbopan.com: could not connect to host
jumbox.xyz: could not connect to host
jumbster.com: could not connect to host
jumparoundreading.co.uk: did not receive HSTS header
+jumperoos.co.uk: could not connect to host
jumping-duck.com: could not connect to host
jumpman-iphone-design.de: could not connect to host
junaos.com: did not receive HSTS header
junaos.xyz: did not receive HSTS header
-junctioncitywisconsin.gov: could not connect to host
+junctioncitywisconsin.gov: did not receive HSTS header
jundimax.com.br: could not connect to host
junge-selbsthilfe.info: could not connect to host
jungleculture.co.za: did not receive HSTS header
junglegoat.xyz: did not receive HSTS header
-junias-fenske.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
juniwalk.cz: could not connect to host
+junjhome.com: could not connect to host
junjung.me: could not connect to host
-junoaroma.com: could not connect to host
junqtion.com: could not connect to host
-jupp0r.de: could not connect to host
+jupp0r.de: did not receive HSTS header
juridiqueo.com: did not receive HSTS header
-juristas.com.br: did not receive HSTS header
+juristas.com.br: max-age too low: 0
juristeo.com: did not receive HSTS header
jurke.com: did not receive HSTS header
jurko.cz: could not connect to host
+just-a-clanpage.de: could not connect to host
just-english.online: did not receive HSTS header
just-pools.co.za: could not connect to host
just2trade.com: did not receive HSTS header
@@ -9462,16 +10000,15 @@ justbelieverecovery.com: did not receive HSTS header
justiceforfathers.com: did not receive HSTS header
justiceo.org: did not receive HSTS header
justinellingwood.com: could not connect to host
-justinharrison.ca: could not connect to host
justinlemay.com: could not connect to host
justinrudio.com: did not receive HSTS header
justlikethat.hosting: did not receive HSTS header
-justmy.website: did not receive HSTS header
+justmy.website: could not connect to host
justnaw.co.uk: could not connect to host
+justtalk.site: could not connect to host
justudin.com: did not receive HSTS header
justwood.cz: did not receive HSTS header
justzz.xyz: could not connect to host
-jutella.de: did not receive HSTS header
juul.xyz: could not connect to host
juventusclublugano.ch: did not receive HSTS header
juventusmania1897.com: could not connect to host
@@ -9479,25 +10016,28 @@ juwairen.cn: could not connect to host
juzgalo.com: did not receive HSTS header
jva-wuerzburg.de: could not connect to host
jvn.com: did not receive HSTS header
-jvoice.net: did not receive HSTS header
+jvoice.net: could not connect to host
jwallet.cc: did not receive HSTS header
jwilsson.me: could not connect to host
jwolt-lx.com: could not connect to host
+jwsoft.nl: could not connect to host
jysperm.me: did not receive HSTS header
jzachpearson.com: max-age too low: 0
jzcapital.co: could not connect to host
+jzgj088.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
jznet.org: could not connect to host
k-dev.de: could not connect to host
k-rickroll-g.pw: could not connect to host
+k-scr.me: could not connect to host
k-wallet.com: could not connect to host
k1cp.com: could not connect to host
k3508.com: could not connect to host
k38.cc: could not connect to host
ka-clan.com: could not connect to host
kaanduman.com: could not connect to host
+kaany.io: could not connect to host
kaasbijwijn.nl: did not receive HSTS header
kaashosting.nl: did not receive HSTS header
-kabarlinux.id: could not connect to host
kabinapp.com: did not receive HSTS header
kabuabc.com: could not connect to host
kackscharf.de: could not connect to host
@@ -9505,7 +10045,7 @@ kadioglumakina.com.tr: did not receive HSTS header
kadmec.com: did not receive HSTS header
kaela.design: could not connect to host
kahopoon.net: could not connect to host
-kai.cool: could not connect to host
+kai.cool: did not receive HSTS header
kaibol.com: could not connect to host
kaika-facilitymanagement.de: could not connect to host
kaika-hms.de: did not receive HSTS header
@@ -9527,22 +10067,24 @@ kaleidoskop-freiburg.de: did not receive HSTS header
kalender.goip.de: could not connect to host
kalilinux.tech: could not connect to host
kaloix.de: could not connect to host
+kalsbouncies.com: could not connect to host
kamalame.co: could not connect to host
kamatajisyaku.tokyo.jp: did not receive HSTS header
kambodja.guide: could not connect to host
kamcvicit.sk: could not connect to host
kamikano.com: could not connect to host
+kamikatse.net: could not connect to host
kamitech.ch: could not connect to host
kampunginggris-ue.com: could not connect to host
kanada.guide: could not connect to host
kanagawachuo-hospital.jp: could not connect to host
kanar.nl: could not connect to host
kancolle.me: could not connect to host
-kandalife.com: could not connect to host
kandec.co.jp: did not receive HSTS header
kaneisdi.com: did not receive HSTS header
kaneo-gmbh.de: did not receive HSTS header
kanganer.com: could not connect to host
+kangooroule.fr: did not receive HSTS header
kangzaber.com: could not connect to host
kaniklani.co.za: did not receive HSTS header
kanmitao.com: did not receive HSTS header
@@ -9551,6 +10093,7 @@ kanr.in: could not connect to host
kanscooking.org: could not connect to host
kantorad.io: could not connect to host
kantv1.com: could not connect to host
+kanzlei-myca.de: did not receive HSTS header
kanzlei-wirtschaftsrecht.berlin: max-age too low: 600000
kanzshop.com: could not connect to host
kaohub.com: could not connect to host
@@ -9564,24 +10107,26 @@ kappit.dk: could not connect to host
kapucini.si: max-age too low: 0
kaputt.com: could not connect to host
kapverde.guide: could not connect to host
+kara-fabian.com: could not connect to host
+kara-fabian.de: could not connect to host
+karaface.com: could not connect to host
karamna.com: could not connect to host
karanastic.com: did not receive HSTS header
karanlyons.com: could not connect to host
karaoketonight.com: could not connect to host
-karatekit.co.uk: could not connect to host
-karatorian.org: could not connect to host
+karatorian.org: did not receive HSTS header
karenledger.ca: did not receive HSTS header
karjala-ski.ru: could not connect to host
karlis-kavacis.id.lv: did not receive HSTS header
karloskontana.tk: could not connect to host
karlproctor.co.uk: could not connect to host
karpanhellas.com: could not connect to host
-kars.ooo: could not connect to host
-karting34.com: did not receive HSTS header
+kartatopia.com: could not connect to host
+karting34.com: could not connect to host
karuneshjohri.com: could not connect to host
-kasadara.com: did not receive HSTS header
kashdash.ca: could not connect to host
kashis.com.au: max-age too low: 0
+kastemperaturen.ga: could not connect to host
kat.al: could not connect to host
katalogakci.cz: did not receive HSTS header
katalogbutikker.dk: could not connect to host
@@ -9590,7 +10135,7 @@ kati0.com: could not connect to host
katiaetdavid.fr: could not connect to host
katja-nikolic-design.de: could not connect to host
katoju.co.jp: could not connect to host
-katproxy.al: could not connect to host
+katproxy.al: did not receive HSTS header
katproxy.online: did not receive HSTS header
katproxy.site: could not connect to host
katproxy.tech: could not connect to host
@@ -9609,14 +10154,13 @@ kausta.me: could not connect to host
kaverti.com: did not receive HSTS header
kavik.no: could not connect to host
kavinvin.me: could not connect to host
-kawaii.io: could not connect to host
kawaiiku.com: could not connect to host
kawaiiku.de: could not connect to host
+kayakabovegroundswimmingpools.com: could not connect to host
kaydan.io: could not connect to host
kayipmurekkep.com: could not connect to host
kayleen.net: could not connect to host
kayon.cf: could not connect to host
-kaysis.gov.tr: did not receive HSTS header
kazamasion.com: could not connect to host
kazanasolutions.de: could not connect to host
kazenojiyu.fr: did not receive HSTS header
@@ -9628,8 +10172,11 @@ kdata.it: did not receive HSTS header
kdbx.online: could not connect to host
kdm-online.de: did not receive HSTS header
kearney.io: could not connect to host
+kediri.win: could not connect to host
keditor.biz: could not connect to host
keechain.io: could not connect to host
+keeckee.ga: could not connect to host
+keeckee.ml: could not connect to host
keeley.gq: could not connect to host
keeley.ml: could not connect to host
keeleysam.me: could not connect to host
@@ -9644,8 +10191,10 @@ keeprubyweird.com: did not receive HSTS header
kefaloniatoday.com: did not receive HSTS header
keihin-chaplin.jp: did not receive HSTS header
kein-fidget-spinner-werden.de: could not connect to host
+kejar.id: did not receive HSTS header
kejibot.com: could not connect to host
kekehouse.net: could not connect to host
+kekgame.com: did not receive HSTS header
kellyandantony.com: could not connect to host
kelm.me: could not connect to host
kelmarsafety.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -9653,7 +10202,7 @@ kelp.agency: did not receive HSTS header
ken-electric.com.br: could not connect to host
kenbillionsyuan.tk: could not connect to host
kenc.dk: max-age too low: 2592000
-kenchristensen.dk: max-age too low: 2592000
+kenchristensen.dk: could not connect to host
kenderbeton-magyarorszag.hu: did not receive HSTS header
kenderbetonmagyarorszag.hu: did not receive HSTS header
kenderhaz-magyarorszag.hu: did not receive HSTS header
@@ -9663,20 +10212,24 @@ kenman.dk: max-age too low: 2592000
kennedy.ie: could not connect to host
kensparkesphotography.com: did not receive HSTS header
kentacademiestrust.org.uk: did not receive HSTS header
+kenx5.eu.org: could not connect to host
kepler-seminar.de: did not receive HSTS header
kerangalam.com: did not receive HSTS header
-kerem.xyz: could not connect to host
+kerem.xyz: did not receive HSTS header
kerksanders.nl: could not connect to host
kermadec.blog: could not connect to host
kernelmode.io: did not receive HSTS header
kernl.us: did not receive HSTS header
+kersbergen.nl: did not receive HSTS header
kersmexico.com: could not connect to host
keshausconsulting.com: could not connect to host
keskeces.com: did not receive HSTS header
kessel-runners.com: could not connect to host
kesteren.com: could not connect to host
+kevinbowers.me: could not connect to host
kevindekoninck.com: could not connect to host
kevinheslinphoto.com: did not receive HSTS header
+kevinhill.nl: could not connect to host
kevinmoreland.com: could not connect to host
kevinroebert.de: did not receive HSTS header
kevlar.pw: did not receive HSTS header
@@ -9691,6 +10244,7 @@ kgb.us: did not receive HSTS header
kgregorczyk.pl: could not connect to host
kgxtech.com: max-age too low: 2592000
khaganat.net: did not receive HSTS header
+khlee.net: did not receive HSTS header
khmath.com: did not receive HSTS header
khosla.uk: could not connect to host
ki-on.net: did not receive HSTS header
@@ -9705,23 +10259,23 @@ kidbacker.com: could not connect to host
kiddies.academy: did not receive HSTS header
kiddieschristianacademy.co.za: did not receive HSTS header
kidkat.cn: could not connect to host
-kidswallstickers.com.au: could not connect to host
kiedys.net: could not connect to host
+kiel-kind.de: could not connect to host
kiel-media.de: did not receive HSTS header
kielderweather.org.uk: did not receive HSTS header
kielwi.gov: could not connect to host
kienlen.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-kieran.ie: could not connect to host
-kieranjones.uk: could not connect to host
kieranweightman.me: could not connect to host
kiesuwcursus.nl: did not receive HSTS header
kievradio.com: could not connect to host
+kiisu.club: could not connect to host
kikimilyatacado.com.br: could not connect to host
kikuzuki.org: could not connect to host
kiladera.be: did not receive HSTS header
kilerd.me: could not connect to host
kill-paff.com: did not receive HSTS header
-kimana.pe: did not receive HSTS header
+kimamass.com: could not connect to host
+kimana.pe: could not connect to host
kimberg.co.uk: did not receive HSTS header
kimberlybeautysoapcompany.com: did not receive HSTS header
kimo.se: did not receive HSTS header
@@ -9733,24 +10287,26 @@ kinderly.co.uk: did not receive HSTS header
kinderopvangengeltjes.nl: did not receive HSTS header
kinderopvangzevenbergen.nl: did not receive HSTS header
kinderwagen-test24.de: could not connect to host
+kindleworth.com: did not receive HSTS header
kindlyfire.com: could not connect to host
kindof.ninja: could not connect to host
kinepolis-studio.ga: could not connect to host
kineto.space: could not connect to host
king-henris-castles.co.uk: did not receive HSTS header
+kingbird.me: could not connect to host
kingclass.cn: could not connect to host
kingdomcrc.org: did not receive HSTS header
kingmanhall.org: could not connect to host
kingpincages.com: could not connect to host
kingqueen.org.uk: did not receive HSTS header
kinkdr.com: could not connect to host
-kinmunity.com: did not receive HSTS header
kinnettmemorial.org: did not receive HSTS header
+kinnikinnick.com: did not receive HSTS header
kinnon.enterprises: could not connect to host
kinow.com: did not receive HSTS header
kinsmenhomelottery.com: did not receive HSTS header
kintoandar.com: max-age too low: 0
-kintrip.com: could not connect to host
+kintrip.com: did not receive HSTS header
kintzingerfilm.de: did not receive HSTS header
kionetworks.com: did not receive HSTS header
kipin.fr: did not receive HSTS header
@@ -9759,21 +10315,21 @@ kipriakipita.gr: could not connect to host
kiraboshi.xyz: could not connect to host
kirainmoe.com: did not receive HSTS header
kirara.eu: could not connect to host
-kirillpokrovsky.de: could not connect to host
-kirito.kr: did not receive HSTS header
+kirche-dortmund-ost.de: max-age too low: 86400
+kirill.ws: could not connect to host
+kirito.kr: could not connect to host
kirkforsenate.com: could not connect to host
kirkpatrickdavis.com: could not connect to host
kis-toitoidixi.de: could not connect to host
kisa.io: could not connect to host
+kisalt.im: could not connect to host
kiss-register.org: could not connect to host
kissart.net: could not connect to host
kissesb.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
kissesb.net: could not connect to host
kisskiss.ch: could not connect to host
-kissoft.ro: could not connect to host
kisstube.tv: could not connect to host
kisstyle.ru: did not receive HSTS header
-kisun.co.jp: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
kita.id: did not receive HSTS header
kitabgaul.com: did not receive HSTS header
kitakemon.com: could not connect to host
@@ -9795,7 +10351,6 @@ kiwiirc.com: max-age too low: 5256000
kiwipayment.com: could not connect to host
kiwipayments.com: could not connect to host
kiwiplace.com: could not connect to host
-kix.moe: did not receive HSTS header
kiyo.space: could not connect to host
kizil.net: could not connect to host
kj1391.com: did not receive HSTS header
@@ -9805,13 +10360,17 @@ kjaermaxi.me: did not receive HSTS header
kjg-bachrain.de: could not connect to host
kjg-ummeln.de: did not receive HSTS header
kjoglum.me: could not connect to host
+kkaefer.com: did not receive HSTS header
kkomputer.net: did not receive HSTS header
+kkren.me: could not connect to host
kkull.tv: could not connect to host
kkws.co: could not connect to host
klantenadvies.nl: did not receive HSTS header
+klapib.ee: could not connect to host
klas.or.id: did not receive HSTS header
klatschreime.de: did not receive HSTS header
klausimas.lt: did not receive HSTS header
+klautshop.com: could not connect to host
klauwd.com: could not connect to host
klaxn.org: could not connect to host
klean-ritekc.com: did not receive HSTS header
@@ -9824,17 +10383,19 @@ kleinholding.com: could not connect to host
kleinserienproduktion.com: could not connect to host
klempnershop.eu: did not receive HSTS header
kletterkater.com: did not receive HSTS header
+klicke-gemeinsames.de: did not receive HSTS header
klicktojob.de: could not connect to host
klingeletest.de: could not connect to host
klingsundet.no: did not receive HSTS header
klinkerstreet.com.ua: did not receive HSTS header
-kliqsd.com: could not connect to host
-kloentrup.de: max-age too low: 604800
+kliqsd.com: did not receive HSTS header
+kloentrup.de: max-age too low: 172800
klotz-labs.com: max-age too low: 7889238
klunkergarten.org: could not connect to host
klustekeningen.nl: did not receive HSTS header
+klzwzhi.com: did not receive HSTS header
km-net.pl: did not receive HSTS header
-kmdev.me: did not receive HSTS header
+kmdev.me: could not connect to host
knapen.io: max-age too low: 604800
knccloud.com: could not connect to host
kneipi.de: did not receive HSTS header
@@ -9845,11 +10406,11 @@ knightsbridgegroup.org: could not connect to host
knightsweep.com: could not connect to host
kniwweler.com: could not connect to host
knowdebt.org: did not receive HSTS header
-knowledgehook.com: did not receive HSTS header
knowledgesnap.com: could not connect to host
knowledgesnapsites.com: could not connect to host
knownsec.cf: could not connect to host
knuckles.tk: could not connect to host
+kobar.id: could not connect to host
kobieta.guru: could not connect to host
koboldcraft.ch: could not connect to host
koddsson.com: did not receive HSTS header
@@ -9865,6 +10426,8 @@ koerper-wie-seele.de: did not receive HSTS header
koerperimpuls.ch: did not receive HSTS header
koez-mangal.ch: could not connect to host
koezmangal.ch: could not connect to host
+kogcoder.com: could not connect to host
+koi-sama.net: did not receive HSTS header
koik.io: could not connect to host
koirala.net: could not connect to host
kokenmetaanbiedingen.nl: could not connect to host
@@ -9873,32 +10436,32 @@ kola-entertainments.de: did not receive HSTS header
kolania.com: could not connect to host
kolaykaydet.com: could not connect to host
kolbeck.tk: could not connect to host
+koldanews.com: did not receive HSTS header
kollawat.me: could not connect to host
-kolozsvaricsuhe.hu: did not receive HSTS header
-kombidorango.com.br: did not receive HSTS header
+kolonie-am-stadtpark.de: could not connect to host
+kolozsvaricsuhe.hu: could not connect to host
+kombidorango.com.br: could not connect to host
komikito.com: could not connect to host
kompetenzwerft.de: did not receive HSTS header
konata.us: could not connect to host
kongbaofang.com: could not connect to host
konicaprinterdriver.com: could not connect to host
-konings.it: could not connect to host
-konkai.store: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+konkai.store: could not connect to host
konkurs.ba: could not connect to host
kontakthuman.hu: did not receive HSTS header
kontaxis.network: could not connect to host
kontrolapovinnosti.cz: did not receive HSTS header
-konventseliten.se: could not connect to host
+konventseliten.se: did not receive HSTS header
koop-bremen.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
koopjesnel.nl: could not connect to host
koordinate.net: could not connect to host
kopio.jp: did not receive HSTS header
-koppelvlak.net: could not connect to host
kopular.com: could not connect to host
-koretech.nl: could not connect to host
kori.ml: did not receive HSTS header
koriyoukai.net: did not receive HSTS header
kornersafe.com: did not receive HSTS header
korni22.org: could not connect to host
+korobi.io: could not connect to host
korsanparti.org: did not receive HSTS header
kostuumstore.nl: could not connect to host
kostya.net: did not receive HSTS header
@@ -9915,21 +10478,21 @@ kourpe.online: could not connect to host
kousaku.jp: could not connect to host
kovnsk.net: could not connect to host
kovuthehusky.com: did not receive HSTS header
+kowalmik.tk: could not connect to host
kozmik.co: could not connect to host
kpdyer.com: did not receive HSTS header
kpebetka.net: did not receive HSTS header
kpmgpublications.ie: did not receive HSTS header
kpn-dnssec.com: could not connect to host
-kprog.net: did not receive HSTS header
+kprog.net: could not connect to host
kpvpn.com: could not connect to host
kraigwalker.com: could not connect to host
-kraiwan.com: did not receive HSTS header
+kraiwon.com: could not connect to host
krasavchik.by: could not connect to host
krasota.ru: did not receive HSTS header
krausen.ca: could not connect to host
krausoft.hu: did not receive HSTS header
kravelindo-adventure.com: could not connect to host
-kraynik.com: could not connect to host
krc.link: could not connect to host
kream.io: did not receive HSTS header
kreavis.com: did not receive HSTS header
@@ -9956,31 +10519,34 @@ kroodle.nl: did not receive HSTS header
krouzkyliduska.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
kruegerrand-wert.de: did not receive HSTS header
krunut.com: did not receive HSTS header
-kryha.io: did not receive HSTS header
+kruu.de: could not connect to host
krypteia.org: could not connect to host
kryptomodkingz.com: could not connect to host
+kscarlett.com: could not connect to host
ksfh-mail.de: could not connect to host
+ksham.net: could not connect to host
ksk-agentur.de: did not receive HSTS header
-kspg.tv: could not connect to host
-kstan.me: could not connect to host
+kstan.me: did not receive HSTS header
kswcosmetics.com: could not connect to host
kswriter.com: could not connect to host
-kteen.info: did not receive HSTS header
+kteen.info: could not connect to host
ktube.yt: could not connect to host
+kuaitiyu.org: could not connect to host
kuba.guide: could not connect to host
kubiwa.net: could not connect to host
kubusadvocaten.nl: could not connect to host
kuchenschock.de: did not receive HSTS header
-kucheryavenkovn.ru: could not connect to host
-kucom.it: did not receive HSTS header
+kucheryavenkovn.ru: did not receive HSTS header
+kucom.it: could not connect to host
+kueche-co.de: max-age too low: 10716219
kuechenplan.online: did not receive HSTS header
+kuehndel.org: could not connect to host
kueulangtahunanak.net: could not connect to host
+kugelblitz.co: could not connect to host
kuko-crews.org: could not connect to host
kultmobil.se: did not receive HSTS header
kum.com: could not connect to host
kummerlaender.eu: did not receive HSTS header
-kundenerreichen.com: could not connect to host
-kundenerreichen.de: could not connect to host
kundo.se: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
kunstfehler.at: did not receive HSTS header
kunstschule-krabax.de: did not receive HSTS header
@@ -9992,7 +10558,6 @@ kura.io: could not connect to host
kurashino-mall.com: could not connect to host
kurehun.org: could not connect to host
kuro346.moe: could not connect to host
-kuroisalva.xyz: did not receive HSTS header
kurrende.nrw: could not connect to host
kurrietv.nl: did not receive HSTS header
kursprogramisty.pl: could not connect to host
@@ -10002,6 +10567,7 @@ kurz.pw: could not connect to host
kurzonline.com.br: could not connect to host
kuwago.io: could not connect to host
kuzdrowiu24.pl: could not connect to host
+kvestmaster.ru: did not receive HSTS header
kvt.berlin: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
kwidz.fr: did not receive HSTS header
kwikmed.eu: could not connect to host
@@ -10017,13 +10583,16 @@ kykoonn.net: did not receive HSTS header
kylapps.com: did not receive HSTS header
kyle.place: could not connect to host
kylebaldw.in: did not receive HSTS header
+kylejohnson.io: could not connect to host
kylerwood.com: could not connect to host
kylescastles.co.uk: did not receive HSTS header
kyliehunt.com: did not receive HSTS header
kylling.io: could not connect to host
kymo.org: did not receive HSTS header
kynaston.org.uk: could not connect to host
+kyobostory-events.com: could not connect to host
kyochon.fr: could not connect to host
+kyoko.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
kyonagashima.com: did not receive HSTS header
kyoto-sake.net: could not connect to host
kyouko.nl: could not connect to host
@@ -10032,20 +10601,22 @@ kzjnet.com: could not connect to host
l-rickroll-i.pw: could not connect to host
l.me.uk: could not connect to host
l18.io: could not connect to host
-l3j.net: could not connect to host
+l2guru.ru: could not connect to host
la-flora-negra.de: could not connect to host
la-grande-jaugue.fr: did not receive HSTS header
la-retraite-info.com: could not connect to host
la-serendipite.fr: did not receive HSTS header
-labaia.info: could not connect to host
+labaia.info: did not receive HSTS header
laballoons.com: max-age too low: 7889238
labella-umbrella.com: did not receive HSTS header
labelleza.com.br: could not connect to host
labfox.de: did not receive HSTS header
labiblioafronebrulepas.com: could not connect to host
labina.com.tr: did not receive HSTS header
+labms.com.au: did not receive HSTS header
laboiteanem.fr: could not connect to host
laboiteapc.fr: did not receive HSTS header
+laboitebio-logique.ca: could not connect to host
labordata.io: could not connect to host
laborie.io: could not connect to host
laboutiquemarocaineduconvoyeur.com: could not connect to host
@@ -10053,16 +10624,17 @@ laboutiquemarocaineduconvoyeur.ma: could not connect to host
labrador-retrievers.com.au: did not receive HSTS header
labrasaq8.com: did not receive HSTS header
labs.directory: could not connect to host
-labs.moscow: did not receive HSTS header
+labs.moscow: could not connect to host
lacarpesaintaubinoise.fr: did not receive HSTS header
lacasa.fr: could not connect to host
+lacaserita.org: could not connect to host
lacasseroy.com: could not connect to host
lacaverne.nl: could not connect to host
lacentral.com: did not receive HSTS header
lacledeslan.ninja: could not connect to host
lacuevadechauvet.com: did not receive HSTS header
ladadate.com: could not connect to host
-ladenzeile.de: did not receive HSTS header
+ladislavbrezovnik.com: could not connect to host
ladybugjam.com: could not connect to host
ladylikeit.com: could not connect to host
ladylucks.co.uk: could not connect to host
@@ -10071,13 +10643,12 @@ laemen.nl: could not connect to host
laf.in.net: could not connect to host
lafamillemusique.fr: did not receive HSTS header
lafeemam.fr: could not connect to host
-lafka.org: could not connect to host
laforetenchantee.ch: could not connect to host
lafosseobservatoire.be: did not receive HSTS header
lafr4nc3.xyz: could not connect to host
lag-gbr.gq: could not connect to host
lagalerievirtuelle.fr: did not receive HSTS header
-lagier.xyz: could not connect to host
+lagier.xyz: did not receive HSTS header
lagodny.eu: could not connect to host
lagoza.name: could not connect to host
laharilais.fr: did not receive HSTS header
@@ -10086,21 +10657,24 @@ laisashop.com.br: could not connect to host
lajijonencadebarbera.com: could not connect to host
lakatrop.com: could not connect to host
lakefrontlittleelm.com: did not receive HSTS header
+lakehavasucityhomebuyerscredit.com: did not receive HSTS header
+lakehavasuhomebuyercredit.com: did not receive HSTS header
+lakehavasuhomes.info: did not receive HSTS header
lakehavasuhouserentals.com: could not connect to host
+lakehavasuhouses.com: did not receive HSTS header
lakewoodcomputerservices.com: could not connect to host
+lakhesis.net: could not connect to host
lalajj.com: could not connect to host
laltroweb.it: did not receive HSTS header
lamafioso.com: could not connect to host
lamaisondelatransformationculturelle.com: did not receive HSTS header
-lamaland.ru: did not receive HSTS header
-lamanwebinfo.com: did not receive HSTS header
lambda-complex.org: could not connect to host
lambdafive.co.uk: could not connect to host
lamiaposta.email: did not receive HSTS header
lamomebijou.paris: did not receive HSTS header
-lampl.info: could not connect to host
lamtv.com.mx: could not connect to host
lan2k.org: max-age too low: 86400
+lana.swedbank.se: did not receive HSTS header
lanauzedesigns.com: did not receive HSTS header
lanboll.com: could not connect to host
lanbyte.se: could not connect to host
@@ -10114,14 +10688,15 @@ landhuisverkopen.nl: could not connect to host
landscape.canonical.com: max-age too low: 2592000
landscapingmedic.com: did not receive HSTS header
langenbach.rocks: could not connect to host
-langendorf-ernaehrung-training.de: could not connect to host
+langendorf-ernaehrung-training.de: did not receive HSTS header
langendries.eu: did not receive HSTS header
+langguth.io: did not receive HSTS header
langhun.me: could not connect to host
-lanhhuyet510.tk: could not connect to host
+lanhhuyet510.tk: did not receive HSTS header
laniakean.com: did not receive HSTS header
-lannainnovation.com: did not receive HSTS header
lanonfire.com: could not connect to host
lansinoh.co.uk: did not receive HSTS header
+lanyang.tk: could not connect to host
lanzainc.xyz: could not connect to host
laobox.fr: could not connect to host
laohei.org: did not receive HSTS header
@@ -10132,22 +10707,22 @@ laplaceduvillage.net: could not connect to host
laquack.com: could not connect to host
lared.ovh: did not receive HSTS header
laredsemanario.com: could not connect to host
+larsbauer.xyz: could not connect to host
larsgujord.no: did not receive HSTS header
-larsmerke.de: did not receive HSTS header
+larsmerke.de: could not connect to host
lasepiataca.com: did not receive HSTS header
lasercloud.ml: could not connect to host
laserfuchs.de: did not receive HSTS header
lashstuff.com: did not receive HSTS header
lasnaves.com: did not receive HSTS header
-lassesworld.com: could not connect to host
-lassesworld.se: could not connect to host
lasst-uns-beten.de: could not connect to host
latabaccheria.net: could not connect to host
latable-bowling-vire.fr: did not receive HSTS header
latabledebry.be: could not connect to host
-latamarissiere.eu: could not connect to host
+latamarissiere.eu: did not receive HSTS header
lateliercantaldeco.fr: could not connect to host
latelierdekathy.com: could not connect to host
+latestbuy.com.au: did not receive HSTS header
latetrain.cn: could not connect to host
latg.com: max-age too low: 300
lathamlabs.com: could not connect to host
@@ -10155,7 +10730,6 @@ lathamlabs.net: could not connect to host
lathamlabs.org: could not connect to host
lathen-wahn.de: did not receive HSTS header
latiendadelbebefeliz.com: did not receive HSTS header
-latinphone.com: could not connect to host
latinred.com: did not receive HSTS header
latitude42technology.com: did not receive HSTS header
latour-managedcare.ch: could not connect to host
@@ -10171,10 +10745,12 @@ laureltv.org: did not receive HSTS header
laurent-e-levy.com: did not receive HSTS header
lausitzer-widerstand.de: did not receive HSTS header
lavapot.com: did not receive HSTS header
+lavasing.eu.org: could not connect to host
laventainnhotel-mailing.com: could not connect to host
lavine.ch: did not receive HSTS header
lavito.cz: could not connect to host
lavval.com: could not connect to host
+lawformt.com: max-age too low: 2592000
lawly.org: could not connect to host
lawrence-institute.com: could not connect to host
laxatus.com: could not connect to host
@@ -10192,7 +10768,6 @@ lbrlh.tk: could not connect to host
lbrli.tk: could not connect to host
lbrls.tk: could not connect to host
lbrt.xyz: could not connect to host
-lbsi-nordwest.de: did not receive HSTS header
lcbizsolutions.com: could not connect to host
lclarkpdx.com: could not connect to host
lcti.biz: could not connect to host
@@ -10200,21 +10775,25 @@ lcy.cat: could not connect to host
lcybox.com: did not receive HSTS header
ldarby.me.uk: could not connect to host
ldcraft.pw: could not connect to host
-leadbook.ru: max-age too low: 604800
+le-blog.ch: could not connect to host
+le0.me: could not connect to host
+le0yn.ml: could not connect to host
leadstart.org: did not receive HSTS header
leakedminecraft.net: could not connect to host
leakreporter.net: did not receive HSTS header
leaks.directory: could not connect to host
leanclub.org: could not connect to host
leaodarodesia.com.br: could not connect to host
+leapandjump.co.uk: could not connect to host
leardev.de: did not receive HSTS header
learn-smart.uk: did not receive HSTS header
learnedhacker.com: could not connect to host
-learnedovo.com: did not receive HSTS header
+learnedovo.com: could not connect to host
learnfrenchfluently.com: could not connect to host
learningorder.com: could not connect to host
learntale.com: could not connect to host
lebal.se: could not connect to host
+lebarbatruc.com: did not receive HSTS header
lebosse.me: could not connect to host
lebrun.org: could not connect to host
lecourtier.fr: did not receive HSTS header
@@ -10225,6 +10804,7 @@ ledgerscope.net: could not connect to host
ledhouse.sk: did not receive HSTS header
ledlampor365.se: could not connect to host
ledshop.mx: did not receive HSTS header
+ledzom.ru: did not receive HSTS header
leebiblestudycenter.co.uk: could not connect to host
leebiblestudycenter.com: could not connect to host
leebiblestudycentre.com: could not connect to host
@@ -10236,6 +10816,7 @@ leelou.wedding: could not connect to host
leen.io: could not connect to host
leerkotte.eu: could not connect to host
leetsaber.com: did not receive HSTS header
+legacy.bank: did not receive HSTS header
legal.farm: could not connect to host
legaleus.co.uk: could not connect to host
legalisepeacebloom.com: could not connect to host
@@ -10250,7 +10831,8 @@ legendarycamera.com: did not receive HSTS header
legitaxi.com: did not receive HSTS header
legumefederation.org: did not receive HSTS header
legymnase.eu: did not receive HSTS header
-lehtinen.xyz: could not connect to host
+lehrermarktplatz.de: did not receive HSTS header
+lehtinen.xyz: did not receive HSTS header
leigh.life: did not receive HSTS header
leighneithardt.com: could not connect to host
leiming.co: could not connect to host
@@ -10259,12 +10841,12 @@ leition.com: did not receive HSTS header
leitionusercontent.com: did not receive HSTS header
leitner.com.au: did not receive HSTS header
leiyun.me: could not connect to host
+lelambiental.com.br: did not receive HSTS header
lelehei.com: could not connect to host
lellyboi.ml: could not connect to host
lelongbank.com: did not receive HSTS header
lelubre.info: did not receive HSTS header
lemon.co: could not connect to host
-lemonthy.ca: could not connect to host
lemp.io: did not receive HSTS header
lenders.direct: could not connect to host
lenguajedeprogramacion.com: did not receive HSTS header
@@ -10274,12 +10856,11 @@ lenkunz.me: could not connect to host
lenn1.de: did not receive HSTS header
lennarth.com: could not connect to host
lennartheinrich.de: could not connect to host
-lennier.info: could not connect to host
lennyfaces.net: did not receive HSTS header
lenovogaming.com: could not connect to host
lentri.com: did not receive HSTS header
lenzw.de: did not receive HSTS header
-leob.in: could not connect to host
+leob.in: did not receive HSTS header
leochedibracchio.com: did not receive HSTS header
leodaniels.com: did not receive HSTS header
leon-jaekel.com: could not connect to host
@@ -10287,29 +10868,30 @@ leonardcamacho.me: could not connect to host
leonauto.de: could not connect to host
leonhooijer.nl: could not connect to host
leopold.email: could not connect to host
+leopoldina.net: could not connect to host
leopotamgroup.com: could not connect to host
lepiquillo.fr: did not receive HSTS header
lepont.pl: could not connect to host
leprado.com: could not connect to host
lerasenglish.com: max-age too low: 0
lerlivros.online: could not connect to host
-lerner.moscow: did not receive HSTS header
+lerner.moscow: could not connect to host
les-corsaires.net: could not connect to host
les-voitures-electriques.com: max-age too low: 2592000
+lesaffre.es: could not connect to host
lesbiansslaves.com: could not connect to host
lesbofight.com: could not connect to host
lescomptoirsdepierrot.com: could not connect to host
-lesconteursavis.org: could not connect to host
lescourtiersbordelais.com: did not receive HSTS header
lesdouceursdeliyana.com: could not connect to host
lesecuadors.com: did not receive HSTS header
-lesformations.net: could not connect to host
+lesformations.net: did not receive HSTS header
lesh.eu: could not connect to host
lesharris.com: could not connect to host
-leshervelines.com: could not connect to host
lesliekearney.com: did not receive HSTS header
lesperlesdunet.fr: could not connect to host
lesquatredauphins.fr: did not receive HSTS header
+lesscloud.com: could not connect to host
lessing.consulting: did not receive HSTS header
letempsdunefleur.be: could not connect to host
leter.io: did not receive HSTS header
@@ -10321,12 +10903,12 @@ letreview.ph: could not connect to host
letsgetintouch.com: could not connect to host
letsmultiplayerplay.com: did not receive HSTS header
letsnet.org: could not connect to host
-letsorganise.uk: did not receive HSTS header
letstox.com: could not connect to host
lettland-firma.com: could not connect to host
letustravel.tk: could not connect to host
levatc.tk: could not connect to host
level-10.net: could not connect to host
+levelaccordingly.com: could not connect to host
levelum.com: did not receive HSTS header
levelupwear.com: max-age too low: 7889238
leveredge.net: could not connect to host
@@ -10340,6 +10922,9 @@ lexxyn.nl: did not receive HSTS header
lez-cuties.com: could not connect to host
lezdomsm.com: could not connect to host
lfaz.org: could not connect to host
+lfklzw.com: could not connect to host
+lfrconseil.com: could not connect to host
+lfullerdesign.com: did not receive HSTS header
lg21.co: could not connect to host
lgbtqventures.com: max-age too low: 86400
lgbtventures.com: did not receive HSTS header
@@ -10348,9 +10933,10 @@ lgrs.com.au: did not receive HSTS header
lgsg.us: could not connect to host
lgts.se: could not connect to host
lhasaapso.com.br: could not connect to host
-lheinrich.com: did not receive HSTS header
-lheinrich.de: did not receive HSTS header
+lheinrich.com: could not connect to host
+lheinrich.de: could not connect to host
lheinrich.org: could not connect to host
+lhero.org: did not receive HSTS header
lhsj28.com: could not connect to host
lhsj68.com: could not connect to host
lhsj78.com: could not connect to host
@@ -10362,7 +10948,7 @@ lian-in.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERRO
lian-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
liang-li88.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
liang-li88.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-liangbp.com: could not connect to host
+liangbp.com: did not receive HSTS header
lianwen.kim: could not connect to host
lianye.in: could not connect to host
lianyexiuchang.in: could not connect to host
@@ -10378,8 +10964,9 @@ libfte.org: did not receive HSTS header
librairie-asie.com: did not receive HSTS header
library.linode.com: did not receive HSTS header
librechan.net: could not connect to host
+libreduca.com: could not connect to host
+libremail.nl: could not connect to host
libricks.fr: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-librisulibri.it: did not receive HSTS header
licence-registry.com: could not connect to host
liceo.cn: did not receive HSTS header
liceserv.com: could not connect to host
@@ -10392,7 +10979,6 @@ liebach.me: did not receive HSTS header
liebestarot.at: did not receive HSTS header
lieblingsholz.de: could not connect to host
lied8.eu: could not connect to host
-liehuojun.com: could not connect to host
lietaer.eu: did not receive HSTS header
life-time.nl: did not receive HSTS header
lifecoach.tw: did not receive HSTS header
@@ -10400,15 +10986,16 @@ lifecoachproviders.com: could not connect to host
lifeguard.aecom.com: did not receive HSTS header
lifeinitsownway.com: could not connect to host
lifeinsurances.pro: could not connect to host
-lifeinsurances24.com: did not receive HSTS header
+lifeinsurances24.com: could not connect to host
+lifeisabug.com: could not connect to host
lifemarque.co.uk: did not receive HSTS header
lifenexto.com: could not connect to host
lifeng.us: could not connect to host
+lifequotes-uk.co.uk: could not connect to host
lifeskillsdirect.com: did not receive HSTS header
lifestyle7788.com: could not connect to host
lifestyler.me: could not connect to host
lifetimemoneymachine.com: did not receive HSTS header
-lifeventure.co.uk: did not receive HSTS header
lightarmory.com: could not connect to host
lightcloud.com: did not receive HSTS header
lightdark.xyz: could not connect to host
@@ -10417,7 +11004,6 @@ lightning-ashe.com: did not receive HSTS header
lightnovelsekai.com: could not connect to host
lightpaste.com: could not connect to host
lighttherapydevice.com: did not receive HSTS header
-lighttp.com: could not connect to host
lightworx.io: could not connect to host
lignemalin.com: could not connect to host
lignemax.com: did not receive HSTS header
@@ -10426,8 +11012,9 @@ lijero.co: could not connect to host
likc.me: did not receive HSTS header
like.lgbt: could not connect to host
likenosis.com: could not connect to host
+likui.me: could not connect to host
lila.pink: did not receive HSTS header
-lilapmedia.com: did not receive HSTS header
+lilapmedia.com: could not connect to host
lilismartinis.com: could not connect to host
lillpopp.eu: did not receive HSTS header
lilpwny.com: could not connect to host
@@ -10442,14 +11029,14 @@ limn.me: could not connect to host
limodo-shop.de: did not receive HSTS header
limpens.net: did not receive HSTS header
limpido.it: could not connect to host
-limunana.com: could not connect to host
+limunana.com: did not receive HSTS header
lincolncountytn.gov: could not connect to host
lincsbouncycastlehire.co.uk: did not receive HSTS header
lindberg.io: did not receive HSTS header
-lindnerhof.info: could not connect to host
+lindholmen.club: did not receive HSTS header
lineauniformes.com.br: could not connect to host
linernotekids.com: could not connect to host
-linext.cn: did not receive HSTS header
+linext.cn: could not connect to host
lingerie.net.br: did not receive HSTS header
lingerielovers.com.br: did not receive HSTS header
lingerieonline.com.br: could not connect to host
@@ -10458,13 +11045,15 @@ lingros-test.tk: could not connect to host
lingting.vip: could not connect to host
linguaquote.com: did not receive HSTS header
linhaoyi.com: could not connect to host
-link.ba: could not connect to host
linkage.ph: did not receive HSTS header
linkages.org: could not connect to host
linkonaut.net: could not connect to host
linksanitizer.com: could not connect to host
linksextremist.at: could not connect to host
-linkybos.com: did not receive HSTS header
+linkstream.live: could not connect to host
+linkthis.ml: could not connect to host
+linkthisstatus.ml: could not connect to host
+linkybos.com: could not connect to host
linley.de: could not connect to host
linmi.cc: did not receive HSTS header
linno.me: could not connect to host
@@ -10473,7 +11062,7 @@ linostassi.net: could not connect to host
linux-admin-california.com: could not connect to host
linux-mint.cz: could not connect to host
linux.army: could not connect to host
-linux.im: did not receive HSTS header
+linux.im: could not connect to host
linux.sb: could not connect to host
linuxandstuff.de: could not connect to host
linuxcode.net: could not connect to host
@@ -10484,12 +11073,14 @@ linuxgeek.ro: could not connect to host
linuxincluded.com: did not receive HSTS header
linuxmint.cz: could not connect to host
linuxmonitoring.net: could not connect to host
-linvx.org: did not receive HSTS header
+linvx.org: could not connect to host
linxmind.eu: could not connect to host
lionhosting.nl: could not connect to host
+lionlyrics.com: could not connect to host
lipo.lol: could not connect to host
-liquid.solutions: did not receive HSTS header
+liquid.solutions: could not connect to host
liquidcomm.net: could not connect to host
+liquidradio.pro: could not connect to host
liquidwarp.net: could not connect to host
liquimoly.market: did not receive HSTS header
liquorsanthe.in: could not connect to host
@@ -10497,6 +11088,7 @@ lisaco.de: could not connect to host
lisbongold.com: did not receive HSTS header
lisgade.dk: could not connect to host
lisieuxarquitetura.com.br: could not connect to host
+lisky.ru: did not receive HSTS header
lisowski-photography.com: could not connect to host
lissabon.guide: could not connect to host
listafirmelor.com: could not connect to host
@@ -10505,14 +11097,17 @@ listal.com: could not connect to host
lists.mayfirst.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
litcc.com: could not connect to host
litcomphonors.com: could not connect to host
+literaturpreis-bad-wurzach.de: did not receive HSTS header
litespeed.io: could not connect to host
litevault.net: did not receive HSTS header
little.pw: could not connect to host
+littlecrittersbrewery.com: did not receive HSTS header
littledisney.ro: did not receive HSTS header
littlefreelibrary.org: did not receive HSTS header
-littlelife.co.uk: did not receive HSTS header
+littleqiu.net: could not connect to host
littleservice.cn: could not connect to host
liud.im: could not connect to host
+liufengyu.cn: did not receive HSTS header
liujunyang.com: did not receive HSTS header
liukang.tech: could not connect to host
liushuyu.tk: did not receive HSTS header
@@ -10521,28 +11116,32 @@ livechatlady.info: did not receive HSTS header
livedemo.io: could not connect to host
livej.am: could not connect to host
livejasmin.dk: could not connect to host
+livepath.ch: did not receive HSTS header
liverewrite.com: could not connect to host
livesearch-fukuoka.com: did not receive HSTS header
+livetube.tv: did not receive HSTS header
liviababynet.com.br: could not connect to host
livinghealthywithchocolate.com: did not receive HSTS header
livrariacoad.com.br: could not connect to host
livrariahugodesaovitor.com.br: could not connect to host
+livres-et-stickers.com: did not receive HSTS header
livroseuniformes.com.br: could not connect to host
lixiang.one: could not connect to host
lixiaojiang.ga: could not connect to host
lixingcong.com: could not connect to host
liyinjia.com: did not receive HSTS header
+liyunbin.com: did not receive HSTS header
+lizhi123.net: could not connect to host
lizzythepooch.com: did not receive HSTS header
-ljason.cn: could not connect to host
+ljc.ro: could not connect to host
lkiserver.com: max-age too low: 43200
lll.st: could not connect to host
llvm.us: could not connect to host
-lmerza.com: did not receive HSTS header
lmrcouncil.gov: could not connect to host
ln.io: could not connect to host
lnbeauty.ru: max-age too low: 0
-lnmp.me: could not connect to host
lnoldan.com: could not connect to host
+lnx.li: could not connect to host
loacg.com: did not receive HSTS header
loadingdeck.com: did not receive HSTS header
loadso.me: could not connect to host
@@ -10550,31 +11149,34 @@ loadtraining.com: did not receive HSTS header
loafbox.com: could not connect to host
loafhead.me: could not connect to host
loanmatch.sg: could not connect to host
-loansharkpro.com: could not connect to host
loansonline.today: could not connect to host
loanstreet.be: could not connect to host
lobin21.com: could not connect to host
lobosdomain.ddns.net: could not connect to host
-lobosdomain.hopto.org: could not connect to host
lobosdomain.no-ip.info: could not connect to host
lobste.rs: did not receive HSTS header
locais.org: could not connect to host
-localblitz.com: did not receive HSTS header
localchum.com: could not connect to host
localdata.us: could not connect to host
localdrive.me: could not connect to host
-localhorst.xyz: could not connect to host
+localea.com: max-age too low: 2592000
localnetwork.nz: could not connect to host
+locationvoitureallemagne.com: could not connect to host
+locationvoitureangleterre.com: could not connect to host
+locationvoitureaustralie.com: could not connect to host
locationvoitureautriche.com: could not connect to host
+locationvoiturebelgique.com: could not connect to host
locationvoiturecorse.net: could not connect to host
+locationvoitureespagne.com: could not connect to host
locationvoiturefinlande.com: could not connect to host
locationvoitureirlande.com: did not receive HSTS header
locationvoitureislande.com: could not connect to host
+locationvoitureitalie.com: could not connect to host
locationvoiturenorvege.com: could not connect to host
locationvoiturepaysbas.com: could not connect to host
+locationvoitureportugal.com: could not connect to host
locationvoituresuede.com: could not connect to host
locchat.com: could not connect to host
-locker.email: could not connect to host
locker3.com: could not connect to host
lockify.com: could not connect to host
locksmith-durbannorth.co.za: could not connect to host
@@ -10584,6 +11186,7 @@ locksmithsbluff.com: could not connect to host
locksport.org.nz: could not connect to host
locktheirphone.com: could not connect to host
lockyourcomputer.pw: could not connect to host
+locomore.com: could not connect to host
locomotive.ca: did not receive HSTS header
locvis.ru: did not receive HSTS header
lode.li: could not connect to host
@@ -10593,7 +11196,7 @@ loftboard.eu: could not connect to host
log2n.uk: could not connect to host
logario.com.br: could not connect to host
logcat.info: could not connect to host
-logfro.de: max-age too low: 0
+logfro.de: did not receive HSTS header
logic8.ml: could not connect to host
logicaladvertising.com: could not connect to host
logicchen.com: could not connect to host
@@ -10601,12 +11204,14 @@ logicsale.com: did not receive HSTS header
logicsale.de: did not receive HSTS header
logicsale.fr: did not receive HSTS header
logicsale.it: did not receive HSTS header
+logicz.top: could not connect to host
logimagine.com: did not receive HSTS header
login.corp.google.com: max-age too low: 7776000 (error ignored - included regardless)
login.persona.org: could not connect to host
logingate.hu: could not connect to host
loginseite.com: could not connect to host
logistify.com.mx: did not receive HSTS header
+logitank.net: did not receive HSTS header
lognot.net: could not connect to host
logymedia.com: could not connect to host
lohl1kohl.de: did not receive HSTS header
@@ -10619,31 +11224,37 @@ lojashowdecozinha.com.br: could not connect to host
lojasviavento.com.br: could not connect to host
lojatema.com.br: could not connect to host
lojavalcapelli.com.br: could not connect to host
+lojavirtualfc.com.br: did not receive HSTS header
lojavirtualfct.com.br: did not receive HSTS header
-loli.bz: could not connect to host
+lolcorp.pl: could not connect to host
+loli.bz: did not receive HSTS header
loli.com: could not connect to host
-loli.vip: could not connect to host
+loli.ee: did not receive HSTS header
+lolico.moe: did not receive HSTS header
lolicon.info: could not connect to host
lolicore.ch: could not connect to host
lolidunno.com: could not connect to host
lolis.stream: could not connect to host
lollaconcept.com.br: could not connect to host
-lonasdigital.com: could not connect to host
+lonal.com: could not connect to host
+lonasdigital.com: did not receive HSTS header
lonbali.com: did not receive HSTS header
londoncalling.co: did not receive HSTS header
londonlanguageexchange.com: could not connect to host
londonseedcentre.co.uk: could not connect to host
lonerwolf.com: did not receive HSTS header
-long139.com: could not connect to host
-long18.cc: could not connect to host
-long688.com: could not connect to host
longboarding-ulm.de: could not connect to host
longma.pw: could not connect to host
longtaitouwang.com: did not receive HSTS header
look-at-my.site: could not connect to host
+looka.ch: did not receive HSTS header
+looka.photo: could not connect to host
+lookart.ch: could not connect to host
+looker.wang: could not connect to host
lookout.com: did not receive HSTS header
looktothestars.org: did not receive HSTS header
lookupclose.com: did not receive HSTS header
+lookyman.net: did not receive HSTS header
looneymooney.com: could not connect to host
loongsg.xyz: could not connect to host
loony.info: could not connect to host
@@ -10654,13 +11265,10 @@ lordgun.com: did not receive HSTS header
lordjevington.co.uk: did not receive HSTS header
losebellyfat.pro: could not connect to host
losrascadoresparagatos.com: did not receive HSTS header
-loss.no: could not connect to host
lostandcash.com: could not connect to host
lostarq.com: could not connect to host
lostg.com: did not receive HSTS header
lostinsecurity.com: could not connect to host
-lostinweb.eu: could not connect to host
-lostwithdan.com: could not connect to host
loteks.de: did not receive HSTS header
lothai.re: did not receive HSTS header
lothuytinhsi.com: could not connect to host
@@ -10679,7 +11287,8 @@ loveamber.me: could not connect to host
loveandloyalty.se: could not connect to host
lovebo9.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
lovebo9.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-lovelens.ch: max-age too low: 0
+lovelens.ch: could not connect to host
+lovelens.li: could not connect to host
lovelifelovelive.com: could not connect to host
lovelive-anime.tk: could not connect to host
lovelive-anime.tokyo: could not connect to host
@@ -10694,32 +11303,33 @@ lovemysafetynet.com: did not receive HSTS header
loveread-ec.appspot.com: did not receive HSTS header
loveto.at: could not connect to host
lovetravel360.com: could not connect to host
+loveyounastya.com: could not connect to host
lovingpenguin.com: did not receive HSTS header
lowhangingfruitgrabber.com: could not connect to host
lowt.us: could not connect to host
lowtherpavilion.co.uk: did not receive HSTS header
loxal.org: could not connect to host
loxis.be: did not receive HSTS header
+loyaleco.it: could not connect to host
loyaltech.ch: could not connect to host
lpacademy.com.br: could not connect to host
lpak.nl: could not connect to host
lpcom.de: max-age too low: 172800
lpgram.ga: could not connect to host
lpm-uk.com: did not receive HSTS header
-lqs.me: could not connect to host
+lprcommunity.co.za: did not receive HSTS header
+lqs.me: did not receive HSTS header
lrhsclubs.com: could not connect to host
lrhstsa.com: could not connect to host
ls-a.org: did not receive HSTS header
ls-reallife.de: did not receive HSTS header
ls-rp.es: did not receive HSTS header
-lshiy.com: did not receive HSTS header
lsky.cn: could not connect to host
lsp-sports.de: did not receive HSTS header
lstma.com: could not connect to host
lsvih.com: did not receive HSTS header
lswim.com: did not receive HSTS header
lsws.de: could not connect to host
-lsy.cn: did not receive HSTS header
lszj.com: could not connect to host
ltba.org: could not connect to host
ltbytes.com: could not connect to host
@@ -10728,34 +11338,39 @@ ltransferts.com: could not connect to host
ltu.social: could not connect to host
lubomirkazakov.com: did not receive HSTS header
lubot.net: could not connect to host
+luca.swiss: could not connect to host
lucakrebs.de: could not connect to host
lucas-garte.com: did not receive HSTS header
lucascantor.com: did not receive HSTS header
lucascobb.com: did not receive HSTS header
lucascodes.com: could not connect to host
lucaterzini.com: could not connect to host
-lucianoalbanes.com: did not receive HSTS header
lucidlogs.com: could not connect to host
luckydog.pw: could not connect to host
luckystarfishing.com: did not receive HSTS header
luclu7.pw: could not connect to host
ludwig.click: could not connect to host
+ludwig.im: could not connect to host
lufthansaexperts.com: max-age too low: 2592000
+lufu.io: could not connect to host
luganskservers.net: could not connect to host
luginbuehl.eu: could not connect to host
luis-checa.com: could not connect to host
luisgf.es: did not receive HSTS header
luisv.me: could not connect to host
-luizkowalski.net: could not connect to host
luk.photo: could not connect to host
+lukas-oppermann.de: max-age too low: 0
lukas-schauer.de: did not receive HSTS header
lukas.im: did not receive HSTS header
lukas2511.de: did not receive HSTS header
+lukasoppermann.com: max-age too low: 0
+lukasoppermann.de: max-age too low: 0
lukasschauer.de: did not receive HSTS header
lukasunger.cz: could not connect to host
lukasunger.net: could not connect to host
lukaszdolan.com: did not receive HSTS header
lukasztkacz.com: could not connect to host
+lukatz.de: did not receive HSTS header
lukem.eu: could not connect to host
lukeng.me: could not connect to host
lukonet.com: did not receive HSTS header
@@ -10770,11 +11385,12 @@ lunapatch.com: max-age too low: 7889238
lunarift.com: could not connect to host
lunarrift.net: could not connect to host
luneta.nearbuysystems.com: could not connect to host
+lungta.pro: could not connect to host
lunight.ml: could not connect to host
lunix.io: did not receive HSTS header
luno.io: could not connect to host
luoe.ml: could not connect to host
-luolikong.vip: did not receive HSTS header
+luolikong.vip: could not connect to host
luom.net: could not connect to host
luoxiao.im: could not connect to host
luoxingyu.ml: could not connect to host
@@ -10784,6 +11400,7 @@ lusis.net: could not connect to host
lustige-zitate.com: did not receive HSTS header
lustrumxi.nl: could not connect to host
luther.fi: could not connect to host
+luukuton.fi: did not receive HSTS header
luvplay.co.uk: could not connect to host
luxe-it.co.uk: could not connect to host
luxinmo.com: did not receive HSTS header
@@ -10793,6 +11410,7 @@ luxus-russen.de: could not connect to host
luzeshomologadas.com.br: could not connect to host
lv5.top: could not connect to host
lwhate.com: could not connect to host
+lychankiet.name.vn: could not connect to host
lycly.me: could not connect to host
lycly.top: could not connect to host
lydia-und-simon.de: could not connect to host
@@ -10813,12 +11431,14 @@ lzqii.cn: could not connect to host
lzzr.me: could not connect to host
m-ali.xyz: did not receive HSTS header
m-edmondson.co.uk: did not receive HSTS header
+m-gaming.tk: could not connect to host
m-generator.com: could not connect to host
m-rickroll-v.pw: could not connect to host
m-warrior.tk: could not connect to host
m.gparent.org: could not connect to host
m.nu: did not receive HSTS header
m0wef.uk: could not connect to host
+m132.eu: did not receive HSTS header
m2tc.fr: could not connect to host
m3-gmbh.de: did not receive HSTS header
m4570.xyz: could not connect to host
@@ -10828,7 +11448,7 @@ ma-plancha.ch: did not receive HSTS header
maarten.nyc: could not connect to host
maartenprovo.be: did not receive HSTS header
maartenterpstra.xyz: could not connect to host
-mac-torrents.me: could not connect to host
+mac-torrents.me: did not receive HSTS header
mac-world.pl: did not receive HSTS header
macandtonic.com: could not connect to host
macbolo.com: could not connect to host
@@ -10842,48 +11462,55 @@ machijun.net: did not receive HSTS header
machinelearningjavascript.com: could not connect to host
maciespartyhire.co.uk: did not receive HSTS header
mack.space: could not connect to host
+macker.io: could not connect to host
mackey7.net: did not receive HSTS header
macleodnc.com: did not receive HSTS header
+macoun.de: max-age too low: 2592000
macsandcheesedreams.com: could not connect to host
macstore.pe: did not receive HSTS header
-macustar.eu: did not receive HSTS header
-madbicicletas.com: could not connect to host
+macustar.eu: could not connect to host
+madandpissedoff.com: did not receive HSTS header
madcatdesign.de: did not receive HSTS header
maddin.ga: could not connect to host
made-to-usb.com: did not receive HSTS header
madebyfalcon.co.uk: did not receive HSTS header
madebymagnitude.com: did not receive HSTS header
madeglobal.com: did not receive HSTS header
+madeinchezmoi.net: could not connect to host
madeinorder.com: could not connect to host
madeintucson.org: could not connect to host
mademoiselle-emma.be: could not connect to host
-mademoiselle-emma.fr: did not receive HSTS header
+mademoiselle-emma.fr: could not connect to host
maderasbrown.com: could not connect to host
maderwin.com: did not receive HSTS header
madesoftware.com.br: could not connect to host
madnetwork.org: could not connect to host
madokami.net: could not connect to host
+madokami.pw: could not connect to host
madpeople.net: max-age too low: 2592000
madrants.net: could not connect to host
maerzpa.de: did not receive HSTS header
+maestrano.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
mafamane.com: could not connect to host
-maff.scot: could not connect to host
mafiareturns.com: max-age too low: 2592000
magazinedabeleza.net: could not connect to host
+magbt.net: could not connect to host
magebankin.com: did not receive HSTS header
magenx.com: did not receive HSTS header
+maggie-shaw.co.uk: did not receive HSTS header
magia360.com: did not receive HSTS header
-magickmoments.co.uk: did not receive HSTS header
+magicalshuttle.fr: did not receive HSTS header
+magickmoments.co.uk: could not connect to host
magieamour.com: did not receive HSTS header
magieblanche.fr: did not receive HSTS header
magnacumlaude.co: could not connect to host
-magneticanvil.com: did not receive HSTS header
+magnettracker.com: could not connect to host
magosmedellin.com: could not connect to host
magyarokegyhelyen.hu: did not receive HSTS header
mahamed91.pw: could not connect to host
mahansexcavating.com: did not receive HSTS header
mahfouzadedimeji.com: did not receive HSTS header
-mahraartisan.com: could not connect to host
+mahraartisan.com: max-age too low: 7889238
maik-mahlow.de: could not connect to host
mail-settings.google.com: did not receive HSTS header (error ignored - included regardless)
mail.google.com: did not receive HSTS header (error ignored - included regardless)
@@ -10892,7 +11519,7 @@ mailchuck.com: could not connect to host
maildragon.com: did not receive HSTS header
mailgarant.nl: could not connect to host
mailhost.it: could not connect to host
-mailing-femprendedores.com: could not connect to host
+mailing-femprendedores.com: did not receive HSTS header
mailing-jbgg.com: could not connect to host
maillink.store: could not connect to host
mailon.ga: could not connect to host
@@ -10905,27 +11532,27 @@ maisalto.ind.br: could not connect to host
maitrechaton.fr: did not receive HSTS header
maitriser-son-stress.com: could not connect to host
majesticcolorado.com: did not receive HSTS header
-majkl.me: could not connect to host
-majkl.xyz: could not connect to host
-majkl578.cz: could not connect to host
majncloud.tk: could not connect to host
make-pizza.info: could not connect to host
makedonien.guide: could not connect to host
+makedonija.net.mk: did not receive HSTS header
makeit-so.de: could not connect to host
makeitdynamic.com: could not connect to host
makemejob.com: could not connect to host
makemyvape.co.uk: max-age too low: 7889238
-makerstuff.net: could not connect to host
+makerstuff.net: did not receive HSTS header
makeshiftco.de: could not connect to host
makeuplove.nl: could not connect to host
-makeyourlaws.org: did not receive HSTS header
+makeyourlaws.org: could not connect to host
makino.games: could not connect to host
+makkyon.com: could not connect to host
malamutedoalasca.com.br: could not connect to host
maldiverna.guide: could not connect to host
maleexcel.com: did not receive HSTS header
malena.com.ua: did not receive HSTS header
malerversand.de: did not receive HSTS header
malesbdsm.com: could not connect to host
+malezan.com: did not receive HSTS header
malfait.nl: could not connect to host
malgraph.net: could not connect to host
malibubeachrecoverycenter.com: could not connect to host
@@ -10933,22 +11560,25 @@ maljaars-media.nl: could not connect to host
malkaso.com.ua: could not connect to host
malmstroms-co.se: could not connect to host
malone.link: could not connect to host
-malte-kiefer.de: did not receive HSTS header
maltes.website: could not connect to host
malvy.kiev.ua: could not connect to host
+malwarekillers.com: could not connect to host
malwareverse.us: did not receive HSTS header
malwre.io: could not connect to host
maly.io: did not receive HSTS header
malya.fr: could not connect to host
+mamaasia.info: did not receive HSTS header
mamacobaby.com: did not receive HSTS header
mamaison.io: could not connect to host
mamastore.eu: could not connect to host
-mamaxi.org: did not receive HSTS header
+mambas.cn: could not connect to host
+mammooc.org: did not receive HSTS header
mammothmail.com: could not connect to host
mammothmail.net: could not connect to host
mammothmail.org: could not connect to host
mammut.space: could not connect to host
mamochka.org.ua: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+mamospienas.lt: did not receive HSTS header
mamout.xyz: could not connect to host
manaboutahor.se: could not connect to host
manage.zenpayroll.com: did not receive HSTS header
@@ -10969,9 +11599,10 @@ mandpress.com: did not receive HSTS header
mangapoi.com: could not connect to host
mangazuki.co: could not connect to host
maniadeprazer.com.br: could not connect to host
-manifestbin.com: did not receive HSTS header
+manifestbin.com: could not connect to host
manipulatedtme.com: could not connect to host
manitasicily.com: did not receive HSTS header
+maniw.com: could not connect to host
mannford.com: could not connect to host
manningbrothers.com: did not receive HSTS header
manns-solutions.com: did not receive HSTS header
@@ -10995,19 +11626,22 @@ maomaofuli.vip: could not connect to host
maosi.xin: could not connect to host
maple5.com: did not receive HSTS header
maplenorth.co: could not connect to host
-mapresidentielle.fr: did not receive HSTS header
+maps.net: did not receive HSTS header
mapservices.nl: did not receive HSTS header
maquillage-permanent-tatoo.com: did not receive HSTS header
maquininhamercadopoint.com.br: could not connect to host
maranatha.pl: did not receive HSTS header
-marbinvest.com: did not receive HSTS header
+marbinvest.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
marcaudefroy.com: did not receive HSTS header
marcberman.co: did not receive HSTS header
+marcberndtgen.de: could not connect to host
marcbuehlmann.com: did not receive HSTS header
+marcceleiro.cat: could not connect to host
marcelmarnitz.com: could not connect to host
marcelparra.com: could not connect to host
marchagen.nl: did not receive HSTS header
marche-nordic-jorat.ch: could not connect to host
+marchwj.pl: did not receive HSTS header
marco-kretz.de: did not receive HSTS header
marco01809.net: could not connect to host
marcoececilia.it: did not receive HSTS header
@@ -11027,6 +11661,7 @@ margaretrosefashions.co.uk: could not connect to host
margo.ml: could not connect to host
mariacorzo.com: could not connect to host
mariacristinadoces.com.br: did not receive HSTS header
+mariage-photo.ch: could not connect to host
mariannematthew.com: could not connect to host
marianwehlus.de: did not receive HSTS header
mariaolesen.dk: could not connect to host
@@ -11049,30 +11684,34 @@ marketingdesignu.cz: could not connect to host
marketingromania.ro: did not receive HSTS header
marketio.co: did not receive HSTS header
marketlinks.org: did not receive HSTS header
+markholden.guru: could not connect to host
markllego.com: could not connect to host
-marko-fenster24.de: did not receive HSTS header
+marko-fenster24.de: could not connect to host
markorszulak.com: did not receive HSTS header
markow.io: max-age too low: 7776000
markrego.com: could not connect to host
marksill.com: could not connect to host
marktboten.de: did not receive HSTS header
+marktplaatshelper.nl: did not receive HSTS header
markusabraham.com: did not receive HSTS header
markusgran.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
markusueberallassetmanagement.de: could not connect to host
markusueberallconsulting.de: could not connect to host
markusweimar.de: did not receive HSTS header
marlen.cz: did not receive HSTS header
-marleyresort.com: did not receive HSTS header
+marleyresort.com: could not connect to host
marlonschultz.de: did not receive HSTS header
+marocmail.ma: could not connect to host
+marotero.com: did not receive HSTS header
marqperso.ch: could not connect to host
marquepersonnelle.ch: could not connect to host
marriottvetcareers.com: could not connect to host
marsatapp.com: could not connect to host
-marsble.com: did not receive HSTS header
marshallford.me: could not connect to host
marshut.net: could not connect to host
martialc.be: could not connect to host
martiert.com: could not connect to host
+martiestrimsalon.nl: did not receive HSTS header
martijnvhoof.nl: could not connect to host
martin-arend.de: did not receive HSTS header
martin-mattel.com: could not connect to host
@@ -11083,11 +11722,13 @@ martingansler.de: did not receive HSTS header
martinkup.cz: did not receive HSTS header
martinp.no: could not connect to host
martinrogalla.com: did not receive HSTS header
-martins.im: could not connect to host
+martynhare.co.uk: could not connect to host
+martynhare.uk: could not connect to host
marumagic.com: could not connect to host
marvinkeller.de: did not receive HSTS header
marxist.party: could not connect to host
marykshoup.com: could not connect to host
+marzio.co.za: did not receive HSTS header
masa-hou.com: did not receive HSTS header
masa-yoga.com: did not receive HSTS header
masa.li: could not connect to host
@@ -11095,12 +11736,14 @@ masaze-hanka.cz: could not connect to host
mascorazon.com: could not connect to host
mashek.net: could not connect to host
mashnew.com: could not connect to host
+masiul.is: could not connect to host
masjidtawheed.net: did not receive HSTS header
maskice.hr: did not receive HSTS header
maskinkultur.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
maskt.pw: could not connect to host
-maslife365.com: could not connect to host
+maslife365.com: did not receive HSTS header
massagelimaperu.com: did not receive HSTS header
+massagetherapyschoolsinformation.com: did not receive HSTS header
massivum.de: did not receive HSTS header
massot.eu: did not receive HSTS header
mastd.fr: could not connect to host
@@ -11135,10 +11778,11 @@ matchneedle.com: did not receive HSTS header
mateusmeyer.com.br: could not connect to host
mateuszpilszek.pl: could not connect to host
mathematris.com: could not connect to host
+mathembedded.com: did not receive HSTS header
mathers.ovh: did not receive HSTS header
matheusmacedo.ddns.net: could not connect to host
+mathias.is: could not connect to host
mathias.re: did not receive HSTS header
-mathieui.net: could not connect to host
mathijskingma.nl: could not connect to host
mathsource.ga: could not connect to host
mathsweek.nz: could not connect to host
@@ -11161,6 +11805,7 @@ matthew-carson.info: could not connect to host
matthewemes.com: did not receive HSTS header
matthewprenger.com: could not connect to host
matthewtester.com: did not receive HSTS header
+matthiasadler.info: did not receive HSTS header
matthiassteen.be: could not connect to host
matthiasweiler.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
mattia98.org: did not receive HSTS header
@@ -11176,10 +11821,13 @@ maurus-automation.de: did not receive HSTS header
mausi.co: did not receive HSTS header
mavisang.cf: could not connect to host
mawe.red: could not connect to host
+mawidabp.com: did not receive HSTS header
+mawidaca.com: did not receive HSTS header
max-mad.com: could not connect to host
maxbachmann.de: did not receive HSTS header
maxdev72.freeboxos.fr: could not connect to host
-maxfox.me: could not connect to host
+maxfox.me: did not receive HSTS header
+maxhoechtl.at: could not connect to host
maxhorvath.com: could not connect to host
maxibanki.ovh: could not connect to host
maxicore.co.za: could not connect to host
@@ -11188,12 +11836,14 @@ maximelouet.me: did not receive HSTS header
maximov.space: did not receive HSTS header
maxkeller.io: did not receive HSTS header
maxmachine.ind.br: could not connect to host
+maxr1998.de: could not connect to host
maxserver.com: did not receive HSTS header
maya-ro.com: could not connect to host
maya.mg: could not connect to host
maybeul.com: could not connect to host
+maydex.info: could not connect to host
maynardnetworks.com: could not connect to host
-mayoimobiliare.ro: did not receive HSTS header
+mayoimobiliare.ro: could not connect to host
mayoristassexshop.com: did not receive HSTS header
mazternet.ru: could not connect to host
mazyun.com: did not receive HSTS header
@@ -11209,6 +11859,7 @@ mcadmin.net: could not connect to host
mcard.vn: did not receive HSTS header
mcb-bank.com: did not receive HSTS header
mcc.re: could not connect to host
+mccarty.io: could not connect to host
mccordworks.com: did not receive HSTS header
mcdanieldevelopmentservices.com: could not connect to host
mcdonalds.ru: did not receive HSTS header
@@ -11218,9 +11869,9 @@ mchan.us: did not receive HSTS header
mchopkins.net: could not connect to host
mcideas.tk: could not connect to host
mcjackk77.com: could not connect to host
+mckenry.net: did not receive HSTS header
mckinley1.com: could not connect to host
mckinleytk.com: could not connect to host
-mcl.gg: did not receive HSTS header
mclab.su: max-age too low: 2592000
mclist.it: could not connect to host
mcnoobs.pro: could not connect to host
@@ -11230,9 +11881,9 @@ mcsa-usa.org: could not connect to host
mcsniper.co: could not connect to host
mcsnovatamabayan.com: could not connect to host
mctherealm.net: could not connect to host
-mcuexchange.com: did not receive HSTS header
mcuong.tk: could not connect to host
md-student.com: did not receive HSTS header
+mdazo.net: could not connect to host
mdbouncycastlehirelondon.co.uk: did not receive HSTS header
mdcloudpracticesolutions.com: could not connect to host
mdfnet.se: did not receive HSTS header
@@ -11251,27 +11902,32 @@ mecenat-cassous.com: did not receive HSTS header
mechok.ru: could not connect to host
medallia.io: could not connect to host
meddatix.com: could not connect to host
+mede-handover.azurewebsites.net: could not connect to host
medi-link.co.il: did not receive HSTS header
media-access.online: did not receive HSTS header
media-courses.com: could not connect to host
+media-service.fr: did not receive HSTS header
mediabm.jp: did not receive HSTS header
mediacru.sh: could not connect to host
mediadandy.com: could not connect to host
mediafinancelab.org: could not connect to host
mediamag.am: max-age too low: 0
mediarocks.de: did not receive HSTS header
-mediastorm.us: could not connect to host
+mediastorm.us: did not receive HSTS header
+mediavault.tech: could not connect to host
mediawikicn.org: could not connect to host
medicinskavranje.edu.rs: could not connect to host
medienservice-fritz.de: did not receive HSTS header
medifab.online: did not receive HSTS header
medirich.co: could not connect to host
meditek-dv.ru: did not receive HSTS header
+meditel.nl: did not receive HSTS header
mediter-simplement.com: did not receive HSTS header
mediterenopmaandag.nl: did not receive HSTS header
-mediumraw.org: did not receive HSTS header
+mediumraw.org: could not connect to host
mediweed.tk: could not connect to host
medm-test.com: could not connect to host
+medmarkt24.com: did not receive HSTS header
medpot.net: did not receive HSTS header
medsindex.com: did not receive HSTS header
medstreaming.com: did not receive HSTS header
@@ -11280,17 +11936,22 @@ medy-me.com: could not connect to host
medzinenews.com: did not receive HSTS header
meedoenzaanstad.nl: did not receive HSTS header
meetfinch.com: could not connect to host
+meetmibaby.co.uk: could not connect to host
mega-aukcion.ru: could not connect to host
megadrol.com: could not connect to host
+megafilmesplay.net: did not receive HSTS header
megaflix.nl: could not connect to host
megakiste.de: could not connect to host
megam.host: could not connect to host
megamarkey.de: did not receive HSTS header
+megaplonk.com: could not connect to host
megashur.se: could not connect to host
megasystem.cl: could not connect to host
meghudson.com: could not connect to host
+megustariasaber.com: did not receive HSTS header
meifrench.com: could not connect to host
meilleur.xyz: did not receive HSTS header
+meimeistartup.com: could not connect to host
meincloudspeicher.de: could not connect to host
meine-plancha.ch: did not receive HSTS header
meine-reise-gut-versichert.de: did not receive HSTS header
@@ -11300,6 +11961,7 @@ meizufans.eu: could not connect to host
melakaltenegger.at: did not receive HSTS header
melangebrasil.com: could not connect to host
melaniebilodeau.com: did not receive HSTS header
+melbyjuliapak.com: could not connect to host
melcher.it: did not receive HSTS header
melenchatsmelenchiens.fr: could not connect to host
melf.nl: could not connect to host
@@ -11321,7 +11983,6 @@ memberstweets.com: could not connect to host
memdoc.org: could not connect to host
memeblast.ninja: could not connect to host
memepasmal.org: could not connect to host
-memes.nz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
memetrash.co.uk: could not connect to host
memind.net: could not connect to host
memory-plus-180.com: could not connect to host
@@ -11331,8 +11992,9 @@ menaraannonces.com: could not connect to host
menchez.me: could not connect to host
menhera.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
menntagatt.is: did not receive HSTS header
-menotag.com: could not connect to host
+menotag.com: did not receive HSTS header
mensachterdepatient.nl: max-age too low: 2592000
+mensagensperfeitas.com.br: did not receive HSTS header
mensmaximus.de: did not receive HSTS header
mentalhealth.gov: did not receive HSTS header
mentax.net: did not receive HSTS header
@@ -11346,7 +12008,8 @@ menzel-motors.com: did not receive HSTS header
meo.de: could not connect to host
meow.cloud: could not connect to host
meozcraft.com: could not connect to host
-meraseo.com: could not connect to host
+mercadobitcoin.com.br: did not receive HSTS header
+mercadobitcoin.net: did not receive HSTS header
mercanix.co.uk: could not connect to host
merccorp.de: max-age too low: 0
mercedes-benz-usedcars.be: could not connect to host
@@ -11354,11 +12017,15 @@ mercury-studio.com: did not receive HSTS header
mereckas.com: could not connect to host
meredithkm.info: did not receive HSTS header
mergozzo.com: did not receive HSTS header
+meridianstore.com.br: could not connect to host
merimatka.fi: could not connect to host
meritz.rocks: could not connect to host
merloat.club: could not connect to host
+merloat.com: could not connect to host
+mers.one: could not connect to host
mersinunivercity.com: could not connect to host
merson.me: could not connect to host
+merson.org: could not connect to host
mertak.cz: did not receive HSTS header
meshlab.co: could not connect to host
meshotes.com: max-age too low: 8640000
@@ -11366,11 +12033,14 @@ meskdeals.com: could not connect to host
mesmoque.com: could not connect to host
messagescelestes-archives.ca: did not receive HSTS header
messagescelestes.ca: did not receive HSTS header
+metadatawiki.com: did not receive HSTS header
metadistribution.com: did not receive HSTS header
metagrader.com: could not connect to host
metalsculpture.co.uk: max-age too low: 0
metanic.org: did not receive HSTS header
metasyntactic.xyz: could not connect to host
+metavetted.com: did not receive HSTS header
+meteosherbrooke.com: could not connect to host
meteosky.net: did not receive HSTS header
metikam.pl: did not receive HSTS header
metin2blog.de: did not receive HSTS header
@@ -11380,39 +12050,43 @@ metrans-spedition.de: could not connect to host
metricaid.com: did not receive HSTS header
metrix-money-ptc.com: could not connect to host
metrix.design: could not connect to host
+metrobriefs.com: could not connect to host
metropolisil.gov: did not receive HSTS header
+metsasta.com: could not connect to host
metzgerei-birkenhof.de: could not connect to host
meu-smartphone.com: did not receive HSTS header
-meucosmetico.com.br: could not connect to host
+meucosmetico.com.br: did not receive HSTS header
meuemail.pro: could not connect to host
meupedido.online: did not receive HSTS header
meusigno.com: could not connect to host
-mevanshop.com: could not connect to host
mexbt.com: could not connect to host
mexicanbusinessweb.mx: did not receive HSTS header
-mexicansbook.ru: could not connect to host
+mexicansbook.ru: did not receive HSTS header
mexior.nl: could not connect to host
meyeraviation.com: could not connect to host
mfacko.cz: did not receive HSTS header
mfcatalin.com: could not connect to host
mfedderke.com: could not connect to host
mfgod.com: did not receive HSTS header
+mfgusa.com: could not connect to host
mfiles.pl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
mfpccprod.com: could not connect to host
mfrsgb45.org: did not receive HSTS header
mft.global: could not connect to host
mfxer.com: could not connect to host
+mfxxx.cn: could not connect to host
mfz.mk: did not receive HSTS header
-mgcraft.net: could not connect to host
-mgdigital.fr: could not connect to host
+mgcraft.net: did not receive HSTS header
+mgdigital.fr: did not receive HSTS header
mgiay.com: did not receive HSTS header
+mgknet.com: did not receive HSTS header
mgoessel.de: did not receive HSTS header
mh-bloemen.co.jp: could not connect to host
mhdsyarif.com: did not receive HSTS header
mhealthdemocamp.com: could not connect to host
mhertel.com: did not receive HSTS header
mhict.nl: could not connect to host
-mhjuma.com: could not connect to host
+mhmfoundationrepair.com: could not connect to host
mht-travel.com: could not connect to host
mhx.pw: could not connect to host
mia.ac: could not connect to host
@@ -11420,10 +12094,10 @@ mia.to: could not connect to host
miamicityballet.org: did not receive HSTS header
mianfei-vpn.com: could not connect to host
miboulot.com: could not connect to host
-micaiahparker.com: could not connect to host
+micaiahparker.com: did not receive HSTS header
micasamgmt.com: did not receive HSTS header
-michaelcullen.name: could not connect to host
michaeldemuth.com: could not connect to host
+michaeleichorn.com: could not connect to host
michaelfitzpatrickruth.com: did not receive HSTS header
michaelizquierdo.com: max-age too low: 0
michaelklos.nl: did not receive HSTS header
@@ -11431,6 +12105,7 @@ michaelmorpurgo.com: did not receive HSTS header
michaeln.net: did not receive HSTS header
michaels-homepage-service.de: could not connect to host
michaelscrivo.com: did not receive HSTS header
+michaelsnoeren.nl: did not receive HSTS header
michaelsulzer.com: did not receive HSTS header
michaelsulzer.eu: did not receive HSTS header
michaelwaite.org: could not connect to host
@@ -11444,6 +12119,8 @@ michel.pt: did not receive HSTS header
michelledonelan.co.uk: did not receive HSTS header
michiganmetalartwork.com: max-age too low: 7889238
mico.world: could not connect to host
+micomi.co: could not connect to host
+miconcinemas.com: could not connect to host
miconware.de: could not connect to host
micro-dv.ru: could not connect to host
micro-rain-systems.com: did not receive HSTS header
@@ -11455,14 +12132,17 @@ microtalk.org: could not connect to host
middletowndelcopa.gov: could not connect to host
midirs.org: did not receive HSTS header
midlgx.com: max-age too low: 0
+midnight-visions.de: could not connect to host
midonet.org: did not receive HSTS header
midriversmotorsllc.com: did not receive HSTS header
midterm.us: could not connect to host
midweststructuralrepair.com: could not connect to host
midwestwomenworkers.org: could not connect to host
-miegl.cz: could not connect to host
+miembarcacion.com: could not connect to host
miemie.jp: could not connect to host
mieterschutzkartei.de: could not connect to host
+mieuxvivreadarvoy.fr: could not connect to host
+mifibra.cl: did not receive HSTS header
migeeks.de: did not receive HSTS header
mightydicks.io: could not connect to host
mightydicks.tech: could not connect to host
@@ -11473,6 +12153,7 @@ migrator.co: could not connect to host
miguelgfierro.com: did not receive HSTS header
miguksaram.com: could not connect to host
mijn-email.org: could not connect to host
+mijnavg.eu: max-age too low: 0
mijndiad.nl: did not receive HSTS header
mijnetickets.nl: did not receive HSTS header
mijnkredietpaspoort.nl: could not connect to host
@@ -11480,14 +12161,16 @@ mijnsite.ovh: could not connect to host
mika.cat: could not connect to host
mikadesign.se: did not receive HSTS header
mikaelemilsson.net: did not receive HSTS header
-mikeburns.com: could not connect to host
+mikeburns.com: did not receive HSTS header
mikedugan.org: did not receive HSTS header
mikeg.de: did not receive HSTS header
mikek.work: did not receive HSTS header
mikeology.org: could not connect to host
mikepair.net: could not connect to host
mikes.tk: did not receive HSTS header
+mikewritesstuff.com: could not connect to host
mikeybot.com: could not connect to host
+mikhirev.ru: could not connect to host
mikii.club: could not connect to host
mikk.cz: could not connect to host
mikori.sk: did not receive HSTS header
@@ -11498,6 +12181,8 @@ miku.hatsune.my: did not receive HSTS header
miku.party: could not connect to host
mikumiku.stream: could not connect to host
mikusinec.com: could not connect to host
+mikywow.eu: did not receive HSTS header
+mil0.com: could not connect to host
milahendri.com: did not receive HSTS header
milang.xyz: could not connect to host
milatrans.pl: did not receive HSTS header
@@ -11509,16 +12194,17 @@ militaryconsumer.gov: did not receive HSTS header
milkingit.net: could not connect to host
millibitcoin.jp: could not connect to host
million5.com: did not receive HSTS header
-million6.com: did not receive HSTS header
+million6.com: could not connect to host
million8.com: did not receive HSTS header
millionairessecrets.com: could not connect to host
+millions1.com: could not connect to host
millions11.com: did not receive HSTS header
millions13.com: did not receive HSTS header
millions14.com: did not receive HSTS header
millions15.com: did not receive HSTS header
millions16.com: did not receive HSTS header
-millions17.com: did not receive HSTS header
-millions19.com: did not receive HSTS header
+millions17.com: could not connect to host
+millions19.com: could not connect to host
millions20.com: did not receive HSTS header
millions22.com: did not receive HSTS header
millions25.com: did not receive HSTS header
@@ -11532,18 +12218,23 @@ millions35.com: did not receive HSTS header
millions36.com: did not receive HSTS header
millions37.com: did not receive HSTS header
millions38.com: did not receive HSTS header
-millions39.com: could not connect to host
+millions39.com: did not receive HSTS header
millions40.com: could not connect to host
millions41.com: could not connect to host
millions42.com: could not connect to host
-millions43.com: could not connect to host
+millions43.com: did not receive HSTS header
millions5.com: did not receive HSTS header
millions50.com: did not receive HSTS header
+millions51.com: could not connect to host
+millions52.com: could not connect to host
+millions53.com: could not connect to host
millions55.com: did not receive HSTS header
millions56.com: did not receive HSTS header
+millions57.com: did not receive HSTS header
millions58.com: did not receive HSTS header
millions59.com: did not receive HSTS header
millions6.com: did not receive HSTS header
+millions60.com: did not receive HSTS header
millions61.com: did not receive HSTS header
millions62.com: did not receive HSTS header
millions63.com: did not receive HSTS header
@@ -11552,9 +12243,11 @@ millions7.com: did not receive HSTS header
millions70.com: did not receive HSTS header
millions71.com: did not receive HSTS header
millions72.com: did not receive HSTS header
+millions77.com: could not connect to host
+millions8.com: could not connect to host
millions80.com: did not receive HSTS header
millions81.com: did not receive HSTS header
-millions82.com: did not receive HSTS header
+millions82.com: could not connect to host
millions88.com: did not receive HSTS header
millions9.com: did not receive HSTS header
millions99.com: did not receive HSTS header
@@ -11575,7 +12268,7 @@ mindbodytherapymn.com: did not receive HSTS header
mindcell.no: could not connect to host
mindcraft.ga: could not connect to host
mindwork.space: could not connect to host
-mine.world: did not receive HSTS header
+mine.world: could not connect to host
minecraft-forum.cf: could not connect to host
minecraft-forum.ga: could not connect to host
minecraft-forum.gq: could not connect to host
@@ -11589,11 +12282,9 @@ minecraftforums.gq: could not connect to host
minecraftforums.ml: could not connect to host
minecraftserverz.com: could not connect to host
minecraftvoter.com: could not connect to host
-minei.me: did not receive HSTS header
mineover.es: could not connect to host
minetude.com: could not connect to host
mingkyaa.com: could not connect to host
-mingming.info: did not receive HSTS header
mingo.nl: max-age too low: 2592000
mingy.ddns.net: could not connect to host
mingyueli.com: could not connect to host
@@ -11604,25 +12295,27 @@ minimaliston.com: could not connect to host
minimoo.se: could not connect to host
minipainting.net: could not connect to host
miniskipper.at: did not receive HSTS header
+minitruckin.net: could not connect to host
miniwallaby.com: could not connect to host
minkondom.nu: could not connect to host
minnesotadata.com: could not connect to host
-minor.news: did not receive HSTS header
+minnesotamathcorps.org: did not receive HSTS header
+minor.news: could not connect to host
minora.io: could not connect to host
minoris.se: did not receive HSTS header
mintea-noua.ro: could not connect to host
-minu.link: could not connect to host
mipiaci.co.nz: did not receive HSTS header
mipiaci.com.au: did not receive HSTS header
-mipla.ch: could not connect to host
+mipla.ch: did not receive HSTS header
miragrow.com: could not connect to host
mireillewendling.com.br: could not connect to host
+mirete.info: did not receive HSTS header
mirgleich.dnshome.de: could not connect to host
mirindadomo.ru: did not receive HSTS header
-mirodasilva.be: could not connect to host
mironized.com: did not receive HSTS header
+mirrorbot.ga: did not receive HSTS header
mirrorsedgearchive.ga: could not connect to host
-mirrorx.com: did not receive HSTS header
+mirrorx.com: could not connect to host
miruc.co: did not receive HSTS header
mirucon.com: did not receive HSTS header
misconfigured.io: could not connect to host
@@ -11635,7 +12328,7 @@ missrain.tw: could not connect to host
missycosmeticos.com.br: could not connect to host
mist.ink: could not connect to host
mister-cooks.fr: did not receive HSTS header
-mister.hosting: did not receive HSTS header
+mister.hosting: could not connect to host
misterl.net: did not receive HSTS header
mitarbeiter-pc.de: did not receive HSTS header
mitchellrenouf.ca: could not connect to host
@@ -11646,18 +12339,24 @@ mittenhacks.com: could not connect to host
mityinc.com: did not receive HSTS header
miukimodafeminina.com: could not connect to host
mivcon.net: could not connect to host
+mivestuariolaboral.com: did not receive HSTS header
+mivzaklive.co.il: did not receive HSTS header
mixer.cash: could not connect to host
+mixnshake.com: did not receive HSTS header
miya.io: could not connect to host
miyako-kyoto.jp: could not connect to host
miyoshi-kikaku.co.jp: could not connect to host
+miyugirls.com: could not connect to host
mizd.at: could not connect to host
mizi.name: could not connect to host
mizumax.me: could not connect to host
mjcaffarattilaw.com: did not receive HSTS header
-mjhsc.nl: did not receive HSTS header
+mjhsc.nl: could not connect to host
+mjscustomcreations.com.au: did not receive HSTS header
mk-dizajn.com: could not connect to host
mkacg.com: could not connect to host
mkakh.xyz: could not connect to host
+mkasu.org: max-age too low: 7776000
mkfs.be: could not connect to host
mkfs.fr: could not connect to host
mkg-palais-hanau.de: did not receive HSTS header
@@ -11675,17 +12374,18 @@ mlpvc-rr.ml: did not receive HSTS header
mlrslateroofing.com.au: did not receive HSTS header
mlsrv.de: could not connect to host
mm-wife.com: could not connect to host
-mm13.at: could not connect to host
mmaps.ddns.net: could not connect to host
+mmaps.org: could not connect to host
mmarnitz.de: could not connect to host
mmcc.pe: did not receive HSTS header
-mmgazhomeloans.com: did not receive HSTS header
+mmgazhomeloans.com: could not connect to host
mmilog.hu: could not connect to host
+mmmaximaliselmeny.hu: could not connect to host
mmmm.com: could not connect to host
mmstick.tk: could not connect to host
-mna7e.com: did not receive HSTS header
mncr.nl: could not connect to host
mnec.io: could not connect to host
+mnedc.org: could not connect to host
mneeb.de: could not connect to host
mnemotiv.com: could not connect to host
mnetworkingsolutions.co.uk: could not connect to host
@@ -11693,10 +12393,10 @@ mnmt.no: did not receive HSTS header
mnwt.nl: could not connect to host
mo3.club: could not connect to host
moar.so: did not receive HSTS header
-moas.design: did not receive HSTS header
-moas.photos: did not receive HSTS header
mobaircon.com: did not receive HSTS header
mobi4.tk: could not connect to host
+mobidea.com: did not receive HSTS header
+mobil-bei-uns.de: did not receive HSTS header
mobile-gesundheit.org: could not connect to host
mobile.eti.br: could not connect to host
mobilebay.top: could not connect to host
@@ -11715,15 +12415,18 @@ mobmp4.co: could not connect to host
mobmp4.com: could not connect to host
mobmp4.info: could not connect to host
mobot.sg: did not receive HSTS header
+mocarps.hk: did not receive HSTS header
+mochiyuki.net: could not connect to host
mochoko.com: could not connect to host
mockmyapp.com: could not connect to host
mocloud.eu: could not connect to host
mocloud.win: could not connect to host
mocsuite.club: could not connect to host
-mocurio.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+mocurio.com: could not connect to host
modalrakyat.com: could not connect to host
modalrakyat.id: did not receive HSTS header
modaperuimport.com: could not connect to host
+modav.org: could not connect to host
modcentral.pw: max-age too low: 2592000
modded-minecraft-server-list.com: could not connect to host
moddedark.com: could not connect to host
@@ -11736,6 +12439,7 @@ modemagazines.co.uk: could not connect to host
moderatortv.de: did not receive HSTS header
modernibytovytextil.cz: could not connect to host
moderntld.net: could not connect to host
+modistryusercontent.com: could not connect to host
mododo.de: could not connect to host
modx.by: max-age too low: 31536
modx.io: could not connect to host
@@ -11753,8 +12457,10 @@ moeloli.pw: did not receive HSTS header
moelord.org: could not connect to host
moen.io: did not receive HSTS header
moevenpick-cafe.com: did not receive HSTS header
-moeyun.net: max-age too low: 86400
-mogry.net: did not receive HSTS header
+moeyoo.net: could not connect to host
+moeyun.net: max-age too low: 2592000
+mogooin.com: did not receive HSTS header
+mogry.net: could not connect to host
mohio.co.nz: did not receive HSTS header
moho.kr: could not connect to host
mohs.es: could not connect to host
@@ -11762,10 +12468,9 @@ moitur.com: did not receive HSTS header
mojapraca.sk: did not receive HSTS header
mojefilmy.xyz: could not connect to host
mojizuri.jp: max-age too low: 86400
-mojnet.eu: could not connect to host
-mojnet.net: could not connect to host
mokadev.com: did not receive HSTS header
mokken-fabriek.nl: did not receive HSTS header
+mokum-organics.com: could not connect to host
mols.me: could not connect to host
momento.co.id: did not receive HSTS header
momfulfilled.com: could not connect to host
@@ -11798,10 +12503,12 @@ monitman.solutions: could not connect to host
monitorchain.com: did not receive HSTS header
monitori.ng: could not connect to host
monkeydust.net: max-age too low: 0
-monkieteel.nl: did not receive HSTS header
+monkieteel.com: did not receive HSTS header
+monkieteel.nl: max-age too low: 2592000
monochrometoys.com: could not connect to host
monodukuri.cafe: could not connect to host
monodzukuri.cafe: could not connect to host
+monokoo.com: max-age too low: 2592000
monotsuku.com: could not connect to host
monozukuri.cafe: did not receive HSTS header
montanacures.org: could not connect to host
@@ -11810,8 +12517,11 @@ montand.com: did not receive HSTS header
monteurzimmerfrei.de: could not connect to host
montonicms.com: could not connect to host
moo.pet: did not receive HSTS header
+moobo.co.jp: did not receive HSTS header
moobo.xyz: did not receive HSTS header
+moodforsex.com: could not connect to host
moodifiers.com: could not connect to host
+moojp.co.jp: could not connect to host
moon.lc: could not connect to host
moonagic.io: could not connect to host
moonless.net: could not connect to host
@@ -11822,6 +12532,7 @@ moonysbouncycastles.co.uk: could not connect to host
mooretownrancheria-nsn.gov: could not connect to host
moosemanstudios.com: could not connect to host
moov.is: could not connect to host
+mop321.com: did not receive HSTS header
moparcraft.com: could not connect to host
moparcraft.org: could not connect to host
moparisthebest.biz: could not connect to host
@@ -11839,6 +12550,7 @@ morethanadream.lv: could not connect to host
morfitronik.pl: could not connect to host
morganestes.com: max-age too low: 0
morganino.eu: could not connect to host
+morgansjewelerspv.com: did not receive HSTS header
morhys.com: could not connect to host
morningcalculation.com: could not connect to host
morninglory.com: did not receive HSTS header
@@ -11847,11 +12559,12 @@ morotech.com.br: did not receive HSTS header
morpheusx.at: could not connect to host
morpheusxaut.net: could not connect to host
morpork.xyz: could not connect to host
-morrodafumacanoticias.com.br: did not receive HSTS header
+morrodafumacanoticias.com.br: could not connect to host
morz.org: max-age too low: 0
mosaique-lachenaie.fr: could not connect to host
-moskva.guide: did not receive HSTS header
+moskva.guide: could not connect to host
moso.io: did not receive HSTS header
+mosshi.be: could not connect to host
mostlikelyto.fail: did not receive HSTS header
mostlyharmless.at: could not connect to host
mostlyinfinite.com: did not receive HSTS header
@@ -11877,18 +12590,22 @@ moumaobuchiyu.com: could not connect to host
mounp.me: max-age too low: 2592000
mountainadventureseminars.com: did not receive HSTS header
mountainmusicpromotions.com: did not receive HSTS header
+mountainroseherbs.com: did not receive HSTS header
mountairymd.gov: could not connect to host
+mountfarmer.de: did not receive HSTS header
mousemessages.com: did not receive HSTS header
movabletype.net: did not receive HSTS header
moveek.com: did not receive HSTS header
moveisfit.com.br: could not connect to host
movepin.com: could not connect to host
+movestub.com: did not receive HSTS header
movie4k.fyi: could not connect to host
movie4k.life: could not connect to host
movie4kto.site: could not connect to host
moviedollars.com: could not connect to host
movienang.com: max-age too low: 0
-movienized.de: did not receive HSTS header
+movienized.de: could not connect to host
+moviepilot.com: did not receive HSTS header
moviesabout.net: could not connect to host
moviespur.info: did not receive HSTS header
moving-pixtures.de: could not connect to host
@@ -11897,6 +12614,7 @@ movio.ga: could not connect to host
mowalls.net: could not connect to host
moy-gorod.od.ua: did not receive HSTS header
moyoo.net: did not receive HSTS header
+moysovet.info: could not connect to host
moyu.host: did not receive HSTS header
mozart-game.cz: could not connect to host
mozartgame.cz: could not connect to host
@@ -11911,16 +12629,17 @@ mp3juices.is: could not connect to host
mpe.org: did not receive HSTS header
mpg.ovh: could not connect to host
mphoto.at: did not receive HSTS header
+mphwinkel.nl: did not receive HSTS header
mpi-sa.fr: did not receive HSTS header
mpintaamalabanna.it: could not connect to host
mpkossen.com: did not receive HSTS header
mpn.poker: did not receive HSTS header
+mpnpokertour.com: did not receive HSTS header
mpodraza.pl: could not connect to host
mpreserver.com: could not connect to host
mpserver12.org: could not connect to host
mpu-giessen.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
mpy.ovh: could not connect to host
-mqas.net: could not connect to host
mr-coffee.net: could not connect to host
mr-hosting.com: could not connect to host
mr-labo.jp: could not connect to host
@@ -11935,10 +12654,11 @@ mredsanders.net: did not receive HSTS header
mrettich.org: did not receive HSTS header
mrizzio.com: could not connect to host
mrksk.com: could not connect to host
-mrleonardo.com: did not receive HSTS header
+mrleonardo.com: max-age too low: 7889238
mrliu.me: could not connect to host
mrmoregame.de: could not connect to host
mrnh.tk: could not connect to host
+mrning.com: could not connect to host
mrnonz.com: max-age too low: 0
mrparker.pw: did not receive HSTS header
mrpopat.in: did not receive HSTS header
@@ -11947,7 +12667,7 @@ mruganiepodspacja.pl: could not connect to host
ms-alternativ.de: did not receive HSTS header
msc-seereisen.net: could not connect to host
msgallery.tk: could not connect to host
-msopopop.cn: max-age too low: 5184000
+msopopop.cn: could not connect to host
msp66.de: could not connect to host
mstd.tokyo: did not receive HSTS header
mstdn-tech.jp: could not connect to host
@@ -11964,21 +12684,26 @@ mtd.ovh: could not connect to host
mtdn.jp: could not connect to host
mtfgnettoyage.fr: could not connect to host
mtg-esport.de: did not receive HSTS header
+mtg-tutor.de: did not receive HSTS header
mtirc.co: could not connect to host
mtn.cc: could not connect to host
+mtnz.co.za: could not connect to host
mtr.md: could not connect to host
mu3on.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
muahahahaha.co.uk: could not connect to host
muchohentai.com: could not connect to host
+mud-status.de: did not receive HSTS header
mudgezero.one: could not connect to host
+muel.io: could not connect to host
muenzubi.de: did not receive HSTS header
-muffet.pw: did not receive HSTS header
+muffet.pw: could not connect to host
muga.space: could not connect to host
muj-svet.cz: could not connect to host
mujadin.se: did not receive HSTS header
mulenvo.com: did not receive HSTS header
mulheres18.com: could not connect to host
mullen.net.au: did not receive HSTS header
+multigamecard.com: did not receive HSTS header
multiplexcy.com: could not connect to host
multiterm.org: could not connect to host
multivpn.cn.com: could not connect to host
@@ -12010,6 +12735,7 @@ murraycolin.org: could not connect to host
murrayrun.com: did not receive HSTS header
mursu.directory: could not connect to host
murz.tv: could not connect to host
+musaccostore.com: did not receive HSTS header
muscleangels.com: could not connect to host
musearchengine.com: could not connect to host
museminder2.com: did not receive HSTS header
@@ -12024,7 +12750,7 @@ musikkfondene.no: did not receive HSTS header
musikzug-bookholzberg.de: did not receive HSTS header
musique2nuit.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
muslimbanter.co.za: could not connect to host
-mustafa.space: could not connect to host
+mustafa.space: did not receive HSTS header
mustika.cf: did not receive HSTS header
mutamatic.com: could not connect to host
mutuelle-obligatoire-pme.fr: did not receive HSTS header
@@ -12035,12 +12761,13 @@ muzykaprzeszladoplay.pl: could not connect to host
mvanmarketing.nl: did not receive HSTS header
mvnet.com.br: did not receive HSTS header
mvsecurity.nl: could not connect to host
+mwalz.com: could not connect to host
mwohlfarth.de: did not receive HSTS header
mxawei.cn: could not connect to host
-mxlife.org: could not connect to host
mxp.tw: did not receive HSTS header
+my-cdn.de: could not connect to host
my-demo.co: could not connect to host
-my-dick.ru: did not receive HSTS header
+my-dick.ru: max-age too low: 0
my-owncloud.com: could not connect to host
my-pawnshop.com.ua: could not connect to host
my-plancha.ch: did not receive HSTS header
@@ -12063,18 +12790,23 @@ mychocolateweightloss.com: could not connect to host
myclientsplus.com: did not receive HSTS header
mycollab.net: could not connect to host
mycolorado.gov: could not connect to host
+mycompanion.cz: could not connect to host
mycontrolmonitor.com: could not connect to host
mycoted.com: did not receive HSTS header
mycreativeartsconsulting.com: could not connect to host
+mycuco.it: did not receive HSTS header
+mydarkstar.net: did not receive HSTS header
myday.eu.com: did not receive HSTS header
mydeos.com: could not connect to host
mydigipass.com: did not receive HSTS header
mydmdi.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
mydnaresults.com: could not connect to host
mydnatest.com: did not receive HSTS header
+mydreamlifelab.com: could not connect to host
mydriversedge.com: did not receive HSTS header
-mydrone.services: could not connect to host
-myeasybooking.de: could not connect to host
+mydrone.services: did not receive HSTS header
+mydroneservices.ca: did not receive HSTS header
+mydroneservices.com: did not receive HSTS header
myeml.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
myepass.bg: could not connect to host
myepass.de: could not connect to host
@@ -12085,6 +12817,7 @@ myfishpalace.at: could not connect to host
myfunworld.de: could not connect to host
mygalgame.com: did not receive HSTS header
mygaysitges.com: could not connect to host
+mygedit.com: could not connect to host
mygivingcircle.org: did not receive HSTS header
mygooder.com: did not receive HSTS header
mygov.scot: did not receive HSTS header
@@ -12114,6 +12847,7 @@ myni.io: could not connect to host
mynigma.org: did not receive HSTS header
myon.info: did not receive HSTS header
myonlinedating.club: could not connect to host
+myonlinevehicleinsurance.com: could not connect to host
myownconference.de: did not receive HSTS header
myownconference.es: did not receive HSTS header
myownconference.fr: did not receive HSTS header
@@ -12130,9 +12864,12 @@ myparfumerie.at: did not receive HSTS header
mypension.ca: could not connect to host
myperfumecollection.com: did not receive HSTS header
myphonebox.de: could not connect to host
+myproxy.eu.org: could not connect to host
myptsite.com: could not connect to host
+mypup.nl: did not receive HSTS header
myqdu.cn: could not connect to host
myqdu.com: could not connect to host
+myranicol.com: did not receive HSTS header
myrig.com.ua: did not receive HSTS header
myrig.io: could not connect to host
myrig.ru: did not receive HSTS header
@@ -12142,10 +12879,12 @@ mysa.is: could not connect to host
mysecretrewards.com: could not connect to host
myseo.ga: could not connect to host
myserv.one: could not connect to host
-mysongbird.xyz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+myseu.cn: did not receive HSTS header
+myshirtsize.com: did not receive HSTS header
+mysongbird.xyz: could not connect to host
myspa.asia: did not receive HSTS header
mystatus24.com: did not receive HSTS header
-mystery-science-theater-3000.de: did not receive HSTS header
+mystery-science-theater-3000.de: could not connect to host
mysteryblog.de: did not receive HSTS header
mystown.org: could not connect to host
mystudy.me: could not connect to host
@@ -12155,39 +12894,42 @@ mythlogic.com: did not receive HSTS header
mythslegendscollection.com: did not receive HSTS header
mytravelblog.de: could not connect to host
mytweeps.com: did not receive HSTS header
+myvoipnews.com: could not connect to host
mywallets.io: could not connect to host
myweb360.de: did not receive HSTS header
mywebinar.io: could not connect to host
myxbox.gr: max-age too low: 0
myzone.com: max-age too low: 0
mzlog.win: could not connect to host
-mzorn.photography: could not connect to host
n-rickroll-e.pw: could not connect to host
n-x.info: could not connect to host
n0099.cf: did not receive HSTS header
-n0rm.ru: could not connect to host
+n0rm.ru: did not receive HSTS header
n0s.de: did not receive HSTS header
n2host.eu: could not connect to host
n2x.in: could not connect to host
n3twork.net: could not connect to host
n4l.pw: could not connect to host
-n64chan.me: did not receive HSTS header
+n5118.com: could not connect to host
+n64chan.me: could not connect to host
na.hn: could not connect to host
naano.org: could not connect to host
nabru.co.uk: did not receive HSTS header
nabu-bad-nauheim.de: did not receive HSTS header
nabytko.cz: could not connect to host
nacktwanderfreunde.de: did not receive HSTS header
-nadaquenosepas.com: could not connect to host
nadia.pt: could not connect to host
nagajanroshiya.info: did not receive HSTS header
nagaragem.com.br: did not receive HSTS header
+nagb.org: could not connect to host
nagios.by: did not receive HSTS header
nagoya-kyuyo.com: could not connect to host
+nagrad.tk: did not receive HSTS header
naiaspa.fr: did not receive HSTS header
naiharngym.com: did not receive HSTS header
nailedithomebuilders.com: max-age too low: 300
nais.me: did not receive HSTS header
+nakada4610.com: could not connect to host
nakamastreamingcommunity.com: could not connect to host
nakanishi-paint.com: could not connect to host
nakhonidc.com: could not connect to host
@@ -12206,11 +12948,11 @@ nameme.xyz: could not connect to host
nametaken-cloud.duckdns.org: could not connect to host
namethatbone.com: could not connect to host
namethatporn.com: could not connect to host
+namethissymbol.com: could not connect to host
nami.exchange: did not receive HSTS header
namikawatetsuji.jp: could not connect to host
-namorico.me: did not receive HSTS header
+namorico.me: could not connect to host
namuwikiusercontent.com: could not connect to host
-nan.ci: did not receive HSTS header
nan.zone: could not connect to host
nanami.moe: could not connect to host
nanderson.me: could not connect to host
@@ -12223,13 +12965,13 @@ nanosingularity.com: could not connect to host
nanrenba.net: could not connect to host
nanto.eu: could not connect to host
naoar.com: could not connect to host
+naotone.com: did not receive HSTS header
naphex.rocks: could not connect to host
+naphogar.com: did not receive HSTS header
napisynapomniky.cz: did not receive HSTS header
+nappynko.com: did not receive HSTS header
narach.com: did not receive HSTS header
-narazaka.net: could not connect to host
-nargele.eu: did not receive HSTS header
narko.space: could not connect to host
-narodniki.com: did not receive HSTS header
narviz.com: did not receive HSTS header
nasarawanewsonline.com: could not connect to host
naseco.se: did not receive HSTS header
@@ -12243,16 +12985,17 @@ natalia.io: did not receive HSTS header
natalieandjoshua.com: could not connect to host
natalt.org: did not receive HSTS header
natalydanilova.com: max-age too low: 300
+natanaelys.com: could not connect to host
nataniel-perissier.fr: could not connect to host
natatorium.org: did not receive HSTS header
nate.sh: could not connect to host
-natecraun.net: did not receive HSTS header
natenom.com: max-age too low: 7200
natenom.de: max-age too low: 7200
natenom.name: max-age too low: 7200
+nathumarket.com.br: could not connect to host
nationalmall.gov: could not connect to host
+nationaltaxprep.com: could not connect to host
nationwidevehiclecontracts.co.uk: did not receive HSTS header
-natropie.pl: could not connect to host
natur-udvar.hu: could not connect to host
natural-progesterone.net: could not connect to host
naturalcommission.com: could not connect to host
@@ -12284,8 +13027,10 @@ nbg-ha.de: could not connect to host
nbis.gov: could not connect to host
nbl.org.tw: could not connect to host
nbp.com.pk: did not receive HSTS header
+nbrown.us: could not connect to host
nbtparse.org: could not connect to host
nc2c.com: could not connect to host
+nca.ink: could not connect to host
ncaq.net: did not receive HSTS header
ncc60205.info: could not connect to host
ncdesigns-studio.com: could not connect to host
@@ -12306,28 +13051,32 @@ nearbi.com.mx: could not connect to host
nearbiwa.com: did not receive HSTS header
nearon.nl: could not connect to host
neavision.de: did not receive HSTS header
+nebracy.com: could not connect to host
+nebras.ga: could not connect to host
nebulousenhanced.com: could not connect to host
necesitodinero.org: could not connect to host
necio.ca: could not connect to host
nedcf.org.uk: could not connect to host
nediyor.com: did not receive HSTS header
-nedwave.com: did not receive HSTS header
-nedys.top: did not receive HSTS header
+nedwave.com: could not connect to host
+nedys.top: could not connect to host
needle.net.nz: could not connect to host
needle.nz: could not connect to host
-neels.ch: could not connect to host
+neels.ch: did not receive HSTS header
neer.io: could not connect to host
neet-investor.biz: could not connect to host
-neftaly.com: did not receive HSTS header
+neftaly.com: could not connect to host
neftebitum-kngk.ru: did not receive HSTS header
negativecurvature.net: could not connect to host
negativzinsen.info: did not receive HSTS header
negraelinda.com: did not receive HSTS header
neilgreen.net: did not receive HSTS header
-neio.uk: could not connect to host
+neilshealthymeals.com: did not receive HSTS header
+nejkasy.cz: did not receive HSTS header
nejnamc.org: did not receive HSTS header
neko-life.com: did not receive HSTS header
neko.li: could not connect to host
+neko.ml: did not receive HSTS header
nekoku.io: could not connect to host
nekox.ml: could not connect to host
nella-project.org: could not connect to host
@@ -12336,14 +13085,14 @@ nellacms.com: could not connect to host
nellacms.org: could not connect to host
nellafw.org: could not connect to host
nellen.it: did not receive HSTS header
-nemanja.top: did not receive HSTS header
+nemanja.top: could not connect to host
nemecl.eu: could not connect to host
nemno.de: could not connect to host
nemovement.org: could not connect to host
-neoani.me: did not receive HSTS header
-neocoding.com: did not receive HSTS header
+nemumu.com: could not connect to host
+neoani.me: could not connect to host
+neocoding.com: could not connect to host
neocyd.com: could not connect to host
-neodrive.ch: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
neoeliteconsulting.com: could not connect to host
neofelhz.space: could not connect to host
neojames.me: could not connect to host
@@ -12351,7 +13100,7 @@ neokobe.city: could not connect to host
neolink.dk: could not connect to host
neonisi.com: could not connect to host
neonnuke.tech: did not receive HSTS header
-neosolution.ca: did not receive HSTS header
+neosolution.ca: could not connect to host
neotist.com: did not receive HSTS header
neowa.tk: could not connect to host
nephos.xyz: could not connect to host
@@ -12363,9 +13112,9 @@ nerfroute.com: could not connect to host
neris.io: could not connect to host
neriumhcp.com: did not receive HSTS header
nesantuoka.lt: could not connect to host
-nestedquotes.ca: could not connect to host
nesterov.pw: could not connect to host
nestone.ru: could not connect to host
+net-masters.pl: could not connect to host
net-navi.cc: did not receive HSTS header
net-rencontre.com: did not receive HSTS header
net2o.com: did not receive HSTS header
@@ -12375,9 +13124,11 @@ net4it.de: did not receive HSTS header
netba.net: could not connect to host
netbox.cc: could not connect to host
netbrief.ml: could not connect to host
+netd.at: max-age too low: 172800
netde.jp: did not receive HSTS header
netdego.jp: could not connect to host
netducks.space: could not connect to host
+netexem.com: did not receive HSTS header
netfs.pl: did not receive HSTS header
netguide.co.nz: did not receive HSTS header
netherwind.eu: did not receive HSTS header
@@ -12391,17 +13142,21 @@ netscaler.expert: could not connect to host
netsight.org: could not connect to host
netsparkercloud.com: did not receive HSTS header
netsystems.pro: could not connect to host
+nettacompany.com.tr: did not receive HSTS header
nettefoundation.com: could not connect to host
nettopower.dk: did not receive HSTS header
nettoyage.email: could not connect to host
nettplusultra-rhone.fr: did not receive HSTS header
-networkmon.net: could not connect to host
+netulo.com: could not connect to host
+networking-groups.co.uk: could not connect to host
+networth.at: did not receive HSTS header
networx-online.de: could not connect to host
netzbit.de: could not connect to host
netzpolitik.org: max-age too low: 2592000
netztest.at: did not receive HSTS header
netzvieh.de: could not connect to host
-netzzwerg4u.de: could not connect to host
+netzzwerg4u.de: did not receive HSTS header
+neuber.uno: could not connect to host
neuch.info: did not receive HSTS header
neueonlinecasino2016.com: could not connect to host
neuhaus-city.de: could not connect to host
@@ -12420,14 +13175,14 @@ newbasemedia.us: did not receive HSTS header
newbieboss.com: did not receive HSTS header
newbownerton.xyz: could not connect to host
newchance.store: could not connect to host
+newcitygas.ca: did not receive HSTS header
newcityinfo.info: could not connect to host
newcreamforface.com: could not connect to host
newdeveloper.download: could not connect to host
newedivideo.it: could not connect to host
newfacialbeautycream.com: could not connect to host
newgenerationplus.org: could not connect to host
-newhdmovies.io: could not connect to host
-newline.online: did not receive HSTS header
+newhdmovies.io: did not receive HSTS header
newlooknow.com: did not receive HSTS header
newparadigmventures.net: did not receive HSTS header
newpathintegratedtherapy.com: could not connect to host
@@ -12446,24 +13201,22 @@ newtonwarp.com: could not connect to host
nexgeneration-solutions.com: could not connect to host
nexlab.org: did not receive HSTS header
nexril.net: max-age too low: 7776000
-next-taxi.ru: could not connect to host
next47.com: did not receive HSTS header
-nextcloud.nerdpol.ovh: could not connect to host
-nextcloud.org: could not connect to host
+nextcloud.org: did not receive HSTS header
nextend.net: did not receive HSTS header
-nextend.org: did not receive HSTS header
+nextend.org: could not connect to host
nexth.de: could not connect to host
nexth.net: did not receive HSTS header
nexth.us: could not connect to host
-nexthop.co.jp: could not connect to host
nexthop.co.th: did not receive HSTS header
-nexthop.jp: could not connect to host
nextlevel-it.co.uk: could not connect to host
nextpages.de: could not connect to host
nextproject.us: could not connect to host
nextshutter.com: did not receive HSTS header
+nexus-vienna.at: could not connect to host
nexusbyte.de: could not connect to host
nexuscorporation.in: could not connect to host
+nezvestice.cz: did not receive HSTS header
nfhome.be: did not receive HSTS header
nfluence.org: could not connect to host
nfo.so: could not connect to host
@@ -12472,6 +13225,7 @@ ng-firewall.com: did not receive HSTS header
ng-security.com: could not connect to host
ngiemboon.net: could not connect to host
ngine.ch: did not receive HSTS header
+nginxconfig.com: could not connect to host
nginxnudes.com: could not connect to host
nginxyii.tk: could not connect to host
ngla.gov: could not connect to host
@@ -12487,9 +13241,8 @@ niallator.com: could not connect to host
nibiisclaim.com: could not connect to host
nicestresser.fr: could not connect to host
nickcleans.co.uk: could not connect to host
-nicktheitguy.com: could not connect to host
nicky.io: did not receive HSTS header
-nico.one: could not connect to host
+nico.one: did not receive HSTS header
nicoborghuis.nl: could not connect to host
nicolaeiotcu.ro: could not connect to host
nicolaelmer.ch: did not receive HSTS header
@@ -12503,36 +13256,41 @@ nidux.com: did not receive HSTS header
niduxcomercial.com: could not connect to host
niedersetz.de: could not connect to host
niedrigsterpreis.de: did not receive HSTS header
+nielshoogenhout.be: did not receive HSTS header
+nielshoogenhout.eu: did not receive HSTS header
+nielshoogenhout.nl: did not receive HSTS header
nien.chat: could not connect to host
nien.com.tw: could not connect to host
+nien.taipei: could not connect to host
nienfun.com: could not connect to host
nieuwsoverijssel.nl: did not receive HSTS header
niffler.software: could not connect to host
nifpnet.nl: could not connect to host
nifume.com: could not connect to host
+nigger.racing: could not connect to host
nightsnack.cf: could not connect to host
nightwinds.tk: could not connect to host
nigt.cf: did not receive HSTS header
niho.jp: did not receive HSTS header
nikcub.com: did not receive HSTS header
niki.ai: did not receive HSTS header
+nikklassen.ca: did not receive HSTS header
nikksno.io: could not connect to host
niklas.host: could not connect to host
niklasanderson.com: did not receive HSTS header
niklaslindblad.se: did not receive HSTS header
-nikobradshaw.com: could not connect to host
+nikobradshaw.com: did not receive HSTS header
nikolaichik.photo: did not receive HSTS header
nikolasbradshaw.com: could not connect to host
nikz.in: did not receive HSTS header
nilianwo.com: could not connect to host
-niloxy.com: did not receive HSTS header
+nilrem.org: did not receive HSTS header
ninchisho-online.com: did not receive HSTS header
ninebytes.xyz: could not connect to host
ning.so: did not receive HSTS header
ninhs.org: could not connect to host
ninjaspiders.com: could not connect to host
ninofink.com: could not connect to host
-ninreiei.jp: could not connect to host
niouininon.eu: could not connect to host
nippler.org: could not connect to host
nippombashi.net: did not receive HSTS header
@@ -12546,12 +13304,16 @@ nishaswonderland.nl: did not receive HSTS header
nishikino-maki.com: could not connect to host
nishisbma.com: could not connect to host
nitaonline.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+nitix.games: could not connect to host
+nitropanel.com: did not receive HSTS header
niva.synology.me: could not connect to host
niveldron.com: could not connect to host
nivi.ca: could not connect to host
+nix.black: could not connect to host
nixien.fr: could not connect to host
nixmag.net: could not connect to host
nixne.st: could not connect to host
+nixtest.net: could not connect to host
njujb.com: max-age too low: 5184000
nkadvertising.online: could not connect to host
nkautoservice.nl: did not receive HSTS header
@@ -12572,16 +13334,17 @@ no17sifangjie.cc: could not connect to host
noc.wang: could not connect to host
nocallaghan.com: could not connect to host
noclegi-online.pl: did not receive HSTS header
-nocmd.com: did not receive HSTS header
+nocs.cn: could not connect to host
noctinus.tk: could not connect to host
nodalr.com: did not receive HSTS header
+nodari.com.ar: did not receive HSTS header
+nodariweb.com.ar: could not connect to host
node-core-app.com: could not connect to host
nodebrewery.com: could not connect to host
nodechate.xyz: could not connect to host
nodecompat.com: did not receive HSTS header
-nodefiles.com: could not connect to host
+nodefiles.com: did not receive HSTS header
nodefoo.com: could not connect to host
-nodelab-it.de: could not connect to host
nodepanel.net: did not receive HSTS header
nodepositcasinouk.com: did not receive HSTS header
nodeselect.com: could not connect to host
@@ -12589,13 +13352,15 @@ nodesturut.cl: did not receive HSTS header
nodetemple.com: could not connect to host
nodi.at: did not receive HSTS header
nodum.io: did not receive HSTS header
-noegoph.com: could not connect to host
+noegoph.com: did not receive HSTS header
noelblog.ga: could not connect to host
noelssanssoucipensacola.com: did not receive HSTS header
noesberts-weidmoos.de: did not receive HSTS header
noexpect.org: could not connect to host
noisebridge.social: could not connect to host
+nojestorget.se: did not receive HSTS header
nojok.es: could not connect to host
+nokia.la: could not connect to host
nolag.host: could not connect to host
nolatepayments.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
nolberg.net: did not receive HSTS header
@@ -12604,10 +13369,12 @@ nolimitsbook.de: did not receive HSTS header
nolte.work: could not connect to host
nomoondev.azurewebsites.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
nomorebytes.de: could not connect to host
+nonabytes.xyz: could not connect to host
nonemu.ninja: could not connect to host
+noobswhatelse.net: could not connect to host
noodlecrave.com: did not receive HSTS header
noodlesandwich.com: did not receive HSTS header
-noodleyum.com: did not receive HSTS header
+noodleyum.com: could not connect to host
nootropicpedia.com: could not connect to host
nootropicsource.com: did not receive HSTS header
nope.website: could not connect to host
@@ -12615,12 +13382,13 @@ nopex.no: could not connect to host
nopol.de: could not connect to host
norandom.com: could not connect to host
norb.at: could not connect to host
-nordic-survival.de: did not receive HSTS header
+norden.eu.org: could not connect to host
+nordic-survival.de: could not connect to host
nordiccasinocommunity.com: did not receive HSTS header
nordicess.dk: could not connect to host
nordlicht.photography: did not receive HSTS header
+nordwal.de: could not connect to host
noref.tk: could not connect to host
-noreply.mx: could not connect to host
norge.guide: could not connect to host
normalady.com: could not connect to host
normanschwaneberg.de: did not receive HSTS header
@@ -12636,6 +13404,7 @@ nosecretshop.com: could not connect to host
nosfermiers.com: could not connect to host
nosproduitsdequalite.fr: did not receive HSTS header
nossasenhoradaconceicao.com.br: could not connect to host
+nostosh.eu.org: could not connect to host
nostraspace.com: could not connect to host
nosx.tk: could not connect to host
not-a.link: could not connect to host
@@ -12652,7 +13421,6 @@ note7forever.com: could not connect to host
notenoughtime.de: could not connect to host
notesforpebble.com: could not connect to host
notevencode.com: could not connect to host
-nothing.net.nz: max-age too low: 7776000
nothing.org.uk: could not connect to host
noticia.do: did not receive HSTS header
notificami.com: could not connect to host
@@ -12678,7 +13446,6 @@ novelabs.de: could not connect to host
novelabs.eu: could not connect to host
novelrealm.com: did not receive HSTS header
novelshouse.com: could not connect to host
-novfishing.ru: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
novinhabucetuda.com: could not connect to host
novtest.ru: did not receive HSTS header
nowcost.com: could not connect to host
@@ -12691,14 +13458,11 @@ npm.li: did not receive HSTS header
npol.de: could not connect to host
npool.org: did not receive HSTS header
nq7.pl: could not connect to host
-nqesh.com: could not connect to host
-nqeshreviewer.com: could not connect to host
nrc-gateway.gov: could not connect to host
nrechn.de: could not connect to host
nrizzio.me: could not connect to host
nrnjn.xyz: did not receive HSTS header
nrvnastudios.com: could not connect to host
-nsa.ovh: could not connect to host
nsa.wtf: could not connect to host
nsbfalconacademy.org: could not connect to host
nsdev.cn: could not connect to host
@@ -12710,7 +13474,6 @@ nstyleintl.ca: did not receive HSTS header
nsure.us: could not connect to host
nsweb.solutions: could not connect to host
ntbs.pro: could not connect to host
-nth.sh: did not receive HSTS header
ntse.xyz: could not connect to host
nu-pogodi.net: could not connect to host
nu3.at: did not receive HSTS header
@@ -12745,11 +13508,11 @@ nullpoint.at: did not receive HSTS header
nullpro.com: could not connect to host
numericacu.com: did not receive HSTS header
numero-di-telefono.it: could not connect to host
-numis.tech: could not connect to host
numista.com: did not receive HSTS header
numm.fr: did not receive HSTS header
+nuos.org: could not connect to host
nuovamoda.al: could not connect to host
-nup.pw: did not receive HSTS header
+nup.pw: could not connect to host
nupef.org.br: did not receive HSTS header
nurserybook.co: did not receive HSTS header
nurture.be: did not receive HSTS header
@@ -12769,7 +13532,9 @@ nvlop.xyz: did not receive HSTS header
nwa.xyz: could not connect to host
nweb.co.nz: could not connect to host
nwork.media: did not receive HSTS header
-nxt.sh: did not receive HSTS header
+nwr-waffenbuch.de: did not receive HSTS header
+nwuss.okinawa: could not connect to host
+nxt.sh: could not connect to host
nyanco.space: could not connect to host
nyanpasu.tv: could not connect to host
nyatane.com: could not connect to host
@@ -12787,6 +13552,7 @@ nystart.no: did not receive HSTS header
nystudio107.com: did not receive HSTS header
nyuusannkinn.com: did not receive HSTS header
nz.search.yahoo.com: max-age too low: 172800
+nzbr.de: did not receive HSTS header
nzbs.io: could not connect to host
nzdmo.govt.nz: did not receive HSTS header
nzmk.cz: could not connect to host
@@ -12794,51 +13560,54 @@ nzquakes.maori.nz: did not receive HSTS header
o-loska.cz: did not receive HSTS header
o-rickroll-y.pw: could not connect to host
o0o.one: did not receive HSTS header
-oakesfam.net: did not receive HSTS header
+o5.cx: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+o8b.club: could not connect to host
oaksbloom.com: could not connect to host
oasis-conference.org.nz: could not connect to host
-oasis.mobi: did not receive HSTS header
+oasis.mobi: could not connect to host
obdolbacca.ru: could not connect to host
oben.pl: did not receive HSTS header
oberam.de: could not connect to host
oberhof.co: could not connect to host
oberhofjuice.com: could not connect to host
-oberoi.de: did not receive HSTS header
+oberoi.de: max-age too low: 600000
obioncountytn.gov: could not connect to host
objectif-leger.com: did not receive HSTS header
oblikdom.pro: did not receive HSTS header
oblikdom.ru: did not receive HSTS header
oblondata.io: did not receive HSTS header
obrienlab.com: did not receive HSTS header
-obscur.us: could not connect to host
obscuredfiles.com: could not connect to host
observatory.se: could not connect to host
+obsidianirc.net: could not connect to host
obsydian.org: could not connect to host
oc-minecraft.com: could not connect to host
ocad.com.au: did not receive HSTS header
ocapic.com: could not connect to host
occasion-impro.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
occupymedia.org: could not connect to host
+ocelot.help: did not receive HSTS header
ochaken.cf: could not connect to host
ocloudhost.com: could not connect to host
ocmeulebeke.be: did not receive HSTS header
ocrami.us: did not receive HSTS header
-octanio.com: could not connect to host
+octal.es: did not receive HSTS header
+octanio.com: did not receive HSTS header
octo.im: could not connect to host
octocat.ninja: could not connect to host
octod.tk: could not connect to host
-octohost.net: could not connect to host
+octohost.net: did not receive HSTS header
oddmouse.com: could not connect to host
+odifi.com: could not connect to host
odin.xxx: could not connect to host
odinkapital.no: did not receive HSTS header
odinoffice.no: did not receive HSTS header
-odisealinux.com: did not receive HSTS header
odosblog.de: could not connect to host
odysseyandco.com: could not connect to host
odysseyconservationtrust.com: did not receive HSTS header
oe8.bet: could not connect to host
ofcourselanguages.com: could not connect to host
-ofcss.com: did not receive HSTS header
+ofcss.com: could not connect to host
ofer.site: could not connect to host
off-the-clock.us: could not connect to host
offenedialoge.de: max-age too low: 2592000
@@ -12848,13 +13617,12 @@ offgames.pro: could not connect to host
office-ruru.com: could not connect to host
officeclub.com.mx: did not receive HSTS header
officeprint.co.th: could not connect to host
-officium.tech: could not connect to host
offshore-firma.org: could not connect to host
offshore-unternehmen.com: could not connect to host
offshorefirma-gruenden.com: could not connect to host
offtherails.ie: could not connect to host
oficinadocelular.com.br: could not connect to host
-ofo2.com: could not connect to host
+ofo2.com: did not receive HSTS header
oganek.ie: could not connect to host
oganime.com: could not connect to host
oggw.us: could not connect to host
@@ -12863,6 +13631,7 @@ ogogoshop.com: could not connect to host
ogrodywstudniach.pl: did not receive HSTS header
ohayosoro.me: could not connect to host
ohhdeertrade.com: did not receive HSTS header
+ohling.org: could not connect to host
ohm2013.org: did not receive HSTS header
ohma.ga: did not receive HSTS header
ohnemusik.com: did not receive HSTS header
@@ -12871,6 +13640,7 @@ ohreally.de: could not connect to host
ohsocool.org: did not receive HSTS header
oiaio.cn: could not connect to host
oiepoie.nl: could not connect to host
+oil-ecn.ru: did not receive HSTS header
oilfieldinjury.attorney: could not connect to host
oinky.ddns.net: could not connect to host
oishioffice.com: did not receive HSTS header
@@ -12878,23 +13648,19 @@ ojanaho.com: did not receive HSTS header
ojbk.eu: could not connect to host
ojeremy.com: did not receive HSTS header
ojls.co: could not connect to host
-okad-center.de: did not receive HSTS header
-okad.de: did not receive HSTS header
-okad.eu: did not receive HSTS header
-okaidi.es: could not connect to host
okane.love: did not receive HSTS header
-okaz.de: did not receive HSTS header
oklahomamoversassociation.org: could not connect to host
oklahomanotepro.com: could not connect to host
okok-rent.com: could not connect to host
okok.rent: could not connect to host
+okonetwork.org.uk: could not connect to host
okutama.in.th: could not connect to host
olafnorge.de: did not receive HSTS header
olcso-vps-szerver.hu: could not connect to host
oldandyounglesbians.us: could not connect to host
oldbrookinflatables.co.uk: did not receive HSTS header
oldenglishsheepdog.com.br: could not connect to host
-oldschool-criminal.com: did not receive HSTS header
+oldonyosafaris.com: did not receive HSTS header
oldtimer-trifft-flugplatz.de: did not receive HSTS header
olightstore.com: did not receive HSTS header
oliode.tk: could not connect to host
@@ -12907,29 +13673,34 @@ olympe-transport.fr: did not receive HSTS header
omacostudio.com: could not connect to host
omar.yt: did not receive HSTS header
omarsuniagamusic.ga: did not receive HSTS header
+omdesign.cz: did not receive HSTS header
omeuanimal.com: did not receive HSTS header
omgaanmetidealen.com: could not connect to host
omifind.com: did not receive HSTS header
-ominto.com: did not receive HSTS header
+ominto.com: max-age too low: 0
omise.co: did not receive HSTS header
+omlmetal.co.jp: max-age too low: 0
ommahpost.com: did not receive HSTS header
omnigon.network: could not connect to host
omnilab.tech: could not connect to host
omnisafira.com: did not receive HSTS header
-omniti.com: max-age too low: 1
+omniscimus.net: could not connect to host
+omniti.com: did not receive HSTS header
omorashi.org: could not connect to host
omquote.gq: could not connect to host
omskit.ru: could not connect to host
omyogarishikesh.com: did not receive HSTS header
on-te.ch: did not receive HSTS header
+on.tax: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+onazikgu.com: could not connect to host
ondrejhoralek.cz: did not receive HSTS header
one-pe.com: did not receive HSTS header
onearth.one: did not receive HSTS header
oneb4nk.com: could not connect to host
+oneclickonejob.com: did not receive HSTS header
onecycling.my: could not connect to host
onecycling.world: could not connect to host
onefour.co: could not connect to host
-onegoodthingbyjillee.com: did not receive HSTS header
onehourloan.com: could not connect to host
onehourloan.sg: did not receive HSTS header
oneiros.cc: could not connect to host
@@ -12939,8 +13710,6 @@ oneminutefilm.tv: did not receive HSTS header
onemusou.com: could not connect to host
onepathnetwork.com: max-age too low: 7776000
onepluscamps.com: did not receive HSTS header
-onepointsafeband.ca: could not connect to host
-onepointsafeband.com: could not connect to host
onepopstore.com: could not connect to host
onespiritinc.com: did not receive HSTS header
onet.space: could not connect to host
@@ -12948,21 +13717,25 @@ onetly.com: could not connect to host
onewebdev.info: could not connect to host
oneworldbank.com: did not receive HSTS header
onewpst.com: could not connect to host
+ongea.io: could not connect to host
onguardonline.gov: did not receive HSTS header
oniichan.us: did not receive HSTS header
onionbot.ga: could not connect to host
onioncloud.org: could not connect to host
onionplay.live: could not connect to host
+onionplay.org: could not connect to host
onionsburg.com: could not connect to host
-onkfaktor.de: could not connect to host
online-casino.eu: did not receive HSTS header
online-horoskop.ch: did not receive HSTS header
online-results.dk: did not receive HSTS header
online-scene.com: did not receive HSTS header
online-wetten.de: could not connect to host
+online.net.gr: could not connect to host
+online.swedbank.se: did not receive HSTS header
onlinebiller.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
onlinebillingform.com: could not connect to host
onlinecasinobluebook.com: could not connect to host
+onlinecasinoselite.org: did not receive HSTS header
onlinecompliance.org: did not receive HSTS header
onlinecorners.com: did not receive HSTS header
onlinedemo.hu: could not connect to host
@@ -12973,6 +13746,7 @@ onlinepollsph.com: could not connect to host
onlineporno.tv: could not connect to host
onlineschadestaat.nl: did not receive HSTS header
onlinespielothek.com: could not connect to host
+onlinestoreninjas.com: did not receive HSTS header
onlineweblearning.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
onlinewetten.de: could not connect to host
only-roses.co.uk: did not receive HSTS header
@@ -12990,7 +13764,7 @@ onoranze-funebri.biz: could not connect to host
onovlena.dn.ua: could not connect to host
onpatient.com: did not receive HSTS header
onpermit.net: could not connect to host
-onsennuie.fr: could not connect to host
+onsennuie.fr: did not receive HSTS header
onsite4u.de: could not connect to host
onsitemassageco.com: did not receive HSTS header
onstud.com: could not connect to host
@@ -12999,6 +13773,7 @@ ontheboard.com: did not receive HSTS header
onthecheap.store: could not connect to host
ontheten.org: did not receive HSTS header
ontimestamp.com: did not receive HSTS header
+onvirt.de: could not connect to host
onwie.com: could not connect to host
onwie.fr: could not connect to host
onyxwall.com: could not connect to host
@@ -13008,22 +13783,24 @@ oo.edu.rs: could not connect to host
ooeste.com: could not connect to host
ookjesprookje.nl: could not connect to host
ooooush.co.uk: could not connect to host
+oopsis.com: could not connect to host
oopsmycase.com: could not connect to host
oopsorup.com: could not connect to host
oosoo.org: could not connect to host
oost.io: could not connect to host
+op11.co.uk: could not connect to host
opadaily.com: could not connect to host
opatut.de: did not receive HSTS header
opcaobolsas.com.br: could not connect to host
-open-desk.org: could not connect to host
-open-future.be: did not receive HSTS header
open-mx.de: could not connect to host
open-to-repair.fr: max-age too low: 86400
-openacademies.com: could not connect to host
+openacademies.com: did not receive HSTS header
openas.org: did not receive HSTS header
openbankproject.com: did not receive HSTS header
openbsd.id: could not connect to host
+openbsd.rocks: could not connect to host
openclub24.ru: could not connect to host
+opencluster.at: could not connect to host
openconcept.no: did not receive HSTS header
openconnect.com.au: could not connect to host
opendesk.cc: did not receive HSTS header
@@ -13033,11 +13810,13 @@ openiocdb.com: could not connect to host
openmetals.com: could not connect to host
openmind-shop.de: did not receive HSTS header
openmirrors.cf: could not connect to host
+openpictures.ch: could not connect to host
openpresentes.com.br: could not connect to host
openpriv.pw: could not connect to host
openprovider.nl: did not receive HSTS header
openrainbow.org: could not connect to host
openrtv.com: did not receive HSTS header
+openruhr.de: did not receive HSTS header
openshift.redhat.com: did not receive HSTS header
opensourcedmind.eu: could not connect to host
opensourcehouse.net: could not connect to host
@@ -13053,6 +13832,7 @@ opinion8td.com: did not receive HSTS header
opinionicentrifuga.it: could not connect to host
opinionipannolini.it: could not connect to host
opioids.com: could not connect to host
+oportho.com.br: did not receive HSTS header
oportunidadesemfoco.com.br: could not connect to host
opp.ag: did not receive HSTS header
oppag.com.br: did not receive HSTS header
@@ -13077,14 +13857,14 @@ optimizedlabs.co.uk: could not connect to host
optimizedlabs.info: could not connect to host
optimizedlabs.net: could not connect to host
optimizedlabs.uk: could not connect to host
-optisure.de: did not receive HSTS header
+optisure.de: could not connect to host
optometriepunt.nl: did not receive HSTS header
optumrxhealthstore.com: could not connect to host
opunch.org: did not receive HSTS header
-opure.ml: could not connect to host
-opure.ru: could not connect to host
+opure.ml: did not receive HSTS header
oracaodocredo.com.br: could not connect to host
orangekey.tk: could not connect to host
+orangenuts.in: could not connect to host
oranges.tokyo: did not receive HSTS header
oranic.com: did not receive HSTS header
orbiosales.com: could not connect to host
@@ -13092,35 +13872,38 @@ orbitcom.de: did not receive HSTS header
orbitdefence.co.uk: could not connect to host
orbograph-hrcm.com: could not connect to host
orcahq.com: did not receive HSTS header
+ordekho.com: did not receive HSTS header
order.one: could not connect to host
ordereat.fr: could not connect to host
+orderessay.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
orderlounge.de: did not receive HSTS header
-oref-idf.com: could not connect to host
-oref-idf.net: could not connect to host
-oref-idf.org: could not connect to host
+oref-idf.com: did not receive HSTS header
+oref-idf.net: did not receive HSTS header
+oref-idf.org: did not receive HSTS header
oregonmu.org: did not receive HSTS header
oreka.online: could not connect to host
orelavtomaster.ru: could not connect to host
orfeo-engineering.ch: could not connect to host
organic-superfood.net: could not connect to host
organicae.com: did not receive HSTS header
+orians.eu: could not connect to host
oricejoc.com: could not connect to host
-orientravelmacas.com: did not receive HSTS header
originalmockups.com: did not receive HSTS header
originalsport.com.br: could not connect to host
orioncustompcs.com: could not connect to host
+oriondynamic.be: did not receive HSTS header
orionfcu.com: did not receive HSTS header
+oriongames.eu: did not receive HSTS header
orionrebellion.com: did not receive HSTS header
orleika.ml: could not connect to host
orovillelaw.com: could not connect to host
oroweatorganic.com: could not connect to host
-orro.ro: did not receive HSTS header
ortho-graz.at: max-age too low: 86400
orthodoxy.lt: did not receive HSTS header
ortodonciaian.com: did not receive HSTS header
orui.com.br: did not receive HSTS header
orum.in: max-age too low: 0
-orz.uno: did not receive HSTS header
+os-chrome.ru: did not receive HSTS header
osaiyuwu.com: could not connect to host
osaka-onakura.com: did not receive HSTS header
oscamp.eu: could not connect to host
@@ -13134,7 +13917,9 @@ oscsdp.cz: could not connect to host
osdls.gov: did not receive HSTS header
osha-kimi.com: did not receive HSTS header
oshanko.de: could not connect to host
+oshershalom.com: did not receive HSTS header
oshinagaki.jp: did not receive HSTS header
+osirisrp.online: could not connect to host
oslfoundation.org: did not receive HSTS header
osmestres.com: did not receive HSTS header
osp.cx: could not connect to host
@@ -13145,30 +13930,35 @@ osteammate.com: could not connect to host
ostendorf.com: did not receive HSTS header
osticketawesome.com: did not receive HSTS header
oswaldmattgroup.com: did not receive HSTS header
+osxentwicklerforum.de: max-age too low: 2592000
otako.pl: did not receive HSTS header
otakucloud.net: did not receive HSTS header
otakuworld.de: could not connect to host
+otakuyun.com: did not receive HSTS header
otchecker.com: could not connect to host
-othercode.nl: could not connect to host
+othercode.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
otherkinforum.com: could not connect to host
othermedia.cc: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
otherstuff.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-otichi.com: could not connect to host
+otichi.com: did not receive HSTS header
otinane.eu: could not connect to host
otmns.net: could not connect to host
-otmo7.com: could not connect to host
+otmo7.com: did not receive HSTS header
otoblok.com: did not receive HSTS header
-otokonna.com: could not connect to host
+otokonna.com: did not receive HSTS header
otrsdemo.hu: did not receive HSTS header
otsu.beer: could not connect to host
ottospora.nl: could not connect to host
ouimoove.com: could not connect to host
-ouowo.gq: could not connect to host
+oulunjujutsu.com: did not receive HSTS header
+ouowo.gq: did not receive HSTS header
ourbank.com: max-age too low: 2592000
ourchoice2016.com: could not connect to host
ouruglyfood.com: could not connect to host
outdooradventures.pro: could not connect to host
outdoorproducts.com: max-age too low: 7889238
+outerlimitsdigital.com: did not receive HSTS header
+outetc.com: could not connect to host
outreachbuddy.com: could not connect to host
outsider.im: could not connect to host
outurnate.com: did not receive HSTS header
@@ -13190,7 +13980,6 @@ owennelson.me: max-age too low: 2592000
owensmith.website: could not connect to host
owl-hakkei.com: did not receive HSTS header
owlscrap.ru: could not connect to host
-ownc.at: could not connect to host
owncloud.help: could not connect to host
owngeek.com: could not connect to host
ownmovies.fr: could not connect to host
@@ -13198,8 +13987,8 @@ ownspec.com: could not connect to host
owothisdiz.pw: could not connect to host
oxanababy.com: could not connect to host
oxro.co: did not receive HSTS header
-oxro.io: could not connect to host
-oxygaming.com: could not connect to host
+oxro.io: did not receive HSTS header
+oxygaming.com: did not receive HSTS header
oxygenabsorbers.com: did not receive HSTS header
oxymc.com: did not receive HSTS header
oxynux.fr: could not connect to host
@@ -13209,17 +13998,22 @@ oyste.in: could not connect to host
ozoz.cc: could not connect to host
p-pc.de: could not connect to host
p-rickroll-o.pw: could not connect to host
+p.ki: could not connect to host
p.linode.com: could not connect to host
p1984.nl: could not connect to host
p1c.pw: could not connect to host
+p1cn.com: could not connect to host
p2av.com: could not connect to host
p3.marketing: did not receive HSTS header
p3in.com: could not connect to host
p3ter.fr: did not receive HSTS header
+p5118.com: could not connect to host
p8r.de: could not connect to host
paavolastudio.com: did not receive HSTS header
pablocamino.tk: could not connect to host
pablorey-art.com: did not receive HSTS header
+paccolat.name: could not connect to host
+paceda.nl: could not connect to host
pachaiyappas.org: did not receive HSTS header
pacificpalisadeselectrician.com: could not connect to host
packair.com: did not receive HSTS header
@@ -13232,7 +14026,6 @@ pacnetwork.io: could not connect to host
pacoda.de: could not connect to host
pactf-flag-4boxdpa21ogonzkcrs9p.com: could not connect to host
pactocore.org: could not connect to host
-padeoe.com: did not receive HSTS header
pader-deko.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
paestbin.com: could not connect to host
page: could not connect to host
@@ -13245,16 +14038,18 @@ paginapolitica.ro: did not receive HSTS header
pagure.org: could not connect to host
pahnid.com: could not connect to host
paigeglass.com: did not receive HSTS header
+painlessproperty.co.uk: did not receive HSTS header
paino.cloud: could not connect to host
painosso.org: could not connect to host
paintingat.com: could not connect to host
+paintsealdirect.com: did not receive HSTS header
paio2-rec.com: could not connect to host
paio2.com: could not connect to host
paisaone.com: could not connect to host
paizinhovirgula.com: did not receive HSTS header
pajonzeck.de: could not connect to host
paket.io: could not connect to host
-paket.ml: did not receive HSTS header
+paket.ml: could not connect to host
paketkreditsuzuki.com: could not connect to host
pakeystonescholars.gov: could not connect to host
pakowanie-polska.pl: could not connect to host
@@ -13262,7 +14057,6 @@ paku.me: could not connect to host
palationtrade.com: could not connect to host
palawan.jp: could not connect to host
palazzotalamo.it: did not receive HSTS header
-paleolowcarb.de: did not receive HSTS header
paleosquawk.com: could not connect to host
pallet.io: could not connect to host
palmer.im: could not connect to host
@@ -13274,29 +14068,31 @@ panama-gbs.com: did not receive HSTS header
panamaequity.com: did not receive HSTS header
panamateakforestry.com: did not receive HSTS header
panascais.io: could not connect to host
-panascais.net: did not receive HSTS header
+panasproducciones.com: could not connect to host
pandapsy.com: could not connect to host
panelomix.net: did not receive HSTS header
pangci.xyz: could not connect to host
panicparts.com: max-age too low: 10540800
-panjee.com: did not receive HSTS header
+panjee.com: max-age too low: 0
panjee.fr: did not receive HSTS header
panlex.org: did not receive HSTS header
panni.me: could not connect to host
panoma.de: did not receive HSTS header
-panoranordic.net: could not connect to host
+panomizer.de: did not receive HSTS header
+panoranordic.net: did not receive HSTS header
panos.io: did not receive HSTS header
panoti.com: could not connect to host
+panoxadrez.com.br: did not receive HSTS header
pansu.space: could not connect to host
pantsu.cat: did not receive HSTS header
paolo565.org: did not receive HSTS header
papalytics.com: could not connect to host
+papapa-members.club: could not connect to host
papatest24.de: could not connect to host
papeda.net: could not connect to host
papelariadante.com.br: could not connect to host
papercard.co.uk: did not receive HSTS header
papercrunch.io: could not connect to host
-paperhaven.com.au: max-age too low: 7889238
papermasters.com: could not connect to host
papersmart.net: could not connect to host
paperwallets.io: could not connect to host
@@ -13305,11 +14101,15 @@ papierniak.net: could not connect to host
papotage.net: could not connect to host
papygeek.com: could not connect to host
parabhairavayoga.com: did not receive HSTS header
+paradependentesquimicos.com.br: did not receive HSTS header
paradiesgirls.ch: could not connect to host
paradigi.com.br: did not receive HSTS header
paradise-engineers.com: could not connect to host
paragon.edu: could not connect to host
+paragontasarim.com: did not receive HSTS header
parakranov.ru: did not receive HSTS header
+paranormalweirdo.com: max-age too low: 600000
+paranoxer.hu: could not connect to host
parav.xyz: did not receive HSTS header
pardnoy.com: could not connect to host
parent5446.us: could not connect to host
@@ -13319,7 +14119,6 @@ pariga.co.uk: could not connect to host
paris-cyber.fr: did not receive HSTS header
parisdimanche.com: did not receive HSTS header
parishome.jp: could not connect to host
-parisprovincedemenagements.fr: did not receive HSTS header
parisvox.info: did not receive HSTS header
parithy.net: could not connect to host
parkhillsbaptist.church: did not receive HSTS header
@@ -13328,33 +14127,40 @@ parkrocker.com: max-age too low: 604800
parksland.net: did not receive HSTS header
parksubaruoemparts.com: could not connect to host
parkwithark.com: could not connect to host
+parodesigns.com: did not receive HSTS header
parodybit.net: did not receive HSTS header
parpaing-paillette.net: could not connect to host
-parquet-lascazes.fr: did not receive HSTS header
-partage.ovh: could not connect to host
+parquet-lascazes.fr: max-age too low: 2592000
+parroquiasanrafaeldegramalote.com: did not receive HSTS header
participatorybudgeting.de: did not receive HSTS header
participatorybudgeting.info: did not receive HSTS header
particonpsplus.it: could not connect to host
+partijhandel.website: did not receive HSTS header
+partijtjevoordevrijheid.nl: could not connect to host
partirkyoto.jp: did not receive HSTS header
-partiwatch.com: max-age too low: 2592000
+partiwatch.com: did not receive HSTS header
partnerbeam.com: could not connect to host
-partnersfcu.org: did not receive HSTS header
partnerwerk.de: did not receive HSTS header
+party-kneipe-bar.com: did not receive HSTS header
partyhaus.ovh: could not connect to host
partyhireformby.co.uk: did not receive HSTS header
partyschnaps.com: could not connect to host
+partyshop.ge: did not receive HSTS header
partyspecialists.com: did not receive HSTS header
partyvan.eu: could not connect to host
partyvan.it: could not connect to host
partyvan.moe: could not connect to host
partyvan.nl: could not connect to host
partyvan.se: could not connect to host
+pasadenasandwich.co: did not receive HSTS header
+pasadenasandwich.com: did not receive HSTS header
pascalchristen.ch: did not receive HSTS header
-pascalspoerri.ch: could not connect to host
pasportaservo.org: did not receive HSTS header
passendonderwijs.nl: did not receive HSTS header
passionebenessere.com: did not receive HSTS header
passpilot.co.uk: did not receive HSTS header
+passrhce.com: could not connect to host
+passrhcsa.com: could not connect to host
passwd.io: did not receive HSTS header
password.codes: could not connect to host
passwordbox.com: did not receive HSTS header
@@ -13368,8 +14174,10 @@ pastenib.com: could not connect to host
paster.li: did not receive HSTS header
pasteros.io: could not connect to host
pastie.se: could not connect to host
+pastoral-verbund.de: max-age too low: 86400
pastorbelgagroenendael.com.br: could not connect to host
pastorcanadense.com.br: could not connect to host
+pastordocaucaso.com.br: could not connect to host
pastormaremanoabruzes.com.br: could not connect to host
pastorsuico.com.br: could not connect to host
pataua.kiwi: did not receive HSTS header
@@ -13377,20 +14185,19 @@ paternitydnatest.com: could not connect to host
patfs.com: did not receive HSTS header
pathwaytofaith.com: could not connect to host
patientinsight.net: could not connect to host
-patouille-et-gribouille.fr: did not receive HSTS header
+patouille-et-gribouille.fr: could not connect to host
patriaco.net: did not receive HSTS header
-patric-lenhart.de: could not connect to host
patrick.dark.name: could not connect to host
patrickbusch.net: could not connect to host
patrickmcnamara.xyz: did not receive HSTS header
patrickneuro.de: could not connect to host
patrickquinn.ca: did not receive HSTS header
-patrickschneider.me: could not connect to host
patt.us: could not connect to host
patterson.mp: could not connect to host
paul-kerebel.pro: could not connect to host
paul-schmidt.de: max-age too low: 0
paulbunyanmls.com: did not receive HSTS header
+paulchen.at: could not connect to host
paulewen.ca: could not connect to host
paulpetersen.dk: did not receive HSTS header
paulproell.at: did not receive HSTS header
@@ -13399,6 +14206,7 @@ paulyang.cn: did not receive HSTS header
paveljanda.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
pavelkahouseforcisco.com: did not receive HSTS header
pavelstriz.cz: could not connect to host
+pawfriends.org.za: did not receive HSTS header
pawsru.org: could not connect to host
paxdei.com.br: could not connect to host
paxwinkel.nl: could not connect to host
@@ -13417,14 +14225,13 @@ payroll.ch: could not connect to host
paytwopay.com: could not connect to host
payzwin.com: did not receive HSTS header
pb-design.ch: could not connect to host
-pb.ax: could not connect to host
pbapp.net: did not receive HSTS header
pbbr.com: did not receive HSTS header
pbcknd.ml: could not connect to host
pbcomp.com.au: did not receive HSTS header
pbprint.ru: could not connect to host
pbqs.site: could not connect to host
-pbreen.co.uk: could not connect to host
+pbreen.co.uk: did not receive HSTS header
pbscreens.com: could not connect to host
pbytes.com: could not connect to host
pc-nf.de: did not receive HSTS header
@@ -13440,10 +14247,12 @@ pdamsidoarjo.co.id: could not connect to host
pdevio.com: could not connect to host
pdf.yt: could not connect to host
pdomo.me: did not receive HSTS header
+pdragt.com: could not connect to host
pe-bank.co.jp: max-age too low: 604800
pe-kyousai.jp: did not receive HSTS header
peaceandwool.com: did not receive HSTS header
peakapp.nl: could not connect to host
+pearbloom.com: could not connect to host
pebblesdemo.com: could not connect to host
pecot.fr: did not receive HSTS header
peekops.com: could not connect to host
@@ -13457,7 +14266,7 @@ peissen.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERRO
pekkapikkarainen.fi: did not receive HSTS header
pekkarik.ru: could not connect to host
peliculasaudiolatinoonline.com: could not connect to host
-peliseries24.com: could not connect to host
+peliculator.com: max-age too low: 0
peliweb.com: did not receive HSTS header
pemagrid.org: could not connect to host
pemberton.at: did not receive HSTS header
@@ -13521,6 +14330,7 @@ personcar.com.br: could not connect to host
personnedisparue.fr: could not connect to host
persson.im: could not connect to host
perthdevicelab.com: did not receive HSTS header
+peruvianphotography.com: did not receive HSTS header
pestalozzishop.com.br: could not connect to host
pesto.video: could not connect to host
pesyun.cn: max-age too low: 3600
@@ -13539,10 +14349,8 @@ pethub.com: did not receive HSTS header
petit.site: could not connect to host
petlife.od.ua: could not connect to host
petplum.com: did not receive HSTS header
-petrkrapek.cz: did not receive HSTS header
-petrotranz.com: did not receive HSTS header
+petrkrapek.cz: could not connect to host
petrovsky.pro: could not connect to host
-petruzz.net: did not receive HSTS header
petsittersservices.com: could not connect to host
pettsy.com: did not receive HSTS header
peuf.shop: could not connect to host
@@ -13552,34 +14360,37 @@ pewboards.com: could not connect to host
pexieapp.com: did not receive HSTS header
peykezamin.ir: did not receive HSTS header
peyote.org: could not connect to host
-peytonfarrar.com: could not connect to host
-pf.dk: did not receive HSTS header
+peytonfarrar.com: did not receive HSTS header
+pfarchimedes-pensioen123.nl: could not connect to host
pferdeeinstreu-kaufen.com: did not receive HSTS header
+pferdekauf.de: did not receive HSTS header
pfgshop.com.br: could not connect to host
pflegedienst-gratia.de: max-age too low: 300
pfo.io: could not connect to host
pfolta.net: could not connect to host
pgcpbc.com: could not connect to host
+pglandscapingpaving.com: did not receive HSTS header
pgmsource.com: could not connect to host
pgpm.io: could not connect to host
pgtb.be: could not connect to host
phalconist.com: could not connect to host
phantasie.cc: could not connect to host
-pharmaboard.org: did not receive HSTS header
pharmgkb.org: could not connect to host
-phaux.uno: could not connect to host
-phcmembers.com: did not receive HSTS header
+phasersec.com: did not receive HSTS header
+phcmembers.com: could not connect to host
phdsupply.com: could not connect to host
phdwuda.com: could not connect to host
phenomeno-porto.com: did not receive HSTS header
phenomeno.nl: did not receive HSTS header
phenomenoporto.com: did not receive HSTS header
phenomenoporto.nl: did not receive HSTS header
+phialo.de: did not receive HSTS header
philadelphiacandies.com: did not receive HSTS header
philadelphiadancefoundation.org: could not connect to host
philipkohn.com: did not receive HSTS header
philipmordue.co.uk: could not connect to host
philippa.cool: could not connect to host
+philippbirkholz.com: could not connect to host
philippinedroneassociation.org: did not receive HSTS header
phillippi.me: could not connect to host
phillmoore.com: did not receive HSTS header
@@ -13587,11 +14398,12 @@ phillprice.com: did not receive HSTS header
philonas.net: did not receive HSTS header
philpropertygroup.com: could not connect to host
phippsreporting.com: did not receive HSTS header
-phishing.rs: did not receive HSTS header
+phishing.rs: could not connect to host
+phligence.com: could not connect to host
phoebe.co.nz: did not receive HSTS header
phoenicis.com.ua: did not receive HSTS header
-phoenics.de: did not receive HSTS header
phoenix.dj: did not receive HSTS header
+phoenixlogan.com: could not connect to host
phonenumberinfo.co.uk: could not connect to host
phongmay24h.com: could not connect to host
phood.be: did not receive HSTS header
@@ -13609,15 +14421,20 @@ php-bach.org: could not connect to host
phpdistribution.com: did not receive HSTS header
phperformances.fr: did not receive HSTS header
phpfashion.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+phpinfo.in.th: could not connect to host
phpkari.cz: could not connect to host
phr34kz.pw: did not receive HSTS header
phra.gs: could not connect to host
phrasing.me: could not connect to host
phrive.space: could not connect to host
+phryanjr.com: could not connect to host
phryneas.de: did not receive HSTS header
phumin.in.th: did not receive HSTS header
+phunehehe.net: did not receive HSTS header
phuong.faith: could not connect to host
+physicaltherapist.com: did not receive HSTS header
physicpezeshki.com: did not receive HSTS header
+pi-box.ml: could not connect to host
pi-eng.fr: did not receive HSTS header
pianetaottica.eu: could not connect to host
pianetaottica.info: could not connect to host
@@ -13633,27 +14450,26 @@ picone.com.au: could not connect to host
picotronic.biz: could not connect to host
picotronic.de: did not receive HSTS header
picsandtours.com: did not receive HSTS header
-picscare.co.uk: did not receive HSTS header
+picscare.co.uk: could not connect to host
picshare.nz: could not connect to host
-pidatacenters.com: could not connect to host
+pidatacenters.com: did not receive HSTS header
pidomex.com: did not receive HSTS header
piedfeed.com: did not receive HSTS header
pieinsurance.com: did not receive HSTS header
piekacz.co.uk: could not connect to host
pieperhome.de: did not receive HSTS header
pierrejeansuau.fr: could not connect to host
+pierreprinetti.com: did not receive HSTS header
pieterjangeeroms.me: could not connect to host
piggott.me.uk: did not receive HSTS header
pigritia.de: could not connect to host
-piils.fr: did not receive HSTS header
+piils.fr: could not connect to host
pikalongwar.com: did not receive HSTS header
-pikeitservices.com.au: did not receive HSTS header
pikmy.com: could not connect to host
pilgermaske.org: did not receive HSTS header
piligrimname.com: could not connect to host
pillowandpepper.com: did not receive HSTS header
pilotcrowd.nl: did not receive HSTS header
-pimg136.com: could not connect to host
pimpmymac.ru: did not receive HSTS header
pimpmypaper.com: could not connect to host
pims.global: did not receive HSTS header
@@ -13667,6 +14483,8 @@ pinkcasino.co.uk: did not receive HSTS header
pinkfis.ch: did not receive HSTS header
pinkhq.com: did not receive HSTS header
pinkinked.com: could not connect to host
+pinnacles.com: max-age too low: 0
+pinner.io: could not connect to host
pinoylinux.org: did not receive HSTS header
pinscher.com.br: could not connect to host
pintoselectrician.co.za: did not receive HSTS header
@@ -13690,11 +14508,10 @@ pirateproxy.sx: did not receive HSTS header
pirateproxy.vip: could not connect to host
pirati.cz: max-age too low: 604800
piratte.net: did not receive HSTS header
-pirganj24.com: did not receive HSTS header
+pirganj24.com: could not connect to host
pirlitu.com: did not receive HSTS header
pisexy.me: did not receive HSTS header
pisidia.de: could not connect to host
-pitchup.com: did not receive HSTS header
pitonarms.com: could not connect to host
pitsstop.nu: could not connect to host
pittaya.com: did not receive HSTS header
@@ -13705,6 +14522,7 @@ pixeame.com: could not connect to host
pixel.google.com: did not receive HSTS header (error ignored - included regardless)
pixelcode.com.au: could not connect to host
pixelesque.uk: could not connect to host
+pixelfou.com: could not connect to host
pixelgliders.de: could not connect to host
pixelhero.co.uk: did not receive HSTS header
pixelpoint.io: did not receive HSTS header
@@ -13714,11 +14532,12 @@ pixi.me: did not receive HSTS header
pixiv.rip: could not connect to host
pixivimg.me: could not connect to host
pizala.de: could not connect to host
+pizzabottle.com: did not receive HSTS header
pizzacook.ch: did not receive HSTS header
pizzadoc.ch: could not connect to host
pizzafunny.com.br: could not connect to host
pizzamc.eu: could not connect to host
-pj00100.com: did not receive HSTS header
+pj00100.com: could not connect to host
pj00200.com: did not receive HSTS header
pj00300.com: did not receive HSTS header
pj00400.com: did not receive HSTS header
@@ -13727,23 +14546,25 @@ pj00700.com: did not receive HSTS header
pj00800.com: did not receive HSTS header
pj009.com: could not connect to host
pj00900.com: did not receive HSTS header
-pj02.com: did not receive HSTS header
+pj02.com: could not connect to host
pj83.duckdns.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
pj881988.com: could not connect to host
pjbet.mg: could not connect to host
pjili.com: did not receive HSTS header
pjsec.tk: could not connect to host
pkautodesign.com: did not receive HSTS header
+pkbjateng.com: could not connect to host
pko.ch: did not receive HSTS header
pkschat.com: could not connect to host
plaasprodukte.com: could not connect to host
placassinal.com.br: did not receive HSTS header
+placebet.pro: could not connect to host
placefade.com: could not connect to host
placehold.co: did not receive HSTS header
placollection.org: could not connect to host
plaettliaktion.ch: did not receive HSTS header
plagiarismcheck.org: max-age too low: 604800
-plaintray.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+plaintray.com: could not connect to host
plakbak.nl: could not connect to host
planbox.info: could not connect to host
planeexplanation.com: could not connect to host
@@ -13754,7 +14575,6 @@ planformation.com: did not receive HSTS header
planktonholland.com: did not receive HSTS header
planpharmacy.com: could not connect to host
plant.ml: could not connect to host
-plantroon.com: could not connect to host
plass.hamburg: could not connect to host
plasti-pac.ch: did not receive HSTS header
plasticsurgeryartist.com: max-age too low: 300
@@ -13763,19 +14583,18 @@ plasvilledescartaveis.com.br: could not connect to host
platform.lookout.com: could not connect to host
platinumpeek.com: did not receive HSTS header
platomania.eu: did not receive HSTS header
-plattner.club: could not connect to host
+plattner.club: did not receive HSTS header
play: could not connect to host
play.google.com: did not receive HSTS header (error ignored - included regardless)
playdreamcraft.com.br: did not receive HSTS header
playerhunter.com: did not receive HSTS header
-playflick.com: could not connect to host
+playflick.com: did not receive HSTS header
playhappywheelsunblocked.com: could not connect to host
playkh.com: did not receive HSTS header
playkinder.com: did not receive HSTS header
playmaker.io: did not receive HSTS header
playmaza.live: could not connect to host
playmfe.com: could not connect to host
-playsoundevents.be: could not connect to host
playsource.co: could not connect to host
playwhyyza.com: could not connect to host
playyou.be: could not connect to host
@@ -13785,7 +14604,6 @@ pleasure.forsale: could not connect to host
plen.io: could not connect to host
plexi.dyndns.tv: could not connect to host
plexpy13.ddns.net: could not connect to host
-plextv.de: did not receive HSTS header
plexusmd.com: did not receive HSTS header
plfgr.eu.org: could not connect to host
plhdb.org: did not receive HSTS header
@@ -13801,7 +14619,6 @@ plugboard.xyz: could not connect to host
pluggedhead.com: did not receive HSTS header
plumbingboksburg.co.za: did not receive HSTS header
plumbingman.com.au: did not receive HSTS header
-plumnet.ch: could not connect to host
plus-digital.net: could not connect to host
plus-u.com.au: did not receive HSTS header
plus.sandbox.google.com: did not receive HSTS header (error ignored - included regardless)
@@ -13809,14 +14626,14 @@ plus1s.site: could not connect to host
plus1s.tk: could not connect to host
plushev.com: did not receive HSTS header
plussizereviews.com: could not connect to host
-plustech.id: did not receive HSTS header
plut.org: did not receive HSTS header
-pluth.org: did not receive HSTS header
+pluta.net: did not receive HSTS header
+pluth.org: could not connect to host
plymouthglassgallery.com: did not receive HSTS header
plymouthsoftplay.co.uk: could not connect to host
pm13-media.cz: could not connect to host
pmac.pt: could not connect to host
-pmbremer.de: could not connect to host
+pmbremer.de: did not receive HSTS header
pmbtf.com: could not connect to host
pmctire.com: did not receive HSTS header
pmemanager.fr: did not receive HSTS header
@@ -13826,20 +14643,43 @@ pmnts.io: could not connect to host
pmponline.de: did not receive HSTS header
pneumonline.be: did not receive HSTS header
pneusgppremium.com.br: did not receive HSTS header
+pnoec.org.do: could not connect to host
pnukee.com: did not receive HSTS header
po.gl: could not connect to host
+poc060.com: did not receive HSTS header
+poc080.com: did not receive HSTS header
+poc100.com: did not receive HSTS header
+poc109.com: did not receive HSTS header
+poc11.com: did not receive HSTS header
+poc116.com: did not receive HSTS header
+poc118.com: did not receive HSTS header
+poc119.com: did not receive HSTS header
+poc120.com: did not receive HSTS header
+poc128.com: did not receive HSTS header
+poc13.com: did not receive HSTS header
+poc15.com: did not receive HSTS header
+poc16.com: did not receive HSTS header
poc17.com: could not connect to host
-pocakdrops.com: did not receive HSTS header
+poc18.com: did not receive HSTS header
+poc19.com: did not receive HSTS header
+poc21.com: did not receive HSTS header
+poc211.com: did not receive HSTS header
+poc226.com: did not receive HSTS header
+poc228.com: did not receive HSTS header
+pocakdrops.com: could not connect to host
pocakking.tk: could not connect to host
pocket-lint.com: did not receive HSTS header
pocketfullofapps.com: did not receive HSTS header
+pocketinsure.com: could not connect to host
pocketmemories.net: could not connect to host
pocketsix.com: could not connect to host
pocloud.homelinux.net: could not connect to host
pocobelli.ch: did not receive HSTS header
podcast.style: could not connect to host
+podemos.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
podiumsdiskussion.org: did not receive HSTS header
poed.com.au: could not connect to host
+poedgirl.com: could not connect to host
poeg.cz: did not receive HSTS header
pogoswine.com: could not connect to host
pogs.us: could not connect to host
@@ -13875,24 +14715,27 @@ polsport.live: did not receive HSTS header
polycoise.com: could not connect to host
polycrypt.us: could not connect to host
polyfill.io: did not receive HSTS header
-polymorph.rs: could not connect to host
polypho.nyc: could not connect to host
polysage.org: did not receive HSTS header
polytechecosystem.vc: could not connect to host
pomardaserra.com: could not connect to host
+pomelo-paradigm.com: did not receive HSTS header
+pomozmruczkom.pl: could not connect to host
pompefunebrilariviera.it: could not connect to host
-pompompoes.com: could not connect to host
+pompompoes.com: did not receive HSTS header
pondof.fish: could not connect to host
ponteencima.com: could not connect to host
ponteus.com: could not connect to host
pontodogame.com.br: could not connect to host
pontokay.com.br: could not connect to host
pontualcomp.com: could not connect to host
+ponxel.com: could not connect to host
pony.today: could not connect to host
ponythread.com: did not receive HSTS header
ponzi.life: could not connect to host
poolinstallers.co.za: could not connect to host
poolsandstuff.com: did not receive HSTS header
+poolspondsandwaterscapes.com: could not connect to host
poon.tech: could not connect to host
popcultureshack.com: could not connect to host
popi.se: did not receive HSTS header
@@ -13909,6 +14752,7 @@ pornalpha.com: could not connect to host
pornbay.org: could not connect to host
pornblog.org: could not connect to host
porncandi.com: could not connect to host
+porncompanions.com: could not connect to host
pornimg.net: could not connect to host
pornless.biz: could not connect to host
pornmax.net: could not connect to host
@@ -13918,27 +14762,33 @@ pornolab-net.appspot.com: could not connect to host
pornoserver.eu: could not connect to host
pornport.org: could not connect to host
pornsocket.com: could not connect to host
+pornspider.to: could not connect to host
pornstars.me: did not receive HSTS header
pornteddy.com: could not connect to host
pornultra.net: could not connect to host
porschen.fr: could not connect to host
port.im: did not receive HSTS header
port.social: could not connect to host
+portablebuildingsales.co.uk: did not receive HSTS header
+portablespeakersfinder.com: could not connect to host
portalcarapicuiba.com: did not receive HSTS header
portale-randkowe.pl: did not receive HSTS header
portalhubnuti.cz: did not receive HSTS header
portalisapres.cl: could not connect to host
+portalkla.com.br: did not receive HSTS header
portalm.tk: could not connect to host
portalmundo.xyz: could not connect to host
portalplatform.net: could not connect to host
portaluniversalista.org: did not receive HSTS header
-portalveneza.com.br: did not receive HSTS header
+portalveneza.com.br: could not connect to host
portalzine.de: did not receive HSTS header
portefeuillesignalen.nl: could not connect to host
portraitsystem.biz: did not receive HSTS header
+portsmoutheic.com: could not connect to host
+poschtiliste.ch: could not connect to host
poshpak.com: max-age too low: 86400
+posijson.stream: could not connect to host
positivesobrietyinstitute.com: did not receive HSTS header
-posoiu.net: could not connect to host
postback.io: did not receive HSTS header
postcardpayment.com: could not connect to host
postcodegarant.nl: could not connect to host
@@ -13946,7 +14796,6 @@ posters.win: could not connect to host
postscheduler.org: could not connect to host
posylka.de: did not receive HSTS header
potatoheads.net: could not connect to host
-potatron.tech: could not connect to host
potbar.com: could not connect to host
potbox.com: could not connect to host
potenzmittelblog.info: could not connect to host
@@ -13955,6 +14804,7 @@ potlytics.com: could not connect to host
potomania.cz: could not connect to host
potpourrifestival.de: did not receive HSTS header
potsky.com: did not receive HSTS header
+pottreid.com: did not receive HSTS header
pouet.it: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
pouets.ovh: could not connect to host
poupatempo.org: did not receive HSTS header
@@ -13966,13 +14816,18 @@ povitria.net: could not connect to host
powaclub.com: max-age too low: 86400
power-coonies.de: could not connect to host
power-l.ch: did not receive HSTS header
+power-meter.cc: did not receive HSTS header
power-of-interest.com: could not connect to host
power99press.com: could not connect to host
powerb.ch: did not receive HSTS header
powerdent.net.br: could not connect to host
+poweredbypurdy.com: did not receive HSTS header
powerentertainment.tv: could not connect to host
poweroff.win: could not connect to host
powerplannerapp.com: could not connect to host
+powerplaywashers.com: did not receive HSTS header
+powersergdatasystems.tk: could not connect to host
+powersergthisisthewebsitefuckyouchris.com: could not connect to host
powersergunited.com: could not connect to host
powersergunited.org: could not connect to host
powersergusercontent.com: could not connect to host
@@ -13980,7 +14835,7 @@ powershellmagic.com: could not connect to host
powershift.ne.jp: did not receive HSTS header
powertothebuilder.com: could not connect to host
powerxequality.com: did not receive HSTS header
-poy-tech.com: could not connect to host
+poy-tech.com: did not receive HSTS header
pozniak.at: did not receive HSTS header
pozyczka-bez-zaswiadczen.pl: did not receive HSTS header
pozytywnyplan.pl: could not connect to host
@@ -13991,7 +14846,7 @@ ppoou.co.uk: could not connect to host
pppo.gov: could not connect to host
ppr-truby.ru: could not connect to host
ppsvcs2.com: did not receive HSTS header
-ppuu.org: did not receive HSTS header
+ppuu.org: could not connect to host
ppy3.com: did not receive HSTS header
practodev.com: could not connect to host
prajwalkoirala.com: could not connect to host
@@ -14000,6 +14855,7 @@ prattpokemon.com: could not connect to host
praxis-research.info: could not connect to host
prazeresdavida.com.br: could not connect to host
prazynka.pl: did not receive HSTS header
+prc-newmedia.com: max-age too low: 0
precedecaritas.com.br: could not connect to host
precisionaeroimaging.com: did not receive HSTS header
prediksisydney.com: could not connect to host
@@ -14014,18 +14870,18 @@ prekladysanca.cz: could not connect to host
prelist.org: did not receive HSTS header
premaritalsex.info: could not connect to host
premioambiente.it: did not receive HSTS header
+premiumweb.co.id: could not connect to host
premiumzweirad.de: max-age too low: 7776000
prepaidgirl.com: could not connect to host
prepandgo-euro.com: could not connect to host
preposted.com: could not connect to host
-preppertactics.com: did not receive HSTS header
+preppertactics.com: could not connect to host
preprodfan.gov: could not connect to host
-presbee.com: could not connect to host
-prescriptionrex.com: did not receive HSTS header
+prescriptionrex.com: could not connect to host
presentesdegrife.com.br: could not connect to host
presidentials2016.com: could not connect to host
press-anime-nenkan.com: did not receive HSTS header
-press-presse.ca: max-age too low: 2592000
+press-presse.ca: max-age too low: 0
pressakey.de: did not receive HSTS header
pressenews.net: could not connect to host
pressfreedomfoundation.org: did not receive HSTS header
@@ -14039,6 +14895,7 @@ pretzlaff.info: did not receive HSTS header
preworkout.me: could not connect to host
prgslab.net: could not connect to host
priceholic.com: could not connect to host
+prideindomination.com: could not connect to host
pridoc.se: did not receive HSTS header
prifo.se: could not connect to host
prijsvergelijken.ml: could not connect to host
@@ -14050,30 +14907,33 @@ primotiles.co.uk: could not connect to host
primotilesandbathrooms.co.uk: max-age too low: 2592000
prinbanat.ngo: did not receive HSTS header
princeagency.com: did not receive HSTS header
+princepessa.de: did not receive HSTS header
+princesparktouch.com: did not receive HSTS header
princessbackpack.de: could not connect to host
princessmargaretlotto.com: did not receive HSTS header
principalship.net: could not connect to host
+principalstest.review: could not connect to host
prinesdoma.at: did not receive HSTS header
printerest.io: could not connect to host
-printersonline.be: did not receive HSTS header
+printersonline.be: could not connect to host
printery.be: could not connect to host
printexpress.cloud: could not connect to host
priolkar.com: could not connect to host
prism-communication.com: could not connect to host
pristineevents.co.uk: did not receive HSTS header
pritchett.xyz: could not connect to host
-privacylabs.io: did not receive HSTS header
+privacylabs.io: could not connect to host
privacymanatee.com: could not connect to host
privacyrup.net: could not connect to host
privategiant.com: could not connect to host
-privatepokertour.com: could not connect to host
privatstunden.express: could not connect to host
privcloud.cc: could not connect to host
privcloud.org: could not connect to host
privilegevisa.fr: could not connect to host
privu.me: could not connect to host
privytime.com: could not connect to host
-prmte.com: did not receive HSTS header
+prknje.com: did not receive HSTS header
+prmte.com: could not connect to host
prnt.li: did not receive HSTS header
pro-esb.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
pro-esb.net: could not connect to host
@@ -14092,13 +14952,11 @@ productgap.com: did not receive HSTS header
productived.net: did not receive HSTS header
producto8.com: did not receive HSTS header
productoinnovador.com: did not receive HSTS header
-produkttest-online.com: did not receive HSTS header
proesb.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
proesb.net: could not connect to host
profi-durchgangsmelder.de: did not receive HSTS header
profinetz.de: could not connect to host
profivps.com: could not connect to host
-profloorstl.com: did not receive HSTS header
proformer.io: could not connect to host
profpay.com: could not connect to host
profundr.com: could not connect to host
@@ -14110,7 +14968,6 @@ programmingstudent.com: could not connect to host
progress-technologies.com: could not connect to host
progressivecfo.co.nz: could not connect to host
prohostonline.fi: could not connect to host
-proimpact.it: did not receive HSTS header
proitconsulting.com.au: could not connect to host
proj.org.cn: could not connect to host
project-rune.tech: could not connect to host
@@ -14119,8 +14976,10 @@ project-splash.com: could not connect to host
project-stats.com: could not connect to host
projectascension.io: could not connect to host
projectasterk.com: could not connect to host
+projectblackbook.us: did not receive HSTS header
projectcastle.tech: did not receive HSTS header
-projectdp.net: could not connect to host
+projectdp.net: did not receive HSTS header
+projectgrimoire.com: did not receive HSTS header
projectherogames.xyz: could not connect to host
projectl1b1t1na.tk: could not connect to host
projectmercury.space: did not receive HSTS header
@@ -14147,8 +15006,8 @@ proobec.cz: did not receive HSTS header
propactrading.com: could not connect to host
propagandism.org: did not receive HSTS header
propepper.net: did not receive HSTS header
+properchels.com: did not receive HSTS header
propershave.com: could not connect to host
-prophiler.de: did not receive HSTS header
proplan.co.il: did not receive HSTS header
propmag.co: could not connect to host
prosenseit.com: did not receive HSTS header
@@ -14156,23 +15015,24 @@ prosharp.com.au: could not connect to host
proslimdiets.com: could not connect to host
prosocialmachines.com: could not connect to host
prosperident.com: did not receive HSTS header
-prostohobby.ru: could not connect to host
prostoporno.net: could not connect to host
prostoporno.sexy: could not connect to host
proteapower.co.za: could not connect to host
protecciondelconsumidor.gov: did not receive HSTS header
-proteinnuts.cz: could not connect to host
+proto-online.ru: did not receive HSTS header
protonmail.ch: did not receive HSTS header
+providerlijst.ml: could not connect to host
provisionaldriving.com: did not receive HSTS header
provisionircd.tk: did not receive HSTS header
provitacare.com: did not receive HSTS header
+provokator.co.il: did not receive HSTS header
proweser.de: did not receive HSTS header
prowhisky.de: did not receive HSTS header
proxbox.net: did not receive HSTS header
proxi.cf: could not connect to host
proximato.com: could not connect to host
proxybay.al: could not connect to host
-proxybay.club: did not receive HSTS header
+proxybay.club: could not connect to host
proxybay.info: did not receive HSTS header
proxybay.top: could not connect to host
proxydesk.eu: could not connect to host
@@ -14185,24 +15045,26 @@ proxyrox.com: could not connect to host
proxyweb.us: did not receive HSTS header
proyecto13.com: did not receive HSTS header
proymaganadera.com: did not receive HSTS header
-prpr.cloud: could not connect to host
-prpsss.com: could not connect to host
+prpsss.com: did not receive HSTS header
prstatic.com: could not connect to host
pruikshop.nl: could not connect to host
prxio.date: could not connect to host
prxio.site: could not connect to host
-ps-qa.com: could not connect to host
+ps-qa.com: did not receive HSTS header
+ps-w.ru: did not receive HSTS header
ps-x.ru: could not connect to host
pscleaningsolutions.co.uk: could not connect to host
-pseudo.coffee: could not connect to host
+pseudo.coffee: did not receive HSTS header
psicologia.co.ve: could not connect to host
psicologoforensebarcelona.com: did not receive HSTS header
+psicometricas.mx: did not receive HSTS header
psicosalud.online: could not connect to host
psncardplus.be: could not connect to host
psncardplus.com: could not connect to host
psncardplus.dk: could not connect to host
psncardplus.nl: could not connect to host
psncardplus.se: could not connect to host
+pson.ninja: could not connect to host
pstrozniak.com: could not connect to host
pstudio.me: max-age too low: 0
psw.academy: could not connect to host
@@ -14211,6 +15073,7 @@ psxtr.com: could not connect to host
psychiatrie-betreuung.ch: could not connect to host
psychologie-hofner.at: could not connect to host
psynapse.net.au: could not connect to host
+pthsec.com: could not connect to host
ptn.moscow: could not connect to host
ptonet.com: could not connect to host
ptrujillo.com: did not receive HSTS header
@@ -14218,12 +15081,15 @@ pub-online.ro: could not connect to host
pubkey.is: could not connect to host
publications.qld.gov.au: did not receive HSTS header
publicidadnovagrass.com.mx: could not connect to host
+publicinquiry.eu: did not receive HSTS header
publick.net: did not receive HSTS header
publicspeakingcamps.com: could not connect to host
publimepa.it: could not connect to host
publishingshack.com: did not receive HSTS header
puchunguis.com: did not receive HSTS header
puentes.info: did not receive HSTS header
+puestifiestas.mx: did not receive HSTS header
+puestosdeferia.mx: did not receive HSTS header
puetter.eu: could not connect to host
pugilares.com.pl: could not connect to host
pugliese.fr: could not connect to host
@@ -14240,22 +15106,25 @@ pumpgames.net: could not connect to host
punchkickinteractive.com: did not receive HSTS header
punchr-kamikazee.rhcloud.com: could not connect to host
punkdns.top: could not connect to host
+puntacanalink.com: could not connect to host
puppydns.com: did not receive HSTS header
purahealthyliving.com: did not receive HSTS header
purbd.com: did not receive HSTS header
pureessentialoil.biz: max-age too low: 300
pureholisticliving.me: could not connect to host
-purelunch.co.uk: could not connect to host
+pureluxemedical.com: did not receive HSTS header
purewebmasters.com: could not connect to host
purikore.com: could not connect to host
purplehippie.in: did not receive HSTS header
-purplez.pw: did not receive HSTS header
purpoz.com.br: could not connect to host
purpspc.com: could not connect to host
+purrfectcams.com: could not connect to host
push.world: did not receive HSTS header
pushapp.org: did not receive HSTS header
+pushers.com.mx: could not connect to host
pushphp.com: could not connect to host
pushstar.com: max-age too low: 0
+pusichatka.ddns.net: could not connect to host
puzz.gg: could not connect to host
pvagner.tk: did not receive HSTS header
pwd.ovh: could not connect to host
@@ -14263,31 +15132,35 @@ pwfrance.com: could not connect to host
pwi.agency: did not receive HSTS header
pwm.jp: could not connect to host
pwnsdx.pw: did not receive HSTS header
-pwntr.com: could not connect to host
+pwntr.com: did not receive HSTS header
pwt.pw: could not connect to host
pxio.de: did not receive HSTS header
pyjiaoyi.cf: could not connect to host
pyol.org: could not connect to host
pypi-mirrors.org: could not connect to host
pypi-status.org: could not connect to host
-pyplo.org: did not receive HSTS header
+pyplo.org: could not connect to host
pypt.lt: did not receive HSTS header
-pyrrhonism.org: could not connect to host
+pyrrhonism.org: did not receive HSTS header
pythia.nz: could not connect to host
pythonic.guru: could not connect to host
pythonic.training: could not connect to host
pzgreni.ch: did not receive HSTS header
pzme.me: could not connect to host
q-rickroll-u.pw: could not connect to host
+q-tr.com: did not receive HSTS header
+q123123.com: did not receive HSTS header
q2.si: did not receive HSTS header
+q5118.com: could not connect to host
q8mp3.me: did not receive HSTS header
qadmium.tk: could not connect to host
-qamrulhaque.com: could not connect to host
+qamrulhaque.com: did not receive HSTS header
qapital.com: did not receive HSTS header
qazcloud.com: could not connect to host
qbik.de: did not receive HSTS header
qbin.io: did not receive HSTS header
qbnt.ca: could not connect to host
+qc.immo: could not connect to host
qccqld.org.au: did not receive HSTS header
qe2homelottery.com: did not receive HSTS header
qensio.com: did not receive HSTS header
@@ -14296,15 +15169,16 @@ qi0.de: did not receive HSTS header
qiannews.net: could not connect to host
qifu.org.cn: could not connect to host
qimiao.io: did not receive HSTS header
+qingcao.org: could not connect to host
qingpat.com: could not connect to host
qingxuan.info: did not receive HSTS header
qinxi1992.com: could not connect to host
qionglu.pw: could not connect to host
qipp.com: did not receive HSTS header
qirinus.com: did not receive HSTS header
+qiu521119.host: did not receive HSTS header
qiuxian.ddns.net: could not connect to host
qixxit.de: did not receive HSTS header
-qkka.org: did not receive HSTS header
qkzy.net: did not receive HSTS header
qldconservation.org: could not connect to host
qnatek.org: could not connect to host
@@ -14313,6 +15187,7 @@ qoohoot.com: did not receive HSTS header
qop.io: did not receive HSTS header
qoqo.us: did not receive HSTS header
qorm.co.uk: could not connect to host
+qq52o.me: did not receive HSTS header
qqj.net: could not connect to host
qqq.gg: could not connect to host
qqvips.com: could not connect to host
@@ -14323,18 +15198,15 @@ qrforex.com: did not receive HSTS header
qrlending.com: could not connect to host
qrlfinancial.com: could not connect to host
qswoo.org: could not connect to host
-qtap.me: could not connect to host
qto.org: could not connect to host
-quaedam.org: did not receive HSTS header
quail.solutions: could not connect to host
quakerlens.com: did not receive HSTS header
quality1.com.br: did not receive HSTS header
qualityology.com: did not receive HSTS header
quanglepro.com: could not connect to host
quangngaimedia.com: did not receive HSTS header
-quanjinlong.cn: did not receive HSTS header
+quanjinlong.cn: could not connect to host
quantacloud.ch: could not connect to host
-quantaloupe.tech: could not connect to host
quantenteranik.eu: could not connect to host
quantor.dk: did not receive HSTS header
quantum-cloud.xyz: could not connect to host
@@ -14357,7 +15229,7 @@ queryplayground.com: could not connect to host
questionable.host: could not connect to host
questions-admin.com: did not receive HSTS header
questionyu.com: did not receive HSTS header
-questoj.cn: did not receive HSTS header
+questoj.cn: could not connect to host
questsandrewards.com: could not connect to host
quic.fr: did not receive HSTS header
quickandroid.tools: could not connect to host
@@ -14365,17 +15237,18 @@ quickpayservice.com: could not connect to host
quietus.gq: could not connect to host
quikrmovies.to: could not connect to host
quikstorhawaii.com: max-age too low: 300
-quilmo.com: could not connect to host
quimsertek.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
quizionic.com: could not connect to host
quizl.io: did not receive HSTS header
quizmemes.org: could not connect to host
+quizstore.net: did not receive HSTS header
+quocdesign.ch: could not connect to host
quotehex.com: could not connect to host
quotemaster.co.za: could not connect to host
quranserver.net: could not connect to host
+qvq.cloud: did not receive HSTS header
qwallet.ca: could not connect to host
qwaser.fr: could not connect to host
-qweepi.de: could not connect to host
qwertyatom100.me: could not connect to host
qwilink.me: did not receive HSTS header
qybot.cc: did not receive HSTS header
@@ -14385,16 +15258,15 @@ r-core.ru: could not connect to host
r-cut.fr: could not connect to host
r-rickroll-u.pw: could not connect to host
r0t.co: could not connect to host
-r0uzic.net: did not receive HSTS header
r10n.com: did not receive HSTS header
r15.me: did not receive HSTS header
r18.moe: could not connect to host
raajheshkannaa.com: could not connect to host
-rabbitvcactus.eu: did not receive HSTS header
+rabbit.wales: could not connect to host
+rabbitvcactus.eu: could not connect to host
rabota-x.ru: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
racasdecachorro.org: could not connect to host
-racdek.net: max-age too low: 2628000
-racdek.nl: max-age too low: 2628000
+racesport.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
rachaelrussell.com: did not receive HSTS header
rackblue.com: could not connect to host
racktear.com: did not receive HSTS header
@@ -14406,28 +15278,32 @@ raddavarden.nu: did not receive HSTS header
radicaleducation.net: could not connect to host
radioactivenetwork.xyz: could not connect to host
radioafibra.com.br: could not connect to host
-radionicabg.com: could not connect to host
radior9.it: could not connect to host
+radiumtree.com: could not connect to host
radom-pack.pl: could not connect to host
radtke.bayern: did not receive HSTS header
rafaelcz.de: could not connect to host
+rafsis.com: did not receive HSTS header
raft.pub: could not connect to host
raghavdua.in: could not connect to host
-ragingserenity.com: did not receive HSTS header
ragnaroktop.com.br: could not connect to host
rahadiana.com: could not connect to host
rahamasin.eu: could not connect to host
-rai-co.net: did not receive HSTS header
+rai-co.net: could not connect to host
raiblockscommunity.net: could not connect to host
raidstone.com: could not connect to host
raidstone.rocks: could not connect to host
railjob.cn: could not connect to host
railyardurgentcare.com: did not receive HSTS header
+raimixmotoparts.com.br: could not connect to host
rainbin.com: could not connect to host
rainbowbarracuda.com: could not connect to host
+raito.win: could not connect to host
raitza.de: could not connect to host
rakugaki.cn: could not connect to host
-ramatola.uk: could not connect to host
+ralph.bike: did not receive HSTS header
+ralphwoessner.com: did not receive HSTS header
+ramatola.uk: did not receive HSTS header
rambii.de: could not connect to host
ramblingrf.tech: could not connect to host
ramezanloo.com: did not receive HSTS header
@@ -14435,14 +15311,13 @@ ramitmittal.com: could not connect to host
ramon-c.nl: could not connect to host
ramonj.nl: could not connect to host
randomcage.com: did not receive HSTS header
-randomcloud.net: could not connect to host
+randomcloud.net: did not receive HSTS header
randomhero.cloud: could not connect to host
randomwinpicker.de: could not connect to host
randy.pw: could not connect to host
ranegroup.hosting: could not connect to host
rankthespot.com: could not connect to host
rannseier.org: did not receive HSTS header
-ranos.org: could not connect to host
rantanda.com: could not connect to host
rany.duckdns.org: could not connect to host
rany.io: did not receive HSTS header
@@ -14452,17 +15327,18 @@ rapdogg.com: could not connect to host
raphaelmoura.ddns.net: could not connect to host
rapidemobile.com: did not receive HSTS header
rapidflow.io: could not connect to host
+rapidhubs.com: could not connect to host
rapido.nu: could not connect to host
rapidresearch.me: could not connect to host
rapidthunder.io: could not connect to host
-rasebo.ro: could not connect to host
+rappet.de: could not connect to host
rasing.me: max-age too low: 43200
raspass.me: did not receive HSTS header
raspberry.us: could not connect to host
raspberryultradrops.com: did not receive HSTS header
raspitec.ddns.net: could not connect to host
rastreador.com.es: did not receive HSTS header
-rastreie.net: could not connect to host
+rastreie.net: did not receive HSTS header
ratajczak.fr: could not connect to host
rate-esport.de: could not connect to host
rathorian.fr: could not connect to host
@@ -14476,6 +15352,7 @@ raulfraile.net: could not connect to host
rautermods.net: did not receive HSTS header
ravage.fm: did not receive HSTS header
raven.lipetsk.ru: could not connect to host
+ravenger.net: did not receive HSTS header
ravengergaming.ga: could not connect to host
ravengergaming.net: could not connect to host
ravenx.me: could not connect to host
@@ -14486,15 +15363,20 @@ rawet.se: could not connect to host
rawoil.com: could not connect to host
rawr.sexy: could not connect to host
rawstorieslondon.com: could not connect to host
+ray-home.de: could not connect to host
+ray-works.de: could not connect to host
rayanitco.com: did not receive HSTS header
raycarruthersphotography.co.uk: could not connect to host
raydan.space: could not connect to host
raydobe.me: could not connect to host
+raymd.de: could not connect to host
+raymii.org: did not receive HSTS header
raymondelooff.nl: did not receive HSTS header
raytron.org: could not connect to host
raywin168.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
raywin168.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
raywin88.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+rayworks.de: could not connect to host
razlaw.name: did not receive HSTS header
razzolini.com.br: could not connect to host
rb-china.net: could not connect to host
@@ -14509,8 +15391,8 @@ rburchell.com: did not receive HSTS header
rbxcatalog.com: could not connect to host
rc4.io: could not connect to host
rc7.ch: could not connect to host
-rca.ink: could not connect to host
rcafox.com: could not connect to host
+rchavez.site: could not connect to host
rcoliveira.com: could not connect to host
rcorporation.be: did not receive HSTS header
rcpcbd.com: could not connect to host
@@ -14526,18 +15408,20 @@ re-customer.net: could not connect to host
re-wilding.com: could not connect to host
reachr.com: could not connect to host
reactdatepicker.com: did not receive HSTS header
-reactions.ai: could not connect to host
reactor92.com: could not connect to host
reader.ga: could not connect to host
+readheadcopywriting.com: max-age too low: 0
readify.com.au: did not receive HSTS header
+readingandmath.org: could not connect to host
readism.io: could not connect to host
readityourself.net: could not connect to host
readmeeatmedrinkme.com: did not receive HSTS header
readr.pw: could not connect to host
+reads.wang: could not connect to host
readtldr.com: could not connect to host
readydok.com: did not receive HSTS header
+readytowear.es: could not connect to host
reagir43.fr: did not receive HSTS header
-reaiaer.com: could not connect to host
reakyaweso.me: could not connect to host
real-bits.com: could not connect to host
real-compare.com: did not receive HSTS header
@@ -14546,7 +15430,7 @@ realfamilyincest.com: could not connect to host
realgarant-shop.de: did not receive HSTS header
realhost.name: could not connect to host
realincest.tv: could not connect to host
-really.io: did not receive HSTS header
+really.io: could not connect to host
reallyreally.io: did not receive HSTS header
realmic.net: could not connect to host
realmofespionage.com: could not connect to host
@@ -14558,7 +15442,9 @@ reaper.rip: could not connect to host
reardenporn.com: could not connect to host
rebekaesgabor.online: could not connect to host
rebootmc.com: could not connect to host
-rebtoor.com: could not connect to host
+recapp.ch: could not connect to host
+recard.vn: did not receive HSTS header
+recebersms.com: did not receive HSTS header
receitas-de-bolos.pt: could not connect to host
receitasdebacalhau.pt: could not connect to host
receptionsbook.com: could not connect to host
@@ -14568,11 +15454,12 @@ rechenwerk.net: could not connect to host
recht-freundlich.de: did not receive HSTS header
rechtenliteratuurleiden.nl: could not connect to host
reclamebureau-ultrax.nl: did not receive HSTS header
-recreation.gov: did not receive HSTS header
+recreoviral.com: did not receive HSTS header
recruitsecuritytraining.co.uk: could not connect to host
recruitsecuritytraining.com: could not connect to host
rectoraudiparts.com: could not connect to host
-red-trigger.net: did not receive HSTS header
+recuerdafilms.com: did not receive HSTS header
+red2fred2.com: could not connect to host
redair.es: could not connect to host
redar.xyz: could not connect to host
redburn.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -14599,7 +15486,9 @@ redoakmedia.net: did not receive HSTS header
redperegrine.com: did not receive HSTS header
redporno.cz: could not connect to host
redports.org: could not connect to host
-redra.ws: did not receive HSTS header
+redprice.by: could not connect to host
+redra.ws: could not connect to host
+redshield.co: did not receive HSTS header
redsquirrelcampsite.co.uk: max-age too low: 5184000
redstarsurf.com: did not receive HSTS header
reducerin.ro: did not receive HSTS header
@@ -14612,12 +15501,14 @@ reeson.org: could not connect to host
reevoo.com: did not receive HSTS header
ref1oct.nl: could not connect to host
referenten.org: did not receive HSTS header
+refill-roboter.de: did not receive HSTS header
refitplanner.com: did not receive HSTS header
reflecton.io: could not connect to host
+reflectores.net: did not receive HSTS header
reformatreality.com: could not connect to host
refreshingserum.com: could not connect to host
reg.ru: did not receive HSTS header
-regaloaks.com: did not receive HSTS header
+regaloaks.com: could not connect to host
regalpaintingfdl.com: could not connect to host
regalpalms.com: did not receive HSTS header
regenbogenwald.de: did not receive HSTS header
@@ -14631,6 +15522,7 @@ register.gov.uk: did not receive HSTS header
registertovoteflorida.gov: did not receive HSTS header
regoul.com: did not receive HSTS header
regsec.com: could not connect to host
+rehabmail.com: did not receive HSTS header
rehabthailand.nl: could not connect to host
reher.pro: could not connect to host
rei.codes: did not receive HSTS header
@@ -14638,11 +15530,9 @@ reic.me: could not connect to host
reidascuecas.com.br: could not connect to host
reignsphere.net: could not connect to host
reikiqueen.uk: could not connect to host
-reinaertvandecruys.com: could not connect to host
reinaertvandecruys.me: could not connect to host
reineberthe.ch: could not connect to host
reinoldus.ddns.net: could not connect to host
-reisenbauer.ee: could not connect to host
reismil.ch: could not connect to host
reisyukaku.org: did not receive HSTS header
reithguard-it.de: did not receive HSTS header
@@ -14663,33 +15553,35 @@ remedica.fr: could not connect to host
remedioscaserosparalacistitis.com: did not receive HSTS header
remedium.de: could not connect to host
remedyrehab.com: did not receive HSTS header
+remejeanne.com: could not connect to host
rememberthis.co.za: could not connect to host
remodela.com.ve: could not connect to host
remodelwithlegacy.com: did not receive HSTS header
remonttitekniikka.fi: could not connect to host
+remoteham.com: could not connect to host
remotestance.com: did not receive HSTS header
rencaijia.com: did not receive HSTS header
rencontres-erotiques.com: did not receive HSTS header
rene-guitton.fr: did not receive HSTS header
-reneclemens.nl: max-age too low: 2628000
-renedekoeijer.nl: max-age too low: 2628000
+reneclemens.nl: could not connect to host
+renesauerwein.com: did not receive HSTS header
+renesauerwein.de: did not receive HSTS header
+renewed.technology: could not connect to host
rengarenkblog.com: could not connect to host
renideo.fr: could not connect to host
renkhosting.com: could not connect to host
renlong.org: did not receive HSTS header
rennfire.org: could not connect to host
renrenss.com: could not connect to host
-renscreations.com: could not connect to host
+renscreations.com: did not receive HSTS header
rentacarcluj.xyz: did not receive HSTS header
rentalmed.com.br: did not receive HSTS header
-rentasweb.gob.ar: did not receive HSTS header
rentbrowser.com: could not connect to host
rentbrowsertrain.me: could not connect to host
rentcarassist.com: could not connect to host
renteater.com: could not connect to host
rentex.com: did not receive HSTS header
reo.gov: could not connect to host
-reorz.com: could not connect to host
reparo.pe: did not receive HSTS header
repex.co.il: could not connect to host
replaceits.me: could not connect to host
@@ -14709,10 +15601,10 @@ reporturl.io: did not receive HSTS header
reposaarenkuva.fi: could not connect to host
reprolife.co.uk: could not connect to host
reptilauksjonen.no: could not connect to host
-republicmo.gov: could not connect to host
+republicmo.gov: did not receive HSTS header
repustate.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
reqognize.com: could not connect to host
-reqrut.net: could not connect to host
+reqrut.net: did not receive HSTS header
request-trent.com: could not connect to host
res-rheingau.de: could not connect to host
res42.com: did not receive HSTS header
@@ -14720,6 +15612,7 @@ resc.la: could not connect to host
research.md: could not connect to host
reseponline.info: did not receive HSTS header
reserve-online.net: did not receive HSTS header
+reservetonshift.com: could not connect to host
reservoirtp.fr: did not receive HSTS header
residentsinsurance.co.uk: did not receive HSTS header
resl20.servehttp.com: could not connect to host
@@ -14738,7 +15631,6 @@ restioson.me: could not connect to host
restopro.nyc: could not connect to host
restoreresearchstudy.com: could not connect to host
resultsdate.news: could not connect to host
-retcor.net: could not connect to host
retetop95.it: did not receive HSTS header
reth.ch: could not connect to host
retireyourpassword.org: did not receive HSTS header
@@ -14759,6 +15651,7 @@ reverse.design: could not connect to host
review.info: could not connect to host
reviewbestseller.com: did not receive HSTS header
reviewjust.com: did not receive HSTS header
+reviewmed-215418.appspot.com: did not receive HSTS header
reviewspedia.org: did not receive HSTS header
revistapequenosolhares.com.br: could not connect to host
revolutionhive.com: could not connect to host
@@ -14770,7 +15663,7 @@ reykjavik.guide: could not connect to host
rezun.cloud: did not receive HSTS header
rf.tn: could not connect to host
rfeif.org: could not connect to host
-rfxanalyst.com: could not connect to host
+rgavmf.ru: did not receive HSTS header
rgservers.com: did not receive HSTS header
rhapsodhy.hu: could not connect to host
rhdigital.pro: could not connect to host
@@ -14784,6 +15677,7 @@ rhodes.ml: could not connect to host
rhodesianridgeback.com.br: could not connect to host
rhodosdreef.nl: could not connect to host
ribopierre.fr: could not connect to host
+ribs.com: did not receive HSTS header
riceglue.com: could not connect to host
richamorindonesia.com: did not receive HSTS header
richardb.me: could not connect to host
@@ -14807,6 +15701,8 @@ rideforwade.net: could not connect to host
rideforwade.org: could not connect to host
rideworks.com: could not connect to host
ridingoklahoma.com: could not connect to host
+ridwan.co: could not connect to host
+riechsteiner.tech: could not connect to host
rienasemettre.fr: did not receive HSTS header
riesenmagnete.de: could not connect to host
riester.pl: did not receive HSTS header
@@ -14819,14 +15715,16 @@ rijndael.xyz: could not connect to host
rijnmondeg.nl: did not receive HSTS header
rika.me: could not connect to host
rimediogiusto.com: could not connect to host
-rincon-nsn.gov: could not connect to host
+rincon-nsn.gov: did not receive HSTS header
ring0.xyz: did not receive HSTS header
ringh.am: could not connect to host
rinj.se: did not receive HSTS header
rionewyork.com.br: could not connect to host
-ripa.io: could not connect to host
+rioxmarketing.pt: could not connect to host
+ripa.io: did not receive HSTS header
ripple.com: did not receive HSTS header
rippleunion.com: could not connect to host
+ris-bad-wurzach.de: did not receive HSTS header
risi-china.com: could not connect to host
risingsun.red: could not connect to host
riskmgt.com.au: could not connect to host
@@ -14840,6 +15738,7 @@ rivermendhealthcenters.com: did not receive HSTS header
riversideauto.net: did not receive HSTS header
riverstyxgame.com: could not connect to host
rivlo.com: could not connect to host
+rixzz.ovh: could not connect to host
rj.gg: could not connect to host
rjnutrition.consulting: did not receive HSTS header
rk6.cz: could not connect to host
@@ -14849,25 +15748,34 @@ rkmedia.no: could not connect to host
rmaqequipamentos.com.br: could not connect to host
rmdlingerie.com.br: did not receive HSTS header
rme.li: did not receive HSTS header
+rmf.io: could not connect to host
rmit.me: could not connect to host
rmk.si: could not connect to host
+rms-digicert.ne.jp: did not receive HSTS header
rmsides.com: did not receive HSTS header
rn29.me: could not connect to host
+rnb-storenbau.ch: max-age too low: 0
rnbjunk.com: did not receive HSTS header
roadfeast.com: could not connect to host
roan24.pl: did not receive HSTS header
-roave.com: could not connect to host
+roave.com: did not receive HSTS header
rob.uk.com: did not receive HSTS header
+robbertt.com: could not connect to host
+robert-foster.com: could not connect to host
robertabittle.com: could not connect to host
robertg.me: did not receive HSTS header
robertglastra.com: could not connect to host
+robertlluberes.com: did not receive HSTS header
roberto-webhosting.nl: could not connect to host
robertocasares.no-ip.biz: could not connect to host
robi-net.it: could not connect to host
robin-novotny.com: could not connect to host
robinadr.com: did not receive HSTS header
+robinflikkema.nl: could not connect to host
+robinsonstrategy.com: could not connect to host
robomonkey.org: could not connect to host
-robtatemusic.com: could not connect to host
+roboth.am: could not connect to host
+robotics.plus: did not receive HSTS header
robteix.com: did not receive HSTS header
robtex.net: did not receive HSTS header
robtex.org: did not receive HSTS header
@@ -14896,7 +15804,7 @@ rofrank.space: could not connect to host
rogeiro.net: could not connect to host
roger101.com: did not receive HSTS header
rogerdat.ovh: could not connect to host
-roguesignal.net: could not connect to host
+rogue-e.xyz: could not connect to host
rohanbassett.com: could not connect to host
rohankrishnadev.in: could not connect to host
rohlik.cz: did not receive HSTS header
@@ -14906,17 +15814,20 @@ roksolana.be: could not connect to host
rolandkolodziej.com: max-age too low: 86400
rolandslate.com: did not receive HSTS header
rolemaster.net: could not connect to host
+roleplayhome.com: could not connect to host
+rollercoasteritalia.it: did not receive HSTS header
rolroer.co.za: could not connect to host
romaimperator.com: did not receive HSTS header
romainmuller.xyz: did not receive HSTS header
romans-place.me.uk: could not connect to host
romantic-quotes.co.uk: did not receive HSTS header
romanticschemermovie.com: could not connect to host
+romar-bos.nl: could not connect to host
romeoferraris.com: did not receive HSTS header
romleg.cf: could not connect to host
roms.fun: could not connect to host
romulusapp.com: could not connect to host
-ron2k.za.net: could not connect to host
+ron2k.za.net: did not receive HSTS header
ronanrbr.com: did not receive HSTS header
rondoniatec.com.br: did not receive HSTS header
rondreis-planner.nl: could not connect to host
@@ -14929,7 +15840,7 @@ rool.me: did not receive HSTS header
roolevoi.ru: could not connect to host
room-checkin24.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
roomongo.com: did not receive HSTS header
-roosterpgplus.nl: did not receive HSTS header
+roosterpgplus.nl: could not connect to host
rootbsd.at: could not connect to host
rootforum.org: did not receive HSTS header
rootrelativity.com: could not connect to host
@@ -14943,7 +15854,7 @@ roseofyork.com: did not receive HSTS header
rosetiger.life: could not connect to host
rosewoodranch.com: did not receive HSTS header
roshiya.co.in: could not connect to host
-rosi-royal.com: could not connect to host
+rosi-royal.com: did not receive HSTS header
rospa100.com: did not receive HSTS header
rossclark.com: did not receive HSTS header
rossen.be: did not receive HSTS header
@@ -14951,60 +15862,72 @@ rossfrancis.co.uk: did not receive HSTS header
rossiworld.com: did not receive HSTS header
rosslug.org.uk: could not connect to host
rotex1840.de: did not receive HSTS header
-rotozen.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
rotter-dam.nl: did not receive HSTS header
rotterdamjazz.info: could not connect to host
rotzonline.com: could not connect to host
rough.nu: could not connect to host
roundaboutweb.info: did not receive HSTS header
-roundtheme.com: did not receive HSTS header
rous.se: could not connect to host
rouvray.org: could not connect to host
+rove3d.com: could not connect to host
+rows.io: could not connect to host
royal-forest.org: max-age too low: 0
royal-mangal.ch: could not connect to host
royal806.com: did not receive HSTS header
-royal810.com: could not connect to host
-royal811.com: could not connect to host
-royal816.com: could not connect to host
-royal817.com: could not connect to host
-royal830.com: could not connect to host
+royal810.com: did not receive HSTS header
+royal811.com: did not receive HSTS header
+royal812.com: did not receive HSTS header
+royal816.com: did not receive HSTS header
+royal817.com: did not receive HSTS header
+royal818.com: did not receive HSTS header
+royal830.com: did not receive HSTS header
royal833.com: did not receive HSTS header
-royal851.com: could not connect to host
+royal850.com: did not receive HSTS header
+royal851.com: did not receive HSTS header
royal852.com: did not receive HSTS header
-royal855.com: could not connect to host
+royal853.com: did not receive HSTS header
+royal855.com: did not receive HSTS header
royal856.com: did not receive HSTS header
royal857.com: did not receive HSTS header
royal859.com: did not receive HSTS header
royal86.com: did not receive HSTS header
royal861.com: did not receive HSTS header
+royal862.com: did not receive HSTS header
+royal863.com: did not receive HSTS header
royal865.com: did not receive HSTS header
+royal867.com: did not receive HSTS header
+royal868.com: did not receive HSTS header
royal869.com: did not receive HSTS header
-royal872.com: could not connect to host
+royal871.com: did not receive HSTS header
+royal872.com: did not receive HSTS header
royal873.com: did not receive HSTS header
royal875.com: did not receive HSTS header
royal876.com: could not connect to host
-royal877.com: could not connect to host
-royal879.com: could not connect to host
+royal877.com: did not receive HSTS header
+royal879.com: did not receive HSTS header
royal88.tech: did not receive HSTS header
-royal881.com: could not connect to host
-royal882.com: could not connect to host
-royal883.com: could not connect to host
+royal881.com: did not receive HSTS header
+royal882.com: did not receive HSTS header
+royal883.com: did not receive HSTS header
royal885.com: did not receive HSTS header
royal886.com: did not receive HSTS header
royal887.com: did not receive HSTS header
royal888888.com: did not receive HSTS header
royal889.com: did not receive HSTS header
royal890.com: could not connect to host
-royal891.com: could not connect to host
+royal891.com: did not receive HSTS header
royal892.com: could not connect to host
royal893.com: could not connect to host
royal894.com: could not connect to host
royal895.com: could not connect to host
royal896.com: did not receive HSTS header
+royal898.com: did not receive HSTS header
royal899.com: did not receive HSTS header
+royalcitytaxi.com: could not connect to host
royalhop.co: could not connect to host
royalsignaturecruise.com: could not connect to host
royaltube.net: could not connect to host
+royalty-market.com: could not connect to host
royalyule.com: did not receive HSTS header
roychan.org: max-age too low: 0
royzez.com: could not connect to host
@@ -15012,14 +15935,16 @@ rozalisbengal.ro: could not connect to host
rozeapp.nl: could not connect to host
rpasafrica.com: could not connect to host
rr.in.th: could not connect to host
+rr105.de: did not receive HSTS header
rring.me: could not connect to host
rritv.com: could not connect to host
-rrke.cc: could not connect to host
+rrke.cc: did not receive HSTS header
rro.rs: could not connect to host
rrom.me: did not receive HSTS header
rs-devdemo.host: could not connect to host
rsajeey.info: could not connect to host
rsampaio.info: did not receive HSTS header
+rsauget.fr: could not connect to host
rsf.io: could not connect to host
rsi.im: could not connect to host
rskuipers.com: did not receive HSTS header
@@ -15027,17 +15952,20 @@ rsldb.com: could not connect to host
rsm-intern.de: could not connect to host
rsmaps.org: could not connect to host
rsmmail.com: did not receive HSTS header
-rsships.com: could not connect to host
+rsships.com: did not receive HSTS header
+rssr.ddns.net: could not connect to host
rstraining.co.uk: did not receive HSTS header
rstsecuritygroup.co.uk: could not connect to host
rtc.fun: could not connect to host
rtd.uk.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
rtfpessoa.xyz: did not receive HSTS header
rtho.me: did not receive HSTS header
+rths.tk: could not connect to host
rttss.com: could not connect to host
rtvi.com: did not receive HSTS header
ru-music.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-ruarua.ml: could not connect to host
+rua.cx: could not connect to host
+ruarua.ml: did not receive HSTS header
rubbereggs.ca: could not connect to host
rubbix.net: could not connect to host
rubecodeberg.com: could not connect to host
@@ -15045,31 +15973,31 @@ rubendv.be: did not receive HSTS header
rubenschulz.nl: did not receive HSTS header
rubi-ka.net: max-age too low: 0
ruborr.se: did not receive HSTS header
-rubyquincunx.com: could not connect to host
-rubyquincunx.org: could not connect to host
rubysecurity.org: did not receive HSTS header
rubyshop.nl: could not connect to host
+rudelune.fr: could not connect to host
rudeotter.com: did not receive HSTS header
ruderverein-gelsenkirchen.de: did not receive HSTS header
rue-de-la-vieille.fr: did not receive HSTS header
ruflay.ru: could not connect to host
+rugby.video: could not connect to host
rugirlfriend.com: could not connect to host
rugs.ca: did not receive HSTS header
rugstorene.co.uk: did not receive HSTS header
ruhr3.de: did not receive HSTS header
ruig.jp: could not connect to host
ruigomes.me: did not receive HSTS header
-ruitershoponline.nl: did not receive HSTS header
ruja.dk: did not receive HSTS header
rukhaiyar.com: could not connect to host
rullzer.com: did not receive HSTS header
rummel-platz.de: could not connect to host
rumoterra.com.br: could not connect to host
+run-forrest.run: could not connect to host
runawebinar.nl: could not connect to host
runcarina.com: could not connect to host
rundumcolumn.xyz: could not connect to host
runementors.com: could not connect to host
-runhardt.eu: did not receive HSTS header
+runhardt.eu: could not connect to host
runtl.com: did not receive HSTS header
runtondev.com: did not receive HSTS header
ruobiyi.com: could not connect to host
@@ -15080,8 +16008,6 @@ rusl.net: did not receive HSTS header
russmarshall.com: could not connect to host
rustbyexample.com: did not receive HSTS header
rustfanatic.com: did not receive HSTS header
-rustralasia.net: max-age too low: 0
-ruurdboomsma.nl: could not connect to host
ruxit.com: did not receive HSTS header
rva.gov: could not connect to host
rvender.cz: did not receive HSTS header
@@ -15089,9 +16015,9 @@ rvg.zone: could not connect to host
rvoigt.eu: could not connect to host
rvolve.net: could not connect to host
rw-solutions.tech: could not connect to host
-rwanderlust.com: did not receive HSTS header
+rwanderlust.com: could not connect to host
rwgamernl.ml: could not connect to host
-rxgroup.io: could not connect to host
+rx-contact.com: did not receive HSTS header
rxprep.com: did not receive HSTS header
rxt.social: could not connect to host
rxv.cc: could not connect to host
@@ -15102,25 +16028,27 @@ rybox.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR
ryejuice.sytes.net: could not connect to host
rylin.net: did not receive HSTS header
rylore.com: could not connect to host
+ryssl.com: could not connect to host
ryssland.guide: could not connect to host
ryyule.com: did not receive HSTS header
ryzex.de: could not connect to host
rzegroup.com: did not receive HSTS header
s-d-v.ch: could not connect to host
-s-mdb.com: max-age too low: 7776000
s-on.li: could not connect to host
s-rickroll-p.pw: could not connect to host
s.how: could not connect to host
s0923.com: could not connect to host
s1mplescripts.de: could not connect to host
s1ris.org: did not receive HSTS header
+s2p.moe: could not connect to host
s3cases.com: did not receive HSTS header
s3gfault.com: could not connect to host
s3n.se: could not connect to host
-saabwa.org: could not connect to host
+s5118.com: could not connect to host
+sa-blog.net: could not connect to host
+saabwa.org: did not receive HSTS header
sabatek.pl: did not receive HSTS header
-sabrinajoiasprontaentrega.com.br: could not connect to host
-sabtunes.com: did not receive HSTS header
+sabtunes.com: could not connect to host
sac-shop.com: did not receive HSTS header
saccounty.gov: could not connect to host
sacharidovejednotky.eu: could not connect to host
@@ -15128,13 +16056,12 @@ sachk.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_
sackers.com: did not receive HSTS header
saco-ceso.com: could not connect to host
sadiejanehair.com: could not connect to host
-sadmansh.com: could not connect to host
-sadsu.com: did not receive HSTS header
saenforcement.agency: could not connect to host
safari-afrique.com: did not receive HSTS header
safe.space: could not connect to host
-safedevice.net: could not connect to host
+safedevice.net: did not receive HSTS header
safelist.eu: did not receive HSTS header
+safeme.ga: could not connect to host
safemovescheme.co.uk: could not connect to host
safemt.gov: could not connect to host
safepay.io: could not connect to host
@@ -15149,7 +16076,6 @@ sagarhandicraft.com: could not connect to host
sagemontchurch.org: did not receive HSTS header
sageth.com: could not connect to host
sah3.net: could not connect to host
-saigonstar.de: could not connect to host
sail-nyc.com: did not receive HSTS header
saint-astier-triathlon.com: did not receive HSTS header
saintefoy-tarentaise.com: did not receive HSTS header
@@ -15166,8 +16092,10 @@ saleaks.org: could not connect to host
salearnership.co.za: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
saleslift.pl: could not connect to host
salishseawhalewatching.ca: did not receive HSTS header
+salixcode.com: did not receive HSTS header
sallysubs.com: could not connect to host
salmo23.com.br: could not connect to host
+salmos91.com: could not connect to host
salon-claudia.ch: could not connect to host
salonestella.it: could not connect to host
salserocafe.com: did not receive HSTS header
@@ -15179,14 +16107,15 @@ saludsexualmasculina.org: did not receive HSTS header
salvaalocombia.com: could not connect to host
salverainha.org: could not connect to host
salzamt.tk: could not connect to host
-samanacafe.com: could not connect to host
samanthahumphreysstudio.com: did not receive HSTS header
samanthasicecream.com: could not connect to host
samaritan.tech: could not connect to host
samaritansnet.org: did not receive HSTS header
+samba.com.co: did not receive HSTS header
+sambaa.com.br: could not connect to host
sametovymesic.cz: could not connect to host
samin.tk: could not connect to host
-samip.fi: did not receive HSTS header
+samitechnic.com: did not receive HSTS header
saml2.com: could not connect to host
samlamac.com: could not connect to host
samm.com.au: did not receive HSTS header
@@ -15199,10 +16128,12 @@ samraskauskas.com: could not connect to host
samsen.club: could not connect to host
samsonova.de: could not connect to host
samsungxoa.com: could not connect to host
+samuel-dumont.be: did not receive HSTS header
samvanderkris.com: could not connect to host
samvanderkris.xyz: did not receive HSTS header
samyerkes.com: did not receive HSTS header
-san-mian-ka.ml: did not receive HSTS header
+san-mian-ka.ml: could not connect to host
+sanael.net: could not connect to host
sanalbayrak.com: could not connect to host
sanandreasstories.com: did not receive HSTS header
sanasalud.org: could not connect to host
@@ -15210,12 +16141,14 @@ sanatfilan.com: did not receive HSTS header
sanatrans.com: could not connect to host
sanchez.adv.br: could not connect to host
sanderknape.com: did not receive HSTS header
+sandobygg.se: could not connect to host
+sandogruppen.se: could not connect to host
sandtonvipcompanions.com: did not receive HSTS header
sandviks.com: did not receive HSTS header
sanguoxiu.com: could not connect to host
sanhei.ch: did not receive HSTS header
-sanik.my: did not receive HSTS header
-sanmuding.com: could not connect to host
+sanik.my: could not connect to host
+sannesfotklinikk.no: did not receive HSTS header
sanradon.by: did not receive HSTS header
sansage.com.br: did not receive HSTS header
sansdev.com: could not connect to host
@@ -15238,12 +16171,14 @@ sapporobeer.com: could not connect to host
sapuncheta.com: could not connect to host
saq.com: could not connect to host
sarah-beckett-harpist.com: did not receive HSTS header
+sarahcheyette.com: did not receive HSTS header
sarahdoyley.com: could not connect to host
sarahlouisesearle.com: could not connect to host
sarahsweetlife.com: could not connect to host
sarahsweger.com: could not connect to host
sarakas.com: did not receive HSTS header
sarangsemutbandung.com: could not connect to host
+sarbash.ee: could not connect to host
sarindia.com: could not connect to host
sarindia.de: could not connect to host
sarisonproductions.com: did not receive HSTS header
@@ -15251,6 +16186,7 @@ sarkarikhoj.com: could not connect to host
sarkarischeme.in: could not connect to host
sarkisozleri.us: could not connect to host
sarndipity.com: could not connect to host
+saronno5stelle.it: did not receive HSTS header
saruwebshop.co.za: could not connect to host
sasrobotics.xyz: could not connect to host
sat.rent: did not receive HSTS header
@@ -15263,7 +16199,6 @@ satrent.com: did not receive HSTS header
satrent.se: did not receive HSTS header
satriyowibowo.my.id: could not connect to host
satsang-uwe.de: did not receive HSTS header
-satsukii.moe: did not receive HSTS header
sattamatkadpboss.mobi: could not connect to host
saturne.tk: could not connect to host
saucyfox.net: did not receive HSTS header
@@ -15276,6 +16211,7 @@ saunasandstuff.com: did not receive HSTS header
saurel.me: could not connect to host
savacloud.com: did not receive HSTS header
savannahtasteexperience.com: did not receive HSTS header
+save-me-koeln.de: could not connect to host
save.gov: could not connect to host
saveaward.gov: could not connect to host
savecashindia.com: did not receive HSTS header
@@ -15286,22 +16222,26 @@ savethedogfishfoundation.org: could not connect to host
saveyour.biz: could not connect to host
savingbytes.com: did not receive HSTS header
savinggoliath.com: could not connect to host
+savingsstoreonline.ca: did not receive HSTS header
savvysuit.com: did not receive HSTS header
saxol-group.com: could not connect to host
say-hanabi.com: could not connect to host
sayhanabi.com: could not connect to host
sazima.ru: did not receive HSTS header
+sblum.de: did not receive HSTS header
sbm.cloud: could not connect to host
sbobetfun.com: did not receive HSTS header
sbox-archives.com: could not connect to host
sbsrv.ml: could not connect to host
sby.de: did not receive HSTS header
sc4le.com: could not connect to host
-scaarus.com: could not connect to host
scaffoldhireeastrand.co.za: did not receive HSTS header
+scaffoldhirefourways.co.za: did not receive HSTS header
+scaffoldhirerandburg.co.za: did not receive HSTS header
scaffoldhiresandton.co.za: did not receive HSTS header
scala.click: did not receive HSTS header
-scannabi.com: could not connect to host
+scannabi.com: did not receive HSTS header
+scentofwine.com: did not receive HSTS header
sceptique.eu: did not receive HSTS header
sch44r0n.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
schaafenstrasse.koeln: could not connect to host
@@ -15309,7 +16249,7 @@ schachburg.de: did not receive HSTS header
schadegarant.net: could not connect to host
schalkoortbv.nl: did not receive HSTS header
schaper-sport.com: did not receive HSTS header
-schatmeester.be: did not receive HSTS header
+schatmeester.be: could not connect to host
schau-rein.co.at: did not receive HSTS header
schauer.so: could not connect to host
schd.io: did not receive HSTS header
@@ -15339,15 +16279,20 @@ schreibnacht.de: did not receive HSTS header
schreinerei-wortmann.de: did not receive HSTS header
schrikdraad.net: did not receive HSTS header
schrodinger.io: could not connect to host
+schrodingersscat.com: could not connect to host
+schrodingersscat.org: could not connect to host
schroepfglas-versand.de: did not receive HSTS header
schroettle.com: did not receive HSTS header
schulterglatzen-altenwalde.de: could not connect to host
+schum.world: could not connect to host
+schummar.de: could not connect to host
schur-it.de: could not connect to host
+schwanke.in: max-age too low: 3600
schwarzkopfforyou.de: did not receive HSTS header
schwarzwaldcon.de: did not receive HSTS header
schwedenhaus.ag: did not receive HSTS header
schweiz.guide: could not connect to host
-schweizerbolzonello.net: could not connect to host
+schweizerbolzonello.net: did not receive HSTS header
schwerkraftlabor.de: did not receive HSTS header
schwetz.net: could not connect to host
sci-internet.tk: could not connect to host
@@ -15358,6 +16303,8 @@ scienceathome.org: did not receive HSTS header
sciencemonster.co.uk: could not connect to host
scionasset.com: did not receive HSTS header
sciototownship-oh.gov: did not receive HSTS header
+scis.com.ua: did not receive HSTS header
+scitopia.me: could not connect to host
scivillage.com: did not receive HSTS header
sckc.stream: could not connect to host
sclgroup.cc: did not receive HSTS header
@@ -15369,13 +16316,16 @@ scores4schools.com: could not connect to host
scorobudem.ru: could not connect to host
scorocode.ru: did not receive HSTS header
scotbirchfield.com: did not receive HSTS header
+scottah.com: did not receive HSTS header
scottainslie.me.uk: could not connect to host
scottdial.com: did not receive HSTS header
scottferguson.com.au: did not receive HSTS header
+scottgruber.me: did not receive HSTS header
scotthel.me: did not receive HSTS header
scotthelme.com: did not receive HSTS header
scottnicol.co.uk: could not connect to host
-scottstorey.co.uk: did not receive HSTS header
+scottstorey.co.uk: could not connect to host
+scotttopperproductions.com: did not receive HSTS header
scottynordstrom.org: could not connect to host
scourt.info: max-age too low: 0
scourt.org.ua: could not connect to host
@@ -15398,13 +16348,13 @@ scriptict.nl: did not receive HSTS header
scriptjunkie.us: could not connect to host
scrollstory.com: did not receive HSTS header
scruffymen.com: could not connect to host
-scrumplex.net: did not receive HSTS header
sctm.at: could not connect to host
scuters.club: could not connect to host
scw.com: did not receive HSTS header
scw.nz: could not connect to host
scwilliams.co.uk: could not connect to host
scwilliams.uk: could not connect to host
+sdayman.com: did not receive HSTS header
sdhmanagementgroup.com: could not connect to host
sdia.ru: could not connect to host
sdl-corporatesite-staging.azurewebsites.net: did not receive HSTS header
@@ -15416,27 +16366,24 @@ se7ensins.com: did not receive HSTS header
sea-godzilla.com: could not connect to host
seanationals.org: max-age too low: 1
seanchaidh.org: could not connect to host
-seans.cc: did not receive HSTS header
+seans.cc: could not connect to host
seanstrout.com: did not receive HSTS header
seansyardservice.com: did not receive HSTS header
searchgov.gov.il: did not receive HSTS header
searchshops.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
searx.pw: could not connect to host
-seatshare.co.uk: did not receive HSTS header
-seattleprivacy.org: could not connect to host
seavancouver.com: did not receive HSTS header
sebastian-bair.de: could not connect to host
sebastian-lutsch.de: could not connect to host
sebastian-schmidt.me: did not receive HSTS header
sebastianhampl.de: could not connect to host
sebastianpedersen.com: did not receive HSTS header
-sebastiensenechal.com: did not receive HSTS header
sebi.cf: could not connect to host
sebster.com: did not receive HSTS header
sec4share.me: did not receive HSTS header
secandtech.com: could not connect to host
secanje.nl: did not receive HSTS header
-secboom.com: did not receive HSTS header
+secboom.com: could not connect to host
seccomp.ru: did not receive HSTS header
seceye.cn: could not connect to host
secitem.at: could not connect to host
@@ -15451,15 +16398,16 @@ secondarysurvivorportal.com: could not connect to host
secondarysurvivorportal.help: could not connect to host
secondbike.co.uk: did not receive HSTS header
secondbyte.nl: could not connect to host
-secondpay.nl: did not receive HSTS header
+secondpay.nl: could not connect to host
secondspace.ca: could not connect to host
secpoc.online: could not connect to host
secretnation.net: did not receive HSTS header
secretofanah.com: could not connect to host
secretpanties.com: could not connect to host
-secretum.tech: did not receive HSTS header
sectest.ml: could not connect to host
sectia22.ro: could not connect to host
+section508.gov: did not receive HSTS header
+sectionw2s.org: did not receive HSTS header
secur3.us: did not receive HSTS header
secure-automotive-cloud.com: could not connect to host
secure-automotive-cloud.org: could not connect to host
@@ -15469,7 +16417,6 @@ secure.link: did not receive HSTS header
securechat4.me: could not connect to host
securedevelop.net: could not connect to host
securefuture.nl: did not receive HSTS header
-secureideas.com: did not receive HSTS header
secureindia.co: could not connect to host
secureradio.net: could not connect to host
securesuisse.ch: could not connect to host
@@ -15478,8 +16425,10 @@ securita.eu: did not receive HSTS header
security-carpet.com: could not connect to host
security-thoughts.org: could not connect to host
security.google.com: did not receive HSTS header (error ignored - included regardless)
+security.love: could not connect to host
security.xn--q9jyb4c: could not connect to host
securityarena.com: could not connect to host
+securityblues.co.uk: could not connect to host
securitybrief.asia: did not receive HSTS header
securitybrief.co.nz: did not receive HSTS header
securitybrief.com.au: did not receive HSTS header
@@ -15491,7 +16440,9 @@ securityglance.com: could not connect to host
securityinet.biz: did not receive HSTS header
securityinet.net: did not receive HSTS header
securityinet.org.il: could not connect to host
+securitysense.co.uk: could not connect to host
securitysoapbox.com: could not connect to host
+securitystreak.com: could not connect to host
securitytalk.pl: could not connect to host
securitytestfan.gov: could not connect to host
securitywatch.co.nz: did not receive HSTS header
@@ -15499,13 +16450,15 @@ securiviera.ch: did not receive HSTS header
securon.io: could not connect to host
securoswiss.ch: could not connect to host
secwise.nl: did not receive HSTS header
+sedeusquiser.net: did not receive HSTS header
sedoexpert.nl: could not connect to host
sedoexperts.nl: could not connect to host
sedrubal.de: could not connect to host
sedziapilkarski.pl: did not receive HSTS header
seedalpha.com: could not connect to host
seedboxers.net: could not connect to host
-seefirm.com: could not connect to host
+seedsofangelica.net: did not receive HSTS header
+seefirm.com: did not receive HSTS header
seefunk.net: did not receive HSTS header
seehimnaked.com: could not connect to host
seehimnude.com: could not connect to host
@@ -15514,6 +16467,7 @@ seekthe.net: did not receive HSTS header
seele.ca: could not connect to host
seemeasaperson.com: did not receive HSTS header
seen.life: did not receive HSTS header
+seesuite.com: could not connect to host
sehenderson.com: did not receive HSTS header
seida.at: could not connect to host
seiko-dojo.com: could not connect to host
@@ -15525,40 +16479,42 @@ selecadm.name: could not connect to host
selectary.com: could not connect to host
selectcertifiedautos.com: did not receive HSTS header
selectruckscalltrackingreports.com: could not connect to host
-selent.me: could not connect to host
-seleondar.ru: did not receive HSTS header
+selekzo.com: could not connect to host
selfdefenserx.com: did not receive HSTS header
selfhosters.com: could not connect to host
selfie-france.fr: could not connect to host
+selfoutlet.com: did not receive HSTS header
selfserverx.com: could not connect to host
selitysvideot.fi: did not receive HSTS header
-sellercritic.com: could not connect to host
+sellercritic.com: did not receive HSTS header
sellocdn.com: could not connect to host
sellservs.co.za: could not connect to host
seltendoof.de: could not connect to host
semantheme.fr: could not connect to host
semen3325.xyz: could not connect to host
semenkovich.com: did not receive HSTS header
-sementes.gratis: could not connect to host
semianalog.com: could not connect to host
semirben.de: max-age too low: 172800
semmlers.com: did not receive HSTS header
semps-servers.de: could not connect to host
sendash.com: did not receive HSTS header
-sendmeback.de: did not receive HSTS header
senedirect.com: could not connect to host
senemusique.com: did not receive HSTS header
+senorporno.com: could not connect to host
senseofnumber.co.uk: did not receive HSTS header
senseye.io: did not receive HSTS header
sensiblemn.org: could not connect to host
sensibus.com: did not receive HSTS header
-sensoft-int.com: could not connect to host
sensoft-int.net: could not connect to host
+sensound.ml: could not connect to host
sensualism.com: could not connect to host
seo-lagniappe.com: did not receive HSTS header
+seo.london: did not receive HSTS header
seoarchive.org: could not connect to host
seobot.com.au: could not connect to host
+seocomposer.com: did not receive HSTS header
seoenmexico.com.mx: did not receive HSTS header
+seoexperte.berlin: did not receive HSTS header
seohochschule.de: could not connect to host
seoium.com: did not receive HSTS header
seokay.com: did not receive HSTS header
@@ -15569,40 +16525,44 @@ seomen.biz: could not connect to host
seomobo.com: could not connect to host
seosanantonioinc.com: did not receive HSTS header
seoscribe.net: could not connect to host
-seosec.xyz: could not connect to host
+seostepbysteplab.com: could not connect to host
seotronix.net: did not receive HSTS header
-seowarp.net: did not receive HSTS header
+seowarp.net: could not connect to host
sep23.ru: did not receive HSTS header
sepakbola.win: could not connect to host
sephr.com: did not receive HSTS header
sepie.gob.es: did not receive HSTS header
-seproco.com: could not connect to host
septakkordeon.de: could not connect to host
seq.tf: did not receive HSTS header
-sequatchiecountytn.gov: could not connect to host
+sequatchiecountytn.gov: did not receive HSTS header
serafin.tech: could not connect to host
serathius.ovh: could not connect to host
serbien.guide: could not connect to host
serenitycreams.com: did not receive HSTS header
serfdom.io: did not receive HSTS header
-sergeemond.ca: could not connect to host
-sergivb01.me: did not receive HSTS header
+sergiojimenezequestrian.com: could not connect to host
serized.pw: could not connect to host
serkaneles.com: did not receive HSTS header
+seru.eu: could not connect to host
servdiscount.com: did not receive HSTS header
servecrypt.com: could not connect to host
servecrypt.net: could not connect to host
servecrypt.ru: could not connect to host
+servemnaction.org: could not connect to host
server-bg.net: could not connect to host
server.pk: did not receive HSTS header
+server92.tk: could not connect to host
+serverangels.co.uk: did not receive HSTS header
servercode.ca: did not receive HSTS header
serverdensity.io: did not receive HSTS header
servergno.me: did not receive HSTS header
serverlauget.no: could not connect to host
+serverlog.net: could not connect to host
servermonkey.nl: could not connect to host
servfefe.com: could not connect to host
service-wueste-vodafone.tk: could not connect to host
servicevie.com: did not receive HSTS header
+servidoresweb.online: did not receive HSTS header
servpanel.de: did not receive HSTS header
servu.de: did not receive HSTS header
servx.ru: did not receive HSTS header
@@ -15610,36 +16570,37 @@ seryo.moe: could not connect to host
seryo.net: could not connect to host
seryovpn.com: could not connect to host
sesha.co.za: could not connect to host
+setfix.de: did not receive HSTS header
sethoedjo.com: could not connect to host
setkit.net: could not connect to host
setterirlandes.com.br: could not connect to host
setuid.de: could not connect to host
sevenet.pl: did not receive HSTS header
sevenhearts.online: could not connect to host
-sevsey.ru: could not connect to host
sevsopr.ru: could not connect to host
sex-education.com: could not connect to host
+sexaki.com: did not receive HSTS header
sexgarage.de: could not connect to host
sexocomgravidas.com: could not connect to host
sexoyrelax.com: could not connect to host
sexpay.net: could not connect to host
sexshopfacil.com.br: could not connect to host
-sexshopnet.com.br: could not connect to host
sexshopsgay.com: did not receive HSTS header
sexwork.net: could not connect to host
sexymassageoil.com: could not connect to host
seyahatsagliksigortalari.com: could not connect to host
+seydaozcan.com: could not connect to host
seyr.it: could not connect to host
sfashion.si: did not receive HSTS header
sfaturiit.ro: could not connect to host
sfcomercio.com.br: could not connect to host
sfhobbies.com.br: could not connect to host
-sfsltd.com: did not receive HSTS header
+sfsltd.com: could not connect to host
sgovaard.nl: did not receive HSTS header
-sgroup-hitoduma.com: did not receive HSTS header
-sgroup-rec.com: did not receive HSTS header
+sgrmreproduccionapp.azurewebsites.net: could not connect to host
sgthotshot.com: could not connect to host
sgtsnookums.net: could not connect to host
+sh0rt.zone: did not receive HSTS header
sh11.pp.ua: did not receive HSTS header
sh4y.com: could not connect to host
sha2017.org: did not receive HSTS header
@@ -15676,11 +16637,13 @@ shanekoster.net: did not receive HSTS header
shanesage.com: could not connect to host
shanewadleigh.com: did not receive HSTS header
shang-yu.cn: could not connect to host
-shangzhen.site: could not connect to host
+shangzhen.site: did not receive HSTS header
+shannoneichorn.com: did not receive HSTS header
shanxiapark.com: could not connect to host
shanyhs.com: could not connect to host
shapesedinburgh.co.uk: did not receive HSTS header
shardsoft.com: could not connect to host
+share.works: max-age too low: 1209600
sharecc.co: could not connect to host
shareeri.com: could not connect to host
shareimg.xyz: could not connect to host
@@ -15690,7 +16653,6 @@ sharepass.pw: could not connect to host
sharepic.xyz: could not connect to host
sharesplitter.com: could not connect to host
shareworx.net: could not connect to host
-sharezen.de: could not connect to host
shariahlawcenter.com: could not connect to host
shariahlawcenter.org: could not connect to host
sharialawcenter.com: could not connect to host
@@ -15701,6 +16663,7 @@ sharpe-practice.co.uk: could not connect to host
shasso.com: did not receive HSTS header
shatorin.com: did not receive HSTS header
shauncrowley.co.uk: could not connect to host
+shaunharker.com: did not receive HSTS header
shaunwheelhou.se: could not connect to host
shavingks.com: could not connect to host
shawnbsmith.me: did not receive HSTS header
@@ -15708,12 +16671,12 @@ shawnh.net: could not connect to host
shawnstarrcustomhomes.com: did not receive HSTS header
shawnwilson.info: could not connect to host
shazbots.org: could not connect to host
-shellday.cc: could not connect to host
+sheekdeveloper.com: could not connect to host
shellot.com: could not connect to host
shellsec.pw: did not receive HSTS header
+shemsconseils.ma: could not connect to host
shena.co.uk: could not connect to host
shengrenyu.com: could not connect to host
-shens.ai: could not connect to host
shentengtu.idv.tw: could not connect to host
shep.co.il: did not receive HSTS header
sheratan.web.id: could not connect to host
@@ -15726,6 +16689,8 @@ sheying.tm: could not connect to host
shiatsu-institut.ch: could not connect to host
shibainu.com.br: could not connect to host
shibe.club: could not connect to host
+shieldcomputer.com: could not connect to host
+shieldfe.com: did not receive HSTS header
shieldofachilles.in: could not connect to host
shift.ooo: did not receive HSTS header
shiftins.com: could not connect to host
@@ -15746,6 +16711,7 @@ shippingbo.com: did not receive HSTS header
shiroki-k.net: could not connect to host
shirosaki.org: could not connect to host
shishamania.de: could not connect to host
+shishkabobnc.com: did not receive HSTS header
shishkin.link: did not receive HSTS header
shitfest.info: did not receive HSTS header
shitposting.life: could not connect to host
@@ -15757,6 +16723,8 @@ shmunky.co.uk: did not receive HSTS header
sho-tanaka.jp: could not connect to host
shocksrv.com: did not receive HSTS header
shoemuse.com: did not receive HSTS header
+sholtowu.com: could not connect to host
+shome.de: did not receive HSTS header
shooshosha.com: could not connect to host
shootpooloklahoma.com: could not connect to host
shop.fr: did not receive HSTS header
@@ -15774,8 +16742,8 @@ shops.neonisi.com: could not connect to host
shortpath.com: could not connect to host
shortr.li: could not connect to host
shota.party: could not connect to host
-shota.vip: could not connect to host
shotpixonline.com.br: did not receive HSTS header
+show-saratov.ru: did not receive HSTS header
show-stream.tv: could not connect to host
showdepiscinas.com.br: did not receive HSTS header
shower.im: did not receive HSTS header
@@ -15789,20 +16757,21 @@ shreyansh26.me: could not connect to host
shtorku.com: could not connect to host
shu-kin.net: did not receive HSTS header
shukatsu-note.com: could not connect to host
+shulker.store: could not connect to host
shurita.org: could not connect to host
-shuvo.rocks: did not receive HSTS header
+shuvo.rocks: could not connect to host
shuzicai.cn: could not connect to host
shv25.se: could not connect to host
shwongacc.com: could not connect to host
-shybynature.com: did not receive HSTS header
shymeck.pw: could not connect to host
shypp.it: could not connect to host
shyrydan.es: could not connect to host
-si.to: could not connect to host
+siamdevsquare.com: could not connect to host
siamega.com: could not connect to host
siammedia.co: could not connect to host
siamojo.com: could not connect to host
sianimacion.com: could not connect to host
+sianjhon.com: did not receive HSTS header
siao-mei.com: did not receive HSTS header
sichere-kartenakzeptanz.de: could not connect to host
siciliadigitale.pro: could not connect to host
@@ -15810,27 +16779,26 @@ sickfile.com: could not connect to host
sicklepod.com: could not connect to host
siconnect.us: did not receive HSTS header
sictame-tigf.org: did not receive HSTS header
-sideropolisnoticias.com.br: did not receive HSTS header
-sidpod.ru: could not connect to host
+sideropolisnoticias.com.br: could not connect to host
siduga.com: could not connect to host
siebens.net: could not connect to host
sieh.es: did not receive HSTS header
+siemencaes.tk: max-age too low: 2592000
sieulog.com: could not connect to host
sifls.com: could not connect to host
sifreuret.com: could not connect to host
signaltransmitter.de: did not receive HSTS header
-signdesk.com: did not receive HSTS header
signere.com: could not connect to host
signere.no: did not receive HSTS header
signoracle.com: could not connect to host
-signosquecombinam.com.br: did not receive HSTS header
+signosquecombinam.com.br: could not connect to host
signsdance.uk: could not connect to host
-sigsegv.run: did not receive HSTS header
+sigsegv.run: could not connect to host
sihaizixun.net: could not connect to host
siikarantacamping.fi: did not receive HSTS header
sijimi.cn: did not receive HSTS header
sijmenschoon.nl: did not receive HSTS header
-sikatehtaat.fi: could not connect to host
+sikatehtaat.fi: did not receive HSTS header
siku.pro: could not connect to host
silentcircle.com: did not receive HSTS header
silentcircle.org: could not connect to host
@@ -15845,9 +16813,14 @@ silverartcollector.com: did not receive HSTS header
silverback.is: did not receive HSTS header
silvergoldbull.ba: could not connect to host
silvergoldbull.bg: could not connect to host
+silvergoldbull.co.tz: could not connect to host
+silvergoldbull.com.gh: could not connect to host
+silvergoldbull.hr: could not connect to host
silvergoldbull.kg: could not connect to host
silvergoldbull.ky: could not connect to host
+silvergoldbull.lk: could not connect to host
silvergoldbull.md: could not connect to host
+silvergoldbull.mk: could not connect to host
silvergoldbull.ml: could not connect to host
silvergoldbull.ph: could not connect to host
silverhome.ninja: could not connect to host
@@ -15864,13 +16837,14 @@ simeon.us: max-age too low: 2592000
simfri.com: could not connect to host
simha.online: could not connect to host
simhaf.cf: could not connect to host
+simlau.net: could not connect to host
simnovo.net: did not receive HSTS header
simobilklub.si: could not connect to host
simod.org: could not connect to host
simon-pokorny.com: did not receive HSTS header
simon.butcher.name: max-age too low: 2629743
simon.lc: did not receive HSTS header
-simongong.net: did not receive HSTS header
+simongong.net: could not connect to host
simonkjellberg.se: did not receive HSTS header
simonsaxon.com: did not receive HSTS header
simonschmitt.ch: could not connect to host
@@ -15881,7 +16855,6 @@ simpeo.fr: did not receive HSTS header
simpeo.org: did not receive HSTS header
simpleai.net: max-age too low: 600
simpleclassiclife.com: could not connect to host
-simplefraud.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
simplelearner.com: could not connect to host
simplepractice.com: did not receive HSTS header
simplerses.com: could not connect to host
@@ -15906,7 +16879,7 @@ singerwang.com: did not receive HSTS header
singles-berlin.de: could not connect to host
singul4rity.com: could not connect to host
sinkip.com: could not connect to host
-sinn.io: could not connect to host
+sinn.io: did not receive HSTS header
sinneserweiterung.de: could not connect to host
sinon.org: did not receive HSTS header
sinoscandinavia.se: could not connect to host
@@ -15917,17 +16890,20 @@ sinusbot.online: did not receive HSTS header
sion.moe: did not receive HSTS header
sipc.org: did not receive HSTS header
sipsik.net: did not receive HSTS header
+sipstix.co.za: did not receive HSTS header
siqi.wang: could not connect to host
-sirburton.com: could not connect to host
+sirburton.com: did not receive HSTS header
siriad.com: could not connect to host
sirius-lee.net: could not connect to host
siro.gq: did not receive HSTS header
siroop.ch: did not receive HSTS header
sisgopro.com: could not connect to host
+sisseastumine.ee: could not connect to host
sistemasespecializados.com: did not receive HSTS header
sistemlash.com: did not receive HSTS header
sistemos.net: could not connect to host
sistersurprise.de: did not receive HSTS header
+siteage.net: did not receive HSTS header
sitecloudify.com: could not connect to host
sitecuatui.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
sitehome.eu: could not connect to host
@@ -15938,21 +16914,23 @@ siterip.org: could not connect to host
sites.google.com: did not receive HSTS header (error ignored - included regardless)
sitesforward.com: did not receive HSTS header
sitesource101.com: did not receive HSTS header
-sitesten.com: did not receive HSTS header
+sitesten.com: could not connect to host
sitesuccessful.com: did not receive HSTS header
sitsy.ru: did not receive HSTS header
sittinginoblivion.com: did not receive HSTS header
+siusto.com: did not receive HSTS header
+sixcorners.info: did not receive HSTS header
+sixcorners.net: could not connect to host
+sixtwentyten.com: did not receive HSTS header
sizingservers.be: did not receive HSTS header
-sizzle.co.uk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
sja-se-training.com: could not connect to host
-sjatsh.com: could not connect to host
sjdtaxi.com: did not receive HSTS header
sjhyl11.com: could not connect to host
sjsc.fr: did not receive HSTS header
sjsmith.id.au: did not receive HSTS header
sjv4u.ch: did not receive HSTS header
sjzebs.com: did not receive HSTS header
-sjzget.com: did not receive HSTS header
+sjzget.com: could not connect to host
sjzybs.com: did not receive HSTS header
skandiabanken.no: did not receive HSTS header
skaraborgsassistans.com: did not receive HSTS header
@@ -15965,12 +16943,13 @@ skates.guru: did not receive HSTS header
skday.com: did not receive HSTS header
ski-insurance.com.au: did not receive HSTS header
skidstresser.com: could not connect to host
+skigebied.nl: could not connect to host
skiinstructor.services: did not receive HSTS header
skilldetector.com: could not connect to host
+skillout.org: could not connect to host
skillproxy.com: could not connect to host
skillproxy.net: could not connect to host
skillproxy.org: could not connect to host
-skills2services.com: did not receive HSTS header
skimming.net: did not receive HSTS header
skinbet.co: could not connect to host
skinmarket.co: could not connect to host
@@ -15983,34 +16962,34 @@ skoda-nurdiebesten.de: did not receive HSTS header
skoda-service-team-cup.de: did not receive HSTS header
skolnieks.lv: could not connect to host
skomski.org: did not receive HSTS header
-skoolergraph.azurewebsites.net: did not receive HSTS header
+skorepova.info: could not connect to host
skpdev.net: could not connect to host
skrimix.tk: could not connect to host
skrivande.co: could not connect to host
skullhouse.nyc: could not connect to host
+skutry.cz: could not connect to host
sky-aroma.com: could not connect to host
sky-universe.net: did not receive HSTS header
+skyanchor.com: did not receive HSTS header
skyasker.cn: could not connect to host
skyasker.com: could not connect to host
-skybloom.com: could not connect to host
skybloom.io: could not connect to host
skybound.link: did not receive HSTS header
skyflix.me: could not connect to host
skyline.link: could not connect to host
skyline.tw: did not receive HSTS header
skylocker.net: could not connect to host
-skylocker.nl: did not receive HSTS header
+skylocker.nl: could not connect to host
skyoy.com: did not receive HSTS header
skypeassets.com: could not connect to host
skypoker.com: could not connect to host
-skyris.co: could not connect to host
+skyris.co: did not receive HSTS header
skyrunners.ch: could not connect to host
-skytec.host: could not connect to host
+skytec.host: did not receive HSTS header
skyvault.io: could not connect to host
-skyveo.ml: did not receive HSTS header
+skyveo.ml: could not connect to host
skyway.capital: did not receive HSTS header
skyworldserver.ddns.net: could not connect to host
-sl0.us: did not receive HSTS header
sl1pkn07.wtf: could not connect to host
slaps.be: could not connect to host
slash-dev.de: did not receive HSTS header
@@ -16025,6 +17004,7 @@ slatemc.fun: could not connect to host
slatko.io: could not connect to host
slattery.co: did not receive HSTS header
slauber.de: did not receive HSTS header
+slaughter.com: could not connect to host
sld08.com: did not receive HSTS header
sleeklounge.com: did not receive HSTS header
sleep10.com: could not connect to host
@@ -16040,7 +17020,6 @@ slimmerbouwen.be: did not receive HSTS header
slingo.com: did not receive HSTS header
slix.io: could not connect to host
sln.cloud: could not connect to host
-slo-net.net: could not connect to host
slope.haus: could not connect to host
slotboss.co.uk: did not receive HSTS header
slovakiana.sk: did not receive HSTS header
@@ -16049,9 +17028,11 @@ slovoice.org: could not connect to host
slowfood.es: did not receive HSTS header
slowsociety.org: could not connect to host
slse.ca: max-age too low: 0
+sluitkampzeist.nl: could not connect to host
sluplift.com: could not connect to host
slycurity.de: could not connect to host
slytech.ch: could not connect to host
+smadav.ml: could not connect to host
smallcdn.rocks: could not connect to host
smallchat.nl: could not connect to host
smallcloudsolutions.co.za: could not connect to host
@@ -16069,7 +17050,7 @@ smarterskies.gov: did not receive HSTS header
smartest-trading.com: could not connect to host
smarthomedna.com: did not receive HSTS header
smartietop.com: could not connect to host
-smartit.pro: did not receive HSTS header
+smartit.pro: could not connect to host
smartlend.se: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
smartmompicks.com: did not receive HSTS header
smartofficesandsmarthomes.com: did not receive HSTS header
@@ -16077,8 +17058,10 @@ smartofficeusa.com: [Exception... "Component returned failure code: 0x80004005 (
smartphone.continental.com: could not connect to host
smartrade.tech: did not receive HSTS header
smartrak.co.nz: did not receive HSTS header
+smartviewing.com: did not receive HSTS header
+smartwelve.com: could not connect to host
smartwritingservice.com: could not connect to host
-smcbox.com: did not receive HSTS header
+smcbox.com: could not connect to host
smdev.fr: could not connect to host
smet.us: could not connect to host
smi-a.me: could not connect to host
@@ -16087,19 +17070,23 @@ smimea.com: did not receive HSTS header
smirkingwhorefromhighgarden.pro: could not connect to host
smith.is: could not connect to host
smittix.co.uk: did not receive HSTS header
+smitug.pw: could not connect to host
smkn1lengkong.sch.id: did not receive HSTS header
smksi2.com: could not connect to host
smksultanismail2.com: could not connect to host
sml.lc: could not connect to host
smmcab.ru: could not connect to host
smmcab.website: could not connect to host
+smmlaba.io: could not connect to host
smokinghunks.com: could not connect to host
smove.sg: did not receive HSTS header
smplix.com: could not connect to host
+smplr.uk: could not connect to host
smries.com: could not connect to host
sms1.ro: could not connect to host
smsben.cn: did not receive HSTS header
smsben.com: did not receive HSTS header
+smskeywords.co.uk: could not connect to host
smspodmena.ru: could not connect to host
smtp.bz: did not receive HSTS header
smtpdev.com: could not connect to host
@@ -16111,8 +17098,10 @@ snailing.org: could not connect to host
snake.dog: could not connect to host
snakehosting.dk: did not receive HSTS header
snapappts.com: could not connect to host
+snapnudes.co: could not connect to host
snapworks.net: did not receive HSTS header
snarf.in: could not connect to host
+snazel.co.uk: could not connect to host
sneaker.date: could not connect to host
sneed.company: could not connect to host
sneezry.com: did not receive HSTS header
@@ -16141,6 +17130,7 @@ socal-babes.com: could not connect to host
soccergif.com: could not connect to host
soci.ml: could not connect to host
social-journey.com: could not connect to host
+social-media-strategy.org.uk: could not connect to host
socialbillboard.com: could not connect to host
socialcs.xyz: could not connect to host
socialdj.de: did not receive HSTS header
@@ -16148,29 +17138,31 @@ socialfacecook.com: did not receive HSTS header
socialgrowing.cl: did not receive HSTS header
socialhead.io: could not connect to host
socialhub.com: did not receive HSTS header
+socializam.com: did not receive HSTS header
socialprize.com: did not receive HSTS header
socialspirit.com.br: did not receive HSTS header
+socialstrata.com: did not receive HSTS header
socialworkout.com: could not connect to host
socialworkout.net: could not connect to host
socialworkout.org: could not connect to host
socialworkout.tv: could not connect to host
socketize.com: did not receive HSTS header
sockeye.cc: could not connect to host
-socoastal.com: could not connect to host
socomponents.co.uk: could not connect to host
sodacore.com: could not connect to host
sodamakerclub.com: did not receive HSTS header
-sodiao.cc: could not connect to host
softballsavings.com: did not receive HSTS header
softbebe.com: did not receive HSTS header
softclean.pt: did not receive HSTS header
softplaynation.co.uk: did not receive HSTS header
+software.rocks: could not connect to host
sogeek.me: could not connect to host
sogravatas.net.br: could not connect to host
sojingle.net: could not connect to host
soju.fi: did not receive HSTS header
sokolka.tv: did not receive HSTS header
sol-3.de: did not receive HSTS header
+sol.works: did not receive HSTS header
solarcom.com.br: could not connect to host
solartrackerapp.com: could not connect to host
soldbygold.net: did not receive HSTS header
@@ -16178,18 +17170,19 @@ solentes.com.br: could not connect to host
solidfuelappliancespares.co.uk: did not receive HSTS header
solidimage.com.br: could not connect to host
solidtuesday.com: could not connect to host
-solidus.systems: could not connect to host
+solidus.systems: did not receive HSTS header
solidwebnetworks.co.uk: did not receive HSTS header
solinter.com.br: did not receive HSTS header
solisrey.es: could not connect to host
soljem.com: did not receive HSTS header
soll-i.ch: did not receive HSTS header
+soloshu.co: did not receive HSTS header
solosmusic.xyz: could not connect to host
solsystems.ru: did not receive HSTS header
solus-project.com: did not receive HSTS header
solutive.fi: did not receive HSTS header
solymar.co: could not connect to host
-some.rip: max-age too low: 6307200
+some.rip: did not receive HSTS header
somebodycares.org: did not receive HSTS header
somepills.com: did not receive HSTS header
somersetscr.nhs.uk: could not connect to host
@@ -16198,11 +17191,13 @@ something-else.cf: could not connect to host
somethingnew.xyz: could not connect to host
somethingsimilar.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
somewherein.jp: did not receive HSTS header
+somosnoticia.com.br: did not receive HSTS header
sonafe.info: could not connect to host
sonerezh.bzh: did not receive HSTS header
songluck.com: could not connect to host
+songsmp3.net: could not connect to host
sonialive.com: did not receive HSTS header
-sonic.network: did not receive HSTS header
+sonic.network: could not connect to host
sonicrainboom.rocks: could not connect to host
sonix.dk: could not connect to host
sonja-daniels.com: could not connect to host
@@ -16213,10 +17208,12 @@ soobi.org: did not receive HSTS header
soodwatthanaphon.net: did not receive HSTS header
soondy.com: could not connect to host
soothemobilemassage.com.au: did not receive HSTS header
+sopher.io: did not receive HSTS header
soply.com: could not connect to host
soporte.cc: could not connect to host
sorenam.com: did not receive HSTS header
sorensen-online.com: could not connect to host
+sorever.online: did not receive HSTS header
sorex.photo: did not receive HSTS header
sorinmuntean.ro: did not receive HSTS header
sortaweird.net: could not connect to host
@@ -16228,6 +17225,7 @@ sosecu.red: could not connect to host
sosesh.shop: could not connect to host
sosiolog.com: did not receive HSTS header
sosko.in.rs: could not connect to host
+sospromotions.com.au: did not receive HSTS header
sotavasara.net: did not receive HSTS header
sotiran.com: did not receive HSTS header
sotor.de: did not receive HSTS header
@@ -16235,7 +17233,7 @@ soucorneteiro.com.br: could not connect to host
soulcraft.bz: could not connect to host
soulema.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
soulfulglamour.uk: could not connect to host
-soulsteer.com: could not connect to host
+soulsteer.com: did not receive HSTS header
soundedj.com.br: could not connect to host
soundforsound.co.uk: did not receive HSTS header
soundgasm.net: could not connect to host
@@ -16258,9 +17256,11 @@ souvik.me: did not receive HSTS header
souyar.de: could not connect to host
souyar.net: could not connect to host
souyar.us: could not connect to host
+soved.eu: could not connect to host
sovereignshare.com: could not connect to host
sown.dyndns.org: could not connect to host
sowncloud.de: could not connect to host
+soz6.com: did not receive HSTS header
sp.rw: could not connect to host
spacecafe.org: did not receive HSTS header
spacedust.xyz: could not connect to host
@@ -16280,10 +17280,11 @@ spark.team: could not connect to host
sparkbase.cn: could not connect to host
sparklingsparklers.com: did not receive HSTS header
sparkresearch.net: could not connect to host
-sparkreviewcenter.com: did not receive HSTS header
+sparkreviewcenter.com: could not connect to host
sparkwood.org: could not connect to host
sparmedo.de: did not receive HSTS header
sparsa.army: could not connect to host
+sparta-solutions.de: could not connect to host
sparta-trade.com: could not connect to host
spartantheatre.org: could not connect to host
spauted.com: could not connect to host
@@ -16294,8 +17295,10 @@ spdysync.com: could not connect to host
specialedesigns.com: could not connect to host
specialistnow.com.au: did not receive HSTS header
spectreattack.com: did not receive HSTS header
+spectroom.space: could not connect to host
spectrosoftware.de: could not connect to host
speculor.net: could not connect to host
+spedition-transport-umzug.de: could not connect to host
spedplus.com.br: did not receive HSTS header
speed-mailer.com: could not connect to host
speedcounter.net: could not connect to host
@@ -16309,6 +17312,8 @@ spendwise.com.au: could not connect to host
sperohub.com: could not connect to host
sperohub.io: could not connect to host
sperohub.lt: did not receive HSTS header
+spha.info: could not connect to host
+sphereblur.com: could not connect to host
sphinx.network: could not connect to host
spicydog.tk: could not connect to host
spicywombat.com: could not connect to host
@@ -16321,18 +17326,20 @@ spilsbury.io: could not connect to host
spineandscoliosis.com: did not receive HSTS header
spinner.dnshome.de: could not connect to host
spinor.im: could not connect to host
+spiralschneiderkaufen.de: could not connect to host
spirit-dev.net: max-age too low: 0
-spirit-hunters-germany.de: did not receive HSTS header
spiritbionic.ro: could not connect to host
spiritfanfics.com: did not receive HSTS header
spisoggrin.dk: could not connect to host
spitefultowel.com: did not receive HSTS header
spitfireuav.com: could not connect to host
spititout.it: could not connect to host
+splendidspoon.com: max-age too low: 0
split.is: could not connect to host
-splunk.zone: did not receive HSTS header
+splunk.zone: could not connect to host
spoketwist.com: did not receive HSTS header
spokonline.com: could not connect to host
+spolwind.de: could not connect to host
spon.cz: did not receive HSTS header
sponsorowani.pl: did not receive HSTS header
sponsortobias.com: could not connect to host
@@ -16368,6 +17375,7 @@ sprueche-zur-geburt.info: could not connect to host
sprueche-zur-hochzeit.de: did not receive HSTS header
sprueche-zur-konfirmation.de: did not receive HSTS header
sprutech.de: could not connect to host
+sputnik1net.org: could not connect to host
spykedigital.com: could not connect to host
sqetsa.com: did not receive HSTS header
sqkaccountancy.co.uk: did not receive HSTS header
@@ -16378,6 +17386,7 @@ square.gs: could not connect to host
squarelab.it: could not connect to host
squareonebgc.com.ph: could not connect to host
squatldf.org: could not connect to host
+squeakql.online: could not connect to host
squids.space: could not connect to host
squirtlesbians.net: could not connect to host
sqzryang.com: could not connect to host
@@ -16385,7 +17394,7 @@ sr-cs.net: did not receive HSTS header
srcc.fr: could not connect to host
sreeharis.tk: could not connect to host
srevilak.net: did not receive HSTS header
-srichan.net: could not connect to host
+srichan.net: did not receive HSTS header
sritest.io: could not connect to host
srmaximo.com: could not connect to host
srna.sk: did not receive HSTS header
@@ -16399,10 +17408,12 @@ ssc8689.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERRO
ssc8689.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
ssco.xyz: did not receive HSTS header
ssconn.com: could not connect to host
+ssdservers.co.uk: could not connect to host
ssh.nu: did not receive HSTS header
sshool.at: could not connect to host
ssl.panoramio.com: could not connect to host
ssl.rip: could not connect to host
+sslcertificateshop.com: did not receive HSTS header
sslzilla.de: did not receive HSTS header
ssn1.ru: did not receive HSTS header
sspanda.com: could not connect to host
@@ -16421,6 +17432,8 @@ staffjoy.com: did not receive HSTS header
staffjoystaging.com: could not connect to host
stagingjobshq.com: could not connect to host
stahl.xyz: did not receive HSTS header
+stahlfors.com: could not connect to host
+stair.ch: could not connect to host
stakestrategy.com: could not connect to host
stalkerhispano.com: max-age too low: 0
stalkthe.net: could not connect to host
@@ -16428,32 +17441,34 @@ stall-zur-linde.de: did not receive HSTS header
stalschermer.nl: could not connect to host
stamboommuller.nl: did not receive HSTS header
stamboomvanderwal.nl: did not receive HSTS header
+stamonicatourandtravel.com: could not connect to host
+stampederadon.com: could not connect to host
stanandjerre.org: could not connect to host
standardssuck.org: did not receive HSTS header
standingmist.com: did not receive HSTS header
-standoutbooks.com: max-age too low: 0
standuppaddlesports.com.au: did not receive HSTS header
stang.moe: did not receive HSTS header
stannahtrapliften.nl: did not receive HSTS header
star-citizen.wiki: did not receive HSTS header
star-killer.net: could not connect to host
-star-stuff.de: could not connect to host
+star-stuff.de: did not receive HSTS header
star.do: did not receive HSTS header
starandshield.com: did not receive HSTS header
starapple.nl: did not receive HSTS header
starcafe.me: could not connect to host
stardeeps.net: max-age too low: 0
stardust-entertainments.co.uk: did not receive HSTS header
-starease.net: could not connect to host
starfeeling.net: could not connect to host
stargatepartners.com: did not receive HSTS header
starinvestors.in: could not connect to host
+starking.net.cn: could not connect to host
starklane.com: max-age too low: 300
starlightentertainmentdevon.co.uk: did not receive HSTS header
starmusic.ga: could not connect to host
starplatinum.jp: could not connect to host
-starquake.nl: could not connect to host
+starquake.nl: did not receive HSTS header
starsbattle.net: could not connect to host
+starskim.cn: could not connect to host
starteesforsale.co.za: did not receive HSTS header
startsamenvitaal.nu: did not receive HSTS header
startup.melbourne: could not connect to host
@@ -16472,11 +17487,10 @@ static-692b8c32.de: could not connect to host
static-assets.io: could not connect to host
static.hosting: could not connect to host
static.or.at: did not receive HSTS header
-staticanime.net: could not connect to host
staticisnoise.com: could not connect to host
stationaryjourney.com: did not receive HSTS header
stationcharlie.com: could not connect to host
-stationnementdenuit.ca: did not receive HSTS header
+stationnementdenuit.ca: could not connect to host
status-sprueche.de: could not connect to host
status.coffee: could not connect to host
statusbot.io: could not connect to host
@@ -16489,8 +17503,7 @@ stcomex.com: did not receive HSTS header
stdev.org: could not connect to host
steamhours.com: could not connect to host
steampunkrobot.com: did not receive HSTS header
-steborio.pw: could not connect to host
-steckel.cc: could not connect to host
+steckel.cc: did not receive HSTS header
steelbea.ms: could not connect to host
steelrhino.co: could not connect to host
steem.io: did not receive HSTS header
@@ -16506,7 +17519,7 @@ steph3n.me: could not connect to host
stephanierxo.com: did not receive HSTS header
stephanos.me: could not connect to host
stephenandburns.com: did not receive HSTS header
-stephenjvoiceovers.com: did not receive HSTS header
+stephencreilly.com: could not connect to host
stephensolis.net: could not connect to host
stephensolisrey.es: could not connect to host
steplogictalent.com: could not connect to host
@@ -16519,7 +17532,8 @@ stevengoodpaster.com: could not connect to host
stevenkwan.me: could not connect to host
stevensheffey.me: could not connect to host
stevensononthe.net: did not receive HSTS header
-steventruesdell.com: could not connect to host
+stevenz.net: did not receive HSTS header
+stevenz.xyz: did not receive HSTS header
stewartremodelingadvantage.com: could not connect to host
stewonet.nl: did not receive HSTS header
stge.uk: could not connect to host
@@ -16539,8 +17553,10 @@ stillblackhat.id: could not connect to host
stillnessproject.com: did not receive HSTS header
stillyarts.com: did not receive HSTS header
stinkytrashhound.com: could not connect to host
+stinsky.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
stirlingpoon.net: could not connect to host
stirlingpoon.xyz: could not connect to host
+stisaac.org: did not receive HSTS header
stitthappens.com: could not connect to host
stjohnmiami.org: did not receive HSTS header
stjohnsc.com: could not connect to host
@@ -16556,9 +17572,10 @@ stockseyeserum.com: could not connect to host
stocktrade.de: could not connect to host
stoffe-monster.de: did not receive HSTS header
stoffelen.nl: did not receive HSTS header
+stogiesandmash.com: max-age too low: 0
stoianlawfirm.com: could not connect to host
stoick.me: could not connect to host
-stoinov.com: could not connect to host
+stoinov.com: did not receive HSTS header
stolbart.com: could not connect to host
stole-my.bike: could not connect to host
stole-my.tv: could not connect to host
@@ -16583,11 +17600,11 @@ storiesofhealth.org: could not connect to host
stormhub.org: could not connect to host
stormwatcher.org: could not connect to host
stormyyd.com: max-age too low: 0
-storytea.top: did not receive HSTS header
stpatricksguild.com: did not receive HSTS header
stqry.com: did not receive HSTS header
str0.at: did not receive HSTS header
straightedgebarbers.ca: did not receive HSTS header
+strangemusicinc.com: did not receive HSTS header
strangeplace.net: did not receive HSTS header
strangescout.me: could not connect to host
strasweb.fr: did not receive HSTS header
@@ -16614,9 +17631,9 @@ streams.dyndns.org: could not connect to host
streamthemeeting.com: did not receive HSTS header
streamzilla.com: did not receive HSTS header
strehl.tk: could not connect to host
+streklhof.at: did not receive HSTS header
strelitzia02.com: could not connect to host
stressfreehousehold.com: could not connect to host
-stretchpc.com: could not connect to host
strictlynormal.com: could not connect to host
strictlysudo.com: could not connect to host
strife.tk: did not receive HSTS header
@@ -16625,6 +17642,7 @@ striptizer.tk: could not connect to host
strming.com: could not connect to host
stroeercrm.de: could not connect to host
strongest-privacy.com: could not connect to host
+strongtowerpc.com: could not connect to host
struxureon.com: did not receive HSTS header
stuartbaxter.co: could not connect to host
stubbings.eu: could not connect to host
@@ -16637,23 +17655,25 @@ studentskydenik.cz: could not connect to host
studenttravel.cz: could not connect to host
studer.su: could not connect to host
studiemeter.nl: did not receive HSTS header
+studienservice.de: did not receive HSTS header
studiereader.nl: did not receive HSTS header
studinf.xyz: could not connect to host
+studio-art.pro: did not receive HSTS header
studio-panic.com: could not connect to host
studio-webdigi.com: did not receive HSTS header
studiocn.cn: could not connect to host
studiodoprazer.com.br: could not connect to host
+studiopop.com.br: did not receive HSTS header
studiozelden.com: did not receive HSTS header
-studlan.no: could not connect to host
-studport.rv.ua: max-age too low: 604800
+studport.rv.ua: could not connect to host
studyabroadstation.com: could not connect to host
studybay.com: could not connect to host
studydrive.net: did not receive HSTS header
studyhub.cf: did not receive HSTS header
studying-neet.com: could not connect to host
studytale.com: could not connect to host
+stuermer.me: did not receive HSTS header
stuff-fibre.co.nz: did not receive HSTS header
-stuffiwouldbuy.com: did not receive HSTS header
stugb.de: did not receive HSTS header
stumeta2018.de: could not connect to host
stupidstatetricks.com: could not connect to host
@@ -16665,7 +17685,6 @@ stutsmancounty.gov: could not connect to host
stuttgart-gablenberg.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
stuudium.cloud: could not connect to host
stuudium.life: could not connect to host
-stylaq.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
stylenda.com: could not connect to host
stylle.me: could not connect to host
stytt.com: could not connect to host
@@ -16679,6 +17698,7 @@ subjektzentrisch.de: could not connect to host
sublevel.net: did not receive HSTS header
subrain.com: did not receive HSTS header
subrosa.io: could not connect to host
+subsistence.wiki: could not connect to host
subsys.no: did not receive HSTS header
subterfuge.io: did not receive HSTS header
subtitle.rip: could not connect to host
@@ -16689,31 +17709,34 @@ succubus.network: could not connect to host
succubus.xxx: could not connect to host
suchprogrammer.net: did not receive HSTS header
sudo.im: could not connect to host
+sudo.org.au: did not receive HSTS header
sudosu.fr: could not connect to host
suempresa.cloud: could not connect to host
-suffts.de: did not receive HSTS header
+suffts.de: could not connect to host
sugarcitycon.com: could not connect to host
sugarsweetorsour.com: did not receive HSTS header
sugartownfarm.com: could not connect to host
suian.or.jp: max-age too low: 86400
suite73.org: could not connect to host
-suited21.com: did not receive HSTS header
+suited21.com: could not connect to host
suitocracy.com: could not connect to host
summa-prefis.com: did not receive HSTS header
summer.ga: could not connect to host
summermc.cc: could not connect to host
summitbankofkc.com: did not receive HSTS header
summitmasters.net: did not receive HSTS header
-sumoatm.com: did not receive HSTS header
sumoscout.de: did not receive HSTS header
+sumthing.com: could not connect to host
sun-leo.co.jp: did not receive HSTS header
-sun-wellness-online.com.vn: did not receive HSTS header
sun.re: did not receive HSTS header
+sunboxstore.jp: did not receive HSTS header
suncountrymarine.com: did not receive HSTS header
sundaycooks.com: max-age too low: 2592000
suneilpatel.com: could not connect to host
sunfeathers.net: could not connect to host
sunfireshop.com.br: could not connect to host
+sunfulong.blog: could not connect to host
+sunfulong.me: could not connect to host
sunlandsg.vn: did not receive HSTS header
sunnyfruit.ru: could not connect to host
sunriseafricarelief.com: did not receive HSTS header
@@ -16739,13 +17762,14 @@ supercastlessouthsydney.com.au: could not connect to host
supercreepsvideo.com: did not receive HSTS header
superiorfloridavacation.com: could not connect to host
superklima.ro: did not receive HSTS header
-superlandnetwork.de: could not connect to host
superlentes.com.br: could not connect to host
+supermil.ch: could not connect to host
supernovabrasil.com.br: did not receive HSTS header
superpase.com: could not connect to host
supersahnetorten.de: could not connect to host
supersalescontest.nl: did not receive HSTS header
superschnappchen.de: could not connect to host
+supersec.es: could not connect to host
supersecurefancydomain.com: could not connect to host
supertramp-dafonseca.com: did not receive HSTS header
superuser.fi: could not connect to host
@@ -16753,21 +17777,22 @@ superwally.org: could not connect to host
superway.es: did not receive HSTS header
supes.io: did not receive HSTS header
supperclub.es: could not connect to host
+supplementswatch.com: did not receive HSTS header
support4server.de: could not connect to host
supportfan.gov: could not connect to host
+supportme123.com: did not receive HSTS header
+suppwatch.com: did not receive HSTS header
suprlink.net: could not connect to host
supweb.ovh: could not connect to host
-surasak.io: could not connect to host
surasak.xyz: could not connect to host
suraya.online: could not connect to host
-surdam.casa: could not connect to host
surfeasy.com: did not receive HSTS header
surfone-leucate.com: did not receive HSTS header
surgiclinic.gr: did not receive HSTS header
surkatty.org: did not receive HSTS header
suruifu.tk: could not connect to host
+surveillance104.com: could not connect to host
survivalistplanet.com: could not connect to host
-survivebox.fr: did not receive HSTS header
susanvelez.com: did not receive HSTS header
susastudentenjobs.de: could not connect to host
susconam.org: could not connect to host
@@ -16779,17 +17804,15 @@ suspiciousdarknet.xyz: could not connect to host
sussexwebdesigns.com: could not connect to host
sussexwebsites.info: could not connect to host
sustainability.gov: did not receive HSTS header
-suts.co.uk: could not connect to host
suttonbouncycastles.co.uk: could not connect to host
suvidhaapay.com: could not connect to host
-suzukikazuki.com: did not receive HSTS header
+suzukikazuki.com: could not connect to host
suzukikenichi.com: did not receive HSTS header
svadobkajuvi.sk: did not receive HSTS header
svarovani.tk: could not connect to host
svatba-frantovi.cz: could not connect to host
sve-hosting.nl: could not connect to host
svenbacia.me: could not connect to host
-svendubbeld.nl: did not receive HSTS header
svenskacasino.com: could not connect to host
svenskaservern.se: could not connect to host
svetdrzaku.cz: did not receive HSTS header
@@ -16804,10 +17827,11 @@ swaleacademiestrust.org.uk: max-age too low: 2592000
swallsoft.co.uk: could not connect to host
swallsoft.com: could not connect to host
swanseapartyhire.co.uk: could not connect to host
-swarlys-server.de: could not connect to host
+swarfarm.com: did not receive HSTS header
swarmation.com: did not receive HSTS header
sway.com: did not receive HSTS header
swdatlantico.pt: could not connect to host
+sweak.net: could not connect to host
sweep.cards: did not receive HSTS header
sweetlegs.jp: could not connect to host
sweetstreats.ca: could not connect to host
@@ -16824,19 +17848,21 @@ swimmingpoolaccidentattorney.net: could not connect to host
swingular.com: could not connect to host
swisscannabis.club: could not connect to host
swissentreprises.ch: could not connect to host
-swissfreshaircan.com: could not connect to host
swisstechtalks.ch: did not receive HSTS header
swisstranslate.ch: did not receive HSTS header
swisstranslate.fr: did not receive HSTS header
swisswebhelp.ch: could not connect to host
swissxperts.ch: could not connect to host
swite.com: did not receive HSTS header
+switzerland-family-office.com: did not receive HSTS header
swmd5c.org: could not connect to host
swordfighting.net: could not connect to host
swu.party: could not connect to host
+swuosa.org: did not receive HSTS header
sx3.no: could not connect to host
sxbk.pw: could not connect to host
syam.cc: could not connect to host
+syamutodon.xyz: could not connect to host
syamuwatching.xyz: could not connect to host
sydgrabber.tk: could not connect to host
syhost.at: did not receive HSTS header
@@ -16844,7 +17870,6 @@ syhost.ch: did not receive HSTS header
syhost.de: did not receive HSTS header
sykl.us: could not connect to host
sylvaincombe.net: could not connect to host
-sylvan.me: could not connect to host
sylvangarden.net: could not connect to host
sylvangarden.org: could not connect to host
sylvanorder.com: did not receive HSTS header
@@ -16854,6 +17879,8 @@ syncaddict.net: could not connect to host
syncappate.com: could not connect to host
syncclinicalstudy.com: could not connect to host
syncer.jp: did not receive HSTS header
+synchrocube.com: could not connect to host
+synchronicity.cz: could not connect to host
syncmylife.net: could not connect to host
syncserve.net: did not receive HSTS header
syneic.com: did not receive HSTS header
@@ -16876,18 +17903,22 @@ sysrq.tech: could not connect to host
syss.de: did not receive HSTS header
systea.net: could not connect to host
system-online.cz: did not receive HSTS header
+systemchile.com: could not connect to host
systemd.me: could not connect to host
sytk.me: could not connect to host
-syunpay.cn: did not receive HSTS header
+syukatsu-net.jp: did not receive HSTS header
syy.hk: did not receive HSTS header
szagun.net: did not receive HSTS header
szaszm.tk: could not connect to host
szczot3k.pl: did not receive HSTS header
szerbnyelvkonyv.hu: could not connect to host
+szerelem.love: could not connect to host
+szetowah.org.hk: could not connect to host
szlovaknyelv.hu: could not connect to host
szlovennyelv.hu: could not connect to host
szongott.net: did not receive HSTS header
-szymczak.at: did not receive HSTS header
+szymczak.at: could not connect to host
+szzsivf.com: did not receive HSTS header
t-complex.space: could not connect to host
t-ken.xyz: could not connect to host
t-point.eu: did not receive HSTS header
@@ -16895,11 +17926,10 @@ t-tz.com: could not connect to host
t0dd.eu: could not connect to host
t2000headphones.com: could not connect to host
t2000laserpointers.com: could not connect to host
-t3rror.net: could not connect to host
t4c-rebirth.com: could not connect to host
t4x.org: could not connect to host
+t5118.com: could not connect to host
taabe.xyz: could not connect to host
-taartenfeesies.nl: did not receive HSTS header
tab.watch: did not receive HSTS header
taberu-fujitsubo.com: did not receive HSTS header
tabhui.com: did not receive HSTS header
@@ -16915,7 +17945,7 @@ tadigitalstore.com: could not connect to host
tafoma.com: did not receive HSTS header
tageau.com: could not connect to host
tagesmutter-in-bilm.de: did not receive HSTS header
-tagesmutter-zwitscherlinge.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+tagesmutter-zwitscherlinge.de: did not receive HSTS header
tahakomat.cz: could not connect to host
tahf.net: could not connect to host
tai-in.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -16938,19 +17968,22 @@ tales-of-interia.de: could not connect to host
talheim-records.ca: could not connect to host
talk.google.com: did not receive HSTS header (error ignored - included regardless)
talk.xyz: could not connect to host
+talkgadget.google.com: did not receive HSTS header (error ignored - included regardless)
talkitup.mx: could not connect to host
talkitup.online: could not connect to host
talklifestyle.nl: could not connect to host
+talktobot.com: could not connect to host
talktwincities.com: could not connect to host
tallr.se: could not connect to host
tallshoe.com: could not connect to host
-talroo.com: could not connect to host
talsi.eu: could not connect to host
tam7t.com: did not receive HSTS header
tamex.xyz: could not connect to host
+tamirson.com: did not receive HSTS header
tandarts-haarlem.nl: did not receive HSTS header
tandblekningidag.com: could not connect to host
tandilmap.com.ar: did not receive HSTS header
+tandk.com.vn: did not receive HSTS header
tangerine.ga: could not connect to host
tangibilizing.com: could not connect to host
tangiblesecurity.com: did not receive HSTS header
@@ -16958,11 +17991,9 @@ tango-cats.de: could not connect to host
tangsisi.com: could not connect to host
tangyue.date: could not connect to host
tangzhao.net: could not connect to host
-tanhit.com: could not connect to host
taniesianie.pl: did not receive HSTS header
tankfreunde.de: did not receive HSTS header
tante-bugil.net: could not connect to host
-tantetilli.de: did not receive HSTS header
tantotiempo.de: did not receive HSTS header
tanze-jetzt.de: could not connect to host
taotuba.net: did not receive HSTS header
@@ -16972,12 +18003,15 @@ tapestries.tk: could not connect to host
tapfinder.ca: could not connect to host
tapka.cz: did not receive HSTS header
tappublisher.com: did not receive HSTS header
+tapsnapp.co: did not receive HSTS header
taqun.club: could not connect to host
tarantul.org.ua: could not connect to host
taravancil.com: did not receive HSTS header
tarek.link: could not connect to host
targaryen.house: could not connect to host
tarhauskielto.fi: did not receive HSTS header
+taron.top: did not receive HSTS header
+tarot-cartas.com: max-age too low: 0
tarots-et-oracles.com: did not receive HSTS header
tarsashaz-biztositas.hu: did not receive HSTS header
tartaros.fi: could not connect to host
@@ -16985,11 +18019,12 @@ taskstats.com: did not receive HSTS header
tasmansecurity.com: could not connect to host
tassup.com: could not connect to host
tasta.ro: could not connect to host
-tasticfilm.com: could not connect to host
+tasticfilm.com: did not receive HSTS header
tastyyy.co: could not connect to host
tasyacherry-anal.com: could not connect to host
tatilbus.com: could not connect to host
tatilmix.com: could not connect to host
+tatiloley.com: did not receive HSTS header
tatort-fanpage.de: could not connect to host
tatt.io: could not connect to host
tauchkater.de: could not connect to host
@@ -17002,18 +18037,19 @@ taxiindenbosch.nl: did not receive HSTS header
taxmadras.com: could not connect to host
taxsnaps.co.nz: did not receive HSTS header
taxspeaker.com: did not receive HSTS header
+taylorreaume.com: did not receive HSTS header
tazemama.biz: could not connect to host
tazj.in: did not receive HSTS header
tazz.in: could not connect to host
tbarter.com: did not receive HSTS header
tbpixel.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
tbrss.com: did not receive HSTS header
-tbtech.cz: did not receive HSTS header
tbys.us: could not connect to host
tc-bonito.de: did not receive HSTS header
tcacademy.co.uk: could not connect to host
tcao.info: could not connect to host
tcby45.xyz: could not connect to host
+tcdww.cn: could not connect to host
tchaka.top: could not connect to host
tcl.ath.cx: did not receive HSTS header
tcp.expert: did not receive HSTS header
@@ -17031,27 +18067,28 @@ tdsbhack.ga: could not connect to host
tdsbhack.gq: could not connect to host
tdsbhack.ml: could not connect to host
tdsbhack.tk: could not connect to host
+tea.codes: did not receive HSTS header
+teabagdesign.co.uk: could not connect to host
teacherph.net: did not receive HSTS header
teachforcanada.ca: did not receive HSTS header
tealdrones.com: did not receive HSTS header
-team-bbd.com: could not connect to host
team-pancake.eu: could not connect to host
team-teasers.com: could not connect to host
team2fou.cf: did not receive HSTS header
teamassists.com: did not receive HSTS header
teambeoplay.co.uk: did not receive HSTS header
teamblueridge.org: could not connect to host
+teambodyproject.com: did not receive HSTS header
teamdaylo.xyz: could not connect to host
teamhood.io: did not receive HSTS header
teamnetsol.com: did not receive HSTS header
teampoint.cz: could not connect to host
teams.microsoft.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
teamsocial.co: did not receive HSTS header
-teamtravel.co: could not connect to host
-teamx-gaming.de: could not connect to host
+teamtravel.co: did not receive HSTS header
teamzeus.cz: could not connect to host
teaparty.id: could not connect to host
-tearoy.faith: did not receive HSTS header
+tearoy.faith: could not connect to host
teasenetwork.com: could not connect to host
tebieer.com: could not connect to host
tech-blog.fr: did not receive HSTS header
@@ -17060,7 +18097,6 @@ tech55i.com: could not connect to host
techandtux.de: could not connect to host
techask.it: could not connect to host
techassist.io: did not receive HSTS header
-techbelife.com: could not connect to host
techbrawl.org: could not connect to host
techcavern.ml: could not connect to host
techcentric.com: did not receive HSTS header
@@ -17087,8 +18123,9 @@ technosuport.com: did not receive HSTS header
technoswag.ca: could not connect to host
technotonic.co.uk: could not connect to host
technotonic.com.au: did not receive HSTS header
+techold.ru: could not connect to host
techpointed.com: could not connect to host
-techpro.net.br: did not receive HSTS header
+techpro.net.br: could not connect to host
techproud.com: did not receive HSTS header
techreview.link: could not connect to host
techtoy.store: did not receive HSTS header
@@ -17097,14 +18134,17 @@ techtraveller.com.au: did not receive HSTS header
techtuts.info: could not connect to host
techunit.org: could not connect to host
techvalue.gr: did not receive HSTS header
-techwords.io: could not connect to host
+techwithcromulent.com: could not connect to host
tecit.ch: could not connect to host
tecnimotos.com: did not receive HSTS header
tecnologino.com: could not connect to host
-tecture.de: could not connect to host
+tecture.de: did not receive HSTS header
tedovo.com: did not receive HSTS header
tedxkmitl.com: could not connect to host
+tedxodense.com: did not receive HSTS header
tee-idf.net: could not connect to host
+teebeedee.org: did not receive HSTS header
+teedb.de: could not connect to host
teehaus-shila.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
teenerotic.net: could not connect to host
teeplelaw.com: did not receive HSTS header
@@ -17134,16 +18174,17 @@ telecharger-winrar.com: could not connect to host
telefisk.org: did not receive HSTS header
telefonnummer.online: could not connect to host
telefonogratuito.com: did not receive HSTS header
-telefonsinyalguclendirici.com: could not connect to host
telefoonnummerinfo.nl: could not connect to host
telekollektiv.org: could not connect to host
telepons.com: could not connect to host
telescam.com: could not connect to host
-teleshop.be: did not receive HSTS header
+teleshop.be: could not connect to host
+telesto.online: could not connect to host
teletra.ru: could not connect to host
telfordwhitehouse.co.uk: did not receive HSTS header
teltonica.com: did not receive HSTS header
telugu4u.net: could not connect to host
+temasa.net: could not connect to host
temehu.com: did not receive HSTS header
tempcraft.net: could not connect to host
tempflix.com: could not connect to host
@@ -17151,6 +18192,7 @@ tempo.co: did not receive HSTS header
tempodecolheita.com.br: could not connect to host
tempus-aquilae.de: could not connect to host
ten-cafe.com: could not connect to host
+tenberg.com: could not connect to host
tendertool.nl: could not connect to host
tenerife-villas.com: max-age too low: 2592000
tengu.cloud: could not connect to host
@@ -17158,7 +18200,7 @@ tenispopular.com: could not connect to host
tenma.pro: could not connect to host
tenni.xyz: could not connect to host
tennisadmin.com: could not connect to host
-tennisapp.org: could not connect to host
+tennisapp.org: did not receive HSTS header
tennispensacola.com: could not connect to host
tensei-slime.com: did not receive HSTS header
tensionup.com: could not connect to host
@@ -17168,13 +18210,16 @@ tentins.com: could not connect to host
teodio.cl: did not receive HSTS header
teos.online: could not connect to host
teoskanta.fi: could not connect to host
+tepid.org: could not connect to host
+terabyteharddrive.net: could not connect to host
teranga.ch: did not receive HSTS header
tercerapuertoaysen.cl: could not connect to host
-termax.me: could not connect to host
-terminalvelocity.co.nz: could not connect to host
+termax.me: did not receive HSTS header
+terpotiz.net: could not connect to host
terra-x.net: could not connect to host
terra.by: did not receive HSTS header
terrace.co.jp: did not receive HSTS header
+terrafinanz.de: did not receive HSTS header
terrax.berlin: could not connect to host
terrax.info: did not receive HSTS header
terrax.net: could not connect to host
@@ -17194,6 +18239,7 @@ testdomain.ovh: could not connect to host
testi.info: max-age too low: 10518975
testnode.xyz: could not connect to host
testosterone-complex.com: could not connect to host
+testosteronedetective.com: could not connect to host
testovaci.ml: could not connect to host
testpornsite.com: could not connect to host
tetrafinancial-commercial-business-equipment-financing.com: could not connect to host
@@ -17217,6 +18263,7 @@ tfcoms-sp-tracker-client.azurewebsites.net: could not connect to host
tffans.com: could not connect to host
tfl.lu: did not receive HSTS header
tgbyte.com: did not receive HSTS header
+tgmkanis.com: did not receive HSTS header
tgod.co: could not connect to host
tgr.re: could not connect to host
th-bl.de: did not receive HSTS header
@@ -17227,14 +18274,14 @@ thaianthro.com: max-age too low: 0
thaigirls.xyz: could not connect to host
thaihostcool.com: did not receive HSTS header
thailandpropertylistings.com: did not receive HSTS header
+thallinger.me: could not connect to host
thalmann.fr: did not receive HSTS header
thalskarth.com: did not receive HSTS header
thatgudstuff.com: could not connect to host
thatpodcast.io: did not receive HSTS header
-thatvizsla.life: did not receive HSTS header
+thatvizsla.life: could not connect to host
the-construct.com: could not connect to host
the-delta.net.eu.org: could not connect to host
-the-digitale.com: did not receive HSTS header
the-earth-yui.net: could not connect to host
the-finance-blog.com: could not connect to host
the-gist.io: could not connect to host
@@ -17244,6 +18291,7 @@ the.ie: max-age too low: 0
the420vape.org: could not connect to host
theamateurs.net: did not receive HSTS header
theamp.com: did not receive HSTS header
+theankhlife.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
thearcheryguide.com: did not receive HSTS header
theater.cf: could not connect to host
theavenuegallery.com: did not receive HSTS header
@@ -17253,6 +18301,7 @@ thebasementguys.com: could not connect to host
thebeautifulmusic.net: did not receive HSTS header
thebeginningisnye.com: could not connect to host
theberkshirescompany.com: could not connect to host
+thebest.ch: could not connect to host
thebigfail.net: could not connect to host
thebreakhotel.com: did not receive HSTS header
thebrotherswarde.com: could not connect to host
@@ -17271,32 +18320,34 @@ theclubjersey.com: did not receive HSTS header
thecodeninja.net: did not receive HSTS header
thecoffeehouse.xyz: could not connect to host
thecoffeepod.co.uk: did not receive HSTS header
+thecoffeesuperstore.com: max-age too low: 7889238
thecozycastle.com: did not receive HSTS header
thecrochetcottage.net: could not connect to host
-thecskr.in: did not receive HSTS header
thecsw.com: did not receive HSTS header
thecuriouscat.net: could not connect to host
+thedailyprosper.com: did not receive HSTS header
thedailyupvote.com: could not connect to host
thedarkartsandcrafts.com: could not connect to host
+thedebug.life: could not connect to host
thedevilwearswibra.nl: did not receive HSTS header
thediaryofadam.com: did not receive HSTS header
+thedoctorsorders.pub: did not receive HSTS header
thedominatorsclan.com: could not connect to host
thedrinks.co: did not receive HSTS header
thedrop.pw: did not receive HSTS header
thedrunkencabbage.com: could not connect to host
thedystance.com: could not connect to host
-theel0ja.info: did not receive HSTS header
theelitebuzz.com: could not connect to host
-theendofzion.com: did not receive HSTS header
+theendofzion.com: could not connect to host
theepankar.com: could not connect to host
theescapistswiki.com: could not connect to host
theevergreen.me: could not connect to host
theexpatriate.de: could not connect to host
+theeyeopener.com: did not receive HSTS header
thefarbeyond.com: could not connect to host
-thefasterweb.com: did not receive HSTS header
thefilmcolor.com: max-age too low: 0
-theflyingbear.net: could not connect to host
thefootballanalyst.com: did not receive HSTS header
+thefourthmoira.com: did not receive HSTS header
thefox.co: did not receive HSTS header
thefox.com.fr: could not connect to host
thefreebirds.in: could not connect to host
@@ -17307,6 +18358,7 @@ thegcccoin.com: max-age too low: 2592000
thegemriverside.com.vn: could not connect to host
thego2swatking.com: could not connect to host
thegoldregister.co.uk: could not connect to host
+thegospelforgeeks.org: did not receive HSTS header
thegraciousgourmet.com: did not receive HSTS header
thegreens.us: could not connect to host
thegreenvpn.com: could not connect to host
@@ -17314,13 +18366,15 @@ thegym.org: did not receive HSTS header
thehiddenbay.cc: could not connect to host
thehiddenbay.eu: could not connect to host
thehiddenbay.fi: did not receive HSTS header
-thehiddenbay.info: did not receive HSTS header
+thehiddenbay.info: could not connect to host
thehiddenbay.me: could not connect to host
thehiddenbay.net: could not connect to host
-thehiddenbay.ws: did not receive HSTS header
+thehiddenbay.ws: could not connect to host
thehighersideclothing.com: did not receive HSTS header
thehistory.me: could not connect to host
thehoopsarchive.com: could not connect to host
+thehoryzon.com: did not receive HSTS header
+thehowtohome.com: did not receive HSTS header
theimagesalon.com: max-age too low: 43200
theinvisibletrailer.com: could not connect to host
thej0lt.com: did not receive HSTS header
@@ -17328,21 +18382,24 @@ thejobauction.com: did not receive HSTS header
thejserver.de: could not connect to host
thekrewserver.com: did not receive HSTS header
thelapine.ca: did not receive HSTS header
+thelastsurprise.com: could not connect to host
thelefthand.org: could not connect to host
thelinuxspace.com: could not connect to host
thelostyankee.com: could not connect to host
+themadlabengineer.co.uk: did not receive HSTS header
themadmechanic.net: could not connect to host
themanufacturingmarketingagency.com: could not connect to host
themarble.co: could not connect to host
-themaster.site: did not receive HSTS header
+themaster.site: could not connect to host
themathbehindthe.science: could not connect to host
themathematician.uk: could not connect to host
themeaudit.com: could not connect to host
themenzentrisch.de: could not connect to host
-themerchandiser.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
themesurgeons.net: could not connect to host
themicrocapital.com: could not connect to host
+themobilestuffs.com: did not receive HSTS header
themoderate.xyz: could not connect to host
+thenanfang.com: could not connect to host
thenarcissisticlife.com: did not receive HSTS header
thenextstep.events: could not connect to host
thenichecast.com: could not connect to host
@@ -17351,39 +18408,44 @@ thenrdhrd.nl: could not connect to host
theodorejones.info: could not connect to host
theojones.name: could not connect to host
theokonst.tk: did not receive HSTS header
+theoldbrewhouse.info: could not connect to host
theosblog.de: did not receive HSTS header
theosophie-afrique.org: could not connect to host
theoverfly.co: could not connect to host
thepartywarehouse.co.uk: did not receive HSTS header
thepcweb.tk: could not connect to host
-thepiabo.ovh: did not receive HSTS header
+thepiabo.ovh: could not connect to host
thepiratebay.al: could not connect to host
thepiratebay.poker: could not connect to host
thepiratebay.tech: could not connect to host
+theplaidpoodle.com: did not receive HSTS header
+theplaydaysbus.co.uk: could not connect to host
theposhfudgecompany.co.uk: could not connect to host
thepostoffice.ro: did not receive HSTS header
theprincegame.com: could not connect to host
theprivacysolution.com: could not connect to host
-thepurem.com: could not connect to host
+thepurem.com: did not receive HSTS header
thepythianseed.com: did not receive HSTS header
thequillmagazine.org: could not connect to host
therewill.be: could not connect to host
therise.ca: max-age too low: 300
thermique.ch: could not connect to host
+thermo-recetas.com: did not receive HSTS header
theroamingnotary.com: did not receive HSTS header
-therockawaysny.com: could not connect to host
+therockawaysny.com: did not receive HSTS header
thesassynut.com: did not receive HSTS header
+thesearchenginepros.com: did not receive HSTS header
thesearchnerds.co.uk: did not receive HSTS header
thesecurityteam.net: could not connect to host
thesehighsandlows.com: could not connect to host
theserver201.tk: could not connect to host
-theserviceyouneed.com: did not receive HSTS header
theshadestore.com: max-age too low: 10368000
+thesharepointfarm.com: did not receive HSTS header
thesled.net: could not connect to host
thesplit.is: could not connect to host
thestack.xyz: could not connect to host
thestagchorleywood.co.uk: did not receive HSTS header
-thestonegroup.de: did not receive HSTS header
+thestonegroup.de: could not connect to host
thestoritplace.com: max-age too low: 0
thestral.pro: could not connect to host
thestralbot.com: could not connect to host
@@ -17396,6 +18458,7 @@ theurbanyoga.com: did not receive HSTS header
theuucc.org: did not receive HSTS header
thevintagenews.com: did not receive HSTS header
thevoid.one: could not connect to host
+thevyra.com: did not receive HSTS header
thewallset.com: could not connect to host
thewaxhouse.shop: did not receive HSTS header
thewebdexter.com: could not connect to host
@@ -17404,6 +18467,7 @@ thewego.com: could not connect to host
theweilai.com: could not connect to host
thewhiterabbit.space: could not connect to host
thewindow.com: could not connect to host
+thewoolroom.com.au: did not receive HSTS header
theworkingeye.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
thewp.pro: max-age too low: 0
theyachtteam.com: could not connect to host
@@ -17418,6 +18482,7 @@ thinkcash.nl: could not connect to host
thinkcoding.de: could not connect to host
thinkcoding.org: could not connect to host
thinkdo.jp: could not connect to host
+thinkforwardmedia.com: max-age too low: 0
thinklikeanentrepreneur.com: did not receive HSTS header
thinkswap.com: did not receive HSTS header
thinlyveiledcontempt.com: could not connect to host
@@ -17428,9 +18493,11 @@ thirtyspot.com: could not connect to host
thisisacompletetest.ga: could not connect to host
thisisforager.com: could not connect to host
thismumdoesntknowbest.com: could not connect to host
+thisoldearth.com: did not receive HSTS header
thiswasalreadymyusername.tk: could not connect to host
thiswebhost.com: did not receive HSTS header
thkb.net: could not connect to host
+thomas-bertran.com: could not connect to host
thomas-ferney.fr: did not receive HSTS header
thomas-gibertie.fr: did not receive HSTS header
thomas-grobelny.de: could not connect to host
@@ -17438,14 +18505,17 @@ thomascloud.ddns.net: could not connect to host
thomasgriffin.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
thomasharvey.me: did not receive HSTS header
thomaskliszowski.fr: did not receive HSTS header
+thomasmeester.nl: could not connect to host
thomasnet.fr: could not connect to host
thomasscholz.com: max-age too low: 2592000
thomasschweizer.net: could not connect to host
thomasvt.xyz: max-age too low: 2592000
+thomspooren.nl: could not connect to host
thorbis.com: could not connect to host
thorbiswebsitedesign.com: could not connect to host
thorgames.nl: did not receive HSTS header
thorncreek.net: did not receive HSTS header
+thoroquel.org: could not connect to host
thot.space: did not receive HSTS header
thoughtlessleaders.online: could not connect to host
threatcentral.io: could not connect to host
@@ -17454,22 +18524,25 @@ threebulls.be: did not receive HSTS header
thriveapproach.co.uk: did not receive HSTS header
thrivewellnesshub.co.za: did not receive HSTS header
throughthelookingglasslens.co.uk: could not connect to host
-thrx.net: did not receive HSTS header
thumbtack.com: did not receive HSTS header
thundercampaign.com: could not connect to host
thuviensoft.net: could not connect to host
-thynx.io: could not connect to host
thyrex.fr: could not connect to host
+thzone.net: did not receive HSTS header
ti-js.com: could not connect to host
ti.blog.br: did not receive HSTS header
tiacollection.com: did not receive HSTS header
+tianshili.me: could not connect to host
tianxicaipiao.com: could not connect to host
tianxicaipiao.win: could not connect to host
tianxicp.com: could not connect to host
tianxing.pro: did not receive HSTS header
tianxingvpn.pro: could not connect to host
+tib1.com: could not connect to host
tibbitshall.ca: could not connect to host
tibovanheule.site: could not connect to host
+ticfleet.com: could not connect to host
+ticketluck.com: did not receive HSTS header
ticketmates.com.au: did not receive HSTS header
ticketoplichting.nl: did not receive HSTS header
tickopa.co.uk: could not connect to host
@@ -17482,7 +18555,6 @@ tiendafetichista.com: could not connect to host
tiendavertigo.com: did not receive HSTS header
tiendschuurstraat.nl: could not connect to host
tiensnet.com: could not connect to host
-tierarztpraxis-illerwinkel.de: did not receive HSTS header
tiernanx.com: could not connect to host
tierrarp.com: could not connect to host
tiggi.pw: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -17529,11 +18601,14 @@ timwittenberg.com: could not connect to host
tinchbear.xyz: could not connect to host
tindewen.net: could not connect to host
tink.network: could not connect to host
+tinker.career: could not connect to host
tinkerboard.org: could not connect to host
-tinkerers-trunk.co.za: could not connect to host
+tinkerers-trunk.co.za: did not receive HSTS header
+tinkererstrunk.co.za: could not connect to host
tipiakers.club: could not connect to host
tipps-fuer-den-haushalt.de: could not connect to host
tippspiel.cc: could not connect to host
+tipsport.cz: could not connect to host
tipsyk.ru: could not connect to host
tiredofeating.com: could not connect to host
tiremoni.ch: did not receive HSTS header
@@ -17551,7 +18626,7 @@ tjc.wiki: could not connect to host
tjeckien.guide: could not connect to host
tjs.me: could not connect to host
tju.me: could not connect to host
-tkappertjedemetamorfose.nl: could not connect to host
+tkappertjedemetamorfose.nl: did not receive HSTS header
tkarstens.de: did not receive HSTS header
tkeycoin.com: did not receive HSTS header
tkhw.tk: could not connect to host
@@ -17563,6 +18638,7 @@ tlo.link: could not connect to host
tlo.network: could not connect to host
tls.builders: could not connect to host
tls.li: could not connect to host
+tls1914.org: could not connect to host
tlsbv.nl: did not receive HSTS header
tlshost.net: could not connect to host
tm-solutions.eu: could not connect to host
@@ -17586,7 +18662,6 @@ tobaby.com.br: could not connect to host
tobacco.gov: could not connect to host
tobaccore.eu: could not connect to host
tobaccore.sk: could not connect to host
-tobi-server.goip.de: could not connect to host
tobi-videos.goip.de: could not connect to host
tobias-bielefeld.de: did not receive HSTS header
tobiasbergius.se: could not connect to host
@@ -17596,7 +18671,6 @@ tobiasofficial.at: could not connect to host
tobiassachs.cf: could not connect to host
tobiassachs.tk: could not connect to host
tobis-webservice.de: did not receive HSTS header
-tobyx.is: could not connect to host
toddmissiontx.gov: did not receive HSTS header
todesschaf.org: could not connect to host
todo.is: could not connect to host
@@ -17616,7 +18690,6 @@ tokage.me: could not connect to host
tokbijouxs.com.br: did not receive HSTS header
tokenloan.com: could not connect to host
tokintu.com: could not connect to host
-tokky.eu: could not connect to host
tokobungaasryflorist.com: did not receive HSTS header
tokobungadijambi.com: did not receive HSTS header
tokobungadilampung.com: could not connect to host
@@ -17626,7 +18699,8 @@ tokoone.com: did not receive HSTS header
tokotamz.net: could not connect to host
tokotimbangandigitalmurah.web.id: did not receive HSTS header
tokoyo.biz: could not connect to host
-toldositajuba.com: could not connect to host
+tokumei.co: could not connect to host
+tollfreeproxy.com: could not connect to host
tollmanz.com: did not receive HSTS header
tollsjekk.no: could not connect to host
tolud.com: could not connect to host
@@ -17634,25 +18708,25 @@ tom-maxwell.com: did not receive HSTS header
tom.run: did not receive HSTS header
tomandshirley.com: could not connect to host
tomaspialek.cz: did not receive HSTS header
-tomaz.eu: could not connect to host
-tomberek.info: did not receive HSTS header
-tomcort.com: could not connect to host
+tomcort.com: did not receive HSTS header
tomdudfield.com: did not receive HSTS header
tomeara.net: could not connect to host
tomevans.io: did not receive HSTS header
tomharling.co.uk: could not connect to host
tomiler.com: could not connect to host
+tomkwok.com: could not connect to host
tomlankhorst.nl: did not receive HSTS header
tomli.me: could not connect to host
tommounsey.com: did not receive HSTS header
tommsy.com: did not receive HSTS header
tommyads.com: could not connect to host
-tommyweber.de: did not receive HSTS header
+tommyweber.de: could not connect to host
tomoyaf.com: could not connect to host
-tomphill.co.uk: could not connect to host
+tomphill.co.uk: did not receive HSTS header
tomudding.com: did not receive HSTS header
tomy.icu: could not connect to host
tonburi.jp: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+tone.tw: could not connect to host
tongmu.me: could not connect to host
tonguetechnology.com: could not connect to host
toni-dis.ch: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -17660,6 +18734,7 @@ toniharant.de: could not connect to host
toomanypillows.com: could not connect to host
toomy.ddns.net: could not connect to host
top-esb.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+top-solar-info.de: could not connect to host
top-stage.net: could not connect to host
top10mountainbikes.info: could not connect to host
topanlage.de: could not connect to host
@@ -17670,32 +18745,38 @@ topdeskdev.net: could not connect to host
topdetoxcleanse.com: could not connect to host
topdevbox.net: could not connect to host
topesb.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+topkek.ml: could not connect to host
topmarine.se: did not receive HSTS header
topnewstoday.org: could not connect to host
topnotchendings.com: could not connect to host
topnovini.com: did not receive HSTS header
toppik.com.br: could not connect to host
toppointrea.com: could not connect to host
+topsailtechnologies.com: could not connect to host
topservercccam.com: did not receive HSTS header
topshelfguild.com: could not connect to host
+topshoptools.com: could not connect to host
toptenthebest.com: did not receive HSTS header
toptranslation.com: did not receive HSTS header
topvertimai.lt: could not connect to host
topwin.la: could not connect to host
topyx.com: did not receive HSTS header
tor2web.org: could not connect to host
+torahanytime.com: did not receive HSTS header
torbay.ga: could not connect to host
torbe.es: could not connect to host
torchl.it: could not connect to host
toretfaction.net: could not connect to host
+torfbahn.de: did not receive HSTS header
torlock.download: could not connect to host
torproject.org.uk: could not connect to host
torproject.ovh: could not connect to host
-torrentdownloads.bid: did not receive HSTS header
+torrentdownloads.bid: could not connect to host
torrentfunk.com: could not connect to host
torrentgamesps2.info: could not connect to host
torrenttop100.net: could not connect to host
-torrentz.website: could not connect to host
+torrentz.website: did not receive HSTS header
+torrentz2.al: could not connect to host
torrentz2.eu: did not receive HSTS header
tortocan.com: could not connect to host
tortugalife.de: could not connect to host
@@ -17704,18 +18785,19 @@ tosainu.com.br: could not connect to host
tosecure.link: could not connect to host
toshnix.com: could not connect to host
toshub.com: could not connect to host
+toskana-appartement.de: did not receive HSTS header
totalbeauty.co.uk: could not connect to host
totaldragonshop.com.br: could not connect to host
totalle.com.br: could not connect to host
totallynotaserver.com: could not connect to host
-totalsystemcare.com: could not connect to host
+totalsystemcare.com: did not receive HSTS header
totalwebmedia.nl: did not receive HSTS header
totalworkout.fitness: did not receive HSTS header
totch.de: could not connect to host
totem-eshop.cz: could not connect to host
totoro.pub: could not connect to host
totot.net: could not connect to host
-toucedo.de: could not connect to host
+toucedo.de: did not receive HSTS header
touch-up-net.com: could not connect to host
touchbasemail.com: did not receive HSTS header
touchinformatica.com: did not receive HSTS header
@@ -17728,16 +18810,17 @@ touray-enterprise.ch: could not connect to host
tourispo.com: could not connect to host
tourpeer.com: did not receive HSTS header
toursandtransfers.it: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-tousproducteurs.fr: did not receive HSTS header
-tovp.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+tousproducteurs.fr: could not connect to host
towaway.ru: could not connect to host
-townofruthnc.gov: could not connect to host
+townhousedevelopments.com.au: did not receive HSTS header
+townofruthnc.gov: did not receive HSTS header
tox.im: did not receive HSTS header
toxicboot.com: could not connect to host
toxicip.com: could not connect to host
toxme.se: could not connect to host
toymania.de: could not connect to host
toyotamotala.se: could not connect to host
+tpansino.com: could not connect to host
tpbcdn.com: could not connect to host
tpblist.xyz: could not connect to host
tpbunblocked.org: could not connect to host
@@ -17746,12 +18829,16 @@ tpms4u.at: could not connect to host
tppdebate.org: did not receive HSTS header
trabajarenperu.com: did not receive HSTS header
tracalada.cl: did not receive HSTS header
+tracelight.io: did not receive HSTS header
+traces.ml: could not connect to host
tracetracker.com: did not receive HSTS header
tracewind.top: could not connect to host
trackdays4fun.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
tracker-gps.ch: could not connect to host
trackfeed.tokyo: could not connect to host
+trackingstream.com: could not connect to host
trackmeet.io: did not receive HSTS header
+tracksa.com.ar: could not connect to host
tracktivity.com.au: did not receive HSTS header
trade-smart.ru: could not connect to host
tradedesk.co.za: could not connect to host
@@ -17762,8 +18849,9 @@ tradingbhavishya.com: did not receive HSTS header
tradingcentre.com.au: did not receive HSTS header
tradinghope.com: could not connect to host
tradingrooms.com: did not receive HSTS header
-traditional-knowledge.tk: did not receive HSTS header
+traditional-knowledge.tk: could not connect to host
traeningsprojekt.dk: did not receive HSTS header
+traffic.az: did not receive HSTS header
trafficquality.org: could not connect to host
traffictigers.com: did not receive HSTS header
traforet.win: could not connect to host
@@ -17779,7 +18867,10 @@ trainline.io: could not connect to host
trainline.se: could not connect to host
trainut.com: could not connect to host
trakfusion.com: could not connect to host
+trance-heal.me: could not connect to host
+tranceheal.me: could not connect to host
trancendances.fr: could not connect to host
+trangcongnghe.com: max-age too low: 5184000
tranos.de: did not receive HSTS header
transbike.es: did not receive HSTS header
transcendmotor.sg: could not connect to host
@@ -17787,6 +18878,7 @@ transcricentro.pt: could not connect to host
transcriptionwave.com: did not receive HSTS header
transdirect.com.au: did not receive HSTS header
transferio.nl: did not receive HSTS header
+transfers.mx: could not connect to host
transformify.org: did not receive HSTS header
transgendernetwerk.nl: did not receive HSTS header
transl8.eu: did not receive HSTS header
@@ -17794,6 +18886,7 @@ translate.googleapis.com: did not receive HSTS header (error ignored - included
translateblender.ru: could not connect to host
translatoruk.co.uk: did not receive HSTS header
transmithe.net: could not connect to host
+transport.eu: max-age too low: 0
transportal.sk: did not receive HSTS header
transsexualpantyhose.com: could not connect to host
tratamentoparacelulite.biz: could not connect to host
@@ -17810,18 +18903,19 @@ travelling.expert: could not connect to host
travellsell.com: did not receive HSTS header
travelmyth.ie: did not receive HSTS header
travelpricecheck.com: max-age too low: 0
-travisfranck.com: could not connect to host
travotion.com: could not connect to host
trazosdearte.com: did not receive HSTS header
treasuredinheritanceministry.com: did not receive HSTS header
treatment.org: could not connect to host
treatprostatewithhifu.com: could not connect to host
-treebaglia.xyz: could not connect to host
+tree0.xyz: could not connect to host
treeby.net: could not connect to host
treehousebydesign.com: did not receive HSTS header
treeremovaljohannesburg.co.za: could not connect to host
+treeworkbyjtec.com: could not connect to host
treino.blog.br: could not connect to host
treker.us: could not connect to host
+trekkinglife.de: did not receive HSTS header
trell.co.in: did not receive HSTS header
tremlor.com: max-age too low: 300
tremolosoftware.com: did not receive HSTS header
@@ -17831,8 +18925,9 @@ trendingpulse.com: could not connect to host
trendisland.de: did not receive HSTS header
trendydips.com: could not connect to host
trentmaydew.com: could not connect to host
+trenztec.ml: could not connect to host
tretkowski.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-trewe.eu: could not connect to host
+trewe.eu: did not receive HSTS header
triadwars.com: did not receive HSTS header
triageo.com.au: could not connect to host
trialmock.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -17843,13 +18938,16 @@ triddi.com: could not connect to host
tridentflood.com: could not connect to host
tridimage.com: did not receive HSTS header
trigular.de: could not connect to host
+trik.es: could not connect to host
trileg.net: could not connect to host
+trilithsolutions.com: did not receive HSTS header
+trim21.cn: could not connect to host
trimarchimanuele.it: did not receive HSTS header
trinity.fr.eu.org: could not connect to host
trinityaffirmations.com: max-age too low: 0
trinitycore.org: max-age too low: 2592000
trinitytechdev.com: did not receive HSTS header
-trink-und-partyspiele.de: could not connect to host
+trior.net: could not connect to host
tripcombi.com: did not receive HSTS header
tripdelta.com: did not receive HSTS header
tripinsider.club: did not receive HSTS header
@@ -17858,7 +18956,6 @@ tripout.tech: did not receive HSTS header
trisportas.lt: did not receive HSTS header
tristanfarkas.one: could not connect to host
triticeaetoolbox.org: did not receive HSTS header
-trixati.org.ua: did not receive HSTS header
trixies-wish.nz: could not connect to host
trixy.com.br: could not connect to host
trizone.com.au: did not receive HSTS header
@@ -17886,20 +18983,23 @@ trustednewssites.com: could not connect to host
trusteecar.com: did not receive HSTS header
trustmeimfancy.com: could not connect to host
trustocean.com: did not receive HSTS header
+trybabyschoice.com: could not connect to host
trybind.com: could not connect to host
tryfabulousdiet.com: could not connect to host
tryfm.net: did not receive HSTS header
trynowrinkleseyeserum.com: could not connect to host
tryoneday.co: did not receive HSTS header
+trypineapple.com: could not connect to host
tryti.me: could not connect to host
ts-publishers.com: could not connect to host
ts2.se: could not connect to host
ts3-dns.com: could not connect to host
ts3-dns.me: could not connect to host
ts3-dns.net: could not connect to host
+ts3-legenda.tech: could not connect to host
ts3.consulting: could not connect to host
tsaro.io: could not connect to host
-tscqmalawi.info: did not receive HSTS header
+tscqmalawi.info: could not connect to host
tsdom.net: could not connect to host
tsecy.com: could not connect to host
tsgbit.net: could not connect to host
@@ -17913,11 +19013,13 @@ tsumegumi.net: could not connect to host
tsumi.moe: could not connect to host
tsura.org: could not connect to host
tsurezurematome.ga: could not connect to host
+tsurimap.com: could not connect to host
ttackmedical.com.br: could not connect to host
tts.co.nz: did not receive HSTS header
ttspttsp.com: could not connect to host
tty.space: could not connect to host
ttz.im: could not connect to host
+tu6.pm: could not connect to host
tuamoronline.com: could not connect to host
tuang-tuang.com: could not connect to host
tubbutec.de: did not receive HSTS header
@@ -17929,18 +19031,17 @@ tucidi.net: could not connect to host
tucker.wales: could not connect to host
tucnak.eu: could not connect to host
tudorapido.com.br: did not receive HSTS header
+tudulinna.ee: max-age too low: 43200
tueche.com.ar: did not receive HSTS header
tufilo.com: could not connect to host
tugers.com: did not receive HSTS header
tulenceria.es: could not connect to host
tulsameetingroom.com: could not connect to host
-tumagiri.net: did not receive HSTS header
tumutanzi.com: did not receive HSTS header
tunca.it: did not receive HSTS header
tunebitfm.de: could not connect to host
tungstenroyce.com: did not receive HSTS header
tunity.be: did not receive HSTS header
-tuou.xyz: could not connect to host
tupizm.com: could not connect to host
turismo.cl: could not connect to host
turkiet.guide: could not connect to host
@@ -17951,28 +19052,28 @@ turnsticks.com: could not connect to host
turtle.ai: did not receive HSTS header
turtlementors.com: could not connect to host
turtles.ga: could not connect to host
-tusb.ml: could not connect to host
+tusb.ml: did not receive HSTS header
tussengelegenwoningverkopen.nl: could not connect to host
tuthowto.com: could not connect to host
-tutiendaroja.com: did not receive HSTS header
-tutiendarosa.com: did not receive HSTS header
+tutiendaroja.com: could not connect to host
+tutiendarosa.com: could not connect to host
tutorio.ga: could not connect to host
tutu.ro: could not connect to host
-tuturulianda.com: did not receive HSTS header
+tuturulianda.com: could not connect to host
tuvalie.com: did not receive HSTS header
-tuxflow.de: could not connect to host
tuxhound.org: could not connect to host
+tuxone.ch: did not receive HSTS header
tuxrtfm.com: could not connect to host
tv.search.yahoo.com: could not connect to host
tvc.red: could not connect to host
tverdohleb.com: could not connect to host
tvoru.com.ua: did not receive HSTS header
tvqc.com: did not receive HSTS header
-tvs-virtual.cz: did not receive HSTS header
tvtubeflix.com: did not receive HSTS header
tvz-materijali.com: could not connect to host
tw2-tools.ga: could not connect to host
twarog.cc: could not connect to host
+twatspot.com: could not connect to host
tweakersbadge.nl: could not connect to host
twee-onder-een-kap-woning-in-alphen-aan-den-rijn-kopen.nl: could not connect to host
twee-onder-een-kap-woning-in-brielle-kopen.nl: could not connect to host
@@ -17991,7 +19092,6 @@ tweetify.io: could not connect to host
twelve.rocks: could not connect to host
twelve.today: could not connect to host
twelverocks.com: could not connect to host
-twem.ddns.net: could not connect to host
twilightcookies.ca: could not connect to host
twillionmas.com: could not connect to host
twinkieman.com: could not connect to host
@@ -18009,7 +19109,7 @@ twitter.ax: could not connect to host
twocornertiming.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
twogo.com: did not receive HSTS header
twojfaktum.pl: could not connect to host
-twolanedesign.com: did not receive HSTS header
+twolanedesign.com: could not connect to host
twolinepassbrewing.com: could not connect to host
twolivelife.com: could not connect to host
twoo.com: could not connect to host
@@ -18024,6 +19124,8 @@ txcp02.com: could not connect to host
txf.pw: could not connect to host
ty2u.com: did not receive HSTS header
tycjt.vip: could not connect to host
+tyil.nl: did not receive HSTS header
+tyil.work: could not connect to host
tykoon.com: could not connect to host
tyl.io: did not receive HSTS header
tyler.coach: could not connect to host
@@ -18050,11 +19152,12 @@ tzwe.com: could not connect to host
u-master.net: did not receive HSTS header
u-metals.com: did not receive HSTS header
u175.com: could not connect to host
-uaci.edu.mx: could not connect to host
+u5eu.com: did not receive HSTS header
uadp.pw: could not connect to host
uahs.org.uk: did not receive HSTS header
ubalert.com: could not connect to host
uber.com.au: did not receive HSTS header
+uberbkk.com: could not connect to host
ubercalculator.com: did not receive HSTS header
uberfunction.com: did not receive HSTS header
ubertt.org: could not connect to host
@@ -18067,7 +19170,8 @@ ubuntuhot.com: did not receive HSTS header
uc.ac.id: did not receive HSTS header
uchiha.ml: could not connect to host
uclanmasterplan.co.uk: did not receive HSTS header
-udbhav.me: could not connect to host
+uddi.ng: did not receive HSTS header
+uefeng.com: did not receive HSTS header
uega.net: did not receive HSTS header
uel-thompson-okanagan.ca: could not connect to host
uerdingen.info: did not receive HSTS header
@@ -18081,8 +19185,11 @@ ugcdn.com: could not connect to host
ugisgutless.com: could not connect to host
ugo.ninja: could not connect to host
ugosadventures.com: could not connect to host
+uhappy1.com: could not connect to host
uhappy11.com: did not receive HSTS header
+uhappy2.com: could not connect to host
uhappy21.com: did not receive HSTS header
+uhappy22.com: could not connect to host
uhappy23.com: did not receive HSTS header
uhappy24.com: did not receive HSTS header
uhappy25.com: did not receive HSTS header
@@ -18091,57 +19198,77 @@ uhappy27.com: did not receive HSTS header
uhappy28.com: did not receive HSTS header
uhappy29.com: did not receive HSTS header
uhappy3.com: did not receive HSTS header
+uhappy30.com: did not receive HSTS header
uhappy31.com: did not receive HSTS header
uhappy33.com: did not receive HSTS header
+uhappy50.com: could not connect to host
uhappy55.com: did not receive HSTS header
uhappy56.com: did not receive HSTS header
+uhappy57.com: could not connect to host
uhappy58.com: did not receive HSTS header
uhappy59.com: did not receive HSTS header
+uhappy6.com: could not connect to host
uhappy60.com: did not receive HSTS header
uhappy61.com: did not receive HSTS header
uhappy62.com: did not receive HSTS header
uhappy66.com: did not receive HSTS header
uhappy67.com: did not receive HSTS header
+uhappy69.com: did not receive HSTS header
+uhappy70.com: did not receive HSTS header
uhappy71.com: did not receive HSTS header
-uhappy73.com: could not connect to host
-uhappy74.com: could not connect to host
-uhappy75.com: could not connect to host
+uhappy72.com: did not receive HSTS header
+uhappy73.com: did not receive HSTS header
+uhappy74.com: did not receive HSTS header
+uhappy75.com: did not receive HSTS header
uhappy76.com: could not connect to host
uhappy77.com: did not receive HSTS header
uhappy78.com: could not connect to host
-uhappy8.com: did not receive HSTS header
+uhappy79.com: did not receive HSTS header
+uhappy8.com: could not connect to host
+uhappy80.com: did not receive HSTS header
+uhappy81.com: did not receive HSTS header
+uhappy82.com: did not receive HSTS header
+uhappy83.com: could not connect to host
+uhappy85.com: could not connect to host
uhappy86.com: did not receive HSTS header
-uhappy9.com: did not receive HSTS header
+uhappy88.com: did not receive HSTS header
+uhappy9.com: could not connect to host
+uhappy90.com: did not receive HSTS header
uhappy99.com: did not receive HSTS header
uhasseltctf.ga: could not connect to host
uhasseltodin.be: did not receive HSTS header
uhm.io: did not receive HSTS header
-uhssl.com: did not receive HSTS header
+uhssl.com: could not connect to host
uhuru-market.com: did not receive HSTS header
uitslagensoftware.nl: did not receive HSTS header
ukas.com: could not connect to host
+ukbc.london: did not receive HSTS header
ukdropshipment.co.uk: did not receive HSTS header
ukdropshipment.com: did not receive HSTS header
ukk.dk: did not receive HSTS header
ukkeyholdingcompany.co.uk: could not connect to host
ukrgadget.com: could not connect to host
+ukunlocks.com: did not receive HSTS header
ulabox.cat: did not receive HSTS header
ulabox.es: did not receive HSTS header
ulalau.com: did not receive HSTS header
ullamodaintima.com.br: could not connect to host
ulmo.dk: could not connect to host
-ulti.gq: did not receive HSTS header
+ulrik.moe: could not connect to host
+ulti.gq: could not connect to host
ultimate-garcinia-plus.com: could not connect to host
ultimate-glow-skin.com: could not connect to host
ultimate-memoryplus.com: could not connect to host
ultimate-neuroplus.com: could not connect to host
ultramax.biz: could not connect to host
ultraporn.biz: could not connect to host
+ultraseopro.com: could not connect to host
ultrasite.tk: could not connect to host
ultrasteam.net: could not connect to host
ultros.io: did not receive HSTS header
umaimise.info: did not receive HSTS header
umassfive.coop: did not receive HSTS header
+umbrellaye.online: could not connect to host
umbriel.fr: did not receive HSTS header
umgardi.ca: could not connect to host
umidev.com: could not connect to host
@@ -18150,6 +19277,7 @@ umkmjogja.com: did not receive HSTS header
ump45.moe: could not connect to host
umsolugar.com.br: could not connect to host
umwandeln-online.de: could not connect to host
+umzugsunternehmenberlin.eu: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
unapolegetic.co: did not receive HSTS header
unart.info: could not connect to host
unbanthe.net: could not connect to host
@@ -18159,6 +19287,7 @@ unblocked.blue: did not receive HSTS header
unblocked.date: could not connect to host
unblocked.faith: could not connect to host
unblocked.host: could not connect to host
+unblocked.lat: could not connect to host
unblocked.party: could not connect to host
unblocked.sh: could not connect to host
unblocked.st: could not connect to host
@@ -18166,7 +19295,7 @@ unblocked.today: could not connect to host
unblocked.vc: could not connect to host
unblocked.win: could not connect to host
unblocked.works: could not connect to host
-unblocked.world: could not connect to host
+unblocked.world: did not receive HSTS header
unblockedall.site: could not connect to host
unblockedbay.info: could not connect to host
unblockerproxy.site: did not receive HSTS header
@@ -18175,7 +19304,7 @@ unblockmy.party: could not connect to host
unblockmy.tech: could not connect to host
unblockmy.xyz: could not connect to host
unblockmyproxy.site: did not receive HSTS header
-unblockthe.site: could not connect to host
+unblockthe.site: did not receive HSTS header
unblockthe.top: could not connect to host
unccdesign.club: could not connect to host
unclegen.xyz: could not connect to host
@@ -18189,10 +19318,11 @@ unfiltered.nyc: could not connect to host
unfuddle.cn: could not connect to host
ungeek.eu: did not receive HSTS header
ungern.guide: could not connect to host
-unhu.fr: could not connect to host
+unhu.fr: did not receive HSTS header
uni-games.com: could not connect to host
uni2share.com: could not connect to host
unicefcards.at: did not receive HSTS header
+unicefcards.gr: could not connect to host
unicefkaarten.be: did not receive HSTS header
unicefkort.dk: did not receive HSTS header
unicooo.com: could not connect to host
@@ -18207,12 +19337,15 @@ uniformespousoalegre.com.br: did not receive HSTS header
unikitty-on-tour.com: could not connect to host
unikrn.com: could not connect to host
uninet.cf: could not connect to host
+unioils.la: max-age too low: 7889238
uniojeda.ml: could not connect to host
unionstationapp.com: could not connect to host
+unionstreetskateboards.com: could not connect to host
unirenter.ru: did not receive HSTS header
unison.com: did not receive HSTS header
-unisyssecurity.com: did not receive HSTS header
+unisyssecurity.com: could not connect to host
unitedcyberdevelopment.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+unitedstreamers.de: did not receive HSTS header
unitlabs.net: could not connect to host
unitrade-425.co.za: did not receive HSTS header
univerpack.net: could not connect to host
@@ -18221,7 +19354,6 @@ universogay.com: could not connect to host
univstore.win: could not connect to host
univz.com: could not connect to host
unixapp.ml: could not connect to host
-unixfox.eu: could not connect to host
unixtime.pro: could not connect to host
unknownbreakup.com: max-age too low: 2592000
unknownphenomena.net: could not connect to host
@@ -18229,17 +19361,16 @@ unleash.pw: could not connect to host
unlogis.ch: could not connect to host
unmanaged.space: did not receive HSTS header
unplugg3r.dk: could not connect to host
-unpossible.xyz: could not connect to host
unravel.ie: could not connect to host
unripple.com: could not connect to host
unruh.fr: did not receive HSTS header
unschoolrules.com: did not receive HSTS header
+unsereins.me: did not receive HSTS header
unstockd.org: could not connect to host
unsupervised.ca: did not receive HSTS header
unsystem.net: could not connect to host
unterkunft.guru: did not receive HSTS header
untoldstory.eu: did not receive HSTS header
-unveiledgnosis.com: did not receive HSTS header
unwiredbrain.com: could not connect to host
unwomen.is: did not receive HSTS header
unworthy.ml: could not connect to host
@@ -18247,10 +19378,10 @@ unyq.me: could not connect to host
uonstaffhub.com: could not connect to host
uow.ninja: could not connect to host
up1.ca: could not connect to host
-upaknship.com: did not receive HSTS header
upandclear.org: max-age too low: 0
upboard.jp: could not connect to host
updatehub.io: did not receive HSTS header
+upgauged.com: could not connect to host
upldr.pw: could not connect to host
uploadbro.com: could not connect to host
upmchealthsecurity.us: could not connect to host
@@ -18261,12 +19392,14 @@ upstats.eu: could not connect to host
uptakedigital.com.au: max-age too low: 2592000
uptic.net: did not receive HSTS header
uptogood.org: could not connect to host
+uptrex.co.uk: did not receive HSTS header
upupming.site: did not receive HSTS header
upwardtraining.co.uk: could not connect to host
ur-lauber.de: did not receive HSTS header
urban-garden.lt: could not connect to host
urban-garden.lv: could not connect to host
urban-karuizawa.co.jp: max-age too low: 0
+urbane-london.com: did not receive HSTS header
urbanfi.sh: did not receive HSTS header
urbanmic.com: could not connect to host
urbanstylestaging.com: could not connect to host
@@ -18297,7 +19430,6 @@ user-new.com: did not receive HSTS header
usercare.com: could not connect to host
useresponse.com: did not receive HSTS header
userify.com: did not receive HSTS header
-uskaria.com: could not connect to host
uslab.io: could not connect to host
usleep.net: could not connect to host
usparklodging.com: did not receive HSTS header
@@ -18305,7 +19437,7 @@ usportsgo.com: could not connect to host
usr.nz: did not receive HSTS header
usuluddin.ga: did not receive HSTS header
utahfireinfo.gov: did not receive HSTS header
-utdscanner.com: did not receive HSTS header
+utdscanner.com: could not connect to host
utdsgda.com: could not connect to host
uteam.it: could not connect to host
utilio.nl: max-age too low: 2592000
@@ -18323,14 +19455,16 @@ uttnetgroup.fr: could not connect to host
utube.tw: could not connect to host
utumno.ch: could not connect to host
utvbloggen.se: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-uuid.cf: could not connect to host
+uuid.cf: did not receive HSTS header
uvarov.pw: could not connect to host
uvolejniku.cz: did not receive HSTS header
+uw1008.com: could not connect to host
uwekoetter.com: did not receive HSTS header
uwesander.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
uwfreelanceopticien.nl: could not connect to host
-uwimonacs.org.jm: did not receive HSTS header
+uwimonacs.org.jm: could not connect to host
uwstartups.com: could not connect to host
+uxtechnologist.com: did not receive HSTS header
uxux.pl: could not connect to host
uygindir.ml: could not connect to host
uyym.com: could not connect to host
@@ -18341,9 +19475,9 @@ v-desk.ga: could not connect to host
v0rtex.xyz: could not connect to host
v0tti.com: did not receive HSTS header
v12.co.uk: did not receive HSTS header
-v1sit0r.ru: could not connect to host
v2.pw: did not receive HSTS header
v2ex.us: could not connect to host
+v4s.ro: could not connect to host
v4veedu.com: could not connect to host
v5wz.com: did not receive HSTS header
v5xp.com: did not receive HSTS header
@@ -18362,15 +19496,18 @@ vaddder.com: could not connect to host
vadennissanofhinesvilleparts.com: did not receive HSTS header
vadik.me: could not connect to host
vadodesign.nl: did not receive HSTS header
+vagrantbits.com: could not connect to host
vaibhavchatarkar.com: could not connect to host
val-sec.com: could not connect to host
valaeris.de: did not receive HSTS header
-valbonne-consulting.com: did not receive HSTS header
+valbonne-consulting.com: could not connect to host
valecnatechnika.cz: could not connect to host
valenhub.com: could not connect to host
valenhub.es: could not connect to host
valenscaelum.com: could not connect to host
+valentin-dederer.de: could not connect to host
valentin-ochs.de: could not connect to host
+valentin.ml: could not connect to host
valesdev.com: max-age too low: 0
valethound.com: could not connect to host
valhallacostarica.com: could not connect to host
@@ -18384,6 +19521,7 @@ vallis.net: could not connect to host
valmagus.com: could not connect to host
valopv.be: could not connect to host
valshamar.is: could not connect to host
+valuechain.me: could not connect to host
vamoaeturismo.com.br: could not connect to host
vamosfalardesaude.pt: could not connect to host
vampirism.eu: could not connect to host
@@ -18394,14 +19532,15 @@ vanderstraeten.dynv6.net: could not connect to host
vanessabalibridal.com: could not connect to host
vanestack.com: could not connect to host
vanetv.com: could not connect to host
-vangeluwedeberlaere.be: could not connect to host
+vangeluwedeberlaere.be: did not receive HSTS header
vanhaos.com: could not connect to host
vanitas.xyz: could not connect to host
vanitynailworkz.com: could not connect to host
-vanlaanen.com: did not receive HSTS header
+vanlent.net: could not connect to host
vanohaker.ru: could not connect to host
vansieleghem.com: could not connect to host
vantaio.com: did not receive HSTS header
+vanvoro.us: did not receive HSTS header
vapecom-shop.com: could not connect to host
vapecraftinc.com: did not receive HSTS header
vapehour.com: could not connect to host
@@ -18409,6 +19548,7 @@ vapemania.eu: could not connect to host
vapeshopsupply.com: max-age too low: 7889238
vaporpunk.space: did not receive HSTS header
varela-electricite.fr: could not connect to host
+varghese.de: could not connect to host
variablyconstant.com: could not connect to host
varta.io: could not connect to host
vasa-webstranka.sk: did not receive HSTS header
@@ -18421,12 +19561,12 @@ vatsim-uk.co.uk: did not receive HSTS header
vatsim.uk: did not receive HSTS header
vavai.net: did not receive HSTS header
vavouchers.com: could not connect to host
-vawltstorage.com: did not receive HSTS header
+vawltstorage.com: could not connect to host
vayaport.com: could not connect to host
vb-oa.co.uk: did not receive HSTS header
vbest.net: could not connect to host
vbestreviews.com: did not receive HSTS header
-vbhelp.org: could not connect to host
+vbhelp.org: did not receive HSTS header
vbulletin-russia.com: could not connect to host
vbulletinrussia.com: could not connect to host
vcdn.xyz: could not connect to host
@@ -18434,9 +19574,11 @@ vcdove.com: could not connect to host
vconcept.ch: could not connect to host
vconcept.me: could not connect to host
vcr.re: could not connect to host
+vctor.net: did not receive HSTS header
vdhco.be: did not receive HSTS header
vdownloader.com: could not connect to host
vdrpro.com: could not connect to host
+vea.re: max-age too low: 0
veblen.com: did not receive HSTS header
vechkasov.ru: could not connect to host
vectro.me: could not connect to host
@@ -18445,7 +19587,7 @@ vega-motor.com.ua: did not receive HSTS header
vega-rumia.com.pl: max-age too low: 2592000
vega.dyndns.info: could not connect to host
vegalayer.com: could not connect to host
-vegalengd.com: did not receive HSTS header
+vegalengd.com: could not connect to host
vegane-proteine.com: could not connect to host
vegangaymer.blog: could not connect to host
veganosonline.com: could not connect to host
@@ -18474,15 +19616,19 @@ venoom.eu: did not receive HSTS header
vensl.org: could not connect to host
venturedisplay.co.uk: did not receive HSTS header
venturepro.com: did not receive HSTS header
-venusbymariatash.com: could not connect to host
+ventzke.com: could not connect to host
+venusbymariatash.com: did not receive HSTS header
venzocrm.com: did not receive HSTS header
ver-ooginoog.nl: max-age too low: 2592000
-veraandsteve.date: did not receive HSTS header
+veraandsteve.date: could not connect to host
verdeandco.co.uk: could not connect to host
+vereinscheck.de: could not connect to host
vergeaccessories.com: could not connect to host
vergessen.cn: could not connect to host
+verificaprezzi.it: did not receive HSTS header
verifiedinvesting.com: could not connect to host
verifikatorindonesia.com: could not connect to host
+veriny.tf: did not receive HSTS header
veriomed.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
veristor.com: did not receive HSTS header
verliefde-jongens.nl: could not connect to host
@@ -18490,6 +19636,7 @@ vermogeninkaart.nl: could not connect to host
vermontcareergateway.org: could not connect to host
vernonfishandgame.ca: did not receive HSTS header
vernonhouseofhope.com: did not receive HSTS header
+verry.org: could not connect to host
versbeton.nl: max-age too low: 864000
versfin.net: could not connect to host
versia.ru: did not receive HSTS header
@@ -18503,11 +19650,13 @@ veterinaire-cazeres-foucault.fr: could not connect to host
vethouse.com.ua: did not receive HSTS header
vetmgmt.com: could not connect to host
veto.fish: could not connect to host
+vexsoluciones.com: did not receive HSTS header
vforvendetta.science: did not receive HSTS header
vfree.org: could not connect to host
vgatest.nl: could not connect to host
vglimg.com: could not connect to host
vhost.co.id: could not connect to host
+vhs-bad-wurzach.de: did not receive HSTS header
viabemestar.com.br: could not connect to host
viadeux.com: did not receive HSTS header
viagraonlinebestellen.org: max-age too low: 3600
@@ -18519,23 +19668,13 @@ viceversa.xyz: did not receive HSTS header
vicianovi.cz: did not receive HSTS header
viciousflora.com: could not connect to host
viciousviscosity.xyz: could not connect to host
-vickshomes.com: could not connect to host
+vickshomes.com: did not receive HSTS header
victorenxovais.com.br: could not connect to host
-victoreriksson.ch: could not connect to host
-victoreriksson.co: could not connect to host
-victoreriksson.com: could not connect to host
-victoreriksson.eu: could not connect to host
-victoreriksson.info: could not connect to host
-victoreriksson.me: could not connect to host
-victoreriksson.net: could not connect to host
-victoreriksson.nu: could not connect to host
-victoreriksson.org: could not connect to host
-victoreriksson.se: could not connect to host
-victoreriksson.us: could not connect to host
victoriapemberton.com: did not receive HSTS header
victoriaville.ca: did not receive HSTS header
victornilsson.pw: did not receive HSTS header
vid.me: did not receive HSTS header
+vida.es: could not connect to host
vidb.me: could not connect to host
vidbuchanan.co.uk: did not receive HSTS header
vidcloud.xyz: did not receive HSTS header
@@ -18549,8 +19688,8 @@ videosxgays.com: could not connect to host
videotogel.net: could not connect to host
videoueberwachung-set.de: did not receive HSTS header
vider.ga: could not connect to host
-vidid.net: did not receive HSTS header
-vidiproject.com: could not connect to host
+vidid.net: could not connect to host
+vidiproject.com: did not receive HSTS header
viditut.com: could not connect to host
vidkovaomara.si: could not connect to host
vidlyoficial.com: could not connect to host
@@ -18558,12 +19697,15 @@ vidz.ga: could not connect to host
vieaw.com: could not connect to host
viennan.net: did not receive HSTS header
vietnam-lifer.com: could not connect to host
-vietnamchevrolet.net: did not receive HSTS header
-vietnamphotographytours.com: did not receive HSTS header
+vietnamchevrolet.net: could not connect to host
+vietnamphotographytours.com: could not connect to host
+vieux.pro: could not connect to host
+viewmyrecords.com: did not receive HSTS header
viewsea.com: max-age too low: 0
viga.me: could not connect to host
vigilo.cf: could not connect to host
vigilo.ga: could not connect to host
+vigour.us: could not connect to host
viikko.eu: could not connect to host
vijos.org: did not receive HSTS header
vikasbabyworld.de: could not connect to host
@@ -18575,7 +19717,7 @@ viladochurrasco.com.br: could not connect to host
vilight.com.br: could not connect to host
villa-anna-cilento.de: could not connect to host
villa-bellarte.de: did not receive HSTS header
-villacarmela.com.br: did not receive HSTS header
+villacarmela.com.br: could not connect to host
villainsclothing.com.au: could not connect to host
villalaskowa.pl: did not receive HSTS header
villasenor.online: could not connect to host
@@ -18591,8 +19733,10 @@ vinbet444.com: could not connect to host
vinbet555.com: could not connect to host
vinbet666.com: could not connect to host
vinbet888.com: could not connect to host
+vincentiliano.tk: could not connect to host
vincentkooijman.at: did not receive HSTS header
vincentkooijman.nl: did not receive HSTS header
+vincentoshana.com: did not receive HSTS header
vineright.com: did not receive HSTS header
vinesauce.info: could not connect to host
vinetalk.net: could not connect to host
@@ -18604,34 +19748,36 @@ vinnie.gq: could not connect to host
vinogradovka.com: did not receive HSTS header
vintock.com: could not connect to host
vio.no: did not receive HSTS header
-violenceinterrupted.org: did not receive HSTS header
+violenceinterrupted.org: could not connect to host
violet-letter.delivery: could not connect to host
violetraven.co.uk: did not receive HSTS header
viosey.com: could not connect to host
vioye.com: could not connect to host
-vip-9649.com: did not receive HSTS header
+vip-9649.com: could not connect to host
vip4553.com: could not connect to host
-vip9649.com: did not receive HSTS header
+vip9649.com: could not connect to host
viperdns.com: could not connect to host
vipesball.cc: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
vipesball.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
vipesball.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
vipesball.net: could not connect to host
viphospitality.se: could not connect to host
+vipi.es: could not connect to host
viplentes.com.br: did not receive HSTS header
vipmusic.ga: could not connect to host
vipnettikasinoklubi.com: did not receive HSTS header
viral8.jp: could not connect to host
viralboombox.xyz: could not connect to host
+viralsv.com: could not connect to host
virginiacrimeanalysisnetwork.org: did not receive HSTS header
virial.de: did not receive HSTS header
viris.si: max-age too low: 536000
virtualhealth.com: did not receive HSTS header
-virtualstrongbox.ca: did not receive HSTS header
+virtualstrongbox.ca: could not connect to host
visa-shinsei.com: did not receive HSTS header
visanhigia.com: could not connect to host
viserproject.com: did not receive HSTS header
-visioflux-premium.com: did not receive HSTS header
+visioflux-premium.com: could not connect to host
vision-painting.com: did not receive HSTS header
visiondigitalsog.com: could not connect to host
visiongamestudios.com: could not connect to host
@@ -18646,16 +19792,17 @@ vissersgrootboek.nl: did not receive HSTS header
vistarait.com: could not connect to host
visualvotes.co.uk: could not connect to host
vitagenda.nl: could not connect to host
-vital-tel.co.uk: did not receive HSTS header
vitalamin.at: could not connect to host
vitalamin.ch: could not connect to host
vitalamin.com: could not connect to host
vitalamin.de: did not receive HSTS header
vitalita.cz: did not receive HSTS header
+vitalium-therme.de: did not receive HSTS header
vitalorange.com: did not receive HSTS header
vitalthings.de: could not connect to host
vitamaxxi.com.br: could not connect to host
vitamineproteine.com: did not receive HSTS header
+vitapingu.de: could not connect to host
vitta.me: did not receive HSTS header
vitzro.kr: could not connect to host
viva-french.com: did not receive HSTS header
@@ -18667,9 +19814,10 @@ vivoregularizafacil.com.br: did not receive HSTS header
vivoseg.com: could not connect to host
vivremoinscher.fr: could not connect to host
viza.io: could not connect to host
+vizards.cc: could not connect to host
vizeat.com: did not receive HSTS header
+vk4wip.org.au: did not receive HSTS header
vkulagin.ru: could not connect to host
-vladimiroff.org: did not receive HSTS header
vldkn.net: could not connect to host
vleij.family: could not connect to host
vlogge.com: did not receive HSTS header
@@ -18678,7 +19826,10 @@ vlzbazar.ru: could not connect to host
vmem.jp: did not receive HSTS header
vmrdev.com: could not connect to host
vmstan.com: did not receive HSTS header
+vmzone.de: could not connect to host
vndb.org: could not connect to host
+vnfs-team.com: did not receive HSTS header
+vnpem.org: did not receive HSTS header
vocab.guru: could not connect to host
vocalik.com: could not connect to host
vocalsynth.space: could not connect to host
@@ -18702,7 +19853,6 @@ voipkb.com: did not receive HSTS header
voiro.club: could not connect to host
voirodaisuki.club: could not connect to host
vokalsystem.com: did not receive HSTS header
-vokurka.net: did not receive HSTS header
volatimer.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
volbyzive.cz: did not receive HSTS header
volcain.io: could not connect to host
@@ -18710,6 +19860,7 @@ volcrado.com: could not connect to host
volkden.com: could not connect to host
volkerwesselswave.nl: did not receive HSTS header
volkswurst.de: did not receive HSTS header
+vollmondstollen.de: could not connect to host
voltimax.com: did not receive HSTS header
voltotc.com: did not receive HSTS header
voluptueuse.com: did not receive HSTS header
@@ -18722,20 +19873,24 @@ vonavy-cukor.sk: could not connect to host
vonavycukor.sk: could not connect to host
vonedelmann.de: did not receive HSTS header
vongerlach.at: did not receive HSTS header
+vonterra.us: could not connect to host
vooreenveiligthuis.nl: did not receive HSTS header
-voorjou.com: did not receive HSTS header
vorangerie.com: could not connect to host
vorderklier.de: could not connect to host
vorkbaard.nl: did not receive HSTS header
+vorlif.org: did not receive HSTS header
vorte.ga: could not connect to host
vortexhobbies.com: did not receive HSTS header
+vos-fleurs.ch: could not connect to host
+vos-fleurs.com: could not connect to host
vosjesweb.nl: could not connect to host
votercircle.com: did not receive HSTS header
voterstartingpoint.uk: did not receive HSTS header
votewa.gov: could not connect to host
-votre-site-internet.ch: could not connect to host
+votre-site-internet.ch: did not receive HSTS header
votresiteweb.ch: could not connect to host
vow.vn: could not connect to host
+vowsy.club: could not connect to host
vox.vg: did not receive HSTS header
vozami.com: could not connect to host
vpip.net: could not connect to host
@@ -18748,7 +19903,7 @@ vps-szerver-berles.hu: could not connect to host
vpsmojo.com: could not connect to host
vpsvz.cloud: could not connect to host
vqporn.com: could not connect to host
-vranjske.co.rs: could not connect to host
+vranjske.co.rs: did not receive HSTS header
vratny.space: could not connect to host
vriendenvoordeel.com: did not receive HSTS header
vrijstaandhuis-in-alphen-aan-den-rijn-kopen.nl: could not connect to host
@@ -18770,6 +19925,7 @@ vrtouring.org: could not connect to host
vrzl.pro: could not connect to host
vsamsonov.com: could not connect to host
vsc-don-stocksport.de: did not receive HSTS header
+vsestiralnie.com: did not receive HSTS header
vtuber-schedule.info: could not connect to host
vucdn.com: could not connect to host
vulndetect.org: did not receive HSTS header
@@ -18783,8 +19939,7 @@ vww-8522.com: could not connect to host
vxapps.com: could not connect to host
vxml.club: could not connect to host
vxst.org: max-age too low: 2592000
-vxz.me: could not connect to host
-vykup-car.ru: could not connect to host
+vykup-car.ru: did not receive HSTS header
vynedmusic.com: could not connect to host
vyshivanochka.in.ua: could not connect to host
vysvetluju.cz: could not connect to host
@@ -18792,9 +19947,11 @@ vyvybean.cf: could not connect to host
vyvygen.com: did not receive HSTS header
vyzner.cz: could not connect to host
vzk.io: could not connect to host
+w-p-k.de: did not receive HSTS header
w10club.com: could not connect to host
w1221.com: could not connect to host
w2gshop.com.br: could not connect to host
+w3n.org: could not connect to host
w4a.fr: could not connect to host
w4b.in: could not connect to host
w4xzr.top: could not connect to host
@@ -18804,35 +19961,37 @@ w9rld.com: did not receive HSTS header
wabifoggynuts.com: could not connect to host
wachter.biz: could not connect to host
wachtwoordencheck.nl: could not connect to host
-wadvisor.com: could not connect to host
waelti.xxx: could not connect to host
wafa4hw.com: could not connect to host
wafairhaven.com.au: did not receive HSTS header
wafni.com: could not connect to host
+wahhoi.net: could not connect to host
+wahlen-bad-wurzach.de: did not receive HSTS header
wai-in.com: could not connect to host
wai-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
waidu.de: did not receive HSTS header
-wail.net: could not connect to host
+wains.be: did not receive HSTS header
wait.moe: could not connect to host
+waiterwheels.com: did not receive HSTS header
waixingrenfuli7.vip: could not connect to host
-waka-mono.com: could not connect to host
waka168.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
waka168.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
waka88.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
waka88.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+wakandasun.com: did not receive HSTS header
wakapp.de: could not connect to host
wakened.net: did not receive HSTS header
waldkinder-ilmenau.de: did not receive HSTS header
-waligorska.pl: could not connect to host
walkeryoung.ca: could not connect to host
walkingforhealth.org.uk: did not receive HSTS header
wallabag.it: did not receive HSTS header
wallabag.org: did not receive HSTS header
wallacequinn.co.uk: did not receive HSTS header
wallet.google.com: did not receive HSTS header (error ignored - included regardless)
-wallingford.cc: could not connect to host
+wallpapers.pub: could not connect to host
wallsblog.dk: could not connect to host
walnutgaming.co.uk: could not connect to host
+waltellis.com: could not connect to host
walterlynnmosley.com: did not receive HSTS header
wanashi.com: could not connect to host
wanban.io: could not connect to host
@@ -18842,16 +20001,14 @@ wanda79.com: could not connect to host
wanda96.com: could not connect to host
wanda97.com: could not connect to host
wanda98.com: could not connect to host
-wandercue.com: could not connect to host
+wandercue.com: did not receive HSTS header
wangjiatun.com.tw: could not connect to host
-wangjun.me: did not receive HSTS header
wangkezun.com: could not connect to host
wangler-internet.de: did not receive HSTS header
-wangqiliang.org: could not connect to host
wangqiliang.xn--fiqs8s: could not connect to host
wangql.cn: could not connect to host
-wanquanojbk.com: did not receive HSTS header
wantshow.com.br: did not receive HSTS header
+wanvi.net: could not connect to host
wanybug.cn: did not receive HSTS header
wapgu.cc: could not connect to host
wapjt.cn: could not connect to host
@@ -18863,14 +20020,12 @@ wardsegers.be: did not receive HSTS header
warehost.de: did not receive HSTS header
warekon.com: could not connect to host
warekon.dk: could not connect to host
-warezaddict.com: could not connect to host
+warezaddict.com: did not receive HSTS header
warhistoryonline.com: did not receive HSTS header
warlions.info: could not connect to host
warmestwishes.ca: could not connect to host
+warmservers.com: could not connect to host
warnings.xyz: could not connect to host
-warp-radio.com: could not connect to host
-warp-radio.net: could not connect to host
-warp-radio.tv: could not connect to host
warped.com: did not receive HSTS header
warren.sh: could not connect to host
warrencreative.com: did not receive HSTS header
@@ -18881,22 +20036,23 @@ wasatchcrest.com: did not receive HSTS header
washandfun.com: did not receive HSTS header
wassim.is: did not receive HSTS header
watashi.bid: could not connect to host
+watchcom.org.za: did not receive HSTS header
watchium.com: did not receive HSTS header
+watchpci.com: did not receive HSTS header
watchtv-online.pw: could not connect to host
watchweasel.com: could not connect to host
waterfedpole.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
waterforlife.net.au: did not receive HSTS header
waterpoint.com.br: could not connect to host
watersportmarkt.net: did not receive HSTS header
-watertrails.io: could not connect to host
watsonhall.uk: could not connect to host
wattechweb.com: did not receive HSTS header
+waukeect.com: could not connect to host
wave-ola.es: did not receive HSTS header
wavefloatrooms.com: did not receive HSTS header
wavefrontsystemstech.com: could not connect to host
wavesoftime.com: could not connect to host
waxlrs.com: could not connect to host
-wayfairertravel.com: did not receive HSTS header
waylaydesign.com: did not receive HSTS header
waylee.net: did not receive HSTS header
wbit.co.il: did not receive HSTS header
@@ -18907,9 +20063,11 @@ wdesk.com: did not receive HSTS header
wdrl.info: did not receive HSTS header
wdt.io: could not connect to host
we.serveftp.net: could not connect to host
+wealthcentral.com.au: did not receive HSTS header
wealthformyhealth.com: did not receive HSTS header
wear2work.nl: could not connect to host
wearedisneyland.com: did not receive HSTS header
+wearehackerone.com: could not connect to host
weareincognito.org: could not connect to host
wearewithyou.org: could not connect to host
weather-and-climate.com: did not receive HSTS header
@@ -18917,35 +20075,39 @@ weaverhairextensions.nl: could not connect to host
web-adminy.co.uk: could not connect to host
web-advisor.co.uk: could not connect to host
web-demarche.com: could not connect to host
-web-dl.cc: did not receive HSTS header
web-industry.fr: could not connect to host
web-insider.net: did not receive HSTS header
web-thinker.ru: could not connect to host
web-vision.de: did not receive HSTS header
+web1n.com: did not receive HSTS header
web4all.fr: did not receive HSTS header
web4pro.fr: could not connect to host
+webambacht.nl: could not connect to host
webandwords.com.au: could not connect to host
webanker.sh: did not receive HSTS header
webapky.cz: could not connect to host
webapps.directory: could not connect to host
webart-factory.de: could not connect to host
webassadors.com: could not connect to host
-webauthority.co.uk: did not receive HSTS header
+webauthority.co.uk: could not connect to host
webbuzz.com.au: did not receive HSTS header
webbx.se: did not receive HSTS header
webchat.domains: did not receive HSTS header
webcreation.rocks: could not connect to host
webdeflect.com: did not receive HSTS header
webdesign-kronberg.de: did not receive HSTS header
+webdesigneauclaire.com: could not connect to host
webdesignssussex.co.uk: could not connect to host
webdev-quiz.de: did not receive HSTS header
webdev.mobi: could not connect to host
+webdevxp.com: could not connect to host
webdollarvpn.io: could not connect to host
webdosh.com: did not receive HSTS header
+webeau.com: could not connect to host
webeconomia.it: did not receive HSTS header
+webeditors.com: did not receive HSTS header
webelement.sk: did not receive HSTS header
weberjulia.com: could not connect to host
-webfox.com.br: did not receive HSTS header
webfronten.dk: did not receive HSTS header
webgaff.com: could not connect to host
webgap.me: did not receive HSTS header
@@ -18961,10 +20123,11 @@ webm.to: could not connect to host
webmail.mayfirst.org: did not receive HSTS header
webmaniabr.com: did not receive HSTS header
webmarketingfestival.it: did not receive HSTS header
+webmax.com.tr: did not receive HSTS header
webmel.com: did not receive HSTS header
webmixseo.com: did not receive HSTS header
webnetmail4u.com: could not connect to host
-webneuch.ch: could not connect to host
+webneuch.ch: did not receive HSTS header
webneuch.com: did not receive HSTS header
webneuch.eu: did not receive HSTS header
webneuch.fr: did not receive HSTS header
@@ -18973,7 +20136,6 @@ webneuch.swiss: did not receive HSTS header
webninja.work: could not connect to host
webnoob.net: could not connect to host
webnosql.com: could not connect to host
-webogram.org: could not connect to host
webperformance.ru: did not receive HSTS header
webproshosting.tk: could not connect to host
webproxy.pw: could not connect to host
@@ -18997,6 +20159,7 @@ webthings.com.br: could not connect to host
webtiles.co.uk: could not connect to host
webuni.hu: did not receive HSTS header
webveloper.com: did not receive HSTS header
+webvisum.de: did not receive HSTS header
webwolf.co.za: could not connect to host
webwork.pw: did not receive HSTS header
webypass.xyz: could not connect to host
@@ -19006,7 +20169,6 @@ wecanfindit.co.za: could not connect to host
wecanvisit.com: could not connect to host
wedding-m.jp: did not receive HSTS header
weddingalbumsdesign.com: max-age too low: 2592000
-weddingenvelopes.co.uk: did not receive HSTS header
weddingfantasy.ru: could not connect to host
weddingibiza.nl: could not connect to host
wedotrains.club: could not connect to host
@@ -19014,6 +20176,8 @@ weebsr.us: could not connect to host
weed.ren: could not connect to host
weedcircles.com: did not receive HSTS header
weedlandia.org: could not connect to host
+weednews.co: did not receive HSTS header
+week.report: could not connect to host
weekly.fyi: could not connect to host
wegenaer.nl: could not connect to host
wegethitched.co.uk: could not connect to host
@@ -19021,17 +20185,18 @@ weggeweest.nl: could not connect to host
wegner.no: could not connect to host
weicn.org: did not receive HSTS header
weightreviews.com: could not connect to host
-weiji.ga: could not connect to host
+weiji.ga: did not receive HSTS header
weiler.xyz: could not connect to host
weimaraner.com.br: could not connect to host
weinhandel-preissler.de: could not connect to host
weirdserver.com: could not connect to host
-weixiaojun.org: did not receive HSTS header
+weixiaojun.org: could not connect to host
weizenke.im: could not connect to host
-wejumall.com: could not connect to host
+wejumall.com: did not receive HSTS header
wekibe.de: could not connect to host
welby.cat: did not receive HSTS header
welches-kinderfahrrad.de: could not connect to host
+welcome-tahiti.com: did not receive HSTS header
welcomehelp.de: could not connect to host
welkers.org: could not connect to host
wellastore.ru: could not connect to host
@@ -19061,16 +20226,18 @@ wenode.net: did not receive HSTS header
wenta-computerservice.net: could not connect to host
wentu.ml: could not connect to host
wenz.io: did not receive HSTS header
-wer.sh: could not connect to host
+wer.sh: did not receive HSTS header
werdeeintimo.de: could not connect to host
wereldplanner.nl: could not connect to host
werhatunsverraten.eu: could not connect to host
werken-bij-inwork.nl: could not connect to host
werkenbijkfc.nl: did not receive HSTS header
-werkplaatsoost.nl: did not receive HSTS header
+werkplaatsoost.nl: could not connect to host
werkruimtebottendaal.nl: could not connect to host
werkz.io: could not connect to host
-wes-dev.com: did not receive HSTS header
+werner-schaeffer.de: did not receive HSTS header
+wernerschaeffer.de: did not receive HSTS header
+wes-dev.com: could not connect to host
wesayyesprogram.com: could not connect to host
wesleyharris.ca: did not receive HSTS header
wespeakgeek.co.za: could not connect to host
@@ -19096,7 +20263,7 @@ wevolver.com: did not receive HSTS header
wewillgo.com: could not connect to host
wewillgo.org: did not receive HSTS header
wewlad.me: could not connect to host
-weyland.tech: did not receive HSTS header
+weyland.tech: could not connect to host
weynaphotography.com: did not receive HSTS header
wf-training-master.appspot.com: did not receive HSTS header (error ignored - included regardless)
wfl.ro: did not receive HSTS header
@@ -19109,6 +20276,8 @@ whats.io: could not connect to host
whatsstalk.me: could not connect to host
whatsupdeco.com: did not receive HSTS header
whatsyouroffer.co.uk: did not receive HSTS header
+wheatgra.in: could not connect to host
+wheelwide.co.uk: could not connect to host
wheelwright.org: did not receive HSTS header
when-release.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
when-release.ru: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -19116,6 +20285,7 @@ whereisjason.com: could not connect to host
whereismyorigin.cf: could not connect to host
wherephoto.com: did not receive HSTS header
wheresben.today: could not connect to host
+whexit.nl: could not connect to host
whilsttraveling.com: could not connect to host
whimtrip.fr: could not connect to host
whisker.network: could not connect to host
@@ -19125,14 +20295,14 @@ whiterabbit.org: did not receive HSTS header
whiterabbitcakery.com: could not connect to host
whiteready.it: did not receive HSTS header
whiteroom.agency: did not receive HSTS header
-whiterose.goip.de: could not connect to host
whitestagforge.com: did not receive HSTS header
whoasome.com: could not connect to host
whoclicks.net: could not connect to host
-whoisamitsingh.com: could not connect to host
+whoisamitsingh.com: did not receive HSTS header
whoisapi.online: could not connect to host
whoiscuter.ml: could not connect to host
whoiscutest.ml: could not connect to host
+whoisdhh.com: could not connect to host
wholebites.com: max-age too low: 7889238
wholelotofbounce.co.uk: did not receive HSTS header
wholikes.us: did not receive HSTS header
@@ -19144,7 +20314,6 @@ wiapply.com: could not connect to host
wibruje.pl: did not receive HSTS header
wibuw.com: could not connect to host
widdleguy.com: did not receive HSTS header
-wideinfo.org: did not receive HSTS header
widenews.org: did not receive HSTS header
wienerwichtelchallenge.at: did not receive HSTS header
wieninternational.at: did not receive HSTS header
@@ -19159,28 +20328,29 @@ wikisports.eu: did not receive HSTS header
wild-emotion-events.de: could not connect to host
wildbee.org: could not connect to host
wildbirds.dk: did not receive HSTS header
+wildboaratvparts.com: did not receive HSTS header
wildcard.hu: could not connect to host
wilddog.com: did not receive HSTS header
wilf1rst.com: could not connect to host
-wilfrid-calixte.fr: could not connect to host
wilhelm-nathan.de: could not connect to host
willcipriano.com: could not connect to host
willeminfo.ch: did not receive HSTS header
willemsjort.be: did not receive HSTS header
william.gg: did not receive HSTS header
-william.si: could not connect to host
+william.si: did not receive HSTS header
williamboundsltd.com: could not connect to host
williamsapiens.com: could not connect to host
williamsflintlocks.com: did not receive HSTS header
williamtm.design: could not connect to host
willkommen-fuerstenberg.de: did not receive HSTS header
willosagiede.com: did not receive HSTS header
+willywangstory.org: could not connect to host
wilsonovi.com: could not connect to host
wilsonvilleoregon.gov: could not connect to host
winaes.com: did not receive HSTS header
winclient.cn: could not connect to host
wind.moe: could not connect to host
-windholz.us: could not connect to host
+windholz.us: did not receive HSTS header
windows10insider.com: did not receive HSTS header
windowsforum.com: did not receive HSTS header
windowstech.it: did not receive HSTS header
@@ -19205,12 +20375,13 @@ winportal.cz: could not connect to host
winsec.nl: could not connect to host
winshiplending.com: could not connect to host
winsufi.biz: could not connect to host
+winter.engineering: could not connect to host
wintercircle.co: max-age too low: 60
wipc.net: did not receive HSTS header
wipply.com: could not connect to host
wirbatz.org: did not receive HSTS header
wirc.gr: could not connect to host
-wiredcut.com: could not connect to host
+wiredcut.com: did not receive HSTS header
wireless-emergency-stop.com: did not receive HSTS header
wirelesswatch.com.au: could not connect to host
wiretrip.io: could not connect to host
@@ -19235,7 +20406,8 @@ wittepapaver.nl: did not receive HSTS header
witting.co: could not connect to host
wittydonut.com: could not connect to host
witzemaschine.com: max-age too low: 0
-wixguide.co: did not receive HSTS header
+wixguide.co: could not connect to host
+wiz.farm: could not connect to host
wizardmeow.xin: could not connect to host
wizardspire.com: did not receive HSTS header
wizznab.tk: could not connect to host
@@ -19243,9 +20415,8 @@ wk-cpm.com: could not connect to host
wk577.com: could not connect to host
wlzhiyin.cn: could not connect to host
wmawri.com: did not receive HSTS header
-wmcuk.net: did not receive HSTS header
+wmcuk.net: could not connect to host
wmfinanz.com: could not connect to host
-wmnrj.com: did not receive HSTS header
wmoda.com.br: could not connect to host
wmustore.com: did not receive HSTS header
wnmed.com.au: did not receive HSTS header
@@ -19254,13 +20425,12 @@ wnnc.co.uk: could not connect to host
woaiuhd.com: could not connect to host
wobblylang.org: could not connect to host
wochenentwicklung.com: did not receive HSTS header
-wochennummern.de: could not connect to host
wod-stavby.cz: could not connect to host
wodboss.com: could not connect to host
wodice.com: could not connect to host
wohnungsbau-ludwigsburg.de: did not receive HSTS header
woi.vision: could not connect to host
-woima.fi: max-age too low: 604800
+woima.fi: did not receive HSTS header
wokeai.net: did not receive HSTS header
woktoss.com: could not connect to host
wolfemg.com: could not connect to host
@@ -19269,28 +20439,26 @@ wolfesden.com: could not connect to host
wolfram.io: could not connect to host
wolkenspeicher.org: could not connect to host
wollekorb.de: could not connect to host
-womb.city: could not connect to host
womf.org: did not receive HSTS header
womosale.de: could not connect to host
-wonabo.com: could not connect to host
wonderbooks.club: could not connect to host
wonderfall.xyz: could not connect to host
wonderhost.info: could not connect to host
wondershift.biz: did not receive HSTS header
wondy.com: could not connect to host
+woodenson.com: did not receive HSTS header
woodlandschurch.net: max-age too low: 43200
woodmafia.com.au: could not connect to host
woodworkertip.com: could not connect to host
+woofsbakery.com: could not connect to host
woomai.net: could not connect to host
woomu.me: could not connect to host
-wooplagaming.com: could not connect to host
woording.com: could not connect to host
wootton95.com: could not connect to host
wooviet.com: could not connect to host
wopen.org: could not connect to host
wordbits.net: did not receive HSTS header
wordlessecho.com: did not receive HSTS header
-wordplay.one: could not connect to host
wordpress-test.site: could not connect to host
wordpresspro.cl: could not connect to host
wordsofamaster.com: could not connect to host
@@ -19306,6 +20474,7 @@ workwithgo.com: could not connect to host
world-education-association.org: could not connect to host
worldchess.london: could not connect to host
worldcrafts.org: did not receive HSTS header
+worldeventscalendars.com: could not connect to host
worldfree4.org: did not receive HSTS header
worldlist.org: could not connect to host
worldofterra.net: could not connect to host
@@ -19315,10 +20484,7 @@ worldwhisperer.net: could not connect to host
wormdisk.net: could not connect to host
wormholevpn.net: could not connect to host
worshapp.com: did not receive HSTS header
-woti.dedyn.io: could not connect to host
-wow-foederation.de: could not connect to host
wow-travel.eu: could not connect to host
-wow202y5.com: did not receive HSTS header
wowapi.org: could not connect to host
wowhelp.it: could not connect to host
wowinvasion.com: did not receive HSTS header
@@ -19326,16 +20492,17 @@ wp-bullet.com: did not receive HSTS header
wp-fastsearch.de: could not connect to host
wp-rescue.com.au: could not connect to host
wp-stack.pro: could not connect to host
-wp6.pw: could not connect to host
+wp6.pw: did not receive HSTS header
wpblog.com.tw: could not connect to host
wpcarer.pro: could not connect to host
+wpcdn.bid: did not receive HSTS header
wpcheck.io: could not connect to host
wpcontrol.se: could not connect to host
wpdesigner.ir: did not receive HSTS header
wpdublin.com: could not connect to host
wpexplainer.com: did not receive HSTS header
wpfast.net: could not connect to host
-wpfortify.com: could not connect to host
+wpfortify.com: did not receive HSTS header
wpg-inc.com: did not receive HSTS header
wphelpwithhomework.tk: could not connect to host
wphome.org: could not connect to host
@@ -19345,6 +20512,7 @@ wplatin.com: could not connect to host
wpmetadatastandardsproject.org: could not connect to host
wprevs.com: did not receive HSTS header
wpruby.com: did not receive HSTS header
+wpsono.com: could not connect to host
wpspeed.nl: did not receive HSTS header
wpunpacked.com: could not connect to host
wpyecom.es: did not receive HSTS header
@@ -19376,7 +20544,7 @@ wubify.com: did not receive HSTS header
wubocong.com: did not receive HSTS header
wubthecaptain.eu: could not connect to host
wuchipc.com: could not connect to host
-wufu.org: did not receive HSTS header
+wufu.org: could not connect to host
wufupay.com: could not connect to host
wuhengmin.com: could not connect to host
wulpi.it: did not receive HSTS header
@@ -19388,6 +20556,7 @@ wumbo.kiwi: could not connect to host
wumbo.ml: could not connect to host
wumbo.tk: could not connect to host
wundtherapie-schulung.de: could not connect to host
+wuppertal-2018.de: could not connect to host
wurzelzwerg.net: could not connect to host
wusx.club: could not connect to host
wutianxian.com: could not connect to host
@@ -19396,6 +20565,7 @@ wvv-8522.com: could not connect to host
wvw-8522.com: could not connect to host
wvw698.com: max-age too low: 2592000
wwbsb.xyz: could not connect to host
+wwjd.dynu.net: could not connect to host
wwv-8522.com: could not connect to host
www-001133.com: could not connect to host
www-0385.com: could not connect to host
@@ -19405,11 +20575,12 @@ www-38978.com: could not connect to host
www-39988.com: did not receive HSTS header
www-507.net: could not connect to host
www-62755.com: could not connect to host
-www-66136.com: did not receive HSTS header
+www-66136.com: could not connect to host
www-746.com: could not connect to host
www-7570.com: did not receive HSTS header
www-771122.com: did not receive HSTS header
www-8003.com: did not receive HSTS header
+www-80036.com: could not connect to host
www-88599.com: did not receive HSTS header
www-8887999.com: could not connect to host
www-9649.com: did not receive HSTS header
@@ -19426,7 +20597,6 @@ www.gmail.com: did not receive HSTS header (error ignored - included regardless)
www.googlemail.com: did not receive HSTS header (error ignored - included regardless)
www.gpo.gov: did not receive HSTS header
www.greplin.com: could not connect to host
-www.intercom.io: did not receive HSTS header
www.jitsi.org: did not receive HSTS header
www.ledgerscope.net: could not connect to host
www.logentries.com: did not receive HSTS header
@@ -19442,22 +20612,23 @@ www.zenpayroll.com: did not receive HSTS header
www3.info: could not connect to host
www68277.com: could not connect to host
wwww.is: could not connect to host
-wwww.me.uk: did not receive HSTS header
+wwww.me.uk: could not connect to host
+wxkxsw.com: could not connect to host
wxrlab.com: could not connect to host
+wxster.com: did not receive HSTS header
wxukang.cn: could not connect to host
wxyz.buzz: could not connect to host
wy6.org: did not receive HSTS header
wybmabiity.com: could not connect to host
wygluszanie.eu: could not connect to host
wyu.cc: could not connect to host
-wyzphoto.nl: did not receive HSTS header
wyzwaniemilosci.com: could not connect to host
wzfetish.com.br: could not connect to host
-wzrd.in: did not receive HSTS header
x-pertservice.com: did not receive HSTS header
x-power-detox.com: could not connect to host
x-ripped-hd.com: could not connect to host
-x1be.win: did not receive HSTS header
+x1616.tk: could not connect to host
+x1be.win: could not connect to host
x23.eu: did not receive HSTS header
x2c0.net: did not receive HSTS header
x2w.io: could not connect to host
@@ -19471,9 +20642,30 @@ xandocs.com: could not connect to host
xat.re: did not receive HSTS header
xavier.is: could not connect to host
xavierbarroso.com: did not receive HSTS header
-xbc.nz: could not connect to host
+xawen.net: did not receive HSTS header
+xb6638.com: max-age too low: 2592000
+xb6673.com: max-age too low: 2592000
+xb851.com: max-age too low: 2592000
+xb862.com: max-age too low: 2592000
+xb913.com: max-age too low: 2592000
+xb917.com: max-age too low: 2592000
+xb925.com: max-age too low: 2592000
+xb927.com: max-age too low: 2592000
+xb965.com: max-age too low: 2592000
+xb983.com: max-age too low: 2592000
xbertschy.com: did not receive HSTS header
xbind.io: could not connect to host
+xbyl15.com: did not receive HSTS header
+xbyl16.com: did not receive HSTS header
+xbyl21.com: did not receive HSTS header
+xbyl23.com: did not receive HSTS header
+xbyl26.com: did not receive HSTS header
+xbyl39.com: did not receive HSTS header
+xbyl63.com: did not receive HSTS header
+xbyl71.com: did not receive HSTS header
+xbyl78.com: did not receive HSTS header
+xbyl82.com: did not receive HSTS header
+xbyl91.com: did not receive HSTS header
xchangeinfo.com: could not connect to host
xchating.com: could not connect to host
xcler8.com: could not connect to host
@@ -19481,7 +20673,10 @@ xcompany.one: could not connect to host
xcoop.me: did not receive HSTS header
xd.fi: did not receive HSTS header
xd.gov: did not receive HSTS header
+xdawn.cn: could not connect to host
xdd.io: could not connect to host
+xecure.zone: could not connect to host
+xecureit.com: could not connect to host
xehoivn.vn: could not connect to host
xellos.ga: could not connect to host
xellos.ml: could not connect to host
@@ -19491,30 +20686,30 @@ xeonlab.com: could not connect to host
xeonlab.de: could not connect to host
xett.com: did not receive HSTS header
xfive.de: could not connect to host
-xfrag-networks.com: did not receive HSTS header
xg3n1us.de: did not receive HSTS header
xgusto.com: did not receive HSTS header
xhadius.de: could not connect to host
-xia100.xyz: could not connect to host
-xiangqiushi.com: did not receive HSTS header
+xiangqiushi.com: could not connect to host
xianguocy.com: could not connect to host
-xiaobude.cn: did not receive HSTS header
xiaody.me: could not connect to host
xiaofengsky.com: did not receive HSTS header
xiaolan.me: could not connect to host
xiaolvmu.com: could not connect to host
xiaolvmu.me: could not connect to host
+xiaoniaoyou.com: could not connect to host
xiaoxiao.im: could not connect to host
xiaxuejin.cn: could not connect to host
xiazhanjian.com: did not receive HSTS header
xice.cf: could not connect to host
xilegames.com: could not connect to host
+xiliant.com: did not receive HSTS header
ximage.me: could not connect to host
ximens.me: could not connect to host
xin-in.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
xin-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
xinbiji.cn: could not connect to host
-xinbo270.com: could not connect to host
+xinbo270.com: max-age too low: 2592000
+xinbo676.com: did not receive HSTS header
xinex.cz: did not receive HSTS header
xing-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
xing.ml: could not connect to host
@@ -19523,20 +20718,25 @@ xingiahanvisa.net: did not receive HSTS header
xinnixwebshop.be: did not receive HSTS header
xinplay.net: max-age too low: 0
xinsane.com: could not connect to host
-xiqi.us: did not receive HSTS header
+xiongx.cn: did not receive HSTS header
+xiqi.us: could not connect to host
xirion.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
xisa.it: could not connect to host
xivpn.com: could not connect to host
+xiwu.li: could not connect to host
xiyu.it: did not receive HSTS header
xiyu.moe: did not receive HSTS header
xj8876.com: max-age too low: 2592000
+xjoin.de: did not receive HSTS header
xlaff.com: did not receive HSTS header
xlboo.com: did not receive HSTS header
xlfblog.com: did not receive HSTS header
xlinar.com: could not connect to host
xlui.me: did not receive HSTS header
-xmerak.com: did not receive HSTS header
+xmerak.com: could not connect to host
+xmine128.tk: could not connect to host
xmiui.com: could not connect to host
+xmlogin288.com: did not receive HSTS header
xmonk.org: did not receive HSTS header
xmr.my: could not connect to host
xn-----8kcgbo2bmdgkdacthvjf.xn--p1ai: could not connect to host
@@ -19562,10 +20762,11 @@ xn--80ablh1c.online: could not connect to host
xn--80ac0aqlt.xn--p1ai: could not connect to host
xn--80aocgsfei.xn--p1ai: could not connect to host
xn--88j2fy28hbxmnnf9zlw5buzd.com: did not receive HSTS header
-xn--8dry00a7se89ay98epsgxxq.com: did not receive HSTS header
+xn--8dry00a7se89ay98epsgxxq.com: could not connect to host
xn--8mr166hf6s.xn--fiqs8s: could not connect to host
xn--98jm6m.jp: could not connect to host
xn--9pr52k0p5a.com: did not receive HSTS header
+xn--baron-bonzenbru-elb.com: did not receive HSTS header
xn--bstlinser-v2a.com: could not connect to host
xn--c5w27q.ml: could not connect to host
xn--cckvb1cwa0c5br5e2d2711k.net: could not connect to host
@@ -19581,7 +20782,6 @@ xn--e--k83a5h244w54gttk.xyz: could not connect to host
xn--eckle6c0exa0b0modc7054g7h8ajw6f.com: did not receive HSTS header
xn--ehq13kgw4e.ml: could not connect to host
xn--ekr87w7se89ay98ezcs.biz: did not receive HSTS header
-xn--gfrrli-yxa.ch: could not connect to host
xn--gmq92k.nagoya: could not connect to host
xn--grnderlehrstuhl-0vb.de: could not connect to host
xn--hfk-allgu-schwaben-stb.de: could not connect to host
@@ -19597,15 +20797,15 @@ xn--lgb3a8bcpn.gq: could not connect to host
xn--lgb3a8bcpn.ml: could not connect to host
xn--lna-2000-9za.nu: could not connect to host
xn--lna-4000-9za.nu: could not connect to host
-xn--lnakuten-9za.com: max-age too low: 10368000
+xn--lnakuten-9za.com: did not receive HSTS header
xn--ls8hi7a.tk: could not connect to host
xn--maraa-rta.org: could not connect to host
xn--mensenges-o1a8c.gq: could not connect to host
-xn--mhringen-65a.de: did not receive HSTS header
xn--mhsv04avtt1xi.com: could not connect to host
xn--milchaufschumer-test-lzb.de: could not connect to host
xn--n8jubz39q0g0afpa985c.com: could not connect to host
xn--neb-tma3u8u.xyz: could not connect to host
+xn--nf1a578axkh.xn--fiqs8s: did not receive HSTS header
xn--o77hka.ga: could not connect to host
xn--oiqt18e8e2a.eu.org: could not connect to host
xn--p8jskj.jp: could not connect to host
@@ -19617,8 +20817,10 @@ xn--qfun83b.ga: could not connect to host
xn--r77hya.ga: could not connect to host
xn--rt-cja.eu: could not connect to host
xn--sdkwa9azd389v01ya.com: could not connect to host
+xn--seelenwchter-mcb.eu: did not receive HSTS header
xn--srenpind-54a.dk: could not connect to host
xn--t8j2a3042d.xyz: could not connect to host
+xn--t8j4aa4nyhxa7duezbl49aqg5546e264d.net: did not receive HSTS header
xn--tda.ml: could not connect to host
xn--thorme-6uaf.ca: could not connect to host
xn--trdler-xxa.xyz: could not connect to host
@@ -19639,7 +20841,12 @@ xn--y8j5gq14rbdd.net: did not receive HSTS header
xn--yj8h0m.ws: could not connect to host
xn--ykrp42k.com: could not connect to host
xn--yoamomisuasbcn-ynb.com: could not connect to host
+xn--yrvp1ac68c.xn--6qq986b3xl: could not connect to host
xn--zck9a4b352yuua.jp: did not receive HSTS header
+xn--zr9h.cf: could not connect to host
+xn--zr9h.ga: could not connect to host
+xn--zr9h.ml: could not connect to host
+xn--zr9h.tk: could not connect to host
xng.io: did not receive HSTS header
xnode.org: could not connect to host
xobox.me: could not connect to host
@@ -19647,7 +20854,7 @@ xoda.pw: could not connect to host
xoffy.com: did not receive HSTS header
xom.party: could not connect to host
xombra.com: could not connect to host
-xoonth.net: could not connect to host
+xoonth.net: did not receive HSTS header
xor-a.net: could not connect to host
xotika.tv: could not connect to host
xpbytes.com: did not receive HSTS header
@@ -19658,9 +20865,10 @@ xpj.bet: did not receive HSTS header
xpj.sx: could not connect to host
xpjcunkuan.com: could not connect to host
xplore-dna.net: could not connect to host
+xposedornot.com: did not receive HSTS header
xpressprint.com.br: max-age too low: 90
-xps2pdf.co.uk: could not connect to host
-xps2pdf.info: could not connect to host
+xps2pdf.co.uk: did not receive HSTS header
+xps2pdf.info: did not receive HSTS header
xpwn.cz: did not receive HSTS header
xq55.com: did not receive HSTS header
xqin.net: could not connect to host
@@ -19683,17 +20891,18 @@ xtrim.ru: did not receive HSTS header
xtzone.be: could not connect to host
xuan-li88.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
xuan-li88.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
-xuanmeishe.top: could not connect to host
+xuanmeishe.top: did not receive HSTS header
xuexb.com: did not receive HSTS header
xujan.com: could not connect to host
xuntaosms.com: could not connect to host
xupeng.me: did not receive HSTS header
+xvii.pl: could not connect to host
xxbase.com: could not connect to host
xxx3dbdsm.com: could not connect to host
xxxladyboysporn.com: could not connect to host
xxxred.net: could not connect to host
xy1919.com: could not connect to host
-xyndrac.net: max-age too low: 2592000
+xy7171.com: could not connect to host
xynex.us: could not connect to host
xyngular-health.com: did not receive HSTS header
xynta.ch: could not connect to host
@@ -19714,6 +20923,7 @@ yalla.jp: did not receive HSTS header
yamamo10.com: could not connect to host
yameveo.com: did not receive HSTS header
yannikhenke.de: could not connect to host
+yannis.codes: did not receive HSTS header
yanwh.xyz: did not receive HSTS header
yao-in.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
yao-in.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
@@ -19729,13 +20939,16 @@ yasutomonodokoiko.com: did not receive HSTS header
yaucy.win: could not connect to host
yawen.tw: did not receive HSTS header
yawnbox.com: did not receive HSTS header
+yaxim.org: could not connect to host
yayart.club: could not connect to host
+yayoba.com: did not receive HSTS header
yazaral.com: did not receive HSTS header
ybscareers.co.uk: did not receive HSTS header
-ybt520.com: did not receive HSTS header
+ybt520.com: could not connect to host
ycaaz.com: did not receive HSTS header
ycc.wtf: could not connect to host
ycm2.wtf: could not connect to host
+yd.io: could not connect to host
ydy.jp: could not connect to host
yello.website: could not connect to host
yellowcar.website: could not connect to host
@@ -19752,7 +20965,6 @@ yepbitcoin.com: could not connect to host
yesdevnull.net: did not receive HSTS header
yesfone.com.br: could not connect to host
yeshu.org: could not connect to host
-yesiammaisey.me: could not connect to host
yestees.com: did not receive HSTS header
yetcore.io: could not connect to host
yetishirt.com: could not connect to host
@@ -19760,6 +20972,12 @@ yffengshi.ml: could not connect to host
ygcdyf.com: did not receive HSTS header
yggdar.ga: could not connect to host
yh35.net: could not connect to host
+yh56787.com: could not connect to host
+yh64678.com: could not connect to host
+yh66656.com: could not connect to host
+yh66689.com: could not connect to host
+yh811.com: could not connect to host
+yh88890.com: could not connect to host
yhori.xyz: could not connect to host
yhwj.top: could not connect to host
yibaoweilong.top: could not connect to host
@@ -19777,24 +20995,26 @@ yingsuo.ltd: could not connect to host
yingyj.com: did not receive HSTS header
yinhe12.net: did not receive HSTS header
yipingguo.com: could not connect to host
-yippie.nl: could not connect to host
+yippie.nl: did not receive HSTS header
yizhu.com: could not connect to host
+yjsoft.me: could not connect to host
yjsw.sh.cn: could not connect to host
ylilauta.org: could not connect to host
ylk.io: could not connect to host
ylwz.cc: did not receive HSTS header
+ymblaw.com: did not receive HSTS header
+ynnovasport.be: could not connect to host
ynode.co: did not receive HSTS header
ynsn.nl: could not connect to host
yntongji.com: could not connect to host
ynxfh.cn: did not receive HSTS header
yob.vn: could not connect to host
-yobai28.com: did not receive HSTS header
yobst.tk: could not connect to host
yocchan1513.net: did not receive HSTS header
yoga-prive.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
yoga.is-an-engineer.com: could not connect to host
+yogabhawnamission.com: could not connect to host
yogatrainingrishikesh.com: could not connect to host
-yogeshbeniwal.com: did not receive HSTS header
yogoeasy.com: did not receive HSTS header
yohanesmario.com: did not receive HSTS header
yoiyado.info: did not receive HSTS header
@@ -19808,24 +21028,26 @@ yomepre.com: could not connect to host
yopers.com: did not receive HSTS header
yorkshireterrier.com.br: could not connect to host
yoru.me: could not connect to host
+yosemo.de: did not receive HSTS header
yosheenetwork.fr: could not connect to host
yotilab.com: could not connect to host
yotilabs.com: could not connect to host
-youcaitian.com: could not connect to host
+youcaitian.com: did not receive HSTS header
youcancraft.de: could not connect to host
youcontrol.ru: could not connect to host
youdowell.com: did not receive HSTS header
youfencun.com: did not receive HSTS header
youftp.tk: could not connect to host
yougot.pw: could not connect to host
+youhs.top: did not receive HSTS header
youjizz.bz: could not connect to host
youlend.com: did not receive HSTS header
-youlog.net: could not connect to host
-youmiracle.com: could not connect to host
+youlog.net: did not receive HSTS header
youmonit.me: could not connect to host
youngandunited.nl: did not receive HSTS header
younl.net: could not connect to host
youon.tokyo: did not receive HSTS header
+your-idc.tk: could not connect to host
yourbapp.ch: could not connect to host
yourfriendlytech.com: could not connect to host
yourgadget.ro: could not connect to host
@@ -19846,12 +21068,12 @@ youth2009.org: max-age too low: 2592000
youtube: could not connect to host
youtubeviews.ml: could not connect to host
youwatchporn.com: could not connect to host
-youyoulemon.com: could not connect to host
ypcs.fi: did not receive HSTS header
ypiresia.fr: could not connect to host
yryz.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
yspeo.biz: did not receive HSTS header
yspeo.com: max-age too low: 2592000
+ysun.xyz: could not connect to host
ysx.me.uk: did not receive HSTS header
ytb.zone: did not receive HSTS header
ytbmp3.com: did not receive HSTS header
@@ -19865,12 +21087,13 @@ yuanbenlian.com: did not receive HSTS header
yuanjiazhao.tk: could not connect to host
yudan.com.br: could not connect to host
yude.ml: could not connect to host
-yue2.net: could not connect to host
yuema.net.cn: could not connect to host
yufan.me: did not receive HSTS header
+yugasun.com: could not connect to host
yugege.cf: could not connect to host
yuhen.ru: did not receive HSTS header
yui.cat: did not receive HSTS header
+yuisyo.ml: did not receive HSTS header
yuka.one: could not connect to host
yuki-portfolio.com: did not receive HSTS header
yukijinji.moe: did not receive HSTS header
@@ -19896,8 +21119,11 @@ yuqi.me: could not connect to host
yurinet.org: could not connect to host
yuriykuzmin.com: did not receive HSTS header
yutabon.com: could not connect to host
+yutang.vn: did not receive HSTS header
yutaron.tokyo: did not receive HSTS header
+yutuo.net: did not receive HSTS header
yuushou.com: could not connect to host
+yuuta.moe: did not receive HSTS header
yux.fr: could not connect to host
yux.io: did not receive HSTS header
yuxingxin.com: did not receive HSTS header
@@ -19905,12 +21131,13 @@ yuzu.tk: did not receive HSTS header
yvetteerasmus.com: max-age too low: 0
ywei.org: could not connect to host
ywyz.tech: could not connect to host
-yxs.me: could not connect to host
-yxt521.com: did not receive HSTS header
yya.bid: did not receive HSTS header
yya.men: could not connect to host
yyrss.com: could not connect to host
+yyy116.com: could not connect to host
+yyy608.com: could not connect to host
z-coder.com: could not connect to host
+z-konzept-nutrition.ru: could not connect to host
z-to-a.com: did not receive HSTS header
z0rro.net: could not connect to host
z33.ch: did not receive HSTS header
@@ -19919,34 +21146,33 @@ z3liff.com: could not connect to host
z3liff.net: could not connect to host
zaalleatherwear.nl: did not receive HSTS header
zabavno.mk: did not receive HSTS header
+zacco.site: could not connect to host
zacharopoulos.me: could not connect to host
zachbolinger.com: could not connect to host
zachpeters.org: did not receive HSTS header
zadieheimlich.com: did not receive HSTS header
zadroweb.com: did not receive HSTS header
zaem.tv: could not connect to host
+zaffit.com: could not connect to host
zahnrechner-staging.azurewebsites.net: could not connect to host
zahyantechnologies.com: did not receive HSTS header
-zaidan.de: did not receive HSTS header
-zaidan.eu: did not receive HSTS header
-zaidanfood.com: did not receive HSTS header
-zaidanfood.eu: did not receive HSTS header
-zaidanlebensmittelhandel.de: did not receive HSTS header
zalan.do: could not connect to host
zalohovaniburian.cz: could not connect to host
-zamis.net: did not receive HSTS header
+zamis.net: could not connect to host
zamorano.edu: could not connect to host
zamos.ru: max-age too low: 0
zaneweb.org: could not connect to host
+zanzabar.it: could not connect to host
zao.fi: could not connect to host
zaoext.com: could not connect to host
zaoshanghao-dajia.rhcloud.com: could not connect to host
zap.yt: could not connect to host
-zapatoshechoamano.pe: did not receive HSTS header
+zapatoshechoamano.pe: could not connect to host
zappos.com: did not receive HSTS header
zaptan.net: could not connect to host
zaptan.org: could not connect to host
zaptan.us: could not connect to host
+zaratan.fr: did not receive HSTS header
zargaripour.com: did not receive HSTS header
zarooba.com: could not connect to host
zavca.com: did not receive HSTS header
@@ -19958,16 +21184,17 @@ zbigniewgalucki.eu: did not receive HSTS header
zbp.at: did not receive HSTS header
zdravesteny.cz: could not connect to host
zdravotnickasluzba.eu: could not connect to host
-zdrowiepaleo.pl: could not connect to host
+zdrowiepaleo.pl: did not receive HSTS header
zdx.ch: max-age too low: 0
-zeal-and.jp: could not connect to host
zeb.fun: could not connect to host
+zebedeescastles.co.uk: could not connect to host
zebibyte.cn: did not receive HSTS header
zebrababy.cn: could not connect to host
zebry.nl: did not receive HSTS header
zecrypto.com: could not connect to host
zeedroom.be: did not receive HSTS header
zeelynk.com: could not connect to host
+zeeuw.nl: did not receive HSTS header
zefiris.org: did not receive HSTS header
zefu.ca: could not connect to host
zehdenick-bleibt-bunt.de: could not connect to host
@@ -19975,12 +21202,14 @@ zehntner.ch: max-age too low: 3600
zeitoununiversity.org: could not connect to host
zeitzer-turngala.de: could not connect to host
zelfmoord.ga: could not connect to host
+zelfoverstappen.nl: did not receive HSTS header
zelfstandigemakelaars.net: could not connect to host
zellari.ru: did not receive HSTS header
zeloz.xyz: could not connect to host
zenfusion.fr: could not connect to host
zenhaiku.com: could not connect to host
zenics.co.uk: did not receive HSTS header
+zenithmedia.ca: could not connect to host
zenmate.com.tr: could not connect to host
zeno-system.com: did not receive HSTS header
zenpayroll.com: did not receive HSTS header
@@ -19997,14 +21226,15 @@ zepect.com: did not receive HSTS header
zera.com.au: could not connect to host
zerekin.net: max-age too low: 86400
zero-sum.xyz: could not connect to host
-zero-x-baadf00d.com: could not connect to host
+zero-x-baadf00d.com: did not receive HSTS header
zerocool.io: could not connect to host
zeroday.sk: did not receive HSTS header
zerofox.gq: could not connect to host
+zerolab.org: could not connect to host
zeroling.com: could not connect to host
zeroml.ml: could not connect to host
zerosource.net: could not connect to host
-zerowastesonoma.gov: could not connect to host
+zerowastesonoma.gov: did not receive HSTS header
zertif.info: could not connect to host
zerudi.com: did not receive HSTS header
zetadisseny.es: did not receive HSTS header
@@ -20016,24 +21246,22 @@ zewtie.com: could not connect to host
zeytin.pro: could not connect to host
zfo.gg: could not connect to host
zgan.ga: could not connect to host
+zh-yds.com: could not connect to host
zh1.li: could not connect to host
zhang.wtf: could not connect to host
zhangcheng.org: did not receive HSTS header
+zhangge.net: did not receive HSTS header
zhangruilin.com: did not receive HSTS header
zhangsir.net: could not connect to host
zhaochen.xyz: could not connect to host
zhaojin97.cn: could not connect to host
zhendingresources.com: did not receive HSTS header
-zhengouwu.com: could not connect to host
-zhenmeish.com: could not connect to host
+zhenmeish.com: did not receive HSTS header
zhenyan.org: could not connect to host
zhh.in: could not connect to host
-zhih.me: could not connect to host
zhihua-lai.com: did not receive HSTS header
-zhiin.net: could not connect to host
zhikin.com: could not connect to host
zhimajk.com: could not connect to host
-zhiwei.me: did not receive HSTS header
zhoujiashu.com: could not connect to host
zhuji.com.cn: could not connect to host
zhuji5.com: could not connect to host
@@ -20049,37 +21277,38 @@ zinc-x.com: did not receive HSTS header
zinenapse.info: could not connect to host
zippy-download.com: could not connect to host
zippy-download.de: could not connect to host
-ziptie.com: max-age too low: 0
+zirka24.net: could not connect to host
zirtue.io: could not connect to host
zitrone44.de: did not receive HSTS header
+zivagold.com: did not receive HSTS header
zivy-ruzenec.cz: could not connect to host
zixo.sk: could not connect to host
ziyuanabc.xyz: could not connect to host
-ziz.exchange: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+ziz.exchange: could not connect to host
zizoo.com: did not receive HSTS header
-zju.tv: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
+zju.tv: could not connect to host
zjubtv.com: could not connect to host
zjuqsc.com: could not connect to host
zjutv.com: could not connect to host
zjyifa.cn: could not connect to host
zkillboard.com: did not receive HSTS header
zking.ga: could not connect to host
-zl0iu.com: could not connect to host
-zl8862.com: could not connect to host
zlc1994.com: did not receive HSTS header
zlcp.com: could not connect to host
-zmala.com: did not receive HSTS header
+zmala.com: could not connect to host
zmsastro.co.za: could not connect to host
zmscable.com: did not receive HSTS header
zmy.im: could not connect to host
znacite.com: did not receive HSTS header
znd.jp: could not connect to host
zning.net.cn: could not connect to host
+zny.pw: could not connect to host
zocken.com: did not receive HSTS header
zoe.vc: could not connect to host
zohar.link: could not connect to host
zohar.shop: could not connect to host
zoi.jp: could not connect to host
+zojadravai.com: could not connect to host
zokster.net: could not connect to host
zolokar.xyz: could not connect to host
zolotoy-standart.com.ua: did not receive HSTS header
@@ -20093,11 +21322,13 @@ zoo.city: could not connect to host
zoo24.de: did not receive HSTS header
zoofaeth.de: did not receive HSTS header
zoofit.com.au: did not receive HSTS header
+zoological-gardens.eu: could not connect to host
zoomingin.net: max-age too low: 5184000
zoommailing.com: did not receive HSTS header
zoomseoservices.com: max-age too low: 2592000
zoorigin.com: did not receive HSTS header
zooxdata.com: could not connect to host
+zopy.com.br: could not connect to host
zorki.nl: did not receive HSTS header
zortium.report: could not connect to host
zorz.info: could not connect to host
@@ -20107,7 +21338,9 @@ zq789.com: could not connect to host
zqhong.com: could not connect to host
zqjs.tk: could not connect to host
zqstudio.top: could not connect to host
+zrkr.de: could not connect to host
zrn.in: did not receive HSTS header
+zrt.io: did not receive HSTS header
ztan.tk: could not connect to host
ztcaoll222.cn: could not connect to host
ztytian.com: could not connect to host
@@ -20122,6 +21355,7 @@ zulu7.com: did not receive HSTS header
zunda.cafe: could not connect to host
zunftmarke.de: did not receive HSTS header
zurickrelogios.com.br: did not receive HSTS header
+zurret.de: did not receive HSTS header
zutsu-raku.com: did not receive HSTS header
zuviel.space: could not connect to host
zvejonys.lt: did not receive HSTS header
@@ -20131,16 +21365,18 @@ zwalcz-cellulit.com: did not receive HSTS header
zwembadheeten.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /home/trava90/REPO/UXP/security/manager/tools/getHSTSPreloadList.js :: processStsHeader :: line 131" data: no]
zx1168.com: could not connect to host
zx2268.com: could not connect to host
-zxavier.com: did not receive HSTS header
+zxavier.com: could not connect to host
zxity.co.uk: could not connect to host
zxity.ltd: could not connect to host
zxity.uk: could not connect to host
+zxtcode.com: could not connect to host
zyf.pw: could not connect to host
zyger.co.za: did not receive HSTS header
zymbit.com: did not receive HSTS header
zync.ca: did not receive HSTS header
zypgr.com: could not connect to host
zypr.pw: could not connect to host
+zyrillezuno.com: could not connect to host
zyso.org: could not connect to host
zz295.com: did not receive HSTS header
zzb510.com: could not connect to host
diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc
index 75d35a777..b81766c3f 100644
--- a/security/manager/ssl/nsSTSPreloadList.inc
+++ b/security/manager/ssl/nsSTSPreloadList.inc
@@ -8,7 +8,7 @@
/*****************************************************************************/
#include <stdint.h>
-const PRTime gPreloadListExpirationTime = INT64_C(1555803903526000);
+const PRTime gPreloadListExpirationTime = INT64_C(1559822263960000);
class nsSTSPreload
{
@@ -18,8 +18,14 @@ class nsSTSPreload
};
static const nsSTSPreload kSTSPreloadList[] = {
- { "0010100.net", true },
+ { "000books.net", true },
+ { "003971.com", true },
+ { "008207.com", true },
+ { "008251.com", true },
+ { "008253.com", true },
+ { "008271.com", true },
{ "0086286.com", true },
+ { "009p.com", true },
{ "00dani.me", true },
{ "00f.net", true },
{ "0100dev.com", false },
@@ -28,6 +34,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "01110000011100110111001001100111.com", true },
{ "01electronica.com.ar", true },
{ "01seguridad.com.ar", true },
+ { "021002.com", true },
{ "022367.com", true },
{ "022379.com", true },
{ "022391.com", true },
@@ -41,23 +48,72 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "022610.com", true },
{ "02327.net", true },
{ "02375.net", true },
- { "02607.com", true },
{ "026122.com", true },
{ "02638.net", true },
{ "03170317.com", true },
{ "0391315.com", true },
{ "046569.com", true },
- { "04911701.cn", true },
{ "050.ca", true },
+ { "050869.com", true },
{ "050media.nl", true },
{ "0511315.net", true },
{ "0513c.com", true },
+ { "056657.com", true },
+ { "056675.com", true },
+ { "056679.com", true },
+ { "056687.com", true },
+ { "056690.com", true },
+ { "056697.com", true },
+ { "056867.com", true },
+ { "056869.com", true },
+ { "056875.com", true },
+ { "056879.com", true },
+ { "056950.com", true },
+ { "056976.com", true },
+ { "056985.com", true },
{ "0573wk.com", true },
+ { "057587.com", true },
+ { "057596.com", true },
+ { "058509.com", true },
+ { "058596.com", true },
+ { "058679.com", true },
+ { "059957.com", true },
+ { "060757.com", true },
+ { "060795.com", true },
+ { "060796.com", true },
+ { "060798.com", true },
+ { "0607p.com", true },
+ { "060870.com", true },
+ { "060875.com", true },
{ "06091994.xyz", true },
- { "06se.com", true },
+ { "065679.com", true },
+ { "065706.com", true },
+ { "065790.com", true },
+ { "065970.com", true },
+ { "065976.com", true },
+ { "066570.com", true },
+ { "066579.com", true },
+ { "066590.com", true },
+ { "066705.com", true },
+ { "066709.com", true },
+ { "066790.com", true },
+ { "068697.com", true },
+ { "068756.com", true },
+ { "068957.com", true },
+ { "069657.com", true },
+ { "069676.com", true },
+ { "0708p.com", true },
+ { "070968.com", true },
+ { "070986.com", true },
+ { "0720p.com", true },
+ { "077768.net", true },
{ "0788yh.com", true },
{ "0792112.com", true },
+ { "079606.com", true },
+ { "079607.com", true },
+ { "0798rcw.com", true },
{ "0809yh.com", true },
+ { "081115.com", true },
{ "081752.com", true },
{ "081763.com", true },
{ "081769.com", true },
@@ -86,8 +142,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "083962.com", true },
{ "083965.com", true },
{ "083967.com", true },
- { "08detaxe.fr", true },
- { "09115.com", true },
+ { "085806.com", true },
+ { "085905.com", true },
+ { "085950.com", true },
+ { "086807.com", true },
+ { "086907.com", true },
+ { "087059.com", true },
+ { "087065.com", true },
+ { "087540.com", true },
+ { "087569.com", true },
+ { "087580.com", true },
{ "0916app.com", true },
{ "09892.net", true },
{ "0au.de", true },
@@ -98,19 +162,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "0ik.de", true },
{ "0iz.net", true },
{ "0knowledge.de", false },
- { "0o0.edu.pl", true },
{ "0paste.com", true },
+ { "0vo.moe", true },
{ "0wx.cat", true },
{ "0wx.es", true },
{ "0wx.eu", true },
{ "0wx.org", true },
{ "0x.cx", true },
{ "0x.sk", true },
- { "0x0.cloud", true },
{ "0x0.li", true },
{ "0x00ff00ff.com", true },
{ "0x17.de", true },
{ "0x378.net", true },
+ { "0x41.us", true },
{ "0x48.pw", true },
{ "0x52.net", true },
{ "0x7d.com", true },
@@ -118,10 +182,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "0x90.io", true },
{ "0xabe.io", true },
{ "0xacab.org", true },
+ { "0xaf.tk", true },
{ "0xda.de", true },
{ "0xdc.io", false },
{ "0xdefaced.de", true },
{ "0xee.eu", true },
+ { "0xf00.ch", true },
{ "0xfc.de", true },
{ "0xn.de", true },
{ "0yen.org", true },
@@ -152,50 +218,70 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "10439.net", true },
{ "10453.net", true },
{ "10495.net", true },
+ { "1066.io", true },
{ "10774.net", true },
{ "10840.net", true },
{ "10gb.io", true },
{ "10hz.de", true },
{ "10og.de", true },
{ "10ppm.com", true },
+ { "110320.com", true },
+ { "110692.com", true },
+ { "1126p.com", true },
{ "112app.nl", true },
{ "112hz.com", true },
+ { "112it.ro", true },
+ { "1130p.com", true },
{ "114514ss.com", true },
{ "1177107.com", true },
{ "11dzon.com", true },
{ "11loc.de", true },
{ "11thstreetcoffee.com", true },
{ "11urss.com", true },
+ { "120323.com", true },
{ "1212873467.rsc.cdn77.org", true },
{ "1218641649.rsc.cdn77.org", true },
- { "123.gg", true },
- { "1231212.com", true },
- { "123123q.com", true },
{ "123123qq.com", true },
{ "123apps.net", true },
{ "123bearing.co.uk", true },
{ "123bearing.com", true },
{ "123bearing.eu", true },
{ "123comparer.fr", true },
+ { "123djdrop.com", true },
{ "123midterm.com", true },
- { "123nutricion.es", true },
{ "123opstalverzekeringen.nl", true },
- { "123plons.nl", true },
{ "123roulement.be", true },
{ "123roulement.com", true },
{ "123writings.com", true },
{ "124133.com", true },
{ "124633.com", true },
{ "125m125.de", true },
- { "1288fc.com", true },
- { "12photos.eu", true },
+ { "126772.com", true },
+ { "127661.com", true },
+ { "127662.com", true },
+ { "127663.com", true },
+ { "127665.com", true },
+ { "12autoankauf-berlin.de", true },
{ "12thmanrising.com", true },
{ "12train.com", true },
{ "12vpn.net", true },
{ "130.ua", true },
+ { "130032.com", true },
+ { "130212.com", true },
+ { "130232.com", true },
+ { "131934.com", true },
+ { "131954.com", true },
+ { "132302.com", true },
{ "132kv.ch", true },
+ { "133294.com", true },
+ { "133492.com", true },
{ "1359826938.rsc.cdn77.org", true },
- { "13th-dover.uk", true },
+ { "136774.com", true },
+ { "136814.com", true },
+ { "136924.com", true },
+ { "137724.com", true },
+ { "138000.xyz", true },
+ { "141145.com", true },
{ "143533.com", true },
{ "143633.com", true },
{ "143733.com", true },
@@ -221,43 +307,48 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "154933.com", true },
{ "156433.com", true },
{ "1590284872.rsc.cdn77.org", true },
- { "159cp.com", true },
{ "1600esplanade.com", true },
{ "160887.com", true },
+ { "161263.com", true },
+ { "162361.com", true },
{ "162jonesrd.ca", true },
{ "1644091933.rsc.cdn77.org", true },
{ "1661237.com", true },
{ "1750studios.com", false },
{ "1768calc.com.au", true },
+ { "177603.com", true },
+ { "17xile.com", true },
{ "1811559.com", true },
{ "1844329061.rsc.cdn77.org", true },
{ "1876996.com", true },
+ { "18888msc.com", true },
+ { "1889p.com", true },
{ "188da.com", true },
{ "188dv.com", true },
{ "1895media.com", true },
- { "189fc.com", true },
- { "18celebration.com", true },
- { "18celebration.org", true },
{ "18f.gov", true },
{ "18f.gsa.gov", false },
{ "1911trust.com", true },
- { "192.io", true },
- { "192168ll.repair", true },
{ "192433.com", true },
{ "1972969867.rsc.cdn77.org", true },
{ "1981612088.rsc.cdn77.org", true },
{ "19area.cn", true },
{ "19hundert84.de", true },
{ "1a-diamantscheiben.de", true },
+ { "1a-werkstattgeraete.de", true },
{ "1ab-machinery.com", true },
+ { "1android.de", true },
{ "1c-power.ru", true },
{ "1cover.co.nz", true },
{ "1cover.com.au", true },
{ "1cswd.com", true },
{ "1e9.nl", true },
{ "1f123.net", true },
+ { "1f412.space", true },
{ "1fach-digital.de", true },
+ { "1gp.us", true },
{ "1hourproofreading.com", true },
+ { "1in9.net", true },
{ "1it.click", true },
{ "1js.de", true },
{ "1kando.com", false },
@@ -273,7 +364,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "1on1on1.de", true },
{ "1on1on1.tv", true },
{ "1panorama.ru", true },
- { "1para.net", true },
{ "1password.ca", true },
{ "1password.com", true },
{ "1password.eu", true },
@@ -287,6 +377,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "1st-bounce.co.uk", true },
{ "1st-community.de", true },
{ "1stchoicefun.co.uk", true },
+ { "1stchoicelandscapingwa.com", true },
{ "1stclassbouncycastles.co.uk", true },
{ "1stforfun.co.uk", true },
{ "1stpeninsulabouncers.co.uk", true },
@@ -295,24 +386,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "1whw.co.uk", true },
{ "1wirelog.de", true },
{ "1wl.uk", true },
+ { "1zombie.team", true },
{ "2.wtf", true },
{ "200.network", true },
- { "2001y.me", true },
+ { "2001y.me", false },
{ "2012.ovh", true },
{ "20188088.com", true },
+ { "2083236893.com", true },
{ "20at.com", true },
+ { "20denier.com", true },
{ "215dy.net", true },
{ "21sthammersmith.org.uk", true },
{ "21stnc.us", true },
{ "21x9.org", true },
+ { "2206p.com", true },
{ "222001.com", true },
{ "2222yh.com", true },
+ { "22delta.com", true },
{ "22vetter.st", true },
{ "230beats.com", true },
- { "23333.link", true },
+ { "232192.com", true },
{ "2333666.xyz", true },
{ "2333blog.com", true },
- { "233abc.com", false },
{ "233blog.com", true },
{ "233boy.com", true },
{ "233bwg.com", true },
@@ -322,35 +417,40 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "233vps.com", true },
{ "233yes.com", true },
{ "24-7.jp", true },
+ { "24.ie", true },
{ "245meadowvistaway.com", true },
{ "246060.ru", true },
{ "247exchange.com", true },
{ "247healthshop.com", true },
{ "247medplan.com", true },
{ "2495dentalimplants.com", true },
+ { "249722.com", true },
{ "24dian30.com", true },
{ "24hour-locksmithsanantonio.com", true },
{ "24hourcyclist.co.uk", true },
{ "24hourlocksmithbaltimore.com", true },
{ "24hourlocksmithdallastx.com", true },
{ "24hourlocksmithdetroit.com", true },
- { "24hourlocksmithshouston.com", true },
{ "24hoursanantoniolocksmiths.com", true },
{ "24hourscienceprojects.com", true },
{ "24ip.com", true },
{ "24ip.de", true },
{ "24ip.fr", true },
+ { "24items.com", true },
{ "24timeravis.dk", true },
{ "24zpravy.cz", true },
{ "256pages.com", false },
+ { "2586p.com", true },
{ "25reinyan25.net", true },
{ "2600edinburgh.org", true },
{ "2600hq.com", true },
{ "260887.com", true },
+ { "263.info", true },
{ "2718282.net", true },
{ "28-industries.com", true },
{ "281180.de", true },
{ "2858958.com", true },
+ { "286.com", true },
{ "28peaks.com", true },
{ "28spots.net", true },
{ "291167.xyz", true },
@@ -400,12 +500,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "2y.fi", true },
{ "3-dot-careapp1-146314.appspot.com", true },
{ "300m.com", false },
+ { "301.technology", true },
{ "302422.com", true },
+ { "303112.com", true },
{ "303422.com", true },
{ "304122.com", true },
{ "304322.com", true },
{ "304622.com", true },
- { "304squadron.org", true },
{ "3056999.com", true },
{ "309422.com", true },
{ "30hzcollective.com", true },
@@ -415,7 +516,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "314122.com", true },
{ "314322.com", true },
{ "314522.com", true },
- { "314553.com", true },
{ "314622.com", true },
{ "314633.com", true },
{ "314922.com", true },
@@ -444,6 +544,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "33445222.com", true },
{ "33445333.com", true },
{ "33445444.com", true },
+ { "3351p.com", true },
{ "33jiasu.com", true },
{ "340422.com", true },
{ "340622.com", true },
@@ -494,10 +595,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "354933.com", true },
{ "356433.com", true },
{ "357maelai.co", true },
+ { "360-staffing.com", true },
{ "360live.fr", true },
{ "360rail.nl", true },
{ "360vrs.com", true },
- { "364553.com", true },
{ "365365.com", true },
{ "365beautyworld.com", true },
{ "365daysreview.com", true },
@@ -510,9 +611,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "373422.com", true },
{ "374933.com", true },
{ "375422.com", true },
+ { "376208.com", true },
{ "379700.com", true },
{ "380422.com", true },
+ { "3880p.com", true },
{ "388da.com", true },
+ { "38sihu.com", false },
{ "390422.com", true },
{ "392422.com", true },
{ "393335.ml", true },
@@ -521,11 +625,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "394122.com", true },
{ "394322.com", true },
{ "394522.com", true },
- { "394553.com", true },
{ "394622.com", true },
{ "394922.com", true },
{ "396422.com", true },
- { "39sihu.com", false },
+ { "398.info", true },
{ "3aandl.com", true },
{ "3ags.de", true },
{ "3amtoolbox.se", true },
@@ -550,6 +653,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "3drenaline.com", true },
{ "3haeuserprojekt.org", true },
{ "3haueserprojekt.org", true },
+ { "3hl0.net", true },
{ "3james.com", true },
{ "3logic.ru", true },
{ "3lot.ru", true },
@@ -564,12 +668,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "3niu8888.com", true },
{ "3niuurl.com", true },
{ "3os.ooo", true },
- { "3phase.pw", true },
{ "3plusdesign.gr", true },
{ "3prn.com", true },
{ "3queens.cz", true },
{ "3queens.io", true },
{ "3r.org.uk", true },
+ { "3rsee.com", true },
{ "3s-datasolution.de", true },
{ "3s-datasolutions.de", true },
{ "3s-ddns.de", true },
@@ -583,10 +687,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "3shosting.de", true },
{ "3smail.de", true },
{ "3timegear.com", true },
- { "3trees.tk", true },
{ "3tribes.co.uk", true },
{ "3typen.tv", true },
{ "3v4l.org", true },
+ { "3vlnaeet.cz", true },
+ { "3xbit.com.br", true },
{ "4-1-where.com", true },
{ "4-it.de", true },
{ "4000milestare.com", false },
@@ -596,11 +701,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "4096bit.de", false },
{ "40acts.org.uk", true },
{ "41-where.com", true },
+ { "4111pk.com", true },
{ "411416.com", true },
{ "41199.com", true },
{ "411film.com", true },
{ "411movie.com", true },
- { "414553.com", true },
+ { "411quest.com", true },
+ { "4138hd.com", true },
{ "41studio.com", true },
{ "41where.com", true },
{ "420java.com", true },
@@ -608,31 +715,36 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "42day.info", true },
{ "439050.com", true },
{ "440887.com", true },
+ { "440hz.radio", true },
{ "441jj.com", false },
+ { "441jz.com", false },
{ "442887.com", true },
+ { "442jz.com", false },
{ "443887.com", true },
+ { "443jz.com", false },
{ "4444yh.com", true },
{ "444887.com", true },
{ "445887.com", true },
{ "44sec.com", true },
{ "451.ooo", true },
- { "4553s.com", true },
+ { "46fa.com", true },
{ "4706666.com", true },
{ "4716666.com", true },
{ "4726666.com", true },
{ "4756666.com", true },
{ "4786666.com", true },
{ "491mhz.net", true },
+ { "494k.com", true },
{ "49889.com", true },
{ "49dollaridahoregisteredagent.com", true },
{ "4c-haircare.com", true },
- { "4everproxy.com", true },
{ "4eyes.ch", true },
{ "4fit.ro", true },
{ "4flex.info", true },
{ "4freepress.com", true },
{ "4g-server.eu", false },
{ "4garage.com.br", true },
+ { "4hmediaproductions.com", true },
{ "4host.ch", true },
{ "4kprojektory.cz", true },
{ "4lock.com.br", true },
@@ -652,38 +764,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "4xlabs.co", true },
{ "50.gd", true },
{ "50.pe", true },
- { "500a500.com", true },
- { "500b500.com", true },
- { "500c500.com", true },
- { "500d500.com", true },
- { "500e500.com", true },
- { "500f500.com", true },
- { "500g500.com", true },
- { "500h500.com", true },
- { "500i500.com", true },
- { "500j500.com", true },
+ { "5002888.com", true },
+ { "5007999.com", true },
{ "500k.nl", true },
- { "500k500.com", true },
- { "500l500.com", true },
- { "500m500.com", true },
- { "500n500.com", true },
- { "500o500.com", true },
{ "500p.xyz", true },
- { "500p500.com", true },
- { "500pingtai.com", true },
- { "500q500.com", true },
- { "500r500.com", true },
- { "500s500.com", true },
- { "500t500.com", true },
- { "500u500.com", true },
- { "500y500.com", true },
- { "500z500.com", true },
{ "504122.com", true },
{ "504322.com", true },
{ "504622.com", true },
{ "504922.com", true },
{ "506422.com", true },
- { "506pay.com", true },
{ "508088.com", true },
{ "50lakeshore.com", true },
{ "50north.de", true },
@@ -696,21 +785,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "51877.net", true },
{ "519422.com", true },
{ "51acg.eu.org", true },
+ { "51aifuli.com", true },
+ { "51guaq.com", true },
{ "51tiaojiu.com", true },
{ "5219.ml", true },
{ "524022.com", true },
{ "524622.com", true },
{ "524922.com", true },
{ "525.info", true },
- { "52hentai.us", true },
+ { "5287.com", true },
+ { "52hentai.ml", true },
{ "52kb365.com", true },
{ "52ncp.net", true },
{ "52sykb.com", true },
{ "531422.com", true },
+ { "532441.com", true },
+ { "532445.com", true },
{ "534122.com", true },
{ "534622.com", true },
{ "534922.com", true },
- { "5364.com", true },
{ "536422.com", true },
{ "5364b.com", true },
{ "5364c.com", true },
@@ -728,32 +821,36 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "5518k3.com", true },
{ "5533445.com", true },
{ "5555yh.com", true },
+ { "555wfcp.com", true },
{ "55639.com", true },
- { "55797.com", true },
{ "566380.com", true },
{ "575380.com", true },
{ "576422.com", true },
{ "578380.com", true },
{ "579422.com", true },
{ "57wilkie.net", true },
+ { "581018.com", true },
{ "583422.com", true },
{ "585380.com", true },
{ "585422.com", true },
{ "586422.com", true },
- { "588da.com", true },
+ { "588l.com", true },
+ { "58nav.com", true },
{ "591380.com", true },
{ "591422.com", true },
{ "592380.com", true },
{ "592422.com", true },
{ "5930593.com", true },
+ { "593380.com", true },
{ "594022.com", true },
{ "594622.com", true },
{ "595422.com", true },
{ "596422.com", true },
+ { "598380.com", true },
{ "5997891.com", true },
{ "5apps.com", true },
+ { "5beanskit.com", true },
{ "5c1fd0f31022cbc40af9f785847baaf9.space", true },
- { "5crowd.com", true },
{ "5dm.tv", true },
{ "5dwin.com", true },
{ "5dwin.net", true },
@@ -761,8 +858,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "5gb.space", true },
{ "5kraceforals.com", true },
{ "5percentperweek.com", true },
+ { "5stars.tv", true },
{ "5thchichesterscouts.org.uk", true },
{ "5y.fi", true },
+ { "5yeb.com", true },
{ "602422.com", true },
{ "604122.com", true },
{ "604322.com", true },
@@ -777,12 +876,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "614922.com", true },
{ "61730123.com", true },
{ "618media.com", true },
+ { "620881.com", true },
{ "621422.com", true },
+ { "62314.cc", true },
{ "624022.com", true },
{ "624122.com", true },
{ "624322.com", true },
{ "624522.com", true },
{ "624922.com", true },
+ { "626380.com", true },
{ "626422.com", true },
{ "630422.com", true },
{ "631422.com", true },
@@ -842,24 +944,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "6547766.com", true },
{ "6548855.com", true },
{ "6548877.com", true },
+ { "6556hd.com", true },
+ { "6556pk.com", true },
{ "656088.com", true },
{ "659422.com", true },
+ { "65d88.com", true },
+ { "6602p.com", true },
+ { "6603p.com", true },
{ "66136.com", true },
+ { "662607.xyz", true },
{ "6633445.com", true },
{ "6652566.com", true },
{ "6660111.ru", true },
- { "6664553.com", true },
{ "666668722.com", true },
{ "6666yh.com", true },
- { "666omg.com", true },
- { "66b.com", true },
{ "670422.com", true },
{ "671422.com", true },
{ "672422.com", true },
{ "673422.com", true },
{ "676422.com", true },
{ "679422.com", true },
- { "680226.com", true },
{ "680422.com", true },
{ "68277.me", true },
{ "686848.com", true },
@@ -871,21 +975,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "694622.com", true },
{ "694922.com", true },
{ "6969.us", true },
+ { "69759.com", true },
{ "698da.com", true },
{ "69928.com", true },
{ "6997896.com", true },
{ "69butterfly.com", true },
{ "69fps.gg", true },
{ "69wasted.net", true },
+ { "6bwcp.com", true },
{ "6ird.com", true },
{ "6lo.zgora.pl", true },
- { "6pm.com", true },
- { "6t-montjoye.org", true },
{ "700.az", true },
{ "704233.com", true },
{ "704533.com", true },
{ "7045h.com", true },
{ "704633.com", true },
+ { "7080997.com", true },
{ "712433.com", true },
{ "713433.com", true },
{ "714133.com", true },
@@ -912,9 +1017,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "743833.com", true },
{ "74th.jp", true },
{ "755k3.com", true },
- { "758global.com", true },
{ "762.ch", true },
+ { "7717a.com", true },
{ "7733445.com", true },
+ { "7770b.com", true },
+ { "7770t.com", true },
{ "7777yh.com", true },
{ "777coin.com", true },
{ "783lab.com", true },
@@ -922,13 +1029,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "7885765.com", true },
{ "7891553.com", true },
{ "7891997.com", true },
+ { "7898666.com", true },
{ "79ch.com", true },
{ "7careconnect.com", true },
{ "7delights.com", true },
{ "7delights.in", true },
+ { "7ferfer.com.br", true },
{ "7geese.com", true },
{ "7graus.pt", true },
{ "7kicks.com", true },
+ { "7plus.com.au", true },
{ "7proxies.com", true },
{ "7qly.com", true },
{ "7sons.de", true },
@@ -936,22 +1046,32 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "7trade8.com", true },
{ "7x24servis.com", true },
{ "804322.com", true },
+ { "8080883.com", true },
+ { "8080889.com", true },
{ "8086.cf", true },
+ { "80883.cc", true },
+ { "80887.cc", true },
{ "809422.com", true },
{ "80993.net", true },
{ "814022.com", true },
+ { "815jz.com", true },
+ { "816jz.com", true },
{ "81818app.com", true },
{ "8189196.com", true },
- { "818da.com", true },
+ { "8211p.com", true },
+ { "8212p.com", true },
+ { "8213p.com", true },
+ { "8214p.com", true },
+ { "8215p.com", true },
+ { "8216p.com", true },
{ "8349822.com", true },
- { "850226.com", true },
+ { "848jz.com", true },
{ "8522.com", true },
{ "8522club.com", true },
{ "8522hk.com", true },
{ "8522ph.com", true },
{ "8522tw.com", true },
{ "8522usa.com", true },
- { "86286286.com", true },
{ "86499.com", true },
{ "86metro.ru", true },
{ "8722.am", true },
@@ -961,13 +1081,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "8722ph.com", true },
{ "8722tw.com", true },
{ "8722usa.com", true },
+ { "877027.com", true },
{ "88-line.com", true },
{ "88-line.net", true },
+ { "8802p.com", true },
{ "881-line.com", true },
{ "881-line.net", true },
{ "8818k3.com", true },
{ "8833445.com", true },
{ "88522am.com", true },
+ { "885287.com", true },
{ "887.ag", true },
{ "8876007.com", true },
{ "8876008.com", true },
@@ -1016,12 +1139,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "8880021.com", true },
{ "8880023.com", true },
{ "8880025.com", true },
- { "8880057.com", true },
{ "8880059.com", true },
{ "8880067.com", true },
{ "8880083.com", true },
{ "8880100.com", true },
- { "8884553.com", true },
+ { "88851333.com", true },
+ { "88851777.com", true },
+ { "888666pj.com", true },
{ "8886737.com", true },
{ "8886739.com", true },
{ "8886793.com", true },
@@ -1060,10 +1184,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "88yule9.com", true },
{ "8ack.de", true },
{ "8ackprotect.com", true },
- { "8da188.com", true },
{ "8da222.com", true },
- { "8da88.com", true },
- { "8da999.com", true },
{ "8dabet.com", true },
{ "8hrs.net", true },
{ "8maerz.at", true },
@@ -1071,12 +1192,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "8tech.com.hk", true },
{ "8thportsmouth.org.uk", true },
{ "8tuffbeers.com", true },
- { "8ung.online", true },
- { "8xxbet.net", true },
+ { "8xx888.com", true },
{ "8y.network", true },
+ { "8yun.cf", true },
{ "9-11commission.gov", true },
{ "903422.com", true },
{ "905422.com", true },
+ { "908.la", true },
+ { "9090819.com", true },
{ "90r.jp", true },
{ "910kj.com", true },
{ "9118.com", true },
@@ -1084,7 +1207,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "912422.com", true },
{ "913422.com", true },
{ "914122.com", true },
- { "918116.com", true },
{ "918gd.com", true },
{ "919422.com", true },
{ "91966.com", true },
@@ -1094,6 +1216,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "924322.com", true },
{ "924622.com", true },
{ "926422.com", true },
+ { "929349.com", true },
{ "92url.com", true },
{ "931422.com", true },
{ "932422.com", true },
@@ -1107,11 +1230,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "949622.com", true },
{ "949722.com", true },
{ "94cs.cn", false },
+ { "967606.com", true },
{ "9679693.com", true },
{ "9681909.com", true },
{ "972422.com", true },
{ "9788876.com", true },
- { "97bros.com", true },
{ "9822.am", true },
{ "9822.bz", true },
{ "9822am.com", true },
@@ -1120,21 +1243,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "9822ph.com", true },
{ "9822tw.com", true },
{ "9822usa.com", true },
- { "98laba.com", true },
- { "98laba.net", true },
+ { "9867666.com", true },
+ { "98laba.com", false },
+ { "98laba.net", false },
{ "9918883.com", true },
{ "9933445.com", true },
+ { "9950p.com", true },
{ "99599.fi", true },
- { "9994553.com", true },
{ "9998722.com", true },
{ "99998522.com", true },
{ "99999822.com", true },
{ "999998722.com", true },
{ "99rst.org", true },
{ "99wxt.com", true },
+ { "9box.jp", true },
{ "9farm.com", true },
{ "9fvip.net", true },
+ { "9hosts.net", true },
+ { "9iwan.net", true },
{ "9jajuice.com", true },
+ { "9jatrust.com", true },
{ "9pkfz.com", true },
{ "9riddles.com", true },
{ "9uelle.jp", true },
@@ -1144,12 +1272,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "a-1basements.com", true },
{ "a-1indianawaterproofing.com", true },
{ "a-allard.be", true },
+ { "a-care.net", true },
{ "a-classinflatables.co.uk", true },
{ "a-invest.de", true },
{ "a-little-linux-box.at", true },
{ "a-msystems.com", true },
{ "a-oben.org", true },
{ "a-players.team", true },
+ { "a-pro-pos.info", true },
{ "a-wife.net", true },
{ "a-ztransmission.com", true },
{ "a0print.nl", true },
@@ -1161,16 +1291,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "a2a.me", true },
{ "a2a.net", true },
{ "a2nutrition.com.au", true },
- { "a2os.club", true },
{ "a4sound.com", true },
{ "a632079.me", true },
{ "a7la-chat.com", true },
+ { "a7m2.me", true },
+ { "aa-tour.ru", true },
{ "aa1718.net", true },
{ "aaapl.com", true },
{ "aabanet.com.br", true },
{ "aaben-bank.dk", true },
{ "aabenbank.dk", true },
- { "aacfree.com", true },
{ "aacs-design.com", true },
{ "aadw.de", true },
{ "aaex.cloud", true },
@@ -1190,7 +1320,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aarkue.eu", true },
{ "aaron.cm", true },
{ "aaron.xin", true },
- { "aaronburt.co.uk", false },
{ "aaronhorler.com", true },
{ "aaronhorler.com.au", true },
{ "aaronkimmig.de", true },
@@ -1200,42 +1329,42 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aati.be", true },
{ "aati.info", true },
{ "aavienna.com", true },
+ { "ab-photography.nl", true },
{ "abaapplianceservice.com", true },
{ "abaaustin.com", true },
{ "ababyco.com.hr", true },
{ "abacusbouncycastle.co.uk", true },
{ "abacustech.co.jp", true },
{ "abandonedmines.gov", true },
+ { "abasalehngo.com", true },
{ "abateroad66.it", true },
{ "abbadabbabouncycastles.co.uk", true },
{ "abbas.ch", true },
{ "abborsjo.fi", true },
{ "abbotsparties.co.uk", true },
{ "abbottscastles.co.uk", true },
- { "abbradar.net", true },
{ "abbruch-star.de", true },
{ "abc-rz.de", true },
{ "abc.li", true },
{ "abc8081.net", true },
{ "abcbouncycastlessurrey.co.uk", true },
{ "abcbouncyfactory.co.uk", true },
- { "abcdef.be", true },
{ "abcheck.se", true },
{ "abckam.com", true },
{ "abcpartyhire.com", true },
{ "abcstudio.com.au", true },
{ "abdel.me", true },
- { "abdelsater.net", true },
{ "abdulwahaab.ca", true },
{ "abe-elektro.de", true },
{ "abe-medical.jp", true },
{ "abeestrada.com", false },
{ "abeilles-idapi.fr", true },
{ "abenteuer-ahnenforschung.de", true },
- { "abeontech.com", true },
{ "aberdeencastles.co.uk", true },
{ "aberdeenjudo.co.uk", true },
{ "abeus.com", true },
+ { "abg.ninja", true },
+ { "abhibhat.com", true },
{ "abhisharma.me", true },
{ "abi-2017.tk", true },
{ "abiapp.net", true },
@@ -1248,9 +1377,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "abilma.com", true },
{ "abilymp06.net", true },
{ "abimelec.com", true },
- { "abinferis.com", true },
{ "abinyah.com", true },
{ "abitidalavoro.roma.it", true },
+ { "abitidasposa.roma.it", true },
{ "abitur97ag.de", true },
{ "abiturma.de", true },
{ "ablak-nyilaszaro.info", true },
@@ -1263,6 +1392,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "abobuch.de", true },
{ "aboces.org", true },
{ "aboderenovation.co.uk", true },
+ { "abogadosescobarysanchez.es", true },
{ "abolicionistas.com", true },
{ "abolition.net", true },
{ "abolitionism.ca", true },
@@ -1285,6 +1415,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "abolitionniste.com", true },
{ "abolizionista.com", true },
{ "abonilla.com", true },
+ { "aborla.net", true },
{ "abos.eu", true },
{ "abouncycastleman.co.uk", true },
{ "abouthrm.nl", true },
@@ -1306,7 +1437,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "abrilect.com", true },
{ "abristolgeek.co.uk", true },
{ "abseits.org", true },
- { "absolem.cc", true },
+ { "absolem.cc", false },
{ "absolutcruceros.com", true },
{ "absoluteautobody.com", true },
{ "absolutedouble.co.uk", true },
@@ -1334,6 +1465,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ac-admin.pl", true },
{ "ac-epmservices.com", true },
{ "ac-town.com", true },
+ { "ac.milan.it", true },
{ "ac0g.dyndns.org", true },
{ "aca-creative.co.uk", true },
{ "academiadebomberosonline.com", true },
@@ -1347,7 +1479,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "acaptureservices.com", true },
{ "acara-yoga.de", true },
{ "acareer.in", true },
- { "acat.io", true },
{ "acbrussels-used.be", true },
{ "accelaway.com", true },
{ "acceleratenetworks.com", true },
@@ -1358,11 +1489,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "accesloges.com", true },
{ "accessacab.co.uk", true },
{ "accessauto-occasions.be", true },
- { "accessibility.gov", true },
{ "accesskeycloning.com", true },
{ "accessmy.net", true },
{ "accessoirescheveuxchic.com", true },
{ "accessoripersmartphone.it", true },
+ { "acchicocchi.com", true },
+ { "acchikocchi.org", true },
{ "accme.co", true },
{ "accoladescreens.com.au", true },
{ "accord-application.com", true },
@@ -1378,15 +1510,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "accuritconsulting.com", true },
{ "accuritpresence.com", true },
{ "accutint.com", true },
+ { "ace-aegon.cloud", true },
{ "ace.media", true },
{ "ace.one", true },
{ "acealters.com", true },
{ "aceanswering.com", true },
- { "acecerts.co.uk", true },
{ "acecolleges.edu.au", true },
{ "acedog.co", true },
{ "aceinflatables.com", true },
{ "aceinstituteonline.com", true },
+ { "acelpb.com", true },
{ "acem.org.au", true },
{ "acemobileforce.com", true },
{ "acen.eu", true },
@@ -1395,7 +1528,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "acerislaw.com", true },
{ "acessoeducacao.com", true },
{ "acfo.org", true },
+ { "acfun.eu.org", true },
{ "acg.social", true },
+ { "acg1080.com", true },
{ "acgmoon.com", true },
{ "acgmoon.org", true },
{ "acgtalktw.com", true },
@@ -1417,6 +1552,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ackis.duckdns.org", false },
{ "acklandstainless.com.au", true },
{ "acl.gov", true },
+ { "acl.ink", true },
{ "aclu.org", false },
{ "acluva.org", false },
{ "acme.beer", true },
@@ -1426,6 +1562,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aconnor.xyz", true },
{ "acordes.online", true },
{ "acorncastles.co.uk", true },
+ { "acorncredentialing.com", true },
{ "acorntreecare.com", true },
{ "acoshift.com", true },
{ "acoshift.me", true },
@@ -1447,22 +1584,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "acrevalue.com", true },
{ "acriticismlab.org", true },
{ "acrolife.cz", true },
- { "acroso.me", true },
{ "acrosstheblvd.com", true },
{ "acroyoga-nuernberg.de", true },
{ "acrylbilder-acrylmalerei.de", true },
{ "acrylicwifi.com", true },
- { "acs-chantal.com", true },
{ "acsbbs.org", true },
{ "acsc.gov.au", true },
{ "acscbasket.com", true },
{ "acsemb.org", true },
{ "acsports.ca", true },
+ { "act-safety.nl", true },
{ "actc.org.uk", true },
{ "actgruppe.de", true },
{ "actheater.com", true },
{ "actiefgeld.nl", true },
{ "actioncleaningnd.com", true },
+ { "actioncoachignite.co.za", true },
{ "actionfinancialservices.net", true },
{ "actionlabs.net", true },
{ "actionmadagascar.ch", true },
@@ -1482,7 +1619,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "actom.cc", true },
{ "actonwoodworks.com", true },
{ "actors-cafe.net", true },
- { "actorsroom.com", true },
{ "actserv.co.ke", true },
{ "actualadmins.com", true },
{ "actualidadblog.com", true },
@@ -1522,7 +1658,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "adambalogh.net", true },
{ "adambryant.ca", false },
{ "adambyers.com", true },
- { "adamek.online", true },
+ { "adamdixon.co.uk", true },
+ { "adamek.online", false },
{ "adamfontenot.com", true },
{ "adamh.us", true },
{ "adamkaminski.com", true },
@@ -1539,6 +1676,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "adapt-elektronik.com", true },
{ "adapt.de", true },
{ "adaptablesecurity.org", true },
+ { "adaptergonomics.com", true },
{ "adapti.de", true },
{ "adaptivemechanics.edu.au", true },
{ "adarshthapa.in", true },
@@ -1548,11 +1686,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "adblockextreme.com", true },
{ "adblockextreme.net", true },
{ "adblockextreme.org", true },
+ { "adcnvs.com", true },
+ { "addcrazy.com", true },
{ "addeekt.com", true },
{ "adderall.space", true },
{ "addicional.com", true },
{ "addictionresource.com", true },
{ "addictively.com", true },
+ { "addiko.net", true },
{ "addisoncrump.info", true },
{ "addnine.com", true },
{ "addon.watch", true },
@@ -1562,7 +1703,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "addvalue-renovations.co.uk", true },
{ "addydari.us", true },
{ "adelebeals.com", true },
- { "adelianz.com", true },
{ "adelightfulglow.com", true },
{ "adeline.mobi", true },
{ "adentalsolution.com", true },
@@ -1598,6 +1738,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "adminforge.de", true },
{ "administrator.de", true },
{ "administratorserwera.pl", true },
+ { "adminless.ovh", true },
{ "adminlinux.pl", true },
{ "admino.cz", true },
{ "admins.tech", true },
@@ -1609,9 +1750,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "admongo.gov", true },
{ "adnanoktar.com", true },
{ "adnanotoyedekparca.com", true },
+ { "adnmb1.com", true },
{ "adnolesh.com", true },
{ "adnot.am", true },
{ "adnseguros.es", true },
+ { "adohanyzasjovoje.hu", true },
+ { "adomani-italia.com", true },
{ "adonizer.science", true },
{ "adonnante.com", true },
{ "adoptionlink.co.uk", true },
@@ -1642,9 +1786,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "adsbouncycastles.co.uk", true },
{ "adsbtc.org", true },
{ "adsl2meg.fr", true },
+ { "adtelligent.com", true },
{ "adtgroup.com", true },
{ "adurra.com", true },
{ "aduvi.de", true },
+ { "advaithbot.com", true },
{ "advance.hr", true },
{ "advanced-fleet-services.com", true },
{ "advanced-scribes.com", true },
@@ -1661,9 +1807,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "advancyte.com", true },
{ "advantagehomeexteriors.com", true },
{ "advara.com", true },
+ { "advenacs.com", true },
{ "advenacs.com.au", true },
{ "advenapay.com", true },
- { "adventaholdings.com", true },
{ "advento.bg", true },
{ "adventure-inn.com", true },
{ "adventureally.com", true },
@@ -1686,7 +1832,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "advokat-romanov.com", true },
{ "advtran.com", true },
{ "adware.pl", true },
- { "adwokatkosterka.pl", true },
{ "adwokatzdunek.pl", true },
{ "adws.io", true },
{ "adxperience.com", true },
@@ -1708,31 +1853,33 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ae-construction.co.uk", true },
{ "ae-dir.com", true },
{ "ae-dir.org", true },
+ { "ae8601.com", true },
{ "aebian.org", true },
{ "aecexpert.fr", true },
{ "aedollon.com", true },
{ "aefcleaning.com", true },
{ "aegee-utrecht.nl", true },
+ { "aegis.moe", true },
{ "aegisalarm.co.uk", true },
{ "aegisalarm.com", true },
{ "aegisalarms.co.uk", true },
{ "aegisalarms.com", true },
- { "aegisinsight.com", true },
{ "aegrel.ee", true },
{ "aehe.us", true },
{ "aei.co.uk", true },
+ { "aelurus.com", true },
+ { "aenterprise.info", true },
{ "aeon.co", true },
- { "aep-digital.com", true },
+ { "aeonct.org", true },
{ "aeradesign.com", true },
{ "aerandir.fr", true },
- { "aerapass.io", true },
{ "aereco.com", true },
{ "aergia.eu", true },
{ "aerisnetwork.com", true },
{ "aero-pioneer.com", true },
- { "aerobasegroup.com", true },
{ "aerobotz.com", true },
{ "aeronautix.com", true },
+ { "aeronote.net", true },
{ "aeropole.de", true },
{ "aeropole.eu", true },
{ "aerosimexperience.com", true },
@@ -1750,6 +1897,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aextron.com", true },
{ "aextron.de", true },
{ "aextron.org", true },
+ { "af-tech.cz", true },
{ "afavre.io", true },
{ "afb24.de", true },
{ "afbeelding.im", true },
@@ -1757,6 +1905,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "afcmrs.org", true },
{ "afcompany.it", true },
{ "afcurgentcarelyndhurst.com", true },
+ { "aff.moe", true },
{ "affarsnatverk.nu", true },
{ "affichagepub3.com", true },
{ "affiliatefeatures.com", true },
@@ -1768,14 +1917,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "affittacamere.roma.it", true },
{ "affittialmare.it", true },
{ "affittisalento.it", true },
+ { "affloc.com", true },
{ "affordableazdivorce.com", true },
{ "affordableblindsexpress.com", true },
- { "affordableenergyadvocates.com", true },
{ "affordableenvironmental.net", true },
{ "affordablehealthquotesforyou.com", true },
{ "affordablekilimanjaro.com", true },
{ "affordablemudjacking.com", true },
{ "affordableracingparts.com.au", true },
+ { "affpass.com", true },
{ "affping.com", true },
{ "affvps.net", true },
{ "afghan.dating", true },
@@ -1784,6 +1934,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aficionados.com.br", true },
{ "afinadoronline.com.br", true },
{ "afinaudio.com", true },
+ { "aflam4you.tv", true },
{ "aflfreebets.com", true },
{ "aflowershop.ca", true },
{ "afmt.fr", true },
@@ -1792,6 +1943,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "afp548.com", true },
{ "afri.cc", true },
{ "africa.dating", true },
+ { "african-bay.de", true },
{ "africanexponent.com", true },
{ "africanimpact.com", true },
{ "africantourer.com", true },
@@ -1803,7 +1955,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "after.digital", true },
{ "afterdwi.info", true },
{ "afterhate.fr", true },
- { "afuh.de", true },
{ "afva.net", true },
{ "afwd.international", true },
{ "ag-websolutions.de", true },
@@ -1814,27 +1965,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "agate.pw", true },
{ "age.hk", true },
{ "agechecker.net", true },
- { "ageg.ca", true },
{ "agemfis.com", true },
{ "agencewebstreet.com", true },
{ "agenciadeempregosdourados.com.br", true },
{ "agenciafiscal.pe", true },
+ { "agenciamdg.com.br", true },
{ "agencyinmotion.com", true },
{ "agenda-loto.net", false },
{ "agenda21senden.de", true },
{ "agendatelefonica.com.br", true },
{ "agendazilei.com", true },
{ "agent-grow.com", true },
- { "agent6.com.au", true },
{ "agentprocessing.com", true },
{ "agenziaimmobiliarezeta.it", true },
{ "agfmedia.com", true },
- { "agglo-sion.ch", true },
- { "aggr.pw", true },
{ "agia.ad", true },
{ "agiapelagia.com", true },
+ { "agibank.com.br", true },
{ "agic-geneve.ch", true },
- { "agic.io", true },
{ "agilebits.com", true },
{ "agilecraft.com", true },
{ "agileecommerce.com.br", true },
@@ -1867,8 +2015,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "agouralandscapelighting.com", true },
{ "agouralighting.com", true },
{ "agouraoutdoorlighting.com", true },
+ { "agowa338.de", true },
{ "agr.asia", true },
- { "agracan.com", true },
{ "agrajag.nl", true },
{ "agrarking.com", true },
{ "agrarking.de", true },
@@ -1896,7 +2044,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ahegao.ca", true },
{ "aheng.me", true },
{ "ahero4all.org", true },
- { "ahkubiak.ovh", true },
+ { "ahkubiak.ovh", false },
{ "ahlaejaba.com", true },
{ "ahlz.sk", true },
{ "ahmad.works", true },
@@ -1916,6 +2064,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ai.gov", true },
{ "ai.je", true },
{ "aia.de", true },
+ { "aianipid.ee", true },
{ "aiasesoriainmobiliaria.com", true },
{ "aibenzi.com", true },
{ "aibiying.com", true },
@@ -1927,12 +2076,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aidanmontare.net", true },
{ "aidanpr.com", true },
{ "aidanpr.net", true },
+ { "aidarikako.com", true },
{ "aiden.link", true },
{ "aidhan.net", true },
{ "aidi-ahmi.com", true },
{ "aids.gov", true },
{ "aie.de", true },
- { "aiforsocialmedia.com", true },
{ "aifriccampbell.com", true },
{ "aigcev.org", true },
{ "aigenpul.se", true },
@@ -1942,6 +2091,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aiho.stream", true },
{ "aiicy.org", true },
{ "aiida.se", true },
+ { "aiinsurance.io", true },
+ { "aiinsurance.xyz", true },
{ "aijsk.com", true },
{ "aikenpromotions.com", true },
{ "aiki.de", true },
@@ -1954,17 +2105,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ailitonia.com", true },
{ "ailitonia.xyz", true },
{ "aimax.com", true },
+ { "aimd.tech", true },
{ "aimeeandalec.com", true },
- { "aimerworld.com", false },
{ "aimgroup.co.tz", true },
{ "aimi-salon.com", true },
+ { "aimonline.nl", true },
{ "aimotive.com", true },
{ "aimstoreglobal.com", true },
- { "aintevenmad.ch", true },
{ "ainutrition.co.uk", true },
{ "ainvest.de", true },
{ "aiois.com", true },
{ "aipbarcelona.com", true },
+ { "aipi.de", true },
{ "air-craftglass.com", true },
{ "air-shots.ch", true },
{ "air-techniques.fr", true },
@@ -2042,6 +2194,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "airbossofamerica.com", true },
{ "airclass.com", true },
{ "aircomms.com", true },
+ { "airconsboksburg.co.za", true },
{ "airductclean.com", false },
{ "airductcleaning-fresno.com", true },
{ "airductcleaninggrandprairie.com", true },
@@ -2062,6 +2215,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "airpbx.com", true },
{ "airplay-inflatable-hire.co.uk", true },
{ "airplayradio.nl", true },
+ { "airportlimototoronto.com", true },
{ "airpurifierproductsonline.com", true },
{ "airrestoration.ch", true },
{ "airsnore.com", true },
@@ -2089,6 +2243,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aivd.lol", true },
{ "aiwdirect.com", true },
{ "aixvox.com", false },
+ { "aizxxs.com", true },
{ "ajapaik.ee", true },
{ "ajarope.com", true },
{ "ajaxed.net", true },
@@ -2104,6 +2259,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ajnasz.hu", true },
{ "ajsb85.com", true },
{ "ak-varazdin.hr", true },
+ { "ak-webit.de", true },
{ "aka.ms", true },
{ "akachanikuji.com", true },
{ "akademeia.moe", true },
@@ -2147,12 +2303,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aktiv-naturheilmittel.de", true },
{ "aktivace.eu", true },
{ "aktivierungscenter.de", true },
+ { "aktuelle-uhrzeit.at", true },
{ "akuislam.com", true },
{ "akukas.com", true },
{ "akustik.tech", true },
{ "akutun.cl", true },
{ "akvorrat.at", true },
{ "akyildiz.net", true },
+ { "al3366.tech", true },
{ "al3xpro.com", true },
{ "alab.space", true },
{ "alabamadebtrelief.org", true },
@@ -2168,14 +2326,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alainwolf.net", true },
{ "alair.cn", false },
{ "alamancetv.com", true },
- { "alamgir.works", true },
{ "alanberger.me.uk", true },
{ "alanhua.ng", true },
- { "alanhuang.name", true },
{ "alaninkenya.org", true },
{ "alaricfavier.eu", false },
{ "alarmcomplete.co.uk", true },
- { "alarna.de", true },
{ "alasdelalma.com.co", true },
{ "alaskafishinglodges.net", true },
{ "alaskajewelry.com", true },
@@ -2190,7 +2345,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "albertbogdanowicz.pl", true },
{ "albertcuyp-markt.amsterdam", true },
{ "albertinum-goettingen.de", true },
- { "albinma.com", true },
{ "albion2.org", true },
{ "alboweb.nl", true },
{ "albrocar.com", true },
@@ -2200,6 +2354,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alco-united.com", true },
{ "alcoholapi.com", true },
{ "alcolecapital.com", true },
+ { "alcouponest.com", true },
{ "aldiabcs.com", true },
{ "aldien.com.br", true },
{ "aldo-vandini.de", true },
@@ -2214,6 +2369,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aleksejjocic.tk", true },
{ "aleksib.fi", true },
{ "alela.fr", true },
+ { "aleph.land", true },
{ "alerbon.net", true },
{ "alertboxx.com", true },
{ "alertonline.nl", true },
@@ -2223,30 +2379,29 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alessandroonline.com.br", true },
{ "aletm.it", true },
{ "alex-ross.co.uk", true },
+ { "alex4386.us", true },
{ "alex97000.de", true },
{ "alexander-beck.eu", true },
{ "alexanderb.info", true },
{ "alexandermuetzel.de", true },
{ "alexanderneng.de", true },
{ "alexanderschimpf.de", true },
- { "alexanderzinn.com", true },
{ "alexandra-schulze.de", true },
{ "alexandrastorm.com", true },
- { "alexandrastylist.com", false },
{ "alexandre-blond.fr", true },
- { "alexandros.io", true },
+ { "alexandrefa.ovh", true },
{ "alexbaker.org", true },
{ "alexberts.ch", true },
{ "alexbogovich.com", true },
{ "alexbresnahan.com", true },
{ "alexcoman.com", true },
{ "alexdaniel.org", true },
- { "alexei.su", false },
{ "alexey-shamara.ru", true },
{ "alexeykopytko.com", true },
{ "alexfabian.myftp.org", true },
{ "alexgaynor.net", true },
{ "alexgebhard.com", true },
+ { "alexhalderman.com", true },
{ "alexhd.de", true },
{ "alexio.ml", true },
{ "alexisabarca.com", true },
@@ -2256,9 +2411,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alexmerkel.com", true },
{ "alexmerkel.me", true },
{ "alexmerkel.xyz", true },
- { "alexmroberts.net", true },
{ "alexn.org", true },
{ "alexpavel.com", true },
+ { "alexpnixon.com", true },
{ "alexpotter.net", true },
{ "alexs.de", true },
{ "alexschroeder.ch", true },
@@ -2275,7 +2430,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alexyang.me", true },
{ "alfa-tech.su", true },
{ "alfred-figge.de", true },
- { "alftrain.com", true },
{ "algbee.com", true },
{ "algeriepart.com", true },
{ "alghanimcatering.com", true },
@@ -2285,6 +2439,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "algolia.com", true },
{ "algorithmofsuccess.com", true },
{ "algoritmus-uspechu.cz", true },
+ { "alhost.ml", true },
{ "aliacraft.net", true },
{ "aliantsoft.pl", true },
{ "aliaswp.com", true },
@@ -2302,7 +2457,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alienstat.com", true },
{ "alienvision.com.br", true },
{ "alignrs.com", true },
- { "aliim.gdn", true },
{ "alijammusic.com", true },
{ "alikulov.me", true },
{ "alinasmusicstudio.com", true },
@@ -2328,6 +2482,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "allaboutthekink.org", true },
{ "allactioneventhire.co.uk", true },
{ "allamericanmuslim.com", true },
+ { "allamericanpaintingplus.com", true },
{ "allamericanprotection.net", true },
{ "allamericatrans.com", true },
{ "allangirvan.net", true },
@@ -2345,7 +2500,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "allcloud.com", true },
{ "allcovered.nl", true },
{ "alldewall.de", true },
- { "alldigitalsolutions.com", true },
{ "alle.bg", true },
{ "allemoz.com", true },
{ "allemoz.fr", true },
@@ -2370,30 +2524,34 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alljamin.com", true },
{ "allmebel.ru", true },
{ "allmend-ru.de", true },
+ { "allmousepads.com", true },
{ "allns.fr", true },
{ "allo-credit.ch", true },
{ "allofthestops.com", true },
{ "allontanamentovolatili.it", true },
{ "allontanamentovolatili.milano.it", true },
+ { "alloutofgum.com", true },
{ "alloverthehill.com", true },
- { "alloydevil.nl", true },
- { "allplayer.tk", true },
{ "allpointsblog.com", true },
{ "allpointsheating.com", true },
{ "allproptonline.com", true },
+ { "allrad-buck.de", true },
+ { "allram.one", true },
{ "allroundpvp.net", true },
+ { "allroundtechnology.com", true },
+ { "allroundtechnology.nl", true },
{ "allsaints.church", true },
{ "allsearch.io", true },
- { "allshousedesigns.com", true },
{ "allstakesupply.com.au", true },
{ "allstarcashforcars.com", true },
- { "allstarpartyinflatables.co.uk", true },
{ "allstarquilts.com", true },
+ { "allsun.online", true },
{ "allsync.com", true },
{ "allsync.nl", true },
{ "allteach.co.uk", true },
{ "allterrainfence.com", true },
{ "allthecryptonews.com", true },
+ { "alltherooms.com", true },
{ "allthethings.co.nz", true },
{ "allthings.me", true },
{ "allthingssquared.com", true },
@@ -2402,19 +2560,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "allurebikerental.com", true },
{ "allurescarves.com", true },
{ "alluvion.studio", true },
- { "allvips.ru", true },
{ "allweatherlandscaping.net", true },
{ "almaatlantica.com", true },
+ { "almamet.com", true },
{ "almavios.com", false },
{ "almayadeen.education", true },
+ { "almenrausch-pirkhof.de", true },
{ "almorafestival.com", true },
{ "almut-zielonka.de", true },
{ "aloesoluciones.com.ar", true },
{ "alohapartyevents.co.uk", true },
+ { "alonas.ml", true },
+ { "alonas.ovh", true },
{ "alonetone.com", true },
{ "alp.od.ua", true },
{ "alpca.org", true },
+ { "alpencam.com", true },
{ "alpencams.com", true },
+ { "alpencams.net", true },
{ "alpengreis.ch", true },
{ "alpenjuice.com", true },
{ "alpertron.com.ar", true },
@@ -2426,18 +2589,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alphaantileak.net", true },
{ "alphabetsigns.com", true },
{ "alphabouncycastles.co.uk", true },
+ { "alphabrock.cn", true },
{ "alphachat.net", true },
{ "alphadote.com", true },
{ "alphaetomega3d.fr", true },
{ "alphafiduciaryservices.ch", true },
{ "alphafitnesslibya.com", true },
{ "alphagateanddoor.com", true },
+ { "alphahunks.com", true },
{ "alphainflatablehire.com", true },
{ "alphaman.ooo", true },
{ "alphanodes.com", true },
{ "alphapengu.in", true },
{ "alpharotary.com", true },
- { "alphasall.com", false },
+ { "alphasall.com", true },
{ "alphassl.de", true },
{ "alphatrash.de", true },
{ "alphavote-avex.com", true },
@@ -2452,9 +2617,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alpinestarmassage.com", true },
{ "alpinetrek.co.uk", true },
{ "alpiniste.fr", true },
- { "alqassam.net", true },
+ { "alpstarentaisetaxi.com", true },
+ { "alpstarentaisetaxi.fr", true },
{ "alquiaga.com", true },
- { "alquiladoramexico.com", true },
{ "alrait.com", true },
{ "alre-outillage.fr", true },
{ "alroniks.com", true },
@@ -2475,6 +2640,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alternative.hosting", true },
{ "alternativebit.fr", true },
{ "alternativedev.ca", true },
+ { "alternativehosting.ca", true },
+ { "alternativehosting.com", true },
{ "alternativeinternet.ca", true },
{ "alternativet.party", true },
{ "alternativetomeds.com", true },
@@ -2494,10 +2661,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alts.li", true },
{ "altstipendiaten.de", true },
{ "altunbas.info", true },
+ { "aluminium-giesserei.de", true },
{ "alumni-kusa.jp", true },
{ "alupferd.de", true },
{ "aluro.info", true },
- { "aluroof.eu", true },
{ "alvcs.com", true },
{ "alviano.com", true },
{ "alvicom.hu", true },
@@ -2505,8 +2672,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "alwaysdry.com.au", true },
{ "alwayslookingyourbest.com", true },
{ "alwaysmine.fi", true },
- { "alwaysonssl.com", true },
{ "alxpresentes.com.br", true },
+ { "alxu.ca", true },
{ "alyoung.com", true },
{ "alza.at", true },
{ "alza.co.uk", true },
@@ -2528,6 +2695,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "amalfi5stars.com", true },
{ "amalfilapiazzetta.it", true },
{ "amalfipositanoboatrental.com", true },
+ { "amalfirock.it", true },
{ "amalfitabula.it", true },
{ "amaliagamis.com", true },
{ "amanatrustbooks.org.uk", true },
@@ -2557,7 +2725,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ambholding-usedcars.be", true },
{ "ambiente.one", true },
{ "ambiq.nl", true },
- { "ambouncyhire.com", true },
{ "amcangroup.com", true },
{ "amcchemical.com", true },
{ "amcfirst.com", true },
@@ -2572,24 +2739,27 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ameego.nl", true },
{ "ameego.org", true },
{ "amees.me", false },
- { "amelandadventure.nl", true },
{ "amello.de", true },
{ "amend-friseur-schwabing.de", true },
+ { "amendine.fr", true },
{ "america.gov", true },
{ "americafamilylawcenter.org", true },
{ "american-school-search.com", true },
{ "american.dating", true },
{ "americandetour.com", true },
{ "americanfoundationbr.com", true },
+ { "americanindiancoc.org", true },
{ "americanindiannursing.com", true },
{ "americanmediainstitute.com", true },
{ "americasbasementcontractor.com", true },
+ { "americasdirector.com", true },
{ "americkykongres.cz", true },
{ "amerigroup.com", true },
{ "ameriikanpoijat.org", true },
{ "amerika-forum.de", true },
{ "amerimarkdirect.com", true },
{ "amerimex.cc", true },
+ { "ames.gq", true },
{ "amesgen.de", true },
{ "amesvacuumrepair.com", true },
{ "amethystdevelopment.co.uk", true },
@@ -2599,9 +2769,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "amh-entertainments.co.uk", true },
{ "ami-de-bastanes.fr", true },
{ "amica-travel.com", true },
+ { "amica.it", true },
{ "amicalecanyon.ch", true },
{ "amiciidogrescue.org.uk", true },
{ "amicimar.it", true },
+ { "amiciperlatesta.it", true },
+ { "amielle.com", true },
{ "amielucha.com", true },
{ "amifoundation.net", true },
{ "amikootours.com", true },
@@ -2613,9 +2786,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "amirautos.com", false },
{ "amirmahdy.com", true },
{ "amisderodin.fr", true },
+ { "amiserver.de", true },
{ "amitabhsirkiclasses.org.in", true },
{ "amitpatra.com", true },
{ "amiu.org", true },
+ { "amj74-informatique.fr", true },
{ "ammanagingdirectors.com", true },
{ "amministratore.biz", true },
{ "amministratore.roma.it", true },
@@ -2623,6 +2798,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "amnesty-bf.org", true },
{ "amnesty.org.au", true },
{ "amnesy.fr", true },
+ { "amokinio.com", true },
{ "amoozesh98.com", true },
{ "amoozesh98.ir", true },
{ "amorgos-aegialis.com", true },
@@ -2637,25 +2813,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ampproject.org", true },
{ "amrcaustin.com", true },
{ "amrcla.com", true },
+ { "ams-web-qa.azurewebsites.net", true },
{ "ams.co.rs", true },
{ "amsportuk.com", true },
+ { "amstelland.com", true },
{ "amsterdamian.com", true },
{ "amuq.net", true },
{ "amuraimpianti.it", true },
{ "amyfoundhermann.com", true },
{ "amyharrisonline.com", true },
+ { "amyria.jp", true },
{ "amyrussellhair.com", true },
{ "amyyeung.com", true },
+ { "amzanalyzer.com", true },
{ "amzn.rocks", true },
{ "an-alles-gedacht.de", true },
- { "anabolic.co", true },
+ { "anabolic.co", false },
{ "anacreon.de", true },
{ "anadiyogacentre.com", true },
{ "anaethelion.fr", true },
{ "anaiscoachpersonal.es", true },
{ "analbleachingguide.com", true },
{ "analgesia.net", true },
- { "analisilaica.it", true },
{ "analogist.net", true },
{ "analytics-shop.com", true },
{ "analyticsinmotion.com", true },
@@ -2670,17 +2849,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "anantshri.info", true },
{ "ananyoo.com", true },
{ "anarchistischegroepnijmegen.nl", false },
- { "anarchyrp.life", true },
- { "anassiriphotography.com", false },
{ "anastasia-shamara.ru", true },
- { "anaveragehuman.eu.org", true },
+ { "anatoray.com", true },
{ "ance.lv", true },
+ { "ancel.io", true },
{ "ancestramil.fr", true },
{ "anchev.net", true },
{ "anchorit.gov", true },
{ "anchovy.nz", false },
+ { "anciennes-automobiles.fr", true },
{ "anciens.org", true },
- { "ancientcraft.eu", true },
{ "ancientnorth.com", true },
{ "ancientnorth.nl", true },
{ "ancolies-andre.com", true },
@@ -2692,13 +2870,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "andarpersassi.it", true },
{ "andel.info", false },
{ "anders.hamburg", true },
- { "anderskp.dk", false },
{ "andersonshatch.com", true },
{ "andiplusben.com", true },
{ "andisadhdspot.com", true },
{ "anditi.com", true },
{ "andoms.fi", true },
- { "andre-ballensiefen.de", true },
{ "andre-lategan.com", true },
{ "andre-otto.com", true },
{ "andrea-kiaora.de", true },
@@ -2706,6 +2882,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "andrea-wirthensohn.at", true },
{ "andreaboero.it", true },
{ "andreadraghetti.it", true },
+ { "andreagobetti.com", true },
{ "andreagourmet.it", true },
{ "andreahruby.it", true },
{ "andreamcnett.com", true },
@@ -2723,7 +2900,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "andrejbenz.com", true },
{ "andrelauzier.com", true },
{ "andreoliveira.io", true },
- { "andrespaz.com", true },
{ "andreundnina.de", true },
{ "andrew.fi", true },
{ "andrew.london", true },
@@ -2733,6 +2909,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "andrewhowden.com", true },
{ "andrewimeson.com", true },
{ "andrewin.ru", true },
+ { "andrewletson.com", true },
{ "andrewmichaud.com", true },
{ "andrewmichaud.me", true },
{ "andrewpeng.net", true },
@@ -2741,9 +2918,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "andrewryno.com", true },
{ "andrewsun.com", true },
{ "andrewtchin.com", true },
+ { "andrewx.net", true },
{ "andrezadnik.com", true },
+ { "andrisilberschmidt.ch", true },
{ "andro2id.com", true },
{ "andro4all.com", true },
+ { "android-tv.3utilities.com", true },
{ "android.re", true },
{ "androide.com", true },
{ "androidhry.cz", true },
@@ -2754,8 +2934,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "androidtamer.com", true },
{ "androidtelefony.cz", true },
{ "androidzone.me", true },
+ { "andromeda.se", true },
{ "andromedacenter.com", true },
+ { "andronika.net", false },
{ "androticsdirect.com", true },
+ { "androzoom.com", true },
{ "andruvision.cz", true },
{ "andsat.org", true },
{ "andschwa.com", false },
@@ -2766,7 +2949,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "andyc.cc", true },
{ "andycrockett.io", true },
{ "andymoore.info", true },
- { "andysroom.dynu.net", true },
+ { "andys-place.co.uk", true },
{ "andyt.eu", true },
{ "andzia.art.pl", true },
{ "anedot-sandbox.com", true },
@@ -2787,8 +2970,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "angeljmadrid.com", true },
{ "angeloryndon.com", true },
{ "angelremigene.com", true },
- { "angelsgirl.eu.org", true },
+ { "angiejones.com", true },
{ "anginf.de", true },
+ { "anglersconservation.net", true },
{ "anglesgirl.eu.org", true },
{ "anglesya.win", true },
{ "anglictina-sojcak.cz", true },
@@ -2796,6 +2980,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "anglingactive.co.uk", true },
{ "anglirl.eu.org", true },
{ "angrapa.ru", true },
+ { "angrido.com", true },
{ "angristan.fr", true },
{ "angristan.xyz", true },
{ "angrut.com", true },
@@ -2807,11 +2992,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "anhaffen.lu", true },
{ "ani-man.de", true },
{ "anicam.fr", true },
- { "aniforprez.net", true },
{ "animacurse.moe", true },
{ "animaemundi.be", true },
{ "animal-liberation.com", true },
- { "animal-nature-human.com", true },
{ "animal-rights.com", true },
{ "animalistic.io", true },
{ "animaltesting.fr", true },
@@ -2827,6 +3010,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "animeai.com", true },
{ "animefluxxx.com", true },
{ "animeinsights.net", true },
+ { "animeone.me", true },
{ "animesharp.com", true },
{ "animetriad.com", true },
{ "animojis.es", true },
@@ -2877,13 +3061,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "annuaire-jcb.com", true },
{ "annuaire-photographe.fr", false },
{ "annunciationbvmchurch.org", true },
+ { "anoboy.org", true },
+ { "anodas.lt", true },
+ { "anohana.org", true },
{ "anojan.com", true },
{ "anon-next.de", true },
{ "anoncom.net", true },
{ "anoncrypto.org", true },
{ "anoneko.com", true },
{ "anongoth.pl", true },
- { "anons.fr", true },
{ "anonym-surfen.de", true },
{ "anonyme-spieler.at", true },
{ "anopan.tk", true },
@@ -2893,7 +3079,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "anotherfatgeek.net", true },
{ "anothervps.com", true },
{ "anowicki.pl", false },
- { "anoxinon.de", false },
{ "ans-delft.nl", true },
{ "ans-ge.ch", true },
{ "ansas.eu", true },
@@ -2903,6 +3088,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ansgar-sonntag.de", true },
{ "ansgarsonntag.de", true },
{ "anshar.eu", true },
+ { "ansibeast.net", true },
{ "ansichtssache.at", true },
{ "ansogning-sg.dk", true },
{ "anstaskforce.gov", true },
@@ -2936,7 +3122,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "anti-bible.com", true },
{ "anti-radar.org", true },
{ "antiaz.com", true },
- { "antibioticshome.com", true },
{ "anticopyright.com", true },
{ "antiekboerderijgraafland.nl", true },
{ "antihype.space", true },
@@ -2944,7 +3129,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "antikvariat.ru", true },
{ "antikvarius.ro", true },
{ "antilaserpriority.com", true },
- { "antiled.by", true },
{ "antimine.me", true },
{ "antipolygraph.org", true },
{ "antique-pedalcars.ch", true },
@@ -2961,6 +3145,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "antonin.one", true },
{ "antonio-gartenbau.de", true },
{ "antonjuulnaber.dk", true },
+ { "antonok.com", true },
{ "antonuotila.fi", true },
{ "antota.lt", true },
{ "antragsgruen.de", true },
@@ -2982,20 +3167,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "anyquestions.govt.nz", true },
{ "anystack.xyz", true },
{ "anzeiger.ag", true },
- { "ao-dev.com", true },
{ "ao2.it", true },
{ "aoa.gov", true },
{ "aoadatacommunity.us", true },
{ "aoaprograms.net", true },
+ { "aobeauty.com.au", true },
+ { "aod-tech.com", true },
{ "aoeuaoeu.com", true },
{ "aofusa.net", true },
{ "aoil.gr", true },
- { "aoku3d.com", true },
{ "aopedeure.nl", true },
{ "aopsy.de", true },
+ { "aori.com", true },
{ "aos-llc.com", true },
{ "aosc.io", false },
- { "aosus.org", true },
+ { "aostacarnavals.it", true },
{ "aotearoa.maori.nz", true },
{ "aotearoaleaks.org", true },
{ "ap-swiss.ch", true },
@@ -3021,6 +3207,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "apertis.org", true },
{ "aperturesciencelabs.de", true },
{ "apervita.net", true },
+ { "apexitsolutions.ca", true },
{ "apfelcholest.de", true },
{ "apgw.jp", true },
{ "aphelionentertainment.com", true },
@@ -3040,12 +3227,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "apiary.store", true },
{ "apiary.supplies", true },
{ "apiary.supply", true },
+ { "apila.care", true },
+ { "apila.us", true },
+ { "apimo.net", true },
{ "apimon.de", true },
{ "apination.com", true },
{ "apio.systems", true },
+ { "apiplus.fr", true },
{ "apis.google.com", true },
{ "apis.moe", true },
{ "apisyouwonthate.com", true },
+ { "apiu.me", true },
{ "apk.li", true },
{ "apk4fun.com", true },
{ "aplikaceproandroid.cz", true },
@@ -3058,15 +3250,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "apn-dz.org", true },
{ "apn-einstellungen.de", true },
{ "apobot.de", true },
+ { "apocalypsemud.org", true },
{ "apogeephoto.com", true },
- { "apoil.org", true },
{ "apoly.de", true },
{ "aponkral.net", true },
{ "aporia.io", true },
{ "aposke.com", true },
{ "aposke.net", true },
{ "aposke.org", true },
- { "apotheke-ch.org", true },
{ "apothes.is", true },
{ "app-at.work", true },
{ "app.lookout.com", true },
@@ -3094,7 +3285,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "applemon.com", true },
{ "appleoosa.com", true },
{ "appleranch.com", true },
- { "applesana.es", true },
{ "applesencia.com", true },
{ "applian.jp", true },
{ "applicationmanager.gov", true },
@@ -3119,11 +3309,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "appseccalifornia.org", false },
{ "appsforlondon.com", true },
{ "appshuttle.com", true },
+ { "appspace.com", true },
{ "appt.ch", true },
{ "apptomics.com", true },
{ "appuals.com", true },
{ "appui-de-fenetre.fr", true },
{ "appveyor.com", true },
+ { "appxcrypto.com", true },
{ "appzoojoo.be", true },
{ "apratimsaha.com", true },
{ "apretatuercas.es", true },
@@ -3132,7 +3324,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aproposcomputing.com", true },
{ "aprovpn.com", true },
{ "aprr.org", true },
- { "aprsdroid.org", true },
{ "aprz.de", true },
{ "apsa.paris", true },
{ "apstudynotes.org", true },
@@ -3141,6 +3332,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "apv-ollon.ch", true },
{ "aqdun.com", true },
{ "aqsiq.net", true },
+ { "aqua-bucht.de", true },
{ "aqua-fitness-nacht.de", true },
{ "aqua-fotowelt.de", true },
{ "aquabar.co.il", true },
@@ -3178,7 +3370,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "araratour.com", true },
{ "araro.ch", true },
{ "araseifudousan.com", true },
- { "arawaza.biz", true },
{ "arawaza.com", false },
{ "araxis.com", true },
{ "arbeitsch.eu", true },
@@ -3187,25 +3378,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "arbejdsdag.dk", true },
{ "arbitrarion.com", true },
{ "arbitrary.ch", true },
- { "arboworks.com", true },
- { "arbu.eu", false },
{ "arcaea.net", true },
{ "arcaik.net", true },
{ "arcbouncycastles.co.uk", true },
{ "arcenergy.co.uk", true },
{ "archaeoadventures.com", true },
+ { "archeologicatoscana.it", true },
{ "archimedicx.com", true },
{ "archined.nl", true },
+ { "archit.in", true },
{ "architectryan.com", true },
{ "architecture-colleges.com", true },
{ "architectureandgovernance.com", true },
{ "archivero.es", true },
{ "archivesdelavieordinaire.ch", true },
{ "archivosstl.com", true },
+ { "archiweb.pl", false },
{ "archlinux.de", true },
{ "archlinux.org", true },
{ "arclandholdings.com.au", true },
- { "arcobalabs.ca", true },
+ { "arcobalabs.ca", false },
{ "arcridge.ca", true },
{ "arctic.gov", true },
{ "arcueil-cachan.fr", false },
@@ -3230,6 +3422,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "arethsu.se", true },
{ "arfad.ch", true },
{ "arg.zone", true },
+ { "argama-nature.com", true },
{ "arganaderm.ch", true },
{ "argb.de", true },
{ "argekultur.at", true },
@@ -3264,12 +3457,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "arkadiyt.com", true },
{ "arkaic.dyndns.org", true },
{ "arkulagunak.com", false },
- { "arlatools.com", true },
{ "arlen.tv", true },
{ "arlenarmageddon.com", true },
{ "arletalibrary.com", true },
{ "arlingtonelectric.com", true },
{ "arm-host.com", true },
+ { "arm.gov", true },
{ "armadaquadrat.com", true },
{ "armandsdiscount.com", true },
{ "armanozak.com", true },
@@ -3294,7 +3487,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "arnaudb.net", true },
{ "arnaudfeld.de", true },
{ "arne.codes", true },
- { "arnevankauter.com", true },
{ "arniescastles.co.uk", true },
{ "arno-klein.de", true },
{ "arno-klein.eu", true },
@@ -3334,8 +3526,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "arrowfastener.com", true },
{ "arrowheadaddict.com", true },
{ "arrowheadflats.com", true },
+ { "arrowit.net", true },
{ "arrowwebprojects.nl", true },
{ "arschkrebs.org", true },
+ { "arslankaynakmetal.com", true },
{ "arsplus.ru", false },
{ "arswb.men", true },
{ "art-auction.jp", true },
@@ -3358,7 +3552,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "artecat.ch", true },
{ "artedellavetrina.it", true },
{ "artedona.com", true },
- { "artefakt.es", true },
+ { "arteequipamientos.com.uy", true },
{ "artefeita.com.br", true },
{ "arteinstudio.it", true },
{ "artelt.com", true },
@@ -3384,6 +3578,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "artisan-cheminees-poeles-design.fr", true },
{ "artisans-libres.com", true },
{ "artisansoftaste.com", true },
+ { "artisavotins.com", true },
{ "artistagenda.com", true },
{ "artistrunwebsite.com", true },
{ "artlantis.nl", true },
@@ -3411,13 +3606,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "artworxbathrooms.com.au", true },
{ "arty.name", true },
{ "arubasunsetbeach.com", true },
+ { "arunjoshua.com", true },
{ "arveron.ch", true },
{ "arvid.io", true },
{ "arviksa.co.uk", true },
{ "arvindhariharan.com", true },
{ "arvindhariharan.me", true },
{ "arvutiladu.ee", true },
+ { "arweth.com", true },
{ "arxell.com", true },
+ { "aryabusines.com", true },
{ "aryalaroca.de", true },
{ "aryan-nation.com", true },
{ "aryasenna.net", true },
@@ -3447,12 +3645,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "asdyx.de", true },
{ "asec01.net", true },
{ "asegem.es", true },
+ { "aseith.com", true },
{ "asenno.com", true },
{ "aserver.co", true },
{ "asexualitat.cat", true },
{ "asgapps.co.za", true },
{ "asge-handel.de", true },
{ "ashastalent.com", true },
+ { "ashd1.goip.de", true },
+ { "ashd2.goip.de", true },
+ { "ashd3.goip.de", true },
+ { "ashessin.com", true },
{ "ashkan-rechtsanwalt-arbeitsrecht-paderborn.de", true },
{ "ashleyedisonuk.com", true },
{ "ashleythouret.com", true },
@@ -3465,7 +3668,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "asiaheavens.com", true },
{ "asialeonding.at", true },
{ "asian-industry.eu", true },
- { "asianodor.com", true },
{ "asianshops.net", true },
{ "asianspa.co.uk", true },
{ "asiba.com.au", true },
@@ -3473,6 +3675,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "asiinc-tex.com", true },
{ "asile-colis.fr", true },
{ "asinetasima.com", true },
+ { "asirigbakaute.com", true },
{ "asirviablog.com", true },
{ "asisee.photography", true },
{ "ask.fi", true },
@@ -3480,21 +3683,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ask1.org", true },
{ "askcaisse.com", true },
{ "askcascade.com", true },
+ { "askeustache.com", true },
{ "askizzy.org.au", true },
{ "askkaren.gov", true },
{ "askme24.de", true },
+ { "asksatya.com", true },
{ "askv6.net", true },
{ "askvg.com", true },
{ "askwhy.cz", true },
{ "askwhy.eu", true },
{ "asmbsurvey.com", true },
{ "asmdz.com", true },
+ { "asmeets.nl", true },
{ "asmood.net", true },
{ "asoul.tw", true },
{ "aspargesgaarden.no", true },
{ "aspatrimoine.com", true },
{ "aspcl.ch", true },
{ "aspectcontext.com", true },
+ { "aspectuw.com.au", true },
{ "asperti.com", true },
{ "aspformacion.com", true },
{ "asphyxia.su", true },
@@ -3516,7 +3723,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "assessoriati.com.br", true },
{ "assetvault.co.za", true },
{ "assguidesporrentruy.ch", true },
- { "assign-it.co.uk", true },
+ { "assign-it.co.uk", false },
{ "assistel.com", true },
{ "assistenzaferrodastiro.org", true },
{ "assistenzafrigorifero.org", true },
@@ -3529,19 +3736,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "astarbouncycastles.co.uk", true },
{ "astarforu.com", true },
{ "astarmathsandphysics.com", true },
+ { "astaxanthin-sport.de", true },
+ { "astaxanthin.de", true },
{ "astec-informatica.com", true },
{ "astengox.com", true },
{ "astenotarili.online", true },
{ "astral-imperium.uk", true },
{ "astral.org.pl", true },
+ { "astroalloys.com.au", true },
{ "astrology42.com", true },
{ "astroscopy.ch", true },
- { "astrosnail.pt.eu.org", true },
{ "astrovandalistas.cc", true },
{ "astural.org", true },
{ "astutikhonda.com", true },
{ "asuclassfinder.com", true },
- { "asucrews.com", true },
{ "asuka.io", true },
{ "asun.co", true },
{ "asurbernardo.com", true },
@@ -3552,6 +3760,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "asystent-dzierzawy.pl", true },
{ "at.search.yahoo.com", false },
{ "at7s.me", true },
+ { "ataber.pw", true },
{ "atac.no", true },
{ "atacadocervejeiro.com.br", true },
{ "atacadodesandalias.com.br", true },
@@ -3583,8 +3792,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "atelierssud.ch", true },
{ "atelierssud.swiss", true },
{ "atencionbimbo.com", false },
- { "atendimentodelta.com.br", true },
+ { "aterlectric.com", true },
{ "aterskapa-data.se", true },
+ { "atg.soy", true },
{ "atgoetschel.ch", true },
{ "atgroup.gr", true },
{ "atgseed.co.uk", true },
@@ -3592,8 +3802,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ath0.org", false },
{ "atheist-refugees.com", true },
{ "atheistfrontier.com", true },
+ { "athekiu.com", true },
{ "athena-bartholdi.com", true },
- { "athena-garage.co.uk", true },
{ "athenadynamics.com", true },
{ "athenaneuro.com", true },
{ "athlin.de", true },
@@ -3618,15 +3828,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "atlantishq.de", true },
{ "atlantiswaterproofing.com", true },
{ "atlas-heritage.com", true },
+ { "atlas-multimedia.de", true },
{ "atlasbrown.com", true },
{ "atlaschiropractic.org", true },
+ { "atlascoffeeclub.com", true },
{ "atlascultural.com", true },
{ "atlasdev.nl", true },
{ "atlasone.us", true },
{ "atlassian.io", true },
{ "atlassignsandplaques.com", true },
- { "atlayo.com", false },
{ "atletika.hu", true },
+ { "atmalta.com", true },
{ "atmschambly.com", true },
{ "atnis.com", true },
{ "ato4sound.com", true },
@@ -3636,13 +3848,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "atom86.net", true },
{ "atombase.org", true },
{ "atomic-bounce.com", true },
- { "atomicbounce.co.uk", true },
{ "atomism.com", true },
{ "atorcidabrasileira.com.br", true },
{ "atplonline.co", true },
{ "atpnutrition.com", true },
{ "atraining.ru", true },
{ "atraverscugy.ch", true },
+ { "atrevillot.com", true },
{ "atrinik.org", true },
{ "atsoftware.de", true },
{ "atspeeds.com", true },
@@ -3658,7 +3870,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "attogtech.com", true },
{ "attorney.org.il", true },
{ "attwood.org", true },
- { "atulhost.com", true },
{ "atviras.lt", false },
{ "atvirtual.at", true },
{ "atvsafety.gov", true },
@@ -3671,20 +3882,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "atypicom.it", true },
{ "atypicom.pt", true },
{ "atzenchefin.de", true },
+ { "atzzz.com", true },
{ "au-be.net", true },
{ "au2pb.org", true },
{ "aubergegilly.ch", true },
{ "aubg.org", true },
{ "aubio.org", true },
{ "aubonmanger.fr", true },
+ { "aucarresainteloi.com", true },
{ "aucielrose.com", true },
{ "aucklandcastles.co.uk", true },
{ "aucubin.de", true },
{ "audialbuquerqueparts.com", true },
- { "audiblox.co.za", true },
{ "audiense.com", false },
{ "audio-detector.com", true },
{ "audiobookboo.com", true },
+ { "audiobookstudio.com", true },
{ "audiolibri.org", true },
{ "audiolot.com", true },
{ "audion.cc", true },
@@ -3712,11 +3925,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "augmentable.de", false },
{ "augmented-portal.com", true },
{ "august-don.site", true },
- { "august.black", true },
{ "augustian-life.cz", true },
{ "augustiner-kantorei-erfurt.de", true },
{ "augustiner-kantorei.de", true },
{ "aukaraoke.su", true },
+ { "aulasvirtualesperu.com", true },
{ "aulo.in", false },
{ "aumilieudumonde.gf", true },
{ "aunali1.com", true },
@@ -3732,7 +3945,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "aurnik.com", true },
{ "aurora-multimedia.co.uk", true },
{ "auroraassociationofrealtors.com", true },
- { "aurosa.cz", true },
{ "auroware.com", true },
{ "auroz.tech", true },
{ "auroz.video", true },
@@ -3740,8 +3952,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ausmwoid.de", true },
{ "auspicacious.org", true },
{ "ausrecord.com", true },
+ { "ausschreibungen-suedtirol.it", true },
{ "aussiefunadvisor.com", true },
- { "aussiegreenmarks.com.au", true },
{ "aussieservicedown.com", true },
{ "aussiestoresonline.com", true },
{ "austenplumbing.com", true },
@@ -3755,7 +3967,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "austinuniversityhouse.com", true },
{ "australian.dating", true },
{ "australianairbrushedtattoos.com.au", true },
- { "australianarmedforces.org", true },
{ "australianattractions.com.au", true },
{ "australianimmigrationadvisors.com.au", true },
{ "australiantemporarytattoos.com", true },
@@ -3766,6 +3977,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "auszeit-walsrode.de", true },
{ "auszeit.bio", true },
{ "auth.adult", true },
+ { "authenticationhub.io", true },
{ "authenticwoodcraft.com", true },
{ "authinity.com", true },
{ "authland.com", false },
@@ -3779,6 +3991,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "auto-plus.tn", true },
{ "auto-spurgo.com", true },
{ "auto.nl", true },
+ { "auto1.fi", true },
{ "autoauctionsohio.com", true },
{ "autoauctionsvirginia.com", true },
{ "autobahnco.com", true },
@@ -3798,10 +4011,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "autodidacticstudios.net", true },
{ "autodidacticstudios.org", true },
{ "autoentrepreneurinfo.com", true },
- { "autoepc.ro", true },
{ "autoeshop.eu", true },
+ { "autohaus-snater.de", true },
+ { "autoi.ch", true },
{ "autoinsurancehavasu.com", true },
{ "autokeyreplacementsanantonio.com", true },
+ { "autolawetawroclaw.pl", true },
{ "autoledky.sk", true },
{ "automaan.nl", true },
{ "automacity.com", true },
@@ -3822,6 +4037,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "autoprogconsortium.ga", true },
{ "autoproshouston.com", true },
{ "autorando.com", true },
+ { "autoreinigung-noack.de", true },
{ "autorijschoolrichardschut.nl", true },
{ "autos-mertens.com", true },
{ "autoschadeschreuder.nl", true },
@@ -3831,6 +4047,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "autoshopsolutions.com", true },
{ "autoshun.org", true },
{ "autoskola.hr", true },
+ { "autoskolaplzen.cz", true },
{ "autoskole.hr", true },
{ "autospurgo.it", true },
{ "autospurgo.milano.it", true },
@@ -3845,7 +4062,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "autozane.com", true },
{ "autres-talents.fr", true },
{ "autshir.com", true },
- { "auux.com", true },
{ "auvernet.org", true },
{ "aux-arts-de-la-table.com", true },
{ "auxiliame.com", true },
@@ -3898,9 +4114,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "avietech.com", true },
{ "aviv.nyc", true },
{ "avlhostel.com", true },
+ { "avm-multimedia.com", true },
{ "avmrc.nl", true },
- { "avnet.ws", true },
- { "avocadooo.stream", true },
+ { "avmup.com", true },
{ "avocatbeziau.com", true },
{ "avocode.com", true },
{ "avonture.be", true },
@@ -3908,8 +4124,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "avpres.net", true },
{ "avptp.org", true },
{ "avqueen.cn", true },
- { "avs-building-services.co.uk", true },
{ "avsox.com", true },
+ { "avtek.pl", true },
{ "avticket.ru", false },
{ "avtobania.pro", true },
{ "avtoforex.ru", true },
@@ -3917,7 +4133,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "avtomarket.ru", true },
{ "avtoveles.by", true },
{ "avtovokzaly.ru", true },
- { "avv.li", true },
{ "avvaterra.ch", true },
{ "avvcorda.com", true },
{ "avvocato.bologna.it", true },
@@ -3933,14 +4148,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "awecademy.org", true },
{ "awesome-coconut-software.fr", true },
{ "awesomebouncycastles.co.uk", true },
- { "awesomesit.es", true },
{ "awic.ca", true },
{ "awk.tw", true },
{ "awksolutions.com", true },
{ "awningcanopyus.com", true },
{ "awningsaboveus.com", true },
{ "awningsatlantaga.com", true },
- { "awomaninherprime.com", true },
+ { "awplasticsurgery.com", true },
+ { "awscloudrecipes.com", true },
{ "awsmdev.de", true },
{ "awsome-books.co.uk", true },
{ "awxg.com", true },
@@ -3956,6 +4171,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "axiomer.net", true },
{ "axiomer.org", true },
{ "axisfleetmanagement.co.uk", true },
+ { "axispara-bg.com", true },
{ "axolotlfarm.org", false },
{ "axon-toumpa.gr", true },
{ "axonholdingse.eu", true },
@@ -3966,9 +4182,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ayanomimi.com", true },
{ "aycomba.de", true },
{ "ayesh.me", true },
+ { "aying.love", true },
{ "ayj.solutions", true },
{ "aykutcevik.com", true },
{ "aylak.com", true },
+ { "aylavblog.com", true },
{ "aylesburycastlehire.co.uk", true },
{ "aymerick.fr", true },
{ "aymericlagier.com", true },
@@ -3981,18 +4199,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "az.search.yahoo.com", false },
{ "azabani.com", true },
{ "azadliq.info", true },
- { "azane.ga", true },
{ "azarus.ch", true },
{ "azazy.net", false },
{ "azgfd.com", true },
- { "aziende.com.ar", true },
{ "azimut.fr", true },
{ "azino777.ru", true },
- { "azizfirat.com", true },
{ "azizvicdan.com", false },
{ "azlk-team.ru", true },
{ "azmusica.biz", true },
- { "azmusica.com", true },
{ "azort.com", true },
{ "azrazalea.net", true },
{ "azsgeniedev.azurewebsites.net", true },
@@ -4014,14 +4228,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "b-cyclesshop.ch", true },
{ "b-f-s.pl", true },
{ "b-freerobux.ga", true },
- { "b-landia.net", true },
{ "b-root-force.de", true },
{ "b-services.net", true },
{ "b0k.org", true },
{ "b0rk.com", true },
{ "b1788.net", false },
{ "b1c1l1.com", true },
- { "b1rd.tk", true },
{ "b2and.com", false },
{ "b2bmuzikbank.com", true },
{ "b303.me", true },
@@ -4031,6 +4243,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "b64.club", true },
{ "b72.com", true },
{ "b72.net", true },
+ { "b767.net", true },
{ "baalsworld.de", true },
{ "baazee.de", true },
{ "babacasino.net", true },
@@ -4073,7 +4286,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bacoux.com", true },
{ "bacsituvansuckhoe.com", true },
{ "bacula.jp", true },
- { "bad-wurzach.de", true },
{ "bad.horse", true },
{ "bad.pet", true },
{ "badam.co", true },
@@ -4088,6 +4300,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "badges.stg.fedoraproject.org", true },
{ "badgesenpatches.nl", true },
{ "badhusky.com", true },
+ { "badkamermarkt.nl", true },
{ "badlink.org", true },
{ "badmania.fr", true },
{ "badmintonbible.com", true },
@@ -4109,8 +4322,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bageluncle.com", true },
{ "baggy.me.uk", true },
{ "bagheera.me.uk", true },
+ { "baglu.com", false },
+ { "bagni-chimici.roma.it", true },
{ "bagsofbounce.co.uk", true },
{ "bagspecialist.nl", true },
+ { "bagwrap.com", true },
{ "bah.im", false },
{ "bahaiprayers.io", true },
{ "bahnbonus-praemienwelt.de", true },
@@ -4126,22 +4342,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "baildonbouncycastles.co.uk", true },
{ "baileebee.com", true },
{ "bailonga.com", true },
- { "baitulongbaycruises.com", true },
+ { "baitaplamvan.com", true },
+ { "baitcon.com", true },
{ "baiyangliu.com", true },
{ "bajic.ch", true },
{ "baka-gamer.net", true },
{ "baka.network", true },
{ "baka.org.cn", true },
- { "baka.red", true },
{ "bakaproxy.moe", true },
{ "bakermen.com", true },
{ "bakersafari.co", true },
{ "bakeup.be", true },
{ "bakibal.com", true },
- { "bakim.li", true },
{ "bakingstone.com", true },
{ "bakkerinjebuurt.be", true },
- { "bakongcondo.com", true },
{ "balade-commune.ch", true },
{ "baladecommune.ch", true },
{ "balancascia.com.br", true },
@@ -4150,7 +4364,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "balancenaturalhealthclinic.ca", true },
{ "balboa.io", true },
{ "balcaonet.com.br", true },
- { "balcarek.pl", true },
{ "balconnr.com", true },
{ "balconsverdun.com", true },
{ "baldur.cc", true },
@@ -4165,7 +4378,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "balkonien.org", true },
{ "ball-bizarr.de", true },
{ "ball.holdings", true },
- { "ball3d.es", true },
{ "ballarin.cc", true },
{ "ballejaune.com", true },
{ "balletcenterofhouston.com", true },
@@ -4178,15 +4390,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ballroom.info", true },
{ "balmofgilead.org.uk", true },
{ "balslev.io", true },
- { "balticer.de", true },
+ { "balter.com", true },
{ "balticmed.pl", true },
{ "balticnetworks.com", true },
{ "bamahammer.com", true },
{ "bambooforest.nl", true },
{ "bamboorelay.com", true },
- { "bambumania.com.br", true },
{ "bamily.rocks", true },
{ "bananavapes.com", true },
+ { "bananice.moe", true },
{ "banburybid.com", true },
{ "bancacrs.it", true },
{ "bancaolhares.com.br", true },
@@ -4195,7 +4407,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bancor.network", true },
{ "bandagastrica.es", true },
{ "bandeira1.com.br", true },
- { "bandgap.io", true },
+ { "banderasdelmundo.xyz", true },
{ "bandiga.it", true },
{ "bandito.re", true },
{ "banes.ch", true },
@@ -4209,8 +4421,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bangyu.wang", true },
{ "banham.co.uk", true },
{ "banham.com", true },
+ { "bani99.com", true },
{ "banjostringiz.com", true },
{ "bank.simple.com", false },
+ { "bankanswers.gov", true },
{ "bankbranchlocator.com", true },
{ "bankcardoffer.com", true },
{ "bankee.us", true },
@@ -4224,6 +4438,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "banknet.gov", true },
{ "bankofdenton.com", true },
{ "bankpolicies.com", true },
+ { "banksaround.com", true },
{ "banksiaparkcottages.com.au", true },
{ "bankstownapartments.com.au", true },
{ "bankvanbreda.be", true },
@@ -4233,18 +4448,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "banquevanbreda.be", true },
{ "bantaihost.com", true },
{ "banter.city", true },
- { "baobeiglass.com", true },
{ "baofengtech.com", true },
{ "baopublishing.it", true },
{ "baptistedeleris.fr", true },
{ "bar-harcourt.com", true },
+ { "bara1.se", true },
{ "barabrume.fr", true },
{ "barans2239.com", true },
{ "baravalle.com", true },
+ { "baraxolka.ru", true },
{ "barbarabowersrealty.com", true },
{ "barbarafabbri.com", true },
{ "barbarafeldman.com", true },
{ "barbarians.com", false },
+ { "barbaros.info", true },
{ "barbate.fr", true },
{ "barberlegalcounsel.com", true },
{ "barbershop-harmony.org", true },
@@ -4256,7 +4473,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "barcel.com.mx", true },
{ "barclays.net", true },
{ "barcodeberlin.com", true },
- { "barcoderealty.com", true },
{ "bardes.org", true },
{ "bardiharborow.com", true },
{ "bardiharborow.tk", true },
@@ -4266,11 +4482,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "barisi.me", true },
{ "bariskaragoz.nl", true },
{ "baristador.com", true },
+ { "bariumoxide.com", true },
{ "barkerjr.xyz", true },
{ "barlex.pl", true },
{ "barlotta.net", true },
{ "barnabycolby.io", true },
{ "barnel.com", true },
+ { "barneveldcentrum.nl", true },
{ "barnfotografistockholm.se", true },
{ "barpodsosnami.pl", true },
{ "barracuda.com.tr", true },
@@ -4286,6 +4504,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bart-f.com", true },
{ "barta.me", true },
{ "bartbania.com", true },
+ { "bartel.ws", true },
{ "bartelt.name", true },
{ "barter4crypto.com", true },
{ "barthonia-showroom.de", true },
@@ -4295,6 +4514,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bartula.de", true },
{ "bartzutow.xyz", true },
{ "baruch.me", true },
+ { "barwave.com", true },
{ "bas.co.jp", true },
{ "base-autonome-durable.com", true },
{ "baseballrampage.com", true },
@@ -4304,7 +4524,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "basedonline.nl", true },
{ "baselang.com", true },
{ "baseline.ba", true },
- { "basementdoctor.com", true },
{ "basementdoctornorthwest.com", true },
{ "basementfinishingohio.com", true },
{ "basementwaterproofingdesmoines.com", true },
@@ -4313,8 +4532,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bashstreetband.co.uk", true },
{ "basicapparel.de", true },
{ "basicattentiontoken.org", true },
+ { "basics.net", true },
{ "basketball-brannenburg.de", true },
- { "basnoslovno.com.ua", false },
{ "basnoslovno.ru", true },
{ "basonlinemarketing.nl", true },
{ "bass-pro.ru", true },
@@ -4328,13 +4547,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bastiv.com", true },
{ "bastolino.de", true },
{ "basw.eu", true },
+ { "baswag.de", true },
{ "baswetter.photography", true },
{ "basyspro.net", true },
{ "batcave.tech", true },
{ "batch.com", true },
{ "bati-alu.fr", true },
{ "batiburrillo.net", true },
+ { "batipresta.ch", true },
{ "batistareisfloresonline.com.br", true },
+ { "batkave.net", true },
{ "batlab.ch", true },
{ "batolis.com", true },
{ "batook.org", true },
@@ -4348,13 +4570,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "baugeldspezi.de", true },
{ "baugemeinschaftbernstein.de", true },
{ "baumannfabrice.com", true },
+ { "baumkuchen-aus-dresden.de", true },
{ "baur.de", true },
{ "bausep.de", true },
{ "baustils.com", true },
{ "bauthier-occasions.be", true },
+ { "bautied.de", true },
{ "bauunternehmen-herr.de", true },
{ "bauwens.cloud", true },
{ "bavartec.de", true },
+ { "bawbby.com", true },
{ "bayareaenergyevents.com", true },
{ "baychimo.com", true },
{ "bayden.com", true },
@@ -4379,6 +4604,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "baytalebaa.com", true },
{ "baywatch.io", true },
{ "bayz.de", true },
+ { "baza-gai.com.ua", true },
{ "bazaarbhaav.com", true },
{ "bazaarcompass.com", true },
{ "bazdell.com", true },
@@ -4402,6 +4628,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bblsa.ch", true },
{ "bbnbb.de", true },
{ "bbnx.net", true },
+ { "bbs8080.net", true },
+ { "bbsec.xyz", true },
{ "bbuio.com", false },
{ "bbw.dating", true },
{ "bbwcs.co.uk", true },
@@ -4427,11 +4655,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bcpc-ccgpfcheminots.com", true },
{ "bcrook.com", true },
{ "bcswampcabins.com", true },
+ { "bcubic.net", true },
+ { "bcvps.com", true },
{ "bcyw56.live", false },
{ "bd2positivo.com", true },
{ "bda-boulevarddesairs.com", true },
{ "bdbxml.net", true },
{ "bdd.fi", true },
+ { "bdikaros-network.net", true },
{ "bdpachicago.tech", true },
{ "bdvg.org", true },
{ "be-a-password.ninja", true },
@@ -4475,12 +4706,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "beautyevent.fr", true },
{ "beautykat.ru", true },
{ "beaverdamautos.com", true },
+ { "beavertales.ca", true },
+ { "bebeautiful.business", true },
{ "bebef.de", true },
{ "bebefofuxo.com.br", true },
{ "bebes.uno", true },
{ "bebest.gov", false },
{ "bebetrotteur.com", true },
- { "bebout.domains", true },
{ "bebout.pw", true },
{ "beckenhamcastles.co.uk", true },
{ "beckerantiques.com", true },
@@ -4492,7 +4724,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bedandbreakfasthoekvanholland.com", true },
{ "bedels.nl", true },
{ "bedfordnissanparts.com", true },
- { "bednar.co", true },
{ "bedrijfsfotoreportages.nl", true },
{ "bedrijfshulpverleningfriesland.nl", true },
{ "bedrijfsportaal.nl", true },
@@ -4500,6 +4731,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bedste10.dk", true },
{ "bee-creative.nl", true },
{ "bee-line.org.uk", true },
+ { "bee-social.it", true },
{ "bee.clothing", true },
{ "bee.tools", true },
{ "beechwoodmetalworks.com", true },
@@ -4532,10 +4764,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "beerjet.sk", true },
{ "beerjetcz.cz", true },
{ "beerly.eu", true },
+ { "beermedlar.com", true },
{ "beerradar.no", true },
{ "beerradar.party", true },
{ "beersconf.com", true },
- { "beerview.ga", true },
{ "beeswax-orgone.com", true },
{ "beethoveninlove.com", true },
{ "beetman.net", true },
@@ -4548,7 +4780,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "beframed.ch", true },
{ "befreewifi.info", true },
{ "befundonline.de", true },
- { "begabungsfoerderung.info", true },
{ "begbie.com", true },
{ "beginatzero.com", true },
{ "beginner.nl", true },
@@ -4556,9 +4787,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "behamepresrdce.sk", true },
{ "behamzdarma.cz", true },
{ "behead.de", true },
+ { "beherit.pl", true },
{ "behindthethrills.com", true },
{ "behna24hodin.cz", true },
- { "behoerden-online-dienste.de", true },
{ "behoreal.cz", true },
{ "bei18.com", true },
{ "beichtgenerator.de", true },
@@ -4572,6 +4803,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "belacapa.com.br", true },
{ "belanglos.de", true },
{ "belani.eu", true },
+ { "belanja.express", true },
{ "belarto.be", true },
{ "belarto.de", true },
{ "belarto.es", true },
@@ -4607,10 +4839,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "belly-button-piercings.com", true },
{ "bellyandbrain.amsterdam", true },
{ "belmontgoessolar.org", true },
+ { "belos.at", true },
{ "belouga.org", true },
{ "belt.black", true },
+ { "beltar.nl", true },
{ "belvoirbouncycastles.co.uk", true },
{ "bely-mishka.by", true },
+ { "belyoung.com.br", true },
{ "bemcorp.de", true },
{ "bemindly.com", true },
{ "bemsoft.pl", true },
@@ -4618,10 +4853,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ben-jarvis.co.uk", true },
{ "ben-stock.de", true },
{ "ben.ninja", true },
- { "ben2.co.il", true },
{ "benabrams.it", true },
{ "benandsarah.life", true },
{ "benary.org", true },
+ { "benbalter.com", true },
{ "benbozsa.ca", true },
{ "benburwell.com", true },
{ "benc.io", true },
@@ -4636,6 +4871,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bendyworks.com", true },
{ "beneathvt.com", true },
{ "benedict-balzer.de", true },
+ { "benefitshub.io", true },
+ { "benefitshub.xyz", true },
{ "benepiscinas.com.br", true },
{ "beneri.se", true },
{ "benevita.bio", true },
@@ -4649,13 +4886,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "benjamin.pe", true },
{ "benjaminbedard.com", true },
{ "benjaminblack.net", true },
- { "benjamindietrich.de", true },
{ "benjaminjurke.com", true },
{ "benjaminkopelke.com", true },
{ "benjaminpiquet.fr", true },
{ "benjamins.com", true },
{ "benjaminvasel.de", true },
{ "benjii.me", true },
+ { "benjijaldoner.nl", true },
{ "benleemd.com", true },
{ "benmatthews.com.au", true },
{ "benmillett.us", false },
@@ -4665,8 +4902,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bennierobinson.com", true },
{ "bennink.me", true },
{ "benno.frl", true },
+ { "benny003.de", true },
{ "bennygommers.nl", true },
- { "bennythink.com", true },
{ "benriya.shiga.jp", true },
{ "bensbouncycastles.co.uk", true },
{ "benschnarr.com", true },
@@ -4680,6 +4917,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bentongroup.co.uk", true },
{ "bentonweatherstone.co.uk", true },
{ "bentrask.com", true },
+ { "benvds.com", true },
{ "benz-hikaku.com", true },
{ "benzi.io", true },
{ "beoordelingen.be", true },
@@ -4689,7 +4927,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bequiia.com", true },
{ "beranovi.com", true },
{ "berasavocate.com", true },
+ { "beraten-entwickeln-steuern.de", true },
+ { "berati.tv", true },
{ "berdu.id", true },
+ { "berg-freunde.at", true },
+ { "berg-freunde.ch", true },
{ "bergenhave.nl", true },
{ "berger-chiro.com", true },
{ "bergevoet-fa.nl", true },
@@ -4716,16 +4958,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bergstoneware.com", true },
{ "berichtsheft-vorlage.de", true },
{ "berikod.ru", true },
- { "beringsoegaard.dk", true },
{ "berlin-flirt.de", true },
{ "berlin.dating", true },
{ "bermeitinger.eu", true },
- { "berna.fr", true },
+ { "bermos.net", true },
{ "bernadetteanderes.ch", true },
{ "bernardcontainers.be", true },
{ "bernarddickens.com", true },
{ "bernardez-photo.com", true },
- { "bernardfischer.fr", true },
{ "bernardgo.com", true },
{ "bernardo.fm", true },
{ "bernat.ch", true },
@@ -4738,6 +4978,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bernhardkau.de", true },
{ "bernhardluginbuehl.ch", true },
{ "bernhardluginbuehl.com", true },
+ { "bernieware.de", true },
{ "berodes.be", true },
{ "berr.yt", true },
{ "berra.se", true },
@@ -4789,7 +5030,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "best-wallpaper.net", true },
{ "best10websitebuilders.com", true },
{ "best2pay.net", true },
- { "best66.me", true },
{ "bestattungen-kammerer.de", true },
{ "bestattungshaus-kammerer.de", true },
{ "bestautoinsurance.com", true },
@@ -4815,15 +5055,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bestinver.es", false },
{ "bestjumptrampolines.be", true },
{ "bestkenmoredentists.com", true },
- { "bestlashesandbrows.com", true },
- { "bestlashesandbrows.hu", true },
+ { "bestlooperpedalsguide.com", true },
{ "bestmotherfucking.website", true },
{ "bestoffert.club", true },
{ "bestoliveoils.com", true },
{ "bestpal.eu", true },
{ "bestpartyhire.com", true },
{ "bestperfumebrands.com", true },
- { "bestpig.fr", true },
{ "bestplumbing.com", true },
{ "bestpractice.domains", true },
{ "bestschools.io", true },
@@ -4843,7 +5081,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "betecnet.de", true },
{ "bethanyduke.com", true },
{ "bethpage.net", true },
- { "betleakbot.com", true },
{ "betobaccofree.gov", true },
{ "betonbit.com", true },
{ "betonmarkets.info", true },
@@ -4862,11 +5099,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bettercrypto.org", true },
{ "betterhelp.com", true },
{ "betterjapanese.blog", true },
- { "betterjapanese.com", true },
- { "betterjapanese.org", true },
{ "betterjapanese.xyz", true },
{ "betterna.me", true },
{ "betterscience.org", true },
+ { "bettersecurity.co", true },
{ "bettertechinterviews.com", true },
{ "bettertest.it", true },
{ "bettertime.de", true },
@@ -4891,7 +5127,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bevinco2020.com", true },
{ "bevinsco.org", true },
{ "bevnut.com", true },
+ { "bewegigsruum.ch", true },
{ "bewegungsfluss.com", false },
+ { "bewerbungsfibel.de", true },
{ "bewerbungsfoto-deinfoto.ch", true },
{ "bewonderen.com", true },
{ "bexit.nl", true },
@@ -4905,21 +5143,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "beyondpricing.com", true },
{ "beyondthecode.io", true },
{ "beyondtodaymediagroup.com", true },
- { "beyondtrust.com", true },
{ "beyondweb.net", true },
{ "beyonic.com", true },
{ "beyours.be", true },
{ "bezemkast.nl", true },
+ { "bezlampowe.pl", true },
{ "bezpecnostsiti.cf", true },
+ { "bezposrednio.net.pl", true },
{ "bezr.co.uk", true },
{ "bezzia.com", true },
{ "bf7088.com", true },
{ "bf7877.com", true },
{ "bfam.tv", true },
+ { "bfcgermania88.de", true },
{ "bfem.gov", true },
{ "bfgcdn.com", true },
- { "bfi.wien", false },
{ "bflix.tv", true },
+ { "bfob.gg", true },
{ "bforb.sk", true },
{ "bfp-mail.de", true },
{ "bfpg.org", true },
@@ -4932,6 +5172,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bghost.xyz", true },
{ "bgkoleda.bg", true },
{ "bglsingles.de", true },
+ { "bgmn.me", true },
{ "bgp.space", true },
{ "bgr34.cz", true },
{ "bgs-game.com", true },
@@ -4956,8 +5197,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bible-maroc.com", true },
{ "bible.ru", true },
{ "bibleonline.ru", true },
+ { "bibles.com.tw", true },
{ "biblethoughts.blog", true },
{ "bibliaon.com", true },
+ { "biblio.wiki", true },
{ "biblioblog.fr", true },
{ "bibliomarkt.ch", true },
{ "biblionaut.net", true },
@@ -4971,12 +5214,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bicranial.io", true },
{ "bicycle-events.com", true },
{ "bicycleframeiz.com", true },
+ { "bicycleuniverse.com", true },
{ "biddl.com", true },
{ "biddle.co", true },
{ "bidman.cz", true },
{ "bidman.eu", true },
{ "bidu.com.br", true },
{ "bie.edu", false },
+ { "bie08.com", true },
+ { "bie35.com", true },
+ { "bie79.com", true },
{ "biegal.ski", true },
{ "biegner-technik.de", true },
{ "biehl.tech", true },
@@ -4985,15 +5232,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bien-etre-sante.info", true },
{ "bienici.com", true },
{ "bienoubien.org", true },
- { "biensenvue.com", true },
- { "bienstar.tv", true },
{ "bierbaumer.net", true },
{ "biergaizi.info", true },
{ "bieser.ch", true },
{ "biester.pro", true },
{ "bieumau.net", true },
{ "bifrost.cz", true },
- { "biftin.net", true },
{ "big-andy.co.uk", true },
{ "big-bounce.co.uk", true },
{ "big-fluglaerm-hamburg.de", true },
@@ -5010,7 +5254,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bigideasnetwork.com", true },
{ "bigio.com.br", true },
{ "biglou.com", false },
- { "bignumworks.com", true },
{ "bigorbitgallery.org", true },
{ "bigserp.com", true },
{ "bigshopper.com", true },
@@ -5025,6 +5268,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bijoux.com.br", true },
{ "bijouxcherie.com", true },
{ "biju-neko.jp", true },
+ { "bijuteriicualint.ro", true },
{ "bike-discount.de", true },
{ "bike-kurse.ch", true },
{ "bike-shack.com", true },
@@ -5044,13 +5288,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bildkomponist.de", true },
{ "bildschirmflackern.de", true },
{ "biletyplus.by", true },
- { "biletyplus.com", true },
{ "biletyplus.ua", true },
{ "bilgo.com", true },
{ "bilibili.link", true },
+ { "bilibili.red", true },
{ "bilimoe.com", true },
{ "bilke.org", true },
{ "billaud.eu.org", true },
+ { "billfazz.com", true },
{ "billgoldstein.name", true },
{ "billhartzer.com", true },
{ "billiger-mietwagen.de", true },
@@ -5069,8 +5314,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "billyoh.com", true },
{ "billysbouncycastlehire.co.uk", true },
{ "billywig.stream", true },
- { "biloplysninger.dk", true },
- { "bilsho.com", true },
{ "biltullen.com", true },
{ "bimbo.com", false },
{ "bimbo.com.ar", false },
@@ -5084,7 +5327,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "binans.io", true },
{ "binans.net", true },
{ "binans.xyz", true },
- { "binarization.com", true },
{ "binaryapparatus.com", true },
{ "binaryappdev.com", true },
{ "binarycreations.scot", true },
@@ -5099,6 +5341,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "binhex.net", true },
{ "binkconsulting.be", true },
{ "binnenmeer.de", true },
+ { "binsp.net", true },
{ "bintangsyurga.com", true },
{ "bintelligence.info", true },
{ "binti.com", true },
@@ -5106,6 +5349,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bio-disinfestazione.it", true },
{ "bio-feed.org", true },
{ "bio24.si", true },
+ { "bioastin.de", true },
{ "bioatelier.it", true },
{ "biobuttons.ch", true },
{ "biocheminee.com", true },
@@ -5139,6 +5383,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "biometrics.es", true },
{ "biomin.co.uk", true },
{ "biomodra.cz", true },
+ { "biopronut.com", true },
{ "biopsychiatry.com", true },
{ "bioresonanz-ibiza.com", true },
{ "biosafe.ch", true },
@@ -5162,7 +5407,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "birgit-rydlewski.de", true },
{ "birgitandmerlin.com", true },
{ "birkenstab.de", true },
- { "birkhoff.me", true },
{ "birminghamcastlehire.co.uk", true },
{ "birminghamsunset.com", true },
{ "birthdaytip.com", true },
@@ -5198,7 +5442,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bitbucket.io", true },
{ "bitbucket.org", true },
{ "bitburner.de", true },
- { "bitcalt.eu.org", true },
+ { "bitcert.com", true },
{ "bitchigo.com", true },
{ "bitcoin-india.net", true },
{ "bitcoin-india.org", true },
@@ -5227,7 +5471,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bitfehler.net", true },
{ "bitfence.io", true },
{ "bitfinder.nl", true },
- { "bitfolio.org", true },
{ "bitfuse.net", true },
{ "bitgo.com", true },
{ "bitgrapes.com", true },
@@ -5252,16 +5495,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bitpoll.org", true },
{ "bitpumpe.net", true },
{ "bitref.com", true },
+ { "bitrefill.com", true },
{ "bitrush.nl", true },
{ "bits-hr.de", true },
{ "bitsafe.com.my", true },
- { "bitsburg.ru", true },
{ "bitski.com", true },
{ "bitskins.co", true },
{ "bitskrieg.net", true },
{ "bitso.com", true },
{ "bitsoffreedom.nl", true },
- { "bitstep.ca", true },
{ "bitstorm.nl", true },
{ "bitstorm.org", true },
{ "bitsum.com", true },
@@ -5276,6 +5518,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bitxel.com.co", true },
{ "biupay.com.br", true },
{ "biurokarier.edu.pl", true },
+ { "bixbydevelopers.com", true },
{ "bixservice.com", true },
{ "biyou-homme.com", true },
{ "biz4x.com", true },
@@ -5289,19 +5532,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "biztera.com", true },
{ "biztok.eu", true },
{ "biztouch.work", true },
+ { "bizzdesign.cloud", true },
{ "bizzdesign.com", true },
{ "bjarnerest.de", true },
{ "bjmgeek.science", true },
{ "bjmun.cn", true },
+ { "bjolanta.pl", true },
{ "bjornhelmersson.se", true },
{ "bjornjohansen.no", true },
{ "bjs.gov", true },
{ "bjsbouncycastles.com", true },
{ "bkentertainments.co.uk", true },
+ { "bkhayes.com", true },
{ "bkhpilates.co.uk", true },
{ "bkkposn.com", true },
{ "bklaindia.com", true },
{ "bkositspartytime.co.uk", true },
+ { "bkt.to", true },
+ { "bl00.se", true },
{ "bl4ckb0x.biz", true },
{ "bl4ckb0x.com", true },
{ "bl4ckb0x.de", true },
@@ -5311,38 +5559,38 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bl4ckb0x.org", true },
{ "blaauwgeers.pro", true },
{ "blabber.im", true },
- { "blablacar.co.uk", true },
- { "blablacar.com", true },
- { "blablacar.com.tr", true },
- { "blablacar.com.ua", true },
- { "blablacar.de", true },
- { "blablacar.es", true },
- { "blablacar.fr", true },
- { "blablacar.hr", true },
- { "blablacar.hu", true },
- { "blablacar.in", true },
- { "blablacar.it", true },
- { "blablacar.mx", true },
- { "blablacar.nl", true },
- { "blablacar.pl", true },
- { "blablacar.pt", true },
- { "blablacar.ro", true },
- { "blablacar.rs", true },
- { "blablacar.ru", true },
+ { "blablacar.co.uk", false },
+ { "blablacar.com", false },
+ { "blablacar.com.tr", false },
+ { "blablacar.com.ua", false },
+ { "blablacar.de", false },
+ { "blablacar.es", false },
+ { "blablacar.fr", false },
+ { "blablacar.hr", false },
+ { "blablacar.hu", false },
+ { "blablacar.in", false },
+ { "blablacar.it", false },
+ { "blablacar.mx", false },
+ { "blablacar.nl", false },
+ { "blablacar.pl", false },
+ { "blablacar.pt", false },
+ { "blablacar.ro", false },
+ { "blablacar.rs", false },
+ { "blablacar.ru", false },
{ "black-khat.com", true },
{ "black-mail.nl", true },
- { "black-pool.net", true },
{ "black-raven.fr", true },
{ "black.dating", true },
{ "black.host", true },
+ { "black1ce.com", true },
{ "blackandpony.de", true },
{ "blackbag.nl", true },
{ "blackbase.de", true },
{ "blackbird-whitebird.com", true },
+ { "blackbyte.it", true },
{ "blackcat.ca", true },
{ "blackcatinformatics.ca", true },
{ "blackcatinformatics.com", true },
- { "blackcicada.com", true },
{ "blackdotbrewery.com", true },
{ "blackdown.de", true },
{ "blackedbyte.com", true },
@@ -5356,9 +5604,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "blackilli.de", true },
{ "blackislegroup.com", true },
{ "blackjackballroomcasino.info", true },
- { "blackkeg.ca", true },
{ "blackl.net", true },
{ "blacklightparty.be", true },
+ { "blackmagicshaman.com", true },
{ "blackmonday.gr", true },
{ "blacknetwork.eu", true },
{ "blacknova.io", true },
@@ -5373,18 +5621,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "blacktown.eu", true },
{ "blackyau.cc", true },
{ "blackys-chamber.de", true },
+ { "blaindalefarms.com", true },
{ "blaise.io", true },
{ "blakecoin.org", true },
{ "blakekhan.com", true },
{ "blakezone.com", true },
{ "blameomar.com", true },
{ "blancodent.com", true },
- { "blankersfamily.com", true },
{ "blanket.technology", true },
+ { "blantr.com", true },
{ "blasorchester-runkel.de", true },
{ "blastentertainment.com.au", true },
{ "blastersklan.com", true },
{ "blastzoneentertainments.co.uk", true },
+ { "blatnice.cf", true },
+ { "blatnice.ga", true },
+ { "blatnice.gq", true },
+ { "blatnice.ml", true },
+ { "blatnice.tk", true },
{ "blaudev.es", true },
{ "blauerhunger.de", true },
{ "blayne.me", true },
@@ -5396,6 +5650,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bleche-onlineshop.de", true },
{ "blechinger.io", true },
{ "blechschmidt.saarland", true },
+ { "blend.guru", true },
{ "blenderinsider.com", true },
{ "blenderrecipereviews.com", true },
{ "blending.kr", true },
@@ -5406,18 +5661,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "blenheimears.com", true },
{ "blenneros.net", false },
{ "blessedguy.com", true },
- { "blessedguy.net", false },
{ "blewebprojects.com", true },
{ "blichmann.eu", true },
+ { "blicy.net", true },
{ "blidz.com", true },
{ "blieque.co.uk", true },
{ "bliesekow.net", true },
{ "blikk.no", true },
- { "blikund.swedbank.se", true },
{ "blinder.com.co", true },
{ "blindpigandtheacorn.com", true },
{ "blinds-unlimited.com", true },
{ "blingsparkleshine.com", true },
+ { "blingwang.cn", true },
{ "blink-security.com", true },
{ "blinking.link", true },
{ "blinkspeed.eu", true },
@@ -5435,12 +5690,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "blm.gov", true },
{ "blo-melchiorshausen.de", true },
{ "blobfolio.com", true },
+ { "blocher.ch", true },
+ { "blochoestergaard.com", true },
{ "block-this.com", true },
{ "block65.com", true },
{ "blockchain.com", true },
{ "blockchain.info", true },
{ "blockchainced.com", true },
{ "blockchaindaigakko.jp", true },
+ { "blockchainevents.nl", true },
{ "blockchainwhiz.com", true },
{ "blockcheck.network", true },
{ "blockedyourcar.com", true },
@@ -5457,18 +5715,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "blog.linode.com", false },
{ "blog.lookout.com", false },
{ "blogaid.net", true },
+ { "bloganchoi.com", true },
{ "blogarts.net", true },
{ "blogbooker.com", true },
{ "blogconcours.net", true },
{ "blogdelosjuguetes.com", true },
+ { "blogdieconomia.it", true },
+ { "blogdimoda.com", true },
+ { "blogdimotori.it", true },
{ "blogexpert.ca", true },
{ "bloggermumofthreeboys.com", true },
{ "blogging-life.com", true },
{ "bloggingwithchildren.com", true },
{ "bloggytalky.com", true },
{ "bloginbeeld.nl", true },
+ { "blogit.fi", true },
{ "bloglines.co.za", true },
{ "bloglogistics.com", true },
+ { "bloglyric.com", true },
{ "blogom.at", true },
{ "blogpentrusuflet.ro", true },
{ "blogreen.org", true },
@@ -5477,12 +5741,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "blogtroterzy.pl", true },
{ "blok56.nl", true },
{ "blokmy.com", true },
- { "blood4pets.tk", true },
{ "bloodhunt.pl", true },
{ "bloodsports.org", true },
{ "bloody.pw", true },
{ "bloom-avenue.com", true },
- { "bloom.sh", true },
+ { "bloom.sh", false },
{ "bltc.co.uk", true },
{ "bltc.com", true },
{ "bltc.net", true },
@@ -5490,17 +5753,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bltc.org.uk", true },
{ "bltdirect.com", true },
{ "blubberladen.de", true },
+ { "blubop.fr", true },
{ "blue-gmbh-erfahrungen.de", true },
{ "blue-gmbh.de", true },
{ "blue-leaf81.net", true },
{ "blue42.net", true },
+ { "bluebahari.gq", true },
{ "blueblou.com", true },
- { "bluecards.eu", true },
{ "bluechilli.com", true },
{ "bluecon.ninja", true },
{ "bluecrazii.nl", true },
{ "blued.moe", true },
- { "bluedata.ltd", true },
{ "bluedeck.org", true },
{ "blueflare.org", true },
{ "bluefrag.com", true },
@@ -5509,19 +5772,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bluekrypt.com", true },
{ "blueliquiddesigns.com.au", true },
{ "bluemeda.web.id", true },
+ { "bluemosh.com", true },
{ "bluemtnrentalmanagement.ca", true },
{ "bluenote9.com", true },
{ "blueoakart.com", true },
- { "blueoceantech.us", true },
{ "blueperil.de", true },
{ "bluepoint.one", true },
{ "bluepostbox.de", true },
+ { "bluepromocode.com", true },
{ "bluerootsmarketing.com", true },
- { "blues-and-pictures.com", true },
{ "blueskycoverage.com", true },
{ "bluestardiabetes.com", true },
{ "bluesuncamping.com", true },
{ "bluesunhotels.com", true },
+ { "blueswandaily.com", true },
{ "bluetexservice.com", true },
{ "bluewavewebdesign.com", true },
{ "bluex.im", true },
@@ -5529,7 +5793,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bluex.net", true },
{ "bluex.org", true },
{ "blueyed.eu", true },
- { "blui.ml", true },
{ "bluiandaj.ml", true },
{ "bluimedia.com", true },
{ "blumenfeldart.com", true },
@@ -5547,11 +5810,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bmhglobal.com.au", true },
{ "bminton.is-a-geek.net", true },
{ "bmk-kramsach.at", true },
+ { "bmoattachments.org", true },
+ { "bmone.net", true },
{ "bmriv.com", true },
{ "bmros.com.ar", true },
{ "bmw-motorradclub-seefeld.de", true },
{ "bmwcolors.com", true },
{ "bn1digital.co.uk", true },
+ { "bn4t.me", true },
{ "bnbsinflatablehire.co.uk", true },
{ "bngs.pl", true },
{ "bnin.org", true },
@@ -5568,7 +5834,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "boattrader.com.au", true },
{ "bobaly.es", true },
{ "bobancoamigo.com", true },
- { "bobaobei.net", true },
{ "bobazar.com", true },
{ "bobcopeland.com", true },
{ "bobkidbob.com", true },
@@ -5611,6 +5876,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "boiseonlinemall.com", true },
{ "boisewaldorf.org", true },
{ "bokadoktorn-test.net", true },
+ { "bokadoktorn.se", true },
{ "boke112.com", true },
{ "bokka.com", true },
{ "bokkeriders.com", true },
@@ -5618,7 +5884,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "boldmediagroup.com", true },
{ "boldt-metallbau.de", true },
{ "bolektro.de", true },
+ { "boleyn.su", true },
{ "bolgarnyelv.hu", true },
+ { "bolivarfm.com.ve", true },
{ "bologna-disinfestazioni.it", true },
{ "bolovegna.it", true },
{ "bolt.cm", false },
@@ -5641,12 +5909,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bondlink.com", true },
{ "bondoer.fr", true },
{ "bondskampeerder.nl", true },
- { "bondtofte.dk", true },
{ "bonebunny.de", true },
{ "bonesserver.com", true },
{ "bonfi.net", true },
{ "bongo.cat", true },
- { "bonibuty.com", true },
{ "bonifacius.be", true },
{ "bonito.pl", true },
{ "bonnant-associes.ch", true },
@@ -5654,6 +5920,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bonnebouffe.fr", true },
{ "bonniecoloring.com", true },
{ "bonniedraw.com", true },
+ { "bonniekitchen.com", true },
{ "bonnieradvocaten.nl", true },
{ "bonnsustainabilityportal.de", true },
{ "bonnyprints.at", true },
@@ -5664,6 +5931,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bonqoeur.ca", true },
{ "bonrecipe.com", true },
{ "bonsaimedia.nl", true },
+ { "bonsi.net", true },
{ "bonux.co", true },
{ "boodmo.com", true },
{ "boogaerdtmakelaars.nl", true },
@@ -5681,6 +5949,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "booksinthefridge.at", true },
{ "booksouthafrica.travel", true },
{ "booktracker-org.appspot.com", true },
+ { "bookzaga.com", true },
{ "bool.be", true },
{ "boombv.com", true },
{ "boomersurf.com", true },
@@ -5696,19 +5965,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "booox.pw", true },
{ "boop.gq", true },
{ "boop.pro", true },
+ { "booplab.com", true },
{ "booq.org", true },
{ "booquiz.com", true },
{ "boosinflatablegames.co.uk", true },
{ "boost.fyi", true },
{ "boost.ink", true },
+ { "boothlabs.me", true },
{ "bootjp.me", false },
+ { "bootsschule-weiss.de", true },
{ "bopiweb.com", true },
{ "bopp.org", true },
{ "borahan.net", true },
+ { "borchers.ninja", true },
{ "bordadoenpedreria.com", true },
{ "bordes.me", true },
{ "boredhackers.com", true },
+ { "boreo.si", true },
{ "borg.cloud", true },
+ { "borgodigatteraia.it", true },
{ "boringsmith.com", true },
{ "boris64.net", true },
{ "borisenko.by", true },
@@ -5719,7 +5994,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "borneodictionary.com", true },
{ "bornfiber.dk", true },
{ "bornhack.dk", true },
- { "borowski.pw", true },
{ "borrelpartybus.nl", true },
{ "borysek.net", true },
{ "bosabosa.org", true },
@@ -5735,7 +6009,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "botguard.net", true },
{ "bothellwaygarage.net", true },
{ "botoes-primor.pt", true },
- { "botsindiscord.me", true },
+ { "botox.bz", true },
+ { "botserver.de", true },
{ "bottaerisposta.net", true },
{ "bottineauneighborhood.org", true },
{ "bottke.berlin", true },
@@ -5813,7 +6088,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bouncycastlehire-norwich.com", true },
{ "bouncycastlehire-sheffield.co.uk", true },
{ "bouncycastlehire.co.uk", true },
- { "bouncycastlehireauckland.co.nz", true },
{ "bouncycastlehirebarnstaple.co.uk", true },
{ "bouncycastlehirebexley.co.uk", true },
{ "bouncycastlehirechelmsford.org.uk", true },
@@ -5882,21 +6156,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bowntycdn.net", true },
{ "boxpeg.com", true },
{ "boxpirates.to", true },
+ { "boxspringbett-160x200.de", true },
{ "boxvergelijker.nl", true },
{ "boyerassoc.com", true },
{ "boyfriendcookbook.com", true },
{ "boyhost.cn", true },
{ "boyinglanguage.com", true },
{ "boyntonobserver.org", true },
+ { "boysontech.com", true },
{ "boz.nl", false },
{ "bozdoz.com", true },
{ "bozit.com.au", true },
{ "bozosbouncycastles.co.uk", true },
{ "bpa.gov", true },
- { "bpaste.net", true },
{ "bpastudies.org", true },
{ "bpo.ovh", true },
{ "bpol-forum.de", true },
+ { "bps.vc", true },
{ "bqp.io", true },
{ "bqr.ch", true },
{ "br.search.yahoo.com", false },
@@ -5921,7 +6197,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "brahmstaedt.de", true },
{ "braiampeguero.xyz", true },
{ "brailsford.xyz", true },
- { "brain-e.co", true },
{ "brain-force.ch", true },
{ "brainball.fr", true },
{ "brainfork.org", true },
@@ -5937,7 +6212,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "brainwork.space", true },
{ "brakemanpro.com", true },
{ "brakpanplumber24-7.co.za", true },
- { "brakstad.org", true },
{ "bralnik.com", true },
{ "brambogaerts.nl", true },
{ "bramhallsamusements.com", true },
@@ -5960,10 +6234,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "brandonwalker.me", true },
{ "brandrocket.dk", true },
{ "brandstead.com", true },
+ { "brandtrapselfie.nl", true },
{ "brandweerfraneker.nl", true },
{ "brandweertrainingen.nl", true },
+ { "brandweeruitgeest.nl", true },
{ "brank.as", true },
- { "branw.xyz", true },
+ { "branw.xyz", false },
{ "brasal.ma", true },
{ "brasalcosmetics.com", true },
{ "brashear.me", true },
@@ -5993,12 +6269,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "brazilian.dating", true },
{ "brazillens.com", true },
{ "brazoriabar.org", true },
+ { "brb.city", true },
{ "brck.nl", true },
{ "brd.ro", true },
{ "breadandlife.org", true },
{ "breadofgod.org", true },
{ "breakingtech.it", true },
{ "breakpoint.at", true },
+ { "breakwall.ml", true },
{ "breaky.de", true },
{ "breathedreamgo.com", true },
{ "breathingblanket.com", true },
@@ -6017,7 +6295,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "brefy.com", true },
{ "brege.org", true },
{ "breitband.bz.it", true },
- { "breitbild-beamer.de", true },
{ "brejoc.com", true },
{ "brelahotelberulia.com", true },
{ "bremen-restaurants.de", true },
@@ -6030,14 +6307,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bretcarmichael.com", true },
{ "brettabel.com", true },
{ "brettcornwall.com", true },
- { "brettelliff.com", true },
{ "brettlawyer.com", true },
{ "brettw.xyz", true },
{ "bretzner.fr", true },
{ "brevboxar.se", true },
{ "brewsouth.com", true },
- { "brewtrackr.com", true },
- { "breznet.com", true },
+ { "brewspark.co", true },
+ { "brewvo.com", true },
{ "brgins.com", true },
{ "brian-gordon.name", true },
{ "brianalaway.com", true },
@@ -6065,32 +6341,32 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bridgevest.com", true },
{ "bridgingdirectory.com", true },
{ "bridltaceng.com", true },
- { "bridzius.lt", true },
{ "brie.tech", true },
{ "briefassistant.com", true },
{ "briefhansa.de", true },
{ "briefvorlagen-papierformat.de", true },
{ "brier.me", true },
{ "briffoud.fr", true },
- { "briggsleroux.com", true },
{ "brighouse-leisure.co.uk", true },
{ "brightday.bz", true },
{ "brightendofleasecleaning.com.au", true },
- { "brightlifedirect.com", true },
{ "brightonbank.com", true },
{ "brightonbouncycastles.net", true },
{ "brightonchilli.org.uk", true },
{ "brightonzhang.com", true },
+ { "brightside.com", true },
{ "brightworkcreative.com", true },
{ "brigidaarie.com", true },
{ "brilliantbouncyfun.co.uk", true },
{ "brilliantproductions.co.nz", true },
{ "brimspark.systems", true },
{ "brio-shop.ch", true },
+ { "briograce.com.mx", true },
{ "brioukraine.store", true },
{ "brisbanelogistics.com.au", true },
{ "bristebein.com", true },
{ "bristolandwestonsuperbounce.com", true },
+ { "britanniacateringyeovil.co.uk", true },
{ "britanniapandi.com", true },
{ "britelocate.com", true },
{ "britishbeef.com", true },
@@ -6099,12 +6375,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "britishpearl.com", true },
{ "britishsciencefestival.org", true },
{ "britishscienceweek.org", true },
+ { "britishsfaward.org", true },
{ "britishsnoring.co.uk", true },
{ "britneyclause.com", true },
{ "brittanyferriesnewsroom.com", true },
{ "britton-photography.com", true },
{ "brk.st", true },
{ "brmsalescommunity.com", true },
+ { "brn.by", true },
{ "brnojebozi.cz", true },
{ "bro.hk", true },
{ "broadbandnd.com", true },
@@ -6118,22 +6396,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "broersma.com", true },
{ "broeselei.at", true },
{ "brokenhands.io", true },
+ { "brokernet.ie", false },
{ "brokervalues.com", true },
{ "brompton-cocktail.com", true },
{ "bronetb2b.com.br", true },
{ "bronevichok.ru", true },
{ "bronwynlewis.com", true },
{ "broodbesteld.nl", true },
- { "brooke-fan.com", true },
{ "brookehatton.com", false },
{ "brooklynrealestateblog.com", true },
{ "brookworth.com", true },
{ "brossmanit.com", true },
- { "brother-printsmart.nl", true },
{ "brouillard.ch", true },
{ "brouwerijdeblauweijsbeer.nl", true },
{ "brovelton.com", true },
- { "brown-devost.com", true },
{ "brownfieldstsc.org", true },
{ "brownihc.com", true },
{ "browntowncountryclub.com", true },
@@ -6143,11 +6419,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "brring.com", true },
{ "brrr.fr", true },
{ "bru6.de", true },
+ { "brubank.com", true },
{ "brubankv1-staging.azurewebsites.net", true },
{ "brucekovner.com", true },
{ "brucemartin.net", true },
{ "brucemobile.de", false },
{ "bruck.me", true },
+ { "bruckner.li", true },
{ "brudkista.nu", true },
{ "brudkista.se", true },
{ "brudkistan.nu", true },
@@ -6159,16 +6437,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "brunner.ninja", true },
{ "brunohenc.from.hr", true },
{ "brunoproduit.ch", true },
- { "brunoramos.com", true },
{ "brunosouza.org", true },
{ "brush.ninja", true },
- { "brutus2.ga", true },
+ { "brushcreekyachts.com", true },
{ "bruun.co", true },
{ "bry.do", true },
{ "bryankaplan.com", true },
{ "bryanquigley.com", true },
{ "bryansmith.net", true },
{ "bryansmith.tech", true },
+ { "bryantzheng.com", true },
+ { "bryantzheng.org", true },
{ "brycecanyon.net", true },
{ "brycecanyonnationalpark.com", true },
{ "bryggebladet.dk", true },
@@ -6186,7 +6465,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bsd-box.net", true },
{ "bsdes.net", true },
{ "bsdfreak.dk", true },
- { "bsdlab.com", true },
{ "bsdracing.ca", true },
{ "bsdunix.xyz", true },
{ "bsee.gov", true },
@@ -6198,10 +6476,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bsidessf.com", true },
{ "bsimerch.com", true },
{ "bslim-e-boutique.com", true },
+ { "bsmomo-api.com", true },
{ "bso-buitengewoon.nl", true },
{ "bsociabl.com", true },
{ "bsp-southpool.com", true },
- { "bsquared.org", true },
{ "bst.gg", true },
{ "bstoked.net", true },
{ "bsw-solution.de", true },
@@ -6209,19 +6487,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bta.lv", false },
{ "btcarmory.com", true },
{ "btcbolsa.com", true },
- { "btcontract.com", true },
{ "btcpop.co", true },
- { "btcycle.org", true },
{ "btine.tk", true },
- { "btio.pw", true },
+ { "btio.pw", false },
{ "btmstore.com.br", true },
{ "btnissanparts.com", true },
{ "btorrent.xyz", true },
{ "btsapem.com", true },
+ { "btshe.net", true },
{ "btsoft.eu", true },
- { "btsow.com", true },
+ { "btsow.com", false },
{ "bttc.co.uk", true },
- { "btth.live", true },
{ "btth.pl", true },
{ "btth.tv", true },
{ "bttorj45.com", true },
@@ -6231,13 +6507,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bubblin.io", true },
{ "bubblinghottubs.co.uk", true },
{ "bubblybouncers.co.uk", true },
- { "bubhub.io", true },
{ "bubulazi.com", false },
{ "bubulazy.com", false },
{ "bucek.cz", true },
{ "buch-angucken.de", true },
{ "buchhandlungkilgus.de", true },
{ "buchwegweiser.com", true },
+ { "buck-hydro.de", true },
{ "buckelewrealtygroup.com", true },
{ "bucketlist.co.ke", true },
{ "buckypaper.com", true },
@@ -6267,7 +6543,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "buettgens.net", true },
{ "buffaloautomation.com", true },
{ "buffaloturf.com.au", true },
- { "buffetbouc.com", true },
{ "bug.blue", true },
{ "bug.ee", true },
{ "bugcrowd.com", true },
@@ -6284,17 +6559,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "buildhoscaletraingi.com", true },
{ "buildingclouds.de", true },
{ "buildingcostestimators.co.uk", true },
+ { "builditfl.com", true },
{ "builditsolutions.net", true },
{ "buildkite.com", true },
{ "buildmorebuslanes.com", true },
{ "buildplease.com", true },
- { "buildrightbuildingservicesltd.co.uk", true },
{ "buileo.com", true },
{ "builtory.my", true },
{ "builtvisible.com", true },
{ "builtwith.com", true },
{ "buissonchardin.fr", true },
+ { "bukiskola.hu", true },
+ { "bukivallalkozasok.hu", true },
{ "bukkenfan.jp", true },
+ { "bukpcszerviz.hu", true },
{ "bul3seas.eu", true },
{ "bulario.com", true },
{ "bulario.net", true },
@@ -6306,29 +6584,37 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bulktrade.de", true },
{ "bulktshirtsjohannesburg.co.za", true },
{ "bulkwholesalesweets.co.uk", true },
- { "bull.id.au", true },
- { "bulldog-hosting.de", true },
+ { "bulldog-hosting.de", false },
+ { "bulldoghire.co.uk", true },
{ "bulledair-savons.ch", true },
+ { "bulletpoint.cz", true },
{ "bullettags.com", true },
{ "bullpendaily.com", true },
{ "bullshitmail.nl", true },
{ "bullterrier.nu", true },
+ { "bulwarkcrypto.com", true },
{ "bulwarkhost.com", true },
- { "bunbun.be", false },
{ "bund-von-theramore.de", true },
{ "bundespolizei-forum.de", true },
{ "bungee.pw", true },
{ "bungee.systems", true },
{ "bungeetaco.com", true },
+ { "bunix.de", true },
{ "bunkyo-life.com", true },
{ "bunny-rabbits.com", true },
{ "bunnycarenotes.com", true },
{ "bunnydiamond.de", true },
{ "bunnyvishal.com", true },
+ { "bunq.love", true },
{ "bunzy.ca", true },
{ "bupropion.com", true },
- { "bupu.ml", true },
+ { "buqi.cc", true },
{ "buradangonder.com", true },
+ { "burakogun.com", true },
+ { "burakogun.com.tr", true },
+ { "burakogun.net", true },
+ { "burakogun.net.tr", true },
+ { "burakogun.org", true },
{ "burcevo.info", true },
{ "burfordbedandbreakfast.co.uk", true },
{ "burg-hohnstein.com", true },
@@ -6360,7 +6646,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "burzmali.com", true },
{ "burzmedia.com", true },
{ "burzstudios.com", true },
- { "busanhs.win", true },
+ { "burzum.ch", true },
+ { "buscandolosmejores.com", true },
{ "bushbaby.com", true },
{ "busindre.com", true },
{ "business-garden.com", true },
@@ -6368,15 +6655,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "businesscentermarin.ch", true },
{ "businessesdirectory.eu", true },
{ "businessfactors.de", true },
- { "businessimmigration-eu.com", true },
- { "businessimmigration-eu.ru", true },
{ "businessloanconnection.org", false },
{ "businessmadeeasypodcast.com", true },
{ "businessmarketingblog.org", true },
{ "businessplanexperts.ca", true },
- { "businessradar.com.au", true },
{ "businesswebadmin.com", true },
{ "busit.be", true },
+ { "busiteyiengelle.com", true },
{ "busold.ws", true },
{ "bustadice.com", true },
{ "bustimes.org", true },
@@ -6390,11 +6675,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "butteramotors.com", true },
{ "buttonline.ch", true },
{ "buttonrun.com", true },
- { "buturyu.net", true },
+ { "butzies.ddnss.org", true },
{ "buurtgenotencollectief.nl", true },
{ "buurtpreventiefraneker.nl", true },
{ "buxum-communication.ch", true },
{ "buy-out.jp", true },
+ { "buy2dollars.com", true },
{ "buybike.shop", true },
{ "buycarpet.shop", true },
{ "buycbd.store", true },
@@ -6414,12 +6700,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "buyseo.store", true },
{ "buysuisse.shop", true },
{ "buytermpaper.com", true },
- { "buytheway.co.za", true },
{ "buywine.shop", true },
{ "buzz.tools", true },
{ "buzzcontent.com", true },
{ "buzzprint.it", true },
{ "bvalle.com", true },
+ { "bvisible.be", true },
{ "bvl.aero", true },
{ "bw.codes", true },
{ "bwcscorecard.org", true },
@@ -6427,25 +6713,32 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bwfc.nl", true },
{ "bwh1.net", false },
{ "bwilkinson.co.uk", true },
+ { "bwin8601.com", true },
+ { "bwin8602.com", true },
+ { "bwin8603.com", true },
+ { "bwin8604.com", true },
+ { "bwin8605.com", true },
+ { "bwin8606.com", true },
{ "bwl-earth.club", true },
{ "bws16.de", true },
{ "bwserhoscaletrainaz.com", true },
{ "bx-n.de", true },
- { "bxdev.me", true },
{ "bxp40.at", true },
{ "byange.pro", true },
{ "byatte.com", true },
{ "bye-bye.us", true },
{ "byeskille.no", true },
{ "bygningsregistrering.dk", true },
+ { "byhe.me", true },
{ "byiu.info", false },
+ { "byjuschennai.com", true },
{ "byken.cn", true },
{ "bymark.co", true },
{ "bymike.co", true },
{ "bynder.com", true },
- { "bynet.cz", true },
{ "bynumlaw.net", true },
{ "bypass.sh", true },
+ { "bypetula.cz", true },
{ "byr.moe", true },
{ "byrko.cz", true },
{ "byrko.sk", true },
@@ -6459,14 +6752,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "bytecode.no", true },
{ "bytecrafter.com", true },
{ "bytecrafter.net", true },
+ { "byteflies.com", true },
{ "bytejail.com", true },
{ "bytema.cz", true },
{ "bytema.eu", true },
{ "bytema.re", true },
{ "bytema.sk", true },
{ "bytemix.cloud", true },
- { "byteowls.com", false },
- { "bytepark.de", true },
{ "bytepen.com", true },
{ "bytes.co", true },
{ "bytes.fyi", true },
@@ -6496,8 +6788,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "c.cc", true },
{ "c0rporation.com", true },
{ "c2design.it", true },
+ { "c2lab.net", true },
{ "c2o-library.net", true },
- { "c3sign.de", true },
+ { "c3sign.de", false },
{ "c3vo.de", true },
{ "c3w.at", true },
{ "c3wien.at", true },
@@ -6514,7 +6807,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "caarecord.org", true },
{ "caasd.org", true },
{ "cabaladada.org", true },
- { "cabarave.com", true },
+ { "cabanactf.com", true },
{ "cabforum.org", true },
{ "cabineritten.nl", true },
{ "cabinet-bedin.com", true },
@@ -6532,11 +6825,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cachetagalong.com", true },
{ "cachetur.no", true },
{ "cackette.com", true },
- { "cacn.pw", true },
{ "cad-noerdlingen.de", true },
- { "cadacoon.com", true },
{ "cadafamilia.de", true },
{ "cadams.io", true },
+ { "cadcreations.co.ke", true },
{ "cadetsge.ch", true },
{ "cadmail.nl", true },
{ "cadman.pw", true },
@@ -6545,6 +6837,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cadoth.net", true },
{ "cadre.com", true },
{ "cadsys.net", true },
+ { "cadusilva.com", true },
+ { "caerus.ws", true },
{ "caesarkabalan.com", true },
{ "cafedupont.be", true },
{ "cafedupont.co.uk", true },
@@ -6554,13 +6848,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cafelandia.net", true },
{ "cafeobscura.nl", true },
{ "caferagazzi.de", true },
+ { "caferestor.com", true },
{ "cafericoy.com", true },
+ { "cafesdomundo.pt", true },
{ "cafeterasbaratas.net", true },
{ "caffeinatedcode.com", true },
{ "cafled.org", true },
{ "cagalogluyayinevi.com", false },
{ "caglarcakici.com", true },
{ "caibi.io", true },
+ { "caijunyi.net", false },
{ "cainhosting.com", false },
{ "caitcs.com", true },
{ "caiwenjian.xyz", true },
@@ -6618,7 +6915,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "call.me", true },
{ "callanan.nl", true },
{ "callantonia.com", true },
+ { "callawayracing.se", false },
{ "callear.org", true },
+ { "callfunc.com", true },
{ "callhub.io", true },
{ "callidus-vulpes.de", true },
{ "calltoar.ms", true },
@@ -6628,6 +6927,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "calluna.nl", true },
{ "calminteractive.fr", true },
{ "calmtech.com", true },
+ { "calomel.org", true },
{ "calotte-academy.com", true },
{ "calrotaract.org", true },
{ "calvin.my", true },
@@ -6650,6 +6950,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cambodian.dating", true },
{ "cambreaconsulting.com", true },
{ "cambridge-examen.nl", true },
+ { "cambridge-security.com", true },
{ "cambridgebouncers.co.uk", true },
{ "cambridgesecuritygroup.org", true },
{ "camcapital.com", true },
@@ -6662,7 +6963,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "camerweb.es", true },
{ "camilomodzz.net", true },
{ "camolist.com", true },
- { "camomile.desi", true },
{ "camp-pleinsoleil.ch", true },
{ "camp.co.uk", true },
{ "campaign-ad.com", true },
@@ -6680,6 +6980,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "campertrailerfinance.com.au", true },
{ "camperverzekerd.nl", true },
{ "campfiretails.org", true },
+ { "camping-le-pasquier.com", true },
{ "camping-seilershof.de", true },
{ "campinghuntingshooting.com", true },
{ "campingskyhooks.com", true },
@@ -6702,7 +7003,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "canadian.dating", true },
{ "canadianatheists.ca", true },
{ "canadianatheists.com", true },
- { "canadianchristianity.com", false },
{ "canadianoutdoorequipment.com", true },
{ "canadiantouristboard.com", true },
{ "canal-onanismo.org", true },
@@ -6710,6 +7010,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "canalsidehouse.com", true },
{ "canariculturacolor.com", true },
{ "canarymod.net", true },
+ { "canberraoutletcentre.com.au", true },
{ "cancerdata.nhs.uk", true },
{ "candaceplayforth.com", true },
{ "candelec.com", true },
@@ -6724,7 +7025,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "candyout.com", true },
{ "cangelloplasticsurgery.com", true },
{ "cangku.in", true },
- { "cangku.moe", false },
+ { "cangku.moe", true },
+ { "canglong.net", true },
{ "canhazip.com", true },
{ "canicaprice.com", true },
{ "canihavesome.coffee", true },
@@ -6738,6 +7040,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cannoli.london", true },
{ "cannyfoxx.me", true },
{ "canoonic.se", true },
+ { "canopy.ninja", true },
{ "canopycleaningmelbourne.com.au", true },
{ "cant.at", true },
{ "cantatio.ch", true },
@@ -6767,6 +7070,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "capitalibre.com", true },
{ "capitalism.party", true },
{ "capitalmediaventures.co.uk", true },
+ { "capitalonecardservice.com", true },
{ "capitalp.jp", true },
{ "capitalquadatv.org.nz", true },
{ "capitolpathways.org", true },
@@ -6779,7 +7083,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "capstansecurity.co.uk", true },
{ "capstansecurity.com", true },
{ "capstoneinsights.com", true },
- { "capsule.org", true },
{ "capsulesubs.fr", true },
{ "captain-dandelion.com", true },
{ "captainark.net", true },
@@ -6811,8 +7114,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "carbono.uy", true },
{ "carbontv.com", true },
{ "carburetorcycleoi.com", true },
- { "carck.co.uk", true },
- { "carck.uk", true },
+ { "carcloud.ch", true },
{ "cardboard.cx", true },
{ "cardcaptorsakura.jp", true },
{ "carddreams.be", true },
@@ -6827,12 +7129,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cardios.srv.br", true },
{ "cardranking.jp", true },
{ "cardrecovery.fr", true },
- { "cardse.net", true },
{ "cardsolutionsbh.com.br", true },
{ "cardxl.be", true },
{ "cardxl.de", true },
{ "cardxl.fr", true },
{ "cardxl.nl", true },
+ { "care-spot.biz", true },
+ { "care-spot.com", true },
+ { "care-spot.info", true },
+ { "care-spot.mobi", true },
+ { "care-spot.net", true },
+ { "care-spot.org", true },
+ { "care-spot.us", true },
{ "care4all.com", true },
{ "careeapp.com", true },
{ "career.support", true },
@@ -6842,10 +7150,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "carefour.nl", true },
{ "caremad.io", true },
{ "carepassport.com", true },
+ { "carespot.biz", true },
+ { "carespot.co", true },
+ { "carespot.mobi", true },
+ { "carespot.net", true },
+ { "carespot.org", true },
+ { "carespot.us", true },
+ { "carespotexpress.com", true },
+ { "carespotexpresshealthcare.com", true },
+ { "carespottravelmedicine.com", true },
+ { "carespottravelmedicine.mobi", true },
+ { "carespoturgentcare.com", true },
+ { "carespoturgentcare.info", true },
+ { "carespoturgentcare.net", true },
+ { "carespoturgentcare.org", true },
+ { "carespoturgentcare.us", true },
{ "caretta.co.uk", true },
{ "careyshop.cn", true },
{ "carezone.com", false },
- { "carfinancehelp.com", true },
{ "carfraemill.co.uk", true },
{ "cargobay.net", true },
{ "cargomaps.com", true },
@@ -6856,12 +7178,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "caribbeanexams.com", true },
{ "carigami.fr", true },
{ "caringladies.org", true },
- { "carinsurance.es", true },
{ "carinthia.eu", true },
{ "cariocacooking.com", true },
{ "carisenda.com", true },
{ "carkeysanantonio.com", true },
- { "carlandfaith.com", true },
{ "carlgo11.com", true },
{ "carlife-at.jp", true },
{ "carlili.fr", true },
@@ -6900,13 +7220,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "carpetcleaningtomball.com", true },
{ "carrando.com", true },
{ "carre-lutz.com", true },
+ { "carrentalsathens.com", true },
{ "carriedin.com", true },
{ "carrierplatform.com", true },
{ "carringtonrealtygroup.com", true },
{ "carroattrezzimilanodaluiso.it", true },
{ "carroceriascarluis.com", true },
- { "carrollservicecompany.com", true },
- { "carrosserie-dubois.com", true },
{ "carrouselcompany.fr", true },
{ "cars4salecy.com", true },
{ "carseatchecks.ca", true },
@@ -6915,20 +7234,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "carson-matthews.co.uk", true },
{ "carsoug.com", true },
{ "carspneu.cz", true },
- { "cartadeviajes.cl", true },
- { "cartadeviajes.co", true },
- { "cartadeviajes.com", true },
- { "cartadeviajes.com.ar", true },
- { "cartadeviajes.com.ve", true },
- { "cartadeviajes.de", true },
- { "cartadeviajes.ec", true },
- { "cartadeviajes.es", true },
- { "cartadeviajes.fr", true },
- { "cartadeviajes.mx", true },
- { "cartadeviajes.pe", true },
- { "cartadeviajes.uk", true },
{ "carteirasedistintivos.com.br", true },
- { "cartelcircuit.com", true },
+ { "carterdan.net", true },
{ "carterstad.se", true },
{ "cartertonscouts.org.nz", true },
{ "cartesentreprises-unicef.fr", true },
@@ -6937,18 +7244,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "carto.la", true },
{ "cartongesso.roma.it", true },
{ "cartooncastles.ie", true },
- { "cartoonhd.cc", true },
{ "cartouche-deal.fr", true },
{ "cartouche24.eu", true },
{ "cartucce24.it", true },
{ "cartwrightrealestate.com", true },
{ "carun.us", true },
{ "carusorealestate.com", true },
+ { "carwellness-hinkelmann.de", true },
{ "caryefurd.com", true },
{ "casa-app.de", true },
{ "casa-due-pur.com", true },
{ "casa-due-pur.de", true },
{ "casa-due.com", true },
+ { "casa-laguna.net", true },
{ "casa-lunch-break.de", true },
{ "casa-lunchbreak.de", true },
{ "casa-mea-inteligenta.ro", true },
@@ -6956,9 +7264,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "casaanastasia.ro", true },
{ "casabouquet.com", true },
{ "casacameo.com", false },
+ { "casacazoleiro.com", true },
{ "casacochecurro.com", true },
{ "casadasportasejanelas.com", true },
{ "casadoarbitro.com.br", true },
+ { "casadopulpo.com", true },
{ "casadowifi.com.br", true },
{ "casaessencias.com.br", true },
{ "casalborgo.it", true },
@@ -6969,7 +7279,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "casasuara.com", true },
{ "casbia.info", true },
{ "casbuijs.nl", true },
- { "casburggraaf.com", true },
+ { "casburggraaf.com", false },
{ "casc.cz", true },
{ "cascadesjobcorpscca.com", true },
{ "cascavelle.fr", true },
@@ -6977,15 +7287,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "case-vacanza-salento.com", true },
{ "casecoverkeygi.com", true },
{ "casecurity.org", true },
- { "caseof.tk", true },
+ { "caseof.fr", true },
{ "caseplus-daem.de", true },
{ "caseycapitalpartners.com", true },
{ "cash-4x4.com", true },
{ "cashati.com", true },
+ { "cashbackcow.us", true },
{ "cashbook.co.tz", true },
{ "cashbot.cz", true },
{ "cashfazz.com", true },
- { "cashlink.de", true },
{ "cashlogic.ch", true },
{ "cashmaxtexas.com", true },
{ "cashplk.com", true },
@@ -6994,10 +7304,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "casino-online.info", true },
{ "casino-trio.com", true },
{ "casinobonuscodes.online", true },
+ { "casinolegal.pt", true },
{ "casinomucho.com", true },
{ "casinomucho.org", true },
{ "casinomucho.se", true },
{ "casinoonlinesicuri.com", true },
+ { "casinoportugal.pt", true },
{ "casinorewards.info", true },
{ "casinovergleich.com", true },
{ "casio-caisses-enregistreuses.fr", true },
@@ -7026,9 +7338,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "castlesrus-kent.com", true },
{ "casualdesignsfurniture.com", true },
{ "casusgrillcaribbean.com", true },
- { "cat-box.de", true },
+ { "cat-blum.com", true },
{ "cat.net", true },
{ "cat73.org", true },
+ { "cat93.com", true },
{ "catalog.beer", true },
{ "catalogobiblioteca.com", true },
{ "catalogoreina.com", true },
@@ -7040,9 +7353,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "catburton.co.uk", true },
{ "catchers.cc", true },
{ "catchersgear.com", true },
- { "catchfotografie.nl", true },
{ "catchhimandkeephim.com", true },
{ "catchief.com", true },
+ { "catchkol.com", true },
{ "catcoxx.de", true },
{ "catdecor.ru", true },
{ "catenacondos.com", true },
@@ -7053,7 +7366,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "catharisme.eu", true },
{ "catharisme.net", true },
{ "catherinejf.com", true },
- { "catherinescastles.co.uk", true },
{ "catholics.dating", true },
{ "cathosa.nl", true },
{ "cathy.guru", true },
@@ -7068,16 +7380,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "catl.st", true },
{ "catmoose.ca", true },
{ "catnet.dk", false },
+ { "catram.org", true },
{ "cattivo.nl", false },
{ "catuniverse.org", true },
{ "catveteran.com", true },
- { "caughtredhanded.co.nz", true },
+ { "caudo.net", true },
+ { "caudohay.com", true },
{ "caulfieldeastapartments.com.au", true },
{ "caulfieldracecourseapartments.com.au", true },
{ "caulong-ao.net", true },
{ "cav.ac", true },
{ "cavac.at", true },
- { "cavevinsdefrance.fr", true },
{ "cavzodiaco.com.br", true },
{ "caxalt.com", true },
{ "caylercapital.com", true },
@@ -7089,7 +7402,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cbcf.info", true },
{ "cbd.casa", true },
{ "cbd.supply", true },
- { "cbdcontact.pl", true },
+ { "cbdcontact.eu", true },
+ { "cbdev.de", true },
{ "cbdmarket.space", true },
{ "cbdoilcures.co", true },
{ "cbecrft.net", true },
@@ -7107,17 +7421,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ccc-ch.ch", true },
{ "cccwien.at", true },
{ "ccgx.de", true },
+ { "cclasabana.com.co", true },
{ "ccoooss.com", true },
{ "ccprwebsite.org", true },
{ "ccsource.org", true },
{ "ccss-cces.com", true },
- { "ccsys.com", true },
{ "cctvcanada.net", true },
{ "cctvview.info", true },
{ "ccu.plus", true },
- { "ccv-deutschland.de", true },
- { "ccv.ch", true },
- { "ccv.nl", true },
{ "cd-shopware.de", true },
{ "cd-sport.com", true },
{ "cd.search.yahoo.com", false },
@@ -7132,7 +7443,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cdda.ch", true },
{ "cdepot.eu", true },
{ "cdkeykopen.com", true },
- { "cdmlb.net", true },
+ { "cdkeyworld.de", true },
{ "cdn.ampproject.org", true },
{ "cdn6.de", true },
{ "cdncompanies.com", true },
@@ -7145,6 +7456,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cdu-wilgersdorf.de", true },
{ "cduckett.net", true },
{ "cdvl.org", true },
+ { "ce-agentur.de", false },
{ "ce-pimkie.fr", true },
{ "ceanimalhealth.com", true },
{ "cebz.org", true },
@@ -7162,6 +7474,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "celcomhomefibre.com.my", true },
{ "cele.bi", true },
{ "celebmasta.com", true },
+ { "celebphotos.club", true },
{ "celebrityhealthcritic.com", true },
{ "celebrityscope.net", true },
{ "celectro-pro.com", true },
@@ -7189,12 +7502,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "centennialradon.com", true },
{ "centennialseptic.com", true },
{ "centerpereezd.ru", false },
+ { "centerperson.org", true },
+ { "centerpoint.ovh", true },
{ "centio.bg", true },
+ { "centision.com", true },
+ { "centos.cz", true },
{ "centos.tips", true },
{ "centralbank.ae", true },
{ "centralebigmat.eu", true },
{ "centralegedimat.eu", true },
- { "centrallotus.com", true },
+ { "centralfor.me", true },
{ "centralmarket.com", true },
{ "centralmissourifoundationrepair.com", true },
{ "centralpoint.be", false },
@@ -7205,13 +7522,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "centreoeil.ch", true },
{ "centrobill.com", true },
{ "centrodoinstalador.com.br", true },
+ { "centroecuestrecastellar.com", true },
{ "centrojovencuenca.es", true },
+ { "centrolavoro.org", true },
{ "centromasterin.com", true },
{ "centroperugia.gr", true },
{ "centrosocialferrel.pt", true },
{ "centrumhodinek.cz", true },
{ "centruvechisv.ro", true },
- { "centrym.top", true },
+ { "centsi.io", true },
{ "centum.no", true },
{ "centura.de", true },
{ "centurialeonina.com", true },
@@ -7249,6 +7568,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "certificatedetails.com", true },
{ "certificatespending.com", true },
{ "certificatetools.com", true },
+ { "certificazioni-energetiche.it", true },
{ "certifiedfieldassociate.com", true },
{ "certifiednurses.org", true },
{ "certmonitor.com.au", true },
@@ -7266,17 +7586,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ceso-saco.com", true },
{ "cesobaly.cz", true },
{ "cestasedelicias.com.br", true },
- { "cestunmetier.ch", true },
{ "cetamol.com", true },
- { "cetangarana.com", true },
{ "ceu.edu", false },
{ "cevo.com.hr", true },
{ "ceyizlikelisleri.com", true },
{ "cf-ide.de", true },
- { "cf-tm.net", true },
+ { "cfan.space", true },
{ "cfda.gov", true },
{ "cfdcre5.org", true },
{ "cfh.com", true },
+ { "cfigura.com", true },
{ "cflsystems.com", true },
{ "cfno.org", true },
{ "cfo.gov", true },
@@ -7297,6 +7616,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cgbassurances.ch", true },
{ "cgbilling.com", true },
{ "cgcookiemarkets.com", true },
+ { "cgf-charcuterie.com", true },
+ { "cglib.xyz", true },
{ "cgminc.net", true },
{ "cgnparts.com", true },
{ "cgpe.com", true },
@@ -7314,7 +7635,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chadstoneapartments.com.au", true },
{ "chaffeyconstruction.com", true },
{ "chaifeng.com", true },
- { "chainedunion.info", true },
+ { "chaip.org", true },
+ { "chairsgb.com", true },
{ "chaisystems.net", true },
{ "chaletdemontagne.org", true },
{ "chaletmanager.com", true },
@@ -7339,7 +7661,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "championweb.nz", true },
{ "championweb.sg", true },
{ "champonthis.de", true },
- { "champserver.net", false },
{ "chancekorte.com", true },
{ "chanddriving.co.uk", true },
{ "chandr1000.ga", true },
@@ -7348,7 +7669,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "changes.jp", true },
{ "changesfor.life", true },
{ "changethislater.com", true },
- { "channeladam.com", true },
{ "chanoyu-gakkai.jp", true },
{ "chanshiyu.com", false },
{ "chantalguggenbuhl.ch", true },
@@ -7363,9 +7683,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chaospott.de", true },
{ "chaosriftgames.com", true },
{ "chaoswars.ddns.net", true },
+ { "chaotichive.com", true },
{ "chapelfordbouncers.co.uk", true },
{ "chapiteauxduleman.fr", true },
{ "chaplain.co", true },
+ { "chapstick.life", true },
{ "charbonnel.eu", true },
{ "charcoal-se.org", true },
{ "charcoalvenice.com", true },
@@ -7375,7 +7697,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "charisma.ai", true },
{ "charissadescande.com", true },
{ "charitylog.co.uk", true },
- { "charlenevondell.com", true },
{ "charles-darwin.com", true },
{ "charlesbwise.com", true },
{ "charlesmilette.net", true },
@@ -7383,6 +7704,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "charlesrogers.co.uk", true },
{ "charlesstover.com", true },
{ "charlestonfacialplastic.com", true },
+ { "charlie4change.com", true },
{ "charliedillon.com", true },
{ "charliegarrod.com", true },
{ "charliehr.com", true },
@@ -7393,10 +7715,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "charlottesvillegolfcommunities.com", true },
{ "charlottesvillehorsefarms.com", true },
{ "charlotteswimmingpoolbuilder.com", true },
+ { "charlylou.de", true },
{ "charmander.me", true },
- { "charmanterelefant.at", true },
{ "charmingsaul.com", true },
{ "charmyadesara.com", true },
+ { "charr.xyz", true },
{ "chars.ga", false },
{ "charta-digitale-vernetzung.de", true },
{ "charteroak.org", true },
@@ -7406,10 +7729,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chartwellestate.com", true },
{ "charuru.moe", false },
{ "chascrazycreations.com", true },
- { "chaseandzoey.de", true },
{ "chasetrails.co.uk", true },
{ "chat-house-adell.com", true },
{ "chat-libera.org", true },
+ { "chat-porc.eu", true },
{ "chat-senza-registrazione.net", true },
{ "chat.cz", true },
{ "chat2.cf", true },
@@ -7444,12 +7767,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chaurocks.com", true },
{ "chaussenot.net", true },
{ "chavetaro.com", true },
+ { "chaz6.com", true },
{ "chazalet.fr", true },
{ "chazay.net", false },
{ "chbk.co", true },
{ "chbs.me", true },
{ "chch.it", true },
- { "chci-web.cz", true },
{ "chcoc.gov", true },
{ "chcsct.com", true },
{ "chd-expert.fr", true },
@@ -7474,6 +7797,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cheapticket.in", true },
{ "cheatengine.pro", true },
{ "check.torproject.org", false },
+ { "checkandreportlive.com", true },
+ { "checkblau.de", true },
{ "checkecert.nl", true },
{ "checkjelinkje.nl", true },
{ "checkmyessay.com", true },
@@ -7482,7 +7807,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "checkmypsoriasis.com", true },
{ "checkout.google.com", true },
{ "checkpoint-tshirt.com", true },
- { "checkras.tk", true },
{ "checkrente.nl", true },
{ "checkspf.net", true },
{ "checktype.com", true },
@@ -7490,6 +7814,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "checkyourmath.com", true },
{ "checkyourprivilege.org", true },
{ "checkyourreps.org", true },
+ { "checookies.com", true },
{ "checos.co.uk", true },
{ "cheddarpayments.com", true },
{ "cheekycharliessoftplay.co.uk", true },
@@ -7505,6 +7830,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cheltenhambounce.co.uk", true },
{ "cheltenhambouncycastles.co.uk", true },
{ "cheltik.ru", true },
+ { "chemco.mu", true },
{ "chemicalcrux.org", true },
{ "chemiphys.com", true },
{ "chemistry-schools.com", true },
@@ -7530,9 +7856,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chesapeakebaychristmas.com", true },
{ "chess.com", true },
{ "chessboardao.com", true },
- { "chesscoders.com", true },
{ "chesskid.com", true },
{ "chesspoint.ch", true },
+ { "chesterfieldplaceapartmentsstl.com", true },
{ "chesterlestreetasc.co.uk", false },
{ "chestnut.cf", true },
{ "chetwood.se", true },
@@ -7541,11 +7867,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chewey.de", true },
{ "chewey.org", true },
{ "chewingucand.com", true },
+ { "chez-janine.de", true },
{ "chez-oim.org", true },
{ "chez.moe", true },
{ "chfr.search.yahoo.com", false },
{ "chhory.com", true },
- { "chiaraiuola.com", false },
+ { "chiangmaimontessori.com", true },
{ "chiaseeds24.com", true },
{ "chiboard.co", true },
{ "chibr.eu", true },
@@ -7555,6 +7882,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chicagostudentactivists.org", true },
{ "chicisimo.com", true },
{ "chicolawfirm.com", true },
+ { "chicurrichi.com", true },
{ "chiemgauflirt.de", true },
{ "chif16.at", true },
{ "chikazawa.info", true },
@@ -7585,6 +7913,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chinaspaceflight.com", true },
{ "chinatrademarkoffice.com", true },
{ "ching.tv", true },
+ { "chinookwebdesign.ca", true },
{ "chint.ai", true },
{ "chinwag.im", true },
{ "chinwag.org", true },
@@ -7632,17 +7961,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "choootto.net", true },
{ "choosemypc.net", true },
{ "chopperdesign.com", true },
- { "chorkley.co.uk", true },
- { "chorkley.com", true },
- { "chorkley.uk", true },
{ "chorpinkpoemps.de", true },
{ "chosenplaintext.org", true },
- { "chotlo.com", true },
{ "chourishi-shigoto.com", true },
{ "chovancova.sk", true },
{ "chowii.com", true },
{ "choyri.com", true },
- { "chr0me.sh", true },
{ "chris-edwards.net", true },
{ "chrisahrweileryoga.com", true },
{ "chrisaitch.com", true },
@@ -7664,15 +7988,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chrisnekarda.com", true },
{ "chrisplankhomes.com", true },
{ "chrispstreet.com", true },
+ { "chrisspencercreative.com", true },
{ "chrissx.ga", true },
{ "christadelphiananswers.org", true },
{ "christadelphians.eu", true },
- { "christchurchbouncycastles.co.uk", true },
{ "christec.net", true },
{ "christensenplace.us", true },
{ "christerwaren.fi", true },
{ "christiaanconover.com", true },
- { "christian-fischer.pictures", true },
{ "christian-folini.ch", true },
{ "christian-gredig.de", true },
{ "christian-host.com", true },
@@ -7694,6 +8017,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "christians.dating", true },
{ "christianscholz.de", false },
{ "christiehawkes.com", true },
+ { "christielepage.com", true },
{ "christiesantiques.com", true },
{ "christmascard.be", true },
{ "christmaspartyhire.co.uk", true },
@@ -7715,14 +8039,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chriswarrick.com", true },
{ "chriswbarry.com", true },
{ "chriswells.io", true },
+ { "chromaxa.com", true },
{ "chromcraft-revington.com", true },
{ "chrome-devtools-frontend.appspot.com", true },
{ "chrome.com", false },
{ "chrome.google.com", true },
{ "chromebookchart.com", true },
{ "chromebooksforwork.com", true },
+ { "chromeworld.ru", true },
{ "chromiumbugs.appspot.com", true },
{ "chromiumcodereview.appspot.com", false },
+ { "chromopho.be", true },
{ "chroniclesofgeorge.com", true },
{ "chronology.no", true },
{ "chronoshop.cz", true },
@@ -7730,8 +8057,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "chrstn.eu", true },
{ "chrysanthos.net", true },
{ "chrystajewelry.com", true },
+ { "chs.us", false },
+ { "chshealthcare.co.uk", true },
{ "chshouyu.com", true },
{ "chsterz.de", true },
+ { "chtsi.uk", true },
{ "chuchote-moi.fr", true },
{ "chuck.ovh", true },
{ "chuill.com", true },
@@ -7761,24 +8091,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ciat.no", false },
{ "cibercactus.com", true },
{ "cica.es", true },
+ { "ciclista.roma.it", true },
{ "cidbot.com", true },
{ "cidersus.com.ec", true },
{ "cie-theatre-montfaucon.ch", true },
{ "ciel.pro", true },
{ "cielbleu.org", true },
{ "cielly.com", true },
+ { "cienciasempresariais.pt", true },
{ "cierreperimetral.com", true },
{ "cifop-numerique.fr", true },
{ "ciftlikesintisi.com", true },
{ "cig-dem.com", true },
{ "cigar-cartel.com", true },
+ { "cihar.com", true },
{ "cilloc.be", true },
{ "cima-idf.fr", true },
{ "cimbalino.org", true },
{ "cimballa.com", true },
{ "cimfax.com", true },
{ "cinafilm.com", true },
- { "cindydudley.com", true },
{ "cine-music.de", true },
{ "cine.to", true },
{ "cinefilzonen.se", true },
@@ -7787,6 +8119,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cinemasetfree.com", true },
{ "cinemysticism.com", true },
{ "cineplex.my", true },
+ { "cinkciarz.pl", true },
{ "cinnabon.com", true },
{ "cinq-elements.com", true },
{ "cinq-elements.fr", true },
@@ -7831,6 +8164,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ciss.ltd", true },
{ "cisum-cycling.com", true },
{ "cisy.me", true },
+ { "citadelnet.works", true },
+ { "citas-adultas.com", true },
{ "citcuit.in", true },
{ "citfin.cz", true },
{ "cities.cl", true },
@@ -7851,15 +8186,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "citya.com", true },
{ "citybeat.de", true },
{ "citycreek.studio", true },
+ { "citydance.ee", true },
{ "cityextra.com.au", true },
{ "cityfloorsupply.com", true },
{ "citylights.eu", true },
{ "citymoobel.ee", true },
{ "cityoftitans.com", true },
+ { "cityoftitansmmo.com", true },
{ "citysportapp.com", true },
+ { "citywidealarms.com", true },
{ "cityworksonline.com", true },
{ "ciubotaru.tk", true },
- { "ciurcasdan.eu", true },
+ { "civicamente.cl", true },
{ "civicforum.pl", true },
{ "civilbikes.com", true },
{ "civilg20.org", true },
@@ -7867,6 +8205,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "civiltoday.com", true },
{ "cj-espace-vert.fr", true },
{ "cj-jackson.com", true },
+ { "cjbeckert.com", true },
{ "cjdby.net", true },
{ "cjdpenterprises.com", true },
{ "cjdpenterprises.com.au", true },
@@ -7887,6 +8226,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ckliemann.com", true },
{ "ckliemann.net", true },
{ "ckostecki.de", true },
+ { "ckrubble.co.za", true },
{ "cktennis.com", true },
{ "cl.search.yahoo.com", false },
{ "cl0ud.space", true },
@@ -7897,10 +8237,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "clairegold.com", true },
{ "clairescastles.co.uk", true },
{ "clamofon.com", true },
+ { "clan-ww.com", true },
{ "clanebouncycastles.com", true },
- { "clangwarnings.com", true },
+ { "clangwarnings.com", false },
{ "clanrose.org.uk", true },
{ "clanwarz.com", true },
+ { "claraism.com", true },
{ "clarkeaward.com", true },
{ "clarkwinkelmann.com", true },
{ "clase3.tk", true },
@@ -7908,6 +8250,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "class.com.au", true },
{ "classdojo.com", true },
{ "classicalpilates.ca", true },
+ { "classics.io", true },
{ "classictheatrecumbria.co.uk", true },
{ "classpoint.cz", true },
{ "classroom.google.com", true },
@@ -7916,7 +8259,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "classteaching.com.au", true },
{ "classyvaper.de", true },
{ "claster.it", true },
- { "claude-leveille.com", true },
{ "claude.tech", true },
{ "claudia-urio.com", true },
{ "claus-bahr.de", true },
@@ -7929,6 +8271,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "claytonstowing.com.au", true },
{ "clazzrooms.com", true },
{ "cldfile.com", true },
+ { "cldinc.com", true },
{ "cldly.com", true },
{ "cleanapproachnw.com", true },
{ "cleanbrowsing.org", true },
@@ -7939,23 +8282,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cleanhouse2000.us", true },
{ "cleaningbyrosie.com", true },
{ "cleaningservicejulai.com", true },
+ { "cleanplanet.co.jp", true },
{ "cleansewellness.com", true },
{ "clearance365.co.uk", true },
{ "clearblueday.co.uk", true },
{ "clearbookscdn.uk", true },
{ "clearbreezesecuritydoors.com.au", true },
- { "clearer.cloud", true },
{ "clearip.com", true },
- { "clearkonjac.com", true },
{ "clearsettle-admin.com", true },
{ "clearvoice.com", true },
{ "clemenscompanies.com", true },
{ "clement-beaufils.fr", true },
- { "clementfevrier.fr", true },
{ "cles-asso.fr", true },
{ "cles.jp", true },
{ "clevergod.net", true },
{ "clevertarget.ru", true },
+ { "cleververmarkten.com", true },
+ { "cleververmarkten.de", true },
{ "clevisto.com", true },
{ "cleysense.com", true },
{ "clic-et-site.com", true },
@@ -7963,7 +8306,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "clicecompre.com.br", true },
{ "clicheshishalounge.co.uk", true },
{ "click-licht.de", true },
+ { "click2order.co.uk", true },
{ "click4web.com", true },
+ { "clickclickphish.com", true },
{ "clickclock.cc", true },
{ "clickenergy.com.au", true },
{ "clickingmad.com", true },
@@ -7977,9 +8322,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "climaprecio.es", true },
{ "climateinteractive.org", true },
{ "climatestew.com", true },
+ { "climaticarus.ru", true },
{ "clindoeilmontagne.com", true },
- { "clingout.com", true },
- { "clinicadam.com", true },
{ "clinicalrehabilitation.info", true },
{ "clinicaltrials.gov", true },
{ "clinicasmedicas.com.br", true },
@@ -7993,11 +8337,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "clmde.de", true },
{ "clnc.to", true },
{ "clnnet.ch", true },
+ { "clo.me", true },
{ "cloaked.ch", true },
{ "clochix.net", true },
{ "clockcaster.com", true },
{ "clockworksms.com", true },
- { "clod-hacking.com", true },
{ "cloppenburg-autmobil.com", true },
{ "cloppenburg-automobil.com", true },
{ "clorophilla.net", true },
@@ -8010,8 +8354,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cloud.fail", true },
{ "cloud.google.com", true },
{ "cloud.gov", true },
+ { "cloud255.com", true },
{ "cloud42.ch", false },
{ "cloud9bouncycastlehire.com", true },
+ { "cloud9vets.co.uk", true },
{ "cloudapps.digital", true },
{ "cloudbolin.es", true },
{ "cloudbrothers.info", true },
@@ -8030,7 +8376,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cloudia.org", true },
{ "cloudily.com", true },
{ "cloudkeep.nl", true },
- { "cloudkit.pro", false },
{ "cloudland.club", true },
{ "cloudlessdreams.com", true },
{ "cloudlight.biz", true },
@@ -8040,14 +8385,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cloudoptimus.com", true },
{ "cloudpipes.com", true },
{ "cloudse.co.uk", true },
+ { "cloudsec.tk", true },
+ { "cloudsecurityalliance-europe.org", true },
+ { "cloudsecurityalliance.com", true },
+ { "cloudsecurityalliance.net", true },
{ "cloudsecurityalliance.org", true },
+ { "cloudsecuritycongress.net", true },
+ { "cloudsecuritycongress.org", true },
{ "cloudservice.io", true },
{ "cloudservices.nz", true },
{ "cloudsign.jp", true },
{ "cloudspace-analytics.com", true },
{ "cloudspeedy.net", true },
{ "cloudspire.net", true },
- { "cloudtocloud.tk", true },
+ { "cloudteam.de", true },
{ "cloudtropia.de", true },
{ "cloudtskr.com", true },
{ "cloudup.com", true },
@@ -8056,6 +8407,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cloveros.ga", true },
{ "clownindeklas.nl", true },
{ "cloxy.com", true },
+ { "cloze.com", true },
{ "clr3.com", true },
{ "clsfoundationrepairandwaterproofing.com", true },
{ "clsimage.com", true },
@@ -8065,7 +8417,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "club-climate.com", true },
{ "club-corsicana.de", true },
{ "club-creole.com", true },
- { "club-duomo.com", true },
+ { "club-dieta.ru", true },
{ "club-is.ru", true },
{ "club-premiere.com", true },
{ "club-reduc.com", true },
@@ -8081,7 +8433,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "clubfamily.de", true },
{ "clubgalaxy.futbol", false },
{ "clubiconkenosha.com", true },
- { "clubmate.rocks", true },
{ "clubmini.jp", true },
{ "clubnoetig-ink2g.de", true },
{ "clubon.space", true },
@@ -8111,6 +8462,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cmn-groupe.com", true },
{ "cmngroup.com", true },
{ "cmngroupe.com", true },
+ { "cmov-plongeurs.fr", true },
{ "cmplainpalais.ch", true },
{ "cms-weble.jp", true },
{ "cmskeyholding.co.uk", true },
@@ -8128,21 +8480,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cncado.net", true },
{ "cncbazar365.com", true },
{ "cncrans.ch", true },
+ { "cncs.gov.pt", true },
{ "cnet-hosting.com", true },
{ "cni-certing.it", true },
- { "cnnet.in", true },
+ { "cnitdog.com", false },
{ "cnre.eu", true },
{ "cnvt.fr", true },
{ "co-factor.ro", true },
{ "co-founder-stuttgart.de", true },
{ "co.search.yahoo.com", false },
+ { "co2eco.cn", true },
{ "co50.com", true },
{ "coachezmoi.ch", true },
{ "coachfederation.ro", true },
{ "coaching-impulse.ch", true },
{ "coalitionministries.org", true },
{ "coalpointcottage.com", true },
- { "coam.co", true },
{ "coastline.net.au", true },
{ "coathangastrangla.com", true },
{ "coathangastrangler.com", true },
@@ -8153,6 +8506,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cobalt.io", true },
{ "cobaltgp.com", true },
{ "cobaltis.co.uk", true },
+ { "cobaltlp.com", true },
{ "cobracastles.co.uk", true },
{ "cocaine-import.agency", true },
{ "cocaine.ninja", true },
@@ -8160,6 +8514,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cocareonline.com", true },
{ "cocinoyo.com", true },
{ "cock.li", true },
+ { "cockfile.com", true },
{ "cocktail-shaken.nl", true },
{ "cockybot.com", true },
{ "coco-line.ch", true },
@@ -8186,6 +8541,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "code.taxi", true },
{ "code67.com", true },
{ "codeandpeace.com", true },
+ { "codeandsupply.co", true },
{ "codebrahma.com", false },
{ "codecommunity.io", true },
{ "codedelarouteenligne.fr", true },
@@ -8208,14 +8564,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "codepref.com", true },
{ "codepult.com", true },
{ "codera.co.uk", true },
- { "codercross.com", true },
{ "codereview.appspot.com", false },
{ "codereview.chromium.org", false },
- { "coderme.com", true },
- { "codersbase.org", true },
{ "coderware.co.uk", true },
{ "codes.pk", true },
- { "codesplain.in", true },
{ "codesport.io", true },
{ "codespromo.be", true },
{ "codestudies.net", true },
@@ -8236,6 +8588,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "codigo-bonus-bet.es", true },
{ "codigodelbonusbet365.com", true },
{ "codigosddd.com.br", true },
+ { "codimaker.com", true },
{ "coding-minds.com", true },
{ "coding.lv", true },
{ "coding.net", true },
@@ -8245,6 +8598,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "codingrobots.com", true },
{ "codxg.org", true },
{ "codyevanscomputer.com", true },
+ { "codymoniz.com", true },
{ "codyqx4.com", true },
{ "codyscafesb.com", true },
{ "coens.me.uk", true },
@@ -8253,6 +8607,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "coffee-mamenoki.jp", true },
{ "coffeeandteabrothers.com", true },
{ "coffeetime.fun", true },
+ { "coffeetocode.me", false },
{ "cogala.eu", true },
{ "cogent.cc", true },
{ "cogilog.com", true },
@@ -8261,6 +8616,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cognitip.com", true },
{ "cognitivecomputingconsortium.com", true },
{ "cognitohq.com", true },
+ { "cognixia.us", true },
{ "cogsquad.house", true },
{ "coi-verify.com", true },
{ "coiffeurschnittstelle.ch", true },
@@ -8273,9 +8629,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "coinbit.trade", true },
{ "coincealed.com", true },
{ "coinchat.im", true },
+ { "coincircle.com", true },
{ "coincoin.eu.org", true },
{ "coincolors.co", true },
{ "coindeal.com", true },
+ { "coindesfilles.fr", true },
{ "coinf.it", true },
{ "coinflux.com", true },
{ "coingate.com", true },
@@ -8286,6 +8644,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "coinroom.com", true },
{ "coins2001.ru", true },
{ "coinx.pro", true },
+ { "coisabakana.com.br", true },
{ "coisasdemulher.org", true },
{ "cojam.ru", true },
{ "cojo.eu", true },
@@ -8294,12 +8653,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "colaborativa.tv", true },
{ "colapsys.net", true },
{ "colasjourdain.fr", true },
+ { "colcomm.com", true },
+ { "coldawn.com", false },
{ "coldcardwallet.com", true },
{ "coldfff.com", false },
{ "coldhak.ca", true },
+ { "coldiario.com", true },
{ "coldstreamcreekfarm.com", true },
{ "colectivointerconductual.com", true },
- { "colegiocierp.com.br", true },
{ "colemak.com", true },
{ "colengo.com", true },
{ "colf.online", true },
@@ -8308,6 +8669,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "colincogle.name", true },
{ "colinsnaith.co.uk", true },
{ "colinstark.ca", true },
+ { "collab.ddnss.org", true },
{ "collabora-office.com", true },
{ "collabora.ca", true },
{ "collabora.co.kr", true },
@@ -8320,26 +8682,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "collaboracloudsuite.com", true },
{ "collaboraoffice.co.uk", true },
{ "collaboraoffice.com", true },
+ { "collaborativehealthpsychology.com", true },
{ "collabornation.net", true },
{ "collaction.hk", true },
{ "collada.org", true },
+ { "collage.me", true },
{ "collectdocs.com", true },
{ "collectfood.com", true },
{ "collectiblebeans.com", true },
- { "collectivesupply.com", true },
{ "collectorknives.net", true },
{ "collectorsystems.com", true },
{ "collegeconnexxions.com.au", true },
{ "collegenavigator.gov", true },
{ "collegeprospectsofcentralindiana.com", true },
+ { "collegereligionandphilosophy.com", true },
{ "collegestationhomes.com", true },
{ "collinel-hossari.com", true },
{ "collinelhossari.com", true },
{ "collinklippel.com", true },
{ "collinmbarrett.com", true },
+ { "colo-tech.com", true },
{ "cololi.moe", true },
{ "colombian.dating", true },
- { "coloppe.com", true },
{ "coloraid.net", true },
{ "colorblindprogramming.com", true },
{ "colorbrush.ru", true },
@@ -8354,10 +8718,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "colotimes.com", true },
{ "colourfulcastles.co.uk", true },
{ "colpacpackaging.com", true },
- { "colpatriaws.azurewebsites.net", true },
{ "colson-occasions.be", true },
{ "coltellisurvival.com", true },
- { "coltonrb.com", true },
{ "columbuswines.com", true },
{ "colyakootees.com", true },
{ "com-in.de", true },
@@ -8374,8 +8736,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "comcol.nl", true },
{ "comdurav.com", true },
{ "comeals.com", true },
+ { "comedyhuis.nl", true },
{ "comefollowme2016.com", true },
{ "comeoishii.com", true },
+ { "comercialdragon.com", true },
{ "comercialtpv.com", true },
{ "comerford.net", true },
{ "comestoarra.com", true },
@@ -8394,15 +8758,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "comicspornow.com", true },
{ "comicspornoxxx.com", true },
{ "comicwiki.dk", true },
- { "comidasperuanas.net", true },
{ "comiteaintriathlon.fr", true },
{ "comm.cx", true },
{ "commania.co.kr", true },
{ "commco.nl", true },
{ "commechezvous.ch", true },
{ "commerce.gov", true },
+ { "commercezen.com", true },
{ "commercial-academy.fr", true },
{ "commeunamour.com", true },
+ { "commissaris-vraagbaak.nl", true },
{ "commissionagenda.com", true },
{ "commitsandrebases.com", true },
{ "common.io", true },
@@ -8412,25 +8777,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "commonspace.la", true },
{ "communityblog.fedoraproject.org", true },
{ "communitycodeofconduct.com", true },
+ { "communityflow.info", true },
{ "communitymanagertorrejon.com", true },
{ "communote.net", true },
{ "como-se-escribe.com", true },
+ { "comoaliviareldolor.de", true },
{ "comocurarlagastritis24.online", true },
{ "comocurarlagastritistratamientonatural.com", true },
{ "comodesinflamarlashemorroides.org", true },
{ "comodo.nl", true },
- { "comodormirmasrapido.com", true },
{ "comodosslstore.com", true },
- { "comoeliminarlaspapulasperladasenelglande.com", true },
{ "comogene.com", true },
{ "comohacerblog.net", true },
{ "comohacerelamoraunhombrenet.com", true },
{ "comohacerpara.com", true },
{ "comoimportar.net", true },
- { "comopuededejardefumar.net", true },
{ "comoquitarlacaspa24.com", true },
{ "comoquitarlasestriasrapidamente.com", true },
- { "comosatisfaceraunhombreenlacamaydejarloloco.com", true },
{ "comosecarabarriga.net", true },
{ "comoseduzir.net", true },
{ "comosefazisto.com.br", true },
@@ -8452,21 +8815,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "comphare.nl", true },
{ "compibus.fr", true },
{ "compilenix.org", true },
+ { "compitak.com", true },
{ "compleetondernemen.nl", true },
{ "completefloorcoverings.com", true },
{ "completesecurityessex.co.uk", true },
{ "completesecurityessex.com", true },
{ "completionist.me", true },
{ "complexart.ro", true },
- { "complexorganizations.com", true },
{ "compliance-management.ch", true },
{ "compliance-systeme.de", true },
{ "compliancedictionary.com", true },
{ "compliancerisksoftware.co.uk", true },
+ { "componentshop.co.uk", true },
{ "compostatebien.com.ar", true },
{ "compoundingrxusa.com", true },
{ "compraneta.com", false },
{ "compraporinternet.online", true },
+ { "comprarefiereygana.com", true },
{ "comprarimpresoras-3d.com", true },
{ "comprasoffie.com.br", true },
{ "compreautomacao.com.br", true },
@@ -8492,10 +8857,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "computernetwerkwestland.nl", true },
{ "computerslotopschool.nl", true },
{ "computersystems.guru", false },
+ { "computerwerk.org", true },
{ "computop.com", true },
- { "comtily.com", true },
{ "comunidadmontepinar.es", true },
{ "comvos.de", true },
+ { "comw.cc", true },
{ "conalcorp.com", true },
{ "conatus.ai", true },
{ "conaudisa.com", false },
@@ -8508,6 +8874,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "concordsoftwareleasing.com", true },
{ "concretelevelingsystems.com", true },
{ "concreterepairatlanta.com", true },
+ { "concreterepairconcreteraising.com", true },
{ "concursopublico.com.br", true },
{ "concursos.com.br", true },
{ "concursosabertos.com.br", true },
@@ -8516,11 +8883,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "condepenalba.com", false },
{ "condesaelectronics.com", true },
{ "condolencemessages.net", true },
+ { "condominiosi.it", true },
{ "condominioweb.com", true },
{ "condosforcash.com", true },
{ "condroz-motors.be", true },
{ "conectadev.com", true },
- { "conectar.ru", true },
{ "conectumfinanse.pl", true },
{ "conejovalleyelectrical.com", true },
{ "conejovalleyelectrician.com", true },
@@ -8534,6 +8901,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "config.schokokeks.org", false },
{ "confiwall.de", true },
{ "conformax.com.br", true },
+ { "congafasdesol.com", true },
{ "congineer.com", true },
{ "congobunkering.com", true },
{ "conju.cat", true },
@@ -8557,16 +8925,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "connext.de", true },
{ "connictro.de", true },
{ "connorhatch.com", true },
- { "connorsmith.co", true },
{ "connyduck.at", true },
{ "conociendosalama.com", true },
{ "conorboyd.info", true },
- { "conory.com", true },
+ { "conory.com", false },
+ { "conotoxia.com", true },
{ "conpath.net", true },
{ "conpins.nl", true },
{ "conrad-kostecki.de", true },
{ "conradkostecki.de", true },
{ "conradsautotransmissionrepair.com", true },
+ { "conraid.net", true },
{ "conrail.blue", true },
{ "consagracionamariasantisima.org", true },
{ "consciouschoices.net", true },
@@ -8578,6 +8947,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "conservados.com.br", true },
{ "conservatoriesincornwall.com", true },
{ "consideredgifts.com", true },
+ { "consideryourways.net", true },
{ "consilium-vitae.ch", true },
{ "consiliumvitae.ch", true },
{ "consill.com", true },
@@ -8589,6 +8959,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "constancechen.me", true },
{ "constant-rough.de", true },
{ "constares.de", true },
+ { "constituenttracker.com", true },
{ "constitution.website", true },
{ "constructexpres.ro", true },
{ "constructieve.nl", true },
@@ -8598,7 +8969,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "constructive.men", true },
{ "consul.io", true },
{ "consulenza.pro", true },
- { "consultanta-in-afaceri.ro", true },
{ "consultation.biz.tr", true },
{ "consultimator.com", true },
{ "consultimedia.de", true },
@@ -8611,6 +8981,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "consumersentinel.gov", true },
{ "consuwijzer.nl", true },
{ "contactsingapore.sg", true },
+ { "containerspace.com.au", true },
{ "contaquanto.com.br", true },
{ "contemplativeeducation.org", true },
{ "content-api-dev.azurewebsites.net", false },
@@ -8621,23 +8992,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "conti-profitlink.co.uk", true },
{ "continuum.memorial", true },
{ "contrabass.net", true },
+ { "contractdigital.co.uk", true },
{ "contractormountain.com", true },
{ "contractwriters.com", true },
{ "contraspin.co.nz", true },
{ "contratatupoliza.com", true },
{ "contributor.google.com", false },
- { "controlarlaansiedad.com", true },
{ "controlautocom.com.br", true },
{ "controlbooth.com", true },
{ "controle.net", true },
{ "controleer-maar-een-ander.nl", true },
{ "controltickets.com.br", true },
{ "conv2pdf.com", true },
- { "convergence.fi", true },
{ "convergencela.com", true },
{ "convergnce.com", true },
{ "conversiones.com", true },
- { "conversionsciences.com", true },
{ "convert.im", true },
{ "converticacommerce.com", false },
{ "convexset.org", true },
@@ -8654,16 +9023,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cooking-sun.com", true },
{ "cookingcrusade.com", true },
{ "cookinglife.nl", false },
+ { "cookingperfected.com", true },
{ "cookingreporter.com", true },
{ "cookmedical.com", false },
{ "cooko.at", true },
- { "cooksbookscorks.com", true },
+ { "cooksecuritygroup.com", true },
+ { "cooksplanet.com", true },
{ "cookwithmanali.com", true },
{ "cool-parties.co.uk", true },
{ "cool-wallpapers.jp", true },
{ "cool.haus", true },
- { "cool110.tk", true },
- { "cool110.xyz", true },
{ "coolattractions.co.uk", true },
{ "coolbitx.com", true },
{ "coolcamping.com", true },
@@ -8672,10 +9041,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "coolerssr.space", true },
{ "coolgifs.de", true },
{ "coolprylar.se", true },
- { "coolwallet.io", true },
+ { "cooltang.ooo", true },
{ "coonawarrawines.com.au", true },
- { "coopens.com", true },
- { "coor.fun", true },
+ { "cooperativehandmade.com", true },
{ "coore.jp", true },
{ "coorpacademy.com", true },
{ "copdfoundation.org", true },
@@ -8686,10 +9054,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "copplaw.com", true },
{ "copta-imagefilme-und-drohnenvideos.de", true },
{ "coptkm.cz", true },
- { "copycaught.co", true },
+ { "copycaught.com", true },
{ "copycaught.net", true },
{ "copycaught.org", true },
- { "copycaught.xyz", true },
{ "copycrafter.net", true },
{ "copydz.com", true },
{ "copypoison.com", true },
@@ -8709,13 +9076,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "core.org.pt", true },
{ "coreapm.org", true },
{ "corecodec.com", true },
- { "coredump.gr", true },
{ "coreless-stretchfilm.com", true },
{ "corelia.net", true },
{ "corepartners.com.ua", true },
{ "coresolutions.ca", true },
{ "coreum.ca", true },
{ "coreyjmahler.com", true },
+ { "corgi.party", true },
{ "coribi.com", true },
{ "corinastefan.ro", true },
{ "corintech.net", true },
@@ -8738,13 +9105,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "corpfin.net", true },
{ "corpio.nl", true },
{ "corpkitnw.com", true },
+ { "corpoepele.com.br", true },
{ "corpoflow.nl", true },
{ "corporacioninternacionallideres.org", true },
{ "corporateclash.net", true },
{ "corporatecomputingsolutions.com", true },
{ "corporateinfluencers.com", true },
- { "corporativoarval.info", true },
- { "corpsepaint.life", true },
{ "corpulant.coffee", true },
{ "corpulantcoffee.com", true },
{ "corpulent.coffee", true },
@@ -8761,6 +9127,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "corscanplus.com", true },
{ "corsectra.com", true },
{ "corsihaccpsicurezzalavoro.it", true },
+ { "corso-antincendio.org", true },
{ "cortexitrecruitment.com", true },
{ "cortexx.nl", true },
{ "cortis-consulting.ch", true },
@@ -8772,14 +9139,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cosasque.com", true },
{ "cosciamoos.com", true },
{ "cosirex.com", true },
- { "coslinker.com", true },
{ "cosmechic.fr", true },
{ "cosmekaitori.jp", true },
+ { "cosmetic-surgery-prices.co.uk", true },
{ "cosmeticappraisal.com", true },
{ "cosmeticasimple.com", true },
{ "cosmeticos-naturales.com", true },
{ "cosmicnavigator.com", true },
- { "cosmintataru.ro", true },
{ "cosmodacollection.com", true },
{ "cosmofunnel.com", true },
{ "cosmundi.de", true },
@@ -8789,10 +9155,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "costablanca.villas", true },
{ "costablancavoorjou.com", true },
{ "costcoinsider.com", true },
- { "costellofc.co.uk", true },
{ "costinstefan.eu", true },
{ "costreportdata.com", false },
{ "costulessdirect.com", true },
+ { "cote-chasse.com", true },
{ "coteries.com", true },
{ "cotoacc.com", true },
{ "cotonmusic.ch", true },
@@ -8814,6 +9180,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "countrybrewer.com.au", true },
{ "countryfrog.uk", true },
{ "countryhouseresort.com", true },
+ { "countryoutlaws.ca", true },
{ "countybankdel.com", true },
{ "countyjailinmatesearch.com", true },
{ "coupe-bordure.com", true },
@@ -8822,6 +9189,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cour4g3.me", true },
{ "couragefound.org", true },
{ "coursables.com", true },
+ { "courseconfidence.com", true },
{ "coursera.org", true },
{ "courtlistener.com", true },
{ "couscous.recipes", true },
@@ -8839,23 +9207,29 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cowbird.org", true },
{ "cowboyim.com", true },
{ "coweo.cz", true },
- { "cowo.group", true },
{ "coworking-luzern.ch", true },
{ "coxcapitalmanagement.com", true },
{ "coxxs.me", true },
- { "coxxs.moe", true },
+ { "coya.tw", true },
{ "cozo.me", true },
{ "cozyeggdesigns.com", true },
{ "cp-st-martin.be", true },
+ { "cpahunt.com", false },
{ "cpap.com", true },
{ "cpasperdu.com", true },
+ { "cpbanq.com", true },
{ "cpbapremiocaduceo.com.ar", true },
{ "cpcheats.co", true },
{ "cpd-education.co.uk", true },
{ "cpe-colleg.de", true },
+ { "cpe-registry.com", true },
+ { "cpe-registry.net", true },
+ { "cpe-registry.org", true },
+ { "cperegistry.com", true },
+ { "cperegistry.net", true },
+ { "cperegistry.org", true },
{ "cpgarmor.com", true },
{ "cphpvb.net", true },
- { "cplala.com", true },
{ "cplus.me", true },
{ "cplusplus.se", true },
{ "cppan.org", true },
@@ -8865,7 +9239,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cprnearme.com", true },
{ "cpsc.gov", true },
{ "cpsq.fr", true },
- { "cptoon.com", true },
{ "cpu.biz.tr", true },
{ "cpvmatch.eu", true },
{ "cpy.pt", true },
@@ -8876,9 +9249,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cra-bank.com", true },
{ "cra-search.net", true },
{ "craazzyman21.at", true },
+ { "crabfactory.com.my", true },
{ "crackcat.de", true },
{ "cracker.in.th", true },
- { "crackers4cheese.com", true },
{ "crackle.io", true },
{ "crackorsquad.in", true },
{ "crackslut.eu", true },
@@ -8886,8 +9259,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cradlepointecm.com", true },
{ "craft-verlag.de", true },
{ "craftandbuild.de", true },
- { "craftcommerce.com", true },
- { "craftinghand.com", false },
+ { "craftinghand.com", true },
{ "craftinginredlipstick.com", true },
{ "craftist.de", true },
{ "craftsmandruggets.com", true },
@@ -8905,8 +9277,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cranforddental.com", true },
{ "cranshafengin.com", true },
{ "crapouill.es", true },
+ { "crashboy.ws", true },
{ "cratss.co.uk", true },
- { "crawcial.de", true },
{ "crawford.cloud", true },
{ "crawfordcountytcc.org", true },
{ "crawl.report", true },
@@ -8920,7 +9292,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "crazybulk.com", true },
{ "crazybulk.de", true },
{ "crazybulk.fr", true },
+ { "crazybulksteroids.com", true },
{ "crazycastles.ie", true },
+ { "crazycraftland.net", true },
{ "crazydomains.ae", true },
{ "crazydomains.co.nz", true },
{ "crazydomains.co.uk", true },
@@ -8940,12 +9314,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "crealogix-online.com", true },
{ "creamcastles.co.uk", true },
{ "creared.edu.co", true },
- { "createcos.com", true },
{ "createme.com.pl", true },
{ "createursdefilms.com", true },
+ { "creaticworld.net", true },
{ "creatieven.com", true },
{ "creation-contemporaine.com", true },
+ { "creativ-impuls-dekorateurin-muenchen.de", true },
{ "creative-wave.fr", true },
+ { "creativeangles.in", true },
{ "creativebites.de", true },
{ "creativecaptiv.es", true },
{ "creativecommons.gr", true },
@@ -8955,7 +9331,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "creativefolks.co.uk", true },
{ "creativefreedom.ca", true },
{ "creativeglassgifts.com.au", true },
- { "creativeground.com.au", true },
{ "creativeimagery.com.au", true },
{ "creativeink.de", true },
{ "creativekkids.com", true },
@@ -8970,7 +9345,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "creatixx-network.de", false },
{ "creators-design.com", true },
{ "creators.direct", true },
+ { "creatorswave.com", true },
{ "creatujoya.com", true },
+ { "crecips.com", true },
{ "credential.eu", true },
{ "credex.bg", true },
{ "credigo.se", true },
@@ -8992,18 +9369,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "crefelder.com", true },
{ "crem.in", false },
{ "cremepassion.de", true },
- { "crena.ch", true },
{ "crepa.ch", true },
{ "crepererum.net", true },
- { "crescent.gr.jp", true },
{ "crestasantos.com", true },
{ "cretdupuy.com", true },
{ "creteangle.com", true },
{ "cretica.no", true },
+ { "creusalp.ch", true },
{ "crew505.org", true },
{ "crgalvin.com", true },
{ "crgm.net", true },
{ "cribcore.com", true },
+ { "cricklewood.condos", true },
{ "criena.com", true },
{ "criena.net", true },
{ "crimefreeliving.com", true },
@@ -9016,6 +9393,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "criscitos.it", true },
{ "crisisactual.com", true },
{ "crisisnextdoor.gov", true },
+ { "crismatthews.com", true },
{ "crisp.chat", true },
{ "crisp.email", true },
{ "crisp.help", true },
@@ -9027,6 +9405,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "critical.today", false },
{ "criticalsurveys.co.uk", true },
{ "crizin.io", true },
+ { "crizk.com", true },
{ "crm.onlime.ch", false },
{ "crm114d.com", true },
{ "crochetnerd.com", true },
@@ -9034,6 +9413,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "croixblanche-haguenau.fr", true },
{ "cromefire.myds.me", true },
{ "croncron.io", true },
+ { "cronenberg.cc", true },
{ "cronix.cc", true },
{ "cronologie.de", true },
{ "cronometer.com", true },
@@ -9055,6 +9435,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "crossorig.in", true },
{ "crossoverit.com", true },
{ "crosssellguide.com", true },
+ { "crossway.nl", true },
+ { "crow.tw", true },
{ "crowd.supply", true },
{ "crowdbox.net", true },
{ "crowdcloud.be", true },
@@ -9086,12 +9468,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cryoit.com", true },
{ "cryothanasia.com", true },
{ "cryp.no", true },
+ { "crypkit.com", true },
{ "crypt.is-by.us", true },
{ "cryptagio.com", true },
{ "cryptearth.de", true },
{ "crypted.chat", true },
{ "crypteianetworks.com", true },
- { "crypticshell.co.uk", true },
{ "crypto-armory.com", true },
{ "crypto.cat", false },
{ "crypto.graphics", true },
@@ -9109,9 +9491,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cryptojourney.com", true },
{ "cryptolinc.com", true },
{ "cryptology.ch", true },
- { "cryptolosophy.io", true },
{ "cryptolosophy.org", true },
+ { "cryptomail.nl", true },
{ "cryptomaniaks.com", true },
+ { "cryptonom.org", true },
{ "cryptonym.com", true },
{ "cryptoparty.at", true },
{ "cryptoparty.tv", true },
@@ -9133,8 +9516,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "crystone.me", true },
{ "cryz.ru", true },
{ "cs2016.ch", true },
+ { "csa-library.org", true },
+ { "csaapac.com", true },
+ { "csaapac.org", true },
{ "csabg.org", true },
+ { "csacongress.com", true },
{ "csacongress.org", true },
+ { "csacongress.us", true },
+ { "csadc.org", true },
+ { "csasummit.net", true },
+ { "csasummit.org", true },
{ "csbs.fr", true },
{ "csbuilder.io", true },
{ "csca.me", true },
@@ -9151,8 +9542,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "csi.lk", true },
{ "csinterstargeneve.ch", true },
{ "cskentertainment.co.uk", true },
+ { "cslaboralistas.pe", true },
{ "csmainframe.com", true },
{ "csokolade.hu", true },
+ { "csosa.gov", true },
{ "csovek-idomok.hu", true },
{ "csp.ch", true },
{ "cspeti.hu", true },
@@ -9194,6 +9587,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cube-cloud.com", true },
{ "cube.builders", true },
{ "cube.de", true },
+ { "cube.la", true },
{ "cubebot.io", true },
{ "cubebuilders.net", true },
{ "cubecart-demo.co.uk", true },
@@ -9217,10 +9611,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cuddlingyaks.com", true },
{ "cueca.com.br", true },
{ "cuecasonline.com.br", true },
+ { "cuegee.com", true },
{ "cuentasmutualamr.org.ar", true },
{ "cuetoems.com", true },
{ "cuibonobo.com", true },
- { "cuisinezest.com", true },
{ "cultiv.nl", true },
{ "cultivo.bio", true },
{ "cultofd50.org", true },
@@ -9233,10 +9627,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cumberlandrivertales.com", true },
{ "cumparama.com", true },
{ "cumplegenial.com", true },
+ { "cumtd.com", true },
+ { "cuntflaps.me", true },
{ "cuoc.org.uk", true },
{ "cup.al", true },
- { "cupcakesandcrinoline.com", true },
{ "cupcao.gov", true },
+ { "cupoane-reducere.net", true },
{ "cupom.net", true },
{ "cuppycakes.fi", true },
{ "cur.by", true },
@@ -9249,17 +9645,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "curio-shiki.com", true },
{ "curiosity-driven.org", true },
{ "curiouspeddler.com", true },
+ { "curlify.com", true },
{ "curlybracket.co.uk", true },
{ "currency-strength.com", true },
{ "currentlystreaming.com", true },
{ "currentlyusa.com", true },
- { "currentobserver.com", true },
{ "currynissanmaparts.com", true },
{ "cursos-trabajadores.net", true },
{ "cursos.com", true },
{ "cursosforex.com", true },
{ "cursosingles.com", true },
{ "cursossena.co", true },
+ { "cursosypostgrados.com", true },
{ "cursuri-de-actorie.ro", true },
{ "curtacircuitos.com.br", false },
{ "curtis-smith.me.uk", true },
@@ -9273,7 +9670,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "curveprotect.cz", true },
{ "curveprotect.net", true },
{ "curveprotect.org", true },
- { "curvesandwords.com", true },
{ "curvissa.co.uk", true },
{ "curvylove.de", true },
{ "custodyxchange.com", true },
@@ -9311,12 +9707,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cvlibrary.co.uk", true },
{ "cvmu.jp", true },
{ "cvr.dk", true },
- { "cvursache.com", true },
+ { "cvtemplatemaster.com", true },
+ { "cvutdecin.cz", true },
{ "cvv.cn", true },
{ "cw.center", true },
{ "cwagner.me", true },
{ "cwarren.org", true },
{ "cwbrtrust.ca", true },
+ { "cwc.gov", true },
{ "cwgaming.co.uk", true },
{ "cwinfo.fi", true },
{ "cwmart.in", true },
@@ -9334,14 +9732,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cyanghost.com", true },
{ "cyber.je", true },
{ "cyberatlantis.com", true },
+ { "cyberbot.info", true },
{ "cybercareers.gov", true },
- { "cybercloud.cc", true },
{ "cybercocoon.com", true },
{ "cybercrew.cc", true },
{ "cybercrime-forschung.de", true },
{ "cybercrime.gov", true },
- { "cyberdos.de", false },
+ { "cybercymru.co.uk", false },
{ "cyberduck.io", true },
+ { "cyberdyne.llc", true },
{ "cyberexplained.info", true },
{ "cybergates.org", true },
{ "cybergrx.com", true },
@@ -9350,18 +9749,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cyberhipsters.nl", true },
{ "cyberianhusky.com", true },
{ "cyberkov.com", true },
- { "cyberlab.kiev.ua", false },
{ "cyberlegal.co", true },
{ "cyberlightapp.com", true },
{ "cybermeldpunt.nl", true },
{ "cyberogism.com", true },
+ { "cyberonesol.com", true },
{ "cyberoptic.de", true },
{ "cyberpioneer.net", false },
{ "cyberpubonline.com", true },
{ "cyberregister.nl", true },
{ "cyberregister.org", true },
{ "cybersafesolutions.com", true },
- { "cybersantri.com", true },
{ "cyberscan.io", true },
{ "cybersecurity.nz", true },
{ "cybersecurity.run", true },
@@ -9374,7 +9772,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cyberspect.com", true },
{ "cyberspect.io", true },
{ "cyberstatus.de", true },
- { "cybertorsk.org", true },
{ "cybertu.be", true },
{ "cyberwars.dk", true },
{ "cyberwire.nl", true },
@@ -9384,7 +9781,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cybozu.com", true },
{ "cybozulive-dev.com", true },
{ "cybozulive.com", true },
- { "cybrary.it", true },
{ "cyclebeads.com", true },
{ "cycleluxembourg.lu", true },
{ "cyclinggoodso.com", true },
@@ -9411,7 +9807,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cyph.video", true },
{ "cyph.ws", true },
{ "cypherpunk.at", true },
- { "cypherpunk.com", true },
{ "cypherpunk.observer", true },
{ "cypressinheritancesaga.com", true },
{ "cypresslegacy.com", true },
@@ -9419,11 +9814,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "cyrating.com", true },
{ "cysec.biz", true },
{ "cysmo.de", true },
- { "cyson.tech", true },
{ "cytech.com.tr", true },
{ "cytegic-update-packages.com", true },
{ "cytotecforsale.com", true },
{ "cyumus.com", true },
+ { "cyyzaid.cn", false },
{ "czakey.net", true },
{ "czbix.com", true },
{ "czbtm.com", true },
@@ -9436,11 +9831,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "d-20.fr", true },
{ "d-designerin.de", true },
{ "d-eisenbahn.com", true },
+ { "d-imitacion.top", true },
{ "d-loop.de", true },
- { "d-msg.com", true },
+ { "d-macindustries.com", true },
{ "d-parts.de", true },
{ "d-parts24.de", true },
- { "d-quantum.com", true },
{ "d-toys.com.ua", true },
{ "d-training.de", true },
{ "d.nf", true },
@@ -9451,18 +9846,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "d0xq.com", true },
{ "d2.gg", true },
{ "d2ph.com", true },
- { "d2s.uk", true },
+ { "d2qa61rbluifiq.cloudfront.net", true },
{ "d3lab.net", true },
{ "d3xt3r01.tk", true },
{ "d3xx3r.de", true },
{ "d42.no", true },
{ "d4done.com", true },
- { "d4rkdeagle.tk", true },
- { "d4wson.com", true },
+ { "d4fx.de", true },
{ "d4x.de", true },
{ "d66.nl", true },
{ "d6c5yfulmsbv6.cloudfront.net", true },
+ { "d7211.com", true },
+ { "d7215.com", true },
+ { "d7216.com", true },
{ "d8.io", true },
+ { "d88688.com", true },
{ "d88988.com", true },
{ "da42foripad.com", true },
{ "daallexx.eu", true },
@@ -9475,6 +9873,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dachtechnik-windschuettl.de", true },
{ "daciaforum.nl", true },
{ "daciamodellen.nl", true },
+ { "dadadani.xyz", true },
+ { "daddybio.com", true },
{ "dado.fr", true },
{ "dado.me", true },
{ "dado.virtual.museum", true },
@@ -9485,15 +9885,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "daemen.org", true },
{ "daemwool.ch", true },
{ "daevel.fr", true },
- { "dafnik.me", true },
{ "dafont.com", true },
{ "dafricapress.com", true },
+ { "dafyddcrosby.com", true },
{ "dag-hebergement.fr", true },
{ "dag-konsult.com", true },
{ "dagensannonser.se", true },
{ "dagmar2018.cz", true },
{ "dahlberg.cologne", true },
{ "dai.top", true },
+ { "dai94.com", true },
{ "daigakujuken-plus.com", true },
{ "daikoz.com", true },
{ "dailybits.be", true },
@@ -9506,11 +9907,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dailyroverr.com", true },
{ "dailyxenang.com", true },
{ "daintymeal.com", true },
+ { "dair.se", true },
{ "dairyshrine.org", true },
{ "daisakuikeda.org", true },
{ "daisidaniels.co.uk", true },
{ "daisy-peanut.com", true },
{ "daisypeanut.com", true },
+ { "daitouryu-jujutsu.com", true },
{ "daiweihu.com", true },
{ "daiyuu.jp", true },
{ "dajiadu.net", true },
@@ -9530,6 +9933,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dalmatiersheusden.be", true },
{ "damaged.org", true },
{ "damasexpress.com", true },
+ { "damedrogy.cz", true },
{ "damejidlo.cz", true },
{ "dameocio.com", true },
{ "damghaem.ir", true },
@@ -9538,13 +9942,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "daminiphysio.ca", true },
{ "damip.net", true },
{ "damirsystems.com", true },
+ { "damjanovic.it", true },
{ "dammekens.be", true },
{ "damngoodpepper.com", false },
- { "damongant.de", true },
{ "damonline.dk", true },
{ "dampedia.com", true },
{ "dan-informacijske-varnosti.si", true },
{ "dan.me.uk", true },
+ { "danads.com", true },
{ "danaketh.com", true },
{ "danamica.dk", true },
{ "danandrum.com", true },
@@ -9554,8 +9959,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dance-colleges.com", true },
{ "danchen.org", true },
{ "dancingcubs.co.uk", true },
+ { "dancingshiva.at", false },
{ "dandenongroadapartments.com.au", true },
{ "daneandthepain.com", true },
+ { "danfromit.co.uk", true },
+ { "danfromit.com", true },
{ "dangmai.tk", true },
{ "dangr.zone", true },
{ "danhalliday.com", true },
@@ -9570,8 +9978,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "danielas.boutique", true },
{ "danielehniss.de", true },
{ "danielepestilli.com", true },
+ { "danielfeau.com", true },
{ "danielgorr.de", true },
{ "danielgray.email", true },
+ { "danielgray.me", true },
{ "danielheal.net", true },
{ "danielhinterlechner.eu", true },
{ "danielhochleitner.de", true },
@@ -9600,7 +10010,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "danieltollot.de", true },
{ "danielvoogsgerd.nl", true },
{ "danielwildhaber.ch", true },
- { "danifabi.eu", true },
{ "danilapisarev.com", true },
{ "danjesensky.com", true },
{ "dank.ninja", true },
@@ -9610,7 +10019,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "danmarksbedstefredagsbar.dk", true },
{ "danmarksflyttemand.dk", true },
{ "danmassarano.com", true },
- { "danminkevitch.com", true },
+ { "danminkevitch.com", false },
{ "danna-salary.com", true },
{ "dannhanks.com", true },
{ "dannicholas.net", true },
@@ -9632,6 +10041,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dansk-skole.de", true },
{ "dansk777.dk", true },
{ "danskoferie.dk", true },
+ { "danskoya.com", true },
{ "danslan.org", true },
{ "danstillman.com", true },
{ "dantelistan.com", true },
@@ -9641,13 +10051,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "danwolff.se", true },
{ "danyabanya.com", true },
{ "danzac.com", true },
- { "dao.spb.su", true },
{ "daoro.net", true },
{ "daphne.informatik.uni-freiburg.de", true },
+ { "dapianw.com", true },
{ "dapim.co.il", true },
- { "daplie.com", true },
{ "dapps.earth", true },
{ "dappworld.com", true },
+ { "dara-berlin.de", true },
{ "daracokorilo.com", true },
{ "daravk.ch", true },
{ "darbi.org", true },
@@ -9655,8 +10065,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "darc-mak.de", true },
{ "darchoods.net", false },
{ "darcymarshall.com", true },
+ { "dare.deals", true },
{ "daren.com.br", true },
{ "dareyou.be", true },
+ { "darf.nl", true },
{ "dariaburger.de", true },
{ "darinkotter.com", true },
{ "darioackermann.ch", true },
@@ -9681,7 +10093,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "darknetlive.com", true },
{ "darknight.blog", true },
{ "darkrisks.com", true },
- { "darkroomsaredead.com", true },
{ "darkserver.fedoraproject.org", true },
{ "darkserver.stg.fedoraproject.org", true },
{ "darkshop.nl", true },
@@ -9691,6 +10102,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "darkwater.info", true },
{ "darkwebnews.com", true },
{ "darkx.me", true },
+ { "darlo.co.uk", false },
{ "darmgesundheit.ch", true },
{ "darom.jp", true },
{ "darookee.net", false },
@@ -9699,11 +10111,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dartcode.org", true },
{ "dartetdemetiers.fr", true },
{ "darth-sonic.de", true },
- { "dartsdon.jp", true },
{ "dartshopmn.nl", true },
{ "darwinkel.net", true },
{ "darwinsearch.org", true },
- { "daryl.moe", true },
{ "darylcrouse.com", true },
{ "darylcumbo.net", true },
{ "das-forum24.de", true },
@@ -9711,7 +10121,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "das-sommercamp.de", true },
{ "dasgeestig.nl", true },
{ "dashboard.run", true },
- { "dashcloud.co", true },
{ "dashnearby.com", true },
{ "dashwebconsulting.com", true },
{ "dasignsource.com", true },
@@ -9722,12 +10131,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "data-wing.ga", true },
{ "data.gov", true },
{ "data.govt.nz", true },
+ { "data.world", true },
{ "data3w.nl", true },
{ "databionix.com", true },
{ "databutlr.com", true },
{ "databutlr.net", true },
{ "datacalle.com", true },
{ "datacandy.com", true },
+ { "datacool.tk", true },
{ "datadit.hu", true },
{ "datadyne.technology", true },
{ "datafd.com", true },
@@ -9738,7 +10149,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dataharvest.at", true },
{ "datahive360.com", true },
{ "datahjalp.nu", true },
- { "datahoarder.xyz", true },
{ "datajobs.ai", true },
{ "datakick.org", true },
{ "datalife.gr", true },
@@ -9755,6 +10165,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "datasupport-stockholm.se", true },
{ "datasupport.one", true },
{ "dataswamp.org", true },
+ { "datatekniikka.com", false },
{ "datatekniikka.fi", false },
{ "datatekniker.nu", true },
{ "datateknologsektionen.se", false },
@@ -9763,6 +10174,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "datatruckers.eu", true },
{ "datatruckers.net", true },
{ "datatruckers.org", true },
+ { "datecougarslocal.com", true },
{ "datememe.com", true },
{ "datengrab.xyz", true },
{ "datenkeks.de", true },
@@ -9775,6 +10187,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "datenschutzzentrum.de", true },
{ "datenwerkstatt.net", true },
{ "datewon.net", false },
+ { "datingsite-vergelijken.website", true },
{ "datingticino.ch", true },
{ "datmancrm.com", true },
{ "dator-test.se", true },
@@ -9792,6 +10205,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "davecardwell.com", true },
{ "davelynes.com", true },
{ "daveoc64.co.uk", true },
+ { "daveops.net", true },
{ "davepage.me.uk", true },
{ "davepearce.com", true },
{ "davepermen.net", true },
@@ -9801,6 +10215,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "davetempleton.com", true },
{ "davevelopment.net", true },
{ "davewardle.com", true },
+ { "davewood.com.au", true },
{ "david-corry.com", true },
{ "david-hinschberger.me", true },
{ "david-jeffery.co.uk", true },
@@ -9810,6 +10225,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "david.kitchen", true },
{ "davidadrian.org", true },
{ "davidandersson.se", true },
+ { "davidandrewcoaching.com", true },
{ "davidbranco.me", true },
{ "davidbuckell.com", true },
{ "davidcrx.net", true },
@@ -9821,6 +10237,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "davidgouveia.net", true },
{ "davidgow.net", true },
{ "davidhanle.com", true },
+ { "davidkeane.com", true },
{ "davidkennardphotography.com", true },
{ "davidking.xyz", true },
{ "davidlamprea.com", true },
@@ -9847,21 +10264,27 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "davypropper.com", true },
{ "daw.nz", true },
{ "dawena.de", true },
- { "dawgs.ga", true },
{ "dawnbringer.eu", true },
{ "dawnbringer.net", true },
{ "dawnofeden.net", true },
{ "dawoud.org", true },
{ "dawson-floridavilla.co.uk", true },
- { "day-peak.com", true },
+ { "dax.guide", true },
+ { "daxpatterns.com", true },
{ "daycontactlens.com", true },
{ "daydream.team", true },
{ "daylight-dream.ee", true },
{ "daylightpirates.org", true },
- { "dayman.net", true },
+ { "dayman.net", false },
{ "daymprove.life", true },
{ "dayofdays.be", true },
{ "daysoftheyear.com", true },
+ { "dazz.it", true },
+ { "dazzit.ca", true },
+ { "dazzit.com", true },
+ { "dazzit.net", true },
+ { "dazzit.org", true },
+ { "dazzit.xyz", true },
{ "db-works.nl", true },
{ "db.ci", true },
{ "dbapress.org", true },
@@ -9872,6 +10295,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dbentertainment.co.uk", true },
{ "dbgamestudio.com", true },
{ "dbjc.tk", true },
+ { "dbjl.fr", true },
{ "dblcastles.co.uk", true },
{ "dbldub.net", true },
{ "dbmiller.org", true },
@@ -9880,6 +10304,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dborcard.com", true },
{ "dbpkg.com", true },
{ "dbq.com", true },
+ { "dbrand.com", true },
{ "dbrgn.ch", true },
{ "dbtsai.com", true },
{ "dc-elektro.com", true },
@@ -9894,18 +10319,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dcards.in.th", true },
{ "dcautomacao.com.br", true },
{ "dcbouncycastles.co.uk", true },
- { "dcc.cat", true },
+ { "dcc.moe", true },
{ "dccommunity.de", true },
{ "dcepler.net", true },
{ "dchatelain.ch", true },
{ "dchest.org", true },
{ "dckd.nl", true },
+ { "dcl.re", true },
{ "dclaisse.fr", true },
{ "dcmediahosting.com", true },
{ "dcmt.co", true },
{ "dcpower.eu", true },
{ "dcrdev.com", true },
{ "dcw.io", true },
+ { "dd7211.com", true },
{ "ddatsh.com", true },
{ "ddays2008.org", true },
{ "ddel.de", true },
@@ -9914,7 +10341,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ddhosted.com", true },
{ "ddns-test.de", true },
{ "ddnsweb.com", true },
- { "ddoser.cn", true },
{ "ddosolitary.org", true },
{ "ddproxy.cf", true },
{ "ddracepro.net", true },
@@ -9926,9 +10352,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "de-rwa.de", true },
{ "de-spil.be", true },
{ "de.search.yahoo.com", false },
+ { "dead-letter.email", true },
{ "deadbeef.ninja", true },
+ { "deadbyhost.com", true },
{ "deadc0de.re", true },
{ "deadinsi.de", false },
+ { "deadsoul.net", false },
{ "deaf.dating", true },
{ "deaf.eu.org", true },
{ "dealapp.nl", true },
@@ -9946,6 +10375,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dealerselectric.com", true },
{ "dealinflatables.co.uk", true },
{ "dealpass.no", true },
+ { "dealspotr.com", true },
+ { "dealszone.net", true },
{ "deamuseum.org", true },
{ "deanbank.com", true },
{ "deanisa.ninja", true },
@@ -9968,8 +10399,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "debarrasclichy.com", true },
{ "debarrascolombes.com", true },
{ "debarrasnanterre.com", true },
+ { "debatereport.com", true },
{ "debbyefurd.com", true },
{ "debie-usedcars.be", true },
+ { "debigare.com", true },
{ "debora-singkreis.de", true },
{ "debron-ot.nl", true },
{ "debrusoft.ch", true },
@@ -9984,6 +10417,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dechat.nl", true },
{ "decher.de", true },
{ "decidetreatment.org", true },
+ { "decimatechnologies.eu", true },
{ "decis.fr", true },
{ "decisivetactics.com", true },
{ "deckbuilderamerica.com", true },
@@ -9991,15 +10425,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "decoating.pl", true },
{ "decock-usedcars.be", true },
{ "decodeanddestroy.com", true },
- { "decoder.link", true },
{ "decompiled.de", true },
{ "decoora.com", true },
{ "decor-d.com", true },
+ { "decor-live.ru", true },
{ "decoratingadvice.co.uk", true },
{ "decoratore.roma.it", true },
{ "decoratrix.com", true },
{ "decorauvent.ca", true },
{ "decorestilo.com.br", true },
+ { "decorumcomics.com", true },
{ "decosoftware.com", true },
{ "decrousaz-ceramique.ch", true },
{ "decrypto.net", true },
@@ -10018,21 +10453,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "deejayevents.ro", true },
{ "deelmijnreis.nl", true },
{ "deep-chess.com", true },
+ { "deep-labs.com", true },
+ { "deep.club", true },
{ "deeparamaraj.com", true },
{ "deepbluecrafting.co.uk", true },
{ "deepblueemail.com", true },
{ "deepcode.io", true },
- { "deeperxh.com", true },
{ "deephill.com", true },
+ { "deepinnov.com", true },
{ "deepinsight.io", true },
- { "deeployr.io", true },
{ "deeps.me", true },
{ "deepserve.info", true },
{ "deepsouthsounds.com", true },
{ "deepspace.dedyn.io", true },
+ { "deepspace4.com", true },
{ "deepwealth.institute", true },
{ "deepz.pt", true },
{ "deepzz.com", true },
+ { "deerfieldapartmentsstl.com", true },
{ "def-pos.ru", true },
{ "defcon.org", true },
{ "defcongroups.org", true },
@@ -10053,7 +10491,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "defme.eu", true },
{ "defont.nl", true },
{ "defrax.com", true },
- { "defrax.de", true },
{ "defreitas.no", true },
{ "deftek.com", true },
{ "deftig-und-fein.de", true },
@@ -10064,19 +10501,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "degeberg.com", true },
{ "degeberg.dk", true },
{ "degen-elektrotechnik.de", true },
- { "degestamptepot.nl", true },
- { "degosoft.nl", true },
{ "degoulet.net", true },
{ "degracetechnologie.com", true },
+ { "degrasboom.nl", true },
{ "degressif.com", true },
+ { "degroupage.info", true },
{ "dehopre.com", true },
{ "deidee.nl", true },
+ { "dein-trueffel.de", true },
{ "deinballon.de", true },
{ "deinewebsite.de", true },
{ "deinfoto.ch", true },
{ "deinserverhost.de", true },
{ "deitti.net", true },
+ { "dejan.media", true },
{ "dejandayoff.com", true },
+ { "dejting-sidor.com", true },
{ "dejure.org", true },
{ "dejw.cz", true },
{ "dekasegi-kansai.com", true },
@@ -10085,15 +10525,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dekka.cz", true },
{ "dekkercreativedesign.nl", true },
{ "dekko.io", true },
+ { "dekoh-shouyu.com", true },
{ "dekonix.ru", true },
{ "dekulk.nl", true },
{ "delahrzolder.nl", true },
+ { "delam.site", true },
+ { "delandalucia.com", true },
{ "delbecqvo.be", true },
{ "delbrouck.ch", true },
+ { "deleenheir.be", true },
{ "deleidscheflesch.nl", true },
{ "delfic.org", true },
{ "delfino.cr", true },
{ "delhionlinegifts.com", true },
+ { "deli-tochigi.jp", true },
{ "deliacreates.com", true },
{ "deliandiver.org", true },
{ "deliciisanatoase.ro", true },
@@ -10101,7 +10546,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "deliciousmedia.net", true },
{ "delicioustable.com", true },
{ "delid.cz", true },
- { "delivery.co.at", true },
{ "deliveryiquique.cl", true },
{ "dellipaoli.com", true },
{ "delogo.nl", true },
@@ -10119,6 +10563,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "deltaservers.com.br", true },
{ "deltasigmachi.org", true },
{ "deltava.org", true },
+ { "deltawolf.tk", true },
{ "demarle.ch", true },
{ "dementiapraecox.de", true },
{ "demeyere-usedcars.be", true },
@@ -10127,21 +10572,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "demilletech.net", true },
{ "demiranda.com", true },
{ "demmer.one", true },
- { "demo.swedbank.se", true },
{ "demo9.ovh", true },
{ "democracychronicles.com", true },
{ "democracyineurope.eu", true },
{ "democraziaineuropa.eu", true },
{ "demolandia.net", true },
+ { "demomanca.com", true },
{ "demoniak.ch", true },
{ "demonwav.com", true },
{ "demonwolfdev.com", true },
{ "demotivatorbi.ru", true },
{ "dempsters.ca", false },
{ "demuzere.be", true },
- { "demuzere.com", true },
- { "demuzere.net", true },
- { "demuzere.org", true },
{ "denabot.pw", true },
{ "denaehula.com", true },
{ "denardbrewing.com", true },
@@ -10153,6 +10595,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "denistruffaut.fr", false },
{ "deniszczuk.pl", true },
{ "denizdesign.co.uk", true },
+ { "denkmalagentur.ch", true },
{ "denkubator.de", true },
{ "dennisang.com", true },
{ "dennisdoes.net", false },
@@ -10174,15 +10617,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "denwauranailab.com", true },
{ "deonlinespecialist.nl", true },
{ "deontology.com", true },
+ { "depaco.com", true },
{ "depaddestoeltjes.be", true },
{ "depannage-traceur.fr", true },
{ "deparis.me", true },
{ "depeces.com", true },
{ "depechemode-live.com", true },
+ { "depedclub.ph", true },
{ "depedncr.com", true },
{ "depedtalks.com", true },
+ { "depedtambayan.net", true },
+ { "depedtayo.com", true },
+ { "depedtayo.ph", true },
{ "depicus.com", true },
+ { "deplorablesdaily.com", true },
{ "depone.net", true },
+ { "depositart.com", true },
{ "depot-leipzig.de", true },
{ "depotsquarekerrville.com", true },
{ "depotter-usedcars.be", true },
@@ -10208,6 +10658,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dereddingsklos.nl", true },
{ "dereferenced.net", true },
{ "derehamcastles.co.uk", true },
+ { "derekbooth.co.uk", true },
{ "derekheld.com", true },
{ "derekkent.com", true },
{ "derekseaman.com", true },
@@ -10229,20 +10680,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "derp.chat", true },
{ "derre.fr", true },
{ "derreichesack.com", true },
- { "dersix.com", true },
{ "dersoundhunter.de", true },
{ "derstulle.de", true },
{ "des-hommes-et-des-clous.com", true },
+ { "desafiomovilidadsustentable.com", true },
{ "desagaz.com", true },
{ "desarrollowp.com", true },
{ "descartes-finance.com", true },
{ "desec.io", true },
+ { "desenfans.com", true },
{ "desertmedaesthetics.com", true },
{ "desertsounds.org", true },
{ "desgenst.ch", true },
{ "design-in-bad.eu", true },
+ { "design-production.jp", true },
{ "design-tooning.de", true },
- { "designdevs.eu", true },
{ "designed-cybersecurity.com", true },
{ "designedbygeniuses.com", true },
{ "designedcybersecurity.com", true },
@@ -10254,8 +10706,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "designville.cz", true },
{ "designville.sk", true },
{ "desila.jp", true },
+ { "deskaservices.com", true },
{ "deskdesign.nl", true },
{ "deskeen.fr", true },
+ { "deskguide.info", true },
{ "desktopd.eu.org", true },
{ "desktopfx.net", false },
{ "deskture.com", true },
@@ -10267,7 +10721,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dessinemoilademocratie.ch", true },
{ "destech.nl", true },
{ "desterman.ru", true },
- { "destileria.net.br", true },
{ "destinationsofnewyorkstate.com", true },
{ "destinattorneyjohngreene.com", true },
{ "destinoytarot.com", true },
@@ -10310,6 +10763,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "deutschland-dsl.de", true },
{ "deuxmetrescubes.fr", true },
{ "dev-brandywineglobal.com", true },
+ { "dev-dot-naga-226708.appspot.com", true },
+ { "dev-greavesindia.pantheonsite.io", true },
{ "dev-gutools.co.uk", true },
{ "dev-pulse-mtn.pantheonsite.io", true },
{ "dev-sev-web.pantheonsite.io", true },
@@ -10318,11 +10773,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "devalps.eu", true },
{ "devb.nl", true },
{ "devcf.com", true },
+ { "devcoins.org", true },
{ "devct.cz", false },
{ "devcu.com", true },
{ "devcu.net", true },
{ "devel.cz", true },
+ { "develop.cool", true },
+ { "develope.cz", true },
{ "developer.android.com", true },
+ { "developer.moe", true },
{ "developer.mydigipass.com", false },
{ "developerdan.com", true },
{ "developerfair.com", true },
@@ -10335,12 +10794,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "developyourelement.com", true },
{ "develux.com", true },
{ "develux.net", true },
+ { "devh.net", true },
{ "deviant.email", true },
{ "devillers-occasions.be", true },
+ { "devils-point.de", true },
{ "devilshakerz.com", true },
{ "devinfo.net", false },
{ "devirc.net", true },
- { "deviser.wang", true },
{ "devisnow.fr", true },
{ "devkid.net", true },
{ "devklog.net", true },
@@ -10349,19 +10809,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "devlogr.com", true },
{ "devnull.zone", true },
{ "devonsawatzky.ca", true },
+ { "devonvintagechina.co.uk", true },
{ "devopers.com.br", true },
{ "devops-survey.com", true },
{ "devpsy.info", true },
{ "devragu.com", true },
{ "devrandom.net", true },
- { "devries.one", true },
{ "devsjournal.com", true },
{ "devsrvr.ru", true },
- { "devstaff.gr", true },
{ "devstroke.io", true },
{ "devswag.io", true },
{ "devtty.org", true },
- { "devyn.ca", false },
{ "devzero.io", true },
{ "dewaard.de", true },
{ "dewalch.net", true },
@@ -10375,9 +10833,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dez-online.de", true },
{ "dezeregio.nl", true },
{ "dezet-ev.de", true },
- { "dezintranet.com", true },
{ "dezmembrariromania.ro", true },
{ "dezshop24.de", true },
+ { "dezzoroofing.co.za", true },
{ "df1paw.de", true },
{ "dfctaiwan.org", true },
{ "dfekt.no", true },
@@ -10395,11 +10853,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dgportals.co.uk", true },
{ "dgpot.com", true },
{ "dgt-portal.de", true },
+ { "dgx.io", true },
{ "dharveydev.com", true },
{ "dhautefeuille.eu", true },
{ "dhauwer.nl", true },
{ "dhaynes.xyz", true },
- { "dhbr.org", true },
{ "dhconcept.ch", true },
{ "dheart.net", true },
{ "dhhs.gov", true },
@@ -10412,8 +10870,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dia-de.com", true },
{ "dia.com.br", true },
{ "diablovalleytech.com", true },
- { "diadorafitness.es", true },
+ { "diadiemdangsong.com", true },
{ "diadorafitness.it", true },
+ { "diag.com.ua", true },
{ "diagnostix.org", true },
{ "dialapicnic.co.za", true },
{ "dialoegue.com", true },
@@ -10450,12 +10909,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dicionarioetimologico.com.br", true },
{ "dicionariofinanceiro.com", true },
{ "dicionariopopular.com", true },
+ { "dicionarios.cc", true },
{ "dickieslife.com", true },
+ { "dickord.cloud", true },
{ "dickord.club", true },
{ "dickpics.ru", true },
{ "dicksakowicz.com", true },
{ "dicoding.com", true },
+ { "diconnex.com", true },
{ "dictionaryofnumbers.com", true },
+ { "dictionarypro.net", true },
{ "dictzone.com", true },
{ "didacte.com", true },
{ "didche.net", true },
@@ -10468,13 +10931,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "didikhari.web.id", true },
{ "die-bergfuehrer.de", true },
{ "die-blahuts.de", true },
+ { "die-bobbeloase.com", true },
{ "die-borts.ch", true },
+ { "die-gruenen-teufel.de", true },
{ "die-partei-reutlingen.de", true },
{ "die-pizzabaeckerei.de", true },
{ "die-seide.de", true },
{ "die-sinlosen.de", true },
{ "die-speisekammer-reutlingen.de", true },
- { "diebestengutscheine.de", true },
{ "diedrich.co", true },
{ "diedrich.me", true },
{ "dieecpd.org", true },
@@ -10488,6 +10952,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "diem-project.org", true },
{ "diemattels.at", true },
{ "dienchaninstitute.com", true },
+ { "diendorfer.space", true },
{ "dienstplan.cc", true },
{ "dienstplan.one", true },
{ "dierabenmutti.de", true },
@@ -10501,7 +10966,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dietafeliz.com", true },
{ "dietbrand.eu", true },
{ "dieterglas.de", true },
- { "dieterstinglhamber.me", true },
+ { "dietergreven.de", false },
+ { "dieterstinglhamber.me", false },
+ { "dietervandenbroeck.be", true },
{ "dieti.net", true },
{ "dietlin.com", true },
{ "dietrich.cx", true },
@@ -10528,17 +10995,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "digimagical.com", true },
{ "digimedia.cd", false },
{ "digioccumss.ddns.net", true },
- { "digipitch.com", true },
{ "digital-compounds.com", true },
{ "digital-eastside.de", true },
+ { "digital-insurance-engine.com", true },
+ { "digital-insurance-engine.de", true },
+ { "digital-insurance-platform.com", true },
+ { "digital-insurance-platform.de", true },
{ "digital-liberal.ch", true },
{ "digital-muscle.com.au", true },
+ { "digital-sculpture.org", true },
{ "digital.gov", false },
{ "digital.govt.nz", true },
{ "digital1st.co.uk", true },
{ "digital2web.com", false },
{ "digitalarchitecture.com", true },
{ "digitalbitbox.com", true },
+ { "digitalblood.eu", true },
{ "digitalcitizen.life", true },
{ "digitalcitizen.ro", true },
{ "digitalcraftmarketing.co.uk", true },
@@ -10587,6 +11059,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dillewijnzwapak.nl", true },
{ "dillonkorman.com", true },
{ "diluv.com", true },
+ { "dimanet.fr", true },
{ "dimanss47.net", true },
{ "dimdom.com.br", true },
{ "dime-staging.com", true },
@@ -10611,7 +11084,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dineachook.com.au", true },
{ "dinepont.fr", true },
{ "dinerroboticurology.com", true },
- { "dingcc.me", true },
{ "dingsbums.shop", true },
{ "dinheirolucrar.com", true },
{ "dinkommunikasjon.no", true },
@@ -10638,7 +11110,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "directelectricalltd.co.uk", true },
{ "directlinkfunding.co.uk", true },
{ "directnews.be", true },
+ { "directoriostelefonicos.com", true },
{ "directorioz.com", true },
+ { "directoryhub.io", true },
{ "directreal.sk", true },
{ "directspa.fr", true },
{ "direktvermarktung-schmitzberger.at", true },
@@ -10649,7 +11123,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dirko.net", true },
{ "dirkwolf.de", true },
{ "dirtcraft.ca", true },
- { "dirtygeek.ovh", true },
{ "dirtyincest.com", true },
{ "dirtyprettyartwear.com", true },
{ "disability.gov", true },
@@ -10661,9 +11134,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "discarica.bologna.it", true },
{ "discarica.it", true },
{ "discarica.roma.it", true },
- { "discha.net", true },
{ "dischempharmacie.com", true },
{ "disciples.io", true },
+ { "disciplesmakingdisciples.ca", true },
{ "disciplina.io", true },
{ "discofitta.com", true },
{ "disconformity.net", true },
@@ -10681,10 +11154,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "discoverthreejs.com", true },
{ "discoveryaima.com", true },
{ "discoveryottawa.ca", true },
- { "discoveryrom.org", true },
{ "discreet-condooms.nl", true },
{ "discrypt.ca", true },
- { "dise-online.de", true },
+ { "discus-communications.dk", true },
{ "disinclined.org", true },
{ "disinfesta.it", true },
{ "disinfestando.info", true },
@@ -10723,8 +11195,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "diskbit.nl", true },
{ "disking.co.uk", true },
{ "dismail.de", true },
- { "dispatchitsolutions.com", true },
- { "dispatchitsolutions.io", true },
{ "disposable.link", true },
{ "disroot.org", true },
{ "disrupters.ch", true },
@@ -10753,18 +11223,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "divegearexpress.net", true },
{ "diveidc.com", true },
{ "diveplan.org", true },
- { "divergenz.org", true },
{ "diversifiedproduct.com", true },
{ "diversityflags.com", true },
{ "diversityflags.com.au", true },
{ "diversityflags.nz", true },
{ "divertiagua.com.br", true },
+ { "divewithfrank.com", true },
{ "divi-experte.de", true },
+ { "dividendz.net", true },
{ "divinasaiamodas.com.br", true },
{ "divinegames.studio", true },
+ { "divineglowinghealth.com", true },
{ "divinemercyparishvld.com", true },
- { "divinemercyparishvlds.com", true },
{ "diving.photo", true },
+ { "divisuite.com", true },
{ "divorcelawyersformen.com", true },
{ "divorciosmurcia.com", true },
{ "diwei.vip", true },
@@ -10772,17 +11244,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dixibox.com", true },
{ "diybook.at", true },
{ "diycc.org", true },
- { "diygod.me", true },
{ "diymediahome.org", true },
{ "diyosun.com", true },
{ "diytechguides.com", true },
{ "diyvideoeditor.com", true },
+ { "dizalty.tv", true },
{ "dizzythewizard.co.uk", true },
{ "dj-leszwolle.nl", true },
{ "dj-x.info", true },
{ "dj3dub.com", true },
{ "djangobirthday.com", true },
- { "djangogolf.com", true },
{ "djangoproject.com", true },
{ "djangosnippets.org", true },
{ "djbbouncycastles.co.uk", true },
@@ -10791,10 +11262,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "djcursuszwolle.nl", true },
{ "djdavid98.hu", true },
{ "djeung.org", true },
+ { "djiconsulting.com", true },
{ "djipanov.com", true },
- { "djleon.net", true },
{ "djlinux.cz", true },
- { "djlive.pl", true },
{ "djlnetworks.co.uk", true },
{ "djroynomden.nl", true },
{ "djsbouncycastlehire.com", true },
@@ -10806,7 +11276,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dk.search.yahoo.com", false },
{ "dkcomputers.com.au", true },
{ "dkds.us", true },
- { "dko-steiermark.ml", true },
{ "dkstage.com", true },
{ "dkwedding.gr", true },
{ "dl.google.com", true },
@@ -10814,6 +11283,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dlaspania.pl", true },
{ "dlde.ru", true },
{ "dldl.fr", true },
+ { "dleger.space", true },
{ "dlfsymposium.nl", true },
{ "dlitz.net", true },
{ "dll4free.com", true },
@@ -10838,18 +11308,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dmess.ru", true },
{ "dmi.es", true },
{ "dmitry.sh", true },
- { "dmmkenya.co.ke", true },
+ { "dmix.ca", true },
+ { "dmk-realestate.com", true },
+ { "dmmkenya.co.ke", false },
{ "dmmultionderhoud.nl", true },
{ "dmparish.com", true },
{ "dmschilderwerken.nl", true },
{ "dmx.xyz", true },
{ "dmxledlights.com", true },
+ { "dmzlab.se", true },
{ "dn3s.me", true },
{ "dn42.eu", false },
{ "dn42.us", true },
{ "dna.li", true },
{ "dnacloud.pl", true },
{ "dnakids.co.uk", true },
+ { "dnalounge.com", true },
+ { "dnapizza.com", true },
{ "dnc.org.nz", true },
{ "dndtools.net", true },
{ "dne.lu", true },
@@ -10863,6 +11338,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dnsaio.com", true },
{ "dnscrawler.com", true },
{ "dnscrypt.info", true },
+ { "dnscrypt.nl", true },
{ "dnscurve.io", true },
{ "dnshallinta.fi", true },
{ "dnsinfo.ml", true },
@@ -10878,7 +11354,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "do13.net", true },
{ "do67.de", true },
{ "do67.net", true },
- { "doanhnhanplus.vn", true },
{ "dobraprace.cz", true },
{ "dobrev.family", true },
{ "dobrisan.ro", true },
@@ -10887,6 +11362,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "doc.to", false },
{ "doc8643.com", true },
{ "docabo.ch", true },
+ { "docassure.de", true },
{ "docbox.ch", true },
{ "doceamoraviverbem.com", true },
{ "docemeldoces.com", true },
@@ -10902,6 +11378,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "docs.python.org", true },
{ "docs.re", true },
{ "docs.tw", true },
+ { "docsoc.org.uk", true },
{ "doctabaila.com", true },
{ "doctafit.com", true },
{ "doctor-locks.co.uk", true },
@@ -10910,19 +11387,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "doctorfox.co.uk", true },
{ "doctorsonmaps.com", true },
{ "doctorwho.cz", true },
+ { "doctorxdentist.com", true },
{ "docubox.info", true },
{ "docucopies.com", true },
{ "docudanang.com.vn", true },
{ "documaniatv.com", true },
{ "docusearch.com", true },
{ "dodds.cc", true },
- { "dodomu.ddns.net", true },
{ "dodopri.com", true },
{ "doenjoylife.com", true },
{ "does.one", true },
{ "doesburg-comp.nl", true },
{ "dofuspvp.com", true },
{ "dofux.org", true },
+ { "dog-blum.com", true },
{ "dogadayiz.net", true },
{ "dogan.ch", false },
{ "dogcontrol.ca", true },
@@ -10932,6 +11410,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "doggedbyirs.com", true },
{ "doggroomingcourse.com", true },
{ "dogmap.jp", true },
+ { "dogodki.today", true },
{ "dogoo.com", true },
{ "dogpawstudio.com", true },
{ "dogrescuegreece.nl", true },
@@ -10943,7 +11422,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dokelio-idf.fr", true },
{ "doki.space", true },
{ "dokipy.no", true },
- { "doku-gilde.de", true },
{ "dokuboard.com", true },
{ "dokuraum.de", true },
{ "dolci-delizie.de", true },
@@ -10952,9 +11430,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "doli.se", true },
{ "dolice.net", true },
{ "dolinathome.com", true },
+ { "dollarrp.pl", true },
{ "dollemore.com", true },
{ "dollhousetoyo.com", true },
{ "dolorism.com", true },
+ { "dolphin-cloud.com", true },
+ { "dolphin-hosting.com", true },
{ "dolphin-it.de", true },
{ "dom-medicina.ru", true },
{ "doma.in", true },
@@ -10976,7 +11457,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "domainsilk.com", true },
{ "domainspeicher.one", true },
{ "domainstaff.com", true },
- { "domainwatch.me", true },
{ "domakidis.com", true },
{ "domaxpoker.com", true },
{ "domeconseil.fr", true },
@@ -10985,13 +11465,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "domenicam.com", true },
{ "domesticcleaners.co.uk", true },
{ "domhaase.me", true },
+ { "domian.cz", true },
{ "dominationgame.co.uk", true },
{ "dominicself.co.uk", true },
+ { "dominik-bergmann.de", true },
{ "dominik-schlueter.de", true },
{ "dominikaner-vechta.de", true },
{ "dominikkulaga.pl", true },
{ "dominionregistries.domains", true },
- { "dominique-haas.fr", true },
+ { "dominique-haas.fr", false },
{ "dominoknihy.cz", true },
{ "dominomatrix.com", true },
{ "domix.fun", true },
@@ -11006,6 +11488,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "domster.com", true },
{ "domus-global.com", true },
{ "domus-global.cz", true },
+ { "domwkwiatach.pl", true },
{ "domyassignments.com", true },
{ "domycasestudy.com", true },
{ "domycoursework.com", true },
@@ -11026,7 +11509,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "donateaday.net", true },
{ "donateway.com", true },
{ "donboscogroep.nl", true },
+ { "donetsk24.su", true },
{ "donfelino.tk", false },
+ { "dongthucvat.com", true },
{ "dongxuwang.com", true },
{ "donjusto.nl", true },
{ "donkennedyandsons.com", true },
@@ -11105,7 +11590,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dorsetentertainments.co.uk", true },
{ "dorth.nl", true },
{ "dosdediez.com", true },
- { "dosenbierrepublik.com", true },
{ "dosenkiwi.at", true },
{ "doska.by", true },
{ "doska.ru", true },
@@ -11113,7 +11597,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dossplumbing.co.za", true },
{ "dostalsecurity.com", true },
{ "dostlar.fr", true },
- { "dostrece.net", true },
{ "dosvientoselectric.com", true },
{ "dosvientoselectrical.com", true },
{ "dosvientoselectrician.com", true },
@@ -11131,6 +11614,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dotbox.org", true },
{ "dotcircle.co", true },
{ "dotconnor.com", true },
+ { "dotesports.com", true },
{ "dotgov.gov", true },
{ "dothebangthingsalon.com", true },
{ "dothydesign.com", true },
@@ -11164,6 +11648,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "douzer.de", true },
{ "douzer.industries", true },
{ "dovenzorgmalawi.nl", true },
+ { "dovro.de", true },
{ "dowell.media", true },
{ "dowellconsulting.com", true },
{ "dowhatmakegood.de", true },
@@ -11177,11 +11662,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "downloads.zdnet.com", true },
{ "downloadsoftwaregratisan.com", true },
{ "downrightcute.com", true },
+ { "downthe.pub", true },
{ "downtimerobot.com", true },
{ "downtimerobot.nl", true },
{ "downtownautospecialists.com", true },
{ "downtownvernon.com", true },
{ "dox-box.eu", true },
+ { "doxal.ro", true },
{ "doyoucheck.com", false },
{ "doyouedc.com", true },
{ "doyoutax.com", true },
@@ -11197,9 +11684,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dpi-design.de", true },
{ "dpisecuretests.com", true },
{ "dpm-ident.de", true },
+ { "dponetwork.nl", true },
{ "dprb.biz", true },
{ "dprd-wonogirikab.go.id", false },
{ "dps.srl", true },
+ { "dpsg-hohenlinden.de", true },
{ "dpsg-roden.de", true },
{ "dpwsweeps.co.uk", true },
{ "dr-becarelli-philippe.chirurgiens-dentistes.fr", true },
@@ -11207,10 +11696,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dr-it.co.uk", true },
{ "dr-jakob-zahnaerzte.de", true },
{ "dr-klotz.info", true },
+ { "dr-knirr.de", true },
{ "dr-krebs.net", true },
{ "dr-marlen-nystroem.de", true },
{ "dr-moldovan.de", true },
{ "dr-nystroem.de", true },
+ { "dr-peter-jahn.de", true },
{ "dr-schlamminger.de", true },
{ "dr-schmutzer.de", true },
{ "dr-schuessler.de", true },
@@ -11224,6 +11715,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "drachenleder.de", true },
{ "dracisvet.cz", true },
{ "dracon.es", true },
+ { "dracoon.cloud", true },
+ { "dracoon.com", true },
+ { "dracoon.de", true },
+ { "dracoon.team", true },
{ "dracox.com", true },
{ "draftguru.com.au", true },
{ "drafton.com", true },
@@ -11235,7 +11730,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "draghive.co", true },
{ "draghive.co.uk", true },
{ "draghive.com", true },
- { "draghive.org", true },
{ "draghive.tv", true },
{ "dragon-chem.eu", true },
{ "dragon-hearts.co.uk", true },
@@ -11260,6 +11754,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "draintechnorthwest.net", true },
{ "drakecommercial.com", true },
{ "drakeluce.com", true },
+ { "drakensberg-tourism.com", true },
{ "drakenson.de", true },
{ "draliabadi.com", true },
{ "dramaticpeople.com", true },
@@ -11271,6 +11766,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "drawesome.uy", true },
{ "drawingcode.net", true },
{ "drawtwo.gg", true },
+ { "drawvesly.ovh", true },
{ "drawxp.com", true },
{ "drbriones.com", true },
{ "drcarolynquist.com", true },
@@ -11283,8 +11779,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dreamdivers.com", true },
{ "dreamhack.com", true },
{ "dreamhostremixer.com", true },
- { "dreamithost.com.au", true },
- { "dreamkitchenbath.com", true },
{ "dreamlandmagic.com", true },
{ "dreamlinehost.com", false },
{ "dreamlordpress.it", true },
@@ -11297,20 +11791,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dreamonkey.com", true },
{ "dreamrae.net", true },
{ "dreamstream.mobi", true },
- { "dreamstream.network", true },
{ "dreamstream.nl", true },
{ "dreamstream.tv", true },
{ "dreamstream.video", true },
{ "dreemurr.com", true },
{ "drei01.com", true },
{ "drei01.de", true },
+ { "drei01.technology", true },
{ "dreid.org", true },
{ "dreiweiden.de", true },
{ "dresden-kaffee-24.de", true },
{ "dresden-kaffeeroesterei.de", true },
{ "dresdener-mandelstollen.de", true },
{ "dresdens-pfefferkuchenprinzessin.de", true },
- { "dresdner-christstollen-von-reimann.de", true },
{ "dresdner-kaffeeroesterei.de", true },
{ "dresdner-mandelstollen.de", true },
{ "dresdner-stollen.shop", true },
@@ -11329,7 +11822,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "drfranciscofonseca.com.br", true },
{ "drfrey.ch", true },
{ "drgdrp.com", true },
- { "drgn.no", true },
+ { "drgrace.ca", true },
{ "drhathazi.hu", true },
{ "drheibel.com", true },
{ "drhoseyni.com", true },
@@ -11345,27 +11838,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "drinkcontrolapp.com", true },
{ "drinkgas-jihlava.cz", true },
{ "drive.google.com", false },
+ { "driveexport.com", true },
{ "driven2shine.eu", true },
{ "drivenes.net", true },
{ "driver.ru", true },
{ "driver61.com", true },
+ { "drivercopilot.com", true },
{ "driverless.id", true },
{ "driverprofiler.co.uk", true },
{ "driverscollection.com", true },
{ "drivinghorror.com", true },
- { "drivingtestpro.com", true },
{ "drivinhors.com", true },
{ "drivya.com", true },
{ "drixn.cn", true },
{ "drixn.com", true },
{ "drizz.com.br", false },
- { "drjacquesmalan.com", true },
{ "drjenafernandez.com", true },
{ "drjoe.ca", true },
{ "drjuanitacollier.com", false },
{ "drjulianneil.com", true },
{ "drkhsh.at", false },
- { "drkmtrx.xyz", true },
{ "drlandis.com", true },
{ "drlangsdon.com", true },
{ "drlinkcheck.com", true },
@@ -11375,7 +11867,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "drms.us", true },
{ "drmtransit.com", true },
{ "drmyco.net", true },
- { "drnow.ru", true },
{ "drogueriaelbarco.com", true },
{ "droidandy.com", true },
{ "droidapp.nl", true },
@@ -11383,9 +11874,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "droidhere.com", true },
{ "droidim.com", false },
{ "droidwave.com", true },
- { "droidwiki.de", true },
{ "drone-it.net", true },
{ "dronebl.org", true },
+ { "droneland.nl", true },
{ "dronepit.dk", true },
{ "droni.cz", true },
{ "dronnet.com", false },
@@ -11404,6 +11895,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "drpetervoigt.ddns.net", true },
{ "drpetervoigt.de", true },
{ "drpico.com.au", true },
+ { "drros.ru", true },
{ "drrr.chat", true },
{ "drrr.wiki", true },
{ "drsajjadian.com", true },
@@ -11441,7 +11933,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dsancomics.com", true },
{ "dsanraffleshangbai.xyz", true },
{ "dsayce.com", true },
+ { "dsble.de", true },
{ "dsbrowser.com", true },
+ { "dsbutler.de", true },
{ "dschwarzachtaler.de", true },
{ "dsdalismerkezi.com", true },
{ "dsebastien.net", true },
@@ -11453,7 +11947,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dshield.org", true },
{ "dsm5.com", true },
{ "dsmjs.com", true },
- { "dsmstainlessproducts.co.uk", true },
{ "dso-imaging.co.uk", true },
{ "dso-izlake.si", true },
{ "dsol.hu", true },
@@ -11466,8 +11959,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dstvinstallfourways.co.za", true },
{ "dstvinstallkemptonpark.co.za", true },
{ "dstvinstallrandburg.co.za", true },
+ { "dstvrandburg.co.za", true },
{ "dstvsandton.co.za", true },
{ "dstvsouthafrica.com", true },
+ { "dsuinnovation.com", true },
{ "dt27.org", true },
{ "dtbouncycastles.co.uk", true },
{ "dtdsh.com", true },
@@ -11484,6 +11979,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dtpak.cz", true },
{ "dtuaarsfest.dk", true },
{ "dtx.sk", true },
+ { "du-alex.ru", true },
{ "dualascent.com", true },
{ "dub.cz", true },
{ "dubai-company.ae", true },
@@ -11494,17 +11990,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dubrovnik-dental.clinic", true },
{ "dubrovskiy.net", true },
{ "dubrovskiy.pro", true },
+ { "dubstep.fr", true },
{ "dubtrack.fm", true },
{ "ducalendars.com", true },
{ "duch.cloud", true },
{ "duckbase.com", true },
{ "duckblade.com", true },
+ { "duckcorp.org", true },
{ "duckduck.horse", true },
{ "duckduckstart.com", true },
{ "duckeight.win", true },
{ "duckinc.net", true },
- { "duckyubuntu.tk", true },
{ "duct.me", true },
+ { "dudesunderwear.com.br", false },
{ "due-diligence-security.com", true },
{ "duerlund-falkenberg.dk", true },
{ "duernberg.at", true },
@@ -11535,7 +12033,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dumbfunded.co.uk", true },
{ "dumbomove.com.au", true },
{ "dumino.bg", true },
- { "dumont.ovh", true },
{ "dumpsters.com", true },
{ "duncancmt.com", true },
{ "duncanfamilytrust.org", true },
@@ -11543,7 +12040,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "duncanwinfrey.com", true },
{ "duncm.com", true },
{ "dundalkdonnie.com", true },
- { "dunesadventure.net", true },
{ "dungeon-bbs.de", true },
{ "dunklau.fr", true },
{ "dunkle-seite.org", true },
@@ -11551,8 +12047,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dunmanelectric.com", true },
{ "duobus.nl", true },
{ "duoluodeyu.com", true },
+ { "duonganhtuan.com", true },
{ "duoquadragintien.fr", true },
{ "dupisces.com.tw", true },
+ { "duploclique.pt", false },
{ "dupree.co", true },
{ "dupree.pe", true },
{ "durand.tf", true },
@@ -11563,18 +12061,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dureuil.info", true },
{ "durexwinkel.nl", true },
{ "durfteparticiperen.nl", true },
+ { "durgatopos.it", true },
{ "duria.de", true },
{ "duriaux-dentiste.ch", true },
{ "duroterm.ro", true },
{ "durys.be", true },
{ "dusmomente.com", true },
- { "dusnan.com", true },
{ "dustplanet.de", true },
{ "dustri.org", true },
+ { "dustycloth.com", true },
{ "dustygroove.com", true },
+ { "dustyro.se", true },
{ "dustyspokesbnb.ca", true },
+ { "dustywilson.com", true },
{ "dutch.desi", true },
{ "dutchdare.nl", true },
+ { "dutchfoodie.nl", true },
{ "dutchforkrunners.com", true },
{ "dutchrank.nl", true },
{ "dutchwanderers.nl", true },
@@ -11592,7 +12094,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dvwc.org", true },
{ "dvx.cloud", true },
{ "dw-loewe.de", true },
- { "dwbtoftshit.com", true },
{ "dwgf.xyz", true },
{ "dwi-sued.de", true },
{ "dwienzek.de", true },
@@ -11604,6 +12105,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dx-revision.com", true },
{ "dxgl.info", true },
{ "dxgl.org", true },
+ { "dxm.no-ip.biz", true },
{ "dybuster.at", true },
{ "dybuster.ch", true },
{ "dybuster.com", true },
@@ -11611,12 +12113,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dybuster.es", true },
{ "dybuster.it", true },
{ "dybuster.se", true },
- { "dycoa.com", true },
{ "dyeager.org", true },
{ "dyktig.as", true },
{ "dyktig.no", true },
{ "dylanboudro.com", true },
{ "dylancl.cf", true },
+ { "dylangattey.com", false },
{ "dylankatz.com", true },
{ "dylanknoll.ca", true },
{ "dylanspcrepairs.com", true },
@@ -11647,22 +12149,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dynamo.city", true },
{ "dynapptic.com", true },
{ "dynastic.co", true },
- { "dynastyarena.com", true },
{ "dynastybullpen.com", true },
- { "dynastycalculator.com", true },
- { "dynastycentral.com", true },
- { "dynastychalkboard.com", true },
- { "dynastyclubhouse.com", true },
- { "dynastycrate.com", true },
- { "dynastyduel.com", true },
- { "dynastyfan.com", true },
- { "dynastygoal.com", true },
- { "dynastylocker.com", true },
- { "dynastyredline.com", true },
{ "dynastyredzone.com", true },
{ "dynn.be", true },
+ { "dynocc.xyz", true },
{ "dynorphin.com", true },
{ "dynorphins.com", true },
+ { "dynts.pro", true },
{ "dynx.pl", true },
{ "dyrenesverden.no", true },
{ "dyrkar.com", true },
@@ -11682,7 +12175,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "dzsi.bi", true },
{ "dzsibi.com", true },
{ "dzsula.hu", true },
- { "dzyabchenko.com", true },
{ "dzyszla.pl", true },
{ "e-bikesdirect.co.uk", true },
{ "e-biografias.net", true },
@@ -11693,8 +12185,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "e-enterprise.gov", false },
{ "e-hon.link", true },
{ "e-id.ee", true },
- { "e-imzo.uz", true },
- { "e-kontakti.fi", true },
{ "e-lambre.com", true },
{ "e-learningbs.com", true },
{ "e-lifetechnology.com", true },
@@ -11702,6 +12192,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "e-speak24.pl", true },
{ "e-standardstore.org", true },
{ "e-surveillant.nl", true },
+ { "e-sushi.net", true },
{ "e-sw.co.jp", true },
{ "e-teacher.pl", true },
{ "e-teachers.me", true },
@@ -11712,8 +12203,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "e-tonery.cz", true },
{ "e-traceur-france.fr", true },
{ "e-tresor.at", true },
+ { "e-tune-mt.net", true },
{ "e-typ.eu", true },
- { "e-verify.gov", false },
+ { "e-verify.gov", true },
+ { "e-webos.com", true },
{ "e-worksmedia.com", true },
{ "e.mail.ru", true },
{ "e11even.nl", false },
@@ -11730,6 +12223,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "e965.ru", true },
{ "e9a.at", true },
{ "ea2drocks.com", true },
+ { "eac.gov", true },
{ "eacero.com", true },
{ "ead-italia.it", true },
{ "eagle.net", true },
@@ -11742,22 +12236,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "eagleyecs.com", true },
{ "eaimty.com", true },
{ "ealev.de", true },
- { "eapestudioweb.com", true },
+ { "eallion.com", true },
{ "earl.org.uk", true },
{ "earlydocs.com", true },
{ "earlyyearshub.com", true },
{ "earmarks.gov", true },
{ "earn.com", true },
+ { "earn.wiki", true },
{ "earthsystemprediction.gov", true },
{ "earticleblog.com", true },
{ "earvinkayonga.com", false },
{ "easelforart.com", true },
+ { "easez.net", true },
{ "eashwar.com", true },
+ { "eason-yang.com", true },
{ "eastarm.net", true },
{ "eastblue.org", true },
{ "easterncapebirding.co.za", true },
{ "eastlothianbouncycastles.co.uk", true },
- { "eastman.space", true },
{ "eastmanbusinessinstitute.com", true },
{ "eastnorschool.co.uk", true },
{ "eastplan.co.kr", true },
@@ -11769,7 +12265,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "easycoding.org", true },
{ "easyconstat.com", true },
{ "easycosmetic.ch", true },
- { "easycup.com", false },
{ "easydumpsterrental.com", true },
{ "easyeigo.com", true },
{ "easyfiles.ch", true },
@@ -11778,6 +12273,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "easyocm.hu", true },
{ "easyoutdoor.nl", true },
{ "easypay.bg", true },
+ { "easypayments.pro", true },
{ "easyproperty.com", true },
{ "easypv.ch", true },
{ "easyqr.codes", true },
@@ -11793,7 +12289,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "eatmebudapest.hu", true },
{ "eaton-works.com", true },
{ "eatry.io", true },
- { "eats.soy", true },
{ "eatsleeprepeat.net", true },
{ "eatson.com", true },
{ "eatz-and-treatz.com", true },
@@ -11821,13 +12316,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ebiografia.com", true },
{ "ebisi.be", true },
{ "ebizarts.com", true },
+ { "eblog.ink", true },
{ "eboek.info", true },
{ "ebonyriddle.com", true },
{ "ebooki.eu.org", true },
- { "ebooklaunchers.com", true },
{ "eboutic.ch", true },
{ "eboyer.com", true },
{ "ebpglobal.com", false },
+ { "ebrnd.de", true },
{ "ec-current.com", true },
{ "ec.mine.nu", true },
{ "eca.edu.au", true },
@@ -11842,6 +12338,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ecdn.cz", true },
{ "ecfnorte.com.br", true },
{ "ecfunstalls.com", true },
+ { "echarity.ae", true },
{ "echatta.net", true },
{ "echatta.org", true },
{ "echi.pw", true },
@@ -11860,12 +12357,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "echosim.io", true },
{ "echosixmonkey.com", true },
{ "echosystem.fr", true },
- { "echoteam.gq", true },
{ "echoteen.com", true },
{ "echoworld.ch", true },
{ "echternach-immobilien.de", true },
- { "echtes-hutzelbrot.de", true },
{ "echtgeld-casinos.de", true },
+ { "ecir.pro", true },
{ "ecir.ru", true },
{ "ecirtam.net", true },
{ "eckel.co", true },
@@ -11881,7 +12377,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ecobin.nl", true },
{ "ecoccinelles.ch", true },
{ "ecoccinelles.com", true },
- { "ecococon.fr", true },
{ "ecocreativity.org", true },
{ "ecodedi.com", true },
{ "ecodesigns.nl", true },
@@ -11905,6 +12400,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "economics-colleges.com", true },
{ "economiefidu.ch", true },
{ "economies.ch", true },
+ { "econsorzio.com", true },
{ "econsumer.gov", true },
{ "econverter.cloud", true },
{ "ecorp.cc", true },
@@ -11943,7 +12439,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "edesseglabor.hu", true },
{ "edfinancial.com", true },
{ "edge-cloud.net", false },
- { "edgedynasty.com", true },
{ "edgefantasy.com", true },
{ "edgeservices.co.uk", true },
{ "edgetalk.net", true },
@@ -11990,12 +12485,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "edu6.cloud", true },
{ "eduard-dopler.de", true },
{ "edubras.com.br", true },
+ { "educacionvirtual.com.ar", true },
{ "educatek.es", true },
+ { "educateyourskin.com", true },
{ "educationevolving.org", true },
{ "educationfutures.com", true },
{ "educationmalaysia.co.uk", true },
{ "educationunlimited.com", true },
- { "educator-one.com", true },
{ "eductf.org", true },
{ "eduid.se", false },
{ "edumundo.nl", true },
@@ -12003,7 +12499,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "eduroam.no", true },
{ "eduroam.uy", true },
{ "edusanjal.com", true },
- { "edusantorini.com", true },
{ "eduvpn.no", true },
{ "eduxpert.in", true },
{ "edv-bv.de", true },
@@ -12029,6 +12524,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "eellak.gr", true },
{ "eelsden.net", true },
{ "eelzak.nl", true },
+ { "eemcevn.com", true },
{ "eentweevijf.be", true },
{ "eer.io", true },
{ "eerlijktransport.nl", true },
@@ -12040,10 +12536,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ef.gy", true },
{ "efa-football.com", true },
{ "efaas.nl", true },
- { "efag.com", true },
{ "efcross.com", true },
{ "efeen.nl", true },
- { "eff-bee-eye.de", true },
{ "eff.org", true },
{ "effdocs.com", true },
{ "effe.ch", true },
@@ -12052,7 +12546,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "effero.net", true },
{ "effex.ru", true },
{ "effinfun.com", true },
- { "efflam.net", true },
{ "effortlesshr.com", true },
{ "efg-darmstadt.de", false },
{ "efinity.io", true },
@@ -12069,22 +12562,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "eflorashop.net", true },
{ "eflorashop.us", true },
{ "efmcredentialing.org", true },
+ { "efreet.xyz", true },
{ "eft.boutique", true },
{ "eftelingcraft.net", true },
{ "egablo.black", true },
- { "egamespw.com", true },
{ "egami.ch", true },
{ "eganassociates.com.au", true },
{ "egarden.it", true },
{ "egb.at", false },
- { "egbert.net", true },
{ "egeozcan.com", true },
{ "egg-ortho.ch", true },
{ "eggblast.com", true },
{ "eggert.org", false },
{ "eggplant.today", true },
+ { "egicloud.com", true },
{ "egiftcards.be", true },
- { "eglek.com", true },
{ "egles.eu", true },
{ "eglisedenantes.fr", true },
{ "ego4u.com", true },
@@ -12103,6 +12595,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ehazi.hu", true },
{ "ehbssl.com", true },
{ "ehcommerce.com", true },
+ { "ehdud8451.tk", true },
{ "eheliche-disziplin.schule", true },
{ "ehertz.uk", true },
{ "ehipaa.com", true },
@@ -12112,7 +12605,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ehne.de", true },
{ "ehomusicgear.com", true },
{ "ehrenburg.info", true },
- { "ehseller.com", true },
{ "ehub.cz", true },
{ "ehub.hu", true },
{ "ehub.pl", true },
@@ -12120,17 +12612,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "eiao.me", true },
{ "eichel.eu", true },
{ "eichler.work", true },
- { "eichornenterprises.com", true },
{ "eickemeyer.nl", true },
{ "eickhof.co", true },
{ "eickhof.us", true },
{ "eickhofcolumbaria.com", true },
{ "eidolons.org", true },
{ "eifel.website", true },
- { "eifelindex.de", true },
{ "eigenpul.se", true },
{ "eigenpulse.com", true },
{ "eighty-aid.com", true },
+ { "eightyfour.ca", true },
{ "eigpropertyauctions.co.uk", true },
{ "eihaikyo.com", true },
{ "eika.as", true },
@@ -12150,7 +12641,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "einsteincapital.ca", true },
{ "eintageinzug.de", true },
{ "eintragsservice24.de", true },
- { "eioperator.com", true },
+ { "eioperator.com", false },
{ "eipione.com", true },
{ "eirastudios.co.uk", false },
{ "eirb.fr", true },
@@ -12167,6 +12658,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ejkwebdesign.nl", true },
{ "ek-networks.de", false },
{ "ekaigotenshoku.com", true },
+ { "ekaplast.com.pl", true },
{ "ekati.ru", true },
{ "ekawaiishop.com", true },
{ "ekb-avia.ru", true },
@@ -12175,12 +12667,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ekedp.com", true },
{ "eklepka.com", true },
{ "eklitzke.org", true },
+ { "ekodevices.com", true },
{ "ekokontakt.cz", true },
{ "ekonbenefits.com", true },
{ "ekostecki.de", true },
{ "ekostrateg.com", true },
+ { "ekouniejow.pl", true },
{ "ekpyroticfrood.net", true },
{ "ekrana.info", true },
+ { "ekranos.me", true },
{ "eksisozluk.com", true },
{ "ekuatorial.com", true },
{ "ekyu.moe", true },
@@ -12191,6 +12686,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "el-hossari.com", true },
{ "el-news.de", true },
{ "eladgames.com", true },
+ { "eladlak-ingatlan.com", true },
{ "elagplus.com", true },
{ "elainerock.com", true },
{ "elaon.de", true },
@@ -12198,6 +12694,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "elarvee.xyz", true },
{ "elb500ttl.nl", true },
{ "elbetech.net", true },
+ { "elblogdegoyo.mx", true },
{ "elcambiador.es", true },
{ "elcontadorsac.com", true },
{ "eldapoint.co.uk", true },
@@ -12208,7 +12705,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "eldertons.co.uk", true },
{ "eldevo.com", true },
{ "eldinhadzic.com", true },
- { "eldisagjapi.com", true },
{ "eldrid.ge", true },
{ "eldritchfiction.net", true },
{ "electionsbycounty.com", true },
@@ -12245,11 +12741,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "electricfencealberton.co.za", true },
{ "electricfencebenoni.co.za", true },
{ "electricfencingballito.co.za", true },
+ { "electricfencinggillitts.co.za", true },
+ { "electricfencinghillcrest.co.za", true },
+ { "electricfencingkloof.co.za", true },
+ { "electricfencingpinetown.co.za", true },
{ "electricgatemotorgermiston.co.za", true },
+ { "electricgatemotorglenvista.co.za", true },
{ "electricgatemotorrandburg.co.za", true },
{ "electricgatemotorskemptonpark.co.za", true },
{ "electricgatemotorsroodepoort.co.za", true },
{ "electrichiddenhills.com", true },
+ { "electrician-umhlangaridge.co.za", true },
{ "electricianagoura.com", true },
{ "electricianagourahills.com", true },
{ "electriciancalabasas.com", true },
@@ -12259,6 +12761,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "electricianhiddenhills.com", true },
{ "electriciankemptonpark24-7.co.za", true },
{ "electricianlakesherwood.com", true },
+ { "electricianlalucia.co.za", true },
{ "electricianmalibu.com", true },
{ "electricianmoorpark.com", true },
{ "electriciannewburypark.com", true },
@@ -12324,19 +12827,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "elementarywave.com", true },
{ "elements.guide", true },
{ "elementshop.co.uk", true },
- { "elena-baykova.ru", false },
- { "elenatranslations.nl", true },
{ "elephants.net", true },
{ "elephpant.cz", true },
{ "elepover.com", true },
- { "elerizoentintado.es", true },
+ { "elerizoentintado.es", false },
{ "eletesstilus.hu", true },
{ "eletor.com", true },
{ "eletor.pl", true },
+ { "eletrochape.com.br", true },
{ "elettricista-roma.it", true },
{ "elettricista-roma.org", true },
{ "eleusis-zur-verschwiegenheit.de", true },
{ "elevatoraptitudetest.com", true },
+ { "elexel.ru", true },
{ "elexprimidor.com", true },
{ "elexwong.com", true },
{ "elfe.de", true },
@@ -12345,12 +12848,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "elfussports.com", true },
{ "elgalponazo.com.ar", true },
{ "elglobo.com.mx", false },
- { "elgosblanc.com", false },
+ { "elgosblanc.com", true },
{ "elguadia.faith", true },
{ "elhamadimi.com", true },
{ "elhorizontal.com", true },
{ "elhossari.com", true },
- { "elia.cloud", true },
{ "elian-art.de", true },
{ "elias-nicolas.com", true },
{ "eliaskordelakos.com", true },
@@ -12365,16 +12867,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "eliminercellulite.com", true },
{ "elinevanhaaften.nl", true },
{ "elinvention.ovh", true },
- { "eliolita.com", true },
{ "elisa.ee", false },
{ "elisabeth-kostecki.de", true },
{ "elisabeth-strunz.de", true },
{ "elisabethkostecki.de", true },
{ "elisabethrene.com", true },
{ "elisechristie.com", true },
+ { "elistor6100.xyz", true },
{ "elite12.de", true },
{ "elitebouncingfun.com", true },
{ "elitegameservers.net", true },
+ { "elitel.nl", true },
{ "elitenutritionoficial.com", true },
{ "elixi.re", true },
{ "elixir.bzh", true },
@@ -12384,6 +12887,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "elizabethrominski.com", true },
{ "eljef.me", true },
{ "elkoy.org", true },
+ { "ell-net.tokyo", true },
{ "ella-kwikmed.com", false },
{ "ellak.gr", true },
{ "ellegaard.dk", true },
@@ -12400,10 +12904,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "elnan.do", true },
{ "elnoorandelmohanad.com", true },
{ "elo-forum.org", true },
- { "elodieclerc.ch", true },
- { "elohellp.com", false },
+ { "elodrias.de", true },
{ "elonaspitze.de", true },
{ "elosrah.com", true },
+ { "elosuite.com", true },
{ "elpado.de", true },
{ "elpo.net", true },
{ "elpoderdelespiritu.org", true },
@@ -12429,8 +12933,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "elvidence.com.au", true },
{ "elviraszabo.com", true },
{ "elvispresley.net", true },
- { "elvisripley.com", true },
- { "elvn.tokyo", true },
+ { "elvn.tokyo", false },
{ "elwave.org", true },
{ "elwix.com", true },
{ "elxsi.de", true },
@@ -12470,23 +12973,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "emeraldcityswagger.com", true },
{ "emeraldcoastrideshare.com", true },
{ "emeraldonion.org", true },
+ { "emergencyshutoff.com", true },
{ "emergenzalavoro.com", true },
{ "emero.de", true },
{ "emex.ro", true },
{ "emi-air-comprime.com", true },
{ "emi.im", true },
{ "emielraaijmakers.nl", true },
- { "emil-dein-baecker.com", true },
{ "emil-dein-baecker.de", true },
{ "emil-reimann.com", true },
{ "emil.click", true },
+ { "emil.one", true },
{ "emilecourriel.com", true },
+ { "emiliendevos.be", true },
{ "emilio.media", true },
{ "emilong.com", true },
- { "emilreimann.de", true },
{ "emils-1910.de", true },
- { "emils-chemnitz.de", true },
- { "emils1910.de", true },
+ { "emilstahl.com", true },
{ "emilstahl.dk", true },
{ "emilvarga.com", true },
{ "emily.moe", true },
@@ -12498,6 +13001,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "emkanrecords.com", true },
{ "emkei.cz", true },
{ "emkrivoy.com", true },
+ { "emma.ca", true },
+ { "emma.ly", true },
{ "emmababy420.com", true },
{ "emmagraystore.com", true },
{ "emobilityforum.org", true },
@@ -12544,10 +13049,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "enalean.com", true },
{ "enamae.net", true },
{ "enbecom.net", true },
+ { "encens.boutique", true },
{ "encfs.win", true },
{ "encircleapp.com", true },
{ "encnet.de", true },
{ "encode.host", true },
+ { "encodecloud.net", true },
{ "encoderx.uk", true },
{ "encore.io", false },
{ "encouragemarketing.com", true },
@@ -12570,7 +13077,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "endingthedocumentgame.gov", true },
{ "endlessdiy.ca", true },
{ "endlessvideo.com", true },
- { "endofodo.goip.de", true },
{ "endoftenancycleaninglondon.co.uk", true },
{ "endoftennancycleaning.co.uk", true },
{ "endpointsystems.com", true },
@@ -12583,7 +13089,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "energy-in-balance.eu", true },
{ "energy-infra.nl", true },
{ "energy-initiative.com", true },
- { "energy.eu", true },
{ "energyatlas.com", true },
{ "energyaupair.se", true },
{ "energycodes.gov", true },
@@ -12596,7 +13101,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "enfantsdelarue.ch", true },
{ "enfield-kitchens.co.uk", true },
{ "enflow.nl", true },
- { "enfu.se", true },
+ { "enganches.es", true },
{ "engarde.net", true },
{ "engaugetools.com", true },
{ "engelke-optik.de", true },
@@ -12605,8 +13110,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "engg.ca", true },
{ "engie-laadpalen.nl", true },
{ "engiedev.net", true },
- { "enginepit.com", true },
{ "enginsight.com", true },
+ { "enginx.net", true },
+ { "engl-server.de", true },
{ "engl-systems.de", true },
{ "englishbulgaria.net", true },
{ "englishcast.com.br", true },
@@ -12640,6 +13146,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "enorekcah.com", true },
{ "enot32.ru", true },
{ "enotecastore.it", true },
+ { "enotefile.com", true },
{ "enpasenerji.com.tr", true },
{ "enquos.com", true },
{ "enrich.email", true },
@@ -12666,32 +13173,36 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "entradaweb.cl", true },
{ "entrainr.com", true },
{ "entrecieletpierres.com", true },
- { "entreprise-toiture-clement.fr", true },
{ "entropia.de", false },
{ "entrusted.io", true },
{ "entryboss.cc", true },
{ "entrypoint.sh", true },
{ "entwickler.land", true },
{ "enuchi.jp", true },
+ { "enuygun.com", true },
{ "envant.co.uk", true },
{ "enveloppenopmaat.nl", true },
{ "envescent.com", true },
{ "enviatufoto.com", true },
{ "enviaya.com.mx", true },
+ { "envide.no", true },
+ { "enviro-umweltservice.de", true },
{ "environmental-colleges.com", true },
- { "environmentkirklees.org", true },
{ "enviroprobasements.com", true },
{ "envirotech.com.au", true },
{ "envoie.moi", true },
{ "envoyez.moi", true },
{ "eocservices.co.uk", true },
{ "eoitek.com", true },
+ { "eola.co", true },
{ "eonhive.com", true },
{ "eoonglobalresources.jp", true },
{ "eopugetsound.org", false },
{ "eosol.de", true },
{ "eosol.net", true },
+ { "eosolutions.co", true },
{ "epa.com.es", true },
+ { "epasar.my", false },
{ "epassafe.com", true },
{ "epay.bg", true },
{ "epdeveloperchallenge.com", true },
@@ -12708,6 +13219,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "epichouse.net", false },
{ "epicinflatables.co.uk", true },
{ "epickitty.co.uk", true },
+ { "epicpages.com", true },
{ "epicsecure.de", true },
{ "epicsoft.de", false },
{ "epicvistas.com", true },
@@ -12716,6 +13228,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "epidauros.be", true },
{ "epigrafes-led-farmakeia.gr", true },
{ "epilis.gr", true },
+ { "epinesdeparadis.com", true },
{ "epiphanyofourlordchurch.com", true },
{ "epiphyte.network", true },
{ "episkevh-plaketas.gr", true },
@@ -12726,7 +13239,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "epizentrum.work", true },
{ "epizentrum.works", true },
{ "epmcentroitalia.it", true },
- { "epo32.ru", true },
{ "epoch.com", true },
{ "epolitiker.com", true },
{ "epos-distributor.co.uk", true },
@@ -12796,11 +13308,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "erico.jp", true },
{ "ericoc.com", true },
{ "erics.site", true },
- { "ericschwartzlive.com", true },
{ "ericspeidel.de", true },
{ "ericvaughn-flam.com", true },
{ "ericwie.se", true },
{ "ericyl.com", true },
+ { "eridanus.uk", true },
{ "erigrid.eu", true },
{ "eriix.org", true },
{ "erikheemskerk.nl", true },
@@ -12811,14 +13323,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "erikwalther.eu", true },
{ "erinaceinae.com", true },
{ "eriner.me", true },
- { "erinn.io", true },
{ "erisrenee.com", true },
{ "erixschueler.de", true },
{ "erkaelderbarenaaben.dk", true },
+ { "erlebnisarchaeologie-bayern.de", true },
{ "ernest.ly", true },
+ { "ernsteisprung.ch", true },
{ "ero.ink", true },
+ { "eromond.com", true },
{ "eron.info", true },
- { "eroskines.com", true },
{ "erp-band.ru", true },
{ "erp.band", true },
{ "erpax.com", true },
@@ -12848,7 +13361,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "erudikum.cz", true },
{ "ervaarjapan.nl", true },
{ "erverydown.ml", true },
- { "erwanlepape.com", true },
{ "erwin.saarland", true },
{ "erwinpaal.nl", true },
{ "erwinschmaeh.ch", true },
@@ -12866,17 +13378,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "esc.chat", true },
{ "esc.gov", true },
{ "escael.org", true },
+ { "escalesensorielle.com", true },
{ "escapeplaza.de", true },
{ "escapetalk.nl", true },
{ "escargotbistro.com", true },
{ "escavador.com", true },
{ "esclear.de", true },
- { "escolibri.com", true },
{ "escontact.ch", true },
{ "escortmantra.com", true },
{ "escritoriodearte.com", false },
{ "escuelabiblica.com", true },
- { "escxtra.com", true },
{ "escyr.top", true },
{ "esdenera.com", true },
{ "esdiscuss.org", true },
@@ -12885,9 +13396,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "esgen.org", true },
{ "esgr.in", true },
{ "eshigami.com", true },
+ { "eshobe.com", true },
{ "eshop-prices.com", true },
{ "eshspotatoes.com", true },
- { "esibun.net", true },
{ "esigmbh.de", true },
{ "esite.ch", true },
{ "eskdale.net", true },
@@ -12900,10 +13411,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "esono.de", true },
{ "esote.net", true },
{ "esoterikerforum.de", true },
+ { "esovita.de", true },
{ "espace-caen.fr", true },
{ "espace-gestion.fr", true },
{ "espace.network", true },
{ "espacecuisine.ca", true },
+ { "espacelanguetokyo.fr", true },
{ "espacetemps.ch", true },
{ "espacetheosophie.fr", true },
{ "espacio-cultural.com", true },
@@ -12927,7 +13440,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "esquisse.fr", true },
{ "esrhd.com", true },
{ "esrinfo.com", true },
- { "ess-cert.ru", true },
{ "essayace.co.uk", true },
{ "essayads.com", true },
{ "essaybrand.com", true },
@@ -12939,7 +13451,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "essaypro.net", true },
{ "essaytalk.com", true },
{ "essaywriting.biz", true },
- { "essca.fr", true },
{ "essenalablog.de", true },
{ "essenciasparis.com.br", true },
{ "essex.cc", true },
@@ -12953,11 +13464,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "estafallando.mx", true },
{ "estaleiro.org", true },
{ "estate360.co.tz", true },
- { "estateczech-eu.ru", true },
{ "estcequejailaflemme.fr", false },
{ "estcequonmetenprodaujourdhui.info", true },
{ "esteam.se", true },
{ "estedafah.com", true },
+ { "estefan.dyndns.org", true },
+ { "esteladigital.com", true },
{ "esterilizacion-perros.es", true },
{ "esteticanorte.com.br", true },
{ "estetista.net", true },
@@ -12965,10 +13477,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "esthesoleil.jp", true },
{ "estilopack-loja.com.br", true },
{ "estoic.net", true },
+ { "estonia.net", true },
{ "estoniantrade.ee", true },
{ "estonoentraenelexamen.com", true },
{ "estoppels.com", true },
+ { "estraks.com", true },
{ "estudiarparaser.com", true },
+ { "estudiaryaprenderingles.com", true },
{ "estudiserradal.com", true },
{ "estufitas.com", true },
{ "esu.zone", true },
@@ -12986,7 +13501,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "etajerka-spb.ru", true },
{ "etaoinwu.win", true },
{ "etasigmaphi.org", true },
- { "etath.com", true },
{ "etax.com.au", true },
{ "etaxi.tn", true },
{ "etccooperative.org", true },
@@ -13001,6 +13515,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "eternal-warriors.de", true },
{ "eternalabyss.int.eu.org", true },
{ "eternalflame.cn", true },
+ { "eternalflame.info", true },
{ "eternit.roma.it", true },
{ "etfacta.com", true },
{ "eth-faucet.net", true },
@@ -13009,10 +13524,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ethack.org", true },
{ "ethaligan.fr", true },
{ "ethan.pm", true },
+ { "ethanchin.com", true },
{ "ethanjones.me", true },
+ { "ethanlew.is", true },
{ "ethercalc.com", true },
{ "ethercalc.org", true },
- { "ethergeist.de", false },
+ { "ethergeist.de", true },
{ "etherium.org", true },
{ "etherpad.nl", true },
{ "ethers.news", true },
@@ -13020,10 +13537,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ethicalpolitics.org", true },
{ "ethicsburg.gov", true },
{ "ethika.com", true },
+ { "ethiobaba.com", true },
{ "ethiopian.dating", true },
{ "ethiopiannews247.com", true },
{ "ethitter.com", true },
- { "ethosinfo.com", true },
{ "etienne.cc", true },
{ "etikus-hacker.hu", true },
{ "etiquetaunica.com.br", true },
@@ -13076,19 +13593,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "eurekaarchi.com", true },
{ "eurekaarchitecture.com", true },
{ "eurheilu.com", true },
- { "euro-servers.de", true },
{ "euroalter.com", true },
{ "eurocars2000.es", true },
{ "eurocenterobuda.hu", true },
+ { "euroconthr.ro", true },
{ "eurodentaire.com", true },
{ "euroflora.com", true },
{ "euroflora.mobi", true },
{ "eurofrank.eu", true },
{ "eurolocarno.es", true },
- { "europapier.com", true },
- { "europapier.hu", true },
+ { "europalettenkaufen.de", true },
+ { "europapier.at", false },
{ "europapier.net", true },
- { "europapier.sk", true },
{ "europarts-sd.com", true },
{ "europastudien.de", true },
{ "european-agency.org", true },
@@ -13100,10 +13616,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "europetravelservice.co.uk", true },
{ "europop.com", true },
{ "eurora.de", true },
+ { "eurorecambios24.com", true },
{ "euroscot.de", true },
{ "euroshop.or.at", true },
{ "euroskano.nl", true },
- { "eurotime.ua", true },
{ "eurotramp.com", true },
{ "eurotravelstar.eu", true },
{ "eurousa.us", true },
@@ -13111,14 +13627,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "euteamo.cn", true },
{ "euterpiaradio.ch", true },
{ "eutotal.com", true },
- { "eutram.com", true },
{ "euwid-energie.de", true },
{ "euwid.de", true },
{ "ev-zertifikate.de", true },
{ "eva-select.com", true },
{ "eva.cz", true },
{ "evaartinger.de", true },
- { "evafojtova.cz", true },
{ "evailoil.ee", true },
{ "evailoil.eu", true },
{ "evalesc.com", true },
@@ -13145,6 +13659,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "evenementenhoekvanholland.nl", true },
{ "evenstargames.com", true },
{ "event-blick.de", true },
+ { "event-fullyyours.com", true },
{ "event4fun.no", true },
{ "eventaro.com", true },
{ "eventide.space", true },
@@ -13162,10 +13677,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "evergladesrestoration.gov", true },
{ "evergreenmichigan.com", true },
{ "everhome.de", true },
+ { "everify.gov", true },
{ "everitoken.io", true },
{ "everling.lu", true },
{ "everlong.org", true },
{ "evermarkstudios.com", true },
+ { "evernaut.com", true },
{ "everpcpc.com", true },
{ "evertonarentwe.com", true },
{ "everwaking.com", false },
@@ -13179,6 +13696,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "everygayporn.com", false },
{ "everything-everywhere.com", true },
{ "everythingaccess.com", true },
+ { "everythingstech.com", false },
{ "everythinq.com", true },
{ "everytrycounts.gov", false },
{ "everywhere.cloud", true },
@@ -13194,7 +13712,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "evileden.com", true },
{ "evilized.de", true },
{ "evilmartians.com", true },
- { "evilsite.cf", true },
{ "evion.nl", true },
{ "evlear.com", true },
{ "evoco.vc", true },
@@ -13228,7 +13745,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ewe2.ninja", true },
{ "ewhitehat.com", true },
{ "ewie.name", true },
- { "ewizmo.com", true },
{ "ewok.io", true },
{ "ewout.io", true },
{ "ewsfeed.com", true },
@@ -13238,6 +13754,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ex-deli.jp", true },
{ "exactlyinfinite.com", true },
{ "exactphilosophy.net", true },
+ { "exadime.net", true },
{ "exagoni.com.au", true },
{ "exagoni.com.my", true },
{ "examedge.com", true },
@@ -13247,6 +13764,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "exaplac.com", true },
{ "exarpy.com", true },
{ "exatmiseis.net", false },
+ { "excaliburtitle.com", true },
{ "exceed.global", true },
{ "exceedagency.com", true },
{ "excel-utbildning.nu", true },
@@ -13255,9 +13773,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "excella.me", true },
{ "exceltechdubai.com", true },
{ "exceltechoman.com", true },
- { "exceltobarcode.com", true },
{ "excentos.com", true },
{ "exceptionalservers.com", true },
+ { "excess-baggage.com", true },
{ "excessamerica.com", true },
{ "excesssecurity.com", true },
{ "exchaser.com", true },
@@ -13282,6 +13800,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "exitooutdoor.com", true },
{ "exmart.ng", true },
{ "exmoe.com", true },
+ { "exnovin.co", true },
+ { "exocen.com", true },
{ "exon.io", true },
{ "exordiumconcepts.com", true },
{ "exoscale.ch", true },
@@ -13302,13 +13822,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "expert.cz", true },
{ "experteasy.com.au", true },
{ "expertofficefitouts.com.au", true },
- { "expertohomestaging.com", true },
{ "expertsverts.com", true },
{ "expertvagabond.com", true },
{ "expertviolinteacher.com", true },
+ { "expii.com", true },
{ "expiscor.solutions", true },
{ "explodie.org", true },
- { "exploflex.com.br", true },
+ { "explodingcamera.com", true },
{ "exploit-db.com", true },
{ "exploit.cz", true },
{ "exploit.party", true },
@@ -13316,14 +13836,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "exploited.cz", true },
{ "exploitit.com.au", true },
{ "exploodo.rocks", true },
- { "exploravacations.in", true },
+ { "explorebigideas.com", true },
{ "exploremonero.com", true },
{ "exploringenderby.com", true },
+ { "expmind.co.in", true },
{ "expo-america.ru", true },
{ "expo-asia.ru", true },
{ "expo-europe.ru", true },
{ "expo-larionov.org", true },
- { "exponentialnews.net", true },
{ "expoort.co.uk", true },
{ "expoort.com", true },
{ "expoort.es", true },
@@ -13331,8 +13851,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "expoort.it", true },
{ "expopodium.com", true },
{ "exporta.cz", true },
+ { "exposurecompensation.co.uk", true },
{ "express-shina.ru", true },
{ "express-vpn.com", true },
+ { "express1040.com", true },
{ "expressemotion.net", true },
{ "expresshosting.org", true },
{ "expressmarket.ru", true },
@@ -13344,7 +13866,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "exside.com", true },
{ "exsora.com", true },
{ "extasic.com", true },
- { "extendwings.com", true },
{ "extensia.it", true },
{ "extensibility.biz.tr", true },
{ "extensiblewebmanifesto.org", true },
@@ -13369,6 +13890,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "exteriorlightingwestlakevillage.com", true },
{ "extintormadrid.com", true },
{ "extradesktops.com", false },
+ { "extradiely.sk", true },
{ "extradivers-worldwide.com", true },
{ "extranetpuc.com.br", true },
{ "extrapagetab.com", true },
@@ -13381,12 +13903,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "exultcosmetics.co.uk", true },
{ "exxo.tk", true },
{ "exyplis.com", true },
+ { "eyasc.nl", true },
{ "eydesignguidelines.com", true },
{ "eye-encounters.com", true },
{ "eyeandfire.com", true },
{ "eyecandy.gr", true },
{ "eyeglasses.com", false },
+ { "eyejobs.com.au", true },
{ "eyelashconcept.com", true },
+ { "eyemagic.net", true },
{ "eyeonid.com", true },
{ "eyep.me", true },
{ "eyes-berg.ch", true },
@@ -13401,6 +13926,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ez3d.eu", true },
{ "ezakazivanje.rs", true },
{ "ezdog.press", true },
+ { "ezequiel-garzon.net", true },
{ "ezesec.com", true },
{ "ezgif.com", true },
{ "ezhik-din.ru", true },
@@ -13451,6 +13977,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fabienne-roux.org", true },
{ "fabiobier.com", true },
{ "fabjansisters.eu", true },
+ { "fabled.com", true },
{ "fableforge.nl", true },
{ "fabmart.com", true },
{ "fabrica360.com", true },
@@ -13459,10 +13986,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fabriziorocca.it", true },
{ "fabrysociety.org", true },
{ "fabse.net", true },
+ { "facai666.cc", true },
+ { "facai888.cc", true },
{ "facanabota.com", true },
{ "facanabota.com.br", true },
+ { "facarospauls.com", true },
{ "faccess.it", true },
{ "facciadastile.it", true },
+ { "face-fashion.de", true },
{ "face-mania.com", true },
{ "facealacrise.fr", true },
{ "facebook-atom.appspot.com", true },
@@ -13474,6 +14005,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "facerepo.com", true },
{ "faceresources.org", true },
{ "fach-journalist.de", true },
+ { "fachmann-umzuege.de", true },
{ "fachschaftslisten.at", true },
{ "fachschaftslisten.org", true },
{ "facialexercising.com", true },
@@ -13482,6 +14014,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "facilities.fr", true },
{ "facilitiessurvey.org", true },
{ "facility-service-muenchen.de", true },
+ { "facingbipolar.com", true },
{ "fackovcova.cz", true },
{ "fackovcova.eu", true },
{ "fackovcova.sk", true },
@@ -13537,6 +14070,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "faithwatch.org", true },
{ "faixaazul.com", true },
{ "fakeapple.nl", true },
+ { "fakeduckpond.com", true },
+ { "fakeemergency.com", true },
{ "fakerli.com", true },
{ "fakti.bg", true },
{ "faktotum.tech", true },
@@ -13550,7 +14085,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "falcona.io", true },
{ "falconfrag.com", true },
{ "falconvintners.com", true },
- { "falcoz.co", false },
+ { "falcoz.co", true },
{ "faldoria.de", true },
{ "falegname-roma.it", true },
{ "falkhusemann.de", true },
@@ -13582,6 +14117,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "familie-remke.de", true },
{ "familieholme.de", true },
{ "familiekiekjes.nl", true },
+ { "familienportal.de", true },
+ { "familiereimann.com", true },
{ "familjenfrodlund.se", true },
{ "familjenm.se", true },
{ "familylawhotline.org", true },
@@ -13589,6 +14126,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "familyreal.ru", true },
{ "familytreehq.com", true },
{ "familyworld.gr", true },
+ { "famion.eu", true },
{ "famososnaweb.com", true },
{ "famousbirthdays.com", true },
{ "famoushostels.com", true },
@@ -13602,7 +14140,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fancy-bridge.com", true },
{ "fancy.org.uk", true },
{ "fancygaming.dk", true },
- { "fander.it", true },
{ "fandler.cz", true },
{ "fandomservices.com", true },
{ "fanfareunion.ch", true },
@@ -13619,14 +14156,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fantasticservicesgroup.com.au", true },
{ "fantasy-judo.com", true },
{ "fantasycastles.co.uk", true },
- { "fantasycdn.com", true },
- { "fantasydrop.com", true },
{ "fantasyescortsbirmingham.co.uk", true },
{ "fantasymina.de", true },
{ "fantasypartyhire.com.au", true },
{ "fantasyspectrum.com", true },
+ { "fantasysportsnews.org", true },
{ "fantopia.club", true },
- { "fanvoice.com", true },
+ { "fantraxhq.com", true },
{ "fanyina.cn", true },
{ "fanyina.com", true },
{ "fanyue123.tk", true },
@@ -13637,6 +14173,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fara.gov", true },
{ "faradji.nu", true },
{ "faradome.ws", true },
+ { "faradrive.ir", true },
{ "faraslot8.com", true },
{ "farcecrew.de", true },
{ "farces.com", false },
@@ -13646,7 +14183,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "farhadexchange.com", true },
{ "farhood.org", true },
{ "farid.is", true },
+ { "farizizhan.com", true },
+ { "farleybrass.com.au", true },
+ { "farleymetals.com.au", true },
{ "farmacia-discreto.com", true },
+ { "farmaciacorvi.it", true },
{ "farmaciadejaime.es", true },
{ "farmacialaboratorio.it", true },
{ "farmer.dating", true },
@@ -13658,13 +14199,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "farrel-f.cf", true },
{ "farrel-f.tk", true },
{ "farrelf.blog", true },
+ { "farsil.eu", true },
{ "fart.wtf", true },
{ "farthing.xyz", true },
{ "farwat.ru", true },
{ "faschingmd.com", true },
+ { "fascia.fit", true },
{ "fashion-stoff.de", true },
{ "fashion24.de", true },
- { "fashion4ever.pl", true },
{ "fashionhijabers.com", true },
{ "fashionunited.be", true },
{ "fashionunited.cl", true },
@@ -13698,12 +14240,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fastest-hosting.co.uk", true },
{ "fastforwardsociety.nl", true },
{ "fastforwardthemes.com", true },
+ { "fastinviter.com", true },
{ "fastlike.co", true },
{ "fastmail.com", false },
{ "fastonline.ro", true },
{ "fastpresence.com", true },
{ "fastrevision.com", true },
{ "fastvistorias.com.br", true },
+ { "fastworx.com", true },
{ "faszienrollen-info.de", false },
{ "fatalerrorcoded.eu", true },
{ "fateandirony.com", true },
@@ -13723,8 +14267,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fauvettes.be", true },
{ "favirei.com", true },
{ "fawong.com", true },
- { "faxite.com", true },
{ "faxvorlagen-druckvorlagen.de", true },
+ { "fb-feed.net", true },
{ "fb.me", true },
{ "fbcdn.net", true },
{ "fbcopy.com", true },
@@ -13733,9 +14277,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fbiic.gov", true },
{ "fbijobs.gov", true },
{ "fbo.gov", true },
+ { "fbrief.org", true },
{ "fbsbx.com", true },
{ "fbtholdings.com", true },
{ "fburl.com", true },
+ { "fbwgynplus.com", true },
+ { "fbwgynplus.com.au", true },
{ "fc.media", true },
{ "fca-tools.com", true },
{ "fcburk.de", true },
@@ -13777,6 +14324,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "federalreserveconsumerhelp.gov", true },
{ "federatedbank.com", true },
{ "federicomigliavacca.it", true },
+ { "federicoparty.it", true },
{ "fedjobs.gov", true },
{ "fedorahosted.org", true },
{ "fedoramagazine.org", true },
@@ -13789,6 +14337,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fedux.com.ar", true },
{ "fedvan.com", true },
{ "feedbin.com", false },
+ { "feedermarket.net", true },
{ "feedfall.com", true },
{ "feedhq.org", true },
{ "feedkovacs.hu", true },
@@ -13812,7 +14361,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fegame.nl", true },
{ "fegli.gov", true },
{ "fehngarten.de", true },
- { "fehnladen.de", true },
{ "feigling.net", false },
{ "feildel.fr", true },
{ "feilen.de", true },
@@ -13820,7 +14368,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "feisim.com", true },
{ "feisim.org", true },
{ "feistyduck.com", true },
- { "feizhujianzhi.com", true },
+ { "feixiang.eu.org", true },
+ { "fejes.house", true },
{ "feld.design", true },
{ "feld.saarland", true },
{ "feldhousen.com", true },
@@ -13830,11 +14379,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "felicifia.org", true },
{ "felinepc.com", true },
{ "felistirnavia.sk", true },
+ { "felix-hirner.de", true },
{ "felixaufreisen.de", true },
{ "felixbarta.de", true },
{ "felixcrux.com", true },
{ "felixgenicio.com", true },
{ "felixkauer.de", true },
+ { "felixqu.com", true },
{ "felixsanz.com", true },
{ "felixseele.de", true },
{ "felsing.net", true },
@@ -13843,13 +14394,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "femastudios.com", true },
{ "femiluna.com", true },
{ "feminina.pt", true },
- { "feminism.lgbt", true },
- { "femradio.es", true },
{ "femtomind.com", true },
{ "fence-stlouis.com", true },
{ "feng-hhcm.com", true },
{ "feng.si", true },
{ "fengyi.tel", true },
+ { "fenichelar.com", true },
{ "fenster-bank.at", true },
{ "fenster-bank.de", true },
{ "feragon.net", true },
@@ -13871,6 +14421,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fernandobarata.pt", true },
{ "fernandobarillas.com", true },
{ "fernandomiguel.net", true },
+ { "feross.net", true },
{ "feross.org", true },
{ "ferrariadvisor.it", true },
{ "ferret.zone", true },
@@ -13882,9 +14433,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ferticare.pt", true },
{ "fertila.de", true },
{ "festaprylar.se", true },
+ { "festicle.com", true },
{ "festival-tipps.com", true },
{ "festivaljapon.com", true },
- { "festx.co.za", true },
+ { "fetch.co.uk", true },
+ { "fetchease.com", true },
{ "fettlaus.de", true },
{ "feudalisten.de", true },
{ "feuerhuhn.de", true },
@@ -13895,10 +14448,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "feuerwehr-heiligenberg.de", true },
{ "feuerwehr-illmensee.de", true },
{ "feuerwehr-mehring.de", true },
- { "feuerwehr-oberkotzau.de", true },
{ "feuerwehr-offenbach-bieber.de", false },
{ "feuerwehr-vechta.de", true },
- { "feuerwehrbadwurzach.de", true },
{ "feuerwerksmanufaktur.de", true },
{ "feuetgloire.com", true },
{ "fewo-hafeninsel-stralsund.de", true },
@@ -13933,7 +14484,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fhmkh.cn", true },
{ "fi.google.com", true },
{ "fi.search.yahoo.com", false },
- { "fialat.cz", true },
{ "fiam.me", true },
{ "fiareapp.red", false },
{ "fiasgo.com", true },
@@ -13942,6 +14492,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fibabanka.com.tr", true },
{ "fibo-forex.org", true },
{ "fibra.click", true },
+ { "fibrasynormasdecolombia.com", false },
{ "fibretv.co.nz", true },
{ "fibretv.tv", true },
{ "fibromuebles.com", true },
@@ -13960,7 +14511,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fierlafijn.net", true },
{ "fierscleaning.nl", true },
{ "fiery.me", true },
- { "fiestagenial.com", true },
{ "fifautstore.com", true },
{ "fifei.de", true },
{ "fifichachnil.paris", true },
@@ -13985,9 +14535,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fil-tec-rixen.com", true },
{ "fil.fi", true },
{ "filanthropystar.org", true },
+ { "filaretihairlove.gr", true },
{ "file-cloud.eu", true },
{ "file-pdf.it", true },
{ "filecopa.com", true },
+ { "filehash.de", true },
{ "files.from-me.org", true },
{ "fileservicios.com.ar", true },
{ "filestar.io", true },
@@ -13997,17 +14549,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "filezilla.cn", true },
{ "filhin.es", true },
{ "filhodohomem.com", true },
- { "fili.org", true },
+ { "fili.com", true },
{ "filidorwiese.nl", true },
{ "filiio.com", true },
{ "filingsmadeeasy.com", true },
- { "filiosoft.cloud", true },
{ "filip-prochazka.com", false },
{ "filippo.io", true },
{ "filipsebesta.com", true },
{ "filleritemsindia.com", true },
{ "fillo.sk", true },
{ "film-colleges.com", true },
+ { "film-op-tv.nl", true },
{ "film-storyboards.fr", true },
{ "film-tutorial.com", true },
{ "filme-onlines.com", true },
@@ -14026,7 +14578,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fimsquad.com", true },
{ "finagosolo.com", true },
{ "final-expense-quotes.com", true },
- { "finalprice.net", true },
{ "finalrewind.org", true },
{ "finalx.nl", true },
{ "finance-colleges.com", true },
@@ -14042,8 +14593,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "find-mba.com", true },
{ "findapinball.com", true },
{ "findcarspecs.com", true },
+ { "findelahistoria.com", true },
{ "findhoustonseniorcare.com", true },
{ "findingkorea.com", true },
+ { "findingtheuniverse.com", true },
{ "finditez.com", true },
{ "findmynudes.com", true },
{ "findoon.de", true },
@@ -14057,6 +14610,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "finecocoin.io", false },
{ "finecraft.cc", true },
{ "finefriends.nl", true },
+ { "finefriends.social", true },
+ { "finefriendsapp.com", true },
{ "finelovedolls.com", true },
{ "finenet.com.tw", true },
{ "finesoon.net", true },
@@ -14068,13 +14623,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "finisron.in", true },
{ "finkelstein.fr", true },
{ "finkmartin.com", true },
+ { "finlandcook.online", true },
+ { "finlandcook.top", true },
{ "finn.io", true },
{ "finnclass.cz", true },
{ "finnwea.com", true },
{ "finpt.com", false },
{ "finsprings.org", true },
{ "fintandunleavy.com", false },
- { "fintechnics.com", false },
{ "fintry.ca", true },
{ "finvantage.com", true },
{ "finwe.info", true },
@@ -14095,11 +14651,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "firecore.com", true },
{ "firecry.org", true },
{ "firefart.at", true },
+ { "firefense.com", true },
{ "firefighters.dating", true },
{ "firefly-iii.org", true },
{ "firegoby.jp", true },
{ "firegore.com", true },
- { "firekoi.com", true },
{ "fireleadership.gov", true },
{ "firemudfm.com", true },
{ "firenza.org", true },
@@ -14120,7 +14676,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "firmapi.com", true },
{ "firmen-assekuranz.de", true },
{ "firmenwerbung-vermarktung.de", true },
- { "firmware.science", true },
{ "first-house.no", true },
{ "first.org", true },
{ "first4it.com", true },
@@ -14149,6 +14704,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fishermansbendtownhouses.com.au", true },
{ "fishexport.eu", true },
{ "fishgen.no", true },
+ { "fishlanestudios.com", true },
+ { "fishoilsafety.com", true },
{ "fishserver.net", true },
{ "fishtacos.blog", true },
{ "fisinfomanagerdr.com", true },
@@ -14158,7 +14715,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fit-4u.ch", true },
{ "fit-mit-nina.com", true },
{ "fit-mit-system.eu", true },
- { "fit365.jp", true },
+ { "fit365.jp", false },
{ "fitchannel.com", true },
{ "fitinclass.com", true },
{ "fitkram.cz", true },
@@ -14172,13 +14729,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fiuxy.co", true },
{ "fiuxy.me", true },
{ "fivethirtyeight.com", true },
+ { "fiveyearsahead.com", true },
{ "fixatom.com", true },
{ "fixed.supply", true },
{ "fixel.express", true },
{ "fixforce.nl", true },
{ "fixhotsauce.com", true },
{ "fixingscrews.co.uk", true },
- { "fixitfelix.us", true },
{ "fixlasvegas.com", true },
{ "fixmyalarmpanel.co.uk", true },
{ "fixmycomputerdude.com", true },
@@ -14195,6 +14752,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fjzone.org", true },
{ "fkcdn.de", true },
{ "fkfev.de", true },
+ { "fkosquad.moe", true },
{ "fktpm.ru", true },
{ "flaemig42.de", false },
{ "flagburningworld.com", true },
@@ -14212,6 +14770,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "flangaapis.com", true },
{ "flapoverspeed.com", true },
{ "flare.cloud", true },
+ { "flasaki.gr", true },
{ "flashback.org", true },
{ "flashbeing.com", true },
{ "flashcomp.cz", true },
@@ -14245,12 +14804,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fleisch.club", true },
{ "flers-agglo.fr", true },
{ "flerstourisme.fr", true },
+ { "fletcherdigital.com", true },
{ "fletchto99.com", true },
{ "fletemaritimo.online", true },
{ "flets-ms.com", true },
{ "fleurenplume.fr", true },
{ "fleuryfleury.com", true },
{ "flexapplications.se", true },
+ { "flexbuildingsystems.com", true },
{ "flexfunding.com", true },
{ "fleximaal.com", true },
{ "fleximal.com", true },
@@ -14259,6 +14820,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "flexstart.me", true },
{ "flextrack.dk", true },
{ "fliacuello.com.ar", true },
+ { "flibusta.appspot.com", true },
{ "flickcritter.com", true },
{ "flieger-funk-runde.de", true },
{ "fliesen-waldschmidt.de", true },
@@ -14333,21 +14895,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "flowair24.ru", true },
{ "flowcom.de", true },
{ "flowersbylegacy.com", true },
+ { "flowersquito.com", true },
{ "flowinvoice.com", true },
{ "flowreader.com", true },
{ "flra.gov", true },
+ { "flucky.xyz", true },
{ "fluffycloud.de", true },
{ "fluggesellschaft.de", true },
{ "fluhrers.de", true },
{ "fluidmeterusa.com", true },
{ "fluids.ac.uk", true },
{ "flumble.nl", true },
- { "flunschi.goip.de", true },
+ { "flunschi.goip.de", false },
{ "fluoxetine.net", true },
{ "flurp.de", false },
{ "flushlife.com", true },
{ "fluteandpianoteaching.co.uk", true },
- { "flux.by", true },
{ "flux.healthcare", true },
{ "fluxent.de", false },
{ "fluxfingers.net", true },
@@ -14357,7 +14920,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "flw365365.com", true },
{ "fly-en-drive.nl", true },
{ "fly.moe", true },
- { "flyawayantennas.com", true },
{ "flyboyfpv.com", true },
{ "flydrivesicilie.nl", true },
{ "flyer.tools", true },
@@ -14370,7 +14932,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "flyp.me", true },
{ "flypenge.dk", true },
{ "flyserver.co.il", true },
- { "flyshe.co.uk", true },
{ "flyswoop.com", true },
{ "flyt.online", true },
{ "flytoadventures.com", true },
@@ -14383,7 +14944,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fmodoux.biz", true },
{ "fmussatmd.com", true },
{ "fnanen.net", true },
- { "fnb-griffinonline.com", true },
{ "fnbnokomis.com", true },
{ "fnh-expert.net", true },
{ "fnkr.net", true },
@@ -14421,18 +14981,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "followerrocket.com", true },
{ "followersya.com", true },
{ "followings-live.com", true },
+ { "followmystaff.com", true },
{ "followthatpage.com", true },
{ "followthedog.co.uk", true },
{ "foluomeng.net", true },
{ "folv.es", true },
{ "folwark.krakow.pl", true },
- { "folwarkwiazy.pl", true },
{ "fomopop.com", true },
{ "fondationwiggli.ch", true },
{ "fondsdiscountbroker.de", true },
{ "fondy.eu", true },
{ "fondy.ua", true },
{ "fonga.ch", true },
+ { "fono.jp", true },
{ "fonolo.com", true },
{ "fonseguin.ca", true },
{ "font-converter.net", true },
@@ -14440,6 +15001,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fontein.de", true },
{ "fontlibrary.org", true },
{ "fonts4free.net", true },
+ { "fonzone.it", true },
{ "foo.fo", true },
{ "foo.hamburg", true },
{ "foodattitude.ch", true },
@@ -14462,6 +15024,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "footloose.co.uk", true },
{ "for.care", true },
{ "foray-jero.me", true },
+ { "forbidden-mods.de", true },
{ "forbusiness.ca", true },
{ "forcelink.eu", true },
{ "forcelinkamerica.com", true },
@@ -14469,7 +15032,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "forces.army", true },
{ "forcewave.com", true },
{ "ford-shop.by", true },
+ { "ford.com.au", true },
+ { "ford.com.br", true },
+ { "ford.com.cn", true },
+ { "ford.mx", true },
{ "fordlibrarymuseum.gov", true },
+ { "fordsync.com", true },
{ "foreachcode.com", true },
{ "forecastcity.com", true },
{ "foreclosureattorneyhouston.com", true },
@@ -14481,6 +15049,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "foresdon.jp", true },
{ "foresthillhomes.ca", true },
{ "forestraven.net", true },
+ { "foreverclean.com", true },
{ "foreverssl.com", true },
{ "foreversummertime.com", true },
{ "forewordreviews.com", true },
@@ -14488,7 +15057,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "forexchef.de", true },
{ "forexee.com", true },
{ "forextickler.com", true },
- { "forextimes.ru", false },
+ { "forextimes.ru", true },
{ "forfunssake.co.uk", true },
{ "forge-goerger.eu", true },
{ "forgotten-legends.org", true },
@@ -14501,6 +15070,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "formation-mac.ch", true },
{ "formationseeker.com", true },
{ "formbetter.com", true },
+ { "formersessalaries.com", true },
+ { "formforger.com", true },
{ "formini.dz", true },
{ "formsbyair.com", true },
{ "formula-ot.ru", true },
@@ -14508,7 +15079,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "formulastudent.de", true },
{ "fornoreason.net.au", true },
{ "fornwall.net", true },
- { "foro.io", false },
{ "forodeespanol.com", true },
{ "forodieta.com", true },
{ "forokd.com", true },
@@ -14518,16 +15088,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "forro.berlin", true },
{ "forro.info", true },
{ "forsakringsarkivet.se", true },
- { "forschbach-janssen.de", true },
{ "forsec.nl", true },
+ { "forself.me", true },
{ "forstbetrieb-hennecke.de", true },
{ "forstprodukte.de", true },
- { "fort.eu", true },
{ "forteggz.nl", true },
{ "fortesanshop.it", true },
{ "fortknox.cz", true },
{ "fortnine.ca", true },
- { "fortnitemagic.ga", true },
{ "fortran.io", true },
{ "fortress.no", true },
{ "fortress.sk", true },
@@ -14540,7 +15108,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "forum-kinozal-tv.appspot.com", true },
{ "forum-kinozal.appspot.com", true },
{ "forum.quantifiedself.com", false },
- { "forum3.ru", true },
{ "forumvoordemocratie.nl", true },
{ "forvisualdesign.com", true },
{ "forward-fly-fishing.ch", true },
@@ -14549,9 +15116,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fosaudit.com", true },
{ "foscamcanada.com", true },
{ "fosdem.org", true },
- { "foshanshequ.com", false },
{ "fossforward.com", true },
{ "fossilfreeyale.org", true },
+ { "fosterpark.ca", true },
{ "fotella.com", true },
{ "fotikpro.ru", true },
{ "foto-janvanaefst.nl", true },
@@ -14587,20 +15154,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fourashesgolfcentre.co.uk", true },
{ "fourashesgolfcentre.com", true },
{ "fourashesgolfcentre.uk", true },
- { "fourdesignstudio.com", true },
+ { "fourdesignstudio.com", false },
+ { "fournarisopenday.com", true },
{ "foutrelis.com", true },
{ "fowlervwparts.com", true },
{ "fowlsmurf.net", true },
{ "fox.my", false },
{ "foxbnc.co.uk", true },
- { "foxdev.co", true },
+ { "foxdev.co", false },
{ "foxesare.sexy", true },
{ "foxing.club", true },
{ "foxo.blue", true },
{ "foxontheinter.net", true },
{ "foxphotography.ch", true },
{ "foxquill.com", true },
- { "foxstreetcomms.co.za", true },
+ { "foxstreetcomms.co.za", false },
+ { "fozzie.space", true },
{ "fpaci.org", true },
{ "fpasca.com", true },
{ "fpc.gov", false },
@@ -14611,10 +15180,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fptravelling.com", false },
{ "fpvr.org", true },
{ "fpy.cz", true },
- { "fq.mk", true },
{ "fr.search.yahoo.com", false },
- { "fr33tux.org", true },
- { "frack.nl", true },
+ { "frack.nl", false },
{ "fracreazioni.it", true },
{ "fraesentest.de", true },
{ "fragmentspuren.de", true },
@@ -14628,10 +15195,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fran.cr", true },
{ "francescopalazzo.com", true },
{ "francescopandolfibalbi.it", true },
- { "francescoservida.ch", true },
{ "francetraceur.fr", true },
{ "franchini.email", true },
{ "franchini.engineer", true },
+ { "francinebelanger.network", true },
{ "francis.tokyo", true },
{ "francisli.net", false },
{ "franckgirard.net", true },
@@ -14640,7 +15207,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "francois-occasions.be", true },
{ "francoisbelangerboisclair.com", true },
{ "francoiscarrier.com", true },
- { "francoise-paviot.com", true },
{ "francoisharvey.ca", true },
{ "francoislepage.com", true },
{ "francoz.me", true },
@@ -14651,7 +15217,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "franken-lehrmittel.de", true },
{ "frankenhost.de", true },
{ "frankenlehrmittel.de", true },
- { "frankhaala.com", true },
{ "frankierfachmann.de", true },
{ "frankierprofi.de", true },
{ "frankierstar.de", true },
@@ -14670,7 +15235,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "franz.beer", true },
{ "franziska-pascal.de", true },
{ "franzknoll.de", true },
+ { "franzt.de", false },
{ "frappant.cc", true },
+ { "frasch-umzuege.de", true },
{ "fraselab.ru", true },
{ "frasesconemocion.com", true },
{ "frasesdodia.com", true },
@@ -14679,6 +15246,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "frasys.net", true },
{ "frattaroli.org", true },
{ "frau-inge.de", true },
+ { "frau-pusteblu.me", true },
{ "frau-sucht-bauer.de", true },
{ "fraudmarc.com", true },
{ "frauenarzt-niendorf.de", true },
@@ -14687,6 +15255,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fraurichter.net", true },
{ "fraye.net", true },
{ "frbracch.it", true },
+ { "frc.gov", true },
{ "frccsgo.tk", true },
{ "frdl.ch", true },
{ "freaksites.dk", true },
@@ -14697,17 +15266,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "freakyawesome.business", true },
{ "freakyawesome.ca", true },
{ "freakyawesome.co.uk", true },
+ { "freakyawesome.fm", true },
{ "freakyawesome.in", true },
+ { "freakyawesome.io", true },
+ { "freakyawesome.lgbt", true },
{ "freakyawesome.net", true },
{ "freakyawesome.org", true },
+ { "frebib.co.uk", true },
+ { "frebib.com", true },
+ { "frebib.net", true },
{ "freddieonfire.tk", false },
{ "freddyfazbearspizzeria.com", true },
{ "freddysfuncastles.co.uk", true },
+ { "fredericcote.com", true },
{ "frederik-braun.com", false },
{ "frederikvig.com", true },
{ "fredloya.com", true },
{ "fredriksslaktforskning.se", true },
- { "fredtec.ru", true },
{ "fredvoyage.fr", true },
{ "free-ss.site", true },
{ "free.ac.cn", true },
@@ -14722,8 +15297,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "freebus.org", true },
{ "freecam2cam.site", true },
{ "freecloud.at", true },
- { "freecycleusa.com", true },
+ { "freecookies.nl", true },
{ "freedev.cz", true },
+ { "freedgb.com", true },
{ "freedom.nl", true },
{ "freedom.press", true },
{ "freedom35.org", true },
@@ -14750,6 +15326,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "freelanceessaywriters.com", true },
{ "freelancehunt.com", true },
{ "freelancejobs.org.uk", true },
+ { "freelanceunited.co.uk", true },
{ "freelauri.com", true },
{ "freelifer.jp", true },
{ "freelo.cz", true },
@@ -14758,7 +15335,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "freemania.nl", true },
{ "freemanlogistics.com", true },
{ "freemans.com", true },
- { "freemomhugs.org", true },
+ { "freeministryresources.org", true },
{ "freemyipod.org", true },
{ "freend.me", false },
{ "freenetproject.org", true },
@@ -14766,6 +15343,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "freepnglogos.com", true },
{ "freepublicprofile.com", true },
{ "freergform.org", true },
+ { "freertomorrow.com", true },
{ "freeshell.de", true },
{ "freeshkre.li", true },
{ "freesitemapgenerator.com", true },
@@ -14778,6 +15356,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "freesquare.net", true },
{ "freessl.tech", true },
{ "freesslcertificate.me", true },
+ { "freetaxusa.com", true },
{ "freethetv.ie", true },
{ "freetsa.org", true },
{ "freeweibo.com", true },
@@ -14797,11 +15376,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "freifunk-remscheid.de", true },
{ "freimeldungen.de", true },
{ "freims.cc", true },
+ { "freitasul.com.br", true },
+ { "freitasul.io", true },
{ "freiwurst.net", true },
{ "freizeitbad-riff.de", true },
{ "freizeitplaza.de", true },
{ "frejasdal.dk", true },
{ "frenchcreekcog.org", true },
+ { "frenchguy.ch", true },
{ "frenchmusic.fr", true },
{ "frequencebanane.ch", true },
{ "frequentflyerapp.com", true },
@@ -14813,6 +15395,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "freshempire.gov", true },
{ "freshislandfish.com", true },
{ "freshlymind.com", true },
+ { "freshmaza.com", true },
{ "freshmaza.net", true },
{ "freshpounds.com", true },
{ "fretscha.com", true },
@@ -14822,7 +15405,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "freundinnen-kurzurlaub.de", true },
{ "freundinnen-urlaub.de", true },
{ "friarsonbase.com", true },
- { "fribourgviking.net", true },
{ "frickelboxx.de", true },
{ "frickelmeister.de", true },
{ "fridayfoucoud.ma", true },
@@ -14832,6 +15414,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "friederloch.de", true },
{ "friedrich-foto-art.de", true },
{ "friedsamphotography.com", true },
+ { "friedzombie.com", true },
{ "friendlysiberia.com", true },
{ "friendowment.us", true },
{ "friends-of-naz.com", true },
@@ -14850,6 +15433,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fringeintravel.com", true },
{ "frinkiac.com", true },
{ "frino.de", true },
+ { "friplay.host", true },
{ "frippz.se", true },
{ "friss.com", true },
{ "fritzrepair.com", true },
@@ -14868,8 +15452,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fromscratch.rocks", true },
{ "fronteers.nl", false },
{ "frontier-ad.co.jp", true },
- { "frontier.bet", true },
{ "frontiers.nl", true },
+ { "frontline.cloud", true },
{ "frontlinemessenger.com", true },
{ "fropky.com", true },
{ "frostprotection.co.uk", true },
@@ -14883,6 +15467,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "frozenjam.com", true },
{ "frpg.gov", true },
{ "frprn.es", true },
+ { "frsnpwr.net", true },
{ "frtn.com", true },
{ "frtr.gov", true },
{ "frtrains.com", true },
@@ -14894,10 +15479,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "frugro.be", true },
{ "fruition.co.jp", true },
{ "fruitscale.com", true },
+ { "fruityfitness.com", true },
+ { "fruityten.co.uk", true },
{ "frusky.de", true },
{ "fruttini.de", true },
{ "frydrychit.cz", true },
- { "fs-community.nl", true },
{ "fs-g.org", true },
{ "fs-maistadt.de", true },
{ "fs257.com", true },
@@ -14906,13 +15492,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fsbnh.bank", true },
{ "fsbpaintrock.com", true },
{ "fsbturton.com", true },
- { "fsck.cz", true },
{ "fsck.jp", true },
{ "fsckd.com", true },
{ "fscott.de", true },
{ "fsdress.com", true },
{ "fsfxpackages.com", true },
{ "fsg.one", true },
+ { "fsgeek.ca", true },
{ "fsk.fo", true },
{ "fsky.info", true },
{ "fsm2016.org", true },
@@ -14924,12 +15510,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ftc.gov", false },
{ "ftccomplaintassistant.gov", true },
{ "ftcefile.gov", true },
+ { "ftdev.in", true },
{ "ftf.agency", true },
{ "fthat.link", true },
{ "ftng.se", true },
{ "ftptest.net", true },
{ "ftrsecure.com", true },
- { "ftv.re", true },
{ "fu898.top", true },
{ "fuantaishenhaimuli.net", true },
{ "fuck-your-false-positive.de", true },
@@ -14967,6 +15553,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fullhost.com", true },
{ "fullhub.ru", true },
{ "fullmatch.net", true },
+ { "fullnitrous.com", true },
{ "fullstack.love", true },
{ "fullstacknotes.com", true },
{ "fumblers.ca", true },
@@ -14991,6 +15578,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fundays.nl", true },
{ "fundchan.com", true },
{ "fundeego.com", true },
+ { "fundingempire.com", true },
{ "fundort.ch", true },
{ "funds.ddns.net", true },
{ "funfactorleeds.co.uk", true },
@@ -15001,7 +15589,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "funhouse-inflatables.co.uk", true },
{ "funinbeds.org.uk", true },
{ "funken-networks.de", true },
- { "funkner.ru", true },
{ "funktionel.co", true },
{ "funktionsverket.se", true },
{ "funkygamer1.de", true },
@@ -15018,9 +15605,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "funtimesbouncycastles.co.uk", true },
{ "fur.red", true },
{ "furcdn.net", true },
- { "furgetmeknot.org", true },
{ "furgo.love", true },
{ "furigana.info", true },
+ { "furikake.xyz", true },
{ "furkancaliskan.com", true },
{ "furkot.com", true },
{ "furkot.de", true },
@@ -15032,11 +15619,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "furlog.it", true },
{ "furnfurs.com", true },
{ "furnishedproperty.com.au", true },
+ { "furries-united.de", true },
+ { "furry.bot", true },
{ "furry.cat", true },
{ "furry.dk", true },
- { "furrybot.me", true },
{ "furrytech.network", true },
- { "furrytf.club", false },
+ { "furrytf.club", true },
{ "furryyiff.site", true },
{ "fursuitbutts.com", true },
{ "fusa-miyamoto.jp", true },
@@ -15046,7 +15634,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fusiongaming.de", true },
{ "fussball-xxl.de", true },
{ "fussell.io", true },
- { "fuszara.eu", true },
+ { "fuszara.pl", true },
{ "futa.moe", true },
{ "futaba-works.com", true },
{ "futagro.com", true },
@@ -15057,13 +15645,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "futureaudiographics.com", true },
{ "futurefund.com", true },
{ "futuregrowthva.com", true },
- { "futurehack.io", true },
{ "futurenda.com", true },
{ "futureoceans.org", true },
{ "futuressm.com", true },
{ "futuretimes.io", true },
{ "futurezone.at", true },
{ "futurope.com", true },
+ { "fuvelis.fr", true },
{ "fuwafuwa.moe", true },
{ "fuyu.moe", true },
{ "fuzzing-project.org", true },
@@ -15094,6 +15682,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fxwebsites.com.au", true },
{ "fxwebsites.net.au", true },
{ "fxwebstudio.net.au", true },
+ { "fydjbsd.cn", true },
{ "fyfywka.com", true },
{ "fyksen.me", true },
{ "fyn.nl", true },
@@ -15110,7 +15699,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "fysuite.com", true },
{ "fytcart.com", true },
{ "fzbrweb.cz", true },
- { "fzhyzamt.com", true },
{ "fzx750.ru", true },
{ "g-ds.de", true },
{ "g-m-w.eu", true },
@@ -15125,6 +15713,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "g2pla.net", true },
{ "g2ship.com", true },
{ "g2soft.net", true },
+ { "g3circuit.com", true },
{ "g3d.ro", true },
{ "g3dev.ch", true },
{ "g3rv4.com", true },
@@ -15135,16 +15724,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gabe565.com", true },
{ "gabeb1920.com", true },
{ "gabecook.com", true },
- { "gabemack.com", true },
{ "gabinetpsychoterapii.krakow.pl", true },
{ "gabiocs.com", true },
{ "gabriel.to", true },
{ "gabriele.tips", true },
+ { "gabrielkoo.com", true },
{ "gabrielsteens.nl", true },
{ "gachimuchi.ru", true },
{ "gachiyase.com", true },
{ "gachter.name", true },
{ "gadabit.pl", true },
+ { "gadget-tips.com", true },
+ { "gadgetadvisor.com", true },
{ "gadgethacks.com", true },
{ "gadse.games", true },
{ "gae123.com", true },
@@ -15161,21 +15752,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gagniard.org", true },
{ "gagor.pl", true },
{ "gagygnole.ch", true },
- { "gaiavanderzeyp.com", true },
- { "gaichon.com", true },
+ { "gailbartist.com", true },
{ "gailfellowsphotography.com", true },
{ "gaines-sodiamex.fr", true },
{ "gaio-automobiles.fr", true },
{ "gaireg.de", true },
+ { "gaiserik.com", false },
{ "gaitandmobility.com", true },
{ "gaitrehabilitation.com", true },
{ "gaitresearch.com", true },
+ { "gakdigital.com", true },
+ { "gakkainavi-epsilon.jp", true },
{ "gakkainavi-epsilon.net", true },
- { "gakkainavi.jp", true },
- { "gakkainavi.net", true },
- { "gakkainavi4.jp", true },
- { "gakkainavi4.net", true },
+ { "gakki.photos", true },
{ "gaku-architect.com", true },
+ { "gala.kiev.ua", false },
{ "galabau-maurmann.de", true },
{ "galacg.me", true },
{ "galactic-crew.org", true },
@@ -15183,23 +15774,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "galanight.cz", true },
{ "galaxy.edu.pe", true },
{ "galaxymimi.com", true },
- { "galecia.com", true },
{ "galeria42.com", true },
{ "galerialottus.com.br", true },
{ "galeriarr.pl", true },
{ "galeries.photo", true },
- { "galilahiskye.com", true },
{ "galileanhome.org", true },
{ "galilel.cloud", true },
{ "galinas-blog.de", true },
{ "galinos.gr", true },
{ "galle.cz", true },
+ { "gallerify.eu", true },
{ "galletasgabi.com.mx", false },
{ "galleyfoods.com", true },
{ "gallicrooster.com", true },
{ "gallifreyapp.co.uk", true },
{ "gallifreypermaculture.com.au", true },
+ { "gallmeyer-consulting.com", true },
{ "gallun-shop.com", true },
+ { "galoserver.org", true },
{ "galpaoap.com.br", true },
{ "gamberorosso.menu", true },
{ "gambetti.fr", true },
@@ -15209,9 +15801,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gambitnash.com", true },
{ "gambitprint.com", true },
{ "gamblerhealing.com", true },
- { "gamblersgaming.eu", true },
+ { "game-club.me", true },
{ "game-files.net", false },
- { "game-topic.ru", true },
{ "game4less.com", true },
{ "game7.de", true },
{ "game88city.net", true },
@@ -15226,6 +15817,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gamedevelopers.pl", true },
{ "gamegix.com", true },
{ "gameguardian.net", true },
+ { "gameharbor.duckdns.org", true },
{ "gameindustry.de", true },
{ "gameisbest.jp", true },
{ "gamekaitori.jp", true },
@@ -15240,28 +15832,29 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gamercredo.com", true },
{ "gamereader.de", true },
{ "gamerezo.com", true },
+ { "gamerwares.com", true },
{ "gamerzdot.com", true },
{ "games4theworld.org", true },
{ "gamesaviour.com", true },
{ "gamesdepartment.co.uk", true },
{ "gameserver-sponsor.me", true },
+ { "gameshogun.xyz", true },
{ "gameshowchallenge.ie", true },
{ "gamesided.com", true },
{ "gamesplanet.com", true },
{ "gamesputnik.ru", true },
{ "gamestats.gg", true },
- { "gametilt.com", true },
{ "gametube.website", true },
{ "gamilab.com", true },
{ "gamilab.no", true },
{ "gamingexodus.com", true },
{ "gamingmedley.com", true },
{ "gamingrealms.net", true },
- { "gamingwithcromulent.com", true },
{ "gamingzoneservers.com", true },
{ "gamisalya.com", true },
{ "gamishou.fr", true },
{ "gamismodernshop.com", true },
+ { "gamismu.com", true },
{ "gamismurahonline.com", true },
{ "gamivo.com", true },
{ "gamoloco.com", true },
@@ -15271,27 +15864,32 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gancedo.com.es", true },
{ "gandalfservice.com", true },
{ "gandalfthefeline.com", true },
- { "gandc.co", false },
{ "gandgliquors.com", true },
{ "ganggalbichler.at", true },
+ { "gangnamavenue.com", true },
+ { "gangnamcool.com", true },
{ "gansleit.com", false },
{ "ganztagplus.de", true },
{ "gao.ci", true },
{ "gao.rocks", true },
+ { "gaodebo.com", true },
{ "gaojianli.me", true },
{ "gaojianli.tk", true },
{ "gaos.org", true },
{ "gapdirect.com", true },
{ "gapfa.org", true },
- { "gaphag.ddns.net", true },
{ "garage-leone.com", true },
{ "garage-meynard.com", true },
{ "garagedejan.ch", true },
+ { "garagedoorrepairingsanjose.com", true },
{ "garageenginuity.com", true },
+ { "garagefox.ch", true },
{ "garagegoossens.be", true },
+ { "garagelink.jp", true },
{ "garagemhermetica.org", true },
{ "garagevanhulle-used.be", true },
{ "garanteasy.com", true },
+ { "garbagedisposalguides.com", true },
{ "garbomuffin.com", true },
{ "garciagerman.com", true },
{ "garda-see.mobi", true },
@@ -15321,6 +15919,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "garyswine.com", true },
{ "garywhittington.com", true },
{ "gashalot.com", true },
+ { "gastauftritt.net", true },
{ "gastoudererenda.nl", true },
{ "gastromedicalcenter.com.br", true },
{ "gastrotiger.at", true },
@@ -15330,6 +15929,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gatekiller.co.uk", true },
{ "gatewaybridal.com", true },
{ "gatewaybronco.com", true },
+ { "gathu.co.ke", true },
{ "gauche.com", true },
{ "gaudeamus-folklor.cz", true },
{ "gaudere.co.jp", true },
@@ -15339,9 +15939,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gautvedt.no", true },
{ "gavin.sh", true },
{ "gavins.stream", true },
- { "gavinsblog.com", true },
+ { "gaw.sh", true },
{ "gawrimanecuta.com", true },
- { "gaycc.cc", true },
{ "gayhotti.es", true },
{ "gaymerconnect.net", true },
{ "gaymerx.com", true },
@@ -15369,6 +15968,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gcoded.de", true },
{ "gcs-ventures.com", true },
{ "gcsepod.com", true },
+ { "gd88.cc", true },
{ "gdax.com", true },
{ "gdb-tutorial.net", true },
{ "gdgrzeszow.pl", true },
@@ -15382,6 +15982,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ge3k.net", false },
{ "gear4you.shop", true },
{ "gearallnews.com", true },
+ { "gearbot.rocks", true },
{ "gearboxhero.com", true },
{ "gearev.net", true },
{ "gearfinder.nl", true },
@@ -15394,23 +15995,27 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gebruikershandleiding.com", true },
{ "gecem.org", true },
{ "gechr.io", true },
- { "geckler-ee.de", true },
+ { "geckler-ee.de", false },
{ "geder.at", true },
{ "gedlingcastlehire.co.uk", true },
{ "gedlingtherapy.co.uk", true },
{ "gee.is", true },
{ "geecrat.com", true },
{ "geek-hub.de", true },
+ { "geek.ch", true },
{ "geekabit.nl", true },
{ "geekandi.com", true },
{ "geekariom.com", true },
{ "geekclubbooks.com", true },
+ { "geekeffect.co.uk", true },
{ "geeklair.net", true },
{ "geeklan.co.uk", true },
{ "geekles.net", true },
{ "geeknik.com", true },
{ "geekpad.com", true },
+ { "geeks.one", false },
{ "geekshirts.cz", true },
+ { "geekthis.de", true },
{ "geektopia.es", true },
{ "geekwhack.org", true },
{ "geekwithabudget.com", true },
@@ -15430,6 +16035,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gehirn.jp", true },
{ "gehopft.de", true },
{ "gehreslaw.com", true },
+ { "gehrke.cloud", true },
{ "gehrke.in", true },
{ "gehsicht.de", true },
{ "geigenbauer.in", false },
@@ -15442,20 +16048,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "geldimblick.de", true },
{ "geleenbeekdal.nl", true },
{ "geleia-real.com", true },
+ { "geli-graphics.com", true },
{ "gelis.ch", true },
{ "gelodosul.com.br", true },
{ "gelog-software.de", false },
{ "gelonghui.com", true },
{ "geloofindemocratie.nl", false },
{ "geluidsstudio.com", true },
- { "geluk.io", true },
+ { "gelukkigehonden.nl", true },
{ "gem-indonesia.net", false },
{ "gem-info.fr", true },
- { "gemeentemolenwaard.nl", true },
+ { "gemails.eu", true },
{ "gemeinsam-ideen-verwirklichen.de", true },
{ "gemgroups.in", true },
{ "gemini.com", true },
{ "gemquery.com", true },
+ { "genbright.com", true },
{ "genchev.io", true },
{ "gencmedya.com", true },
{ "genderidentiteit.nl", true },
@@ -15467,11 +16075,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "geneau.net", true },
{ "genehightower.com", true },
{ "genehome.com.au", true },
+ { "genemon.at", true },
{ "generace-id.org", true },
{ "generador-electrico.com", true },
{ "general-anaesthesia.com", true },
{ "general-anaesthetics.com", true },
{ "general-anesthesia.com", true },
+ { "general-plast.com", true },
{ "generali-worldwide.com", true },
{ "generalinsuranceservices.com", true },
{ "generationgoat.com", true },
@@ -15488,6 +16098,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "geneve-naturisme.ch", true },
{ "genevoise-entretien.ch", true },
{ "genfaerd.dk", true },
+ { "geniofinanciero.org", true },
{ "geniush.ovh", true },
{ "geniushost.in", true },
{ "geniusteacher.in", true },
@@ -15508,10 +16119,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gensonline.eu", true },
{ "gentianes.ch", true },
{ "gentoo-blog.de", true },
- { "gentooblog.de", true },
{ "genusshotel-riegersburg.at", true },
{ "geocar.com", true },
{ "geocompass.at", true },
+ { "geoffsec.org", true },
{ "geofox.org", true },
{ "geography-schools.com", true },
{ "geoinstinct.com", true },
@@ -15520,6 +16131,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "geojs.io", true },
{ "geology-schools.com", true },
{ "geometra.roma.it", true },
+ { "geometra24.it", true },
{ "geomex.be", true },
{ "geomonkeys.com", true },
{ "geoponika.gr", true },
@@ -15561,22 +16173,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gerbyte.uk", true },
{ "germandarknes.net", true },
{ "germanssky.de", true },
- { "germanticz.de", true },
{ "gernert-server.de", true },
{ "gero.io", true },
{ "gerritcodereview.com", true },
{ "gerwinvanderkamp.nl", true },
{ "ges-bo.de", true },
- { "geschichtscheck.de", true },
+ { "geschenkly.de", false },
{ "geschmacksache.online", true },
{ "geschwinder.net", true },
{ "gesica.cloud", true },
+ { "gesnex.com", true },
{ "gessettirotti.it", true },
{ "gestorehotel.com", true },
{ "gestormensajeria.com", true },
+ { "gestsal.com", true },
{ "gesundheitmassage.com", true },
{ "gesundheitswelt24.de", true },
- { "gesundheitszentrum-am-reischberg.de", true },
{ "get-erp.ru", true },
{ "get-it-live.com", true },
{ "get-it-live.de", true },
@@ -15593,16 +16205,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "getbrowink.com", true },
{ "getbutterfly.com", true },
{ "getcloak.com", false },
- { "getcolq.com", true },
{ "getcommande.com", true },
{ "getdash.io", true },
{ "getdeveloper.de", true },
{ "geteckeld.nl", true },
- { "getenv.io", true },
{ "geterp.ru", true },
{ "getfedora.org", true },
+ { "getfilterlive.org", true },
{ "getfirstalert.com", true },
- { "getfittedstore.com", true },
{ "getflorence.co.uk", true },
{ "getfoundquick.com", true },
{ "getgeek.es", true },
@@ -15614,6 +16224,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "getinphase.com", true },
{ "getitlive.de", true },
{ "getitpeople.com", true },
+ { "getlawyered.com.au", true },
{ "getmango.com", true },
{ "getmdl.io", true },
{ "getmerch.eu", true },
@@ -15642,7 +16253,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "getticker.com", true },
{ "gettodoing.com", true },
{ "gettopquality.com", true },
- { "getts.ro", true },
{ "getupandbounce.co.uk", true },
{ "getvdownloader.com", true },
{ "getwemap.com", true },
@@ -15666,7 +16276,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gfnetfun.cf", true },
{ "gforce.ninja", true },
{ "gfoss.eu", true },
- { "gfournier.ca", true },
{ "gfxbench.com", true },
{ "ggdcpt.com", true },
{ "gginin.today", true },
@@ -15679,14 +16288,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ggservers.com", true },
{ "ggx.us", true },
{ "gha.st", true },
- { "ghaglund.se", true },
{ "ghettonetflix.de", true },
{ "ghfip.com.au", true },
{ "ghini.com", true },
{ "ghislainphu.fr", true },
+ { "ghost-legion.com", true },
{ "ghostblog.info", false },
{ "ghostcir.com", true },
{ "ghou.me", true },
+ { "ghowell.io", true },
{ "ghrelinblocker.info", true },
{ "ghrelinblocker.org", true },
{ "ghuntley.com", false },
@@ -15706,13 +16316,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "giardiniere.bologna.it", true },
{ "giardiniere.milano.it", true },
{ "gichigamigames.com", true },
+ { "gidari.shop", true },
{ "giebel.it", true },
{ "gierds.de", true },
{ "giethoorn.com", true },
{ "gietvloergarant.nl", false },
{ "giftcard.net", true },
{ "giftcardgranny.com", true },
+ { "giftedconsortium.com", true },
{ "giftking.nl", false },
+ { "giftlist.guru", true },
{ "giftmaniabrilhos.com.br", true },
{ "gifts.best", true },
{ "gifts365.co.uk", true },
@@ -15722,11 +16335,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "giga.nl", true },
{ "gigabitz.pw", true },
{ "gigacog.com", true },
- { "gigantar.com", true },
{ "gigantism.com", true },
{ "gigawa.lt", true },
{ "giggletotz.co.uk", true },
- { "gigime.com", true },
{ "gigin.eu", true },
{ "gigin.me", true },
{ "gigis-pizzeria.de", true },
@@ -15737,25 +16348,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gijsbertus.com", true },
{ "gijswesterman.nl", true },
{ "gikovatelojavirtual.com.br", true },
- { "gilangcp.com", true },
+ { "gilangcp.com", false },
{ "gileadpac.com", true },
{ "giliamor.com", true },
- { "gilium.com", true },
{ "gillesdesnoyers.com", true },
{ "gillesmorelle.com", true },
{ "gillfamily.de", true },
{ "gillmanandsoame.co.uk", true },
{ "gillyscastles.co.uk", true },
+ { "gilme.net", true },
{ "gilmoreid.com.au", true },
- { "gilmourluna.com", true },
{ "gilnet.be", true },
{ "gimme.money", true },
{ "gina-architektur.design", true },
{ "ginabaum.com", true },
- { "ginacat.de", true },
{ "gingersutton.com", true },
{ "ginionusedcars.be", true },
{ "ginja.co.th", true },
+ { "ginnegappen.nl", true },
{ "ginniemae.gov", true },
{ "gino-gelati.de", true },
{ "ginza-luce.net", true },
@@ -15800,7 +16410,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "giulianosdeli.com", true },
{ "giunchi.net", true },
{ "giuseppemacario.men", true },
- { "givastar.com", true },
{ "give2charity.co", true },
{ "give2charityapp.com", true },
{ "giveattheoffice.org", false },
@@ -15809,6 +16418,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "given2.com", true },
{ "givesunlight.com", true },
{ "givingnexus.org", false },
+ { "givingtools.com", true },
{ "gixtools.com", true },
{ "gixtools.net", true },
{ "gj-bochum.de", true },
@@ -15822,6 +16432,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "glaciernursery.com", true },
{ "gladiatorboost.com", true },
{ "gladwellentertainments.co.uk", true },
+ { "glahcks.com", true },
{ "glamguru.co.il", true },
{ "glamguru.world", true },
{ "glamour4you.de", true },
@@ -15832,6 +16443,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "glasfaser-im-hanseviertel.de", true },
{ "glasgestaltung.biz", true },
{ "glasner.photo", true },
+ { "glass-mag.eu", true },
{ "glass.google.com", true },
{ "glasschmuck-millefiori.de", true },
{ "glassexpertswa.com", true },
@@ -15853,6 +16465,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "glidingshop.de", true },
{ "glidingshop.eu", true },
{ "glitzerstuecke.de", true },
+ { "glixee.com", true },
{ "glloq.org", true },
{ "glob-coin.com", true },
{ "global-adult-webcams.com", true },
@@ -15869,6 +16482,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "globalisierung-fakten.de", true },
{ "globalitac.com", true },
{ "globalityinvestment.com", true },
+ { "globalno.me", true },
{ "globalonetechnology.com", true },
{ "globalprojetores.com.br", true },
{ "globalresearchcouncil.org", true },
@@ -15884,7 +16498,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "glont.net", true },
{ "gloria.tv", true },
{ "glosiko.com", true },
- { "glossopnorthendafc.co.uk", true },
{ "glotech.co.uk", true },
{ "glotechkitchens.co.uk", true },
{ "glotechrepairs.co.uk", true },
@@ -15927,18 +16540,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gmx.fr", true },
{ "gmx.net", true },
{ "gn00.com", true },
+ { "gn00.ink", true },
{ "gnax.jp", false },
{ "gndh.net", true },
{ "gnetion.com", true },
{ "gnetwork.eu", true },
{ "gnfrazier.me", true },
- { "gnhub.org", true },
{ "gnilebein.de", true },
{ "gnk.io", true },
{ "gnuand.me", true },
{ "gnucashtoqif.us", true },
{ "gnunet.org", true },
- { "gnuplus.me", true },
{ "gnwp.eu", true },
{ "go-dutch.eu", true },
{ "go-embedded.de", true },
@@ -15947,6 +16559,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "go-zh.org", true },
{ "go.microsoft.com", true },
{ "go.xero.com", false },
+ { "go2archive.nl", true },
{ "go2ubl.nl", true },
{ "goa8.xyz", true },
{ "goalbookapp.com", true },
@@ -15964,10 +16577,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gochu.se", true },
{ "gocleanerslondon.co.uk", true },
{ "god-clan.hu", true },
+ { "godattributes.com", true },
{ "godaxen.tv", true },
{ "godclan.hu", true },
{ "godesigner.ru", true },
- { "godrive.ga", true },
{ "godsofhell.com", true },
{ "godsofhell.de", true },
{ "goededoelkerstkaarten.nl", true },
@@ -15990,7 +16603,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gofoiayourself.org", true },
{ "gogle-analytics.com", true },
{ "gogleapis.com", true },
- { "gogonano.com", true },
{ "gogoodyear.eu", true },
{ "gogroopie.com", true },
{ "gogroopie.ie", true },
@@ -16036,20 +16648,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "golser.info", true },
{ "gomasy.jp", true },
{ "gomel.chat", true },
+ { "gomel.city", true },
{ "gomelchat.com", true },
+ { "gomelphoto.com", true },
{ "gomena.io", true },
{ "gommista.roma.it", true },
{ "gondawa.com", true },
{ "gondelvaartdwarsgracht.nl", true },
{ "gongjianwei.com", true },
{ "gongjuhao.com", true },
- { "gonx.dk", true },
+ { "gonx.dk", false },
{ "goo.gl", true },
{ "gooby.co", false },
{ "good-tips.pro", true },
+ { "good588.com", true },
{ "gooday.life", true },
- { "goodenough.nz", true },
{ "goodhealthtv.com", true },
+ { "goodiesoftware.xyz", true },
{ "goodquote.gq", true },
{ "goodryb.top", true },
{ "goodshepherdmv.com", true },
@@ -16057,15 +16672,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "google", true },
{ "google-analytics.com", true },
{ "googleandroid.cz", true },
- { "googlehosts.org", true },
{ "googlemail.com", false },
{ "googleplex.com", true },
{ "googlesource.com", true },
{ "goombi.fr", true },
{ "goonersworld.co.uk", true },
- { "goontopia.com", true },
{ "goooo.info", true },
- { "gootlijsten.nl", true },
{ "goover.de", true },
{ "goow.in", true },
{ "goozp.com", true },
@@ -16084,12 +16696,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gorgias.me", true },
{ "gorky.media", true },
{ "gorn.ch", true },
- { "gorschenin.com", true },
+ { "goru.travel", true },
{ "gosccs.com", true },
{ "gosciencegirls.com", true },
{ "gosforthdentalsurgery.co.uk", true },
{ "goshawkdb.io", true },
{ "goshin-group.co.jp", true },
+ { "gosnipe.com", true },
{ "gosolockpicks.com", true },
{ "gospelfollower.com", true },
{ "gospelofmark.ch", true },
@@ -16104,17 +16717,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gothamlimo.com", true },
{ "gothic.dating", true },
{ "gotirupati.com", false },
- { "gotmalk.org", true },
+ { "gotmalk.org", false },
{ "goto.google.com", true },
{ "goto.msk.ru", true },
{ "goto.world", true },
{ "goto10.se", true },
{ "gotomi.info", true },
+ { "gotowned.org", false },
{ "gotoxy.at", true },
{ "gotrail.fr", true },
{ "gottcode.org", false },
{ "gottfridsberg.org", true },
{ "goudenharynck.be", true },
+ { "goufaan.com", true },
{ "gouforit.com", true },
{ "gouldcooksey.com", true },
{ "goup.co", true },
@@ -16130,6 +16745,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "govtjobs.blog", true },
{ "govtrack.us", true },
{ "govype.com", true },
+ { "gow220.ru", true },
{ "gowancommunications.com", true },
{ "gowe.wang", false },
{ "gowildrodeo.co.uk", true },
@@ -16146,9 +16762,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gpsvideocanada.com", true },
{ "gpureport.cz", true },
{ "gpws.ovh", true },
+ { "gpyy.net", true },
{ "gqmstore.com.br", true },
{ "gr.search.yahoo.com", false },
{ "gra2.com", true },
+ { "graandco.com", false },
{ "graasp.net", false },
{ "grabacabpa.com", true },
{ "grace-wan.com", true },
@@ -16157,7 +16775,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gracethrufaith.com", true },
{ "gracetini.com", true },
{ "graciousmay.com", true },
- { "gradecam.com", true },
+ { "gradecam.com", false },
{ "gradienthosting.co.uk", true },
{ "gradients.com", true },
{ "gradingcontractornc.com", true },
@@ -16170,7 +16788,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "grafcaps.com", true },
{ "graffen.dk", true },
{ "grafmag.pl", true },
- { "grafmurr.de", true },
{ "grafoteka.pl", true },
{ "graft.community", true },
{ "graft.observer", true },
@@ -16200,6 +16817,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "grandjunctionbrewing.com", true },
{ "grandmusiccentral.com.au", true },
{ "grandpadusercontent.com", true },
+ { "grandwailea.com", true },
{ "granfort.es", false },
{ "granishe.com", true },
{ "graniteind.com", true },
@@ -16215,17 +16833,27 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "grapee.jp", true },
{ "grapeintentions.com", true },
{ "grapevine.is", true },
+ { "graph.org", true },
{ "graphcommons.com", true },
{ "graphene.software", true },
{ "graphic-schools.com", true },
{ "graphic-shot.com", true },
+ { "graphobyte.com", true },
{ "grapholio.net", true },
+ { "grasboomamersfoort.nl", true },
+ { "grasboombinnendoor.nl", true },
+ { "grasboomclophaemer.nl", true },
+ { "grasboomderoos.nl", true },
+ { "grasboomleusden.nl", true },
+ { "grasboommax.nl", true },
+ { "grasboommeerbalans.nl", true },
+ { "grasboomveenendaal.nl", true },
+ { "grasboomvondellaan.nl", true },
{ "grasmark.com", true },
{ "grassenberg.de", true },
{ "grasshoppervape.com", true },
{ "grasso.io", true },
{ "grassreinforcement.com.au", true },
- { "gratis-lovecheck.de", true },
{ "gratisgamecards.nl", true },
{ "gratisrollenspieltag.de", true },
{ "gratiswifivoorjegasten.nl", true },
@@ -16260,13 +16888,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "greatskillchecks.com", true },
{ "greboid.co.uk", true },
{ "greboid.com", true },
- { "greditsoft.com", true },
{ "greek.dating", true },
{ "greeklish.gr", true },
{ "greekmusic.academy", true },
{ "green-attitude.be", true },
{ "green-care.nl", true },
+ { "green-light.cf", true },
{ "green-light.co.nz", true },
+ { "green-light.ga", true },
+ { "green-light.gq", true },
+ { "green-light.ml", true },
{ "greenaddress.it", true },
{ "greenapproach.ca", true },
{ "greencircleplantnursery.com.au", true },
@@ -16295,9 +16926,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "greg.red", true },
{ "gregbrimble.com", true },
{ "greger.me", true },
- { "gregmarziomedia-dev.com", true },
- { "gregmarziomedia.co.za", true },
- { "gregmarziomedia.com", true },
{ "gregmilton.com", true },
{ "gregmote.com", true },
{ "grego.pt", true },
@@ -16314,7 +16942,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "grenadierkorps-kaarst.de", true },
{ "grenadierkorps.de", true },
{ "grendel.no", true },
- { "grengine.ch", true },
+ { "grenlandkiropraktor.no", true },
{ "grepmaste.rs", true },
{ "grepular.com", true },
{ "gresak.io", true },
@@ -16323,7 +16951,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "grexx.nl", true },
{ "grey.house", true },
{ "greybeards.ca", true },
- { "greyhash.se", true },
{ "greymattertechs.com", true },
{ "greysky.me", true },
{ "greyskymedia.com", true },
@@ -16333,6 +16960,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "grh.am", true },
{ "griassdi-reseller.de", true },
{ "gricargo.com", true },
+ { "gridle.io", true },
{ "gridsmartercities.com", true },
{ "griechische-pfoetchen.de", true },
{ "griefheart.com", true },
@@ -16347,6 +16975,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "griegshipbrokers.no", true },
{ "griesser2.de", true },
{ "grillen-darf-nicht-gesund-sein.de", true },
+ { "grillhutsunderland.com", true },
{ "grillteller42.de", true },
{ "grimcalc.com", true },
{ "grimm-gastrobedarf.de", true },
@@ -16355,7 +16984,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "grinnellplans.com", true },
{ "grippe-impftermin.de", true },
{ "gritte.ch", true },
- { "grizzlys.com", true },
{ "grmp.fr", true },
{ "grocerybuild.com", true },
{ "grocock.me.uk", true },
@@ -16385,6 +17013,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "grothoff.org", true },
{ "grottenthaler.eu", true },
{ "groundlevelup.com", true },
+ { "groundmc.net", true },
+ { "groundthumpingmotors.com", true },
+ { "groundthumpingmotors.net", true },
+ { "groundthumpinmotors.com", true },
+ { "groundthumpinmotors.net", true },
{ "group4layers.net", true },
{ "groupe-neurologique-nord.lu", true },
{ "groupebaillargeon.com", true },
@@ -16413,6 +17046,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "grundlage.com.ua", true },
{ "grunwaldzki.center", true },
{ "grunwasser.fr", true },
+ { "grupodatco.com", true },
{ "grupomakben.com", true },
{ "grupomedlegal.com", true },
{ "grupoparco.com", true },
@@ -16438,12 +17072,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gt-network.de", true },
{ "gta-arabs.com", true },
{ "gtaforum.nl", true },
- { "gtchipsi.org", true },
- { "gtcprojects.com", true },
+ { "gtdgo.com", false },
{ "gtlaun.ch", true },
{ "gtlfsonlinepay.com", true },
{ "gtmasterclub.it", false },
{ "gtmetrix.com", true },
+ { "gtn-pravda.ru", true },
{ "gtoepfer.de", true },
{ "gtopala.com", true },
{ "gtopala.net", true },
@@ -16451,6 +17085,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gtravers-basketmaker.co.uk", true },
{ "gtxbbs.com", true },
{ "gtxmail.de", true },
+ { "guadagnare.info", true },
{ "guajars.cl", true },
{ "guannan.net.cn", true },
{ "guanyembadalona.org", true },
@@ -16475,7 +17110,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gueze-sas.fr", true },
{ "guffr.it", true },
{ "guge.ch", true },
- { "gugert.net", true },
{ "guhei.net", true },
{ "guhenry3.tk", true },
{ "guiacidade.com.br", true },
@@ -16488,13 +17122,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "guide-peche-cantal.com", true },
{ "guidebook.co.tz", true },
{ "guidedselling.net", true },
+ { "guidedsteps.com", true },
{ "guideline.gov", false },
{ "guidelines.gov", false },
{ "guideo.ch", true },
{ "guidepointsecurity.com", true },
{ "guides-peche64.com", true },
{ "guidetoiceland.is", false },
- { "guildbase.de", true },
{ "guildofmusicsupervisors.co.uk", true },
{ "guillaume-briand.fr", true },
{ "guillaumeperrin.io", true },
@@ -16506,6 +17140,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gulchuk.com", true },
{ "gulenbase.no", true },
{ "gulfstream.ru", true },
+ { "gulshankumar.net", true },
{ "gume4you.com", true },
{ "gumeyamall.jp", true },
{ "gumi.ca", true },
@@ -16522,17 +17157,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "guoliang.me", true },
{ "guozeyu.com", true },
{ "gupfen.ch", true },
- { "guphi.net", false },
{ "gurkan.in", true },
{ "gurmel.ru", true },
{ "gurpusmaximus.com", true },
{ "guru-naradi.cz", true },
{ "gurucomi.com", true },
{ "gurueffect.com", true },
+ { "gurunpa.com", true },
{ "gururi.com", true },
{ "gus.host", true },
{ "gustaff.de", true },
- { "gustiaux.com", true },
{ "gustom.io", true },
{ "gut8er.com.de", true },
{ "gutools.co.uk", true },
@@ -16540,7 +17174,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "guts.moe", true },
{ "gutschein-spezialist.de", true },
{ "gutscheingeiz.de", true },
- { "gutuia.blue", true },
{ "guus-thijssen.nl", true },
{ "guusvandewal.nl", true },
{ "guyeskens.be", true },
@@ -16564,6 +17197,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gwhois.org", true },
{ "gwrtech.com", true },
{ "gwsec.co.uk", true },
+ { "gx3.cn", true },
{ "gxmyqy.net", true },
{ "gyara.moe", true },
{ "gyas.nl", true },
@@ -16573,7 +17207,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gymjp.com", true },
{ "gymkirchenfeld.ch", true },
{ "gymnaserenens.ch", true },
- { "gymnasium-farmsen.de", true },
{ "gymnasium-hittfeld.de", true },
{ "gympap.de", true },
{ "gynaecology.co", true },
@@ -16583,31 +17216,36 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "gyrenens.ch", true },
{ "gyu-raku.jp", true },
{ "gyulakerezsi.ro", true },
+ { "gyume.ir", true },
{ "gz-architekten.de", true },
{ "gz-benz.com", true },
{ "gz-bmw.com", true },
{ "gza.jp", true },
{ "gzom.ru", true },
+ { "gzriedstadt.de", true },
{ "h-jo.net", true },
{ "h-suppo.com", true },
{ "h001.ru", true },
{ "h09.eu", true },
{ "h0r.st", true },
{ "h10l.com", true },
- { "h11.io", true },
+ { "h11.io", false },
{ "h11.moe", true },
{ "h1ctf.com", true },
{ "h1z1swap.com", true },
{ "h24.org", true },
{ "h2s-design.de", true },
{ "h2u.tv", true },
+ { "h33t.xyz", true },
{ "h3artbl33d.nl", true },
{ "h3b.nl", true },
+ { "h3x.net", true },
{ "h3z.jp", true },
{ "h404bi.com", true },
{ "ha-kunamatata.de", true },
{ "ha3.eu", true },
{ "ha6.ru", true },
+ { "haancommunity.cf", true },
{ "haarlemsesaxofoonschool.nl", true },
{ "haavard.me", true },
{ "haazen.xyz", true },
@@ -16625,6 +17263,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hacertest.com", true },
{ "hacettepeteknokent.com.tr", true },
{ "hachre.de", false },
+ { "hack.club", true },
{ "hackademix.net", true },
{ "hackanders.com", true },
{ "hackattack.com", true },
@@ -16634,6 +17273,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hackdown.me", true },
{ "hackenkunjeleren.nl", true },
{ "hackenturet.dk", true },
+ { "hacker.club", true },
{ "hacker.holiday", true },
{ "hacker.im", true },
{ "hacker.one", true },
@@ -16647,6 +17287,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hackerone-ext-content.com", true },
{ "hackerone-user-content.com", true },
{ "hackerone.at", true },
+ { "hackerone.blog", true },
{ "hackerone.com", true },
{ "hackerone.net", true },
{ "hackerone.org", true },
@@ -16655,13 +17296,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hackgins.com", true },
{ "hackingand.coffee", false },
{ "hackingdh.com", true },
+ { "hackingondemand.com", true },
{ "hackmd.io", true },
{ "hackmeimfamo.us", true },
{ "hackreone.com", true },
{ "hacksecu.re", true },
{ "hacksoc.co.uk", true },
{ "hackthissite.org", true },
- { "hacktic.info", true },
{ "hacktivis.me", true },
{ "hackworx.com", false },
{ "hadaly.fr", true },
@@ -16669,6 +17310,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hadouk.in", true },
{ "hadrons.org", true },
{ "hady.fr", true },
+ { "haeckdesign.com", true },
{ "haefligermedia.ch", true },
{ "haemka.de", true },
{ "haens.li", true },
@@ -16682,6 +17324,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hagueaustralia.com.au", true },
{ "haha-raku.com", true },
{ "hahay.es", true },
+ { "haibara.top", true },
{ "haiboxu.com", true },
{ "hailer.com", true },
{ "hailstorm.nl", true },
@@ -16694,10 +17337,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hairtonic-lab.com", true },
{ "haixihui.cn", true },
{ "hajekdavid.cz", true },
+ { "hajekj.com", true },
{ "hajekj.cz", true },
{ "hajekj.net", true },
{ "hajnzic.at", true },
{ "hak5.org", true },
+ { "hakans.science", true },
{ "hakaru.org", true },
{ "hakase.io", true },
{ "hakase.pw", true },
@@ -16706,16 +17351,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hakkasangroup.com", true },
{ "hakkasannightclub.com", true },
{ "halacs.hu", true },
- { "halbich.design", true },
{ "haleo.net", true },
{ "half.host", true },
- { "halfco.de", true },
{ "halfhosting.de", true },
{ "halitopuroprodutos.com.br", true },
{ "halkirkbouncycastles.co.uk", true },
- { "halkyon.net", true },
{ "hallelujahsoftware.com", true },
- { "halletienne.fr", true },
{ "hallettxn.com", true },
{ "hallhuber.com", true },
{ "halliday.work", true },
@@ -16723,22 +17364,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hallmarkestates.ca", true },
{ "hallucinogen.com", true },
{ "hallucinogens.org", true },
- { "hallumlaw.com", true },
{ "halo.fr", true },
{ "halocredit.pl", true },
- { "halongbaybackpackertour.com", true },
{ "haloobaloo.com", true },
{ "haloria.com", true },
{ "haltegame.com", true },
+ { "halyul.com", true },
{ "hamacho-kyudo.com", true },
{ "hamali.bg", true },
+ { "hambassadors.org", true },
{ "hamburg40grad.de", true },
{ "hamburgerbesteld.nl", true },
{ "hamcocc.com", true },
{ "hamcram.io", true },
{ "hamiltonlinen.com", true },
{ "hamiltonmedical.nl", true },
- { "hammer-schnaps.com", true },
{ "hammer-sms.com", true },
{ "hampl.tv", true },
{ "hampshiretechservices.co.uk", true },
@@ -16757,11 +17397,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "handmade-workshop.de", true },
{ "handmadehechoamano.com", true },
{ "handy-center.net", true },
+ { "handy-reparatur-berlin.com", true },
{ "handymanlondonplease.co.uk", true },
+ { "handynummer-info.ch", true },
+ { "handynummer.online", true },
{ "handysex.live", true },
{ "handyticket.de", true },
{ "hanfox.co.uk", false },
- { "hanfverband-erfurt.de", true },
+ { "hang333.moe", true },
{ "hangar.hosting", true },
{ "hangcapnach.com", true },
{ "hangouts.google.com", true },
@@ -16773,10 +17416,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hannasecret.de", true },
{ "hannoluteijn.nl", true },
{ "hannover.de", true },
- { "hanoibuffet.com", true },
{ "hanpenblog.com", true },
{ "hansahome.ddns.net", true },
{ "hansashop.eu", true },
+ { "hansashop.fi", true },
{ "hansbijster.nl", true },
{ "hanschventures.com", true },
{ "hansen-kronshagen.de", true },
@@ -16789,22 +17432,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hantse.com", true },
{ "hanu.la", true },
{ "hanyibo.com", true },
+ { "hanying6.com", true },
{ "hanzubon.jp", true },
{ "hao-zhang.com", true },
{ "haocq3.com", true },
{ "haogoodair.ca", true },
{ "haoqi.men", true },
{ "haorenka.cc", true },
- { "haotown.cn", true },
{ "haozhang.org", true },
{ "haozhexie.com", true },
{ "haozi.me", true },
- { "haozijing.com", true },
{ "hapheemraadssingel.nl", true },
{ "hapijs.cn", true },
{ "happndin.com", true },
{ "happy-baby.info", true },
{ "happy-end-shukatsu.com", true },
+ { "happy-life-food.de", true },
{ "happyagain.de", true },
{ "happyagain.se", true },
{ "happyandrelaxeddogs.eu", true },
@@ -16826,6 +17469,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "haptemic.com", true },
{ "haraj.com.sa", true },
{ "harald-d.dyndns.org", true },
+ { "harald-pfeiffer.de", true },
{ "harapecorita.com", true },
{ "harbor-light.net", true },
{ "hardeman.nu", true },
@@ -16833,15 +17477,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hardergayporn.com", true },
{ "hardertimes.com", true },
{ "hardesec.com", true },
- { "hardez.de", true },
+ { "hardez.de", false },
{ "hardfalcon.net", true },
{ "hardforum.com", true },
{ "hardh.at", true },
+ { "hardhat.io", true },
{ "hardloopfysio.nl", true },
{ "hardrain980.com", true },
{ "hardtfrieden.de", true },
{ "hardwareschotte.de", true },
{ "harekaze.info", true },
+ { "harelmallac.com", true },
+ { "harelmallacglobal.com", true },
{ "haribilalic.com", true },
{ "harilova.fr", true },
{ "harion.fr", true },
@@ -16853,18 +17500,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "harmoney.com", true },
{ "harmoney.com.au", true },
{ "harmonyplace.com", true },
+ { "harnov.dk", true },
{ "haroldsharpe.com", true },
{ "harp.gov", true },
{ "harrcostl.com", true },
{ "harringtonca.com", true },
{ "harrisonswebsites.com", true },
{ "harrisonvillenaz.org", true },
+ { "harry-baker.com", true },
+ { "harrygerritstransport.nl", true },
{ "harrymclaren.co.uk", true },
{ "harryphoto.fr", true },
{ "harrysgardengamehire.co.uk", true },
{ "harrysmallbones.co.uk", true },
{ "harrysqnc.co.uk", true },
+ { "harschnitz.nl", false },
{ "hartie95.de", true },
+ { "hartkampforkids.nl", true },
{ "hartlep.email", true },
{ "hartlieb.me", true },
{ "hartzer.com", true },
@@ -16875,6 +17527,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "harvestapp.com", true },
{ "harvester.fr", true },
{ "harveyauzorst.com", true },
+ { "harveyplum.com", true },
{ "harveysautoservice.net", true },
{ "has-no-email-set.de", false },
{ "has.work", true },
@@ -16905,6 +17558,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hasselbach-dellwig.de", true },
{ "hatarisecurity.co.ke", true },
{ "hatpakha.com", true },
+ { "hatter.ink", true },
{ "hatul.info", true },
{ "haucke.xyz", true },
{ "hauntedhouserecords.co.uk", true },
@@ -16912,16 +17566,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "haus-henne.de", true },
{ "haus-zeitlos.de", true },
{ "hausarztpraxis-linn.de", true },
+ { "haushaltsaufloesunghannover.de", true },
{ "haushenne.de", true },
{ "hausjugo.de", true },
{ "haustechnik-breu.de", true },
+ { "haustechnik-schulte-sanitaer-heizung-klima.de", true },
{ "hausundhof.com", true },
{ "hausverbrauch.de", true },
{ "hautaka.com", true },
{ "hautarztzentrum.ch", true },
{ "hauteslatitudes.com", true },
- { "havarijna-sluzba-bratislava.sk", true },
- { "havasuhomepage.com", true },
{ "havasuinsurance.com", true },
{ "havasutacohacienda.com", true },
{ "have.jp", true },
@@ -16939,6 +17593,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "havetherelationshipyouwant.com", true },
{ "hawaar.com", true },
{ "hawaiianchoice.com", true },
+ { "hawawa.kr", true },
{ "hawaya.com", true },
{ "hawkeyeinsight.com", true },
{ "hawkinsonkiaparts.com", true },
@@ -16951,9 +17606,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "haxo.nl", false },
{ "hayai.space", true },
{ "hayashi-rin.net", true },
- { "hayden.one", false },
{ "haydenjames.io", true },
- { "haydentomas.com", true },
{ "hayfordoleary.com", true },
{ "haynes-davis.com", true },
{ "hayvid.com", true },
@@ -16975,7 +17628,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hd-offensive.at", false },
{ "hd-only.org", true },
{ "hd-outillage.com", true },
- { "hd1tj.org", true },
+ { "hd4138.com", true },
+ { "hd6556.com", true },
{ "hdc.cz", true },
{ "hdcamvids.com", true },
{ "hdcenter.cc", true },
@@ -16998,10 +17652,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "headlinepublishing.be", true },
{ "headshopinternational.com", true },
{ "headshotharp.de", true },
- { "healey.io", true },
- { "health-and-beauty-news.net", true },
- { "health-booster.com", false },
+ { "health-booster.com", true },
{ "health-plan-news.com", true },
+ { "health.gov", true },
{ "health.graphics", true },
{ "healthand-beautynews.net", true },
{ "healthandskinbeauty.com", true },
@@ -17011,9 +17664,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "healtheals.com", true },
{ "healtheffectsofasbestos.com", true },
{ "healthery.com", true },
+ { "healthfinder.gov", true },
{ "healthfoam.com", true },
{ "healthgames.co.uk", true },
- { "healthiercompany.com", true },
{ "healthiergenerations.co.uk", true },
{ "healthit.gov", true },
{ "healthplansamerica.org", true },
@@ -17022,8 +17675,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "healththoroughfare.com", true },
{ "healthy-map.com", true },
{ "healthybeterlife.click", true },
- { "healthyfitfood.com", true },
{ "healthypeople.gov", true },
+ { "healthyrecharge.com", true },
{ "healthyteame.com", true },
{ "heap.zone", true },
{ "heapkeeper.org", true },
@@ -17034,7 +17687,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "heartlandbiomed.com", true },
{ "heartmdinstitute.com", true },
{ "heartsintrueharmony.com", true },
- { "heartsucker.com", false },
{ "hearttruth.gov", true },
{ "heartview.com.br", true },
{ "heartwoodart.com", true },
@@ -17045,7 +17697,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hearty.ml", true },
{ "hearty.ooo", true },
{ "hearty.org.tw", true },
- { "hearty.taipei", true },
{ "hearty.tw", true },
{ "heartyapp.tw", true },
{ "heartycraft.com", true },
@@ -17056,7 +17707,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "heavensinferno.net", true },
{ "heavyequipments.org", true },
{ "hebamme-cranio.ch", true },
- { "hebergeurssd.com", true },
{ "hebikhiv.nl", true },
{ "hebingying.cn", true },
{ "hebocon.nl", true },
@@ -17085,9 +17735,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "heiaheia.com", true },
{ "heid.ws", true },
{ "heidisheroes.org", true },
+ { "heighton.com.au", true },
{ "heijblok.com", true },
{ "heijdel.nl", true },
{ "heikegastmann.com", true },
+ { "heikohessenkemper.de", true },
{ "heikorichter.name", true },
{ "heiland.io", true },
{ "heiliger-gral.info", true },
@@ -17105,8 +17757,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "heisenberg.co", true },
{ "heissluft-fritteuse.com", true },
{ "heistheguy.com", true },
+ { "heitepriem.info", true },
{ "heitland-it.de", true },
- { "heiwa-valve.co.jp", true },
+ { "heiwa-valve.co.jp", false },
+ { "hejahanif.se", true },
{ "hejianpeng.cn", true },
{ "heka.ai", true },
{ "helber-it-services.de", true },
@@ -17120,8 +17774,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "helenelefauconnier.com", true },
{ "helenkellersimulator.org", true },
{ "helfordriversc.co.uk", true },
- { "helgaschultz.de", true },
{ "helichat.de", true },
+ { "helifreak.club", true },
{ "helikon.ro", true },
{ "helioanodyne.eu", true },
{ "helios4.com", true },
@@ -17134,18 +17788,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "helles-koepfchen.de", true },
{ "helloacm.com", true },
{ "hellobrian.me", true },
+ { "hellomookie.com", true },
+ { "hellomouse.cf", true },
{ "hellomouse.net", true },
+ { "hellovillam.com", true },
{ "helloworldhost.com", false },
+ { "helloyemek.com", true },
{ "hellsgamers.pw", true },
{ "hellsh.com", true },
- { "helmut-a-binser.de", true },
{ "help.simpletax.ca", true },
{ "helpconnect.com.au", true },
- { "helpgoabroad.com", true },
- { "helpmij.cf", true },
{ "helpscoutdocs.com", true },
{ "helpstarloja.com.br", true },
+ { "helptasker.com", true },
+ { "helptasker.net", true },
+ { "helptasker.ru", true },
+ { "helpwithinsomnia.org", true },
{ "helpwithmybank.gov", true },
+ { "helserbrothers.com", true },
{ "helsinki.dating", true },
{ "helvella.de", true },
{ "hematoonkologia.pl", true },
@@ -17155,8 +17815,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hemtest.com", true },
{ "hen.ne.ke", true },
{ "henchman.io", true },
+ { "hendersonrealestatepros.com", true },
{ "hendersonvalleyautomotive.co.nz", true },
{ "hendric.us", false },
+ { "hendrickx.be", true },
{ "hendrik.li", true },
{ "hendrinortier.nl", true },
{ "hengelsportdeal.com", true },
@@ -17167,20 +17829,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "henkverlinde.com", false },
{ "henley-computer-repairs.co.uk", true },
{ "henleybouncycastles.co.uk", true },
- { "hennadesigns.org", true },
{ "hennecke-forstbetrieb.de", true },
{ "henneke.me", true },
{ "hennies.org", true },
{ "henningkerstan.de", true },
{ "hennymerkel.com", true },
{ "henok.eu", true },
+ { "henrik-bondtofte.dk", true },
{ "henriksen.is", true },
{ "henrikwelk.de", true },
{ "henrilammers.nl", true },
{ "henry.gg", true },
{ "henryphan.com", false },
{ "henrysautodetail.com", true },
- { "hentaiworld.cc", true },
{ "hentschke-bau.de", true },
{ "hentschke-betonfertigteilwerk.de", true },
{ "hentschke-invest.de", true },
@@ -17190,6 +17851,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "her25.com", false },
{ "herberichfamily.com", true },
{ "herbert.io", true },
+ { "herbertjanvandinther.nl", true },
{ "herbhuang.com", true },
{ "herbweb.net", true },
{ "herbweb.org", true },
@@ -17199,6 +17861,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "herebedragons.io", true },
{ "herecsrymy.cz", true },
{ "heren.fashion", true },
+ { "heribro.com", true },
{ "heritagebaptistchurch.com.ph", true },
{ "herkam.pl", true },
{ "hermanbrouwer.nl", true },
@@ -17214,8 +17877,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "heroiclove.com", true },
{ "heroicpixel.com", true },
{ "heroku.com", true },
+ { "heroku.ga", true },
{ "heromuster.com", true },
{ "herpes-no.com", true },
+ { "herramientasbazarot.com", true },
{ "herranzramia.com", false },
{ "herrderzeit.de", true },
{ "herrenmuehle-wein.de", true },
@@ -17226,7 +17891,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "herrtxbias.net", false },
{ "hertsbouncycastles.com", true },
{ "hertz.bj", true },
- { "hervespanneut.com", true },
{ "herzbotschaft.de", true },
{ "herzfuersoziales.at", true },
{ "herzig.cc", true },
@@ -17270,11 +17934,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hg.gg", true },
{ "hg.python.org", true },
{ "hgbet.com", true },
+ { "hgpowerglue.nl", true },
{ "hgvnet.de", true },
{ "hgw168.com", true },
{ "hh-medic.com", true },
{ "hh-wolke.dedyn.io", true },
{ "hhgdo.de", true },
+ { "hhh1080.com", true },
{ "hhhdb.com", true },
{ "hhidr.org", true },
{ "hhmmmm.de", true },
@@ -17302,6 +17968,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "higgstools.org", true },
{ "highair.net", true },
{ "higherpress.org", true },
+ { "highlatitudestravel.com", true },
{ "highlegshop.com", true },
{ "highlevelwoodlands.com", true },
{ "highlightsfootball.com", true },
@@ -17326,15 +17993,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hilfreiche-server.tips", true },
{ "hilhorst-uitvaartverzorging.nl", true },
{ "hillcountryoralsurgery.com", true },
+ { "hillcrestswimclub.com", true },
{ "hillsboroccpa.org", true },
{ "hillstrak.com.au", true },
{ "hilltopcellar.com", true },
{ "hilnu.com", true },
{ "hiltonarubabeachservices.com", true },
+ { "himalaya-cross.com", true },
+ { "himalaya.video", true },
{ "himcy.ga", true },
{ "himecorazon.com", true },
{ "himekomi.com", true },
- { "himens.com", true },
{ "himiku.com", true },
{ "hin10.com", true },
{ "hinata-hidetoshi.com", true },
@@ -17363,6 +18032,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hireabouncycastle.net", true },
{ "hiresteve.ca", true },
{ "hirevo.eu", true },
+ { "hirevue.com", true },
{ "hirezzportal.com", true },
{ "hiring-process.com", true },
{ "hiromuogawa.com", true },
@@ -17374,24 +18044,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hisingensck.se", true },
{ "hisnet.de", true },
{ "hispanic.dating", true },
- { "histocamp.de", true },
{ "histoire-cite.ch", true },
{ "historia-arte.com", true },
{ "history-schools.com", true },
{ "history.google.com", false },
{ "history.gov", true },
{ "hitandhealth.nl", true },
+ { "hitchpin.com", true },
{ "hiteco.com", true },
{ "hiteshbrahmbhatt.com", true },
{ "hititgunesi-tr.com", true },
{ "hitmanstat.us", true },
{ "hitn.at", true },
- { "hitoapi.cc", true },
+ { "hitoapi.cc", false },
{ "hitocom.net.br", true },
{ "hitokoto-mania.com", true },
{ "hitokoto.cn", true },
{ "hitomecha.com", true },
- { "hitrek.ml", true },
{ "hitter-lauzon.com", true },
{ "hitter.family", true },
{ "hitterfamily.com", true },
@@ -17418,6 +18087,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hjw-kunstwerk.de", true },
{ "hjyl9898.com", true },
{ "hk.search.yahoo.com", false },
+ { "hkas.org.hk", true },
{ "hkbsurgery.com", true },
{ "hkdobrev.com", true },
{ "hkr.at", true },
@@ -17425,7 +18095,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hks.pw", true },
{ "hktkl.com", true },
{ "hkustmbajp.com", true },
- { "hl7999.com", true },
{ "hl8999.com", true },
{ "hlavacek.us", true },
{ "hlavi.hu", true },
@@ -17435,6 +18104,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hlidacnajemneho.cz", true },
{ "hlin.cloud", true },
{ "hlinformatics.nl", true },
+ { "hloe0xff.ru", true },
{ "hlsmandarincentre.com", true },
{ "hlucas.de", true },
{ "hm773.net", true },
@@ -17453,6 +18123,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hoaas.no", true },
{ "hoahau.org", true },
{ "hoarding.me", true },
+ { "hoathienthao.com", true },
+ { "hoathienthao.vn", true },
{ "hobby-drechselei.de", true },
{ "hobbyspeed.com", true },
{ "hochdorf-tennis.de", true },
@@ -17465,6 +18137,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hochzeitsplanerin-hamburg.de", true },
{ "hockeyapp.ch", true },
{ "hockeymotion.ch", true },
+ { "hoctap.net", true },
{ "hodgephotography.com", true },
{ "hodnos.com", true },
{ "hoe.re", true },
@@ -17490,15 +18163,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hohenleimbach.de", true },
{ "hoikuen-now.top", true },
{ "hoiquanadida.com", true },
- { "hoish.in", true },
+ { "hoish.in", false },
{ "hoken-wakaru.jp", true },
- { "hokieprivacy.org", true },
{ "hokioisecurity.com", true },
- { "holad.de", true },
+ { "hokung.xyz", true },
{ "holadinero.es", true },
{ "holadinero.mx", true },
{ "holboxwhalesharktours.com", true },
{ "holebedeljek.hu", true },
+ { "holidayacademy.co.uk", true },
{ "holidaysportugal.eu", true },
{ "holisticacupuncture.com.au", true },
{ "holistichealer.in", true },
@@ -17544,7 +18217,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "homatism.com", true },
{ "hombresconestilo.com", true },
{ "home-handymen.co.uk", true },
- { "homeautomated.com", true },
{ "homebasedsalons.com.au", true },
{ "homebodyalberta.com", true },
{ "homecareassociatespa.com", true },
@@ -17553,8 +18225,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "homegardeningforum.com", true },
{ "homegardenresort.nl", true },
{ "homegreenmark.com", true },
- { "homehuntertoronto.com", true },
{ "homeimagician.com.au", true },
+ { "homelabquotes.com", true },
{ "homem-viril.com", true },
{ "homeodynamics.com", true },
{ "homeofjones.net", true },
@@ -17577,7 +18249,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "homophoni.com", true },
{ "hompus.nl", false },
{ "homunyan.com", true },
- { "homyremedies.com", true },
{ "hon-matsuba.co.jp", true },
{ "honda-centrum.cz", true },
{ "hondart.cz", true },
@@ -17592,13 +18263,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hong.io", true },
{ "hongoi.com", true },
{ "honkion.net", true },
+ { "honoka-seitai.jp", true },
{ "honovere.de", true },
{ "hontoir.eu", true },
{ "hoodtrader.com", true },
{ "hoofddorp-centraal.nl", true },
{ "hookany.com", true },
{ "hookbin.com", true },
- { "hoooc.com", true },
+ { "hookupndate.com", true },
{ "hooowl.com", true },
{ "hoop.la", true },
{ "hoopertechnicalsolutions.com", true },
@@ -17612,7 +18284,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hopconseils.ch", true },
{ "hopconseils.com", true },
{ "hope-line-earth.jp", true },
- { "hopemeet.info", true },
+ { "hopecbd.com", true },
{ "hopemeet.me", true },
{ "hopesanddreams.org.uk", true },
{ "hopla.sg", true },
@@ -17631,16 +18303,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "horeco.com", true },
{ "horeizai.net", true },
{ "horizonhomes-samui.com", true },
- { "horizonlawncare.tk", true },
- { "horizonresourcesinc.com", true },
{ "horizonshypnosis.ca", true },
+ { "horizzon.cloud", true },
{ "horn.co", true },
{ "hornertranslations.com", true },
- { "hornyforhanzo.com", true },
{ "horodance.dk", true },
{ "horrell.ca", true },
+ { "horrendous-servers.com", true },
{ "horror-forum.de", true },
{ "horrormovies.gr", true },
+ { "horsegateway.com", true },
{ "horsehunter.co.uk", true },
{ "horstmanshof.eu", true },
{ "horton-brasses.com", true },
@@ -17656,6 +18328,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hospitality-colleges.com", true },
{ "hostadvice.com", true },
{ "hostarea51.com", true },
+ { "hostco.nl", true },
{ "hosteasy.nl", false },
{ "hostedcomments.com", true },
{ "hostedtalkgadget.google.com", true },
@@ -17665,6 +18338,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hostinecpodlipou.cz", true },
{ "hosting-swiss.ch", true },
{ "hostingactive.it", true },
+ { "hostingalternative.com", true },
{ "hostinghelp.guru", true },
{ "hostinginnederland.nl", true },
{ "hostinglogin.net", true },
@@ -17673,7 +18347,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hostingsams.com", true },
{ "hostingsolutions.cz", true },
{ "hostix.de", true },
- { "hostma.ma", true },
{ "hostmark.pl", true },
{ "hostme.co.il", true },
{ "hostmijnpagina.nl", true },
@@ -17691,6 +18364,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hotel-le-vaisseau.ch", true },
{ "hotel-pension-sonnalp.eu", true },
{ "hotel-rosner.at", true },
+ { "hotel1926.com.mt", true },
{ "hotelamgarnmarkt.at", false },
{ "hotelarevalo.com", true },
{ "hotelbonacabol.com", true },
@@ -17780,10 +18454,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hqhh.org", true },
{ "hquest.pro.br", true },
{ "hqwebhosting.tk", false },
- { "hqy.moe", true },
{ "hr-tech.shop", true },
{ "hrabogados.com", true },
{ "hraesvelg.net", true },
+ { "hrafnkellbaldurs.com", true },
{ "hranicka.cz", true },
{ "hrbatypes.cz", true },
{ "hrbl.lc", true },
@@ -17805,7 +18479,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hs-group.net", true },
{ "hs-umformtechnik.de", true },
{ "hsappstatic.net", true },
+ { "hschen.top", false },
{ "hscorp.de", true },
+ { "hsg-kreuzberg.de", true },
{ "hsivonen.com", true },
{ "hsivonen.fi", true },
{ "hsivonen.iki.fi", true },
@@ -17819,6 +18495,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hstspreload.com", true },
{ "hstspreload.de", true },
{ "hstspreload.org", true },
+ { "hsuan.pw", true },
{ "hszemi.de", true },
{ "ht.mk", true },
{ "htaccessbook.com", true },
@@ -17857,6 +18534,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hu8777.com", true },
{ "hu8bet.com", true },
{ "hu8hu8.com", true },
+ { "huabianwa.com", true },
{ "huagati.com", true },
{ "huahinpropertylisting.com", true },
{ "hualao.co", true },
@@ -17874,7 +18552,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "huangjia99.com", true },
{ "huangjiaint.com", true },
{ "huangjingjing.com", true },
- { "huangliangbo.com", true },
+ { "huangqifu.com", true },
{ "huangzenghao.cn", false },
{ "huaqian.art", true },
{ "huashan.co.uk", true },
@@ -17901,16 +18579,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "huffsinsurance.com", true },
{ "hughtodd.ink", true },
{ "hugi.is", true },
- { "hugizrecords.com", true },
{ "huglen.info", true },
{ "hugo.pro", true },
{ "hugo6.com", true },
{ "hugofs.com", true },
{ "hugolynx.fr", true },
+ { "hugonote.ml", true },
{ "huguesblanchard.paris", true },
{ "huguesditciles.com", true },
{ "huh.gdn", true },
- { "huh.today", true },
+ { "huh.today", false },
{ "huihui.moe", true },
{ "huininga.com", true },
{ "huininga.nl", true },
@@ -17977,6 +18655,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hundhausen.de", true },
{ "hundter.com", true },
{ "hunger.im", true },
+ { "huniverse.co", true },
{ "hunstoncanoeclub.co.uk", true },
{ "hunter-read.com", true },
{ "hunter.io", true },
@@ -17987,9 +18666,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "huntshomeinspections.com", false },
{ "huntsmansecurity.com", true },
{ "huntsvillecottage.ca", true },
+ { "huoduan.com", true },
{ "huonit.com.au", true },
{ "hup.hu", true },
- { "hupp.se", true },
{ "hurd.is", true },
{ "huren.nl", true },
{ "huroji.com", true },
@@ -18002,7 +18681,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hussam.eu.org", true },
{ "hustlehope.com", true },
{ "hustunique.com", true },
- { "huto.ml", true },
{ "huurwoordenaar.nl", true },
{ "huutonauru.net", true },
{ "huwcbjones.co.uk", true },
@@ -18039,6 +18717,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hydro17.com", true },
{ "hydroagro.pl", true },
{ "hydrographicsocietybenelux.eu", true },
+ { "hydronicheatingaustralia.com.au", true },
{ "hydroturbine.info", true },
{ "hydrozone.fr", true },
{ "hyec.jp", true },
@@ -18056,6 +18735,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hyperalgesia.com", true },
{ "hyperautomotive.com.au", true },
{ "hyperbolic-mayonnaise-interceptor.ovh", true },
+ { "hyperd.sh", true },
{ "hyperion.io", true },
{ "hyperreal.biz", true },
{ "hypersomnia.com", true },
@@ -18070,10 +18750,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "hypothyroidmom.com", true },
{ "hyr.mn", true },
{ "hysh.jp", true },
+ { "hytale.com", true },
+ { "hytzongxuan.com", true },
{ "hyundai.no", true },
{ "hyvanilmankampaamo.fi", true },
{ "hyvanolonterapia.fi", true },
{ "hyvinvointineuvoja.fi", true },
+ { "hyyen.com", true },
{ "hztgzz.com", true },
{ "i--b.com", true },
{ "i-0v0.in", true },
@@ -18081,11 +18764,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "i-geld.de", true },
{ "i-hakul.net", true },
{ "i-logic.co.jp", false },
- { "i-meto.com", true },
{ "i-office.com.vn", true },
{ "i-proswiss.com", true },
{ "i-red.info", true },
- { "i-scream.space", true },
{ "i-sports.cz", true },
{ "i-stuff.site", true },
{ "i-telligence.de", true },
@@ -18097,8 +18778,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "i2gether.org.uk", true },
{ "i5y.co.uk", true },
{ "i5y.org", true },
- { "i66.me", true },
{ "i879.com", true },
+ { "i95.me", false },
{ "i9s.in", true },
{ "ia.cafe", true },
{ "ia.net", true },
@@ -18108,7 +18789,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "iaeste.no", true },
{ "iaeste.or.jp", true },
{ "iaf.gov", true },
- { "iahemobile.net", false },
+ { "iahemobile.net", true },
{ "iainsimms.co.uk", true },
{ "iainsimms.com", true },
{ "iainsimms.me", true },
@@ -18118,7 +18799,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "iam.soy", true },
{ "iamanewme.com", true },
{ "iambozboz.co.uk", true },
- { "iamcarrico.com", true },
{ "iamcryptoki.com", true },
{ "iamhansen.xyz", true },
{ "iaminashittymood.today", true },
@@ -18160,6 +18840,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ibps-recruitment.in", true },
{ "ibrainmedicine.org", true },
{ "ibrom.eu", true },
+ { "ibsociety.com", true },
{ "ibstyle.tk", true },
{ "ibuki.run", true },
{ "ibutikk.no", true },
@@ -18173,6 +18854,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "icarlos.net", true },
{ "icasture.top", true },
{ "iccpublisher.com", true },
+ { "icdp.org.ua", true },
{ "ice.xyz", true },
{ "iceberg.academy", true },
{ "icebook.co.uk", true },
@@ -18182,6 +18864,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "icetiger.eu", true },
{ "ich-hab-die-schnauze-voll-von-der-suche-nach-ner-kurzen-domain.de", true },
{ "ich-tanke.de", true },
+ { "ichasco.com", true },
{ "ichbinein.org", true },
{ "ichbinkeinreh.de", true },
{ "ichmachdas.net", true },
@@ -18190,7 +18873,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "icloudlogin.com", true },
{ "icmhd.ch", true },
{ "icmp2018.org", true },
+ { "icmshoptrend.com", false },
{ "icnsoft.cf", true },
+ { "icnsoft.ga", true },
{ "icnsoft.ml", true },
{ "icobench.com", true },
{ "icodeconnect.com", true },
@@ -18209,7 +18894,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ict-radar.nl", true },
{ "ictcareer.ch", true },
{ "ictl.eu", true },
+ { "ictoniolopisa.it", true },
{ "ictradar.com", true },
+ { "ictussistemas.com.br", true },
{ "icyapril.com", true },
{ "icymint.me", true },
{ "icynet.eu", true },
@@ -18220,24 +18907,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "id.search.yahoo.com", false },
{ "id0-rsa.pub", true },
{ "id7.fr", true },
- { "idaeus.eu", true },
- { "idafauziyah.com", true },
{ "idahoansforliberty.net", true },
{ "idarv.com", true },
{ "idaspis.com", true },
{ "idatha.de", true },
{ "idc-business.be", true },
{ "idconsult.nl", true },
+ { "ideal-envelopes.co.uk", false },
+ { "idealcontabilidade.net", true },
{ "idealimplant.com", true },
- { "idealinflatablehire.co.uk", true },
{ "idealninajemce.cz", false },
- { "idealsegurancaeletronica.com.br", false },
+ { "idealsegurancaeletronica.com.br", true },
{ "idealtruss.com", true },
{ "idealtruss.com.tw", true },
{ "idealwhite.space", true },
{ "ideaman924.com", true },
{ "ideasenfoto.com", true },
{ "ideashop.com", true },
+ { "ideatarmac.com", true },
{ "ideaweb.de", true },
{ "idenamaislami.com", true },
{ "idensys.nl", true },
@@ -18269,8 +18956,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "idolf.dk", true },
{ "idolish7.fun", false },
{ "idolknow.com", true },
- { "idolshop.dk", true },
- { "idolshop.me", true },
{ "idontplaydarts.com", true },
{ "idoparadoxon.hu", true },
{ "idranktoomuch.coffee", true },
@@ -18280,33 +18965,31 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "idraulico.roma.it", true },
{ "idrinktoomuch.coffee", true },
{ "idrissi.eu", true },
+ { "idroserviceweb.com", true },
{ "idrottsnaprapaten.se", true },
{ "idrycleaningi.com", true },
{ "idtheft.gov", true },
{ "idubaj.cz", true },
{ "idunno.org", true },
+ { "idvl.de", true },
{ "idxforza.com", true },
{ "ie.search.yahoo.com", false },
{ "iea-annex61.org", true },
- { "ieedes.com", true },
{ "ieeedeis.org", true },
{ "ieeesb.nl", true },
{ "ieeesbe.nl", true },
{ "ieeespmb.org", true },
{ "ieffalot.me", true },
- { "ieji.de", true },
+ { "ieji.de", false },
{ "iemb.tk", true },
{ "ienakanote.com", false },
{ "ies-italia.it", true },
{ "iesonline.co.in", true },
{ "ieval.ro", true },
- { "iewar.com", true },
+ { "ifan.ws", true },
{ "ifangpei.cn", true },
{ "ifangpei.com.cn", true },
- { "ifcfg.jp", true },
{ "ifelse.io", true },
- { "ifengge.cn", true },
- { "ifengge.me", true },
{ "ifgcdn.com", true },
{ "ifibe.com", true },
{ "ifightsurveillance.com", true },
@@ -18317,6 +19000,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ifort.fr", true },
{ "ifosep.fr", true },
{ "ifoss.me", true },
+ { "ifreetion.cn", true },
+ { "ifreetion.com", true },
{ "ifsac.org", true },
{ "ifsclist.com", true },
{ "ifsr.de", true },
@@ -18328,12 +19013,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ig.com", true },
{ "iga-semi.jp", true },
{ "igcc.jp", true },
+ { "igdn.de", true },
{ "igeh-immo.at", true },
{ "igglabs.com", true },
{ "iggprivate.com", true },
{ "iggsoft.com", true },
{ "iggsoftware.com", true },
- { "igiftcards.de", true },
{ "igimusic.com", true },
{ "igk.nz", true },
{ "igm-be.ch", true },
@@ -18351,14 +19036,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "igorrealestate.com", true },
{ "igorw.org", true },
{ "igotoffer.com", false },
+ { "igrarium.com.ua", true },
{ "igrivi.com", true },
{ "igsmgmt.com", true },
{ "iguana.com.ec", false },
+ { "igva.or.kr", true },
{ "ih8sn0w.com", true },
- { "ihacklabs.com", true },
+ { "ihacklabs.com", false },
{ "ihakkitekin.com", true },
+ { "ihc.im", true },
{ "ihcprofile.com", true },
- { "iheartmary.org", true },
{ "ihkk.net", true },
{ "ihls.stream", true },
{ "ihls.world", true },
@@ -18374,13 +19061,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ii74.com", true },
{ "iiit.pl", true },
{ "iimarckus.org", true },
+ { "iinf.in", true },
{ "iiong.com", true },
{ "iirii.com", true },
{ "iix.se", true },
+ { "iiyama-bg.com", true },
{ "ijm.io", true },
{ "ijohan.nl", true },
{ "ijsbaanwitten.nl", true },
{ "ijsblokjesvormen.nl", true },
+ { "ijsclubdwarsgracht.nl", true },
{ "ijsclubtilburg.nl", true },
{ "ijsclubwanneperveen.nl", true },
{ "ijunohana.jp", true },
@@ -18395,19 +19085,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ikespta.com", true },
{ "ikeyless.com", true },
{ "ikigaiweb.com", true },
- { "ikiler.com", true },
{ "ikinokori-marketing.com", true },
{ "ikk.me", true },
+ { "ikkakujuku.work", true },
{ "ikkatsu-satei.jp", true },
{ "ikkbb.de", true },
{ "ikke-coach.nl", true },
{ "ikkev.de", true },
{ "ikkoku.de", true },
{ "iklive.org", false },
+ { "ikmx.net", true },
{ "ikraenglish.com", false },
{ "iktisatbank.com", true },
{ "ikulist.me", true },
{ "ikumi.us", true },
+ { "ikuuuu.com", true },
{ "ikvts.de", true },
{ "ikwilthepiratebay.org", true },
{ "ikxkx.com", true },
@@ -18419,11 +19111,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ilamparas.com.ve", true },
{ "ilamparas.mx", true },
{ "ilard.fr", true },
+ { "ilazycat.com", true },
{ "ile-kalorii.pl", true },
{ "ile-sapporo.jp", true },
{ "ileci.de", true },
{ "ilektronika-farmakeia-online.gr", true },
- { "ilemonrain.com", true },
+ { "ilemonrain.com", false },
{ "ilformichiere.com", true },
{ "ilhan.name", true },
{ "ilhansubasi.com", true },
@@ -18451,6 +19144,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "illusionunlimited.com", true },
{ "illustrate.biz", true },
{ "illuxat.com", true },
+ { "ilmainensanakirja.fi", true },
{ "ilmataat.ee", true },
{ "ilmiobusinessonline.it", true },
{ "ilmiogiardiniere.it", true },
@@ -18474,6 +19168,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "im4h.info", true },
{ "im66.net", true },
{ "ima-tourcoing.fr", true },
+ { "ima.re", true },
{ "imacs.org", true },
{ "image-drive.de", true },
{ "imagebin.ca", true },
@@ -18492,15 +19187,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "imanesdeviaje.com", true },
{ "imanolbarba.net", true },
{ "imap2imap.de", true },
+ { "imaple.org", true },
{ "imarkethost.co.uk", true },
{ "imask.ml", true },
{ "imawhale.com", true },
{ "imbianchino.roma.it", true },
{ "imbushuo.net", true },
+ { "imcsi.cn", true },
{ "imcsx.co", true },
{ "imdemos.com", true },
{ "ime.moe", true },
- { "imedes.de", true },
{ "imediafly.com", true },
{ "imedikament.de", true },
{ "imeds.pl", true },
@@ -18518,11 +19214,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "imguploaden.nl", true },
{ "imhua.com", true },
{ "imi-rhapsody.eu", true },
- { "iminshell.com", true },
+ { "iminshell.com", false },
{ "imirhil.fr", true },
{ "imitza.com", true },
{ "imjad.cn", true },
{ "imjo.in", true },
+ { "imjustcreative.co.uk", true },
{ "imjustcreative.com", true },
{ "imkerei-freilinger.de", false },
{ "imkerverein-moenchswald.de", true },
@@ -18531,17 +19228,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "immatix.xyz", true },
{ "immersa.co.uk", true },
{ "immersion-pictures.com", true },
- { "immersionwealth.com", true },
{ "immigrantdad.com", true },
{ "immigrationdirect.com.au", true },
{ "immo-agentur.com", false },
{ "immo-passion.net", true },
- { "immo-vk.de", true },
{ "immobilien-badlippspringe.de", true },
{ "immobilien-in-istanbul.de", true },
{ "immobilien-zirm.de", true },
{ "immobiliengutachter-holland.de", true },
- { "immobilier-nice.fr", true },
{ "immobilier92.net", true },
{ "immobiza.com", false },
{ "immortal.run", true },
@@ -18559,6 +19253,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "impendulo.org", true },
{ "impera.at", true },
{ "imperial-legrand.com", true },
+ { "imperialinfosys.com", true },
{ "imperialmiami.com", true },
{ "imperiodigital.online", true },
{ "imperiumglass.com.au", true },
@@ -18584,19 +19279,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "improfestival.ee", true },
{ "improklinikken.dk", true },
{ "improved-madness.de", true },
+ { "improvision.eu", true },
{ "impulsionsa.com", true },
{ "impyus.com", true },
{ "imququ.com", true },
{ "imreh.net", true },
- { "imrejonk.nl", true },
{ "imrunner.com", true },
{ "imrunner.ru", true },
{ "ims-sargans.ch", true },
{ "imscompany.com", true },
{ "imtikai.ml", true },
+ { "imtikaib.ml", true },
{ "imwalking.de", true },
{ "imwnk.cn", true },
{ "imydl.tech", true },
+ { "imyjy.cn", true },
{ "imyrs.cn", true },
{ "imyunya.com", true },
{ "imyvm.com", true },
@@ -18615,6 +19312,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "inbox-group.com", true },
{ "inbox.google.com", true },
{ "inbulgaria.info", true },
+ { "inc.wf", true },
{ "incarna.co", true },
{ "incco.ir", true },
{ "incert.cn", true },
@@ -18641,7 +19339,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "indecipherable.info", true },
{ "independencerecovery.com", true },
{ "independent-operators.com", true },
- { "index-games.com", true },
+ { "independenttravelcats.com", true },
{ "index-mp3.com", true },
{ "indiaflowermall.com", true },
{ "indian-elephant.com", true },
@@ -18649,8 +19347,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "indianaberry.com", true },
{ "indianafoundationpros.com", true },
{ "indianamoldrepairpros.com", true },
- { "indianapolislocksmithinc.com", true },
{ "indianawaterdamagerepairpros.com", true },
+ { "indiansmartpanel.com", true },
{ "indiatrademarkwatch.com", true },
{ "indiayogastudio.net", true },
{ "indicateurs-flash.fr", true },
@@ -18658,13 +19356,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "indiecongdr.it", true },
{ "indiegame.space", true },
{ "indievelopment.nl", true },
- { "indigitalagency.com", true },
{ "indigoinflatables.com", true },
+ { "indigolawnscape.net", true },
{ "indigosakura.com", true },
{ "indigotreeservice.com", true },
{ "indika.pe", true },
{ "indio.co.jp", true },
{ "inditip.com", true },
+ { "indochina.io", true },
{ "indogermanstartup.com", true },
{ "indoorcomfortteam.com", true },
{ "indovinabank.com.vn", true },
@@ -18684,6 +19383,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "inesta.nl", true },
{ "inet.se", true },
{ "inethost.eu", true },
+ { "inetpub.cn", true },
{ "inetserver.eu", true },
{ "inetsoftware.de", true },
{ "inf-fusion.ca", true },
@@ -18693,7 +19393,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "inffin-portal.de", true },
{ "inffin-tec.de", true },
{ "inficom.org", true },
- { "infinite.hosting", true },
{ "infinitegroup.info", true },
{ "infinitescript.com", true },
{ "infinitiofallentownparts.com", true },
@@ -18702,7 +19401,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "infinitomaisum.com", true },
{ "infinitybas.com", true },
{ "infinitybc.se", true },
- { "infinityengine.org", true },
{ "infinityepos.co.uk", true },
{ "infirmiere-canadienne.com", true },
{ "infirmieredevie.ch", true },
@@ -18710,11 +19408,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "inflatablesny.com", true },
{ "inflatadays.co.uk", true },
{ "inflatamania.com", true },
+ { "inflated.cloud", true },
{ "inflationstation.net", true },
{ "inflexsys.com", true },
- { "influencerchampions.com", true },
{ "influo.com", true },
- { "infmed.com", true },
{ "info-beamer.com", true },
{ "info-d-74.com", true },
{ "info-screen-usercontent.me", true },
@@ -18722,7 +19419,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "info-screw.com", true },
{ "infobae.com", true },
{ "infobrain.net", true },
- { "infocity-tech.fr", true },
+ { "infocoin.es", true },
{ "infocommsociety.com", true },
{ "infocon.org", true },
{ "infocusvr.net", true },
@@ -18736,7 +19433,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "infopulsa.com", true },
{ "infopuntzorg.nl", true },
{ "infor-allaitement.be", true },
- { "inforaga.com", true },
{ "informaciondeciclismo.com", true },
{ "informatiebeveiliging.nl", true },
{ "informatik-handwerk.de", true },
@@ -18749,6 +19445,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "infosec.pizza", true },
{ "infosec.wiki", true },
{ "infosectalks.com", true },
+ { "infosectekniques.com", true },
{ "infosenior.ch", true },
{ "infotainworld.com", true },
{ "infotolium.com", false },
@@ -18757,17 +19454,32 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "infovision-france.com", true },
{ "infoweb.ee", true },
{ "infra.land", true },
- { "infra.press", true },
+ { "infraball.com", true },
{ "infrabeep.com", true },
+ { "infrabeta.com", true },
+ { "infrabold.com", true },
+ { "infraboom.com", true },
{ "infraclass.com", true },
+ { "infraclip.com", true },
+ { "infracron.com", true },
+ { "infradart.com", true },
+ { "infradisk.com", true },
{ "infradrop.com", true },
{ "infrafire.com", true },
{ "infraflip.com", true },
{ "infraflux.com", true },
+ { "infrafuse.com", true },
{ "infrafusion.com", true },
+ { "infralira.com", true },
{ "infralist.com", true },
+ { "infraloon.com", true },
+ { "inframake.com", true },
+ { "inframeet.com", true },
+ { "inframenu.com", true },
{ "inframetro.com", true },
{ "inframint.com", true },
+ { "infraname.com", true },
+ { "infranest.com", true },
{ "infranium.com", true },
{ "infranium.eu", true },
{ "infranium.info", true },
@@ -18785,18 +19497,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "infrarank.net", true },
{ "infraspin.com", true },
{ "infratank.com", true },
+ { "infratask.com", true },
{ "infrathink.com", true },
+ { "infratrip.com", true },
+ { "infravibe.com", true },
{ "infravideo.com", true },
{ "infrazine.com", true },
+ { "infruction.com", true },
{ "infuzeit.com.au", true },
- { "ing-buero-junk.de", true },
{ "ingatlanjogaszok.hu", true },
{ "ingatlanneked.hu", true },
{ "ingatlanrobot.hu", true },
{ "ingber.com", true },
{ "inge-r.nl", true },
{ "ingeeibach.de", true },
- { "ingenium.si", true },
{ "ingenius.ws", true },
{ "ingerhy.com", true },
{ "ingi.ga", true },
@@ -18807,16 +19521,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ingolonde.pw", true },
{ "ingoschlueter.de", true },
{ "ingredientdaddy.ro", true },
+ { "ingridbai.me", true },
{ "inhaltsangabe.de", true },
{ "inheritestate.com", true },
{ "inhouseents.co.uk", true },
+ { "iniiter.com", true },
{ "inima.org", true },
{ "inios.fr", true },
{ "inishbofin.ie", true },
{ "initq.net", true },
{ "initramfs.io", true },
- { "initrd.net", true },
{ "inixal.com", true },
+ { "injigo.com", false },
+ { "injurylawyer.com", true },
{ "ink.horse", true },
{ "inkable.com.au", true },
{ "inkeliz.com", true },
@@ -18832,7 +19549,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "inmatefinancial.com", true },
{ "inmateintake.com", true },
{ "inmobillium.fr", true },
- { "inmoodforsex.com", true },
{ "inmusrv.de", true },
{ "innerfence.com", true },
{ "innerlightcrystals.co.uk", true },
@@ -18855,13 +19571,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "innovation-workshop.ro", true },
{ "innovation.gov", false },
{ "innover.se", true },
+ { "innovere.co.uk", true },
{ "innovum.cz", false },
{ "innsalzachsingles.de", true },
{ "innwan.com", true },
{ "inoa8.com", true },
{ "inobun.jp", true },
- { "inovat.ma", true },
{ "inovatecsystems.com", true },
+ { "inoxandco.com", true },
+ { "inoxdesign.fr", true },
+ { "inoxdesign.pro", true },
+ { "inoxmavang.net", true },
{ "inpas.co.uk", true },
{ "inputmag.com", true },
{ "inquant.de", true },
@@ -18884,9 +19604,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "insidebedroom.com", true },
{ "insidesolutions.nl", true },
{ "insidethefirewall.tk", true },
- { "insightera.co.th", true },
- { "insighti.com", true },
- { "insighti.eu", true },
{ "insighti.org", true },
{ "insighti.sk", true },
{ "insignificant.space", true },
@@ -18896,27 +19613,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "insolent.ch", true },
{ "insolved.com", true },
{ "insping.com", true },
- { "inspirationalquotesuk.co.uk", true },
- { "inspired-creations.co.za", true },
+ { "inspiratienodig.nl", true },
{ "inspired-lua.org", true },
+ { "inspiredlife.fun", true },
{ "inspiredrealtyinc.com", true },
{ "insrt.uk", true },
{ "insside.net", true },
{ "instafind.nl", true },
+ { "instafuckfriend.com", true },
{ "instagram-atom.appspot.com", true },
{ "instagrammernews.com", true },
{ "instagramtweet.com", true },
+ { "instahub.net", true },
{ "installatietechniekgresnigt.nl", true },
{ "installgentoo.net", true },
{ "instamojo.com", true },
+ { "instant-clearance-sale.co.uk", true },
{ "instant-thinking.de", true },
{ "instant.io", true },
{ "instantkhabar.com", true },
- { "instantluxe.cn", true },
- { "instantluxe.co.uk", true },
- { "instantluxe.com", true },
- { "instantluxe.de", true },
- { "instantluxe.it", true },
{ "instantphotocamera.com", true },
{ "instantphotoprinter.com", true },
{ "instava.cz", true },
@@ -18925,20 +19640,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "instela.com", true },
{ "instelikes.com.br", true },
{ "instics.com", true },
- { "instinctive.io", true },
{ "instinctiveads.com", true },
{ "institut-confucius-montpellier.org", true },
{ "institutmaupertuis.hopto.org", true },
{ "institutogiuseppe.com", true },
{ "institutogiuseppe.com.ar", true },
- { "institutolancaster.com", true },
+ { "institutomaritimocolombiano.com", true },
{ "instrumart.ru", false },
{ "insult.es", true },
{ "insurance321.com", true },
{ "insureon.com", true },
{ "insurgentsmustdie.com", true },
{ "int64software.com", true },
- { "intae.it", true },
{ "intafe.co.jp", true },
{ "intal.info", true },
{ "intarweb.ca", true },
@@ -18946,6 +19659,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "intasky.sk", true },
{ "integralblue.com", true },
{ "integralkk.com", true },
+ { "integrata.de", true },
{ "integratedintegrations.xyz", true },
{ "integratedmedicalonline.com", true },
{ "integrateur-web-paris.com", true },
@@ -18975,21 +19689,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "intensifyrsvp.com.au", true },
{ "inter-corporate.com", true },
{ "inter-culinarium.com", true },
- { "interabbit.co", true },
+ { "interabbit.com", true },
{ "interaffairs.com", true },
{ "interaktiva.fi", true },
{ "interasistmen.se", true },
{ "interchangedesign.com", true },
+ { "intercom.com", true },
+ { "intercom.io", true },
+ { "interessengemeinschaft-pregelstrasse.tk", true },
{ "interessiert-uns.net", true },
- { "interfesse.net", true },
{ "interflores.com.br", true },
{ "interfug.de", true },
{ "intergozd.si", true },
- { "interguard.net", true },
{ "interiery-waters.cz", true },
{ "interimages.fr", true },
{ "interior-design-colleges.com", true },
- { "interiordesignsconcept.com", true },
{ "interiorprofesional.com.ar", true },
{ "interisaudit.com", true },
{ "interlijn.nl", true },
@@ -19004,6 +19718,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "international-nash-day.com", true },
{ "internationalfashionjobs.com", true },
{ "internationalschool.it", true },
+ { "internationalstudentassociation.com", true },
{ "internationaltalento.it", true },
{ "internect.co.za", true },
{ "internet-aukcion.info", true },
@@ -19015,6 +19730,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "internetbusiness-howto.com", true },
{ "internetcom.jp", true },
{ "internetfonden.se", true },
+ { "internetgardener.co.uk", true },
{ "internethealthreport.org", true },
{ "internethering.de", true },
{ "internetinhetbuitengebied.nl", true },
@@ -19030,7 +19746,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "interpol.gov", true },
{ "interracial.dating", true },
{ "interseller.io", true },
- { "interserved.com", false },
{ "interstateautomotiveinc.com", true },
{ "intertime.services", true },
{ "interview-suite.com", true },
@@ -19038,7 +19753,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "intheater.de", true },
{ "inthepicture.com", true },
{ "inthouse.cloud", true },
- { "intimastoreatacado.com.br", true },
{ "intita.com", true },
{ "intl-webs.com", true },
{ "intmissioncenter.org", true },
@@ -19054,8 +19768,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "intraobes.com", true },
{ "intrasoft.com.au", true },
{ "intraxia.com", true },
+ { "intropickup.ru", true },
{ "intrp.net", true },
- { "intune.life", true },
{ "intvonline.com", true },
{ "intxt.net", true },
{ "inumcoeli.com.br", true },
@@ -19075,10 +19789,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "inventtheworld.com.au", true },
{ "inventum.cloud", true },
{ "inverselink-user-content.com", true },
- { "inversioneseconomicas.com", true },
{ "investarholding.nl", true },
{ "investigatore.it", true },
{ "investigazionimoretti.it", true },
+ { "investinturkey.com.tr", true },
{ "investir.ch", true },
{ "investor-academy.jp", true },
{ "investor.gov", true },
@@ -19175,8 +19889,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "iprcenter.gov", true },
{ "ipresent.com", true },
{ "iprim.ru", true },
+ { "ipripojeni.cz", true },
{ "iproducemusic.com", true },
{ "ipsec.pl", true },
+ { "ipso.paris", true },
{ "ipssl.li", true },
{ "ipstream.it", true },
{ "ipswitch.com.tw", true },
@@ -19220,14 +19936,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "irish.radio", true },
{ "irishradioplayer.radio", true },
{ "irisjieun.com", true },
+ { "irismq.fr", true },
{ "irkfap.com", true },
{ "irland-firma.com", true },
+ { "irlfp.com", true },
{ "irmag.ru", true },
{ "irmgard-woelfle.de", true },
{ "irmgardkoch.com", true },
{ "iro-iro.xyz", true },
+ { "irodorinet.com", true },
{ "iroise.ch", true },
- { "ironbelly.pro", true },
{ "ironcarnival.com", true },
{ "ironfistdesign.com", true },
{ "ironhide.de", true },
@@ -19239,7 +19957,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "is-going-to-rickroll.me", true },
{ "is-sw.net", true },
{ "isaac.world", true },
- { "isaacdgoodman.com", true },
+ { "isaacdgoodman.com", false },
{ "isaackhor.com", true },
{ "isaacman.tech", true },
{ "isaacmorneau.com", true },
@@ -19255,6 +19973,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "isamiok.com", true },
{ "isara.com", true },
{ "isarklinikum.de", true },
+ { "isaropiping.fr", true },
{ "isastylish.com", true },
{ "isavings.com", true },
{ "isayoga.de", true },
@@ -19265,15 +19984,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "iscert.org", true },
{ "isdn.jp", true },
{ "isecrets.se", true },
+ { "iservicio.com.mx", true },
{ "iservicio.mx", true },
- { "iseulde.com", true },
{ "isg-tech.com", true },
{ "isgp-studies.com", true },
{ "ishamf.com", true },
{ "ishangirdhar.com", true },
{ "ishiharaken.com", true },
+ { "ishland.com", true },
{ "ishome.org", true },
{ "ishtarfreya.com", true },
+ { "isif-ostewg.org", true },
{ "isil.fi", true },
{ "isimonbrown.co.uk", true },
{ "isincheck.com", true },
@@ -19283,6 +20004,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "isitchristmas.com", true },
{ "isitcoffeetime.com", true },
{ "isitdoneyet.gov", true },
+ { "isitef.com", true },
{ "isitpatchtuesday.com", true },
{ "isitrest.info", true },
{ "isitup.org", true },
@@ -19291,7 +20013,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "iskaz.rs", true },
{ "iskogen.nu", true },
{ "islam.si", true },
- { "islamonline.net", true },
+ { "islamicmarkets.com", true },
{ "islandhosting.com", true },
{ "islavolcan.cl", true },
{ "isletech.net", true },
@@ -19306,6 +20028,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ismywebsitepenalized.com", true },
{ "isn.cz", true },
{ "iso27032.com", true },
+ { "isocom.eu", true },
{ "isognattori.com", true },
{ "isolta.com", true },
{ "isolta.de", true },
@@ -19313,7 +20036,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "isolta.fi", true },
{ "isolta.lv", true },
{ "isolta.se", true },
- { "isondo.com", true },
{ "isonet.fr", true },
{ "isopres.de", true },
{ "isotope.gov", true },
@@ -19348,7 +20070,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "istheservicedown.co.uk", true },
{ "istheservicedown.com", true },
{ "istheservicedowncanada.com", true },
- { "isthisus.org", true },
{ "isthnew.com", true },
{ "istogether.com", true },
{ "istore.lt", true },
@@ -19357,6 +20078,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "istschonsolangeinrente.de", true },
{ "istsi.org", true },
{ "isuzupartscenter.com", true },
+ { "isv.online", true },
{ "isvbscriptdead.com", true },
{ "isvsecwatch.org", true },
{ "isyu.xyz", true },
@@ -19387,7 +20109,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "it-tekniker.nu", true },
{ "it-ti.me", true },
{ "it-uws.com", true },
- { "it-world.eu", true },
{ "it.search.yahoo.com", false },
{ "it1b.com", true },
{ "itactiq.com", true },
@@ -19408,6 +20129,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "itbox.cl", true },
{ "itchy.nl", true },
{ "itcko.sk", true },
+ { "itcs.services", true },
{ "itdashboard.gov", true },
{ "itecor.net", true },
{ "iteecafe.hu", true },
@@ -19420,8 +20142,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "itesign.de", true },
{ "itfh.eu", true },
{ "itfix.cz", true },
+ { "itfly.xyz", true },
{ "itforge.nl", true },
- { "itgirls.rs", true },
{ "ithakama.cz", true },
{ "ithenrik.com", true },
{ "ithinc.net", true },
@@ -19453,6 +20175,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "itruth.tk", true },
{ "its-future.com", true },
{ "its-gutachten.de", true },
+ { "its420somewhere.com", true },
+ { "its4living.com", true },
{ "itsabouncything.com", true },
{ "itsanicedoor.co.uk", true },
{ "itsasaja.com", true },
@@ -19462,10 +20186,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "itsdcdn.com", true },
{ "itsecblog.de", true },
{ "itsecguy.com", true },
+ { "itseeze.com", true },
{ "itsense.fr", true },
{ "itsevident.com", true },
{ "itsgoingdown.org", true },
- { "itskayla.com", true },
{ "itsmyparty.ie", true },
{ "itsnotquitethehilton.com", true },
{ "itsok.de", true },
@@ -19492,22 +20216,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ivaoru.org", true },
{ "ivfausland.de", true },
{ "ivfmeds.com", true },
- { "ivi-fertilite.fr", true },
- { "ivi-fruchtbarkeit.de", true },
- { "ivi.com.ar", true },
- { "ivi.com.pa", true },
- { "ivi.mx", true },
- { "ivi.net.br", true },
- { "ivi.pt", true },
{ "ivig.com.br", true },
- { "ivinet.cl", true },
- { "ivitalia.it", true },
{ "ivo.co.za", true },
{ "ivopetkov.com", true },
{ "ivor.io", true },
{ "ivor.is", true },
{ "ivorvanhese.com", true },
{ "ivorvanhese.nl", true },
+ { "ivotemahdi.com", true },
{ "ivpn.net", true },
{ "ivre.rocks", true },
{ "ivsign.net", true },
@@ -19522,6 +20238,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "iwanttoliveinabunker.com", true },
{ "iwanttrack.com", true },
{ "iwascoding.com", true },
+ { "iwascoding.de", true },
{ "iwatchcops.com", true },
{ "iwatchcops.org", true },
{ "iwch.tk", true },
@@ -19543,33 +20260,39 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ixquick.nl", true },
{ "iyassu.com", true },
{ "iyinolaashafa.com", true },
+ { "iyn.me", true },
{ "iyouewo.com", true },
{ "iyuanbao.net", true },
{ "iz8mbw.net", true },
- { "izaakbeekman.com", true },
+ { "izanah.com", true },
+ { "izevg.ru", true },
+ { "izhaojie.com", true },
{ "izodiacsigns.com", true },
{ "izuba.info", true },
{ "izumi.tv", true },
{ "izzys.casa", true },
{ "j-elliott.co.uk", true },
{ "j-navi.com", true },
+ { "j-robertson.com", true },
{ "j0bs.org", true },
+ { "j0e.com", true },
{ "j0m.de", true },
{ "j0s.at", true },
{ "j0s.eu", true },
{ "j15h.nu", true },
{ "j2h.de", true },
{ "j3e.de", true },
+ { "j5lx.de", true },
+ { "j5lx.eu", true },
+ { "j5lx.io", true },
{ "ja-dyck.de", true },
{ "ja-gps.com.au", true },
- { "ja.md", true },
{ "jaakkohannikainen.fi", true },
{ "jaalits.com", true },
{ "jaarvistech.com", true },
{ "jaba.hosting", true },
{ "jababu.cz", true },
{ "jabbari.io", true },
- { "jabbas.eu", true },
{ "jabber.at", true },
{ "jabberfr.org", true },
{ "jabbers.one", true },
@@ -19580,29 +20303,32 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jaccblog.com", true },
{ "jacekowski.org", true },
{ "jacik.cz", true },
- { "jack2celebrities.com", true },
{ "jackassofalltrades.org", true },
{ "jackdawphoto.co.uk", true },
{ "jackdelik.de", true },
{ "jackf.me", true },
+ { "jackgreenrealty.com", true },
{ "jackhoodtransportation.com", true },
{ "jackingramnissanparts.com", true },
{ "jackpothappy.com", true },
+ { "jacksanalytics.com", true },
{ "jackson-quon.com", true },
{ "jackson.jp", true },
{ "jacksonhu.com", true },
{ "jacksonvillestation.com", true },
{ "jacksorrell.com", true },
{ "jacksutton.info", true },
+ { "jackwozny.com", true },
+ { "jackyliao.me", true },
{ "jackyliao123.tk", true },
+ { "jackyyf.com", false },
{ "jacobamunch.com", true },
{ "jacobdevans.com", true },
{ "jacobhaug.com", false },
{ "jacobi-server.de", true },
{ "jacobian.org", true },
{ "jacobjangles.com", true },
- { "jacobphono.com", true },
- { "jacobsenarquitetura.com", true },
+ { "jacobs-implantate.at", true },
{ "jacuzziprozone.com", true },
{ "jadchaar.me", true },
{ "jadopado.com", true },
@@ -19619,7 +20345,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jahofmann.de", false },
{ "jailbreakingisnotacrime.org", true },
{ "jaion.xyz", true },
- { "jaispirit.com", false },
+ { "jaispirit.com", true },
{ "jaitnetworking.com", false },
{ "jajsemjachym.cz", true },
{ "jakarta.dating", true },
@@ -19632,6 +20358,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jakereynolds.co", true },
{ "jakerullman.com", true },
{ "jaketremper.com", true },
+ { "jakewalker.xyz", true },
{ "jakewestrip.com", true },
{ "jakob-server.tk", true },
{ "jakobejitblokaci.cz", true },
@@ -19656,11 +20383,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "james-loewen.com", true },
{ "jamesachambers.com", true },
{ "jamesaimonetti.com", true },
- { "jamesandpame.la", true },
{ "jamesbillingham.com", true },
{ "jameschorlton.co.uk", true },
{ "jamesclark.com", true },
{ "jamesdorf.com", true },
+ { "jamesedition.com", true },
{ "jamesgreenfield.com", true },
{ "jameshemmings.co.uk", true },
{ "jameshost.net", true },
@@ -19670,13 +20397,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jamesmarsh.net", true },
{ "jamesmilazzo.com", true },
{ "jamesmorrison.me", true },
- { "jamesmurphy.com.au", true },
+ { "jamesmurphy.com.au", false },
{ "jamesrobertson.io", true },
{ "jamesrobertson.net", true },
{ "jamesross.name", true },
{ "jamesrussellward.co.uk", true },
{ "jamessmith.me.uk", true },
+ { "jamestmartin.me", true },
{ "jamesturnerstickley.com", true },
+ { "jameswarp.com", true },
{ "jamhost.org", true },
{ "jamie-read-photography.com", true },
{ "jamie.ie", true },
@@ -19684,11 +20413,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jamielinux.com", true },
{ "jamiemagee.co.uk", true },
{ "jamiemagee.dk", true },
- { "jamiepeters.nl", true },
{ "jamieweb.net", true },
{ "jamieweb.org", true },
{ "jamiewebb.net", true },
- { "jamjestsimon.pl", true },
{ "jammucake.com", true },
{ "jammysplodgers.co.uk", true },
{ "jamon.ca", true },
@@ -19705,10 +20432,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "janaundgeorgsagenja.eu", true },
{ "janbrodda.de", true },
{ "jandev.de", true },
- { "janduchene.ch", true },
{ "jane.com", true },
{ "janehamelgardendesign.co.uk", true },
{ "janelauhomes.com", true },
+ { "jangocloud.tk", true },
+ { "janhermann.cz", true },
{ "janhuelsmann.com", true },
{ "jani.media", true },
{ "janiat.com", true },
@@ -19732,21 +20460,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "janvaribalint.com", true },
{ "jaot.info", true },
{ "japanesemotorsports.net", true },
+ { "japangids.nl", true },
{ "japaniac.de", false },
{ "japanphilosophy.com", false },
{ "japanwatches.xyz", true },
{ "japon-japan.com", true },
{ "jar.io", true },
{ "jardin-exotique-rennes.fr", true },
- { "jardinderline.ch", true },
{ "jardineriaon.com", true },
{ "jardiniersduminotaure.fr", true },
{ "jaredeberle.org", false },
{ "jaredfernandez.com", true },
+ { "jaredfraser.com", true },
{ "jario.com.br", true },
{ "jarniashop.se", true },
{ "jaroku.com", true },
{ "jarondl.net", true },
+ { "jarrah-alsilawi.com", true },
{ "jarrettgraham.com", true },
{ "jarroba.com", true },
{ "jas-team.net", true },
@@ -19760,20 +20490,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jasonmili.online", true },
{ "jasonsplecoscichlids.com", true },
{ "jasper.link", true },
- { "jasperhammink.com", true },
{ "jasperhuttenmedia.com", true },
{ "jasperpatterson.me", true },
{ "jaszbereny-vechta.eu", true },
{ "javalestari.com", true },
{ "javamilk.com", true },
+ { "javi.pro", true },
{ "javierburgos.net", true },
{ "javierlorente.es", true },
{ "jaxfstk.com", true },
{ "jaxxnet.co.uk", true },
{ "jaxxnet.org", true },
+ { "jaybrokers.com", true },
{ "jaycouture.com", true },
{ "jayf.de", true },
- { "jayfreestone.com", true },
+ { "jayfreestone.com", false },
{ "jaymecd.rocks", true },
{ "jaypandit.me", true },
{ "jayrl.com", true },
@@ -19785,7 +20516,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jazz-alliance.com", true },
{ "jazz-alliance.org", true },
{ "jazzanet.com", true },
- { "jazzfeet.co.uk", true },
{ "jazzncheese.com", true },
{ "jazzy-feet.com", true },
{ "jazzy.id.au", true },
@@ -19802,10 +20532,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jcb.com", true },
{ "jcbgolfandcountryclub.com", true },
{ "jci.cc", true },
+ { "jcit.xyz", true },
{ "jclynne.com", true },
- { "jcra.net", true },
{ "jcsesecuneta.com", true },
{ "jctf.team", true },
+ { "jcus.co", true },
{ "jcwodan.nl", true },
{ "jd-group.co.uk", true },
{ "jd1.de", true },
@@ -19818,6 +20549,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jdjohnsonmedia.com", true },
{ "jdjohnsonwaterproofing.com", true },
{ "jdm.elk.pl", true },
+ { "jdm.pl", true },
{ "jdncr.com", true },
{ "jdoi.pw", true },
{ "jdoiron.me", true },
@@ -19848,19 +20580,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jeepeg.com", true },
{ "jeeran.com", true },
{ "jeeranservices.com", true },
- { "jeffcasavant.com", false },
+ { "jeff.forsale", true },
{ "jeffcloninger.net", true },
{ "jeffersonregan.co.uk", true },
{ "jeffersonregan.com", true },
{ "jeffersonregan.net", true },
{ "jeffhaferman.com", true },
+ { "jeffmcneill.com", true },
{ "jeffreyhaferman.com", true },
{ "jeffrhinelander.com", true },
{ "jeffri.me", true },
{ "jeffsanders.com", true },
{ "jefftickle.com", true },
{ "jeffwebb.com", true },
- { "jefrydco.id", true },
{ "jefsweden.eu", true },
{ "jehovahsays.net", true },
{ "jej.cz", true },
@@ -19877,7 +20609,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jelleluteijn.nl", true },
{ "jelleluteijn.pro", true },
{ "jelleraaijmakers.nl", true },
- { "jelleschneiders.com", false },
+ { "jelleschneiders.com", true },
{ "jelly.cz", true },
{ "jellybeanbooks.com.au", true },
{ "jelmer.co.uk", true },
@@ -19887,9 +20619,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jemangeducheval.com", true },
{ "jembatankarir.com", true },
{ "jemefaisdesamis.com", true },
+ { "jemigjordy.nl", true },
+ { "jennethaarfotografie.nl", true },
{ "jennierobinson.com", true },
{ "jenniferengerwingaantrouwen.nl", true },
- { "jennifermason.eu", true },
{ "jennifersauer.nl", true },
{ "jennythebaker.com", true },
{ "jenolson.net", true },
@@ -19913,6 +20646,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jering.tech", true },
{ "jeroendeneef.com", true },
{ "jerret.de", true },
+ { "jerrysretailstores.com", true },
{ "jerryweb.org", true },
{ "jerryyu.ca", true },
{ "jerseybikehire.co.uk", true },
@@ -19936,15 +20670,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jetkittens.co.uk", true },
{ "jetsetboyz.net", true },
{ "jetsieswerda.nl", true },
+ { "jettlarue.com", true },
{ "jetwhiz.com", true },
{ "jeuxetcodes.fr", true },
{ "jeweet.net", true },
{ "jewishboyscouts.com", true },
{ "jewishquotations.com", true },
- { "jexler.net", true },
- { "jf-fotos.de", true },
{ "jfbst.net", true },
- { "jfmhero.me", true },
{ "jfr.im", true },
{ "jfreitag.de", true },
{ "jfsa.jp", true },
@@ -19958,27 +20690,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jhalderm.com", true },
{ "jhaveri.net", true },
{ "jhe.li", true },
- { "jhf.io", true },
{ "jhill.de", true },
{ "jhollandtranslations.com", true },
{ "jhservicos.net.br", true },
{ "jhuang.me", true },
{ "jhwestover.com", true },
+ { "ji0vwl.net", true },
{ "jiahao.codes", true },
{ "jiangxu.site", true },
{ "jianji.de", true },
{ "jianny.me", true },
{ "jianshu.com", true },
+ { "jianwei.wang", true },
{ "jianyuan.pro", true },
{ "jiatingtrading.com", true },
{ "jicaivvip.com", true },
{ "jichi.io", true },
{ "jichi000.win", true },
- { "jieyang2016.com", true },
{ "jimbiproducts.com", true },
{ "jimbraaten.com", true },
{ "jimbutlerkiaparts.com", true },
{ "jimdorf.com", true },
+ { "jime-hlavou.cz", true },
{ "jimfranke.com", true },
{ "jimfranke.nl", true },
{ "jimizhou.xyz", true },
@@ -20003,14 +20736,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jirosworld.com", true },
{ "jisai.net.cn", true },
{ "jisha.site", true },
+ { "jix.im", true },
{ "jixun.moe", true },
+ { "jiyue.com", true },
{ "jiyue.moe", true },
{ "jiyusu.com", true },
{ "jiyuu-ni.com", true },
{ "jiyuu-ni.net", true },
{ "jjhampton.com", true },
{ "jjj.blog", true },
- { "jjjconnection.com", true },
{ "jjlvk.nl", true },
{ "jjmarketing.co.uk", true },
{ "jjspartyhire.co.uk", true },
@@ -20021,17 +20755,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jkchocolate.com", true },
{ "jki.io", true },
{ "jkinteriorspa.com", true },
- { "jkirsche.com", true },
{ "jkrippen.com", true },
- { "jl-dns.eu", true },
- { "jl-dns.nl", true },
- { "jl-exchange.nl", true },
- { "jl-mail.nl", true },
{ "jlink.nl", true },
{ "jlkhosting.com", true },
{ "jloh.codes", true },
- { "jlpn.eu", true },
- { "jlpn.nl", true },
{ "jlponsetto.com", true },
{ "jlr-luxembourg.com", true },
{ "jltctech.com", true },
@@ -20051,7 +20778,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jmfjltd.com", true },
{ "jmk.hu", true },
{ "jmorahan.net", true },
- { "jmoreau.ddns.net", true },
{ "jmpb.hu", true },
{ "jmsolodesigns.com", true },
{ "jmssg.jp", true },
@@ -20059,13 +20785,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jnm-art.com", true },
{ "jnordell.com", true },
{ "joa-ebert.com", true },
- { "joacimeldre.com", true },
{ "joanofarcmtcarmel.org", true },
{ "joaoaugusto.net", true },
{ "joaosampaio.com.br", true },
- { "joaquimgoliveira.pt", true },
{ "job-ofertas.info", true },
- { "job-offer.de", true },
{ "job.biz.tr", true },
{ "jobatus.com.br", true },
{ "jobatus.es", true },
@@ -20088,7 +20811,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jobs4sales.ch", true },
{ "jobseekeritalia.it", true },
{ "jobsisbrown.com", true },
- { "jobsnet.eu", true },
{ "jobsuchmaschine.ch", true },
{ "jobwinner.ch", true },
{ "jobzninja.com", true },
@@ -20123,11 +20845,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "joemotherfuckingjohnson.com", true },
{ "joepitt.co.uk", false },
{ "joergschneider.com", true },
- { "joerosca.com", true },
{ "joerss.at", true },
+ { "joeseago.com", true },
{ "joeskup.com", true },
+ { "joesniderman.com", true },
{ "joespaintingpgh.com", true },
- { "joestead.codes", true },
+ { "joestead.codes", false },
{ "joetsutj.com", true },
{ "joetyson.me", true },
{ "joeygitalian.com", true },
@@ -20157,7 +20880,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "johncook.ltd.uk", true },
{ "johndball.com", true },
{ "johnfulgenzi.com", true },
+ { "johngadenne.com.au", true },
{ "johngallias.com", true },
+ { "johngo.tk", false },
{ "johnguant.com", true },
{ "johnhgaunt.com", true },
{ "johnkastler.net", true },
@@ -20171,7 +20896,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "johnroach.io", true },
{ "johnroberts.me", true },
{ "johnrockefeller.net", true },
- { "johnsanchez.io", true },
{ "johnsegovia.com", true },
{ "johnsiu.com", true },
{ "johnsonho.net", true },
@@ -20183,7 +20907,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "joinus-outfits.nl", true },
{ "jojosplaycentreandcafeteria.co.uk", true },
{ "jokedalderup.nl", true },
- { "joker.menu", true },
{ "jokerice.co.uk", true },
{ "jokesbykids.com", true },
{ "jokewignand.nl", true },
@@ -20201,16 +20924,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jonandnoraswedding.com", true },
{ "jonas-thelemann.de", true },
{ "jonas-wenk.de", false },
+ { "jonas.me", true },
{ "jonaskjodt.com", true },
{ "jonasled.de", true },
{ "jonaswitmer.ch", true },
- { "jonathan-apps.com", true },
+ { "jonathancarter.org", true },
{ "jonathandupree.com", true },
{ "jonathanha.as", true },
{ "jonathanj.nl", true },
{ "jonathanlara.com", true },
+ { "jonathanreyes.com", false },
{ "jonathanschle.de", true },
{ "jonathanscott.me", true },
+ { "jonathanselea.se", false },
{ "jonblankenship.com", true },
{ "jondarby.com", true },
{ "jondevin.com", true },
@@ -20232,11 +20958,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jonola.com", true },
{ "jonpads.com", true },
{ "jonpavelich.com", true },
+ { "jons.org", true },
{ "jonscaife.com", true },
{ "jooksms.com", true },
{ "jooksuratas.ee", true },
{ "joomlant.org", true },
{ "joompress.biz", true },
+ { "joona.pw", true },
{ "joonatoona.me", true },
{ "joostrijneveld.nl", true },
{ "joostvanderlaan.nl", true },
@@ -20248,13 +20976,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jordanhamilton.me", true },
{ "jordankmportal.com", true },
{ "jordans.co.uk", true },
- { "jordanscorporatelaw.com", true },
{ "jordanstrustcompany.com", true },
{ "jordhy.com", true },
+ { "jordiescudero.com", true },
{ "jorexenterprise.com", true },
{ "jorgerosales.org", true },
{ "jorisdalderup.nl", true },
{ "jornalalerta.com.br", true },
+ { "jorsev.com", true },
{ "josc.com.au", true },
{ "joscares.com", true },
{ "jose-alexand.re", true },
@@ -20279,7 +21008,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "joshharmon.me", true },
{ "joshics.in", true },
{ "joshlovephotography.co.uk", true },
- { "joshpanter.com", true },
+ { "joshpanter.com", false },
{ "joshrickert.com", true },
{ "joshruppe.com", true },
{ "joshschmelzle.com", true },
@@ -20287,7 +21016,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "joshua-kuepper.de", true },
{ "joshua.bio", true },
{ "joshuadmiller.info", true },
- { "joshuajohnson.ca", true },
{ "joshuameunier.com", true },
{ "joshuarogers.net", true },
{ "josoansi.de", true },
@@ -20299,8 +21027,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jovic.hamburg", true },
{ "joyful.house", true },
{ "joyfulexpressions.gallery", true },
+ { "joyfulhealthyeats.com", true },
{ "joynadvisors.com", true },
{ "joyofcookingandbaking.com", true },
+ { "joyqi.com", true },
{ "joysinventingblog.com", true },
{ "jpbe-network.de", true },
{ "jpbe.de", true },
@@ -20327,9 +21057,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jrc9.ca", true },
{ "jrchaseify.xyz", true },
{ "jreb.nl", true },
- { "jreinert.com", true },
{ "jrflorian.com", true },
- { "jrlopezoficial.com", true },
{ "jross.me", true },
{ "jrtapsell.co.uk", true },
{ "jrxpress.com", true },
@@ -20341,6 +21069,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jsdelivr.com", true },
{ "jselby.net", true },
{ "jsent.co.uk", true },
+ { "jsevilleja.org", true },
{ "jskier.com", false },
{ "jskoelliken.ch", true },
{ "jsmetallerie.fr", true },
@@ -20349,6 +21078,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jsonsinc.com", true },
{ "jsteward.moe", true },
{ "jstore.ch", true },
+ { "jsvr.tk", false },
+ { "jtcat.com", true },
+ { "jtcjewelry.com", true },
{ "jtconsultancy.sg", true },
{ "jthackery.com", false },
{ "jtl-software.com", true },
@@ -20368,17 +21100,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jucca-nautica.si", true },
{ "juch.cc", true },
{ "juchit.at", true },
+ { "jucktehkeinen.de", true },
{ "judc-ge.ch", true },
{ "judge2020.com", true },
{ "judge2020.me", true },
{ "judoprodeti.cz", true },
{ "judosaintdenis.fr", true },
- { "judytka.cz", true },
{ "juef.space", true },
{ "juegosycodigos.es", true },
{ "juegosycodigos.mx", true },
{ "juegosyolimpicos.com", true },
- { "juelda.com", true },
{ "juergen-elbert.de", true },
{ "juergen-roehrig.de", true },
{ "juergenhecht.de", true },
@@ -20392,9 +21123,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "juhakoho.com", true },
{ "juice.codes", true },
{ "juk.life", false },
- { "juku-info.top", true },
{ "juku-wing.jp", true },
{ "jule-spil.dk", true },
+ { "julenlanda.com", false },
+ { "julestern.com", true },
{ "julian-uphoff.de", true },
{ "julian-weigle.de", true },
{ "juliangonggrijp.com", true },
@@ -20421,6 +21153,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "julientartarin.com", true },
{ "julius-zoellner.de", true },
{ "jullensgroningen.com", true },
+ { "julm.de", true },
{ "juls.cloud", true },
{ "jultube.de", true },
{ "jumbopan.net", true },
@@ -20434,7 +21167,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jumparoundbouncycastles.co.uk", true },
{ "jumparty.co.uk", true },
{ "jumpeasy.com.au", true },
- { "jumperoos.co.uk", true },
{ "jumpin-jax.co.uk", true },
{ "jumpinchat.com", true },
{ "jumpingbee.co.uk", true },
@@ -20456,11 +21188,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "junglist.org", true },
{ "jungundwild-design.de", false },
{ "juni.io", true },
+ { "junias-fenske.de", true },
{ "juniperroots.ca", true },
- { "junjhome.com", true },
{ "junjun-web.net", true },
{ "junkdrome.org", true },
{ "juno.co.uk", true },
+ { "junoaroma.com", true },
{ "junodownload.com", true },
{ "jura-reiseschutz.de", true },
{ "jurassicbarkharrogate.co.uk", true },
@@ -20468,8 +21201,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "juridoc.com.br", true },
{ "jurijbuga.de", true },
{ "jurriaan.ninja", true },
- { "just-a-clanpage.de", true },
+ { "jusos-goettingen.de", true },
{ "just-vet-and-drive.fr", true },
+ { "just-webdesign-berlin.de", true },
{ "justanothercompany.name", true },
{ "justbelieverecoverypa.com", true },
{ "justbookexcursions.com", true },
@@ -20483,6 +21217,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "justice.gov", true },
{ "justice4assange.com", true },
{ "justin-tech.com", true },
+ { "justinfreid.com", true },
+ { "justinharrison.ca", false },
{ "justinho.com", true },
{ "justinmuturifoundation.org", true },
{ "justinribeiro.com", true },
@@ -20492,11 +21228,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "justpaste.it", true },
{ "justsmart.io", true },
{ "justsome.info", true },
- { "justtalk.site", true },
{ "justthinktwice.gov", false },
{ "justupdate.me", true },
{ "justyy.com", true },
{ "juszkiewicz.com.pl", true },
+ { "jutella.de", false },
{ "jutlander-netbank.dk", true },
{ "jutlander.dk", true },
{ "juttaheitland.com", true },
@@ -20513,21 +21249,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "jvwdev.nl", true },
{ "jwatt.org", true },
{ "jwe.nl", true },
+ { "jwhite.network", true },
{ "jwilsson.com", true },
{ "jwjwjw.com", true },
{ "jwmmarketing.com", true },
{ "jwnotifier.org", true },
{ "jwod.gov", true },
{ "jwplay.ml", true },
+ { "jwpoore.com", true },
{ "jwschuepfheim.ch", true },
- { "jwsoft.nl", true },
+ { "jwybk.ml", true },
+ { "jwz.org", true },
{ "jxir.de", true },
+ { "jxkangyifu.com", true },
{ "jxltom.com", true },
{ "jxm.in", true },
{ "jydemarked.dk", true },
{ "jyggen.com", true },
{ "jym.fit", true },
{ "jyoti-fairworks.org", true },
+ { "jz585.com", true },
{ "jzbk.org", true },
{ "k-bone.com", true },
{ "k-homes.net", true },
@@ -20535,10 +21276,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "k-pan.com", true },
{ "k-plant.com", true },
{ "k-pture.com", true },
- { "k-scr.me", true },
{ "k-system.de", true },
{ "k-tube.com", true },
{ "k1024.org", true },
+ { "k1yoshi.com", true },
{ "k258059.net", true },
{ "k2mts.org", true },
{ "k33k00.com", false },
@@ -20552,11 +21293,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "k9swx.com", true },
{ "kaamoscreations.com", true },
{ "kaangenc.me", true },
- { "kaany.io", true },
{ "kaasbesteld.nl", true },
{ "kaatha-kamrater.se", true },
{ "kab-s.de", true },
{ "kabaca.design", true },
+ { "kabarlinux.id", true },
{ "kabashop.com.br", true },
{ "kabat-fans.cz", true },
{ "kabeltv.co.nz", true },
@@ -20582,6 +21323,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kaikei7.com", true },
{ "kaileymslusser.com", true },
{ "kairion.de", false },
+ { "kairostecnologia.com.br", true },
{ "kaisakura.net", true },
{ "kaisev.net", false },
{ "kaitol.click", true },
@@ -20598,6 +21340,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kakolightingmuseum.or.jp", true },
{ "kalakarclub.com", true },
{ "kalamos-psychiatrie.be", true },
+ { "kalashcards.com", true },
{ "kalastus.com", true },
{ "kaleidoscope.co.uk", true },
{ "kalender.com", true },
@@ -20611,16 +21354,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kalmar.com", true },
{ "kalolina.com", true },
{ "kalombo.ru", true },
- { "kalsbouncies.com", true },
{ "kaltenbrunner.it", true },
{ "kalterersee.ch", true },
+ { "kalugadeti.ru", true },
{ "kalwestelectric.com", true },
{ "kalyanmatka.guru", true },
{ "kam-serwis.pl", true },
{ "kamata-shinkyu-seikotsu.jp", true },
{ "kameari-za.space", true },
+ { "kamen-master.ru", true },
{ "kamikaichimaru.com", false },
- { "kamikatse.net", true },
{ "kamilki.me", true },
{ "kaminbau-laub.de", true },
{ "kamisato-ent.com", true },
@@ -20635,6 +21378,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kanag.pl", true },
{ "kanal-schaefer.de", true },
{ "kanal-tv-haensch.de", true },
+ { "kandalife.com", true },
{ "kandianshang.com", true },
{ "kanecastles.com", true },
{ "kanehusky.com", true },
@@ -20649,7 +21393,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kangaroovalleyshow.org.au", true },
{ "kangaroovalleywoodcrafts.com.au", true },
{ "kangkai.me", true },
- { "kangooroule.fr", true },
{ "kanis.ag", true },
{ "kankimaru.com", true },
{ "kanna.cf", true },
@@ -20665,7 +21408,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kanzakiranko.jp", false },
{ "kanzashi.com", true },
{ "kanzlei-gaengler.de", true },
- { "kanzlei-myca.de", true },
{ "kanzlei-oehler.com", true },
{ "kanzlei-sixt.de", true },
{ "kap-genial.de", true },
@@ -20675,18 +21417,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kapseli.net", true },
{ "kaptadata.com", true },
{ "kaptamedia.com", true },
- { "kara-fabian.com", true },
- { "kara-fabian.de", true },
{ "karabas.com", true },
{ "karabijnhaken.nl", false },
{ "karachi.dating", true },
- { "karaface.com", true },
{ "karalane.com", true },
{ "karamomo.net", true },
{ "karanjthakkar.com", true },
{ "karasik.by", true },
{ "karateka.org", true },
{ "karateka.ru", true },
+ { "karatekit.co.uk", true },
{ "kardize24.pl", true },
{ "kardolocksmith.com", true },
{ "karewan.ovh", true },
@@ -20710,17 +21450,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "karn.nu", true },
{ "karneid.info", true },
{ "karoverwaltung.de", true },
+ { "kars.ooo", true },
{ "karsofsystems.com", true },
{ "karsten-voigt.de", true },
{ "karta-paliwowa.pl", true },
{ "kartacha.com", true },
{ "kartar.net", false },
- { "kartatopia.com", true },
{ "kartec.com", true },
{ "karten-verlag.de", true },
{ "kartonmodellbau.org", true },
{ "karula.org", true },
{ "karupp-did.net", true },
+ { "kasadara.com", true },
{ "kasei.im", true },
{ "kashinavi.com", true },
{ "kashmirobserver.net", true },
@@ -20729,7 +21470,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kassa.at", true },
{ "kastankaoffice.cz", true },
{ "kastelruth.biz", true },
- { "kastemperaturen.ga", true },
{ "kastorsky.ru", true },
{ "kat.marketing", true },
{ "katagena.com", true },
@@ -20757,7 +21497,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "katscastles.co.uk", true },
{ "kattelans.eu", true },
{ "katyl.info", false },
- { "katyusha.net", false },
+ { "katyusha.net", true },
{ "katzenbrunnen-test.de", true },
{ "katzensklave.me", true },
{ "katzrkool.xyz", true },
@@ -20766,11 +21506,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kaufberatung.community", true },
{ "kaufmanbankruptcylaw.com", true },
{ "kavovary-kava.cz", true },
+ { "kawaii.io", true },
{ "kawaiii.link", true },
{ "kaweus.de", true },
{ "kay.la", true },
- { "kayakabovegroundswimmingpools.com", true },
+ { "kayo.digital", true },
{ "kayscs.com", true },
+ { "kaysis.gov.tr", false },
{ "kazakov.lt", true },
{ "kazancci.com", true },
{ "kazand.lt", true },
@@ -20820,7 +21562,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kecht.at", true },
{ "kedarastudios.com", true },
{ "kedibizworx.com", true },
- { "kediri.win", true },
{ "kedv.es", true },
{ "keeleysam.com", true },
{ "keelove.net", true },
@@ -20831,12 +21572,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "keepersecurity.com", true },
{ "keepingtheplot.co.uk", true },
{ "keepiteasy.eu", true },
+ { "keepitsecure24.com", true },
{ "keepsight.org.au", true },
{ "keevitaja.com", true },
{ "keeweb.info", true },
{ "keezin.ga", true },
{ "keganthorrez.com", true },
{ "kehlenbach.net", true },
+ { "keian.tk", true },
{ "keifel.de", true },
{ "kein-design.de", true },
{ "keinanung.nl", true },
@@ -20845,12 +21588,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "keishiando.com", true },
{ "keithlomax.com", true },
{ "keithws.net", true },
- { "kejar.id", true },
{ "keke-shop.ch", true },
- { "kekgame.com", true },
{ "kekku.li", true },
{ "keksi.io", true },
{ "kela.jp", true },
+ { "kelantanmudah.com", false },
{ "keldan.fo", true },
{ "kelderwijnen.nl", true },
{ "kelgtermans-usedcars.be", true },
@@ -20875,6 +21617,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kengilmour.com", true },
{ "kenguntokku.jp", true },
{ "kenia-vakantie.nl", true },
+ { "kennedyinsurancesolutions.com", true },
{ "kenners.org", true },
{ "kennethaasan.no", true },
{ "kennethferguson.com", true },
@@ -20892,7 +21635,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kentec.net", true },
{ "kenterlis.gr", true },
{ "kenvix.com", true },
- { "kenx5.eu.org", true },
{ "kenyons.info", true },
{ "keops-spine.fr", true },
{ "keops-spine.us", true },
@@ -20910,12 +21652,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kernelprogrammer.com", true },
{ "kerrfrequencycombs.org", true },
{ "kerrnel.com", true },
- { "kersbergen.nl", true },
{ "kerstkaart.nl", true },
{ "kersvers.agency", true },
{ "kerus.net", true },
{ "kerzyte.net", true },
- { "kescher.site", true },
{ "kessawear.com", true },
{ "kesslerwine.com", true },
{ "kesteren.org", true },
@@ -20930,13 +21670,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kevin-darmor.eu", true },
{ "kevin-ta.com", true },
{ "kevinapease.com", true },
- { "kevinbowers.me", true },
{ "kevinbusse.de", true },
{ "kevincox.ca", false },
+ { "kevindienst.blog", true },
{ "kevinfoley.cc", true },
{ "kevinfoley.org", true },
{ "kevingsky.com", true },
- { "kevinhill.nl", true },
{ "kevinhq.com", true },
{ "kevinkla.es", true },
{ "kevinlocke.name", true },
@@ -20985,8 +21724,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kheshtar.pl", true },
{ "khetzal.info", true },
{ "khipu.com", true },
- { "khlee.net", true },
- { "khmb.ru", false },
+ { "khmb.ru", true },
{ "khoury-dulla.ch", true },
{ "khs1994.com", true },
{ "khslaw.com", true },
@@ -20998,6 +21736,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kiapartscenter.net", true },
{ "kiapartsdepartment.com", true },
{ "kiapps.ovh", true },
+ { "kiarayoga.com", true },
+ { "kiasystems.com", true },
{ "kibea.net", true },
{ "kibibit.net", true },
{ "kibriscicek.net", true },
@@ -21005,7 +21745,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kickasscanadians.ca", true },
{ "kickedmycat.com", true },
{ "kickstart.com.pk", false },
- { "kicou.info", true },
+ { "kicou.info", false },
{ "kidaptive.com", true },
{ "kiddieschristian.academy", true },
{ "kiddyboom.ua", true },
@@ -21021,6 +21761,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kidsneversleep.com", true },
{ "kidsplay-plymouth.co.uk", true },
{ "kidsplaybouncycastles.co.uk", true },
+ { "kidswallstickers.com.au", true },
{ "kidtoyshop.ru", true },
{ "kidzpartiesllp.co.uk", true },
{ "kidzsmile.co.uk", true },
@@ -21028,14 +21769,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kiehls.pt", true },
{ "kiekin.org", true },
{ "kiekko.pro", true },
- { "kiel-kind.de", true },
+ { "kieran.de", true },
+ { "kieran.ie", true },
+ { "kieranjones.uk", true },
{ "kiesuwkerstkaart.nl", true },
{ "kiffmarks.com", true },
{ "kigmbh.com", true },
- { "kiisu.club", true },
+ { "kii91.com", true },
{ "kikbb.com", true },
{ "kiki-voice.jp", true },
+ { "kiknudes.co", true },
{ "kiku.pw", true },
+ { "kileahh.fr", true },
{ "kilianvalkhof.com", true },
{ "killaraapartments.com.au", true },
{ "killdeer.com", true },
@@ -21047,7 +21792,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kilobyte22.de", true },
{ "kilogram.nl", true },
{ "kilometertje.nl", true },
- { "kimamass.com", true },
{ "kimbal.co.uk", true },
{ "kimdumaine.com", true },
{ "kimiris.com", true },
@@ -21062,6 +21806,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kin.life", true },
{ "kin.pet", true },
{ "kinautas.com", true },
+ { "kinderarzt-berlin-zia.de", true },
{ "kinderbasar-luhe.de", true },
{ "kinderchor-bayreuth.de", true },
{ "kinderjugendfreizeitverein.de", true },
@@ -21070,9 +21815,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kindertagespflege-rasselbande-halle.de", true },
{ "kinderzahn-bogenhausen.de", true },
{ "kindfotografie.nl", true },
- { "kindleworth.com", true },
{ "kindlezs.com", true },
{ "kine-duthil.fr", true },
+ { "kinecle.com", true },
{ "kinepolis-studio.be", true },
{ "kinerd.me", true },
{ "kinesiomed-cryosauna.gr", true },
@@ -21080,7 +21825,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "king-of-the-castles.com", true },
{ "kingant.net", true },
{ "kinganywhere.eu", true },
- { "kingbird.me", true },
{ "kingdoms.gg", true },
{ "kingiescastles.co.uk", true },
{ "kingofshooting.com", true },
@@ -21097,7 +21841,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kini24.ru", true },
{ "kinkcafe.net", true },
{ "kinkenonline.com", true },
- { "kinnikinnick.com", true },
+ { "kinkyhookup.com", true },
+ { "kinmunity.com", true },
{ "kinniyaonlus.com", true },
{ "kinocheck.de", true },
{ "kinohled.cz", true },
@@ -21114,24 +21859,27 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kipa.at", true },
{ "kipiradio.com", true },
{ "kippenbart.gq", true },
+ { "kipsu.com", true },
{ "kiragameforum.net", true },
{ "kiraku.co", true },
{ "kirbear.com", true },
- { "kirche-dortmund-ost.de", true },
{ "kirchen-im-web.de", false },
{ "kirchengemeinde-markt-erlbach.de", true },
+ { "kirchhoff-getraenke.de", true },
{ "kircp.com", true },
{ "kirei.se", true },
{ "kirig.ph", true },
{ "kirikira.moe", true },
- { "kirill.ws", true },
{ "kirillaristov.com", true },
+ { "kirillpokrovsky.de", false },
{ "kirinas.com", true },
{ "kirinuki.jp", true },
{ "kirkforcongress.com", true },
{ "kirkforillinois.com", true },
{ "kirkify.com", true },
{ "kirkovsky.com", true },
+ { "kirkwoodfence.com", true },
+ { "kiropraktorvard.se", true },
{ "kirrie.pe.kr", true },
{ "kirsch-gestaltung.de", true },
{ "kirschbaum.me", true },
@@ -21140,7 +21888,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kirstin-peters.de", true },
{ "kirwandigital.com", true },
{ "kisallatorvos.hu", true },
- { "kisalt.im", true },
{ "kisel.org", true },
{ "kisiselveri.com", true },
{ "kiskeedeesailing.com", true },
@@ -21148,6 +21895,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kissflow.com", true },
{ "kissgyms.com", true },
{ "kissmycreative.com", true },
+ { "kissoft.ro", true },
+ { "kisun.co.jp", false },
{ "kitabnamabayi.com", true },
{ "kitacoffee.com", true },
{ "kitbag.com.au", true },
@@ -21172,7 +21921,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kiwi.com", true },
{ "kiwi.digital", true },
{ "kiwi.wiki", true },
+ { "kiwihub.org", true },
+ { "kix.moe", true },
{ "kiyotatsu.com", true },
+ { "kizomba.info", true },
+ { "kizzycode.de", true },
{ "kj-prince.com", true },
{ "kjaer.io", true },
{ "kjarni.cc", true },
@@ -21181,17 +21934,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kjellner.com", true },
{ "kjelltitulaer.com", true },
{ "kjellvn.net", true },
+ { "kjnotes.com", true },
{ "kk-neudorf-duissern.de", false },
- { "kkaefer.com", true },
+ { "kk.in.th", true },
{ "kki.org", true },
{ "kkovacs.eu", true },
{ "kkr-bridal.net", true },
- { "kkren.me", true },
{ "kks-karlstadt.de", true },
{ "kksg.com", true },
{ "kkyy.me", true },
{ "kkzxak47.com", true },
{ "kl-diaetist.dk", true },
+ { "kl008888.com", true },
{ "klaasmeijerbodems.nl", true },
{ "klaim.us", true },
{ "klamathrestoration.gov", true },
@@ -21217,6 +21971,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kleine-strandburg-heringsdorf.de", true },
{ "kleine-strandburg.com", true },
{ "kleine-strolche-lich.de", true },
+ { "kleine-viecherei.de", true },
{ "kleineanfragen.de", true },
{ "kleinestrandburg-heringsdorf.de", true },
{ "kleinestrandburg-usedom.de", true },
@@ -21229,7 +21984,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "klemkow.org", true },
{ "kleppe.co", true },
{ "kleteckova.cz", true },
- { "klicke-gemeinsames.de", true },
{ "klickstdu.com", true },
{ "kliemann.me", true },
{ "klif1.nl", true },
@@ -21247,6 +22001,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "klocker-ausserlechner.com", true },
{ "klocksnack.se", true },
{ "kloia.com", true },
+ { "klop.info", true },
{ "klose.family", true },
{ "klosko.net", true },
{ "kloudboy.com", true },
@@ -21259,7 +22014,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "klustermedia.com", true },
{ "klusweb-merenwijk.nl", true },
{ "klva.cz", true },
- { "klzwzhi.com", true },
{ "kmashworth.co.uk", true },
{ "kmkz.jp", true },
{ "kmsci.com.ph", true },
@@ -21292,15 +22046,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "knmv.nl", true },
{ "knnet.ch", true },
{ "knockendarroch.co.uk", true },
+ { "knoji.com", true },
{ "knop.info", true },
{ "knot-store.com", true },
{ "knowarth.com", true },
{ "knowledgeforce.com", true },
+ { "knowledgehook.com", true },
{ "knowlevillagecc.co.uk", true },
{ "knowyourday.ai", true },
{ "knthost.com", true },
{ "knurps.de", true },
- { "knuthildebrandt.de", false },
+ { "knuthildebrandt.de", true },
{ "knutur.is", true },
{ "knygos.lt", true },
{ "ko-sys.com", true },
@@ -21325,6 +22081,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "koe.hn", true },
{ "koebbes.de", true },
{ "koecollege.com", true },
+ { "koeeusa.org", true },
{ "koelnmafia.de", true },
{ "koenigsbrunner-tafel.de", true },
{ "koenleemans.nl", true },
@@ -21338,7 +22095,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kofler.info", true },
{ "kogak.ninja", true },
{ "kogax.com", true },
- { "kogcoder.com", true },
{ "kogi.fr", true },
{ "kogro.de", true },
{ "kogudesi.com", true },
@@ -21347,24 +22103,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kohlistkool.tk", true },
{ "koho.fi", true },
{ "kohoutsautomotive.com", true },
+ { "kohparadise.com", true },
{ "kohsandra.com", true },
{ "kohu.nz", true },
{ "koi-lexikon.de", true },
- { "koi-sama.net", true },
{ "koicenter-thuine.de", true },
{ "koifish.org", true },
{ "koirala.email", true },
+ { "kojip.com", true },
{ "koka-shop.de", true },
{ "kokensupport.com", true },
{ "koketteriet.se", true },
{ "kokobaba.com", true },
{ "kokona.ch", true },
+ { "kokoushuvila.fi", true },
{ "kokumoto.com", true },
{ "kolania.de", true },
{ "kolania.net", true },
{ "kolbeinsson.se", true },
{ "kolcsey.eu", true },
- { "koldanews.com", true },
{ "kolin.org", true },
{ "kolizaskrap.bg", true },
{ "kolja-engelmann.de", true },
@@ -21374,7 +22131,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kollega.it", true },
{ "kolmann.at", true },
{ "kolmann.eu", true },
- { "kolonie-am-stadtpark.de", true },
{ "kolorbon.com", true },
{ "kolpingsfamilie-vechta-maria-frieden.de", true },
{ "koluke.co", true },
@@ -21393,17 +22149,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "komischkeszeug.de", true },
{ "kommaer.dk", true },
{ "kommune42.org", true },
+ { "komodolabs.com", true },
{ "komoju.com", true },
{ "komok.co.uk", true },
+ { "komp247.pl", true },
{ "kompetenzkurs.de", true },
{ "komplet.sk", true },
{ "kon-sil.de", true },
{ "kondi.net", true },
{ "kondou-butsudan.com", true },
{ "kongar.org", true },
+ { "kongress-hostessen.de", true },
{ "kongsecuritydata.com", true },
{ "koniecfica.sk", true },
{ "konijntjes.nl", true },
+ { "konings.it", false },
{ "koningskwartiertje.nl", true },
{ "koninkrijk.net", true },
{ "konklone.com", true },
@@ -21429,21 +22189,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kooliveeb.ee", true },
{ "kooponline.eu", true },
{ "koot.nl", true },
+ { "kooxdiving.com", true },
{ "koozal.de", true },
- { "kopfkrieg.org", true },
+ { "kopfkrieg.org", false },
{ "kopfundseele.de", true },
{ "kopjethee.nl", true },
{ "koplancpa.com", true },
+ { "kopplin.family", true },
{ "koptev.ru", true },
{ "kopteva.ru", true },
{ "korben.info", true },
{ "korea-dpr.org", true },
{ "korea.dating", true },
{ "koreaboo.com", true },
+ { "koretech.nl", true },
{ "korinar.com", true },
{ "kornrunner.net", true },
- { "korobi.io", true },
- { "korobkovsky.ru", true },
+ { "korobkovsky.ru", false },
{ "koroknaimedical.hu", true },
{ "korono.de", true },
{ "korosiprogram.hu", true },
@@ -21457,6 +22219,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "koscielniak-nieruchomosci.pl", true },
{ "kosherjava.com", true },
{ "kosho.org", true },
+ { "kosinc.org", true },
+ { "kosmos.org.tw", true },
{ "kosonaudioteca.com", true },
{ "kost-magazin.de", true },
{ "kostal.com", false },
@@ -21484,12 +22248,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kovals.sk", true },
{ "kovehitus.ee", true },
{ "kovspace.com", true },
- { "kowalmik.tk", true },
{ "kowalstwo.com.pl", true },
{ "kowarschick.de", true },
{ "kowshiksundararajan.com", true },
{ "koyaanis.com", true },
{ "koyo.kr", true },
+ { "kozawa.tokyo", true },
{ "kozuch.biz", true },
{ "kpfanworld.com", true },
{ "kpforme.org", true },
@@ -21497,7 +22261,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kplasticsurgery.com", true },
{ "kplnet.net", true },
{ "kpop.re", true },
- { "kpopsource.com", true },
{ "kpumuk.info", true },
{ "kpx1.de", true },
{ "kr.search.yahoo.com", false },
@@ -21510,7 +22273,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kraftzeiten.de", true },
{ "krag.be", true },
{ "kraga.sk", true },
- { "kraiwon.com", true },
+ { "kraiwan.com", true },
{ "kraken.io", true },
{ "kraken.site", true },
{ "kralik.io", true },
@@ -21523,10 +22286,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kramsj.uk", true },
{ "krang.org.uk", true },
{ "krankenpflege-haushaltshilfe.de", true },
- { "kranz.space", true },
+ { "krant.nl", true },
+ { "kranz.space", false },
{ "krasnodar-avia.ru", true },
{ "krasovsky.me", true },
{ "krautomat.com", true },
+ { "kraynik.com", true },
{ "krayx.com", true },
{ "krazyboi.com", true },
{ "krazykastles.co.uk", true },
@@ -21567,12 +22332,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kristinbailey.com", false },
{ "kristofba.ch", true },
{ "kristofdv.be", true },
+ { "kritikawebu.cz", true },
{ "kritikos.io", true },
{ "krizevci.info", true },
{ "krmeni.cz", false },
+ { "kroell.net", true },
{ "krokedil.se", true },
{ "kromamoveis.com.br", true },
- { "kromonos.net", true },
+ { "kromonos.net", false },
{ "krony.de", true },
{ "kroon.email", true },
{ "kropkait.pl", true },
@@ -21589,7 +22356,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kruselegal.com.au", true },
{ "krusesec.com", true },
{ "krutka.cz", true },
- { "kruu.de", true },
{ "kruzhki-s-kartinkami.ru", true },
{ "kry.no", true },
{ "kry.se", true },
@@ -21608,11 +22374,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kselenia.ee", true },
{ "ksero.center", true },
{ "ksero.wroclaw.pl", true },
- { "ksham.net", true },
{ "kshlm.in", true },
{ "ksmmmo.org.tr", true },
+ { "ksopp.si", true },
+ { "kspg.tv", true },
{ "kssk.de", true },
{ "ksukelife.com", true },
+ { "kt-events.de", true },
{ "kt-zoe.com", true },
{ "ktbnetbank.com", true },
{ "kthnxbai.xyz", true },
@@ -21624,11 +22392,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ku-7.club", true },
{ "ku.io", false },
{ "kuaimen.bid", true },
- { "kuaitiyu.org", true },
{ "kualiti.net", true },
{ "kualo.co.uk", true },
{ "kualo.com", true },
{ "kualo.in", true },
+ { "kuanta.net", true },
{ "kuaza.com", true },
{ "kub.hr", true },
{ "kubica.ch", true },
@@ -21638,19 +22406,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kublis.ch", true },
{ "kuchen-am-stiel.de", true },
{ "kuchenfeelisa.de", true },
- { "kuchentraum.eu", true },
+ { "kuchentraum.eu", false },
{ "kucnibudzet.com", true },
{ "kucukayvaz.com", true },
{ "kudo.co.id", true },
- { "kueche-co.de", false },
{ "kuechenprofi-group.de", false },
- { "kuehndel.org", true },
+ { "kuechenserver.de", true },
+ { "kuechenserver.org", true },
{ "kuehnel-bs.de", true },
{ "kuehnel-online.eu", true },
{ "kuehnel.org", false },
{ "kuemmerlin.eu", true },
{ "kuemmling.eu", true },
- { "kugelblitz.co", true },
{ "kuhn-elektrotechnik.de", true },
{ "kuhne-electronic.de", true },
{ "kuhnelautorepair.com", true },
@@ -21666,6 +22433,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kumalog.com", true },
{ "kumasanda.jp", true },
{ "kumilasvegas.com", true },
+ { "kunaldesai.blog", true },
+ { "kundenerreichen.com", true },
+ { "kundenerreichen.de", true },
{ "kungerkueken.de", true },
{ "kunra.de", true },
{ "kunstdrucke-textildruck.de", true },
@@ -21673,10 +22443,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kuoruan.com", true },
{ "kupaa.ink", true },
{ "kupferstichshop.com", true },
+ { "kupiclub.com", true },
{ "kupid.com", true },
{ "kupiec.eu.org", true },
{ "kupimlot.ru", true },
{ "kupinska.pl", true },
+ { "kupleno.com", true },
{ "kuponrazzi.com", true },
{ "kuponydoher.cz", true },
{ "kupschke.net", true },
@@ -21685,11 +22457,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kurofuku.me", true },
{ "kuroha.co.uk", true },
{ "kuroinu.jp", true },
+ { "kuroisalva.xyz", false },
{ "kurona.ga", true },
{ "kuronekogaro.com", true },
{ "kurschies.de", true },
{ "kurserne.dk", true },
{ "kurswahl-online.de", true },
+ { "kurszielnull.de", true },
{ "kurtschlatzer.com", true },
{ "kuruppa.xyz", true },
{ "kuschku.de", true },
@@ -21702,6 +22476,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kuttler.eu", true },
{ "kutukupret.com", true },
{ "kutus.ee", true },
+ { "kuunlamaailm.ee", true },
{ "kuzbass-pwl.ru", true },
{ "kvadratnimeter.si", true },
{ "kvalita-1a.cz", true },
@@ -21709,7 +22484,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kvalitnitesneni.cz", true },
{ "kvantel.no", true },
{ "kvcc.com.au", true },
- { "kvestmaster.ru", true },
{ "kvetinymilt.cz", true },
{ "kvhile.com", true },
{ "kvilt.dk", true },
@@ -21730,15 +22504,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "kxnrl.com", true },
{ "kxway.com", true },
{ "kybi.sk", true },
+ { "kybqp.com", true },
+ { "kybqp.net", true },
{ "kydara.com", true },
{ "kyledrake.net", true },
{ "kylegutschow.com", true },
- { "kylejohnson.io", true },
{ "kylelaker.com", true },
{ "kylinj.com", false },
{ "kynastonwedding.co.uk", true },
- { "kyobostory-events.com", true },
- { "kyoko.org", true },
{ "kyosaku.org", true },
{ "kyoto-k9.com", false },
{ "kyoto-mic.com", true },
@@ -21756,9 +22529,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "l-lab.org", true },
{ "l0re.com", true },
{ "l17r.eu", true },
- { "l2guru.ru", true },
{ "l3.ee", true },
{ "l33te.net", true },
+ { "l3j.net", true },
{ "l4n-clan.de", true },
{ "l7plumbing.com.au", true },
{ "l7world.com", true },
@@ -21784,9 +22557,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "labcenter.com", true },
{ "labcoat.jp", true },
{ "labeled.vn", true },
- { "labms.com.au", true },
{ "labobooks.com", true },
- { "laboitebio-logique.ca", true },
{ "labortogether.com", true },
{ "labouncycastlehire.co.uk", true },
{ "labourreedevergheas.fr", true },
@@ -21798,7 +22569,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "labtest.ltd", true },
{ "lacaey.se", true },
{ "lacantine.xyz", true },
- { "lacaserita.org", true },
{ "lacaveducinquantenaire.com", true },
{ "lacetsfun.com", true },
{ "lacetsroses.ch", true },
@@ -21820,9 +22590,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lacocinadelila.com", true },
{ "lacoquette.gr", true },
{ "lacyc3.eu", true },
- { "ladbroke.net", true },
+ { "ladbroke.net", false },
{ "ladenzeile.at", true },
- { "ladislavbrezovnik.com", true },
+ { "ladenzeile.de", true },
+ { "lado.ltd", true },
+ { "ladotech.cn", true },
+ { "ladotech.com", true },
{ "ladraiglaan.com", true },
{ "lady-2.jp", true },
{ "ladyanna.de", true },
@@ -21833,8 +22606,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lafayette-rushford.com", true },
{ "lafcheta.info", true },
{ "lafema.de", true },
+ { "lafermegourmande.fr", true },
{ "lafillepolyvalente.ca", true },
{ "lafillepolyvalente.com", true },
+ { "lafka.org", true },
{ "lafkor.de", true },
{ "laflash.com", true },
{ "lagarderob.ru", false },
@@ -21844,9 +22619,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "laglab.org", false },
{ "lagout.org", true },
{ "lagriffeduservice.fr", true },
+ { "lagsoftware.com", true },
{ "laguiadelvaron.com", true },
{ "laguinguette.fr", true },
{ "lagunacoastrealestate.com", true },
+ { "lagunakitchenandbath.com", true },
{ "lahipotesisgaia.com", true },
{ "lahnau-akustik.de", true },
{ "lahora.com.ec", true },
@@ -21858,11 +22635,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lak-berlin.de", true },
{ "lakarwebb.se", true },
{ "lakedavid.com.au", true },
- { "lakehavasucityhomebuyerscredit.com", true },
{ "lakehavasucitynews.com", true },
- { "lakehavasuhomebuyercredit.com", true },
- { "lakehavasuhomes.info", true },
- { "lakehavasuhouses.com", true },
{ "lakehavasuwebsites.com", true },
{ "lakelandbank.com", true },
{ "lakeoswegotowncar.com", true },
@@ -21875,7 +22648,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lakesherwoodoutdoorlighting.com", true },
{ "lakeshowlife.com", true },
{ "lakewoodcityglass.com", true },
- { "lakhesis.net", true },
{ "lakkt.de", true },
{ "lakonia.com.br", true },
{ "lalalab.com", true },
@@ -21883,11 +22655,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "laled.ch", true },
{ "lalingua.ir", true },
{ "lalucioledigitale.com", true },
+ { "lalunaonlinebr.com", true },
{ "lalunecreative.com", true },
{ "lalyre-corcelles.ch", true },
{ "lamakat.de", true },
{ "lamapoll.de", true },
{ "lamarieealhonneur.com", false },
+ { "lambangcapgiare.com", true },
{ "lambauer.com", true },
{ "lambdaof.xyz", true },
{ "lambertshealthcare.co.uk", true },
@@ -21911,12 +22685,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lampenwelt.at", true },
{ "lampenwelt.ch", true },
{ "lampenwelt.de", true },
+ { "lampl.info", false },
{ "lampposthomeschool.com", true },
{ "lampsh.ml", true },
{ "lampy.pl", true },
{ "lamunyon.com", true },
{ "lan.biz.tr", true },
- { "lana.swedbank.se", true },
{ "lanahallen.com", true },
{ "lanbroa.eu", true },
{ "lancashirecca.org.uk", true },
@@ -21961,7 +22735,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lang-php.com", true },
{ "langatang.com", true },
{ "langbein.org", true },
- { "langguth.io", true },
{ "langkahteduh.com", true },
{ "langkawitrip.com", true },
{ "langotie.com.br", true },
@@ -21972,17 +22745,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "langworth.com", true },
{ "langzijn.nl", true },
{ "lanna.io", true },
+ { "lannainnovation.com", true },
+ { "lannamontessori.com", true },
+ { "lannatefl.com", true },
{ "lanodan.eu", true },
{ "lanostrasalute.it", true },
{ "lanre.org", true },
{ "lanroamer.de", true },
{ "lansechensilu.com", true },
+ { "lansewu.com", true },
{ "lanternalauth.com", true },
{ "lanternhealth.org", true },
{ "lantian.pub", true },
{ "lanturtle.com", true },
{ "lanuovariviera.it", true },
- { "lanyang.tk", true },
{ "lanzamientovirtual.es", true },
{ "lanzarote-online.info", true },
{ "laos.dating", true },
@@ -21999,6 +22775,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lapotagere.ch", true },
{ "lapparente-aise.ch", true },
{ "lappari.com", true },
+ { "lapshore.com", true },
{ "lara.photography", true },
{ "larabergmann.de", true },
{ "laracode.eu", true },
@@ -22011,6 +22788,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "larbertbaptist.org", true },
{ "lareclame.fr", true },
{ "larepublicacultural.es", true },
+ { "lares.com", true },
{ "largescaleforums.com", true },
{ "largeviewer.com", true },
{ "lariposte.org", true },
@@ -22026,7 +22804,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lars-mense.de", true },
{ "lars.cloud", true },
{ "lars.moi", true },
- { "larsbauer.xyz", true },
{ "larsklene.nl", true },
{ "larsklint.com", true },
{ "laruga.co.uk", true },
@@ -22036,6 +22813,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lasavonnerieducroisic.fr", true },
{ "lascana.co.uk", true },
{ "lasereyess.net", true },
+ { "laserhealthsolutions.com", true },
{ "laserpc.net", true },
{ "laserplaza.de", true },
{ "laserplaza.net", true },
@@ -22051,6 +22829,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lasseleegaard.dk", true },
{ "lasseleegaard.net", true },
{ "lasseleegaard.org", true },
+ { "lassesworld.com", true },
+ { "lassesworld.se", true },
{ "lastbutnotyeast.com", true },
{ "lastchancetraveler.com", true },
{ "lastharo.com", true },
@@ -22067,12 +22847,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "latenitefilms.com", false },
{ "lateral.dog", true },
{ "lateralsecurity.com", true },
- { "latestbuy.com.au", true },
{ "latestdeals.co.uk", true },
{ "latiendauno.com", true },
{ "latiendawapa.com", true },
{ "latinmusicrecords.com", true },
{ "latino.dating", true },
+ { "latinphone.com", true },
{ "latintoy.com", true },
{ "latitudesign.com", true },
{ "latremebunda.com", true },
@@ -22087,6 +22867,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "laughinggrapepublishing.com", true },
{ "laukstein.com", true },
{ "launayflorian.net", true },
+ { "launcher-minecraft.com", true },
{ "launchkey.com", false },
{ "launchmylifend.com", true },
{ "launchpad-app2.com", true },
@@ -22113,7 +22894,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lavalite.de", true },
{ "lavamob.com", true },
{ "lavanderia.roma.it", true },
- { "lavasing.eu.org", true },
{ "lavaux.lv", true },
{ "lavenderx.org", true },
{ "laviedalex.ovh", true },
@@ -22122,15 +22902,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lavita.de", true },
{ "lavitaura.com", true },
{ "lavitrine-une-collection.be", true },
+ { "lavka-konditera.com", true },
{ "lavoieducoeur.be", true },
{ "lavoiepharmd.com", true },
{ "lavolte.net", true },
+ { "lavril.fr", true },
{ "law-colleges.com", true },
{ "law-peters.de", true },
{ "law.co.il", true },
{ "law22.com", true },
{ "lawbirduk.com", true },
- { "lawformt.com", true },
{ "lawn-seeds.com", true },
{ "lawnuk.com", true },
{ "lawrenceberg.nl", true },
@@ -22138,9 +22919,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lawrencewhiteside.com", true },
{ "lawyerdigital.co.bw", true },
{ "lawyerkf.com", true },
+ { "layazc.com", true },
{ "laylo.io", false },
{ "laylo.nl", false },
+ { "layordesign.co.uk", true },
{ "layoutsatzunddruck.de", true },
+ { "lazau.com", true },
{ "lazistance.com", true },
{ "lazowik.pl", true },
{ "lazyboston.com", true },
@@ -22157,6 +22941,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lbmblaasmuziek.nl", true },
{ "lbphacker.pw", true },
{ "lbs-logics.com", true },
+ { "lbsistemas.com.mx", true },
{ "lbux.org", true },
{ "lc-cs.com", false },
{ "lc-promiss.de", true },
@@ -22175,7 +22960,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ldjb.jp", true },
{ "ldsun.com", true },
{ "le-bar.org", true },
- { "le-blog.ch", true },
{ "le-controle-parental.fr", true },
{ "le-creux-du-van.ch", true },
{ "le-dev.de", false },
@@ -22185,11 +22969,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "le-page.info", true },
{ "le-palantir.com", true },
{ "le-traiteur-parisien.fr", true },
- { "le0.me", true },
- { "le0yn.ml", true },
{ "le130rb.com", true },
{ "le23.fr", true },
{ "le42mars.fr", true },
+ { "leadbook.ru", true },
{ "leadbox.cz", true },
{ "leaderoftheresistance.com", false },
{ "leaderoftheresistance.net", false },
@@ -22203,13 +22986,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "leafandseed.co.uk", true },
{ "leafans.tk", false },
{ "leafinote.com", true },
+ { "leafland.co.nz", true },
{ "leakforums.net", true },
{ "leamsigc.com", true },
{ "leandre.cn", true },
{ "leankit.com", true },
{ "leanplando.com", true },
{ "leap-it.be", true },
- { "leapandjump.co.uk", true },
{ "learndev.info", true },
{ "learnflakes.net", true },
{ "learnforestry.com", true },
@@ -22220,6 +23003,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "learnlux.com", true },
{ "learnpianogreece.com", true },
{ "learnplayground.com", true },
+ { "learnthetruth.tk", true },
+ { "learntotradethemarket.com", true },
{ "learntube.cz", true },
{ "leaseit24.com", true },
{ "leaseit24.de", true },
@@ -22232,7 +23017,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "leatherwood.nl", true },
{ "leavesofchangeweekly.org", true },
{ "lebanesearmy.gov.lb", true },
- { "lebarbatruc.com", true },
{ "lebarmy.gov.lb", true },
{ "lebendige-heilkunst.de", true },
{ "lebens-fluss.at", true },
@@ -22252,7 +23036,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lederer-it.com", true },
{ "ledlight.com", true },
{ "ledscontato.com.br", true },
- { "ledzom.ru", false },
{ "lee-fuller.co.uk", true },
{ "leeaaronsrealestate.com", true },
{ "leebiblestudycentre.co.uk", true },
@@ -22269,32 +23052,37 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "leetcode.net", true },
{ "leetgamers.asia", true },
{ "leevealdc.com", true },
- { "lefcoaching.nl", true },
+ { "lefcoaching.nl", false },
{ "lefebvristes.com", true },
{ "lefebvristes.fr", true },
{ "leflibustier.ru", true },
{ "lefonddeloeil.com", true },
+ { "left-baggage.co.uk", true },
{ "leftclick.cloud", true },
{ "leftclick.eu", true },
{ "lega-dental.com", true },
- { "legacy.bank", true },
+ { "legabot.fr", true },
{ "legadental.com", true },
{ "legaillart.fr", true },
{ "legalcontrol.info", true },
{ "legaldesk.com", true },
+ { "legalforms.ng", true },
{ "legalinmotion.es", true },
{ "legalrobot.com", true },
+ { "legendagroup.ch", true },
{ "legendesdechine.ch", true },
{ "legendofkrystal.com", true },
{ "legends-game.ru", false },
{ "legible.es", true },
{ "legilimens.de", true },
{ "legioniv.org", true },
+ { "legionminecraft.com", true },
{ "legiscontabilidade.com.br", true },
{ "legissa.ovh", true },
{ "legit.nz", true },
{ "legjobblogo.hu", true },
{ "legland.fr", true },
+ { "legnami24.it", true },
{ "legoutdesplantes.be", true },
{ "legrandvtc.fr", true },
{ "legumeinfo.org", true },
@@ -22314,7 +23102,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lejardindesmesanges.fr", true },
{ "lektier.cf", true },
{ "lel.ovh", true },
- { "lelambiental.com.br", true },
{ "lemarcheelagrandeguerra.it", true },
{ "lemazol.fr", true },
{ "lemni.top", true },
@@ -22325,6 +23112,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lemonop.com", true },
{ "lemonparty.co", true },
{ "lemonrockbiketours.com", true },
+ { "lemonthy.ca", true },
{ "lemonthy.com", true },
{ "lemouillour.fr", true },
{ "lemuslimpost.com", true },
@@ -22337,6 +23125,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lengzzz.com", true },
{ "lenidh.de", true },
{ "leninalbertop.com.ve", true },
+ { "lennier.info", true },
{ "lennyobez.be", true },
{ "lenou.nl", true },
{ "lenr-forum.com", true },
@@ -22361,7 +23150,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "leonklingele.de", true },
{ "leonmahler.consulting", true },
{ "leontiekoetter.de", true },
- { "leopoldina.net", true },
{ "leovanna.co.uk", true },
{ "leowkahman.com", true },
{ "lep.gov", true },
@@ -22370,6 +23158,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "leponton-lorient.fr", true },
{ "leppis-it.de", true },
{ "lepsos.com", true },
+ { "lequateur.fr", true },
{ "lequerceagriturismo.com", true },
{ "lequest.dk", true },
{ "lereporter.ma", true },
@@ -22385,14 +23174,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "les-ateliers-de-melineo.be", true },
{ "les-inoxydables.com", true },
{ "les-pingouins.com", true },
- { "lesaffre.es", true },
{ "lesancheslibres.fr", true },
{ "lesarts.com", true },
{ "lesberger.ch", true },
{ "lesbrillantsdaristide.com", true },
+ { "lesconteursavis.org", true },
{ "leseditionsbraquage.com", true },
{ "lesfilmsavivre.com", true },
{ "lesgoodnews.fr", true },
+ { "leshervelines.com", true },
{ "lesjardinsdemathieu.net", true },
{ "lesjardinsdubanchet.fr", true },
{ "lesmamy.ch", true },
@@ -22403,14 +23193,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lesplatanes.ch", true },
{ "lespret.nl", true },
{ "lesquerda.cat", false },
- { "lesscloud.com", true },
{ "lessets-graphiques.com", true },
{ "lessis.moe", true },
{ "lesterchan.net", true },
{ "lesterrassesdusoleil.ch", true },
+ { "lesummeira.is", true },
{ "lesyndicat.info", true },
+ { "leszonderstress.nl", true },
{ "letemps.ch", true },
{ "letertrefleuri.com", true },
+ { "letkidsbekids.co.uk", true },
{ "leto12.xyz", true },
{ "letranif.net", true },
{ "lets-bounce.com", true },
@@ -22420,11 +23212,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lets.nu", true },
{ "letsbounceuk.com", true },
{ "letsdebug.net", true },
+ { "letsdocode.com", true },
{ "letsencrypt-for-cpanel.com", true },
{ "letsgame.nl", true },
{ "letsgetchecked.com", true },
{ "letsgowhilewereyoung.com", true },
{ "letskick.ru", true },
+ { "letson.me", true },
+ { "letsorganise.uk", true },
{ "letspartyrugby.co.uk", true },
{ "letssackcancer.org", true },
{ "letstalkcounseling.com", true },
@@ -22439,15 +23234,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "leumi-how-to.co.il", true },
{ "leuthardtfamily.com", true },
{ "levans.fr", true },
- { "levanscatering.com", true },
+ { "levanscatering.com", false },
{ "level-10.de", true },
- { "levelaccordingly.com", true },
+ { "level6.me", true },
{ "levelcheat.com", true },
{ "levelonetrainingandfitness.com", true },
{ "leveluplv.com", true },
{ "leveluprails.com", true },
{ "levendwater.org", true },
{ "levensbron.nl", true },
+ { "leventismotors.com.ng", true },
{ "leverj.io", true },
{ "levermann.eu", true },
{ "leviaan.nl", true },
@@ -22464,6 +23260,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lewislaw.com", true },
{ "lewisllewellyn.me", true },
{ "lexdigital.pl", true },
+ { "lexic.co", true },
{ "lexico.pt", true },
{ "lexicography.online", true },
{ "lexpierce.social", true },
@@ -22472,23 +23269,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lezard-com.fr", true },
{ "lfashion.eu", true },
{ "lfgss.com", true },
- { "lfklzw.com", true },
- { "lfrconseil.com", true },
- { "lfullerdesign.com", true },
{ "lg-waps.go.jp", true },
{ "lg-waps.jp", true },
{ "lg0.site", true },
{ "lgbt-colleges.com", true },
{ "lgbt.io", true },
{ "lgbt.ventures", true },
+ { "lgbtq.cool", true },
{ "lghfinancialstrategy.ch", true },
{ "lgpecasoriginais.com.br", true },
{ "lhajn.cz", true },
{ "lhakustik.se", true },
{ "lhalbert.xyz", true },
- { "lhamaths.online", false },
+ { "lhamaths.online", true },
{ "lhconsult.tk", false },
- { "lhero.org", true },
{ "lhgavarain.com", true },
{ "lhost.su", true },
{ "li-ke.co.jp", true },
@@ -22497,6 +23291,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "liam-w.io", true },
{ "liamelliott.me", true },
{ "liamlin.me", true },
+ { "liangyichen.net", true },
{ "lianye1.cc", true },
{ "lianye2.cc", true },
{ "lianye3.cc", true },
@@ -22509,6 +23304,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "libble.eu", true },
{ "liberapay.com", true },
{ "liberation2020.com", true },
+ { "liberationschool.org", true },
{ "liberdademg.com.br", true },
{ "libgame.com", true },
{ "libmpq.org", true },
@@ -22524,13 +23320,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "libre.university", true },
{ "libreboot.org", true },
{ "librebox.de", true },
- { "libreduca.com", true },
{ "librelamp.com", true },
- { "libremail.nl", true },
{ "librends.org", true },
{ "libreoffice-from-collabora.com", true },
{ "libreofficefromcollabora.com", true },
{ "librervac.org", true },
+ { "librisulibri.it", true },
{ "librosdescargas.club", true },
{ "libscode.com", false },
{ "libskia.so", true },
@@ -22562,6 +23357,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lie.as", true },
{ "liebel.org", true },
{ "lieberwirth.biz", true },
+ { "liehuojun.com", true },
{ "liemen.net", true },
{ "lierrmm.space", true },
{ "lieuu.com", true },
@@ -22577,13 +23373,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lifegrip.com.au", true },
{ "lifeinhex.com", true },
{ "lifeinsurancepro.org", true },
- { "lifeisabug.com", true },
{ "lifekiss.ru", true },
{ "lifelenz.com", true },
{ "lifematenutrition.com", true },
{ "lifemstyle.com", true },
{ "lifeqa.net", true },
- { "lifequotes-uk.co.uk", true },
{ "lifereset.it", true },
{ "lifesafety.com.br", true },
{ "lifestylecent.com", true },
@@ -22594,6 +23388,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lifi.is", true },
{ "lift-wise.com", true },
{ "liftie.info", true },
+ { "liftoff.rocks", true },
{ "ligadosgames.com", true },
{ "light-up.xyz", true },
{ "light.mail.ru", true },
@@ -22622,10 +23417,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lights.co.uk", true },
{ "lights.ie", true },
{ "lightscale.com", true },
- { "lightsheep.no", true },
+ { "lightsheep.no", false },
{ "lightspeed.com", false },
{ "lightspeedta.co", true },
+ { "lighttp.com", true },
{ "lightupcollective.co.uk", true },
+ { "lightweighthr.com", true },
+ { "ligmadrive.com", true },
{ "lignite.com", true },
{ "lignoma.com", true },
{ "ligonier.com", true },
@@ -22640,9 +23438,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "likehifi.de", true },
{ "likemovies.de", true },
{ "likenewhearing.com.au", true },
+ { "likeometer.co", true },
{ "likere.com", true },
{ "likesforinsta.com", true },
- { "likui.me", true },
{ "lilaccakeboutique.com", true },
{ "liliang13.com", true },
{ "liljohnsanitary.net", true },
@@ -22669,11 +23467,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "limousineservicezurich.com", true },
{ "limpid.nl", true },
{ "limules.ch", true },
+ { "limx.win", true },
{ "lin.fi", true },
+ { "linaklein.de", true },
{ "linan.blog", true },
+ { "linan.info", true },
+ { "linan.me", true },
+ { "linan.site", true },
+ { "linasjourney.com", true },
{ "lincdavis.com", true },
{ "linchpin-it.com", true },
{ "lincnaarzorg.nl", true },
+ { "lincoln.com.cn", true },
+ { "lincoln.mx", true },
{ "lincolnfinewines.com", true },
{ "lincolnpedsgroup.com", true },
{ "lincolnsfh.com", true },
@@ -22683,8 +23489,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lindemann.space", true },
{ "linden.me", true },
{ "lindeskar.se", true },
- { "lindholmen.club", true },
{ "lindnerhof-taktik.de", true },
+ { "lindnerhof.info", true },
{ "lindo.ru", true },
{ "lindon.pw", true },
{ "lindsayanderson.com", true },
@@ -22708,6 +23514,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "linherest.tk", true },
{ "linhua.org", true },
{ "link-sanitizer.com", true },
+ { "link.ba", true },
{ "link2serve.com", true },
{ "linkat4.cz", true },
{ "linkdr.uk", true },
@@ -22718,13 +23525,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "linkmaker.co.uk", true },
{ "linkmauve.fr", true },
{ "linkopia.com", true },
- { "linkstream.live", true },
+ { "linkst.co", true },
{ "linkthis.me", true },
- { "linkthis.ml", true },
- { "linkthisstatus.ml", true },
{ "linktio.com", true },
{ "linky.tk", true },
{ "linkycat.com", true },
+ { "linkyou.top", true },
{ "linode.com", false },
{ "linost.com", true },
{ "linpx.com", true },
@@ -22744,6 +23550,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "linux3.org", true },
{ "linuxadictos.com", true },
{ "linuxbabe.com", true },
+ { "linuxbg.eu", true },
{ "linuxbierwanderung.com", true },
{ "linuxchick.se", true },
{ "linuxcommand.ru", true },
@@ -22755,34 +23562,36 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "linuxos.org", true },
{ "linuxproperties.com", true },
{ "linuxsecurity.expert", true },
- { "linx.li", true },
{ "linx.net", true },
{ "linzgau.de", true },
{ "linzyjx.com", true },
- { "lionlyrics.com", true },
{ "lionsdeal.com", true },
{ "lipartydepot.com", true },
{ "lipex.com", true },
+ { "lipighor.com", true },
+ { "lipighor.xyz", true },
{ "lipoabaltimore.org", true },
+ { "lippu1.fi", true },
{ "lipthink.com", true },
{ "liqd.net", true },
+ { "liqueur.wiki", true },
{ "liquid.cz", true },
{ "liquidhost.co", true },
{ "liquidinternet.co", true },
- { "liquidradio.pro", true },
{ "liquipedia.net", true },
{ "lirion.de", true },
{ "liris-beautywelt.de", true },
{ "lirlandais.ch", true },
{ "lirnberger.com", true },
+ { "lisahh-jayne.com", true },
{ "lisamccorrie.com", true },
{ "lisamortimore.com", true },
{ "lisanzauomo.com", true },
{ "lisburnhottubnbounce.co.uk", true },
{ "liskgdt.net", true },
- { "lisky.ru", true },
{ "lislan.org.uk", true },
{ "lisowski-development.com", false },
+ { "list-gymnasium.de", true },
{ "listahu.org", true },
{ "listekdo.fr", true },
{ "listen.dk", true },
@@ -22794,10 +23603,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "litebit.eu", true },
{ "litebitanalytics.eu", true },
{ "litebits.com", true },
- { "litemind.com", true },
+ { "litemind.com", false },
{ "literarymachin.es", true },
{ "literature-schools.com", true },
- { "literaturpreis-bad-wurzach.de", true },
{ "litfin.name", true },
{ "lithan.com", true },
{ "lithesalar.se", true },
@@ -22805,22 +23613,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "litsovet.com", true },
{ "little-cake.com", true },
{ "littlebestfriend.de", true },
+ { "littleblackfish.se", true },
{ "littleboutiqueshop.co.uk", true },
{ "littleboutiqueshop.com", true },
{ "littleboutiqueshop.uk", true },
{ "littledev.nl", true },
+ { "littleduck.xyz", true },
{ "littlefairy.no", true },
{ "littlefamilyadventure.com", true },
{ "littlegreece.ae", true },
{ "littlejumpers.co.uk", true },
+ { "littlelife.co.uk", true },
{ "littlenina.nz", false },
{ "littlepigcreek.com.au", true },
{ "littlepincha.fr", true },
{ "littleprincessandmascotparties.co.uk", true },
- { "littleqiu.net", true },
{ "littleredpenguin.com", true },
{ "littleredsbakeshop.com", true },
- { "littlericket.me", false },
+ { "littlericket.me", true },
{ "littlescallywagsplay.co.uk", true },
{ "littleskin.cn", true },
{ "littleswitch.co.jp", true },
@@ -22828,12 +23638,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "litvideoserver.de", true },
{ "litz.ca", true },
{ "litzenberger.ca", true },
+ { "liu0hy.cn", true },
{ "liuboznaiko.eu", true },
{ "liudon.org", true },
- { "liufengyu.cn", true },
{ "liul.in", true },
{ "liupeicheng.top", true },
+ { "liuxiangling.com", true },
{ "liv3d.stream", true },
+ { "livadm.ml", true },
{ "livaniaccesorios.com", true },
{ "live4k.media", false },
{ "livebandphotos.com", true },
@@ -22843,6 +23655,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "livecards.es", true },
{ "livecards.eu", true },
{ "livecards.it", true },
+ { "livecchi.cloud", true },
{ "livedesign.at", true },
{ "livedesign24.de", true },
{ "liveflightapp.com", true },
@@ -22862,18 +23675,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "livelexi.com", true },
{ "livelifewithintent.com", true },
{ "livepaperhelp.com", true },
- { "livepath.ch", true },
{ "liveperformersmeeting.net", true },
{ "liveregistratie.nl", true },
{ "liverider.co.jp", true },
{ "livesheep.com", true },
{ "livesure.com", true },
{ "livetoride.co.za", true },
- { "livetube.tv", true },
{ "livi.co", true },
{ "livi.co.uk", true },
{ "livi.fr", true },
{ "living-space.co.nz", true },
+ { "living-with-outlook-2010.com", true },
{ "living.digital", true },
{ "living.video", true },
{ "living24.de", true },
@@ -22885,26 +23697,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "livingworduk.org", true },
{ "livnev.me", true },
{ "livnev.xyz", true },
+ { "livogeva.dk", true },
{ "livolett.de", true },
- { "livres-et-stickers.com", true },
{ "lixiaoyu.live", true },
{ "lixtick.com", true },
{ "liyang.pro", false },
{ "liyin.date", true },
- { "liyunbin.com", true },
{ "liz.ee", true },
{ "lizardsystems.com", true },
{ "lizheng.de", true },
{ "lizhi.io", true },
- { "lizhi123.net", true },
+ { "lizhuogui.ga", true },
{ "lizmooredestinationweddings.com", true },
{ "lizzaran.io", true },
{ "lizzwood.com", true },
- { "ljc.ro", true },
+ { "ljason.cn", true },
+ { "ljoonal.xyz", true },
{ "ljs.io", true },
{ "ljskool.com", true },
{ "ljusdalsnaprapatklinik.se", true },
+ { "ljw.me", true },
{ "lk-hardware.cz", true },
+ { "lkellar.org", true },
{ "lknw.de", true },
{ "lkp111138.me", true },
{ "llamacuba.com", true },
@@ -22929,8 +23743,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lmtravis.com", true },
{ "lng-17.org", true },
{ "lnhequipmentltd.com", true },
+ { "lnmp.me", true },
{ "lntu.org", true },
- { "lnx.li", true },
{ "lnyltx.cn", true },
{ "load-ev.de", true },
{ "loadlow.me", true },
@@ -22939,38 +23753,38 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "loancompare.co.za", true },
{ "loandolphin.com.au", true },
{ "loanreadycredit.com", true },
+ { "loansharkpro.com", true },
{ "loanstreet.nl", true },
{ "lob-assets-staging.com", true },
{ "lob-assets.com", true },
{ "lob-staging.com", true },
{ "lob.com", true },
{ "lobivia.de", true },
+ { "lobosdomain.hopto.org", true },
{ "lobsangstudio.com", true },
{ "lobstr.co", true },
{ "local360.net", true },
{ "localbandz.com", true },
{ "localbitcoins.com", true },
+ { "localblitz.com", true },
{ "localblock.co.za", true },
{ "localbouncycastle.com", true },
{ "localdecor.com.br", true },
- { "localea.com", true },
+ { "localegroup.com", true },
{ "localethereum.com", true },
{ "localhorst.duckdns.org", true },
+ { "localhorst.xyz", true },
{ "localhost.ee", true },
{ "localprideart.com", true },
{ "localsource.eu", true },
{ "localspot.pl", true },
{ "locapos.com", true },
{ "location-fichier-email.com", true },
- { "locationvoitureallemagne.com", true },
- { "locationvoitureangleterre.com", true },
- { "locationvoitureaustralie.com", true },
- { "locationvoiturebelgique.com", true },
- { "locationvoitureespagne.com", true },
- { "locationvoitureitalie.com", true },
- { "locationvoitureportugal.com", true },
{ "locatorplus.gov", true },
{ "locauxrama.fr", true },
+ { "lock23.ca", true },
+ { "lockaby.org", true },
+ { "locker.email", true },
{ "locker.plus", true },
{ "locklock.com.br", true },
{ "locklockbrasil.com.br", true },
@@ -22983,20 +23797,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "locksmithbalchsprings.com", true },
{ "locksmithballito.com", true },
{ "locksmithbluff.co.za", true },
+ { "locksmithcarrolltontx.com", true },
{ "locksmithdearborn.com", true },
+ { "locksmithdrippingspringstx.com", true },
{ "locksmithedmonds.com", true },
{ "locksmithfriendswoodtexas.com", true },
{ "locksmithgarland-tx.com", true },
{ "locksmithgrapevinetx.com", true },
{ "locksmithhumbletx.com", true },
{ "locksmithindurban.co.za", true },
+ { "locksmithlakewaytx.com", true },
{ "locksmithlivoniami.com", true },
{ "locksmithmadisonheights.com", true },
+ { "locksmithmesquitetexas.com", true },
{ "locksmithmesquitetx.com", true },
{ "locksmithmissouricity.com", true },
{ "locksmithopen.com", true },
{ "locksmithsammamishwa.com", true },
{ "locksmithsanantoniotexas.com", true },
+ { "locksmithsbuda.com", true },
{ "locksmithscottsdaleaz.com", true },
{ "locksmithseattleco.com", true },
{ "locksmithservice-houston.com", true },
@@ -23004,11 +23823,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "locksmithspringtx.com", true },
{ "locksmithswestville.com", true },
{ "locksmiththewoodlands.com", true },
+ { "lockwoodchristmastreefarm.com", true },
{ "locomocosec.com", true },
- { "locomore.com", true },
{ "locomotionds.com", true },
{ "locomotive.net.br", true },
{ "locurimunca.co", true },
+ { "locus-dashboard.com", true },
+ { "locusmap.eu", true },
{ "lodash.com", false },
{ "loddeke.eu", true },
{ "lodewijkict.nl", true },
@@ -23033,7 +23854,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "logicio.net", false },
{ "logicne-hise.si", true },
{ "logicoma.com", true },
- { "logicz.top", true },
{ "login.corp.google.com", true },
{ "login.gov", false },
{ "login.launchpad.net", true },
@@ -23042,7 +23862,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "login.xero.com", false },
{ "login.yahoo.com", false },
{ "loginsentinel.eu", true },
- { "logitank.net", true },
{ "logitel.de", true },
{ "logoesun.com", true },
{ "logoglo.com", true },
@@ -23076,27 +23895,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lojaprojetoagua.com.br", true },
{ "lojasceletro.com.br", true },
{ "lojaterrazul.com.br", true },
- { "lojavirtualfc.com.br", true },
{ "lojavisamed.com.br", true },
{ "lojix.com", true },
{ "lojj.pt", true },
{ "lok.space", true },
{ "lokaal.org", true },
+ { "lokal-speisen.de", true },
{ "loker.id", true },
{ "loket.nl", true },
- { "lolcorp.pl", true },
{ "lolcow.farm", true },
{ "lolhax.org", true },
- { "loli.ee", true },
{ "loli.net", true },
{ "loli.pet", true },
{ "loli.ski", true },
{ "loli.tube", true },
+ { "loli.vip", true },
{ "loli.world", true },
{ "lolibrary.org", true },
{ "lolic.xyz", true },
- { "lolico.moe", true },
{ "lolicon.eu", true },
+ { "lolitalechat.com", true },
{ "lolkot.ru", true },
{ "lolly.cc", true },
{ "lolnames.gg", true },
@@ -23107,7 +23925,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lommyfleet.com", true },
{ "lon-so.com", true },
{ "lona.io", true },
- { "lonal.com", true },
+ { "lonay.me", true },
{ "london-transfers.com", true },
{ "london.dating", true },
{ "londongallery.net", true },
@@ -23118,6 +23936,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lonesomecosmonaut.com", true },
{ "lonestarlandandcommercial.com", true },
{ "long-journey.com", true },
+ { "long139.com", true },
+ { "long18.cc", true },
+ { "long688.com", true },
{ "longboat.io", true },
{ "longhaircareforum.com", true },
{ "longhorn-imports.com", true },
@@ -23127,10 +23948,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lonniec.com", true },
{ "lonniemason.net", true },
{ "look.co.il", true },
- { "looka.ch", true },
- { "looka.photo", true },
{ "lookagain.co.uk", true },
- { "lookart.ch", true },
{ "lookasik.eu", true },
{ "lookastic.co.uk", true },
{ "lookastic.com", true },
@@ -23141,9 +23959,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lookastic.ru", true },
{ "lookatmysco.re", true },
{ "lookbetweenthelines.com", true },
- { "looker.wang", true },
{ "lookup-dns.net", true },
- { "lookyman.net", true },
{ "lookzook.com", true },
{ "loom.no", true },
{ "loopstart.org", true },
@@ -23166,10 +23982,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "losangelestown.com", true },
{ "losless.fr", true },
{ "losreyesdeldescanso.com.ar", true },
+ { "loss.no", true },
{ "lost.host", true },
{ "lost.report", true },
+ { "lostinweb.eu", true },
{ "lostkeys.co.uk", true },
+ { "lostsandal.com", true },
+ { "lostsandal.io", true },
{ "lostserver.com", true },
+ { "lostwithdan.com", true },
{ "loteamentomontereiitu.com.br", true },
{ "lothlorien.ca", false },
{ "lotl.ru", true },
@@ -23178,6 +23999,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lotnonline.com", true },
{ "lotnonline.nl", true },
{ "lotro-wiki.com", true },
+ { "lotsofbargains.com", true },
{ "lottospielen24.org", false },
{ "lotw.de", true },
{ "lotz.li", true },
@@ -23185,6 +24007,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "louange-reconvilier.ch", true },
{ "loucanfixit.com", true },
{ "louerunhacker.fr", true },
+ { "louisapolicefoundation.com", true },
+ { "louisapolicefoundation.org", true },
{ "louisemisellinteriors.co.uk", true },
{ "louisvillecarguys.com", true },
{ "loune.net", true },
@@ -23198,7 +24022,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lovecrystal.co.uk", true },
{ "loveislandgames.com", true },
{ "loveisourweapon.com", true },
- { "lovelens.li", false },
{ "lovelivewiki.com", true },
{ "lovelovenavi.jp", true },
{ "lovemanagementaccounts.co.uk", true },
@@ -23211,7 +24034,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lovesmagical.com", true },
{ "lovesupremefestival.com", true },
{ "lovevape.co", true },
- { "loveyounastya.com", true },
{ "loveysa.ch", true },
{ "lovg.ren", true },
{ "lovingearth.co", true },
@@ -23226,29 +24048,35 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lowsidetna.com", true },
{ "lowson.ca", true },
{ "loxal.net", true },
- { "loyaleco.it", true },
{ "loyaltyondemand.club", true },
{ "loyaltyondemand.eu", true },
{ "lp-support.nl", true },
- { "lprcommunity.co.za", true },
{ "lpt-nebreziny.eu", true },
{ "lra-cloud.de", true },
{ "lrdo.net", true },
{ "lriese.ch", true },
{ "lrssystems.com", true },
{ "ls-alarm.de", true },
+ { "ls-modcompany.com", true },
{ "lsal.me", true },
{ "lsc-dillingen.de", true },
{ "lsc.gov", true },
+ { "lshiy.com", true },
+ { "lsmentor.com", true },
{ "lsmpx.com", true },
{ "lsquo.com", true },
{ "lsscreens.de", true },
+ { "lsy.cn", true },
{ "lsys.ac", true },
{ "lt.search.yahoo.com", false },
{ "ltaake.com", true },
{ "ltecode.com", true },
{ "ltib.com.au", true },
+ { "ltlec.cn", true },
+ { "ltlec.net", true },
+ { "ltlec.org", true },
{ "ltls.org", true },
+ { "ltmw.xyz", true },
{ "ltn-tom-morel.fr", true },
{ "lty.space", true },
{ "lu.search.yahoo.com", false },
@@ -23259,7 +24087,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lublin.toys", true },
{ "luc-oberson.ch", true },
{ "luca-steeb.com", true },
- { "luca.swiss", true },
{ "lucacastelnuovo.nl", false },
{ "lucafontana.net", true },
{ "lucafrancesca.me", true },
@@ -23272,6 +24099,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lucassoler.com.ar", false },
{ "luce.life", true },
{ "luchscheider.de", false },
+ { "lucianoalbanes.com", true },
{ "lucid-light.de", true },
{ "lucidframeworks.com", true },
{ "lucidlight.de", true },
@@ -23281,6 +24109,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "luckycastles.co.uk", true },
{ "luckyfrog.hk", true },
{ "luckyxf.com", true },
+ { "luclu7.fr", true },
{ "lucy.science", true },
{ "lucyparsonslabs.com", true },
{ "lucysan.net", true },
@@ -23290,7 +24119,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ludogue.net", true },
{ "ludovic-muller.fr", true },
{ "ludum.pl", true },
- { "ludwig.im", true },
{ "ludwiggrill.de", true },
{ "ludwigjohnson.se", true },
{ "ludwigpro.net", true },
@@ -23302,7 +24130,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "luffyhair.com", true },
{ "luftbild-siegerland.de", true },
{ "luftreiniger.biz", true },
- { "lufu.io", true },
{ "lugbb.org", true },
{ "lugimax.com", true },
{ "luginbuehl.be", true },
@@ -23311,19 +24138,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "luiscapelo.info", true },
{ "luismaier.de", true },
{ "luisyr.com", true },
+ { "luizkowalski.net", true },
{ "luk.earth", true },
{ "lukas-gorr.de", true },
{ "lukas-meixner.com", true },
- { "lukas-oppermann.de", true },
{ "lukasberan.com", true },
{ "lukasberan.cz", true },
{ "lukasfunk.com", true },
- { "lukasoppermann.com", true },
- { "lukasoppermann.de", true },
{ "lukasschick.de", false },
{ "lukaszorn.de", true },
{ "lukaszwojcik.net", true },
- { "lukatz.de", true },
{ "luke.ch", true },
{ "luke6887.me", true },
{ "lukeistschuld.de", true },
@@ -23358,8 +24182,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lunastrail.com", true },
{ "lunazacharias.com", true },
{ "lunchbunch.me", true },
+ { "lundberghealthadvocates.com", true },
{ "lune-indigo.ch", true },
- { "lungta.pro", true },
{ "lunidea.ch", true },
{ "lunidea.com", true },
{ "lunis.net", true },
@@ -23393,7 +24217,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lutoma.org", true },
{ "luukdebruincv.nl", true },
{ "luukklene.nl", true },
- { "luukuton.fi", true },
{ "luuppi.fi", true },
{ "luvare.com", true },
{ "luvbridal.com.au", true },
@@ -23424,7 +24247,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "lxd.pm", true },
{ "lyam.fr", true },
{ "lycee-saintjoseph-mesnieres.fr", true },
- { "lychankiet.name.vn", false },
{ "lydudlejning.net", true },
{ "lyftrideestimate.com", true },
{ "lykai.ca", true },
@@ -23465,11 +24287,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "m.mail.ru", true },
{ "m.me", true },
{ "m0t0k1ch1.com", true },
- { "m132.eu", true },
+ { "m0v0.com", true },
{ "m134.eu", true },
{ "m2epro.com", true },
{ "m2il.co", true },
{ "m2os.com", true },
+ { "m2tm.fr", true },
{ "m4g.ru", true },
{ "m4rcus.de", true },
{ "ma-eir.nl", true },
@@ -23507,7 +24330,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "machu-picchu.nl", true },
{ "macil.tech", true },
{ "macinyasha.net", true },
- { "macker.io", true },
{ "mackeysack.com", true },
{ "mackiehouse.ca", true },
{ "macksproductions.in", true },
@@ -23520,15 +24342,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "maco.org.uk", true },
{ "maconnerie-dcs.ch", true },
{ "macosxfilerecovery.com", true },
- { "macoun.de", true },
{ "macros.co.jp", true },
{ "macsupportnacka.se", true },
{ "macsupportstockholm.se", true },
{ "mactools.com.co", true },
{ "mad.ninja", true },
{ "madae.nl", true },
- { "madandpissedoff.com", true },
{ "madars.org", false },
+ { "madbicicletas.com", true },
{ "madbin.com", true },
{ "madbouncycastles.co.uk", true },
{ "maddi.biz", true },
@@ -23539,7 +24360,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "made-in-earth.co.jp", true },
{ "madebydusk.com", true },
{ "madebyshore.com", true },
- { "madeinchezmoi.net", true },
{ "madeinstudio3.com", true },
{ "madeitwor.se", true },
{ "madeloc.com", true },
@@ -23552,13 +24372,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "madmar.ee", true },
{ "madmax-store.gr", true },
{ "madoka.nu", true },
- { "madokami.pw", true },
{ "madreacqua.org", true },
{ "madrecha.com", true },
{ "madreshoy.com", true },
{ "madridartcollection.com", true },
{ "madscientistwebdesign.com", true },
{ "madtec.de", true },
+ { "maduradas.info", true },
+ { "maduradas.net", true },
{ "madusecurity.com", true },
{ "mae-berlinistanbul.com", true },
{ "maedchenflohmarkt.at", true },
@@ -23567,8 +24388,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "maelstrom-fury.eu", true },
{ "maelstrom.ninja", true },
{ "maeplasticsurgery.com", true },
- { "maestrano.com", true },
{ "maff.co.uk", true },
+ { "maff.scot", false },
{ "mafia.network", true },
{ "mafiaforum.de", true },
{ "mafiapenguin.club", true },
@@ -23596,13 +24417,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "magical-secrets.com", true },
{ "magical.rocks", true },
{ "magicalcircuslv.com", true },
- { "magicalshuttle.fr", true },
{ "magicamulet.me", true },
{ "magicball.co", true },
{ "magicbroccoli.de", true },
{ "magiccards.info", true },
{ "magicdaysomagh.co.uk", true },
{ "magicdlp.com", true },
+ { "magicjudges.org", true },
{ "magiclen.org", true },
{ "magicspaceninjapirates.de", true },
{ "magictable.com", true },
@@ -23611,10 +24432,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "magnacarebroker.com", true },
{ "magnate.co", true },
{ "magnatronic.com.br", true },
+ { "magneticanvil.com", true },
{ "magneticattraction.com.au", true },
{ "magnetpass.uk", true },
{ "magnets.jp", true },
- { "magnettracker.com", true },
{ "magnificatwellnesscenter.com", true },
{ "magnificentdata.com", true },
{ "magnoliadoulas.com", true },
@@ -23654,8 +24475,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mailer-dot.de", true },
{ "mailfence.com", true },
{ "mailflank.com", true },
+ { "mailhardener.com", true },
{ "mailinabox.email", true },
{ "mailjet.tech", true },
+ { "mailjunky.de", true },
{ "maillady-susume.com", true },
{ "mailmag.net", false },
{ "mailnara.co.kr", true },
@@ -23664,6 +24487,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mailum.org", false },
{ "mainechiro.com", true },
{ "mainframeserver.space", true },
+ { "mainhattan-handwerker.de", true },
{ "mainlined.org", true },
{ "maintenance-traceur-hp.fr", true },
{ "mainzelmaennchen.net", true },
@@ -23686,6 +24510,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "majkassab.com", true },
{ "majkassab.net", true },
{ "majkassab.org", true },
+ { "majkl.me", true },
+ { "majkl.xyz", true },
+ { "majkl578.cz", true },
{ "majkyto.cz", true },
{ "majlovesreg.one", true },
{ "majolka.com", true },
@@ -23696,7 +24523,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "makeaboldmove.com", true },
{ "makechanges.com.au", true },
{ "makedin.net", true },
- { "makedonija.net.mk", true },
{ "makem-bounce.co.uk", true },
{ "makenaiyo-fx.com", true },
{ "makera.ga", true },
@@ -23706,7 +24532,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "maki-chan.de", true },
{ "makinen.ru", true },
{ "makkusu.photo", true },
- { "makkyon.com", true },
+ { "makogaming.com", true },
{ "makos.jp", true },
{ "makowitz.cz", true },
{ "maktoob.search.yahoo.com", false },
@@ -23721,11 +24547,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "maler-marschalleck.de", true },
{ "malermeister-haussmann.de", true },
{ "malesoowki.blog", true },
- { "malezan.com", true },
{ "maliar.fr", true },
{ "malibu-electric.com", true },
{ "malibuelectrical.com", true },
{ "malibuexteriorlighting.com", true },
+ { "malibumodas.com.br", true },
{ "malik.holdings", true },
{ "malik.id", true },
{ "malikussa.id", true },
@@ -23747,28 +24573,27 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "malscan.com", true },
{ "malscan.org", true },
{ "malta-firma.com", true },
+ { "malte-kiefer.de", true },
{ "malufs.com.br", true },
+ { "malvertise.xyz", true },
{ "malware.watch", true },
{ "malwareinvestigator.gov", true },
- { "malwarekillers.com", true },
{ "malwaretips.com", false },
{ "maly.cz", true },
{ "malyshata.com", true },
{ "malysvet.net", true },
- { "mamaasia.info", true },
+ { "mamabepo.com", true },
{ "mamadea.be", true },
{ "mamadoma.com.ua", true },
{ "mamafit.club", true },
{ "mamamoet.ru", true },
{ "mamanecesitaungintonic.com", true },
- { "mambas.cn", true },
+ { "mamaxi.org", true },
{ "mamiecouscous.com", true },
{ "mammals.net", true },
{ "mammaw.com", true },
{ "mammeitalianeavienna.com", true },
- { "mammooc.org", true },
{ "mammothlakesmls.net", true },
- { "mamospienas.lt", true },
{ "mamot.fr", false },
{ "mamuko.nl", true },
{ "man3s.jp", false },
@@ -23777,6 +24602,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "manage.cm", true },
{ "manage4all.de", true },
{ "manageathome.co.uk", true },
+ { "managedhosting.de", true },
{ "management-companie.ro", true },
{ "managementboek.nl", true },
{ "managementfeedback.com", true },
@@ -23785,6 +24611,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "manager-efficacement.com", true },
{ "manager.linode.com", false },
{ "managewp.org", true },
+ { "manantialdevida1450.com", true },
{ "manaonetrading.com", true },
{ "manatees.com.au", true },
{ "manatees.net", true },
@@ -23805,15 +24632,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "manhattanchoralensemble.org", true },
{ "manhole.club", true },
{ "manhuagui.com", true },
+ { "maniacoland.com", true },
{ "manicbouncycastles.co.uk", true },
{ "manicode.com", true },
{ "maniorpedi.com", true },
{ "maniosglass.gr", true },
{ "manipil.ch", true },
- { "maniw.com", true },
{ "manja-und-martin.de", true },
{ "manjaro.ru", true },
{ "mankans.com", true },
+ { "mankomarketing.com", true },
{ "manmeetgill.com", true },
{ "manneguiden.no", true },
{ "mannheimbloggt.tk", true },
@@ -23830,6 +24658,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "manti.by", true },
{ "mantor.org", false },
{ "mantra.pictures", true },
+ { "mantuo.com", true },
+ { "mantuo.xyz", true },
{ "manualidadeson.com", true },
{ "manuall.co.uk", true },
{ "manuall.de", true },
@@ -23851,6 +24681,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "manuscriptlink.com", true },
{ "manutd.org.np", true },
{ "manuth.life", true },
+ { "manwish.cn", true },
{ "manwithavan.co.uk", true },
{ "manyetikboya.com", true },
{ "manyiu.com", true },
@@ -23860,9 +24691,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "maomihz.com", true },
{ "maone.net", true },
{ "maorseo.com", true },
+ { "maorx.cn", true },
{ "maosensanguentadasdejesus.net", true },
{ "maowtm.org", true },
{ "maozedong.red", true },
+ { "map-patho.com", true },
{ "map4erfurt.de", true },
{ "map4jena.de", true },
{ "mapasmundi.com.br", true },
@@ -23873,8 +24706,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "maplegate.info", true },
{ "maplehome.tk", true },
{ "mapletime.com", true },
- { "maps.net", true },
+ { "mapresidentielle.fr", true },
{ "mapstack.org", true },
+ { "maquena.org", true },
{ "maquettage.com", true },
{ "maquinariaspesadas.org", true },
{ "maquinasdecoserplus.com", true },
@@ -23889,8 +24723,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "marc-schlagenhauf.de", true },
{ "marcaixala.me", true },
{ "marcbeije.com", true },
- { "marcberndtgen.de", true },
- { "marcceleiro.cat", true },
{ "marcceleiro.com", true },
{ "marceau.ovh", true },
{ "marcel-preuss.de", true },
@@ -23911,7 +24743,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "marche-contre-monsanto.ch", true },
{ "marchhappy.tech", false },
{ "marchukov.com", true },
- { "marchwj.pl", true },
{ "marciaimportados.com.br", true },
{ "marcianoandtopazio.com", true },
{ "marclay.co.uk", true },
@@ -23920,7 +24751,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "marco-polo-reisen.com", true },
{ "marcocasoni.com", true },
{ "marcoherten.com", true },
- { "marcoklomp.nl", true },
+ { "marcoklomp.nl", false },
{ "marcoslater.com", true },
{ "marcusds.ca", true },
{ "marcuskoh.com", true },
@@ -23938,7 +24769,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "margots.life", true },
{ "margots.tech", true },
{ "marguerite-maison.fr", true },
- { "mariage-photo.ch", true },
{ "mariaheidemann.nl", true },
{ "marianatherapy.com", true },
{ "marianelaisashi.com", true },
@@ -23951,6 +24781,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mariehane.com", true },
{ "mariemiramont.fr", true },
{ "mariereichl.cz", true },
+ { "marietrap.ch", true },
{ "marijnfidder.nl", true },
{ "marikafranke.de", true },
{ "marilsnijders.nl", true },
@@ -23967,7 +24798,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "marinelausa.com", false },
{ "marines-shop.com", true },
{ "mario.party", false },
- { "mariogeckler.de", true },
+ { "mariogeckler.de", false },
{ "mariposah.ch", true },
{ "marisamorby.com", false },
{ "mariskavankasbergen.nl", true },
@@ -24000,7 +24831,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "marketingconverts.com", true },
{ "marketingeinnovacion.com", true },
{ "marketingforfood.com", true },
- { "marketinggenerators.nl", true },
+ { "marketinggenerators.nl", false },
{ "marketingtrendnews.com", true },
{ "marketingvirtuales.com", true },
{ "marketizare.ro", true },
@@ -24008,8 +24839,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "markfordelegate.com", true },
{ "markhaehnel.de", true },
{ "markhenrick.site", true },
- { "markholden.guru", true },
{ "markhoodphoto.com", true },
+ { "markhoodwrites.com", true },
{ "markido.com", true },
{ "markitzeroday.com", true },
{ "markkirkforillinois.com", true },
@@ -24033,7 +24864,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "markt-heiligenstadt.de", false },
{ "marktcontact.com", true },
{ "marktissink.nl", true },
- { "marktplaatshelper.nl", true },
{ "markup-ua.com", true },
{ "markus-blog.de", true },
{ "markus-dev.com", true },
@@ -24054,14 +24884,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "marmotte.love", true },
{ "maroc-bivouac.com", true },
{ "marocemploi.co", true },
- { "marocmail.ma", true },
- { "marotero.com", true },
+ { "maroismasso.com", true },
{ "marpa-wohnen.de", true },
{ "marqueswines.co.uk", true },
{ "marrai.de", true },
{ "marriage-shrine.jp", true },
{ "marrickvilleapartments.com.au", true },
+ { "marron-dietrecipe.com", true },
{ "marsanvet.com", true },
+ { "marsble.com", true },
{ "marseillekiteclub.com", true },
{ "marshallscastles.com", true },
{ "marshallwilson.com", true },
@@ -24077,8 +24908,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "martensson.io", true },
{ "marti201.ga", true },
{ "martialarts-wels.at", true },
+ { "martian.tk", true },
{ "martide.com", true },
- { "martiestrimsalon.nl", true },
{ "martijn.site", true },
{ "martijnhielema.nl", true },
{ "martijnvanderzande.nl", true },
@@ -24092,14 +24923,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "martinkus.eu", true },
{ "martinmuc.de", true },
{ "martinreed.net", true },
+ { "martins.im", true },
{ "martinvillalba.com", true },
{ "martinvillalba.com.ar", true },
{ "martinvillalba.info", true },
{ "martinvillalba.net", true },
{ "martinvillalba.org", true },
{ "martonmihaly.hu", true },
- { "martynhare.co.uk", true },
- { "martynhare.uk", true },
{ "maru-life.com", true },
{ "maruhoi.com", true },
{ "marustat.ru", true },
@@ -24113,7 +24943,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "maryjruggles.com", true },
{ "marykatrinaphotography.com", true },
{ "marylandbasementandcrawlspacewaterproofing.com", true },
- { "marzio.co.za", true },
{ "masarik.sh", true },
{ "masatotaniguchi.jp", true },
{ "masautonomo.com", true },
@@ -24124,7 +24953,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mashandco.it", true },
{ "mashandco.tv", true },
{ "masiniunelte.store.ro", true },
- { "masiul.is", true },
{ "maskim.fr", true },
{ "maslin.io", true },
{ "masrur.org", true },
@@ -24133,7 +24961,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "massage-vitalite.fr", true },
{ "massage4u.net", true },
{ "massagecupping.com", true },
+ { "massageishealthy.com", true },
{ "massagetainha-hanoi.com", true },
+ { "massar.family", true },
{ "massdrop.com", true },
{ "masse.org", true },
{ "massflix.com", true },
@@ -24156,9 +24986,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "masterhelenaroma.com", true },
{ "masterofallscience.com", true },
{ "masterofbytes.ch", true },
+ { "masterpassword.org", true },
{ "masterpc.co.uk", true },
{ "masterplc.com", true },
{ "masters.black", true },
+ { "mastersadistancia.com", true },
{ "masterstuff.de", true },
{ "mastodon.at", true },
{ "mastodon.host", true },
@@ -24174,8 +25006,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "matchatea24.com", true },
{ "matchboxdesigngroup.com", true },
{ "matdogs.com", true },
+ { "mateiko.by", true },
{ "matejgroma.com", true },
{ "matel.org", true },
+ { "matematyka.wiki", true },
{ "materassi.roma.it", true },
{ "materiaischiquinho.com.br", true },
{ "material-ui.com", true },
@@ -24185,19 +25019,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "maternalsafety.org", true },
{ "maternum.com", true },
{ "mateuszchyla.pl", true },
+ { "math-coaching.com", true },
{ "math-colleges.com", true },
{ "math.hamburg", true },
{ "mathalexservice.info", true },
{ "mathematik.rocks", false },
- { "mathembedded.com", true },
{ "matheo-schefczyk.de", true },
{ "mathfinder.org", true },
{ "mathhire.org", true },
- { "mathias.is", true },
{ "mathiasbynens.be", true },
{ "mathiasgarbe.de", true },
{ "mathiaswagner.org", true },
{ "mathieuguimond.com", true },
+ { "mathieui.net", true },
{ "mathis.com.tr", true },
{ "maths.network", true },
{ "mathspace.co", true },
@@ -24206,6 +25040,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "matildajaneclothing.com", true },
{ "matjaz.it", true },
{ "matlss.com", true },
+ { "matocmedia.com", true },
{ "matok.me.uk", true },
{ "matome-surume.com", true },
{ "matomeathena.com", true },
@@ -24234,6 +25069,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mattconstruction.com", true },
{ "mattcorp.com", true },
{ "mattdbarton.com", true },
+ { "matteobrenci.com", true },
{ "matteomarescotti.it", true },
{ "mattessons.co.uk", true },
{ "mattferderer.com", true },
@@ -24251,8 +25087,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "matthewsetter.com", true },
{ "matthey.nl", true },
{ "matthi.coffee", true },
+ { "matthi3u.xyz", true },
{ "matthias-muenzner.de", true },
- { "matthiasadler.info", true },
{ "matthiasbeck.com", true },
{ "matthiasheil.de", true },
{ "matthiasott.com", true },
@@ -24271,6 +25107,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "matway.com", true },
{ "matway.net", true },
{ "matze.co", true },
+ { "mauerwerk.online", true },
{ "mauerwerkstag.info", true },
{ "mauiticketsforless.com", true },
{ "mauldincookfence.com", true },
@@ -24290,8 +25127,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mavora.de", true },
{ "mavotax.at", true },
{ "mavotax.de", true },
- { "mawidabp.com", true },
- { "mawidaca.com", true },
{ "mawo.olkusz.pl", true },
{ "max-moeglich.de", true },
{ "max-went.pl", true },
@@ -24303,7 +25138,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "maxchan.info", true },
{ "maxh.me.uk", true },
{ "maxhamon.ovh", true },
- { "maxhoechtl.at", true },
{ "maximdeboiserie.be", true },
{ "maximdens.be", true },
{ "maximeferon.fr", true },
@@ -24321,9 +25155,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "maxmilton.com", true },
{ "maxmind.com", true },
{ "maxmobiles.ru", true },
+ { "maxmoda.eu", true },
{ "maxp.info", true },
{ "maxpl0it.com", true },
- { "maxr1998.de", true },
{ "maxrandolph.com", true },
{ "maxtruxa.com", true },
{ "maxundlara.at", true },
@@ -24334,10 +25168,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "may24.tw", true },
{ "mayaimplant.com", true },
{ "mayavi.co.in", true },
- { "maydex.info", true },
{ "mayerbrownllz.com", true },
{ "mayomarquees.com", true },
{ "mayopartyhire.com", true },
+ { "mayorcahill.com", true },
{ "maypolevilla.co.uk", true },
{ "mayrhofer.eu.org", false },
{ "mazda-mps.de", true },
@@ -24350,6 +25184,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mazurlabs.tk", true },
{ "mazzotta.me", true },
{ "mb-is.info", true },
+ { "mb-server.de", true },
{ "mbaasy.com", true },
{ "mbaestlein.de", true },
{ "mbainflatables.co.uk", true },
@@ -24371,6 +25206,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mbrooks.info", true },
{ "mbs-journey.com", true },
{ "mbsec.net", true },
+ { "mbsr-barmstedt.de", true },
{ "mburaks.com", true },
{ "mburns.duckdns.org", true },
{ "mbweir.com", true },
@@ -24380,7 +25216,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mc-venture.net", false },
{ "mc4free.cc", true },
{ "mcatnnlo.org", true },
- { "mccarty.io", false },
+ { "mcconciergerie.com", true },
{ "mccoolesredlioninn.com", true },
{ "mccordsvillelocksmith.com", true },
{ "mccrackon.com", true },
@@ -24389,12 +25225,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mcdona1d.me", true },
{ "mcdonalds.be", true },
{ "mcdonalds.design", true },
+ { "mcdsg.net", true },
{ "mce.eu", true },
{ "mce.nyc", true },
{ "mce55.eu", true },
{ "mcea-hld.jp", true },
{ "mceconferencecentre.eu", true },
{ "mcfedries.com", true },
+ { "mcfi.mu", true },
{ "mcfipvt.com", true },
{ "mcfx.us", true },
{ "mcgaccountancy.co.uk", true },
@@ -24406,10 +25244,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mcinterface.de", true },
{ "mcit.gov.ws", true },
{ "mcivor.me", true },
- { "mckenry.net", false },
{ "mckernan.in", true },
{ "mckinley.school", true },
{ "mcl.de", false },
+ { "mcl.gg", true },
{ "mclinflatables.co.uk", true },
{ "mclmotors.co.uk", true },
{ "mclyr.com", true },
@@ -24428,6 +25266,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mcsports.es", true },
{ "mcsrvstat.us", true },
{ "mctools.org", true },
+ { "mcuexchange.com", true },
{ "mcuuid.net", true },
{ "mcversions.net", true },
{ "mcynews.com", true },
@@ -24435,7 +25274,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "md-clinica.com.ua", true },
{ "md5file.com", true },
{ "md5hashing.net", true },
- { "mdazo.net", true },
{ "mdcloudps.com", true },
{ "mdek.at", true },
{ "mdewendt.de", true },
@@ -24479,13 +25317,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mechmk1.me", true },
{ "med-colleges.com", true },
{ "med-otzyv.ru", true },
+ { "med-post.biz", true },
+ { "med-post.co", true },
+ { "med-post.com", true },
+ { "med-post.net", true },
+ { "med-post.org", true },
+ { "med-postclinic.com", true },
+ { "med-postdoctor.com", true },
+ { "med-postdoctors.com", true },
+ { "med-postemergency.com", true },
+ { "med-posthealth.com", true },
+ { "med-postmedical.com", true },
+ { "med-postphysicians.com", true },
+ { "med-postwellness.com", true },
+ { "med.tips", true },
{ "med360.at", true },
{ "medba.se", true },
{ "medcir.com.br", true },
{ "medcrowd.com", true },
{ "meddelare.com", true },
{ "meddigital.com", false },
- { "mede-handover.azurewebsites.net", true },
{ "medecine-esthetique-du-calaisis.fr", true },
{ "medeinos.lt", true },
{ "medellinapartamentos.com", true },
@@ -24496,13 +25347,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "media-instance.ru", true },
{ "media-library.co.uk", true },
{ "media-pi.com", true },
- { "media-service.fr", true },
{ "media-serwis.com", true },
{ "mediaarea.net", true },
{ "mediabackoffice.co.jp", true },
{ "mediablaster.com", true },
{ "mediabogen.net", true },
{ "mediaburst.co.uk", true },
+ { "mediacloud.me", true },
{ "mediadex.be", true },
{ "mediaexpert.fr", true },
{ "mediafly.com", true },
@@ -24523,7 +25374,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mediationculturelleclp.ch", true },
{ "mediatorzy.waw.pl", true },
{ "mediaukkies.nl", true },
- { "mediavault.tech", true },
{ "mediawijsheid.nl", true },
{ "mediawijzer.net", true },
{ "mediawiki.org", true },
@@ -24553,16 +25403,40 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "medinsider.li", true },
{ "medireport.fr", true },
{ "meditadvisors.com", true },
- { "meditel.nl", true },
{ "medium.com", true },
{ "medja.net", true },
{ "medlineplus.gov", true },
- { "medmarkt24.com", true },
{ "medo64.com", true },
{ "medovea.ru", true },
{ "medpeer.co.jp", true },
{ "medpeer.jp", true },
{ "medpics.com", true },
+ { "medpost.biz", true },
+ { "medpost.co", true },
+ { "medpost.info", true },
+ { "medpost.me", true },
+ { "medpost.mobi", true },
+ { "medpost.tv", true },
+ { "medpost.us", true },
+ { "medpostcare.com", true },
+ { "medpostclinic.com", true },
+ { "medpostdoctor.com", true },
+ { "medpostdoctors.com", true },
+ { "medpostemergency.com", true },
+ { "medpostexpresscare.com", true },
+ { "medposthealth.com", true },
+ { "medposthealthcare.com", true },
+ { "medpostimmediatecare.com", true },
+ { "medpostmedical.com", true },
+ { "medpostphysicians.com", true },
+ { "medposturgentcare.biz", true },
+ { "medposturgentcare.co", true },
+ { "medposturgentcare.com", true },
+ { "medposturgentcare.info", true },
+ { "medposturgentcare.net", true },
+ { "medposturgentcare.org", true },
+ { "medpostwalkincare.com", true },
+ { "medpostwellness.com", true },
{ "medschat.com", true },
{ "medtalents.ch", true },
{ "medtehnika.ua", true },
@@ -24590,7 +25464,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "meetingmanage.nl", true },
{ "meetingmanager.ovh", true },
{ "meetings2.com", true },
- { "meetmibaby.co.uk", true },
{ "meetmygoods.com", true },
{ "meetscompany.jp", true },
{ "meeusen-usedcars.be", true },
@@ -24604,7 +25477,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "megabounce.co.uk", true },
{ "megabounceni.co.uk", true },
{ "megabouncingcastles.com", true },
- { "megafilmesplay.net", true },
{ "megaflowers.ru", true },
{ "megagifs.de", true },
{ "megainflatables.co.uk", true },
@@ -24616,7 +25488,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "megapixel.cz", true },
{ "megaplan.cz", true },
{ "megaplan.ru", true },
- { "megaplonk.com", true },
{ "megarex.jp", true },
{ "megasslstore.com", true },
{ "megauction.tk", true },
@@ -24624,7 +25495,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "meggidesign.com", true },
{ "mego.cloud", true },
{ "megumico.net", true },
- { "megustariasaber.com", true },
{ "megztosidejos.lt", true },
{ "meh.is", true },
{ "mehalick.com", true },
@@ -24640,7 +25510,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "meikan.moe", true },
{ "meillard-auto-ecole.ch", true },
{ "meilleur.info", true },
- { "meimeistartup.com", true },
{ "mein-kuechenhelfer.de", true },
{ "mein-muehlhausen.bayern", true },
{ "mein-webportal.de", true },
@@ -24670,6 +25539,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mekesh.ru", true },
{ "meklon.net", true },
{ "mekongeye.com", true },
+ { "mekongmontessori.com", true },
{ "melaniebernhardt.com", true },
{ "melaniegruber.de", true },
{ "melbourne.dating", true },
@@ -24689,6 +25559,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "melnessgroup.com", true },
{ "melnikov.ch", true },
{ "melodicprogressivehouse.com", true },
+ { "melodict.com", true },
{ "melodiouscode.co.uk", true },
{ "melodiouscode.com", true },
{ "melodiouscode.net", true },
@@ -24706,11 +25577,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "meme.institute", true },
{ "memememememememe.me", true },
{ "memepasmal.net", true },
+ { "memes.nz", true },
{ "memesbee.com", true },
{ "memfrob.org", true },
{ "memiux.com", true },
{ "memo-linux.com", true },
{ "memo.ee", true },
+ { "memo2ch.com", true },
{ "memoire-resistance-ariege.fr", true },
{ "memorycards.ie", true },
{ "memoryex.net", true },
@@ -24720,6 +25593,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mendipbouncycastles.co.uk", true },
{ "mendozagenevieve.com", true },
{ "mendy.jp", true },
+ { "menhadendefenders.org", true },
{ "menielias.com", true },
{ "menkyo-blog.com", true },
{ "mennace.com", true },
@@ -24730,11 +25604,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mensagemdaluz.com", true },
{ "mensagensaniversario.com.br", true },
{ "mensagensdeconforto.com.br", true },
- { "mensagensperfeitas.com.br", true },
{ "mensarena.gr", true },
{ "mensch-peter.me", true },
{ "mentalhealthmn.org", true },
{ "mentaltraining-fuer-musiker.ch", true },
+ { "mentecuriosa.net", true },
{ "mentiq.az", true },
{ "mentorithm.com", true },
{ "mentz.info", true },
@@ -24747,8 +25621,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mer.gd", true },
{ "merakilp.com", true },
{ "meransuedtirol.com", true },
- { "mercadobitcoin.com.br", true },
- { "mercadobitcoin.net", true },
+ { "meraseo.com", true },
{ "mercadoleal.com.br", true },
{ "mercadopago.com", true },
{ "mercamaris.es", true },
@@ -24765,7 +25638,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mercuryamericas.com", false },
{ "meremeti-online.gr", true },
{ "meremobil.dk", true },
- { "merenbach.com", true },
+ { "merenbach.com", false },
{ "merenita.com", true },
{ "merenita.eu", true },
{ "merenita.net", true },
@@ -24773,15 +25646,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "meric-graphisme.info", true },
{ "meridianfresno.com", true },
{ "meridianmetals.com", true },
- { "meridianstore.com.br", true },
{ "merkel.me", true },
{ "merlet.eu", true },
{ "merlinsoap.com", true },
- { "merloat.com", true },
{ "merojob.com", true },
{ "meronberry.jp", true },
- { "mers.one", true },
- { "merson.org", true },
{ "merson.tv", true },
{ "mertarauh.com", true },
{ "mertcangokgoz.com", true },
@@ -24814,9 +25683,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "metachris.com", true },
{ "metacoda.com", true },
{ "metacode.biz", true },
- { "metadatawiki.com", true },
{ "metaether.net", true },
{ "metafurquest.net", true },
+ { "metallomania.it", true },
{ "metallosajding.ru", true },
{ "metalu.ch", true },
{ "metanic.services", true },
@@ -24826,7 +25695,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "metasquare.nyc", true },
{ "metasysteminfo.com", true },
{ "metaurl.io", true },
- { "metavetted.com", true },
{ "metaword.com", true },
{ "metaword.net", true },
{ "metaword.org", true },
@@ -24844,8 +25712,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "meteobox.sk", true },
{ "meteocat.net", true },
{ "meteorapp.space", true },
+ { "meteorites-for-sale.com", true },
{ "meteorologiaenred.com", true },
- { "meteosherbrooke.com", true },
{ "meteosmit.it", true },
{ "meter.md", true },
{ "meterhost.com", true },
@@ -24856,35 +25724,36 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "metro-lawn-care.com", true },
{ "metro-web.net", true },
{ "metroairvirtual.com", true },
- { "metrobriefs.com", true },
+ { "metrodetroitmommy.com", true },
{ "metrolush.com", true },
{ "metron-eging.com", true },
{ "metron-networks.com", true },
{ "metron-online.com", true },
{ "metronaut.de", true },
{ "metropop.ch", true },
- { "metsasta.com", true },
{ "mettekopp.dk", true },
{ "meu-solutions.com", true },
+ { "meubanco7.com.br", true },
+ { "meuble-house.fr", true },
{ "meujeitodigital.com.br", false },
{ "meupainel.me", true },
{ "meurisse.org", true },
+ { "mevanshop.com", true },
{ "mevo.xyz", true },
{ "mevs.cz", true },
{ "mexican.dating", true },
{ "mexicanjokes.net", true },
{ "mexico.sh", true },
+ { "mexicodental.co", true },
{ "mexicom.org", true },
{ "meyash.co", true },
{ "mf-fischer.de", true },
{ "mfen.de", true },
- { "mfgusa.com", true },
{ "mfits.co.uk", true },
{ "mflodin.se", true },
{ "mfxbe.de", true },
- { "mfxxx.cn", true },
{ "mgi.gov", true },
- { "mgknet.com", true },
+ { "mgiljum.com", true },
{ "mglink.be", true },
{ "mgrossklaus.de", true },
{ "mgrt.net", true },
@@ -24898,22 +25767,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mheistermann.de", true },
{ "mhermans.nl", true },
{ "mhi.web.id", true },
- { "mhmfoundationrepair.com", true },
+ { "mhjuma.com", true },
{ "mi-beratung.de", true },
{ "mi-so-ji.com", true },
{ "mi80.com", true },
+ { "mi92.ru", true },
{ "miadennees.com", true },
{ "miagexport.com", true },
{ "mialquilerdecoches.com", true },
+ { "miamaibaum.com", true },
{ "miaonagemi.com", true },
{ "miaoubox.com", true },
{ "miaowo.org", true },
{ "miasarafina.de", true },
{ "miavierra.org", true },
+ { "mibh.de", true },
{ "mibuiin.com", true },
{ "micado-software.com", true },
{ "micalodeal.ch", true },
{ "micbase.com", true },
+ { "micelius.com", true },
{ "michadenheijer.com", true },
{ "michael-schefczyk.de", true },
{ "michael-schilling.de", true },
@@ -24922,13 +25795,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "michaelasawyer.com", true },
{ "michaelband.co", true },
{ "michaelband.com", true },
- { "michaeleichorn.com", true },
+ { "michaelcullen.name", true },
{ "michaelhrehor.com", true },
{ "michaeliscorp.com", true },
{ "michaelismold.com", true },
{ "michaeljdennis.com", true },
{ "michaelkuchta.me", true },
+ { "michaell.io", true },
+ { "michaell.xyz", true },
{ "michaelleibundgut.com", true },
+ { "michaelloveys.com", true },
{ "michaelpelletterie.it", true },
{ "michaelpfrommer.de", true },
{ "michaelpfrommer.pub", true },
@@ -24936,7 +25812,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "michaelschubert.com", true },
{ "michaelschule-rheine.de", true },
{ "michaelslatkine.com", true },
- { "michaelsnoeren.nl", true },
{ "michaelsweater.com", true },
{ "michaeltaboada.me", true },
{ "michaeltroger.com", true },
@@ -24957,11 +25832,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "michelskovbo.dk", true },
{ "michiganstateuniversityonline.com", true },
{ "michiganunionoptout.com", true },
+ { "michilaw.com", true },
{ "michmexguides.com.mx", true },
{ "michu.pl", true },
{ "mickelvaessen.com", true },
- { "micomi.co", true },
- { "miconcinemas.com", true },
{ "micopal.com", true },
{ "micr.io", true },
{ "micr0lab.org", true },
@@ -24974,11 +25848,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "microlog.org", true },
{ "micromata.de", true },
{ "micromind.io", true },
+ { "micromookie.com", true },
{ "microneedlingstudio.se", true },
{ "microsoftaffiliates.azurewebsites.net", true },
{ "microvb.com", true },
{ "microwesen.de", true },
{ "microzubr.com", true },
+ { "micsell.com", true },
{ "midair.io", true },
{ "midasjewellery.com.au", true },
{ "midcarolinaregionalairport.com", true },
@@ -24992,7 +25868,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "midlandroofingri.com", true },
{ "midlandsfundays.co.uk", true },
{ "midlandsphotobooths.co.uk", true },
- { "midnight-visions.de", true },
{ "midnightmango.co.uk", true },
{ "midnightmango.de", true },
{ "midnightmechanism.com", true },
@@ -25003,11 +25878,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "midwestbloggers.org", true },
{ "midwestplus.com", true },
{ "miegl.com", true },
- { "miembarcacion.com", true },
+ { "miegl.cz", true },
{ "miemus.eu", true },
{ "mietwohnungen-vermietung.com", true },
{ "mieuxgrandir.ch", true },
- { "mieuxvivreadarvoy.fr", true },
{ "miffy.me", true },
{ "mig5.net", true },
{ "miggy.org", true },
@@ -25020,17 +25894,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "miguelmenendez.pro", true },
{ "miguelmoura.com", true },
{ "miguia.tv", true },
+ { "mihgroup.eu.org", true },
+ { "mihgroup.net", true },
{ "mihnea.net", true },
{ "mijailovic.net", true },
{ "mijcorijneveld.nl", true },
{ "mijn-financien.be", true },
- { "mijnavg.eu", true },
{ "mijnetz.nl", true },
{ "mijnkerstkaarten.be", true },
{ "mijnkinderkleding.com", true },
{ "mijnpartijhandel.nl", true },
{ "mijnreisoverzicht.nl", true },
{ "mijnstembureau.nl", true },
+ { "mijntelefoonboek.com", true },
{ "mijntransacties.nl", true },
{ "mika.moe", true },
{ "mikadoe.nl", true },
@@ -25056,9 +25932,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mikewest.org", true },
{ "mikewillia.ms", true },
{ "mikewrites.online", true },
- { "mikewritesstuff.com", true },
{ "mikeybailey.org", true },
- { "mikhirev.ru", true },
{ "mikhlevich.ru", true },
{ "miki-boras.de", true },
{ "miki.it", true },
@@ -25073,9 +25947,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mikroskeem.eu", true },
{ "mikumaycry.com", true },
{ "mikupic.com", true },
- { "mikywow.eu", true },
+ { "mikusa.xyz", true },
{ "mil-spec.ch", true },
- { "mil0.com", true },
{ "milakirschner.de", true },
{ "milania.de", true },
{ "milanpala.cz", false },
@@ -25091,6 +25964,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "milkandcookies.ca", true },
{ "milkingit.co.uk", true },
{ "milktea.info", true },
+ { "milkypond.org", true },
{ "millanova.wedding", false },
{ "milldyke.com", true },
{ "milldyke.nl", true },
@@ -25102,15 +25976,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "millettable.com", true },
{ "millhousenchurch.com", true },
{ "millionairegames.com", true },
- { "millions1.com", true },
{ "millions32.com", true },
- { "millions51.com", true },
- { "millions52.com", true },
- { "millions53.com", true },
- { "millions57.com", true },
- { "millions60.com", true },
- { "millions77.com", true },
- { "millions8.com", true },
{ "millistream.com", true },
{ "milnes.org", true },
{ "milsonhypnotherapyservices.com", true },
@@ -25138,11 +26004,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mindcoding.ro", true },
{ "mindercasso.nl", true },
{ "mindfactory.de", true },
+ { "mindhunter.info", true },
{ "mindleaking.org", true },
+ { "mindmax.fi", true },
{ "mindmeister.com", true },
{ "mindoktor.se", false },
{ "mindorbs.com", true },
{ "mindox.com.br", true },
+ { "mindsetatx.com", true },
{ "mindstretchers.co.uk", true },
{ "mine-craftlife.com", true },
{ "mine-pixl.de", true },
@@ -25156,6 +26025,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "minecraftstal.com", true },
{ "minehattan.de", true },
{ "minehub.de", true },
+ { "minei.me", true },
{ "minenash.com", true },
{ "minepack.net", true },
{ "minepay.net", true },
@@ -25169,11 +26039,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "minf3-games.de", true },
{ "minfin.gov.ua", true },
{ "mingky.net", true },
+ { "mingming.info", true },
{ "mingram.net", true },
{ "mingtreerealty.com", true },
{ "mingwah.ch", true },
{ "minh.at", false },
{ "mini2.fi", true },
+ { "minican.net", true },
{ "minigames.com", true },
{ "miniglueck.net", true },
{ "minigolf-reisinger.com", true },
@@ -25189,12 +26061,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "miningtronics.com", true },
{ "minisoft4u.ir", true },
{ "ministeriumfuerinternet.de", true },
- { "minitruckin.net", true },
{ "minitrucktalk.com", true },
{ "minivaro.de", true },
{ "minkymoon.jp", true },
{ "minnesotakinkyyouth.org", true },
- { "minnesotamathcorps.org", true },
{ "minnesotareadingcorps.org", true },
{ "minnit.chat", true },
{ "minobar.com", true },
@@ -25205,9 +26075,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mintosherbs.com", true },
{ "mintrak2.com", true },
{ "mintse.com", true },
+ { "minttang.cn", true },
+ { "minu.link", true },
{ "minube.co.cr", true },
{ "minutashop.ru", true },
{ "minux.info", true },
+ { "mionerve.com", true },
+ { "mionerve.org", true },
{ "mipapo.de", true },
{ "miproximopaso.org", true },
{ "mipueblohoy.com", true },
@@ -25217,6 +26091,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "miraheze.org", true },
{ "miraidenshi.com", true },
{ "miraiex.com", true },
+ { "miraste.com.br", true },
+ { "mirazperu.com", true },
+ { "mircarfinder.ru", true },
{ "mirch.com", true },
{ "mirco-grams.de", true },
{ "mireiaseuba.com", true },
@@ -25225,13 +26102,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mirfire.com", true },
{ "mirjamderijk.nl", false },
{ "mirkofranz.de", true },
+ { "mirodasilva.be", true },
{ "mironet.cz", true },
- { "mirrorbot.ga", true },
{ "mirrorsedgearchive.de", true },
{ "mirshak.com", true },
{ "mirtes.cz", true },
{ "mirtouf.fr", true },
{ "misakacloud.net", true },
+ { "misakatang.cn", true },
{ "misakiya.co.jp", true },
{ "misanci.cz", true },
{ "mischak.net", true },
@@ -25261,7 +26139,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "missualready.com", true },
{ "missyou.link", true },
{ "mistacms.com", true },
+ { "mistaken.pl", true },
{ "mister-matthew.de", true },
+ { "misterseguros.com.br", true },
{ "mistreaded.com", true },
{ "mistybox.com", true },
{ "misupport.dk", true },
@@ -25297,7 +26177,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mitylite.com", true },
{ "mitzpettel.com", true },
{ "miui-germany.de", true },
- { "mivestuariolaboral.com", true },
{ "mivzak.im", true },
{ "mivzakim.biz", true },
{ "mivzakim.info", true },
@@ -25305,19 +26184,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mivzakim.net", true },
{ "mivzakim.org", true },
{ "mivzakim.tv", true },
- { "mivzaklive.co.il", true },
{ "miweb.cr", false },
{ "mixinglight.com", true },
{ "mixmister.com", true },
- { "mixnshake.com", true },
{ "mixposure.com", true },
{ "mixrepairs.co.uk", true },
{ "mixtafrica.com", true },
{ "mixtape.moe", true },
{ "mixx.com.hk", true },
{ "miyatore.com", true },
- { "miyoshi-kikaku.com", true },
- { "miyugirls.com", true },
+ { "miyoshi-kikaku.com", false },
{ "mizipack.com", true },
{ "mizque.ch", true },
{ "mizu.coffee", true },
@@ -25332,12 +26208,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mjlaurindo.pt", true },
{ "mjmedia.co.za", true },
{ "mjmnagy.info", true },
- { "mjscustomcreations.com.au", true },
+ { "mjpak.com.au", true },
{ "mjt.me.uk", true },
{ "mk89.de", true },
{ "mkaciuba.com", true },
{ "mkakh.com", true },
- { "mkasu.org", false },
{ "mkbouncycastles.co.uk", true },
{ "mkbouncyhire.co.uk", true },
{ "mkcert.org", true },
@@ -25372,26 +26247,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mlundberg.se", true },
{ "mlvbphotography.com", true },
{ "mlytics.com", true },
+ { "mm13.at", true },
{ "mm404.com", true },
{ "mma-acareporting.com", true },
{ "mmalisz.com", true },
- { "mmaps.org", true },
{ "mmbb.org", true },
+ { "mmgal.com", true },
{ "mmin.us", false },
{ "mmmarco.com", true },
- { "mmmaximaliselmeny.hu", true },
{ "mmogah.com", true },
{ "mmonit.com", true },
{ "mms.is", true },
{ "mmt.my", true },
{ "mmucha.de", true },
+ { "mna7e.com", true },
{ "mncloud.de", true },
+ { "mnconsulting.xyz", true },
{ "mnd.sc", true },
{ "mne.moe", true },
- { "mnedc.org", true },
{ "mneerup.dk", true },
{ "mnemonic.ninja", true },
{ "mnguyen.io", true },
+ { "mnienamel.com", true },
{ "mnitro.com", true },
{ "mnium.de", true },
{ "mnml.art", true },
@@ -25407,12 +26284,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "moabpapier.de", true },
{ "moabygg.se", true },
{ "moahmo.com", true },
+ { "moas.design", true },
+ { "moas.photos", true },
{ "mobag.ru", false },
{ "mobal.com", true },
{ "mobi2go.com", true },
- { "mobidea.com", true },
{ "mobifinans.ru", true },
- { "mobil-bei-uns.de", true },
{ "mobila-chisinau.md", true },
{ "mobilcom-debitel-empfehlen.de", true },
{ "mobilcom-debitel.de", true },
@@ -25442,17 +26319,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mobsender.com", true },
{ "mobycoders.com", true },
{ "moc.ac", true },
- { "mocarps.hk", true },
{ "mochanstore.com", true },
- { "mochiyuki.net", true },
{ "mockerel.com", true },
{ "mococo.co.uk", true },
{ "modaexecutiva.com.br", true },
{ "modafinil.com", true },
+ { "modafinil.net", true },
{ "modafinil.wiki", true },
{ "modafo.com", true },
{ "modalogi.com", true },
- { "modav.org", true },
{ "modcasts.video", true },
{ "modding-forum.com", true },
{ "modding-welt.com", true },
@@ -25476,10 +26351,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "moderncommercialrealestate.com", true },
{ "modifiedmind.com", true },
{ "modistry.com", true },
- { "modistryusercontent.com", true },
{ "modmountain.com", true },
{ "modnitsa.info", true },
+ { "modonor.dk", true },
{ "modosaude.com.br", true },
+ { "mods-community.de", true },
+ { "mods-pic.de", true },
{ "modul21.com", true },
{ "modul21.eu", true },
{ "module.market", true },
@@ -25488,18 +26365,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "moebel-vergleichen.com", true },
{ "moechel.com", true },
{ "moeclue.com", true },
+ { "moecraft.net", true },
{ "moefactory.com", true },
{ "moehrke.cc", true },
{ "moekes.amsterdam", true },
{ "moeking.me", true },
{ "moellers.systems", true },
{ "moenew.top", true },
- { "moeqing.net", true },
+ { "moepass.com", true },
+ { "moeqing.net", false },
{ "moetrack.com", true },
- { "moeyoo.net", true },
{ "mofidmed.com", true },
{ "mofohome.dyndns.org", true },
- { "mogooin.com", true },
{ "moha-swiss.com", true },
{ "mohanmekap.com", true },
{ "mohela.com", true },
@@ -25516,6 +26393,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mojefedora.cz", true },
{ "mojilitygroup.com", true },
{ "mojizuri.com", true },
+ { "mojnet.eu", true },
+ { "mojnet.net", true },
{ "mojoco.co.za", true },
{ "mojzis.com", true },
{ "mojzis.cz", true },
@@ -25524,15 +26403,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mokeedev.review", true },
{ "mokhtarmial.com", false },
{ "mokote.com", true },
- { "mokum-organics.com", false },
{ "molb.org", true },
{ "molecularbiosystems.org", true },
+ { "moleskinestudio.com", true },
{ "molinero.xyz", true },
{ "mollaretsmeningitis.org", true },
{ "mollie.com", true },
{ "molokai.org", true },
{ "molti.hu", true },
- { "molun.net", false },
+ { "molun.net", true },
{ "molunerfinn.com", true },
{ "molwick.com", true },
{ "momentsofimpact.info", true },
@@ -25560,7 +26439,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mondedie.fr", true },
{ "mondial-movers.nl", true },
{ "mondo-it.ch", true },
+ { "monelephantapois.com", true },
{ "moneni.com", true },
+ { "moneseglobal.com", true },
{ "moneybird.com", true },
{ "moneybird.nl", true },
{ "moneychangersoftware.com", true },
@@ -25580,7 +26461,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "monkeybusiness.agency", true },
{ "monkeyhill.us", true },
{ "monkeytek.ca", true },
- { "monkieteel.com", true },
{ "monlabs.com", true },
{ "monloyer.quebec", true },
{ "monnyonle.hu", true },
@@ -25589,7 +26469,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "monobank.no", true },
{ "monobunt.at", true },
{ "monodukuri.com", true },
- { "monokoo.com", true },
{ "monolithapps.com", true },
{ "monolithindustries.com", true },
{ "monolithinteractive.com", true },
@@ -25601,6 +26480,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "monpermisvoiture.com", true },
{ "monpetitforfait.com", true },
{ "monpetitmobile.com", true },
+ { "monplay.host", true },
{ "monsieurbureau.com", true },
{ "monsieursavon.ch", true },
{ "monstermashentertainments.co.uk", true },
@@ -25626,11 +26506,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "monzo.com", true },
{ "monzo.me", true },
{ "moo.la", true },
- { "moobo.co.jp", true },
{ "moodfoods.com", true },
- { "moodforsex.com", true },
{ "moodzshop.com", true },
- { "moojp.co.jp", true },
{ "moolah.rocks", true },
{ "moon.fish", true },
{ "moonagic.com", true },
@@ -25658,7 +26535,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "moosmann-moehrle.de", true },
{ "moot-info.co.za", true },
{ "moovablestorage.com", true },
- { "mop321.com", true },
{ "moparcraft.net", true },
{ "moparisthebest.com", true },
{ "moparisthebest.net", true },
@@ -25670,6 +26546,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "moplx.com", true },
{ "moppeleinhorn.de", true },
{ "moppy.org", true },
+ { "mora.pl", true },
{ "morbatex.com", true },
{ "morbiceramicindustry.com", true },
{ "morbitzer.de", true },
@@ -25689,7 +26566,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "morethancode.be", true },
{ "morethandigital.info", true },
{ "morganino.it", true },
- { "morgansjewelerspv.com", true },
{ "morgansleisure.co.uk", true },
{ "morgner.com", true },
{ "moritz-baestlein.de", true },
@@ -25701,6 +26577,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "morningcurve.com", true },
{ "morningstar.moe", true },
{ "morphy2k.io", true },
+ { "morris.computer", true },
{ "morrisby.com", true },
{ "morteruelo.net", true },
{ "mortgagecalculator.biz", true },
@@ -25718,8 +26595,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mosos.de", true },
{ "mosquitojoe.com", true },
{ "mosscade.com", true },
- { "mosshi.be", true },
{ "mosstier.com", true },
+ { "mostcomfortableworkboots.net", true },
{ "mostholynameofjesus.org", true },
{ "mostlyoverhead.com", true },
{ "motd.ch", true },
@@ -25740,16 +26617,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "motionvideos.uk", true },
{ "motiweb.fr", true },
{ "motocollection.pl", true },
+ { "motogb.net", true },
{ "motohell.com", true },
{ "motojato.com.br", true },
{ "motonauticaibiza.com", true },
+ { "motor-forum.nl", true },
{ "motoreflex.com", true },
{ "motorpointarenacardiff.co.uk", true },
{ "motorring.ru", true },
{ "motorsplus.com", false },
{ "motoryachtclub-radolfzell.de", true },
{ "motosikletevi.com", true },
+ { "motospaya.com", true },
{ "motostorie.blog", false },
+ { "mototax.ch", true },
{ "motovated.co.nz", true },
{ "motowilliams.com", true },
{ "motransportinfo.com", true },
@@ -25757,10 +26638,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "moulinaparoles.ca", true },
{ "mountain-rock.ru", true },
{ "mountainactivitysection.org.uk", true },
+ { "mountainbatchers.de", true },
{ "mountainchalet.blue", true },
- { "mountainroseherbs.com", true },
{ "mountainspringsrentals.ca", true },
- { "mountfarmer.de", true },
{ "mousepotato.uk", true },
{ "moutiezhaller.com", true },
{ "movacare.de", true },
@@ -25768,6 +26648,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "moveltix.net", true },
{ "movember.com", false },
{ "movewellnesslab.com", true },
+ { "movfun.ga", true },
{ "movie-cross.net", true },
{ "movie-infos.net", true },
{ "movie1000.com", true },
@@ -25776,7 +26657,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "moviedeposit.com", true },
{ "moviefreeze.com", true },
{ "movieguys.org", true },
- { "moviepilot.com", true },
{ "moviesetc.net", true },
{ "moviko.nz", true },
{ "movil.uno", true },
@@ -25789,7 +26669,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "moy.cat", true },
{ "moyer.pub", true },
{ "moylen.eu", true },
- { "moysovet.info", false },
{ "mozartgroup.hu", true },
{ "mozektevidi.net", true },
{ "mozilla.cz", true },
@@ -25801,22 +26680,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mpetroff.net", true },
{ "mpg-universal.com", true },
{ "mpgaming.pro", true },
- { "mphwinkel.nl", true },
{ "mpkrachtig.nl", true },
{ "mpkshop.com.br", true },
{ "mplanetphl.fr", true },
{ "mplant.io", true },
{ "mplicka.cz", true },
{ "mplusm.eu", true },
- { "mpnpokertour.com", true },
{ "mprsco.eu", true },
{ "mpsgarage.com.au", true },
{ "mpsoundcraft.com", true },
{ "mpu-vorbereitung.com", true },
+ { "mqas.net", true },
{ "mr-anderson.org", true },
{ "mr-designer-oman.com", true },
{ "mr-nachhilfe.de", true },
{ "mr-wolf.nl", false },
+ { "mralonas.ml", true },
{ "mrbmafrica.com", true },
{ "mrbounce.com", true },
{ "mrbouncescrazycastles.co.uk", true },
@@ -25825,6 +26704,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mrca-sharp.com", true },
{ "mrcoolevents.com", true },
{ "mrd.ninja", true },
+ { "mrdatenschutz.de", true },
{ "mrdayman.com", true },
{ "mremallin.ca", true },
{ "mrevolution.eu", true },
@@ -25839,8 +26719,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mrketolocksmith.com", true },
{ "mrknee.gr", true },
{ "mrkrabat.de", true },
+ { "mrmad.com.tw", true },
{ "mrnh.de", true },
- { "mrning.com", true },
{ "mrprintables.com", true },
{ "mrs-labo.jp", true },
{ "mrs-shop.com", true },
@@ -25848,6 +26728,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mrserge.lv", true },
{ "mrsk.me", true },
{ "mrstat.co.uk", true },
+ { "mrstuudio.ee", true },
{ "mrtunnel.club", true },
{ "mruczek.ga", true },
{ "mrv.li", true },
@@ -25880,6 +26761,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mstdn.fr", true },
{ "mstdn.io", true },
{ "mstdn.onl", false },
+ { "mstdn.vodka", true },
{ "msuna.net", true },
{ "msv-limpezas.pt", true },
{ "msx.org", true },
@@ -25895,8 +26777,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mtauburnassociates.com", true },
{ "mtb.wtf", true },
{ "mtd.org", true },
+ { "mte.sk", true },
{ "mteleport.net", true },
- { "mtg-tutor.de", true },
{ "mtgeni.us", true },
{ "mtgenius.com", true },
{ "mtgsuomi.fi", true },
@@ -25908,7 +26790,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mtiryaki.com", true },
{ "mtlconcerts.com", true },
{ "mtltransport.com", true },
- { "mtnz.co.za", true },
{ "mtouch.facebook.com", false },
{ "mtravelers.net", true },
{ "mtrip.com", true },
@@ -25923,24 +26804,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "muckrack.com", true },
{ "mucmail.de", true },
{ "muctool.de", true },
- { "mud-status.de", true },
{ "mudbenesov.cz", true },
{ "mudcrab.us", false },
+ { "mudit.xyz", true },
{ "muehlemann.net", true },
- { "muel.io", true },
{ "muelhau.pt", true },
{ "muell-weg.de", true },
{ "muellapp.com", true },
+ { "mueller-gaestehaus.de", true },
{ "muenchberger.com", true },
{ "mufibot.net", true },
{ "muguayuan.com", true },
{ "muh.io", true },
{ "mui.jp", true },
+ { "muilties.com", true },
{ "muitadica.com", true },
{ "mujerfutura.com", true },
{ "muk-kobetsu.com", true },
{ "mukilteodentalarts.com", true },
{ "mukilteoeuropeanautorepair.com", true },
+ { "mukyu.moe", true },
{ "mulaccosmetics.com", true },
{ "mulaisehat.com", true },
{ "mulej.net", true },
@@ -25951,13 +26834,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "multibit.org", true },
{ "multibomasm.com.br", true },
{ "multicomhost.com", true },
- { "multigamecard.com", true },
{ "multigeist.de", true },
{ "multikalender.de", false },
{ "multimail.work", true },
{ "multimatte.com", false },
{ "multimed.krakow.pl", true },
{ "multimedia-pool.com", true },
+ { "multimediapc.de", true },
{ "multiplayernow.com", true },
{ "multipleservers.com", true },
{ "multirep.ch", true },
@@ -25993,6 +26876,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "munki.org", true },
{ "munkibuilds.org", true },
{ "munwr.com", true },
+ { "muoivancauhoivisao.com", true },
{ "muqu.co", true },
{ "mur-vegetal-interieur.fr", true },
{ "murakami-sah.com", true },
@@ -26001,14 +26885,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "murfy.nz", true },
{ "murmel.it", false },
{ "murof.com.br", true },
+ { "murphycraftbeerfest.com", true },
{ "murray.xyz", true },
{ "murraya.cn", true },
{ "murzik.space", true },
{ "musa.gallery", true },
- { "musaccostore.com", true },
{ "muscle-tg.com", true },
{ "musclecarresearch.com", true },
{ "muscolinomusic.com", true },
+ { "museclef.com", true },
{ "musehelix.com", true },
{ "muses-success.info", true },
{ "musettishop.com", true },
@@ -26036,6 +26921,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "musicstudio.pro", true },
{ "musicwear.cz", true },
{ "musicworkout.de", true },
+ { "musiikkiohjelmapalvelu.fi", true },
{ "musik-mentaltraining.ch", true },
{ "musikholics.com", true },
{ "musikverein-elten.de", true },
@@ -26065,6 +26951,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "muurlingoogzorg.nl", true },
{ "muusikoiden.net", true },
{ "muwatenraqamy.org", true },
+ { "muy.ooo", true },
{ "muz2u.ru", true },
{ "muzeumkomiksu.eu", true },
{ "muzhijy.com", true },
@@ -26073,13 +26960,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mv-wohnen.de", true },
{ "mvandek.nl", true },
{ "mvbits.com", true },
+ { "mvbug.com", true },
{ "mvisioncorp.com", true },
{ "mvistatic.com", true },
{ "mvno.io", true },
{ "mvp-stars.com", true },
+ { "mvwoensel.com", true },
{ "mw.search.yahoo.com", false },
{ "mwainc.org", true },
- { "mwalz.com", true },
{ "mwamitours.com", true },
{ "mware-staging.azurewebsites.net", true },
{ "mwavuli.co.ke", true },
@@ -26098,7 +26986,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mxn8.com", true },
{ "my-aftershave-store.co.uk", true },
{ "my-best-wishes.com", true },
- { "my-cdn.de", true },
+ { "my-co.ir", true },
{ "my-contract.ch", true },
{ "my-contract.info", true },
{ "my-contract.net", true },
@@ -26133,6 +27021,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "myapexcard.com", true },
{ "myaspenheights.com", true },
{ "mybagofcoffee.com", true },
+ { "mybakkupakku.com", true },
{ "mybasementdoctor.com", true },
{ "mybb.com", true },
{ "mybb.de", true },
@@ -26148,6 +27037,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mybus.ro", true },
{ "mybusiness.wien", true },
{ "mycamda.com", true },
+ { "mycamshowhub.com", true },
{ "mycard.moe", true },
{ "mycareersfuture.sg", true },
{ "mycarwashers.com", true },
@@ -26157,10 +27047,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mycircleworks.com", true },
{ "myclasscam.com", true },
{ "myclasscam.org", true },
+ { "myclgnotes.com", true },
{ "myclinicalstudybuddy.com", true },
{ "mycloud-system.com", true },
{ "mycofairtrade.com", true },
- { "mycompanion.cz", true },
{ "myconan.net", true },
{ "myconnect.cn", true },
{ "myconsulting.ch", true },
@@ -26169,12 +27059,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mycr.eu", true },
{ "mycreativenook.com", true },
{ "mycreditcardcenter.com", true },
+ { "mycreditunion.gov", true },
{ "mycrypnet.io", true },
{ "mycrypto.com", false },
{ "mycrystalgrove.com", true },
- { "mycuco.it", true },
{ "mycustomwriting.com", true },
- { "mydarkstar.net", true },
{ "mydatadoneright.eu", true },
{ "mydaywebapp.com", true },
{ "mydebian.in.ua", true },
@@ -26187,11 +27076,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mydoc.fr", true },
{ "mydocserve.com", true },
{ "mydomaindesk.com", true },
- { "mydreamlifelab.com", true },
{ "mydreamshaadi.in", true },
- { "mydroneservices.ca", true },
- { "mydroneservices.com", true },
{ "myduffyfamily.com", true },
+ { "myeasybooking.de", true },
{ "myeberspaecher.com", true },
{ "myeffect.today", true },
{ "myeisenbahn.de", true },
@@ -26209,7 +27096,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mygadgetguardian.lookout.com", false },
{ "mygallery.homelinux.net", true },
{ "mygate.at", false },
- { "mygedit.com", true },
{ "mygeneral.org", true },
{ "mygeotrip.com", true },
{ "mygest.me", true },
@@ -26227,8 +27113,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "myhealthreviews.com", true },
{ "myhollywoodnews.com", true },
{ "myhome-24.pl", true },
- { "myhostname.net", true },
{ "myhuthwaite.com", true },
+ { "myibidder.com", true },
{ "myimds.com", true },
{ "myimmitracker.com", true },
{ "myinvite.nl", true },
@@ -26248,6 +27134,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mylittlechat.ru", true },
{ "myliveupdates.com", true },
{ "myloan.hk", true },
+ { "myloneworkers.com", true },
{ "mylookout.com", false },
{ "mylstrom.com", true },
{ "mylucknursinghome.com", true },
@@ -26260,6 +27147,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mymedz.nl", true },
{ "mymixtapez.com", true },
{ "mymommyworld.com", true },
+ { "mymonture.com", true },
{ "mymotor.nl", true },
{ "myms.eu", true },
{ "mymun.com", true },
@@ -26277,7 +27165,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mynortherngarden.com", true },
{ "myonline.hu", true },
{ "myonline.store", true },
- { "myonlinevehicleinsurance.com", true },
+ { "myopd.in", true },
{ "myoptumhealthcomplexmedical.com", true },
{ "myoptumhealthparentsteps.com", true },
{ "myotopie.de", true },
@@ -26286,6 +27174,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "myownconference.cloud", true },
{ "myownconference.com", true },
{ "myownconference.com.ua", true },
+ { "myownconference.net", true },
{ "myownconference.pl", true },
{ "myownconference.ru", true },
{ "myowndisk.com", true },
@@ -26298,6 +27187,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mypcqq.cc", true },
{ "myperfecthome.ca", true },
{ "myperks.in", true },
+ { "myphamaplus.org", true },
{ "myphotoshopbrushes.com", true },
{ "mypillcard.com", true },
{ "mypizza-bremen.de", true },
@@ -26307,10 +27197,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "myprintcard.de", true },
{ "myproblog.com", true },
{ "myprotime.eu", true },
- { "myproxy.eu.org", true },
- { "mypup.nl", true },
+ { "mypt3.com", true },
{ "myrandomtips.com", true },
- { "myranicol.com", true },
{ "myraytech.net", false },
{ "myrealestatemate.com.au", true },
{ "myrealestateschool.com", true },
@@ -26344,6 +27232,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "myrepublic.mobi", true },
{ "myrepublic.my", true },
{ "myrepublic.net", true },
+ { "myrepublic.net.au", true },
{ "myrepublic.nz", true },
{ "myrepublic.ph", true },
{ "myrepublic.rocks", true },
@@ -26375,16 +27264,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "myrotvorets.center", true },
{ "myrotvorets.news", true },
{ "myrp.co", true },
+ { "mysad.de", true },
{ "mysber.ru", true },
{ "myschoolphoto.org", true },
{ "myseatime.com", true },
{ "mysecretcase.com", false },
{ "mysectools.org", true },
{ "myself5.de", true },
+ { "myservice.store", false },
{ "myservicearl.com", true },
- { "myseu.cn", true },
{ "mysexydate24.com", true },
- { "myshirtsize.com", true },
{ "mysignal.com", true },
{ "mysize-condooms.nl", true },
{ "mysmelly.com", true },
@@ -26403,13 +27292,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "mystic-welten.de", true },
{ "mystickphysick.com", true },
{ "mysticplumes.com", true },
+ { "mysticrs.tk", true },
{ "mystorymonster.com", true },
{ "mystudycart.com", true },
{ "myswissmailaddress.com", true },
+ { "myte.ch", true },
{ "mytfg.de", true },
{ "mythemeshop.com", false },
{ "mythengay.ch", true },
{ "mythicdelirium.com", true },
+ { "mytime.gl", true },
{ "myting.net", true },
{ "mytraiteurs.com", true },
{ "mytripcar.co.uk", true },
@@ -26431,7 +27323,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "myvalleymarketing.com", true },
{ "myvirtualserver.com", true },
{ "myvitalhealthsolutions.com.au", true },
- { "myvoipnews.com", true },
{ "myvpl.com", true },
{ "mywari.com", true },
{ "mywebmanager.co.uk", true },
@@ -26448,10 +27339,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "myzina.cz", false },
{ "mz-mz.net", true },
{ "mza.com", true },
+ { "mzcsgo.top", true },
{ "mzh.io", true },
{ "mziulu.me", false },
+ { "mzlive.eu", true },
{ "mzmtech.com", true },
{ "mznet.de", true },
+ { "mzorn.photography", true },
{ "mzstatic.cc", true },
{ "mzzj.de", true },
{ "n-a.date", true },
@@ -26468,7 +27362,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "n2diving.net", true },
{ "n2servers.com", true },
{ "n4v.eu", true },
- { "n5118.com", true },
{ "n6a.net", true },
{ "n7.education", true },
{ "n8ch.net", true },
@@ -26479,11 +27372,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "na-school.nl", true },
{ "naahgluck.de", true },
{ "naam.me", true },
+ { "naarakah.fr", true },
{ "nabaleka.com", true },
{ "nabankco.com", true },
+ { "nabbar.com", true },
{ "nabidkamajetku.cz", true },
{ "nabidkydnes.cz", true },
{ "nabytek-valmo.cz", true },
+ { "nac-6.fr", true },
{ "nacfit.com", true },
{ "nachsendeauftrag.net", true },
{ "nachsenden.info", true },
@@ -26491,6 +27387,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nacin.com", true },
{ "nacktetatsachen.at", false },
{ "nacyklo.cz", true },
+ { "nadaquenosepas.com", true },
{ "nadejeproninu.cz", true },
{ "nadelholzkulturen.de", true },
{ "naders.com", true },
@@ -26500,10 +27397,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nadyaolcer.fr", true },
{ "nafod.net", true },
{ "naga-semi.com", true },
+ { "naganithin.me", true },
{ "nagashi.ma", false },
+ { "nagata.info", true },
{ "nagaya.biz", true },
{ "nagb.gov", true },
- { "nagb.org", true },
{ "nagel-dentaltechnik.de", true },
{ "nagelfam.com", true },
{ "naggie.net", true },
@@ -26511,12 +27409,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nah.re", true },
{ "nahura.com", true },
{ "nai-job.jp", true },
+ { "naijaxnet.com.ng", true },
{ "nailattitude.ch", true },
{ "nailchiodo.com", true },
{ "nailsalon-aztplus.com", true },
+ { "nailsart.roma.it", true },
{ "nailtodayminneapolis.com", true },
{ "nairobibusinessreview.com", true },
+ { "nais0ne.com", true },
{ "naive.network", true },
+ { "naivetube.com", true },
{ "najany.de", true },
{ "najany.dk", true },
{ "najany.fr", true },
@@ -26524,11 +27426,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "najany.se", true },
{ "najedlo.sk", true },
{ "naji-astier.com", true },
- { "nakada4610.com", true },
{ "nakalabo.jp", true },
{ "nakama.tv", true },
{ "nakandya.com", true },
+ { "nakayama.industries", true },
{ "nakayama.systems", true },
+ { "nakayamaresearch.com", true },
{ "nakedalarmclock.me", true },
{ "nakedtruthbeauty.com", true },
{ "nakene.com", true },
@@ -26546,8 +27449,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "namegrep.com", true },
{ "nameid.org", true },
{ "namepros.com", true },
+ { "nameproscdn.com", true },
{ "namereel.com", true },
- { "namethissymbol.com", true },
{ "nametiles.co", true },
{ "nami.bo", true },
{ "nami.trade", true },
@@ -26557,6 +27460,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "namu.live", true },
{ "namu.moe", true },
{ "namu.wiki", true },
+ { "namus.gov", true },
+ { "nan.ci", true },
+ { "nan.ge", true },
{ "nanarose.ch", true },
{ "nanch.com", true },
{ "nancytelford.com", true },
@@ -26581,24 +27487,30 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nanubo.de", true },
{ "naomi.es", false },
{ "naomiheji.com", true },
- { "naotone.com", true },
{ "napcae.de", true },
- { "naphogar.com", true },
{ "napisdata.us", true },
+ { "napkins-wholesale.co.za", true },
+ { "napkins-wholesale.com", true },
+ { "napkins-wholesale.in", true },
+ { "napkins-wholesale.nz", true },
+ { "napkins-wholesale.uk", true },
+ { "napkins-wholesale.us", true },
{ "napolinissanctparts.com", true },
- { "nappynko.com", true },
{ "narada.com.ua", true },
{ "narakenkoland.net", true },
{ "naralogics.com", true },
{ "narardetval.se", true },
+ { "narazaka.net", true },
{ "narduin.xyz", true },
{ "narenderchopra.com", true },
{ "narfation.org", true },
+ { "nargele.eu", true },
{ "nargileh.nl", true },
{ "naric.com", true },
{ "narindal.ch", true },
{ "narmos.ch", true },
{ "naro.se", true },
+ { "narodniki.com", true },
{ "narodsovety.ru", true },
{ "naroska.name", true },
{ "narrativasdigitais.pt", true },
@@ -26609,31 +27521,34 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nasbi.pl", true },
{ "nasbnation.com", false },
{ "nascio.org", true },
+ { "naseehah.ga", true },
{ "nashdistribution.com", true },
{ "nashikmatka.com", true },
{ "nashira.cz", true },
{ "nashvillebasements.com", true },
{ "nashvillelidsurgery.com", true },
{ "nashzhou.me", true },
+ { "nasosvdom.com.ua", true },
+ { "nasr.mobi", true },
{ "nasrsolar.com", true },
{ "nastoletni.pl", true },
{ "nataldigital.com", true },
{ "nataliedawnhanson.com", true },
- { "natanaelys.com", false },
{ "natation-nsh.com", false },
{ "natchmatch.com", true },
+ { "natecraun.net", false },
{ "natgeofreshwater.com", true },
{ "nathaliebaron.ch", true },
{ "nathaliebaroncoaching.ch", true },
{ "nathaliedijkxhoorn.com", true },
{ "nathaliedijkxhoorn.nl", true },
{ "nathan.io", true },
+ { "nathan.ovh", true },
{ "nathanaeldawe.com", true },
{ "nathancheek.com", false },
{ "nathankonopinski.com", true },
{ "nathanmfarrugia.com", true },
{ "nathansmetana.com", true },
- { "nathumarket.com.br", true },
{ "nation-contracting.com.hk", true },
{ "nationalbank.gov", true },
{ "nationalbanknet.gov", true },
@@ -26644,13 +27559,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nationalmap.gov", true },
{ "nationalpassportservice.info", true },
{ "nationalpriorities.org", true },
- { "nationaltaxprep.com", true },
{ "nationaltrails.ru", true },
{ "nationwiderealtyinvestors.com", true },
{ "natives-team.ch", true },
{ "nativitynj.org", true },
{ "nativs.ch", true },
{ "natlec.com", true },
+ { "natropie.pl", true },
{ "natsumihoshino.com", true },
{ "natuerlichabnehmen.ch", true },
{ "natur.com", true },
@@ -26676,6 +27591,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "naude.co", true },
{ "naughty.audio", true },
{ "naughtytoy.co.uk", true },
+ { "nauris.fi", true },
{ "nausicaahotel.it", true },
{ "naut.ca", true },
{ "nautiljon.com", true },
@@ -26757,15 +27673,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nbrain.de", true },
{ "nbrii.com", true },
{ "nbriresearch.com", true },
- { "nbrown.us", true },
{ "nbur.co.uk", true },
{ "nc-beautypro.fr", true },
{ "nc-formation.fr", true },
{ "nc-network.io", true },
{ "nc99.co", true },
- { "nca.ink", true },
{ "ncamarquee.co.uk", true },
{ "ncands.net", true },
+ { "ncarmine.com", true },
{ "ncc-efm.com", true },
{ "ncc-efm.org", true },
{ "ncc-qualityandsafety.org", true },
@@ -26776,12 +27691,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nchangfong.com", true },
{ "nchponline.org", true },
{ "ncic.gg", true },
+ { "ncjrs.gov", true },
{ "ncloud.freeddns.org", true },
{ "ncm-malerbetrieb.de", true },
{ "ncsc.gov.uk", true },
{ "ncsccs.com", true },
{ "ncstep.org", true },
{ "nctx.co.uk", true },
+ { "ncua.gov", true },
{ "ndarville.com", true },
{ "ndbt.com", true },
{ "ndcpolipak.com", true },
@@ -26790,6 +27707,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ndfa.net", true },
{ "ndfirefighter.com", true },
{ "ndhlink.com", true },
+ { "ndime.com", true },
{ "ndpbrn-research.org", true },
{ "ndphp.org", true },
{ "ndpigskin.com", true },
@@ -26809,7 +27727,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nebelheim.de", true },
{ "nebenbeiblog.ch", true },
{ "nebra.io", true },
- { "nebracy.com", true },
{ "nebul.at", true },
{ "nebula.exchange", true },
{ "nebulae.co", true },
@@ -26849,14 +27766,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "neilfarrington.com", true },
{ "neillans.co.uk", true },
{ "neillans.com", true },
- { "neilshealthymeals.com", true },
{ "neilwynne.com", true },
+ { "neio.uk", true },
{ "nejenpneu.cz", true },
- { "nejkasy.cz", true },
{ "nejlevnejsi-parapety.cz", true },
{ "neko-nyan-nuko.com", true },
{ "neko-nyan.org", true },
- { "neko.ml", true },
{ "nekodex.net", true },
{ "nekolove.jp", true },
{ "nekomimi.pl", true },
@@ -26873,7 +27788,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nemplex.com", true },
{ "nemplex.win", false },
{ "nems.no", true },
- { "nemumu.com", true },
{ "nemunai.re", true },
{ "nenkin-kikin.jp", true },
{ "neno.io", true },
@@ -26882,6 +27796,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "neocities.org", true },
{ "neoclick.io", true },
{ "neodigital.bg", true },
+ { "neodrive.ch", true },
{ "neoedresources.org", true },
{ "neohu.com", true },
{ "neojo.org", true },
@@ -26914,10 +27829,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nerdmind.de", true },
{ "nerdoutstudios.tv", true },
{ "nerdpol.ch", true },
+ { "nerdpol.org", true },
+ { "nerdrockshop.co.uk", true },
{ "nerds-gegen-stephan.de", true },
{ "nerdtime.de", true },
{ "nerdwallet.com", true },
{ "nerdydev.net", true },
+ { "nereustech.com", true },
{ "nerot.eu", true },
{ "nerpa-club.ru", true },
{ "nerull7.info", true },
@@ -26925,9 +27843,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nesbase.com", true },
{ "nesolabs.com", true },
{ "nesolabs.de", true },
+ { "nestedquotes.ca", false },
{ "nestor.nu", true },
{ "neswec.org.uk", true },
- { "net-masters.pl", true },
{ "net-safe.info", true },
{ "net-share.de", true },
{ "net4visions.at", true },
@@ -26943,18 +27861,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "netbrewventures.com", true },
{ "netbulls.io", true },
{ "netbuzz.ru", true },
+ { "netchameleon.com", true },
{ "netconnect.at", true },
{ "netcoolusers.org", true },
- { "netd.at", true },
{ "netdex.co", true },
{ "netera.se", true },
{ "neteraser.de", true },
- { "netexem.com", true },
{ "netfabb.com", true },
+ { "netfeeds.eu", true },
{ "netflixlife.com", true },
{ "netfog.de", true },
{ "netfuture.ch", true },
{ "netfxharmonics.com", true },
+ { "nethack.ninja", true },
{ "nethackwiki.com", true },
{ "nethask.ru", true },
{ "nethostingtalk.com", true },
@@ -26982,7 +27901,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "netsparker.com.tr", true },
{ "netspeedia.net", true },
{ "netsphere.cz", true },
- { "nettacompany.com.tr", true },
{ "nettamente.com", true },
{ "nette.org", true },
{ "nettegeschenke.de", true },
@@ -26991,7 +27909,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "netto-service.ch", true },
{ "nettools.link", true },
{ "nettx.co.uk", true },
- { "netulo.com", true },
+ { "netube.org", true },
{ "netvizura.co.uk", true },
{ "netvpn.ml", true },
{ "netwarc.eu", true },
@@ -27002,19 +27920,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "network-notes.com", true },
{ "network23.nl", true },
{ "networkersdiary.com", true },
- { "networking-groups.co.uk", true },
+ { "networkhane.com", true },
{ "networking4all.com", true },
{ "networkingnexus.net", true },
{ "networkingphoenix.com", true },
+ { "networkmas.com", true },
{ "networkmidlands.co.uk", true },
{ "networkmidlands.uk", true },
+ { "networkmon.net", true },
{ "networkposting.com", true },
- { "networth.at", true },
{ "netz-yokohama.co.jp", true },
{ "netzfabrik.com", true },
{ "netzfrauen.org", true },
+ { "netzona.org", true },
{ "netzwerkwerk.de", true },
- { "neuber.uno", true },
{ "neuflizeobc.net", true },
{ "neurabyte.com", true },
{ "neurexcellence.com", true },
@@ -27028,13 +27947,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "neurotransmitter.net", true },
{ "neurozentrum-zentralschweiz.ch", true },
{ "neutein.com", true },
- { "neutralox.com", false },
+ { "neutralox.com", true },
{ "neuwal.com", true },
{ "neva.li", true },
+ { "nevalogic.com", true },
{ "never.pet", true },
{ "nevergreen.io", true },
{ "nevermore.fi", true },
{ "neverwetturkey.com", true },
+ { "nevivur.net", true },
{ "nevntech.com", true },
{ "nevolution.me", true },
{ "nevoxo.com", true },
@@ -27045,11 +27966,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "new-process.com", true },
{ "new-process.de", true },
{ "new-process.eu", true },
+ { "new-vip.com", true },
{ "new-web-studio.com", true },
{ "new.travel.pl", true },
{ "newaccess.ch", true },
+ { "newbernpost539.com", true },
{ "newbietech.cn", false },
{ "newborncryptocoin.com", true },
+ { "newbrunswick.today", true },
+ { "newbrunswicktoday.com", true },
{ "newburybouncycastles.co.uk", true },
{ "newburyparkelectric.com", true },
{ "newburyparkelectrical.com", true },
@@ -27058,7 +27983,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "newburyparklandscapelighting.com", true },
{ "newburyparkoutdoorlighting.com", true },
{ "newcab.de", true },
- { "newcitygas.ca", true },
{ "newcityinfo.ch", true },
{ "newcitystudio.ch", true },
{ "newcloudwhodis.com", true },
@@ -27066,14 +27990,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "newearth.press", true },
{ "newfangledscoop.com", true },
{ "newfiepedia.ca", true },
+ { "newfoundland-labradorflora.ca", true },
{ "newgrowbook.com", true },
{ "newguidance.ch", true },
+ { "newhoperailroad.com", true },
{ "newind.info", true },
{ "newizv.ru", true },
{ "newjianzhi.com", true },
{ "newkaliningrad.ru", true },
{ "newknd.com", true },
{ "newlifeband.de", true },
+ { "newline.online", true },
{ "newmarketbouncycastlehire.co.uk", true },
{ "newmed.com.br", true },
{ "newmediaone.net", true },
@@ -27096,6 +28023,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nex.sx", true },
{ "nexd.com", true },
{ "nexicafiles.com", true },
+ { "next-taxi.ru", false },
{ "next-web.ad.jp", true },
{ "next176.sk", true },
{ "next24.io", true },
@@ -27103,15 +28031,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nextbranders.com", true },
{ "nextcairn.com", true },
{ "nextcasino.com", true },
+ { "nextcloud-miyamoto.spdns.org", true },
{ "nextcloud.co.za", true },
{ "nextcloud.com", true },
{ "nextcloud.li", true },
+ { "nextcloud.nerdpol.ovh", true },
{ "nextclouddarwinkel.nl", true },
+ { "nexter.cloud", true },
{ "nextevolution.co.uk", true },
{ "nextgen.sk", true },
{ "nextgencel.com", true },
{ "nextgenthemes.com", true },
{ "nextgreatmess.com", true },
+ { "nexthop.co.jp", true },
+ { "nexthop.jp", true },
{ "nextiot.de", true },
{ "nextmbta.com", true },
{ "nextme.se", true },
@@ -27122,14 +28055,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nexttv.co.il", true },
{ "nextwab.com", true },
{ "nexus-exit.de", true },
- { "nexus-vienna.at", true },
{ "nexusconnectinternational.eu", true },
{ "nexwebsites.com", true },
{ "nexxus-sistemas.net.br", true },
{ "neyer-lorenz.de", true },
{ "nezrouge-est-vaudois.ch", true },
{ "nezrouge-geneve.ch", true },
- { "nezvestice.cz", true },
{ "nf4.net", true },
{ "nf9q.com", true },
{ "nfam.de", true },
@@ -27150,10 +28081,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ngc.gov", false },
{ "nghe.net", true },
{ "ngi.eu", true },
- { "nginxconfig.com", true },
{ "nginxconfig.io", true },
{ "ngndn.jp", true },
{ "ngt.gr", true },
+ { "nguyencucthanh.com", true },
{ "nguyenminhhung.com", true },
{ "ngvf.de", true },
{ "ngx.hk", true },
@@ -27180,6 +28111,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nic.soy", true },
{ "nic.xn--q9jyb4c", true },
{ "nice.ch", true },
+ { "nice.im", true },
{ "niceguyit.biz", true },
{ "nicesco.re", true },
{ "nicesleepo.com", true },
@@ -27200,12 +28132,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nicklord.com", true },
{ "nickmertin.ca", true },
{ "nickmorri.com", true },
+ { "nickmorris.name", true },
{ "nickplotnek.co.uk", true },
{ "nickrickard.co.uk", true },
{ "nicks-autos.com", true },
{ "nickscomputers.nl", true },
{ "nickserve.com", true },
{ "nickstories.de", true },
+ { "nicktheitguy.com", true },
{ "niclasreich.de", true },
{ "nicn.me", true },
{ "nico.st", true },
@@ -27213,6 +28147,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nicocourts.com", true },
{ "nicoknibbe.nl", true },
{ "nicoladixonrealestate.com", true },
+ { "nicolaiteglskov.dk", true },
{ "nicolajanedesigns.co.uk", true },
{ "nicolas-dumermuth.com", true },
{ "nicolas-hoffmann.net", true },
@@ -27234,9 +28169,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nidsuber.ch", true },
{ "niederohmig.de", true },
{ "niehage.name", true },
- { "nielshoogenhout.be", true },
- { "nielshoogenhout.eu", true },
- { "nielshoogenhout.nl", true },
{ "niemaler.de", true },
{ "nien.cf", true },
{ "nien.co", true },
@@ -27244,7 +28176,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nien.eu.org", true },
{ "nien.gq", true },
{ "nien.org", true },
- { "nien.taipei", true },
{ "nien.tk", true },
{ "nienkeslop.nl", true },
{ "nierenpraxis-dr-merkel.de", true },
@@ -27260,7 +28191,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nigelwakefield.com", true },
{ "nigensha.co.jp", true },
{ "niggemeier.cc", true },
- { "nigger.racing", true },
{ "niggo.eu", true },
{ "night2stay.cn", true },
{ "night2stay.com", true },
@@ -27273,6 +28203,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nightmoose.org", true },
{ "nightsi.de", true },
{ "nightstand.io", true },
+ { "nihilistan.tk", true },
{ "nihon-no-sake.net", true },
{ "nihtek.in", true },
{ "nii2.org", true },
@@ -27286,7 +28217,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nikimix.com", true },
{ "nikkasystems.com", true },
{ "nikkila.me", true },
- { "nikklassen.ca", true },
{ "niklas.pw", true },
{ "niklasbabel.com", true },
{ "nikolainevalainen.fi", true },
@@ -27296,11 +28226,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nikonnps.co.uk", true },
{ "nikonpromotions.co.uk", true },
{ "nikonschool.co.uk", true },
+ { "nikpool.com", true },
{ "niktok.com", true },
{ "nil.gs", true },
{ "nil.mx", true },
{ "niles.xyz", true },
- { "nilrem.org", true },
+ { "nilgirispice.co.uk", true },
+ { "niloxy.com", true },
{ "nimeshjm.com", true },
{ "nimidam.com", true },
{ "nina-laaf.de", true },
@@ -27312,16 +28244,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ninepints.co", true },
{ "ninesix.cc", true },
{ "ninespec.com", true },
- { "ninetailed.ninja", true },
+ { "ninetailed.ninja", false },
{ "ninetaillabs.com", true },
{ "ninetaillabs.xyz", true },
{ "ninfora.com", true },
+ { "ningbo.co.uk", true },
{ "ninja-galerie.de", true },
{ "ninja-skillz.com", true },
{ "ninjan.co", true },
+ { "ninjasquad.fr", true },
{ "ninjaworld.co.uk", true },
{ "ninjio.com", true },
{ "ninov.de", true },
+ { "ninreiei.jp", true },
{ "nintendoforum.no", true },
{ "ninth.cat", true },
{ "ninthfloor.org", true },
@@ -27338,22 +28273,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "niscats.com", true },
{ "nissanofbismarckparts.com", true },
{ "nitifilter.com", true },
- { "nitix.games", true },
{ "nitrix.me", true },
{ "nitrohorse.com", false },
{ "nitrokey.com", true },
- { "nitropanel.com", true },
{ "nitropur.com", true },
{ "nitropur.de", true },
{ "nitrous-networks.com", true },
{ "nitschinger.at", true },
{ "niu.moe", true },
- { "nix.black", true },
{ "nixonlibrary.gov", true },
- { "nixtest.net", true },
{ "nixx-gel.cz", true },
{ "niyawe.de", true },
{ "niyazpoyilan.com", false },
+ { "nizhaoheng.com", true },
{ "nja.id.au", true },
{ "njast.net", true },
{ "njguardtraining.com", true },
@@ -27390,6 +28322,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "noahmodas.com.br", true },
{ "noahsaso.com", true },
{ "noahwitt.me", true },
+ { "nob.ro", true },
{ "nobitakun.com", true },
{ "nobledust.com", true },
{ "nobleparkapartments.com.au", true },
@@ -27397,12 +28330,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "noc.org", true },
{ "nocit.dk", true },
{ "nocks.com", true },
- { "nocs.cn", true },
- { "nodari.com.ar", true },
- { "nodariweb.com.ar", true },
+ { "nocmd.com", true },
{ "nodecdn.net", true },
{ "nodecraft.com", true },
{ "nodejs.de", true },
+ { "nodelab-it.de", true },
{ "nodelia.com", true },
{ "nodesec.cc", true },
{ "nodesonic.com", true },
@@ -27435,33 +28367,36 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "noisetrap.cz", true },
{ "noisky.cn", true },
{ "noisyfox.cn", true },
- { "nojestorget.se", true },
- { "nokia.la", true },
+ { "nojobook.com", true },
{ "nokono.com", true },
{ "nolaviz.org", true },
{ "noleggio-bagni-chimici.it", true },
+ { "noleggiolimousine.roma.it", true },
{ "noma-film.com", true },
{ "nomadproject.io", true },
{ "nomagic.software", true },
+ { "nomaster.cc", true },
{ "nomenclator.org", true },
{ "nomesbiblicos.com", true },
{ "nomial.co.uk", true },
{ "nomifensine.com", true },
+ { "nomik.xyz", true },
{ "nomsy.net", true },
- { "nonabytes.xyz", false },
{ "noname-ev.de", true },
{ "nonametheme.com", true },
{ "noncombatant.org", true },
+ { "nonx.pro", true },
{ "noob-box.net", true },
{ "noobow.me", true },
- { "noobswhatelse.net", true },
{ "noobunbox.net", true },
{ "noodles.net.nz", true },
{ "noodplan.co.za", true },
{ "noodweer.be", true },
{ "noofficewalls.com", true },
+ { "nook.my", true },
{ "noomist.com", true },
{ "noon-entertainments.com", true },
+ { "noonan.family", true },
{ "noop.ch", true },
{ "nooranevalainen.fi", true },
{ "noordsee.de", true },
@@ -27478,15 +28413,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nord-restaurant-bar.de", true },
{ "nord-sud.be", true },
{ "nordakademie.de", true },
- { "norden.eu.org", true },
{ "nordicirc.com", true },
{ "nordinfo.fi", true },
{ "nordlichter-brv.de", true },
{ "nordmoregatebilklubb.com", true },
{ "nordnetz-hamburg.de", true },
{ "nordseeblicke.de", true },
- { "nordwal.de", true },
{ "nordwaldzendo.de", true },
+ { "noreply.mx", true },
{ "norestfortheweekend.com", true },
{ "noret.com", true },
{ "norichanmama.com", true },
@@ -27503,6 +28437,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "northatlantalaw.net", true },
{ "northbridgecre.com", true },
{ "northbrisbaneapartments.com.au", true },
+ { "northcoastlabs.com", true },
{ "northconsulting.fr", true },
{ "northcountykiaparts.com", true },
{ "northcreekresort.com", true },
@@ -27511,6 +28446,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "northdevonbouncycastles.co.uk", true },
{ "northeastcdc.org", true },
{ "northeastrodeo.co.uk", true },
+ { "northebridge.com", true },
{ "northern-lakes.com", true },
{ "northerngate.net", true },
{ "northernhamsterclub.com", true },
@@ -27535,8 +28471,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nosqlzoo.net", true },
{ "nossasenhora.net", true },
{ "nossasenhoradodesterro.com.br", true },
- { "nostosh.eu.org", true },
{ "nostraforma.com", false },
+ { "nosuch.blog", true },
+ { "nosuch.site", true },
+ { "nosuch.website", true },
{ "noswap.com", true },
{ "nosyu.pe.kr", true },
{ "nota.moe", true },
@@ -27552,7 +28490,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "notarvysocina.cz", true },
{ "notcompletelycorrect.com", true },
{ "notepad.nz", true },
+ { "noteshare.online", true },
{ "noteskeeper.ru", true },
+ { "nothing.net.nz", true },
{ "noticaballos.com", true },
{ "noticiasdehumor.com", true },
{ "notify.moe", true },
@@ -27570,6 +28510,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "notsafefor.work", true },
{ "nottres.com", true },
{ "noudjalink.nl", true },
+ { "nourishandnestle.com", true },
{ "noustique.com", true },
{ "nova-dess.ch", true },
{ "nova-it.pl", true },
@@ -27593,6 +28534,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "novelfeed.com", true },
{ "novelinglife.net", true },
{ "novelvyretraite.fr", true },
+ { "novengi.mu", true },
+ { "novfishing.ru", true },
{ "novgorod-avia.ru", true },
{ "novilaw.com", true },
{ "novilidery.com", true },
@@ -27605,29 +28548,37 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nowall.online", true },
{ "nowhere.dk", true },
{ "nowitzki.me", true },
+ { "nowitzki.network", true },
{ "nowlas.org", true },
{ "nowloading.co", true },
+ { "nowzuwan.org", false },
{ "noxlogic.nl", true },
+ { "noxx.global", true },
{ "noydeen.com", true },
{ "noyocenter.org", true },
{ "np-edv.at", true },
{ "np.search.yahoo.com", false },
{ "npath.de", true },
+ { "npbeta.com", true },
{ "npcrcss.org", true },
{ "nphrm.com", true },
{ "npmcdn.com", true },
{ "npregion.org", true },
{ "npsas.org", true },
{ "npw.net", true },
+ { "nqesh.com", true },
+ { "nqeshreviewer.com", true },
{ "nrd.li", true },
{ "nrdstd.io", true },
{ "nrev.ch", true },
{ "nrkn.fr", true },
+ { "nrsmart.com", true },
{ "nrsweb.org", true },
{ "nrvn.cc", false },
{ "ns-frontier.com", true },
{ "ns2servers.pw", true },
{ "nsa.lol", true },
+ { "nsa.ovh", true },
{ "nsapwn.com", true },
{ "nsboston.org", true },
{ "nsboutique.com", true },
@@ -27651,12 +28602,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ntags.org", true },
{ "ntcoss.org.au", true },
{ "nte.email", true },
+ { "nth.sh", true },
{ "nti.de", true },
{ "ntia.gov", true },
{ "ntlabs.org", true },
{ "ntotten.com", true },
{ "ntppool.org", false },
{ "ntsb.gov", true },
+ { "ntut.net", true },
{ "ntwt.us", true },
{ "ntx360grad-fallakte.de", true },
{ "ntzwrk.org", true },
@@ -27694,13 +28647,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "numero1.ch", true },
{ "numerologist.com", true },
{ "numerossanos.com.ar", true },
+ { "numis.tech", true },
{ "numismed-seniorcare.de", true },
{ "numwave.nl", true },
{ "nunesgh.com", true },
{ "nunnenmacher.net", true },
{ "nunnun.jp", true },
{ "nunomoura.com", true },
- { "nuos.org", true },
{ "nuovaelle.it", true },
{ "nuquery.com", true },
{ "nur.berlin", true },
@@ -27748,9 +28701,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nwitt.us", true },
{ "nwk1.com", true },
{ "nwperformanceandoffroad.com", true },
- { "nwr-waffenbuch.de", true },
{ "nwra.com", true },
- { "nwuss.okinawa", true },
+ { "nwshell.com", true },
{ "nwwc.dk", true },
{ "nwwnetwork.net", true },
{ "nxinfo.ch", true },
@@ -27775,27 +28727,30 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "nyloc.de", true },
{ "nymphetomania.net", true },
{ "nynex.net", true },
+ { "nyoliveoil.com", true },
{ "nyoronfansubs.org", true },
{ "nyphox.ovh", true },
{ "nys-hk.com", false },
+ { "nysis.fr", true },
+ { "nysis.net", true },
{ "nysteak5.com", true },
{ "nytrafficticket.com", true },
{ "nyxi.eu", true },
{ "nyyu.tk", true },
{ "nzb.cat", false },
- { "nzbr.de", true },
{ "nzstudy.ac.nz", true },
{ "nzws.me", true },
{ "o-results.ch", true },
+ { "o-s.no", true },
{ "o-sp.com", true },
+ { "o0o.st", true },
{ "o2careers.co.uk", true },
{ "o3.wf", true },
{ "o3wallet.com", true },
- { "o5.cx", true },
{ "o6asan.com", true },
- { "o8b.club", true },
{ "oaic.gov.au", true },
{ "oakandresin.co", true },
+ { "oakesfam.net", true },
{ "oakington.info", false },
{ "oaklands.co.za", true },
{ "oakparkelectrical.com", true },
@@ -27804,6 +28759,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oakparklighting.com", true },
{ "oakparkoutdoorlighting.com", true },
{ "oakslighting.co.uk", true },
+ { "oaktonhouseandgardens.com", true },
{ "oaktree-realtors.com", true },
{ "oanalista.com.br", true },
{ "oasisdabeleza.com.br", true },
@@ -27813,6 +28769,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oauth-dropins.appspot.com", false },
{ "obamalibrary.gov", true },
{ "obamawhitehouse.gov", true },
+ { "obec-krakovany.cz", true },
{ "oberhofdrinks.com", true },
{ "obermeiers.eu", true },
{ "obesidadlavega.com", true },
@@ -27829,9 +28786,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "obono.at", true },
{ "obrienswine.ie", true },
{ "obs.group", true },
+ { "obscur.us", true },
{ "observer.name", true },
{ "obsessharness.com", true },
- { "obsidianirc.net", true },
{ "obsproject.com", true },
{ "obtima.org", true },
{ "obud.cz", true },
@@ -27854,7 +28811,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oceandns.nl", true },
{ "oceanlord.me", true },
{ "oceanvisuals.com", true },
- { "ocelot.help", true },
{ "ocenovani-inspekce.cz", true },
{ "ocf.io", true },
{ "ocg-card.com", true },
@@ -27871,8 +28827,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ocrn.nl", true },
{ "ocsigroup.fr", true },
{ "ocsr.nl", true },
+ { "octa.store", true },
{ "octagongroup.co", true },
- { "octal.es", true },
{ "octarineparrot.com", true },
{ "octav.name", false },
{ "octobered.com", true },
@@ -27896,8 +28852,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "odensc.me", true },
{ "odense3dprint.dk", true },
{ "odhosc.ca", true },
- { "odifi.com", true },
{ "odinseye.net", true },
+ { "odisealinux.com", true },
{ "odoo.co.th", true },
{ "odpikedoslike.com", true },
{ "odtu.lu", true },
@@ -27942,6 +28898,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "officeinteriors.co.nz", true },
{ "officemovepro.com", true },
{ "officiants.wedding", false },
+ { "officium.tech", true },
{ "offroadeq.com", true },
{ "offroadhoverboard.net", true },
{ "offshoot.ie", true },
@@ -27968,7 +28925,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oheila.com", true },
{ "ohhere.xyz", true },
{ "ohiohealthfortune100.com", true },
- { "ohling.org", true },
{ "ohmayonnaise.com", true },
{ "ohne-name.de", true },
{ "ohnonotme.com", true },
@@ -27976,7 +28932,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ohsohairy.co.uk", true },
{ "ohyooo.com", true },
{ "oi-wiki.org", true },
- { "oil-ecn.ru", true },
{ "oilpaintingsonly.com", true },
{ "oirealtor.com", true },
{ "oisd.nl", true },
@@ -27985,12 +28940,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ojdip.net", true },
{ "ojomovies.com", true },
{ "ojp.gov", true },
+ { "okad-center.de", true },
+ { "okad.de", true },
+ { "okad.eu", true },
+ { "okaidi.es", true },
{ "okaidi.fr", true },
{ "okakuro.org", true },
{ "okanaganrailtrail.ca", true },
{ "okashi.me", true },
{ "okay.cf", true },
{ "okay.coffee", true },
+ { "okaz.de", true },
{ "okburrito.com", true },
{ "okchicas.com", true },
{ "okchousebuyer.com", true },
@@ -28002,8 +28962,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "okmx.cloud", true },
{ "okmx.de", true },
{ "okna-tm.kz", true },
- { "okonetwork.org.uk", true },
{ "okotoksbeach.ca", true },
+ { "okqubit.net", true },
{ "oksafe-t.org", true },
{ "oktime.cz", true },
{ "oktoberfeststore.nl", true },
@@ -28011,7 +28971,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "okukan.com.au", true },
{ "okurapictures.com", true },
{ "okusiassociates.com", true },
+ { "okviz.com", true },
{ "olanderflorist.com", true },
+ { "olandiz.com", true },
{ "olasouris.com", true },
{ "olastrafford.org", true },
{ "olback.net", true },
@@ -28028,6 +28990,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oldoakflorist.com", true },
{ "oldprop.com", true },
{ "oldroutetwo.com", true },
+ { "oldschool-criminal.com", true },
{ "oldsticker.com", true },
{ "oldstmary.com", true },
{ "oldtimerreifen-moeller.de", true },
@@ -28045,6 +29008,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "olhcparish.net", true },
{ "olifant.fr", true },
{ "olightstore.ro", true },
+ { "olivemultispecialist.com", true },
{ "oliveoil.bot", true },
{ "oliveoilschool.org", true },
{ "oliveoiltest.com", true },
@@ -28058,6 +29022,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oliverschmid.space", true },
{ "oliverspringer.eu", true },
{ "oliverst.com", true },
+ { "olivier-rochet.com", true },
{ "olivierberardphotographe.com", true },
{ "olivierlemoal.fr", true },
{ "olivierpieters.be", true },
@@ -28089,9 +29054,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "om1.com", true },
{ "omanko.porn", true },
{ "omarh.net", true },
- { "omdesign.cz", true },
{ "omegahosting.net", true },
+ { "omegarazer.ca", true },
{ "omegathermoproducts.nl", true },
+ { "omenprinting.com.au", true },
{ "omeopatiadinamica.it", true },
{ "omertabeyond.com", true },
{ "omertabeyond.net", true },
@@ -28102,13 +29068,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "omi-news.fr", true },
{ "omicron3069.com", true },
{ "omitech.co.uk", true },
- { "omlmetal.co.jp", true },
{ "omniaclubs.com", true },
{ "omniasig.ro", true },
{ "omniasl.com", true },
{ "omniatv.com", true },
{ "omnibot.tv", true },
- { "omniscimus.net", false },
{ "omnisiens.se", true },
{ "omnisky.dk", true },
{ "omnitrack.org", true },
@@ -28120,12 +29084,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "omronwellness.com", true },
{ "omsdieppe.fr", true },
{ "on-tech.co.uk", true },
- { "on.tax", true },
{ "ona.io", true },
{ "onaboat.se", true },
{ "onahonavi.com", true },
{ "onarto.com", true },
- { "onazikgu.com", true },
{ "onbuzzer.com", false },
{ "onceuponarainbow.co.uk", true },
{ "oncf.asso.fr", true },
@@ -28145,16 +29107,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oneazcu.com", false },
{ "onebigcow.com", true },
{ "oneclic.ch", true },
- { "oneclickonejob.com", true },
{ "onedegreehealth.com", true },
{ "onedot.nl", true },
- { "onedottwelve.co.jp", true },
- { "onedottwelve.com", true },
+ { "onedottwelve.co.jp", false },
+ { "onedottwelve.com", false },
{ "onedrive.com", true },
{ "onedrive.live.com", false },
{ "onee3.org", true },
{ "onefour.ga", false },
+ { "onegoodthingbyjillee.com", true },
{ "oneheartbali.church", true },
+ { "onehost.blue", true },
{ "oneidentity.me", true },
{ "oneiroi.co.uk", true },
{ "onemid.net", true },
@@ -28162,8 +29125,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oneononeonone.de", true },
{ "oneononeonone.tv", true },
{ "onepercentrentals.com", true },
+ { "onepointsafeband.ca", true },
+ { "onepointsafeband.com", true },
{ "onepointzero.com", true },
{ "oneprediction.com", true },
+ { "onesearay.com", true },
{ "onesnzeroes.com", true },
{ "onesports.cz", true },
{ "onestepfootcare.com", true },
@@ -28179,7 +29145,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "onewaymail.com", true },
{ "oneweb.hu", true },
{ "onfarma.it", true },
- { "ongea.io", true },
{ "ongiaenegogoa.com", true },
{ "onhistory.co.uk", true },
{ "onhub1.com", true },
@@ -28187,15 +29152,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "onice.ch", true },
{ "onionbot.me", true },
{ "onionplay.net", true },
- { "onionplay.org", true },
{ "onionscan.org", true },
{ "onionyst.com", true },
{ "oniria.ch", true },
{ "onix.eu.com", true },
{ "onixcco.com.br", true },
{ "onkentessegertdij.hu", true },
+ { "onkfaktor.de", true },
{ "onlfait.ch", true },
{ "online-backup.se", true },
+ { "online-biblio.tk", true },
{ "online-bouwmaterialen.nl", true },
{ "online-calculator.com", true },
{ "online-consulting-corp.com", true },
@@ -28209,8 +29175,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "online-textil.cz", true },
{ "online-textil.sk", true },
{ "online.marketing", true },
- { "online.net.gr", true },
- { "online.swedbank.se", true },
{ "online24.pt", true },
{ "onlinebizdirect.com", false },
{ "onlinecasino.vlaanderen", true },
@@ -28228,7 +29192,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "onlineporno.xyz", true },
{ "onlineprofecional.com", true },
{ "onlinerollout.de", true },
- { "onlinestoreninjas.com", true },
{ "onlinetextil.cz", true },
{ "onlineth.com", false },
{ "onlinexl.nl", true },
@@ -28252,7 +29215,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "onurer.net", true },
{ "onvey.io", true },
{ "onviga.de", true },
- { "onvirt.de", true },
{ "onvori.com", true },
{ "onvori.de", true },
{ "onvousment.fr", true },
@@ -28265,19 +29227,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oogami.name", true },
{ "oogartsennet.nl", true },
{ "ooharttemplates.com", true },
+ { "oolsa.net", true },
{ "ooonja.de", true },
- { "oopsis.com", true },
{ "ooyo.be", true },
- { "op11.co.uk", false },
{ "opalesurfcasting.net", true },
{ "oparl.org", true },
{ "opcenter.de", true },
+ { "opcionpublicitaria.pe", true },
{ "ope.ee", true },
{ "open-banking-access.uk", true },
{ "open-bs.com", true },
{ "open-bs.ru", true },
+ { "open-ctp.com", true },
+ { "open-ctp.net", true },
+ { "open-ctp.org", true },
+ { "open-desk.org", true },
{ "open-domotics.info", true },
{ "open-freax.fr", true },
+ { "open-future.be", true },
{ "open-gaming.net", true },
{ "open-infrastructure.net", true },
{ "open-letters.de", true },
@@ -28290,10 +29257,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "openbeecloud.com", true },
{ "openblox.org", true },
{ "opencad.io", true },
+ { "opencaves.io", true },
{ "opencircuit.nl", true },
{ "openclima.com", true },
- { "opencluster.at", true },
{ "opencrm.co.uk", true },
+ { "openctp.com", true },
+ { "openctp.net", true },
+ { "openctp.org", true },
{ "opendata.cz", true },
{ "opendataincubator.eu", true },
{ "opendecide.com", true },
@@ -28311,7 +29281,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "openmtbmap.org", true },
{ "opennippon.com", true },
{ "opennippon.ru", true },
- { "openpictures.ch", true },
{ "openquery.com.au", true },
{ "openrainbow.com", true },
{ "openrainbow.net", true },
@@ -28320,13 +29289,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "openresty.com", true },
{ "openreview.net", true },
{ "openroademail.com", true },
- { "openruhr.de", true },
{ "openscreen.lu", true },
+ { "openshippers.com", true },
{ "opensource-cms.nl", true },
{ "opensource-training.de", true },
{ "opensourcesurvey.org", true },
{ "openspa.webhop.info", true },
{ "openssl.org", true },
+ { "openstandia.jp", true },
{ "openstem.com.au", true },
{ "openstreetmap.is", true },
{ "openstreetmap.lu", true },
@@ -28351,7 +29321,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "opium.io", true },
{ "oplop.appspot.com", true },
{ "opoleo.com", false },
- { "oportho.com.br", true },
{ "oposiciones.com.es", true },
{ "oposicionesapolicialocal.es", true },
{ "oposicionescorreos.com.es", true },
@@ -28365,6 +29334,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oppejoud.ee", true },
{ "opportunis.me", true },
{ "opportunity.de", true },
+ { "opportunityliu.top", true },
{ "oppositionsecurity.com", true },
{ "oppwa.com", true },
{ "opq.pw", true },
@@ -28378,6 +29348,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "opticaltest.com", true },
{ "optik-trosdorff.de", true },
{ "optimalsetup.com", true },
+ { "optimaner.pl", true },
{ "optimisedlabs.co.uk", true },
{ "optimisedlabs.com", true },
{ "optimist.bg", true },
@@ -28388,6 +29359,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "optmos.at", true },
{ "optometryscotland.org.uk", true },
{ "optoutday.de", true },
+ { "opure.ru", true },
{ "opus-codium.fr", true },
{ "oraculum.cz", true },
{ "orang-utans.com", true },
@@ -28396,7 +29368,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "orangefinanse.com.pl", true },
{ "orangejetpack.com", true },
{ "orangenbaum.at", true },
- { "orangenuts.in", true },
+ { "orangesquash.org.uk", true },
{ "orangetravel.eu", true },
{ "orangutan-appeal.org.uk", true },
{ "oranjee.net", true },
@@ -28409,17 +29381,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "orchidsforum.com", true },
{ "orchidspaper.com", true },
{ "orcsnet.com", true },
- { "orderessay.net", true },
+ { "ordbokpro.se", true },
{ "ordernow.at", true },
{ "orderswift.com", true },
+ { "ordoh.com", true },
{ "ordoro.com", true },
{ "ordr.mobi", true },
+ { "ore.cool", true },
{ "oreshinya.xyz", true },
{ "oreskylaw.com", true },
{ "oreto.de", true },
{ "orf-digitalsatkarte.at", false },
{ "orf-kartentausch.at", false },
{ "organica.co.za", true },
+ { "organicskincare.com", true },
{ "organisatieteam.nl", true },
{ "organisationsberatung-jacobi.de", true },
{ "organix.ma", true },
@@ -28427,12 +29402,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "orgatech-gmbh.de", true },
{ "orgsyn.in", true },
{ "orhideous.name", true },
- { "orians.eu", true },
{ "oribia.net", true },
{ "orientalart.nl", true },
+ { "orientravelmacas.com", true },
{ "oriflameszepsegkozpont.hu", true },
{ "origami.to", true },
{ "origamika.com", true },
+ { "origin8delicafes.com", true },
{ "original-christstollen.com", true },
{ "original-christstollen.de", true },
{ "originalniknihy.cz", true },
@@ -28444,17 +29420,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "orimex-mebel.ru", true },
{ "orion-universe.com", true },
{ "orioncokolada.cz", true },
- { "oriondynamic.be", true },
{ "orionfinancialservices.com", true },
- { "oriongames.eu", true },
{ "orkestar-krizevci.hr", true },
{ "orkiv.com", true },
{ "orlandobalbas.com", true },
{ "orlandoprojects.com", true },
{ "orleika.io", true },
- { "orlives.de", false },
{ "ormer.nl", true },
{ "orocojuco.com", true },
+ { "oroscopodelmese.it", true },
+ { "orro.ro", false },
{ "orrs.de", true },
{ "orthocop.cz", true },
{ "orthodontiste-geneve-docteur-rioux.com", true },
@@ -28464,7 +29439,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oruggt.is", true },
{ "orwell1984.today", true },
{ "oryva.com", true },
- { "os-chrome.ru", true },
+ { "orz.uno", true },
{ "os-s.net", true },
{ "os-t.de", true },
{ "os24.cz", true },
@@ -28481,12 +29456,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oses.mobi", true },
{ "oshayr.com", true },
{ "oshell.me", true },
- { "oshershalom.com", true },
{ "oshrc.gov", true },
{ "osielnava.com", true },
- { "osirisrp.online", true },
{ "osirium.com", true },
{ "oskrba.net", true },
+ { "oskrba.online", true },
{ "oskuro.net", true },
{ "osla.org", true },
{ "oslinux.net", true },
@@ -28496,11 +29470,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "osmre.gov", true },
{ "osnova.cz", true },
{ "osobliwydom.pl", true },
+ { "osolutionscorp.com", true },
{ "osomjournal.org", true },
{ "ospf.sk", true },
{ "osprecos.com.br", true },
{ "osprecos.pt", true },
{ "ospree.me", true },
+ { "ostachstore.com", true },
{ "ostan-collections.net", true },
{ "osterkraenzchen.de", true },
{ "ostgotamusiken.se", true },
@@ -28514,25 +29490,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "oswbouncycastles.co.uk", true },
{ "osworx.net", true },
{ "osx86spain.com", true },
- { "osxentwicklerforum.de", true },
{ "oszri.hu", true },
{ "otakubox.de", true },
{ "otakurepublic.com", true },
{ "otakurumi.de", true },
- { "otakuyun.com", true },
{ "otellio.com", true },
{ "otellio.de", true },
{ "otellio.it", true },
{ "other98.com", true },
{ "oticasaopaulo.com.br", true },
{ "oticasvisao.net.br", true },
+ { "otisko.com", true },
{ "otokiralama.name.tr", true },
{ "otorrino.pt", true },
{ "otoy.com", true },
- { "otoya.space", true },
+ { "otoya.space", false },
{ "otpsmart.com.ua", true },
{ "otr.ie", true },
{ "otrm.de", true },
+ { "ots.gov", true },
{ "otsfreestyle.jp", true },
{ "ottoproject.io", false },
{ "ottoversand.at", true },
@@ -28544,7 +29520,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ouestsolutions.com", true },
{ "ouglor.com", true },
{ "ouin.land", true },
- { "oulunjujutsu.com", true },
{ "our-box.net", true },
{ "ourai.ws", true },
{ "ourcloud.at", true },
@@ -28559,7 +29534,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ourwedding.xyz", true },
{ "ourworldindata.org", true },
{ "out-of-scope.de", true },
+ { "outdoorchoose.com", true },
{ "outdoorfurniture.ie", true },
+ { "outdoorhole.com", true },
{ "outdoorimagingportal.com", true },
{ "outdoorlightingagoura.com", true },
{ "outdoorlightingagourahills.com", true },
@@ -28575,9 +29552,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "outdoorlightingsimivalley.com", true },
{ "outdoorlightingthousandoaks.com", true },
{ "outdoorlightingwestlakevillage.com", true },
- { "outerlimitsdigital.com", true },
- { "outetc.com", true },
+ { "outfit-weimar.eu", true },
{ "outgress.com", true },
+ { "outincanberra.com.au", true },
{ "outka.xyz", true },
{ "outline.ski", true },
{ "outlines.xyz", true },
@@ -28592,6 +29569,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "overclockers.ge", true },
{ "overdrive-usedcars.be", true },
{ "overkillshop.com", true },
+ { "overlandireland.ie", true },
{ "overseamusic.de", true },
{ "oversight.garden", true },
{ "oversight.gov", true },
@@ -28619,15 +29597,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "owlandrabbitgallery.com", true },
{ "owlishmedia.com", true },
{ "own3d.ch", true },
+ { "ownagepranks.com", true },
+ { "ownc.at", true },
{ "owncloud.ch", true },
- { "ownmay.com", true },
+ { "ownmay.com", false },
{ "oxborrow.ca", true },
+ { "oxdl.cn", true },
{ "oxelie.com", true },
{ "oxia.me", true },
{ "oxiame.eu", true },
+ { "oximo.lviv.ua", true },
{ "oxo.cloud", true },
{ "oxygin.net", true },
{ "oxytocin.org", true },
+ { "oxz.me", true },
{ "oxzeth3sboard.com", true },
{ "oyashirosama.tokyo", true },
{ "oyosoft.fr", true },
@@ -28645,12 +29628,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "p-fent.ch", true },
{ "p-s-b.com", true },
{ "p-t.io", true },
- { "p.ki", true },
- { "p1cn.com", true },
+ { "p0l.de", true },
{ "p1ratrulezzz.me", true },
{ "p22.co", true },
{ "p4chivtac.com", true },
- { "p5118.com", true },
+ { "p5on.net", true },
{ "p5r.uk", true },
{ "pa-w.de", true },
{ "pa.search.yahoo.com", false },
@@ -28683,9 +29665,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pacaom.com", true },
{ "pacatlantic.com", true },
{ "pacco.com.br", true },
- { "paccolat.name", true },
{ "pace.car", true },
- { "paceda.nl", true },
+ { "paced.me", true },
{ "pacelink.de", true },
{ "pacifco.com", true },
{ "pacificcashforcars.com.au", true },
@@ -28703,11 +29684,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "packaware.com", true },
{ "packetdigital.com", true },
{ "packetlinux.com", true },
+ { "packs-de-mujeres.com", true },
{ "pact2017.nl", true },
{ "pactf.com", true },
{ "padam-group.com", true },
{ "padberx-marketing-consultants.de", true },
{ "paddy.rocks", true },
+ { "padeoe.com", true },
{ "padianda.com", true },
{ "padkit.org", true },
{ "padovani.de", true },
@@ -28725,12 +29708,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pagalworld.la", true },
{ "pagalworld.me", true },
{ "pagalworld.org", true },
+ { "pagamentosonline.pt", true },
{ "page-builders.com", true },
{ "pageantsnews.com", false },
{ "pagedesignhub.com", true },
{ "pagedesignpro.com", true },
{ "pagedesignweb.com", true },
{ "pagefulloflies.io", true },
+ { "pagerduty.com", true },
{ "pagewizz.com", true },
{ "pagiamtzis.com", true },
{ "pagina.com.mx", true },
@@ -28740,17 +29725,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pahae.de", true },
{ "pahealthbilling.com", true },
{ "pahlawanpulsa.com", true },
+ { "pahub.io", true },
{ "paichai.space", false },
+ { "paigejulianne.com", true },
{ "paincareehr.com", true },
{ "paindata.dk", true },
{ "painefamily.co.uk", true },
- { "painlessproperty.co.uk", true },
{ "paint-it.pink", true },
{ "paintball-ljubljana.si", true },
{ "paintball-shop.sk", true },
{ "paintcolorsbysue.com", true },
{ "paintingindurban.co.za", true },
- { "paintsealdirect.com", true },
{ "paipuman.jp", true },
{ "pajadam.me", true },
{ "pajuvuo.fi", true },
@@ -28765,16 +29750,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pakroyalpress.com", true },
{ "paktolos.net", true },
{ "palabr.as", true },
+ { "palace-bayreuth.de", true },
{ "palapadev.com", true },
{ "palariviera.com", true },
{ "palary.work", true },
{ "palatin.at", true },
{ "palava.tv", true },
+ { "palavalbasket.it", true },
{ "palavatv.com", true },
{ "palazzo.link", true },
{ "palazzo.work", true },
+ { "paleolowcarb.de", true },
{ "paleoself.com", true },
{ "paleotraining.com", true },
+ { "palermopride.it", true },
{ "palestra.roma.it", true },
{ "palladium46.com", true },
{ "pallas.in", true },
@@ -28788,6 +29777,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pamatv.hk", true },
{ "pamsorel.co.za", true },
{ "pan.digital", true },
+ { "panamatrippin.com", true },
{ "panasca.is", true },
{ "panascais.co", true },
{ "panascais.com", true },
@@ -28795,11 +29785,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "panascais.eu", true },
{ "panascais.host", true },
{ "panascais.me", true },
+ { "panascais.net", true },
{ "panascais.pw", true },
{ "panascais.site", true },
{ "panascais.tech", true },
{ "panascais.us", true },
- { "panasproducciones.com", true },
{ "panaxis.biz", true },
{ "panaxis.ch", true },
{ "panaxis.li", true },
@@ -28814,14 +29804,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "panhandlemenshealth.com", true },
{ "panic.tk", true },
{ "panier-legumes.bio", true },
+ { "paniodpolskiego.eu", true },
{ "paniyanovska.ua", true },
{ "panj.ws", true },
{ "panjiva.com", true },
{ "panmetro.com", true },
- { "panomizer.de", true },
{ "panopy.co", true },
{ "panopy.me", true },
- { "panoxadrez.com.br", true },
{ "panpa.ca", true },
{ "panpsychism.com", true },
{ "panpsychist.com", true },
@@ -28836,11 +29825,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "panzer72.ru", true },
{ "panzerscreen.dk", true },
{ "pao.ge", true },
+ { "paolotagliaferri.com", true },
{ "pap.la", false },
{ "papa-webzeit.de", true },
{ "papadopoulos.me", true },
{ "papakatsu-life.com", true },
- { "papapa-members.club", true },
{ "papaya.me.uk", true },
{ "papayame.com", true },
{ "papayapythons.com", true },
@@ -28864,7 +29853,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "parachute70.com", true },
{ "paracomer.es", true },
{ "paradais-sphynx.com", true },
- { "paradependentesquimicos.com.br", true },
{ "paradise-engineer.com", true },
{ "paradise-engineering.com", true },
{ "paradise-travel.net", true },
@@ -28876,8 +29864,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "paranoidcrypto.com", true },
{ "paranoidmode.com", true },
{ "paranoidpenguin.net", true },
- { "paranormalweirdo.com", true },
- { "paranoxer.hu", true },
{ "parasitologyclub.org", true },
{ "parasosto.fi", true },
{ "paratlan.hu", true },
@@ -28887,6 +29873,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "parckwart.de", true },
{ "parcon.it", true },
{ "parcoursup.fr", true },
+ { "pareachat.com", true },
{ "parentelement.com", true },
{ "parentheseardenne.be", true },
{ "parentinterview.com", true },
@@ -28900,6 +29887,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "parisfranceparking.de", true },
{ "parisfranceparking.fr", true },
{ "parisfranceparking.nl", true },
+ { "parisprovincedemenagements.fr", true },
{ "parkeren.in", true },
{ "parkfans.net", true },
{ "parkhost.eu", true },
@@ -28914,21 +29902,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "parleu2016.nl", true },
{ "parmels.com.br", true },
{ "parnassys.net", true },
- { "parodesigns.com", true },
{ "parolu.io", true },
{ "parquettista.milano.it", true },
{ "parquettista.roma.it", true },
- { "parroquiasanrafaeldegramalote.com", true },
{ "parry.org", true },
{ "parsemail.org", true },
{ "parser.nu", true },
{ "parsonsfamilyhomes.com", true },
+ { "partage.ovh", true },
{ "parteaga.com", true },
{ "parteaga.net", true },
{ "partecipa.tn.it", true },
{ "parthkolekar.me", true },
- { "partijhandel.website", true },
- { "partijtjevoordevrijheid.nl", false },
{ "partiono.com", true },
{ "partner.sh", true },
{ "partnercardservices.com", true },
@@ -28937,10 +29922,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "partridge.tech", true },
{ "parts4phone.com", true },
{ "partsestore.com", true },
+ { "parturi-manner.fi", true },
{ "partusedtyres.net", true },
{ "party-and-play.co.uk", true },
{ "party-calendar.net", true },
- { "party-kneipe-bar.com", true },
{ "party-time-inflatables-durham.co.uk", true },
{ "partybounceplay.co.uk", true },
{ "partycentrumdebinnenhof.nl", true },
@@ -28958,9 +29943,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "partyyy.io", true },
{ "partyzone.ie", true },
{ "parvaneh.fr", true },
+ { "parys.org", true },
{ "pasadenapooch.org", true },
- { "pasadenasandwich.co", true },
- { "pasadenasandwich.com", true },
{ "pasadenasandwichcompany.com", true },
{ "pasalt.com", true },
{ "pasarella.eu", true },
@@ -28973,6 +29957,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pascalmathis.com", true },
{ "pascalmathis.me", true },
{ "pascalmathis.net", true },
+ { "pascalspoerri.ch", false },
{ "pascualinmuebles.com", true },
{ "pasearch.nl", true },
{ "pashminacachemire.com", true },
@@ -28998,8 +29983,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "passport.yandex.ru", true },
{ "passport.yandex.ua", true },
{ "passports.govt.nz", true },
- { "passrhce.com", true },
- { "passrhcsa.com", true },
{ "passthepopcorn.me", true },
{ "passumpsicbank.com", true },
{ "passvanille-reservation.fr", true },
@@ -29026,8 +30009,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pasteblin.com", true },
{ "pasternok.org", true },
{ "pasticcerialorenzetti.com", true },
- { "pastoral-verbund.de", true },
- { "pastordocaucaso.com.br", true },
{ "pasztor.at", true },
{ "patapwn.com", true },
{ "patatbesteld.nl", true },
@@ -29043,6 +30024,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "patika-biztositas.hu", true },
{ "patikabiztositas.hu", true },
{ "patineteselectricosbaratos.net", true },
+ { "patric-lenhart.de", true },
{ "patrick-othmer.de", true },
{ "patrick-robrecht.de", true },
{ "patrick.my-gateway.de", true },
@@ -29052,11 +30034,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "patrickbrosi.de", true },
{ "patrickhoefler.net", true },
{ "patricklynch.xyz", true },
+ { "patrickschneider.me", true },
{ "patrikgarten.de", true },
{ "patriksima.cz", true },
{ "patriksimek.cz", true },
{ "patriotstationatchalfont.com", true },
{ "patrocinio.com.br", true },
+ { "patrykwegrzynek.pl", true },
{ "patrz.eu", true },
{ "patsch-photography.de", true },
{ "patsyforyou.ch", true },
@@ -29074,12 +30058,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "paulbakaus.com", true },
{ "paulbdelaat.nl", true },
{ "paulbramhall.uk", true },
- { "paulchen.at", true },
{ "paulcooper.me.uk", true },
{ "pauldev.co", true },
{ "paulerhof.com", true },
{ "paulgerberrealtors.com", true },
{ "paulinewesterman.nl", true },
+ { "paullockaby.com", true },
{ "paulmeier.com", false },
{ "paulomonteiro.pt", true },
{ "paulov.com", true },
@@ -29094,11 +30078,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "paulsnar.lv", true },
{ "paulswartz.net", true },
{ "paulus-foto.pl", true },
+ { "paulw.io", true },
{ "paulward.net", true },
{ "paulwatabe.com", true },
{ "paulwendelboe.com", true },
{ "pauly-stahlhandel.com", true },
{ "pauly-stahlhandel.de", true },
+ { "pause-canap.com", true },
{ "pauspam.net", true },
{ "pautadiaria.com", true },
{ "pavamtio.cz", true },
@@ -29111,18 +30097,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pawel-international.com", true },
{ "pawelnazaruk.com", true },
{ "pawelurbanek.com", true },
- { "pawfriends.org.za", true },
{ "pawsomebox.co.uk", true },
+ { "pawspuppy.com", true },
{ "pawsr.us", true },
+ { "paxchecker.com", true },
{ "paxerahealth.com", true },
{ "pay-online.in", true },
{ "pay.gov", true },
+ { "paya.cat", true },
{ "paybook.co.tz", true },
{ "payboy.biz", true },
{ "payboy.rocks", true },
{ "paybro.eu", true },
+ { "paydigital.pt", true },
{ "payexpresse.com", true },
{ "payfazz.com", true },
+ { "payjunction.com", true },
+ { "payjunctionlabs.com", true },
{ "paylike.io", true },
{ "payloc.io", true },
{ "payme.uz", true },
@@ -29148,11 +30139,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "paytonmoledor.com", true },
{ "payupay.ru", true },
{ "payzang.com", true },
+ { "pb.ax", false },
{ "pback.se", true },
{ "pbosquet.com", true },
{ "pbourhis.me", true },
{ "pbr.so", true },
{ "pbraunschdash.com", true },
+ { "pbren.com", true },
{ "pbrumby.com", true },
{ "pbz.im", true },
{ "pc-rescue.me", false },
@@ -29178,6 +30171,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pcnotdienst-oldenburg-rastede.de", true },
{ "pcreparatiehardenberg.nl", true },
{ "pcrypt.org", true },
+ { "pcs.org.au", true },
{ "pcs2.gr", true },
{ "pcsetting.com", true },
{ "pctonic.net", true },
@@ -29193,7 +30187,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pdfsearches.com", true },
{ "pdkrawczyk.com", true },
{ "pdox.net", true },
- { "pdragt.com", true },
{ "pdthings.net", true },
{ "pdxtowncar.net", true },
{ "pe.search.yahoo.com", false },
@@ -29206,13 +30199,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "peanutbase.org", true },
{ "peanutproductionsnyc.com", true },
{ "pear2pear.de", true },
- { "pearbloom.com", true },
{ "pearlcohen.com", true },
{ "pearlsenroses.nl", true },
+ { "pearlsonly.ca", true },
{ "pearlsonly.com", true },
+ { "pearlsonly.com.au", true },
+ { "pearlsonly.de", true },
+ { "peatsbeast.com", true },
{ "peaudorange.net", true },
{ "pebbleparents.com", true },
+ { "pebblepointapartmentsstl.com", true },
{ "pebbles.net.in", true },
+ { "peckcloths.com", true },
{ "pecker-johnson.com", true },
{ "peda.net", true },
{ "peddock.com", true },
@@ -29231,6 +30229,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "peeekaaabooo.com", true },
{ "peekier.com", true },
{ "peep.gq", true },
+ { "peepsfoundation.org", true },
{ "peercraft.at", true },
{ "peercraft.be", true },
{ "peercraft.biz", true },
@@ -29260,6 +30259,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "peerweb.com", true },
{ "peetah.com", true },
{ "peeters.io", true },
+ { "pefricea.com", true },
{ "peg.nu", true },
{ "pegas-studio.net", true },
{ "pehapkari.cz", true },
@@ -29268,10 +30268,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "peka.pw", true },
{ "pekarstvivetvrzi.cz", true },
{ "pekkapleppanen.fi", true },
- { "pekoe.se", true },
+ { "pekoe.se", false },
{ "pelanucto.cz", true },
{ "pelican.ie", true },
- { "peliculator.com", true },
+ { "peliseries24.com", true },
{ "pellet.pordenone.it", true },
{ "pelletizermill.com", true },
{ "pelletsprice.com", true },
@@ -29282,6 +30282,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pems.gov.au", true },
{ "penaugustin.com", true },
{ "pencepay.com", true },
+ { "pencil2d.org", true },
{ "pencillab.cn", true },
{ "pendriveapps.com", true },
{ "penetrationstest.se", true },
@@ -29311,15 +30312,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pentofun.ch", true },
{ "pentoo.ch", true },
{ "penz.media", true },
+ { "penzionvzahrade.cz", true },
{ "peoplelikemeapp.com", true },
{ "peoplesdecade.org", true },
{ "peoplesguardian.org", true },
{ "pepeelektro.sk", true },
{ "pepemodelismo.com.br", true },
{ "peperstraat.online", true },
+ { "pepfar.gov", true },
{ "pepgrid.net", true },
{ "peplog.nl", true },
{ "pepme.net", true },
+ { "peppelmedi.fi", true },
{ "pepstaff.net", true },
{ "pepwaterproofing.com", true },
{ "pequenosfavoritos.com.br", false },
@@ -29333,6 +30337,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "percyflix.com", true },
{ "perd.re", true },
{ "perecraft.com", true },
+ { "perevedi.org", true },
{ "perezdecastro.org", true },
{ "perfect-carstyle.de", true },
{ "perfect.in.th", true },
@@ -29346,16 +30351,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "perfektesgewicht.com", true },
{ "perfektesgewicht.de", true },
{ "perfmatters.io", true },
+ { "performancegate.com", true },
{ "performancehealth.com", false },
{ "performing-art-schools.com", true },
{ "perfumeaz.com", true },
{ "perfumes.com.br", true },
+ { "perge.com.br", true },
{ "periodic-drinking.com", true },
{ "periscope.tv", true },
{ "perishablepress.com", true },
{ "perm-avia.ru", true },
{ "perm4.com", true },
{ "permajackofstlouis.com", true },
+ { "permaseal.net", true },
{ "permeance108.com", true },
{ "permistheorique.be", true },
{ "permistheoriqueenligne.be", true },
@@ -29365,6 +30373,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "perrau.lt", true },
{ "perroquet-passion.ch", true },
{ "persephone.gr", true },
+ { "persiart.shop", true },
{ "persocloud.org", true },
{ "personal-genome.com", true },
{ "personaltrainer-senti.de", true },
@@ -29396,6 +30405,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "peterbarrett.ca", true },
{ "peterboers.info", true },
{ "peterborgapps.com", true },
+ { "peterboweycomputerservices.com.au", true },
{ "peterbruceharvey.com", true },
{ "peterdavehello.org", true },
{ "peterfiorella.com", true },
@@ -29407,6 +30417,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "peterlew.is", true },
{ "petermaar.com", true },
{ "petersontoscano.com", true },
+ { "petervaldesii.com", true },
+ { "petervaldesii.io", true },
{ "petervanleeuwentweewielers.nl", true },
{ "petfa.ga", true },
{ "petit-archer.com", true },
@@ -29429,26 +30441,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "petroleum-schools.com", true },
{ "petroscand.eu", true },
{ "petrostathis.com", true },
+ { "petrotranz.com", true },
{ "petrpikora.com", true },
{ "petrucciresidential.com", true },
+ { "petruzz.net", true },
{ "pets4life.com.au", true },
{ "petschnighof.at", true },
{ "pettitcoat.com", true },
+ { "petto.com.co", true },
{ "petwall.info", true },
{ "pew.ninja", true },
{ "pewnews.org", true },
{ "pex.digital", true },
{ "peyote.com", true },
+ { "pf.dk", true },
{ "pfa.or.jp", true },
{ "pfadfinder-aurich.de", true },
{ "pfadfinder-grossauheim.de", true },
- { "pfarchimedes-pensioen123.nl", true },
{ "pfarre-kremsmuenster.at", true },
{ "pfcafeen.dk", true },
{ "pfd-nz.com", false },
{ "pfefferkuchen-shop.de", true },
{ "pfefferkuchenprinzessin-dresden.de", true },
- { "pferdekauf.de", true },
{ "pfeuffer-elektro.de", true },
{ "pfft.net", true },
{ "pfk.org.pl", true },
@@ -29464,7 +30478,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pg-forum.de", true },
{ "pg-mana.net", true },
{ "pgh-art.com", true },
- { "pglandscapingpaving.com", true },
+ { "pglaum.tk", true },
{ "pgmann.cf", true },
{ "pgnetwork.net", true },
{ "pgp.guru", true },
@@ -29478,11 +30492,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pharma-display.com", true },
{ "pharmaabsoluta.com.br", true },
{ "pharmaboard.de", true },
+ { "pharmaboard.org", true },
{ "pharmacie-fr.org", true },
{ "pharmacieplusfm.ch", true },
+ { "pharmacyglobalrx.net", true },
{ "pharmafoto.ch", true },
{ "pharmaphoto.ch", true },
{ "pharmapolitics.com", true },
+ { "pharmaquality.com", true },
{ "pharmasana.co.uk", true },
{ "pharmasana.de", true },
{ "pharmica.co.uk", true },
@@ -29490,9 +30507,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pharside.dyndns.org", true },
{ "pharynks.com", true },
{ "pharynx.nl", true },
- { "phasersec.com", false },
{ "phasme-2016.com", true },
{ "phattea.tk", true },
+ { "phaux.uno", true },
{ "phcimages.com", true },
{ "phcnetworks.net", true },
{ "phcorner.net", true },
@@ -29505,7 +30522,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "phget.com", true },
{ "phhtc.ir", true },
{ "phi-works.com", true },
- { "phialo.de", true },
+ { "phibureza.com", true },
{ "phil-dirt.com", true },
{ "phil-phillies.com", true },
{ "phil.red", true },
@@ -29519,7 +30536,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "philipp-trulson.de", true },
{ "philipp-winkler.de", true },
{ "philipp1994.de", true },
- { "philippbirkholz.com", true },
{ "philippbirkholz.de", true },
{ "philippe-mignotte.fr", true },
{ "philippebonnard.fr", true },
@@ -29545,12 +30561,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "philux.ch", true },
{ "phishing-studie.org", true },
{ "phishingusertraining.com", true },
- { "phligence.com", true },
{ "phocean.net", true },
- { "phoenixlogan.com", true },
+ { "phoenics.de", false },
{ "phoenixurbanspaces.com", true },
{ "pholder.com", true },
{ "phone-service-center.de", true },
+ { "phonenumber-info.co.uk", true },
{ "phonix-company.fr", true },
{ "phormance.com", true },
{ "phosagro.biz", false },
@@ -29570,6 +30586,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "photography-workshops.net", true },
{ "photolium.net", false },
{ "photomodelcasting.com", true },
+ { "photosafari.com.my", true },
{ "phototravel.uk", true },
{ "phototrio.com", true },
{ "phoxden.net", true },
@@ -29581,7 +30598,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "phpartners.org", true },
{ "phpbbchinese.com", true },
{ "phpdorset.co.uk", true },
- { "phpinfo.in.th", true },
{ "phpliteadmin.org", true },
{ "phpmyadmin.net", true },
{ "phpower.com", true },
@@ -29589,21 +30605,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "phpsecure.info", true },
{ "phpstan.org", true },
{ "phpunit.de", true },
- { "phryanjr.com", false },
+ { "phrazor.com", true },
{ "phuket-idc.com", true },
{ "phuket-idc.de", true },
- { "phunehehe.net", true },
{ "phurl.de", true },
{ "phurl.io", true },
{ "phus.lu", true },
{ "phyley.com", true },
{ "physicalism.com", true },
{ "physicalist.com", true },
- { "physicaltherapist.com", false },
{ "physics-schools.com", true },
{ "physiotherapie-seiwald.de", true },
{ "physiovesenaz.ch", true },
- { "pi-box.ml", true },
{ "pi-control.de", true },
{ "pi-dash.com", true },
{ "pi-net.dedyn.io", true },
@@ -29612,6 +30625,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pianetaottica.it", true },
{ "pianetatatuaggi.it", true },
{ "pianomover.co.uk", true },
+ { "pianos.de", true },
{ "pianyigou.com", true },
{ "piatabrasil.com.br", true },
{ "piboubes.me", true },
@@ -29628,10 +30642,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pickmysoap.gr", true },
{ "pickormix.co.uk", true },
{ "picksin.club", true },
+ { "pickupenc.ru", true },
{ "piclect.com", true },
{ "picoauto.com", true },
{ "piconepress.com", true },
{ "picotech.com", true },
+ { "picr.ws", true },
{ "picster.at", true },
{ "picsto.re", true },
{ "pictorial.com.sg", true },
@@ -29660,7 +30676,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pierre-schmitz.com", true },
{ "pierreblake.com", true },
{ "pierrefv.com", true },
- { "pierreprinetti.com", true },
{ "pierrickdeniel.fr", true },
{ "pietechsf.com", true },
{ "pieterbos.nl", true },
@@ -29671,6 +30686,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pijuice.com", true },
{ "pijusmagnificus.com", true },
{ "pik.bzh", true },
+ { "pikafederation.ca", true },
+ { "pikeitservices.com.au", true },
{ "pikimusic.moe", true },
{ "pilani.ch", true },
{ "pilarguineagil.com", true },
@@ -29685,9 +30702,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pilotgrowth.com", true },
{ "pilsoncontracting.com", true },
{ "pilvin.pl", true },
+ { "pimg136.com", true },
{ "pimhaarsma.nl", true },
{ "pimhaarsmamedia.nl", true },
{ "pimpmyperf.fr", true },
+ { "pimusiccloud.hopto.org", true },
+ { "pimylifeup.com", true },
{ "pinceaux.org", true },
{ "pincha.com.tw", false },
{ "pincodeit.com", true },
@@ -29708,6 +30728,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pinkladyapples.co.uk", true },
{ "pinklecfest.org", true },
{ "pinklittlenotebook.com", true },
+ { "pinkmango.travel", true },
{ "pinkwalk.co.nz", true },
{ "pinkyf.com", false },
{ "pinkylam.me", true },
@@ -29715,8 +30736,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pinnacleallergy.net", true },
{ "pinnaclelife.co.nz", true },
{ "pinnaclelife.nz", true },
- { "pinnacles.com", true },
- { "pinner.io", true },
{ "pinot.it", true },
{ "pinoydailytvshow.net", true },
{ "pinoyonlinetv.com", true },
@@ -29734,6 +30753,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pinterest.jp", true },
{ "pinterjann.is", true },
{ "pintosbeeremovals.co.za", true },
+ { "pintoselectricfencing.co.za", true },
{ "pintosplumbing.co.za", true },
{ "pioneer-car.eu", true },
{ "pioneer-rus.ru", true },
@@ -29745,6 +30765,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "piraten-basel.ch", true },
{ "piraten-bv-nord.de", true },
{ "pirateparty.org.uk", true },
+ { "pirateproxy.bet", true },
{ "pirateproxy.cam", true },
{ "pirateproxy.cat", true },
{ "pirateproxy.cc", true },
@@ -29777,10 +30798,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pitaiatrade.com", true },
{ "pitbullsecuritysolutions.ca", true },
{ "pitchpinecapital.com", true },
+ { "pitchup.com", true },
{ "pitchupp.com", true },
{ "pitfire.io", true },
{ "pitot-rs.org", true },
{ "pittmantraffic.co.uk", true },
+ { "piu.moe", true },
{ "piubip.com.br", true },
{ "pivniraj.com", true },
{ "pivotaltracker.com", true },
@@ -29794,20 +30817,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pixel.google.com", true },
{ "pixelbash.de", true },
{ "pixelcubed.com", true },
- { "pixelfou.com", true },
{ "pixelminers.net", true },
{ "pixelpirat.ch", true },
{ "pixelsquared.us", true },
{ "pixelurbia.com", true },
{ "pixelution.at", true },
{ "pixelz.cc", true },
+ { "pixeoapp.com", true },
{ "pixiv.cat", true },
{ "pixiv.moe", true },
{ "pixlfox.com", true },
{ "pixloc.fr", true },
+ { "pixshop.fr", true },
+ { "pixulutinho.com.br", true },
{ "pizza-show.fr", true },
{ "pizzabesteld.nl", true },
- { "pizzabottle.com", false },
{ "pizzafest.ddns.net", true },
{ "pizzagigant.hu", true },
{ "pizzahut.ru", true },
@@ -29819,9 +30843,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pjentertainments.co.uk", true },
{ "pjleisure.co.uk", true },
{ "pjo.no", true },
+ { "pjp.com.mt", true },
{ "pjuu.com", false },
{ "pk.search.yahoo.com", false },
- { "pkbjateng.com", true },
{ "pkbjateng.or.id", true },
{ "pkeus.de", true },
{ "pkgt.de", false },
@@ -29834,7 +30858,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pl-cours.ch", true },
{ "pl.search.yahoo.com", false },
{ "placasonline.com.br", true },
- { "placebet.pro", true },
{ "placedaffiliate.com", true },
{ "placedapps.com", true },
{ "placedsupport.com", true },
@@ -29882,21 +30905,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "plantastique.ch", true },
{ "plantastique.com", true },
{ "planteforum.no", true },
- { "plantekno.com", true },
+ { "plantekno.com", false },
{ "plantes.ch", true },
{ "plantezcheznous.com", true },
+ { "plantron.gr", true },
+ { "plantroon.com", true },
{ "plantrustler.com", true },
{ "planujemywesele.pl", true },
{ "planup.fr", true },
{ "planview.com", true },
{ "plaque-funeraire.fr", true },
{ "plassmann.ws", true },
+ { "plastic-id.com", true },
{ "plasticsurgerynola.com", true },
{ "plasticsurgeryservices.com", true },
{ "plastovelehatko.cz", true },
{ "plateformecandidature.com", true },
{ "platformadmin.com", true },
+ { "platinapump.com", true },
{ "platinumexpress.com.ar", true },
+ { "platnicyvat.pl", true },
{ "platomania.nl", true },
{ "platschi.net", true },
{ "platten-nach-mass.de", true },
@@ -29919,6 +30947,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "playreal.city", true },
{ "playsharp.com", true },
{ "playsnake.org", true },
+ { "playsoundevents.be", true },
{ "playtictactoe.org", true },
{ "playtimebouncycastles.co.uk", true },
{ "playupnow.com", true },
@@ -29940,6 +30969,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "plexa.de", true },
{ "plexhome13.ddns.net", true },
{ "plexmark.tk", true },
+ { "plextv.de", true },
{ "plicca.com", true },
{ "pliosoft.com", true },
{ "plissee-experte.de", true },
@@ -29963,6 +30993,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pluginsloaded.com", true },
{ "pluimveeplanner.nl", true },
{ "plumber-in-sandton.co.za", true },
+ { "plumbercincoranch.com", true },
{ "plumbermountedgecombe.co.za", true },
{ "plumberumhlangarocks.co.za", true },
{ "plumbingandheatingspecialistnw.com", true },
@@ -29970,6 +31001,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "plumbingcentral.com.au", true },
{ "plumbingglenvista.co.za", true },
{ "plumlocosoft.com", true },
+ { "plumnet.ch", true },
{ "plumpie.net", false },
{ "plumplat.com", true },
{ "plur.com.au", true },
@@ -29980,11 +31012,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "plus.sandbox.google.com", true },
{ "pluscbdoil.com", true },
{ "pluslink.co.jp", true },
+ { "plusminus30.si", true },
{ "plusstreamfeed.appspot.com", true },
- { "pluta.net", false },
+ { "plustech.id", true },
{ "plutiedev.com", true },
{ "pluto.life", true },
{ "plutokorea.com", true },
+ { "plutonx.com", true },
{ "plutopia.ch", true },
{ "plymouthbouncycastles.co.uk", true },
{ "plzdontpwn.me", true },
@@ -30025,33 +31059,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pneuhaus-lemp.ch", true },
{ "pnimmobilier.ch", true },
{ "pnmhomecheckup.com", true },
- { "pnoec.org.do", true },
{ "pnona.cz", true },
{ "pnsc.is", true },
{ "pnut.io", false },
{ "po.net", true },
{ "poba.fr", true },
{ "poc.xn--fiqs8s", true },
- { "poc060.com", true },
- { "poc080.com", true },
- { "poc100.com", true },
- { "poc109.com", true },
- { "poc11.com", true },
- { "poc116.com", true },
- { "poc118.com", true },
- { "poc119.com", true },
- { "poc120.com", true },
- { "poc128.com", true },
- { "poc13.com", true },
- { "poc15.com", true },
- { "poc16.com", true },
- { "poc18.com", true },
- { "poc19.com", true },
- { "poc21.com", true },
- { "poc211.com", true },
{ "poc22.com", true },
- { "poc226.com", true },
- { "poc228.com", true },
{ "poc23.com", true },
{ "poc25.com", true },
{ "poc26.com", true },
@@ -30112,18 +31126,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pochaneko.com", true },
{ "pocitacezababku.cz", true },
{ "pocketfruity.com", true },
- { "pocketinsure.com", true },
{ "pocpok.com", true },
{ "pocqipai.com", true },
- { "podemos.info", true },
{ "podia.com.gr", false },
+ { "podipod.com", true },
{ "podo-podo.com", true },
{ "podroof.com", true },
{ "podroof.com.au", true },
{ "podshrink.de", true },
{ "poe.digital", true },
{ "poed.net.au", true },
- { "poedgirl.com", true },
{ "poemlife.com", true },
{ "poezja.com.pl", true },
{ "poezjagala.pl", true },
@@ -30135,6 +31147,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pohlmann.io", true },
{ "poinsot.info", true },
{ "pointaction.com", true },
+ { "pointcab.vn", true },
{ "pointhost.de", true },
{ "pointsgame.net", true },
{ "pointsixtyfive.com", true },
@@ -30151,6 +31164,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pokemontabletopadventures.com", true },
{ "pokemori.jp", true },
{ "pokepon.center", true },
+ { "pokerslab.com", true },
{ "pokl.cz", true },
{ "pokrowcecardo.pl", true },
{ "polaire.org", true },
@@ -30205,6 +31219,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "polygraphi.ae", true },
{ "polymake.org", true },
{ "polymathematician.com", true },
+ { "polymorph.rs", true },
{ "polynomapp.com", true },
{ "polypane.rocks", true },
{ "polypet.com.sg", true },
@@ -30212,13 +31227,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "polytarian.com", true },
{ "polytekniskforening.dk", true },
{ "pomar.club", false },
- { "pomelo-paradigm.com", true },
{ "pomfe.co", true },
{ "pomfeed.fr", true },
{ "pommedepain.fr", true },
{ "pomockypredeti.sk", true },
{ "pomocniczy.eu.org", true },
- { "pomozmruczkom.pl", true },
{ "pompiers-martigny.ch", true },
{ "pomsinoz.com", true },
{ "poncho-bedrucken.de", true },
@@ -30226,6 +31239,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "poneypourtous.com", true },
{ "poneytelecom.org", true },
{ "ponga.se", true },
+ { "ponio.org", true },
{ "ponio.xyz", true },
{ "pony-cl.co.jp", true },
{ "pony.tf", true },
@@ -30233,12 +31247,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ponycyclepals.co.uk", true },
{ "ponydesignclub.nl", true },
{ "ponyfoo.com", true },
+ { "poochingaround.co.uk", true },
{ "poodleassassin.com", true },
{ "poodlefan.net", true },
{ "pookl.com", true },
{ "poolsafely.gov", true },
{ "poolsafety.gov", true },
- { "poolspondsandwaterscapes.com", true },
+ { "pooltechthailand.com", true },
{ "pooltools.net", true },
{ "poolvilla-margarita.net", false },
{ "poon.io", true },
@@ -30273,11 +31288,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "porniwi.com", true },
{ "pornloupe.com", true },
{ "pornmega.net", true },
+ { "pornofilme.top", true },
{ "pornofilmovi.us", true },
{ "pornomens.be", true },
{ "pornovk.xxx", true },
{ "pornshop.biz", true },
- { "pornspider.to", true },
{ "pornstop.net", true },
{ "pornsuper.net", true },
{ "porny.xyz", true },
@@ -30287,25 +31302,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "port443.se", true },
{ "port67.org", true },
{ "port80.hamburg", true },
- { "portablebuildingsales.co.uk", true },
- { "portablespeakersfinder.com", true },
{ "portailevangelique.ca", true },
{ "portal.tirol.gv.at", true },
{ "portalcarriers.com", true },
{ "portalcentric.net", true },
- { "portalkla.com.br", true },
{ "portamiinpista.it", true },
{ "portatiles-baratos.net", true },
{ "porte.roma.it", true },
{ "portercup.com", true },
{ "porterranchelectrical.com", true },
+ { "portesmagistral.com", true },
{ "portofacil.com", true },
{ "portofala.pt", true },
{ "portofrotterdam.com", false },
{ "portosonline.pl", true },
{ "portsdebalears.gob.es", true },
{ "portsmouthbouncycastles.co.uk", true },
- { "portsmoutheic.com", true },
{ "portugal-a-programar.pt", true },
{ "portugalsko.net", true },
{ "portvincentcaravanpark.com.au", true },
@@ -30314,24 +31326,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "posalji.me", true },
{ "posaunenchor-senden.de", true },
{ "posbank.co.uk", true },
- { "poschtiliste.ch", true },
{ "poseidonwaterproofing.com", true },
{ "poshcastles.co.uk", true },
{ "poshlashes.se", true },
{ "poshsecurity.com", true },
- { "posijson.stream", true },
{ "positionus.io", true },
{ "positive.com.cy", true },
{ "positivenames.net", true },
{ "posobota.cz", true },
+ { "posoiu.net", true },
{ "post-darwinian.com", true },
{ "post-darwinism.com", true },
{ "post.com.ar", true },
{ "post.io", true },
- { "post.we.bs", true },
+ { "post.we.bs", false },
{ "post4me.at", true },
{ "postal.dk", true },
{ "postal3.es", true },
+ { "postandfly.com", true },
{ "postblue.info", true },
{ "postbox.life", true },
{ "postcode.nl", true },
@@ -30350,8 +31362,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "postura-corretta.it", true },
{ "posyperfume.com", true },
{ "potatiz.com", true },
+ { "potato.im", true },
{ "potatofrom.space", true },
{ "potatopro.com", true },
+ { "potatron.tech", true },
{ "potature.rimini.it", true },
{ "potature.roma.it", true },
{ "potentialproject.com", false },
@@ -30362,7 +31376,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "potrillionaires.com", true },
{ "potterscraftcider.com", true },
{ "pottersheartministry.org", true },
- { "pottreid.com", false },
{ "pottshome.co.uk", true },
{ "potworowski.de", true },
{ "potzwonen.nl", true },
@@ -30373,31 +31386,30 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "povareschka.ru", true },
{ "povertymind.com", true },
{ "povesham.tk", true },
+ { "povmacrostabiliteit.nl", true },
{ "pow-s.com", true },
{ "pow.jp", true },
{ "powdersnow.top", true },
{ "powelljones.co.uk", true },
{ "power-fit.org", true },
{ "power-flowengineer.com", true },
- { "power-meter.cc", true },
{ "power-tools24.com", true },
{ "powerball.shop", true },
{ "powerblanket.com", true },
{ "powercloud.technology", true },
{ "poweredbyiris.nl", true },
- { "poweredbypurdy.com", true },
{ "powerfortunes.com", true },
{ "powerinboxperformance.com", true },
{ "powermatic7.com", true },
{ "powermeter.at", true },
{ "powermint.de", true },
- { "powerplaywashers.com", true },
{ "powerpointschool.com", true },
+ { "powersaleskc.com", true },
{ "powerserg.org", true },
{ "powersergdatasystems.com", true },
+ { "powersergdynamic.com", true },
{ "powersergholdings.com", true },
{ "powersergthisisthetunnelfuckyouscott.com", true },
- { "powersergthisisthewebsitefuckyouchris.com", true },
{ "powersergthisisthewebsitefuckyouscott.com", true },
{ "powerwellness-korecki.de", true },
{ "pozemedicale.org", true },
@@ -30445,12 +31457,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "prateep.io", true },
{ "pratopronto.org", true },
{ "pratorotoli.it", true },
- { "praxino.de", true },
+ { "praxino.de", false },
{ "praxis-dingeldey.de", true },
{ "praxis-familienglueck.de", true },
{ "praxis-odermath.de", true },
{ "prayerrequest.com", true },
- { "prc-newmedia.com", true },
{ "prc.gov", true },
{ "pre-lean-consulting.de", true },
{ "precept.uk.com", true },
@@ -30487,6 +31498,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "prelved.se", true },
{ "prematureacceleration.club", true },
{ "preme.name", true },
+ { "premieravenue.net", true },
{ "premierbouncycastles.co.uk", true },
{ "premieresloges.ca", false },
{ "premierevents.ie", true },
@@ -30494,7 +31506,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "premierjewelersjax.com", true },
{ "premiership-predictors.co.uk", true },
{ "premiumcredit.am", true },
- { "premiumweb.co.id", true },
{ "premiumwebdesign.it", true },
{ "premtech.nl", true },
{ "prenatalgeboortekaartjes.nl", true },
@@ -30504,6 +31515,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "prepaidkredietkaart.be", true },
{ "prepare-job-hunting.com", true },
{ "prepavesale.fr", true },
+ { "presbee.com", true },
{ "presbvm.org", true },
{ "presbyterian-colleges.com", true },
{ "prescotonline.co.uk", true },
@@ -30547,7 +31559,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "preview-it-now.com", true },
{ "priceremoval.net", true },
{ "pricesniffer.co", true },
- { "prideindomination.com", true },
{ "pridetechdesign.com", false },
{ "prielwurmjaeger.de", true },
{ "prihatno.my.id", true },
@@ -30561,12 +31572,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "primoloyalty.com", true },
{ "primorus.lt", true },
{ "princeofwhales.com", true },
- { "princesparktouch.com", true },
{ "princessefoulard.com", true },
{ "principalsexam.com", true },
{ "principalstest.com", true },
{ "principalstest.ph", true },
- { "principalstest.review", true },
{ "principaltoolbox.com", true },
{ "principia-journal.de", true },
{ "principia-magazin.de", true },
@@ -30625,6 +31634,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "privacyweek.at", true },
{ "privacyweek.de", true },
{ "privacyweek.eu", true },
+ { "privacyweek.wien", true },
{ "privacyweekvienna.at", true },
{ "privaday.de", false },
{ "privasphere.com", true },
@@ -30633,6 +31643,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "privatecapsecurity.org", true },
{ "privateideas.de", true },
{ "privateimarketing.com", true },
+ { "privatepokertour.com", true },
{ "privatepropertymallorca.com", true },
{ "privatestatic.com", false },
{ "privatevoid.net", true },
@@ -30646,7 +31657,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "privy.com", true },
{ "prjktruby.com", false },
{ "prknje.co", true },
- { "prknje.com", true },
{ "prlved.co.uk", true },
{ "prnav.com", true },
{ "pro-ben.sk", true },
@@ -30660,6 +31670,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "proactivestructuresolutions.com", true },
{ "proadvanced.com", true },
{ "proautorepairs.com.au", true },
+ { "probano.com", true },
{ "probase.ph", true },
{ "probely.com", true },
{ "probiv.biz", true },
@@ -30689,9 +31700,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "productboard.com", true },
{ "productdesignsoftware.com.au", true },
{ "production.vn", true },
+ { "productionscime.com", true },
{ "productlondon.com", true },
{ "productpeo.pl", true },
{ "products4more.at", true },
+ { "produkttest-online.com", true },
{ "prodware.fr", true },
{ "prodware.nl", true },
{ "proeflokaalbakker.nl", true },
@@ -30710,6 +31723,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "profiles.google.com", true },
{ "profitablewebprojects.com", true },
{ "profitopia.de", true },
+ { "profloorstl.com", true },
{ "proft.eu", true },
{ "progarm.org", true },
{ "progenda.be", true },
@@ -30733,14 +31747,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "progressnet.nl", true },
{ "progresswww.nl", true },
{ "prohrcloud.com", true },
+ { "proimpact.it", true },
{ "project.supply", true },
{ "project86fashion.com", true },
{ "projectarmy.net", false },
- { "projectblackbook.us", true },
{ "projectborealisgitlab.site", true },
{ "projectforge.org", true },
- { "projectgrimoire.com", true },
{ "projectlinuseasttn.org", true },
+ { "projectmakeit.com", true },
{ "projectnom.com", true },
{ "projectsafechildhood.gov", true },
{ "projectsecretidentity.com", true },
@@ -30764,6 +31778,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "promo-brille.de", true },
{ "promo-computers.nl", true },
{ "promo-matelas.com", true },
+ { "promobo.fr", true },
{ "promods.cn", true },
{ "promods.net", true },
{ "promohulp.nl", true },
@@ -30775,6 +31790,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "promoterms.com.au", true },
{ "promotioncentre.co.uk", true },
{ "promozione.info", true },
+ { "promuovi.tv", true },
{ "pronto-intervento.net", true },
{ "prontointerventoimmediato.it", true },
{ "prontossl.com", true },
@@ -30783,20 +31799,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "proovn.com", true },
{ "propagandablog.de", true },
{ "propagationtools.com", true },
- { "properchels.com", true },
{ "propermatches.com", true },
{ "properticons.com", true },
{ "property-catalogue.eu", true },
+ { "propertycrawl.com", true },
{ "propertygroup.pl", true },
{ "propertyinside.id", true },
{ "propertyone.mk", true },
{ "propertysales-almeria.com", true },
+ { "prophiler.de", true },
{ "propipesystem.com", true },
{ "proposalonline.com", true },
{ "propr.no", true },
{ "proprietairesmaisons.fr", true },
{ "propseller.com", true },
{ "proseandleprechauns.com", true },
+ { "proservices.vip", true },
{ "prospanek.cz", true },
{ "prospecto.com.au", true },
{ "prospecto.ee", true },
@@ -30805,6 +31823,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "prosperfit.com", true },
{ "prosperontheweb.com", true },
{ "prospo.co", true },
+ { "prostecheat.xyz", true },
+ { "prostohobby.ru", true },
{ "prostoporno.vip", true },
{ "prostye-recepty.com", true },
{ "prosurveillancegear.com", true },
@@ -30817,13 +31837,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "protege.moi", true },
{ "protegetudescanso.com", true },
{ "protein-riegel-test.de", true },
+ { "proteinnuts.cz", false },
{ "proteinnuts.sk", false },
{ "protempore.fr", true },
{ "proteogenix-products.com", true },
{ "proteogenix.science", true },
{ "proteus-eretes.nl", true },
{ "proteus-tech.com", true },
- { "proto-online.ru", true },
{ "protobetatest.com", true },
{ "protocol.ai", true },
{ "protonmail.com", true },
@@ -30833,21 +31853,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "proust.ch", false },
{ "proust.media", false },
{ "proustmedia.de", false },
+ { "prove.no", true },
{ "provectus.de", true },
{ "proveits.me", false },
{ "provence-appartements.com", true },
{ "providencecmc.com", true },
{ "providerlijst.com", true },
- { "providerlijst.ml", true },
{ "providerlijst.nl", true },
{ "provision-isr.nl", true },
{ "provitec.com", true },
{ "provitec.de", true },
- { "provokator.co.il", true },
{ "prowebcenter.com", true },
{ "prowise.com", true },
{ "prowise.me", true },
{ "proximityradio.fr", true },
+ { "proximoconcurso.com.br", true },
+ { "proxirealtime.com", true },
{ "proxybay.bet", true },
{ "proxybay.bz", true },
{ "proxybay.co", true },
@@ -30859,6 +31880,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "proyectafengshui.com", true },
{ "prpferrara.it", true },
{ "prplz.io", true },
+ { "prpr.cloud", true },
{ "prt.in.th", true },
{ "prtimes.com", true },
{ "prtpe.com", true },
@@ -30875,9 +31897,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "przemas.pl", true },
{ "ps-provider.co.jp", true },
{ "ps-sale.ru", true },
- { "ps-w.ru", true },
{ "ps4all.nl", true },
{ "psa.gov", true },
+ { "psabrowse.com", true },
+ { "psauxit.com", true },
{ "psb.cloud", true },
{ "psb1.org", true },
{ "psb1911.com", true },
@@ -30891,6 +31914,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "psdsfn.com", true },
{ "psdsuc.com", true },
{ "pself.net", true },
+ { "pseric.site", true },
{ "pseta.ru", true },
{ "psg-calw.de", true },
{ "psg.bg", true },
@@ -30904,7 +31928,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "psicologoforensemadrid.com", true },
{ "psm.org.ph", true },
{ "psochecker.com", true },
- { "pson.ninja", true },
{ "psono.pw", true },
{ "psoriasischecker.com", true },
{ "pssgcsim.org", true },
@@ -30936,7 +31959,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "psytrance-pro.com", true },
{ "pt-d.ru", true },
{ "pt-server.de", true },
+ { "pt.im", true },
{ "ptal.eu", true },
+ { "ptasiepodroze.eu", true },
{ "ptbi.org.pl", true },
{ "ptbx.co", true },
{ "pterodactylus.cz", true },
@@ -30944,7 +31969,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ptfiber.ru", true },
{ "ptfiber.spb.ru", true },
{ "ptgoldensun.com", true },
- { "pthsec.com", true },
{ "ptm.ro", false },
{ "ptmarquees.ie", true },
{ "ptr.kr", true },
@@ -30956,13 +31980,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pubclub.com", true },
{ "pubean.com", true },
{ "pubi.me", false },
+ { "pubkit.io", true },
{ "publanda.nl", true },
+ { "publi-all.be", true },
{ "public-g.de", true },
{ "public-projects.com", true },
{ "public-projects.de", true },
{ "public-vocals.de", true },
{ "publiccarauctionscalifornia.com", true },
- { "publicinquiry.eu", true },
{ "publicintegrity.org", true },
{ "publicintelligence.net", true },
{ "publicrea.com", true },
@@ -30974,8 +31999,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pucchi.net", true },
{ "pucssa.org", true },
{ "puddis.de", true },
- { "puestifiestas.mx", true },
- { "puestosdeferia.mx", true },
{ "puggan.se", true },
{ "pugovka72.ru", true },
{ "puissancemac.ch", true },
@@ -30992,6 +32015,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pumpandcash.com", true },
{ "pumperszene.com", true },
{ "punchlinetheatre.co.uk", true },
+ { "punchlinetheatre.com", true },
{ "punchunique.com", true },
{ "puneflowermall.com", true },
{ "punematka.com", true },
@@ -30999,10 +32023,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "punitsheth.com", true },
{ "punkapoule.fr", true },
{ "punknews.org", true },
- { "puntacanalink.com", true },
+ { "puntcunts.com", true },
{ "punte-juwelier.nl", true },
+ { "puntonium.hu", true },
{ "pupboss.com", true },
{ "puppet.pl", true },
+ { "puppo.space", true },
{ "puq.moe", true },
{ "puralps.ch", true },
{ "puravida-estate.com", true },
@@ -31011,9 +32037,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "purefkh.xyz", true },
{ "purefreefrom.co.uk", true },
{ "pureitsolutionsllp.com", true },
- { "pureluxemedical.com", true },
+ { "purejewels.com", true },
+ { "purelunch.co.uk", true },
{ "purenvi.ca", true },
{ "purevapeofficial.com", true },
+ { "purityclothing.co.uk", true },
{ "purplebooth.co.uk", false },
{ "purplebricks.co.uk", true },
{ "purplebricks.com", true },
@@ -31029,18 +32057,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "purplestar.com", true },
{ "purplestar.mobi", true },
{ "purplewindows.net", true },
+ { "purplez.pw", true },
{ "purrfect-box.co.uk", true },
{ "purrfectboudoir.com", true },
- { "purrfectcams.com", true },
{ "purrfectmembersclub.com", true },
{ "purrfectswingers.com", true },
{ "pursuedtirol.com", true },
{ "puryearlaw.com", true },
{ "pusatinkubatorbayi.com", true },
- { "pushers.com.mx", true },
{ "pushoflove.com", true },
{ "pushrax.com", true },
- { "pusichatka.ddns.net", true },
{ "pussr.com", true },
{ "put.moe", true },
{ "put.re", true },
@@ -31068,11 +32094,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pvphs98.com", true },
{ "pvtschlag.com", true },
{ "pwaresume.com", true },
- { "pwdsafe.com", true },
+ { "pwdsafe.com", false },
{ "pwe.vision", true },
{ "pwnedpass.tk", true },
{ "pwnies.dk", true },
{ "pwolk.com", true },
+ { "pxetech.com", true },
{ "pxgamer.xyz", true },
{ "pxl-mailtracker.com", true },
{ "pxl.cl", true },
@@ -31083,13 +32110,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "pycrc.org", true },
{ "pycrypto.org", true },
{ "pycycle.info", true },
- { "pygarage.com", true },
+ { "pygarage.com", false },
{ "pyopenssl.org", true },
{ "pypa.io", true },
{ "pypi.io", true },
{ "pypi.org", true },
{ "pypi.python.org", true },
- { "pyramidsofchi.com", true },
+ { "pyramidsofchi.com", false },
{ "pyrenees.io", true },
{ "pyrios.pro", true },
{ "pyrotechnologie.de", true },
@@ -31104,9 +32131,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "q-inn.com", true },
{ "q-inn.nl", true },
{ "q-technologies.com.au", true },
- { "q123123.com", true },
{ "q1q2q3.tk", true },
- { "q5118.com", true },
{ "qa-brandywineglobal.com", true },
{ "qa-team.xyz", true },
{ "qa.fedoraproject.org", true },
@@ -31116,6 +32141,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "qadmium.com", true },
{ "qambarraza.com", true },
{ "qani.me", true },
+ { "qaq.cloud", true },
{ "qaq.sh", true },
{ "qarea.com", true },
{ "qaz.cloud", true },
@@ -31123,7 +32149,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "qbiju.com.br", true },
{ "qbiltrade.com", true },
{ "qbus.pl", true },
- { "qc.immo", true },
{ "qc.search.yahoo.com", false },
{ "qccareerschool.com", true },
{ "qcdesignschool.com", true },
@@ -31153,18 +32178,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "qicomidadeverdade.com.br", true },
{ "qifu.me", true },
{ "qiliang.wang", true },
- { "qingcao.org", true },
+ { "qingly.me", true },
{ "qingpei.me", true },
{ "qionouu.cn", true },
{ "qipl.org", true },
{ "qis.fr", true },
{ "qitarabutrans.com", true },
- { "qiu521119.host", true },
{ "qiukong.com", true },
{ "qiuri.org", false },
{ "qivonline.pt", true },
{ "qiwi.be", true },
{ "qixi.biz", true },
+ { "qkka.org", true },
+ { "qklshequ.com", true },
{ "qkmortgage.com", true },
{ "qlcvea.com", true },
{ "qldconservation.org.au", true },
@@ -31182,16 +32208,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "qpcna.org", true },
{ "qponverzum.hu", true },
{ "qq-navi.com", true },
- { "qq52o.me", true },
+ { "qq885.com", true },
{ "qqrss.com", true },
{ "qr-city.org", true },
{ "qr.cl", true },
{ "qrbird.com", true },
{ "qrcontagion.com", true },
+ { "qrpatrol.com", true },
{ "qrpth.eu", true },
{ "qruiser.com", true },
{ "qscloud.de", true },
{ "qtacairsoft.com", true },
+ { "qtap.me", false },
{ "qtl.me", true },
{ "qtmsheep.com", true },
{ "qtn.net", true },
@@ -31205,6 +32233,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "qtxh.net", true },
{ "quackerswaterproofing.com", true },
{ "quadra.srl", true },
+ { "quaedam.org", true },
{ "quaggan.co", true },
{ "quai10.org", false },
{ "qualite-ecole-et-formation.ch", true },
@@ -31214,9 +32243,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "qualityhvacservices.com", true },
{ "qualityofcourse.com", true },
{ "qualitypropertycare.co.uk", true },
+ { "quallo.com", true },
{ "qualpay.biz", true },
{ "qualtrics.com", true },
{ "quant-labs.de", true },
+ { "quantaloupe.tech", true },
{ "quanterra.ch", true },
{ "quantolytic.de", true },
{ "quantoras.com", true },
@@ -31272,6 +32303,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "quietboy.net", true },
{ "quikchange.net", true },
{ "quikpay.com.au", true },
+ { "quilmo.com", true },
{ "quimatic.com.br", true },
{ "quinnlabs.com", true },
{ "quinoa24.com", true },
@@ -31281,15 +32313,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "quiq-cdn.com", true },
{ "quiq.us", true },
{ "quire.io", true },
+ { "quirkytravelguy.com", true },
{ "quisido.com", true },
{ "quitarlasmanchasde.com", true },
{ "quitimes.com", true },
{ "quizogames.com", true },
- { "quizstore.net", true },
{ "qul.link", true },
{ "quli.nl", false },
{ "qunzi.la", true },
- { "quocdesign.ch", true },
+ { "qunzi.org", true },
{ "quote.gq", true },
{ "quoteidiot.com", true },
{ "quotev.com", true },
@@ -31305,6 +32337,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "qwant.fr", true },
{ "qwdqwd.de", true },
{ "qwe7002.com", true },
+ { "qweepi.de", false },
{ "qwertee.com", true },
{ "qwerty.work", true },
{ "qwikdash.com", true },
@@ -31312,9 +32345,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "qx.fi", true },
{ "qx.se", true },
{ "qxy.ch", true },
+ { "qxzg.xyz", true },
+ { "qxzgssr.xyz", true },
{ "r-ay.cn", true },
{ "r-rwebdesign.com", true },
{ "r-t-b.fr", true },
+ { "r0uzic.net", true },
{ "r1a.eu", true },
{ "r1ch.net", true },
{ "r2d2pc.com", true },
@@ -31335,15 +32371,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ra.vc", true },
{ "ra4wvpn.com", true },
{ "raah.co", true },
- { "rabbit.wales", false },
{ "rabbitfinance.com", true },
{ "rabbitinternet.com", true },
{ "rabica.de", true },
{ "rabotaescort.com", true },
{ "rabynska.eu", true },
{ "raccoltarifiuti.com", true },
+ { "racdek.net", true },
+ { "racdek.nl", true },
{ "racermaster.xyz", true },
- { "racesport.nl", false },
{ "raceviewcycles.com", true },
{ "raceviewequestrian.com", true },
{ "rachelchen.me", true },
@@ -31354,7 +32390,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rachida-dati.eu", true },
{ "rachurch.net", true },
{ "racius.com", true },
- { "rackerlab.com", false },
+ { "rackerlab.com", true },
{ "raclet.co.uk", true },
{ "raconconsulting.co.uk", true },
{ "racoo.net", true },
@@ -31381,16 +32417,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "radiofmimagen.net", true },
{ "radioheteroglossia.com", true },
{ "radioilusion.es", true },
+ { "radiolla.com", true },
{ "radiom.fr", true },
{ "radiomodem.dk", true },
{ "radiomontebianco.it", true },
+ { "radionicabg.com", true },
+ { "radiopleer.net", true },
{ "radiopolarniki.spb.ru", true },
{ "radiormi.com", true },
{ "radiorsvp.com", false },
{ "radiosendungen.com", true },
{ "radis-adopt.com", true },
+ { "radiumcode.com", true },
{ "radiumone.io", true },
- { "radiumtree.com", true },
{ "radondetectionandcontrol.com", true },
{ "radreisetraumtreibstoff.de", true },
{ "radyabkhodro.net", true },
@@ -31399,24 +32438,31 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "raeven.nl", true },
{ "raevinnd.com", true },
{ "rafaelmagalhaesweb.com", true },
+ { "rafas.com.tr", true },
{ "rafey.xyz", true },
{ "raffaellaosti.com", true },
+ { "raffleshospital.co.id", false },
+ { "rafgrup.com", true },
{ "rafleatherdesign.com", true },
{ "rafting-japan.com", true },
{ "ragasto.nl", true },
{ "rage-overload.ch", true },
{ "rage.rip", true },
{ "rage4.com", true },
+ { "ragingserenity.com", true },
{ "rahulpnath.com", true },
+ { "raid-runners.fr", true },
{ "raidensnakesden.co.uk", true },
{ "raidensnakesden.com", true },
{ "raidensnakesden.net", true },
{ "raidstone.net", true },
{ "raiffeisen-kosovo.com", true },
+ { "raiffeisenzeitung.at", true },
{ "rail-o-rama.nl", true },
{ "rail24.nl", true },
{ "rail360.nl", true },
{ "railbird.nl", true },
+ { "railduction.eu", true },
{ "railgun.ac", true },
{ "railgun.com.cn", true },
{ "railorama.nl", true },
@@ -31426,7 +32472,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "railvideo.net", true },
{ "railvideo.nl", true },
{ "railwaytech.net", true },
- { "raimixmotoparts.com.br", true },
+ { "raimondos.com", true },
{ "rain.bz", true },
{ "rainbowbay.org", true },
{ "rainbowinflatables.co.uk", true },
@@ -31438,12 +32484,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rainpaper.com", true },
{ "rainstormsinjuly.co", true },
{ "rainville.me", true },
+ { "rainway.com", true },
{ "rainway.io", true },
{ "raipet.no-ip.biz", true },
{ "raisecorp.com", true },
{ "raiseyourflag.com", true },
{ "raissarobles.com", true },
- { "raito.win", true },
+ { "raito.ooo", true },
{ "rajivshah.co.uk", true },
{ "rajkapoordas.com", true },
{ "rajyogarishikesh.com", true },
@@ -31461,8 +32508,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rallybase.cz", true },
{ "rallybase.eu", true },
{ "rallycycling.com", true },
- { "ralph.bike", true },
- { "ralphwoessner.com", true },
+ { "rallypodium.be", true },
{ "raltha.com", true },
{ "ram-it.nl", true },
{ "ram.nl", true },
@@ -31472,8 +32518,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ramrecha.com", false },
{ "ramsor-gaming.de", true },
{ "randc.org", true },
+ { "randewoo.ru", true },
{ "randolf.ca", true },
{ "random-samplings.org", true },
+ { "random.org", true },
{ "randomadversary.com", true },
{ "randombit.eu", false },
{ "randomcode.org", true },
@@ -31490,6 +32538,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rank-net.de", true },
{ "ranking-deli.jp", true },
{ "ranktopay.com", true },
+ { "ranos.org", true },
{ "ranson.com.au", true },
{ "rante.com", true },
{ "ranyeh.com", true },
@@ -31503,11 +32552,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "raphaelschmid.eu", true },
{ "raphrfg.com", true },
{ "rapidapp.io", true },
- { "rapidhubs.com", true },
{ "rapidoo.com.br", true },
{ "rapidshit.net", true },
{ "rapidstone.com", true },
- { "rappet.de", true },
{ "raptorsrapture.com", true },
{ "raraflora.com.au", true },
{ "rareative.com", true },
@@ -31516,6 +32563,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rascals-castles.co.uk", true },
{ "rascalscastles.co.uk", true },
{ "rascalscastlesdoncaster.co.uk", true },
+ { "rasebo.ro", true },
{ "raspii.tech", true },
{ "rasty.cz", true },
{ "ratd.net", true },
@@ -31531,12 +32579,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "raulrivero.es", true },
{ "rault.io", true },
{ "rauros.net", true },
+ { "rauschenbach.de", true },
{ "rautelow.de", true },
{ "ravada-vdi.com", true },
{ "ravanalk.com", true },
{ "ravchat.com", true },
{ "raven.dog", true },
- { "ravenger.net", true },
{ "ravensbuch.de", true },
{ "ravhaaglanden.org", true },
{ "ravindran.me", true },
@@ -31547,20 +32595,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rawsec.net", true },
{ "raxion.cf", true },
{ "raxion.tk", true },
- { "ray-home.de", true },
- { "ray-works.de", true },
{ "rayan-it.ir", true },
{ "rayiris.com", true },
{ "raykitchenware.com", true },
{ "raymcbride.com", true },
- { "raymd.de", true },
- { "raymii.org", true },
{ "raystark.com", true },
- { "rayworks.de", true },
{ "razberry.kr", true },
{ "razeen.me", true },
{ "razeencheng.com", true },
{ "raziskovalec-resnice.com", true },
+ { "razrsec.uk", true },
{ "razvanburz.net", true },
{ "rbensch.com", true },
{ "rbflote.lv", true },
@@ -31568,15 +32612,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rbmland.com", true },
{ "rbnet.xyz", true },
{ "rbran.com", true },
+ { "rbuddenhagen.com", true },
{ "rbx-talk.xyz", true },
+ { "rbx.com", true },
{ "rc-offi.net", true },
{ "rc-rp.com", true },
{ "rc-shop.ch", true },
{ "rca.fr", true },
+ { "rca.ink", true },
{ "rcd.cz", true },
{ "rcdocuments.com", true },
{ "rcgoncalves.pt", true },
- { "rchavez.site", true },
{ "rchrdsn.uk", true },
{ "rcifsgapinsurance.co.uk", true },
{ "rclsm.net", true },
@@ -31599,36 +32645,38 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rdns.cc", true },
{ "rdv-cni.fr", true },
{ "rdv-prefecture.com", true },
- { "rdwh.tech", true },
+ { "rdwh.tech", false },
{ "re-curi.com", true },
{ "re-engines.com", true },
+ { "reach-on.de", true },
{ "reachhead.com", true },
{ "reachonline.org", true },
{ "reachrss.com", true },
{ "reaconverter.com", true },
{ "react-db.com", true },
+ { "reactions.ai", true },
{ "reactions.studio", true },
{ "reactivarte.es", true },
{ "reactive-press.com", true },
{ "reactpwa.com", true },
{ "read.sc", true },
+ { "readabilitychecker.com", true },
{ "reades.co.uk", true },
{ "reades.uk", true },
- { "readheadcopywriting.com", true },
- { "readingandmath.org", true },
{ "readingrats.de", true },
+ { "readitify.com", true },
{ "readmusiccoleman.com", true },
{ "readonly.de", true },
{ "readouble.com", false },
- { "reads.wang", true },
{ "readybetwin.com", true },
{ "readyrowan.com", true },
{ "readyrowan.org", true },
{ "readysell.net", true },
{ "readytobattle.net", true },
{ "readytongue.com", true },
- { "readytowear.es", true },
{ "reaganlibrary.gov", true },
+ { "reaiaer.com", true },
+ { "reaksi.id", true },
{ "real-digital.co.uk", true },
{ "real-it.nl", true },
{ "realcapoeira.ru", true },
@@ -31638,7 +32686,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "realestateonehowell.com", true },
{ "realestateradioshow.com", true },
{ "realfood.space", true },
- { "realfreedom.city", true },
+ { "realfreedom.city", false },
{ "realhorsegirls.net", true },
{ "realhypnosistraining.com.au", true },
{ "realitea.co.uk", true },
@@ -31655,6 +32703,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "realmofespionage.xyz", true },
{ "realoteam.ddns.net", true },
{ "realpropertyprofile.gov", true },
+ { "realtoraidan.com", true },
{ "realtygroup-virginia.com", true },
{ "realtyink.net", true },
{ "realum.com", true },
@@ -31669,6 +32718,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "reanimated.eu", true },
{ "reath.me", true },
{ "reath.xyz", true },
+ { "reavaninc.com", true },
{ "reaven.nl", true },
{ "rebane2001.com", true },
{ "rebeagle.com", true },
@@ -31679,17 +32729,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rebirthia.me", true },
{ "reboxetine.com", true },
{ "reboxonline.com", true },
+ { "rebtoor.com", true },
+ { "reby.gq", true },
{ "recalls.gov", true },
{ "recantoshop.com", true },
{ "recantoshop.com.br", true },
- { "recapp.ch", true },
{ "recaptcha-demo.appspot.com", true },
- { "recard.vn", true },
{ "receiliart.com", true },
{ "receptionpoint.com", true },
{ "recepty.eu", true },
{ "recetasdecocinaideal.com", true },
{ "recetin.com", true },
+ { "recettecookeo.net", true },
{ "rechenknaecht.de", true },
{ "rechtsanwaeltin-vollmer.de", true },
{ "rechtsanwalt-koeppen-feucht.de", true },
@@ -31710,17 +32761,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "recordeuropa.com", false },
{ "recoveringspirit.com", true },
{ "recoveryonline.org", true },
- { "recreoviral.com", true },
+ { "recreation.gov", true },
{ "recruitmade.jp", true },
{ "rectecforum.com", true },
- { "recuerdafilms.com", true },
{ "recuperodatiraidfastec.it", true },
{ "recurly.com", true },
{ "recurrentmeningitis.org", true },
{ "recursosdeautoayuda.com", true },
{ "recyclingpromotions.us", true },
+ { "red-button.hu", true },
{ "red-t-shirt.ru", true },
- { "red2fred2.com", true },
+ { "red-trigger.net", true },
{ "redable.hosting", true },
{ "redable.nl", true },
{ "redactieco.nl", true },
@@ -31732,6 +32783,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "redcone.net", true },
{ "redcorus.com", true },
{ "redd.it", true },
+ { "reddepsicologosdecr.com", true },
{ "reddingo.at", true },
{ "reddingo.be", true },
{ "reddingo.ch", true },
@@ -31746,11 +32798,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "reddingo.nl", true },
{ "reddingo.nz", true },
{ "reddingsbrigade-zwolle.nl", true },
+ { "reddingsbrigadeveghel.nl", true },
{ "reddit2kindle.com", true },
{ "reddraggone9.com", true },
{ "reddyai.com", true },
{ "rede-reim.de", true },
{ "rede-t.com", true },
+ { "redecsirt.pt", true },
{ "redelectrical.co.uk", true },
{ "redessantaluzia.com.br", true },
{ "redflare.com.au", true },
@@ -31770,16 +32824,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "redleslie.com", true },
{ "redlinelap.com", true },
{ "redlink.de", true },
+ { "redmangallpsychologists.com.au", true },
{ "redmind.se", true },
{ "redmondtea.com", true },
{ "redmore.me", true },
{ "redneragenturen.org", true },
{ "rednsx.org", true },
{ "redpact.com", true },
- { "redprice.by", true },
{ "redscan.com", true },
{ "redshell.pw", true },
- { "redshield.co", true },
{ "redshiftlabs.com.au", true },
{ "redshoeswalking.net", true },
{ "redsicom.com", true },
@@ -31804,12 +32857,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "reevaappliances.co.uk", true },
{ "reezer.org", true },
{ "refactor.zone", false },
+ { "refer.codes", true },
{ "referdell.com", true },
{ "refficience.com", true },
- { "refill-roboter.de", true },
{ "refinansiering.no", true },
{ "reflectivity.io", true },
- { "reflectores.net", true },
{ "refletindosaude.com.br", true },
{ "reflets.info", true },
{ "reflexions.co", true },
@@ -31819,6 +32871,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "reforesttheplanet.com", true },
{ "refresh-media.nl", true },
{ "refreshliving.us", true },
+ { "refrigeracionpeinado.com.mx", true },
{ "refu.net", true },
{ "refuelcollective.com", true },
{ "refuelcreative.com.au", true },
@@ -31835,6 +32888,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "regeneo.cz", true },
{ "regenerapoint.it", true },
{ "regenerescence.com", true },
+ { "regensburg-repariert.de", true },
{ "regily.com", true },
{ "regime-anticellulite.com", true },
{ "regime-maigrir-vite.com", true },
@@ -31868,7 +32922,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "reha-honpo.jp", true },
{ "rehabili-shigoto.com", true },
{ "rehabilitation.network", true },
- { "rehabmail.com", true },
{ "rehabphilippines.com", true },
{ "rehabreviews.com", true },
{ "rehabthailand.com", true },
@@ -31887,6 +32940,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "reimann.me", true },
{ "reimers.de", true },
{ "rein.kr", true },
+ { "reinaertvandecruys.com", true },
{ "reinaldudras.ee", true },
{ "reinaldudrasfamily.ee", true },
{ "reinencaressa.be", true },
@@ -31899,6 +32953,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "reinouthoornweg.nl", true },
{ "reinventetoi.com", false },
{ "reisekosten-gorilla.com", true },
+ { "reisenbauer.ee", true },
{ "reiseversicherung-werner-hahn.de", true },
{ "reishunger.de", true },
{ "reisslittle.com", true },
@@ -31935,7 +32990,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "remedionaturales.com", true },
{ "remedioparaherpes.com", true },
{ "remedios-caserospara.com", true },
- { "remejeanne.com", true },
+ { "remembermidi.sytes.net", true },
{ "rememberthemilk.com", false },
{ "remi-saurel.com", true },
{ "remiafon.com", true },
@@ -31946,13 +33001,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "remitatm.com", false },
{ "remonti.info", true },
{ "remote.so", true },
- { "remoteham.com", true },
{ "remoteutilities.com", true },
{ "removalcellulite.com", true },
{ "removedrepo.com", true },
{ "remptmotors.com", true },
{ "remrol.ru", true },
{ "remszeitung.de", true },
+ { "rena.cloud", true },
{ "renaissanceplasticsurgery.net", true },
{ "renascentia.asia", true },
{ "renaultclubticino.ch", true },
@@ -31963,6 +33018,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rene-stolp.de", true },
{ "renearends.nl", true },
{ "renedekoeijer.com", true },
+ { "renedekoeijer.nl", true },
{ "renee.today", true },
{ "reneleu.ch", true },
{ "renem.net", false },
@@ -31970,7 +33026,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "reneschmidt.de", true },
{ "renewablefreedom.org", true },
{ "renewablemaine.org", true },
- { "renewed.technology", true },
{ "renewgsa.com", true },
{ "renewmedispa.com", true },
{ "renewpfc.com", true },
@@ -31987,14 +33042,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rent-a-coder.de", true },
{ "rentacaramerica.com", true },
{ "rentandgo.it", true },
+ { "rentasweb.gob.ar", true },
{ "rentayventadecarpas.com", true },
{ "renthelper.us", true },
{ "rentinsingapore.com.sg", true },
{ "rentourhomeinprovence.com", true },
{ "renuo.ch", true },
{ "renxinge.cn", false },
+ { "reorz.com", true },
{ "reox.at", false },
- { "repaik.com", true },
+ { "repaik.com", false },
{ "repair.by", true },
{ "repaper.org", true },
{ "repaxan.com", true },
@@ -32024,13 +33081,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "res-kc.com", true },
{ "resama.eu", true },
{ "rescms-secure.com", true },
+ { "resdon.cn", true },
{ "research-panel.jp", true },
{ "research.facebook.com", false },
{ "researchgate.net", true },
{ "researchstory.com", true },
{ "reseausyndic.ca", true },
{ "reservar-un-hotel.com", true },
- { "reservetonshift.com", true },
{ "resfriatech.com.br", true },
{ "residence-simoncelli.com", true },
{ "residentiallocksmithsanantoniotx.com", true },
@@ -32057,6 +33114,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "respiranto.de", true },
{ "respon.jp", true },
{ "responer.com", true },
+ { "respons.je", true },
+ { "respons.me", true },
+ { "respons.mobi", true },
+ { "respons.us", true },
+ { "respons.ws", true },
+ { "responscode.eu", true },
+ { "responscode.info", true },
+ { "responscode.mobi", true },
+ { "responscode.nl", true },
+ { "responsecode.info", true },
+ { "responsecode.mobi", true },
+ { "responsecode.nl", true },
{ "responsepartner.com", true },
{ "responsibledisclosure.nl", false },
{ "responsive-shop.com", true },
@@ -32077,6 +33146,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "restrito.org", true },
{ "resultsatretail.com", true },
{ "resursedigitale.ro", true },
+ { "retailcybersolutions.com", true },
+ { "retcor.net", true },
{ "retefarmaciecostadamalfi.it", true },
{ "retetenoi.net", true },
{ "reticket.me", true },
@@ -32100,6 +33171,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "retrojar.top", true },
{ "retroride.cz", true },
{ "retroroundup.com", true },
+ { "retrotown.ws", true },
{ "retrotracks.net", true },
{ "retrovideospiele.com", true },
{ "returnonerror.com", true },
@@ -32120,8 +33192,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "reversecanada.com", true },
{ "reverseloansolutions.com", true },
{ "reversesouthafrica.com", true },
+ { "reviderm-skinmedics-rheinbach.de", true },
{ "review.jp", true },
- { "reviewmed-215418.appspot.com", true },
{ "reviewninja.net", true },
{ "reviews.anime.my", false },
{ "revirt.global", true },
@@ -32131,10 +33203,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "revista-programar.info", true },
{ "revivalinhisword.com", true },
{ "revivalprayerfellowship.com", true },
+ { "revivalsstores.com", true },
{ "revivingtheredeemed.org", true },
{ "revlect.com", true },
{ "revolt.tv", true },
{ "revthefox.co.uk", true },
+ { "revuestarlight.me", true },
{ "rewardingexcellence.com", true },
{ "rewrite3.com", true },
{ "rewtherealtor.com", true },
@@ -32147,9 +33221,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rezosup.net", true },
{ "rezosup.org", true },
{ "rezultant.ru", true },
+ { "rfitness.dk", true },
{ "rftoon.com", true },
+ { "rfxanalyst.com", true },
{ "rga.sh", true },
- { "rgavmf.ru", true },
{ "rgbinnovation.com", true },
{ "rgcomportement.fr", true },
{ "rgraph.net", true },
@@ -32168,6 +33243,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rhinoceroses.org", true },
{ "rhodenmanorcattery.co.uk", true },
{ "rhodri.io", true },
+ { "rhondanp.com", true },
{ "rhowell.io", true },
{ "rhumblineadvisers.com", true },
{ "rhymeswithmogul.com", true },
@@ -32177,7 +33253,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "riaki.net", true },
{ "rial.space", true },
{ "riaucybersolution.net", false },
- { "ribs.com", true },
{ "ricardo.nu", true },
{ "ricardobalk.nl", true },
{ "ricardopq.com", true },
@@ -32207,6 +33282,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "richardson.tw", true },
{ "richardstonerealestate.com", true },
{ "richardwarrender.com", true },
+ { "richbutler.co.uk", true },
{ "richeyweb.com", true },
{ "richie.fi", true },
{ "ricketyspace.net", true },
@@ -32223,13 +33299,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ricoydesign.com", true },
{ "ricozienke.de", true },
{ "riddims.co", true },
+ { "riddler.com.ar", true },
{ "rideintaxi.com", true },
{ "rideways.com", true },
{ "rideyourdamn.bike", true },
{ "ridgelandchurch.org", true },
{ "ridhaan.co", true },
{ "ridingboutique.de", true },
- { "ridwan.co", false },
{ "riederle.com", true },
{ "riemer.ml", true },
{ "riesenweber.id.au", true },
@@ -32245,7 +33321,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rightbrain.training", true },
{ "rightmovecanada.com", true },
{ "rightnetworks.com", true },
- { "rightstuff.link", true },
+ { "rightstuff.link", false },
{ "righttobuy.gov.uk", true },
{ "rigolitch.fr", true },
{ "rigsalesaustralia.com", true },
@@ -32257,11 +33333,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "riku.pw", true },
{ "rile5.com", true },
{ "rileyevans.co.uk", true },
+ { "rileyskains.com", true },
{ "rimax.vn", true },
{ "rimcountrymuseum.org", true },
{ "rimeto.io", true },
{ "rimo.site", true },
{ "rimorrecherche.nl", true },
+ { "rincondenoticas.com", true },
{ "ring.com", true },
{ "ringingliberty.com", true },
{ "ringjewellery.co.uk", true },
@@ -32269,30 +33347,32 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rio-weimar.de", true },
{ "rioshop.com.br", true },
{ "rioxmarketing.com", true },
- { "rioxmarketing.pt", true },
{ "rip-sport.cz", true },
{ "ripaton.fr", true },
{ "ripcorddesign.com", true },
{ "ripcordsandbox.com", true },
{ "ripmixmake.org", true },
{ "riqy86.nl", true },
- { "ris-bad-wurzach.de", true },
{ "ris.fi", true },
{ "risada.nl", true },
{ "risaphuketproperty.com", true },
{ "riscascape.net", true },
{ "rischard.org", true },
{ "rise-technologies.com", true },
+ { "rise.global", true },
{ "riseup.net", true },
{ "rishikeshyoga.in", true },
{ "risiinfo.com", true },
{ "riskmitigation.ch", true },
{ "risparmiare.info", true },
{ "ristioja.ee", true },
+ { "ristisanat.fi", true },
{ "ristoarea.it", true },
{ "ristorantefattoamano.it", true },
+ { "ristorantelittleitaly.com", true },
{ "ristoviitanen.fi", true },
{ "ristrutturazioneappartamento.roma.it", true },
+ { "ristrutturazioniappartamentinapoli.it", true },
{ "rit.space", false },
{ "ritirocalcinacci.viterbo.it", true },
{ "rittau.biz", true },
@@ -32302,6 +33382,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rivalsa.cn", true },
{ "rivastation.de", true },
{ "riverbanktearooms.co.uk", true },
+ { "riverbendessentialoil.com", true },
{ "riverbendroofingnd.com", true },
{ "riverford.co.uk", true },
{ "rivermist.com.au", true },
@@ -32317,7 +33398,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "riwick.com", false },
{ "rix.ninja", true },
{ "rixter.com", true },
- { "rixzz.ovh", true },
{ "riyono.com", true },
{ "rizalpalawan.gov.ph", true },
{ "rizospastis.gr", true },
@@ -32328,6 +33408,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rlalique.com", true },
{ "rld.org", true },
{ "rlds.ch", true },
+ { "rle.me", true },
{ "rleeden.servehttp.com", true },
{ "rleh.de", true },
{ "rlnunez.com", true },
@@ -32336,18 +33417,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rmb.li", true },
{ "rmcbs.de", true },
{ "rmeuropean.com", true },
- { "rmf.io", true },
{ "rmi.com.ar", true },
{ "rmm-i.com", true },
{ "rmmanfredi.com", true },
{ "rmpsolution.de", true },
{ "rmrig.org", true },
- { "rms-digicert.ne.jp", true },
{ "rms.sexy", true },
{ "rmstudio.tw", true },
{ "rmsupply.nl", true },
{ "rnag.ie", true },
- { "rnb-storenbau.ch", true },
{ "rngmeme.com", true },
{ "rnt.cl", true },
{ "ro.search.yahoo.com", false },
@@ -32357,7 +33435,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "roams.es", true },
{ "rob006.net", true },
{ "robandjanine.com", true },
- { "robbertt.com", false },
{ "robbiecrash.me", true },
{ "robdavidson.network", true },
{ "robert-flynn.de", true },
@@ -32367,8 +33444,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "robertayamashita.com.br", true },
{ "robertbln.com", true },
{ "roberthurlbut.com", true },
+ { "robertkotlermd.com", true },
{ "robertkrueger.de", true },
- { "robertlluberes.com", true },
{ "robertlysik.com", true },
{ "robertnemec.com", true },
{ "robertoentringer.com", true },
@@ -32376,18 +33453,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "robertopazeller.ch", true },
{ "robertreiser.photography", true },
{ "robertrijnders.nl", true },
+ { "robertses.org", true },
{ "robertsmits.be", false },
+ { "robgorman.ie", true },
{ "robhorstmanshof.nl", true },
{ "robicue.com", true },
{ "robigalia.org", false },
{ "robin.co.kr", true },
{ "robin.info", true },
{ "robinevandenbos.nl", true },
- { "robinflikkema.nl", true },
{ "robinfrancq.ml", true },
{ "robinhoodbingo.com", true },
{ "robinlinden.eu", true },
- { "robinsonstrategy.com", true },
{ "robinsonyu.com", true },
{ "robinvdmarkt.nl", true },
{ "robinwill.de", true },
@@ -32395,14 +33472,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "robjager-fotografie.nl", true },
{ "robocop.no", true },
{ "robodeidentidad.gov", true },
+ { "roboex.net", true },
{ "robohash.org", true },
{ "robokits.co.in", true },
{ "robot.car", true },
{ "robot.works", true },
{ "robotattack.org", true },
- { "roboth.am", true },
{ "robotham.org", true },
- { "robotics.plus", true },
{ "robotkvarnen.se", true },
{ "robototes.com", true },
{ "robots-ju.ch", true },
@@ -32410,6 +33486,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "robpol86.com", true },
{ "robspc.repair", true },
{ "robspeed.rocks", true },
+ { "robsutter.com", true },
+ { "robtatemusic.com", true },
{ "robtex.com", true },
{ "robu.in", true },
{ "robud.info", true },
@@ -32421,6 +33499,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rockbankland.com.au", true },
{ "rockcanyonbank.com", true },
{ "rockenfuerlachenhelfen.de", true },
+ { "rockerchyc.com", true },
{ "rocket-wars.de", true },
{ "rocketevents.com.au", true },
{ "rocketr.net", true },
@@ -32469,11 +33548,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rogersvilleumc.org", true },
{ "rognhaugen.no", true },
{ "rogoff.xyz", true },
- { "rogue-e.xyz", true },
{ "roguefinancial.com", true },
{ "roguefortgame.com", true },
{ "roguenation.space", true },
{ "roguenetworks.me", true },
+ { "roguesignal.net", true },
{ "roguetechhub.org", true },
{ "rohedaten.de", true },
{ "rohitagr.com", true },
@@ -32481,6 +33560,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "roka9.de", true },
{ "rokass.nl", true },
{ "rokki.ch", true },
+ { "roko-foto.de", true },
{ "rokort.dk", true },
{ "rokudenashi.de", true },
{ "roland.io", true },
@@ -32489,10 +33569,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rolandlips.nl", true },
{ "rolandreed.cn", true },
{ "rolandszabo.com", true },
- { "roleplayhome.com", true },
+ { "rolfsbuss.se", true },
{ "roligprylar.se", true },
{ "rollatorweb.nl", true },
- { "rollercoasteritalia.it", true },
{ "rolleyes.org", true },
{ "rollingbarge.com", true },
{ "rolliwelt.de", true },
@@ -32513,12 +33592,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "romanticsexshopguatemala.com", true },
{ "romanticvillas.com.au", false },
{ "romapa.com", true },
- { "romar-bos.nl", true },
{ "romarin.es", true },
{ "romaservicegroup.it", true },
{ "romatrip.it", true },
{ "rome.dating", true },
{ "rommelwood.de", true },
+ { "romtex.co.uk", true },
{ "romun.net", true },
{ "romy.tw", true },
{ "rondommen.nl", true },
@@ -32559,7 +33638,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rootcommand.com", true },
{ "rootear.com", true },
{ "rootedlifemontessori.com", true },
+ { "rootetsy.com", true },
{ "rootkea.me", true },
+ { "rootkit.es", true },
{ "rootlair.com", true },
{ "rootonline.de", true },
{ "rootpigeon.com", true },
@@ -32610,6 +33691,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rothwellgornthomes.com", true },
{ "rotkreuzshop.de", true },
{ "rotol.me", true },
+ { "rottipowah.com", true },
{ "rottweil-hilft.de", true },
{ "rotunneling.net", true },
{ "rougechocolat.fr", true },
@@ -32621,6 +33703,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "roundcube.mayfirst.org", false },
{ "roundrock-locksmith.com", true },
{ "roundtablekzn.co.za", true },
+ { "roundtheme.com", false },
{ "roundtoprealestate.com", true },
{ "roussos.cc", true },
{ "rout0r.org", true },
@@ -32629,7 +33712,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "routerclub.ru", true },
{ "routercncperu.com", true },
{ "routetracker.co", true },
- { "rove3d.com", true },
+ { "rowancasting.com", true },
{ "rowancasting.ie", true },
{ "rowancounty911.com", true },
{ "rowancounty911.org", true },
@@ -32642,35 +33725,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rowantransit.com", true },
{ "rowantransit.org", true },
{ "rowlog.com", true },
- { "rows.io", true },
{ "roxiesbouncycastlehire.co.uk", true },
{ "roxtri.cz", true },
{ "royal-rangers.de", true },
- { "royal812.com", true },
{ "royal813.com", true },
- { "royal818.com", true },
- { "royal850.com", true },
- { "royal853.com", true },
- { "royal862.com", true },
- { "royal863.com", true },
- { "royal867.com", true },
- { "royal868.com", true },
- { "royal871.com", true },
{ "royal88.com", true },
- { "royal898.com", true },
{ "royalacademy.org.uk", true },
{ "royalasianescorts.co.uk", true },
{ "royalbeautyclinic.ir", true },
{ "royalbluewa3.cc", true },
{ "royalcitytaxi.ca", true },
- { "royalcitytaxi.com", true },
{ "royalfoxrealtor.com", true },
{ "royalmarinesassociation.org.uk", true },
{ "royalnissanparts.com", true },
{ "royalpalacenogent.fr", true },
{ "royalpub.net", false },
{ "royalrangers.fi", true },
- { "royalty-market.com", true },
{ "royceandsteph.com", true },
{ "roycewilliams.net", true },
{ "roygerritse.nl", true },
@@ -32690,16 +33760,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rpus.co", true },
{ "rpy.xyz", true },
{ "rq-labo.jp", true },
- { "rr105.de", true },
{ "rraesthetics.com", true },
+ { "rrbts.com", true },
{ "rrdesignsuisse.com", true },
{ "rrg-partner.ch", true },
{ "rrudnik.com", true },
{ "rrwolfe.com", true },
+ { "rs-cloud.ddns.net", true },
{ "rs-maschinenverleih.de", true },
{ "rsanahuano.com", true },
{ "rsap.ca", true },
- { "rsauget.fr", true },
{ "rsblake.net", true },
{ "rsgcard.com", true },
{ "rsingermd.com", true },
@@ -32709,7 +33779,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rsp-blogs.de", true },
{ "rsridentassist.com", true },
{ "rss.sh", false },
- { "rssr.ddns.net", true },
{ "rssr.se", true },
{ "rsttraining.co.uk", true },
{ "rsync.eu", false },
@@ -32731,18 +33800,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rteplayer.com", true },
{ "rtesport.eu", true },
{ "rteworld.com", true },
- { "rths.tk", false },
{ "rthsoftware.cn", true },
{ "rthsoftware.net", true },
{ "rtrappman.com", true },
{ "rtrinflatables.co.uk", true },
+ { "rtsak.com", true },
{ "rtsr.ch", true },
{ "rttvvip.com", true },
{ "rtwcourse.com", true },
{ "rtzoeller.com", true },
{ "ru-sprachstudio.ch", true },
{ "ru.search.yahoo.com", false },
- { "rua.cx", true },
{ "ruaneattorneys.com", true },
{ "ruanmi.de", true },
{ "rubberfurs.org", true },
@@ -32753,10 +33821,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rubenbarbero.com", true },
{ "rubenkruisselbrink.nl", true },
{ "rubens.cloud", true },
+ { "rubixstudios.com.au", true },
{ "rublacklist.net", true },
{ "ruby-auf-schienen.de", true },
+ { "rubyist.im", true },
{ "rubyist.today", true },
{ "rubymartin.com.au", true },
+ { "rubyquincunx.com", true },
+ { "rubyquincunx.org", true },
{ "rubytune.com", true },
{ "rucksack-rauf-und-weg.de", true },
{ "ruckzuck-privatpatient.de", true },
@@ -32764,7 +33836,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ruconsole.com", true },
{ "rud.is", true },
{ "rudd-o.com", true },
- { "rudelune.fr", true },
+ { "rudel-wot.de", true },
{ "rudewiki.com", true },
{ "rudhaulidirectory.com", true },
{ "rudloff.pro", true },
@@ -32778,12 +33850,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rueduparticulier.tk", false },
{ "rueegger.me", true },
{ "rueg.eu", true },
+ { "ruequincampoix.com", true },
{ "ruerte.net", true },
{ "rufabula-com.appspot.com", true },
{ "ruffbeatz.com", true },
- { "rugby.video", true },
{ "rugk.dedyn.io", true },
{ "ruh-veit.de", true },
+ { "ruha.co.in", true },
+ { "ruhnke.cloud", true },
{ "ruhrmobil-e.de", true },
{ "ruhrnalist.de", true },
{ "ruht.ro", true },
@@ -32791,6 +33865,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ruiming.me", true },
{ "ruin.one", true },
{ "ruiruigeblog.com", true },
+ { "ruitershoponline.nl", true },
{ "ruitersportbak.nl", true },
{ "ruk.ca", true },
{ "rulu.co", true },
@@ -32802,11 +33877,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rumplesinflatables.co.uk", true },
{ "rumtaste.com", true },
{ "rumtaste.de", true },
- { "run-forrest.run", false },
{ "run-it-direct.co.uk", true },
{ "runagain.ch", true },
{ "runebet.com", true },
{ "runefake.com", true },
+ { "runfitcoaching.com", true },
{ "runklesecurity.com", true },
{ "runnergrapher.com", true },
{ "runreport.fr", true },
@@ -32845,27 +33920,33 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ruthmontenegro.com", false },
{ "rutiger.com", true },
{ "rutika.ru", true },
- { "rutten.me", true },
+ { "rutten.me", false },
{ "ruudkoot.nl", true },
+ { "ruurdboomsma.nl", true },
{ "ruwhof.net", true },
{ "ruya.com", true },
{ "ruyatabirleri.com", true },
+ { "ruzzll.com", true },
{ "rv-jpshop.com", true },
{ "rva-asbestgroep.nl", true },
+ { "rvc-france.com", true },
+ { "rvfit.dk", true },
{ "rvfu98.com", true },
{ "rvnoel.net", true },
{ "rvsa2bevestigingen.nl", true },
{ "rvsa4bevestigingen.nl", true },
{ "rvsbevestigingen.nl", true },
+ { "rvsuitlaatdelen.nl", true },
{ "rw.search.yahoo.com", false },
{ "rwky.net", true },
{ "rws-cc.com", true },
{ "rws-vertriebsportal.de", true },
{ "rwx.ovh", true },
- { "rx-contact.com", false },
{ "rxbn.de", true },
{ "rxbusiness.com", true },
{ "rxcheck.com", true },
+ { "rxgroup.io", true },
+ { "rxguide.nl", true },
{ "rxight.com", true },
{ "ryan-design.com", true },
{ "ryan-gehring.com", true },
@@ -32882,8 +33963,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "rynkebo.dk", true },
{ "ryois.me", true },
{ "rys.pw", true },
- { "ryssl.com", true },
{ "ryu22e.org", true },
+ { "ryuanerin.kr", true },
{ "ryuu.es", true },
{ "ryzhov.me", true },
{ "rzentarzewski.net", true },
@@ -32902,7 +33983,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "s13d.fr", true },
{ "s16e.no", true },
{ "s2member.com", true },
- { "s2p.moe", true },
{ "s2t.net", true },
{ "s3cur3.it", true },
{ "s3robertomarini.it", true },
@@ -32913,24 +33993,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "s4q.me", true },
{ "s4tips.com", true },
{ "s4ur0n.com", true },
- { "s5118.com", true },
{ "s64.cz", true },
{ "s8a.us", true },
{ "s95.de", true },
- { "sa-blog.net", true },
{ "sa-mp.ro", true },
{ "sa.net", true },
{ "saabpartsdistribution.com", true },
{ "saamhorigheidsfonds.nl", false },
{ "saas.de", true },
{ "saastopankki.fi", true },
+ { "saatchiart.com", true },
{ "saba-piserver.info", true },
{ "sabahattin-gucukoglu.com", true },
+ { "sabbottlabs.com", true },
{ "sabe.cz", true },
{ "sabine-forschbach.de", true },
- { "sabineforschbach.de", true },
{ "sablyrics.com", true },
{ "sabrinajoias.com.br", true },
+ { "sabrinajoiasprontaentrega.com.br", true },
{ "sacaentradas.com", true },
{ "saccani.net", true },
{ "sackmesser.ch", true },
@@ -32947,7 +34027,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sadhana.cz", true },
{ "sadhawkict.org", true },
{ "sadiejewellery.co.uk", true },
+ { "sadmansh.com", true },
{ "sadou.kyoto.jp", true },
+ { "sadsu.com", true },
{ "saechsischer-christstollen.shop", true },
{ "saengsook.com", true },
{ "saengsuk.com", true },
@@ -32971,7 +34053,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "safeitup.se", true },
{ "safejourney.education", true },
{ "safematix.com", true },
- { "safeme.ga", true },
{ "safeocs.gov", true },
{ "safer-networking.org", true },
{ "saferproduct.gov", true },
@@ -32986,6 +34067,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "safetyworkkits.co.nz", true },
{ "safeui.com", true },
{ "safire.ac.za", true },
+ { "safungerar.se", true },
+ { "saga-umzuege.de", true },
+ { "sagaenterprizes.com", true },
{ "sagargandecha.com.au", true },
{ "sagedocumentmanager.com", true },
{ "sagerus.com", true },
@@ -33005,6 +34089,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "saier.me", true },
{ "saifoundation.in", true },
{ "saigonflowers.com", true },
+ { "saigonstar.de", true },
{ "saikarra.com", true },
{ "saikou.moe", true },
{ "saikouji.tokushima.jp", true },
@@ -33048,6 +34133,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "saitv.org", true },
{ "sajamstudija.info", true },
{ "sajdowski.de", true },
+ { "sajtoskal.hu", true },
{ "sakaki.anime.my", false },
{ "sakamichi.moe", true },
{ "sakerhetskopiering.nu", true },
@@ -33079,7 +34165,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "salesmachine.io", true },
{ "salexy.kz", true },
{ "salidaswap.com", true },
- { "salixcode.com", true },
{ "salland1.nl", true },
{ "salle-quali.fr", true },
{ "sallydowns.name", true },
@@ -33087,7 +34172,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "salmonella.co.uk", true },
{ "salmonrecovery.gov", true },
{ "salmonvision.com.tw", true },
- { "salmos91.com", true },
{ "salmotierra-salvatierra.com", true },
{ "salon-hinata.biz", true },
{ "salon-minipli.de", true },
@@ -33106,23 +34190,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "saludmas.site", true },
{ "saludsis.mil.co", true },
{ "saludyvida.site", true },
+ { "saluels.servemp3.com", true },
{ "salutethefish.com", true },
{ "salutethegrains.com", true },
{ "salutethepig.com", true },
{ "salva.re", true },
{ "salvagedfurnitureparlour.com", true },
{ "sam-football.fr", true },
+ { "samanacafe.com", true },
{ "samanthasgeckos.com", true },
{ "samappleton.com", true },
{ "samara-avia.ru", true },
+ { "samariafar.com", true },
{ "samaritainsmeyrin.ch", true },
{ "samatva-yogalaya.com", true },
- { "samba.com.co", true },
{ "samba.org", true },
- { "sambaa.com.br", true },
{ "sambaash.com", true },
{ "sambeso.net", true },
{ "samdev.io", true },
+ { "samdrewtakeson.com", false },
{ "samegoal.com", true },
{ "samegoal.org", true },
{ "samel.de", true },
@@ -33132,7 +34218,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "samgrayson.me", true },
{ "samhuri.net", true },
{ "samifar.in", true },
- { "samitechnic.com", true },
{ "samizdat.cz", true },
{ "samkelleher.com", true },
{ "saml-gateway.org", true },
@@ -33142,7 +34227,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sammyjohnson.com", true },
{ "sammyservers.com", true },
{ "sammyservers.net", true },
- { "samnya.cn", false },
+ { "samnya.cn", true },
+ { "samorazvitie.ru", true },
{ "samplefashion.nl", true },
{ "samri.pt", true },
{ "samrobertson.co.uk", true },
@@ -33150,7 +34236,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "samsungmobile.it", true },
{ "samsungphonegenerator.xyz", true },
{ "samtalen.nl", true },
- { "samuel-dumont.be", true },
{ "samuelkeeley.com", true },
{ "samuellaulhau.fr", true },
{ "samui-samui.de", false },
@@ -33162,7 +34247,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sana-store.com", true },
{ "sana-store.cz", true },
{ "sana-store.sk", true },
- { "sanael.net", true },
{ "sanantoniolocksmithinc.com", true },
{ "sanantoniolocksmithtx.com", true },
{ "sanasport.cz", true },
@@ -33186,8 +34270,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sandiegotown.com", true },
{ "sandmanintel.com", true },
{ "sandmarc.cz", true },
- { "sandobygg.se", true },
- { "sandogruppen.se", true },
{ "sandor.wtf", true },
{ "sandrainden.nl", true },
{ "sandraindenfotografie.nl", true },
@@ -33204,6 +34286,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sanex.ca", false },
{ "sanglierhurlant.fr", true },
{ "sangwon.io", true },
+ { "sangyoui.health", true },
{ "sanilodge.com", true },
{ "sanipousse.com", true },
{ "sanissimo.com.mx", false },
@@ -33212,7 +34295,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sanitairwinkel.nl", true },
{ "sanitrak.cz", true },
{ "sanjotech.space", true },
- { "sannesfotklinikk.no", true },
+ { "sanmuding.com", true },
+ { "sanovnik.at", true },
{ "sanpham-balea.org", true },
{ "sanskritiyoga.com", true },
{ "sansonehowell.com", true },
@@ -33226,12 +34310,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "santojuken.co.jp", true },
{ "santoshpandit.com", true },
{ "sanvitolocapobus.com", true },
+ { "sanych-msk.ru", true },
{ "saol.eu", true },
{ "saoneth.pl", true },
{ "saorsat.com", true },
{ "saorsat.ie", true },
{ "saorsat.tv", true },
{ "saorview.com", true },
+ { "saorview.net", true },
{ "saorviewconnect.ie", true },
{ "saorviewconnected.ie", true },
{ "sap-inc.co.jp", true },
@@ -33244,6 +34330,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sapphirepearl.com.sg", true },
{ "sapprendre.ch", true },
{ "saprima.de", true },
+ { "saputra.org", true },
{ "sarabara.com", true },
{ "sarahbeckettharpist.com", true },
{ "sarahboydrealty.com", true },
@@ -33253,6 +34340,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sarahplusdrei.de", true },
{ "sarahsecret.de", true },
{ "sarahvictor.co.uk", true },
+ { "sarahwellington.com", true },
{ "sarahwikeley.co.uk", true },
{ "saraleebread.com", false },
{ "sarariman.com", true },
@@ -33262,8 +34350,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sardegnatirocini.it", true },
{ "sarink.eu", true },
{ "sarkisianbuilders.com", true },
+ { "sarkoziadam.hu", true },
{ "saro.me", true },
- { "saronno5stelle.it", true },
{ "sarpsb.org", true },
{ "sarumtechnologies.com", true },
{ "sas-snowboarding.sk", true },
@@ -33294,6 +34382,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "satisperfectacollections.com", true },
{ "satmd.de", true },
{ "satoshinumbers.com", true },
+ { "satplay.host", true },
+ { "satsukii.moe", true },
+ { "sattamatka.market", true },
{ "sattamatkachart.in", true },
{ "sattamatkamobi.mobi", true },
{ "saturn.pl", true },
@@ -33319,8 +34410,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sauvagebridge.nl", true },
{ "savaari.com", true },
{ "savageorgiev.com", true },
+ { "savbus.com", true },
+ { "savbus.net", true },
+ { "savbus.ws", true },
{ "save-me-aachen.de", true },
- { "save-me-koeln.de", true },
{ "savecrypto.org", true },
{ "savenet.org", true },
{ "saveoney.ca", true },
@@ -33333,7 +34426,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "savingrecipe.com", true },
{ "savingsoftheyear.com", true },
{ "savingsomegreen.com", true },
- { "savingsstoreonline.ca", true },
{ "savisasolutions.co.za", true },
{ "savvytime.com", true },
{ "sawyerroofing.com", true },
@@ -33366,7 +34458,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sbir.gov", true },
{ "sbirecruitment.co.in", true },
{ "sbit.com.br", true },
- { "sblum.de", true },
{ "sbo-dresden.de", true },
{ "sbox-servers.com", true },
{ "sbr.red", true },
@@ -33380,9 +34471,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sbytes.info", true },
{ "sc-artworks.co.uk", true },
{ "sc5.jp", true },
+ { "scaarus.com", true },
{ "scaffalature.roma.it", true },
- { "scaffoldhirefourways.co.za", true },
- { "scaffoldhirerandburg.co.za", true },
{ "scalacollege.nl", true },
{ "scalaire.com", true },
{ "scalaire.fr", true },
@@ -33408,8 +34498,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "scene.mx", true },
{ "scenester.tv", true },
{ "scenicbyways.info", true },
- { "scentofwine.com", true },
{ "scepticism.com", true },
+ { "scevity.com", true },
{ "schadevergoedingen.eu", true },
{ "schaefer-reifen.de", true },
{ "schaffensdrang.at", true },
@@ -33428,7 +34518,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "schelberts.de", true },
{ "schellevis.net", true },
{ "schemingmind.com", true },
- { "schenkes.de", true },
+ { "schenkes.de", false },
{ "scherfke.de", true },
{ "scheuchenstuel.at", true },
{ "schgroup.com", true },
@@ -33449,12 +34539,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "schlick.wedding", true },
{ "schlossereieder.at", true },
{ "schlossfuchs.de", true },
+ { "schluesseldienst-berlin.de", true },
+ { "schluesseldienst-hannover24.de", true },
{ "schlueter-software.de", true },
{ "schmaeh-coaching.ch", true },
+ { "schmatloch.cloud", true },
{ "schmelle.me", true },
{ "schmetterlingsapp.at", true },
{ "schmid.tv", true },
{ "schmidthomes.com", true },
+ { "schmidtlohwasser.de", true },
{ "schmidtplasticsurgery.com", true },
{ "schmitt-etienne.fr", true },
{ "schmitt-max.com", true },
@@ -33470,6 +34564,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "schnyder-werbung.ch", true },
{ "schoeck-elektro.de", true },
{ "schoeller.click", true },
+ { "schoenstatt.link", true },
{ "schoepski.de", true },
{ "schoknecht.net", true },
{ "schoknecht.one", true },
@@ -33489,6 +34584,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "scholierenvervoerzeeland.nl", true },
{ "scholledev.com", true },
{ "scholz-kallies.de", true },
+ { "schonstedt.com", true },
{ "schont.org", true },
{ "school-b.us", true },
{ "school-register.co.za", true },
@@ -33512,8 +34608,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "schreinerei-jahreis.de", true },
{ "schrenkinzl.at", true },
{ "schritt4fit.de", true },
- { "schrodingersscat.com", true },
- { "schrodingersscat.org", true },
{ "schroeder-immobilien-sundern.de", true },
{ "schroepfi.de", true },
{ "schrolm.de", true },
@@ -33532,9 +34626,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "schulfotograf-deinfoto.ch", true },
{ "schull.ch", true },
{ "schultzflorists.com", true },
- { "schum.world", true },
{ "schumanandmonnet.eu", true },
- { "schummar.de", true },
{ "schunako.ch", true },
{ "schuppentier.org", true },
{ "schurkenstaat.net", true },
@@ -33544,11 +34636,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "schutzwerk.com", true },
{ "schwabenhaus-ka.de", true },
{ "schwalliers.com", true },
- { "schwanke.in", true },
{ "schwano-dent.at", true },
{ "schwarz-gelbe-fuechse.de", true },
{ "schwarzegar.de", true },
{ "schwarzer.it", true },
+ { "schwarzer.wang", true },
{ "schwarzes-muenchen.de", true },
{ "schwarzhenri.ch", true },
{ "schwarztrade.cz", true },
@@ -33561,6 +34653,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "science-network.ch", true },
{ "science-questions.org", true },
{ "science-texts.de", true },
+ { "science.gov", true },
{ "science360.gov", true },
{ "sciencebase.gov", true },
{ "scienceexploits.com", true },
@@ -33576,9 +34669,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "scimage.com", true },
{ "scintilla.nl", true },
{ "scintillating.stream", true },
- { "scis.com.ua", true },
{ "scistarter.com", true },
- { "scitopia.me", true },
{ "scitopia.net", true },
{ "sclns.co", true },
{ "scohetal.de", true },
@@ -33591,17 +34682,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "scorerealtygroup.com", true },
{ "scorp13.com", true },
{ "scorpowines.com", true },
- { "scottah.com", true },
{ "scottgalvin.com", true },
- { "scottgruber.me", true },
{ "scottgthomas.com", true },
{ "scotthelme.co.uk", true },
{ "scottipc.com", true },
{ "scottishcu.org", true },
{ "scottishseniorsgolf.com", true },
{ "scottlanderkingman.com", true },
+ { "scottmay.id.au", true },
{ "scottseditaacting.com", true },
- { "scotttopperproductions.com", true },
{ "scoutingridderkerk.nl", true },
{ "scoutingtungelroy.nl", true },
{ "scoutnet.de", true },
@@ -33643,6 +34732,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "scroll.in", true },
{ "scrtch.fr", true },
{ "scrumbleship.com", true },
+ { "scrumplex.net", true },
{ "scrumpus.com", true },
{ "scrumstack.co.uk", true },
{ "scryfall.com", true },
@@ -33658,7 +34748,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sculpture.support", true },
{ "scuolaguidalame.ch", true },
{ "sd.af", true },
- { "sdayman.com", true },
{ "sdcardrecovery.de", true },
{ "sdg-tracker.org", true },
{ "sdgllc.com", true },
@@ -33715,6 +34804,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "searchcandy.uk", true },
{ "searchdatalogy.com", true },
{ "searchfox.org", true },
+ { "searchpartners.dk", true },
{ "seareytraining.com", true },
{ "searsucker.com", true },
{ "searx.ru", true },
@@ -33724,9 +34814,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "seasons-vintage.com", true },
{ "seasons.nu", false },
{ "seatbeltpledge.com", true },
+ { "seatshare.co.uk", true },
{ "seattle-life.net", true },
{ "seattlefabrication.com", true },
{ "seattlemesh.net", true },
+ { "seattleprivacy.org", true },
{ "seattlewalkinbathtubs.com", true },
{ "seb-mgl.de", true },
{ "seb-net.com", true },
@@ -33743,6 +34835,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sebastianblade.com", true },
{ "sebastianboegl.de", true },
{ "sebastiaperis.com", true },
+ { "sebastiensenechal.com", true },
{ "sebasveeke.nl", true },
{ "sebepoznani.eu", true },
{ "sebi.org", true },
@@ -33772,6 +34865,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "secnews.gr", true },
{ "secomo.org", true },
{ "secondchancejobsforfelons.com", true },
+ { "secondnature.bio", true },
{ "seconfig.sytes.net", true },
{ "secpatrol.de", true },
{ "secretar.is", true },
@@ -33780,19 +34874,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "secretsanta.fr", true },
{ "secretsdujeu.com", true },
{ "secretserveronline.com", true },
+ { "secretum.tech", true },
{ "secteer.com", true },
{ "sectelligence.nl", true },
{ "sectio-aurea.org", true },
{ "section-31.org", true },
{ "section.io", true },
- { "section508.gov", true },
{ "section77.de", true },
- { "sectionw2s.org", true },
{ "sector5.xyz", true },
{ "sectun.com", true },
{ "secumail.nl", true },
{ "secundity.nl", true },
{ "securai.de", true },
+ { "secure-computing.net", true },
{ "secure-graphic.de", true },
{ "secure-gw.de", true },
{ "secure-server-hosting.com", true },
@@ -33800,19 +34894,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "secure.co.hu", true },
{ "secure.facebook.com", false },
{ "securecomms.cz", true },
+ { "securedns.zone", true },
{ "securedrop.org", true },
{ "secureesolutions.com", true },
+ { "securefiletransfer.nl", true },
{ "secureheaders.com", true },
+ { "secureideas.com", true },
{ "secureim.de", true },
{ "securejabber.me", true },
{ "securelect-inspection.com", true },
{ "securemailbox.com", true },
{ "securemessage.nl", true },
+ { "securemy.website", true },
+ { "securenets.nl", true },
{ "secureobscure.com", true },
- { "secureonline.co", false },
+ { "secureonline.co", true },
{ "securethe.news", true },
{ "securetheorem.com", true },
{ "securetrustbank.com", true },
+ { "securevideo.com", true },
{ "securi-tay.co.uk", true },
{ "securify.nl", true },
{ "securipy.com", true },
@@ -33822,10 +34922,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "security-brokers.com", true },
{ "security.gives", true },
{ "security.google.com", true },
- { "security.love", true },
{ "security201.co.uk", true },
{ "security201.com", true },
- { "securityblues.co.uk", true },
{ "securitycamerascincinnati.com", true },
{ "securityescrownews.com", true },
{ "securityfest.com", true },
@@ -33840,10 +34938,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "securitypluspro.com", true },
{ "securityprimes.in", true },
{ "securitypuppy.com", true },
- { "securitysense.co.uk", true },
+ { "securityrussia.com", true },
{ "securitysnobs.com", false },
{ "securitystrata.com", true },
- { "securitystreak.com", true },
{ "securitytrails.com", true },
{ "securitywithnick.com", true },
{ "securitywithoutborders.org", true },
@@ -33854,7 +34951,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "secvault.io", true },
{ "secwall.me", true },
{ "secyourity.se", true },
- { "sedeusquiser.net", true },
{ "sedlakovalegal.com", true },
{ "sedmicka.sk", true },
{ "sedomicilier.fr", true },
@@ -33866,12 +34962,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "seedcoworking.es", true },
{ "seedisclaimers.com", true },
{ "seednode.co", true },
- { "seedsofangelica.net", true },
{ "seekers.ch", true },
{ "seekfirstthekingdom.ca", true },
{ "seeks.ru", true },
{ "seemeagain.com", true },
- { "seesuite.com", false },
+ { "seemomclick.com", true },
{ "seewhatididhere.com", true },
{ "seeworkdone.com", true },
{ "seezeitlodge-bostalsee.de", true },
@@ -33891,7 +34986,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "segurosdevidamiami.org", true },
{ "segurosocial.gov", false },
{ "seguroviagem.srv.br", false },
+ { "sehablazolano.com", true },
{ "sehnenweh.org", true },
+ { "seht.xyz", true },
{ "seibert.ninja", true },
{ "seibu-kikaku.co.jp", true },
{ "seifried.org", true },
@@ -33902,9 +34999,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "seitai-nabejun.jp", true },
{ "seitai-taiyou.com", true },
{ "seitenwaelzer.de", true },
+ { "sek.ai", true },
{ "sekikawa.biz", true },
{ "sekisonn.com", true },
{ "sekoya.org", true },
+ { "sektor.ro", true },
+ { "sektor.tech", true },
+ { "sektor41.com", true },
+ { "selber-coden.de", true },
{ "selbys.net.au", true },
{ "selcusters.nl", true },
{ "seldax.com", true },
@@ -33912,10 +35014,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "selected-properties.com", true },
{ "selectel.com", false },
{ "selectel.ru", true },
+ { "selectionengine.ca", true },
+ { "selectionengine.com", true },
+ { "selectionengine.net", true },
+ { "selectionengine.org", true },
{ "selectorders.com", true },
{ "selectsplat.com", true },
{ "selegiline.com", true },
- { "selekzo.com", true },
+ { "selent.me", true },
+ { "seleondar.ru", true },
{ "self-evident.org", true },
{ "self-signed.com", true },
{ "self-xss.info", true },
@@ -33927,7 +35034,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "selfishness.com", true },
{ "selfloath.in", true },
{ "selfmade4u.de", true },
- { "selfoutlet.com", true },
{ "selkiemckatrick.com", true },
{ "sellajoch.com", true },
{ "selldorado.com", true },
@@ -33945,8 +35051,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "semantica.cz", true },
{ "semaphore-studios.com", true },
{ "semdynamics.com", true },
- { "semenov.su", false },
+ { "semenov.su", true },
+ { "sementes.gratis", true },
{ "seminariruum.ee", true },
+ { "seminariruumid.ee", true },
{ "semiocast.com", true },
{ "semiread.com", true },
{ "semjonov.de", true },
@@ -33959,12 +35067,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "semyonov.su", true },
{ "semyonov.us", true },
{ "senarius.de", true },
+ { "send4x.com", true },
{ "sendai-sisters.com", true },
{ "sendaiouji.com", true },
{ "sendbox.cz", true },
{ "sendc.at", true },
{ "sendcat.com", true },
+ { "sendingbee.com", true },
{ "sendinvoice.nl", true },
+ { "sendmeback.de", false },
{ "sendonce.io", true },
{ "sendthisfile.com", true },
{ "sendtrix.nl", true },
@@ -33986,11 +35097,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sense.hamburg", true },
{ "sensebridge.com", true },
{ "sensebridge.net", true },
+ { "senseict.com.au", true },
{ "sensepixel.com", true },
{ "senshudo.tv", true },
+ { "sensoft-int.com", true },
{ "sensoft-int.org", true },
- { "sensound.ml", true },
{ "sentandsecure.com", true },
+ { "sentencing.net", true },
{ "sentic.info", true },
{ "sentidosdelatierra.org", true },
{ "sentiments.io", true },
@@ -34006,30 +35119,33 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "seo-nerd.de", true },
{ "seo-portal.de", true },
{ "seo.consulting", true },
- { "seo.london", true },
{ "seo.tl", true },
{ "seoagentur2go.de", true },
{ "seoankara.name.tr", true },
{ "seobutler.com", true },
- { "seocomposer.com", true },
{ "seodayo.com", true },
- { "seoexperte.berlin", true },
{ "seogeek.nl", true },
{ "seohackers.fr", true },
{ "seohouston.com", true },
{ "seoinc.com", true },
{ "seojames.com", true },
+ { "seolotsen.de", true },
{ "seomarketing.bg", true },
+ { "seomik.dk", true },
{ "seon.me", true },
{ "seoprovider.nl", true },
{ "seoquake.com", true },
+ { "seosec.xyz", true },
{ "seosof.com", true },
- { "seostepbysteplab.com", false },
+ { "seotools.asia", true },
{ "seoul.dating", true },
{ "seouniversity.org", true },
{ "seovision.se", true },
+ { "seowebexpert.co.uk", true },
+ { "seowordpress.pl", true },
{ "sepalandseed.com", true },
{ "seppelec.com", true },
+ { "seproco.com", true },
{ "septentrionalist.org", true },
{ "septfinance.ch", true },
{ "septicrepairspecialists.com", true },
@@ -34046,28 +35162,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "serendeputy.com", true },
{ "serf.io", true },
{ "serge-design.ch", true },
+ { "sergeemond.ca", true },
{ "sergefonville.nl", true },
{ "sergeyreznikov.com", true },
{ "sergije-stanic.me", true },
- { "sergiojimenezequestrian.com", true },
{ "sergiosantoro.it", true },
{ "sergiozygmunt.com", true },
+ { "sergivb01.me", false },
{ "sergos.de", true },
{ "serialexperiments.co.uk", true },
{ "serienstream.to", true },
{ "serigraphs.co.uk", true },
{ "serinamusic.com", true },
+ { "seriousaboutsecurity.com", true },
{ "seriousclimbing.com", true },
{ "seriouss.am", true },
{ "sernate.com", true },
{ "serotiuk.com", false },
{ "serpenteq.com", true },
{ "serrano-chris.ch", true },
- { "seru.eu", true },
{ "serve-a.com.au", true },
{ "servea.com.au", true },
{ "serveatechnologies.com", true },
- { "servemnaction.org", true },
{ "servepublic.com", true },
{ "servepublic.org", true },
{ "server-daten.de", true },
@@ -34075,17 +35191,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "server-essentials.com", false },
{ "server-eye.com", true },
{ "server-eye.de", true },
- { "server92.tk", true },
+ { "server92.eu", true },
{ "serveradium.com", true },
{ "serveradminz.com", true },
- { "serverangels.co.uk", true },
{ "serverco.com", true },
{ "serverd.de", true },
{ "serverexpose.com", true },
{ "serverfrog.de", true },
- { "serverlog.net", true },
{ "serveroffline.net", false },
{ "serverpedia.de", true },
+ { "serverping.io", true },
{ "servers4all.co.uk", true },
{ "serversfrom.space", true },
{ "serversftw.com", true },
@@ -34093,15 +35208,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "serversuit.com", true },
{ "servertastic.com", true },
{ "servethecity-karlsruhe.de", true },
+ { "servetten-groothandel.nl", true },
{ "servettorna.com", true },
{ "servgate.jp", true },
{ "service.gov.uk", true },
{ "servicebeaute.fr", true },
{ "serviceboss.de", true },
{ "servicemembers.gov", true },
+ { "servicerequesthub.io", true },
{ "servida.ch", true },
- { "servidoresweb.online", true },
+ { "servidoresadmin.com", true },
+ { "servietten-grosshandel.at", true },
+ { "servietten-grosshandel.be", true },
+ { "servietten-grosshandel.ch", true },
+ { "servietten-grosshandel.de", true },
{ "serviettenhaus.de", true },
+ { "serviettes-et-plus.com", true },
+ { "servilletas-de-papel.es", true },
+ { "servilletas-de-papel.mx", true },
{ "servingbaby.com", true },
{ "servious.org", true },
{ "servitek.de", true },
@@ -34109,6 +35233,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "servo.org", true },
{ "servx.org", true },
{ "serw.org", true },
+ { "serwetki-papierowe.pl", true },
{ "serwis-wroclaw.pl", true },
{ "serwusik.pl", true },
{ "seryox.com", true },
@@ -34121,7 +35246,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sestra.in", true },
{ "setasgourmet.es", true },
{ "setenforce.one", true },
- { "setfix.de", true },
{ "sethcaplan.com", true },
{ "sethjust.com", true },
{ "sethvargo.com", true },
@@ -34144,19 +35268,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "severine-trousselard.com", true },
{ "severntrentinsuranceportal.com", true },
{ "sevinci.ch", true },
+ { "sevsey.ru", true },
{ "sevwebdesign.com", true },
{ "sewa.nu", true },
{ "sewafineseam.com", true },
{ "sewinginsight.com", true },
{ "sewoo.co.uk", true },
- { "sexaki.com", true },
+ { "sexar.info", true },
+ { "sexara.co", true },
{ "sexdocka.nu", true },
{ "sexflare.net", true },
{ "sexmobil.de", true },
{ "sexplicit.co.uk", true },
{ "sexservice.io", true },
+ { "sexshopnet.com.br", true },
+ { "sextfriend.com", true },
{ "sexy-store.nl", true },
- { "seydaozcan.com", true },
{ "seyfarth.de", true },
{ "seyr.me", true },
{ "sfa.sk", true },
@@ -34180,7 +35307,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sgi.org", true },
{ "sgitc.de", true },
{ "sglibellen.de", true },
- { "sgrmreproduccionapp.azurewebsites.net", true },
+ { "sgroup-hitoduma.com", true },
+ { "sgroup-rec.com", true },
{ "sgs-systems.de", true },
{ "sgs.camera", true },
{ "sgs.systems", true },
@@ -34190,7 +35318,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sgutranscripts.org", true },
{ "sh-heppelmann.de", true },
{ "sh-network.de", true },
- { "sh0rt.zone", true },
{ "sh0shin.org", true },
{ "shaadithailand.com", true },
{ "shabiwangyou.com", true },
@@ -34217,6 +35344,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shadynook.net", true },
{ "shafou.com", true },
{ "shafou.net", true },
+ { "shahar.cc", true },
{ "shaharyaranjum.com", true },
{ "shaicoleman.com", true },
{ "shainessim.com", true },
@@ -34241,16 +35369,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shanahanstrategy.com", true },
{ "shanetully.com", true },
{ "shankangke.com", true },
- { "shannoneichorn.com", true },
{ "shansing.cn", true },
{ "shansing.com", true },
{ "shansing.net", true },
{ "shansing.space", true },
{ "shaobin.wang", true },
+ { "shapediver.com", true },
{ "sharanyamunsi.net", true },
- { "share.works", true },
{ "sharealo.org", true },
{ "sharedhost.de", true },
+ { "shareeri.xyz", true },
+ { "sharefox.eu", true },
+ { "sharefox.nl", true },
{ "sharejoy.cn", false },
{ "sharekey.com", false },
{ "sharelovenotsecrets.com", true },
@@ -34259,6 +35389,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sharescope.co.uk", false },
{ "shareselecttools.com", true },
{ "sharevari.com", true },
+ { "shareworks.com", true },
+ { "sharezen.de", true },
{ "sharing-kyoto.com", true },
{ "sharisharpe.com", true },
{ "shark.cat", true },
@@ -34273,29 +35405,32 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shaunandamyswedding.com", true },
{ "shaunc.com", true },
{ "shaundanielz.com", true },
- { "shaunharker.com", true },
{ "shav.it", true },
{ "shavegazette.com", true },
+ { "shavit.space", true },
{ "shawnalucey.com", true },
{ "shawnhogan.com", true },
{ "shawnow.com", true },
{ "shawnwilkerson.com", true },
{ "shazzlemd.com", true },
{ "shazzlepro.com", true },
+ { "shdsub.xyz", true },
{ "sheaf.site", true },
{ "shearcomfort.com", true },
{ "sheaspire.com.tw", true },
{ "shee.org", true },
{ "sheehyinfinitioftysonsparts.com", true },
- { "sheekdeveloper.com", true },
{ "sheekmedia.com", true },
+ { "sheenveininstitutestl.com", true },
{ "sheepfriends.com", true },
+ { "sheerchain.com", true },
{ "sheet.host", true },
{ "shehaal.com", true },
{ "shehata.com", true },
{ "sheilasdrivingschool.com", true },
{ "shek.zone", true },
{ "shelfordsandstaplefordscouts.org.uk", true },
+ { "shellday.cc", true },
{ "shelleystoybox.com", true },
{ "shellfire.de", true },
{ "shellgame.io", true },
@@ -34304,10 +35439,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shellshock.eu", true },
{ "shellvatore.us", true },
{ "shemissed.me", true },
- { "shemsconseils.ma", true },
{ "shengbao.org", true },
{ "shenghaiautoparts.com", true },
{ "shenghaiautoparts.net", true },
+ { "shens.ai", true },
{ "shenyuqi.com", false },
{ "sherbers.de", true },
{ "sherrikehoetherapy.com", true },
@@ -34321,9 +35456,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shiawasedo.co.jp", true },
{ "shichibukai.net", true },
{ "shico.org", true },
- { "shieldcomputer.com", true },
{ "shielder.it", true },
- { "shieldfe.com", true },
{ "shift-record.com", true },
{ "shift-to.co.jp", true },
{ "shiftdevices.com", true },
@@ -34349,11 +35482,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shinsyo.com", true },
{ "shintoism.com", true },
{ "shinuytodaati.co.il", true },
+ { "shiny.gift", true },
{ "shinyuu.net", true },
{ "shipard.com", true },
{ "shipard.cz", true },
{ "shipcloud.io", true },
{ "shippercenter.info", true },
+ { "shippinglabel.de", true },
{ "shiqi.ca", true },
{ "shiqi.lol", true },
{ "shiqi.one", true },
@@ -34366,12 +35501,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shirtsdelivered.com", true },
{ "shirtsofholland.com", true },
{ "shiseki.top", true },
- { "shishkabobnc.com", true },
{ "shishkin.us", true },
{ "shishlik.net", true },
{ "shitagi-shop.com", true },
{ "shitbeast.institute", true },
- { "shitmybradsays.com", true },
+ { "shitmybradsays.com", false },
{ "shitposts.se", true },
{ "shitproductions.org", true },
{ "shitsta.in", true },
@@ -34387,8 +35521,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shoeracks.uk", true },
{ "shoestringeventing.co.uk", true },
{ "shokola.com", true },
- { "sholtowu.com", true },
- { "shome.de", true },
{ "shooter.dog", true },
{ "shootingstarmedium.com", true },
{ "shop-hellsheadbangers.com", true },
@@ -34409,11 +35541,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shopapi.cz", true },
{ "shopatkei.com", true },
{ "shopbakersnook.com", true },
+ { "shopcord.co.uk", true },
{ "shopcoupon.co.za", true },
{ "shopcoupons.co.id", true },
{ "shopcoupons.my", true },
{ "shopcoupons.ph", true },
{ "shopcoupons.sg", true },
+ { "shopdongho.com", true },
+ { "shopfinale.com", true },
{ "shopific.co", true },
{ "shopific.com", true },
{ "shopify.com", true },
@@ -34421,6 +35556,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shopkini.com", true },
{ "shoplandia.co", true },
{ "shopperexperts.com", true },
+ { "shopperexpertss.com", true },
{ "shopping24.de", true },
{ "shoppr.dk", true },
{ "shopregional.com.br", true },
@@ -34437,12 +35573,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shorten.ninja", true },
{ "shoshin-aikido.de", true },
{ "shoshin.technology", true },
+ { "shota.vip", true },
{ "shotbow.net", true },
+ { "shotly.net", true },
{ "shotonwhat.com", true },
{ "shouldihookupwithmybarista.com", true },
{ "shouttag.com", true },
{ "shovonhasan.com", true },
- { "show-saratov.ru", false },
{ "showbits.net", true },
{ "showersnet.com", true },
{ "showf.om", true },
@@ -34459,6 +35596,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shrimpcam.pw", true },
{ "shrinidhiclinic.in", true },
{ "shrinkhub.com", true },
+ { "shrt.tv", true },
{ "shrub.ca", true },
{ "shrug.ml", true },
{ "shtaketniki.kz", true },
@@ -34472,7 +35610,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shukatsu-support.jp", true },
{ "shulan.moe", true },
{ "shuletime.ml", true },
- { "shulker.store", true },
{ "shura.eu.org", true },
{ "shuro.de", true },
{ "shuset.dk", true },
@@ -34481,15 +35618,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "shuvodeep.de", true },
{ "shux.pro", true },
{ "shwrm.ch", true },
+ { "shybynature.com", true },
{ "shyuka.me", true },
{ "si-benelux.nl", true },
+ { "si.to", true },
{ "si2b.fr", true },
{ "siaggiusta.com", true },
{ "siamdevsqua.re", true },
- { "siamdevsquare.com", true },
{ "siamsnus.com", true },
{ "sianbryn.co.uk", true },
- { "sianjhon.com", true },
{ "siava.ru", true },
{ "siberas.de", true },
{ "siberkulupler.com", true },
@@ -34501,6 +35638,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "siciliamconsulting.com", true },
{ "sicilianbalm.com", true },
{ "siciliapulizie.it", true },
+ { "sicilyalacarte.com", true },
{ "sicken.eu", true },
{ "sicurezzalavoro24.com", true },
{ "sicurled.com", false },
@@ -34516,13 +35654,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sidnicio.us", true },
{ "sidonge.com", true },
{ "sidongkim.com", true },
+ { "sidpod.ru", true },
{ "siegemund-frankfurt.de", true },
{ "siel.nl", true },
{ "sielsystems.nl", true },
- { "siemencaes.tk", true },
{ "sientemendoza.com.ar", true },
{ "sierpinska.co", true },
{ "sierpinska.eu", true },
+ { "sietejefes.com.ar", true },
{ "siewert-kau.de", true },
{ "sift-tool.org", true },
{ "sig6.org", true },
@@ -34533,13 +35672,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sighup.nz", true },
{ "sigismonda.ch", true },
{ "sigma-signalisation.com", true },
+ { "sigma957.net", true },
{ "sigmalux.ltd", true },
{ "sigmalux.sarl", true },
{ "sigmapramuka.com", true },
+ { "sigmaweb.co.uk", true },
{ "sign.io", true },
{ "signage.red", true },
{ "signal.org", true },
{ "signalmaps.co.uk", true },
+ { "signdesk.com", true },
{ "significados.com", true },
{ "significados.com.br", true },
{ "significantbanter.com", true },
@@ -34569,6 +35711,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "silerfamily.net", true },
{ "silica-project.com", true },
{ "silica-project.jp", true },
+ { "silicanetworks.com", true },
{ "silicon-north.com", true },
{ "silicon-vision.com", true },
{ "siliconchip.me", true },
@@ -34596,13 +35739,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "silvergoldbull.co.ao", true },
{ "silvergoldbull.co.il", true },
{ "silvergoldbull.co.no", true },
- { "silvergoldbull.co.tz", true },
{ "silvergoldbull.co.uk", true },
{ "silvergoldbull.com", true },
{ "silvergoldbull.com.ar", true },
{ "silvergoldbull.com.au", true },
{ "silvergoldbull.com.eg", true },
- { "silvergoldbull.com.gh", true },
{ "silvergoldbull.com.mt", true },
{ "silvergoldbull.cr", true },
{ "silvergoldbull.cz", true },
@@ -34620,7 +35761,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "silvergoldbull.gt", true },
{ "silvergoldbull.hk", true },
{ "silvergoldbull.hn", true },
- { "silvergoldbull.hr", true },
{ "silvergoldbull.hu", true },
{ "silvergoldbull.id", true },
{ "silvergoldbull.in", true },
@@ -34628,11 +35768,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "silvergoldbull.it", true },
{ "silvergoldbull.kr", true },
{ "silvergoldbull.li", true },
- { "silvergoldbull.lk", true },
{ "silvergoldbull.lt", true },
{ "silvergoldbull.lv", true },
{ "silvergoldbull.ma", true },
- { "silvergoldbull.mk", true },
{ "silvergoldbull.mw", true },
{ "silvergoldbull.my", true },
{ "silvergoldbull.nz", true },
@@ -34656,9 +35794,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "silverkingalaska.com", true },
{ "silverlinkz.net", true },
{ "silverseen.com", true },
+ { "silvershadow.cc", true },
{ "silverswanrecruitment.com", true },
{ "silverwind.io", true },
{ "silvesrom.ro", true },
+ { "silvester-mitterschida.de", true },
{ "silvine.xyz", true },
{ "silvobeat.blog", true },
{ "silvobeat.com", true },
@@ -34679,7 +35819,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "simivalleylighting.com", true },
{ "simivalleyoutdoorlighting.com", true },
{ "simkova-reality.cz", true },
- { "simlau.net", true },
{ "simmis.fr", true },
{ "simoesgoulart.com.br", true },
{ "simon-agozzino.fr", true },
@@ -34697,6 +35836,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "simonlyabonnement.nl", true },
{ "simonmaddox.com", true },
{ "simonpaarlberg.com", true },
+ { "simonpayne.cz", true },
{ "simonreich.de", true },
{ "simonshine.dk", true },
{ "simonspeich.ch", true },
@@ -34715,6 +35855,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "simplecontacts.com", true },
{ "simplecrypt.io", true },
{ "simplednscrypt.org", true },
+ { "simplefraud.com", true },
+ { "simplegoodhealth.com", true },
{ "simpleindianrecipes.com", true },
{ "simpleinout.com", true },
{ "simpleinvoices.io", true },
@@ -34744,6 +35886,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "simrail.nl", true },
{ "simsnieuws.nl", true },
{ "simukti.net", true },
+ { "simulping.com", true },
{ "sin-nombre-alleria.de", true },
{ "sin.swiss", true },
{ "sinaryuda.web.id", true },
@@ -34769,6 +35912,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sinonimosonline.com.br", true },
{ "sinquin.eu", true },
{ "sinronet.com", true },
+ { "sinsastudio.com", true },
{ "sint-joris.nl", true },
{ "sintaxis.org", true },
{ "sinterama.biz", true },
@@ -34776,7 +35920,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sinusitis-bronchitis.ch", true },
{ "sioeckes.hu", true },
{ "sion.info", true },
- { "sipstix.co.za", true },
{ "siratalmustaqim.com", true },
{ "siraweb.org", true },
{ "sirbouncealotcastles.co.uk", true },
@@ -34786,12 +35929,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sirena.co.jp", true },
{ "sirencallofficial.com", true },
{ "sirenslove.com", true },
+ { "sirihouse.com", true },
{ "siriuspup.com", true },
{ "sirtaptap.com", true },
{ "sirtuins.com", true },
{ "sirvoy.com", true },
+ { "siseministeerium.ee", true },
{ "sisiengineers.gq", true },
- { "sisseastumine.ee", true },
{ "sistel.es", true },
{ "sistem-maklumat.com", true },
{ "sistem-maklumat.com.my", true },
@@ -34805,7 +35949,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sit.ec", true },
{ "sitc.sk", true },
{ "site-helper.com", true },
- { "siteage.net", true },
+ { "site.pictures", true },
{ "sitebuilderreport.com", true },
{ "sitedrive.fi", true },
{ "sitefactory.com.br", true },
@@ -34817,21 +35961,23 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sitevandaag.nl", true },
{ "sitischu.com", true },
{ "sitiweb.nl", true },
+ { "sitz.ch", true },
{ "sivale.mx", true },
{ "sivyerge.com", true },
{ "siw64.com", true },
{ "six-o-one.com", true },
- { "sixcorners.info", true },
- { "sixcorners.net", true },
+ { "sixnines.net", true },
{ "sixpackholubice.cz", true },
- { "sixtwentyten.com", true },
+ { "sizzle.co.uk", true },
{ "sj-leisure.com", true },
{ "sjaakgilsingfashion.nl", true },
+ { "sjatsh.com", true },
{ "sjbwoodstock.org", true },
- { "sjd.is", true },
+ { "sjd.is", false },
{ "sjdaws.com", true },
{ "sjis.me", true },
{ "sjleisure.co.uk", true },
+ { "sjnp.org", true },
{ "sjoorm.com", true },
{ "sk-net.cz", true },
{ "skala.io", true },
@@ -34858,20 +36004,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "skhoop.cz", true },
{ "skia.org", false },
{ "skiblandford.com", true },
+ { "skid-berlin.de", true },
{ "skid.church", true },
{ "skiddle.com", true },
{ "skifairview.com", true },
{ "skifttiljutlanderbank.dk", true },
- { "skigebied.nl", true },
{ "skigebiete-test.de", true },
{ "skill.moe", true },
{ "skilletfood.com", true },
{ "skillled.com", true },
{ "skillmoe.at", true },
- { "skillout.org", true },
{ "skills2serve.org", true },
+ { "skills2services.com", true },
{ "skillseo.com", true },
+ { "skillside.net", true },
{ "skin-cosmetic.eu", true },
+ { "skinandglamour.com", true },
{ "skincare-note.com", true },
{ "skincases.co", true },
{ "skincontracts.co", true },
@@ -34881,18 +36029,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "skinmodo.com", true },
{ "skinpwrd.com", true },
{ "skins.net", true },
+ { "skinwhiteningoptions.com", true },
{ "skipfault.com", true },
{ "skippy.dog", true },
{ "skischule-wildewiese.de", true },
{ "skizzen-zeichnungen.de", true },
{ "skk.moe", true },
{ "skks.cz", true },
+ { "sklep-majster.pl", true },
{ "sklepsamsung.pl", true },
{ "sklepwielobranzowymd.com", true },
{ "sklotechnik.cz", true },
{ "sknclinics.co.uk", true },
{ "skogsbruket.fi", true },
{ "skogskultur.fi", true },
+ { "skoilly.cn", true },
{ "skol.bzh", true },
{ "skolagatt.is", true },
{ "skolakrizik.cz", true },
@@ -34901,7 +36052,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "skommettiamo.it", true },
{ "skontakt.cz", true },
{ "skontorp-enterprise.no", true },
- { "skorepova.info", true },
+ { "skoolergraph.azurewebsites.net", true },
+ { "skorpil.cz", true },
{ "skortekaas.nl", false },
{ "skory.us", true },
{ "skou.dk", false },
@@ -34913,13 +36065,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "skulblaka.ch", true },
{ "skuldwyrm.no", true },
{ "skutry-levne.cz", true },
- { "skutry.cz", true },
{ "skwile-cafe.com", true },
{ "skwitko.com", true },
{ "sky-coach.com", true },
{ "sky-coach.nl", true },
- { "sky-live.fr", true },
- { "skyanchor.com", true },
+ { "sky-live.fr", false },
+ { "skyautorental.com", true },
+ { "skybloom.com", false },
{ "skycmd.net", true },
{ "skyderby.ru", true },
{ "skydragoness.com", true },
@@ -34928,6 +36080,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "skyem.co.uk", true },
{ "skyfone.cz", true },
{ "skyger.cz", true },
+ { "skyingo.net", true },
{ "skylgenet.nl", true },
{ "skylightcreative.com.au", true },
{ "skylinertech.com", true },
@@ -34949,6 +36102,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "skyzimba.com.br", true },
{ "sl-bildermacher.de", true },
{ "sl-informatique.ovh", true },
+ { "sl0.us", true },
{ "sl899.com", true },
{ "sl998.com", true },
{ "slab.com", false },
@@ -34966,7 +36120,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "slashcrypto.org", true },
{ "slate.to", true },
{ "slatop.org", false },
- { "slaughter.com", true },
{ "slaughterhouse.fr", true },
{ "slavasveta.info", true },
{ "slaws.io", true },
@@ -34994,6 +36147,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "slink.hr", true },
{ "slip-gaming.tk", true },
{ "slneighbors.org", true },
+ { "slo-net.net", true },
{ "slo-tech.com", true },
{ "sloancom.com", true },
{ "slonep.net", true },
@@ -35006,15 +36160,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "slotlist.info", true },
{ "slow.zone", true },
{ "slowb.ro", true },
+ { "slowcookingperfected.com", true },
{ "slowgames.xyz", true },
{ "slpower.com", true },
{ "slrd-isperih.com", true },
{ "slt24.de", true },
{ "sluciaconstruccion.com", true },
+ { "sluhockey.com", true },
{ "sluimann.de", false },
- { "sluitkampzeist.nl", false },
{ "slunecnice.cz", true },
+ { "sluo.org", true },
{ "slusham.com", true },
+ { "slushpool.com", true },
{ "slvh.fr", true },
{ "slwilde.ca", true },
{ "slxh.eu", true },
@@ -35024,9 +36181,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sm.ms", true },
{ "sm2016.ch", true },
{ "sma-gift.com", true },
+ { "smaaker.com", true },
{ "smablo.com", true },
{ "smackhappy.com", true },
- { "smadav.ml", true },
{ "smakassen.no", true },
{ "smalldata.tech", true },
{ "smalldogbreeds.net", true },
@@ -35038,6 +36195,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "smaltimento.milano.it", true },
{ "smaltimento.napoli.it", true },
{ "smaltimento.roma.it", true },
+ { "smaltimentoamianto.campania.it", true },
{ "smaltimentoamianto.frosinone.it", true },
{ "smaltimentoamianto.latina.it", true },
{ "smaltimentorifiuti.firenze.it", true },
@@ -35045,6 +36203,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "smaltimentorifiuti.prato.it", true },
{ "smaltimentorifiuti.veneto.it", true },
{ "smares.de", true },
+ { "smarntrading.com", true },
{ "smart-cp.jp", true },
{ "smart-informatics.com", true },
{ "smart-media-gmbh.de", true },
@@ -35062,9 +36221,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "smartedg.io", true },
{ "smartfit.cz", true },
{ "smartftp.com", true },
+ { "smartgridsecurity.com", true },
+ { "smartgridsecurity.org", true },
{ "smarthdd.com", true },
{ "smarthinking.nl", true },
{ "smarthouse.de", true },
+ { "smartime.com.ar", true },
{ "smartjoin.style", true },
{ "smartlocksmith.com", true },
{ "smartlogreturns.com", true },
@@ -35073,8 +36235,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "smartmarketingcoaching.com", true },
{ "smartmeal.ru", true },
{ "smartmessages.net", true },
+ { "smartminibushire.co.uk", true },
{ "smartmomsmartideas.com", true },
{ "smartpass.government.ae", true },
+ { "smartphone-pliable.wtf", true },
{ "smartphonechecker.co.uk", true },
{ "smartphones-baratos.com", true },
{ "smartpolicingplatform.com", true },
@@ -35087,10 +36251,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "smartsparrow.com", true },
{ "smartthursday.hu", true },
{ "smartvideo.io", true },
- { "smartviewing.com", true },
{ "smartwank.com", true },
{ "smartweb.ge", true },
- { "smartwelve.com", true },
{ "smartwoodczech.cz", true },
{ "smartwurk.nl", false },
{ "smash-gg.club", true },
@@ -35115,19 +36277,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "smipty.com", true },
{ "smit.com.ua", true },
{ "smit.ee", true },
- { "smith.co", true },
+ { "smith.co", false },
{ "smithandcanova.co.uk", false },
{ "smithchow.com", true },
{ "smithchung.eu", true },
- { "smithfieldbaptist.org", true },
- { "smitug.pw", true },
+ { "smithfieldbaptist.org", false },
{ "smkw.com", false },
{ "smm.im", true },
- { "smmlaba.io", true },
{ "smokeandmirrors.agency", true },
{ "smokefree.gov", true },
{ "smokefreerowan.org", true },
{ "smokeus.dk", true },
+ { "smokingblendoils.com", true },
{ "smol.cat", true },
{ "smoo.st", true },
{ "smoothcomp.com", true },
@@ -35141,7 +36302,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "smorgasblog.ie", true },
{ "smow.com", true },
{ "smow.de", true },
- { "smplr.uk", true },
{ "sms.storage", true },
{ "smsappointment.com", true },
{ "smsben.net", true },
@@ -35150,7 +36310,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "smsinger.com", true },
{ "smsk.email", true },
{ "smsk.io", true },
- { "smskeywords.co.uk", true },
{ "smskmail.com", true },
{ "smsprivacy.org", true },
{ "smspujcka24.eu", true },
@@ -35177,12 +36336,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "snaptools.io", true },
{ "snargol.com", true },
{ "snatch.com.ua", true },
- { "snazel.co.uk", false },
{ "snazzie.nl", true },
{ "sncdn.com", true },
{ "sndbouncycastles.co.uk", true },
{ "sneak.berlin", true },
{ "sneakpod.de", true },
+ { "sneakycode.net", true },
{ "sneakynote.com", true },
{ "sneakypaw.com", true },
{ "sneberger.cz", false },
@@ -35200,6 +36359,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "snfdata.com", false },
{ "sngallery.co.uk", true },
{ "sngeo.com", true },
+ { "snh48live.org", true },
{ "sniderman.eu.org", true },
{ "sniderman.org", true },
{ "sniderman.us", true },
@@ -35241,6 +36401,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sntravel.co.uk", true },
{ "snuff.porn", true },
{ "snughealth.org.uk", true },
+ { "snus123.com", true },
+ { "snwsjz.com", true },
{ "sny.no", true },
{ "so-comm.fr", true },
{ "so.is-a-cpa.com", true },
@@ -35253,26 +36415,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sobersys.com", true },
{ "sobie.ch", true },
{ "sobieray.dyndns.org", true },
+ { "soblaznenie.ru", true },
+ { "soblaznenie2.ru", true },
{ "sobotkama.eu", true },
{ "sobreporcentagem.com", true },
{ "soccorso-stradale.org", true },
{ "sochi-sochno.ru", true },
+ { "sochic.in", true },
{ "sociability.dk", true },
{ "social-events.net", false },
{ "social-media-strategies.it", true },
- { "social-media-strategy.org.uk", true },
{ "social-work-colleges.com", true },
{ "socialhams.net", true },
- { "socializam.com", true },
{ "socialmarketingday.nl", true },
+ { "socialmedia-manager.gr", true },
{ "socialmedia.ro", true },
{ "socialnitro.com", true },
{ "socialnous.co", true },
{ "socialrank.com", true },
{ "socialsecurity.gov", false },
- { "socialstrata.com", true },
{ "socialtrends.pl", true },
{ "socialweblearning.com", true },
+ { "socialz.nl", true },
{ "societe-chablaisienne-de-revetements.com", true },
{ "societe-chablaisienne-de-revetements.fr", true },
{ "societyhilldance.com", true },
@@ -35282,10 +36446,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sociopathy.org", true },
{ "sockeye.io", true },
{ "sockscap64.com", true },
+ { "socoastal.com", true },
{ "sodadigital.com.au", true },
{ "sodafilm.de", true },
{ "sodexam.pro", true },
{ "sodi.nl", true },
+ { "sodiao.cc", true },
{ "sodomojo.com", true },
{ "soe-server.com", true },
{ "sofa-rockers.org", true },
@@ -35302,6 +36468,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "softart.club", true },
{ "softballrampage.com", true },
{ "softblinds.co.uk", true },
+ { "softcreatr.com", true },
{ "softcreatr.de", false },
{ "softfay.com", true },
{ "softonic.com", true },
@@ -35314,7 +36481,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "softsecmatheodexelle.be", true },
{ "softtennis-zenei.com", true },
{ "softw.net", true },
- { "software.rocks", true },
+ { "software-search.com", true },
{ "softwarebetrieb.de", true },
{ "softwarebeveiligingtestdomein.be", true },
{ "softwaredesign.foundation", false },
@@ -35335,7 +36502,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sokolkarvina.cz", true },
{ "sokouchousa.net", true },
{ "sol-computers.es", true },
- { "sol.works", true },
{ "sol24.net", true },
{ "solacyre.ch", true },
{ "solanum-games.com", true },
@@ -35354,6 +36520,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sole-software.de", true },
{ "sole.gmbh", true },
{ "soledadpenades.com", true },
+ { "solemare-hotel.it", true },
{ "solentbasketball.co.uk", true },
{ "solentbubblesandbounce.co.uk", true },
{ "solepurposetest.com", true },
@@ -35377,7 +36544,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "solomo.pt", true },
{ "solonotizie24.it", true },
{ "solos.im", true },
- { "soloshu.co", true },
{ "solsocog.de", false },
{ "soluphant.de", true },
{ "solutionhoisthire.com.au", true },
@@ -35401,12 +36567,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "somethingsketchy.net", true },
{ "sommefeldt.com", true },
{ "somoshuemul.cl", true },
- { "somosnoticia.com.br", true },
{ "sompani.com", true },
{ "somuchbetterwithage.com", true },
{ "somweyr.de", true },
{ "sona-gaming.com", true },
{ "sonacupalova.cz", true },
+ { "sonaraamat.com", true },
{ "sonarqube.com", false },
{ "sonavankova.cz", true },
{ "sondergaard.de", true },
@@ -35418,7 +36584,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "songsmp3.io", true },
{ "songsmp3.live", true },
{ "songsmp3.me", true },
- { "songsmp3.net", true },
{ "songsthatsavedyourlife.com", true },
{ "songtianyi.com", true },
{ "songzhuolun.com", true },
@@ -35437,7 +36602,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sooscreekdental.com", true },
{ "soph.jp", true },
{ "soph.us", true },
- { "sopher.io", true },
{ "sophiaandmatt.co.uk", true },
{ "sophiakligys.com", true },
{ "sophieandtrey.com", true },
@@ -35452,7 +36616,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sorellecollection.com.au", true },
{ "soren.xyz", true },
{ "sorenstudios.com", true },
- { "sorever.online", true },
{ "sorincocorada.ro", true },
{ "sorrowfulunfounded.com", true },
{ "sortesim.com.br", true },
@@ -35464,7 +36627,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sos-idraulico.it", true },
{ "sos-muratore.it", true },
{ "sosoftplay.co.uk", true },
- { "sospromotions.com.au", true },
{ "sostacancun.com", true },
{ "sosteam.jp", true },
{ "sosteric.si", true },
@@ -35473,6 +36635,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sotadb.info", true },
{ "sotai.tk", true },
{ "sotar.us", true },
+ { "sotayhoctap.com", true },
{ "sotoasobi.net", true },
{ "sotthewes.nl", true },
{ "sou-co.jp", true },
@@ -35530,16 +36693,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "southside-tuning-day.de", true },
{ "southsidebargaincenter.com", true },
{ "southwaymotors.com", true },
+ { "southwesteventhire.co.uk", true },
{ "southwestrda.org.uk", true },
{ "souyidai.com", true },
- { "soved.eu", true },
{ "sovendus.com", true },
{ "sovendus.de", true },
+ { "sovereignpcs.com", true },
{ "sowlutions.com", true },
{ "soybase.org", true },
{ "soydemac.com", true },
- { "soz6.com", true },
{ "sozai-good.com", true },
+ { "sozialstation-ritterhude.de", true },
{ "sozialy.com", true },
{ "sozon.ca", true },
{ "sp-sites.com.au", true },
@@ -35554,6 +36718,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "spacehighway.ms", true },
{ "spacehost.de", true },
{ "spacestation13.com", true },
+ { "spaceunique.de", true },
{ "spacinov.com", true },
{ "spacivox.com", true },
{ "spackova.cz", true },
@@ -35563,7 +36728,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "spakhmer.com", true },
{ "spakurort.eu", true },
{ "spaldingwall.com", true },
+ { "spalnobelyo.com", true },
{ "spamdrain.com", true },
+ { "spanch.cf", true },
{ "spanda.io", true },
{ "spanjeflydrive.nl", true },
{ "spanner.works", true },
@@ -35578,10 +36745,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sparkz.no", true },
{ "sparprofi.at", true },
{ "sparta-en.org", true },
- { "sparta-solutions.de", true },
{ "spartaconsulting.fi", true },
{ "spartacuslife.com", true },
{ "spartaermelo.nl", true },
+ { "sparumzuege.de", true },
{ "sparxsolutions.be", true },
{ "spasicilia.it", true },
{ "spatzenwerkstatt.de", true },
@@ -35597,22 +36764,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "speak-polish.com", true },
{ "speakingdiligence.com", true },
{ "spearfishingmx.com", true },
- { "speargames.net", true },
+ { "speargames.net", false },
{ "specdrones.us", true },
{ "specialized-hosting.eu", true },
{ "specialproperties.com", true },
{ "specialtyalloys.ca", true },
{ "speciesism.com", true },
- { "spectroom.space", true },
{ "spectrum.gov", true },
{ "spediscifiori.com", true },
- { "spedition-transport-umzug.de", true },
{ "speech-balloon.com", true },
{ "speechdrop.net", true },
{ "speechmate.com", true },
{ "speechmore.ml", true },
{ "speechndraw.com", true },
{ "speeddate.it", false },
+ { "speeder.im", true },
{ "speedof.me", true },
{ "speedracer.ca", true },
{ "speedsportofhull.co.uk", true },
@@ -35635,11 +36801,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "spero.solutions", true },
{ "sperrstun.de", true },
{ "spesys-services.fr", true },
- { "spha.info", true },
+ { "spewingmews.moe", true },
{ "sphere-realty.com", true },
- { "sphereblur.com", true },
{ "spherenix.org", true },
- { "sphido.org", true },
+ { "sphido.org", false },
{ "spicejungle.com", true },
{ "spicydog.org", true },
{ "spicymatch.com", true },
@@ -35647,6 +36812,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "spidernet.tk", true },
{ "spideroak.com", true },
{ "spiders.org.ua", true },
+ { "spiegel21.de", true },
{ "spielezar.ch", true },
{ "spielland.ch", true },
{ "spiellawine.de", true },
@@ -35667,8 +36833,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "spinspin.wtf", true },
{ "spira-group.eu", true },
{ "spira.kiev.ua", true },
- { "spiralschneiderkaufen.de", true },
{ "spirella-shop.ch", true },
+ { "spirit-hunters-germany.de", false },
{ "spirit55555.dk", true },
{ "spiritual.dating", true },
{ "spiritualife.net", true },
@@ -35679,7 +36845,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "spittank.info", true },
{ "spittersberger.recipes", true },
{ "splarty.net", true },
- { "splendidspoon.com", true },
{ "splendorservizi.it", true },
{ "splikity.com", true },
{ "splintermail.com", true },
@@ -35693,7 +36858,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "spokaneexteriors.com", true },
{ "spokanepolebuildings.com", true },
{ "spoluck.ca", true },
- { "spolwind.de", true },
{ "spom.net", true },
{ "sponc.de", true },
{ "spongepowered.org", true },
@@ -35706,6 +36870,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "spoorcam.nl", true },
{ "sporcard.com", true },
{ "spornkuller.de", true },
+ { "sport-decouverte.com", true },
{ "sport-in-sundern.de", true },
{ "sport-potreby.cz", true },
{ "sport-potreby.sk", true },
@@ -35714,6 +36879,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sportakrobatik.at", true },
{ "sportbetuwe.nl", true },
{ "sporter.com", true },
+ { "sportmundschutz-info.de", true },
{ "sportnesia.com", true },
{ "sportovnidum.cz", true },
{ "sportparks.com", true },
@@ -35731,10 +36897,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sportwetten-anbieter.de", true },
{ "sportxt.ru", true },
{ "spot-lumiere-led.com", true },
+ { "spotfake.news", true },
{ "spotrebitelskecentrum.sk", true },
{ "spotswoodvet.com", true },
{ "spottedpenguin.co.uk", true },
+ { "spotterpix.de", true },
{ "spotupload.com", true },
+ { "spotypal.com", true },
{ "sppin.fr", true },
{ "sprachfreudehoch3.de", true },
{ "sprax2013.de", true },
@@ -35748,6 +36917,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "springerundpartner.de", true },
{ "springfieldbricks.com", true },
{ "springhillmaine.com", true },
+ { "springtxcarpetcleaning.com", true },
{ "sprinklermanohio.com", true },
{ "spritmonitor.de", true },
{ "spritsail.io", true },
@@ -35767,15 +36937,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "spufpowered.com", true },
{ "spunkt.fr", true },
{ "spur.com.br", true },
- { "sputnik1net.org", true },
{ "spydar007.com", true },
{ "spydar007.net", true },
{ "spydersec.com", true },
{ "spyprofit.ru", true },
{ "spyroszarzonis.com", true },
+ { "sqills.com", true },
{ "sql-und-xml.de", true },
+ { "sql.bi", true },
{ "sqlapius.net", true },
+ { "sqlbi.com", true },
{ "sqlfeatures.com", true },
+ { "sqprod.co", true },
{ "sqr-training.com", true },
{ "sqroot.eu", true },
{ "sqsd.xyz", true },
@@ -35784,7 +36957,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "square.com", false },
{ "squareup.com", false },
{ "squawk.cc", true },
- { "squeakql.online", true },
{ "squeezemetrics.com", true },
{ "squido.ch", true },
{ "squidparty.com", true },
@@ -35818,15 +36990,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ss64.org", true },
{ "ss88.uk", true },
{ "ssa.gov", false },
+ { "ssab.gov", true },
{ "ssbgportal.net", true },
{ "ssbkk.ru", true },
{ "ssbrm.ch", true },
{ "sscd.no", true },
- { "ssdax.com", false },
- { "ssdservers.co.uk", true },
+ { "ssdax.com", true },
{ "ssenberg.nl", true },
{ "ssh-keys.online", true },
{ "ssh-vault.com", true },
+ { "sshx.top", true },
{ "ssky.cn", true },
{ "ssl-zertifikate.de", true },
{ "ssl.do", true },
@@ -35841,7 +37014,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ssl888.com", true },
{ "sslbrain.com", true },
{ "sslcertificaten.nl", true },
- { "sslcertificateshop.com", true },
{ "sslcheck.nl", true },
{ "ssldecoder.org", true },
{ "ssldev.net", true },
@@ -35871,6 +37043,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "st-news.de", true },
{ "st-shakyo.jp", true },
{ "st-steuern.de", true },
+ { "st-tir-pln.fr", true },
{ "staatschutz.at", true },
{ "staatsschutz.at", true },
{ "staatsschutzgesetz.at", true },
@@ -35899,10 +37072,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stageirites.com", true },
{ "stageirites.fr", true },
{ "stageirites.org", true },
- { "stahlfors.com", true },
+ { "stahlfeuer-ofenwerkstatt.de", true },
{ "stainedglass.net.au", true },
{ "stainternational.com", true },
- { "stair.ch", true },
{ "stairfallgames.com", true },
{ "stairlin.com", true },
{ "staklim-malang.info", true },
@@ -35917,9 +37089,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stameystreet.com", true },
{ "stamkassa.nl", true },
{ "stammtisch.domains", true },
- { "stamonicatourandtravel.com", true },
{ "stamparmakarije.me", true },
- { "stampederadon.com", true },
{ "stampsbar.co.uk", true },
{ "standagainstspying.org", true },
{ "standard.co.uk", true },
@@ -35933,20 +37103,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stanthonymaryclaret.org", true },
{ "staparishgm.org", true },
{ "star-clean.it", true },
+ { "star.garden", true },
{ "star.watch", true },
{ "starcoachservices.ca", true },
{ "starcomproj.com", true },
{ "stardanceacademy.net", true },
+ { "starease.com", true },
+ { "starease.net", true },
{ "stareplanymiast.pl", true },
{ "starflix.uk", true },
{ "starfm.de", true },
+ { "starfriend.ru", true },
{ "stargarder-jungs.de", true },
+ { "stargate365.com", true },
{ "stargatelrp.co.uk", true },
{ "stargazer.de", true },
{ "starina.ru", true },
{ "starka.st", true },
{ "starkbim.com", true },
- { "starking.net.cn", true },
{ "starlim.co.in", true },
{ "starlim.org", true },
{ "starmtech.fr", true },
@@ -35956,7 +37130,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "starsam80.net", true },
{ "starsguru.com", true },
{ "starsing.bid", true },
- { "starskim.cn", true },
{ "starstreak.net", false },
{ "startaninflatablebusiness.com", true },
{ "startanull.ru", true },
@@ -36029,6 +37202,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "steamtrades.com", true },
{ "steamwhale.com", true },
{ "stebet.net", true },
+ { "steborio.pw", true },
{ "stedb.eu", true },
{ "stedbg.net", true },
{ "steef389.eu", true },
@@ -36050,6 +37224,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stefanvanburen.xyz", true },
{ "stefanvd.net", true },
{ "stefany.eu", true },
+ { "steffenmeister.com", true },
{ "steffentreeservice.com", true },
{ "stefpastoor.nl", true },
{ "stegmaier-immobilien.de", true },
@@ -36079,10 +37254,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stephaniedeady.ie", true },
{ "stephanieschreiber.com", true },
{ "stephansurgicalarts.com", true },
- { "stephencreilly.com", true },
{ "stephenhaunts.com", true },
{ "stephenhorler.com.au", true },
{ "stephenj.co.uk", true },
+ { "stephenjvoiceovers.com", true },
{ "stephenperreira.com", true },
{ "stephenreescarter.com", true },
{ "stephenreescarter.net", true },
@@ -36133,17 +37308,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stevenroddis.com", true },
{ "stevens.se", false },
{ "steventress.com", true },
+ { "steventruesdell.com", true },
{ "stevenwooding.com", true },
- { "stevenz.net", true },
{ "stevenz.science", true },
- { "stevenz.xyz", true },
{ "stevesdrivingschooltyneside.com", true },
+ { "stevezheng.cf", true },
+ { "stevezheng.tk", true },
{ "stewartswines.com", true },
{ "stewpolley.com", false },
{ "steyaert.be", false },
{ "stforex.com", false },
{ "stfrancisnaugatuck.org", true },
{ "stfw.info", true },
+ { "stgabrielavondalepa.org", true },
{ "stgabrielstowepa.org", true },
{ "stgeorgecomfortinn.com", true },
{ "stgeorgegolfing.com", true },
@@ -36158,10 +37335,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stickandpoketattookit.com", true },
{ "stickeramoi.com", true },
{ "stickergiant.com", true },
+ { "stickerparadise.me", true },
{ "stickertuningfetzt.de", true },
{ "stickies.io", true },
{ "stickmanventures.com", true },
{ "stickstueb.de", true },
+ { "stiebel.co.nz", true },
+ { "stiebel.com.au", true },
+ { "stiebelmedia.co.nz", true },
+ { "stiebelmedia.com.au", true },
+ { "stiebelservice.com.au", true },
+ { "stiebelstore.com.au", true },
{ "stift-kremsmuenster.at", true },
{ "stiftemaskinen.no", true },
{ "stigharder.com", true },
@@ -36176,13 +37360,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stimmgabel.lu", true },
{ "stin.hr", true },
{ "stinaspiegelberg.com", true },
- { "stinsky.com", true },
{ "stintup.com", true },
{ "stipsan.me", true },
{ "stirblaut.de", true },
{ "stirling.co", true },
{ "stirlingpoon.com", true },
- { "stisaac.org", true },
{ "stisidores.org", true },
{ "stitchfiddle.com", true },
{ "stitchinprogress.com", true },
@@ -36199,6 +37381,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stjustin.org", true },
{ "stkevin-stbenedict.org", true },
{ "stln.ml", true },
+ { "stlouisinsuranceco.com", true },
{ "stlu.de", true },
{ "stlukenh.org", true },
{ "stlukesbrandon.org", true },
@@ -36219,6 +37402,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stneotsbouncycastlehire.co.uk", true },
{ "stnevis.ru", true },
{ "stockpile.com", true },
+ { "stockportpyramid.co.uk", true },
{ "stockrow.com", true },
{ "stockstuck.com", true },
{ "stocktout.info", true },
@@ -36226,8 +37410,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stocp.org", true },
{ "stodieck.com", true },
{ "stoebermehl.at", true },
+ { "stoerevrouwensporten.nl", true },
{ "stoffelnet.de", true },
- { "stogiesandmash.com", true },
{ "stokvistrading.nl", true },
{ "stolin.info", true },
{ "stolina.de", false },
@@ -36240,6 +37424,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stonechatjewellers.ie", true },
{ "stonedworms.de", true },
{ "stoneedgeconcrete.com", true },
+ { "stonegateapartmentsstl.com", true },
{ "stonehammerhead.org", true },
{ "stonehurstcap.com", true },
{ "stonewuu.com", true },
@@ -36263,6 +37448,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "storycollective.nl", true },
{ "storyland.ie", true },
{ "storysift.news", true },
+ { "storytea.top", true },
{ "storytell.com", true },
{ "storytime.hu", true },
{ "stouter.nl", true },
@@ -36273,6 +37459,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stpatricks-pelham.com", true },
{ "stpaulcatholicchurcheastnorriton.net", true },
{ "str8hd.com", true },
+ { "str92.com", true },
{ "straatderzotten.nl", true },
{ "strafensau.de", true },
{ "strafvollzugsgesetze.de", true },
@@ -36283,9 +37470,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "strandom.ru", true },
{ "strandschnuppern.de", true },
{ "strangelane.com", true },
- { "strangemusicinc.com", true },
{ "strangemusicinc.net", true },
- { "strangeways.ca", true },
+ { "strangeways.ca", false },
{ "straphael-holyangels.com", true },
{ "strate.io", true },
{ "strategiccapital.com", true },
@@ -36313,15 +37499,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "streetspotr.com", true },
{ "streetview.wien", true },
{ "strefapi.com", true },
- { "streklhof.at", true },
{ "stremio.com", true },
+ { "strengthinyoufitness.com", true },
{ "strengthroots.com", true },
+ { "stretchmarkdestroyer.com", true },
{ "stretchmyan.us", true },
+ { "stretchpc.com", true },
{ "striata.com", true },
{ "striatadev.com", true },
{ "stricted.net", true },
{ "strictlyguitar.de", true },
{ "strijkshop.be", true },
+ { "stringbeanstudio.com", true },
{ "stringtoolbox.com", true },
{ "stringvox.com", true },
{ "stripe.com", true },
@@ -36343,7 +37532,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "strongpassword.club", true },
{ "strongrandom.com", false },
{ "strongsalpinesucculents.com", true },
- { "strongtowerpc.com", true },
{ "stroomacties.nl", true },
{ "strosemausoleum.com", true },
{ "stroseoflima.com", true },
@@ -36383,12 +37571,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "studenttenant.com", true },
{ "studiebegeleiding-haegeman.be", true },
{ "studienportal.eu", true },
- { "studienservice.de", true },
{ "studio-637.com", true },
{ "studio-architetto.com", true },
- { "studio-art.pro", true },
{ "studio-fotografico.ru", true },
{ "studio-happyvalley.com", true },
+ { "studio-n.pl", true },
{ "studio44.fit", true },
{ "studioadevents.com", true },
{ "studioavvocato24.it", true },
@@ -36405,7 +37592,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "studiomarcella.com", true },
{ "studionowystyl.pl", true },
{ "studiopirrate.com", true },
- { "studiopop.com.br", true },
{ "studioproapp.com", true },
{ "studioriehl.com", true },
{ "studioscherp.nl", true },
@@ -36419,13 +37605,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "studipro-marketing.fr", true },
{ "studisys.net", true },
{ "studium.cz", true },
+ { "studlan.no", true },
{ "studyin.jp", true },
{ "studyspy.ac.nz", true },
{ "studytactics.com", true },
- { "stuermer.me", true },
{ "stuetzredli.ch", true },
{ "stuffi.fr", true },
- { "stuffie.org", true },
+ { "stuffie.org", false },
+ { "stuffiwouldbuy.com", false },
{ "stuka-art.de", true },
{ "stulda.cz", false },
{ "stumeta.de", true },
@@ -36444,6 +37631,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "stuvus.uni-stuttgart.de", true },
{ "stw-group.at", true },
{ "stygium.net", false },
+ { "stylaq.com", true },
{ "stylebajumuslim.com", true },
{ "styleci.io", true },
{ "stylecollective.us", true },
@@ -36468,8 +37656,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "subohm.com", true },
{ "suborbital.io", true },
{ "subrosr.com", true },
- { "subsistence.wiki", true },
{ "substitutealert.com", true },
+ { "subtitry.ru", true },
{ "suburban-landscape.net", true },
{ "suburbaninfinitioftroyparts.com", true },
{ "subversive-tech.com", true },
@@ -36478,15 +37666,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "succesprojekter.dk", true },
{ "successdeliv.com", true },
{ "suche.org", true },
+ { "suchem.com", true },
{ "suchmaschinen-werkstatt.de", true },
{ "suckmyan.us", false },
{ "sucretown.net", true },
{ "sud66.com", true },
+ { "sudanindependent.com", true },
{ "sudaraka.org", true },
{ "sudmotor-occasions.be", true },
{ "sudo-i.net", true },
{ "sudo.li", true },
- { "sudo.org.au", true },
{ "sudo.ws", true },
{ "sudokian.io", true },
{ "sudoschool.com", true },
@@ -36499,6 +37688,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sugarandcloth.com", true },
{ "sugarbrother.com", true },
{ "sugarfactory.cz", true },
+ { "sugarhillsfarm.com", true },
{ "sugarlandkarate.net", true },
{ "sugarmillmanagement.com", true },
{ "sugarshin.net", true },
@@ -36522,11 +37712,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "suluvir.com", true },
{ "sumguy.com", true },
{ "summa.eu", false },
+ { "summerbo.at", true },
{ "summercampthailand.com", true },
{ "summershomes.com", true },
- { "sumthing.com", true },
- { "sunboxstore.jp", true },
+ { "sun-wellness-online.com.vn", true },
{ "sunbritetv.com", true },
+ { "sunbury.xyz", true },
{ "sunchasercats.com", true },
{ "sundanceusa.com", true },
{ "sundayfundayjapan.com", true },
@@ -36535,9 +37726,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sunfiregold.com", true },
{ "sunflyer.cn", false },
{ "sunfox.cz", true },
- { "sunfulong.blog", true },
- { "sunfulong.me", true },
{ "sungreen.info", true },
+ { "sunhaoxiang.net", true },
{ "sunjaydhama.com", true },
{ "sunjiutuo.com", true },
{ "sunlit.cloud", true },
@@ -36546,6 +37736,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sunnylyx.com", true },
{ "sunnysidechurchofchrist.org", true },
{ "sunoikisis.org", true },
+ { "sunplay.host", true },
{ "sunred.info", true },
{ "sunred.org", true },
{ "sunsetwx.com", true },
@@ -36555,6 +37746,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sunstar.bg", true },
{ "sunwolf.studio", true },
{ "suool.net", true },
+ { "suourl.com", true },
{ "supa.sexy", true },
{ "supastuds.com", true },
{ "supcoronado.com", true },
@@ -36576,19 +37768,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "superdaddy.club", true },
{ "superdroni.com", true },
{ "supereight.net", true },
+ { "superenduro.net", true },
{ "superguide.com.au", true },
{ "superhappiness.com", true },
{ "superhome.com.au", true },
{ "superidropulitrice.com", true },
+ { "superlandnetwork.de", true },
{ "supermae.pt", true },
{ "supermarx.nl", true },
- { "supermercadosdia.com.ar", true },
+ { "supermercadosdia.com.ar", false },
{ "supermercato24.it", true },
- { "supermil.ch", true },
{ "supern0va.net", true },
{ "supernaut.info", true },
{ "supernt.lt", true },
- { "supersec.es", true },
{ "supersole.net", true },
{ "supersonnig-festival.de", true },
{ "supersonnigfestival.de", true },
@@ -36610,7 +37802,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "support.mayfirst.org", false },
{ "supportdesk.nu", true },
{ "supportericking.org", true },
- { "supportme123.com", true },
{ "supra.tf", true },
{ "supracube.com", true },
{ "suprem.biz", true },
@@ -36619,8 +37810,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "supriville.com.br", true },
{ "sur-v.com", true },
{ "surao.cz", true },
+ { "surasak.io", true },
{ "surasak.net", true },
{ "surasak.org", true },
+ { "surdam.casa", true },
{ "sure-it.de", true },
{ "surefit-oms.com", true },
{ "suretone.co.za", true },
@@ -36636,10 +37829,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "surreyheathyc.org.uk", true },
{ "suruifu.com", true },
{ "survature.com", true },
- { "surveillance104.com", true },
{ "surveyhealthcare.com", true },
{ "surveymill.co.uk", true },
{ "survivalmonkey.com", true },
+ { "survivebox.fr", true },
{ "susanbpilates.co", true },
{ "susanbpilates.com", true },
{ "susann-kerk.de", true },
@@ -36654,8 +37847,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sussexheart.com", true },
{ "sustainabilityknowledgegroup.com", true },
{ "sustainoss.org", true },
+ { "sustc.ac.cn", true },
{ "sustsol.com", true },
{ "sutas.market", true },
+ { "suts.co.uk", true },
{ "suttacentral.net", true },
{ "suurhelsinki.cf", true },
{ "suuria.de", true },
@@ -36666,6 +37861,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "suzukimarinepress.com", true },
{ "sv-1966-medenbach.de", false },
{ "sv-bachum-bergheim.de", true },
+ { "sv-schody.cz", true },
{ "sv-turm-hohenlimburg.de", true },
{ "sv.search.yahoo.com", false },
{ "svager.cz", true },
@@ -36682,12 +37878,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "svdb.co", false },
{ "svdreamcatcher.com", true },
{ "sveinerik.org", true },
+ { "svendubbeld.nl", true },
{ "sveneckelmann.de", true },
{ "svenjaundchristian.de", true },
{ "svenluijten.com", false },
{ "svenmuller.nl", true },
{ "svennd.be", true },
+ { "svenrath.de", true },
{ "svetandroida.cz", true },
+ { "svetila.com", true },
{ "svetlilo.com", true },
{ "svht.nl", true },
{ "svijet-medija.hr", true },
@@ -36705,7 +37904,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "swap.gg", true },
{ "swapadoodle.com", true },
{ "swaptaxdata.com", true },
- { "swarfarm.com", true },
+ { "swarlys-server.de", true },
{ "swarovski-lov.cz", true },
{ "swat4stats.com", true },
{ "swattransport.ae", true },
@@ -36713,24 +37912,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "swd.agency", true },
{ "swe77.com", true },
{ "swe777.com", true },
- { "sweak.net", true },
{ "swedishhost.com", true },
{ "swedishhost.se", true },
{ "sweep-me.net", true },
{ "sweepay.ch", true },
+ { "sweepy.pw", true },
{ "sweet-as.co.uk", true },
{ "sweet-orr.com", true },
{ "sweet-spatula.com", true },
{ "sweetair.com", true },
{ "sweetbridge.com", true },
+ { "sweetenedcondensed.com", true },
{ "sweetgood.de", true },
{ "sweethomesnohomishrenovations.com", true },
{ "sweets-mimatsu.com", true },
+ { "sweetydecor.ru", true },
{ "sweharris.org", true },
{ "swerve-media-testbed-03.co.uk", true },
{ "swetrust.com", true },
+ { "swey.net", true },
{ "swfmax.com", true },
{ "swiftcashforcars.com.au", true },
+ { "swifteh.net", true },
{ "swiftpcbassembly.com", true },
{ "swiftqueue.com", true },
{ "swilly.org", true },
@@ -36739,6 +37942,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "swimwear365.co.uk", true },
{ "swineson.me", true },
{ "swing-belleville.de", true },
+ { "swingerclub.in", true },
{ "swingmonkey.com", true },
{ "swipetv.ie", true },
{ "swiss-apartments.com", true },
@@ -36749,6 +37953,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "swissdojo.ch", true },
{ "swisselement365.com", true },
{ "swissfreshaircan.ch", true },
+ { "swissfreshaircan.com", true },
{ "swissid.ch", true },
{ "swisslinux.org", true },
{ "swisstechassociation.ch", true },
@@ -36758,14 +37963,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "switch.moe", true },
{ "switcheo.exchange", true },
{ "switcheo.rocks", true },
- { "switzerland-family-office.com", true },
{ "swivells.com", true },
{ "swkdevserver.tk", true },
{ "swktestserver.tk", true },
{ "swn-nec.de", true },
{ "swordfeng.xyz", true },
{ "swqa.hu", true },
- { "swuosa.org", false },
+ { "swrpgitems.com", true },
{ "swvaux.com", true },
{ "swxtd.com", true },
{ "swyn.net", true },
@@ -36773,9 +37977,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sxistolithos.gr", true },
{ "sy-anduril.de", true },
{ "sy24.ru", true },
- { "syajvo.if.ua", true },
+ { "syajvo.if.ua", false },
{ "syakonavi.com", true },
- { "syamutodon.xyz", true },
{ "sycamorememphis.org", true },
{ "sychov.pro", true },
{ "sydney-sehen.com", true },
@@ -36793,6 +37996,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sylvaindurand.fr", true },
{ "sylvaindurand.org", true },
{ "sylvaloir.fr", true },
+ { "sylvan.me", true },
{ "sylve.ch", true },
{ "sym01.com", true },
{ "symb.ch", true },
@@ -36818,9 +38022,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sync-it.no", true },
{ "synccentre.com", true },
{ "syncflare.com", true },
- { "synchrocube.com", true },
{ "synchrolarity.com", true },
- { "synchronicity.cz", true },
{ "synchronyse.com", true },
{ "synchtu.be", false },
{ "syncrise.co.jp", true },
@@ -36846,6 +38048,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "sysctl.se", true },
{ "sysdb.io", true },
{ "sysdot.blog", true },
+ { "syskit.com", true },
{ "syslogic.io", true },
{ "sysmike.de", true },
{ "systea.fr", true },
@@ -36858,11 +38061,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "systemadmin.uk", true },
{ "systematic-momo.com", true },
{ "systematic-momo.dk", true },
- { "systemchile.com", true },
+ { "systemctl.io", true },
{ "systemd.ch", true },
{ "systemd.eu.org", true },
{ "systemeprod.fr", true },
{ "systemintegra.ru", true },
+ { "systemisbusy.info", true },
{ "systemli.org", true },
{ "systemonthego.com", true },
{ "systemreboot.net", true },
@@ -36873,7 +38077,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "systoolbox.net", true },
{ "sysystems.cz", true },
{ "syt3.net", true },
- { "syukatsu-net.jp", true },
+ { "syunpay.cn", true },
{ "syy.im", true },
{ "syzygy-tables.info", true },
{ "sz-ideenlos.de", true },
@@ -36881,19 +38085,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "szafkirtv.pl", true },
{ "szaloneigly.com", true },
{ "szamitogepdepo.com", true },
+ { "szasz.me", true },
{ "szaydon.me", false },
{ "szc.me", true },
{ "szclsya.me", true },
{ "szechenyi2020.hu", true },
{ "szentistvanpt.sk", true },
{ "szepsegbennedrejlik.hu", true },
- { "szerelem.love", true },
+ { "szeptylasu.eu", true },
{ "szeretekvajpolni.hu", true },
- { "szetowah.org.hk", true },
{ "szunia.com", true },
{ "szybkiebieganie.pl", true },
{ "szyndler.ch", true },
- { "szzsivf.com", true },
{ "t-hawk.com", true },
{ "t-m.me", true },
{ "t-net.org.hu", true },
@@ -36904,10 +38107,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "t12u.com", true },
{ "t23m-navi.jp", false },
{ "t2i.nl", true },
+ { "t3rror.net", true },
{ "t47.io", true },
{ "t4c.link", true },
{ "t4cc0.re", true },
- { "t5118.com", true },
{ "t7e.de", false },
{ "t9i.in", true },
{ "ta-65.com", true },
@@ -36916,6 +38119,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "taabe.net", true },
{ "taalcursusvolgen.nl", true },
{ "taartbesteld.nl", true },
+ { "taartenfeesies.nl", true },
{ "tabarnak.ga", true },
{ "tabernadovinho.com.br", true },
{ "tabi-news.com", true },
@@ -36935,6 +38139,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tacklinglife.com", true },
{ "tacklog.com", true },
{ "tacomafia.net", true },
+ { "tacticalavocado.com", true },
{ "tacticalsquare.com", true },
{ "taddiestales.com", true },
{ "tadeo.ca", true },
@@ -36950,11 +38155,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "taglioepiega.com", true },
{ "taglioepiega.eu", true },
{ "taglioepiega.it", true },
+ { "tagnull.de", true },
{ "tagpay.com", true },
{ "tagungsraum-usedom.de", true },
{ "tagungsraum-zinnowitz.de", true },
{ "tahavu.com", true },
{ "taherian.me", true },
+ { "tahmintr.com", true },
{ "tahosa.co", true },
{ "tahosalodge.org", true },
{ "tailpuff.net", false },
@@ -36982,6 +38189,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "takeshifujimoto.com", false },
{ "takk.pl", true },
{ "takkaaaaa.com", true },
+ { "tako-miyabi.xyz", true },
{ "takuhai12.com", true },
{ "takumi-s.net", true },
{ "takuto.de", true },
@@ -36993,6 +38201,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "talentos.pt", true },
{ "talentwall.io", true },
{ "taler.net", true },
+ { "talichi.com", true },
{ "talideon.com", false },
{ "talk.google.com", true },
{ "talkgadget.google.com", true },
@@ -37000,43 +38209,49 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "talkingmoose.net", true },
{ "talkreal.net", true },
{ "talktech.com", true },
- { "talktobot.com", true },
{ "talktodarcy.com", true },
{ "talkwithyourbaby.org", true },
{ "tallcraft.com", true },
{ "talldude.net", true },
{ "tallinnsec.ee", true },
{ "tallinnsex.ee", true },
+ { "tallship.cz", true },
{ "talltreeskv.com.au", true },
{ "tallyfy.com", true },
{ "talon.rip", true },
+ { "talroo.com", true },
{ "talun.de", true },
{ "tam-moon.com", true },
{ "tam-safe.com", true },
+ { "tamada.expert", true },
{ "tamaraboutique.com", true },
+ { "tamarimolhem.com", true },
{ "tamashimx.net", true },
{ "tamasszabo.net", true },
+ { "tambayology.com", true },
{ "tambre.ee", true },
{ "tamchunho.com", true },
{ "tamersunion.org", true },
{ "tamindir.com", true },
- { "tamirson.com", true },
{ "tammy.pro", true },
{ "tampabaybusinesslistings.com", true },
{ "tamposign.fr", true },
{ "tamriel-rebuilt.org", true },
{ "tanacio.com", true },
{ "tanak3n.xyz", false },
+ { "tanchynski.com", true },
{ "tancredi.nl", true },
+ { "tandartszilverschoon.nl", true },
{ "tandem-trade.ru", false },
{ "tandemexhibits.com", true },
{ "tandempartnerships.com", true },
- { "tandk.com.vn", true },
{ "tandzorg.link", true },
{ "tangel.me", true },
{ "tangemann.org", true },
+ { "tangledmeditations.com", true },
{ "tango-ouest.com", true },
{ "tangoalpha.co.uk", true },
+ { "tanhit.com", true },
{ "taniafitness.co.uk", true },
{ "taniafitness.com", true },
{ "tanie-uslugi-ksiegowe.pl", true },
@@ -37050,7 +38265,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tansuya.jp", true },
{ "tantalos.nl", true },
{ "tantei100.net", true },
- { "tanto259.name", false },
+ { "tantetilli.de", false },
+ { "tanto259.name", true },
{ "tanyanama.com", true },
{ "tanz-kreativ.de", true },
{ "tanz.info", true },
@@ -37058,12 +38274,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tanzo.io", true },
{ "taoburee.com", true },
{ "taotuba.org", true },
+ { "taowa.ca", true },
{ "taoways.com", true },
{ "taplamvan.net", true },
{ "taplemon.at", true },
{ "taplemon.com", true },
{ "taprix.org", true },
- { "tapsnapp.co", true },
{ "taquilla.com", true },
{ "tar-mag.com", true },
{ "taranis.re", true },
@@ -37077,8 +38293,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tariff.cc", true },
{ "tarik.io", true },
{ "tarmexico.com", true },
- { "taron.top", true },
- { "tarot-cartas.com", true },
{ "tarsan.cz", true },
{ "tartaneagle.org.uk", true },
{ "tartanhamedshop.com.br", true },
@@ -37104,7 +38318,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tatara.ne.jp", true },
{ "tateesq.com", true },
{ "tatildukkani.com", true },
- { "tatiloley.com", true },
+ { "tatler.com", true },
{ "tatsidou.gr", true },
{ "tattoo.dating", true },
{ "tattvaayoga.com", true },
@@ -37116,6 +38330,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tax-guard.com", true },
{ "taxaroo.com", true },
{ "taxaudit.com", true },
+ { "taxhawk.com", true },
{ "taxi-chamonix.fr", true },
{ "taxi-collectif.ch", true },
{ "taxi-jihlava.cz", true },
@@ -37125,13 +38340,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "taxid-k.be", true },
{ "taxis-collectifs.ch", true },
{ "taxisafmatosinhos.pt", true },
+ { "taxisantapolagranalacant.com", true },
{ "taxiscollectifs.ch", true },
{ "taxlab.co.nz", true },
{ "taxo.fi", true },
{ "taxpackagesupport.com", true },
{ "taxsquirrel.com", true },
{ "taylorpearson.me", false },
- { "taylorreaume.com", true },
{ "taylors-castles.co.uk", true },
{ "taylorstauss.com", true },
{ "taysonvodao.fr", true },
@@ -37145,6 +38360,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tbrindus.ca", true },
{ "tbs-certificates.co.uk", true },
{ "tbspace.de", true },
+ { "tbtech.cz", true },
{ "tbuchloh.de", true },
{ "tc-st-leonard.ch", true },
{ "tc.nz", true },
@@ -37153,7 +38369,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tcb-b.org", true },
{ "tccmb.com", true },
{ "tcdw.net", true },
- { "tcdww.cn", true },
{ "tcf.org", true },
{ "tcgforum.pl", true },
{ "tcgrepublic.com", true },
@@ -37163,6 +38378,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tchnics.de", true },
{ "tchoukball.ch", true },
{ "tcit.fr", true },
+ { "tcl.sh", true },
{ "tcmwellnessclinic.com", true },
{ "tcnapplications.com", true },
{ "tcpweb.net", true },
@@ -37170,6 +38386,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tcvvip.com", true },
{ "tcwis.com", true },
{ "tdchrom.com", true },
+ { "tddos.pw", true },
{ "tdfbfoundation.org", true },
{ "tdrcartuchos.com.br", true },
{ "tdro.cf", true },
@@ -37177,9 +38394,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tdsf.io", true },
{ "tdsinflatables.co.uk", true },
{ "tdude.co", true },
- { "tea.codes", true },
{ "tea.in.th", true },
- { "teabagdesign.co.uk", true },
{ "teachbiz.net", true },
{ "teachercreatedmaterials.com", true },
{ "teacherph.com", true },
@@ -37194,14 +38409,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "teachwithouttears.com", true },
{ "teahut.net", true },
{ "team-azerty.com", true },
+ { "team-bbd.com", true },
{ "team.house", true },
{ "team3482.com", true },
{ "teambeam.at", true },
{ "teambeam.ch", true },
{ "teambeam.com", true },
{ "teambeam.de", true },
+ { "teambim.eu", true },
{ "teambition.com", true },
- { "teambodyproject.com", true },
{ "teamcombat.com", true },
{ "teamliquidpro.com", true },
{ "teammateworld.com", true },
@@ -37221,6 +38437,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "teamupturn.org", true },
{ "teamusec.de", true },
{ "tearoomlints.be", true },
+ { "tease.email", true },
{ "teaser-trailer.com", true },
{ "teatrarium.com", true },
{ "teb-akademia.pl", true },
@@ -37244,6 +38461,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "techamigo.in", true },
{ "techarea.fr", true },
{ "techaulogy.com", true },
+ { "techbelife.com", true },
{ "techbrown.com", true },
{ "techcracky.com", true },
{ "techcultivation.de", false },
@@ -37259,11 +38477,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "techinet.pl", true },
{ "techinsurance.com", true },
{ "techjoe.co", true },
+ { "techlr.de", true },
{ "techmagus.icu", true },
{ "techmajesty.com", true },
{ "techmasters.io", true },
{ "techmoviles.com", true },
{ "techmunchies.net", false },
+ { "techni-grav.com", true },
{ "technic3000.com", true },
{ "technicabv.nl", true },
{ "technicalbrothers.cf", true },
@@ -37282,10 +38502,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "technologyhound.org", true },
{ "technologysi.com", true },
{ "technoparcepsilon.fr", true },
+ { "technorely.com", true },
{ "technoscoots.com", true },
{ "technosorcery.net", true },
{ "technospeakco.com", true },
- { "techold.ru", true },
{ "techorbiter.com", true },
{ "techosmarcelo.com.ar", true },
{ "techpilipinas.com", true },
@@ -37300,10 +38520,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "techtalks.no", true },
{ "techtrader.ai", true },
{ "techtrader.io", true },
+ { "techusers.de", true },
{ "techview.link", true },
{ "techviewforum.com", true },
{ "techwayz.com", true },
- { "techwithcromulent.com", true },
+ { "techwords.io", true },
{ "techzero.cn", true },
{ "teckids.org", true },
{ "tecma.com", true },
@@ -37317,6 +38538,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tecnogaming.com", true },
{ "tecnogazzetta.it", true },
{ "tecnologiasurbanas.com", true },
+ { "tecnosa.es", true },
{ "tecon.co.at", true },
{ "tecyt.com", true },
{ "ted.do", true },
@@ -37326,9 +38548,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "teddylu.info", true },
{ "teddyss.com", false },
{ "tedsdivingsystem.com", true },
- { "tedxodense.com", true },
- { "teebeedee.org", false },
- { "teedb.de", true },
+ { "tedxyalesecondaryschool.com", true },
+ { "teektalk.org", true },
{ "teemo.gg", true },
{ "teemperor.de", true },
{ "teemulintula.fi", true },
@@ -37351,6 +38572,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tekno.de", true },
{ "teknoforums.com", true },
{ "teknolit.com", true },
+ { "teknoroit.com", true },
{ "tekstschrijvers.net", true },
{ "tekuteku.jp", true },
{ "telamon.eu", true },
@@ -37370,6 +38592,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "telefoon.nl", true },
{ "telefoonabonnement.nl", true },
{ "telegenisys.com", true },
+ { "telegra.ph", true },
{ "telegram.org", true },
{ "telegramdr.com", true },
{ "telehealthventures.com", false },
@@ -37377,7 +38600,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "teleogistic.net", true },
{ "telepass.me", true },
{ "telephonedirectories.us", true },
- { "telesto.online", true },
{ "teletechnology.in", false },
{ "teletexto.com", true },
{ "telework.gov", true },
@@ -37391,11 +38613,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tellyourtale.com", true },
{ "teloo.pl", true },
{ "telos-analytics.com", true },
+ { "telsu.fi", true },
{ "teltru.com", true },
{ "tem.li", true },
{ "temariopolicianacional.es", true },
{ "temariosdeoposiciones.es", true },
- { "temasa.net", true },
{ "tematicas.org", true },
{ "temdu.com", true },
{ "temizmama.com", true },
@@ -37408,9 +38630,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "templates-office.com", true },
{ "templum.com.br", true },
{ "tenable.com.au", true },
- { "tenberg.com", true },
{ "tenbos.ch", true },
{ "tendance-et-accessoires.com", true },
+ { "tende.roma.it", true },
{ "tendermaster.com.ua", true },
{ "tenderplan.ru", true },
{ "tenderstem.co.uk", true },
@@ -37434,31 +38656,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tenzer.dk", true },
{ "teoleonie.com", true },
{ "tepautotuning.com", true },
- { "tepid.org", true },
{ "tepitus.de", true },
{ "teplofom.ru", true },
{ "teplomash24.ru", true },
{ "tequilazor.com", true },
{ "terabyte.services", true },
- { "terabyteharddrive.net", true },
{ "terabyteit.co.uk", true },
{ "teracloud.at", true },
{ "teranacreative.com", true },
{ "teriiphotography.com", true },
{ "teriyakisecret.com", true },
{ "terlindung.com", true },
+ { "terminalvelocity.co.nz", true },
{ "termino.eu", true },
{ "terminsrakning.se", true },
{ "termitemounds.org", true },
{ "termitinitus.org", true },
{ "termografiranje.si", true },
{ "termux.com", true },
- { "terpotiz.net", true },
{ "terra.fitness", true },
{ "terrab.de", false },
{ "terracloud.de", false },
{ "terraelectronica.ru", true },
- { "terrafinanz.de", true },
{ "terraform.io", true },
{ "terragni-sarasin.ch", true },
{ "terrainator.com", true },
@@ -37485,21 +38704,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tesoro.pr", true },
{ "tessai.ga", true },
{ "tesseractinitiative.org", true },
+ { "test-greavesindia.pantheonsite.io", true },
{ "test-sev-web.pantheonsite.io", true },
{ "test-textbooks.com", true },
{ "test.de", true },
{ "test.support", true },
+ { "testeri.fi", true },
{ "testeveonline.com", true },
{ "testgeomed.ro", true },
+ { "testingbot.com", true },
{ "testomato.com", true },
{ "testoon.com", true },
- { "testosteronedetective.com", true },
{ "testsuite.org", true },
{ "testsvigilantesdeseguridad.es", true },
{ "testuje.net", true },
{ "tetedelacourse.ch", true },
{ "teto.nu", true },
{ "tetraetc.com", true },
+ { "tetragir.com", true },
{ "tetraktus.org", true },
{ "tetrarch.co", true },
{ "tetsugakunomichi.jp", true },
@@ -37551,12 +38773,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tgb.org.uk", true },
{ "tgbyte.de", true },
{ "tgexport.eu", true },
- { "tgmkanis.com", true },
{ "tgtv.tn", true },
{ "tgui.eu", true },
{ "tgui.net", true },
{ "tgw.com", true },
{ "tgwork.com", true },
+ { "th-music-finder.com", true },
{ "th.search.yahoo.com", false },
{ "thablubb.de", true },
{ "thaedal.net", true },
@@ -37575,7 +38797,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thalhammer.it", true },
{ "thalia.nu", true },
{ "thaliagetaway.com.au", true },
- { "thallinger.me", true },
{ "thambaru.com", true },
{ "thamesfamilydentistry.com", true },
{ "thamtubinhminh.com", true },
@@ -37586,33 +38807,42 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thatquiz.org", true },
{ "thatsme.io", true },
{ "thca.ca", true },
+ { "thcdev.de", true },
{ "thcpbees.co.uk", true },
{ "the-arabs.com", true },
{ "the-bermanns.com", true },
{ "the-big-bang-theory.com", true },
{ "the-body-shop.hu", false },
+ { "the-digitale.com", false },
{ "the-fermenter.com", true },
{ "the-gdn.net", true },
{ "the-hemingway-code.de", true },
+ { "the-jeuxflash.com", true },
{ "the-mystery.org", true },
{ "the-nash-education-program.com", true },
{ "the-pack.nl", true },
{ "the-pcca.org", true },
+ { "the-train.de", true },
{ "the-webmaster.com", true },
{ "the-woods.org.uk", true },
{ "the-zenti.de", true },
{ "the2f.de", true },
{ "the3musketeers.biz", true },
{ "the8rules.co.uk", true },
+ { "thea-team.net", true },
{ "theactuary.ninja", true },
{ "theadelaideshow.com.au", true },
{ "theadultswiki.com", true },
{ "theafleo.gq", true },
+ { "theagencywithoutaname.com", true },
{ "thealexandertechnique.co.uk", true },
{ "theallmanteam.com", true },
- { "theankhlife.com", true },
+ { "thealonas.ml", true },
{ "theanticellulitediet.com", true },
+ { "theappliancedepot.co.uk", true },
{ "theaps.net", true },
+ { "theasianshooter.com", true },
+ { "theasianshooters.com", true },
{ "theastrocoach.com", true },
{ "theatre-schools.com", true },
{ "theazoorsociety.org", true },
@@ -37626,7 +38856,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thebeachessportsphysio.com", true },
{ "thebeardedrapscallion.com", true },
{ "thebeginningviolinist.com", true },
- { "thebest.ch", true },
{ "thebestfun.co.uk", true },
{ "thebestofthesprings.com", true },
{ "thebestpersonin.ml", true },
@@ -37637,6 +38866,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thebikeinsurer.co.uk", true },
{ "thebimhub.com", true },
{ "thebinarys.com", true },
+ { "thebirchwoods.com", true },
{ "thebirthdaysite.co.uk", true },
{ "thebit.link", true },
{ "theblackknightsings.com", true },
@@ -37644,6 +38874,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "theblueroofcottage.ca", true },
{ "thebluub.com", true },
{ "theboatmancapital.com", true },
+ { "theboats.agency", true },
+ { "theboats.club", true },
+ { "theboats.com", true },
+ { "theboats.de", true },
+ { "theboats.online", true },
+ { "theboats.pro", true },
+ { "theboats.site", true },
{ "thebodyprinciple.com", true },
{ "thebonerking.com", true },
{ "thebouncedepartment.co.uk", true },
@@ -37656,14 +38893,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thebusinessofgoodfilm.com", true },
{ "thecamels.org", true },
{ "thecameradivision.com", true },
+ { "thecandyjam.com", true },
{ "thecarolingconnection.com", true },
{ "thecellulitediet.com", true },
+ { "thechavs.xyz", true },
{ "thecherryship.ch", true },
{ "thechunk.net", true },
{ "thecitywarehouse.clothing", true },
{ "thecloudshelter.com", true },
{ "thecoffeecamp.com", true },
- { "thecoffeesuperstore.com", true },
{ "thecolumnist.net", true },
{ "thecompany.pl", true },
{ "theconcordbridge.azurewebsites.net", true },
@@ -37672,6 +38910,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thecrazytravel.com", true },
{ "thecrescentchildcarecenter.com", true },
{ "thecrew-exchange.com", true },
+ { "thecskr.in", true },
{ "thecstick.com", true },
{ "thecuppacakery.co.uk", true },
{ "thecuriousdev.com", true },
@@ -37679,8 +38918,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thecustomdroid.com", true },
{ "theda.co.za", true },
{ "thedark1337.com", true },
- { "thedebug.life", true },
{ "thederminstitute.com", true },
+ { "thedermreport.com", true },
{ "thedhs.com", true },
{ "thediamondcenter.com", true },
{ "thedisc.nl", true },
@@ -37695,26 +38934,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "theeducationchannel.info", true },
{ "theeducationdirectory.org", true },
{ "theeffingyogablog.com", true },
- { "theeighthbit.com", true },
+ { "theeighthbit.com", false },
+ { "theel0ja.info", true },
{ "theel0ja.ovh", true },
{ "theemasphere.com", true },
{ "theender.net", true },
{ "theepiclounge.com", true },
{ "theeverycompany.com", true },
- { "theeyeopener.com", true },
{ "thefairieswantmedead.com", true },
{ "thefanimatrix.net", true },
{ "thefashionpolos.com", true },
+ { "thefasterweb.com", true },
{ "thefbstalker.com", true },
{ "thefengshuioffice.com", true },
{ "theferrarista.com", true },
{ "thefilmphotography.com", true },
{ "theflowerbasketonline.com", true },
{ "theflowershopdeddington.com", true },
+ { "theflyingbear.net", true },
{ "thefnafarchive.org", true },
{ "theforkedspoon.com", true },
- { "thefourthmoira.com", true },
{ "thefreemail.com", true },
+ { "thefriedzombie.com", true },
{ "thefrk.pw", true },
{ "thefuckingtide.com", true },
{ "thefunfirm.co.uk", true },
@@ -37724,9 +38965,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thegatheringocala.com", true },
{ "thegeekdiary.com", true },
{ "thegerwingroup.com", true },
+ { "theghostlytavern.com", true },
+ { "thegioidulich.com.vn", true },
{ "thegioinano.com", true },
- { "thegospelforgeeks.org", true },
{ "thegrape.ro", true },
+ { "thegreatcommissionpodcast.com", true },
{ "thegreatpakistan.com", true },
{ "thegreatplains.com", true },
{ "thegreenfields.se", true },
@@ -37745,11 +38988,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thehomeicreate.com", true },
{ "thehonorguard.org", true },
{ "thehookup.be", true },
- { "thehoryzon.com", true },
{ "thehotfix.net", true },
{ "thehotness.tech", true },
{ "thehouseofgod.org.nz", true },
- { "thehowtohome.com", true },
{ "thehub.ai", true },
{ "theideaskitchen.com.au", true },
{ "theidiotboard.com", true },
@@ -37774,7 +39015,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thelaimlife.com", true },
{ "thelanscape.com", true },
{ "thelastbeach.top", true },
- { "thelastsurprise.com", true },
{ "thelatedcult.com", true },
{ "thelearningenterprise.co.uk", true },
{ "thelegionshirley.co.uk", true },
@@ -37785,12 +39025,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thelocals.ru", true },
{ "thelonelyones.co.uk", true },
{ "thelonious.nl", true },
+ { "thelounge.chat", true },
{ "themacoaching.nl", true },
- { "themadlabengineer.co.uk", true },
{ "themallards.info", true },
{ "themarshallproject.org", true },
{ "themecraft.studio", true },
{ "themefoxx.com", true },
+ { "themerchandiser.net", true },
{ "themeridianway.com", true },
{ "themetacity.com", true },
{ "themiddle.co", true },
@@ -37799,7 +39040,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "themillerslive.com", true },
{ "themimitoof.fr", true },
{ "themist.cz", true },
- { "themobilestuffs.com", true },
{ "themoep.at", true },
{ "themoneyconverter.com", true },
{ "themonkeytrail.co.uk", true },
@@ -37807,9 +39047,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "themostexpensiveworkofart.com", true },
{ "themusecollaborative.org", true },
{ "themusicinnoise.net", true },
- { "thenanfang.com", true },
{ "theneatgadgets.com", true },
{ "thenerdic.com", true },
+ { "thenetw.org", true },
{ "thenexwork.com", true },
{ "thenib.com", true },
{ "theninenine.com", true },
@@ -37825,7 +39065,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "theodorahome.com.br", true },
{ "theofleck.com", true },
{ "theokouzelis.com", true },
- { "theoldbrewhouse.info", true },
{ "theonethaimassage.de", true },
{ "theoriginalbit.com", true },
{ "theory-test-online.co.uk", true },
@@ -37846,9 +39085,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thephp.cc", true },
{ "thepieslicer.com", true },
{ "thepiratesociety.org", true },
- { "theplaidpoodle.com", true },
{ "theplasticsurgerycenterofnashville.com", true },
- { "theplaydaysbus.co.uk", true },
{ "theplayspot.co.uk", true },
{ "theploughharborne.co.uk", true },
{ "thepoplarswines.com.au", true },
@@ -37872,6 +39109,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "therevenge.me", true },
{ "therhetorical.ml", true },
{ "thermalbad-therme.de", true },
+ { "thermia.co.nz", true },
+ { "thermia.com.au", true },
{ "thermity.com", true },
{ "thermolamina.nl", true },
{ "thermorecetas.com", true },
@@ -37882,23 +39121,26 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "theruizes.com", true },
{ "theruleslawyer.net", true },
{ "therumfordcitizen.com", true },
+ { "thesage.cf", true },
{ "thesalonthing.com", false },
+ { "thesanta.biz", true },
{ "thesarogroup.com", true },
{ "thesaturdaypaper.com.au", true },
{ "thesaurus.net", true },
{ "theschool.jp", true },
{ "thescientists.nl", true },
- { "thesearchenginepros.com", true },
{ "thesecondsposts.com", false },
{ "theseed.io", true },
{ "theseedbox.xyz", true },
{ "theseletarmall.com", true },
{ "theseoframework.com", true },
+ { "theseoplatform.co.uk", true },
{ "theseosystem.com", true },
+ { "theserviceyouneed.com", true },
{ "thesession.org", false },
+ { "thesetwohands864.com", true },
{ "thesharedbrain.ch", true },
{ "thesharedbrain.com", true },
- { "thesharepointfarm.com", true },
{ "theshield.in", true },
{ "theshine.pl", true },
{ "theshopally.com", false },
@@ -37928,6 +39170,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thesuppercircle.com", true },
{ "theswissbay.ch", true },
{ "theteacherscorner.net", true },
+ { "thetechbasket.com", true },
{ "thetechnical.me", true },
{ "thetenscrolls.com", true },
{ "thethreepercent.marketing", true },
@@ -37950,7 +39193,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thevgg.com", false },
{ "thevisasofoz.com", true },
{ "thevoya.ga", true },
- { "thevyra.com", true },
{ "thewagesroom.co.uk", true },
{ "thewarrencenter.org", true },
{ "thewaxhouse.academy", true },
@@ -37963,7 +39205,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thewhitneypaige.com", true },
{ "thewinstonatlyndhurst.com", true },
{ "thewoodkid.com.au", true },
- { "thewoolroom.com.au", true },
{ "theworld.tk", true },
{ "theworldbattle.com", true },
{ "theworldexchange.com", true },
@@ -37992,13 +39233,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thijsslop.nl", true },
{ "thijsvanderveen.net", true },
{ "thinegen.de", true },
+ { "thing.vn", true },
{ "thingies.site", true },
{ "thingsimplied.com", true },
{ "thingsof.org", true },
{ "think-asia.org", true },
{ "think-pink.info", true },
{ "think-positive-watches.de", true },
- { "thinkforwardmedia.com", true },
{ "thinkheaddesign.com", true },
{ "thinkindifferent.net", true },
{ "thinkingandcomputing.com", true },
@@ -38019,11 +39260,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thisfreelife.gov", true },
{ "thisisgrey.com", true },
{ "thisishugo.com", true },
+ { "thisistechtoday.com", true },
{ "thisisthefinalact.com", true },
{ "thisistheserver.com", true },
{ "thisiswhywemom.com", true },
{ "thismatter.com", true },
- { "thisoldearth.com", true },
{ "thisserver.dontexist.net", true },
{ "thistleandleaves.com", true },
{ "thitruongsi.com", true },
@@ -38031,7 +39272,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thole.org", true },
{ "thom4s.info", true },
{ "thomalaudan.de", true },
- { "thomas-bertran.com", true },
{ "thomas-fahle.de", true },
{ "thomas-klubert.de", true },
{ "thomas-prior.com", true },
@@ -38050,7 +39290,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thomashunter.name", false },
{ "thomaskaviani.be", true },
{ "thomasmcfly.com", true },
- { "thomasmeester.nl", false },
{ "thomasmerritt.de", true },
{ "thomassen.sh", true },
{ "thomasstevensmusic.com", true },
@@ -38061,13 +39300,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thomien.de", true },
{ "thompsonfamily.cloud", true },
{ "thomsonscleaning.co.uk", true },
- { "thomspooren.nl", true },
{ "thomwiggers.nl", true },
{ "thor.edu", true },
{ "thor.re", true },
- { "thoroquel.org", true },
{ "thoroughbreddiesel.com", true },
- { "thorsten-schaefer.com", true },
+ { "thorshammare.com", true },
+ { "thorshammare.org", true },
+ { "thorshammare.se", true },
+ { "thorsten-schaefer.com", false },
{ "thorstenschaefer.name", true },
{ "thosci.com", true },
{ "thotpublicidad.com", true },
@@ -38081,6 +39321,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thousandoakslandscapelighting.com", true },
{ "thousandoakslighting.com", true },
{ "thousandoaksoutdoorlighting.com", true },
+ { "thoxyn.com", true },
{ "thpay.com", true },
{ "threatcon.io", true },
{ "threatmarket.com", true },
@@ -38089,7 +39330,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "threecrownsllp.com", true },
{ "threedpro.me", true },
{ "threefantasy.com", true },
- { "threefours.net", true },
+ { "threefours.net", false },
{ "threelions.ch", true },
{ "threema.ch", true },
{ "threexxx.ch", true },
@@ -38105,6 +39346,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "throwaway.link", true },
{ "throwpass.com", true },
{ "thrush.com", true },
+ { "thrx.net", true },
{ "thues.eu", true },
{ "thuisverpleging-meerdael.be", true },
{ "thullbery.com", true },
@@ -38113,30 +39355,29 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "thunderkeys.net", true },
{ "thundr.eu", true },
{ "thunraz.com", true },
+ { "thurn.net", true },
{ "thusoy.com", true },
{ "thuthuatios.com", true },
{ "thuviensoft.com", true },
- { "thuybich.com", false },
+ { "thuybich.com", true },
{ "thw-bernburg.de", true },
{ "thxandbye.de", true },
{ "thycotic.ru", true },
+ { "thymiaturtle.de", true },
{ "thyngster.com", true },
- { "thzone.net", true },
+ { "thynx.io", true },
{ "ti-pla.net", true },
{ "ti-planet.org", true },
{ "tiagonunes.pt", true },
{ "tiaki.org", true },
{ "tianeptine.com", true },
- { "tianshili.me", true },
{ "tiantangbt.com", true },
{ "tibicinagarricola.com", true },
{ "tibipg.com", true },
{ "tibovanheule.space", true },
- { "ticfleet.com", true },
{ "tichieru.pw", true },
{ "ticketassist.nl", true },
{ "ticketdriver.com", true },
- { "ticketluck.com", true },
{ "ticketmaze.com", true },
{ "ticketpro.ca", false },
{ "ticketrunway.com", true },
@@ -38157,7 +39398,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tiens-ib.cz", true },
{ "tier-1-entrepreneur.com", true },
{ "tierarztpraxis-bogenhausen.de", true },
+ { "tierarztpraxis-illerwinkel.de", true },
{ "tierarztpraxis-weinert.de", true },
+ { "tieronegraphics.com", true },
{ "tierraprohibida.net", true },
{ "ties.com", true },
{ "tiew.pl", true },
@@ -38168,6 +39411,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tigerdile.com", true },
{ "tigernode.com", true },
{ "tigernode.net", true },
+ { "tigerscu.org", true },
{ "tiggeriffic.com", true },
{ "tiglitub.com", true },
{ "tiihosen.fi", true },
@@ -38212,6 +39456,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "timeauction.hk", true },
{ "timebox.tk", true },
{ "timebutler.de", true },
+ { "timecd.cn", true },
{ "timeglass.de", true },
{ "timeless-photostudio.com", true },
{ "timelessskincare.co.uk", true },
@@ -38223,7 +39468,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "timfiedler.net", true },
{ "timi-matik.hu", true },
{ "timing.com.br", true },
- { "timjk.de", true },
+ { "timjk.de", false },
{ "timmersgems.com", true },
{ "timmyrs.de", true },
{ "timnash.co.uk", true },
@@ -38247,9 +39492,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tinf15b4.de", true },
{ "tinfoilsecurity.com", false },
{ "tinfoleak.com", true },
- { "tinker.career", true },
+ { "tinhchattrangda.vn", true },
{ "tinkerbeast.com", true },
- { "tinkererstrunk.co.za", true },
{ "tinkertry.com", true },
{ "tinlc.org", true },
{ "tinte24.de", true },
@@ -38267,6 +39511,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tinytownsoftplay.co.uk", true },
{ "tinyvpn.net", true },
{ "tinyvpn.org", true },
+ { "tio.run", true },
{ "tioat.net", true },
{ "tipaki.gr", true },
{ "tipbox.is", true },
@@ -38301,6 +39546,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "titanwaterproofing.com.au", true },
{ "titelseite.ch", true },
{ "titiansgirlphotography.com", true },
+ { "titli.fr", true },
{ "titouan.co", false },
{ "tittelbach.at", true },
{ "titusetcompagnies.net", true },
@@ -38334,12 +39580,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tloxygen.com", true },
{ "tls-proxy.de", true },
{ "tls.care", true },
- { "tls1914.org", true },
{ "tlsrobot.se", true },
{ "tlthings.net", true },
{ "tlumaczenie.com", true },
{ "tlyphed.net", true },
{ "tlys.de", true },
+ { "tm-t.ca", true },
{ "tm80plus.com", true },
{ "tmakiguchi.org", true },
{ "tmas.dk", true },
@@ -38351,6 +39597,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tmc.com.mt", true },
{ "tmcpromotions.co.uk", true },
{ "tmcreationweb.com", true },
+ { "tmd.cool", true },
{ "tmdb.biz", true },
{ "tmdc.ddns.net", true },
{ "tmf.ru", true },
@@ -38370,6 +39617,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tnl.cloud", true },
{ "tntmobi.com", true },
{ "tny.link", true },
+ { "to-riktari.gr", true },
{ "toad.ga", true },
{ "toast.al", false },
{ "tob-rulez.de", true },
@@ -38377,6 +39625,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tobedo.net", true },
{ "tober-cpag.de", true },
{ "tobi-mayer.de", true },
+ { "tobi-server.goip.de", true },
+ { "tobiaalberti.com", true },
{ "tobias-bauer.de", true },
{ "tobias-haenel.de", true },
{ "tobias-kleinmann.de", true },
@@ -38406,6 +39656,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tobyx.com", true },
{ "tobyx.de", true },
{ "tobyx.eu", true },
+ { "tobyx.is", true },
{ "tobyx.net", true },
{ "tobyx.org", true },
{ "tocaro.im", true },
@@ -38418,6 +39669,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "todaymeow.com", true },
{ "toddfry.com", true },
{ "toddmath.com", true },
+ { "todo-anime.com", true },
{ "todoereaders.com", true },
{ "todoescine.com", true },
{ "todoist.com", true },
@@ -38452,9 +39704,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tokka.com", true },
{ "tokke.dk", true },
{ "tokkee.org", true },
+ { "tokky.eu", true },
+ { "tokoplugin.com", true },
{ "tokototech.com", true },
{ "tokugai.com", true },
- { "tokumei.co", true },
{ "tokyo-onkyo.jp", true },
{ "tokyo-powerstation.com", true },
{ "tokyo.dating", true },
@@ -38462,11 +39715,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tokyomakino.com", true },
{ "tokyovipper.com", true },
{ "tolboe.com", true },
+ { "toldositajuba.com", true },
{ "toleressea.fr", true },
{ "toles-sur-mesure.fr", true },
{ "tolle-wolke.de", true },
{ "tollerunterricht.com", true },
- { "tollfreeproxy.com", true },
{ "tom-geiger.de", true },
{ "tom-kunze.de", true },
{ "tom-kurka.cz", true },
@@ -38485,7 +39738,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tomatenaufdenaugen.de", true },
{ "tomatis-nantes.com", true },
{ "tomaw.net", true },
+ { "tomaz.eu", true },
{ "tombaker.me", true },
+ { "tomberek.info", true },
{ "tombroker.org", true },
{ "tombrossman.com", true },
{ "tomd.ai", true },
@@ -38499,9 +39754,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tomik.cloud", true },
{ "tomjans.nl", true },
{ "tomjn.com", true },
- { "tomjonsson.se", true },
{ "tomkunze.de", true },
- { "tomkwok.com", true },
{ "tomli.blog", true },
{ "tomlowenthal.com", true },
{ "tomm.yt", true },
@@ -38509,6 +39762,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tommy-bordas.fr", false },
{ "tomnatt.com", true },
{ "tomo.gr", false },
+ { "tomorrowmuseum.com", true },
{ "tomosm.net", true },
{ "tomravinmd.com", true },
{ "tomrei.com", true },
@@ -38524,14 +39778,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tomvote.com", true },
{ "tomwassenberg.com", true },
{ "tomwassenberg.nl", true },
- { "tomwiggers.nl", false },
{ "tomwilson.io", true },
{ "tomyork.net", true },
{ "tonabor.ru", true },
{ "tonage.de", true },
{ "toncusters.nl", true },
{ "tondles.com", true },
- { "tone.tw", true },
{ "tonegidoarchief.nl", true },
{ "toner24.at", true },
{ "toner24.co.uk", true },
@@ -38549,6 +39801,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tonermonster.de", true },
{ "tonex.de", true },
{ "tonex.nl", true },
+ { "tongli.eu.org", true },
{ "tonifarres.net", true },
{ "tonigallagherinteriors.com", true },
{ "tonkayagran.com", true },
@@ -38562,7 +39815,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tonsit.org", true },
{ "tontonnews.net", true },
{ "tonyarcieri.com", true },
- { "tonymanning.com", false },
+ { "tonymanning.com", true },
{ "tonytan.cn", true },
{ "tonytan.io", true },
{ "tonytron.com.br", true },
@@ -38593,9 +39846,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tooti.biz", true },
{ "top-obaly.cz", true },
{ "top-opakowania.pl", true },
- { "top-solar-info.de", true },
{ "top4shop.de", true },
{ "top5hosting.co.uk", true },
+ { "top6casinos.com", true },
{ "top9.fr", true },
{ "topaxi.ch", true },
{ "topaxi.codes", true },
@@ -38618,7 +39871,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "topicit.net", true },
{ "topirishcasinos.com", true },
{ "topjobs.ch", true },
- { "topkek.ml", true },
{ "toplist.cz", true },
{ "toplist.eu", true },
{ "toplist.sk", true },
@@ -38627,23 +39879,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "toponlinecasinosites.co.uk", true },
{ "toppercan.es", true },
{ "topprice.ua", true },
- { "topsailtechnologies.com", true },
{ "topservercccam.tv", true },
{ "topshelfcommercial.com", true },
- { "topshoptools.com", true },
{ "topsteaks-daun.de", true },
{ "toptec.net.br", true },
{ "toptexture.com", true },
{ "toptheto.com", true },
{ "topvision.se", true },
{ "topwindowcleaners.co.uk", true },
+ { "topwoodltd.co.uk", true },
{ "topworktops.co.uk", true },
+ { "topyachts.com.ua", true },
{ "toracon.org", true },
- { "torahanytime.com", true },
{ "torchantifa.org", true },
{ "toreni.us", true },
{ "toretame.jp", true },
- { "torfbahn.de", true },
{ "torg-room.ru", true },
{ "torkware.com", true },
{ "torlock.com", true },
@@ -38672,7 +39922,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "torrentfunk.pw", true },
{ "torrentfunk2.com", true },
{ "torrentpier.me", true },
- { "torrentz2.al", true },
{ "torresygutierrez.com", true },
{ "torretzalam.com", true },
{ "torservers.net", true },
@@ -38687,7 +39936,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "toschool.com.br", true },
{ "toshen.com", true },
{ "toshkov.com", true },
- { "toskana-appartement.de", false },
{ "tosolini.info", true },
{ "tosostav.cz", true },
{ "tosteberg.se", true },
@@ -38724,6 +39972,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "touhou.fm", true },
{ "touhouwiki.net", true },
{ "toujours-actif.com", true },
+ { "toulineprestige.com", true },
{ "tounyou-raku.com", true },
{ "tourgest.net", true },
{ "tourify.me", true },
@@ -38752,12 +40001,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "toutvendre.pics", true },
{ "toutvendre.uk", true },
{ "toutvendre.us", true },
+ { "tovaglioli-di-carta.it", true },
{ "tovare.com", true },
{ "toverland-tickets.nl", true },
+ { "tovp.org", true },
{ "towandalibrary.org", true },
{ "tower.land", true },
{ "townandcountryus.com", true },
- { "townhousedevelopments.com.au", true },
{ "townhouseregister.com.au", true },
{ "townofbridgewater.ca", true },
{ "towsonroofers.com", true },
@@ -38772,15 +40022,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tp-kabushiki.com", true },
{ "tp-kyouyufudousan.com", true },
{ "tp-law.jp", true },
- { "tpansino.com", true },
{ "tpbproxy.co", true },
{ "tpci.biz", true },
{ "tpidg.us", true },
{ "tpolemis.com", true },
{ "tpp.chat", true },
{ "tppleague.me", false },
+ { "tpro.co.id", true },
{ "tpro.rocks", true },
{ "tqdev.com", true },
+ { "tql.plus", true },
{ "tr.search.yahoo.com", false },
{ "tr0n.net", true },
{ "traas.org", true },
@@ -38789,24 +40040,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "trace.guru", true },
{ "trace.moe", true },
{ "traceheatinguk.co.uk", true },
- { "tracelight.io", true },
{ "tracemyplace.com", true },
{ "traceroute.guru", true },
{ "traceroute.link", true },
{ "traceroute.network", true },
- { "traces.ml", true },
{ "tracetracker.no", true },
{ "tracfinancialservices.com", true },
{ "tracinsurance.com", true },
{ "track.plus", true },
{ "trackchair.com", true },
{ "trackdomains.com", true },
+ { "tracker.com.ar", true },
{ "trackersimulator.org", true },
{ "trackeye.dk", true },
{ "tracking.best", true },
- { "trackingstream.com", true },
{ "trackrecordpro.co.uk", true },
- { "tracksa.com.ar", true },
{ "trackyourlogs.com", true },
{ "tractorfan.nl", true },
{ "tractorpumps.com", true },
@@ -38821,17 +40069,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "traderjoe-cloud.de", true },
{ "tradernet.ru", true },
{ "tradeshowfreightservices.com", true },
+ { "tradexport.cn", true },
+ { "tradexport.com", true },
{ "tradik.com", true },
{ "tradinews.com", true },
{ "tradinews.fr", true },
+ { "tradingview.com", true },
{ "traditions.nl", true },
{ "traditionskapperscollege.nl", true },
{ "traditionsvivantesenimages.ch", true },
{ "tradiz.org", false },
{ "tradlost-natverk.se", true },
+ { "traducir.win", true },
{ "trafarm.ro", true },
{ "trafas.nl", true },
- { "traffic.az", true },
{ "trafficmanager.com", true },
{ "trafficmanager.ltd", true },
{ "trafficmanager.xxx", true },
@@ -38868,7 +40119,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "trainplaza.be", true },
{ "trainplaza.net", true },
{ "trainplaza.nl", true },
- { "trainsgoodplanesbad.com", true },
+ { "trainsgoodplanesbad.com", false },
{ "traintimes.be", true },
{ "traintimes.ch", true },
{ "traintimes.dk", true },
@@ -38888,11 +40139,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tran.pw", true },
{ "trance-heal.com", true },
{ "trance-heal.de", true },
- { "trance-heal.me", true },
{ "tranceheal.com", true },
{ "tranceheal.de", true },
- { "tranceheal.me", true },
- { "trangcongnghe.com", true },
{ "trangell.com", true },
{ "tranglenull.xyz", true },
{ "tranhsondau.net", false },
@@ -38902,8 +40150,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "transcend.org", true },
{ "transcontrol.com.ua", true },
{ "transfer.pw", true },
+ { "transferbags.com", true },
{ "transfers.do", true },
- { "transfers.mx", true },
{ "transferserver.at", true },
{ "transfersummit.com", true },
{ "transfigurewizard.com", true },
@@ -38935,7 +40183,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "transoil.co.uk", true },
{ "transpak-cn.com", true },
{ "transparentcorp.com", true },
- { "transport.eu", true },
{ "transporta.it", true },
{ "transporterlock.com", true },
{ "transumption.com", true },
@@ -38973,18 +40220,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "travis.nl", true },
{ "travisf.net", true },
{ "travisforte.io", true },
+ { "travisfranck.com", true },
{ "travler.net", true },
{ "trbanka.com", true },
{ "trea98.org", true },
{ "treaslockbox.gov", true },
{ "trebarov.cz", true },
{ "trebek.club", true },
- { "tree0.xyz", true },
+ { "treebaglia.xyz", true },
+ { "treehouse.pub", true },
{ "treehouseresort.nl", true },
{ "trees.chat", true },
{ "treeschat.com", true },
+ { "treestarmarketing.com", true },
{ "treetopsecurity.com", true },
- { "treeworkbyjtec.com", true },
{ "trefcon.cz", true },
{ "trefpuntdemeent.nl", true },
{ "treinaweb.com.br", false },
@@ -38993,14 +40242,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "treinonerd.com", true },
{ "trek-planet.ru", true },
{ "trekfriend.com", true },
- { "trekkinglife.de", true },
+ { "treml-sturm.com", true },
{ "trendkraft.de", true },
{ "trendreportdeals.com", true },
{ "trendsettersre.com", true },
{ "trendus.no", true },
{ "trendykids.cz", true },
{ "trenta.io", true },
- { "trenztec.ml", true },
+ { "trentonmakesnews.com", true },
{ "tresor.it", true },
{ "tresorit.com", true },
{ "tresorsecurity.com", true },
@@ -39033,35 +40282,39 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tributh.net", true },
{ "tributh.tk", true },
{ "tricefy4.com", true },
+ { "trichdanhay.com", true },
{ "triciaree.com", true },
+ { "trico-pigmentazione.it", true },
{ "trident-online.de", true },
{ "trietment.com", true },
{ "trigardon-rg.de", true },
- { "trik.es", false },
{ "trilex.be", true },
- { "trilithsolutions.com", true },
{ "trillian.im", true },
{ "trilliumvacationrentals.ca", true },
{ "triluxds.com", true },
{ "trim-a-slab.com", true },
- { "trim21.cn", true },
{ "trimage.org", true },
{ "trinary.ca", true },
{ "trineco.com", true },
{ "trineco.fi", true },
{ "tringavillasyala.com", true },
+ { "trinitasgyor.hu", true },
+ { "trinitycorporateservices.com", true },
+ { "trink-und-partyspiele.de", true },
{ "trinnes.net", true },
{ "trio.online", true },
{ "triop.se", true },
- { "trior.net", true },
{ "triplekeys.net", true },
{ "tripolistars.com", true },
{ "tripp.xyz", true },
{ "tripseats.com", true },
{ "tripsinc.com", true },
+ { "triri.org", true },
{ "trisect.eu", true },
{ "trish-mcevoy.ru", true },
+ { "tristanberger.io", true },
{ "trix360.com", true },
+ { "trixati.org.ua", true },
{ "trixexpressweb.nl", true },
{ "triz.co.uk", true },
{ "trkpuls.tk", true },
@@ -39085,6 +40338,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "trouble-free-employees.com", true },
{ "trouweninoverijssel.nl", true },
{ "trovaprezzi.it", true },
+ { "troxal.com", true },
{ "troyfawkes.com", true },
{ "troyhunt.com", true },
{ "troyhuntsucks.com", true },
@@ -39102,6 +40356,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "trueachievements.com", true },
{ "trueassignmenthelp.co.uk", true },
{ "trueblueessentials.com", true },
+ { "truecosmeticbeauty.com", true },
{ "trueduality.net", true },
{ "truehempculture.com.au", true },
{ "trueinstincts.ca", true },
@@ -39130,30 +40385,36 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "trustcase.com", true },
{ "trustedbody.com", true },
{ "trustednetworks.nl", true },
+ { "trustees.org", true },
{ "trustfield.ch", true },
{ "trustserv.de", true },
{ "truthmessages.pw", true },
+ { "truthsayer.tk", true },
{ "truvisory.com", true },
{ "truyenfull.vn", true },
{ "trw-reseller.com", true },
{ "try2admin.pw", true },
{ "try2services.cm", true },
- { "trybabyschoice.com", true },
+ { "try2services.vc", true },
{ "trybooking.com", true },
{ "tryfabulousskincream.com", true },
{ "tryfabulousskinserum.com", true },
{ "trygarciniaslimdiet.com", true },
{ "tryhard.cz", true },
+ { "tryhexadecimal.com", true },
+ { "tryitonline.net", true },
{ "trymegadrol.com", true },
{ "tryndraze.com", true },
{ "trynta.com", true },
{ "trynta.net", true },
- { "trypineapple.com", true },
+ { "tryplo.com", true },
+ { "tryplo.io", true },
+ { "tryplo.net", true },
+ { "tryplo.org", true },
{ "tryretool.com", true },
{ "tryupdates.com", true },
{ "trywesayyes.com", true },
{ "trzepak.pl", true },
- { "ts3-legenda.tech", true },
{ "tsa-sucks.com", true },
{ "tsab.moe", true },
{ "tsai.com.de", true },
@@ -39177,7 +40438,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tsundere.moe", true },
{ "tsung.co", true },
{ "tsurai.work", true },
- { "tsurimap.com", true },
{ "tsutsumi-kogyo.jp", true },
{ "tsuyuzakihiroyuki.com", true },
{ "tsv-1894.de", true },
@@ -39189,8 +40449,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ttchan.org", true },
{ "ttclub.fr", true },
{ "ttdsevaonline.com", true },
+ { "ttfin.ch", true },
+ { "ttlet.com", true },
{ "ttll.de", true },
{ "ttrade.ga", true },
+ { "tts-assessments.com", true },
{ "ttsoft.pl", true },
{ "ttsweb.org", true },
{ "ttt.tt", true },
@@ -39200,7 +40463,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tty1.net", true },
{ "ttyystudio.com", true },
{ "tu-immoprojekt.at", true },
- { "tu6.pm", true },
+ { "tuanhstore.com", true },
{ "tuasaude.com", true },
{ "tubanten.nl", true },
{ "tube.tools", true },
@@ -39215,7 +40478,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tucuxi.org", true },
{ "tudiennhakhoa.com", true },
{ "tudorproject.org", true },
- { "tudulinna.ee", true },
+ { "tueplay.host", true },
{ "tuev-hessen.de", true },
{ "tufashionista.com", true },
{ "tuffclassified.com", true },
@@ -39225,7 +40488,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tuingereedschappen.net", false },
{ "tuitle.com", true },
{ "tuja.hu", true },
+ { "tujunfang.com", true },
{ "tulumplayarealestate.com", true },
+ { "tumagiri.net", true },
{ "tumblenfun.com", true },
{ "tumedico.es", true },
{ "tumelum.de", true },
@@ -39242,13 +40507,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tunnelwatch.com", true },
{ "tuntitili.fi", true },
{ "tuotteet.org", true },
+ { "tuou.xyz", false },
{ "tupa-germania.ru", true },
{ "tupeuxpastest.ch", true },
{ "tuppenceworth.ie", true },
- { "turbobit.ch", true },
{ "turdnagel.com", true },
{ "turf-experts.com", true },
{ "turigum.com", true },
+ { "turingmind.com", true },
{ "turismodubrovnik.com", true },
{ "turkish.dating", true },
{ "turkiyen.com", true },
@@ -39267,6 +40533,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tuscanyleather.it", true },
{ "tusi.co", false },
{ "tusksol.com", true },
+ { "tusmedicamentos.com", true },
{ "tutanota.com", true },
{ "tuto-craft.com", true },
{ "tutoragency.org", true },
@@ -39282,10 +40549,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tuversionplus.com", true },
{ "tuwaner.com", true },
{ "tuxcloud.net", true },
+ { "tuxflow.de", false },
{ "tuxgeo.com", false },
{ "tuxie.com", true },
{ "tuxlife.net", true },
- { "tuxone.ch", true },
{ "tuxpeliculas.com", true },
{ "tuxpi.com", true },
{ "tuxplace.nl", true },
@@ -39306,9 +40573,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tvlanguedoc.com", true },
{ "tvleaks.se", true },
{ "tvlplus.net", true },
+ { "tvs-virtual.cz", true },
{ "tvseries.info", true },
{ "tvsheerenhoek.nl", true },
- { "tvzr.com", true },
+ { "tvzr.com", false },
{ "tw.search.yahoo.com", false },
{ "twaka.com", true },
{ "twalter.de", true },
@@ -39323,6 +40591,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tweedehandslaptophardenberg.nl", true },
{ "tweetfinity.com", true },
{ "tweetfinityapp.com", true },
+ { "twem.ddns.net", true },
{ "twenty71.com", true },
{ "twentymilliseconds.com", true },
{ "twilleys.com", true },
@@ -39345,6 +40614,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "twodadsgames.com", true },
{ "twofactorauth.org", true },
{ "twohuo.com", true },
+ { "twoleftsticks.com", true },
{ "twopif.net", true },
{ "tworaz.net", true },
{ "twtimmy.com", true },
@@ -39354,13 +40624,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "txi.su", true },
{ "txlrs.org", true },
{ "txm.pl", true },
+ { "txpi.nsupdate.info", true },
{ "txtecho.com", true },
{ "txurologist.com", true },
+ { "ty5998.com", true },
{ "tyche.io", true },
{ "tycho.org", true },
{ "tycom.cz", true },
- { "tyil.nl", true },
- { "tyil.work", true },
{ "tykeplay.com", true },
{ "tyler.rs", true },
{ "tylerdavies.net", true },
@@ -39368,6 +40638,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tylerharcourt.ca", true },
{ "tylerharcourt.com", true },
{ "tylerharcourt.org", true },
+ { "tylermade.net", true },
{ "tyleromeara.com", true },
{ "tylerschmidtke.com", true },
{ "typcn.com", true },
@@ -39392,8 +40663,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "tyuo-keibi.co.jp", true },
{ "tzermias.gr", true },
{ "tzifas.com", true },
+ { "tzsec.com", true },
+ { "u-chan.com", true },
{ "u-he.com", true },
{ "u-martfoods.com", true },
+ { "u-page.nl", true },
{ "u-tokyo.club", true },
{ "u.nu", true },
{ "u0010.com", true },
@@ -39406,15 +40680,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "u03.fr", true },
{ "u1100.com", true },
{ "u1144.com", true },
+ { "u29dc.com", true },
{ "u2fanlife.com", true },
{ "u2fsecuritykeys.com", true },
{ "u4mh-dev-accesscontroller.azurewebsites.net", true },
{ "u4mh-dev-portal.azurewebsites.net", true },
{ "u5.re", true },
{ "u5b.de", false },
- { "u5eu.com", true },
{ "u5r.nl", true },
{ "ua.search.yahoo.com", false },
+ { "uaci.edu.mx", true },
{ "uae-company-service.com", true },
{ "uangteman.com", true },
{ "uasmi.com", true },
@@ -39423,10 +40698,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ub3rk1tten.com", false },
{ "ubanquity.com", true },
{ "ubcani.com", true },
- { "uberbkk.com", true },
{ "uberboxen.net", true },
{ "uberestimator.com", true },
{ "ubermail.me", true },
+ { "uberpromocodes.us", true },
{ "uberwald.de", true },
{ "uberwald.ws", true },
{ "ubezpieczeniepsa.com", true },
@@ -39435,6 +40710,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ubis.company", true },
{ "ubis.group", true },
{ "ublaboo.org", true },
+ { "ubntleaks.com", true },
{ "uborcare.com", true },
{ "ubunlog.com", true },
{ "ubuntu18.com", true },
@@ -39450,7 +40726,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ucrdatatool.gov", true },
{ "uctarna.online", true },
{ "udancy.com", true },
- { "uddi.ng", true },
+ { "udbhav.me", true },
+ { "uddhabhaldar.com", true },
{ "udo-luetkemeier.de", true },
{ "udomain.net", true },
{ "udp.sh", false },
@@ -39461,35 +40738,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ueberdosis.io", true },
{ "ueberwachungspaket.at", true },
{ "uedaviolin.com", true },
- { "uefeng.com", true },
{ "ueni.com", true },
{ "uevan.com", true },
{ "uex.im", true },
{ "ufanisi.mx", true },
{ "ufindme.at", true },
+ { "ufo-blogger.com", true },
{ "ufocentre.com", true },
{ "ufplanets.com", true },
{ "ugb-verlag.de", true },
{ "uggedal.com", true },
{ "ugx-mods.com", true },
- { "uhappy1.com", true },
- { "uhappy2.com", true },
- { "uhappy22.com", true },
- { "uhappy30.com", true },
- { "uhappy50.com", true },
- { "uhappy57.com", true },
- { "uhappy6.com", true },
- { "uhappy69.com", true },
- { "uhappy70.com", true },
- { "uhappy72.com", true },
- { "uhappy79.com", true },
- { "uhappy80.com", true },
- { "uhappy81.com", true },
- { "uhappy82.com", true },
- { "uhappy83.com", true },
- { "uhappy85.com", true },
- { "uhappy88.com", true },
- { "uhappy90.com", true },
+ { "uhasseltctf.be", true },
{ "uhc.gg", true },
{ "uhlhosting.ch", true },
{ "uhrenlux.de", true },
@@ -39500,11 +40760,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "uiop.link", true },
{ "uiterwijk.org", true },
{ "uitgeverij-deviant.nl", true },
+ { "uitvaartvrouwenfriesland.nl", true },
{ "ujob.com.cn", true },
{ "ujvary.eu", true },
{ "uk.dating", true },
{ "uk.search.yahoo.com", false },
- { "ukbc.london", true },
{ "ukchemicalresearch.org", false },
{ "ukclimbing.com", true },
{ "ukdefencejournal.org.uk", true },
@@ -39517,10 +40777,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ukpirate.org", true },
{ "ukrainians.ch", true },
{ "ukrigging.net", true },
+ { "ukrn.io", true },
{ "ukrnet.co.uk", true },
{ "uktw.co.uk", true },
{ "ukulelejim.com", true },
- { "ukunlocks.com", true },
{ "ukwct.org.uk", true },
{ "ulabox.com", true },
{ "uldsh.de", true },
@@ -39532,23 +40792,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ullah.se", true },
{ "ulmer-schneesport.de", true },
{ "ulovdomov.cz", true },
- { "ulrik.moe", true },
{ "ultieme.be", true },
{ "ultima-ratio.at", true },
{ "ultimate-uk.com", true },
{ "ultimateanu.com", true },
{ "ultimatemafia.net", true },
- { "ultraseopro.com", true },
+ { "ultramookie.com", true },
{ "ultratech.software", true },
{ "ultratechlp.com", true },
{ "ultrautoparts.com.au", true },
+ { "uma.vn", true },
{ "umanityracing.com", true },
{ "umbertheprussianblue.com", true },
- { "umbrellaye.online", true },
{ "umbricht.li", true },
{ "umenlisam.com", true },
{ "umisonoda.com", true },
+ { "ummati.com", true },
{ "umsapi.com", true },
+ { "umzuege-berlin.com", true },
+ { "umzuege-hannover.net", true },
+ { "umzuege-wolfsburg.de", true },
+ { "umzug-berlin24.de", true },
+ { "umzug-braunschweig24.de", true },
{ "un-framed.co.za", true },
{ "un-zero-un.fr", true },
{ "un.fo", true },
@@ -39564,7 +40829,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "unblocked.cam", true },
{ "unblocked.gdn", true },
{ "unblocked.ink", true },
- { "unblocked.lat", true },
{ "unblocked.live", true },
{ "unblocked.mx", true },
{ "unblocked.one", true },
@@ -39608,7 +40872,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "unicef-karten.at", true },
{ "unicef.pl", true },
{ "unicefcards.cz", true },
- { "unicefcards.gr", true },
{ "unicefcards.it", true },
{ "unicefcards.nl", true },
{ "unicefcards.sk", true },
@@ -39618,6 +40881,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "unicefkepeslapok.hu", true },
{ "unicefvoscilnice.si", true },
{ "unicioushop.com", true },
+ { "unicmotos.com", true },
{ "unicolabo.jp", true },
{ "unicorn-systems.net", true },
{ "unicorn.melbourne", true },
@@ -39633,13 +40897,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "unifei.edu.br", true },
{ "uniform-agri.com", true },
{ "unijob.com.br", true },
+ { "unik.bg", true },
{ "unikoingold.com", true },
{ "unikrn.space", true },
{ "unila.edu.br", true },
{ "unimbalr.com", true },
- { "unioils.la", true },
{ "unionplat.ru", true },
- { "unionstreetskateboards.com", true },
{ "uniontestprep.com", true },
{ "unipig.de", true },
{ "uniprimebr.com.br", false },
@@ -39653,28 +40916,32 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "unite-ka.de", true },
{ "uniteasia.org", true },
{ "united-coders.com", true },
+ { "united-german-commander.de", true },
{ "united-schools.net", true },
{ "united.com", false },
{ "unitedadmins.com", true },
{ "unitedkingdoms-guild.com", true },
{ "unitedpsychological.com", true },
- { "unitedstreamers.de", true },
{ "unitel2000.de", true },
{ "unityconsciousnessbooks.com", true },
{ "univercite.ch", true },
{ "univeril.com", false },
{ "universal-happiness.com", true },
{ "universal.at", true },
+ { "universalcarpetinc.com", true },
{ "universalcarremote.com", true },
{ "universalpaymentgateway.com", true },
{ "universeinform.com", true },
{ "universidadvg.edu.mx", true },
+ { "universrumbacongolaise.com", true },
{ "univitale.fr", true },
{ "unix.se", true },
{ "unixadm.org", true },
{ "unixattic.com", true },
{ "unixforum.org", true },
+ { "unixfox.eu", true },
{ "unixtime.date", true },
+ { "unkn0wncat.net", true },
{ "unkrn.com", true },
{ "unlax.com", true },
{ "unli.xyz", true },
@@ -39689,6 +40956,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "unoccupyabq.org", true },
{ "unp.me", true },
{ "unpkg.com", true },
+ { "unpluggedjuice.dk", true },
+ { "unpossible.xyz", true },
{ "unpr.dk", true },
{ "unquote.li", true },
{ "unrealircd.org", true },
@@ -39699,7 +40968,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "unseen.is", true },
{ "unseen.tw", true },
{ "unser-gartenforum.de", true },
- { "unsereins.me", true },
{ "unsourirealecole.fr", true },
{ "unstablewormhole.ltd", true },
{ "unstamps.org", true },
@@ -39713,9 +40981,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "untethereddog.com", true },
{ "unun.fi", true },
{ "unusualhatclub.com", true },
+ { "unveiledgnosis.com", true },
{ "unx.dk", true },
{ "unxicdellum.cat", true },
+ { "uoone.com", true },
{ "uotomizu.com", true },
+ { "upaknship.com", true },
{ "upakweship.com", true },
{ "upandrunningtutorials.com", true },
{ "upay.ru", true },
@@ -39723,12 +40994,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "upbeatrobot.com", true },
{ "upbeatrobot.eu", true },
{ "upcambio.com", true },
+ { "upcloud.cz", true },
{ "upd.jp", true },
{ "upengo.com", true },
{ "upgamerengine.com", true },
{ "upgamerengine.com.br", true },
{ "upgamerengine.net", true },
- { "upgauged.com", true },
{ "upholsterydesign.com.au", true },
{ "upitnik.rs", true },
{ "uplaqui.com.br", true },
@@ -39744,6 +41015,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "upplevelse.com", true },
{ "upr.com.ua", true },
{ "uprint.it", true },
+ { "upropay.com", true },
{ "uprospr.com", true },
{ "uprouteyou.com", true },
{ "upsettunnel.com", true },
@@ -39757,7 +41029,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "uptownvintagecafe.com", true },
{ "uptrends.com", true },
{ "uptrends.de", true },
- { "uptrex.co.uk", true },
{ "upturn.org", true },
{ "upundit.com", true },
{ "upwork.com", true },
@@ -39774,6 +41045,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "urbandance.club", true },
{ "urbanesecurity.com", true },
{ "urbanguerillas.de", true },
+ { "urbangymfirenze.com", true },
{ "urbanhotbed.eu", true },
{ "urbanietz-immobilien.de", true },
{ "urbanmelbourne.info", true },
@@ -39784,6 +41056,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "urbanwildlifealliance.org", false },
{ "urbanxdevelopment.com", true },
{ "urbexdk.nl", true },
+ { "urbexing.eu", true },
{ "urbizoroofing.com", true },
{ "urcentral.com", true },
{ "urcentral.net", true },
@@ -39815,6 +41088,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "urth.org", true },
{ "uruguay-experience.com", true },
{ "urukproject.org", true },
+ { "usa-10.com", true },
{ "usa-greencard.eu", true },
{ "usaa.com", false },
{ "usabackground.com", true },
@@ -39835,6 +41109,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "usbcraft.com", true },
{ "usbevents.co.uk", true },
{ "usbr.gov", true },
+ { "uscis.gov", true },
{ "uscloud.nl", true },
{ "uscurrency.gov", true },
{ "usd.de", true },
@@ -39853,6 +41128,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "usimmigration.us", true },
{ "usipvd.ch", true },
{ "usitcolours.bg", true },
+ { "uskaria.com", true },
{ "usmint.gov", true },
{ "usninosnikrcni.eu", true },
{ "usnti.com", true },
@@ -39895,16 +41171,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "utonia.ch", true },
{ "utopicestudios.com", true },
{ "utox.io", true },
+ { "utrace.me", true },
{ "utterberry.io", true },
{ "utugnn.ru", true },
{ "utw.me", true },
{ "utwente.io", true },
{ "utzon.net", true },
+ { "uuid.fr", true },
{ "uuit.nl", true },
{ "uv.uy", true },
{ "uvenuse.cz", true },
{ "uvocorp.com", true },
- { "uw1008.com", true },
{ "uw2333.com", true },
{ "uwac.co.uk", false },
{ "uwat.cf", true },
@@ -39913,11 +41190,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "uwvloereruit.nl", true },
{ "uxp-it.nl", true },
{ "uxteam.com", true },
- { "uxtechnologist.com", true },
{ "uy.search.yahoo.com", false },
{ "uz.search.yahoo.com", false },
{ "uzayliyiz.biz", true },
{ "uzaymedya.com.tr", true },
+ { "uze-mobility.com", true },
{ "uziregister.nl", true },
{ "uzpirksana.lv", true },
{ "uzsvm.cz", true },
@@ -39926,6 +41203,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "v-spin.cz", true },
{ "v-tek.fi", true },
{ "v-u-z.ru", true },
+ { "v1sit0r.ru", true },
{ "v2bv.net", true },
{ "v2bv.win", true },
{ "v2cn.win", true },
@@ -39933,7 +41211,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "v2ray6.com", true },
{ "v2ray66.com", true },
{ "v2ray666.com", true },
- { "v4s.ro", true },
+ { "v5ray.top", true },
{ "va-reitartikel.com", true },
{ "va.gov", true },
{ "va1der.ca", true },
@@ -39949,7 +41227,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vagaerg.net", true },
{ "vagmour.eu", true },
{ "vagpartsdb.com", true },
- { "vagrantbits.com", true },
{ "vagrantcloud.com", true },
{ "vagrantup.com", true },
{ "vaincreladyslexie.com", false },
@@ -39963,11 +41240,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "valcano.ru", true },
{ "valcansell.com", true },
{ "valcardiesel.com", true },
+ { "valdicass.com", true },
{ "valek.net", true },
{ "valenciadevops.me", true },
- { "valentin-dederer.de", true },
{ "valentin-sundermann.de", true },
- { "valentin.ml", true },
{ "valentinberclaz.com", true },
{ "valentineapparel.com", true },
{ "valentineforpresident.com", true },
@@ -39982,6 +41258,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "validator.nu", true },
{ "validbrands.com", true },
{ "valika.ee", true },
+ { "valimised.ee", true },
{ "valis.sx", true },
{ "valkohattu.fi", true },
{ "valkova.net", true },
@@ -40004,9 +41281,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "valtoaho.com", true },
{ "valtool.uk", true },
{ "valudo.st", true },
- { "valuechain.me", true },
+ { "valuehost.com.br", true },
{ "valuemyhome.co.uk", true },
{ "valuemyhome.uk", true },
+ { "valuemywebsite.net", true },
{ "valueng.com", true },
{ "valueofblog.com", true },
{ "valueseed.net", true },
@@ -40038,16 +41316,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vanhoudt-usedcars.be", true },
{ "vanhoutte.be", false },
{ "vanhove.biz", true },
- { "vanlent.net", true },
+ { "vanlaanen.com", false },
{ "vanmalland.com", true },
{ "vannaos.com", true },
{ "vannaos.net", true },
{ "vanouwerkerk.net", true },
{ "vantagepointpreneed.com", true },
- { "vante.me", true },
+ { "vante.me", false },
{ "vantien.com", true },
{ "vantru.is", true },
- { "vanvoro.us", false },
{ "vanwunnik.com", true },
{ "vapecrunch.com", true },
{ "vapensiero.co.uk", true },
@@ -40065,7 +41342,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "varden.info", true },
{ "vareillefoundation.fr", true },
{ "vareillefoundation.org", true },
- { "varghese.de", true },
{ "variable.agency", false },
{ "variag-group.ru", true },
{ "variag-montazh.ru", true },
@@ -40084,6 +41360,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "varztupasaulis.eu", true },
{ "varztupasaulis.lt", true },
{ "varztupasaulis.net", true },
+ { "vasastansbygg.se", true },
{ "vascomm.co.id", true },
{ "vasel.de", true },
{ "vasel.eu", true },
@@ -40132,7 +41409,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vcsjones.codes", true },
{ "vcsjones.com", true },
{ "vcti.cloud", true },
- { "vctor.net", true },
{ "vd42.net", true },
{ "vda.li", true },
{ "vdanker.net", true },
@@ -40143,10 +41419,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vdisk24.de", true },
{ "vdlp.nl", true },
{ "vdmeij.com", true },
+ { "vdzn.net", true },
{ "vdzwan.net", true },
{ "ve.search.yahoo.com", false },
{ "ve3oat.ca", true },
- { "vea.re", true },
{ "veblr.com", false },
{ "vec.ac.nz", true },
{ "vecerkaracing.cz", true },
@@ -40166,13 +41442,18 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vegetariantokyo.net", true },
{ "veggie-einhorn.de", true },
{ "veggie-treff.de", true },
+ { "veggiesecret.com", true },
{ "vegguide.org", true },
+ { "vegoresto.fr", true },
{ "veii.de", true },
{ "veil-framework.com", true },
+ { "veilofsecurity.com", true },
{ "veincenterbrintonlake.com", true },
{ "veit.zone", true },
{ "veke.fi", true },
+ { "velassoltas.pt", true },
{ "velen.io", true },
+ { "velocom.com.ar", true },
{ "veloroute.hamburg", true },
{ "venalytics.com", true },
{ "venclave.com", true },
@@ -40197,10 +41478,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "venturum.de", true },
{ "venturum.eu", true },
{ "venturum.net", true },
- { "ventzke.com", true },
{ "venuedriver.com", true },
{ "ver.ma", true },
{ "vera.bg", true },
+ { "veracix.ca", true },
{ "veramagazine.jp", true },
{ "verasani.ch", true },
{ "verberne.nu", true },
@@ -40212,19 +41493,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "verein-kiekin.de", true },
{ "verein-zur-pflege-der-geselligkeit.de", true },
{ "vereinlandwege.de", true },
- { "vereinscheck.de", true },
{ "verfassungsklage.at", true },
{ "verge.capital", true },
{ "vergelijksimonly.nl", true },
{ "verhovs.ky", false },
{ "veri2.com", true },
{ "verifalia.com", true },
- { "verificaprezzi.it", true },
{ "verifiedjoseph.com", true },
{ "verifiny.com", true },
{ "verifyos.com", true },
{ "verifyyourip.com", true },
- { "veriny.tf", true },
{ "verios.com.br", true },
{ "veritafineviolins.com", true },
{ "veritas-data.de", true },
@@ -40232,6 +41510,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "verizonconnect.com", false },
{ "verizonguidelines.com", true },
{ "verkeersschoolrichardschut.nl", true },
+ { "verkkopalvelin.fi", true },
{ "verliebt-in-bw.de", true },
{ "verliebt-in-niedersachsen.de", true },
{ "vermeerdealers.com", true },
@@ -40248,12 +41527,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "veronic.hu", true },
{ "veronique-schmitz.de", true },
{ "verrerie-mousseline.org", true },
- { "verry.org", true },
{ "vers.one", true },
{ "versagercloud.de", true },
{ "versalhost.com", true },
{ "versalhost.nl", true },
{ "versbesteld.nl", true },
+ { "verschoren.com", true },
{ "verschurendegroot.nl", true },
{ "verses.space", true },
{ "versicherungen-werner-hahn.de", true },
@@ -40263,11 +41542,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "verstraetenusedcars.be", true },
{ "vertebrates.com", true },
{ "verteilergetriebe.info", true },
+ { "verticesedge.com", true },
{ "verticrew.com", true },
+ { "vertigo.com.br", true },
{ "vertigo.name", false },
{ "vertner.net", true },
{ "vertrieb-strategie.de", true },
{ "verustracking.com", true },
+ { "vervewellness.co.nz", true },
{ "verwandlung.org", true },
{ "verwayen.com", true },
{ "very-kids.fr", true },
@@ -40285,6 +41567,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vestum.ru", true },
{ "vet-planet.com", true },
{ "vetbits.com", false },
+ { "veteransonline.us", true },
{ "vetergysurveys.com", true },
{ "veterinarian-hospital.com", true },
{ "veterinario.roma.it", true },
@@ -40306,12 +41589,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vgropp.de", true },
{ "vh.net", true },
{ "vhrca.com", true },
- { "vhs-bad-wurzach.de", true },
{ "vhummel.nl", true },
{ "vi.photo", true },
{ "via-shire-krug.ru", true },
{ "via.blog.br", true },
{ "viablog.com.br", true },
+ { "viacation.co", true },
{ "viacdn.org", true },
{ "viafinance.cz", false },
{ "viaggio-in-cina.it", true },
@@ -40333,6 +41616,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "victorblomberg.se", true },
{ "victorcanera.com", true },
{ "victordiaz.me", true },
+ { "victoreriksson.ch", true },
+ { "victoreriksson.co", true },
+ { "victoreriksson.com", true },
+ { "victoreriksson.eu", true },
+ { "victoreriksson.info", true },
+ { "victoreriksson.me", true },
+ { "victoreriksson.net", true },
+ { "victoreriksson.nu", true },
+ { "victoreriksson.org", true },
+ { "victoreriksson.se", true },
+ { "victoreriksson.us", true },
{ "victorgbustamante.com", true },
{ "victorhawk.com", true },
{ "victoriaartist.ru", true },
@@ -40344,10 +41638,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "victory.radio", true },
{ "victoryalliance.us", true },
{ "victorzambrano.com", true },
+ { "vicugna.nl", true },
{ "vicyu.com", true },
{ "vid-immobilien.de", true },
{ "vida-it.com", true },
- { "vida.es", true },
{ "vidadu.com", true },
{ "vidarity.com", true },
{ "vidbooster.com", true },
@@ -40382,18 +41676,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vietnamphotoblog.com", true },
{ "vietnamwomenveterans.org", true },
{ "vietplan.vn", true },
- { "vieux.pro", true },
{ "viewbook.com", true },
{ "viewey.com", true },
{ "viewing.nyc", true },
- { "viewmyrecords.com", true },
{ "vigenebio.com", true },
{ "vigilantnow.com", true },
{ "vigliano.ovh", true },
{ "vignoblesdeletat.ch", true },
{ "vigo-krankenversicherung.de", true },
{ "vigo-tarife.de", true },
- { "vigour.us", true },
{ "vigoxatelier.tech", true },
{ "vigrey.com", true },
{ "viikko.cf", true },
@@ -40418,6 +41709,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "villa-eden.cz", true },
{ "villa-gockel.de", true },
{ "villa-romantica-zillertal.at", true },
+ { "villaella.com", true },
{ "villafiore.com.br", true },
{ "villageunique.com.br", true },
{ "villagockel.de", true },
@@ -40441,13 +41733,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vinahost.vn", true },
{ "vinarstvimodryhrozen.cz", true },
{ "vincentcox.com", false },
- { "vincentiliano.tk", true },
- { "vincentoshana.com", true },
{ "vincentpancol.com", true },
{ "vincentswordpress.nl", true },
{ "vincible.space", true },
{ "vinciconps4.it", true },
{ "vincitraining.com", true },
+ { "vindipoker.dk", true },
{ "vinetech.co.nz", true },
{ "vingt.me", true },
{ "vinilosdecorativos.net", true },
@@ -40477,16 +41768,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vionicshoes.co.uk", true },
{ "vionicshoes.com", true },
{ "vip8522.com", true },
- { "vipi.es", true },
+ { "vipllcnj.com", true },
{ "viptamin.eu", true },
{ "viptamol.com", true },
{ "viqo.pl", true },
- { "vir-tec.eu", true },
+ { "vir-tec.eu", false },
{ "vir2.me", true },
{ "viral32111.com", true },
{ "viralpop.it", true },
{ "viralsouls.in", true },
- { "viralsv.com", true },
{ "virgopolymer.com", true },
{ "viridis-milites.cz", true },
{ "virtit.fr", true },
@@ -40494,14 +41784,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "virtualcloud.ddns.net", true },
{ "virtualcommodities.org", true },
{ "virtuality4d.com", true },
+ { "virtualizy.de", true },
{ "virtuallifestyle.nl", true },
{ "virtualmt2.pl", true },
{ "virtualsanity.com", true },
{ "virtualspeech.com", true },
{ "virtualvaults.com", true },
{ "virtubox.net", true },
+ { "virtuebags.com", true },
+ { "virtus-group.com", true },
{ "virtusaero.com", true },
+ { "virus.pm", true },
{ "virvum.ch", true },
+ { "visadaifu.com", true },
{ "visaexpert.co.za", true },
{ "visalist.io", true },
{ "visalogy.com", true },
@@ -40522,12 +41817,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "visionexpresscareers.com", true },
{ "visionless.me", false },
{ "visionnissancanandaiguaparts.com", true },
+ { "visionviral.com", true },
{ "visit-montenegro.com", true },
{ "visitbeulah.com", true },
{ "visitcambridgeshirefens.org", true },
{ "visitkangaroovalley.com.au", true },
{ "visitmaine.com", true },
{ "visor.ph", true },
+ { "vista-research-group.com", true },
{ "vistaalmar.es", true },
{ "vistacampus.gov", true },
{ "vistastylebuilder.com", false },
@@ -40543,15 +41840,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "visualmasters.nl", true },
{ "visudira.com", true },
{ "vitahook.pw", true },
+ { "vital-tel.co.uk", true },
+ { "vitalastin-sport.de", true },
{ "vitalia.cz", true },
{ "vitalismaatjes.nl", true },
{ "vitalityscience.com", true },
- { "vitalium-therme.de", true },
{ "vitalthrills.com", true },
{ "vitalware.com", true },
{ "vitalyzhukphoto.com", true },
+ { "vitamina.cl", true },
+ { "vitamina.com", true },
{ "vitaminler.com", true },
- { "vitapingu.de", true },
{ "vitastic.nl", true },
{ "vitavie.nl", true },
{ "viteoscrm.ch", true },
@@ -40569,12 +41868,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vivaldi.com", true },
{ "vivanosports.com.br", false },
{ "vivatv.com.tw", true },
+ { "vive.link", true },
{ "vivendi.de", true },
{ "viveport.com", true },
{ "vivianmaier.cn", true },
{ "vivid-academy.com", true },
{ "vividinflatables.co.uk", true },
{ "vividlumen.com", true },
+ { "viviendy.com", true },
{ "viviennevandenbos.nl", true },
{ "vivirenelmundo.com", true },
{ "vivo.sx", true },
@@ -40582,7 +41883,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vivy.com", true },
{ "vixrapedia.org", true },
{ "viyf.org", true },
- { "vizards.cc", true },
{ "vize.ai", false },
{ "vizija-nepremicnine.si", true },
{ "vizional.com", true },
@@ -40593,13 +41893,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vjirovsky.cz", false },
{ "vjpatel.me", true },
{ "vk-k.com", true },
- { "vk4wip.org.au", true },
{ "vkb-remont.ru", true },
{ "vkennke.org", true },
{ "vkino.com", false },
{ "vkirichenko.name", true },
{ "vkox.com", true },
{ "vksportphoto.com", true },
+ { "vladimiroff.org", true },
{ "vladislavstoyanov.com", true },
{ "vlakem.net", true },
{ "vlakjebak.nl", true },
@@ -40625,13 +41925,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vmoagents.com", false },
{ "vmoe.info", true },
{ "vmug.pl", true },
- { "vmzone.de", true },
{ "vn.search.yahoo.com", false },
{ "vncg.org", true },
{ "vnd.cloud", true },
- { "vnfs-team.com", true },
{ "vnpay.vn", true },
- { "vnpem.org", true },
{ "vnvisa.center", true },
{ "vnvisa.ru", true },
{ "vocaloid.my", true },
@@ -40660,6 +41957,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vojtechpavelka.cz", true },
{ "vokativy.cz", true },
{ "vokeapp.com", true },
+ { "vokurka.net", true },
{ "volcanconcretos.com", true },
{ "volcano-kazan.ru", true },
{ "volcano-spb.ru", true },
@@ -40674,11 +41972,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "volkerwesselstransfer.nl", false },
{ "volksvorschlagpmar.ch", true },
{ "vollans.id.au", true },
- { "vollmondstollen.de", true },
{ "voloevents.com", true },
{ "volqanic.com", true },
{ "volta.io", true },
- { "voltahurt.pl", true },
+ { "voltahurt.pl", false },
{ "volto.io", true },
{ "volunteeringmatters.org.uk", true },
{ "vomitb.in", true },
@@ -40686,18 +41983,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vonborstelboerner.de", true },
{ "vonniehudson.com", true },
{ "vonski.pl", true },
- { "vonterra.us", true },
{ "voodoochile.at", true },
+ { "voolik.pw", true },
+ { "voorjou.com", true },
{ "vop.li", true },
{ "vorlage-musterbriefe.de", true },
{ "vorlage-mustervertrag.de", true },
{ "vorlagen-geburtstagsgruesse.de", true },
{ "vorlicek.de", true },
- { "vorlif.org", true },
{ "vorm2.com", true },
{ "vorodevops.com", true },
- { "vos-fleurs.ch", true },
- { "vos-fleurs.com", true },
{ "vos-systems.com", true },
{ "vos-systems.es", true },
{ "vos-systems.eu", true },
@@ -40718,10 +42013,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "votoot.com", true },
{ "vouchinsurance.sg", true },
{ "vovladikavkaze.ru", true },
- { "vowsy.club", true },
{ "voxfilmeonline.net", true },
{ "voxml.com", true },
{ "voxographe.com", false },
+ { "voxpopuli.com", true },
{ "voya.ga", true },
{ "voyage-martinique.fr", true },
{ "voyageforum.com", true },
@@ -40738,10 +42033,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vpsao.org", true },
{ "vpsboard.com", true },
{ "vpsdream.dk", true },
- { "vpsou.com", true },
+ { "vpsou.com", false },
{ "vpsport.ch", true },
{ "vpsproj.dynu.net", true },
{ "vpsvz.net", true },
+ { "vragenvanproust.nl", true },
{ "vrandopulo.ru", true },
{ "vrcholovka.cz", true },
{ "vrcprofile.com", true },
@@ -40763,7 +42059,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vseomedia.com", true },
{ "vserver-preis-vergleich.de", true },
{ "vsesrazu-raiffeisen.ru", true },
- { "vsestiralnie.com", true },
{ "vsestoki.com", true },
{ "vsl-defi.ch", true },
{ "vsl.de", true },
@@ -40776,6 +42071,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vtt-hautsdefrance.fr", true },
{ "vtuber.art", true },
{ "vuakhuyenmai.vn", true },
+ { "vuatruyen.com", true },
{ "vubey.yt", true },
{ "vuilelakens.be", true },
{ "vuljespaarpot.nl", true },
@@ -40810,24 +42106,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vwsoft.de", true },
{ "vx.hn", true },
{ "vxstream-sandbox.com", true },
+ { "vxz.me", true },
{ "vybeministry.org", true },
{ "vyber-odhadce.cz", true },
{ "vyberodhadce.cz", true },
{ "vyplnto.cz", true },
{ "vysko.cz", true },
{ "vyskocil.eu", true },
+ { "vytea.com", true },
{ "vyvygen.org", true },
{ "vzce.cn", true },
{ "vzis.org", true },
{ "vztekloun.cz", true },
- { "w-p-k.de", true },
{ "w-spotlight.appspot.com", true },
{ "w-w-auto.de", true },
{ "w.wiki", true },
{ "w1n73r.de", true },
{ "w2n.me", true },
{ "w3ctag.org", true },
- { "w3n.org", true },
+ { "w3n14izy.ml", true },
{ "w4.no", true },
{ "w4eg.de", true },
{ "w4nvu.org", true },
@@ -40851,16 +42148,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wacky.one", true },
{ "wadidi.com", true },
{ "wadsworth.gallery", true },
+ { "wadvisor.com", true },
{ "waelisch.de", true },
{ "waf.ninja", true },
{ "waf.sexy", true },
{ "wafelland.be", true },
+ { "waffenversand-klausing.de", true },
{ "waffle.at", false },
{ "wafuton.com", true },
+ { "waggs.link", true },
{ "wagyu-bader.de", true },
- { "wahhoi.net", true },
{ "wahidhasan.com", true },
- { "wahlen-bad-wurzach.de", true },
{ "wahlman.org", true },
{ "wahrnehmungswelt.de", true },
{ "wahrnehmungswelten.de", true },
@@ -40869,14 +42167,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "waifu-technologies.moe", true },
{ "waigel.org", true },
{ "waikatowebdesigners.com", true },
- { "wains.be", false },
+ { "wail.net", true },
{ "wait.jp", true },
- { "waiterwheels.com", true },
{ "waits.io", true },
{ "wajtc.com", true },
{ "wak.io", true },
+ { "waka-mono.com", true },
{ "wakamiyasumiyosi.com", true },
- { "wakandasun.com", true },
{ "wakatime.com", true },
{ "wakhanyeza.org", true },
{ "wakiminblog.com", true },
@@ -40885,6 +42182,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "waldvogel.family", true },
{ "walent.in", true },
{ "walentin.co", true },
+ { "waligorska.pl", true },
{ "walk.onl", true },
{ "walkera-fans.de", true },
{ "walkhighlandsandislands.com", true },
@@ -40900,7 +42198,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wallethub.com", false },
{ "walletnames.com", true },
{ "wallinger-online.at", true },
- { "wallpapers.pub", true },
+ { "wallingford.cc", true },
{ "wallpaperup.com", true },
{ "walls.de", true },
{ "walls.io", true },
@@ -40915,11 +42213,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "walravensax.nl", true },
{ "walruses.org", true },
{ "walshbanks.com", true },
- { "waltellis.com", true },
{ "walter.lc", true },
{ "waltervictor.com", true },
{ "waltzmanplasticsurgery.com", true },
{ "walvi.nl", true },
+ { "wammu.eu", true },
{ "wan.pp.ua", false },
{ "wanda.ch", true },
{ "wandelreizen.eu", true },
@@ -40934,19 +42232,22 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wangbangyu.ml", true },
{ "wangbangyu.tk", true },
{ "wangejiba.com", true },
+ { "wangjun.me", true },
{ "wangqiliang.cn", true },
{ "wangqiliang.com", true },
+ { "wangqiliang.org", true },
{ "wangql.net", true },
{ "wangqr.tk", true },
{ "wangriwu.com", true },
{ "wangtanzhang.com", true },
+ { "wangwenbo.cn", false },
{ "wangwill.me", true },
{ "wangyubao.cn", true },
{ "wangyue.blog", true },
{ "wangzuan168.cc", true },
{ "wanlieyan.com", true },
{ "wannaridecostarica.com", true },
- { "wanvi.net", false },
+ { "wanquanojbk.com", false },
{ "wanybug.cf", true },
{ "wanybug.com", true },
{ "wanybug.ga", true },
@@ -40966,21 +42267,30 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "warekit.io", true },
{ "warenits.at", false },
{ "warenmedia.com", true },
+ { "warfield.org.uk", true },
{ "wargameexclusive.com", true },
{ "warhaggis.com", true },
- { "warmservers.com", true },
+ { "warmtepomp.express", true },
{ "waroengkoe-shop.com", true },
{ "warofelements.de", true },
+ { "warp-radio.com", true },
+ { "warp-radio.net", true },
+ { "warp-radio.tv", true },
{ "warr.ath.cx", true },
{ "warringtonkidsbouncycastles.co.uk", true },
{ "warschild.org", true },
{ "warsh.moe", true },
{ "warsonco.com", true },
{ "wartorngalaxy.com", true },
+ { "wasabiwallet.co", true },
+ { "wasabiwallet.io", true },
+ { "waschmaschinen-dienst.de", true },
{ "waschpark-hantschel.de", true },
+ { "wasd.ms", true },
{ "wasema.com", true },
{ "wasfestes.de", true },
{ "wasfuereintheater.com", true },
+ { "wasgehtheute.in", true },
{ "washingtonregisteredagent.io", true },
{ "washingtonviews.com", true },
{ "wasi-net.de", true },
@@ -40992,13 +42302,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wassibauer.com", true },
{ "wastrel.ch", true },
{ "watch-wiki.org", true },
- { "watchcom.org.za", true },
{ "watchface.watch", true },
{ "watchfreeonline.co.uk", true },
{ "watchinventory.com", true },
{ "watchonline.al", true },
{ "watchparts-and-tools-okayama.co.jp", true },
- { "watchpci.com", true },
{ "watchstyle.com", true },
{ "water-addict.com", true },
{ "waterbrook.com.au", true },
@@ -41011,12 +42319,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "waterschaplimburg.nl", true },
{ "waterside-residents.org.uk", true },
{ "waterslide-austria.at", true },
+ { "watertrails.io", true },
{ "waterworkscondos.com", true },
{ "watfordjc.uk", true },
{ "watoo.tech", true },
{ "watsonwork.me", true },
+ { "wattmaedchen.de", true },
{ "watvindtnederland.com", true },
- { "waukeect.com", true },
+ { "wav-productions.com", true },
{ "wave.is", true },
{ "wave.red", true },
{ "wavengine.com", true },
@@ -41027,6 +42337,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "waxdramatic.com", true },
{ "waycraze.com", true },
{ "wayfair.de", true },
+ { "wayfairertravel.com", true },
{ "waylandss.com", true },
{ "waynefranklin.com", true },
{ "wayohoo.com", true },
@@ -41047,8 +42358,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wbx.support", true },
{ "wby.gd", true },
{ "wby.tw", true },
+ { "wc1234.cn", true },
{ "wcbook.ru", false },
{ "wcn.life", false },
+ { "wcosmeticsurgery.com", true },
{ "wcrca.org", true },
{ "wcsi.com", true },
{ "wcwcg.net", true },
@@ -41063,7 +42376,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "we-run-linux.de", true },
{ "we-use-linux.de", true },
{ "weacceptbitcoin.gr", true },
- { "wealthcentral.com.au", true },
+ { "wealthings.net", true },
{ "wealthprojector.com", true },
{ "wealthprojector.com.au", true },
{ "wealthreport.com.au", true },
@@ -41071,7 +42384,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "weare1inspirit.com", true },
{ "wearebfi.co.uk", true },
{ "wearegenki.com", true },
- { "wearehackerone.com", true },
{ "wearepapermill.co", true },
{ "wearesouthafricans.com", true },
{ "wearvr.com", true },
@@ -41082,6 +42394,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "web-apps.tech", true },
{ "web-art.cz", true },
{ "web-design.co.il", true },
+ { "web-dl.cc", true },
+ { "web-fox23.ru", true },
{ "web-hotel.gr", true },
{ "web-jive.com", true },
{ "web-kouza.com", true },
@@ -41094,7 +42408,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "web.bzh", true },
{ "web.cc", false },
{ "web.de", true },
- { "web1n.com", true },
{ "web2033.com", true },
{ "web2ldap.de", true },
{ "web2screen.tv", true },
@@ -41106,7 +42419,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "webaholic.co.in", true },
{ "webais.ru", true },
{ "webalert.cz", true },
- { "webambacht.nl", true },
{ "webandmore.de", true },
{ "webappky.cz", true },
{ "webartex.ru", true },
@@ -41124,19 +42436,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "webcurtaincall.com", true },
{ "webdemaestrias.com", true },
{ "webdesign-st.de", true },
- { "webdesigneauclaire.com", true },
{ "webdesignerinwarwickshire.co.uk", true },
{ "webdesignlabor.ch", true },
{ "webdesignplay.com", true },
{ "webdesignplayground.io", true },
{ "webdesignsandiego.com", true },
+ { "webdev-cw.me", true },
{ "webdevops.io", true },
- { "webdevxp.com", true },
{ "webdl.org", true },
{ "webduck.nl", false },
{ "webeast.eu", true },
- { "webeau.com", true },
- { "webeditors.com", true },
{ "webergrillrestaurant.com", true },
{ "webev.ru", true },
{ "webexample.win", true },
@@ -41147,6 +42456,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "webfilings-mirror-hrd.appspot.com", true },
{ "webfilings.appspot.com", true },
{ "webfixers.nl", true },
+ { "webfox.com.br", true },
{ "webgap.io", false },
{ "webgarten.ch", true },
{ "webgears.com", true },
@@ -41155,12 +42465,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "webhost.guide", true },
{ "webhostingzzp.nl", false },
{ "webhostplan.info", true },
+ { "webhotelli.website", true },
+ { "webia.in.th", true },
{ "webies.ro", true },
{ "webinnovation.ie", true },
+ { "webionite.com", true },
{ "webjobposting.com", true },
{ "webkef.com", true },
{ "webkeks.org", true },
{ "weblagring.se", true },
+ { "weblate.com", true },
+ { "weblate.cz", true },
{ "weblate.org", true },
{ "webliberty.ru", true },
{ "webline.ch", true },
@@ -41171,7 +42486,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "webmail.schokokeks.org", false },
{ "webmail.xalqbank.az", true },
{ "webmandesign.eu", true },
- { "webmax.com.tr", true },
+ { "webmediaprint.at", true },
{ "webmedpharmacy.co.uk", true },
{ "webmetering.at", true },
{ "webministeriet.net", true },
@@ -41180,8 +42495,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "webnames.ca", true },
{ "webnetforce.net", true },
{ "webnexty.com", true },
+ { "webogram.org", false },
+ { "webperformance.io", true },
{ "webpinoytambayan.net", true },
{ "webpinoytv.info", true },
+ { "webplatform.fi", true },
{ "webpostingmart.com", true },
{ "webpostingpro.com", true },
{ "webpostingreviews.com", true },
@@ -41230,7 +42548,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "webtropia.com", false },
{ "webukhost.com", true },
{ "webutils.io", true },
- { "webvisum.de", true },
{ "webwednesday.nl", true },
{ "webwelearn.com", true },
{ "webwinkelexploitatie.nl", true },
@@ -41244,20 +42561,21 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wecleanbins.com", true },
{ "wecobble.com", true },
{ "weddingdays.tv", true },
+ { "weddingenvelopes.co.uk", false },
{ "weddingofficiantwilmington.com", true },
{ "weddingsbynoon.co.uk", true },
{ "weddywood.ru", false },
+ { "wedestock.com", true },
{ "wedg.uk", true },
{ "wedos.com", true },
+ { "wedplay.host", true },
{ "weebl.me", true },
{ "weeblr.com", true },
{ "weeblrpress.com", true },
{ "weedlife.com", true },
- { "weednews.co", true },
{ "weedupdate.com", true },
{ "weedworthy.com", true },
{ "weedypedia.de", true },
- { "week.report", true },
{ "weekdone.com", true },
{ "weekendinitaly.com", true },
{ "weekly-residence.com", true },
@@ -41275,9 +42593,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wefinanceinc.com", true },
{ "wefitboilers.com", true },
{ "weforgood.org.tw", true },
+ { "wegerecht.org", true },
{ "wegonnagetsued.org", true },
{ "wegotcookies.com", true },
{ "wegrzynek.org", true },
+ { "wegrzynek.pl", true },
{ "wegvielfalt.de", true },
{ "wehostdnn.com", true },
{ "weibomiaopai.com", true },
@@ -41302,7 +42622,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "weiterbildung-vdz.de", true },
{ "weitergedacht.eu", true },
{ "weizenspr.eu", true },
- { "welcome-tahiti.com", true },
{ "welcome-werkstatt.com", true },
{ "welcome-werkstatt.de", true },
{ "welcome26.ch", true },
@@ -41373,6 +42692,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "werkgroepderdewereld.nl", true },
{ "werkgroeppaleisparkhetloo.nl", true },
{ "werkinc.de", true },
+ { "werkinholland.com", true },
{ "werkkrew.xyz", true },
{ "werkslimreisslim.nl", true },
{ "werkstattkinder.de", true },
@@ -41380,8 +42700,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "werktor.net", true },
{ "wermeester.com", true },
{ "werner-ema.de", true },
- { "werner-schaeffer.de", true },
- { "wernerschaeffer.de", true },
{ "werpo.com.ar", true },
{ "wertheimer-burgrock.de", true },
{ "wertpapiertreuhand.de", true },
@@ -41405,6 +42723,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "westcoastcastles.com", true },
{ "westcoastmarineadvisor.com", true },
{ "westcode.de", true },
+ { "westcommunitycu.org", true },
{ "westcountrystalking.com", true },
{ "westendwifi.net", true },
{ "westernfrontierins.com", true },
@@ -41445,6 +42764,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wexfordbouncycastles.ie", true },
{ "wexilapp.com", true },
{ "weyland-yutani.org", true },
+ { "weymouthslowik.com", true },
{ "wezartt.com", true },
{ "wezl.net", true },
{ "wf-bigsky-master.appspot.com", true },
@@ -41457,9 +42777,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wf-training-hrd.appspot.com", true },
{ "wf-training-master.appspot.com", true },
{ "wf-trial-hrd.appspot.com", true },
+ { "wfcp1010.com", true },
{ "wfh.ovh", true },
{ "wfh.se", true },
{ "wforum.nl", true },
+ { "wfsystem.net", true },
{ "wft-portfolio.nl", true },
{ "wg-steubenstrasse.de", true },
{ "wg3k.us", false },
@@ -41468,6 +42790,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wgplatform.co.uk", true },
{ "wgraphics.ru", true },
{ "wgsi-friesland.nl", true },
+ { "wgtrm.com", true },
{ "wh-guide.de", true },
{ "what-wood.servehttp.com", true },
{ "whatagreatwebsite.net", true },
@@ -41498,17 +42821,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "whatwebcando.today", true },
{ "whatwg.org", true },
{ "whd-guide.de", true },
- { "wheatgra.in", true },
{ "wheatley.nl", true },
{ "wheeler.kiwi.nz", true },
- { "wheelwide.co.uk", true },
{ "wheelwork.org", true },
{ "wheezie.be", true },
{ "when.fm", false },
{ "where2trip.com", true },
{ "whereiszakir.com", true },
{ "wheresbuzz.com.au", true },
- { "whexit.nl", true },
{ "whey-protein.ch", true },
{ "whiletrue.run", true },
{ "whing.org", true },
@@ -41547,6 +42867,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "whitelabelcashback.nl", true },
{ "whitelabeltickets.com", false },
{ "whitepharmacy.co.uk", true },
+ { "whiterose.goip.de", true },
{ "whiteshadowimperium.com", true },
{ "whitewebhosting.co.za", true },
{ "whitewebhosting.com", true },
@@ -41564,9 +42885,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "whoami.io", true },
{ "whocalld.com", true },
{ "whocalled.us", true },
+ { "whocalledme.xyz", true },
{ "whocybered.me", true },
{ "whoimg.com", false },
- { "whoisdhh.com", true },
{ "whoisthenightking.com", true },
{ "whoiswp.com", true },
{ "wholesalecbd.com", true },
@@ -41595,9 +42916,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wichitafoundationpros.com", true },
{ "wick-machinery.com", true },
{ "wickelfischfrance.fr", true },
+ { "wickerliving.com", true },
{ "wickrath.net", true },
{ "wideboxmacau.com", false },
{ "widegab.com", true },
+ { "wideinfo.org", true },
{ "widemann.de", true },
{ "widememory.com", true },
{ "widmer.bz", true },
@@ -41626,6 +42949,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wiimotion.de", true },
{ "wijaya.net", true },
{ "wijnbesteld.nl", true },
+ { "wijnimportjanssen.nl", true },
{ "wijnservices.nl", false },
{ "wijzijnwolf.nl", true },
{ "wiki-play.ru", true },
@@ -41647,6 +42971,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wikihow.vn", true },
{ "wikileaks.com", true },
{ "wikileaks.org", true },
+ { "wikilivres.ca", true },
{ "wikimedia.org", true },
{ "wikimediafoundation.org", true },
{ "wikimilk.org", true },
@@ -41663,7 +42988,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wilane.org", true },
{ "wilcodeboer.me", true },
{ "wild-turtles.com", true },
- { "wildboaratvparts.com", true },
{ "wildcatdiesel.com.au", true },
{ "wilddogdesign.co.uk", true },
{ "wildercerron.com", true },
@@ -41675,6 +42999,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wildwind.world", true },
{ "wildzoopark.co.uk", true },
{ "wildzoopark.com", true },
+ { "wilfrid-calixte.fr", false },
{ "wili.li", true },
{ "wiliquet.net", true },
{ "wilkushka.com", true },
@@ -41707,7 +43032,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "willvision.com", true },
{ "willywangstory.com", true },
{ "willywangstory.com.tw", true },
- { "willywangstory.org", true },
{ "wiloca.it", true },
{ "wilseyrealty.com", true },
{ "wimachtendienk.com", true },
@@ -41723,6 +43047,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "winddan.nz", true },
{ "windelnkaufen24.de", true },
{ "windforme.com", true },
+ { "windictus.net", true },
{ "windowcleaningexperts.net", true },
{ "windows-support.nu", true },
{ "windows-support.se", true },
@@ -41739,6 +43064,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wineparis.com", true },
{ "winepress.org", true },
{ "winfieldchen.me", true },
+ { "winfographics.com", true },
{ "winghill.com", true },
{ "wingify.com", true },
{ "wingmin.net", true },
@@ -41752,7 +43078,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wint.global", true },
{ "winter-auszeit.de", true },
{ "winter-elektro.de", true },
- { "winter.engineering", false },
{ "winterbergwebcams.com", true },
{ "wintercam.nl", true },
{ "winterfeldt.de", true },
@@ -41790,8 +43115,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wisv.ch", true },
{ "wisweb.no", true },
{ "wit.ai", true },
+ { "witch-spells.com", true },
{ "with-environment.com", true },
{ "with-planning.co.jp", true },
+ { "withdewhua.space", true },
{ "withextraveg.net", true },
{ "withgoogle.com", true },
{ "withinsecurity.com", true },
@@ -41804,7 +43131,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wivoc.nl", true },
{ "wiz.at", true },
{ "wiz.biz", true },
- { "wiz.farm", true },
{ "wizardbouncycastles.co.uk", true },
{ "wizzair.com", true },
{ "wizzley.com", true },
@@ -41835,8 +43161,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wm-talk.net", true },
{ "wmaccess.com", true },
{ "wmaccess.de", true },
+ { "wmcns.net", true },
{ "wmfusercontent.org", true },
{ "wmkowa.de", true },
+ { "wmnrj.com", true },
{ "wnu.com", true },
{ "wo-ist-elvira.net", true },
{ "wo2forum.nl", true },
@@ -41844,11 +43172,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wobble.ninja", true },
{ "wobblywotnotz.co.uk", true },
{ "woblex.cz", true },
+ { "wochennummern.de", true },
{ "wodinaz.com", true },
{ "wodka-division.de", true },
{ "woelkchen.me", true },
{ "wofflesoft.com", true },
- { "wofford-ecs.org", true },
+ { "wofford-ecs.org", false },
{ "woffs.de", true },
{ "wogo.org", true },
{ "woheni.de", true },
@@ -41856,9 +43185,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wohlpa.de", true },
{ "wohnbegleitung.ch", true },
{ "wohnsitz-ausland.com", true },
+ { "wojak.xyz", true },
{ "wokinghammotorhomes.com", true },
{ "wolfachtal-alpaka.de", true },
{ "wolfarth.info", true },
+ { "wolfcrow.com", true },
+ { "wolfdev.fr", true },
{ "wolfermann.org", true },
{ "wolferstetterkeller.de", true },
{ "wolfgang-braun.info", true },
@@ -41880,6 +43212,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wollwerk.org", true },
{ "wolszon.me", true },
{ "woltlab-demo.com", true },
+ { "womb.city", true },
{ "wombatalla.com.au", true },
{ "wombatnet.com", true },
{ "wombats.net", true },
@@ -41889,6 +43222,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "womensalespros.com", true },
{ "womenshairlossproject.com", true },
{ "womensmedassoc.com", true },
+ { "wonabo.com", true },
{ "wonder.com.mx", false },
{ "wonderbill.com", true },
{ "wonderbits.net", true },
@@ -41904,22 +43238,24 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wood-crafted.uk", true },
{ "woodbury.io", true },
{ "woodcoin.org", true },
- { "woodenson.com", true },
{ "woodev.us", true },
{ "woodinvillesepticservice.net", true },
+ { "woodlandboys.com", true },
{ "woodlandhillselectrical.com", true },
{ "woodlandsmetro.church", false },
{ "woodlandsvale.uk", true },
{ "woodlandwindows.com", true },
{ "woodomat.com", true },
{ "woodsidepottery.ca", true },
+ { "woodsmillparkapartmentsstl.com", true },
{ "woodstocksupply.com", true },
{ "woof.gq", true },
- { "woofsbakery.com", true },
{ "woohooyeah.nl", true },
{ "woonboulevardvolendam.nl", true },
{ "woontegelwinkel.nl", true },
+ { "wooplagaming.com", true },
{ "wootware.co.za", true },
+ { "wopplan.de", true },
{ "wopr.network", true },
{ "worca.de", true },
{ "worcade.com", true },
@@ -41930,6 +43266,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "word-grabber.com", true },
{ "wordcounter.net", true },
{ "wordher.com", true },
+ { "wordnietvindbaar.nl", true },
+ { "wordplay.one", true },
{ "wordpress.com", false },
{ "wordsmart.it", true },
{ "wordspy.com", true },
@@ -41961,7 +43299,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "worldcigars.com.br", true },
{ "worldcubeassociation.org", true },
{ "worldessays.com", true },
- { "worldeventscalendars.com", true },
{ "worldmeteo.info", true },
{ "worldnettps.com", true },
{ "worldofarganoil.com", true },
@@ -41975,12 +43312,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "worldsinperil.it", true },
{ "worldsoccerclips.com", true },
{ "worldstone777.com", true },
+ { "worldsy.com", true },
{ "worldtalk.de", true },
{ "wormbytes.ca", true },
{ "worst.horse", false },
{ "wort-suchen.de", true },
+ { "woshiluo.com", true },
{ "woshiluo.site", true },
{ "wot-tudasbazis.hu", true },
+ { "woti.dedyn.io", true },
{ "wotra-register.com", true },
{ "wotsunduk.ru", true },
{ "woudenberg.nl", true },
@@ -41990,7 +43330,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wouterslop.com", true },
{ "wouterslop.eu", true },
{ "wouterslop.nl", true },
+ { "wow-foederation.de", true },
{ "wow-screenshots.net", true },
+ { "wow202y5.com", true },
{ "wowaffixes.info", true },
{ "wowbouncycastles.co.uk", true },
{ "wowi-ffo.de", true },
@@ -42008,16 +43350,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wp-webagentur.de", true },
{ "wpac.de", true },
{ "wpandup.org", true },
+ { "wpbook-pacificmall.work", true },
+ { "wpboot.com", true },
{ "wpcanban.com", true },
{ "wpccu-cdn.org", true },
{ "wpccu.org", true },
- { "wpcdn.bid", true },
{ "wpcharged.nz", true },
+ { "wpcs.pro", true },
{ "wpdirecto.com", true },
{ "wpenhance.com", true },
{ "wpexplorer.com", true },
{ "wpformation.com", true },
{ "wpgoblin.com", true },
+ { "wpherc.com", true },
{ "wphostingblog.nl", true },
{ "wpinter.com", true },
{ "wpldn.uk", true },
@@ -42036,7 +43381,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wpsitemovers.com", true },
{ "wpsmackdown.com", true },
{ "wpsnelheid.nl", true },
- { "wpsono.com", true },
{ "wpthaiuser.com", true },
{ "wptomatic.de", true },
{ "wptorium.com", true },
@@ -42090,6 +43434,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wsgvet.com", true },
{ "wsl.sh", true },
{ "wsldp.com", true },
+ { "wsp-center.com", true },
{ "wsspalluto.de", true },
{ "wstudio.ch", true },
{ "wstx.com", true },
@@ -42106,9 +43451,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wtpmj.com", true },
{ "wtup.net", true },
{ "wtw.io", true },
+ { "wuav.net", true },
{ "wucke13.de", true },
{ "wuerfel.wf", true },
{ "wuerfelmail.de", true },
+ { "wug.fun", true },
{ "wug.jp", true },
{ "wug.news", true },
{ "wuifan.com", true },
@@ -42122,9 +43469,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wundi.net", true },
{ "wunschpreisauto.de", true },
{ "wunschzettel.de", true },
- { "wuppertal-2018.de", false },
- { "wuppertaler-kurrende.com", false },
- { "wuppertaler-kurrende.de", false },
+ { "wuppertaler-kurrende.com", true },
+ { "wuppertaler-kurrende.de", true },
{ "wutianyi.com", true },
{ "wuwuwu.me", true },
{ "wuxiaobai.win", true },
@@ -42133,17 +43479,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wuyue.photo", true },
{ "wv-n.de", true },
{ "wvg.myds.me", true },
+ { "ww-design.ch", true },
{ "ww0512.com", true },
{ "ww2onlineshop.com", true },
{ "wweforums.net", true },
{ "wweichen.com.cn", true },
{ "wwgc2011.se", true },
- { "wwjd.dynu.net", true },
{ "wwv-8722.com", true },
{ "www-33445.com", true },
{ "www-49889.com", true },
+ { "www-5287.com", true },
{ "www-68277.com", true },
- { "www-80036.com", true },
{ "www-8522.am", true },
{ "www-8522.com", true },
{ "www-86499.com", true },
@@ -42192,6 +43538,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "www.honeybadger.io", false },
{ "www.hyatt.com", false },
{ "www.icann.org", false },
+ { "www.intercom.io", true },
{ "www.irccloud.com", false },
{ "www.lastpass.com", false },
{ "www.linode.com", false },
@@ -42227,9 +43574,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wxdisco.com", true },
{ "wxforums.com", true },
{ "wxh.jp", true },
- { "wxkxsw.com", true },
{ "wxlog.cn", true },
- { "wxster.com", true },
{ "wxzm.sx", true },
{ "wyam.io", true },
{ "wybar.uk", true },
@@ -42238,9 +43583,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wygibanki.pl", true },
{ "wygodnie.pl", true },
{ "wyhpartnership.co.uk", true },
+ { "wyldfiresignage.com", true },
{ "wylog.ph", true },
{ "wynterhill.co.uk", true },
{ "wyo.cam", true },
+ { "wyomingexiles.com", true },
{ "wypemagazine.se", true },
{ "wyrickstaxidermy.com", true },
{ "wyrihaximus.net", true },
@@ -42250,7 +43597,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "wyydsb.com", true },
{ "wyydsb.xin", true },
{ "wyysoft.tk", true },
+ { "wyzphoto.nl", true },
{ "wzfou.com", true },
+ { "wzilverschoon.nl", true },
+ { "wzrd.in", true },
{ "wzyboy.org", true },
{ "x-iweb.ru", true },
{ "x-lan.be", true },
@@ -42259,11 +43609,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "x.st", true },
{ "x0r.be", true },
{ "x13.com", true },
- { "x1616.tk", true },
- { "x2d2.de", true },
+ { "x2d2.de", false },
{ "x378.ch", true },
{ "x509.io", true },
{ "x64architecture.com", true },
+ { "x6r3p2yjg1g6x7iu.myfritz.net", true },
{ "x7plus.com", true },
{ "xa.search.yahoo.com", false },
{ "xa1.uk", true },
@@ -42273,21 +43623,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xanadu-taxi.cz", true },
{ "xanadu-trans.cz", true },
{ "xanax.pro", false },
+ { "xanderbron.tech", true },
{ "xants.de", true },
{ "xatr0z.org", false },
- { "xawen.net", false },
- { "xb6638.com", true },
- { "xb6673.com", true },
- { "xb851.com", true },
- { "xb862.com", true },
- { "xb913.com", true },
- { "xb917.com", true },
- { "xb925.com", true },
- { "xb927.com", true },
- { "xb965.com", true },
- { "xb983.com", true },
+ { "xavierdmello.com", true },
+ { "xb83studio.ch", true },
{ "xbb.hk", true },
{ "xbb.li", true },
+ { "xbc.nz", true },
{ "xblau.com", true },
{ "xboxdownloadthat.com", true },
{ "xboxlivegoldshop.nl", true },
@@ -42301,17 +43644,15 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xceedgaming.com", true },
{ "xcentricmold.com", true },
{ "xclirion-support.de", true },
+ { "xcmfu.com", true },
{ "xcorpsolutions.com", true },
{ "xcvb.xyz", true },
{ "xd.cm", true },
{ "xdavidhu.me", true },
- { "xdawn.cn", true },
{ "xdeftor.com", true },
{ "xdos.io", true },
{ "xdtag.com", true },
{ "xdty.org", true },
- { "xecure.zone", true },
- { "xecureit.com", true },
{ "xeedbeam.me", true },
{ "xega.org", true },
{ "xehost.com", true },
@@ -42325,7 +43666,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xenophile.name", true },
{ "xenotropegames.com", true },
{ "xenoworld.de", true },
+ { "xentho.net", true },
{ "xentox.com", true },
+ { "xenum.ua", true },
{ "xerblade.com", true },
{ "xerhost.de", true },
{ "xerkus.pro", true },
@@ -42333,20 +43676,25 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xeryus.nl", true },
{ "xetown.com", true },
{ "xf-liam.com", true },
+ { "xf5888.com", true },
{ "xfce.space", true },
{ "xfcy.me", true },
{ "xfd3.de", true },
{ "xferion.com", true },
{ "xfix.pw", true },
+ { "xfrag-networks.com", true },
{ "xgame.com.tr", true },
{ "xgclan.com", true },
{ "xgn.es", true },
+ { "xgwap.com", true },
{ "xgzepto.cn", true },
{ "xhily.com", true },
{ "xhmikosr.io", true },
{ "xho.me", true },
{ "xhotlips.date", true },
+ { "xi.ht", true },
{ "xia.de", true },
+ { "xia100.xyz", true },
{ "xiamenshipbuilding.com", true },
{ "xiamuzi.com", true },
{ "xiangblog.com", true },
@@ -42354,29 +43702,30 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xiangweiqing.co.uk", true },
{ "xiangwenquan.me", true },
{ "xianjianruishiyouyiyuan.com", true },
- { "xiaocg.xyz", true },
+ { "xiaobude.cn", true },
+ { "xiaocg.xyz", false },
{ "xiaoguo.net", false },
+ { "xiaohui.love", true },
{ "xiaolanglang.net", true },
{ "xiaolong.link", true },
{ "xiaomao.tk", true },
{ "xiaomi.eu", true },
{ "xiaomionline24.pl", true },
- { "xiaoniaoyou.com", true },
{ "xiaoyu.net", true },
{ "xiaoyy.org", true },
{ "xiashali.me", true },
{ "xichtsbuch.de", true },
{ "xicreative.net", true },
+ { "xie38.com", true },
+ { "xie91.com", true },
{ "xiecongan.org", true },
{ "xif.at", true },
{ "xight.org", true },
{ "xilef.org", true },
- { "xiliant.com", false },
{ "xilkoi.net", true },
{ "xilou.org", true },
{ "ximble.com", true },
{ "ximbo.net", true },
- { "xinbo676.com", true },
{ "xinboyule.com", true },
{ "xinj.com", true },
{ "xinlandm.com", true },
@@ -42385,12 +43734,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xinuspeed.com", true },
{ "xinuspeedtest.com", true },
{ "xinuurl.com", true },
- { "xiongx.cn", true },
{ "xjd.vision", true },
{ "xjf6.com", true },
{ "xjjeeps.com", true },
{ "xjoi.net", true },
- { "xjoin.de", true },
{ "xjpvictor.info", true },
{ "xkblog.xyz", true },
{ "xkcd.pw", true },
@@ -42406,9 +43753,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xmedius.eu", true },
{ "xmenrevolution.com", true },
{ "xmflyrk.com", true },
- { "xmine128.tk", true },
{ "xmlbeam.org", true },
- { "xmlogin288.com", true },
{ "xmodule.org", true },
{ "xmpp.dk", true },
{ "xmppwocky.net", true },
@@ -42416,6 +43761,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xmtpro.com", true },
{ "xmusic.live", true },
{ "xmv.cz", true },
+ { "xn-----6kcbjcgl1atjj7aadbkxfxfe7a9yia.xn--p1ai", true },
{ "xn----7sbfl2alf8a.xn--p1ai", true },
{ "xn----8hcdn2ankm1bfq.com", true },
{ "xn----8sbjfacqfqshbh7afyeg.xn--80asehdb", true },
@@ -42423,6 +43769,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xn----zmcaltpp1mdh16i.com", true },
{ "xn--0iv967ab7w.xn--rhqv96g", true },
{ "xn--0kq33cz5c8wmwrqqw1d.com", true },
+ { "xn--12c3bpr6bsv7c.com", true },
+ { "xn--13-6kc0bufl.xn--p1ai", true },
{ "xn--158h.ml", true },
{ "xn--15tx89ctvm.xn--6qq986b3xl", true },
{ "xn--1yst51avkr.ga", true },
@@ -42430,6 +43778,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xn--24-6kch4bfqee.xn--p1ai", true },
{ "xn--24-glcia8dc.xn--p1ai", true },
{ "xn--2sxs9ol7o.com", true },
+ { "xn--3st814ec8r.cn", true },
+ { "xn--3stv82k.hk", true },
+ { "xn--3stv82k.tw", true },
{ "xn--48jwg508p.net", true },
{ "xn--4dbfsnr.xn--9dbq2a", true },
{ "xn--4kro7fswi.xn--6qq986b3xl", true },
@@ -42452,13 +43803,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xn--80azelb.xn--p1ai", true },
{ "xn--8bi.gq", true },
{ "xn--90accgba6bldkcbb7a.xn--p1acf", true },
+ { "xn--90aroj.xn--p1ai", true },
{ "xn--allgu-biker-o8a.de", true },
{ "xn--aviao-dra1a.pt", true },
{ "xn--b3c4f.xn--o3cw4h", true },
- { "xn--baron-bonzenbru-elb.com", true },
{ "xn--bckerei-trster-5hb11a.de", true },
{ "xn--ben-bank-8za.dk", true },
{ "xn--benbank-dxa.dk", true },
+ { "xn--bersetzung-8db.cc", true },
{ "xn--berwachungspaket-izb.at", true },
{ "xn--brneruhr-0za.ch", true },
{ "xn--cck4ax91r.com", true },
@@ -42477,6 +43829,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xn--dmontaa-9za.com", true },
{ "xn--dragni-g1a.de", true },
{ "xn--dtursfest-72a.dk", true },
+ { "xn--durhre-yxa.de", true },
{ "xn--e1aoahhqgn.xn--p1ai", true },
{ "xn--ecki0cd0bu9a4nsjb.com", true },
{ "xn--ehqw04eq6e.jp", true },
@@ -42493,6 +43846,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xn--frankierknig-djb.de", true },
{ "xn--fs5ak3f.com", true },
{ "xn--gfrr-7qa.li", true },
+ { "xn--gfrrli-yxa.ch", true },
+ { "xn--gi8hwa.tk", true },
{ "xn--heilendehnde-ocb.de", true },
{ "xn--hgbk4a00a.com", true },
{ "xn--hllrigl-90a.at", true },
@@ -42526,6 +43881,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xn--mgbmmp7eub.com", true },
{ "xn--mgbpkc7fz3awhe.com", true },
{ "xn--mgbuq0c.net", true },
+ { "xn--mgi-qla.life", true },
+ { "xn--mhringen-65a.de", true },
{ "xn--mllers-wxa.info", true },
{ "xn--mntsamling-0cb.dk", true },
{ "xn--myrepubic-wub.net", true },
@@ -42533,7 +43890,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xn--n8j7dygrbu0c31a5861bq8qb.com", true },
{ "xn--n8jp5083dnzs.net", true },
{ "xn--n8jtcugp92n4wc738f.net", true },
- { "xn--nf1a578axkh.xn--fiqs8s", true },
{ "xn--nrrdetval-v2ab.se", true },
{ "xn--o38h.tk", true },
{ "xn--obt757c.com", true },
@@ -42546,6 +43902,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xn--qckss0j.tk", true },
{ "xn--r8jzaf7977b09e.com", true },
{ "xn--rdiger-kuhlmann-zvb.de", true },
+ { "xn--registriertesexualstraftter-ykc.de", true },
{ "xn--reisebro-herrsching-bbc.de", true },
{ "xn--rlcus7b3d.xn--xkc2dl3a5ee0h", true },
{ "xn--roselire-60a.ch", true },
@@ -42557,12 +43914,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xn--schlerzeitung-ideenlos-ulc.de", true },
{ "xn--schpski-c1a.de", true },
{ "xn--schsischer-christstollen-qbc.shop", true },
- { "xn--seelenwchter-mcb.eu", true },
+ { "xn--solidaritt-am-ort-yqb.de", true },
{ "xn--spenijmazania-yhc.pl", true },
{ "xn--sz8h.ml", true },
{ "xn--t-oha.lv", true },
{ "xn--t8j4aa4nkg1h9bwcvud.com", true },
- { "xn--t8j4aa4nyhxa7duezbl49aqg5546e264d.net", true },
{ "xn--t8j4aa4nzg3a5euoxcwee.xyz", true },
{ "xn--tigreray-i1a.org", true },
{ "xn--u8jwd.ga", true },
@@ -42576,13 +43932,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xn--y-5ga.com", true },
{ "xn--y8j148r.xn--q9jyb4c", true },
{ "xn--y8jarb5hca.jp", true },
- { "xn--yrvp1ac68c.xn--6qq986b3xl", true },
{ "xn--z1tq4ldt4b.com", true },
{ "xn--zettlmeil-n1a.de", true },
- { "xn--zr9h.cf", true },
- { "xn--zr9h.ga", true },
- { "xn--zr9h.ml", true },
- { "xn--zr9h.tk", true },
{ "xn5.de", true },
{ "xnaas.info", true },
{ "xnet-x.net", true },
@@ -42604,7 +43955,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xperidia.com", true },
{ "xpletus.nl", true },
{ "xpoc.pro", true },
- { "xposedornot.com", true },
+ { "xpressable.com", true },
+ { "xpresswifi.network", true },
{ "xqk7.com", true },
{ "xr.cx", true },
{ "xr1s.me", true },
@@ -42624,7 +43976,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xss.ht", true },
{ "xss.name", true },
{ "xss.sk", true },
+ { "xssi.uk", true },
{ "xsteam.eu", true },
+ { "xstreamable.com", true },
{ "xsuper.net", true },
{ "xsz.jp", true },
{ "xtarget.ru", true },
@@ -42645,6 +43999,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xuanmeishe.net", true },
{ "xubo666.com", true },
{ "xuc.me", true },
+ { "xueanquan.com", true },
{ "xuedianshang.com", true },
{ "xuehao.net.cn", true },
{ "xuehuang666.cn", true },
@@ -42652,7 +44007,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xunn.io", true },
{ "xuntier.ch", true },
{ "xuyh0120.win", true },
- { "xvii.pl", true },
{ "xviimusic.com", true },
{ "xvt-blog.tk", true },
{ "xwalck.se", true },
@@ -42665,7 +44019,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "xy6161.com", true },
{ "xy6262.com", true },
{ "xy6363.com", true },
- { "xy7171.com", true },
{ "xy7272.com", true },
{ "xy7373.com", true },
{ "xyenon.bid", true },
@@ -42678,6 +44031,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "y11n.net", true },
{ "yabuisha.jp", true },
{ "yachigoya.com", true },
+ { "yachtlettering.com", true },
{ "yacineboumaza.fr", true },
{ "yacobo.com", true },
{ "yado-furu.com", true },
@@ -42707,15 +44061,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yandere.moe", true },
{ "yangcs.net", true },
{ "yangjingwen.cn", true },
+ { "yangjingwen.com", true },
{ "yangmaodang.org", true },
{ "yangmi.blog", true },
+ { "yangshangzhen.com", true },
{ "yanngraf.ch", true },
{ "yanngraf.com", true },
{ "yannic.world", true },
{ "yannick.cloud", true },
{ "yannik-buerkle.de", true },
{ "yannikbloscheck.com", true },
- { "yannis.codes", true },
{ "yanovich.net", true },
{ "yanqiyu.info", true },
{ "yans.io", true },
@@ -42726,27 +44081,28 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yarravilletownhouses.com.au", true },
{ "yaru.one", true },
{ "yassine-ayari.com", true },
+ { "yateshomesales.com", true },
{ "yatesun.com", true },
{ "yatorie.net", true },
{ "yatstudios.com", true },
{ "yatsuenpoon.com", true },
{ "yaup.tk", true },
{ "yawen.me", true },
- { "yaxim.org", true },
{ "ybin.me", true },
{ "ybresson.com", true },
{ "ybsul.com", true },
{ "ybti.net", true },
{ "ybzhao.com", true },
+ { "ycbmdevelopment.com", true },
+ { "ycbmstaging.com", true },
{ "ych.art", true },
{ "ycherbonnel.fr", true },
{ "ychon.com", true },
{ "ychong.com", true },
{ "yclan.net", true },
{ "ycnrg.org", true },
- { "yd.io", true },
{ "yeapdata.com", true },
- { "yecl.net", false },
+ { "yecl.net", true },
{ "yeesker.com", true },
{ "yell.ml", true },
{ "yellotalk.co", true },
@@ -42791,7 +44147,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yenpape.com", true },
{ "yep-pro.ch", true },
{ "yephy.com", true },
+ { "yes35.ru", true },
+ { "yesiammaisey.me", true },
{ "yeskx.com", true },
+ { "yesornut.com", true },
{ "yeswecan.co.bw", true },
{ "yeswehack.com", true },
{ "yetanalytics.io", true },
@@ -42806,6 +44165,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ygrene.com", true },
{ "ygreneworks.com", true },
{ "yh599.cc", true },
+ { "yh98768.com", true },
{ "yhaupenthal.org", true },
{ "yhb.io", true },
{ "yhe.me", true },
@@ -42815,6 +44175,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yhndnzj.com", true },
{ "yhong.me", true },
{ "yhrd.org", true },
+ { "yiffed.me", true },
{ "yigujin.cn", true },
{ "yiheng.moe", true },
{ "yii2.cc", true },
@@ -42828,19 +44189,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yiyuanzhong.com", true },
{ "yiyueread.com", true },
{ "yiz96.com", true },
- { "yjsoft.me", true },
{ "ykhut.com", true },
{ "yksityisyydensuoja.fi", true },
{ "ylde.de", true },
{ "ylinternal.com", true },
{ "ymarion.de", true },
- { "ymblaw.com", true },
{ "ymoah.nl", true },
{ "ymtsonline.org", true },
- { "ynnovasport.be", true },
{ "yoa.st", true },
{ "yoast.com", true },
{ "yobai-grouprec.jp", true },
+ { "yobai28.com", true },
{ "yobbelwobbel.de", false },
{ "yobify.com", true },
{ "yoga-alliance-teacher-training.com", true },
@@ -42849,18 +44208,20 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yoga-school.xyz", true },
{ "yoga-sky.de", true },
{ "yoga-zentrum-narayani.de", true },
- { "yogabhawnamission.com", true },
{ "yogacentric.co.uk", true },
{ "yogahealsinc.org", true },
{ "yogamea.school", true },
{ "yogananda-roma.org", true },
+ { "yogaprague.com", true },
{ "yogaschoolrishikesh.com", true },
+ { "yogeshbeniwal.com", false },
{ "yoibyoin.info", true },
{ "yoimise.net", true },
{ "yoitoko.city", true },
{ "yoitsu.moe", true },
{ "yokohama-legaloffice.jp", true },
{ "yokone3-kutikomi.com", true },
+ { "yolandgao.me", true },
{ "yolo.jetzt", true },
{ "yolobert.de", true },
{ "yoloboatrentals.com", true },
@@ -42868,7 +44229,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yombo.net", true },
{ "yon.co.il", true },
{ "yongbin.org", true },
+ { "yooguo123.com", true },
{ "yoonas.com", true },
+ { "yooomu.com", true },
{ "yooooex.com", true },
{ "yoplate.com", true },
{ "yoppoy.com", true },
@@ -42879,8 +44242,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yorkshiredalesinflatables.co.uk", true },
{ "yorkshireinflatables.co.uk", true },
{ "yorname.ml", false },
+ { "yosakoinight.com", true },
{ "yosbeda.com", true },
- { "yosemo.de", true },
{ "yoshibaworks.com", true },
{ "yoshitsugu.net", true },
{ "yosida-dental.com", true },
@@ -42906,6 +44269,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "youked.com", true },
{ "youkok2.com", true },
{ "youlovehers.com", true },
+ { "youmiracle.com", true },
{ "youms.de", true },
{ "young-sheldon.com", true },
{ "youngauthentic.cf", true },
@@ -42917,7 +44281,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "youpark.no", true },
{ "youpickfarms.org", true },
{ "your-erotic-stories.com", true },
- { "your-idc.tk", true },
{ "your-out.com", true },
{ "your-waterserver.com", true },
{ "youracnepro.com", true },
@@ -42927,6 +44290,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yourbittorrent.icu", true },
{ "yourbittorrent.pw", true },
{ "yourbittorrent2.com", true },
+ { "yourbodyknows.dk", true },
+ { "yourbodyknows.is", true },
{ "yourbonus.click", true },
{ "yourciso.com", true },
{ "yourcomputer.expert", true },
@@ -42938,11 +44303,14 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yourlanguages.de", true },
{ "yourmemorykeeper.co.uk", true },
{ "yourneighborhub.com", true },
+ { "yourscotlandtour.co.uk", true },
{ "yourskin.nl", true },
{ "yourstake.org", true },
{ "yourticketbooking.com", true },
+ { "yourtime.tv", true },
{ "yourtrainer.com", true },
{ "yousei.ne.jp", true },
+ { "youshouldbealiberal.com", true },
{ "yout.com", true },
{ "youth.gov", true },
{ "youthovation.org", true },
@@ -42952,6 +44320,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "youtube.com", true },
{ "youtubedownloader.com", true },
{ "youtuberis.lt", true },
+ { "youyoulemon.com", true },
{ "yoxall.me.uk", true },
{ "yoyoost.duckdns.org", true },
{ "ypart.eu", true },
@@ -42966,7 +44335,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "ysicing.net", true },
{ "ysicorp.com", true },
{ "yslbeauty.com", true },
- { "ysun.xyz", true },
{ "ytec.ca", true },
{ "ytpak.pk", true },
{ "ytreza.fr", true },
@@ -43032,9 +44400,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yubikeyservices.eu", true },
{ "yubiking.com", true },
{ "yue.la", true },
+ { "yue2.net", true },
{ "yuexiangzs.com", true },
- { "yugasun.com", true },
- { "yuisyo.ml", true },
+ { "yuhindo.com", true },
{ "yukari.cafe", true },
{ "yukari.cloud", true },
{ "yuki-nagato.com", true },
@@ -43043,8 +44411,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yukonlip.com", true },
{ "yukontec.com", true },
{ "yumeconcert.com", true },
+ { "yumikori.net", true },
{ "yunity.org", true },
{ "yunjishou.pro", true },
+ { "yunloc.com", true },
{ "yuntong.tw", true },
{ "yunzhu.li", true },
{ "yuricarlenzoli.it", true },
@@ -43055,14 +44425,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yushi.moe", true },
{ "yusu.org", true },
{ "yutakato.net", true },
- { "yutang.vn", true },
{ "yutangyun.com", true },
- { "yutuo.net", true },
{ "yuuki0xff.jp", true },
- { "yuuta.moe", true },
{ "yuwei.org", true },
{ "yuweiyang.xyz", true },
{ "yuxuan.org", true },
+ { "yuyiyang.eu.org", true },
{ "yuyo.com", true },
{ "yuyu.io", true },
{ "yuzei.tk", true },
@@ -43072,14 +44440,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "yvonnehaeusser.de", true },
{ "yvonnethomet.ch", true },
{ "yvonnewilhelmi.com", true },
+ { "yxs.me", true },
+ { "yxt521.com", true },
+ { "yxzero.xyz", true },
{ "yya.me", true },
{ "yyc.city", true },
+ { "yycbike.info", true },
{ "yyyy.xyz", true },
{ "yzal.io", true },
{ "yzcloud.me", true },
{ "yzer.club", true },
{ "yzimroni.net", true },
- { "z-konzept-nutrition.ru", true },
{ "z-latko.info", true },
{ "z-vector.com", true },
{ "z.ai", true },
@@ -43095,7 +44466,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zacarias.com.ar", true },
{ "zacavi.com.br", true },
{ "zacchaeus.co.uk", true },
- { "zacco.site", true },
{ "zach.codes", true },
{ "zacharopoulos.eu", true },
{ "zacharopoulos.org", false },
@@ -43107,6 +44477,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zachgibbens.org", true },
{ "zachschneider.ca", true },
{ "zaclys.com", false },
+ { "zadania.wiki", true },
{ "zafirus.name", true },
{ "zaghyr.org", true },
{ "zagluszaczgps.pl", true },
@@ -43117,6 +44488,11 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zahnarzt-kramer.ch", true },
{ "zahnarzt-muenich.de", true },
{ "zahnmedizinzentrum.com", true },
+ { "zaidan.de", true },
+ { "zaidan.eu", true },
+ { "zaidanfood.com", true },
+ { "zaidanfood.eu", true },
+ { "zaidanlebensmittelhandel.de", true },
{ "zajazd.biz", true },
{ "zakariya.blog", true },
{ "zakcutner.uk", true },
@@ -43125,13 +44501,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zakladam.cz", true },
{ "zakmccrac.de", true },
{ "zakojifarm.jp", true },
- { "zakoncontrol.com", false },
{ "zakr.es", true },
{ "zakspartiesandevents.com", true },
{ "zalamea.ph", true },
{ "zaloghaz.ro", true },
{ "zaltv.com", true },
{ "zalvus.com", true },
+ { "zalzalac.com", true },
{ "zamalektoday.com", true },
{ "zamocosmeticos.com.br", true },
{ "zamow.co", true },
@@ -43139,13 +44515,12 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zander.dk", true },
{ "zanellidesigns.co.uk", true },
{ "zanthra.com", true },
- { "zanzabar.it", true },
{ "zanzo.cz", true },
+ { "zap-mag.ru", true },
{ "zapier.com", true },
{ "zapmaster14.com", true },
{ "zappbuildapps.com", false },
{ "zarabiaj.com", true },
- { "zaratan.fr", true },
{ "zargescases.co.uk", true },
{ "zarmarket.org", true },
{ "zarpo.com.br", true },
@@ -43179,19 +44554,19 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zdrojak.cz", true },
{ "zdymak.by", true },
{ "ze3kr.com", true },
+ { "zeal-and.jp", true },
{ "zeal-interior.com", true },
{ "zealworks.jp", true },
{ "zebbra.ro", true },
- { "zebedeescastles.co.uk", true },
{ "zebulon.fr", true },
{ "zeds-official.com", true },
{ "zeebrieshoekvanholland.nl", true },
{ "zeel.com", true },
{ "zeestraten.nl", true },
{ "zeetoppers.nl", true },
- { "zeeuw.nl", true },
{ "zeguigui.com", true },
{ "zehkae.net", true },
+ { "zehrailkeakyildiz.com", true },
{ "zeibekiko-souvlaki.gr", true },
{ "zeidlertechnik.de", true },
{ "zeilenmethans.nl", true },
@@ -43199,7 +44574,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zeitpunkt-kulturmagazin.de", true },
{ "zekesnider.com", true },
{ "zekinteractive.com", true },
- { "zelfoverstappen.nl", true },
{ "zelfrijdendeautos.com", true },
{ "zemlova.cz", true },
{ "zen-diez.de", true },
@@ -43209,15 +44583,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zenevents.ro", true },
{ "zengdong.ren", true },
{ "zenghx.tk", false },
- { "zenithmedia.ca", true },
{ "zenk-security.com", true },
{ "zenlogic.com", true },
{ "zenluxuryliving.com", true },
{ "zennzimie.be", true },
{ "zennzimie.com", true },
+ { "zeno-dev.com", true },
{ "zenofa.co.id", true },
{ "zentask.io", true },
{ "zenti.cloud", true },
+ { "zenus-biometrics.com", true },
{ "zenvideocloud.com", true },
{ "zenvite.com", true },
{ "zenycosta.com", true },
@@ -43230,7 +44605,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zerg.uk", true },
{ "zerobounce.net", true },
{ "zerofy.de", true },
- { "zerolab.org", true },
{ "zeronet.io", true },
{ "zeropoint.bg", true },
{ "zeropush.com", true },
@@ -43248,6 +44622,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zettaplan.ru", true },
{ "zettlmeissl.de", true },
{ "zevelev.net", true },
+ { "zeyi.fan", true },
+ { "zf1898.com", true },
{ "zfast.com.br", true },
{ "zfg.li", true },
{ "zfly.me", true },
@@ -43256,14 +44632,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zgrep.org", true },
{ "zh.search.yahoo.com", false },
{ "zhang-hao.com", true },
+ { "zhang.fm", true },
+ { "zhang.ge", true },
{ "zhang.nz", true },
{ "zhangfangzhou.com", true },
- { "zhangge.net", true },
{ "zhanghao.me", true },
+ { "zhanghao.org", true },
{ "zhangheda.cf", true },
{ "zhangshuqiao.org", true },
{ "zhangsidan.com", true },
{ "zhangwendao.com", true },
+ { "zhangxuhu.com", true },
{ "zhangyuhao.com", true },
{ "zhangzifan.com", false },
{ "zhaoeq.com", true },
@@ -43274,11 +44653,17 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zhdd.pl", true },
{ "zhen-chen.com", true },
{ "zhengjie.com", true },
+ { "zhengouwu.com", true },
{ "zhenic.ir", true },
{ "zhi.ci", true },
+ { "zhih.me", true },
+ { "zhiin.net", true },
{ "zhiku8.com", true },
{ "zhima.io", true },
+ { "zhina.wiki", true },
{ "zhitanska.com", true },
+ { "zhiwei.me", true },
+ { "zhiyuan.cloud", true },
{ "zhl123.com", true },
{ "zhome.info", true },
{ "zhongzicili.ws", true },
@@ -43290,6 +44675,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zhthings.com", true },
{ "zhuihoude.com", true },
{ "zhuji.com", true },
+ { "zhy.us", true },
{ "zi.is", true },
{ "ziegler-heizung-frankfurt.de", true },
{ "zielonakarta.com", true },
@@ -43322,16 +44708,16 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zionnationalpark.net", true },
{ "zionsvillelocksmiths.com", true },
{ "zip.ch", true },
+ { "zipfworks.com", true },
{ "zipkey.de", true },
{ "zircode.com", true },
- { "zirka24.net", true },
{ "ziroh.be", true },
{ "zirrka.de", true },
{ "zirtek.ie", true },
{ "zirtual.com", true },
+ { "zistemo.com", true },
{ "zitseng.com", true },
{ "zittingskalender.be", true },
- { "zivagold.com", true },
{ "zivava.ge", true },
{ "zivmergers.com", true },
{ "zivver.be", true },
@@ -43345,6 +44731,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zixiao.wang", true },
{ "zizcollections.com", true },
{ "zjateaucafe.be", true },
+ { "zjc3.com", true },
{ "zjv.me", true },
{ "zk.com.co", true },
{ "zk.gd", true },
@@ -43352,6 +44739,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zkontrolujsiauto.cz", true },
{ "zkrypt.cc", true },
{ "zkzone.net", true },
+ { "zl0iu.com", true },
+ { "zl8862.com", true },
{ "zlatakus.cz", true },
{ "zlatosnadno.cz", true },
{ "zlaty-tyden.cz", true },
@@ -43371,7 +44760,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zmartagroup.se", true },
{ "znation.nl", true },
{ "znhglobalresources.com", true },
- { "zny.pw", true },
{ "zoarcampsite.uk", true },
{ "zobraz.cz", true },
{ "zobworks.com", true },
@@ -43382,10 +44770,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zodiacohouses.com", true },
{ "zoeller.me", true },
{ "zofrex.com", true },
+ { "zohair.xyz", true },
{ "zohar.wang", true },
{ "zoigl.club", true },
{ "zoisfinefood.com", true },
- { "zojadravai.com", true },
{ "zoki.art", true },
{ "zollihood.ch", true },
{ "zom.bi", true },
@@ -43407,10 +44795,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zook.systems", true },
{ "zoola.io", true },
{ "zoolaboo.de", true },
- { "zoological-gardens.eu", true },
{ "zoom.earth", true },
{ "zoomcar.pro", true },
{ "zoomek.com", true },
+ { "zooneshop.com", true },
{ "zooom.azurewebsites.net", true },
{ "zooom2.azurewebsites.net", true },
{ "zoop.ml", true },
@@ -43419,7 +44807,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zootime.net", true },
{ "zootime.org", true },
{ "zoowiki.us", true },
- { "zopy.com.br", true },
{ "zopyx.com", true },
{ "zor.com", true },
{ "zorasvobodova.cz", true },
@@ -43437,10 +44824,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zr.is", true },
{ "zravypapir.cz", true },
{ "zrhdwz.cn", true },
- { "zrkr.de", true },
{ "zrniecka-pre-sny.sk", true },
{ "zrnieckapresny.sk", true },
- { "zrt.io", false },
{ "zry-blog.top", true },
{ "zs-ohradni.cz", true },
{ "zs-reporyje.cz", true },
@@ -43451,6 +44836,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zsoltsandor.me", true },
{ "zsq.im", true },
{ "zsrbcs.com", true },
+ { "zstu.eu", true },
{ "zten.org", true },
{ "ztjuh.tk", true },
{ "zubel.it", false },
@@ -43467,7 +44853,9 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zulu.ro", true },
{ "zum-baur.de", true },
{ "zumazar.ru", true },
+ { "zumub.com", true },
{ "zund-app.com", true },
+ { "zundapp.one", true },
{ "zundapp529.nl", true },
{ "zundappachterhoek.nl", true },
{ "zuolan.me", false },
@@ -43477,7 +44865,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zuppy.pm", true },
{ "zuralski.net", true },
{ "zurgl.com", false },
- { "zurret.de", true },
{ "zusjesvandenbos.nl", true },
{ "zuzumba.es", true },
{ "zvps.uk", true },
@@ -43485,6 +44872,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zwartendijkstalling.nl", true },
{ "zwb3.de", true },
{ "zwerimex.com", true },
+ { "zwierslanguagetraining.nl", true },
{ "zwk.de", true },
{ "zwollemag.nl", true },
{ "zwollemagazine.nl", true },
@@ -43493,7 +44881,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zx7r.de", true },
{ "zxc.science", false },
{ "zxe.com.br", true },
- { "zxtcode.com", true },
+ { "zxssl.com", true },
+ { "zxxcq.com", true },
{ "zy.md", true },
{ "zybbo.com", true },
{ "zyciedlazwierzat.pl", true },
@@ -43505,10 +44894,10 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "zymmm.com", true },
{ "zypern-firma.com", true },
{ "zyria.de", true },
- { "zyrillezuno.com", true },
{ "zyul.ddns.net", true },
{ "zyzardx.com", true },
{ "zyzsdy.com", true },
+ { "zzbnet.cn", true },
{ "zzekj.net", true },
{ "zzpd.nl", false },
{ "zzsec.org", true },
diff --git a/security/manager/ssl/nsSiteSecurityService.cpp b/security/manager/ssl/nsSiteSecurityService.cpp
index 1d79844ff..fc38f4e64 100644
--- a/security/manager/ssl/nsSiteSecurityService.cpp
+++ b/security/manager/ssl/nsSiteSecurityService.cpp
@@ -211,6 +211,7 @@ nsSiteSecurityService::nsSiteSecurityService()
: mMaxMaxAge(kSixtyDaysInSeconds)
, mUsePreloadList(true)
, mPreloadListTimeOffset(0)
+ , mUseStsService(true)
{
}
@@ -239,6 +240,10 @@ nsSiteSecurityService::Init()
"network.stricttransportsecurity.preloadlist", true);
mozilla::Preferences::AddStrongObserver(this,
"network.stricttransportsecurity.preloadlist");
+ mUseStsService = mozilla::Preferences::GetBool(
+ "network.stricttransportsecurity.enabled", true);
+ mozilla::Preferences::AddStrongObserver(this,
+ "network.stricttransportsecurity.enabled");
mProcessPKPHeadersFromNonBuiltInRoots = mozilla::Preferences::GetBool(
"security.cert_pinning.process_headers_from_non_builtin_roots", false);
mozilla::Preferences::AddStrongObserver(this,
@@ -335,6 +340,11 @@ nsSiteSecurityService::SetHSTSState(uint32_t aType,
aHSTSState == SecurityPropertyNegative),
"HSTS State must be SecurityPropertySet or SecurityPropertyNegative");
+ // Exit early if STS not enabled
+ if (!mUseStsService) {
+ return NS_OK;
+ }
+
int64_t expiretime = ExpireTimeFromMaxAge(maxage);
SiteHSTSState siteState(expiretime, aHSTSState, includeSubdomains);
nsAutoCString stateString;
@@ -922,6 +932,13 @@ nsSiteSecurityService::IsSecureURI(uint32_t aType, nsIURI* aURI,
nsAutoCString hostname;
nsresult rv = GetHost(aURI, hostname);
NS_ENSURE_SUCCESS(rv, rv);
+
+ // Exit early if STS not enabled
+ if (!mUseStsService) {
+ *aResult = false;
+ return NS_OK;
+ }
+
/* An IP address never qualifies as a secure URI. */
if (HostIsIPAddress(hostname.get())) {
*aResult = false;
@@ -980,6 +997,11 @@ nsSiteSecurityService::IsSecureHost(uint32_t aType, const char* aHost,
*aCached = false;
}
+ // Exit early if checking HSTS and STS not enabled
+ if (!mUseStsService && aType == nsISiteSecurityService::HEADER_HSTS) {
+ return NS_OK;
+ }
+
/* An IP address never qualifies as a secure URI. */
if (HostIsIPAddress(aHost)) {
return NS_OK;
@@ -1282,6 +1304,8 @@ nsSiteSecurityService::Observe(nsISupports *subject,
if (strcmp(topic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) == 0) {
mUsePreloadList = mozilla::Preferences::GetBool(
"network.stricttransportsecurity.preloadlist", true);
+ mUseStsService = mozilla::Preferences::GetBool(
+ "network.stricttransportsecurity.enabled", true);
mPreloadListTimeOffset =
mozilla::Preferences::GetInt("test.currentTimeOffsetSeconds", 0);
mProcessPKPHeadersFromNonBuiltInRoots = mozilla::Preferences::GetBool(
diff --git a/security/manager/ssl/nsSiteSecurityService.h b/security/manager/ssl/nsSiteSecurityService.h
index c40180550..63afee377 100644
--- a/security/manager/ssl/nsSiteSecurityService.h
+++ b/security/manager/ssl/nsSiteSecurityService.h
@@ -150,6 +150,7 @@ private:
uint64_t mMaxMaxAge;
bool mUsePreloadList;
+ bool mUseStsService;
int64_t mPreloadListTimeOffset;
bool mProcessPKPHeadersFromNonBuiltInRoots;
RefPtr<mozilla::DataStorage> mSiteStateStorage;
diff --git a/toolkit/components/alerts/nsXULAlerts.cpp b/toolkit/components/alerts/nsXULAlerts.cpp
index 882617637..d353d8714 100644
--- a/toolkit/components/alerts/nsXULAlerts.cpp
+++ b/toolkit/components/alerts/nsXULAlerts.cpp
@@ -18,7 +18,6 @@
#include "nsIWindowWatcher.h"
using namespace mozilla;
-using mozilla::dom::NotificationTelemetryService;
#define ALERT_CHROME_URL "chrome://global/content/alerts/alert.xul"
@@ -185,20 +184,6 @@ nsXULAlerts::ShowAlertWithIconURI(nsIAlertNotification* aAlert,
NS_ENSURE_SUCCESS(rv, rv);
if (mDoNotDisturb) {
- if (!inPrivateBrowsing) {
- RefPtr<NotificationTelemetryService> telemetry =
- NotificationTelemetryService::GetInstance();
- if (telemetry) {
- // Record the number of unique senders for XUL alerts. The OS X and
- // libnotify backends will fire `alertshow` even if "do not disturb"
- // is enabled. In that case, `NotificationObserver` will record the
- // sender.
- nsCOMPtr<nsIPrincipal> principal;
- if (NS_SUCCEEDED(aAlert->GetPrincipal(getter_AddRefs(principal)))) {
- Unused << NS_WARN_IF(NS_FAILED(telemetry->RecordSender(principal)));
- }
- }
- }
if (aAlertListener)
aAlertListener->Observe(nullptr, "alertfinished", cookie.get());
return NS_OK;
diff --git a/toolkit/components/downloads/ApplicationReputation.cpp b/toolkit/components/downloads/ApplicationReputation.cpp
index a369ca884..9fdc8a103 100644
--- a/toolkit/components/downloads/ApplicationReputation.cpp
+++ b/toolkit/components/downloads/ApplicationReputation.cpp
@@ -117,14 +117,6 @@ private:
friend class PendingDBLookup;
- // Telemetry states.
- // Status of the remote response (valid or not).
- enum SERVER_RESPONSE_TYPES {
- SERVER_RESPONSE_VALID = 0,
- SERVER_RESPONSE_FAILED = 1,
- SERVER_RESPONSE_INVALID = 2,
- };
-
// Number of blocklist and allowlist hits we have seen.
uint32_t mBlocklistCount;
uint32_t mAllowlistCount;
diff --git a/toolkit/components/osfile/NativeOSFileInternals.cpp b/toolkit/components/osfile/NativeOSFileInternals.cpp
index e4725d390..36517d9ec 100644
--- a/toolkit/components/osfile/NativeOSFileInternals.cpp
+++ b/toolkit/components/osfile/NativeOSFileInternals.cpp
@@ -232,7 +232,6 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(AbstractResult)
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(AbstractResult)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(AbstractResult)
diff --git a/toolkit/components/passwordmgr/LoginManagerParent.jsm b/toolkit/components/passwordmgr/LoginManagerParent.jsm
index e472fb61c..2d75dac7a 100644
--- a/toolkit/components/passwordmgr/LoginManagerParent.jsm
+++ b/toolkit/components/passwordmgr/LoginManagerParent.jsm
@@ -102,8 +102,13 @@ var LoginManagerParent = {
}
case "RemoteLogins:findRecipes": {
- let formHost = (new URL(data.formOrigin)).host;
- return this._recipeManager.getRecipesForHost(formHost);
+ try {
+ let formHost = (new URL(data.formOrigin)).host;
+ return this._recipeManager.getRecipesForHost(formHost);
+ } catch(e) {
+ // Just return an empty set in case of error.
+ return new Set();
+ }
}
case "RemoteLogins:onFormSubmit": {
diff --git a/toolkit/components/perfmonitoring/nsPerformanceStats.cpp b/toolkit/components/perfmonitoring/nsPerformanceStats.cpp
index 33aeaf7c2..59d84ced1 100644
--- a/toolkit/components/perfmonitoring/nsPerformanceStats.cpp
+++ b/toolkit/components/perfmonitoring/nsPerformanceStats.cpp
@@ -662,9 +662,6 @@ nsPerformanceStatsService::nsPerformanceStatsService()
nsPerformanceGroup::GroupScope::RUNTIME // scope
))
, mIsHandlingUserInput(false)
- , mProcessStayed(0)
- , mProcessMoved(0)
- , mProcessUpdateCounter(0)
, mIsMonitoringPerCompartment(false)
, mJankAlertThreshold(mozilla::MaxValue<uint64_t>::value) // By default, no alerts
, mJankAlertBufferingDelay(1000 /* ms */)
@@ -953,13 +950,6 @@ nsPerformanceStatsService::SetJankAlertBufferingDelay(uint32_t value) {
return NS_OK;
}
-nsresult
-nsPerformanceStatsService::UpdateTelemetry()
-{
- /* STUB */
- return NS_OK;
-}
-
/* static */ nsIPerformanceStats*
nsPerformanceStatsService::GetStatsForGroup(const js::PerformanceGroup* group)
@@ -992,12 +982,6 @@ nsPerformanceStatsService::GetSnapshot(JSContext* cx, nsIPerformanceSnapshot * *
}
}
- js::GetPerfMonitoringTestCpuRescheduling(cx, &mProcessStayed, &mProcessMoved);
-
- if (++mProcessUpdateCounter % 10 == 0) {
- mozilla::Unused << UpdateTelemetry();
- }
-
snapshot.forget(aSnapshot);
return NS_OK;
@@ -1098,6 +1082,9 @@ nsPerformanceStatsService::GetPerformanceGroups(JSContext* cx,
return false;
}
+ // Returning a vector that is too large would cause allocations all over the
+ // place in the JS engine. We want to be sure that all data is stored inline.
+ MOZ_ASSERT(out.length() <= out.sMaxInlineStorage);
return true;
}
@@ -1326,8 +1313,12 @@ nsPerformanceStatsService::GetResources(uint64_t* userTime,
void
nsPerformanceStatsService::NotifyJankObservers(const mozilla::Vector<uint64_t>& aPreviousJankLevels) {
- GroupVector alerts;
- mPendingAlerts.swap(alerts);
+
+ // The move operation is generally constant time, unless
+ // `mPendingAlerts.length()` is very small, in which case it's fast anyway.
+ GroupVector alerts(Move(mPendingAlerts));
+ mPendingAlerts = GroupVector(); // Reconstruct after `Move`.
+
if (!mPendingAlertsCollector) {
// We are shutting down.
return;
diff --git a/toolkit/components/perfmonitoring/nsPerformanceStats.h b/toolkit/components/perfmonitoring/nsPerformanceStats.h
index c82a3e92c..661a78a1a 100644
--- a/toolkit/components/perfmonitoring/nsPerformanceStats.h
+++ b/toolkit/components/perfmonitoring/nsPerformanceStats.h
@@ -19,7 +19,7 @@
class nsPerformanceGroup;
class nsPerformanceGroupDetails;
-typedef mozilla::Vector<RefPtr<nsPerformanceGroup>> GroupVector;
+typedef mozilla::Vector<RefPtr<nsPerformanceGroup>, 8> GroupVector;
/**
* A data structure for registering observers interested in
@@ -363,21 +363,6 @@ protected:
nsPerformanceGroup* group);
-
-
- /**********************************************************
- *
- * To check whether our algorithm makes sense, we keep count of the
- * number of times the process has been rescheduled to another CPU
- * while we were monitoring the performance of a group and we upload
- * this data through Telemetry.
- */
- nsresult UpdateTelemetry();
-
- uint64_t mProcessStayed;
- uint64_t mProcessMoved;
- uint32_t mProcessUpdateCounter;
-
/**********************************************************
*
* Options controlling measurements.
diff --git a/toolkit/components/places/Database.cpp b/toolkit/components/places/Database.cpp
index a87c14b37..08c382377 100644
--- a/toolkit/components/places/Database.cpp
+++ b/toolkit/components/places/Database.cpp
@@ -597,7 +597,7 @@ Database::BackupAndReplaceDatabaseFile(nsCOMPtr<mozIStorageService>& aStorage)
// If anything fails from this point on, we have a stale connection or
// database file, and there's not much more we can do.
// The only thing we can try to do is to replace the database on the next
- // startup, and report the problem through telemetry.
+ // startup.
{
enum eCorruptDBReplaceStage : int8_t {
stage_closing = 0,
diff --git a/toolkit/components/places/Helpers.cpp b/toolkit/components/places/Helpers.cpp
index dda162197..13e040bfd 100644
--- a/toolkit/components/places/Helpers.cpp
+++ b/toolkit/components/places/Helpers.cpp
@@ -382,12 +382,5 @@ AsyncStatementCallbackNotifier::HandleCompletion(uint16_t aReason)
////////////////////////////////////////////////////////////////////////////////
//// AsyncStatementCallbackNotifier
-NS_IMETHODIMP
-AsyncStatementTelemetryTimer::HandleCompletion(uint16_t aReason)
-{
- /* STUB */
- return NS_OK;
-}
-
} // namespace places
} // namespace mozilla
diff --git a/toolkit/components/places/Helpers.h b/toolkit/components/places/Helpers.h
index 654e42539..4e79abc75 100644
--- a/toolkit/components/places/Helpers.h
+++ b/toolkit/components/places/Helpers.h
@@ -15,7 +15,6 @@
#include "nsThreadUtils.h"
#include "nsProxyRelease.h"
#include "prtime.h"
-#include "mozilla/Telemetry.h"
namespace mozilla {
namespace places {
@@ -270,26 +269,6 @@ private:
const char* mTopic;
};
-/**
- * Used to notify a topic to system observers on async execute completion.
- */
-class AsyncStatementTelemetryTimer : public AsyncStatementCallback
-{
-public:
- explicit AsyncStatementTelemetryTimer(Telemetry::ID aHistogramId,
- TimeStamp aStart = TimeStamp::Now())
- : mHistogramId(aHistogramId)
- , mStart(aStart)
- {
- }
-
- NS_IMETHOD HandleCompletion(uint16_t aReason);
-
-private:
- const Telemetry::ID mHistogramId;
- const TimeStamp mStart;
-};
-
} // namespace places
} // namespace mozilla
diff --git a/toolkit/components/places/nsNavHistory.cpp b/toolkit/components/places/nsNavHistory.cpp
index 49d911d65..e72526022 100644
--- a/toolkit/components/places/nsNavHistory.cpp
+++ b/toolkit/components/places/nsNavHistory.cpp
@@ -3063,17 +3063,15 @@ nsNavHistory::Observe(nsISupports *aSubject, const char *aTopic,
namespace {
-class DecayFrecencyCallback : public AsyncStatementTelemetryTimer
+class DecayFrecencyCallback : public AsyncStatementCallback
{
public:
DecayFrecencyCallback()
- : AsyncStatementTelemetryTimer(Telemetry::PLACES_IDLE_FRECENCY_DECAY_TIME_MS)
{
}
NS_IMETHOD HandleCompletion(uint16_t aReason)
{
- (void)AsyncStatementTelemetryTimer::HandleCompletion(aReason);
if (aReason == REASON_FINISHED) {
nsNavHistory *navHistory = nsNavHistory::GetHistoryService();
NS_ENSURE_STATE(navHistory);
diff --git a/toolkit/components/search/current/nsSearchService.js b/toolkit/components/search/current/nsSearchService.js
index 99e73b50b..6e8f6da43 100644
--- a/toolkit/components/search/current/nsSearchService.js
+++ b/toolkit/components/search/current/nsSearchService.js
@@ -21,6 +21,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "OS",
"resource://gre/modules/osfile.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Task",
"resource://gre/modules/Task.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "Deprecated",
+ "resource://gre/modules/Deprecated.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "SearchStaticData",
"resource://gre/modules/SearchStaticData.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "setTimeout",
@@ -2691,6 +2693,13 @@ SearchService.prototype = {
return;
}
+ let performanceWarning =
+ "Search service falling back to synchronous initialization. " +
+ "This is generally the consequence of an add-on using a deprecated " +
+ "search service API.";
+ Deprecated.perfWarning(performanceWarning, "https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIBrowserSearchService#async_warning");
+ LOG(performanceWarning);
+
this._syncInit();
if (!Components.isSuccessCode(this._initRV)) {
throw this._initRV;
diff --git a/toolkit/components/search/orginal/nsSearchService.js b/toolkit/components/search/orginal/nsSearchService.js
index 8d81e1a27..6b23724a7 100644
--- a/toolkit/components/search/orginal/nsSearchService.js
+++ b/toolkit/components/search/orginal/nsSearchService.js
@@ -2917,12 +2917,12 @@ SearchService.prototype = {
return;
}
- let warning =
+ let performanceWarning =
"Search service falling back to synchronous initialization. " +
"This is generally the consequence of an add-on using a deprecated " +
"search service API.";
- Deprecated.warning(warning, "https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIBrowserSearchService#async_warning");
- LOG(warning);
+ Deprecated.perfWarning(performanceWarning, "https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIBrowserSearchService#async_warning");
+ LOG(performanceWarning);
engineMetadataService.syncInit();
this._syncInit();
diff --git a/toolkit/components/telemetry/TelemetryHistogram.cpp b/toolkit/components/telemetry/TelemetryHistogram.cpp
index ba0288979..30fcc05ee 100644
--- a/toolkit/components/telemetry/TelemetryHistogram.cpp
+++ b/toolkit/components/telemetry/TelemetryHistogram.cpp
@@ -2090,11 +2090,6 @@ void TelemetryHistogram::InitializeGlobalState(bool canRecordBase,
// don't go unnoticed.
// TODO: Compare explicitly with gHistograms[<histogram id>].bucketCount here
// once we can make gHistograms constexpr (requires VS2015).
- static_assert((JS::gcreason::NUM_TELEMETRY_REASONS == 100),
- "NUM_TELEMETRY_REASONS is assumed to be a fixed value in Histograms.json."
- " If this was an intentional change, update this assert with its value "
- "and update the n_values for the following in Histograms.json: "
- "GC_MINOR_REASON, GC_MINOR_REASON_LONG, GC_REASON_2");
static_assert((mozilla::StartupTimeline::MAX_EVENT_ID == 16),
"MAX_EVENT_ID is assumed to be a fixed value in Histograms.json. If this"
" was an intentional change, update this assert with its value and update"
@@ -2689,37 +2684,5 @@ TelemetryHistogram::IPCTimerFired(nsITimer* aTimer, void* aClosure)
}
}
- switch (XRE_GetProcessType()) {
- case GeckoProcessType_Content: {
- mozilla::dom::ContentChild* contentChild = mozilla::dom::ContentChild::GetSingleton();
- mozilla::Unused << NS_WARN_IF(!contentChild);
- if (contentChild) {
- if (accumulationsToSend.Length()) {
- mozilla::Unused <<
- NS_WARN_IF(!contentChild->SendAccumulateChildHistogram(accumulationsToSend));
- }
- if (keyedAccumulationsToSend.Length()) {
- mozilla::Unused <<
- NS_WARN_IF(!contentChild->SendAccumulateChildKeyedHistogram(keyedAccumulationsToSend));
- }
- }
- break;
- }
- case GeckoProcessType_GPU: {
- if (mozilla::gfx::GPUParent* gpu = mozilla::gfx::GPUParent::GetSingleton()) {
- if (accumulationsToSend.Length()) {
- mozilla::Unused << gpu->SendAccumulateChildHistogram(accumulationsToSend);
- }
- if (keyedAccumulationsToSend.Length()) {
- mozilla::Unused << gpu->SendAccumulateChildKeyedHistogram(keyedAccumulationsToSend);
- }
- }
- break;
- }
- default:
- MOZ_ASSERT_UNREACHABLE("Unsupported process type");
- break;
- }
-
gIPCTimerArmed = false;
}
diff --git a/toolkit/components/thumbnails/BackgroundPageThumbs.jsm b/toolkit/components/thumbnails/BackgroundPageThumbs.jsm
index 3eec9827d..3ba0c346c 100644
--- a/toolkit/components/thumbnails/BackgroundPageThumbs.jsm
+++ b/toolkit/components/thumbnails/BackgroundPageThumbs.jsm
@@ -41,6 +41,9 @@ XPCOMUtils.defineLazyModuleGetter(this, "ContextualIdentityService",
"resource://gre/modules/ContextualIdentityService.jsm");
const global = this;
+// contains base64 version of a placeholder thumbnail
+#include blankthumb.inc
+
const BackgroundPageThumbs = {
/**
diff --git a/toolkit/components/thumbnails/PageThumbs.jsm b/toolkit/components/thumbnails/PageThumbs.jsm
index 5c7754b31..b0affee92 100644
--- a/toolkit/components/thumbnails/PageThumbs.jsm
+++ b/toolkit/components/thumbnails/PageThumbs.jsm
@@ -28,9 +28,6 @@ const MAX_THUMBNAIL_AGE_SECS = 172800; // 2 days == 60*60*24*2 == 172800 secs.
*/
const THUMBNAIL_DIRECTORY = "thumbnails";
-// contains base64 version of a placeholder thumbnail
-#include blankthumb.inc
-
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
Cu.import("resource://gre/modules/PromiseWorker.jsm", this);
Cu.import("resource://gre/modules/Promise.jsm", this);
diff --git a/toolkit/components/thumbnails/moz.build b/toolkit/components/thumbnails/moz.build
index d4003c635..e4a178998 100644
--- a/toolkit/components/thumbnails/moz.build
+++ b/toolkit/components/thumbnails/moz.build
@@ -13,13 +13,13 @@ EXTRA_COMPONENTS += [
]
EXTRA_JS_MODULES += [
- 'BackgroundPageThumbs.jsm',
+ 'PageThumbs.jsm',
'PageThumbsWorker.js',
'PageThumbUtils.jsm',
]
EXTRA_PP_JS_MODULES += [
- 'PageThumbs.jsm',
+ 'BackgroundPageThumbs.jsm',
]
diff --git a/toolkit/components/url-classifier/nsUrlClassifierStreamUpdater.cpp b/toolkit/components/url-classifier/nsUrlClassifierStreamUpdater.cpp
index e230f6951..9319822d5 100644
--- a/toolkit/components/url-classifier/nsUrlClassifierStreamUpdater.cpp
+++ b/toolkit/components/url-classifier/nsUrlClassifierStreamUpdater.cpp
@@ -20,7 +20,6 @@
#include "mozilla/Logging.h"
#include "nsIInterfaceRequestor.h"
#include "mozilla/LoadContext.h"
-#include "mozilla/Telemetry.h"
#include "nsContentUtils.h"
#include "nsIURLFormatter.h"
@@ -503,115 +502,6 @@ nsUrlClassifierStreamUpdater::AddRequestBody(const nsACString &aRequestBody)
return NS_OK;
}
-// Map the HTTP response code to a Telemetry bucket
-static uint32_t HTTPStatusToBucket(uint32_t status)
-{
- uint32_t statusBucket;
- switch (status) {
- case 100:
- case 101:
- // Unexpected 1xx return code
- statusBucket = 0;
- break;
- case 200:
- // OK - Data is available in the HTTP response body.
- statusBucket = 1;
- break;
- case 201:
- case 202:
- case 203:
- case 205:
- case 206:
- // Unexpected 2xx return code
- statusBucket = 2;
- break;
- case 204:
- // No Content
- statusBucket = 3;
- break;
- case 300:
- case 301:
- case 302:
- case 303:
- case 304:
- case 305:
- case 307:
- case 308:
- // Unexpected 3xx return code
- statusBucket = 4;
- break;
- case 400:
- // Bad Request - The HTTP request was not correctly formed.
- // The client did not provide all required CGI parameters.
- statusBucket = 5;
- break;
- case 401:
- case 402:
- case 405:
- case 406:
- case 407:
- case 409:
- case 410:
- case 411:
- case 412:
- case 414:
- case 415:
- case 416:
- case 417:
- case 421:
- case 426:
- case 428:
- case 429:
- case 431:
- case 451:
- // Unexpected 4xx return code
- statusBucket = 6;
- break;
- case 403:
- // Forbidden - The client id is invalid.
- statusBucket = 7;
- break;
- case 404:
- // Not Found
- statusBucket = 8;
- break;
- case 408:
- // Request Timeout
- statusBucket = 9;
- break;
- case 413:
- // Request Entity Too Large - Bug 1150334
- statusBucket = 10;
- break;
- case 500:
- case 501:
- case 510:
- // Unexpected 5xx return code
- statusBucket = 11;
- break;
- case 502:
- case 504:
- case 511:
- // Local network errors, we'll ignore these.
- statusBucket = 12;
- break;
- case 503:
- // Service Unavailable - The server cannot handle the request.
- // Clients MUST follow the backoff behavior specified in the
- // Request Frequency section.
- statusBucket = 13;
- break;
- case 505:
- // HTTP Version Not Supported - The server CANNOT handle the requested
- // protocol major version.
- statusBucket = 14;
- break;
- default:
- statusBucket = 15;
- };
- return statusBucket;
-}
-
///////////////////////////////////////////////////////////////////////////////
// nsIStreamListenerObserver implementation
diff --git a/toolkit/components/webextensions/ExtensionUtils.jsm b/toolkit/components/webextensions/ExtensionUtils.jsm
index e7f768c07..04e767cb5 100644
--- a/toolkit/components/webextensions/ExtensionUtils.jsm
+++ b/toolkit/components/webextensions/ExtensionUtils.jsm
@@ -990,7 +990,8 @@ function findPathInObject(obj, path, printErrors = true) {
for (let elt of path.split(".")) {
if (!obj || !(elt in obj)) {
if (printErrors) {
- Cu.reportError(`WebExtension API ${path} not found (it may be unimplemented by Firefox).`);
+ let appname = Services.appinfo.name;
+ Cu.reportError(`WebExtension API ${path} not found (it may be unimplemented by ${appname}).`);
}
return null;
}
diff --git a/toolkit/modules/Deprecated.jsm b/toolkit/modules/Deprecated.jsm
index 7491a4938..981cd13ab 100644
--- a/toolkit/modules/Deprecated.jsm
+++ b/toolkit/modules/Deprecated.jsm
@@ -9,15 +9,21 @@ this.EXPORTED_SYMBOLS = [ "Deprecated" ];
const Cu = Components.utils;
const Ci = Components.interfaces;
const PREF_DEPRECATION_WARNINGS = "devtools.errorconsole.deprecation_warnings";
+const PREF_PERFORMANCE_WARNINGS = "devtools.errorconsole.performance_warnings";
Cu.import("resource://gre/modules/Services.jsm");
// A flag that indicates whether deprecation warnings should be logged.
-var logWarnings = Services.prefs.getBoolPref(PREF_DEPRECATION_WARNINGS);
+var logDepWarnings = Services.prefs.getBoolPref(PREF_DEPRECATION_WARNINGS);
+var logPerfWarnings = Services.prefs.getBoolPref(PREF_PERFORMANCE_WARNINGS);
Services.prefs.addObserver(PREF_DEPRECATION_WARNINGS,
function (aSubject, aTopic, aData) {
- logWarnings = Services.prefs.getBoolPref(PREF_DEPRECATION_WARNINGS);
+ logDepWarnings = Services.prefs.getBoolPref(PREF_DEPRECATION_WARNINGS);
+ }, false);
+Services.prefs.addObserver(PREF_PERFORMANCE_WARNINGS,
+ function (aSubject, aTopic, aData) {
+ logPerfWarnings = Services.prefs.getBoolPref(PREF_PERFORMANCE_WARNINGS);
}, false);
/**
@@ -58,7 +64,7 @@ this.Deprecated = {
* logged.
*/
warning: function (aText, aUrl, aStack) {
- if (!logWarnings) {
+ if (!logDepWarnings) {
return;
}
@@ -71,7 +77,42 @@ this.Deprecated = {
let textMessage = "DEPRECATION WARNING: " + aText +
"\nYou may find more details about this deprecation at: " +
- aUrl + "\n" +
+ aUrl + "\nCallstack:\n" +
+ // Append a callstack part to the deprecation message.
+ stringifyCallstack(aStack);
+
+ // Report deprecation warning.
+ Cu.reportError(textMessage);
+ },
+
+ /**
+ * Log a performance warning.
+ *
+ * @param string aText
+ * Performance issue warning text.
+ * @param string aUrl
+ * A URL pointing to documentation describing performance
+ * issue and the way to address it.
+ * @param nsIStackFrame aStack
+ * An optional callstack. If it is not provided a
+ * snapshot of the current JavaScript callstack will be
+ * logged.
+ */
+ perfWarning: function (aText, aUrl, aStack) {
+ if (!logPerfWarnings) {
+ return;
+ }
+
+ // If URL is not provided, report an error.
+ if (!aUrl) {
+ Cu.reportError("Error in Deprecated.perfWarning: warnings must " +
+ "provide a URL documenting this performance issue.");
+ return;
+ }
+
+ let textMessage = "PERFORMANCE WARNING: " + aText +
+ "\nYou may find more details about this problem at: " +
+ aUrl + "\nCallstack:\n" +
// Append a callstack part to the deprecation message.
stringifyCallstack(aStack);
diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build
index e288d11c8..948d8d2c9 100644
--- a/toolkit/modules/moz.build
+++ b/toolkit/modules/moz.build
@@ -46,8 +46,6 @@ EXTRA_JS_MODULES += [
'FinderIterator.jsm',
'FormLikeFactory.jsm',
'Geometry.jsm',
- 'GMPInstallManager.jsm',
- 'GMPUtils.jsm',
'Http.jsm',
'InlineSpellChecker.jsm',
'InlineSpellCheckerContent.jsm',
diff --git a/toolkit/mozapps/extensions/GMPInstallManager.jsm b/toolkit/mozapps/extensions/GMPInstallManager.jsm
new file mode 100644
index 000000000..b9ebe5d7e
--- /dev/null
+++ b/toolkit/mozapps/extensions/GMPInstallManager.jsm
@@ -0,0 +1,961 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+this.EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, results: Cr, utils: Cu, manager: Cm} =
+ Components;
+// Chunk size for the incremental downloader
+const DOWNLOAD_CHUNK_BYTES_SIZE = 300000;
+// Incremental downloader interval
+const DOWNLOAD_INTERVAL = 0;
+// 1 day default
+const DEFAULT_SECONDS_BETWEEN_CHECKS = 60 * 60 * 24;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://gre/modules/Promise.jsm");
+Cu.import("resource://gre/modules/Preferences.jsm");
+Cu.import("resource://gre/modules/Log.jsm");
+Cu.import("resource://gre/modules/osfile.jsm");
+Cu.import("resource://gre/modules/Task.jsm");
+Cu.import("resource://gre/modules/ctypes.jsm");
+Cu.import("resource://gre/modules/GMPUtils.jsm");
+
+this.EXPORTED_SYMBOLS = ["GMPInstallManager", "GMPExtractor", "GMPDownloader",
+ "GMPAddon"];
+
+var gLocale = null;
+
+// Shared code for suppressing bad cert dialogs
+XPCOMUtils.defineLazyGetter(this, "gCertUtils", function() {
+ let temp = { };
+ Cu.import("resource://gre/modules/CertUtils.jsm", temp);
+ return temp;
+});
+
+XPCOMUtils.defineLazyModuleGetter(this, "UpdateChannel",
+ "resource://gre/modules/UpdateChannel.jsm");
+
+/**
+ * Number of milliseconds after which we need to cancel `checkForAddons`.
+ *
+ * Bug 1087674 suggests that the XHR we use in `checkForAddons` may
+ * never terminate in presence of network nuisances (e.g. strange
+ * antivirus behavior). This timeout is a defensive measure to ensure
+ * that we fail cleanly in such case.
+ */
+const CHECK_FOR_ADDONS_TIMEOUT_DELAY_MS = 20000;
+
+function getScopedLogger(prefix) {
+ // `PARENT_LOGGER_ID.` being passed here effectively links this logger
+ // to the parentLogger.
+ return Log.repository.getLoggerWithMessagePrefix("Toolkit.GMP", prefix + " ");
+}
+
+// This is copied directly from nsUpdateService.js
+// It is used for calculating the URL string w/ var replacement.
+// TODO: refactor this out somewhere else
+XPCOMUtils.defineLazyGetter(this, "gOSVersion", function aus_gOSVersion() {
+ let osVersion;
+ let sysInfo = Cc["@mozilla.org/system-info;1"].
+ getService(Ci.nsIPropertyBag2);
+ try {
+ osVersion = sysInfo.getProperty("name") + " " + sysInfo.getProperty("version");
+ }
+ catch (e) {
+ LOG("gOSVersion - OS Version unknown: updates are not possible.");
+ }
+
+ if (osVersion) {
+#ifdef XP_WIN
+ const BYTE = ctypes.uint8_t;
+ const WORD = ctypes.uint16_t;
+ const DWORD = ctypes.uint32_t;
+ const WCHAR = ctypes.char16_t;
+ const BOOL = ctypes.int;
+
+ // This structure is described at:
+ // http://msdn.microsoft.com/en-us/library/ms724833%28v=vs.85%29.aspx
+ const SZCSDVERSIONLENGTH = 128;
+ const OSVERSIONINFOEXW = new ctypes.StructType('OSVERSIONINFOEXW',
+ [
+ {dwOSVersionInfoSize: DWORD},
+ {dwMajorVersion: DWORD},
+ {dwMinorVersion: DWORD},
+ {dwBuildNumber: DWORD},
+ {dwPlatformId: DWORD},
+ {szCSDVersion: ctypes.ArrayType(WCHAR, SZCSDVERSIONLENGTH)},
+ {wServicePackMajor: WORD},
+ {wServicePackMinor: WORD},
+ {wSuiteMask: WORD},
+ {wProductType: BYTE},
+ {wReserved: BYTE}
+ ]);
+
+ // This structure is described at:
+ // http://msdn.microsoft.com/en-us/library/ms724958%28v=vs.85%29.aspx
+ const SYSTEM_INFO = new ctypes.StructType('SYSTEM_INFO',
+ [
+ {wProcessorArchitecture: WORD},
+ {wReserved: WORD},
+ {dwPageSize: DWORD},
+ {lpMinimumApplicationAddress: ctypes.voidptr_t},
+ {lpMaximumApplicationAddress: ctypes.voidptr_t},
+ {dwActiveProcessorMask: DWORD.ptr},
+ {dwNumberOfProcessors: DWORD},
+ {dwProcessorType: DWORD},
+ {dwAllocationGranularity: DWORD},
+ {wProcessorLevel: WORD},
+ {wProcessorRevision: WORD}
+ ]);
+
+ let kernel32 = false;
+ try {
+ kernel32 = ctypes.open("Kernel32");
+ } catch (e) {
+ LOG("gOSVersion - Unable to open kernel32! " + e);
+ osVersion += ".unknown (unknown)";
+ }
+
+ if(kernel32) {
+ try {
+ // Get Service pack info
+ try {
+ let GetVersionEx = kernel32.declare("GetVersionExW",
+ ctypes.default_abi,
+ BOOL,
+ OSVERSIONINFOEXW.ptr);
+ let winVer = OSVERSIONINFOEXW();
+ winVer.dwOSVersionInfoSize = OSVERSIONINFOEXW.size;
+
+ if(0 !== GetVersionEx(winVer.address())) {
+ osVersion += "." + winVer.wServicePackMajor
+ + "." + winVer.wServicePackMinor;
+ } else {
+ LOG("gOSVersion - Unknown failure in GetVersionEX (returned 0)");
+ osVersion += ".unknown";
+ }
+ } catch (e) {
+ LOG("gOSVersion - error getting service pack information. Exception: " + e);
+ osVersion += ".unknown";
+ }
+
+ // Get processor architecture
+ let arch = "unknown";
+ try {
+ let GetNativeSystemInfo = kernel32.declare("GetNativeSystemInfo",
+ ctypes.default_abi,
+ ctypes.void_t,
+ SYSTEM_INFO.ptr);
+ let sysInfo = SYSTEM_INFO();
+ // Default to unknown
+ sysInfo.wProcessorArchitecture = 0xffff;
+
+ GetNativeSystemInfo(sysInfo.address());
+ switch(sysInfo.wProcessorArchitecture) {
+ case 9:
+ arch = "x64";
+ break;
+ case 6:
+ arch = "IA64";
+ break;
+ case 0:
+ arch = "x86";
+ break;
+ }
+ } catch (e) {
+ LOG("gOSVersion - error getting processor architecture. Exception: " + e);
+ } finally {
+ osVersion += " (" + arch + ")";
+ }
+ } finally {
+ kernel32.close();
+ }
+ }
+#endif
+
+ try {
+ osVersion += " (" + sysInfo.getProperty("secondaryLibrary") + ")";
+ }
+ catch (e) {
+ // Not all platforms have a secondary widget library, so an error is nothing to worry about.
+ }
+ osVersion = encodeURIComponent(osVersion);
+ }
+ return osVersion;
+});
+
+// This is copied directly from nsUpdateService.js
+// It is used for calculating the URL string w/ var replacement.
+// TODO: refactor this out somewhere else
+XPCOMUtils.defineLazyGetter(this, "gABI", function aus_gABI() {
+ let abi = null;
+ try {
+ abi = Services.appinfo.XPCOMABI;
+ }
+ catch (e) {
+ LOG("gABI - XPCOM ABI unknown: updates are not possible.");
+ }
+#ifdef XP_MACOSX
+ // Mac universal build should report a different ABI than either macppc
+ // or mactel.
+ let macutils = Cc["@mozilla.org/xpcom/mac-utils;1"].
+ getService(Ci.nsIMacUtils);
+
+ if (macutils.isUniversalBinary)
+ abi += "-u-" + macutils.architecturesInBinary;
+#ifdef MOZ_SHARK
+ // Disambiguate optimised and shark nightlies
+ abi += "-shark"
+#endif
+#endif
+ return abi;
+});
+
+/**
+ * Provides an easy API for downloading and installing GMP Addons
+ */
+function GMPInstallManager() {
+}
+/**
+ * Temp file name used for downloading
+ */
+GMPInstallManager.prototype = {
+ /**
+ * Obtains a URL with replacement of vars
+ */
+ _getURL: function() {
+ let log = getScopedLogger("GMPInstallManager._getURL");
+ // Use the override URL if it is specified. The override URL is just like
+ // the normal URL but it does not check the cert.
+ let url = GMPPrefs.get(GMPPrefs.KEY_URL_OVERRIDE);
+ if (url) {
+ log.info("Using override url: " + url);
+ } else {
+ url = GMPPrefs.get(GMPPrefs.KEY_URL);
+ log.info("Using url: " + url);
+ }
+
+ url =
+ url.replace(/%PRODUCT%/g, Services.appinfo.name)
+ .replace(/%VERSION%/g, Services.appinfo.version)
+ .replace(/%BUILD_ID%/g, Services.appinfo.appBuildID)
+ .replace(/%BUILD_TARGET%/g, Services.appinfo.OS + "_" + gABI)
+ .replace(/%OS_VERSION%/g, gOSVersion);
+ if (/%LOCALE%/.test(url)) {
+ // TODO: Get the real local, does it actually matter for GMP plugins?
+ url = url.replace(/%LOCALE%/g, "en-US");
+ }
+ url =
+ url.replace(/%CHANNEL%/g, UpdateChannel.get())
+ .replace(/%PLATFORM_VERSION%/g, Services.appinfo.platformVersion)
+ .replace(/%DISTRIBUTION%/g,
+ GMPPrefs.get(GMPPrefs.KEY_APP_DISTRIBUTION))
+ .replace(/%DISTRIBUTION_VERSION%/g,
+ GMPPrefs.get(GMPPrefs.KEY_APP_DISTRIBUTION_VERSION))
+ .replace(/\+/g, "%2B");
+ log.info("Using url (with replacement): " + url);
+ return url;
+ },
+ /**
+ * Performs an addon check.
+ * @return a promise which will be resolved or rejected.
+ * The promise is resolved with an array of GMPAddons
+ * The promise is rejected with an object with properties:
+ * target: The XHR request object
+ * status: The HTTP status code
+ * type: Sometimes specifies type of rejection
+ */
+ checkForAddons: function() {
+ let log = getScopedLogger("GMPInstallManager.checkForAddons");
+ if (this._deferred) {
+ log.error("checkForAddons already called");
+ return Promise.reject({type: "alreadycalled"});
+ }
+ this._deferred = Promise.defer();
+ let url = this._getURL();
+
+ this._request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
+ createInstance(Ci.nsISupports);
+ // This is here to let unit test code override XHR
+ if (this._request.wrappedJSObject) {
+ this._request = this._request.wrappedJSObject;
+ }
+ this._request.open("GET", url, true);
+ let allowNonBuiltIn = !GMPPrefs.get(GMPPrefs.KEY_CERT_CHECKATTRS, true);
+ this._request.channel.notificationCallbacks =
+ new gCertUtils.BadCertHandler(allowNonBuiltIn);
+ // Prevent the request from reading from the cache.
+ this._request.channel.loadFlags |= Ci.nsIRequest.LOAD_BYPASS_CACHE;
+ // Prevent the request from writing to the cache.
+ this._request.channel.loadFlags |= Ci.nsIRequest.INHIBIT_CACHING;
+
+ this._request.overrideMimeType("text/xml");
+ // The Cache-Control header is only interpreted by proxies and the
+ // final destination. It does not help if a resource is already
+ // cached locally.
+ this._request.setRequestHeader("Cache-Control", "no-cache");
+ // HTTP/1.0 servers might not implement Cache-Control and
+ // might only implement Pragma: no-cache
+ this._request.setRequestHeader("Pragma", "no-cache");
+
+ this._request.timeout = CHECK_FOR_ADDONS_TIMEOUT_DELAY_MS;
+ this._request.addEventListener("error", event => this.onFailXML("onErrorXML", event), false);
+ this._request.addEventListener("abort", event => this.onFailXML("onAbortXML", event), false);
+ this._request.addEventListener("timeout", event => this.onFailXML("onTimeoutXML", event), false);
+ this._request.addEventListener("load", event => this.onLoadXML(event), false);
+
+ log.info("sending request to: " + url);
+ this._request.send(null);
+
+ return this._deferred.promise;
+ },
+ /**
+ * Installs the specified addon and calls a callback when done.
+ * @param gmpAddon The GMPAddon object to install
+ * @return a promise which will be resolved or rejected
+ * The promise will resolve with an array of paths that were extracted
+ * The promise will reject with an error object:
+ * target: The XHR request object
+ * status: The HTTP status code
+ * type: A string to represent the type of error
+ * downloaderr, verifyerr or previouserrorencountered
+ */
+ installAddon: function(gmpAddon) {
+ if (this._deferred) {
+ log.error("previous error encountered");
+ return Promise.reject({type: "previouserrorencountered"});
+ }
+ this.gmpDownloader = new GMPDownloader(gmpAddon);
+ return this.gmpDownloader.start();
+ },
+ _getTimeSinceLastCheck: function() {
+ let now = Math.round(Date.now() / 1000);
+ // Default to 0 here because `now - 0` will be returned later if that case
+ // is hit. We want a large value so a check will occur.
+ let lastCheck = GMPPrefs.get(GMPPrefs.KEY_UPDATE_LAST_CHECK, 0);
+ // Handle clock jumps, return now since we want it to represent
+ // a lot of time has passed since the last check.
+ if (now < lastCheck) {
+ return now;
+ }
+ return now - lastCheck;
+ },
+ get _isEMEEnabled() {
+ return GMPPrefs.get(GMPPrefs.KEY_EME_ENABLED, true);
+ },
+ _isAddonUpdateEnabled: function(aAddon) {
+ return GMPPrefs.get(GMPPrefs.KEY_PLUGIN_ENABLED, true, aAddon) &&
+ GMPPrefs.get(GMPPrefs.KEY_PLUGIN_AUTOUPDATE, true, aAddon);
+ },
+ _updateLastCheck: function() {
+ let now = Math.round(Date.now() / 1000);
+ GMPPrefs.set(GMPPrefs.KEY_UPDATE_LAST_CHECK, now);
+ },
+ _versionchangeOccurred: function() {
+ let savedBuildID = GMPPrefs.get(GMPPrefs.KEY_BUILDID, null);
+ let buildID = Services.appinfo.platformBuildID;
+ if (savedBuildID == buildID) {
+ return false;
+ }
+ GMPPrefs.set(GMPPrefs.KEY_BUILDID, buildID);
+ return true;
+ },
+ /**
+ * Wrapper for checkForAddons and installAddon.
+ * Will only install if not already installed and will log the results.
+ * This will only install/update the OpenH264 and EME plugins
+ * @return a promise which will be resolved if all addons could be installed
+ * successfully, rejected otherwise.
+ */
+ simpleCheckAndInstall: Task.async(function*() {
+ let log = getScopedLogger("GMPInstallManager.simpleCheckAndInstall");
+
+ if (this._versionchangeOccurred()) {
+ log.info("A version change occurred. Ignoring " +
+ "media.gmp-manager.lastCheck to check immediately for " +
+ "new or updated GMPs.");
+ } else {
+ let secondsBetweenChecks =
+ GMPPrefs.get(GMPPrefs.KEY_SECONDS_BETWEEN_CHECKS,
+ DEFAULT_SECONDS_BETWEEN_CHECKS)
+ let secondsSinceLast = this._getTimeSinceLastCheck();
+ log.info("Last check was: " + secondsSinceLast +
+ " seconds ago, minimum seconds: " + secondsBetweenChecks);
+ if (secondsBetweenChecks > secondsSinceLast) {
+ log.info("Will not check for updates.");
+ return {status: "too-frequent-no-check"};
+ }
+ }
+
+ try {
+ let gmpAddons = yield this.checkForAddons();
+ this._updateLastCheck();
+ log.info("Found " + gmpAddons.length + " addons advertised.");
+ let addonsToInstall = gmpAddons.filter(function(gmpAddon) {
+ log.info("Found addon: " + gmpAddon.toString());
+
+ if (!gmpAddon.isValid || GMPUtils.isPluginHidden(gmpAddon) ||
+ gmpAddon.isInstalled) {
+ log.info("Addon invalid, hidden or already installed.");
+ return false;
+ }
+
+ let addonUpdateEnabled = false;
+ if (GMP_PLUGIN_IDS.indexOf(gmpAddon.id) >= 0) {
+ addonUpdateEnabled = this._isAddonUpdateEnabled(gmpAddon.id);
+ if (!addonUpdateEnabled) {
+ log.info("Auto-update is off for " + gmpAddon.id +
+ ", skipping check.");
+ }
+ } else {
+ // Currently, we only support installs of OpenH264 and EME plugins.
+ log.info("Auto-update is off for unknown plugin '" + gmpAddon.id +
+ "', skipping check.");
+ }
+
+ return addonUpdateEnabled;
+ }, this);
+
+ if (!addonsToInstall.length) {
+ log.info("No new addons to install, returning");
+ return {status: "nothing-new-to-install"};
+ }
+
+ let installResults = [];
+ let failureEncountered = false;
+ for (let addon of addonsToInstall) {
+ try {
+ yield this.installAddon(addon);
+ installResults.push({
+ id: addon.id,
+ result: "succeeded",
+ });
+ } catch (e) {
+ failureEncountered = true;
+ installResults.push({
+ id: addon.id,
+ result: "failed",
+ });
+ }
+ }
+ if (failureEncountered) {
+ throw {status: "failed",
+ results: installResults};
+ }
+ return {status: "succeeded",
+ results: installResults};
+ } catch(e) {
+ log.error("Could not check for addons", e);
+ throw e;
+ }
+ }),
+
+ /**
+ * Makes sure everything is cleaned up
+ */
+ uninit: function() {
+ let log = getScopedLogger("GMPInstallManager.uninit");
+ if (this._request) {
+ log.info("Aborting request");
+ this._request.abort();
+ }
+ if (this._deferred) {
+ log.info("Rejecting deferred");
+ this._deferred.reject({type: "uninitialized"});
+ }
+ log.info("Done cleanup");
+ },
+
+ /**
+ * If set to true, specifies to leave the temporary downloaded zip file.
+ * This is useful for tests.
+ */
+ overrideLeaveDownloadedZip: false,
+
+ /**
+ * The XMLHttpRequest succeeded and the document was loaded.
+ * @param event The nsIDOMEvent for the load
+ */
+ onLoadXML: function(event) {
+ let log = getScopedLogger("GMPInstallManager.onLoadXML");
+ try {
+ log.info("request completed downloading document");
+ let certs = null;
+ if (!Services.prefs.prefHasUserValue(GMPPrefs.KEY_URL_OVERRIDE) &&
+ GMPPrefs.get(GMPPrefs.KEY_CERT_CHECKATTRS, true)) {
+ certs = gCertUtils.readCertPrefs(GMPPrefs.KEY_CERTS_BRANCH);
+ }
+
+ let allowNonBuiltIn = !GMPPrefs.get(GMPPrefs.KEY_CERT_REQUIREBUILTIN,
+ true);
+ log.info("allowNonBuiltIn: " + allowNonBuiltIn);
+
+ gCertUtils.checkCert(this._request.channel, allowNonBuiltIn, certs);
+
+ this.parseResponseXML();
+ } catch (ex) {
+ log.error("could not load xml: " + ex);
+ this._deferred.reject({
+ target: event.target,
+ status: this._getChannelStatus(event.target),
+ message: "" + ex,
+ });
+ delete this._deferred;
+ }
+ },
+
+ /**
+ * Returns the status code for the XMLHttpRequest
+ */
+ _getChannelStatus: function(request) {
+ let log = getScopedLogger("GMPInstallManager._getChannelStatus");
+ let status = null;
+ try {
+ status = request.status;
+ log.info("request.status is: " + request.status);
+ }
+ catch (e) {
+ }
+
+ if (status == null) {
+ status = request.channel.QueryInterface(Ci.nsIRequest).status;
+ }
+ return status;
+ },
+
+ /**
+ * There was an error of some kind during the XMLHttpRequest. This
+ * error may have been caused by external factors (e.g. network
+ * issues) or internally (by a timeout).
+ *
+ * @param event The nsIDOMEvent for the error
+ */
+ onFailXML: function(failure, event) {
+ let log = getScopedLogger("GMPInstallManager.onFailXML " + failure);
+ let request = event.target;
+ let status = this._getChannelStatus(request);
+ let message = "request.status: " + status + " (" + event.type + ")";
+ log.warn(message);
+ this._deferred.reject({
+ target: request,
+ status: status,
+ message: message
+ });
+ delete this._deferred;
+ },
+
+ /**
+ * Returns an array of GMPAddon objects discovered by the update check.
+ * Or returns an empty array if there were any problems with parsing.
+ * If there's an error, it will be logged if logging is enabled.
+ */
+ parseResponseXML: function() {
+ try {
+ let log = getScopedLogger("GMPInstallManager.parseResponseXML");
+ let updatesElement = this._request.responseXML.documentElement;
+ if (!updatesElement) {
+ let message = "empty updates document";
+ log.warn(message);
+ this._deferred.reject({
+ target: this._request,
+ message: message
+ });
+ delete this._deferred;
+ return;
+ }
+
+ if (updatesElement.nodeName != "updates") {
+ let message = "got node name: " + updatesElement.nodeName +
+ ", expected: updates";
+ log.warn(message);
+ this._deferred.reject({
+ target: this._request,
+ message: message
+ });
+ delete this._deferred;
+ return;
+ }
+
+ const ELEMENT_NODE = Ci.nsIDOMNode.ELEMENT_NODE;
+ let gmpResults = [];
+ for (let i = 0; i < updatesElement.childNodes.length; ++i) {
+ let updatesChildElement = updatesElement.childNodes.item(i);
+ if (updatesChildElement.nodeType != ELEMENT_NODE) {
+ continue;
+ }
+ if (updatesChildElement.localName == "addons") {
+ gmpResults = GMPAddon.parseGMPAddonsNode(updatesChildElement);
+ }
+ }
+ this._deferred.resolve(gmpResults);
+ delete this._deferred;
+ } catch (e) {
+ this._deferred.reject({
+ target: this._request,
+ message: e
+ });
+ delete this._deferred;
+ }
+ },
+};
+
+/**
+ * Used to construct a single GMP addon
+ * GMPAddon objects are returns from GMPInstallManager.checkForAddons
+ * GMPAddon objects can also be used in calls to GMPInstallManager.installAddon
+ *
+ * @param gmpAddon The AUS response XML's DOM element `addon`
+ */
+function GMPAddon(gmpAddon) {
+ let log = getScopedLogger("GMPAddon.constructor");
+ gmpAddon.QueryInterface(Ci.nsIDOMElement);
+ ["id", "URL", "hashFunction",
+ "hashValue", "version", "size"].forEach(name => {
+ if (gmpAddon.hasAttribute(name)) {
+ this[name] = gmpAddon.getAttribute(name);
+ }
+ });
+ this.size = Number(this.size) || undefined;
+ log.info ("Created new addon: " + this.toString());
+}
+/**
+ * Parses an XML GMP addons node from AUS into an array
+ * @param addonsElement An nsIDOMElement compatible node with XML from AUS
+ * @return An array of GMPAddon results
+ */
+GMPAddon.parseGMPAddonsNode = function(addonsElement) {
+ let log = getScopedLogger("GMPAddon.parseGMPAddonsNode");
+ let gmpResults = [];
+ if (addonsElement.localName !== "addons") {
+ return;
+ }
+
+ addonsElement.QueryInterface(Ci.nsIDOMElement);
+ let addonCount = addonsElement.childNodes.length;
+ for (let i = 0; i < addonCount; ++i) {
+ let addonElement = addonsElement.childNodes.item(i);
+ if (addonElement.localName !== "addon") {
+ continue;
+ }
+ addonElement.QueryInterface(Ci.nsIDOMElement);
+ try {
+ gmpResults.push(new GMPAddon(addonElement));
+ } catch (e) {
+ log.warn("invalid addon: " + e);
+ continue;
+ }
+ }
+ return gmpResults;
+};
+GMPAddon.prototype = {
+ /**
+ * Returns a string representation of the addon
+ */
+ toString: function() {
+ return this.id + " (" +
+ "isValid: " + this.isValid +
+ ", isInstalled: " + this.isInstalled +
+ ", hashFunction: " + this.hashFunction+
+ ", hashValue: " + this.hashValue +
+ (this.size !== undefined ? ", size: " + this.size : "" ) +
+ ")";
+ },
+ /**
+ * If all the fields aren't specified don't consider this addon valid
+ * @return true if the addon is parsed and valid
+ */
+ get isValid() {
+ return this.id && this.URL && this.version &&
+ this.hashFunction && !!this.hashValue;
+ },
+ get isInstalled() {
+ return this.version &&
+ GMPPrefs.get(GMPPrefs.KEY_PLUGIN_VERSION, "", this.id) === this.version;
+ },
+ get isEME() {
+ return this.id == "gmp-widevinecdm" || this.id.indexOf("gmp-eme-") == 0;
+ },
+};
+/**
+ * Constructs a GMPExtractor object which is used to extract a GMP zip
+ * into the specified location. (Which typically leties per platform)
+ * @param zipPath The path on disk of the zip file to extract
+ */
+function GMPExtractor(zipPath, installToDirPath) {
+ this.zipPath = zipPath;
+ this.installToDirPath = installToDirPath;
+}
+GMPExtractor.prototype = {
+ /**
+ * Obtains a list of all the entries in a zipfile in the format of *.*.
+ * This also includes files inside directories.
+ *
+ * @param zipReader the nsIZipReader to check
+ * @return An array of string name entries which can be used
+ * in nsIZipReader.extract
+ */
+ _getZipEntries: function(zipReader) {
+ let entries = [];
+ let enumerator = zipReader.findEntries("*.*");
+ while (enumerator.hasMore()) {
+ entries.push(enumerator.getNext());
+ }
+ return entries;
+ },
+ /**
+ * Installs the this.zipPath contents into the directory used to store GMP
+ * addons for the current platform.
+ *
+ * @return a promise which will be resolved or rejected
+ * See GMPInstallManager.installAddon for resolve/rejected info
+ */
+ install: function() {
+ try {
+ let log = getScopedLogger("GMPExtractor.install");
+ this._deferred = Promise.defer();
+ log.info("Installing " + this.zipPath + "...");
+ // Get the input zip file
+ let zipFile = Cc["@mozilla.org/file/local;1"].
+ createInstance(Ci.nsIFile);
+ zipFile.initWithPath(this.zipPath);
+
+ // Initialize a zipReader and obtain the entries
+ var zipReader = Cc["@mozilla.org/libjar/zip-reader;1"].
+ createInstance(Ci.nsIZipReader);
+ zipReader.open(zipFile)
+ let entries = this._getZipEntries(zipReader);
+ let extractedPaths = [];
+
+ // Extract each of the entries
+ entries.forEach(entry => {
+ // We don't need these types of files
+ if (entry.includes("__MACOSX")) {
+ return;
+ }
+ let outFile = Cc["@mozilla.org/file/local;1"].
+ createInstance(Ci.nsILocalFile);
+ outFile.initWithPath(this.installToDirPath);
+ outFile.appendRelativePath(entry);
+
+ // Make sure the directory hierarchy exists
+ if(!outFile.parent.exists()) {
+ outFile.parent.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt("0755", 8));
+ }
+ zipReader.extract(entry, outFile);
+ extractedPaths.push(outFile.path);
+ log.info(entry + " was successfully extracted to: " +
+ outFile.path);
+ });
+ zipReader.close();
+ if (!GMPInstallManager.overrideLeaveDownloadedZip) {
+ zipFile.remove(false);
+ }
+
+ log.info(this.zipPath + " was installed successfully");
+ this._deferred.resolve(extractedPaths);
+ } catch (e) {
+ if (zipReader) {
+ zipReader.close();
+ }
+ this._deferred.reject({
+ target: this,
+ status: e,
+ type: "exception"
+ });
+ }
+ return this._deferred.promise;
+ }
+};
+
+
+/**
+ * Constructs an object which downloads and initiates an install of
+ * the specified GMPAddon object.
+ * @param gmpAddon The addon to install.
+ */
+function GMPDownloader(gmpAddon)
+{
+ this._gmpAddon = gmpAddon;
+}
+/**
+ * Computes the file hash of fileToHash with the specified hash function
+ * @param hashFunctionName A hash function name such as sha512
+ * @param fileToHash An nsIFile to hash
+ * @return a promise which resolve to a digest in binary hex format
+ */
+GMPDownloader.computeHash = function(hashFunctionName, fileToHash) {
+ let log = getScopedLogger("GMPDownloader.computeHash");
+ let digest;
+ let fileStream = Cc["@mozilla.org/network/file-input-stream;1"].
+ createInstance(Ci.nsIFileInputStream);
+ fileStream.init(fileToHash, FileUtils.MODE_RDONLY,
+ FileUtils.PERMS_FILE, 0);
+ try {
+ let hash = Cc["@mozilla.org/security/hash;1"].
+ createInstance(Ci.nsICryptoHash);
+ let hashFunction =
+ Ci.nsICryptoHash[hashFunctionName.toUpperCase()];
+ if (!hashFunction) {
+ log.error("could not get hash function");
+ return Promise.reject();
+ }
+ hash.init(hashFunction);
+ hash.updateFromStream(fileStream, -1);
+ digest = binaryToHex(hash.finish(false));
+ } catch (e) {
+ log.warn("failed to compute hash: " + e);
+ digest = "";
+ }
+ fileStream.close();
+ return Promise.resolve(digest);
+},
+GMPDownloader.prototype = {
+ /**
+ * Starts the download process for an addon.
+ * @return a promise which will be resolved or rejected
+ * See GMPInstallManager.installAddon for resolve/rejected info
+ */
+ start: function() {
+ let log = getScopedLogger("GMPDownloader.start");
+ this._deferred = Promise.defer();
+ if (!this._gmpAddon.isValid) {
+ log.info("gmpAddon is not valid, will not continue");
+ return Promise.reject({
+ target: this,
+ status: status,
+ type: "downloaderr"
+ });
+ }
+
+ let uri = Services.io.newURI(this._gmpAddon.URL, null, null);
+ this._request = Cc["@mozilla.org/network/incremental-download;1"].
+ createInstance(Ci.nsIIncrementalDownload);
+ let gmpFile = FileUtils.getFile("TmpD", [this._gmpAddon.id + ".zip"]);
+ if (gmpFile.exists()) {
+ gmpFile.remove(false);
+ }
+
+ log.info("downloading from " + uri.spec + " to " + gmpFile.path);
+ this._request.init(uri, gmpFile, DOWNLOAD_CHUNK_BYTES_SIZE,
+ DOWNLOAD_INTERVAL);
+ this._request.start(this, null);
+ return this._deferred.promise;
+ },
+ // For nsIRequestObserver
+ onStartRequest: function(request, context) {
+ },
+ // For nsIRequestObserver
+ // Called when the GMP addon zip file is downloaded
+ onStopRequest: function(request, context, status) {
+ let log = getScopedLogger("GMPDownloader.onStopRequest");
+ log.info("onStopRequest called");
+ if (!Components.isSuccessCode(status)) {
+ log.info("status failed: " + status);
+ this._deferred.reject({
+ target: this,
+ status: status,
+ type: "downloaderr"
+ });
+ return;
+ }
+
+ let promise = this._verifyDownload();
+ promise.then(() => {
+ log.info("GMP file is ready to unzip");
+ let destination = this._request.destination;
+
+ let zipPath = destination.path;
+ let gmpAddon = this._gmpAddon;
+ let installToDirPath = Cc["@mozilla.org/file/local;1"].
+ createInstance(Ci.nsIFile);
+ let path = OS.Path.join(OS.Constants.Path.profileDir,
+ gmpAddon.id,
+ gmpAddon.version);
+ installToDirPath.initWithPath(path);
+ log.info("install to directory path: " + installToDirPath.path);
+ let gmpInstaller = new GMPExtractor(zipPath, installToDirPath.path);
+ let installPromise = gmpInstaller.install();
+ installPromise.then(extractedPaths => {
+ // Success, set the prefs
+ let now = Math.round(Date.now() / 1000);
+ GMPPrefs.set(GMPPrefs.KEY_PLUGIN_LAST_UPDATE, now, gmpAddon.id);
+ // Setting the version pref signals installation completion to consumers,
+ // if you need to set other prefs etc. do it before this.
+ GMPPrefs.set(GMPPrefs.KEY_PLUGIN_VERSION, gmpAddon.version,
+ gmpAddon.id);
+ this._deferred.resolve(extractedPaths);
+ }, err => {
+ this._deferred.reject(err);
+ });
+ }, err => {
+ log.warn("verifyDownload check failed");
+ this._deferred.reject({
+ target: this,
+ status: 200,
+ type: "verifyerr"
+ });
+ });
+ },
+ /**
+ * Verifies that the downloaded zip file's hash matches the GMPAddon hash.
+ * @return a promise which resolves if the download verifies
+ */
+ _verifyDownload: function() {
+ let verifyDownloadDeferred = Promise.defer();
+ let log = getScopedLogger("GMPDownloader._verifyDownload");
+ log.info("_verifyDownload called");
+ if (!this._request) {
+ return Promise.reject();
+ }
+
+ let destination = this._request.destination;
+ log.info("for path: " + destination.path);
+
+ // Ensure that the file size matches the expected file size.
+ if (this._gmpAddon.size !== undefined &&
+ destination.fileSize != this._gmpAddon.size) {
+ log.warn("Downloader:_verifyDownload downloaded size " +
+ destination.fileSize + " != expected size " +
+ this._gmpAddon.size + ".");
+ return Promise.reject();
+ }
+
+ let promise = GMPDownloader.computeHash(this._gmpAddon.hashFunction, destination);
+ promise.then(digest => {
+ let expectedDigest = this._gmpAddon.hashValue.toLowerCase();
+ if (digest !== expectedDigest) {
+ log.warn("hashes do not match! Got: `" +
+ digest + "`, expected: `" + expectedDigest + "`");
+ this._deferred.reject();
+ return;
+ }
+
+ log.info("hashes match!");
+ verifyDownloadDeferred.resolve();
+ }, err => {
+ verifyDownloadDeferred.reject();
+ });
+ return verifyDownloadDeferred.promise;
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIRequestObserver])
+};
+
+/**
+ * Convert a string containing binary values to hex.
+ */
+function binaryToHex(input) {
+ let result = "";
+ for (let i = 0; i < input.length; ++i) {
+ let hex = input.charCodeAt(i).toString(16);
+ if (hex.length == 1)
+ hex = "0" + hex;
+ result += hex;
+ }
+ return result;
+}
diff --git a/toolkit/modules/GMPUtils.jsm b/toolkit/mozapps/extensions/GMPUtils.jsm
index 9e41a7a61..9e41a7a61 100644
--- a/toolkit/modules/GMPUtils.jsm
+++ b/toolkit/mozapps/extensions/GMPUtils.jsm
diff --git a/toolkit/mozapps/extensions/content/extensions.xml b/toolkit/mozapps/extensions/content/extensions.xml
index cbd05bfa9..9c8fda8ed 100644
--- a/toolkit/mozapps/extensions/content/extensions.xml
+++ b/toolkit/mozapps/extensions/content/extensions.xml
@@ -941,10 +941,6 @@
#endif
oncommand="document.getBindingParent(this).showPreferences();"/>
<!-- label="&cmd.debugAddon.label;" -->
- <xul:button anonid="debug-btn" class="addon-control debug"
- label="&cmd.debugAddon.label;"
- oncommand="document.getBindingParent(this).debug();"/>
-
<xul:button anonid="enable-btn" class="addon-control enable"
label="&cmd.enableAddon.label;"
oncommand="document.getBindingParent(this).userDisabled = false;"/>
@@ -1087,10 +1083,6 @@
document.getAnonymousElementByAttribute(this, "anonid",
"enable-btn");
</field>
- <field name="_debugBtn">
- document.getAnonymousElementByAttribute(this, "anonid",
- "debug-btn");
- </field>
<field name="_disableBtn">
document.getAnonymousElementByAttribute(this, "anonid",
"disable-btn");
@@ -1430,12 +1422,6 @@
this.mAddon.install.state != AddonManager.STATE_INSTALLED);
this._showStatus(showProgress ? "progress" : "none");
- let debuggable = this.mAddon.isDebuggable &&
- Services.prefs.getBoolPref('devtools.chrome.enabled') &&
- Services.prefs.getBoolPref('devtools.debugger.remote-enabled');
-
- this._debugBtn.disabled = this._debugBtn.hidden = !debuggable
-
if (this.mAddon.type == "experiment") {
this.removeAttribute("notification");
let prefix = "experiment.";
diff --git a/toolkit/mozapps/extensions/internal/GMPProvider.jsm b/toolkit/mozapps/extensions/internal/GMPProvider.jsm
index 25651f1b8..131db7249 100644
--- a/toolkit/mozapps/extensions/internal/GMPProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/GMPProvider.jsm
@@ -49,6 +49,7 @@ const GMP_PLUGINS = [
homepageURL: "http://www.openh264.org/",
optionsURL: "chrome://mozapps/content/extensions/gmpPrefs.xul"
},
+/*
{
id: EME_ADOBE_ID,
name: "eme-adobe_name",
@@ -57,6 +58,17 @@ const GMP_PLUGINS = [
homepageURL: "http://help.adobe.com/en_US/primetime/drm/HTML5_CDM",
optionsURL: "chrome://mozapps/content/extensions/gmpPrefs.xul",
isEME: true
+ },
+*/
+ {
+ id: WIDEVINE_ID,
+ name: "widevine_description",
+ // Describe the purpose of both CDMs in the same way.
+ description: "eme-adobe_description",
+ licenseURL: "https://www.google.com/policies/privacy/",
+ homepageURL: "https://www.widevine.com/",
+ optionsURL: "chrome://mozapps/content/extensions/gmpPrefs.xul",
+ isEME: true
}];
XPCOMUtils.defineConstant(this, "GMP_PLUGINS", GMP_PLUGINS);
diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
index 9ea876f6c..99a121da4 100644
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -2584,7 +2584,7 @@ this.XPIProvider = {
}
}
catch (e) {
- logger.warn("Failed to call uninstall for " + id, e);
+ // If called on startup this may fail due to staged folder still existing.
}
try {
diff --git a/toolkit/mozapps/extensions/moz.build b/toolkit/mozapps/extensions/moz.build
index 3988cc27a..104e8d734 100644
--- a/toolkit/mozapps/extensions/moz.build
+++ b/toolkit/mozapps/extensions/moz.build
@@ -29,11 +29,13 @@ EXTRA_PP_COMPONENTS += [
EXTRA_JS_MODULES += [
'ChromeManifestParser.jsm',
'DeferredSave.jsm',
+ 'GMPUtils.jsm',
'LightweightThemeManager.jsm',
]
EXTRA_PP_JS_MODULES += [
- 'AddonManager.jsm'
+ 'AddonManager.jsm',
+ 'GMPInstallManager.jsm',
]
# Additional debugging info is exposed in debug builds
diff --git a/toolkit/modules/GMPInstallManager.jsm b/toolkit/mozapps/webextensions/GMPInstallManager.jsm
index b5987ca55..b5987ca55 100644
--- a/toolkit/modules/GMPInstallManager.jsm
+++ b/toolkit/mozapps/webextensions/GMPInstallManager.jsm
diff --git a/toolkit/mozapps/webextensions/internal/XPIProvider.jsm b/toolkit/mozapps/webextensions/internal/XPIProvider.jsm
index 256765439..c95221417 100644
--- a/toolkit/mozapps/webextensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/webextensions/internal/XPIProvider.jsm
@@ -5663,7 +5663,7 @@ class AddonInstall {
this.updateAddonURIs();
this.addon._install = this;
- this.name = this.addon.selectedLocale.name;
+ this.name = this.addon.selectedLocale.name || this.addon.defaultLocale.name;
this.type = this.addon.type;
this.version = this.addon.version;
@@ -6690,8 +6690,9 @@ function createUpdate(aCallback, aAddon, aUpdate) {
} else {
install = new DownloadAddonInstall(aAddon._installLocation, url,
aUpdate.updateHash, aAddon, null,
- aAddon.selectedLocale.name, aAddon.type,
- aAddon.icons, aUpdate.version);
+ aAddon.selectedLocale.name ?
+ aAddon.selectedLocale.name : aAddon.defaultLocale.name,
+ aAddon.type, aAddon.icons, aUpdate.version);
}
try {
if (aUpdate.updateInfoURL)
@@ -7986,6 +7987,9 @@ PROP_LOCALE_SINGLE.forEach(function(aProp) {
if (aProp == "creator")
return result ? new AddonManagerPrivate.AddonAuthor(result) : null;
+ if (aProp == "name")
+ return result ? result : addon.defaultLocale.name;
+
return result;
});
});
diff --git a/toolkit/mozapps/webextensions/moz.build b/toolkit/mozapps/webextensions/moz.build
index e703125e6..f6e83a355 100644
--- a/toolkit/mozapps/webextensions/moz.build
+++ b/toolkit/mozapps/webextensions/moz.build
@@ -30,8 +30,10 @@ EXTRA_PP_COMPONENTS += [
EXTRA_JS_MODULES += [
'../extensions/ChromeManifestParser.jsm',
'../extensions/DeferredSave.jsm',
+ '../extensions/GMPUtils.jsm',
'AddonManager.jsm',
'LightweightThemeManager.jsm',
+ 'GMPInstallManager.jsm',
]
JAR_MANIFESTS += ['jar.mn']
diff --git a/tools/update-packaging/common.sh b/tools/update-packaging/common.sh
index eb358806f..ec9478035 100755
--- a/tools/update-packaging/common.sh
+++ b/tools/update-packaging/common.sh
@@ -76,8 +76,7 @@ make_add_instruction() {
check_for_add_if_not_update() {
add_if_not_file_chk="$1"
- if [ `basename $add_if_not_file_chk` = "channel-prefs.js" -o \
- `basename $add_if_not_file_chk` = "update-settings.ini" ]; then
+ if [ `basename $add_if_not_file_chk` = "update-settings.ini" ]; then
## "true" *giggle*
return 0;
fi
diff --git a/widget/windows/nsClipboard.cpp b/widget/windows/nsClipboard.cpp
index 0db1dd342..432badeb5 100644
--- a/widget/windows/nsClipboard.cpp
+++ b/widget/windows/nsClipboard.cpp
@@ -283,16 +283,19 @@ nsresult nsClipboard::GetGlobalData(HGLOBAL aHGBL, void ** aData, uint32_t * aLe
{
// Allocate a new memory buffer and copy the data from global memory.
// Recall that win98 allocates to nearest DWORD boundary. As a safety
- // precaution, allocate an extra 2 bytes (but don't report them!) and
- // null them out to ensure that all of our strlen calls will succeed.
+ // precaution, allocate an extra 3 bytes (but don't report them in |aLen|!)
+ // and null them out to ensure that all of our NS_strlen calls will succeed.
+ // NS_strlen operates on char16_t, so we need 3 NUL bytes to ensure it finds
+ // a full NUL char16_t when |*aLen| is odd.
nsresult result = NS_ERROR_FAILURE;
if (aHGBL != nullptr) {
LPSTR lpStr = (LPSTR) GlobalLock(aHGBL);
DWORD allocSize = GlobalSize(aHGBL);
- char* data = static_cast<char*>(malloc(allocSize + sizeof(char16_t)));
+ char* data = static_cast<char*>(malloc(allocSize + 3));
if ( data ) {
memcpy ( data, lpStr, allocSize );
- data[allocSize] = data[allocSize + 1] = '\0'; // null terminate for safety
+ data[allocSize] = data[allocSize + 1] = data[allocSize + 2] =
+ '\0'; // null terminate for safety
GlobalUnlock(aHGBL);
*aData = data;
diff --git a/xpcom/base/nsCycleCollector.cpp b/xpcom/base/nsCycleCollector.cpp
index 7109d85bd..06ed42326 100644
--- a/xpcom/base/nsCycleCollector.cpp
+++ b/xpcom/base/nsCycleCollector.cpp
@@ -185,7 +185,6 @@
#include "mozilla/AutoGlobalTimelineMarker.h"
#include "mozilla/Likely.h"
#include "mozilla/PoisonIOInterposer.h"
-#include "mozilla/Telemetry.h"
#include "mozilla/ThreadLocal.h"
using namespace mozilla;
@@ -2266,7 +2265,7 @@ CCGraphBuilder::BuildGraph(SliceBudget& aBudget)
SetFirstChild();
if (pi->mParticipant) {
- nsresult rv = pi->mParticipant->Traverse(pi->mPointer, *this);
+ nsresult rv = pi->mParticipant->TraverseNativeAndJS(pi->mPointer, *this);
MOZ_RELEASE_ASSERT(!NS_FAILED(rv), "Cycle collector Traverse method failed");
}
@@ -2540,7 +2539,7 @@ static bool
MayHaveChild(void* aObj, nsCycleCollectionParticipant* aCp)
{
ChildFinder cf;
- aCp->Traverse(aObj, cf);
+ aCp->TraverseNativeAndJS(aObj, cf);
return cf.MayHaveChild();
}
@@ -2597,7 +2596,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(JSPurpleBuffer)
CycleCollectionNoteChild(cb, tmp, "self");
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
#define NS_TRACE_SEGMENTED_ARRAY(_field, _type) \
@@ -3488,7 +3486,6 @@ nsCycleCollector::FixGrayBits(bool aForceGC, TimeLog& aTimeLog)
aTimeLog.Checkpoint("FixWeakMappingGrayBits");
bool needGC = !mJSContext->AreGCGrayBitsValid();
- // Only do a telemetry ping for non-shutdown CCs.
if (!needGC) {
return;
}
@@ -3540,8 +3537,6 @@ nsCycleCollector::CleanupAfterCollection()
printf(".\ncc: \n");
#endif
- timeLog.Checkpoint("CleanupAfterCollection::telemetry");
-
if (mJSContext) {
mJSContext->FinalizeDeferredThings(mResults.mAnyManual
? CycleCollectedJSContext::FinalizeNow
diff --git a/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp b/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp
index 7c48002e3..f65a92e61 100644
--- a/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp
+++ b/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp
@@ -21,8 +21,9 @@ CycleCollectionNoteEdgeNameImpl(nsCycleCollectionTraversalCallback& aCallback,
}
void
-nsScriptObjectTracer::NoteJSChild(JS::GCCellPtr aGCThing, const char* aName,
- void* aClosure)
+nsCycleCollectionParticipant::NoteJSChild(JS::GCCellPtr aGCThing,
+ const char* aName,
+ void* aClosure)
{
nsCycleCollectionTraversalCallback* cb =
static_cast<nsCycleCollectionTraversalCallback*>(aClosure);
diff --git a/xpcom/glue/nsCycleCollectionParticipant.h b/xpcom/glue/nsCycleCollectionParticipant.h
index 2dfbb6750..5d03acd26 100644
--- a/xpcom/glue/nsCycleCollectionParticipant.h
+++ b/xpcom/glue/nsCycleCollectionParticipant.h
@@ -113,11 +113,38 @@ private:
class NS_NO_VTABLE nsCycleCollectionParticipant
{
public:
- constexpr nsCycleCollectionParticipant() : mMightSkip(false) {}
- constexpr explicit nsCycleCollectionParticipant(bool aSkip) : mMightSkip(aSkip) {}
+ constexpr nsCycleCollectionParticipant()
+ : mMightSkip(false)
+ , mTraverseShouldTrace(false)
+ {
+ }
+
+ constexpr explicit nsCycleCollectionParticipant(bool aSkip,
+ bool aTraverseShouldTrace = false)
+ : mMightSkip(aSkip)
+ , mTraverseShouldTrace(aTraverseShouldTrace)
+ {
+ }
NS_IMETHOD Traverse(void* aPtr, nsCycleCollectionTraversalCallback& aCb) = 0;
+ nsresult TraverseNativeAndJS(void* aPtr,
+ nsCycleCollectionTraversalCallback& aCb)
+ {
+ nsresult rv = Traverse(aPtr, aCb);
+ if (mTraverseShouldTrace) {
+ // Note, we always call Trace, even if Traverse returned
+ // NS_SUCCESS_INTERRUPTED_TRAVERSE.
+ TraceCallbackFunc noteJsChild(&nsCycleCollectionParticipant::NoteJSChild);
+ Trace(aPtr, noteJsChild, &aCb);
+ }
+ return rv;
+ }
+
+ // Implemented in nsCycleCollectorTraceJSHelpers.cpp.
+ static void NoteJSChild(JS::GCCellPtr aGCThing, const char* aName,
+ void* aClosure);
+
NS_IMETHOD_(void) Root(void* aPtr) = 0;
NS_IMETHOD_(void) Unlink(void* aPtr) = 0;
NS_IMETHOD_(void) Unroot(void* aPtr) = 0;
@@ -172,26 +199,24 @@ protected:
private:
const bool mMightSkip;
+ const bool mTraverseShouldTrace;
};
class NS_NO_VTABLE nsScriptObjectTracer : public nsCycleCollectionParticipant
{
public:
constexpr nsScriptObjectTracer()
- : nsCycleCollectionParticipant(false)
+ : nsCycleCollectionParticipant(false, true)
{
}
constexpr explicit nsScriptObjectTracer(bool aSkip)
- : nsCycleCollectionParticipant(aSkip)
+ : nsCycleCollectionParticipant(aSkip, true)
{
}
NS_IMETHOD_(void) Trace(void* aPtr, const TraceCallbacks& aCb,
void* aClosure) override = 0;
- // Implemented in nsCycleCollectorTraceJSHelpers.cpp.
- static void NoteJSChild(JS::GCCellPtr aGCThing, const char* aName,
- void* aClosure);
};
class NS_NO_VTABLE nsXPCOMCycleCollectionParticipant : public nsScriptObjectTracer
@@ -440,12 +465,6 @@ DowncastCCParticipant(void* aPtr)
#define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(_field) \
CycleCollectionNoteChild(cb, tmp->_field, #_field);
-#define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS \
- { \
- TraceCallbackFunc noteJsChild(&nsScriptObjectTracer::NoteJSChild); \
- Trace(p, noteJsChild, &cb); \
- }
-
#define NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \
(void)tmp; \
return NS_OK; \