<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: malisper</title><link>https://news.ycombinator.com/user?id=malisper</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 07 Nov 2026 17:13:13 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=malisper" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by malisper in "Can GROUP BY still be optimized after all these years?"]]></title><description><![CDATA[
<p>The query is:<p><pre><code>  SELECT item_id, COUNT(*) AS c
  FROM orders
  GROUP BY item_id
  ORDER BY c DESC
  LIMIT 10;
</code></pre>
They are getting the top 10 most frequent values of item_id. It's possible for one item_id to be the 11th most popular item across every partition and not the 10th. Then when you sum the counts across all partitions, it becomes the 10th most common.</p>
]]></description><pubDate>Sat, 07 Nov 2026 15:13:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=50405236</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50405236</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50405236</guid></item><item><title><![CDATA[New comment by malisper in "Can GROUP BY still be optimized after all these years?"]]></title><description><![CDATA[
<p>Neat! For others, the data structure they are describing is a count-min sketch. It looks like they're using it to set a bound on elements that can enter the group-by and using it to skip a bunch of extra work</p>
]]></description><pubDate>Sat, 07 Nov 2026 06:06:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=50402082</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50402082</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50402082</guid></item><item><title><![CDATA[New comment by malisper in "A thousand fewer paths to root"]]></title><description><![CDATA[
<p>You don't have to take my word for it. The ClickHouse CTO (who opened the original removal PR) updated his post after reviewing our explanation and our fully open-source v0.4-beta submission[0]:<p>> We clarified with the author - while the binary had signs of optimization for specific benchmark queries, we have a reason to believe that the actual runtime didn't use per-query kernels... The usage of a query condition cache and cached statistics per granule is legitimate. The submission of a closed source preview version fine-tuned for benchmark was shady nevertheless. However, the new submission #2751 should move us post all the concerns.<p>Submitting an incomplete, closed-source preview build was a mistake on my part. Since then, we open-sourced a new version with full SQL support, ClickHouse merged it back into ClickBench, and the new version actually runs 7% faster (geomean) than the preview build that was removed.<p>[0] <a href="https://github.com/ClickHouse/ClickBench/pull/2165" rel="nofollow">https://github.com/ClickHouse/ClickBench/pull/2165</a></p>
]]></description><pubDate>Fri, 06 Nov 2026 15:47:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=50393808</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50393808</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50393808</guid></item><item><title><![CDATA[New comment by malisper in "Postgres 19 is late because so many more bugs are being found now"]]></title><description><![CDATA[
<p>I work on pgrust. We shouldn't have submitted the preview when we did: it was still in active development, and its SQL coverage was far too narrow, though there was nothing in it giving it an unfair performance advantage<p>For the other two claims in the removal PR, we wrote scripts you can use to verify the behavior of the original 0.4-preview binary:<p><pre><code>  - Per-query kernels did not serve the benchmark queries[0]
  - The preview's fast repeat LIKE queries came from a dictionary filter cache, not a cached query result[1]
</code></pre>
Our open-sourced 0.4-beta has now been merged and is back on ClickBench[2][3]<p>Across all queries and instance sizes on ClickBench, 0.4-beta is ~7% faster overall than the 0.4-preview binary that was removed. If 0.4-preview's numbers had come from hardcoded kernels or faked results, the open-source general engine wouldn't be beating it<p>[0] <a href="https://pgrust.com/downloads/archive/2026-09-clickbench-snapshot/verify-preview.sh" rel="nofollow">https://pgrust.com/downloads/archive/2026-09-clickbench-snap...</a><p>[1] <a href="https://pgrust.com/downloads/archive/2026-09-clickbench-snapshot/verify-like-hot-runs.sh" rel="nofollow">https://pgrust.com/downloads/archive/2026-09-clickbench-snap...</a><p>[2] <a href="https://benchmark.clickhouse.com/" rel="nofollow">https://benchmark.clickhouse.com/</a><p>[3] <a href="https://github.com/ClickHouse/ClickBench/pull/2751" rel="nofollow">https://github.com/ClickHouse/ClickBench/pull/2751</a></p>
]]></description><pubDate>Mon, 02 Nov 2026 01:46:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=50332080</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50332080</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50332080</guid></item><item><title><![CDATA[New comment by malisper in "Programming at Light Speed: Building the Gravity Query Engine"]]></title><description><![CDATA[
<p>Yep! My username is a portmanteau of my last name and lisper.<p>My first handful of blog posts were all about doing really cool stuff in Lisp: <a href="https://malisper.me/building-fizzbuzz-fractran-bottom/" rel="nofollow">https://malisper.me/building-fizzbuzz-fractran-bottom/</a></p>
]]></description><pubDate>Sat, 31 Oct 2026 03:44:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=50313015</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50313015</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50313015</guid></item><item><title><![CDATA[New comment by malisper in "OpenAI and Anthropic cut their LLM prices by up to 80% within a few months. Why?"]]></title><description><![CDATA[
<p>If they are the problem, shouldn't they be regulated?</p>
]]></description><pubDate>Mon, 26 Oct 2026 01:50:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=50238106</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50238106</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50238106</guid></item><item><title><![CDATA[New comment by malisper in "OpenAI and Anthropic cut their LLM prices by up to 80% within a few months. Why?"]]></title><description><![CDATA[
<p>> This is why Anthropic and OpenAI are pushing for more “regulation”<p>Given everything happening with Black October[0], don't you think regulating models may be reasonable?<p>[0] <a href="https://en.wikipedia.org/wiki/Black_October_(information_security)" rel="nofollow">https://en.wikipedia.org/wiki/Black_October_(information_sec...</a></p>
]]></description><pubDate>Mon, 26 Oct 2026 01:13:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=50237814</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50237814</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50237814</guid></item><item><title><![CDATA[New comment by malisper in "We should be more ambitious with the software we build"]]></title><description><![CDATA[
<p>Update: ClickHouse finished the preliminary benchmarks for 0.4-beta[0], the version we've open-sourced. If you compute the geomean across all queries and instance sizes, it comes out as 7% faster than the 0.4-preview entry[1] that was accused of cheating.<p>To give you a sense of how fast it is, pgrust on a c6a.2xl is faster than ClickHouse running on a c6a.metal, a machine with 24x as many cores and costs 24x as much.<p>Edit: And now it's been accepted: <a href="https://benchmark.clickhouse.com/" rel="nofollow">https://benchmark.clickhouse.com/</a><p>[0] <a href="https://github.com/ClickHouse/ClickBench/commit/56535d29e825ea450a8749bb2bb4b03bd9f11208" rel="nofollow">https://github.com/ClickHouse/ClickBench/commit/56535d29e825...</a><p>[1] <a href="https://github.com/ClickHouse/ClickBench/commit/89cc76e1e4e2ed4dd14f4abbde0635d1b6679e5c" rel="nofollow">https://github.com/ClickHouse/ClickBench/commit/89cc76e1e4e2...</a></p>
]]></description><pubDate>Sun, 25 Oct 2026 17:31:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=50233934</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50233934</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50233934</guid></item><item><title><![CDATA[New comment by malisper in "Remove pgrust: the entry is cheating (per-query kernels and result caching)"]]></title><description><![CDATA[
<p>The preliminary ClickBench results for -beta are in[0]. The geomean across all runs came out as 7% faster than -preview[1]<p>[0] <a href="https://github.com/ClickHouse/ClickBench/commit/56535d29e825ea450a8749bb2bb4b03bd9f11208" rel="nofollow">https://github.com/ClickHouse/ClickBench/commit/56535d29e825...</a><p>[1] <a href="https://github.com/ClickHouse/ClickBench/commit/89cc76e1e4e2ed4dd14f4abbde0635d1b6679e5c" rel="nofollow">https://github.com/ClickHouse/ClickBench/commit/89cc76e1e4e2...</a></p>
]]></description><pubDate>Sun, 25 Oct 2026 16:16:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=50233168</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50233168</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50233168</guid></item><item><title><![CDATA[New comment by malisper in "We should be more ambitious with the software we build"]]></title><description><![CDATA[
<p>If you don't trust the logging, here's a script you can run that instruments the binary and shows that the files called out for cheating don't run during the benchmark: <a href="https://pgrust.com/downloads/archive/2026-09-clickbench-snapshot/verify-preview.sh" rel="nofollow">https://pgrust.com/downloads/archive/2026-09-clickbench-snap...</a><p>It instruments the files that were called out in the PR, then runs ClickBench. You can run it and see that the code in those files doesn't run.<p>If you can find anything suspicious in the binary, let me know, and I'm happy to dig in</p>
]]></description><pubDate>Sun, 25 Oct 2026 04:32:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=50228346</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50228346</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50228346</guid></item><item><title><![CDATA[New comment by malisper in "We should be more ambitious with the software we build"]]></title><description><![CDATA[
<p>> I've seen his explanation. I don't find it convincing, at all<p>You don't have to take my word for it. If you want you can inspect the binary yourself: <a href="https://pgrust.com/downloads/archive/2026-09-clickbench-snapshot/pgrust-v0.4-preview-aarch64-neoverse-v2.tar.gz" rel="nofollow">https://pgrust.com/downloads/archive/2026-09-clickbench-snap...</a><p>You can run the binary with PGRUST_GRAVITY_REPORT=1 which logs the code path hit for every query. You'll see that all the code goes through the general query path. We did have hand-rolled code in the binary, but we used it for testing. The code is not used when running the benchmark. We also did not use a results cache. Warm runs still scan all the data. You can verify all of this<p>You are right, though, that it did support a narrow set of SQL. It supported scans, group bys, sorts, and filters. That's enough to run all the queries on ClickBench, but failed on functionality not tested by the benchmark like subqueries</p>
]]></description><pubDate>Sun, 25 Oct 2026 03:01:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=50227869</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50227869</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50227869</guid></item><item><title><![CDATA[New comment by malisper in "We should be more ambitious with the software we build"]]></title><description><![CDATA[
<p>Unfortunately, we have some sensitive stuff in our internal repo that we can't share. Fortunately, you can check the binary we submitted yourself: <a href="https://pgrust.com/downloads/archive/2026-09-clickbench-snapshot/pgrust-v0.4-preview-aarch64-neoverse-v2.tar.gz" rel="nofollow">https://pgrust.com/downloads/archive/2026-09-clickbench-snap...</a><p>You can run it with PGRUST_GRAVITY_REPORT=1 and it will log the codepath that was hit for every query<p>On the lint, yes, I'm aware. It's one layer of defense. When we were prepping for the 0.4-beta release, we generated a large number of fresh queries and made sure the engine runs them and performs well across all of them</p>
]]></description><pubDate>Sun, 25 Oct 2026 02:51:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=50227820</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50227820</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50227820</guid></item><item><title><![CDATA[New comment by malisper in "We should be more ambitious with the software we build"]]></title><description><![CDATA[
<p>Fair point: the 0.4-beta source doesn't prove anything about the benchmarked binary. So don't take my word for it or rely on the source we published as evidence. Instead, check the submitted binary itself: <a href="https://pgrust.com/downloads/archive/2026-09-clickbench-snapshot/pgrust-v0.4-preview-aarch64-neoverse-v2.tar.gz" rel="nofollow">https://pgrust.com/downloads/archive/2026-09-clickbench-snap...</a><p>If you run it with PGRUST_GRAVITY_REPORT=1 it will report the code path hit for each query. You can see that all the queries go through the general query engine<p>The binary does contain hand-written kernels in the irprobe files. These were used for testing. You can validate that when running the benchmark, those files are dead code<p>The engine supports a narrow subset of SQL: scans, group-bys, filters, and sorting. That's enough to run ClickBench. It doesn't support e.g. subqueries which is why some of the follow up queries failed</p>
]]></description><pubDate>Sun, 25 Oct 2026 02:39:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=50227760</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50227760</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50227760</guid></item><item><title><![CDATA[New comment by malisper in "We should be more ambitious with the software we build"]]></title><description><![CDATA[
<p>> This aged like milk. pgrust was caught cheating on all benchmarks this week.<p>Can you back this up? Our code is open source here[0]. You're free to audit it and benchmark it as much as you want. You'll find it's just as fast as we claim it is<p>[0] <a href="https://github.com/malisper/pgrust" rel="nofollow">https://github.com/malisper/pgrust</a></p>
]]></description><pubDate>Sun, 25 Oct 2026 01:24:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=50227288</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50227288</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50227288</guid></item><item><title><![CDATA[New comment by malisper in "We should be more ambitious with the software we build"]]></title><description><![CDATA[
<p>My goal isn't to "prove" the software is correct. My goal is to find as many bugs as I can with the least effort. If I'm able to find all differences in behavior between pgrust and Postgres, sans bugs in the compiler, that's a real win for me<p>fwiw, I wouldn't say working at the assembly level solves the problem. You now need to make sure that your definition of the assembly behavior is correct</p>
]]></description><pubDate>Sun, 25 Oct 2026 00:39:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=50227018</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50227018</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50227018</guid></item><item><title><![CDATA[New comment by malisper in "We should be more ambitious with the software we build"]]></title><description><![CDATA[
<p>Happy to chat about it. I looked at Aeneas, but as described, it only supports safe Rust. I also need C support so I can prove both the C and Rust code<p>Right now, I wrote a compiler that takes C and Rust code and compiles it to Lean. Then I have an LLM write a proof that the C and Rust code behave identically. I've been able to prove equivalent behavior for about ~70k lines of C code with pgrust.<p>The issue I've started to encounter is that the context needed for each incremental proof has kept growing, and things have slowed down dramatically. My hunch is that the speed is the time it takes to prove a line of code is on the order of O(n^2) of how much you've proved so far<p>I'm looking to see if there are ways to shard things so the required context scales better. Today I was going through the formal verification work Anthropic and Theorem published a few days ago, and it looks like they used some sort of orchestrator to manage all their proofs and ensure good clustering of similar code. I'm seeing if I can get an approach like that to work<p>It's just difficult enough that I think it's doable if done right. Half of me is debating if I should wait until the next model release because any improvement in model performance will help a ton</p>
]]></description><pubDate>Sat, 24 Oct 2026 23:23:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=50226514</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50226514</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50226514</guid></item><item><title><![CDATA[New comment by malisper in "The Goose Programming Language"]]></title><description><![CDATA[
<p>This is roughly what I do in Rust. I use different static types for values based on how long they'll live. Temporary values get one type; cached values get another. The allocator allocates each value in a different location based on how long the value will live.</p>
]]></description><pubDate>Sat, 24 Oct 2026 21:08:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=50225303</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50225303</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50225303</guid></item><item><title><![CDATA[New comment by malisper in "The Goose Programming Language"]]></title><description><![CDATA[
<p>Yeah, that looks like a freelist approach. That will work as long as the values you're allocating are all fixed-size. You'll need something much more complicated if you want arbitrarily sized values<p>That example implements a linked list of integers. I'm curious how you would do a linked list of strings</p>
]]></description><pubDate>Sat, 24 Oct 2026 21:02:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=50225248</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50225248</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50225248</guid></item><item><title><![CDATA[New comment by malisper in "The Goose Programming Language"]]></title><description><![CDATA[
<p>Goose determines where the array will be copied to at compile time and allocates it there.<p>Rust does a similar thing. When a function returns a value, a location for it will be put in the callers stack frame. That means it automatically stack-allocates values when feasible. The downside in Rust is you need to know the size of the value at compile time whereas Goose can do it for arbitrarily sized values</p>
]]></description><pubDate>Sat, 24 Oct 2026 20:59:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=50225215</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50225215</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50225215</guid></item><item><title><![CDATA[New comment by malisper in "The Goose Programming Language"]]></title><description><![CDATA[
<p>From the link<p>> Keys and values are fixed-size<p>so not quite what I'm looking for</p>
]]></description><pubDate>Sat, 24 Oct 2026 20:51:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=50225128</link><dc:creator>malisper</dc:creator><comments>https://news.ycombinator.com/item?id=50225128</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50225128</guid></item></channel></rss>