攻破VPL SQL作业的一个小尝试

Post created: Tue, 18 Mar 2025 21:10:00 +0800

快速演示图,展示本篇文章的核心内容

我到底是怎么发现这个的?

背景故事

我们遇到过这样一道题目:

Q6. [12%] 显示2024年2月期间,每个充电站(charging station)的 station_IDstation_namerental_income

  • 结果排序要求:首先按 rental_income 从高到低排序,然后按 station_ID 从低到高排序。
  • 这里的 rental_income 就是该时段内所有 payment_amount 的总和。

平时的话,我们直接用(My)SQL一句话就给它解决了:

SELECT cs.station_ID, cs.name AS station_name,
    SUM(rt.payment_amount) AS rental_income
FROM ChargingStation cs
    INNER JOIN RentalTransaction rt ON cs.station_ID = rt.station_ID
WHERE rt.end_datetime >= '2024-02-01 00:00:00' AND
    rt.end_datetime < '2024-03-01 00:00:00' AND
    rt.status = 1 -- Completed transaction
GROUP BY cs.station_ID, cs.name
ORDER BY rental_income DESC, cs.station_ID ASC;

不过,Moodle上有位同学(就是这位 skylee)提醒我们,其实后台用的是SQLite数据库。这下子倒是激起了我的好奇心,于是开始倒腾SQLite,琢磨着能不能用点“取巧”的手段完成这道题。

`.version`命令输出结果,显示了VPL沙盒中搭建的SQLite版本。

探索与信息收集

一番Google下来,我发现SQLite其实可以直接在查询过程中执行shell命令的!所以我赶紧用一下最简单的ls命令查看当前目录下都有些啥:

.shell ls

在SQLite中执行`.shell ls`的结果

好了,现在文件列表看到了,那我们当然得瞅瞅每个文件的内容:

.shell cat *

执行`.shell cat *`之后的输出结果,会显示当前目录下所有文件的内容。其中有一个VPL用于测试作业的shell脚本。

Emmm……看起来大部分文件都跟我们想看的内容没什么关系。 不过我觉得,题目相关的文件估计是.txt.sql扩展名,所以再挑明一下:

.shell cat *.txt *.sql

执行`.shell cat *.txt *.sql`,试图打印所有可能与SQL题目相关的文件内容。

果然,不出所料!看起来这个txt文件应该就是我们想要的“标准输出”。所以说,只要简单地把它的内容打印出来,我们就能直接拿个满分了。

当然啦,这个骚操作在隐藏测试点面前可能就行不通了,因为隐藏测试点往往会使用不同的文件名。不过,对于这道数据固定的题而言,这就完全够了。

再闲扯几句

顺便提一下,如果你想让VSCode(以及GitHub Copilot)用起来更像Cursor Tab,其实也是有办法的!你只需要先切换到pre-release版扩展,然后启用这个实验设置:

VSCode中Copilot Tab配置的位置

建议把其他可选配置也折腾一下,说不定还能发现点意料之外的好东西!信我,没骗你。


再安利一个翻车史:之前我尝试用了copilot-more,结果被GitHub直接ban了(hhh)。现在大概仓库都被删干净了。不过你要真好奇的话,它的作用就是把GitHub Copilot的大语言模型(Large Language Models)包装成与 OpenAI的API兼容 的格式。使用目的嘛,说实话,一开始想用的原因就很简单:如果你是用GitHub Education学生认证,基本相当于白嫖一个免费的类似最新 Claude 3.7 Sonnet (thinking) API之类的模型了!

但我真的不建议你模仿我的做法。 后来怎样了呢?简单点说,我的GitHub Copilot Pro权限就这么被暂停了。后来我去联系了GitHub Support,乖乖认错,保证再也不乱搞了,于是人家也很厚道地帮我解封了权限,就这么点事(笑)。——希望这个故事满足你的好奇心,也顺便防止你重蹈我的覆辙被GitHub给ban掉!

English