Skip to content
This repository was archived by the owner on Apr 29, 2025. It is now read-only.

Commit 691ee50

Browse files
committed
feat(utils/validateResultSet): add warning for oversized result sets
This behaviour is generally undesirable and may lead to excessive memory use or crashes.
1 parent 7b488f8 commit 691ee50

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

src/database/rawExecute.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { executeType, parseExecute } from '../utils/parseExecute';
55
import { getPoolConnection } from './connection';
66
import { setCallback } from '../utils/setCallback';
77
import { performance } from 'perf_hooks';
8+
import validateResultSet from 'utils/validateResultSet';
89

910
export const rawExecute = async (
1011
invokingResource: string,
@@ -60,6 +61,8 @@ export const rawExecute = async (
6061
} else if (startTime) {
6162
logQuery(invokingResource, query, performance.now() - startTime, values);
6263
}
64+
65+
validateResultSet(invokingResource, query, result);
6366
}
6467

6568
if (!cb) return response.length === 1 ? response[0] : response;

src/database/rawQuery.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type { QueryType } from '../types';
77
import { getPoolConnection } from './connection';
88
import { RowDataPacket } from 'mysql2';
99
import { performance } from 'perf_hooks';
10+
import validateResultSet from 'utils/validateResultSet';
1011

1112
export const rawQuery = async (
1213
type: QueryType,
@@ -43,6 +44,8 @@ export const rawQuery = async (
4344
logQuery(invokingResource, query, performance.now() - startTime, parameters);
4445
}
4546

47+
validateResultSet(invokingResource, query, result);
48+
4649
if (!cb) return parseResponse(type, result);
4750

4851
try {

src/utils/validateResultSet.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { OkPacket, ProcedureCallPacket, ResultSetHeader, RowDataPacket } from 'mysql2/promise';
2+
3+
const oversizedResultSet = GetConvarInt('mysql_resultset_warning', 1000);
4+
5+
export default function (
6+
invokingResource: string,
7+
query: string,
8+
rows:
9+
| OkPacket
10+
| ResultSetHeader
11+
| ResultSetHeader[]
12+
| RowDataPacket[]
13+
| RowDataPacket[][]
14+
| OkPacket[]
15+
| ProcedureCallPacket
16+
) {
17+
const length = Array.isArray(rows) ? rows.length : 0;
18+
19+
if (length < oversizedResultSet) return;
20+
21+
console.warn(`${invokingResource} executed a query with an oversized result set (${length} results)!\n${query}`);
22+
}

0 commit comments

Comments
 (0)