This is an automated email from the ASF dual-hosted git repository.

gerlowskija pushed a commit to branch branch_9_8
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_9_8 by this push:
     new 70bd055f1dc SOLR-17677: Ensure DBQ is safe before running (#3203)
70bd055f1dc is described below

commit 70bd055f1dc8d8bb5200f77fd6f4790115357080
Author: Jason Gerlowski <[email protected]>
AuthorDate: Fri Feb 21 21:21:21 2025 -0500

    SOLR-17677: Ensure DBQ is safe before running (#3203)
    
    Portions of the DBQ codepath execute the deletion query with a standard
    Lucene IndexSearcher, which upsets some Solr Query implementations that
    have been built to assume SolrIndexSearcher in (e.g.)
    Query.createWeight.
    
    This commit adds checks for this case, which work by using a Lucene
    "QueryVisitor" to iterate over a parsed query tree and detect whether
    any of the individual queries require SolrIndexSearcher.
    
    (The QueryVisitor implementation has been added as 'lucene.
    experimental', to leave us free to modify or remove it in future as 
desired.)
---
 .kotlin/errors/errors-1740072217062.log            |  36 ++++++++
 .kotlin/errors/errors-1740072397518.log            |  36 ++++++++
 ...ecompose-decompose-3.2.2-commonMain-LOK12Q.klib | Bin 0 -> 54810 bytes
 ...extensions-compose-3.2.2-commonMain-chfXrQ.klib | Bin 0 -> 25104 bytes
 ...nsions-compose-3.2.2-nonAndroidMain-chfXrQ.klib | Bin 0 -> 4454 bytes
 ...senty-back-handler-2.2.1-commonMain-xZCRSw.klib | Bin 0 -> 5711 bytes
 ...ty-instance-keeper-2.4.0-commonMain-4cie6w.klib | Bin 0 -> 4563 bytes
 ....essenty-lifecycle-2.4.0-commonMain-R48i8A.klib | Bin 0 -> 4484 bytes
 ...senty-state-keeper-2.2.1-commonMain-Ye027A.klib | Bin 0 -> 9586 bytes
 ...vikotlin-mvikotlin-4.3.0-commonMain-uN2ISg.klib | Bin 0 -> 23273 bytes
 ...ensions-coroutines-4.3.0-commonMain-07Xjcg.klib | Bin 0 -> 9851 bytes
 ...-mvikotlin-logging-4.3.0-commonMain-eUbwvQ.klib | Bin 0 -> 8342 bytes
 ...lin-mvikotlin-main-4.3.0-commonMain-VD1jKg.klib | Bin 0 -> 2810 bytes
 ...hai-kotlin-logging-7.0.3-commonMain-AaQeDg.klib | Bin 0 -> 8434 bytes
 ...or-ktor-client-cio-3.1.0-commonMain-1h1QtA.klib | Bin 0 -> 8253 bytes
 ...ontent-negotiation-3.1.0-commonMain-JOFagw.klib | Bin 0 -> 2972 bytes
 ...r-ktor-client-core-3.1.0-commonMain-zNPbyA.klib | Bin 0 -> 76649 bytes
 ...o.ktor-ktor-events-3.1.0-commonMain-6BUpyw.klib | Bin 0 -> 1877 bytes
 .../io.ktor-ktor-http-3.1.0-commonMain-C60_2Q.klib | Bin 0 -> 48212 bytes
 ...ktor-ktor-http-cio-3.1.0-commonMain-SrQkIg.klib | Bin 0 -> 14652 bytes
 .../io.ktor-ktor-io-3.1.0-commonMain-0AWRlA.klib   | Bin 0 -> 31705 bytes
 ....ktor-ktor-network-3.1.0-commonMain-YkPbow.klib | Bin 0 -> 11025 bytes
 ...r-ktor-network-tls-3.1.0-commonMain-bttVYA.klib | Bin 0 -> 8648 bytes
 ...ktor-serialization-3.1.0-commonMain-ap7BlQ.klib | Bin 0 -> 3157 bytes
 ...ialization-kotlinx-3.1.0-commonMain-vCvDRA.klib | Bin 0 -> 4084 bytes
 ...ation-kotlinx-json-3.1.0-commonMain-CQrDiQ.klib | Bin 0 -> 3438 bytes
 .../io.ktor-ktor-sse-3.1.0-commonMain-Sy69FA.klib  | Bin 0 -> 2107 bytes
 ...io.ktor-ktor-utils-3.1.0-commonMain-Hp2p2g.klib | Bin 0 -> 40569 bytes
 ...cket-serialization-3.1.0-commonMain-4lwwjQ.klib | Bin 0 -> 1782 bytes
 ...or-ktor-websockets-3.1.0-commonMain-WQyQMg.klib | Bin 0 -> 11535 bytes
 ...nimation-animation-1.7.3-commonMain-TojQLQ.klib | Bin 0 -> 17265 bytes
 ...ion-animation-core-1.7.3-commonMain-KAIxIA.klib | Bin 0 -> 26464 bytes
 ...imation-animation-core-1.7.3-jbMain-KAIxIA.klib | Bin 0 -> 3429 bytes
 ...mponents-resources-1.7.3-commonMain-Tn2Qyw.klib | Bin 0 -> 13405 bytes
 ...omponents-resources-1.7.3-skikoMain-Tn2Qyw.klib | Bin 0 -> 5700 bytes
 ...ui-tooling-preview-1.7.3-commonMain--i3iSw.klib | Bin 0 -> 4651 bytes
 ...ndation-foundation-1.7.3-commonMain-m1MhUQ.klib | Bin 0 -> 163654 bytes
 ...undation-foundation-1.7.3-skikoMain-m1MhUQ.klib | Bin 0 -> 25929 bytes
 ...-foundation-layout-1.7.3-commonMain-Nkt8ew.klib | Bin 0 -> 24909 bytes
 ...undation-layout-1.7.3-notMobileMain-Nkt8ew.klib | Bin 0 -> 3470 bytes
 ...n-foundation-layout-1.7.3-skikoMain-Nkt8ew.klib | Bin 0 -> 3632 bytes
 ...aterial-icons-core-1.7.3-commonMain-OY6u5w.klib | Bin 0 -> 21037 bytes
 ...ial-icons-extended-1.7.3-commonMain-m2wuDA.klib | Bin 0 -> 465612 bytes
 ...al-material-ripple-1.7.3-commonMain-hYj_-Q.klib | Bin 0 -> 7567 bytes
 ...terial-material-ripple-1.7.3-jbMain-hYj_-Q.klib | Bin 0 -> 3842 bytes
 ...aterial3-material3-1.7.3-commonMain-qpUt6Q.klib | Bin 0 -> 107845 bytes
 ...material3-material3-1.7.3-skikoMain-qpUt6Q.klib | Bin 0 -> 11233 bytes
 ...se.runtime-runtime-1.7.3-commonMain-9pDeVQ.klib | Bin 0 -> 95905 bytes
 ...ompose.runtime-runtime-1.7.3-jbMain-9pDeVQ.klib | Bin 0 -> 4531 bytes
 ...e-runtime-saveable-1.7.3-commonMain-dToAUQ.klib | Bin 0 -> 5671 bytes
 ...ains.compose.ui-ui-1.7.3-commonMain-0ic95A.klib | Bin 0 -> 124534 bytes
 ...s.compose.ui-ui-1.7.3-notMobileMain-0ic95A.klib | Bin 0 -> 5051 bytes
 ...rains.compose.ui-ui-1.7.3-skikoMain-0ic95A.klib | Bin 0 -> 43337 bytes
 ...ose.ui-ui-geometry-1.7.3-commonMain-CwQ9Eg.klib | Bin 0 -> 6295 bytes
 ...ose.ui-ui-graphics-1.7.3-commonMain-kJsJ2w.klib | Bin 0 -> 38175 bytes
 ...pose.ui-ui-graphics-1.7.3-skikoMain-kJsJ2w.klib | Bin 0 -> 11225 bytes
 ...compose.ui-ui-test-1.7.3-commonMain-gt8Tiw.klib | Bin 0 -> 22467 bytes
 ....compose.ui-ui-test-1.7.3-skikoMain-gt8Tiw.klib | Bin 0 -> 8423 bytes
 ...compose.ui-ui-text-1.7.3-commonMain-22Ga_g.klib | Bin 0 -> 41036 bytes
 ....compose.ui-ui-text-1.7.3-skikoMain-22Ga_g.klib | Bin 0 -> 19530 bytes
 ...compose.ui-ui-unit-1.7.3-commonMain-pR3KgA.klib | Bin 0 -> 9302 bytes
 ...ins.compose.ui-ui-unit-1.7.3-jbMain-pR3KgA.klib | Bin 0 -> 3140 bytes
 ...compose.ui-ui-util-1.7.3-commonMain-3-t5Ow.klib | Bin 0 -> 4977 bytes
 ...lin-kotlin-stdlib-2.1.10-commonMain-ITmP6A.klib | Bin 0 -> 189164 bytes
 ...n-test-2.1.10-annotationsCommonMain-D3q3YQ.klib | Bin 0 -> 1544 bytes
 ...in-test-2.1.10-assertionsCommonMain-D3q3YQ.klib | Bin 0 -> 6027 bytes
 ...x-coroutines-core-1.10.1-commonMain-KUhp4Q.klib | Bin 0 -> 112761 bytes
 ...x-coroutines-test-1.10.1-commonMain-vXmODA.klib | Bin 0 -> 10746 bytes
 ...x-kotlinx-datetime-0.6.2-commonMain-fgfANw.klib | Bin 0 -> 32113 bytes
 ...linx-io-bytestring-0.6.0-commonMain-ptgxIQ.klib | Bin 0 -> 6049 bytes
 ...nx-kotlinx-io-core-0.6.0-commonMain-Ctrzpg.klib | Bin 0 -> 18094 bytes
 ...serialization-core-1.8.0-commonMain-tao8ug.klib | Bin 0 -> 50797 bytes
 ...serialization-json-1.8.0-commonMain-sWF2lQ.klib | Bin 0 -> 37327 bytes
 ...ialization-json-io-1.8.0-commonMain-YDa3rA.klib | Bin 0 -> 2782 bytes
 ...rains.skiko-skiko-0.8.18-commonMain-b4F8jQ.klib | Bin 0 -> 98978 bytes
 solr/CHANGES.txt                                   |   3 +
 .../src/java/org/apache/solr/search/JoinQuery.java |   8 +-
 .../search/SolrSearcherRequirementDetector.java    |  65 ++++++++++++++
 .../apache/solr/search/SolrSearcherRequirer.java   |  27 ++++++
 .../org/apache/solr/search/TopLevelJoinQuery.java  |   3 +-
 .../solr/search/join/CrossCollectionJoinQuery.java |   3 +-
 .../org/apache/solr/search/join/GraphQuery.java    |   3 +-
 .../apache/solr/search/join/HashRangeQuery.java    |   3 +-
 .../apache/solr/update/DirectUpdateHandler2.java   |  18 +++-
 .../apache/solr/cloud/TestCloudDeleteByQuery.java  |  40 +++++++++
 .../SolrSearcherRequirementDetectorTest.java       |  93 +++++++++++++++++++++
 .../pages/indexing-with-update-handlers.adoc       |   6 +-
 87 files changed, 333 insertions(+), 11 deletions(-)

diff --git a/.kotlin/errors/errors-1740072217062.log 
b/.kotlin/errors/errors-1740072217062.log
new file mode 100644
index 00000000000..5a3235f305e
--- /dev/null
+++ b/.kotlin/errors/errors-1740072217062.log
@@ -0,0 +1,36 @@
+kotlin version: 2.1.10
+error message: java.lang.OutOfMemoryError: GC overhead limit exceeded
+       at java.base/java.util.Arrays.copyOf(Arrays.java:3482)
+       at 
org.jetbrains.kotlin.kotlinx.collections.immutable.implementations.immutableList.SmallPersistentVector.add(SmallPersistentVector.kt:30)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary.appendInstr(WasmIrToBinary.kt:770)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary.appendExpr(WasmIrToBinary.kt:484)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary.appendCode$lambda$57(WasmIrToBinary.kt:573)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary$$Lambda/0x000000012800acb0.invoke(Unknown
 Source)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary.withVarUInt32PayloadSizePrepended(WasmIrToBinary.kt:338)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary.appendCode(WasmIrToBinary.kt:564)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary.appendWasmModule$lambda$28$lambda$24(WasmIrToBinary.kt:177)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary$$Lambda/0x000000012800aa58.invoke(Unknown
 Source)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary.appendSection_Sr9dMcE$lambda$45(WasmIrToBinary.kt:327)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary$$Lambda/0x00000001280a0b90.invoke(Unknown
 Source)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary.withVarUInt32PayloadSizePrepended(WasmIrToBinary.kt:338)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary.appendSection-Sr9dMcE(WasmIrToBinary.kt:327)
+       at 
org.jetbrains.kotlin.wasm.ir.convertors.WasmIrToBinary.appendWasmModule(WasmIrToBinary.kt:175)
+       at 
org.jetbrains.kotlin.backend.wasm.WasmCompilerKt.compileWasm-quGr1d0(wasmCompiler.kt:191)
+       at 
org.jetbrains.kotlin.cli.js.K2JSCompiler.doExecute(K2JSCompiler.kt:490)
+       at 
org.jetbrains.kotlin.cli.js.K2JSCompiler.doExecute(K2JSCompiler.kt:105)
+       at 
org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:102)
+       at org.jetbrains.kotlin.cli.common.CLICompiler.exec(CLICompiler.kt:316)
+       at 
org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1706)
+       at 
java.base/java.lang.invoke.LambdaForm$DMH/0x00000001280b1c00.invokeInterface(LambdaForm$DMH)
+       at 
java.base/java.lang.invoke.LambdaForm$MH/0x00000001280b6000.invoke(LambdaForm$MH)
+       at 
java.base/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
+       at 
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:157)
+       at 
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+       at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+       at 
java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360)
+       at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
+       at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
+       at 
java.base/java.security.AccessController.executePrivileged(AccessController.java:809)
+       at 
java.base/java.security.AccessController.doPrivileged(AccessController.java:714)
+
+
diff --git a/.kotlin/errors/errors-1740072397518.log 
b/.kotlin/errors/errors-1740072397518.log
new file mode 100644
index 00000000000..ac4c79ce3e6
--- /dev/null
+++ b/.kotlin/errors/errors-1740072397518.log
@@ -0,0 +1,36 @@
+kotlin version: 2.1.10
+error message: java.lang.OutOfMemoryError: Java heap space
+       at java.base/java.lang.StringBuilder.toString(StringBuilder.java:475)
+       at 
org.jetbrains.kotlin.ir.util.RenderIrElementKt.renderClassFqn(RenderIrElement.kt:604)
+       at 
org.jetbrains.kotlin.ir.util.RenderIrElementKt.renderClassifierFqn(RenderIrElement.kt:589)
+       at 
org.jetbrains.kotlin.ir.util.RenderIrElementKt.renderTypeInner(RenderIrElement.kt:805)
+       at 
org.jetbrains.kotlin.ir.util.RenderIrElementKt.renderTypeWithRenderer(RenderIrElement.kt:791)
+       at 
org.jetbrains.kotlin.ir.util.RenderIrElementKt.render(RenderIrElement.kt:652)
+       at 
org.jetbrains.kotlin.ir.util.RenderIrElementKt.render$default(RenderIrElement.kt:651)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator.visitSetValue(BodyGenerator.kt:529)
+       at 
org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitSetValue(IrElementVisitorVoid.kt:656)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator.visitSetValue(BodyGenerator.kt:32)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator.visitSetValue(BodyGenerator.kt:32)
+       at 
org.jetbrains.kotlin.ir.expressions.IrSetValue.accept(IrSetValue.kt:21)
+       at 
org.jetbrains.kotlin.ir.visitors.IrVisitorsKt.acceptVoid(IrVisitors.kt:11)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator.generateExpression$backend_wasm(BodyGenerator.kt:65)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator.generateAsStatement(BodyGenerator.kt:75)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator.generateStatement(BodyGenerator.kt:83)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator.visitBlockBody(BodyGenerator.kt:932)
+       at 
org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitBlockBody(IrElementVisitorVoid.kt:216)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator.visitBlockBody(BodyGenerator.kt:32)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator.visitBlockBody(BodyGenerator.kt:32)
+       at 
org.jetbrains.kotlin.ir.expressions.IrBlockBody.accept(IrBlockBody.kt:20)
+       at 
org.jetbrains.kotlin.ir.visitors.IrVisitorsKt.acceptVoid(IrVisitors.kt:11)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.DeclarationGenerator.visitFunction(DeclarationGenerator.kt:154)
+       at 
org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitSimpleFunction(IrElementVisitorVoid.kt:148)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.DeclarationGenerator.visitSimpleFunction(DeclarationGenerator.kt:30)
+       at 
org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitSimpleFunction(IrElementVisitorVoid.kt:144)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.DeclarationGenerator.visitSimpleFunction(DeclarationGenerator.kt:30)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.DeclarationGenerator.visitSimpleFunction(DeclarationGenerator.kt:30)
+       at 
org.jetbrains.kotlin.ir.declarations.IrSimpleFunction.accept(IrSimpleFunction.kt:39)
+       at 
org.jetbrains.kotlin.ir.visitors.IrVisitorsKt.acceptVoid(IrVisitors.kt:11)
+       at 
org.jetbrains.kotlin.backend.wasm.ir2wasm.DeclarationGenerator.visitClass(DeclarationGenerator.kt:367)
+       at 
org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitClass(IrElementVisitorVoid.kt:48)
+
+
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.decompose-decompose-3.2.2-commonMain-LOK12Q.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.decompose-decompose-3.2.2-commonMain-LOK12Q.klib
new file mode 100644
index 00000000000..032056bd6a8
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.decompose-decompose-3.2.2-commonMain-LOK12Q.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.decompose-extensions-compose-3.2.2-commonMain-chfXrQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.decompose-extensions-compose-3.2.2-commonMain-chfXrQ.klib
new file mode 100644
index 00000000000..05176c7eb73
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.decompose-extensions-compose-3.2.2-commonMain-chfXrQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.decompose-extensions-compose-3.2.2-nonAndroidMain-chfXrQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.decompose-extensions-compose-3.2.2-nonAndroidMain-chfXrQ.klib
new file mode 100644
index 00000000000..6384cfdf055
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.decompose-extensions-compose-3.2.2-nonAndroidMain-chfXrQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-back-handler-2.2.1-commonMain-xZCRSw.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-back-handler-2.2.1-commonMain-xZCRSw.klib
new file mode 100644
index 00000000000..d66a5e1b696
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-back-handler-2.2.1-commonMain-xZCRSw.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-instance-keeper-2.4.0-commonMain-4cie6w.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-instance-keeper-2.4.0-commonMain-4cie6w.klib
new file mode 100644
index 00000000000..2d29c8f4363
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-instance-keeper-2.4.0-commonMain-4cie6w.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-lifecycle-2.4.0-commonMain-R48i8A.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-lifecycle-2.4.0-commonMain-R48i8A.klib
new file mode 100644
index 00000000000..9b4aeb51e9c
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-lifecycle-2.4.0-commonMain-R48i8A.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-state-keeper-2.2.1-commonMain-Ye027A.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-state-keeper-2.2.1-commonMain-Ye027A.klib
new file mode 100644
index 00000000000..029a4a3f9eb
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.essenty-state-keeper-2.2.1-commonMain-Ye027A.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-4.3.0-commonMain-uN2ISg.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-4.3.0-commonMain-uN2ISg.klib
new file mode 100644
index 00000000000..c6782400273
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-4.3.0-commonMain-uN2ISg.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-extensions-coroutines-4.3.0-commonMain-07Xjcg.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-extensions-coroutines-4.3.0-commonMain-07Xjcg.klib
new file mode 100644
index 00000000000..1e9375bf66a
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-extensions-coroutines-4.3.0-commonMain-07Xjcg.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-logging-4.3.0-commonMain-eUbwvQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-logging-4.3.0-commonMain-eUbwvQ.klib
new file mode 100644
index 00000000000..ada9e28e572
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-logging-4.3.0-commonMain-eUbwvQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-main-4.3.0-commonMain-VD1jKg.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-main-4.3.0-commonMain-VD1jKg.klib
new file mode 100644
index 00000000000..809db7edbc6
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.arkivanov.mvikotlin-mvikotlin-main-4.3.0-commonMain-VD1jKg.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.github.oshai-kotlin-logging-7.0.3-commonMain-AaQeDg.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.github.oshai-kotlin-logging-7.0.3-commonMain-AaQeDg.klib
new file mode 100644
index 00000000000..313663a416f
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.github.oshai-kotlin-logging-7.0.3-commonMain-AaQeDg.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-client-cio-3.1.0-commonMain-1h1QtA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-client-cio-3.1.0-commonMain-1h1QtA.klib
new file mode 100644
index 00000000000..0e25df64cec
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-client-cio-3.1.0-commonMain-1h1QtA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-client-content-negotiation-3.1.0-commonMain-JOFagw.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-client-content-negotiation-3.1.0-commonMain-JOFagw.klib
new file mode 100644
index 00000000000..e89dc475a29
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-client-content-negotiation-3.1.0-commonMain-JOFagw.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-client-core-3.1.0-commonMain-zNPbyA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-client-core-3.1.0-commonMain-zNPbyA.klib
new file mode 100644
index 00000000000..d8e61788dbe
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-client-core-3.1.0-commonMain-zNPbyA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-events-3.1.0-commonMain-6BUpyw.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-events-3.1.0-commonMain-6BUpyw.klib
new file mode 100644
index 00000000000..4c57d5cf673
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-events-3.1.0-commonMain-6BUpyw.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-http-3.1.0-commonMain-C60_2Q.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-http-3.1.0-commonMain-C60_2Q.klib
new file mode 100644
index 00000000000..643a99b5d4e
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-http-3.1.0-commonMain-C60_2Q.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-http-cio-3.1.0-commonMain-SrQkIg.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-http-cio-3.1.0-commonMain-SrQkIg.klib
new file mode 100644
index 00000000000..3ef327ab773
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-http-cio-3.1.0-commonMain-SrQkIg.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-io-3.1.0-commonMain-0AWRlA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-io-3.1.0-commonMain-0AWRlA.klib
new file mode 100644
index 00000000000..9dc66c5c147
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-io-3.1.0-commonMain-0AWRlA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-network-3.1.0-commonMain-YkPbow.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-network-3.1.0-commonMain-YkPbow.klib
new file mode 100644
index 00000000000..37070bb74ba
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-network-3.1.0-commonMain-YkPbow.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-network-tls-3.1.0-commonMain-bttVYA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-network-tls-3.1.0-commonMain-bttVYA.klib
new file mode 100644
index 00000000000..3368bbc7ead
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-network-tls-3.1.0-commonMain-bttVYA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-serialization-3.1.0-commonMain-ap7BlQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-serialization-3.1.0-commonMain-ap7BlQ.klib
new file mode 100644
index 00000000000..915f809294b
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-serialization-3.1.0-commonMain-ap7BlQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-serialization-kotlinx-3.1.0-commonMain-vCvDRA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-serialization-kotlinx-3.1.0-commonMain-vCvDRA.klib
new file mode 100644
index 00000000000..e38da960b7d
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-serialization-kotlinx-3.1.0-commonMain-vCvDRA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-serialization-kotlinx-json-3.1.0-commonMain-CQrDiQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-serialization-kotlinx-json-3.1.0-commonMain-CQrDiQ.klib
new file mode 100644
index 00000000000..07141e382ea
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-serialization-kotlinx-json-3.1.0-commonMain-CQrDiQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-sse-3.1.0-commonMain-Sy69FA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-sse-3.1.0-commonMain-Sy69FA.klib
new file mode 100644
index 00000000000..bd8140edd7f
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-sse-3.1.0-commonMain-Sy69FA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-utils-3.1.0-commonMain-Hp2p2g.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-utils-3.1.0-commonMain-Hp2p2g.klib
new file mode 100644
index 00000000000..2d8ec317bf5
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-utils-3.1.0-commonMain-Hp2p2g.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-websocket-serialization-3.1.0-commonMain-4lwwjQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-websocket-serialization-3.1.0-commonMain-4lwwjQ.klib
new file mode 100644
index 00000000000..6a343bf997d
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-websocket-serialization-3.1.0-commonMain-4lwwjQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-websockets-3.1.0-commonMain-WQyQMg.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-websockets-3.1.0-commonMain-WQyQMg.klib
new file mode 100644
index 00000000000..9032f2f6a78
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.ktor-ktor-websockets-3.1.0-commonMain-WQyQMg.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.animation-animation-1.7.3-commonMain-TojQLQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.animation-animation-1.7.3-commonMain-TojQLQ.klib
new file mode 100644
index 00000000000..0dff1452654
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.animation-animation-1.7.3-commonMain-TojQLQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.animation-animation-core-1.7.3-commonMain-KAIxIA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.animation-animation-core-1.7.3-commonMain-KAIxIA.klib
new file mode 100644
index 00000000000..2cd83cd390a
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.animation-animation-core-1.7.3-commonMain-KAIxIA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.animation-animation-core-1.7.3-jbMain-KAIxIA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.animation-animation-core-1.7.3-jbMain-KAIxIA.klib
new file mode 100644
index 00000000000..1cccbbc0d5b
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.animation-animation-core-1.7.3-jbMain-KAIxIA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.components-components-resources-1.7.3-commonMain-Tn2Qyw.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.components-components-resources-1.7.3-commonMain-Tn2Qyw.klib
new file mode 100644
index 00000000000..ae02dc0a2bb
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.components-components-resources-1.7.3-commonMain-Tn2Qyw.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.components-components-resources-1.7.3-skikoMain-Tn2Qyw.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.components-components-resources-1.7.3-skikoMain-Tn2Qyw.klib
new file mode 100644
index 00000000000..ed536251f75
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.components-components-resources-1.7.3-skikoMain-Tn2Qyw.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.components-components-ui-tooling-preview-1.7.3-commonMain--i3iSw.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.components-components-ui-tooling-preview-1.7.3-commonMain--i3iSw.klib
new file mode 100644
index 00000000000..42209831053
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.components-components-ui-tooling-preview-1.7.3-commonMain--i3iSw.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-1.7.3-commonMain-m1MhUQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-1.7.3-commonMain-m1MhUQ.klib
new file mode 100644
index 00000000000..39d8f8c3fda
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-1.7.3-commonMain-m1MhUQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-1.7.3-skikoMain-m1MhUQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-1.7.3-skikoMain-m1MhUQ.klib
new file mode 100644
index 00000000000..0cb94157132
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-1.7.3-skikoMain-m1MhUQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-layout-1.7.3-commonMain-Nkt8ew.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-layout-1.7.3-commonMain-Nkt8ew.klib
new file mode 100644
index 00000000000..4ff3a3f54c0
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-layout-1.7.3-commonMain-Nkt8ew.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-layout-1.7.3-notMobileMain-Nkt8ew.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-layout-1.7.3-notMobileMain-Nkt8ew.klib
new file mode 100644
index 00000000000..f1d23c09484
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-layout-1.7.3-notMobileMain-Nkt8ew.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-layout-1.7.3-skikoMain-Nkt8ew.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-layout-1.7.3-skikoMain-Nkt8ew.klib
new file mode 100644
index 00000000000..9864f86aa9d
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.foundation-foundation-layout-1.7.3-skikoMain-Nkt8ew.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-icons-core-1.7.3-commonMain-OY6u5w.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-icons-core-1.7.3-commonMain-OY6u5w.klib
new file mode 100644
index 00000000000..c77913c0004
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-icons-core-1.7.3-commonMain-OY6u5w.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-icons-extended-1.7.3-commonMain-m2wuDA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-icons-extended-1.7.3-commonMain-m2wuDA.klib
new file mode 100644
index 00000000000..c4e7084b3f4
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-icons-extended-1.7.3-commonMain-m2wuDA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-ripple-1.7.3-commonMain-hYj_-Q.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-ripple-1.7.3-commonMain-hYj_-Q.klib
new file mode 100644
index 00000000000..78926d30627
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-ripple-1.7.3-commonMain-hYj_-Q.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-ripple-1.7.3-jbMain-hYj_-Q.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-ripple-1.7.3-jbMain-hYj_-Q.klib
new file mode 100644
index 00000000000..565aaec3385
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material-material-ripple-1.7.3-jbMain-hYj_-Q.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material3-material3-1.7.3-commonMain-qpUt6Q.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material3-material3-1.7.3-commonMain-qpUt6Q.klib
new file mode 100644
index 00000000000..2c36044b2e8
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material3-material3-1.7.3-commonMain-qpUt6Q.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material3-material3-1.7.3-skikoMain-qpUt6Q.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material3-material3-1.7.3-skikoMain-qpUt6Q.klib
new file mode 100644
index 00000000000..0d113521467
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.material3-material3-1.7.3-skikoMain-qpUt6Q.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.runtime-runtime-1.7.3-commonMain-9pDeVQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.runtime-runtime-1.7.3-commonMain-9pDeVQ.klib
new file mode 100644
index 00000000000..9937604e58b
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.runtime-runtime-1.7.3-commonMain-9pDeVQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.runtime-runtime-1.7.3-jbMain-9pDeVQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.runtime-runtime-1.7.3-jbMain-9pDeVQ.klib
new file mode 100644
index 00000000000..53a6fec63ea
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.runtime-runtime-1.7.3-jbMain-9pDeVQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.runtime-runtime-saveable-1.7.3-commonMain-dToAUQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.runtime-runtime-saveable-1.7.3-commonMain-dToAUQ.klib
new file mode 100644
index 00000000000..bcb74d24ca2
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.runtime-runtime-saveable-1.7.3-commonMain-dToAUQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-1.7.3-commonMain-0ic95A.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-1.7.3-commonMain-0ic95A.klib
new file mode 100644
index 00000000000..f0e39b834d0
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-1.7.3-commonMain-0ic95A.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-1.7.3-notMobileMain-0ic95A.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-1.7.3-notMobileMain-0ic95A.klib
new file mode 100644
index 00000000000..b599a1c5ea1
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-1.7.3-notMobileMain-0ic95A.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-1.7.3-skikoMain-0ic95A.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-1.7.3-skikoMain-0ic95A.klib
new file mode 100644
index 00000000000..2b9d0215447
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-1.7.3-skikoMain-0ic95A.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-geometry-1.7.3-commonMain-CwQ9Eg.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-geometry-1.7.3-commonMain-CwQ9Eg.klib
new file mode 100644
index 00000000000..f6aecb0d5c4
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-geometry-1.7.3-commonMain-CwQ9Eg.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-graphics-1.7.3-commonMain-kJsJ2w.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-graphics-1.7.3-commonMain-kJsJ2w.klib
new file mode 100644
index 00000000000..7fd8f7e93d1
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-graphics-1.7.3-commonMain-kJsJ2w.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-graphics-1.7.3-skikoMain-kJsJ2w.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-graphics-1.7.3-skikoMain-kJsJ2w.klib
new file mode 100644
index 00000000000..a9e45bb410a
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-graphics-1.7.3-skikoMain-kJsJ2w.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-test-1.7.3-commonMain-gt8Tiw.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-test-1.7.3-commonMain-gt8Tiw.klib
new file mode 100644
index 00000000000..5721242b050
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-test-1.7.3-commonMain-gt8Tiw.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-test-1.7.3-skikoMain-gt8Tiw.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-test-1.7.3-skikoMain-gt8Tiw.klib
new file mode 100644
index 00000000000..656c5faff76
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-test-1.7.3-skikoMain-gt8Tiw.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-text-1.7.3-commonMain-22Ga_g.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-text-1.7.3-commonMain-22Ga_g.klib
new file mode 100644
index 00000000000..0a17832f859
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-text-1.7.3-commonMain-22Ga_g.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-text-1.7.3-skikoMain-22Ga_g.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-text-1.7.3-skikoMain-22Ga_g.klib
new file mode 100644
index 00000000000..4c080fe38de
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-text-1.7.3-skikoMain-22Ga_g.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-unit-1.7.3-commonMain-pR3KgA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-unit-1.7.3-commonMain-pR3KgA.klib
new file mode 100644
index 00000000000..d6daa262821
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-unit-1.7.3-commonMain-pR3KgA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-unit-1.7.3-jbMain-pR3KgA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-unit-1.7.3-jbMain-pR3KgA.klib
new file mode 100644
index 00000000000..2e109c53736
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-unit-1.7.3-jbMain-pR3KgA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-util-1.7.3-commonMain-3-t5Ow.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-util-1.7.3-commonMain-3-t5Ow.klib
new file mode 100644
index 00000000000..64792b88c12
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.compose.ui-ui-util-1.7.3-commonMain-3-t5Ow.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlin-kotlin-stdlib-2.1.10-commonMain-ITmP6A.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlin-kotlin-stdlib-2.1.10-commonMain-ITmP6A.klib
new file mode 100644
index 00000000000..f1545f7d298
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlin-kotlin-stdlib-2.1.10-commonMain-ITmP6A.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlin-kotlin-test-2.1.10-annotationsCommonMain-D3q3YQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlin-kotlin-test-2.1.10-annotationsCommonMain-D3q3YQ.klib
new file mode 100644
index 00000000000..e6e71526236
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlin-kotlin-test-2.1.10-annotationsCommonMain-D3q3YQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlin-kotlin-test-2.1.10-assertionsCommonMain-D3q3YQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlin-kotlin-test-2.1.10-assertionsCommonMain-D3q3YQ.klib
new file mode 100644
index 00000000000..9a9ed43e6e2
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlin-kotlin-test-2.1.10-assertionsCommonMain-D3q3YQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-coroutines-core-1.10.1-commonMain-KUhp4Q.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-coroutines-core-1.10.1-commonMain-KUhp4Q.klib
new file mode 100644
index 00000000000..8f8207964db
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-coroutines-core-1.10.1-commonMain-KUhp4Q.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-coroutines-test-1.10.1-commonMain-vXmODA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-coroutines-test-1.10.1-commonMain-vXmODA.klib
new file mode 100644
index 00000000000..39ef51fa6b3
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-coroutines-test-1.10.1-commonMain-vXmODA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-datetime-0.6.2-commonMain-fgfANw.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-datetime-0.6.2-commonMain-fgfANw.klib
new file mode 100644
index 00000000000..3ba744a076c
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-datetime-0.6.2-commonMain-fgfANw.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-io-bytestring-0.6.0-commonMain-ptgxIQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-io-bytestring-0.6.0-commonMain-ptgxIQ.klib
new file mode 100644
index 00000000000..66569e0b172
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-io-bytestring-0.6.0-commonMain-ptgxIQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-io-core-0.6.0-commonMain-Ctrzpg.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-io-core-0.6.0-commonMain-Ctrzpg.klib
new file mode 100644
index 00000000000..d2f85d59e7b
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-io-core-0.6.0-commonMain-Ctrzpg.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-serialization-core-1.8.0-commonMain-tao8ug.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-serialization-core-1.8.0-commonMain-tao8ug.klib
new file mode 100644
index 00000000000..74885c529a0
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-serialization-core-1.8.0-commonMain-tao8ug.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-serialization-json-1.8.0-commonMain-sWF2lQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-serialization-json-1.8.0-commonMain-sWF2lQ.klib
new file mode 100644
index 00000000000..0566416a1da
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-serialization-json-1.8.0-commonMain-sWF2lQ.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-serialization-json-io-1.8.0-commonMain-YDa3rA.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-serialization-json-io-1.8.0-commonMain-YDa3rA.klib
new file mode 100644
index 00000000000..21850965aaf
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-serialization-json-io-1.8.0-commonMain-YDa3rA.klib
 differ
diff --git 
a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.skiko-skiko-0.8.18-commonMain-b4F8jQ.klib
 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.skiko-skiko-0.8.18-commonMain-b4F8jQ.klib
new file mode 100644
index 00000000000..34a945c4989
Binary files /dev/null and 
b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.skiko-skiko-0.8.18-commonMain-b4F8jQ.klib
 differ
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 8837e6f3224..68149c7e1c3 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -27,6 +27,9 @@ Bug Fixes
 
 * SOLR-17670: Fix unnecessary memory allocation caused by a large reRankDocs 
param. (JiaBao Gao)
 
+* SOLR-17677: Before attempting a delete by query ("DBQ"), Solr now checks 
whether the provided query can be run using a Lucene IndexSearcher,
+  and aborts the operation with a '400' error if it cannot. (Jason Gerlowski)
+
 Dependency Upgrades
 ---------------------
 (No changes)
diff --git a/solr/core/src/java/org/apache/solr/search/JoinQuery.java 
b/solr/core/src/java/org/apache/solr/search/JoinQuery.java
index 3ec6b85b94c..ede3edaddc7 100644
--- a/solr/core/src/java/org/apache/solr/search/JoinQuery.java
+++ b/solr/core/src/java/org/apache/solr/search/JoinQuery.java
@@ -29,6 +29,7 @@ import org.apache.lucene.index.MultiPostingsEnum;
 import org.apache.lucene.index.PostingsEnum;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
+import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.ConstantScoreScorer;
 import org.apache.lucene.search.ConstantScoreWeight;
 import org.apache.lucene.search.DocIdSetIterator;
@@ -54,7 +55,7 @@ import org.apache.solr.search.join.GraphPointsCollector;
 import org.apache.solr.util.RTimer;
 import org.apache.solr.util.RefCounted;
 
-class JoinQuery extends Query {
+class JoinQuery extends Query implements SolrSearcherRequirer {
   String fromField;
   String toField;
   // TODO: name is missleading here compared to JoinQParserPlugin usage - here 
it must be a core
@@ -86,7 +87,10 @@ class JoinQuery extends Query {
   }
 
   @Override
-  public void visit(QueryVisitor visitor) {}
+  public void visit(QueryVisitor visitor) {
+    QueryVisitor sub = visitor.getSubVisitor(BooleanClause.Occur.MUST, this);
+    q.visit(sub);
+  }
 
   @Override
   public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, 
float boost)
diff --git 
a/solr/core/src/java/org/apache/solr/search/SolrSearcherRequirementDetector.java
 
b/solr/core/src/java/org/apache/solr/search/SolrSearcherRequirementDetector.java
new file mode 100644
index 00000000000..9abc601fa6d
--- /dev/null
+++ 
b/solr/core/src/java/org/apache/solr/search/SolrSearcherRequirementDetector.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.search;
+
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.QueryVisitor;
+
+/**
+ * Detects whether a query can be run using a standard Lucene {@link
+ * org.apache.lucene.search.IndexSearcher}
+ *
+ * <p>Some Solr {@link Query} implementations are written to assume access to 
a {@link
+ * SolrIndexSearcher}. But these objects aren't always available: some 
code-paths (e.g. when
+ * executing a "delete-by-query") execute the query using the standard {@link
+ * org.apache.lucene.search.IndexSearcher} available in Lucene. This {@link 
QueryVisitor} allows
+ * code to detect whether a given Query requires SolrIndexSearcher or not.
+ *
+ * <p>Instances should not be reused for multiple query-tree inspections.
+ *
+ * @see SolrSearcherRequirer
+ * @lucene.experimental
+ */
+public class SolrSearcherRequirementDetector extends QueryVisitor {
+
+  private boolean requiresSolrSearcher = false;
+
+  @Override
+  public QueryVisitor getSubVisitor(BooleanClause.Occur occur, Query parent) {
+    // This method is primarily intended to swap out visitors when descending 
through the Query
+    // tree, but it's also the only place to put visiting logic for non-leaf 
nodes, since the
+    // QueryVisitor interface largely assumes that only leaf-nodes are worth 
visiting.  See
+    // LUCENE-????? for more details - this can be restructured if that ticket 
is ever addressed.
+    if (parent instanceof SolrSearcherRequirer) {
+      requiresSolrSearcher = true;
+    }
+
+    return this;
+  }
+
+  @Override
+  public void visitLeaf(Query query) {
+    if (query instanceof SolrSearcherRequirer) {
+      requiresSolrSearcher = true;
+    }
+  }
+
+  public boolean getRequiresSolrSearcher() {
+    return requiresSolrSearcher;
+  }
+}
diff --git 
a/solr/core/src/java/org/apache/solr/search/SolrSearcherRequirer.java 
b/solr/core/src/java/org/apache/solr/search/SolrSearcherRequirer.java
new file mode 100644
index 00000000000..888060a4231
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/search/SolrSearcherRequirer.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.search;
+
+import org.apache.lucene.search.IndexSearcher;
+
+/**
+ * Marker interface indicating that the tagged class assumes access to {@link 
SolrIndexSearcher}
+ * functionality and cannot be used by a vanilla Lucene {@link IndexSearcher}
+ *
+ * @lucene.experimental
+ */
+public interface SolrSearcherRequirer {}
diff --git a/solr/core/src/java/org/apache/solr/search/TopLevelJoinQuery.java 
b/solr/core/src/java/org/apache/solr/search/TopLevelJoinQuery.java
index ea7b55a2e75..ad3fd963574 100644
--- a/solr/core/src/java/org/apache/solr/search/TopLevelJoinQuery.java
+++ b/solr/core/src/java/org/apache/solr/search/TopLevelJoinQuery.java
@@ -46,7 +46,7 @@ import org.slf4j.LoggerFactory;
  * {@link JoinQuery} implementation using global (top-level) DocValues 
ordinals to efficiently
  * compare values in the "from" and "to" fields.
  */
-public class TopLevelJoinQuery extends JoinQuery {
+public class TopLevelJoinQuery extends JoinQuery implements 
SolrSearcherRequirer {
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public TopLevelJoinQuery(String fromField, String toField, String coreName, 
Query subQuery) {
@@ -60,6 +60,7 @@ public class TopLevelJoinQuery extends JoinQuery {
       log.debug(
           "Falling back to JoinQueryWeight because searcher [{}] is not the 
required SolrIndexSearcher",
           searcher);
+      // TODO This check no longer makes sense as super.createWeight *also* 
requires a SIS
       return super.createWeight(searcher, scoreMode, boost);
     }
 
diff --git 
a/solr/core/src/java/org/apache/solr/search/join/CrossCollectionJoinQuery.java 
b/solr/core/src/java/org/apache/solr/search/join/CrossCollectionJoinQuery.java
index b0b396cf6cf..619025800ac 100644
--- 
a/solr/core/src/java/org/apache/solr/search/join/CrossCollectionJoinQuery.java
+++ 
b/solr/core/src/java/org/apache/solr/search/join/CrossCollectionJoinQuery.java
@@ -60,8 +60,9 @@ import org.apache.solr.search.BitDocSet;
 import org.apache.solr.search.DocSet;
 import org.apache.solr.search.DocSetUtil;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.search.SolrSearcherRequirer;
 
-public class CrossCollectionJoinQuery extends Query {
+public class CrossCollectionJoinQuery extends Query implements 
SolrSearcherRequirer {
 
   protected final String query;
   protected final String zkHost;
diff --git a/solr/core/src/java/org/apache/solr/search/join/GraphQuery.java 
b/solr/core/src/java/org/apache/solr/search/join/GraphQuery.java
index 3dddedb755f..051c3f639f5 100644
--- a/solr/core/src/java/org/apache/solr/search/join/GraphQuery.java
+++ b/solr/core/src/java/org/apache/solr/search/join/GraphQuery.java
@@ -46,6 +46,7 @@ import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.BitDocSet;
 import org.apache.solr.search.DocSet;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.search.SolrSearcherRequirer;
 
 /**
  * GraphQuery - search for nodes and traverse edges in an index.
@@ -58,7 +59,7 @@ import org.apache.solr.search.SolrIndexSearcher;
  *
  * @lucene.experimental
  */
-public class GraphQuery extends Query {
+public class GraphQuery extends Query implements SolrSearcherRequirer {
 
   /** The inital node matching query */
   private Query q;
diff --git a/solr/core/src/java/org/apache/solr/search/join/HashRangeQuery.java 
b/solr/core/src/java/org/apache/solr/search/join/HashRangeQuery.java
index d0bdc326747..df70e7c9bf0 100644
--- a/solr/core/src/java/org/apache/solr/search/join/HashRangeQuery.java
+++ b/solr/core/src/java/org/apache/solr/search/join/HashRangeQuery.java
@@ -38,8 +38,9 @@ import org.apache.lucene.util.BytesRef;
 import org.apache.solr.common.util.Hash;
 import org.apache.solr.search.SolrCache;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.search.SolrSearcherRequirer;
 
-public class HashRangeQuery extends Query {
+public class HashRangeQuery extends Query implements SolrSearcherRequirer {
 
   protected final String field;
   protected final int lower;
diff --git 
a/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java 
b/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
index 2704ef4e027..4c55eaab9b5 100644
--- a/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
+++ b/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
@@ -65,6 +65,7 @@ import org.apache.solr.search.FunctionRangeQuery;
 import org.apache.solr.search.QParser;
 import org.apache.solr.search.QueryUtils;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.search.SolrSearcherRequirementDetector;
 import org.apache.solr.search.SyntaxError;
 import org.apache.solr.search.function.ValueSourceRangeFilter;
 import org.apache.solr.util.RefCounted;
@@ -79,6 +80,8 @@ import org.slf4j.LoggerFactory;
 public class DirectUpdateHandler2 extends UpdateHandler
     implements SolrCoreState.IndexWriterCloser, SolrMetricProducer {
 
+  private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   private static final int NO_FILE_SIZE_UPPER_BOUND_PLACEHOLDER = -1;
 
   protected final SolrCoreState solrCoreState;
@@ -115,8 +118,6 @@ public class DirectUpdateHandler2 extends UpdateHandler
     this.commitWithinSoftCommit = value;
   }
 
-  private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
   public DirectUpdateHandler2(SolrCore core) {
     super(core, null, false);
 
@@ -572,12 +573,23 @@ public class DirectUpdateHandler2 extends UpdateHandler
     deleteByQueryCommandsCumulative.mark();
     boolean madeIt = false;
     try {
+      Query q = getQuery(cmd);
+
+      // Parts of the DBQ codepath run the query using a standard Lucene 
IndexSearcher, so block any
+      // queries that we know require a SolrIndexSearcher
+      final var unsupportedQDetector = new SolrSearcherRequirementDetector();
+      q.visit(unsupportedQDetector);
+      if (unsupportedQDetector.getRequiresSolrSearcher()) {
+        throw new SolrException(
+            SolrException.ErrorCode.BAD_REQUEST,
+            "Query [" + cmd.getQuery() + "] is not supported in 
delete-by-query operations");
+      }
+
       if ((cmd.getFlags() & UpdateCommand.IGNORE_INDEXWRITER) != 0) {
         if (ulog != null) ulog.deleteByQuery(cmd);
         madeIt = true;
         return;
       }
-      Query q = getQuery(cmd);
 
       boolean delAll = MatchAllDocsQuery.class == q.getClass();
 
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/TestCloudDeleteByQuery.java 
b/solr/core/src/test/org/apache/solr/cloud/TestCloudDeleteByQuery.java
index f2a6d7c1d76..1e6a5c04b5c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudDeleteByQuery.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudDeleteByQuery.java
@@ -16,11 +16,15 @@
  */
 package org.apache.solr.cloud;
 
+import static org.hamcrest.Matchers.containsString;
+
+import java.lang.invoke.MethodHandles;
 import java.net.URL;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.UUID;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -40,9 +44,14 @@ import org.apache.solr.embedded.JettySolrRunner;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class TestCloudDeleteByQuery extends SolrCloudTestCase {
 
+  private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   private static final int NUM_SHARDS = 2;
   private static final int REPLICATION_FACTOR = 2;
   private static final int NUM_SERVERS = 5;
@@ -255,6 +264,37 @@ public class TestCloudDeleteByQuery extends 
SolrCloudTestCase {
     testMalformedDBQ(NO_COLLECTION_CLIENT);
   }
 
+  // See SOLR-17677 for context
+  @Test
+  public void testDBQWithUnsupportedQueryReturns400() throws Exception {
+    final var unsupportedQueryExamples =
+        new String[] {
+          "{!join from=expected_shard_s to=expected_shard_s 
v=\"expected_shard_s:5\"}",
+          "{!graph from=expected_shard_s to=expected_shard_s 
v=\"expected_shard_s:5\"}",
+          "{!hash_range f=\"foo_i\" l=\"0\" u=\"12345\"}"
+        };
+
+    update(params()).add(doc(f("id", 
UUID.randomUUID().toString()))).process(COLLECTION_CLIENT);
+    for (String queryStr : unsupportedQueryExamples) {
+      log.info("Testing unsupported DBQ query: {}", queryStr);
+      SolrException e =
+          expectThrows(
+              SolrException.class,
+              () -> {
+                
update(params()).deleteByQuery(queryStr).process(COLLECTION_CLIENT);
+              });
+      assertEquals("Unexpected status code for DBQ with query " + queryStr, 
400, e.code());
+      final var expectedStr =
+          "Query [" + queryStr + "] is not supported in delete-by-query 
operations";
+      assertThat(e.getMessage(), containsString(expectedStr));
+    }
+
+    final var acceptableJoin =
+        "{!join method=dvWithScore score=None from=expected_shard_s 
to=expected_shard_s v=\"expected_shard_s:5\"}";
+    final var response = 
update(params()).deleteByQuery(acceptableJoin).process(COLLECTION_CLIENT);
+    assertEquals(0, response.getStatus());
+  }
+
   public static UpdateRequest update(SolrParams params, SolrInputDocument... 
docs) {
     UpdateRequest r = new UpdateRequest();
     r.setParams(new ModifiableSolrParams(params));
diff --git 
a/solr/core/src/test/org/apache/solr/search/SolrSearcherRequirementDetectorTest.java
 
b/solr/core/src/test/org/apache/solr/search/SolrSearcherRequirementDetectorTest.java
new file mode 100644
index 00000000000..526d9a23a26
--- /dev/null
+++ 
b/solr/core/src/test/org/apache/solr/search/SolrSearcherRequirementDetectorTest.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.search;
+
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.not;
+
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.TermQuery;
+import org.apache.solr.SolrTestCase;
+import org.apache.solr.search.join.GraphQuery;
+import org.junit.Test;
+
+/** Unit tests for {@link SolrSearcherRequirementDetector} */
+public class SolrSearcherRequirementDetectorTest extends SolrTestCase {
+
+  @Test
+  public void testDetectsWhenQueriesDontRequireSolrSearcher() {
+    final var termQuery = new TermQuery(new Term("someField", 
"someFieldValue"));
+    final var termQuery2 = new TermQuery(new Term("someField", 
"someOtherFieldValue"));
+
+    var needsSearcherDetector = new SolrSearcherRequirementDetector();
+    termQuery.visit(needsSearcherDetector);
+    assertFalse(needsSearcherDetector.getRequiresSolrSearcher());
+
+    final var boolQuery =
+        new BooleanQuery.Builder()
+            .add(termQuery, BooleanClause.Occur.MUST)
+            .add(termQuery2, BooleanClause.Occur.SHOULD)
+            .build();
+    needsSearcherDetector = new SolrSearcherRequirementDetector();
+    boolQuery.visit(needsSearcherDetector);
+    assertFalse(needsSearcherDetector.getRequiresSolrSearcher());
+  }
+
+  @Test
+  public void testDetectsWhenQueriesDoRequireSolrSearcher_TopLevel() {
+    final var termQuery = new TermQuery(new Term("someField", 
"someFieldValue"));
+
+    var needsSearcherDetector = new SolrSearcherRequirementDetector();
+    final var joinQuery = new JoinQuery("fromField", "toField", 
"someCoreName", termQuery);
+    assertThat(
+        joinQuery,
+        instanceOf(SolrSearcherRequirer.class)); // Ensure that JoinQuery 
still requires SIS
+    joinQuery.visit(needsSearcherDetector);
+    assertTrue(needsSearcherDetector.getRequiresSolrSearcher());
+
+    needsSearcherDetector = new SolrSearcherRequirementDetector();
+    final var graphQuery = new GraphQuery(termQuery, "fromField", "toField");
+    assertThat(
+        graphQuery,
+        instanceOf(SolrSearcherRequirer.class)); // Ensure that GraphQuery 
still requires SIS
+    graphQuery.visit(needsSearcherDetector);
+    assertTrue(needsSearcherDetector.getRequiresSolrSearcher());
+  }
+
+  @Test
+  public void testDeteectsWhenQueriesDoRequireSolrSearcher_Nested() {
+    final var termQuery = new TermQuery(new Term("someField", 
"someFieldValue"));
+    final var termQuery2 = new TermQuery(new Term("someField", 
"someOtherFieldValue"));
+    final var joinQuery = new JoinQuery("fromField", "toField", 
"someCoreName", termQuery);
+    final var boolQuery =
+        new BooleanQuery.Builder()
+            .add(new BooleanClause(termQuery, BooleanClause.Occur.MUST))
+            .add(new BooleanClause(termQuery2, BooleanClause.Occur.SHOULD))
+            .add(new BooleanClause(joinQuery, BooleanClause.Occur.SHOULD))
+            .build();
+
+    final var needsSearcherDetector = new SolrSearcherRequirementDetector();
+    // Top level query and some leaves don't require SIS, but JoinQuery does.
+    assertThat(boolQuery, not(instanceOf(SolrSearcherRequirer.class)));
+    assertThat(termQuery, not(instanceOf(SolrSearcherRequirer.class)));
+    assertThat(joinQuery, instanceOf(SolrSearcherRequirer.class));
+    boolQuery.visit(needsSearcherDetector);
+    assertTrue(needsSearcherDetector.getRequiresSolrSearcher());
+  }
+}
diff --git 
a/solr/solr-ref-guide/modules/indexing-guide/pages/indexing-with-update-handlers.adoc
 
b/solr/solr-ref-guide/modules/indexing-guide/pages/indexing-with-update-handlers.adoc
index 92b7bedcdec..44aa38a85a7 100644
--- 
a/solr/solr-ref-guide/modules/indexing-guide/pages/indexing-with-update-handlers.adoc
+++ 
b/solr/solr-ref-guide/modules/indexing-guide/pages/indexing-with-update-handlers.adoc
@@ -181,8 +181,10 @@ A single delete message can contain multiple delete 
operations.
 [IMPORTANT]
 ====
 
-When using the Join query parser in a Delete By Query, you should use the 
`score` parameter with a value of "none" to avoid a `ClassCastException`.
-See the section on the xref:query-guide:join-query-parser.adoc[] for more 
details on the `score` parameter.
+Some queries, including many `{!join}` and `{!graph}` queries, are not 
supported in delete operations and will return a 400 error.
+
+Users interested in using the Join query parser in a Delete By Query may do so 
by specifying a `score` parameter with the value "none" (and ensuring no 
`method` parameter is provided).
+See the section on the xref:query-guide:join-query-parser.adoc[] for more 
details on the `score` parameter and its usage.
 
 ====
 

Reply via email to