攻破VPL SQL作业的一个小尝试
Post created: Tue, 18 Mar 2025 21:10:00 +0800我到底是怎么发现这个的?
背景故事
我们遇到过这样一道题目:
Q6. [12%] 显示2024年2月期间,每个充电站(charging station)的 station_ID、station_name 和 rental_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,琢磨着能不能用点“取巧”的手段完成这道题。
探索与信息收集
一番Google下来,我发现SQLite其实可以直接在查询过程中执行shell命令的!所以我赶紧用一下最简单的ls
命令查看当前目录下都有些啥:
.shell ls
好了,现在文件列表看到了,那我们当然得瞅瞅每个文件的内容:
.shell cat *
Emmm……看起来大部分文件都跟我们想看的内容没什么关系。 不过我觉得,题目相关的文件估计是.txt
或.sql
扩展名,所以再挑明一下:
.shell cat *.txt *.sql
果然,不出所料!看起来这个txt文件应该就是我们想要的“标准输出”。所以说,只要简单地把它的内容打印出来,我们就能直接拿个满分了。
当然啦,这个骚操作在隐藏测试点面前可能就行不通了,因为隐藏测试点往往会使用不同的文件名。不过,对于这道数据固定的题而言,这就完全够了。
再闲扯几句
顺便提一下,如果你想让VSCode(以及GitHub Copilot)用起来更像Cursor Tab,其实也是有办法的!你只需要先切换到pre-release
版扩展,然后启用这个实验设置:
建议把其他可选配置也折腾一下,说不定还能发现点意料之外的好东西!信我,没骗你。
再安利一个翻车史:之前我尝试用了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掉!