Build strings through StringBuilder instead of chained concat #3
Closed
agra
wants to merge 2 commits from
string-builder-concat into master
pull from: string-builder-concat
merge into: sx:master
sx:master
sx:task/3906-s2-the-runner-holds-a-session-s-claude-r
sx:task/4000-runs-and-jobs-claim-at-the-priority-and
sx:task/3999-a-queued-run-takes-the-rank-of-the-runs
sx:task/3998-every-flow-run-goes-through-its-queue-an
sx:task/3905-s1-sessions-in-the-store-a-session-its-l
sx:task/3730-a-stream-media-part-with-malformed-base6
sx:task/3765-s7-task-list-and-needs-you-s3-v2-s5-v1
sx:task/3764-s6-the-queue-s-three-surfaces-s4
sx:task/3763-s5-flow-card-and-question-s2-v2-s6-v2
sx:task/3762-s4-dispatch-dialog-s1-v2
sx:task/3761-s3-questions-with-options-images-and-fil
sx:task/3760-s2-the-queue-s-api
sx:task/3759-s1-the-queue-in-the-store-and-its-slots
sx:task/3665-s1-sak-runner-attach-shows-a-service-run
sx:task/3981-runs-receive-hundreds-of-unreviewed-agen
sx:task/3937-release-0-3-12-so-an-agy-account-signs-i
sx:task/3936-an-agy-sign-in-hangs-after-its-login-suc
sx:task/3933-release-0-3-11-so-sak-and-the-runners-ta
sx:task/3863-tests-runner-handover-sx-leaves-its-stub
sx:task/3782-releasing-0-3-6-breaks-the-hand-over-tes
sx:task/3803-a-run-on-a-runner-host-replaced-the-host
sx:task/3744-on-a-macos-runner-at-night-timers-stretc
sx:task/3829-s4-the-flow-page-on-the-graph-the-chosen
sx:task/3648-sak-runner-keeps-a-dead-channel-after-it
sx:task/3897-sak-s-full-gate-takes-half-an-hour-and-a
sx:task/3847-a-codex-grok-or-agy-run-gets-only-its-pr
sx:task/3841-sak-runner-runs-gemini-through-the-agy-h
sx:task/3879-a-flow-run-whose-step-ends-goes-to-the-b
sx:task/3880-an-orchestrator-s-instructions-go-to-cla
sx:task/3871-the-deploy-runtime-is-rebuilt-on-sx-af8455
sx:task/3877-a-project-names-run-tags-that-every-run
sx:task/3860-backing-up-the-live-database-with-vacuum
sx:task/3856-in-the-dispatch-dialog-the-role-selects
sx:task/3622-e2e-runner-wizard-spec-ts-220-can-time-o
sx:task/3828-s3-the-graph-layout-a-flow-s-graph-place
sx:task/3859-r1-dispatch-on-data-colour
sx:task/3758-s12-navigator-and-whole-web
sx:task/3839-stopping-a-flow-run-leaves-its-going-run
sx:task/3857-release-0-3-10-so-the-runners-keep-every
sx:task/3852-a-run-that-rewrites-a-commit-the-runner
sx:task/3853-the-runner-config-s-flow-tests-wait-60-s
sx:task/3827-s2-the-flows-page-on-f-read-by-a-followe
sx:task/3854-release-0-3-9-so-production-serves-3729
sx:task/3757-s11-settings-flow-dialog-surfaces
sx:task/3729-the-needs-you-card-offers-a-proposed-act
sx:task/3845-release-0-3-8-so-production-and-the-runn
sx:task/3756-s10-stream-run-file-surfaces
sx:task/3826-s1-the-main-page-s-flows-a-title-line-an
sx:task/3834-sak-0-3-7-a986bb0-crash-loops-at-start-o
sx:task/3840-deploy-runtime-lock-binds-runtime-image
sx:task/3728-a-wait-names-its-actions-and-a-proposal
sx:plan/3682-design-system-s9
sx:task/3727-a-dispatch-with-no-forge-token-or-that-n
sx:task/3825-a-task-marked-urgent-has-its-runs-and-ga
sx:task/3563-the-website-cannot-label-a-task-the-task
sx:task/3832-3682-s-eight-finished-steps-reach-master
sx:plan/3682-design-system
sx:task/3726-an-orchestrator-s-run-takes-no-share-of
sx:task/3553-sak-runner-s-running-view-draws-the-flow
sx:task/3805-a-gate-job-fixes-the-base-it-gates-onto
sx:task/3823-release-0-3-7-so-the-runners-take-3797-s
sx:task/3800-sak-records-each-runner-s-free-space-and
sx:task/3785-a-gate-job-runs-only-on-the-runner-of-th
sx:task/3808-run-steps-bases-every-step-on-the-plan-s
sx:task/3797-each-sak-runner-update-drops-the-macos-p
sx:task/3810-3694-s-five-finished-steps-reach-master
sx:task/3807-runner-core-s-gate-re-attach-check-gives
sx:task/3725-a-slot-s-process-that-starts-again-or-sa
sx:task/3784-a-runner-whose-disk-is-full-keeps-taking
sx:task/3694-plan-a-flow-run-waits-on-agra-only-for-a
sx:task/3724-a-run-lives-through-a-sak-restart-its-tr
sx:task/3799-a-gate-job-cuts-its-output-tail-on-a-byt
sx:task/3734-tests-step-concurrency-sx-s-dropped-tail
sx:task/3629-tests-runner-core-sx-intermittently-fail
sx:task/3776-sak-s-e2e-suites-serve-on-fixed-ports-18
sx:task/3796-two-main-playwright-specs-fail-sak-s-ful
sx:task/3723-a-mechanical-failure-runs-the-step-again
sx:task/3722-a-forbidden-word-reaches-the-run-as-a-me
sx:task/3779-release-0-3-6-so-the-runners-take-3687-s
sx:task/3731-two-web-unit-tests-fail-sak-s-fast-gate
sx:task/3721-a-finished-turn-ends-its-run-settle-with
sx:task/3651-streams-spec-ts-and-tail-stream-spec-ts
sx:plan/3684-stream-view
sx:task/3687-a-run-whose-turn-ends-while-its-backgrou
sx:fix/3683-stream-image-base64
sx:task/3659-release-0-3-5
sx:flow/sak-3596/plan
sx:task/3563-label-a-task
sx:task/3562-flows-every-task
sx:fix/3548-runner-idle-timeout-after-result
sx:task/585-runtime-publish
sx:fix/2827-flick-latency
sx:fix/2363-layered-phone-scale
sx:fix/3502-cone-layout-order
sx:task/3464-global-lists
sx:fix/3498-runners-golden-id
sx:fix/2642-hud-backdrop
sx:fix/3467-navigator-goldens
sx:fix/3500-field-control-font
sx:fix/3499-field-label-rule
sx:fix/2632-long-token-wrap
sx:fix/2661-done-plain-decimal
sx:task/3469-nas-deploy
sx:task/3470-login-screen
sx:task/3000-queued-event-kind
sx:task/3470-login-errors
sx:task/3470-sign-in-paste
sx:task/731-stream-drop-band
sx:task/3466-rand-hex-leak
sx:task/3030-unique-run-home
sx:task/3131-gate-unknown-leak
sx:task/3130-config-output-leak
sx:task/3070-acceptance-fixes
sx:task/3228-unkept-memory-flake
sx:task/3150-board-atomic
sx:task/3119-macos-runner
sx:task/3114-running-view
sx:task/3113-setup-tui
sx:task/3112-runner-reads-flow
sx:task/3111-update-all
sx:fix/3129-empty-result-leaks
sx:task/3110-dependencies
sx:task/3109-install-command
sx:task/3108-enrolment
sx:task/3067-dist-build
sx:task/3053-multi-label-flows
sx:task/2945-web-dispatch
sx:task/2944-web-flows
sx:task/2943-plan-built-ins
sx:task/2942-gate-jobs
sx:task/2941-flow-runs
sx:task/2940-flows
sx:task/2939-web-roles-memories
sx:task/2938-run-memories
sx:task/2937-roles-memories
sx:task/2936-project-gates
sx:task/2935-project-repository
sx:task/2934-web-accounts
sx:task/2933-account-sign-in
sx:task/2953-masked-token
sx:task/2932-runner-wizard
sx:task/2931-insulated-runs
sx:task/2930-accounts
sx:fix/2926-claude-permission
sx:task/2925-runner-tokens
sx:fix/2909-gallery-flake
sx:task/2805-runner-supervisor
sx:task/2803-app-server-harness
sx:task/819-runner-core
sx:fix/2860-fresh-db-writer-busy
sx:task/2801-pin-e2200801
sx:task/817-run-queue
sx:task/2802-runner-registry
sx:task/816-stream-inbox
sx:fix/2632-long-token
sx:task/2632-task-view-a-long-unbroken-token-in-a-des
sx:fix/2625-empty-string-option
sx:fix/2617-galaxy-flick
sx:fix/2800-allocator-bypass
sx:task/1635-stringbuilder
sx:fix/2545-streams-390
sx:fix/2666-layered-page-zoom
sx:fix/2528-webkit-refused-range
sx:fix/2506-latest-runs-attempt
sx:fix/2500-bg-bash-once
sx:fix/2665-layered-hud-fit
sx:fix/2498-stream-facts-390
sx:fix/2488-utf8-len-optional
sx:task/2649-attr-pill
sx:fix/2439-fold-toggle-names
sx:fix/2421-edit-focus
sx:fix/2382-floor-labels-edge
sx:fix/2381-hud-counts-backdrop
sx:fix/2282-rehearsal-token-race
sx:task/944-task-side-pane
sx:task/549-error-sets
sx:fix/2562-board-put-race
sx:fix/2501-test-roots
sx:fix/2358-galaxy-label-flake
sx:fix/2355-sticky-seal-goldens
sx:fix/2291-find-around
sx:task/2474-scoped-stdlib
sx:fix/2597-anchor-doc
sx:nav/remaining
sx:qa/2548-gallery
sx:qa/2540-clip-tiles
sx:qa/2499-stream-rows
sx:flow/sak-2435/plan
sx:qa/2441-streams
sx:qa/2408-task-side
sx:qa/2410-task-list
sx:fix/2409-layered-header
sx:fix/2389-npm-node26
sx:fix/2388-markdown-test-node22
sx:flow/sak-2189/plan
sx:fix/2264-now-time
sx:flow/sak-2156/v1
sx:flow/sak-2156/plan
sx:flow/sak-2107/plan
sx:flow/sak-sx-latest/plan
sx:json-writer-sink
sx:flow/sak-transcript/T4
sx:flow/sak-transcript/T2
sx:flow/sak-streams/R1
sx:streams
sx:flow/sak-streams/S1
sx:sak-v1
sx:flow/sak/step-10b
No reviewers
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
sx/sak!3
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "string-builder-concat"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Tracker: #1635
Strings that grow in a loop or across several appends are built in one
StringBuilderinstead of chainedconcat, which copied the whole prefix on every link.store.sx:patch_set,fts_quote,and_clause,placeholdersare ufcs methods on*StringBuilder; the task/projectUPDATEstatements, the task filter, the FTS match andORDER BYare each written into one builder.api.sx:sse_data/sse_eventare ufcs methods writing straight into the frame's builder; payload lines use the slice operator andslice_ofis gone.logging.sx: the request line is one builder;configis one variadicconcat.Output bytes are unchanged. Single fixed joins (
concat("sak_", hex),concat(root, p)) stay as oneconcatcall.Verification at
ea2bc64on sx 6f334aa4: coldsx build src/main.sx -o sakok;tests/*.sx20 of 20,step9_releaseagainstdist/packaged fromea2bc64.Head:
ea2bc64545Superseded by #44, which re-delivers this StringBuilder change on current master (sak task #1635, run contract comment 12565). Closing.
agra referenced this pull request2026-10-27 15:30:03 +02:00
agra referenced this pull request2026-10-30 05:35:58 +02:00
Pull request closed