Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion .github/copilot-dependabot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,39 @@
6. **Comments** — review any existing PR comments and review threads, including resolved/hidden ones, and address anything actionable.
7. **Self-rate** — rate this work 1-10 against: correctness, test coverage, changelog accuracy, build/lint health, and comment resolution.
8. **Iterate** — if it's not a 10, keep improving until it is before finishing.
9. **Summary** — post a final comment explaining why this update matters, what the impact/risk is, and what could go wrong if it weren't applied, along with your self-rating and reasoning.
9. **Summary** — your final response must use the following structure exactly (no free-form paragraph summary).

## Impact analysis
- Package:
- Old version:
- New version:
- Change Impact:

## Build/Conflict Issues
- Commands:
- Result:

## Tests
- Added:
- Updated:
- Result:

## Run the Suite
- Commands:
- Status:

## Changelog
- Entry:
- Location:

## Comments
- Reviewed:
- Actions:

## Self-Rate
- Score:
- Reasoning:

## Summary
- Why this matters:
- Risk of not taking change:
1 change: 1 addition & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

General:

- Updated lockfile-resolved `mysql2` from 3.23.4 to 3.24.2 to correct three-byte length-coded parameter encoding and improve SQL metadata-store performance; added SQL pool regression coverage for large bound parameters.
- Updated the lockfile-resolved `eslint` version from 10.9.0 to 10.9.1 to fix a `no-loss-of-precision` false positive for trailing decimal points; added regression coverage for the corrected lint behavior.

## 2026.08 Version 3.37.0
Expand Down
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 19 additions & 2 deletions tests/blob/blockblob.highlevel.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import {
getTestServerBaseURL,
getUniqueName,
readStreamToLocalFile,
rmRecursive
rmRecursive,
sleep
} from "../testutils";

// Set true to enable debug log
Expand Down Expand Up @@ -56,6 +57,22 @@ describe("BlockBlobHighlevel", () => {
let tempFileLargeLength: number;
const tempFolderPath = "temp";
const timeoutForLargeFileUploadingTest = 20 * 60 * 1000;
const cleanupRetryDelay = 100;
const cleanupRetryMaxTries = 3;

async function deleteContainerWithTransientRetry(): Promise<void> {
for (let i = 1; i <= cleanupRetryMaxTries; i++) {
try {
await containerClient.delete();
return;
} catch (err: any) {
if (err.code !== "ECONNRESET" || i === cleanupRetryMaxTries) {
throw err;
}
await sleep(cleanupRetryDelay * i);
}
}
}

beforeEach(async () => {
containerName = getUniqueName("container");
Expand All @@ -67,7 +84,7 @@ describe("BlockBlobHighlevel", () => {
});

afterEach(async function () {
await containerClient.delete();
await deleteContainerWithTransientRetry();
});

before(async () => {
Expand Down
25 changes: 25 additions & 0 deletions tests/blob/sqlBlobMetadataStorePool.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as assert from "assert";
import { QueryTypes, Sequelize } from "sequelize";

import * as Models from "../../src/blob/generated/artifacts/models";
import Context from "../../src/blob/generated/Context";
Expand Down Expand Up @@ -146,4 +147,28 @@ describe("SqlBlobMetadataStore connection pool @sql", () => {

await store.deleteContainer(createContext("conflict-4"), accountName, name);
});

it("executes a three-byte length-coded parameter", async function () {
const sequelize = getSequelize(store);
const dialect = sequelize.getDialect();
if (dialect !== "mysql" && dialect !== "mariadb") {
this.skip();
}

const value = "x".repeat(0x10000 + 1);

const result = await sequelize.query<{ value: string }>(
"SELECT $value AS value",
{
bind: { value },
type: QueryTypes.SELECT
}
);

assert.strictEqual(result[0].value, value);
});

function getSequelize(store: SqlBlobMetadataStore): Sequelize {
return (store as any).sequelize;
}
});
Loading