Skip to content

Commit 08d8ba1

Browse files
authored
Stabilize PPL ITs on the analytics-engine route (percentile/float/datetime/json/dedup/union/rename/chart) (opensearch-project#5564)
Brings 14 PPL IT classes to parity on the analytics-engine route (-Dtests.analytics.parquet_indices=true). Each gated test is skipped ONLY on the AE route via @RequiresCapability + a matching build.gradle excludeTestsMatching; the v2/Calcite path runs all of them unchanged. Engine divergences gated (route-only, behavior is correct elsewhere): - PERCENTILE_APPROXIMATE: percentile/median is approximate on DataFusion - FLOAT_ARITHMETIC_PRECISION: float/half_float arithmetic keeps 32-bit - DATETIME_FORMAT_RENDERING: date_format/strftime token rendering differs - UNIX_TIMESTAMP_SUBSECOND: unix_timestamp drops sub-second precision - JSON_DOLLAR_PATH: json_set/json_delete with $-path is a no-op - DEDUP_NONDETERMINISTIC: dedup surviving-row selection is unstable - SAME_INDEX_UNION_CONFLATION: same-index union conflates (delegate leak) - WILDCARD_COLUMN_ORDER: rename * column order differs - BIN_TIME_FIELD_BUCKETING: span() time bucketing differs - MULTI_VALUE_FIELD_LOAD: otel_logs/game_of_thrones multi-value field can't bulk-load into the parquet store Two cases were harness-predicate gaps, not real divergences, so they now PASS on AE instead of being gated: testStatsPercentileWithMin and testTimestampDiff branch on isCalciteEnabled() for the result type, but the AE route runs the Calcite path while the cluster setting reads false; extended the predicate with isAnalyticsParquetIndicesEnabled(). Guarded the otel_logs / game_of_thrones loads in CalciteChartCommandIT and CalcitePPLJsonBuiltinFunctionIT init() so a multi-value bulk-load failure no longer aborts init() and mislabels unrelated tests. CalciteAnalyticsDatetimeWireFormatIT (AE-only via assumeTrue) updated to assert the date/time UDT types AE now preserves. Results (this batch, on the AE route): - CalcitePPLAggregationIT: 100 run, 2 skip - CalcitePPLBuiltinFunctionIT: 26 run, 3 skip - CalciteDateTimeFunctionIT: 65 run, 5 skip - CalcitePPLDedupIT: 15 run, 3 skip - CalcitePPLJsonBuiltinFunctionIT: 22 run, 2 skip - CalcitePPLRenameIT: 24 run, 1 skip - CalciteUnionCommandIT: 15 run, 2 skip - CalciteChartCommandIT: 15 run, 5 skip - DateTimeFunctionIT: 59 run, 4 skip - StatsCommandIT: 59 run, 6 skip - SystemFunctionIT: 1 run - CalciteAnalyticsDatetimeWireFormatIT: 11 run AE route: 0 failures (was 30+ fail across the batch). V2 baseline: 402 run, 0 fail, 3 pre-existing skips, 0 from these gates. Signed-off-by: Kai Huang <ahkcs@amazon.com>
1 parent 7f2b60f commit 08d8ba1

14 files changed

Lines changed: 281 additions & 16 deletions

integ-test/build.gradle

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,52 @@ task integTestRemote(type: RestIntegTestTask) {
12391239
// === Excludes: CalcitePPLBasicIT route divergence ===
12401240
// REGEXP filter throws a backend NullPointerException on the AE route.
12411241
excludeTestsMatching '*CalcitePPLBasicIT.testRegexpFilter'
1242+
1243+
// === Excludes: percentile is approximate on AE (DataFusion) but exact on v2/Calcite ===
1244+
excludeTestsMatching '*StatsCommandIT.testStatsPercentileWithNull'
1245+
excludeTestsMatching '*StatsCommandIT.testStatsPercentileByNullValue'
1246+
excludeTestsMatching '*StatsCommandIT.testStatsPercentileByNullValueNonNullBucket'
1247+
excludeTestsMatching '*StatsCommandIT.testStatsPercentileBySpan'
1248+
excludeTestsMatching '*CalcitePPLAggregationIT.testPercentile'
1249+
excludeTestsMatching '*CalcitePPLAggregationIT.testPercentileShortcutsFloatingPoint'
1250+
1251+
// === Excludes: span() time-field bucketing differs on the AE route ===
1252+
excludeTestsMatching '*StatsCommandIT.testStatsBySpanTimeWithNullBucket'
1253+
excludeTestsMatching '*CalciteChartCommandIT.testChartMaxValueByTimestampSpanDayAndWeek'
1254+
1255+
// === Excludes: float/half_float arithmetic keeps 32-bit precision on AE ===
1256+
excludeTestsMatching '*CalcitePPLBuiltinFunctionIT.testDivide'
1257+
excludeTestsMatching '*CalcitePPLBuiltinFunctionIT.testModFloatAndNegative'
1258+
excludeTestsMatching '*CalcitePPLBuiltinFunctionIT.testModShouldReturnWiderTypes'
1259+
1260+
// === Excludes: date_format/strftime render some tokens differently on AE ===
1261+
excludeTestsMatching '*DateTimeFunctionIT.testDateFormat'
1262+
excludeTestsMatching '*CalciteDateTimeFunctionIT.testStrftimeWithDateFields'
1263+
1264+
// === Excludes: unix_timestamp drops sub-second precision on AE ===
1265+
excludeTestsMatching '*DateTimeFunctionIT.testUnixTimestampWithTimestampString'
1266+
1267+
// === Excludes: json_set/json_delete with a $-prefixed path is a no-op on AE ===
1268+
excludeTestsMatching '*CalcitePPLJsonBuiltinFunctionIT.testJsonSetWithDollarPrefixedPath'
1269+
excludeTestsMatching '*CalcitePPLJsonBuiltinFunctionIT.testJsonDeleteWithDollarPrefixedPath'
1270+
1271+
// === Excludes: dedup surviving-row selection is non-deterministic on AE ===
1272+
excludeTestsMatching '*CalcitePPLDedupIT.testDedupComplex'
1273+
excludeTestsMatching '*CalcitePPLDedupIT.testDedupExpr'
1274+
excludeTestsMatching '*CalcitePPLDedupIT.testConsecutiveImplicitFallbackV2'
1275+
1276+
// === Excludes: same-index union conflates on AE (delegated predicate leak) ===
1277+
excludeTestsMatching '*CalciteUnionCommandIT.testUnionThreeSubsearches'
1278+
excludeTestsMatching '*CalciteUnionCommandIT.testUnionMidPipeline_SingleExplicitDataset'
1279+
1280+
// === Excludes: rename * returns columns in a different order on AE ===
1281+
excludeTestsMatching '*CalcitePPLRenameIT.testRenameFullWildcardExcludesMetadataFields'
1282+
1283+
// === Excludes: otel_logs multi-value field can't load into the parquet store ===
1284+
excludeTestsMatching '*CalciteChartCommandIT.testChartLimit0WithUseOther'
1285+
excludeTestsMatching '*CalciteChartCommandIT.testChartLimitTopWithUseOther'
1286+
excludeTestsMatching '*CalciteChartCommandIT.testChartLimitBottomWithUseOther'
1287+
excludeTestsMatching '*CalciteChartCommandIT.testChartLimitTopWithMinAgg'
12421288
}
12431289
}
12441290

integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteAnalyticsDatetimeWireFormatIT.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,29 +92,24 @@ public void testTimestampRootColumnSpaceFormat() throws IOException {
9292
verifyDataRows(result, rows("2024-03-15 10:30:00"));
9393
}
9494

95-
/**
96-
* DATE-mapped col: AE widens to TIMESTAMP at scan time; value must use space separator, not ISO
97-
* {@code T}.
98-
*/
95+
/** DATE-mapped col: AE preserves the DATE type (date UDT) and renders {@code yyyy-MM-dd}. */
9996
@Test
10097
public void testDateRootColumnYmdFormat() throws IOException {
10198
String query = "source=" + INDEX + " | where d = '2024-03-15' | fields d";
10299
assertRoutedToAnalyticsEngine(query);
103100
JSONObject result = executeQuery(query);
104-
verifySchema(result, schema("d", "timestamp"));
105-
verifyDataRows(result, rows("2024-03-15 00:00:00"));
101+
verifySchema(result, schema("d", "date"));
102+
verifyDataRows(result, rows("2024-03-15"));
106103
}
107104

108-
/** TIME-mapped col: AE widens to TIMESTAMP; value must use space separator, not ISO {@code T}. */
105+
/** TIME-mapped col: AE preserves the TIME type (time UDT) and renders {@code HH:mm:ss}. */
109106
@Test
110107
public void testTimeRootColumnHmsFormat() throws IOException {
111108
String query = "source=" + INDEX + " | sort t | head 1 | fields t";
112109
assertRoutedToAnalyticsEngine(query);
113110
JSONObject result = executeQuery(query);
114-
verifySchema(result, schema("t", "timestamp"));
115-
Assert.assertFalse(
116-
"Time-mapped column must not surface as ISO T-separator literal",
117-
result.getJSONArray("datarows").getJSONArray(0).getString(0).contains("T"));
111+
verifySchema(result, schema("t", "time"));
112+
verifyDataRows(result, rows("10:30:00"));
118113
}
119114

120115
/** Eval-derived TIMESTAMP follows the same wire-format contract as a root column. */

integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteChartCommandIT.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_BANK_WITH_NULL_VALUES;
1010
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_OTEL_LOGS;
1111
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_TIME_DATA;
12+
import static org.opensearch.sql.util.Capability.BIN_TIME_FIELD_BUCKETING;
13+
import static org.opensearch.sql.util.Capability.MULTI_VALUE_FIELD_LOAD;
1214
import static org.opensearch.sql.util.MatcherUtils.assertJsonEquals;
1315
import static org.opensearch.sql.util.MatcherUtils.rows;
1416
import static org.opensearch.sql.util.MatcherUtils.schema;
@@ -20,6 +22,7 @@
2022
import org.json.JSONObject;
2123
import org.junit.jupiter.api.Test;
2224
import org.opensearch.sql.ppl.PPLIntegTestCase;
25+
import org.opensearch.sql.util.RequiresCapability;
2326

2427
public class CalciteChartCommandIT extends PPLIntegTestCase {
2528
@Override
@@ -28,7 +31,13 @@ public void init() throws Exception {
2831
enableCalcite();
2932
loadIndex(Index.BANK);
3033
loadIndex(Index.BANK_WITH_NULL_VALUES);
31-
loadIndex(Index.OTELLOGS);
34+
// otel_logs has a multi-value array for a scalar-mapped field, which the parquet store rejects
35+
// at bulk load (MULTI_VALUE_FIELD_LOAD); skip the load on the AE route so it doesn't abort
36+
// init() for the otel-independent tests. The otel tests themselves are
37+
// @RequiresCapability-gated.
38+
if (!isAnalyticsParquetIndicesEnabled()) {
39+
loadIndex(Index.OTELLOGS);
40+
}
3241
loadIndex(Index.TIME_TEST_DATA);
3342
loadIndex(Index.EVENTS_NULL);
3443
}
@@ -142,6 +151,11 @@ public void testChartMaxValueOverCategoryByTimestampSpanWeek() throws IOExceptio
142151
}
143152

144153
@Test
154+
@RequiresCapability(
155+
value = BIN_TIME_FIELD_BUCKETING,
156+
note =
157+
"span=2weeks anchors the bucket to a different week origin on the AE route"
158+
+ " (BIN_TIME_FIELD_BUCKETING).")
145159
public void testChartMaxValueByTimestampSpanDayAndWeek() throws IOException {
146160
JSONObject result =
147161
executeQuery(
@@ -165,6 +179,11 @@ public void testChartMaxValueByTimestampSpanDayAndWeek() throws IOException {
165179
}
166180

167181
@Test
182+
@RequiresCapability(
183+
value = MULTI_VALUE_FIELD_LOAD,
184+
note =
185+
"reads otel_logs whose multi-value field can't load on the AE store"
186+
+ " (MULTI_VALUE_FIELD_LOAD).")
168187
public void testChartLimit0WithUseOther() throws IOException {
169188
JSONObject result =
170189
executeQuery(
@@ -208,6 +227,11 @@ public void testChartLimit0WithUseOther() throws IOException {
208227
}
209228

210229
@Test
230+
@RequiresCapability(
231+
value = MULTI_VALUE_FIELD_LOAD,
232+
note =
233+
"reads otel_logs whose multi-value field can't load on the AE store"
234+
+ " (MULTI_VALUE_FIELD_LOAD).")
211235
public void testChartLimitTopWithUseOther() throws IOException {
212236
JSONObject result =
213237
executeQuery(
@@ -230,6 +254,11 @@ public void testChartLimitTopWithUseOther() throws IOException {
230254
}
231255

232256
@Test
257+
@RequiresCapability(
258+
value = MULTI_VALUE_FIELD_LOAD,
259+
note =
260+
"reads otel_logs whose multi-value field can't load on the AE store"
261+
+ " (MULTI_VALUE_FIELD_LOAD).")
233262
public void testChartLimitBottomWithUseOther() throws IOException {
234263
JSONObject result =
235264
executeQuery(
@@ -246,6 +275,11 @@ public void testChartLimitBottomWithUseOther() throws IOException {
246275
}
247276

248277
@Test
278+
@RequiresCapability(
279+
value = MULTI_VALUE_FIELD_LOAD,
280+
note =
281+
"reads otel_logs whose multi-value field can't load on the AE store"
282+
+ " (MULTI_VALUE_FIELD_LOAD).")
249283
public void testChartLimitTopWithMinAgg() throws IOException {
250284
JSONObject result =
251285
executeQuery(

integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteDateTimeFunctionIT.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_DATE;
99
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_DATE_FORMATS;
10+
import static org.opensearch.sql.util.Capability.DATETIME_FORMAT_RENDERING;
1011
import static org.opensearch.sql.util.MatcherUtils.rows;
1112
import static org.opensearch.sql.util.MatcherUtils.verifyDataRows;
1213

@@ -17,6 +18,7 @@
1718
import org.junit.Ignore;
1819
import org.junit.Test;
1920
import org.opensearch.sql.ppl.DateTimeFunctionIT;
21+
import org.opensearch.sql.util.RequiresCapability;
2022

2123
public class CalciteDateTimeFunctionIT extends DateTimeFunctionIT {
2224
@Override
@@ -73,6 +75,9 @@ public void testStrftimeWithVariousInputTypes() throws IOException {
7375
}
7476

7577
@Test
78+
@RequiresCapability(
79+
value = DATETIME_FORMAT_RENDERING,
80+
note = "strftime renders sub-second precision differently on the AE route.")
7681
public void testStrftimeWithDateFields() throws IOException {
7782
// Test strftime with different date field types from indices
7883
loadIndex(Index.DATE_FORMATS);

integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalcitePPLAggregationIT.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_DATE_FORMATS;
1313
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_LOGS;
1414
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_TELEMETRY;
15+
import static org.opensearch.sql.util.Capability.PERCENTILE_APPROXIMATE;
1516
import static org.opensearch.sql.util.MatcherUtils.assertJsonEquals;
1617
import static org.opensearch.sql.util.MatcherUtils.rows;
1718
import static org.opensearch.sql.util.MatcherUtils.schema;
@@ -28,6 +29,7 @@
2829
import org.opensearch.sql.common.utils.StringUtils;
2930
import org.opensearch.sql.exception.SemanticCheckException;
3031
import org.opensearch.sql.ppl.PPLIntegTestCase;
32+
import org.opensearch.sql.util.RequiresCapability;
3133

3234
public class CalcitePPLAggregationIT extends PPLIntegTestCase {
3335

@@ -967,6 +969,9 @@ public void testTake() throws IOException {
967969
}
968970

969971
@Test
972+
@RequiresCapability(
973+
value = PERCENTILE_APPROXIMATE,
974+
note = "percentile is approximate on the AE route but exact on v2/Calcite.")
970975
public void testPercentile() throws IOException {
971976
JSONObject actual =
972977
executeQuery(
@@ -1184,6 +1189,9 @@ public void testPercentileShortcutsWithDecimals() throws IOException {
11841189
}
11851190

11861191
@Test
1192+
@RequiresCapability(
1193+
value = PERCENTILE_APPROXIMATE,
1194+
note = "percentile is approximate on the AE route but exact on v2/Calcite.")
11871195
public void testPercentileShortcutsFloatingPoint() throws IOException {
11881196
JSONObject actual =
11891197
executeQuery(

integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalcitePPLBuiltinFunctionIT.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_DOG;
1010
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_NULL_MISSING;
1111
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_STATE_COUNTRY;
12+
import static org.opensearch.sql.util.Capability.FLOAT_ARITHMETIC_PRECISION;
1213
import static org.opensearch.sql.util.MatcherUtils.closeTo;
1314
import static org.opensearch.sql.util.MatcherUtils.rows;
1415
import static org.opensearch.sql.util.MatcherUtils.schema;
@@ -21,6 +22,7 @@
2122
import org.json.JSONObject;
2223
import org.junit.jupiter.api.Test;
2324
import org.opensearch.sql.ppl.PPLIntegTestCase;
25+
import org.opensearch.sql.util.RequiresCapability;
2426

2527
public class CalcitePPLBuiltinFunctionIT extends PPLIntegTestCase {
2628
@Override
@@ -255,6 +257,9 @@ public void testModWithSortAndFields() throws IOException {
255257
}
256258

257259
@Test
260+
@RequiresCapability(
261+
value = FLOAT_ARITHMETIC_PRECISION,
262+
note = "float modulo keeps 32-bit precision on AE; v2 widens to double.")
258263
public void testModFloatAndNegative() throws IOException {
259264
JSONObject actual =
260265
executeQuery(
@@ -267,6 +272,9 @@ public void testModFloatAndNegative() throws IOException {
267272
}
268273

269274
@Test
275+
@RequiresCapability(
276+
value = FLOAT_ARITHMETIC_PRECISION,
277+
note = "float modulo keeps 32-bit precision on AE; v2 widens to double.")
270278
public void testModShouldReturnWiderTypes() throws IOException {
271279
JSONObject actual =
272280
executeQuery(
@@ -347,6 +355,9 @@ public void testSignAndRound() throws IOException {
347355
}
348356

349357
@Test
358+
@RequiresCapability(
359+
value = FLOAT_ARITHMETIC_PRECISION,
360+
note = "float/half_float division keeps 32-bit precision on AE; v2 widens to double.")
350361
public void testDivide() throws IOException {
351362
JSONObject actual =
352363
executeQuery(

integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalcitePPLDedupIT.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77

88
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_ACCOUNT;
99
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_DUPLICATION_NULLABLE;
10+
import static org.opensearch.sql.util.Capability.DEDUP_NONDETERMINISTIC;
1011
import static org.opensearch.sql.util.MatcherUtils.*;
1112

1213
import java.io.IOException;
1314
import org.json.JSONObject;
1415
import org.junit.jupiter.api.Test;
1516
import org.opensearch.sql.ppl.PPLIntegTestCase;
17+
import org.opensearch.sql.util.RequiresCapability;
1618

1719
public class CalcitePPLDedupIT extends PPLIntegTestCase {
1820

@@ -95,6 +97,9 @@ public void testDedupMultipleFieldsKeepEmpty() throws IOException {
9597
}
9698

9799
@Test
100+
@RequiresCapability(
101+
value = DEDUP_NONDETERMINISTIC,
102+
note = "dedup CONSECUTIVE behavior diverges on the AE route.")
98103
public void testConsecutiveImplicitFallbackV2() throws IOException {
99104
JSONObject actual =
100105
executeQuery(
@@ -252,6 +257,10 @@ public void testReorderDedupFieldsShouldNotAffectResult() throws IOException {
252257
}
253258

254259
@Test
260+
@RequiresCapability(
261+
value = DEDUP_NONDETERMINISTIC,
262+
note =
263+
"dedup surviving-duplicate selection diverges on the AE route (no stable merge order).")
255264
public void testDedupComplex() throws IOException {
256265
JSONObject actual =
257266
executeQuery(String.format("source=%s | dedup 1 name", TEST_INDEX_DUPLICATION_NULLABLE));
@@ -364,6 +373,10 @@ public void testSortThenDedupKeepEmpty() throws IOException {
364373
}
365374

366375
@Test
376+
@RequiresCapability(
377+
value = DEDUP_NONDETERMINISTIC,
378+
note =
379+
"dedup surviving-duplicate selection diverges on the AE route (no stable merge order).")
367380
public void testDedupExpr() throws IOException {
368381
JSONObject actual =
369382
executeQuery(

integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalcitePPLJsonBuiltinFunctionIT.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static org.opensearch.sql.expression.function.jsonUDF.JsonUtils.gson;
99
import static org.opensearch.sql.legacy.TestsConstants.*;
10+
import static org.opensearch.sql.util.Capability.JSON_DOLLAR_PATH;
1011
import static org.opensearch.sql.util.MatcherUtils.*;
1112
import static org.opensearch.sql.util.MatcherUtils.rows;
1213

@@ -15,6 +16,7 @@
1516
import org.json.JSONObject;
1617
import org.junit.jupiter.api.Test;
1718
import org.opensearch.sql.ppl.PPLIntegTestCase;
19+
import org.opensearch.sql.util.RequiresCapability;
1820

1921
public class CalcitePPLJsonBuiltinFunctionIT extends PPLIntegTestCase {
2022
@Override
@@ -30,7 +32,12 @@ public void init() throws Exception {
3032
loadIndex(Index.PEOPLE2);
3133
loadIndex(Index.BANK);
3234
loadIndex(Index.JSON_TEST);
33-
loadIndex(Index.GAME_OF_THRONES);
35+
// game_of_thrones has a multi-value array for the scalar-mapped `titles` field, which the
36+
// parquet store rejects at bulk load; skip it on the AE route so it doesn't abort init() for
37+
// the rest of the suite. No test in this class queries game_of_thrones.
38+
if (!isAnalyticsParquetIndicesEnabled()) {
39+
loadIndex(Index.GAME_OF_THRONES);
40+
}
3441
}
3542

3643
@Test
@@ -297,6 +304,9 @@ public void testJsonSetPartialSet() throws IOException {
297304
}
298305

299306
@Test
307+
@RequiresCapability(
308+
value = JSON_DOLLAR_PATH,
309+
note = "json_set with a $-prefixed path is a no-op on the AE route (JSON_DOLLAR_PATH).")
300310
public void testJsonSetWithDollarPrefixedPath() throws IOException {
301311
// Issue #5167: json_set with $.key path should not double-prefix
302312
JSONObject actual =
@@ -313,6 +323,9 @@ public void testJsonSetWithDollarPrefixedPath() throws IOException {
313323
}
314324

315325
@Test
326+
@RequiresCapability(
327+
value = JSON_DOLLAR_PATH,
328+
note = "json_delete with a $-prefixed path is a no-op on the AE route (JSON_DOLLAR_PATH).")
316329
public void testJsonDeleteWithDollarPrefixedPath() throws IOException {
317330
// Issue #5167: json_delete with $.key path should remove the key
318331
JSONObject actual =

0 commit comments

Comments
 (0)