Skip to content

How the language behaves

How the language behaves, executably.

Every case below is a query, the dataset it runs on, and the answer it must give. They are not illustrations: src/Debyko.Dql.Tests runs each one on every build, and a release that answered any of them differently would not have shipped. If you want to know what DQL does in a corner, this is the place that cannot be out of date.

The dataset is synthetic — four venues, three instruments, values chosen so that every result can be checked by hand. Those venue codes exist only here: a query you send to the platform must name a venue from Venues in DQL.

Evaluation instant T = 2026-09-21T09:30:05.000Z unless a query says otherwise. Freshness defaults as in §8.4. Timeframe set as in §3.4. Candle layer off for GMX-PERP’s group; all other layers on for all groups. Retention covers everything below. settle_after = 60.

Venues: BINANCE-USDM, BYBIT-PERP, HYPERLIQUID, GMX-PERP. Capability: GMX-PERP does not publish the book layer. Instruments and listings at T: BTC on all four; ETH on BINANCE-USDM, BYBIT-PERP, GMX-PERP; SOL on HYPERLIQUID.

Snapshot values. “P” = received at 2026-09-21T09:30:04.000Z (age 1 000 ms, present). Quote: BINANCE-USDM and BYBIT-PERP USDT; HYPERLIQUID and GMX-PERP USDC. funding_interval is 8h on BINANCE-USDM and BYBIT-PERP, 1h on HYPERLIQUID and GMX-PERP.

Instrument Venue mark funding oi bid / ask
BTC BINANCE-USDM 65000 P 0.0001 received 09:29:35.000 (age 30 000 ms, present) 1000 P 64999 / 65001 P
BTC BYBIT-PERP 65010 P 0.0002 received 09:20:00.000 (age 605 000 ms, stale) 800 P 65005 / 65015 P
BTC HYPERLIQUID missing 0.00005 P 500 P 64990 / 65010 P
BTC GMX-PERP 65020 P −0.00003 P 200 P not_published
ETH BINANCE-USDM 3200 P 0.0003 P 5000 P 3199.9 / 3200.1 P
ETH BYBIT-PERP 3201 P 0.0001 P 4000 P 3200.5 / 3201.5 P
ETH GMX-PERP 3199 P missing 1000 P not_published
SOL HYPERLIQUID 150 P 0.0002 P 30000 P 149.99 / 150.01 P

Derived: BTC/BINANCE spread = 2/65000 = 3.0769230769230769e-5; BTC/BYBIT spread = 10/65010 = 1.5382248884786956e-4; BTC/HYPERLIQUID spread = 20/65000 = 3.076923076923077e-4; BTC/GMX spread null (not_published). funding_8h: BINANCE BTC 0.0001, BYBIT BTC 0.0002 (stale), HYPERLIQUID BTC 0.0004, GMX BTC −0.00024.

Candles (15m, UTC-aligned). Candle k has period [end − 15m, end), received_at = end + 0.4 s, open = previous close, high = close + 100, low = close − 100, volume = 10.

  • BTC / BINANCE-USDM: 10 candles, ends 07:15, 07:30, …, 09:30; close = 60000 for the first nine and 66000 for the candle ending 09:30.
  • BTC / BYBIT-PERP: same ends and closes (all 60000), except the candle ending 08:45 is absent (gap).
  • BTC / HYPERLIQUID: 3 candles, ends 09:00, 09:15, 09:30, closes 59000, 59500, 60000.
  • BTC / GMX-PERP: layer off.
  • ETH and SOL: no candles received on any venue (status missing).

Cadence facts (ADR-025, added 2026-09-29). Every listing polls every layer, good for exactly the old per-layer bound (30 s ticker, mark, oi, book; 120 s stats; 300 s funding) — so every case above reads as it did — except the stats layer:

  • ETH / BINANCE-USDM and ETH / BYBIT-PERP stats: pushed only on change (on_change, horizon source connection), last value received 09:29:00 (volume 150 and 140); on BYBIT-PERP a disconnection of the segment is recorded at 09:29:30 (recorded 09:29:30.200): stale, connection_lost; on BINANCE-USDM the connection lives: present, valid_until null, carried into the 09:30 minute.
  • ETH / GMX-PERP stats: volume 90, received P: present, valid_until 09:32:04.
  • BTC / HYPERLIQUID stats: volume 7000, received 09:27:00 (185 s old, past its 120 s) while the platform’s projection was recorded lagging from 09:27:30 (recorded 09:27:45): stale, state_lag.
  • BTC / GMX-PERP stats: volume 300, received P, but no fact covers the pair: stale, horizon_unknown.

This table is generated from src/Debyko.Dql.Tests/Corpus.cs and checked against it by CorpusSpecTests: a case added to the tests and not to this table, or the other way round, fails the build. Numbering is continuous across the origins — 01–47 from draft 1, 48–72 from change set 01, 73–82 from change set 02, 83–88 from change set 03, 89–95 from change set 04, 109–115 from ADR-025, 116–128 from change set 34 (ref), 129–131 from the amendment of 2026-10-09 (issue #247, ref of a series), and the lettered ones (14a, 20a, 62a, 82a, 94a …) added while implementing, each pinning a decision of the implementation notes.

Every state has a case (ADR-025): present 109 (a live connection value, valid_until null) and 01; stale — horizon_passed 05, 17 and 20b, connection_lost 109 and 111, state_lag 110, horizon_unknown 110, freshness_bound 115; missing 108 (not_retained) and 24; not_published 07; off 28. count does not count a stale value (112), all over one is unknown (111), status(F) = stale is never unknown (110), freshness only tightens (20b, 115), and carried tells an observed value from a carried one (113, 114).

“Result” is the set of instruments whose result is true, written as market codes (C4-01). Cases run with units: base unless the row says otherwise.

# Query Expected
01 any(venues where funding > 0) BTC-PERP, ETH-PERP, SOL-PERP
02 all(venues where funding > 0) SOL-PERP (ETH-PERP unknown)
03 count(venues where funding > 0) >= 3 none
04 count(venues where funding > 0) >= 2 BTC-PERP, ETH-PERP
05 count(venues where status(funding) = stale) = 1 BTC-PERP
06 any(venues where status(funding) = missing) ETH-PERP
07 any(venues where status(bid) = not_published) BTC-PERP, ETH-PERP
08 all(venues where status(bid) = not_published or spread < 5bps) BTC-PERP, ETH-PERP, SOL-PERP
09 all(venues where spread < 5bps) BTC-PERP, ETH-PERP, SOL-PERP
10 venues_answered >= 3 BTC-PERP, ETH-PERP
11 venues_answered < venues_listed BTC-PERP
12 max(venues, mark) - min(venues, mark) > 15 BTC-PERP
13 max(venues where quote = USDT, mark) - min(venues where quote = USDT, mark) > 5 BTC-PERP (SOL-PERP unknown)
14a sum(venues, oi) > 2000 BTC-PERP, ETH-PERP, SOL-PERP
14b sum(venues, oi) > 5000 ETH-PERP, SOL-PERP
15 sum(venues, mark) > 0 error DQL_TYPE
16 funding > 0 error DQL_SCOPE
17 any(venues where venue = HYPERLIQUID and funding_8h > 3bps) BTC-PERP, SOL-PERP
18 any(venues where funding > 0 and age(funding) < 10s) BTC-PERP, ETH-PERP, SOL-PERP
19 any(venues where age(funding) < 10s) freshness 10s BTC-PERP, ETH-PERP, SOL-PERP
20a any(venues where funding > 0) freshness 1d BTC-PERP, ETH-PERP, SOL-PERP
20b count(venues where funding > 0) >= 3 freshness 1d none (freshness only tightens: BYBIT-PERP stays stale, BTC-PERP counts 2)
21 any(venues where sma(close, 3) = 62000) timeframe 15m BTC-PERP
22 any(venues where ema(close, 2) = 64000) timeframe 15m BTC-PERP
23 any(venues where venue = BYBIT-PERP and sma(close, 3) = 60000) timeframe 15m BTC-PERP
24 any(venues where venue = BYBIT-PERP and sma(close, 5) > 0) timeframe 15m none (BTC-PERP unknown, gap)
25 any(venues where venue = BYBIT-PERP and gaps(10) = 1) timeframe 15m BTC-PERP
26 any(venues where venue = HYPERLIQUID and ema(close, 2) > 0) timeframe 15m none (BTC-PERP unknown, insufficient_history)
27 any(venues where venue = HYPERLIQUID and sma(close, 3) = 59500) timeframe 15m BTC-PERP
28 any(venues where status(close) = off) timeframe 15m BTC-PERP
29 any(venues where crossover(close, sma(close, 3))) timeframe 15m BTC-PERP
30 any(venues where rsi(close, 2) = 100) timeframe 15m BTC-PERP
31 any(venues where atr(2) = 3150) timeframe 15m BTC-PERP
32 any(venues where stdev(close, 3) > 2828.42 and stdev(close, 3) < 2828.43) timeframe 15m BTC-PERP
33 any(venues where change(close, 1) = 6000 and roc(close, 1) = 0.1 and prev(close, 1) = 60000 and highest(close, 3) = 66000 and lowest(close, 3) = 60000) timeframe 15m BTC-PERP
34 any(venues where ema(close, 20) > 0) error DQL_TIMEFRAME_REQUIRED
35 any(venues where sma(close, 3) = 60000 and venue = BINANCE-USDM) timeframe 15m as of 2026-09-21T09:30:00Z BTC-PERP
36 any(venues where crossover(close, sma(close, 3))) timeframe 15m as of 2026-09-21T09:30:00Z none
37 any(venues where funding > 0) as of 2030-01-01T00:00:00Z error DQL_AS_OF_RANGE
38 venues_listed >= 1 order by sum(venues, oi) desc SOL-PERP, ETH-PERP, BTC-PERP (in this order)
39 venues_listed >= 1 order by max(venues where quote = USDT, mark) desc BTC-PERP, ETH-PERP, SOL-PERP (in this order)
40 any(venues where quote in (USDT, USDC) and funding > 0) or venues_answered = 0 BTC-PERP, ETH-PERP, SOL-PERP
41 any(venues where funding > 0 and not (status(funding) = stale)) BTC-PERP, ETH-PERP, SOL-PERP
42 not any(venues where funding < 0) SOL-PERP
43 any(venues where funding > 0) AND venues_listed > 1 error DQL_SYNTAX
44 any(venues where 5min > 0) error DQL_SYNTAX
45 any( venues where funding>=0.0001 and (spread<5bps) ) // note canonical any(venues where funding >= 0.0001 and spread < 0.0005)
46 any( venues where funding>=0.0001 and (spread<5bps) ) // note canonical any(venues where funding >= 0.0001 and spread < 0.0005)
47 any(venues where funding > 0) response shape: BTC-PERP lists all four venues with provenance
48 any(venues where sma(mark, 5) = 64986) timeframe 1m BTC-PERP
49 any(venues where sma(mark, 6) > 0) timeframe 1m none (BTC-PERP unknown, gap)
50 any(venues where change(mark, 4) = 10 and prev(mark, 1) = 64970 and highest(mark, 5) = 65010 and lowest(mark, 5) = 64960) timeframe 1m BTC-PERP
51 any(venues where mark > sma(mark, 5)) timeframe 1m BTC-PERP
52 any(venues where percentile(mark, 5, 50%) = 64990 and percentile(mark, 5, 95%) = 65010 and percentile(mark, 5, 20%) = 64960) timeframe 1m BTC-PERP
53 any(venues where percentile_rank(mark, 5) = 0.8) timeframe 1m BTC-PERP
54 any(venues where rolling_sum(abs(change(mark, 1)), 4) = 150 and abs(change(mark, 4)) = 10) timeframe 1m BTC-PERP
55 any(venues where abs(change(mark, 4)) / rolling_sum(abs(change(mark, 1)), 4) > 0.06 and abs(change(mark, 4)) / rolling_sum(abs(change(mark, 1)), 4) < 0.07) timeframe 1m BTC-PERP
56 any(venues where age(mark) = 1s and age(mark, 1m) = 5500ms and status(mark, 1m) = present) BTC-PERP
57 any(venues where sma(mark, 2) = 64990) timeframe 1m as of 2026-09-21T09:29:59Z BTC-PERP
58 any(venues where status(mark) = stale) as of 2026-09-21T09:29:59Z BTC-PERP
59 any(venues where bid_size = 2 and ask_size = 1.5) BTC-PERP
60 any(venues where depth_bid(1bps) = 5 and depth_ask(1bps) = 4 and depth_bid_value(1bps) = 324992 and depth_ask_value(1bps) = 260006.5) BTC-PERP
61 any(venues where depth_bid(10bps) > 0) none (BTC-PERP unknown, band_truncated)
62a any(venues where depth_bid(0) > 0) error DQL_ARGUMENT
62b any(venues where depth_bid(6%) > 0) error DQL_ARGUMENT
63 sum(venues, depth_bid(1bps)) = 5 BTC-PERP
64 any(venues where tick_size / mark < 1bps and lot_size = 0.001) BTC-PERP
65 any(venues where quote in (USDT, USDC)) select venues_listed, sum(venues, oi), funding_8h BTC-PERP, ETH-PERP, SOL-PERP (as corpus test 14)
66 venues_listed >= 1 order by venues_answered desc, sum(venues, oi) asc BTC-PERP, ETH-PERP, SOL-PERP (in this order)
67 venues_listed >= 1 order by max(venues where quote = USDT, mark) desc, venues_listed asc BTC-PERP, ETH-PERP, SOL-PERP (in this order)
68 any(venues where sma(quote, 3) > 0) timeframe 1m error DQL_TYPE
69 any(venues where sma(venues_listed, 3) > 0) timeframe 1m error DQL_TYPE
70 any(venues where percentile(mark, 5, 1.5) > 0) timeframe 1m error DQL_ARGUMENT
71 count(venues where roc(mark, 5) > 0.5%) >= 3 select venues_listed timeframe 1m order by venues_listed desc canonical count(venues where roc(mark, 5) > 0.005) >= 3 timeframe 1m order by venues_listed desc select venues_listed
72 any(venues where venue = BYBIT-PERP) select spread, bid spread prints 0.000153822489, bid prints 65005
73 any(venues where sma(mark, 5) = 64986) timeframe 1m BTC-PERP
74 any(venues where lowest(change(mark, 1), 3) > 0) timeframe 1m none (BTC-PERP false)
75 any(venues where mark_close - close = 10) timeframe 15m BTC-PERP
76 any(venues where venue = BYBIT-PERP and status(mark_close) = not_published) timeframe 15m BTC-PERP
77 any(venues where sma(mark_close, 3) = 62010) timeframe 15m BTC-PERP
78 any(venues where percentile(mark, 5, 90%, linear) > 65005.99 and percentile(mark, 5, 90%, linear) < 65006.01) timeframe 1m BTC-PERP
79 any(venues where percentile(mark, 5, 50%, linear) = 64990) timeframe 1m BTC-PERP
80 any(venues where percentile(mark, 5, 50%, midrank) > 0) timeframe 1m error DQL_ARGUMENT
81 any(venues where sma(close, 3) > 0) timeframe 7m error DQL_TIMEFRAME_UNSUPPORTED
82a any(venues where percentile(mark, 5, 90%, nearest) > 0) timeframe 1m canonical any(venues where percentile(mark, 5, 0.9) > 0) timeframe 1m
82b any(venues where percentile(mark, 5, 90%, linear) > 0) timeframe 1m canonical any(venues where percentile(mark, 5, 0.9, linear) > 0) timeframe 1m
83 any(venues where depth_bid(25bps) > 0) error DQL_ARGUMENT
84 any(venues where depth_bid(50bps) > 0) none (BTC-PERP unknown, band_truncated)
85 any(venues where sma(mark_volume, 3) = 0) timeframe 15m BTC-PERP
86 any(venues where venue = BYBIT-PERP and status(mark_volume) = not_published) timeframe 15m BTC-PERP
87 any(venues where depth_bid_value(1bps) = 324992) as of 2026-09-21T09:30:04Z BTC-PERP
88 any(venues where depth_bid_value(1bps) > 0) as of 2026-09-21T09:30:03Z none (BTC-PERP unknown, no_value)
89 any(venues where funding > 0) where venue = HYPERLIQUID BTC-PERP, SOL-PERP
90 venues_listed = 1 where venue = BINANCE-USDM BTC-PERP, ETH-PERP
91 any(venues where mark > 0) where symbol = "BTCUSDT" BTC-PERP
92 any(venues where mark > 0) where symbol = BTCUSDT error DQL_TYPE
93 any(venues where mark > 0) where venue = "HYPERLIQUID" error DQL_TYPE
94a sum(venues, oi) > 0 error DQL_TYPE; with units: published
94b sum(venues, oi) > 0 BTC-PERP, ETH-PERP, SOL-PERP (as corpus test 14)
95 any(venues where funding > 0) where base = BTC timeframe 1m canonical any(venues where funding > 0) timeframe 1m where base = BTC
96 any(venues where crossunder(sma(close, 3), close)) timeframe 15m BTC-PERP
97 all(venues where crossunder(close, sma(close, 3))) timeframe 15m none
98 any(venues where basis > 0.001) BTC-PERP
99 any(venues where index > 64000) BTC-PERP
100 count(venues where funding_interval = 8h) >= 2 ETH-PERP
101 any(venues where time_to_funding < 1h) BTC-PERP
102 any(venues where volume_24h > 10000) BTC-PERP
103 any(venues where turnover_24h > 800000000) BTC-PERP
104 any(venues where change_24h < 0) BTC-PERP
105 any(venues where min_qty <= 0.001) BTC-PERP
106 any(venues where index_close > 0) timeframe 15m none
107 any(venues where index_volume > 0) timeframe 15m none
108 any(venues where volume_24h > 0) where base = SOL none
109 any(venues where volume_24h > 100) where base = ETH ETH-PERP
110 count(venues where status(volume_24h) = stale) >= 2 BTC-PERP
111 all(venues where volume_24h > 0) where base = ETH none (ETH-PERP unknown)
112 count(venues where volume_24h > 0) = 2 where base = ETH ETH-PERP
113 any(venues where carried(volume_24h, 1) = 1) where base = ETH timeframe 1m ETH-PERP
114 any(venues where venue = BYBIT-PERP and carried(volume_24h, 1) = 0) where base = ETH timeframe 1m ETH-PERP
115 all(venues where volume_24h > 0) where base = ETH freshness 30s none (ETH-PERP unknown: freshness_bound on BINANCE-USDM)
116 any(venues where venue = BINANCE-USDM and ref(BTC-PERP, mark) = 65000) where base = ETH ETH-PERP (BTC-PERP is read on BINANCE-USDM, the venue evaluated, and is not in the answer)
117 any(venues where venue = BINANCE-USDM and ref(BTC-PERP, mark, BYBIT-PERP) = 65010) where base = ETH ETH-PERP (BTC-PERP is read on the venue named, not the one evaluated)
118 ref(BTC-PERP, mark, BINANCE-USDM) = 65000 where base = ETH ETH-PERP (at instrument scope the venue is written)
119 ref(BTC-PERP, mark) > 0 error DQL_SCOPE
120 any(venues where ref(BTC-SWAP, mark) > 0) error DQL_UNKNOWN_INSTRUMENT
121 any(venues where ref(BTC-PERP, mark, BINANCE-USDT) > 0) error DQL_UNKNOWN_VENUE
122 any(venues where ref(SOL-PERP, mark) > 0) where base = ETH none (ETH-PERP unknown: SOL-PERP is listed on none of ETH-PERP’s venues, not_in_scope)
123 any(venues where venue = BINANCE-USDM and ref(BTC-PERP, mark) > 0) where base = ETH none (ETH-PERP unknown: BTC-PERP is halted on BINANCE-USDM, not_in_scope; the §16.1 dataset with that listing halted from 09:00:00)
124 any(venues where ref(BTC-PERP, ref(BTC-PERP, mark)) > 0) error DQL_NESTING
125 any(venues where ref(BTC-PERP, any(venues where mark > 0))) error DQL_NESTING
126 any(venues where ref(BTC-PERP, mark) > 0 and ref(ETH-PERP, mark) > 0 and ref(SOL-PERP, mark) > 0 and ref(BTC-PERP, mark, BINANCE-USDM) > 0 and ref(ETH-PERP, mark, BINANCE-USDM) > 0) error DQL_COMPLEXITY
127 any(venues where venue = BINANCE-USDM and ref(BTC-PERP, close) > ref(BTC-PERP, sma(close, 3)) and ref(BTC-PERP, close) = 66000) where base = ETH timeframe 15m ETH-PERP (a regime filter: BTC-PERP’s close 66000 above its three-bar average 62000, on the venue evaluated)
128 any( venues where ref( BTC-PERP ,mark_close>ema(mark_close,50,4h) ) and ref(ETH-PERP,mark,BYBIT-PERP)>1e3 ) timeframe 15m // regime canonical any(venues where ref(BTC-PERP, mark_close > ema(mark_close, 50, 4h)) and ref(ETH-PERP, mark, BYBIT-PERP) > 1000) timeframe 15m
129 any(venues where ref(BTC-PERP, sma(mark_close, 20)) > 0) timeframe 15m canonical any(venues where ref(BTC-PERP, sma(mark_close, 20)) > 0) timeframe 15m (the series function inside ref: accepted, a number)
130 any(venues where sma(ref(BTC-PERP, mark_close), 20) > 0) timeframe 15m error DQL_TYPE (a ref is a value at T, not a series)
131 any(venues where venue = BINANCE-USDM and ref(BTC-PERP, mark_close) > 66000) where base = ETH timeframe 15m ETH-PERP (BTC-PERP’s latest mark bar close, 66010, on the venue evaluated; the bars before it close at 60010)