Full Code of github/gh-ost for AI

master b9652c336746 cached
2299 files
21.9 MB
4.1M tokens
83352 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (16,207K chars total). Download the full file to get everything.
Repository: github/gh-ost
Branch: master
Commit: b9652c336746
Files: 2299
Total size: 21.9 MB

Directory structure:
gitextract_0igtfzyc/

├── .github/
│   ├── CODEOWNERS
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       ├── codeql.yml
│       ├── golangci-lint.yml
│       └── replica-tests.yml
├── .gitignore
├── .golangci.yml
├── Dockerfile.packaging
├── Dockerfile.test
├── LICENSE
├── README.md
├── build.sh
├── doc/
│   ├── azure.md
│   ├── cheatsheet.md
│   ├── coding-ghost.md
│   ├── command-line-flags.md
│   ├── cut-over.md
│   ├── hooks.md
│   ├── interactive-commands.md
│   ├── local-tests.md
│   ├── migrating-with-sbr.md
│   ├── perks.md
│   ├── questions.md
│   ├── rds.md
│   ├── requirements-and-limitations.md
│   ├── resume.md
│   ├── revert.md
│   ├── shared-key.md
│   ├── subsecond-lag.md
│   ├── testing-on-replica.md
│   ├── the-fine-print.md
│   ├── throttle.md
│   ├── triggerless-design.md
│   ├── understanding-output.md
│   ├── what-if.md
│   └── why-triggerless.md
├── docker-compose.yml
├── go/
│   ├── base/
│   │   ├── context.go
│   │   ├── context_test.go
│   │   ├── default_logger.go
│   │   ├── load_map.go
│   │   ├── load_map_test.go
│   │   ├── utils.go
│   │   └── utils_test.go
│   ├── binlog/
│   │   ├── binlog_dml_event.go
│   │   ├── binlog_entry.go
│   │   ├── binlog_reader.go
│   │   ├── gomysql_reader.go
│   │   └── testdata/
│   │       ├── mysql-bin.000066
│   │       ├── mysql-bin.000070
│   │       ├── rbr-sample-0.txt
│   │       ├── rbr-sample-1.txt
│   │       └── rbr-sample-2.txt
│   ├── cmd/
│   │   └── gh-ost/
│   │       └── main.go
│   ├── logic/
│   │   ├── applier.go
│   │   ├── applier_test.go
│   │   ├── checkpoint.go
│   │   ├── hooks.go
│   │   ├── hooks_test.go
│   │   ├── inspect.go
│   │   ├── inspect_test.go
│   │   ├── migrator.go
│   │   ├── migrator_test.go
│   │   ├── my.cnf.test
│   │   ├── server.go
│   │   ├── server_test.go
│   │   ├── streamer.go
│   │   ├── streamer_test.go
│   │   ├── test_utils.go
│   │   └── throttler.go
│   ├── mysql/
│   │   ├── binlog.go
│   │   ├── binlog_file.go
│   │   ├── binlog_file_test.go
│   │   ├── binlog_gtid.go
│   │   ├── connection.go
│   │   ├── connection_test.go
│   │   ├── instance_key.go
│   │   ├── instance_key_map.go
│   │   ├── instance_key_test.go
│   │   ├── replica_terminology_map.go
│   │   └── utils.go
│   └── sql/
│       ├── builder.go
│       ├── builder_test.go
│       ├── encoding.go
│       ├── parser.go
│       ├── parser_test.go
│       ├── types.go
│       └── types_test.go
├── go.mod
├── go.sum
├── localtests/
│   ├── alter-charset/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── alter-charset-all-dml/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── attempt-instant-ddl/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── autoinc-copy-deletes/
│   │   ├── create.sql
│   │   └── expect_table_structure
│   ├── autoinc-copy-deletes-user-defined/
│   │   ├── create.sql
│   │   ├── expect_table_structure
│   │   └── extra_args
│   ├── autoinc-copy-simple/
│   │   ├── create.sql
│   │   └── expect_table_structure
│   ├── autoinc-zero-value/
│   │   └── create.sql
│   ├── bigint-change-nullable/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── binary-to-varbinary/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── bit-add/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── bit-dml/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── compound-pk/
│   │   └── create.sql
│   ├── compound-pk-ts/
│   │   └── create.sql
│   ├── convert-utf8mb4/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── copy-retries-exhausted/
│   │   ├── after.sql
│   │   ├── before.sql
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── datetime/
│   │   └── create.sql
│   ├── datetime-1970/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   ├── orig_columns
│   │   └── sql_mode
│   ├── datetime-submillis/
│   │   └── create.sql
│   ├── datetime-submillis-zeroleading/
│   │   └── create.sql
│   ├── datetime-to-timestamp/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── datetime-to-timestamp-pk-fail/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── datetime-with-zero/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── decimal/
│   │   └── create.sql
│   ├── discard-fk/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   └── ignore_versions
│   ├── docker-compose.yml
│   ├── drop-null-add-not-null/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── enum/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── enum-pk/
│   │   └── create.sql
│   ├── enum-to-varchar/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── existing-datetime-with-zero/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── fail-datetime-with-zero/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-drop-pk/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-existing-datetime-with-zero/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-fk/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── ignore_versions
│   ├── fail-fk-parent/
│   │   ├── create.sql
│   │   ├── destroy.sql
│   │   ├── expect_failure
│   │   ├── extra_args
│   │   └── ignore_versions
│   ├── fail-float-unique-key/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-no-shared-uk/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-no-unique-key/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-rename-table/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-update-pk-column/
│   │   └── create.sql
│   ├── gbk-charset/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── generated-columns/
│   │   ├── create.sql
│   │   └── ignore_versions
│   ├── generated-columns-add/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   ├── ignore_versions
│   │   ├── order_by
│   │   └── orig_columns
│   ├── generated-columns-rename/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   └── ignore_versions
│   ├── generated-columns-unique/
│   │   ├── create.sql
│   │   └── ignore_versions
│   ├── geometry/
│   │   ├── create.sql
│   │   └── ignore_versions
│   ├── gtid/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── gtid_mode
│   │   └── ignore_versions
│   ├── json/
│   │   └── create.sql
│   ├── json-dml/
│   │   └── create.sql
│   ├── keyword-column/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── latin1/
│   │   └── create.sql
│   ├── latin1text/
│   │   └── create.sql
│   ├── mixed-charset/
│   │   └── create.sql
│   ├── modify-change-case/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── modify-change-case-pk/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── panic-on-warnings-duplicate-unique-values-on-column-type-change/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── panic-on-warnings-duplicate-values-for-unique-index/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── panic-on-warnings-update-pk-with-duplicate-on-new-unique-index/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   ├── extra_args
│   │   └── test.sh
│   ├── rename/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── rename-inserts-only/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── rename-none-column/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── rename-none-comment/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── rename-reorder-column/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── rename-reorder-columns/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── reorder-columns/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── shared-uk/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── spatial/
│   │   ├── create.sql
│   │   └── ignore_versions
│   ├── swap-pk-uk/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   └── order_by
│   ├── swap-uk/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── swap-uk-uk/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   └── order_by
│   ├── sysbench/
│   │   └── create.sql
│   ├── test.sh
│   ├── timestamp/
│   │   └── create.sql
│   ├── timestamp-datetime/
│   │   └── create.sql
│   ├── timestamp-to-datetime/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── trigger-advanced-features/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── trigger-ghost-name-conflict/
│   │   ├── create.sql
│   │   ├── destroy.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── trigger-long-name-validation/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── trivial/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── tz/
│   │   └── create.sql
│   ├── tz-datetime/
│   │   └── create.sql
│   ├── tz-datetime-ts/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── unsigned/
│   │   └── create.sql
│   ├── unsigned-modify/
│   │   └── create.sql
│   ├── unsigned-rename/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── unsigned-reorder/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── utf8/
│   │   └── create.sql
│   ├── utf8mb4/
│   │   └── create.sql
│   └── varbinary/
│       └── create.sql
├── resources/
│   └── hooks-sample/
│       ├── gh-ost-on-before-cut-over-hook
│       ├── gh-ost-on-before-row-copy-hook
│       ├── gh-ost-on-begin-postponed-hook
│       ├── gh-ost-on-failure-hook
│       ├── gh-ost-on-interactive-command-hook
│       ├── gh-ost-on-row-copy-complete-hook
│       ├── gh-ost-on-rowcount-complete-hook
│       ├── gh-ost-on-start-replication-hook
│       ├── gh-ost-on-startup-hook
│       ├── gh-ost-on-status-hook
│       ├── gh-ost-on-stop-replication-hook
│       ├── gh-ost-on-success-hook
│       ├── gh-ost-on-success-hook-2
│       └── gh-ost-on-validated-hook
├── script/
│   ├── bootstrap
│   ├── build
│   ├── build-deploy-tarball
│   ├── cibuild
│   ├── cibuild-gh-ost-build-deploy-tarball
│   ├── dock
│   ├── docker-gh-ost-replica-tests
│   ├── ensure-go-installed
│   ├── ensure-golangci-lint-installed
│   ├── gh-ost-test-mysql-master
│   ├── gh-ost-test-mysql-replica
│   ├── go
│   ├── lint
│   └── test
├── test.sh
├── tmp/
│   └── .gitkeep
└── vendor/
    ├── dario.cat/
    │   └── mergo/
    │       ├── .deepsource.toml
    │       ├── .gitignore
    │       ├── .travis.yml
    │       ├── CODE_OF_CONDUCT.md
    │       ├── CONTRIBUTING.md
    │       ├── LICENSE
    │       ├── README.md
    │       ├── SECURITY.md
    │       ├── doc.go
    │       ├── map.go
    │       ├── merge.go
    │       └── mergo.go
    ├── filippo.io/
    │   └── edwards25519/
    │       ├── LICENSE
    │       ├── README.md
    │       ├── doc.go
    │       ├── edwards25519.go
    │       ├── extra.go
    │       ├── field/
    │       │   ├── fe.go
    │       │   ├── fe_amd64.go
    │       │   ├── fe_amd64.s
    │       │   ├── fe_amd64_noasm.go
    │       │   ├── fe_arm64.go
    │       │   ├── fe_arm64.s
    │       │   ├── fe_arm64_noasm.go
    │       │   ├── fe_extra.go
    │       │   └── fe_generic.go
    │       ├── scalar.go
    │       ├── scalar_fiat.go
    │       ├── scalarmult.go
    │       └── tables.go
    ├── github.com/
    │   ├── Azure/
    │   │   └── go-ansiterm/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── constants.go
    │   │       ├── context.go
    │   │       ├── csi_entry_state.go
    │   │       ├── csi_param_state.go
    │   │       ├── escape_intermediate_state.go
    │   │       ├── escape_state.go
    │   │       ├── event_handler.go
    │   │       ├── ground_state.go
    │   │       ├── osc_string_state.go
    │   │       ├── parser.go
    │   │       ├── parser_action_helpers.go
    │   │       ├── parser_actions.go
    │   │       ├── states.go
    │   │       ├── utilities.go
    │   │       └── winterm/
    │   │           ├── ansi.go
    │   │           ├── api.go
    │   │           ├── attr_translation.go
    │   │           ├── cursor_helpers.go
    │   │           ├── erase_helpers.go
    │   │           ├── scroll_helper.go
    │   │           ├── utilities.go
    │   │           └── win_event_handler.go
    │   ├── Masterminds/
    │   │   └── semver/
    │   │       ├── .travis.yml
    │   │       ├── CHANGELOG.md
    │   │       ├── LICENSE.txt
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── appveyor.yml
    │   │       ├── collection.go
    │   │       ├── constraints.go
    │   │       ├── doc.go
    │   │       ├── version.go
    │   │       └── version_fuzz.go
    │   ├── Microsoft/
    │   │   └── go-winio/
    │   │       ├── .gitattributes
    │   │       ├── .gitignore
    │   │       ├── .golangci.yml
    │   │       ├── CODEOWNERS
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── SECURITY.md
    │   │       ├── backup.go
    │   │       ├── doc.go
    │   │       ├── ea.go
    │   │       ├── file.go
    │   │       ├── fileinfo.go
    │   │       ├── hvsock.go
    │   │       ├── internal/
    │   │       │   ├── fs/
    │   │       │   │   ├── doc.go
    │   │       │   │   ├── fs.go
    │   │       │   │   ├── security.go
    │   │       │   │   └── zsyscall_windows.go
    │   │       │   ├── socket/
    │   │       │   │   ├── rawaddr.go
    │   │       │   │   ├── socket.go
    │   │       │   │   └── zsyscall_windows.go
    │   │       │   └── stringbuffer/
    │   │       │       └── wstring.go
    │   │       ├── pipe.go
    │   │       ├── pkg/
    │   │       │   └── guid/
    │   │       │       ├── guid.go
    │   │       │       ├── guid_nonwindows.go
    │   │       │       ├── guid_windows.go
    │   │       │       └── variant_string.go
    │   │       ├── privilege.go
    │   │       ├── reparse.go
    │   │       ├── sd.go
    │   │       ├── syscall.go
    │   │       └── zsyscall_windows.go
    │   ├── cenkalti/
    │   │   └── backoff/
    │   │       └── v4/
    │   │           ├── .gitignore
    │   │           ├── LICENSE
    │   │           ├── README.md
    │   │           ├── backoff.go
    │   │           ├── context.go
    │   │           ├── exponential.go
    │   │           ├── retry.go
    │   │           ├── ticker.go
    │   │           ├── timer.go
    │   │           └── tries.go
    │   ├── containerd/
    │   │   ├── log/
    │   │   │   ├── .golangci.yml
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   └── context.go
    │   │   └── platforms/
    │   │       ├── .gitattributes
    │   │       ├── .golangci.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── compare.go
    │   │       ├── cpuinfo.go
    │   │       ├── cpuinfo_linux.go
    │   │       ├── cpuinfo_other.go
    │   │       ├── database.go
    │   │       ├── defaults.go
    │   │       ├── defaults_darwin.go
    │   │       ├── defaults_freebsd.go
    │   │       ├── defaults_unix.go
    │   │       ├── defaults_windows.go
    │   │       ├── errors.go
    │   │       ├── platform_compat_windows.go
    │   │       ├── platforms.go
    │   │       ├── platforms_other.go
    │   │       └── platforms_windows.go
    │   ├── cpuguy83/
    │   │   └── dockercfg/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── auth.go
    │   │       ├── config.go
    │   │       └── load.go
    │   ├── davecgh/
    │   │   └── go-spew/
    │   │       ├── LICENSE
    │   │       └── spew/
    │   │           ├── bypass.go
    │   │           ├── bypasssafe.go
    │   │           ├── common.go
    │   │           ├── config.go
    │   │           ├── doc.go
    │   │           ├── dump.go
    │   │           ├── format.go
    │   │           └── spew.go
    │   ├── distribution/
    │   │   └── reference/
    │   │       ├── .gitattributes
    │   │       ├── .gitignore
    │   │       ├── .golangci.yml
    │   │       ├── CODE-OF-CONDUCT.md
    │   │       ├── CONTRIBUTING.md
    │   │       ├── GOVERNANCE.md
    │   │       ├── LICENSE
    │   │       ├── MAINTAINERS
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── SECURITY.md
    │   │       ├── helpers.go
    │   │       ├── normalize.go
    │   │       ├── reference.go
    │   │       ├── regexp.go
    │   │       └── sort.go
    │   ├── docker/
    │   │   ├── docker/
    │   │   │   ├── AUTHORS
    │   │   │   ├── LICENSE
    │   │   │   ├── NOTICE
    │   │   │   ├── api/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── common.go
    │   │   │   │   ├── swagger-gen.yaml
    │   │   │   │   ├── swagger.yaml
    │   │   │   │   └── types/
    │   │   │   │       ├── blkiodev/
    │   │   │   │       │   └── blkio.go
    │   │   │   │       ├── checkpoint/
    │   │   │   │       │   ├── list.go
    │   │   │   │       │   └── options.go
    │   │   │   │       ├── client.go
    │   │   │   │       ├── common/
    │   │   │   │       │   └── id_response.go
    │   │   │   │       ├── container/
    │   │   │   │       │   ├── change_type.go
    │   │   │   │       │   ├── change_types.go
    │   │   │   │       │   ├── commit.go
    │   │   │   │       │   ├── config.go
    │   │   │   │       │   ├── container.go
    │   │   │   │       │   ├── create_request.go
    │   │   │   │       │   ├── create_response.go
    │   │   │   │       │   ├── errors.go
    │   │   │   │       │   ├── exec.go
    │   │   │   │       │   ├── filesystem_change.go
    │   │   │   │       │   ├── health.go
    │   │   │   │       │   ├── hostconfig.go
    │   │   │   │       │   ├── hostconfig_unix.go
    │   │   │   │       │   ├── hostconfig_windows.go
    │   │   │   │       │   ├── network_settings.go
    │   │   │   │       │   ├── options.go
    │   │   │   │       │   ├── port.go
    │   │   │   │       │   ├── stats.go
    │   │   │   │       │   ├── top_response.go
    │   │   │   │       │   ├── update_response.go
    │   │   │   │       │   ├── wait_exit_error.go
    │   │   │   │       │   ├── wait_response.go
    │   │   │   │       │   └── waitcondition.go
    │   │   │   │       ├── error_response.go
    │   │   │   │       ├── error_response_ext.go
    │   │   │   │       ├── events/
    │   │   │   │       │   └── events.go
    │   │   │   │       ├── filters/
    │   │   │   │       │   ├── errors.go
    │   │   │   │       │   └── parse.go
    │   │   │   │       ├── image/
    │   │   │   │       │   ├── delete_response.go
    │   │   │   │       │   ├── image.go
    │   │   │   │       │   ├── image_history.go
    │   │   │   │       │   ├── image_inspect.go
    │   │   │   │       │   ├── manifest.go
    │   │   │   │       │   ├── opts.go
    │   │   │   │       │   └── summary.go
    │   │   │   │       ├── mount/
    │   │   │   │       │   └── mount.go
    │   │   │   │       ├── network/
    │   │   │   │       │   ├── create_response.go
    │   │   │   │       │   ├── endpoint.go
    │   │   │   │       │   ├── ipam.go
    │   │   │   │       │   └── network.go
    │   │   │   │       ├── plugin.go
    │   │   │   │       ├── plugin_device.go
    │   │   │   │       ├── plugin_env.go
    │   │   │   │       ├── plugin_interface_type.go
    │   │   │   │       ├── plugin_mount.go
    │   │   │   │       ├── plugin_responses.go
    │   │   │   │       ├── registry/
    │   │   │   │       │   ├── authconfig.go
    │   │   │   │       │   ├── authenticate.go
    │   │   │   │       │   ├── registry.go
    │   │   │   │       │   └── search.go
    │   │   │   │       ├── storage/
    │   │   │   │       │   └── driver_data.go
    │   │   │   │       ├── strslice/
    │   │   │   │       │   └── strslice.go
    │   │   │   │       ├── swarm/
    │   │   │   │       │   ├── common.go
    │   │   │   │       │   ├── config.go
    │   │   │   │       │   ├── container.go
    │   │   │   │       │   ├── network.go
    │   │   │   │       │   ├── node.go
    │   │   │   │       │   ├── runtime/
    │   │   │   │       │   │   ├── gen.go
    │   │   │   │       │   │   ├── plugin.pb.go
    │   │   │   │       │   │   └── plugin.proto
    │   │   │   │       │   ├── runtime.go
    │   │   │   │       │   ├── secret.go
    │   │   │   │       │   ├── service.go
    │   │   │   │       │   ├── service_create_response.go
    │   │   │   │       │   ├── service_update_response.go
    │   │   │   │       │   ├── swarm.go
    │   │   │   │       │   └── task.go
    │   │   │   │       ├── system/
    │   │   │   │       │   ├── info.go
    │   │   │   │       │   ├── runtime.go
    │   │   │   │       │   └── security_opts.go
    │   │   │   │       ├── time/
    │   │   │   │       │   └── timestamp.go
    │   │   │   │       ├── types.go
    │   │   │   │       ├── types_deprecated.go
    │   │   │   │       ├── versions/
    │   │   │   │       │   └── compare.go
    │   │   │   │       └── volume/
    │   │   │   │           ├── cluster_volume.go
    │   │   │   │           ├── create_options.go
    │   │   │   │           ├── list_response.go
    │   │   │   │           ├── options.go
    │   │   │   │           ├── volume.go
    │   │   │   │           └── volume_update.go
    │   │   │   ├── client/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── build_cancel.go
    │   │   │   │   ├── build_prune.go
    │   │   │   │   ├── checkpoint.go
    │   │   │   │   ├── checkpoint_create.go
    │   │   │   │   ├── checkpoint_delete.go
    │   │   │   │   ├── checkpoint_list.go
    │   │   │   │   ├── client.go
    │   │   │   │   ├── client_deprecated.go
    │   │   │   │   ├── client_interfaces.go
    │   │   │   │   ├── client_unix.go
    │   │   │   │   ├── client_windows.go
    │   │   │   │   ├── config_create.go
    │   │   │   │   ├── config_inspect.go
    │   │   │   │   ├── config_list.go
    │   │   │   │   ├── config_remove.go
    │   │   │   │   ├── config_update.go
    │   │   │   │   ├── container_attach.go
    │   │   │   │   ├── container_commit.go
    │   │   │   │   ├── container_copy.go
    │   │   │   │   ├── container_create.go
    │   │   │   │   ├── container_diff.go
    │   │   │   │   ├── container_exec.go
    │   │   │   │   ├── container_export.go
    │   │   │   │   ├── container_inspect.go
    │   │   │   │   ├── container_kill.go
    │   │   │   │   ├── container_list.go
    │   │   │   │   ├── container_logs.go
    │   │   │   │   ├── container_pause.go
    │   │   │   │   ├── container_prune.go
    │   │   │   │   ├── container_remove.go
    │   │   │   │   ├── container_rename.go
    │   │   │   │   ├── container_resize.go
    │   │   │   │   ├── container_restart.go
    │   │   │   │   ├── container_start.go
    │   │   │   │   ├── container_stats.go
    │   │   │   │   ├── container_stop.go
    │   │   │   │   ├── container_top.go
    │   │   │   │   ├── container_unpause.go
    │   │   │   │   ├── container_update.go
    │   │   │   │   ├── container_wait.go
    │   │   │   │   ├── disk_usage.go
    │   │   │   │   ├── distribution_inspect.go
    │   │   │   │   ├── envvars.go
    │   │   │   │   ├── errors.go
    │   │   │   │   ├── events.go
    │   │   │   │   ├── hijack.go
    │   │   │   │   ├── image_build.go
    │   │   │   │   ├── image_create.go
    │   │   │   │   ├── image_history.go
    │   │   │   │   ├── image_history_opts.go
    │   │   │   │   ├── image_import.go
    │   │   │   │   ├── image_inspect.go
    │   │   │   │   ├── image_inspect_opts.go
    │   │   │   │   ├── image_list.go
    │   │   │   │   ├── image_load.go
    │   │   │   │   ├── image_load_opts.go
    │   │   │   │   ├── image_prune.go
    │   │   │   │   ├── image_pull.go
    │   │   │   │   ├── image_push.go
    │   │   │   │   ├── image_remove.go
    │   │   │   │   ├── image_save.go
    │   │   │   │   ├── image_save_opts.go
    │   │   │   │   ├── image_search.go
    │   │   │   │   ├── image_tag.go
    │   │   │   │   ├── info.go
    │   │   │   │   ├── login.go
    │   │   │   │   ├── network_connect.go
    │   │   │   │   ├── network_create.go
    │   │   │   │   ├── network_disconnect.go
    │   │   │   │   ├── network_inspect.go
    │   │   │   │   ├── network_list.go
    │   │   │   │   ├── network_prune.go
    │   │   │   │   ├── network_remove.go
    │   │   │   │   ├── node_inspect.go
    │   │   │   │   ├── node_list.go
    │   │   │   │   ├── node_remove.go
    │   │   │   │   ├── node_update.go
    │   │   │   │   ├── options.go
    │   │   │   │   ├── ping.go
    │   │   │   │   ├── plugin_create.go
    │   │   │   │   ├── plugin_disable.go
    │   │   │   │   ├── plugin_enable.go
    │   │   │   │   ├── plugin_inspect.go
    │   │   │   │   ├── plugin_install.go
    │   │   │   │   ├── plugin_list.go
    │   │   │   │   ├── plugin_push.go
    │   │   │   │   ├── plugin_remove.go
    │   │   │   │   ├── plugin_set.go
    │   │   │   │   ├── plugin_upgrade.go
    │   │   │   │   ├── request.go
    │   │   │   │   ├── secret_create.go
    │   │   │   │   ├── secret_inspect.go
    │   │   │   │   ├── secret_list.go
    │   │   │   │   ├── secret_remove.go
    │   │   │   │   ├── secret_update.go
    │   │   │   │   ├── service_create.go
    │   │   │   │   ├── service_inspect.go
    │   │   │   │   ├── service_list.go
    │   │   │   │   ├── service_logs.go
    │   │   │   │   ├── service_remove.go
    │   │   │   │   ├── service_update.go
    │   │   │   │   ├── swarm_get_unlock_key.go
    │   │   │   │   ├── swarm_init.go
    │   │   │   │   ├── swarm_inspect.go
    │   │   │   │   ├── swarm_join.go
    │   │   │   │   ├── swarm_leave.go
    │   │   │   │   ├── swarm_unlock.go
    │   │   │   │   ├── swarm_update.go
    │   │   │   │   ├── task_inspect.go
    │   │   │   │   ├── task_list.go
    │   │   │   │   ├── task_logs.go
    │   │   │   │   ├── utils.go
    │   │   │   │   ├── version.go
    │   │   │   │   ├── volume_create.go
    │   │   │   │   ├── volume_inspect.go
    │   │   │   │   ├── volume_list.go
    │   │   │   │   ├── volume_prune.go
    │   │   │   │   ├── volume_remove.go
    │   │   │   │   └── volume_update.go
    │   │   │   ├── errdefs/
    │   │   │   │   ├── defs.go
    │   │   │   │   ├── doc.go
    │   │   │   │   ├── helpers.go
    │   │   │   │   ├── http_helpers.go
    │   │   │   │   └── is.go
    │   │   │   ├── internal/
    │   │   │   │   ├── lazyregexp/
    │   │   │   │   │   └── lazyregexp.go
    │   │   │   │   └── multierror/
    │   │   │   │       └── multierror.go
    │   │   │   └── pkg/
    │   │   │       ├── archive/
    │   │   │       │   ├── archive.go
    │   │   │       │   ├── archive_linux.go
    │   │   │       │   ├── archive_other.go
    │   │   │       │   ├── archive_unix.go
    │   │   │       │   ├── archive_windows.go
    │   │   │       │   ├── changes.go
    │   │   │       │   ├── changes_linux.go
    │   │   │       │   ├── changes_other.go
    │   │   │       │   ├── changes_unix.go
    │   │   │       │   ├── changes_windows.go
    │   │   │       │   ├── copy.go
    │   │   │       │   ├── copy_unix.go
    │   │   │       │   ├── copy_windows.go
    │   │   │       │   ├── dev_freebsd.go
    │   │   │       │   ├── dev_unix.go
    │   │   │       │   ├── diff.go
    │   │   │       │   ├── diff_unix.go
    │   │   │       │   ├── diff_windows.go
    │   │   │       │   ├── path.go
    │   │   │       │   ├── path_unix.go
    │   │   │       │   ├── path_windows.go
    │   │   │       │   ├── time.go
    │   │   │       │   ├── time_nonwindows.go
    │   │   │       │   ├── time_windows.go
    │   │   │       │   ├── whiteouts.go
    │   │   │       │   ├── wrap.go
    │   │   │       │   ├── xattr_supported.go
    │   │   │       │   ├── xattr_supported_linux.go
    │   │   │       │   ├── xattr_supported_unix.go
    │   │   │       │   └── xattr_unsupported.go
    │   │   │       ├── idtools/
    │   │   │       │   ├── idtools.go
    │   │   │       │   ├── idtools_unix.go
    │   │   │       │   └── idtools_windows.go
    │   │   │       ├── jsonmessage/
    │   │   │       │   └── jsonmessage.go
    │   │   │       └── stdcopy/
    │   │   │           └── stdcopy.go
    │   │   ├── go-connections/
    │   │   │   ├── LICENSE
    │   │   │   ├── nat/
    │   │   │   │   ├── nat.go
    │   │   │   │   ├── parse.go
    │   │   │   │   └── sort.go
    │   │   │   ├── sockets/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── inmem_socket.go
    │   │   │   │   ├── proxy.go
    │   │   │   │   ├── sockets.go
    │   │   │   │   ├── sockets_unix.go
    │   │   │   │   ├── sockets_windows.go
    │   │   │   │   ├── tcp_socket.go
    │   │   │   │   └── unix_socket.go
    │   │   │   └── tlsconfig/
    │   │   │       ├── certpool.go
    │   │   │       ├── config.go
    │   │   │       └── config_client_ciphers.go
    │   │   └── go-units/
    │   │       ├── CONTRIBUTING.md
    │   │       ├── LICENSE
    │   │       ├── MAINTAINERS
    │   │       ├── README.md
    │   │       ├── circle.yml
    │   │       ├── duration.go
    │   │       ├── size.go
    │   │       └── ulimit.go
    │   ├── ebitengine/
    │   │   └── purego/
    │   │       ├── .gitignore
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── abi_amd64.h
    │   │       ├── abi_arm64.h
    │   │       ├── cgo.go
    │   │       ├── dlerror.go
    │   │       ├── dlfcn.go
    │   │       ├── dlfcn_android.go
    │   │       ├── dlfcn_darwin.go
    │   │       ├── dlfcn_freebsd.go
    │   │       ├── dlfcn_linux.go
    │   │       ├── dlfcn_nocgo_freebsd.go
    │   │       ├── dlfcn_nocgo_linux.go
    │   │       ├── dlfcn_playground.go
    │   │       ├── dlfcn_stubs.s
    │   │       ├── func.go
    │   │       ├── go_runtime.go
    │   │       ├── internal/
    │   │       │   ├── cgo/
    │   │       │   │   ├── dlfcn_cgo_unix.go
    │   │       │   │   ├── empty.go
    │   │       │   │   └── syscall_cgo_unix.go
    │   │       │   ├── fakecgo/
    │   │       │   │   ├── abi_amd64.h
    │   │       │   │   ├── abi_arm64.h
    │   │       │   │   ├── asm_amd64.s
    │   │       │   │   ├── asm_arm64.s
    │   │       │   │   ├── callbacks.go
    │   │       │   │   ├── doc.go
    │   │       │   │   ├── freebsd.go
    │   │       │   │   ├── go_darwin_amd64.go
    │   │       │   │   ├── go_darwin_arm64.go
    │   │       │   │   ├── go_freebsd_amd64.go
    │   │       │   │   ├── go_freebsd_arm64.go
    │   │       │   │   ├── go_libinit.go
    │   │       │   │   ├── go_linux_amd64.go
    │   │       │   │   ├── go_linux_arm64.go
    │   │       │   │   ├── go_setenv.go
    │   │       │   │   ├── go_util.go
    │   │       │   │   ├── iscgo.go
    │   │       │   │   ├── libcgo.go
    │   │       │   │   ├── libcgo_darwin.go
    │   │       │   │   ├── libcgo_freebsd.go
    │   │       │   │   ├── libcgo_linux.go
    │   │       │   │   ├── setenv.go
    │   │       │   │   ├── symbols.go
    │   │       │   │   ├── symbols_darwin.go
    │   │       │   │   ├── symbols_freebsd.go
    │   │       │   │   ├── symbols_linux.go
    │   │       │   │   ├── trampolines_amd64.s
    │   │       │   │   ├── trampolines_arm64.s
    │   │       │   │   └── trampolines_stubs.s
    │   │       │   └── strings/
    │   │       │       └── strings.go
    │   │       ├── is_ios.go
    │   │       ├── nocgo.go
    │   │       ├── struct_amd64.go
    │   │       ├── struct_arm64.go
    │   │       ├── struct_other.go
    │   │       ├── sys_amd64.s
    │   │       ├── sys_arm64.s
    │   │       ├── sys_unix_arm64.s
    │   │       ├── syscall.go
    │   │       ├── syscall_cgo_linux.go
    │   │       ├── syscall_sysv.go
    │   │       ├── syscall_windows.go
    │   │       ├── zcallback_amd64.s
    │   │       └── zcallback_arm64.s
    │   ├── felixge/
    │   │   └── httpsnoop/
    │   │       ├── .gitignore
    │   │       ├── LICENSE.txt
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── capture_metrics.go
    │   │       ├── docs.go
    │   │       ├── wrap_generated_gteq_1.8.go
    │   │       └── wrap_generated_lt_1.8.go
    │   ├── go-ini/
    │   │   └── ini/
    │   │       ├── .editorconfig
    │   │       ├── .gitignore
    │   │       ├── .golangci.yml
    │   │       ├── LICENSE
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── codecov.yml
    │   │       ├── data_source.go
    │   │       ├── deprecated.go
    │   │       ├── error.go
    │   │       ├── file.go
    │   │       ├── helper.go
    │   │       ├── ini.go
    │   │       ├── key.go
    │   │       ├── parser.go
    │   │       ├── section.go
    │   │       └── struct.go
    │   ├── go-logr/
    │   │   ├── logr/
    │   │   │   ├── .golangci.yaml
    │   │   │   ├── CHANGELOG.md
    │   │   │   ├── CONTRIBUTING.md
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   ├── SECURITY.md
    │   │   │   ├── context.go
    │   │   │   ├── context_noslog.go
    │   │   │   ├── context_slog.go
    │   │   │   ├── discard.go
    │   │   │   ├── funcr/
    │   │   │   │   ├── funcr.go
    │   │   │   │   └── slogsink.go
    │   │   │   ├── logr.go
    │   │   │   ├── sloghandler.go
    │   │   │   ├── slogr.go
    │   │   │   └── slogsink.go
    │   │   └── stdr/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       └── stdr.go
    │   ├── go-mysql-org/
    │   │   └── go-mysql/
    │   │       ├── LICENSE
    │   │       ├── client/
    │   │       │   ├── auth.go
    │   │       │   ├── conn.go
    │   │       │   ├── pool.go
    │   │       │   ├── pool_options.go
    │   │       │   ├── req.go
    │   │       │   ├── resp.go
    │   │       │   ├── stmt.go
    │   │       │   └── tls.go
    │   │       ├── compress/
    │   │       │   └── zlib.go
    │   │       ├── mysql/
    │   │       │   ├── const.go
    │   │       │   ├── errcode.go
    │   │       │   ├── errname.go
    │   │       │   ├── error.go
    │   │       │   ├── field.go
    │   │       │   ├── gtid.go
    │   │       │   ├── mariadb_gtid.go
    │   │       │   ├── mysql_gtid.go
    │   │       │   ├── parse_binary.go
    │   │       │   ├── position.go
    │   │       │   ├── result.go
    │   │       │   ├── resultset.go
    │   │       │   ├── resultset_helper.go
    │   │       │   ├── rowdata.go
    │   │       │   ├── state.go
    │   │       │   ├── util.go
    │   │       │   └── validate.go
    │   │       ├── packet/
    │   │       │   └── conn.go
    │   │       ├── replication/
    │   │       │   ├── backup.go
    │   │       │   ├── binlogstreamer.go
    │   │       │   ├── binlogsyncer.go
    │   │       │   ├── const.go
    │   │       │   ├── doc.go
    │   │       │   ├── event.go
    │   │       │   ├── generic_event.go
    │   │       │   ├── json_binary.go
    │   │       │   ├── parser.go
    │   │       │   ├── row_event.go
    │   │       │   ├── time.go
    │   │       │   └── transaction_payload_event.go
    │   │       └── utils/
    │   │           ├── byte_slice_pool.go
    │   │           ├── bytes_buffer_pool.go
    │   │           ├── now.go
    │   │           ├── now_unix.go
    │   │           └── zeroalloc.go
    │   ├── go-ole/
    │   │   └── go-ole/
    │   │       ├── .travis.yml
    │   │       ├── ChangeLog.md
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── appveyor.yml
    │   │       ├── com.go
    │   │       ├── com_func.go
    │   │       ├── connect.go
    │   │       ├── constants.go
    │   │       ├── error.go
    │   │       ├── error_func.go
    │   │       ├── error_windows.go
    │   │       ├── guid.go
    │   │       ├── iconnectionpoint.go
    │   │       ├── iconnectionpoint_func.go
    │   │       ├── iconnectionpoint_windows.go
    │   │       ├── iconnectionpointcontainer.go
    │   │       ├── iconnectionpointcontainer_func.go
    │   │       ├── iconnectionpointcontainer_windows.go
    │   │       ├── idispatch.go
    │   │       ├── idispatch_func.go
    │   │       ├── idispatch_windows.go
    │   │       ├── ienumvariant.go
    │   │       ├── ienumvariant_func.go
    │   │       ├── ienumvariant_windows.go
    │   │       ├── iinspectable.go
    │   │       ├── iinspectable_func.go
    │   │       ├── iinspectable_windows.go
    │   │       ├── iprovideclassinfo.go
    │   │       ├── iprovideclassinfo_func.go
    │   │       ├── iprovideclassinfo_windows.go
    │   │       ├── itypeinfo.go
    │   │       ├── itypeinfo_func.go
    │   │       ├── itypeinfo_windows.go
    │   │       ├── iunknown.go
    │   │       ├── iunknown_func.go
    │   │       ├── iunknown_windows.go
    │   │       ├── ole.go
    │   │       ├── oleutil/
    │   │       │   ├── connection.go
    │   │       │   ├── connection_func.go
    │   │       │   ├── connection_windows.go
    │   │       │   ├── go-get.go
    │   │       │   └── oleutil.go
    │   │       ├── safearray.go
    │   │       ├── safearray_func.go
    │   │       ├── safearray_windows.go
    │   │       ├── safearrayconversion.go
    │   │       ├── safearrayslices.go
    │   │       ├── utility.go
    │   │       ├── variables.go
    │   │       ├── variant.go
    │   │       ├── variant_386.go
    │   │       ├── variant_amd64.go
    │   │       ├── variant_arm.go
    │   │       ├── variant_arm64.go
    │   │       ├── variant_date_386.go
    │   │       ├── variant_date_amd64.go
    │   │       ├── variant_date_arm.go
    │   │       ├── variant_date_arm64.go
    │   │       ├── variant_ppc64le.go
    │   │       ├── variant_s390x.go
    │   │       ├── vt_string.go
    │   │       ├── winrt.go
    │   │       └── winrt_doc.go
    │   ├── go-sql-driver/
    │   │   └── mysql/
    │   │       ├── .gitignore
    │   │       ├── AUTHORS
    │   │       ├── CHANGELOG.md
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── atomic_bool.go
    │   │       ├── atomic_bool_go118.go
    │   │       ├── auth.go
    │   │       ├── buffer.go
    │   │       ├── collations.go
    │   │       ├── conncheck.go
    │   │       ├── conncheck_dummy.go
    │   │       ├── connection.go
    │   │       ├── connector.go
    │   │       ├── const.go
    │   │       ├── driver.go
    │   │       ├── dsn.go
    │   │       ├── errors.go
    │   │       ├── fields.go
    │   │       ├── infile.go
    │   │       ├── nulltime.go
    │   │       ├── packets.go
    │   │       ├── result.go
    │   │       ├── rows.go
    │   │       ├── statement.go
    │   │       ├── transaction.go
    │   │       └── utils.go
    │   ├── goccy/
    │   │   └── go-json/
    │   │       ├── .codecov.yml
    │   │       ├── .gitignore
    │   │       ├── .golangci.yml
    │   │       ├── CHANGELOG.md
    │   │       ├── LICENSE
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── color.go
    │   │       ├── decode.go
    │   │       ├── docker-compose.yml
    │   │       ├── encode.go
    │   │       ├── error.go
    │   │       ├── internal/
    │   │       │   ├── decoder/
    │   │       │   │   ├── anonymous_field.go
    │   │       │   │   ├── array.go
    │   │       │   │   ├── assign.go
    │   │       │   │   ├── bool.go
    │   │       │   │   ├── bytes.go
    │   │       │   │   ├── compile.go
    │   │       │   │   ├── compile_norace.go
    │   │       │   │   ├── compile_race.go
    │   │       │   │   ├── context.go
    │   │       │   │   ├── float.go
    │   │       │   │   ├── func.go
    │   │       │   │   ├── int.go
    │   │       │   │   ├── interface.go
    │   │       │   │   ├── invalid.go
    │   │       │   │   ├── map.go
    │   │       │   │   ├── number.go
    │   │       │   │   ├── option.go
    │   │       │   │   ├── path.go
    │   │       │   │   ├── ptr.go
    │   │       │   │   ├── slice.go
    │   │       │   │   ├── stream.go
    │   │       │   │   ├── string.go
    │   │       │   │   ├── struct.go
    │   │       │   │   ├── type.go
    │   │       │   │   ├── uint.go
    │   │       │   │   ├── unmarshal_json.go
    │   │       │   │   ├── unmarshal_text.go
    │   │       │   │   └── wrapped_string.go
    │   │       │   ├── encoder/
    │   │       │   │   ├── code.go
    │   │       │   │   ├── compact.go
    │   │       │   │   ├── compiler.go
    │   │       │   │   ├── compiler_norace.go
    │   │       │   │   ├── compiler_race.go
    │   │       │   │   ├── context.go
    │   │       │   │   ├── decode_rune.go
    │   │       │   │   ├── encoder.go
    │   │       │   │   ├── indent.go
    │   │       │   │   ├── int.go
    │   │       │   │   ├── map112.go
    │   │       │   │   ├── map113.go
    │   │       │   │   ├── opcode.go
    │   │       │   │   ├── option.go
    │   │       │   │   ├── optype.go
    │   │       │   │   ├── query.go
    │   │       │   │   ├── string.go
    │   │       │   │   ├── string_table.go
    │   │       │   │   ├── vm/
    │   │       │   │   │   ├── debug_vm.go
    │   │       │   │   │   ├── hack.go
    │   │       │   │   │   ├── util.go
    │   │       │   │   │   └── vm.go
    │   │       │   │   ├── vm_color/
    │   │       │   │   │   ├── debug_vm.go
    │   │       │   │   │   ├── hack.go
    │   │       │   │   │   ├── util.go
    │   │       │   │   │   └── vm.go
    │   │       │   │   ├── vm_color_indent/
    │   │       │   │   │   ├── debug_vm.go
    │   │       │   │   │   ├── util.go
    │   │       │   │   │   └── vm.go
    │   │       │   │   └── vm_indent/
    │   │       │   │       ├── debug_vm.go
    │   │       │   │       ├── hack.go
    │   │       │   │       ├── util.go
    │   │       │   │       └── vm.go
    │   │       │   ├── errors/
    │   │       │   │   └── error.go
    │   │       │   └── runtime/
    │   │       │       ├── rtype.go
    │   │       │       ├── struct_field.go
    │   │       │       └── type.go
    │   │       ├── json.go
    │   │       ├── option.go
    │   │       ├── path.go
    │   │       └── query.go
    │   ├── gogo/
    │   │   └── protobuf/
    │   │       ├── AUTHORS
    │   │       ├── CONTRIBUTORS
    │   │       ├── LICENSE
    │   │       └── proto/
    │   │           ├── Makefile
    │   │           ├── clone.go
    │   │           ├── custom_gogo.go
    │   │           ├── decode.go
    │   │           ├── deprecated.go
    │   │           ├── discard.go
    │   │           ├── duration.go
    │   │           ├── duration_gogo.go
    │   │           ├── encode.go
    │   │           ├── encode_gogo.go
    │   │           ├── equal.go
    │   │           ├── extensions.go
    │   │           ├── extensions_gogo.go
    │   │           ├── lib.go
    │   │           ├── lib_gogo.go
    │   │           ├── message_set.go
    │   │           ├── pointer_reflect.go
    │   │           ├── pointer_reflect_gogo.go
    │   │           ├── pointer_unsafe.go
    │   │           ├── pointer_unsafe_gogo.go
    │   │           ├── properties.go
    │   │           ├── properties_gogo.go
    │   │           ├── skip_gogo.go
    │   │           ├── table_marshal.go
    │   │           ├── table_marshal_gogo.go
    │   │           ├── table_merge.go
    │   │           ├── table_unmarshal.go
    │   │           ├── table_unmarshal_gogo.go
    │   │           ├── text.go
    │   │           ├── text_gogo.go
    │   │           ├── text_parser.go
    │   │           ├── timestamp.go
    │   │           ├── timestamp_gogo.go
    │   │           ├── wrappers.go
    │   │           └── wrappers_gogo.go
    │   ├── google/
    │   │   └── uuid/
    │   │       ├── CHANGELOG.md
    │   │       ├── CONTRIBUTING.md
    │   │       ├── CONTRIBUTORS
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── dce.go
    │   │       ├── doc.go
    │   │       ├── hash.go
    │   │       ├── marshal.go
    │   │       ├── node.go
    │   │       ├── node_js.go
    │   │       ├── node_net.go
    │   │       ├── null.go
    │   │       ├── sql.go
    │   │       ├── time.go
    │   │       ├── util.go
    │   │       ├── uuid.go
    │   │       ├── version1.go
    │   │       ├── version4.go
    │   │       ├── version6.go
    │   │       └── version7.go
    │   ├── hashicorp/
    │   │   └── go-version/
    │   │       ├── CHANGELOG.md
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── constraint.go
    │   │       ├── version.go
    │   │       └── version_collection.go
    │   ├── klauspost/
    │   │   └── compress/
    │   │       ├── .gitattributes
    │   │       ├── .gitignore
    │   │       ├── .goreleaser.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── SECURITY.md
    │   │       ├── compressible.go
    │   │       ├── flate/
    │   │       │   ├── deflate.go
    │   │       │   ├── dict_decoder.go
    │   │       │   ├── fast_encoder.go
    │   │       │   ├── huffman_bit_writer.go
    │   │       │   ├── huffman_code.go
    │   │       │   ├── huffman_sortByFreq.go
    │   │       │   ├── huffman_sortByLiteral.go
    │   │       │   ├── inflate.go
    │   │       │   ├── inflate_gen.go
    │   │       │   ├── level1.go
    │   │       │   ├── level2.go
    │   │       │   ├── level3.go
    │   │       │   ├── level4.go
    │   │       │   ├── level5.go
    │   │       │   ├── level6.go
    │   │       │   ├── matchlen_amd64.go
    │   │       │   ├── matchlen_amd64.s
    │   │       │   ├── matchlen_generic.go
    │   │       │   ├── regmask_amd64.go
    │   │       │   ├── regmask_other.go
    │   │       │   ├── stateless.go
    │   │       │   └── token.go
    │   │       ├── fse/
    │   │       │   ├── README.md
    │   │       │   ├── bitreader.go
    │   │       │   ├── bitwriter.go
    │   │       │   ├── bytereader.go
    │   │       │   ├── compress.go
    │   │       │   ├── decompress.go
    │   │       │   └── fse.go
    │   │       ├── gen.sh
    │   │       ├── huff0/
    │   │       │   ├── .gitignore
    │   │       │   ├── README.md
    │   │       │   ├── bitreader.go
    │   │       │   ├── bitwriter.go
    │   │       │   ├── compress.go
    │   │       │   ├── decompress.go
    │   │       │   ├── decompress_amd64.go
    │   │       │   ├── decompress_amd64.s
    │   │       │   ├── decompress_generic.go
    │   │       │   └── huff0.go
    │   │       ├── internal/
    │   │       │   ├── cpuinfo/
    │   │       │   │   ├── cpuinfo.go
    │   │       │   │   ├── cpuinfo_amd64.go
    │   │       │   │   └── cpuinfo_amd64.s
    │   │       │   └── snapref/
    │   │       │       ├── LICENSE
    │   │       │       ├── decode.go
    │   │       │       ├── decode_other.go
    │   │       │       ├── encode.go
    │   │       │       ├── encode_other.go
    │   │       │       └── snappy.go
    │   │       ├── s2sx.mod
    │   │       ├── s2sx.sum
    │   │       ├── zlib/
    │   │       │   ├── reader.go
    │   │       │   └── writer.go
    │   │       └── zstd/
    │   │           ├── README.md
    │   │           ├── bitreader.go
    │   │           ├── bitwriter.go
    │   │           ├── blockdec.go
    │   │           ├── blockenc.go
    │   │           ├── blocktype_string.go
    │   │           ├── bytebuf.go
    │   │           ├── bytereader.go
    │   │           ├── decodeheader.go
    │   │           ├── decoder.go
    │   │           ├── decoder_options.go
    │   │           ├── dict.go
    │   │           ├── enc_base.go
    │   │           ├── enc_best.go
    │   │           ├── enc_better.go
    │   │           ├── enc_dfast.go
    │   │           ├── enc_fast.go
    │   │           ├── encoder.go
    │   │           ├── encoder_options.go
    │   │           ├── framedec.go
    │   │           ├── frameenc.go
    │   │           ├── fse_decoder.go
    │   │           ├── fse_decoder_amd64.go
    │   │           ├── fse_decoder_amd64.s
    │   │           ├── fse_decoder_generic.go
    │   │           ├── fse_encoder.go
    │   │           ├── fse_predefined.go
    │   │           ├── hash.go
    │   │           ├── history.go
    │   │           ├── internal/
    │   │           │   └── xxhash/
    │   │           │       ├── LICENSE.txt
    │   │           │       ├── README.md
    │   │           │       ├── xxhash.go
    │   │           │       ├── xxhash_amd64.s
    │   │           │       ├── xxhash_arm64.s
    │   │           │       ├── xxhash_asm.go
    │   │           │       ├── xxhash_other.go
    │   │           │       └── xxhash_safe.go
    │   │           ├── matchlen_amd64.go
    │   │           ├── matchlen_amd64.s
    │   │           ├── matchlen_generic.go
    │   │           ├── seqdec.go
    │   │           ├── seqdec_amd64.go
    │   │           ├── seqdec_amd64.s
    │   │           ├── seqdec_generic.go
    │   │           ├── seqenc.go
    │   │           ├── snappy.go
    │   │           ├── zip.go
    │   │           └── zstd.go
    │   ├── lufia/
    │   │   └── plan9stats/
    │   │       ├── .gitignore
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── cpu.go
    │   │       ├── doc.go
    │   │       ├── host.go
    │   │       ├── int.go
    │   │       ├── opts.go
    │   │       └── stats.go
    │   ├── magiconair/
    │   │   └── properties/
    │   │       ├── .gitignore
    │   │       ├── LICENSE.md
    │   │       ├── README.md
    │   │       ├── decode.go
    │   │       ├── doc.go
    │   │       ├── integrate.go
    │   │       ├── lex.go
    │   │       ├── load.go
    │   │       ├── parser.go
    │   │       ├── properties.go
    │   │       └── rangecheck.go
    │   ├── moby/
    │   │   ├── docker-image-spec/
    │   │   │   ├── LICENSE
    │   │   │   └── specs-go/
    │   │   │       └── v1/
    │   │   │           └── image.go
    │   │   ├── patternmatcher/
    │   │   │   ├── LICENSE
    │   │   │   ├── NOTICE
    │   │   │   ├── ignorefile/
    │   │   │   │   └── ignorefile.go
    │   │   │   └── patternmatcher.go
    │   │   └── sys/
    │   │       ├── sequential/
    │   │       │   ├── LICENSE
    │   │       │   ├── doc.go
    │   │       │   ├── sequential_unix.go
    │   │       │   └── sequential_windows.go
    │   │       ├── user/
    │   │       │   ├── LICENSE
    │   │       │   ├── lookup_unix.go
    │   │       │   ├── user.go
    │   │       │   └── user_fuzzer.go
    │   │       └── userns/
    │   │           ├── LICENSE
    │   │           ├── userns.go
    │   │           ├── userns_linux.go
    │   │           ├── userns_linux_fuzzer.go
    │   │           └── userns_unsupported.go
    │   ├── morikuni/
    │   │   └── aec/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── aec.go
    │   │       ├── ansi.go
    │   │       ├── builder.go
    │   │       └── sgr.go
    │   ├── openark/
    │   │   └── golib/
    │   │       ├── LICENSE
    │   │       ├── log/
    │   │       │   └── log.go
    │   │       └── sqlutils/
    │   │           ├── dialect.go
    │   │           ├── sqlite_dialect.go
    │   │           └── sqlutils.go
    │   ├── opencontainers/
    │   │   ├── go-digest/
    │   │   │   ├── .mailmap
    │   │   │   ├── .pullapprove.yml
    │   │   │   ├── .travis.yml
    │   │   │   ├── CONTRIBUTING.md
    │   │   │   ├── LICENSE
    │   │   │   ├── LICENSE.docs
    │   │   │   ├── MAINTAINERS
    │   │   │   ├── README.md
    │   │   │   ├── algorithm.go
    │   │   │   ├── digest.go
    │   │   │   ├── digester.go
    │   │   │   ├── doc.go
    │   │   │   └── verifiers.go
    │   │   └── image-spec/
    │   │       ├── LICENSE
    │   │       └── specs-go/
    │   │           ├── v1/
    │   │           │   ├── annotations.go
    │   │           │   ├── config.go
    │   │           │   ├── descriptor.go
    │   │           │   ├── index.go
    │   │           │   ├── layout.go
    │   │           │   ├── manifest.go
    │   │           │   └── mediatype.go
    │   │           ├── version.go
    │   │           └── versioned.go
    │   ├── pingcap/
    │   │   ├── errors/
    │   │   │   ├── .gitignore
    │   │   │   ├── .travis.yml
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   ├── compatible_shim.go
    │   │   │   ├── errors.go
    │   │   │   ├── group.go
    │   │   │   ├── juju_adaptor.go
    │   │   │   ├── normalize.go
    │   │   │   └── stack.go
    │   │   └── tidb/
    │   │       └── pkg/
    │   │           └── parser/
    │   │               ├── LICENSE
    │   │               ├── charset/
    │   │               │   ├── BUILD.bazel
    │   │               │   ├── charset.go
    │   │               │   ├── encoding.go
    │   │               │   ├── encoding_ascii.go
    │   │               │   ├── encoding_base.go
    │   │               │   ├── encoding_bin.go
    │   │               │   ├── encoding_gbk.go
    │   │               │   ├── encoding_latin1.go
    │   │               │   ├── encoding_table.go
    │   │               │   └── encoding_utf8.go
    │   │               ├── format/
    │   │               │   ├── BUILD.bazel
    │   │               │   └── format.go
    │   │               ├── mysql/
    │   │               │   ├── BUILD.bazel
    │   │               │   ├── charset.go
    │   │               │   ├── const.go
    │   │               │   ├── errcode.go
    │   │               │   ├── errname.go
    │   │               │   ├── error.go
    │   │               │   ├── locale_format.go
    │   │               │   ├── privs.go
    │   │               │   ├── state.go
    │   │               │   ├── type.go
    │   │               │   └── util.go
    │   │               └── terror/
    │   │                   ├── BUILD.bazel
    │   │                   └── terror.go
    │   ├── pkg/
    │   │   └── errors/
    │   │       ├── .gitignore
    │   │       ├── .travis.yml
    │   │       ├── LICENSE
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── appveyor.yml
    │   │       ├── errors.go
    │   │       ├── go113.go
    │   │       └── stack.go
    │   ├── pmezard/
    │   │   └── go-difflib/
    │   │       ├── LICENSE
    │   │       └── difflib/
    │   │           └── difflib.go
    │   ├── power-devops/
    │   │   └── perfstat/
    │   │       ├── LICENSE
    │   │       ├── c_helpers.c
    │   │       ├── c_helpers.h
    │   │       ├── config.go
    │   │       ├── cpustat.go
    │   │       ├── diskstat.go
    │   │       ├── doc.go
    │   │       ├── fsstat.go
    │   │       ├── helpers.go
    │   │       ├── lparstat.go
    │   │       ├── lvmstat.go
    │   │       ├── memstat.go
    │   │       ├── netstat.go
    │   │       ├── procstat.go
    │   │       ├── sysconf.go
    │   │       ├── systemcfg.go
    │   │       ├── types_cpu.go
    │   │       ├── types_disk.go
    │   │       ├── types_fs.go
    │   │       ├── types_lpar.go
    │   │       ├── types_lvm.go
    │   │       ├── types_memory.go
    │   │       ├── types_network.go
    │   │       ├── types_process.go
    │   │       └── uptime.go
    │   ├── shirou/
    │   │   └── gopsutil/
    │   │       └── v4/
    │   │           ├── LICENSE
    │   │           ├── common/
    │   │           │   └── env.go
    │   │           ├── cpu/
    │   │           │   ├── cpu.go
    │   │           │   ├── cpu_aix.go
    │   │           │   ├── cpu_aix_cgo.go
    │   │           │   ├── cpu_aix_nocgo.go
    │   │           │   ├── cpu_darwin.go
    │   │           │   ├── cpu_darwin_arm64.go
    │   │           │   ├── cpu_darwin_fallback.go
    │   │           │   ├── cpu_dragonfly.go
    │   │           │   ├── cpu_dragonfly_amd64.go
    │   │           │   ├── cpu_fallback.go
    │   │           │   ├── cpu_freebsd.go
    │   │           │   ├── cpu_freebsd_386.go
    │   │           │   ├── cpu_freebsd_amd64.go
    │   │           │   ├── cpu_freebsd_arm.go
    │   │           │   ├── cpu_freebsd_arm64.go
    │   │           │   ├── cpu_linux.go
    │   │           │   ├── cpu_netbsd.go
    │   │           │   ├── cpu_netbsd_amd64.go
    │   │           │   ├── cpu_netbsd_arm.go
    │   │           │   ├── cpu_netbsd_arm64.go
    │   │           │   ├── cpu_openbsd.go
    │   │           │   ├── cpu_openbsd_386.go
    │   │           │   ├── cpu_openbsd_amd64.go
    │   │           │   ├── cpu_openbsd_arm.go
    │   │           │   ├── cpu_openbsd_arm64.go
    │   │           │   ├── cpu_openbsd_riscv64.go
    │   │           │   ├── cpu_plan9.go
    │   │           │   ├── cpu_solaris.go
    │   │           │   └── cpu_windows.go
    │   │           ├── internal/
    │   │           │   └── common/
    │   │           │       ├── binary.go
    │   │           │       ├── common.go
    │   │           │       ├── common_darwin.go
    │   │           │       ├── common_freebsd.go
    │   │           │       ├── common_linux.go
    │   │           │       ├── common_netbsd.go
    │   │           │       ├── common_openbsd.go
    │   │           │       ├── common_unix.go
    │   │           │       ├── common_windows.go
    │   │           │       ├── endian.go
    │   │           │       ├── sleep.go
    │   │           │       └── warnings.go
    │   │           ├── mem/
    │   │           │   ├── ex_linux.go
    │   │           │   ├── ex_windows.go
    │   │           │   ├── mem.go
    │   │           │   ├── mem_aix.go
    │   │           │   ├── mem_aix_cgo.go
    │   │           │   ├── mem_aix_nocgo.go
    │   │           │   ├── mem_bsd.go
    │   │           │   ├── mem_darwin.go
    │   │           │   ├── mem_fallback.go
    │   │           │   ├── mem_freebsd.go
    │   │           │   ├── mem_linux.go
    │   │           │   ├── mem_netbsd.go
    │   │           │   ├── mem_openbsd.go
    │   │           │   ├── mem_openbsd_386.go
    │   │           │   ├── mem_openbsd_amd64.go
    │   │           │   ├── mem_openbsd_arm.go
    │   │           │   ├── mem_openbsd_arm64.go
    │   │           │   ├── mem_openbsd_riscv64.go
    │   │           │   ├── mem_plan9.go
    │   │           │   ├── mem_solaris.go
    │   │           │   └── mem_windows.go
    │   │           ├── net/
    │   │           │   ├── net.go
    │   │           │   ├── net_aix.go
    │   │           │   ├── net_aix_cgo.go
    │   │           │   ├── net_aix_nocgo.go
    │   │           │   ├── net_darwin.go
    │   │           │   ├── net_fallback.go
    │   │           │   ├── net_freebsd.go
    │   │           │   ├── net_linux.go
    │   │           │   ├── net_openbsd.go
    │   │           │   ├── net_solaris.go
    │   │           │   ├── net_unix.go
    │   │           │   └── net_windows.go
    │   │           └── process/
    │   │               ├── process.go
    │   │               ├── process_bsd.go
    │   │               ├── process_darwin.go
    │   │               ├── process_darwin_amd64.go
    │   │               ├── process_darwin_arm64.go
    │   │               ├── process_fallback.go
    │   │               ├── process_freebsd.go
    │   │               ├── process_freebsd_386.go
    │   │               ├── process_freebsd_amd64.go
    │   │               ├── process_freebsd_arm.go
    │   │               ├── process_freebsd_arm64.go
    │   │               ├── process_linux.go
    │   │               ├── process_openbsd.go
    │   │               ├── process_openbsd_386.go
    │   │               ├── process_openbsd_amd64.go
    │   │               ├── process_openbsd_arm.go
    │   │               ├── process_openbsd_arm64.go
    │   │               ├── process_openbsd_riscv64.go
    │   │               ├── process_plan9.go
    │   │               ├── process_posix.go
    │   │               ├── process_solaris.go
    │   │               ├── process_windows.go
    │   │               ├── process_windows_32bit.go
    │   │               └── process_windows_64bit.go
    │   ├── shopspring/
    │   │   └── decimal/
    │   │       ├── .gitignore
    │   │       ├── .travis.yml
    │   │       ├── CHANGELOG.md
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── decimal-go.go
    │   │       ├── decimal.go
    │   │       └── rounding.go
    │   ├── siddontang/
    │   │   └── go-log/
    │   │       ├── LICENSE
    │   │       ├── log/
    │   │       │   ├── doc.go
    │   │       │   ├── filehandler.go
    │   │       │   ├── handler.go
    │   │       │   ├── log.go
    │   │       │   └── logger.go
    │   │       └── loggers/
    │   │           └── loggers.go
    │   ├── stretchr/
    │   │   └── testify/
    │   │       ├── LICENSE
    │   │       ├── assert/
    │   │       │   ├── assertion_compare.go
    │   │       │   ├── assertion_format.go
    │   │       │   ├── assertion_format.go.tmpl
    │   │       │   ├── assertion_forward.go
    │   │       │   ├── assertion_forward.go.tmpl
    │   │       │   ├── assertion_order.go
    │   │       │   ├── assertions.go
    │   │       │   ├── doc.go
    │   │       │   ├── errors.go
    │   │       │   ├── forward_assertions.go
    │   │       │   ├── http_assertions.go
    │   │       │   └── yaml/
    │   │       │       ├── yaml_custom.go
    │   │       │       ├── yaml_default.go
    │   │       │       └── yaml_fail.go
    │   │       ├── require/
    │   │       │   ├── doc.go
    │   │       │   ├── forward_requirements.go
    │   │       │   ├── require.go
    │   │       │   ├── require.go.tmpl
    │   │       │   ├── require_forward.go
    │   │       │   ├── require_forward.go.tmpl
    │   │       │   └── requirements.go
    │   │       └── suite/
    │   │           ├── doc.go
    │   │           ├── interfaces.go
    │   │           ├── stats.go
    │   │           └── suite.go
    │   ├── tklauser/
    │   │   ├── go-sysconf/
    │   │   │   ├── .cirrus.yml
    │   │   │   ├── .gitignore
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   ├── sysconf.go
    │   │   │   ├── sysconf_bsd.go
    │   │   │   ├── sysconf_darwin.go
    │   │   │   ├── sysconf_dragonfly.go
    │   │   │   ├── sysconf_freebsd.go
    │   │   │   ├── sysconf_generic.go
    │   │   │   ├── sysconf_linux.go
    │   │   │   ├── sysconf_netbsd.go
    │   │   │   ├── sysconf_openbsd.go
    │   │   │   ├── sysconf_posix.go
    │   │   │   ├── sysconf_solaris.go
    │   │   │   ├── sysconf_unsupported.go
    │   │   │   ├── zsysconf_defs_darwin.go
    │   │   │   ├── zsysconf_defs_dragonfly.go
    │   │   │   ├── zsysconf_defs_freebsd.go
    │   │   │   ├── zsysconf_defs_linux.go
    │   │   │   ├── zsysconf_defs_netbsd.go
    │   │   │   ├── zsysconf_defs_openbsd.go
    │   │   │   ├── zsysconf_defs_solaris.go
    │   │   │   ├── zsysconf_values_freebsd_386.go
    │   │   │   ├── zsysconf_values_freebsd_amd64.go
    │   │   │   ├── zsysconf_values_freebsd_arm.go
    │   │   │   ├── zsysconf_values_freebsd_arm64.go
    │   │   │   ├── zsysconf_values_freebsd_riscv64.go
    │   │   │   ├── zsysconf_values_linux_386.go
    │   │   │   ├── zsysconf_values_linux_amd64.go
    │   │   │   ├── zsysconf_values_linux_arm.go
    │   │   │   ├── zsysconf_values_linux_arm64.go
    │   │   │   ├── zsysconf_values_linux_loong64.go
    │   │   │   ├── zsysconf_values_linux_mips.go
    │   │   │   ├── zsysconf_values_linux_mips64.go
    │   │   │   ├── zsysconf_values_linux_mips64le.go
    │   │   │   ├── zsysconf_values_linux_mipsle.go
    │   │   │   ├── zsysconf_values_linux_ppc64.go
    │   │   │   ├── zsysconf_values_linux_ppc64le.go
    │   │   │   ├── zsysconf_values_linux_riscv64.go
    │   │   │   ├── zsysconf_values_linux_s390x.go
    │   │   │   ├── zsysconf_values_netbsd_386.go
    │   │   │   ├── zsysconf_values_netbsd_amd64.go
    │   │   │   ├── zsysconf_values_netbsd_arm.go
    │   │   │   └── zsysconf_values_netbsd_arm64.go
    │   │   └── numcpus/
    │   │       ├── .cirrus.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── numcpus.go
    │   │       ├── numcpus_bsd.go
    │   │       ├── numcpus_linux.go
    │   │       ├── numcpus_solaris.go
    │   │       ├── numcpus_unsupported.go
    │   │       └── numcpus_windows.go
    │   └── yusufpapurcu/
    │       └── wmi/
    │           ├── LICENSE
    │           ├── README.md
    │           ├── swbemservices.go
    │           └── wmi.go
    ├── go.opentelemetry.io/
    │   ├── auto/
    │   │   └── sdk/
    │   │       ├── CONTRIBUTING.md
    │   │       ├── LICENSE
    │   │       ├── VERSIONING.md
    │   │       ├── doc.go
    │   │       ├── internal/
    │   │       │   └── telemetry/
    │   │       │       ├── attr.go
    │   │       │       ├── doc.go
    │   │       │       ├── id.go
    │   │       │       ├── number.go
    │   │       │       ├── resource.go
    │   │       │       ├── scope.go
    │   │       │       ├── span.go
    │   │       │       ├── status.go
    │   │       │       ├── traces.go
    │   │       │       └── value.go
    │   │       ├── limit.go
    │   │       ├── span.go
    │   │       ├── tracer.go
    │   │       └── tracer_provider.go
    │   ├── contrib/
    │   │   └── instrumentation/
    │   │       └── net/
    │   │           └── http/
    │   │               └── otelhttp/
    │   │                   ├── LICENSE
    │   │                   ├── client.go
    │   │                   ├── common.go
    │   │                   ├── config.go
    │   │                   ├── doc.go
    │   │                   ├── handler.go
    │   │                   ├── internal/
    │   │                   │   └── semconvutil/
    │   │                   │       ├── gen.go
    │   │                   │       ├── httpconv.go
    │   │                   │       └── netconv.go
    │   │                   ├── labeler.go
    │   │                   ├── transport.go
    │   │                   ├── version.go
    │   │                   └── wrap.go
    │   └── otel/
    │       ├── .codespellignore
    │       ├── .codespellrc
    │       ├── .gitattributes
    │       ├── .gitignore
    │       ├── .golangci.yml
    │       ├── .lycheeignore
    │       ├── .markdownlint.yaml
    │       ├── CHANGELOG.md
    │       ├── CODEOWNERS
    │       ├── CONTRIBUTING.md
    │       ├── LICENSE
    │       ├── Makefile
    │       ├── README.md
    │       ├── RELEASING.md
    │       ├── VERSIONING.md
    │       ├── attribute/
    │       │   ├── README.md
    │       │   ├── doc.go
    │       │   ├── encoder.go
    │       │   ├── filter.go
    │       │   ├── iterator.go
    │       │   ├── key.go
    │       │   ├── kv.go
    │       │   ├── set.go
    │       │   ├── type_string.go
    │       │   └── value.go
    │       ├── baggage/
    │       │   ├── README.md
    │       │   ├── baggage.go
    │       │   ├── context.go
    │       │   └── doc.go
    │       ├── codes/
    │       │   ├── README.md
    │       │   ├── codes.go
    │       │   └── doc.go
    │       ├── dependencies.Dockerfile
    │       ├── doc.go
    │       ├── error_handler.go
    │       ├── get_main_pkgs.sh
    │       ├── handler.go
    │       ├── internal/
    │       │   ├── attribute/
    │       │   │   └── attribute.go
    │       │   ├── baggage/
    │       │   │   ├── baggage.go
    │       │   │   └── context.go
    │       │   ├── gen.go
    │       │   ├── global/
    │       │   │   ├── handler.go
    │       │   │   ├── instruments.go
    │       │   │   ├── internal_logging.go
    │       │   │   ├── meter.go
    │       │   │   ├── propagator.go
    │       │   │   ├── state.go
    │       │   │   └── trace.go
    │       │   └── rawhelpers.go
    │       ├── internal_logging.go
    │       ├── metric/
    │       │   ├── LICENSE
    │       │   ├── README.md
    │       │   ├── asyncfloat64.go
    │       │   ├── asyncint64.go
    │       │   ├── config.go
    │       │   ├── doc.go
    │       │   ├── embedded/
    │       │   │   ├── README.md
    │       │   │   └── embedded.go
    │       │   ├── instrument.go
    │       │   ├── meter.go
    │       │   ├── syncfloat64.go
    │       │   └── syncint64.go
    │       ├── metric.go
    │       ├── propagation/
    │       │   ├── README.md
    │       │   ├── baggage.go
    │       │   ├── doc.go
    │       │   ├── propagation.go
    │       │   └── trace_context.go
    │       ├── propagation.go
    │       ├── renovate.json
    │       ├── requirements.txt
    │       ├── semconv/
    │       │   ├── v1.20.0/
    │       │   │   ├── README.md
    │       │   │   ├── attribute_group.go
    │       │   │   ├── doc.go
    │       │   │   ├── event.go
    │       │   │   ├── exception.go
    │       │   │   ├── http.go
    │       │   │   ├── resource.go
    │       │   │   ├── schema.go
    │       │   │   └── trace.go
    │       │   └── v1.26.0/
    │       │       ├── README.md
    │       │       ├── attribute_group.go
    │       │       ├── doc.go
    │       │       ├── exception.go
    │       │       ├── metric.go
    │       │       └── schema.go
    │       ├── trace/
    │       │   ├── LICENSE
    │       │   ├── README.md
    │       │   ├── auto.go
    │       │   ├── config.go
    │       │   ├── context.go
    │       │   ├── doc.go
    │       │   ├── embedded/
    │       │   │   ├── README.md
    │       │   │   └── embedded.go
    │       │   ├── internal/
    │       │   │   └── telemetry/
    │       │   │       ├── attr.go
    │       │   │       ├── doc.go
    │       │   │       ├── id.go
    │       │   │       ├── number.go
    │       │   │       ├── resource.go
    │       │   │       ├── scope.go
    │       │   │       ├── span.go
    │       │   │       ├── status.go
    │       │   │       ├── traces.go
    │       │   │       └── value.go
    │       │   ├── nonrecording.go
    │       │   ├── noop/
    │       │   │   ├── README.md
    │       │   │   └── noop.go
    │       │   ├── noop.go
    │       │   ├── provider.go
    │       │   ├── span.go
    │       │   ├── trace.go
    │       │   ├── tracer.go
    │       │   └── tracestate.go
    │       ├── trace.go
    │       ├── verify_readmes.sh
    │       ├── verify_released_changelog.sh
    │       ├── version.go
    │       └── versions.yaml
    ├── golang.org/
    │   └── x/
    │       ├── crypto/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   ├── blowfish/
    │       │   │   ├── block.go
    │       │   │   ├── cipher.go
    │       │   │   └── const.go
    │       │   ├── chacha20/
    │       │   │   ├── chacha_arm64.go
    │       │   │   ├── chacha_arm64.s
    │       │   │   ├── chacha_generic.go
    │       │   │   ├── chacha_noasm.go
    │       │   │   ├── chacha_ppc64x.go
    │       │   │   ├── chacha_ppc64x.s
    │       │   │   ├── chacha_s390x.go
    │       │   │   ├── chacha_s390x.s
    │       │   │   └── xor.go
    │       │   ├── curve25519/
    │       │   │   └── curve25519.go
    │       │   ├── internal/
    │       │   │   ├── alias/
    │       │   │   │   ├── alias.go
    │       │   │   │   └── alias_purego.go
    │       │   │   └── poly1305/
    │       │   │       ├── mac_noasm.go
    │       │   │       ├── poly1305.go
    │       │   │       ├── sum_amd64.s
    │       │   │       ├── sum_asm.go
    │       │   │       ├── sum_generic.go
    │       │   │       ├── sum_loong64.s
    │       │   │       ├── sum_ppc64x.s
    │       │   │       ├── sum_s390x.go
    │       │   │       └── sum_s390x.s
    │       │   └── ssh/
    │       │       ├── buffer.go
    │       │       ├── certs.go
    │       │       ├── channel.go
    │       │       ├── cipher.go
    │       │       ├── client.go
    │       │       ├── client_auth.go
    │       │       ├── common.go
    │       │       ├── connection.go
    │       │       ├── doc.go
    │       │       ├── handshake.go
    │       │       ├── internal/
    │       │       │   └── bcrypt_pbkdf/
    │       │       │       └── bcrypt_pbkdf.go
    │       │       ├── kex.go
    │       │       ├── keys.go
    │       │       ├── mac.go
    │       │       ├── messages.go
    │       │       ├── mux.go
    │       │       ├── server.go
    │       │       ├── session.go
    │       │       ├── ssh_gss.go
    │       │       ├── streamlocal.go
    │       │       ├── tcpip.go
    │       │       └── transport.go
    │       ├── net/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   └── context/
    │       │       └── context.go
    │       ├── sync/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   └── errgroup/
    │       │       └── errgroup.go
    │       ├── sys/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   ├── cpu/
    │       │   │   ├── asm_aix_ppc64.s
    │       │   │   ├── asm_darwin_x86_gc.s
    │       │   │   ├── byteorder.go
    │       │   │   ├── cpu.go
    │       │   │   ├── cpu_aix.go
    │       │   │   ├── cpu_arm.go
    │       │   │   ├── cpu_arm64.go
    │       │   │   ├── cpu_arm64.s
    │       │   │   ├── cpu_darwin_x86.go
    │       │   │   ├── cpu_gc_arm64.go
    │       │   │   ├── cpu_gc_s390x.go
    │       │   │   ├── cpu_gc_x86.go
    │       │   │   ├── cpu_gc_x86.s
    │       │   │   ├── cpu_gccgo_arm64.go
    │       │   │   ├── cpu_gccgo_s390x.go
    │       │   │   ├── cpu_gccgo_x86.c
    │       │   │   ├── cpu_gccgo_x86.go
    │       │   │   ├── cpu_linux.go
    │       │   │   ├── cpu_linux_arm.go
    │       │   │   ├── cpu_linux_arm64.go
    │       │   │   ├── cpu_linux_loong64.go
    │       │   │   ├── cpu_linux_mips64x.go
    │       │   │   ├── cpu_linux_noinit.go
    │       │   │   ├── cpu_linux_ppc64x.go
    │       │   │   ├── cpu_linux_riscv64.go
    │       │   │   ├── cpu_linux_s390x.go
    │       │   │   ├── cpu_loong64.go
    │       │   │   ├── cpu_loong64.s
    │       │   │   ├── cpu_mips64x.go
    │       │   │   ├── cpu_mipsx.go
    │       │   │   ├── cpu_netbsd_arm64.go
    │       │   │   ├── cpu_openbsd_arm64.go
    │       │   │   ├── cpu_openbsd_arm64.s
    │       │   │   ├── cpu_other_arm.go
    │       │   │   ├── cpu_other_arm64.go
    │       │   │   ├── cpu_other_mips64x.go
    │       │   │   ├── cpu_other_ppc64x.go
    │       │   │   ├── cpu_other_riscv64.go
    │       │   │   ├── cpu_other_x86.go
    │       │   │   ├── cpu_ppc64x.go
    │       │   │   ├── cpu_riscv64.go
    │       │   │   ├── cpu_s390x.go
    │       │   │   ├── cpu_s390x.s
    │       │   │   ├── cpu_wasm.go
    │       │   │   ├── cpu_x86.go
    │       │   │   ├── cpu_zos.go
    │       │   │   ├── cpu_zos_s390x.go
    │       │   │   ├── endian_big.go
    │       │   │   ├── endian_little.go
    │       │   │   ├── hwcap_linux.go
    │       │   │   ├── parse.go
    │       │   │   ├── proc_cpuinfo_linux.go
    │       │   │   ├── runtime_auxv.go
    │       │   │   ├── runtime_auxv_go121.go
    │       │   │   ├── syscall_aix_gccgo.go
    │       │   │   ├── syscall_aix_ppc64_gc.go
    │       │   │   └── syscall_darwin_x86_gc.go
    │       │   ├── plan9/
    │       │   │   ├── asm.s
    │       │   │   ├── asm_plan9_386.s
    │       │   │   ├── asm_plan9_amd64.s
    │       │   │   ├── asm_plan9_arm.s
    │       │   │   ├── const_plan9.go
    │       │   │   ├── dir_plan9.go
    │       │   │   ├── env_plan9.go
    │       │   │   ├── errors_plan9.go
    │       │   │   ├── mkall.sh
    │       │   │   ├── mkerrors.sh
    │       │   │   ├── mksysnum_plan9.sh
    │       │   │   ├── pwd_go15_plan9.go
    │       │   │   ├── pwd_plan9.go
    │       │   │   ├── race.go
    │       │   │   ├── race0.go
    │       │   │   ├── str.go
    │       │   │   ├── syscall.go
    │       │   │   ├── syscall_plan9.go
    │       │   │   ├── zsyscall_plan9_386.go
    │       │   │   ├── zsyscall_plan9_amd64.go
    │       │   │   ├── zsyscall_plan9_arm.go
    │       │   │   └── zsysnum_plan9.go
    │       │   ├── unix/
    │       │   │   ├── .gitignore
    │       │   │   ├── README.md
    │       │   │   ├── affinity_linux.go
    │       │   │   ├── aliases.go
    │       │   │   ├── asm_aix_ppc64.s
    │       │   │   ├── asm_bsd_386.s
    │       │   │   ├── asm_bsd_amd64.s
    │       │   │   ├── asm_bsd_arm.s
    │       │   │   ├── asm_bsd_arm64.s
    │       │   │   ├── asm_bsd_ppc64.s
    │       │   │   ├── asm_bsd_riscv64.s
    │       │   │   ├── asm_linux_386.s
    │       │   │   ├── asm_linux_amd64.s
    │       │   │   ├── asm_linux_arm.s
    │       │   │   ├── asm_linux_arm64.s
    │       │   │   ├── asm_linux_loong64.s
    │       │   │   ├── asm_linux_mips64x.s
    │       │   │   ├── asm_linux_mipsx.s
    │       │   │   ├── asm_linux_ppc64x.s
    │       │   │   ├── asm_linux_riscv64.s
    │       │   │   ├── asm_linux_s390x.s
    │       │   │   ├── asm_openbsd_mips64.s
    │       │   │   ├── asm_solaris_amd64.s
    │       │   │   ├── asm_zos_s390x.s
    │       │   │   ├── auxv.go
    │       │   │   ├── auxv_unsupported.go
    │       │   │   ├── bluetooth_linux.go
    │       │   │   ├── bpxsvc_zos.go
    │       │   │   ├── bpxsvc_zos.s
    │       │   │   ├── cap_freebsd.go
    │       │   │   ├── constants.go
    │       │   │   ├── dev_aix_ppc.go
    │       │   │   ├── dev_aix_ppc64.go
    │       │   │   ├── dev_darwin.go
    │       │   │   ├── dev_dragonfly.go
    │       │   │   ├── dev_freebsd.go
    │       │   │   ├── dev_linux.go
    │       │   │   ├── dev_netbsd.go
    │       │   │   ├── dev_openbsd.go
    │       │   │   ├── dev_zos.go
    │       │   │   ├── dirent.go
    │       │   │   ├── endian_big.go
    │       │   │   ├── endian_little.go
    │       │   │   ├── env_unix.go
    │       │   │   ├── fcntl.go
    │       │   │   ├── fcntl_darwin.go
    │       │   │   ├── fcntl_linux_32bit.go
    │       │   │   ├── fdset.go
    │       │   │   ├── gccgo.go
    │       │   │   ├── gccgo_c.c
    │       │   │   ├── gccgo_linux_amd64.go
    │       │   │   ├── ifreq_linux.go
    │       │   │   ├── ioctl_linux.go
    │       │   │   ├── ioctl_signed.go
    │       │   │   ├── ioctl_unsigned.go
    │       │   │   ├── ioctl_zos.go
    │       │   │   ├── mkall.sh
    │       │   │   ├── mkerrors.sh
    │       │   │   ├── mmap_nomremap.go
    │       │   │   ├── mremap.go
    │       │   │   ├── pagesize_unix.go
    │       │   │   ├── pledge_openbsd.go
    │       │   │   ├── ptrace_darwin.go
    │       │   │   ├── ptrace_ios.go
    │       │   │   ├── race.go
    │       │   │   ├── race0.go
    │       │   │   ├── readdirent_getdents.go
    │       │   │   ├── readdirent_getdirentries.go
    │       │   │   ├── sockcmsg_dragonfly.go
    │       │   │   ├── sockcmsg_linux.go
    │       │   │   ├── sockcmsg_unix.go
    │       │   │   ├── sockcmsg_unix_other.go
    │       │   │   ├── sockcmsg_zos.go
    │       │   │   ├── symaddr_zos_s390x.s
    │       │   │   ├── syscall.go
    │       │   │   ├── syscall_aix.go
    │       │   │   ├── syscall_aix_ppc.go
    │       │   │   ├── syscall_aix_ppc64.go
    │       │   │   ├── syscall_bsd.go
    │       │   │   ├── syscall_darwin.go
    │       │   │   ├── syscall_darwin_amd64.go
    │       │   │   ├── syscall_darwin_arm64.go
    │       │   │   ├── syscall_darwin_libSystem.go
    │       │   │   ├── syscall_dragonfly.go
    │       │   │   ├── syscall_dragonfly_amd64.go
    │       │   │   ├── syscall_freebsd.go
    │       │   │   ├── syscall_freebsd_386.go
    │       │   │   ├── syscall_freebsd_amd64.go
    │       │   │   ├── syscall_freebsd_arm.go
    │       │   │   ├── syscall_freebsd_arm64.go
    │       │   │   ├── syscall_freebsd_riscv64.go
    │       │   │   ├── syscall_hurd.go
    │       │   │   ├── syscall_hurd_386.go
    │       │   │   ├── syscall_illumos.go
    │       │   │   ├── syscall_linux.go
    │       │   │   ├── syscall_linux_386.go
    │       │   │   ├── syscall_linux_alarm.go
    │       │   │   ├── syscall_linux_amd64.go
    │       │   │   ├── syscall_linux_amd64_gc.go
    │       │   │   ├── syscall_linux_arm.go
    │       │   │   ├── syscall_linux_arm64.go
    │       │   │   ├── syscall_linux_gc.go
    │       │   │   ├── syscall_linux_gc_386.go
    │       │   │   ├── syscall_linux_gc_arm.go
    │       │   │   ├── syscall_linux_gccgo_386.go
    │       │   │   ├── syscall_linux_gccgo_arm.go
    │       │   │   ├── syscall_linux_loong64.go
    │       │   │   ├── syscall_linux_mips64x.go
    │       │   │   ├── syscall_linux_mipsx.go
    │       │   │   ├── syscall_linux_ppc.go
    │       │   │   ├── syscall_linux_ppc64x.go
    │       │   │   ├── syscall_linux_riscv64.go
    │       │   │   ├── syscall_linux_s390x.go
    │       │   │   ├── syscall_linux_sparc64.go
    │       │   │   ├── syscall_netbsd.go
    │       │   │   ├── syscall_netbsd_386.go
    │       │   │   ├── syscall_netbsd_amd64.go
    │       │   │   ├── syscall_netbsd_arm.go
    │       │   │   ├── syscall_netbsd_arm64.go
    │       │   │   ├── syscall_openbsd.go
    │       │   │   ├── syscall_openbsd_386.go
    │       │   │   ├── syscall_openbsd_amd64.go
    │       │   │   ├── syscall_openbsd_arm.go
    │       │   │   ├── syscall_openbsd_arm64.go
    │       │   │   ├── syscall_openbsd_libc.go
    │       │   │   ├── syscall_openbsd_mips64.go
    │       │   │   ├── syscall_openbsd_ppc64.go
    │       │   │   ├── syscall_openbsd_riscv64.go
    │       │   │   ├── syscall_solaris.go
    │       │   │   ├── syscall_solaris_amd64.go
    │       │   │   ├── syscall_unix.go
    │       │   │   ├── syscall_unix_gc.go
    │       │   │   ├── syscall_unix_gc_ppc64x.go
    │       │   │   ├── syscall_zos_s390x.go
    │       │   │   ├── sysvshm_linux.go
    │       │   │   ├── sysvshm_unix.go
    │       │   │   ├── sysvshm_unix_other.go
    │       │   │   ├── timestruct.go
    │       │   │   ├── unveil_openbsd.go
    │       │   │   ├── vgetrandom_linux.go
    │       │   │   ├── vgetrandom_unsupported.go
    │       │   │   ├── xattr_bsd.go
    │       │   │   ├── zerrors_aix_ppc.go
    │       │   │   ├── zerrors_aix_ppc64.go
    │       │   │   ├── zerrors_darwin_amd64.go
    │       │   │   ├── zerrors_darwin_arm64.go
    │       │   │   ├── zerrors_dragonfly_amd64.go
    │       │   │   ├── zerrors_freebsd_386.go
    │       │   │   ├── zerrors_freebsd_amd64.go
    │       │   │   ├── zerrors_freebsd_arm.go
    │       │   │   ├── zerrors_freebsd_arm64.go
    │       │   │   ├── zerrors_freebsd_riscv64.go
    │       │   │   ├── zerrors_linux.go
    │       │   │   ├── zerrors_linux_386.go
    │       │   │   ├── zerrors_linux_amd64.go
    │       │   │   ├── zerrors_linux_arm.go
    │       │   │   ├── zerrors_linux_arm64.go
    │       │   │   ├── zerrors_linux_loong64.go
    │       │   │   ├── zerrors_linux_mips.go
    │       │   │   ├── zerrors_linux_mips64.go
    │       │   │   ├── zerrors_linux_mips64le.go
    │       │   │   ├── zerrors_linux_mipsle.go
    │       │   │   ├── zerrors_linux_ppc.go
    │       │   │   ├── zerrors_linux_ppc64.go
    │       │   │   ├── zerrors_linux_ppc64le.go
    │       │   │   ├── zerrors_linux_riscv64.go
    │       │   │   ├── zerrors_linux_s390x.go
    │       │   │   ├── zerrors_linux_sparc64.go
    │       │   │   ├── zerrors_netbsd_386.go
    │       │   │   ├── zerrors_netbsd_amd64.go
    │       │   │   ├── zerrors_netbsd_arm.go
    │       │   │   ├── zerrors_netbsd_arm64.go
    │       │   │   ├── zerrors_openbsd_386.go
    │       │   │   ├── zerrors_openbsd_amd64.go
    │       │   │   ├── zerrors_openbsd_arm.go
    │       │   │   ├── zerrors_openbsd_arm64.go
    │       │   │   ├── zerrors_openbsd_mips64.go
    │       │   │   ├── zerrors_openbsd_ppc64.go
    │       │   │   ├── zerrors_openbsd_riscv64.go
    │       │   │   ├── zerrors_solaris_amd64.go
    │       │   │   ├── zerrors_zos_s390x.go
    │       │   │   ├── zptrace_armnn_linux.go
    │       │   │   ├── zptrace_linux_arm64.go
    │       │   │   ├── zptrace_mipsnn_linux.go
    │       │   │   ├── zptrace_mipsnnle_linux.go
    │       │   │   ├── zptrace_x86_linux.go
    │       │   │   ├── zsymaddr_zos_s390x.s
    │       │   │   ├── zsyscall_aix_ppc.go
    │       │   │   ├── zsyscall_aix_ppc64.go
    │       │   │   ├── zsyscall_aix_ppc64_gc.go
    │       │   │   ├── zsyscall_aix_ppc64_gccgo.go
    │       │   │   ├── zsyscall_darwin_amd64.go
    │       │   │   ├── zsyscall_darwin_amd64.s
    │       │   │   ├── zsyscall_darwin_arm64.go
    │       │   │   ├── zsyscall_darwin_arm64.s
    │       │   │   ├── zsyscall_dragonfly_amd64.go
    │       │   │   ├── zsyscall_freebsd_386.go
    │       │   │   ├── zsyscall_freebsd_amd64.go
    │       │   │   ├── zsyscall_freebsd_arm.go
    │       │   │   ├── zsyscall_freebsd_arm64.go
    │       │   │   ├── zsyscall_freebsd_riscv64.go
    │       │   │   ├── zsyscall_illumos_amd64.go
    │       │   │   ├── zsyscall_linux.go
    │       │   │   ├── zsyscall_linux_386.go
    │       │   │   ├── zsyscall_linux_amd64.go
    │       │   │   ├── zsyscall_linux_arm.go
    │       │   │   ├── zsyscall_linux_arm64.go
    │       │   │   ├── zsyscall_linux_loong64.go
    │       │   │   ├── zsyscall_linux_mips.go
    │       │   │   ├── zsyscall_linux_mips64.go
    │       │   │   ├── zsyscall_linux_mips64le.go
    │       │   │   ├── zsyscall_linux_mipsle.go
    │       │   │   ├── zsyscall_linux_ppc.go
    │       │   │   ├── zsyscall_linux_ppc64.go
    │       │   │   ├── zsyscall_linux_ppc64le.go
    │       │   │   ├── zsyscall_linux_riscv64.go
    │       │   │   ├── zsyscall_linux_s390x.go
    │       │   │   ├── zsyscall_linux_sparc64.go
    │       │   │   ├── zsyscall_netbsd_386.go
    │       │   │   ├── zsyscall_netbsd_amd64.go
    │       │   │   ├── zsyscall_netbsd_arm.go
    │       │   │   ├── zsyscall_netbsd_arm64.go
    │       │   │   ├── zsyscall_openbsd_386.go
    │       │   │   ├── zsyscall_openbsd_386.s
    │       │   │   ├── zsyscall_openbsd_amd64.go
    │       │   │   ├── zsyscall_openbsd_amd64.s
    │       │   │   ├── zsyscall_openbsd_arm.go
    │       │   │   ├── zsyscall_openbsd_arm.s
    │       │   │   ├── zsyscall_openbsd_arm64.go
    │       │   │   ├── zsyscall_openbsd_arm64.s
    │       │   │   ├── zsyscall_openbsd_mips64.go
    │       │   │   ├── zsyscall_openbsd_mips64.s
    │       │   │   ├── zsyscall_openbsd_ppc64.go
    │       │   │   ├── zsyscall_openbsd_ppc64.s
    │       │   │   ├── zsyscall_openbsd_riscv64.go
    │       │   │   ├── zsyscall_openbsd_riscv64.s
    │       │   │   ├── zsyscall_solaris_amd64.go
    │       │   │   ├── zsyscall_zos_s390x.go
    │       │   │   ├── zsysctl_openbsd_386.go
    │       │   │   ├── zsysctl_openbsd_amd64.go
    │       │   │   ├── zsysctl_openbsd_arm.go
    │       │   │   ├── zsysctl_openbsd_arm64.go
    │       │   │   ├── zsysctl_openbsd_mips64.go
    │       │   │   ├── zsysctl_openbsd_ppc64.go
    │       │   │   ├── zsysctl_openbsd_riscv64.go
    │       │   │   ├── zsysnum_darwin_amd64.go
    │       │   │   ├── zsysnum_darwin_arm64.go
    │       │   │   ├── zsysnum_dragonfly_amd64.go
    │       │   │   ├── zsysnum_freebsd_386.go
    │       │   │   ├── zsysnum_freebsd_amd64.go
    │       │   │   ├── zsysnum_freebsd_arm.go
    │       │   │   ├── zsysnum_freebsd_arm64.go
    │       │   │   ├── zsysnum_freebsd_riscv64.go
    │       │   │   ├── zsysnum_linux_386.go
    │       │   │   ├── zsysnum_linux_amd64.go
    │       │   │   ├── zsysnum_linux_arm.go
    │       │   │   ├── zsysnum_linux_arm64.go
    │       │   │   ├── zsysnum_linux_loong64.go
    │       │   │   ├── zsysnum_linux_mips.go
    │       │   │   ├── zsysnum_linux_mips64.go
    │       │   │   ├── zsysnum_linux_mips64le.go
    │       │   │   ├── zsysnum_linux_mipsle.go
    │       │   │   ├── zsysnum_linux_ppc.go
    │       │   │   ├── zsysnum_linux_ppc64.go
    │       │   │   ├── zsysnum_linux_ppc64le.go
    │       │   │   ├── zsysnum_linux_riscv64.go
    │       │   │   ├── zsysnum_linux_s390x.go
    │       │   │   ├── zsysnum_linux_sparc64.go
    │       │   │   ├── zsysnum_netbsd_386.go
    │       │   │   ├── zsysnum_netbsd_amd64.go
    │       │   │   ├── zsysnum_netbsd_arm.go
    │       │   │   ├── zsysnum_netbsd_arm64.go
    │       │   │   ├── zsysnum_openbsd_386.go
    │       │   │   ├── zsysnum_openbsd_amd64.go
    │       │   │   ├── zsysnum_openbsd_arm.go
    │       │   │   ├── zsysnum_openbsd_arm64.go
    │       │   │   ├── zsysnum_openbsd_mips64.go
    │       │   │   ├── zsysnum_openbsd_ppc64.go
    │       │   │   ├── zsysnum_openbsd_riscv64.go
    │       │   │   ├── zsysnum_zos_s390x.go
    │       │   │   ├── ztypes_aix_ppc.go
    │       │   │   ├── ztypes_aix_ppc64.go
    │       │   │   ├── ztypes_darwin_amd64.go
    │       │   │   ├── ztypes_darwin_arm64.go
    │       │   │   ├── ztypes_dragonfly_amd64.go
    │       │   │   ├── ztypes_freebsd_386.go
    │       │   │   ├── ztypes_freebsd_amd64.go
    │       │   │   ├── ztypes_freebsd_arm.go
    │       │   │   ├── ztypes_freebsd_arm64.go
    │       │   │   ├── ztypes_freebsd_riscv64.go
    │       │   │   ├── ztypes_linux.go
    │       │   │   ├── ztypes_linux_386.go
    │       │   │   ├── ztypes_linux_amd64.go
    │       │   │   ├── ztypes_linux_arm.go
    │       │   │   ├── ztypes_linux_arm64.go
    │       │   │   ├── ztypes_linux_loong64.go
    │       │   │   ├── ztypes_linux_mips.go
    │       │   │   ├── ztypes_linux_mips64.go
    │       │   │   ├── ztypes_linux_mips64le.go
    │       │   │   ├── ztypes_linux_mipsle.go
    │       │   │   ├── ztypes_linux_ppc.go
    │       │   │   ├── ztypes_linux_ppc64.go
    │       │   │   ├── ztypes_linux_ppc64le.go
    │       │   │   ├── ztypes_linux_riscv64.go
    │       │   │   ├── ztypes_linux_s390x.go
    │       │   │   ├── ztypes_linux_sparc64.go
    │       │   │   ├── ztypes_netbsd_386.go
    │       │   │   ├── ztypes_netbsd_amd64.go
    │       │   │   ├── ztypes_netbsd_arm.go
    │       │   │   ├── ztypes_netbsd_arm64.go
    │       │   │   ├── ztypes_openbsd_386.go
    │       │   │   ├── ztypes_openbsd_amd64.go
    │       │   │   ├── ztypes_openbsd_arm.go
    │       │   │   ├── ztypes_openbsd_arm64.go
    │       │   │   ├── ztypes_openbsd_mips64.go
    │       │   │   ├── ztypes_openbsd_ppc64.go
    │       │   │   ├── ztypes_openbsd_riscv64.go
    │       │   │   ├── ztypes_solaris_amd64.go
    │       │   │   └── ztypes_zos_s390x.go
    │       │   └── windows/
    │       │       ├── aliases.go
    │       │       ├── dll_windows.go
    │       │       ├── env_windows.go
    │       │       ├── eventlog.go
    │       │       ├── exec_windows.go
    │       │       ├── memory_windows.go
    │       │       ├── mkerrors.bash
    │       │       ├── mkknownfolderids.bash
    │       │       ├── mksyscall.go
    │       │       ├── race.go
    │       │       ├── race0.go
    │       │       ├── security_windows.go
    │       │       ├── service.go
    │       │       ├── setupapi_windows.go
    │       │       ├── str.go
    │       │       ├── syscall.go
    │       │       ├── syscall_windows.go
    │       │       ├── types_windows.go
    │       │       ├── types_windows_386.go
    │       │       ├── types_windows_amd64.go
    │       │       ├── types_windows_arm.go
    │       │       ├── types_windows_arm64.go
    │       │       ├── zerrors_windows.go
    │       │       ├── zknownfolderids_windows.go
    │       │       └── zsyscall_windows.go
    │       ├── term/
    │       │   ├── CONTRIBUTING.md
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   ├── README.md
    │       │   ├── codereview.cfg
    │       │   ├── term.go
    │       │   ├── term_plan9.go
    │       │   ├── term_unix.go
    │       │   ├── term_unix_bsd.go
    │       │   ├── term_unix_other.go
    │       │   ├── term_unsupported.go
    │       │   ├── term_windows.go
    │       │   └── terminal.go
    │       └── text/
    │           ├── LICENSE
    │           ├── PATENTS
    │           ├── encoding/
    │           │   ├── charmap/
    │           │   │   ├── charmap.go
    │           │   │   └── tables.go
    │           │   ├── encoding.go
    │           │   ├── internal/
    │           │   │   ├── identifier/
    │           │   │   │   ├── identifier.go
    │           │   │   │   └── mib.go
    │           │   │   └── internal.go
    │           │   ├── japanese/
    │           │   │   ├── all.go
    │           │   │   ├── eucjp.go
    │           │   │   ├── iso2022jp.go
    │           │   │   ├── shiftjis.go
    │           │   │   └── tables.go
    │           │   ├── korean/
    │           │   │   ├── euckr.go
    │           │   │   └── tables.go
    │           │   ├── simplifiedchinese/
    │           │   │   ├── all.go
    │           │   │   ├── gbk.go
    │           │   │   ├── hzgb2312.go
    │           │   │   └── tables.go
    │           │   ├── traditionalchinese/
    │           │   │   ├── big5.go
    │           │   │   └── tables.go
    │           │   └── unicode/
    │           │       ├── override.go
    │           │       └── unicode.go
    │           ├── internal/
    │           │   └── utf8internal/
    │           │       └── utf8internal.go
    │           ├── runes/
    │           │   ├── cond.go
    │           │   └── runes.go
    │           └── transform/
    │               └── transform.go
    ├── gopkg.in/
    │   ├── natefinch/
    │   │   └── lumberjack.v2/
    │   │       ├── .gitignore
    │   │       ├── .travis.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── chown.go
    │   │       ├── chown_linux.go
    │   │       └── lumberjack.go
    │   └── yaml.v3/
    │       ├── LICENSE
    │       ├── NOTICE
    │       ├── README.md
    │       ├── apic.go
    │       ├── decode.go
    │       ├── emitterc.go
    │       ├── encode.go
    │       ├── parserc.go
    │       ├── readerc.go
    │       ├── resolve.go
    │       ├── scannerc.go
    │       ├── sorter.go
    │       ├── writerc.go
    │       ├── yaml.go
    │       ├── yamlh.go
    │       └── yamlprivateh.go
    └── modules.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/CODEOWNERS
================================================
* @rashiq @meiji163 @timvaillancourt


================================================
FILE: .github/CONTRIBUTING.md
================================================
## Contributing

Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great.

This project adheres to the [Open Code of Conduct](http://todogroup.org/opencodeofconduct/#gh-ost/opensource@github.com). By participating, you are expected to uphold this code.

## Submitting a pull request

0. [Fork](https://github.com/github/gh-ost/fork) and clone the repository
0. Create a new branch: `git checkout -b my-branch-name`
0. Make your change, add tests, and make sure the tests still pass
0. Push to your fork and [submit a pull request](https://github.com/github/gh-ost/compare)
0. Pat your self on the back and wait for your pull request to be reviewed and merged.

Here are a few things you can do that will increase the likelihood of your pull request being accepted:

- Follow the [style guide](https://golang.org/doc/effective_go.html#formatting).
- Write tests.
- Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as separate pull requests.
- Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).

## Development Guidelines

### Channel Safety

When working with channels in goroutines, it's critical to prevent deadlocks that can occur when a channel receiver exits due to an error while senders are still trying to send values. Always use `base.SendWithContext` for channel sends to avoid deadlocks:

```go
// ✅ CORRECT - Uses helper to prevent deadlock
if err := base.SendWithContext(ctx, ch, value); err != nil {
    return err  // context was cancelled
}

// ❌ WRONG - Can deadlock if receiver exits
ch <- value
```

Even if the destination channel is buffered, deadlocks could still occur if the buffer fills up and the receiver exits, so it's important to use `SendWithContext` in those cases as well.

## Resources

- [Contributing to Open Source on GitHub](https://guides.github.com/activities/contributing-to-open-source/)
- [Using Pull Requests](https://help.github.com/articles/using-pull-requests/)
- [GitHub Help](https://help.github.com)


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
> This is the place to report a bug, ask a question, or suggest an enhancement.

> This is also the place to make a discussion before creating a PR.

> If this is a bug report, please provide a test case (e.g., your table definition and gh-ost command) and the error output.

> Please use markdown to format code or SQL: https://guides.github.com/features/mastering-markdown/

> Please label the issue on the right (bug, enhancement, question, etc.).

> And please understand if this issue is not addressed immediately or in a timeframe you were expecting.

> Thank you!


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## A Pull Request should be associated with an Issue.

> We wish to have discussions in Issues. A single issue may be targeted by multiple PRs.
> If you're offering a new feature or fixing anything, we'd like to know beforehand in Issues,
> and potentially we'll be able to point development in a particular direction.

Related issue: https://github.com/github/gh-ost/issues/0123456789

> Further notes in https://github.com/github/gh-ost/blob/master/.github/CONTRIBUTING.md
> Thank you! We are open to PRs, but please understand if for technical reasons we are unable to accept each and any PR

### Description

This PR [briefly explain what it does]

> In case this PR introduced Go code changes:

- [ ] contributed code is using same conventions as original code
- [ ] `script/cibuild` returns with no formatting errors, build errors or unit test errors.


================================================
FILE: .github/dependabot.yml
================================================
---
version: 2
updates:
- package-ecosystem: github-actions
  directory: "/"
  schedule:
    interval: daily


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
permissions:
  contents: read

on: [pull_request]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Set up Go
      uses: actions/setup-go@v6
      with:
        go-version-file: go.mod

    - name: Build
      run: script/cibuild

    - name: Upload gh-ost binary artifact
      uses: actions/upload-artifact@v4
      with:
        name: gh-ost
        path: bin/gh-ost


================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL analysis"

on: 
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
  schedule:
    - cron: '25 22 * * 6'

jobs:
  codeql:
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ 'actions', 'go' ]

    runs-on: ubuntu-latest # windows-latest and ubuntu-latest are supported. macos-latest is not supported at this time. 

    steps:
    - name: Checkout repository
      uses: actions/checkout@v4
        
    - name: Initialize CodeQL 
      uses: github/codeql-action/init@v3
      with:
          languages: ${{ matrix.language }}
    
    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v3


================================================
FILE: .github/workflows/golangci-lint.yml
================================================
name: golangci-lint
on:
  push:
    branches:
      - master
  pull_request:
permissions:
  contents: read
  # Optional: allow read access to pull request. Use with `only-new-issues` option.
  # pull-requests: read
jobs:
  golangci:
    name: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v6
        with:
          go-version-file: go.mod
      - name: golangci-lint
        uses: golangci/golangci-lint-action@v6
        with:
          version: v1.61.0


================================================
FILE: .github/workflows/replica-tests.yml
================================================
name: migration tests
permissions:
  contents: read

on: [pull_request]

jobs:
  docker-tests:
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        image: ['mysql/mysql-server:5.7.41','mysql:8.0.41','mysql:8.4.3','percona/percona-server:8.0.41-32']
    env:
      TEST_MYSQL_IMAGE: ${{ matrix.image }}

    steps:
      - uses: actions/checkout@v4

      - name: Install sysbench
        run: |
          sudo apt-get update
          sudo apt-get install -y sysbench

      - name: Setup environment
        run: script/docker-gh-ost-replica-tests up

      - name: Run tests
        run: script/docker-gh-ost-replica-tests run

      - name: Set artifact name
        if: failure()
        run: |
          ARTIFACT_NAME=$(echo "${{ matrix.image }}" | tr '/:' '-')
          echo "ARTIFACT_NAME=test-logs-${ARTIFACT_NAME}" >> $GITHUB_ENV

      - name: Upload test logs on failure
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.ARTIFACT_NAME }}
          path: /tmp/gh-ost-test.*
          retention-days: 7

      - name: Teardown environment
        if: always()
        run: script/docker-gh-ost-replica-tests down


================================================
FILE: .gitignore
================================================
/.gopath/
/bin/
/libexec/
/.vendor/
.idea/
*.tmp


================================================
FILE: .golangci.yml
================================================
run:
  timeout: 5m
linters:
  disable:
    - errcheck
  enable:
    - bodyclose
    - containedctx
    - contextcheck
    - dogsled
    - durationcheck
    - errname
    - errorlint
    - gofmt
    - misspell
    - nilerr
    - nilnil
    - noctx
    - nolintlint
    - nosprintfhostport
    - prealloc
    - rowserrcheck
    - sqlclosecheck
    - unconvert
    - unparam
    - unused
    - wastedassign
    - whitespace


================================================
FILE: Dockerfile.packaging
================================================
FROM golang:1.23-bullseye

RUN apt-get update
RUN apt-get install -y ruby ruby-dev rubygems build-essential
RUN gem install fpm
ENV GOPATH=/tmp/go

RUN apt-get install -y curl
RUN apt-get install -y rsync
RUN apt-get install -y gcc
RUN apt-get install -y g++
RUN apt-get install -y bash
RUN apt-get install -y git
RUN apt-get install -y tar
RUN apt-get install -y rpm

RUN mkdir -p $GOPATH/src/github.com/github/gh-ost
WORKDIR $GOPATH/src/github.com/github/gh-ost
COPY . .
RUN bash build.sh


================================================
FILE: Dockerfile.test
================================================
FROM golang:1.23-bullseye
LABEL maintainer="github@github.com"

RUN apt-get update
RUN apt-get install -y lsb-release
RUN rm -rf /var/lib/apt/lists/*

COPY . /go/src/github.com/github/gh-ost
WORKDIR /go/src/github.com/github/gh-ost

CMD ["script/test"]


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2016 GitHub

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# gh-ost

[![ci](https://github.com/github/gh-ost/actions/workflows/ci.yml/badge.svg)](https://github.com/github/gh-ost/actions/workflows/ci.yml) [![replica-tests](https://github.com/github/gh-ost/actions/workflows/replica-tests.yml/badge.svg)](https://github.com/github/gh-ost/actions/workflows/replica-tests.yml) [![downloads](https://img.shields.io/github/downloads/github/gh-ost/total.svg)](https://github.com/github/gh-ost/releases) [![release](https://img.shields.io/github/release/github/gh-ost.svg)](https://github.com/github/gh-ost/releases)

#### GitHub's online schema migration for MySQL <img src="doc/images/gh-ost-logo-light-160.png" align="right">

 `gh-ost` is a triggerless online schema migration solution for MySQL. It is testable and provides pausability, dynamic control/reconfiguration, auditing, and many operational perks.

`gh-ost` produces a light workload on the master throughout the migration, decoupled from the existing workload on the migrated table.

It has been designed based on years of experience with existing solutions, and changes the paradigm of table migrations.



## How?

All existing online-schema-change tools operate in similar manner: they create a _ghost_ table in the likeness of your original table, migrate that table while empty, slowly and incrementally copy data from your original table to the _ghost_ table, meanwhile propagating ongoing changes (any `INSERT`, `DELETE`, `UPDATE` applied to your table) to the _ghost_ table. Finally, at the right time, they replace your original table with the _ghost_ table.

`gh-ost` uses the same pattern. However it differs from all existing tools by not using triggers. We have recognized the triggers to be the source of [many limitations and risks](doc/why-triggerless.md).

Instead, `gh-ost` [uses the binary log stream](doc/triggerless-design.md) to capture table changes, and asynchronously applies them onto the _ghost_ table. `gh-ost` takes upon itself some tasks that other tools leave for the database to perform. As result, `gh-ost` has greater control over the migration process; can truly suspend it; can truly decouple the migration's write load from the master's workload.

In addition, it offers many [operational perks](doc/perks.md) that make it safer, trustworthy and fun to use.

![gh-ost general flow](doc/images/gh-ost-general-flow.png)

## Highlights

- Build your trust in `gh-ost` by testing it on replicas. `gh-ost` will issue same flow as it would have on the master, to migrate a table on a replica, without actually replacing the original table, leaving the replica with two tables you can then compare and satisfy yourself that the tool operates correctly. This is how we continuously test `gh-ost` in production.
- True pause: when `gh-ost` [throttles](doc/throttle.md), it truly ceases writes on master: no row copies and no ongoing events processing. By throttling, you return your master to its original workload
- Dynamic control: you can [interactively](doc/interactive-commands.md) reconfigure `gh-ost`, even as migration still runs. You may forcibly initiate throttling.
- Auditing: you may query `gh-ost` for status. `gh-ost` listens on unix socket or TCP.
- Control over cut-over phase: `gh-ost` can be instructed to postpone what is probably the most critical step: the swap of tables, until such time that you're comfortably available. No need to worry about ETA being outside office hours.
- External [hooks](doc/hooks.md) can couple `gh-ost` with your particular environment.

Please refer to the [docs](doc) for more information. No, really, read the [docs](doc).

## Usage

The [cheatsheet](doc/cheatsheet.md) has it all. You may be interested in invoking `gh-ost` in various modes:

- a _noop_ migration (merely testing that the migration is valid and good to go)
- a real migration, utilizing a replica (the migration runs on the master; `gh-ost` figures out identities of servers involved. Required mode if your master uses Statement Based Replication)
- a real migration, run directly on the master (but `gh-ost` prefers the former)
- a real migration on a replica (master untouched)
- a test migration on a replica, the way for you to build trust with `gh-ost`'s operation.

Our tips:

- [Testing above all](doc/testing-on-replica.md), try out `--test-on-replica` first few times. Better yet, make it continuous. We have multiple replicas where we iterate our entire fleet of production tables, migrating them one by one, checksumming the results, verifying migration is good.
- For each master migration, first issue a _noop_
- Then issue the real thing via `--execute`.

More tips:

- Use `--exact-rowcount` for accurate progress indication
- Use `--postpone-cut-over-flag-file` to gain control over cut-over timing
- Get familiar with the [interactive commands](doc/interactive-commands.md)

Also see:

- [requirements and limitations](doc/requirements-and-limitations.md)
- [common questions](doc/questions.md)
- [what if?](doc/what-if.md)
- [the fine print](doc/the-fine-print.md)
- [Community questions](https://github.com/github/gh-ost/issues?q=label%3Aquestion)
- [Using `gh-ost` on AWS RDS](doc/rds.md)
- [Using `gh-ost` on Azure Database for MySQL](doc/azure.md)

## What's in a name?

Originally this was named `gh-osc`: GitHub Online Schema Change, in the likes of [Facebook online schema change](https://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932/) and [pt-online-schema-change](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html).

But then a rare genetic mutation happened, and the `c` transformed into `t`. And that sent us down the path of trying to figure out a new acronym. `gh-ost` (pronounce: _Ghost_), stands for GitHub's Online Schema Transmogrifier/Translator/Transformer/Transfigurator

## License

`gh-ost` is licensed under the [MIT license](https://github.com/github/gh-ost/blob/master/LICENSE)

`gh-ost` uses 3rd party libraries, each with their own license. These are found [here](https://github.com/github/gh-ost/tree/master/vendor).

## Community

`gh-ost` is released at a stable state, but with mileage to go. We are [open to pull requests](https://github.com/github/gh-ost/blob/master/.github/CONTRIBUTING.md). Please first discuss your intentions via [Issues](https://github.com/github/gh-ost/issues).

We develop `gh-ost` at GitHub and for the community. We may have different priorities than others. From time to time we may suggest a contribution that is not on our immediate roadmap but which may appeal to others.

Please see [Coding gh-ost](doc/coding-ghost.md) for a guide to getting started developing with gh-ost.

## Download/binaries/source

`gh-ost` is now GA and stable.

`gh-ost` is available in binary format for Linux and Mac OS/X

[Download latest release here](https://github.com/github/gh-ost/releases/latest)

`gh-ost` is a Go project; it is built with Go `1.15` and above. To build on your own, use either:
- [script/build](https://github.com/github/gh-ost/blob/master/script/build) - this is the same build script used by CI hence the authoritative; artifact is `./bin/gh-ost` binary.
- [build.sh](https://github.com/github/gh-ost/blob/master/build.sh) for building `tar.gz` artifacts in `/tmp/gh-ost-release`

Generally speaking, `master` branch is stable, but only [releases](https://github.com/github/gh-ost/releases) are to be used in production.

## Authors

`gh-ost` is designed, authored, reviewed and tested by the database infrastructure team at GitHub:
- [@jonahberquist](https://github.com/jonahberquist)
- [@ggunson](https://github.com/ggunson)
- [@tomkrouper](https://github.com/tomkrouper)
- [@shlomi-noach](https://github.com/shlomi-noach)
- [@jessbreckenridge](https://github.com/jessbreckenridge)
- [@gtowey](https://github.com/gtowey)
- [@timvaillancourt](https://github.com/timvaillancourt)


================================================
FILE: build.sh
================================================
#!/bin/bash

RELEASE_VERSION=
buildpath=

function setuptree() {
  b=$( mktemp -d $buildpath/gh-ostXXXXXX ) || return 1
  mkdir -p $b/gh-ost
  mkdir -p $b/gh-ost/usr/bin
  echo $b
}

function build {
  osname=$1
  osshort=$2
  GOOS=$3
  GOARCH=$4

  if ! go version | egrep -q 'go1\.(1[5-9]|[2-9][0-9]{1})' ; then
    echo "go version must be 1.15 or above"
    exit 1
  fi

  echo "Building ${osname}-${GOARCH} binary"
  export GOOS
  export GOARCH
  go build -ldflags "$ldflags" -o $buildpath/$target go/cmd/gh-ost/main.go

  if [ $? -ne 0 ]; then
      echo "Build failed for ${osname} ${GOARCH}."
      exit 1
  fi

  (cd $buildpath && tar cfz ./gh-ost-binary-${osshort}-${GOARCH}-${timestamp}.tar.gz $target)

  # build RPM and deb for Linux, x86-64 only
  if [ "$GOOS" == "linux" ] && [ "$GOARCH" == "amd64" ] ; then
    echo "Creating Distro full packages"
    builddir=$(setuptree)
    cp $buildpath/$target $builddir/gh-ost/usr/bin
    cd $buildpath
    fpm -v "${RELEASE_VERSION}" --epoch 1 -f -s dir -n gh-ost -m 'GitHub' --description "GitHub's Online Schema Migrations for MySQL " --url "https://github.com/github/gh-ost" --vendor "GitHub" --license "Apache 2.0" -C $builddir/gh-ost --prefix=/ -t rpm --rpm-rpmbuild-define "_build_id_links none" --rpm-os linux .
    fpm -v "${RELEASE_VERSION}" --epoch 1 -f -s dir -n gh-ost -m 'GitHub' --description "GitHub's Online Schema Migrations for MySQL " --url "https://github.com/github/gh-ost" --vendor "GitHub" --license "Apache 2.0" -C $builddir/gh-ost --prefix=/ -t deb --deb-no-default-config-files .
    cd -
  fi
}

main() {
  if [ -z "${RELEASE_VERSION}" ] ; then
    RELEASE_VERSION=$(git describe --abbrev=0 --tags | tr -d 'v')
  fi
  if [ -z "${RELEASE_VERSION}" ] ; then
    echo "RELEASE_VERSION must be set"
    exit 1
  fi

  if [ -z "${GIT_COMMIT}" ]; then
    GIT_COMMIT=$(git rev-parse HEAD)
  fi

  buildpath=/tmp/gh-ost-release
  target=gh-ost
  timestamp=$(date "+%Y%m%d%H%M%S")
  ldflags="-X main.AppVersion=${RELEASE_VERSION} -X main.GitCommit=${GIT_COMMIT}"

  mkdir -p ${buildpath}
  rm -rf ${buildpath:?}/*
  build GNU/Linux linux linux amd64
  build GNU/Linux linux linux arm64
  build macOS osx darwin amd64
  build macOS osx darwin arm64

  bin_files=$(find $buildpath/gh-ost* -type f -maxdepth 1)
  echo "Binaries found in:"
  echo "$bin_files"

  echo "Checksums:"
  (shasum -a256 $bin_files 2>/dev/null)

  echo "Build Success!"
}

main "$@"


================================================
FILE: doc/azure.md
================================================
`gh-ost` has been updated to work with Azure Database for MySQL however due to GitHub does not use it, this documentation is community driven so if you find a bug please [open an issue][new_issue]!

# Azure Database for MySQL

## Limitations

- `gh-ost` runs should be setup use [`--assume-rbr`][assume_rbr_docs] and use `binlog_row_image=FULL`.
- Azure Database for MySQL does not use same user name suffix for master and replica, so master host, user and password need to be pointed out. 

## Step
1. Change the replica server's `binlog_row_image` from `MINIMAL` to `FULL`. See [guide](https://docs.microsoft.com/en-us/azure/mysql/howto-server-parameters) on Azure document.
2. Use your `gh-ost` always with additional 5 parameter
```{bash}
gh-ost \
--azure \
--assume-master-host=master-server-dns-name \
--master-user="master-user-name" \
--master-password="master-password" \
--assume-rbr \
[-- other parameters you need]
```


[new_issue]: https://github.com/github/gh-ost/issues/new
[assume_rbr_docs]: https://github.com/github/gh-ost/blob/master/doc/command-line-flags.md#assume-rbr
[migrate_test_on_replica_docs]: https://github.com/github/gh-ost/blob/master/doc/cheatsheet.md#c-migratetest-on-replica


================================================
FILE: doc/cheatsheet.md
================================================
# Cheatsheet

### Operation modes

![operation modes](images/gh-ost-operation-modes.png)


`gh-ost` operates by connecting to potentially multiple servers, as well as imposing itself as a replica in order to streamline binary log events directly from one of those servers. There are various operation modes, which depend on your setup, configuration, and where you want to run the migration.

#### a. Connect to replica, migrate on master

This is the mode `gh-ost` expects by default. `gh-ost` will investigate the replica, crawl up to find the topology's master, and will hook onto it as well. Migration will:

- Read and write row-data on master
- Read binary logs events on the replica, apply the changes onto the master
- Investigates table format, columns & keys, count rows on the replica
- Read internal changelog events (such as heartbeat) from the replica
- Cut-over (switch tables) on the master

If your master works with SBR, this is the mode to work with. The replica must be configured with binary logs enabled (`log_bin`, `log_slave_updates`) and should have `binlog_format=ROW` (`gh-ost` can apply the latter for you).

However even with RBR we suggest this is the least master-intrusive operation mode.

```shell
gh-ost \
--max-load=Threads_running=25 \
--critical-load=Threads_running=1000 \
--chunk-size=1000 \
--throttle-control-replicas="myreplica.1.com,myreplica.2.com" \
--max-lag-millis=1500 \
--user="gh-ost" \
--password="123456" \
--host=replica.with.rbr.com \
--database="my_schema" \
--table="my_table" \
--verbose \
--alter="engine=innodb" \
--switch-to-rbr \
--allow-master-master \
--cut-over=default \
--exact-rowcount \
--concurrent-rowcount \
--default-retries=120 \
--panic-flag-file=/tmp/ghost.panic.flag \
--postpone-cut-over-flag-file=/tmp/ghost.postpone.flag \
[--execute]
```

With `--execute`, migration actually copies data and flips tables. Without it this is a `noop` run.


#### b. Connect to master

If you don't have replicas, or do not wish to use them, you are still able to operate directly on the master. `gh-ost` will do all operations directly on the master. You may still ask it to be considerate of replication lag.

- Your master must produce binary logs in RBR format.
- You must approve this mode via `--allow-on-master`.

```shell
gh-ost \
--max-load=Threads_running=25 \
--critical-load=Threads_running=1000 \
--chunk-size=1000 \
--throttle-control-replicas="myreplica.1.com,myreplica.2.com" \
--max-lag-millis=1500 \
--user="gh-ost" \
--password="123456" \
--host=master.with.rbr.com \
--allow-on-master \
--database="my_schema" \
--table="my_table" \
--verbose \
--alter="engine=innodb" \
--switch-to-rbr \
--allow-master-master \
--cut-over=default \
--exact-rowcount \
--concurrent-rowcount \
--default-retries=120 \
--panic-flag-file=/tmp/ghost.panic.flag \
--postpone-cut-over-flag-file=/tmp/ghost.postpone.flag \
[--execute]
```

#### c. Migrate/test on replica

This will perform a migration on the replica. `gh-ost` will briefly connect to the master but will thereafter perform all operations on the replica without modifying anything on the master.
Throughout the operation, `gh-ost` will throttle such that the replica is up to date.

- `--migrate-on-replica` indicates to `gh-ost` that it must migrate the table directly on the replica. It will perform the cut-over phase even while replication is running.
- `--test-on-replica` indicates the migration is for purpose of testing only. Before cut-over takes place, replication is stopped. Tables are swapped and then swapped back: your original table returns to its original place.
Both tables are left with replication stopped. You may examine the two and compare data.

Test on replica cheatsheet:
```shell
gh-ost \
  --user="gh-ost" \
  --password="123456" \
  --host=replica.with.rbr.com \
  --test-on-replica \
  --database="my_schema" \
  --table="my_table" \
  --verbose \
  --alter="engine=innodb" \
  --initially-drop-ghost-table \
  --initially-drop-old-table \
  --max-load=Threads_running=30 \
  --switch-to-rbr \
  --chunk-size=500 \
  --cut-over=default \
  --exact-rowcount \
  --concurrent-rowcount \
  --serve-socket-file=/tmp/gh-ost.test.sock \
  --panic-flag-file=/tmp/gh-ost.panic.flag \
  --execute
```

### cnf file

You may use a `cnf` file in the following format:

```
[client]
user=gh-ost
password=123456
```

You may then remove `--user=gh-ost --password=123456` and specify `--conf=/path/to/config/file.cnf`


### Special configurations

#### Master-master

Master-master setups are supported, but at this time only active-passive. An active-active setup, where both masters write to the migrated table, is not supported at this stage. `gh-ost` requires you to acknowledge master-master via:

```
gh-ost --allow-master-master
```

`gh-ost` will pick one of the masters to work on. You may additionally force `gh-ost` to pick a particular master of your choice:

```
gh-ost --allow-master-master --assume-master-host=a.specific.master.com
```

#### Tungsten

Topologies using _tungsten replicator_ are peculiar in that the participating servers are not actually aware they are replicating. The _tungsten replicator_ looks just like another app issuing queries on those hosts. `gh-ost` is unable to identify that a server participates in a _tungsten_ topology.

If you choose to migrate directly on master (see above), there's nothing special you need to do.

If you choose to migrate via replica, then you need to make sure Tungsten is configured with log-slave-updates parameter (note this is different from MySQL's own log-slave-updates parameter), otherwise changes will not be in the replica's binlog, causing data to be corrupted after table swap. You must also supply the identity of the master, and indicate this is a tungsten setup, as follows:

```
gh-ost --tungsten --assume-master-host=the.topology.master.com
```

Also note that `--switch-to-rbr` does not work for a Tungsten setup as the replication process is external, so you need to make sure `binlog_format` is set to ROW before Tungsten Replicator connects to the server and starts applying events from the master.

### Concurrent migrations

It is possible to run concurrent `gh-ost` migrations.

- Never on the exact same table.
- If running on different replicas, (e.g. `table1` on `replica1` and `table2` on `replica2`) then no further configuration required.
- If running from same server (binaries run on same server, regardless of which replica/replicas are used):
  - Make sure not to specify same `-serve-socket-file` (or let `gh-ost` pick one for you).
  - You may choose to use same `-throttle-flag-file` (preferably use `-throttle-additional-flag-file`, this is exactly the reason there's two, this latter file is for sharing).
  - You may choose to use same `-panic-flag-file`. This all depends on your flow and how you'd like to control your migrations.
- If using same inspected box (either master or replica, `--host=everyone.uses.this.host`) then for each `gh-ost` process you must also provide a different, unique `--replica-server-id`. Optionally use process ID (`$$` in shell) ; but it's on you to choose a number that does not collide with another `gh-ost` or another running replica.


================================================
FILE: doc/coding-ghost.md
================================================
# Getting started with gh-ost development.

## Overview

Getting started with gh-ost development is simple!

- First obtain the repository with `git clone` or `go get`.
- From inside of the repository run `script/cibuild`.
- This will bootstrap the environment if needed, format the code, build the code, and then run the unit test.

## CI build workflow

`script/cibuild` performs the following actions will bootstrap the environment to build `gh-ost` correctly, build, perform syntax checks and run unit tests.

If additional steps are needed, please add them into this workflow so that the workflow remains simple.

## `golang-ci` linter

To enfore best-practices, Pull Requests are automatically linted by [`golang-ci`](https://golangci-lint.run/). The linter config is located at [`.golangci.yml`](https://github.com/github/gh-ost/blob/master/.golangci.yml) and the `golangci-lint` GitHub Action is located at [`.github/workflows/golangci-lint.yml`](https://github.com/github/gh-ost/blob/master/.github/workflows/golangci-lint.yml).

To run the `golang-ci` linters locally _(recommended before push)_, use `script/lint`.

## Notes:

Currently, `script/ensure-go-installed` will install `go` for Mac OS X and Linux. We welcome PR's to add other platforms.


================================================
FILE: doc/command-line-flags.md
================================================
# Command line flags

A more in-depth discussion of various `gh-ost` command line flags: implementation, implication, use cases.

### aliyun-rds

Add this flag when executing on Aliyun RDS.

### allow-zero-in-date

Allows the user to make schema changes that include a zero date or zero in date (e.g. adding a `datetime default '0000-00-00 00:00:00'` column), even if global `sql_mode` on MySQL has `NO_ZERO_IN_DATE,NO_ZERO_DATE`.

###  azure

Add this flag when executing on Azure Database for MySQL.

### allow-master-master

See [`--assume-master-host`](#assume-master-host).

### allow-on-master

By default, `gh-ost` would like you to connect to a replica, from where it figures out the master by itself. This wiring is required should your master execute using `binlog_format=STATEMENT`.

If, for some reason, you do not wish `gh-ost` to connect to a replica, you may connect it directly to the master and approve this via `--allow-on-master`.

### allow-setup-metadata-lock-instruments

`--allow-setup-metadata-lock-instruments` allows gh-ost to enable the [`metadata_locks`](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-metadata-locks-table.html) table in `performance_schema`, if it is not already enabled. This is used for a safety check before cut-over.
See also: [`skip-metadata-lock-check`](#skip-metadata-lock-check)

### approve-renamed-columns

When your migration issues a column rename (`change column old_name new_name ...`) `gh-ost` analyzes the statement to try and associate the old column name with new column name. Otherwise, the new structure may also look like some column was dropped and another was added.

`gh-ost` will print out what it thinks the _rename_ implied, but will not issue the migration unless you provide with `--approve-renamed-columns`.

If you think `gh-ost` is mistaken and that there's actually no _rename_ involved, you may pass [`--skip-renamed-columns`](#skip-renamed-columns) instead. This will cause `gh-ost` to disassociate the column values; data will not be copied between those columns.

### assume-master-host

`gh-ost` infers the identity of the master server by crawling up the replication topology. You may explicitly tell `gh-ost` the identity of the master host via `--assume-master-host=the.master.com`. This is useful in:

- _master-master_ topologies (together with [`--allow-master-master`](#allow-master-master)), where `gh-ost` can arbitrarily pick one of the co-masters, and you prefer that it picks a specific one
- _tungsten replicator_ topologies (together with [`--tungsten`](#tungsten)), where `gh-ost` is unable to crawl and detect the master

### assume-rbr

If you happen to _know_ your servers use RBR (Row Based Replication, i.e. `binlog_format=ROW`), you may specify `--assume-rbr`. This skips a verification step where `gh-ost` would issue a `STOP SLAVE; START SLAVE`.
Skipping this step means `gh-ost` would not need the `SUPER` privilege in order to operate.
You may want to use this on Amazon RDS.

### attempt-instant-ddl

MySQL 8.0 supports "instant DDL" for some operations. If an alter statement can be completed with instant DDL, only a metadata change is required internally. Instant operations include:

- Adding a column
- Dropping a column
- Dropping an index
- Extending a varchar column
- Adding a virtual generated column

It is not reliable to parse the `ALTER` statement to determine if it is instant or not. This is because the table might be in an older row format, or have some other incompatibility that is difficult to identify.

`--attempt-instant-ddl` is disabled by default, but the risks of enabling it are relatively minor: `gh-ost` may need to acquire a metadata lock at the start of the operation. This is not a problem for most scenarios, but it could be a problem for users that start the DDL during a period with long running transactions.

`gh-ost` will automatically fallback to the normal DDL process if the attempt to use instant DDL is unsuccessful.

### binlogsyncer-max-reconnect-attempts
`--binlogsyncer-max-reconnect-attempts=0`, the maximum number of attempts to re-establish a broken inspector connection for sync binlog. `0` or `negative number` means infinite retry, default `0`

### checkpoint

`--checkpoint` enables periodic checkpoints of the gh-ost's state so that gh-ost can resume a migration from the checkpoint with `--resume`. Checkpoints are written to a separate table named `_${original_table_name}_ghk`. It is recommended to use with `--gtid` for checkpoints.
See also: [`resuming-migrations`](resume.md)

### checkpoint-seconds

`--checkpoint-seconds` specifies the seconds between checkpoints. Default is 300.

### conf

`--conf=/path/to/my.cnf`: file where credentials are specified. Should be in (or contain) the following format:

  ```
[client]
user=gromit
password=123456
  ```

### concurrent-rowcount

Defaults to `true`. See [`exact-rowcount`](#exact-rowcount)

### critical-load

Comma delimited status-name=threshold, same format as [`--max-load`](#max-load).

`--critical-load` defines a threshold that, when met, `gh-ost` panics and bails out. The default behavior is to bail out immediately when meeting this threshold.

This may sometimes lead to migrations bailing out on a very short spike, that, while in itself is impacting production and is worth investigating, isn't reason enough to kill a 10-hour migration.

### critical-load-hibernate-seconds

When `--critical-load-hibernate-seconds` is non-zero (e.g. `--critical-load-hibernate-seconds=300`), `critical-load` does not panic and bail out; instead, `gh-ost` goes into hibernation for the specified duration. It will not read/write anything from/to any server during this time.  Execution then continues upon waking from hibernation.

If `critical-load` is met again, `gh-ost` will repeat this cycle, and never panic and bail out.

### critical-load-interval-millis

When `--critical-load-interval-millis` is specified (e.g. `--critical-load-interval-millis=2500`), `gh-ost` gives a second chance: when it meets `critical-load` threshold, it doesn't bail out. Instead, it starts a timer (in this example: `2.5` seconds) and re-checks `critical-load` when the timer expires. If `critical-load` is met again, `gh-ost` panics and bails out. If not, execution continues.

This is somewhat similar to a Nagios `n`-times test, where `n` in our case is always `2`.

### cut-over

Optional. Default is `safe`. See more discussion in [`cut-over`](cut-over.md)

### cut-over-lock-timeout-seconds

Default `3`.  Max number of seconds to hold locks on tables while attempting to cut-over (retry attempted when lock exceeds timeout).

### discard-foreign-keys

**Danger**: this flag will _silently_ discard any foreign keys existing on your table.

At this time (10-2016) `gh-ost` does not support foreign keys on migrated tables (it bails out when it notices a FK on the migrated table). However, it is able to support _dropping_ of foreign keys via this flag. If you're trying to get rid of foreign keys in your environment, this is a useful flag.

See also: [`skip-foreign-key-checks`](#skip-foreign-key-checks)


### dml-batch-size

`gh-ost` reads event from the binary log and applies them onto the _ghost_ table. It does so in batched writes: grouping multiple events to apply in a single transaction. This gives better write throughput as we don't need to sync the transaction log to disk for each event.

The `--dml-batch-size` flag controls the size of the batched write. Allowed values are `1 - 1000`, where `1` means no batching (every event from the binary log is applied onto the _ghost_ table on its own transaction). Default value is `10`.

Why is this behavior configurable? Different workloads have different characteristics. Some workloads have very large writes, such that aggregating even `50` writes into a transaction makes for a significant transaction size. On other workloads write rate is high such that one just can't allow for a hundred more syncs to disk per second. The default value of `10` is a modest compromise that should probably work very well for most workloads. Your mileage may vary.

Noteworthy is that setting `--dml-batch-size` to higher value _does not_ mean `gh-ost` blocks or waits on writes. The batch size is an upper limit on transaction size, not a minimal one. If `gh-ost` doesn't have "enough" events in the pipe, it does not wait on the binary log, it just writes what it already has. This conveniently suggests that if write load is light enough for `gh-ost` to only see a few events in the binary log at a given time, then it is also light enough for `gh-ost` to apply a fraction of the batch size.

### exact-rowcount

A `gh-ost` execution need to copy whatever rows you have in your existing table onto the ghost table. This can and often will be, a large number. Exactly what that number is?
`gh-ost` initially estimates the number of rows in your table by issuing an `explain select * from your_table`. This will use statistics on your table and return with a rough estimate. How rough? It might go as low as half or as high as double the actual number of rows in your table. This is the same method as used in [`pt-online-schema-change`](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html).

`gh-ost` also supports the `--exact-rowcount` flag. When this flag is given, two things happen:
- An initial, authoritative `select count(*) from your_table`.
  This query may take a long time to complete, but is performed before we begin the massive operations.
  When [`--concurrent-rowcount`](#concurrent-rowcount) is also specified, this runs in parallel to row copy.
  Note: [`--concurrent-rowcount`](#concurrent-rowcount) now defaults to `true`.
- A continuous update to the estimate as we make progress applying events.
  We heuristically update the number of rows based on the queries we process from the binlogs.

While the ongoing estimated number of rows is still heuristic, it's almost exact, such that the reported  [ETA](understanding-output.md) or percentage progress is typically accurate to the second throughout a multiple-hour operation.

### execute

Without this parameter, migration is a _noop_: testing table creation and validity of migration, but not touching data.

### force-named-cut-over

If given, a `cut-over` command must name the migrated table, or else ignored.

### force-named-panic

If given, a `panic` command must name the migrated table, or else ignored.

### force-table-names

Table name prefix to be used on the temporary tables.

### gcp

Add this flag when executing on a 1st generation Google Cloud Platform (GCP).

### gtid

Add this flag to enable support for [MySQL replication GTIDs](https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-concepts.html) for replication positioning. This requires `gtid_mode` and `enforce_gtid_consistency` to be set to `ON`.

### heartbeat-interval-millis

Default 100. See [`subsecond-lag`](subsecond-lag.md) for details.

### hooks-status-interval

Defaults to 60 seconds. Configures how often the `gh-ost-on-status` hook is called, see [`hooks`](hooks.md) for full details on how to use hooks.

### initially-drop-ghost-table

`gh-ost` maintains two tables while migrating: the _ghost_ table (which is synced from your original table and finally replaces it) and a changelog table, which is used internally for bookkeeping. By default, it panics and aborts if it sees those tables upon startup. Provide `--initially-drop-ghost-table` and `--initially-drop-old-table` to let `gh-ost` know it's OK to drop them beforehand.

We think `gh-ost` should not take chances or make assumptions about the user's tables. Dropping tables can be a dangerous, locking operation. We let the user explicitly approve such operations.

### initially-drop-old-table

See [`initially-drop-ghost-table`](#initially-drop-ghost-table)

### initially-drop-socket-file

Default False. Should `gh-ost` forcibly delete an existing socket file. Be careful: this might drop the socket file of a running migration!

### max-lag-millis

On a replication topology, this is perhaps the most important migration throttling factor: the maximum lag allowed for migration to work. If lag exceeds this value, migration throttles.

When using [Connect to replica, migrate on master](cheatsheet.md#a-connect-to-replica-migrate-on-master), this lag is primarily tested on the very replica `gh-ost` operates on. Lag is measured by checking the heartbeat events injected by `gh-ost` itself on the utility changelog table. That is, to measure this replica's lag, `gh-ost` doesn't need to issue `show slave status` nor have any external heartbeat mechanism.

When [`--throttle-control-replicas`](#throttle-control-replicas) is provided, throttling also considers lag on specified hosts. Lag measurements on listed hosts is done by querying `gh-ost`'s _changelog_ table, where `gh-ost` injects a heartbeat.

When using on master or when `--allow-on-master` is provided, `max-lag-millis` is also considered a threshold for starting the cutover stage of the migration. If the row copy is complete and the heartbeat lag is less than `max-lag-millis` cutover phase of the migration will start. 

See also: [Sub-second replication lag throttling](subsecond-lag.md)

### max-load

List of metrics and threshold values; topping the threshold of any will cause throttler to kick in. See also: [`throttling`](throttle.md#status-thresholds)

### migrate-on-replica

Typically `gh-ost` is used to migrate tables on a master. If you wish to only perform the migration in full on a replica, connect `gh-ost` to said replica and pass `--migrate-on-replica`. `gh-ost` will briefly connect to the master but otherwise will make no changes on the master. Migration will be fully executed on the replica, while making sure to maintain a small replication lag.

### panic-on-warnings

When this flag is set, `gh-ost` will panic when SQL warnings indicating data loss are encountered when copying data. This flag helps prevent data loss scenarios with migrations touching unique keys, column collation and types, as well as `NOT NULL` constraints, where `MySQL` will silently drop inserted rows that no longer satisfy the updated constraint (also dependent on the configured `sql_mode`).

While `panic-on-warnings` is currently disabled by defaults, it will default to `true` in a future version of `gh-ost`.

### postpone-cut-over-flag-file

Indicate a file name, such that the final [cut-over](cut-over.md) step does not take place as long as the file exists.
When this flag is set, `gh-ost` expects the file to exist on startup, or else tries to create it. `gh-ost` exits with error if the file does not exist and `gh-ost` is unable to create it.
With this flag set, the migration will cut-over upon deletion of the file or upon `cut-over` [interactive command](interactive-commands.md).

### replica-server-id

Defaults to 99999. If you run multiple migrations then you must provide a different, unique `--replica-server-id` for each `gh-ost` process.
Optionally involve the process ID, for example: `--replica-server-id=$((1000000000+$$))`.

It's on you to choose a number that does not collide with another `gh-ost` or another running replica.
See also: [`concurrent-migrations`](cheatsheet.md#concurrent-migrations) on the cheatsheet.

### resume

`--resume` attempts to resume a migration that was previously interrupted from the last checkpoint. The first `gh-ost` invocation must run with `--checkpoint` and have successfully written a checkpoint in order for `--resume` to work.
See also: [`resuming-migrations`](resume.md)

### serve-socket-file

Defaults to an auto-determined and advertised upon startup file. Defines Unix socket file to serve on.
### skip-foreign-key-checks

By default `gh-ost` verifies no foreign keys exist on the migrated table. On servers with large number of tables this check can take a long time. If you're absolutely certain no foreign keys exist (table does not reference other table nor is referenced by other tables) and wish to save the check time, provide with `--skip-foreign-key-checks`.

### skip-metadata-lock-check

By default `gh-ost` performs a check before the cut-over to ensure the rename session holds the exclusive metadata lock on the table. In case `performance_schema.metadata_locks` cannot be enabled on your setup, this check can be skipped with `--skip-metadata-lock-check`. 
:warning: Disabling this check involves the small chance of data loss in case a session accesses the ghost table during cut-over. See https://github.com/github/gh-ost/pull/1536 for details.

See also: [`allow-setup-metadata-lock-instruments`](#allow-setup-metadata-lock-instruments)

### skip-strict-mode

By default `gh-ost` enforces STRICT_ALL_TABLES sql_mode as a safety measure. In some cases this changes the behaviour of other modes (namely ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, and NO_ZERO_IN_DATE) which may lead to errors during migration. Use `--skip-strict-mode` to explicitly tell `gh-ost` not to enforce this. **Danger** This may have some unexpected disastrous side effects.

### skip-renamed-columns

See [`approve-renamed-columns`](#approve-renamed-columns)

### ssl

By default `gh-ost` does not use ssl/tls connections to the database servers when performing migrations. This flag instructs `gh-ost` to use encrypted connections. If enabled, `gh-ost` will use the system's ca certificate pool for server certificate verification. If a different certificate is needed for server verification, see `--ssl-ca`. If you wish to skip server verification, but still use encrypted connections, use with `--ssl-allow-insecure`.

### ssl-allow-insecure

Allows `gh-ost` to connect to the MySQL servers using encrypted connections, but without verifying the validity of the certificate provided by the server during the connection. Requires `--ssl`.

### ssl-ca

`--ssl-ca=/path/to/ca-cert.pem`: ca certificate file (in PEM format) to use for server certificate verification. If specified, the default system ca cert pool will not be used for verification, only the ca cert provided here. Requires `--ssl`.

### ssl-cert

`--ssl-cert=/path/to/ssl-cert.crt`: SSL public key certificate file (in PEM format).

### ssl-key

`--ssl-key=/path/to/ssl-key.key`: SSL private key file (in PEM format).

### storage-engine
Default is `innodb`, and `rocksdb` support is currently experimental. InnoDB and RocksDB are both transactional engines, supporting both shared and exclusive row locks.

But RocksDB currently lacks a few features support compared to InnoDB:
- Gap Locks
- Foreign Key
- Generated Columns
- Spatial
- Geometry

When `--storage-engine=rocksdb`, `gh-ost` will make some changes necessary (e.g. sets isolation level to `READ_COMMITTED`) to support RocksDB.

### charset
The default charset for the database connection is utf8mb4, utf8, latin1. The ability to specify character set and collation is supported, eg: utf8mb4_general_ci,utf8_general_ci,latin1. 

### test-on-replica

Issue the migration on a replica; do not modify data on master. Useful for validating, testing and benchmarking. See [`testing-on-replica`](testing-on-replica.md)

### test-on-replica-skip-replica-stop

Default `False`. When `--test-on-replica` is enabled, do not issue commands stop replication (requires `--test-on-replica`).

### throttle-control-replicas

Provide a command delimited list of replicas; `gh-ost` will throttle when any of the given replicas lag beyond [`--max-lag-millis`](#max-lag-millis). The list can be queried and updated dynamically via [interactive commands](interactive-commands.md)

### throttle-http

Provide an HTTP endpoint; `gh-ost` will issue `HEAD` requests on given URL and throttle whenever response status code is not `200`. The URL can be queried and updated dynamically via [interactive commands](interactive-commands.md). Empty URL disables the HTTP check.

### throttle-http-interval-millis

Defaults to 100. Configures the HTTP throttle check interval in milliseconds.

### throttle-http-timeout-millis

Defaults to 1000 (1 second). Configures the HTTP throttler check timeout in milliseconds.

### timestamp-old-table

Makes the _old_ table include a timestamp value. The _old_ table is what the original table is renamed to at the end of a successful migration. For example, if the table is `gh_ost_test`, then the _old_ table would normally be `_gh_ost_test_del`. With `--timestamp-old-table` it would be, for example, `_gh_ost_test_20170221103147_del`.

### tungsten

See [`tungsten`](cheatsheet.md#tungsten) on the cheatsheet.


================================================
FILE: doc/cut-over.md
================================================
# Cut-over step

The cut-over is the final major step of the migration: it's the moment where your original table is pushed aside, and the ghost table (the one we secretly altered and operated on throughout the process) takes its place.

MySQL poses some limitations on how the table swap can take place. While it supports an atomic swap, it does not allow a connection to swap tables it holds under lock.

The [facebook OSC](https://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932/) tool documents this nicely. Look for **"Cut-over phase"**. The Facebook solution uses a non-atomic swap: the original table is first renamed and pushed aside, then the ghost table is renamed to take its place. In between the two renames there's a brief period of time where your table just does not exist, and queries will fail.

`gh-ost` solves this by using an atomic, two-step blocking swap: while one connection holds the lock, another attempts the atomic `RENAME`. The `RENAME` is guaranteed to not be executed prematurely by positioning a sentry table which blocks the `RENAME` operation until `gh-ost` is satisfied all is in order.

This solution either:
- executes successfully, in which case the tables are swapped atomically and pending connections are blocked for a brief period of time, proceeding to operate on the newly migrated table
- or fails, due to timeout or death of some connection, in which case we are naturally returning to pre-cut-over phase, where the original table is still in place and accessible. This releases the pending connections, which are able again to write to the table, and `gh-ost` is then able to make another attempt at the cut-over.

Also note:
- With `--migrate-on-replica` the cut-over is executed in exactly the same way as on master.
- With `--test-on-replica` the replication is first stopped; then the cut-over is executed just as on master, but then reverted (tables rename forth then back again).

Internals of the atomic cut-over are discussed in [Issue #82](https://github.com/github/gh-ost/issues/82).

At this time the command-line argument `--cut-over` is supported, and defaults to the atomic cut-over algorithm described above. Also supported is `--cut-over=two-step`, which uses the FB non-atomic algorithm. We recommend using the default cut-over that has been battle tested in our production environments.


================================================
FILE: doc/hooks.md
================================================
# Hooks

`gh-ost` supports _hooks_: external processes which `gh-ost` executes at particular points of interest.

Use cases include:

- You wish to be notified by mail when a migration completes/fails
- You wish to be notified when `gh-ost` postpones cut-over (at your demand), thus ready to complete (at your leisure)
- RDS users who wish to `--test-on-replica`, but who cannot have `gh-ost` issue a `STOP SLAVE`, would use a hook to command RDS to stop replication
- Send a status message to your chatops every hour
- Perform cleanup on the _ghost_ table (drop/rename/nibble) once migration completes
- etc.

`gh-ost` defines certain points of interest (event types), and executes hooks at those points.

Notes:

- You may have more than one hook per event type.
- `gh-ost` will invoke relevant hooks _sequentially_ and _synchronously_
  - thus, you would generally like the hooks to execute as fast as possible, or otherwise issue tasks in the background
- A hook returning with error code will propagate the error in `gh-ost`. Thus, you are able to force `gh-ost` to fail migration on your conditions.
  - Make sure to only return an error code when you do indeed wish to fail the rest of the migration

### Creating hooks

All hooks are expected to reside in a single directory. This directory is indicated by `--hooks-path`. When not provided, no hooks are executed.

`gh-ost` will dynamically search for hooks in said directory. You may add and remove hooks to/from this directory as `gh-ost` makes progress (though likely you don't want to). Hook files are expected to be executable processes.

In an effort to simplify code and to standardize usage, `gh-ost` expects hooks in explicit naming conventions. As an example, the `onStartup` hook expects processes named `gh-ost-on-startup*`. It will match and accept files named:

- `gh-ost-on-startup`
- `gh-ost-on-startup--send-notification-mail`
- `gh-ost-on-startup12345`
- etc.

The full list of supported hooks is best found in code: [hooks.go](https://github.com/github/gh-ost/blob/master/go/logic/hooks.go). Documentation will always be a bit behind. At this time, though, the following are recognized:

- `gh-ost-on-startup`
- `gh-ost-on-validated`
- `gh-ost-on-rowcount-complete`
- `gh-ost-on-before-row-copy`
- `gh-ost-on-status`
- `gh-ost-on-interactive-command`
- `gh-ost-on-row-copy-complete`
- `gh-ost-on-stop-replication`
- `gh-ost-on-start-replication`
- `gh-ost-on-begin-postponed`
- `gh-ost-on-before-cut-over`
- `gh-ost-on-success`
- `gh-ost-on-failure`
- `gh-ost-on-batch-copy-retry`

### Context

`gh-ost` will set environment variables per hook invocation. Hooks are then able to read those variables, indicating schema name, table name, `alter` statement, migrated host name etc. Some variables are available on all hooks, and some are available on relevant hooks.

The following variables are available on all hooks:

- `GH_OST_DATABASE_NAME`
- `GH_OST_TABLE_NAME`
- `GH_OST_GHOST_TABLE_NAME`
- `GH_OST_OLD_TABLE_NAME` - the name the original table will be renamed to at the end of operation
- `GH_OST_DDL`
- `GH_OST_ELAPSED_SECONDS` - total runtime
- `GH_OST_ELAPSED_COPY_SECONDS` - row-copy time (excluding startup, row-count and postpone time)
- `GH_OST_ESTIMATED_ROWS` - estimated total rows in table
- `GH_OST_COPIED_ROWS` - number of rows copied by `gh-ost`
- `GH_OST_INSPECTED_LAG` - lag in seconds (floating point) of inspected server
- `GH_OST_HEARTBEAT_LAG` - lag in seconds (floating point) of heartbeat
- `GH_OST_PROGRESS` - progress pct ([0..100], floating point) of migration
- `GH_OST_ETA_SECONDS` - estimated duration until migration finishes in seconds
- `GH_OST_MIGRATED_HOST`
- `GH_OST_INSPECTED_HOST`
- `GH_OST_EXECUTING_HOST`
- `GH_OST_HOOKS_HINT` - copy of `--hooks-hint` value
- `GH_OST_HOOKS_HINT_OWNER` - copy of `--hooks-hint-owner` value
- `GH_OST_HOOKS_HINT_TOKEN` - copy of `--hooks-hint-token` value
- `GH_OST_DRY_RUN` - whether or not the `gh-ost` run is a dry run
- `GH_OST_REVERT` - whether or not `gh-ost` is running in revert mode

The following variable are available on particular hooks:

- `GH_OST_COMMAND` is only available in `gh-ost-on-interactive-command`
- `GH_OST_STATUS` is only available in `gh-ost-on-status`
- `GH_OST_LAST_BATCH_COPY_ERROR` is only available in `gh-ost-on-batch-copy-retry`

### Examples

See [sample hooks](https://github.com/github/gh-ost/tree/master/resources/hooks-sample), as `bash` implementation samples.


================================================
FILE: doc/interactive-commands.md
================================================
# Interactive commands

`gh-ost` is designed to be operations friendly. To that effect, it allows the user to control its behavior even while it is running.

### Interactive interfaces

`gh-ost` listens on:

- Unix socket file: either provided via `--serve-socket-file` or determined by `gh-ost`, this interface is always up.
  When self-determined, `gh-ost` will advertise the identify of socket file upon start up and throughout the migration.
- TCP: if `--serve-tcp-port` is provided

Both interfaces may serve at the same time. Both respond to simple text command, which makes it easy to interact via shell.

### Known commands

- `help`: shows a brief list of available commands
- `status`: returns a detailed status summary of migration progress and configuration
- `sup`: returns a brief status summary of migration progress
- `cpu-profile`: returns a base64-encoded [`runtime/pprof`](https://pkg.go.dev/runtime/pprof) CPU profile using a duration, default: `30s`. Comma-separated options `gzip` and/or `block` (blocked profile) may follow the profile duration
- `coordinates`: returns recent (though not exactly up to date) binary log coordinates of the inspected server
- `applier`: returns the hostname of the applier
- `inspector`: returns the hostname of the inspector
- `chunk-size=<newsize>`: modify the `chunk-size`; applies on next running copy-iteration
- `dml-batch-size=<newsize>`: modify the `dml-batch-size`; applies on next applying of binary log events
- `max-lag-millis=<max-lag>`: modify the maximum replication lag threshold (milliseconds, minimum value is `100`, i.e. `0.1` second)
- `max-load=<max-load-thresholds>`: modify the `max-load` config; applies on next running copy-iteration
  - The `max-load` format must be: `some_status=<numeric-threshold>[,some_status=<numeric-threshold>...]`'
  - For example: `Threads_running=50,threads_connected=1000`, and you would then write/echo `max-load=Threads_running=50,threads_connected=1000` to the socket.
- `critical-load=<critical-load-thresholds>`: modify the `critical-load` config (exceeding these thresholds aborts the operation)
  - The `critical-load` format must be: `some_status=<numeric-threshold>[,some_status=<numeric-threshold>...]`'
  - For example: `Threads_running=1000,threads_connected=5000`, and you would then write/echo `critical-load=Threads_running=1000,threads_connected=5000` to the socket.
- `nice-ratio=<ratio>`: change _nice_ ratio: 0 for aggressive (not nice, not sleeping), positive integer `n`:
  - For any `1ms` spent copying rows, spend `n*1ms` units of time sleeping.
  - Examples: assume a single rows chunk copy takes `100ms` to complete.
    - `nice-ratio=0.5` will cause `gh-ost` to sleep for `50ms` immediately following.
    - `nice-ratio=1` will cause `gh-ost` to sleep for `100ms`, effectively doubling runtime
    - value of `2` will effectively triple the runtime; etc.
- `throttle-http`: change throttle HTTP endpoint
- `throttle-query`: change throttle query
- `throttle-control-replicas='replica1,replica2'`: change list of throttle-control replicas, these are replicas `gh-ost` will check. This takes a comma separated list of replica's to check and replaces the previous list.
- `throttle`: force migration suspend
- `no-throttle`: cancel forced suspension (though other throttling reasons may still apply)
- `postpone-cut-over-flag-file=<path>`: Postpone the [cut-over](cut-over.md) phase, writing a cut over flag file to the given path
- `unpostpone`: at a time where `gh-ost` is postponing the [cut-over](cut-over.md) phase, instruct `gh-ost` to stop postponing and proceed immediately to cut-over.
- `panic`: immediately panic and abort operation

### Querying for data

For commands that accept an argument as value, pass `?` (question mark) to _get_ current value rather than _set_ a new one.

### Examples

While migration is running:

```shell
$ echo status | nc -U /tmp/gh-ost.test.sample_data_0.sock
# Migrating `test`.`sample_data_0`; Ghost table is `test`.`_sample_data_0_gst`
# Migration started at Tue Jun 07 11:45:16 +0200 2016
# chunk-size: 200; max lag: 1500ms; dml-batch-size: 10; max-load: map[Threads_connected:20]
# Throttle additional flag file: /tmp/gh-ost.throttle
# Serving on unix socket: /tmp/gh-ost.test.sample_data_0.sock
# Serving on TCP port: 10001
Copy: 0/2915 0.0%; Applied: 0; Backlog: 0/100; Time: 41s(total), 40s(copy); streamer: mysql-bin.000550:49942; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, flag-file; ETA: N/A
```

```shell
$ echo "chunk-size=250" | nc -U /tmp/gh-ost.test.sample_data_0.sock
# Migrating `test`.`sample_data_0`; Ghost table is `test`.`_sample_data_0_gst`
# Migration started at Tue Jun 07 11:56:03 +0200 2016
# chunk-size: 250; max lag: 1500ms; dml-batch-size: 10; max-load: map[Threads_connected:20]
# Throttle additional flag file: /tmp/gh-ost.throttle
# Serving on unix socket: /tmp/gh-ost.test.sample_data_0.sock
# Serving on TCP port: 10001
```

```shell
$ echo "chunk-size=?" | nc -U /tmp/gh-ost.test.sample_data_0.sock
250
```

```shell
$ echo throttle | nc -U /tmp/gh-ost.test.sample_data_0.sock

$ echo status | nc -U /tmp/gh-ost.test.sample_data_0.sock
# Migrating `test`.`sample_data_0`; Ghost table is `test`.`_sample_data_0_gst`
# Migration started at Tue Jun 07 11:56:03 +0200 2016
# chunk-size: 250; max lag: 1500ms; max-load: map[Threads_connected:20]
# Throttle additional flag file: /tmp/gh-ost.throttle
# Serving on unix socket: /tmp/gh-ost.test.sample_data_0.sock
# Serving on TCP port: 10001
Copy: 0/2915 0.0%; Applied: 0; Backlog: 0/100; Time: 59s(total), 59s(copy); streamer: mysql-bin.000551:68067; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, commanded by user; ETA: N/A
```


================================================
FILE: doc/local-tests.md
================================================
# Local tests

`gh-ost` is continuously tested in production via `--test-on-replica alter='engine=innodb'`. These tests check the GitHub workload and usage, but not necessarily the general case.

Local tests are an additional layer of tests used for continuous integration tests and local development.

Local tests test explicit use cases, such as column renames, mix of time zones, special types and alters. Traits of a single test:

- Composed of a single table.
- A single alter.
- By default the alter is `engine=innodb`, but this can be overridden per-test
- Scheduled DML operations, executed via `event_scheduler`.
- `gh-ost` is set to execute and throttle for `5` seconds, at which time all tested DMLs are expected to operate.
- The test requires a replication topology and utilizes `--test-on-replica`
- The test checksums the two tables (original and _ghost_) and expects identical checksum
- By default the test selects all (`*`) columns, but this can be overridden per-test

Tests are found under [localtests](https://github.com/github/gh-ost/tree/master/localtests). A single test is a subdirectory and tests are iterated alphabetically.

New data-integrity, synchronization issues or otherwise concerns are expected to be tested by new test cases.

## Run with docker compose

Local tests can be run locally with docker compose using the helper script [script/docker-gh-ost-replica-tests](https://github.com/github/gh-ost/tree/master/script/docker-gh-ost-replica-tests). 

Example usage:
```shell
# create primary-replica containers with specified mysql image
TEST_MYSQL_IMAGE="mysql-server:8.0.16" ./script/docker-gh-ost-replica-tests up

# run all tests
./script/docker-gh-ost-replica-tests run

# cleanup containers
./script/docker-gh-ost-replica-tests down
```

Pass the `-t` flag to run the tests with a toxiproxy between gh-ost and the MySQL replica. This simulates network conditions where MySQL connections are closed unexpectedly.

```shell
# run tests with toxiproxy
./script/docker-gh-ost-replica-tests up -t
./script/docker-gh-ost-replica-tests run -t
```


================================================
FILE: doc/migrating-with-sbr.md
================================================
# Migrating with Statement Based Replication

Even though `gh-ost` relies on Row Based Replication (RBR), it does not mean you can't keep your Statement Based Replication (SBR).

`gh-ost` is happy to, and actually prefers and suggests to, connect to a replica. On this replica, it is happy to:
- issue the heavyweight `INFORMATION_SCHEMA` queries that make a table structure analysis
- issue a `select count(*) from mydb.mytable`, should `--exact-rowcount` be provided
- connect itself as a fake replica to get the binary log stream

All of the above can be executed on the master, but we're more comfortable that they execute on a replica.

Please note the third item: `gh-ost` connects as a fake replica and pulls the binary logs. This is how `gh-ost` finds the table's changelog: it looks up entries in the binary log.

The magic is that your master can still produce SBR, but if you have a replica with `log-slave-updates`, you can also configure it to have `binlog_format='ROW'`. Such a replica accepts SBR statements from its master, and produces RBR statements onto its binary logs.

`gh-ost` is happy to modify the `binlog_format` on the replica for you:
- If you supply `--switch-to-rbr`, `gh-ost` will convert the binlog format for you, and restart replication to make sure this takes effect.
- If your replica is an intermediate master, i.e. further serves as a master to other replicas, `gh-ost` will not convert the `binlog_format`.
- At any case, `gh-ost` **will not** convert back to `STATEMENT` (SBR). This is because you may be running multiple migrations concurrently. Being able to run concurrent migrations is one of the design goals of this tool. It's your own responsibility to switch back to SBR once all pending migrations are complete.

### Summary

- If you're already using RBR, all is well for you
- If not, convert one of your replicas to `binlog_format='ROW'`, or let `gh-ost` do this for you.


================================================
FILE: doc/perks.md
================================================
# Perks

Listed below are some operation perks that make the DBA happy.

### Dynamic reconfiguration

You started with a `chunk-size=5000` but you find out it's too much. You want to reduce it. There is no need to kill and restart the migration with a new configuration. You may change the `chunk-size` dynamically.

`gh-ost` listens on a unix socket file, and optionally via `TCP` as well. You may, for example:

```shell
$ echo "chunk-size=250" | nc -U /tmp/gh-ost.test.sample_data_0.sock
```

Likewise, you can change the `max-load` configuration:

```shell
$ echo "max-load=Threads_running=50,threads_connected=1000" | nc -U /tmp/gh-ost.test.sample_data_0.sock
```

The `max-load` format must be: `some_status=<numeric-threshold>[,some_status=<numeric-threshold>...]`.
In case of parsing error the command is ignored.

Read more about [interactive commands](interactive-commands.md)

### What's the status?

You do not have to have access to the `screen` where the migration is issued. You have two ways to get current status:

1. Use [interactive commands](interactive-commands.md). Via unix socket file or via `TCP` you can get current status:

```shell
$ echo status | nc -U /tmp/gh-ost.test.sample_data_0.sock
# Migrating `test`.`sample_data_0`; Ghost table is `test`.`_sample_data_0_gst`
# Migration started at Tue Jun 07 11:45:16 +0200 2016
# chunk-size: 200; max lag: 1500ms; max-load: map[Threads_connected:20]
# Throttle additional flag file: /tmp/gh-ost.throttle
# Serving on unix socket: /tmp/gh-ost.test.sample_data_0.sock
# Serving on TCP port: 10001
Copy: 0/2915 0.0%; Applied: 0; Backlog: 0/100; Time: 41s(total), 40s(copy); streamer: mysql-bin.000550:49942; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, flag-file; ETA: N/A
```

1. `gh-ost` creates and uses a changelog table for internal bookkeeping. This table has the `_osc` suffix (the tool creates and announces this table upon startup) If you like, you can SQL your status:

```
> select * from _sample_data_0_osc order by id desc limit 1 \G
*************************** 1. row ***************************
         id: 325
last_update: 2016-06-08 15:52:13
       hint: copy iteration 0 at 1465393933
      value: throttled, flag-file
```

### Postpone the cut-over phase

You begin a migration, and the ETA is for it to complete at 04:00am. Not a good time for you, because you happen to want to have eyes on things as the migration completes (ideally, you shouldn't need to, but life is hard).

Today, DBAs are coordinating the migration start time such that it completes in a convenient hour. `gh-ost` offers an alternative: postpone the final cut-over phase till you're ready.

Execute `gh-ost` with `--postpone-cut-over-flag-file=/path/to/flag.file`. As long as this file exists, `gh-ost` will not take the final cut-over step. It will complete the row copy, and continue to synchronize the tables by continuously applying changes made on the original table onto the ghost table. It can do so on and on and on. When you're finally ready, remove the file and cut-over will take place.

### Sub-second lag throttling

With sub-second replication lag measurements, `gh-ost` is able to keep a fleet of replicas well below `1sec` lag throughout the migration. We encourage you to issue sub-second heartbeats. Read more on [sub-second replication lag throttling](subsecond-lag.md)


================================================
FILE: doc/questions.md
================================================
# How?

### How does the cut-over work? Is it really atomic?

The cut-over phase, where the original table is swapped away, and the _ghost_ table takes its place, is an atomic, blocking, controlled operation.

- Atomic: the tables are swapped together. There is no gap where your table does not exist.
- Blocking: all app queries involving the migrated (original) table are either operate on the original table, or are blocked, or proceed to operate on the _new_ table (formerly the _ghost_ table, now swapped in).
- Controlled: the cut-over times out at pre-defined threshold, and is atomically aborted, then re-attempted. Cut-over only takes place when no lags are present, and otherwise no throttling reason is found. Cut-over step itself gets high priority and is never throttled.

Read more on [cut-over](cut-over.md) and on the [cut-over design Issue](https://github.com/github/gh-ost/issues/82)


# Is it possible to?

### Is it possible to add a UNIQUE KEY?

Adding a `UNIQUE KEY` is possible, in the condition that no violation will occur. That is, you must make sure there aren't any violating rows on your table before, and during the migration.

At this time there is no equivalent to `ALTER IGNORE`, where duplicates are implicitly and silently thrown away. The MySQL `5.7` docs say:

> As of MySQL 5.7.4, the IGNORE clause for ALTER TABLE is removed and its use produces an error.

It is therefore unlikely that `gh-ost` will support this behavior.

### Run concurrent migrations?

Yes. TL;DR if running all on same replica/master, make sure to provide `--replica-server-id`. [Read more](cheatsheet.md#concurrent-migrations)

# Why

### Why Is the "Connect to Replica" mode preferred? 

To avoid placing extra load on the master. `gh-ost` connects as a replication client. Each additional replica adds some load to the master. 

To monitor replication lag from a replica. This makes the replication lag throttle, `--max-lag-millis`, more representative of the lag experienced by other replicas following the master (perhaps N levels deep in a tree of replicas).


================================================
FILE: doc/rds.md
================================================
`gh-ost` has been updated to work with Amazon RDS however due to GitHub not using AWS for databases, this documentation is community driven so if you find a bug please [open an issue][new_issue]!

# Amazon RDS

## Limitations

- No `SUPER` privileges.
- `gh-ost` runs should be setup use [`--assume-rbr`][assume_rbr_docs] and use `binlog_format=ROW`.
- Aurora does not allow editing of the `read_only` parameter. While it is defined as `{TrueIfReplica}`, the parameter is non-modifiable field.

## Aurora

#### Replication

In Aurora replication, you have separate reader and writer endpoints however because the cluster shares the underlying storage layer, `gh-ost` will detect it is running on the master. This becomes an issue when you wish to use [migrate/test on replica][migrate_test_on_replica_docs] because you won't be able to use a single cluster in the same way you would with MySQL RDS.

To work around this, you can follow along the [AWS replication between clusters documentation][aws_replication_docs] for Aurora with one small caveat. For the "Create a Snapshot of Your Replication Master" step, the binlog position is not available in the AWS console. You will need to issue the SQL query `SHOW SLAVE STATUS` or `aws rds describe-events` API call to get the correct position.

#### Percona Toolkit

If you use `pt-table-checksum` as a part of your data integrity checks, you might want to check out [this patch][percona_toolkit_patch] which will enable you to run `pt-table-checksum` with the `--no-binlog-format-check` flag and prevent errors like the following:

```
03-24T12:51:06 Failed to /*!50108 SET @@binlog_format := 'STATEMENT'*/: DBD::mysql::db do failed: Access denied; you need (at least one of) the SUPER privilege(s) for this operation [for Statement "/*!50108 SET @@binlog_format := 'STATEMENT'*/"] at pt-table-checksum line 9292.

This tool requires binlog_format=STATEMENT, but the current binlog_format is set to ROW and an error occurred while attempting to change it.  If running MySQL 5.1.29 or newer, setting binlog_format requires the SUPER privilege.  You will need to manually set binlog_format to 'STATEMENT' before running this tool.
```

#### Binlog filtering

In Aurora, the [binlog filtering feature][aws_replication_docs_bin_log_filtering] is enabled by default. This becomes an issue when gh-ost tries to do the cut-over, because gh-ost waits for an entry in the binlog to proceed but this entry will never end up in the binlog because it gets filtered out by the binlog filtering feature.  
You need to turn this feature off during the migration process.  
Set the `aurora_enable_repl_bin_log_filtering` parameter to 0 in the Parameter Group for your cluster.  
When the migration is done, set it back to 1 (default).


#### Preflight checklist

Before trying to run any `gh-ost` migrations you will want to confirm the following:

- [ ] You have a secondary cluster available that will act as a replica. Rule of thumb here has been a 1 instance per cluster to mimic MySQL-style replication as opposed to Aurora style.
- [ ] The database instance parameters and database cluster parameters are consistent between your master and replicas
- [ ] Executing `SHOW SLAVE STATUS\G` on your replica cluster displays the correct master host, binlog position, etc.
- [ ] Database backup retention is greater than 1 day to enable binlogs
- [ ] You have setup [`hooks`][ghost_hooks] to issue RDS procedures for stopping and starting replication. (see [github/gh-ost#163][ghost_rds_issue_tracking] for examples)
- [ ] The parameter `aurora_enable_repl_bin_log_filtering` is set to 0

[new_issue]: https://github.com/github/gh-ost/issues/new
[assume_rbr_docs]: https://github.com/github/gh-ost/blob/master/doc/command-line-flags.md#assume-rbr
[migrate_test_on_replica_docs]: https://github.com/github/gh-ost/blob/master/doc/cheatsheet.md#c-migratetest-on-replica
[aws_replication_docs]: http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Aurora.Overview.Replication.MySQLReplication.html
[percona_toolkit_patch]: https://github.com/jacobbednarz/percona-toolkit/commit/0271ba6a094da446a5e5bb8d99b5c26f1777f2b9
[ghost_hooks]: https://github.com/github/gh-ost/blob/master/doc/hooks.md
[ghost_rds_issue_tracking]: https://github.com/github/gh-ost/issues/163
[aws_replication_docs_bin_log_filtering]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.html#AuroraMySQL.Replication.Performance

================================================
FILE: doc/requirements-and-limitations.md
================================================
# Requirements and limitations

### Requirements

- `gh-ost` currently requires MySQL versions 5.7 and greater.

- You will need to have one server serving Row Based Replication (RBR) format binary logs. Right now `FULL` row image is supported. `MINIMAL` to be supported in the near future. `gh-ost` prefers to work with replicas. You may [still have your master configured with Statement Based Replication](migrating-with-sbr.md) (SBR).

- If you are using a replica, the table must have an identical schema between the master and replica.

- `gh-ost` requires an account with these privileges:

  - `ALTER, CREATE, DELETE, DROP, INDEX, INSERT, LOCK TABLES, SELECT, TRIGGER, UPDATE` on the database (schema) where your migrated table is, or of course on `*.*`
  - either:
    - `SUPER, REPLICATION SLAVE` on `*.*`, or:
    - `REPLICATION CLIENT, REPLICATION SLAVE` on `*.*`

The `SUPER` privilege is required for `STOP SLAVE`, `START SLAVE` operations. These are used on:

- Switching your `binlog_format` to `ROW`, in the case where it is _not_ `ROW` and you explicitly specified `--switch-to-rbr`
  - If your replication is already in RBR (`binlog_format=ROW`) you can specify `--assume-rbr` to avoid the `STOP SLAVE/START SLAVE` operations, hence no need for `SUPER`.

- `gh-ost` uses the `REPEATABLE_READ` transaction isolation level for all MySQL connections, regardless of the server default.

- Running `--test-on-replica`: before the cut-over phase, `gh-ost` stops replication so that you can compare the two tables and satisfy that the migration is sound.

### Limitations

- Foreign key constraints are not supported. They may be supported in the future, to some extent.

- Triggers are not supported. They may be supported in the future.

- MySQL 5.7 `JSON` columns are supported but not as part of `PRIMARY KEY`

- The two _before_ & _after_ tables must share a `PRIMARY KEY` or other `UNIQUE KEY`. This key will be used by `gh-ost` to iterate through the table rows when copying. [Read more](shared-key.md)
  - The migration key must not include columns with NULL values. This means either:
    1. The columns are `NOT NULL`, or
    2. The columns are nullable but don't contain any NULL values.
  - by default, `gh-ost` will not run if the only `UNIQUE KEY` includes nullable columns.
    - You may override this via `--allow-nullable-unique-key` but make sure there are no actual `NULL` values in those columns. Existing NULL values can't guarantee data integrity on the migrated table.

- It is not allowed to migrate a table where another table exists with same name and different upper/lower case.
  - For example, you may not migrate `MyTable` if another table called `MYtable` exists in the same schema.

- Amazon RDS works, but has its own [limitations](rds.md).
- Google Cloud SQL works, `--gcp` flag required.
- Aliyun RDS works, `--aliyun-rds` flag required.
- Azure Database for MySQL works, `--azure` flag required, and have detailed document about it. (azure.md)

- Multisource is not supported when migrating via replica. It _should_ work (but never tested) when connecting directly to master (`--allow-on-master`)

- Master-master setup is only supported in active-passive setup. Active-active (where table is being written to on both masters concurrently) is unsupported. It may be supported in the future.

- If you have an `enum` field as part of your migration key (typically the `PRIMARY KEY`), migration performance will be degraded and potentially bad. [Read more](https://github.com/github/gh-ost/pull/277#issuecomment-254811520)

- Migrating a `FEDERATED` table is unsupported and is irrelevant to the problem `gh-ost` tackles.

- [Encrypted binary logs](https://www.percona.com/blog/2018/03/08/binlog-encryption-percona-server-mysql/) are not supported.
- `ALTER TABLE ... RENAME TO some_other_name` is not supported (and you shouldn't use `gh-ost` for such a trivial operation).


================================================
FILE: doc/resume.md
================================================
# Resuming Migrations

`gh-ost` can attempt to resume an interrupted migration from a checkpoint if the following conditions are met:
- The first `gh-ost` process was invoked with `--checkpoint`
- The first `gh-ost` process had at least one successful checkpoint
- The binlogs from the last checkpoint's binlog coordinates still exist on the replica gh-ost is inspecting (specified by `--host`)
- The checkpoint table (name ends with `_ghk`) still exists

To resume, invoke `gh-ost` again with the same arguments with the `--resume` flag.

> [!WARNING]
> It is recommended use `--checkpoint` with `--gtid` enabled so that checkpoint binlog coordinates store GTID sets rather than file positions. In that case, `gh-ost` can resume using a different replica than it originally attached to.

## Example
The migration starts with a `gh-ost` invocation such as:
```shell
gh-ost \
--chunk-size=100 \
--host=replica1.company.com \
--database="mydb" \
--table="mytable" \
--alter="add column mycol varchar(20)"
--gtid \
--checkpoint \
--checkpoint-seconds=60 \
--execute
```

In this example `gh-ost` writes a checkpoint to a table `_mytable_ghk` every 60 seconds. After `gh-ost` is interrupted/killed, the migration can be resumed with:
```shell
# resume migration
gh-ost \
--chunk-size=100
--host=replica1.company.com \
--database="mydb" \
--table="mytable" \
--alter="add column mycol varchar(20)"
--gtid \
--resume \
--execute
```

`gh-ost` then reconnects at the binlog coordinates of the last checkpoint and resumes copying rows at the chunk specified by the checkpoint. The data integrity of the ghost table is preserved because `gh-ost` applies row DMLs and copies row in an idempotent way.


================================================
FILE: doc/revert.md
================================================
# Reverting Migrations

`gh-ost` can attempt to revert a previously completed migration if the follow conditions are met:
- The first `gh-ost` process was invoked with `--checkpoint`
- The checkpoint table (name ends with `_ghk`) still exists
- The binlogs from the time of the migration's cut-over still exist on the replica gh-ost is inspecting (specified by `--host`)

To revert, find the name of the "old" table from the original migration e.g. `_mytable_del`. Then invoke `gh-ost` with the same arguments and the flags `--revert` and `--old-table="_mytable_del"`.
gh-ost will read the binlog coordinates of the original cut-over from the checkpoint table and bring the old table up to date. Then it performs another cut-over to complete the reversion.
Note that the checkpoint table (name ends with _ghk) will not be automatically dropped unless `--ok-to-drop-table` is provided.

> [!WARNING]
> It is recommended use `--checkpoint` with `--gtid` enabled so that checkpoint binlog coordinates store GTID sets rather than file positions. In that case, `gh-ost` can revert using a different replica than it originally attached to.

### ❗ Note ❗
Reverting is roughly equivalent to applying the "reverse" migration. _Before attempting to revert you should determine if the reverse migration is possible and does not involve any unacceptable data loss._

For example: if the original migration drops a `NOT NULL` column that has no `DEFAULT` then the reverse migration adds the column. In this case, the reverse migration is impossible if rows were added after the original cut-over and the revert will fail.
Another example: if the original migration modifies a `VARCHAR(32)` column to `VARCHAR(64)`, the reverse migration truncates the `VARCHAR(64)` column to `VARCHAR(32)`. If values were inserted with length > 32 after the cut-over then the revert will fail.


## Example
The migration starts with a `gh-ost` invocation such as:
```shell
gh-ost \
--chunk-size=100 \
--host=replica1.company.com \
--database="mydb" \
--table="mytable" \
--alter="drop key idx1"
--gtid \
--checkpoint \
--checkpoint-seconds=60 \
--execute
```

In this example `gh-ost` writes a cut-over checkpoint to `_mytable_ghk` after the cut-over is successful. The original table is renamed to `_mytable_del`.

Suppose that dropping the index causes problems, the migration can be revert with:
```shell
# revert migration
gh-ost \
--chunk-size=100 \
--host=replica1.company.com \
--database="mydb" \
--table="mytable" \
--old-table="_mytable_del"
--gtid \
--checkpoint \
--checkpoint-seconds=60 \
--revert \
--execute
```

gh-ost then reconnects at the binlog coordinates stored in the cut-over checkpoint and applies DMLs until the old table is up-to-date.
Note that the "reverse" migration is `ADD KEY idx(...)` so there is no potential data loss to consider in this case.


================================================
FILE: doc/shared-key.md
================================================
# Shared key

gh-ost requires for every migration that both the _before_ and _after_ versions of the table share the same unique not-null key columns. This page illustrates this rule.

### Introduction

Consider a simple migration, with a normal table,

```sql
CREATE TABLE tbl (
  id bigint unsigned not null auto_increment,
  data varchar(255),
  more_data int,
  PRIMARY KEY(id)
)
```

and the migration `add column ts timestamp`. The _after_ table version would be:

```sql
CREATE TABLE tbl (
  id bigint unsigned not null auto_increment,
  data varchar(255),
  more_data int,
  ts timestamp,
  PRIMARY KEY(id)
)
```

(This is also the definition of the _ghost_ table, except that that table would be called `_tbl_gho`). 

In this migration, the _before_ and _after_ versions contain the same unique not-null key (the PRIMARY KEY). To run this migration, `gh-ost` would iterate through the `tbl` table using the primary key, copy rows from `tbl` to the _ghost_ table `_tbl_gho` in primary key order, while also applying the binlog event writes from `tbl` onto `_tbl_gho`.

The applying of the binlog events is what requires the shared unique key. For example, an `UPDATE` statement to `tbl` translates to a `REPLACE` statement which `gh-ost` applies to `_tbl_gho`. A `REPLACE` statement expects to insert or replace an existing row based on its row's values and the table's unique key constraints. In particular, if inserting that row would result in a unique key violation (e.g., a row with that primary key already exists), it would _replace_ that existing row with the new values.

So `gh-ost` correlates `tbl` and `_tbl_gho` rows one to one using a unique key. In the above example that would be the `PRIMARY KEY`.

### Interpreting the rule

The _before_ and _after_ versions of the table share the same unique not-null key, but:
- the key doesn't have to be the PRIMARY KEY
- the key can have a different name between the _before_ and _after_ versions (e.g., renamed via DROP INDEX and ADD INDEX) so long as it contains the exact same column(s)

At the start of the migration, `gh-ost` inspects both the original and _ghost_ table it created, and attempts to find at least one such unique key (or rather, a set of columns) that is shared between the two. Typically this would just be the `PRIMARY KEY`, but some tables don't have primary keys, or sometimes it is the primary key that is being modified by the migration. In these cases `gh-ost` will look for other options.

`gh-ost` expects unique keys where no `NULL` values are found, i.e. all columns contained in the unique key are defined as `NOT NULL`. This is implicitly true for primary keys. If no such key can be found, `gh-ost` bails out. 

If the table contains a unique key with nullable columns, but you know your columns contain no `NULL` values, use the `--allow-nullable-unique-key` option. The migration will run well as long as no `NULL` values are found in the unique key's columns. **Any actual `NULL`s may corrupt the migration.**

### Examples: Allowed and Not Allowed

```sql
create table some_table (
  id int not null auto_increment,
  ts timestamp,
  name varchar(128) not null,
  owner_id int not null,
  loc_id int not null,
  primary key(id),
  unique key name_uidx(name)
)
```

Note the two unique, not-null indexes: the primary key and `name_uidx`.

Allowed migrations:

- `add column i int`
- `add key owner_idx (owner_id)`
- `add unique key owner_name_idx (owner_id, name)` - **be careful not to write conflicting rows while this migration runs**
- `drop key name_uidx` - `primary key` is shared between the tables
- `drop primary key, add primary key(owner_id, loc_id)` - `name_uidx` is shared between the tables
- `change id bigint unsigned not null auto_increment` - the `primary key` changes datatype but not value, and can be used
- `drop primary key, drop key name_uidx, add primary key(name), add unique key id_uidx(id)` - swapping the two keys. Either `id` or `name` could be used

Not allowed:

- `drop primary key, drop key name_uidx` - the _ghost_ table has no unique key
- `drop primary key, drop key name_uidx, create primary key(name, owner_id)` - no shared columns to the unique keys on both tables. Even though `name` exists in the _ghost_ table's `primary key`, it is only part of the key and in itself does not guarantee uniqueness in the _ghost_ table.


### Workarounds

If you need to change your primary key or only not-null unique index to use different columns, you will want to do it as two separate migrations:
1. `ADD UNIQUE KEY temp_pk (temp_pk_column,...)`
1. `DROP PRIMARY KEY, DROP KEY temp_pk, ADD PRIMARY KEY (temp_pk_column,...)`


================================================
FILE: doc/subsecond-lag.md
================================================
# Sub-second replication lag throttling

`gh-ost` is able to utilize sub-second replication lag measurements.

At GitHub, small replication lag is crucial, and we like to keep it below `1s` at all times.

`gh-ost` will do sub-second throttling when `--max-lag-millis` is smaller than `1000`, i.e. smaller than `1sec`.
Replication lag is measured on:

- The "inspected" server (the server `gh-ost` connects to; replica is desired but not mandatory)
- The `throttle-control-replicas` list

In both cases, `gh-ost` uses an internal heartbeat mechanism. It injects heartbeat events onto the utility changelog table, then reads those entries on replicas, and compares times. This measurement is on by default and by definition supports sub-second resolution.

You can explicitly define how frequently will `gh-ost` inject heartbeat events, via `heartbeat-interval-millis`. You should set `heartbeat-interval-millis <= max-lag-millis`. It still works if not, but loses granularity and effect.

In earlier versions, the `--throttle-control-replicas` list was subjected to `1` second resolution or to 3rd party heartbeat injections such as `pt-heartbeat`. This is no longer the case. The argument `--replication-lag-query` has been deprecated and is no longer needed.

Our production migrations use sub-second lag throttling and are able to keep our entire fleet of replicas well below `1sec` lag. We use `--heartbeat-interval-millis=100` on our production migrations with a `--max-lag-millis` value of between `300` and `500`.


================================================
FILE: doc/testing-on-replica.md
================================================
# Testing on replica

`gh-ost`'s design allows for trusted and reliable tests of the migration without compromising production data integrity.

Test on replica if you:
- Are unsure of `gh-ost`, have not gained confidence into its workings
- Just want to experiment with a real migration without affecting production (maybe measure migration time?)
- Wish to observe data change impact

## What testing on replica means

TL;DR `gh-ost` will make all changes on a replica and leave both original and ghost tables for you to compare.

## Issuing a test drive

Apply `--test-on-replica --host=<a.replica>`.
- `gh-ost` would connect to the indicated server
- Will verify this is indeed a replica and not a master
- Will perform _everything_ on this replica. Other then checking who the master is, it will otherwise not touch it.
  - All `INFORMATION_SCHEMA` and `SELECT` queries run on the replica
  - Ghost table is created on the replica
  - Rows are copied onto the ghost table on the replica
  - Binlog events are read from the replica and applied to ghost table on the replica
  - So... everything

`gh-ost` will sync the ghost table with the original table.
- When it is satisfied, it will issue a `STOP SLAVE`, stopping replication
- Will finalize last few statements
- Will swap tables via normal [cut-over](cut-over.md), and immediately revert the swap.
- Will terminate. No table is dropped.

You are now left with the original table **and** the ghost table. When using a trivial `alter` statement, such as `engine-innodb`, both tables _should_ be identical.

You now have the time to verify the tool works correctly. You may checksum the entire table data if you like.
- e.g.
  `mysql -e 'select * from mydb.mytable order by id' | md5sum`
  `mysql -e 'select * from mydb._mytable_gst order by id' | md5sum`
- or of course only select the shared columns before/after the migration
- We use the trivial `engine=innodb` for `alter` when testing. This way the resulting ghost table is identical in structure to the original table (including indexes) and we expect data to be completely identical. We use `md5sum` on the entire dataset to confirm the test result.
- When adding/dropping columns, you will want to use the explicit list of shared columns before/after migration. This list is printed by `gh-ost` at the beginning of the migration.

### Cleanup

It's your job to:
- Drop the ghost table (at your leisure, you should be aware that a `DROP` can be a lengthy operation)
- Start replication back (via `START SLAVE`)

### Examples

Simple:
```shell
$ gh-ost --host=myhost.com --conf=/etc/gh-ost.cnf --database=test --table=sample_table --alter="engine=innodb" --chunk-size=2000 --max-load=Threads_connected=20 --initially-drop-ghost-table --initially-drop-old-table --test-on-replica --verbose --execute
```

Elaborate:
```shell
$ gh-ost --host=myhost.com --conf=/etc/gh-ost.cnf --database=test --table=sample_table --alter="engine=innodb" --chunk-size=2000 --max-load=Threads_connected=20 --switch-to-rbr --initially-drop-ghost-table --initially-drop-old-table --test-on-replica --postpone-cut-over-flag-file=/tmp/ghost-postpone.flag --exact-rowcount --concurrent-rowcount --allow-nullable-unique-key --verbose --execute
```
- Count exact number of rows (makes ETA estimation very good). This goes at the expense of paying the time for issuing a `SELECT COUNT(*)` on your table. We use this lovingly.
- Automatically switch to `RBR` if replica is configured as `SBR`. See also: [migrating with SBR](migrating-with-sbr.md)
- allow iterating on a `UNIQUE KEY` that has `NULL`able columns (at your own risk)

### Further notes

Do not confuse `--test-on-replica` with `--migrate-on-replica`; the latter performs the migration and _keeps it that way_ (does not revert the table swap nor stops replication)

As part of testing on replica, `gh-ost` issues a `STOP SLAVE`. This requires the `SUPER` privilege.
See related discussion on https://github.com/github/gh-ost/issues/162


================================================
FILE: doc/the-fine-print.md
================================================
# The Fine Print: What are You Not Telling Me?

Here are technical considerations you may be interested in. We write here things that are not an obvious [Requirements & Limitations](requirements-and-limitations.md)

# Connecting to replica

`gh-ost` prefers connecting to a replica. If your master uses Statement Based Replication, this is a _requirement_.

What does "connect to replica" mean?

- `gh-ost` connects to the replica as a normal client
- It additionally connects as a replica to the replica (pretends to be a MySQL replica itself)
- It auto-detects the master

`gh-ost` reads the RBR binary logs from the replica, and applies events onto the master as part of the table migration.

THE FINE PRINT:

- You trust the replica's binary logs to represent events applied on master.
  - If you don't trust the replica, or if you suspect there's data drift between replica & master, take notice. 
  - If the table on the replica has a different schema than the master, `gh-ost` likely won't work correctly.
  - Our take: we trust replica data; if master dies in production, we promote a replica. Our read serving is based on replica(s).
  
- If your master is RBR, do instead connect `gh-ost` to master, via `--allow-on-master` (see [cheatsheet](cheatsheet.md)).
  
- Replication needs to run.
  - This is an obvious, but worth stating. You cannot perform a migration with "connect to replica" if your replica lags. `gh-ost` will actually do all it can so that replication does not lag, and avoid critical operations if replication is lagging.

# Network usage

`gh-ost` reads binary logs and then applies them onto the migrated server.

THE FINE PRINT:

- `gh-ost` delivers more network traffic than other online-schema-change tools, that let MySQL handle all data transfer internally. This is part of the [triggerless design](triggerless-design.md).
  - Our take: we deal with cross-DC migration traffic and this is working well for us.

# Impersonating as a replica

`gh-ost` impersonates as a replica: it connects to a MySQL server, says "oh hey, I'm a replica, please send me binary logs kthx".

THE FINE PRINT:

- `SHOW SLAVE HOSTS` or `SHOW PROCESSLIST` will list this strange "replica" that you can't really connect to.


================================================
FILE: doc/throttle.md
================================================
# Throttle

Throughout a migration operation, `gh-ost` is either actively copying and applying data, or is _throttling_.

When _throttled_, `gh-ost` ceases to write row data and ceases to inspect binary log entries. It pauses all writes except for the low-volume changelog status writes and the heartbeat writes.

As compared with trigger-based solutions, when `gh-ost` is throttled, the write load on the master is truly removed.

Typically, throttling is based on replication lag or on master load. At such time, you wish to reduce load from master and from replication by pausing the _ghost_ writes. However, with a trigger based solution this is impossible to achieve: the triggers must remain in place and they continue to generate excess writes while the table is being used.

Since `gh-ost` is not based on triggers, but of reading binary logs, it controls its own writes. Each and every write on the master comes from the `gh-ost` app, which means `gh-ost` is able to reduce writes to a bare minimum when it wishes so.

`gh-ost` supports various means for controlling throttling behavior; it is operations friendly in that it allows the user greater, dynamic control of throttler behavior.

### Throttling parameters and factors

Throttling is controlled via the following explicit and implicit factors:

#### Replication-lag

The recommended way of running `gh-ost` is by connecting it to a replica. It will figure out the master by traversing the topology. It is by design that `gh-ost` is throttle aware: it generates its own _heartbeat_ mechanism; while it is running the migration, it is self-checking the replica to which it is connected for replication lag.

Otherwise you may specify your own list of replica servers you wish it to observe.

- `--throttle-control-replicas`: list of replicas you explicitly wish `gh-ost` to check for replication lag.

  Example: `--throttle-control-replicas=myhost1.com:3306,myhost2.com,myhost3.com:3307`

- `--max-lag-millis`: maximum allowed lag; any controlled replica lagging more than this value will cause throttling to kick in. When all control replicas have smaller lag than indicated, operation resumes.

Note that you may dynamically change both `--max-lag-millis` and the `throttle-control-replicas` list via [interactive commands](interactive-commands.md)

#### Status thresholds

- `--max-load`: list of metrics and threshold values; topping the threshold of any will cause throttler to kick in.

  Example:

  `--max-load='Threads_running=100,Threads_connected=500'`

  Metrics must be valid, numeric [status variables](https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html)

#### Throttle query

- When provided, the `--throttle-query` is expected to return a scalar integer. A return value `> 0` implies `gh-ost` should throttle. A return value `<= 0` implied `gh-ost` is free to proceed (pending other throttling factors).

An example query could be: `--throttle-query="select hour(now()) between 8 and 17"` which implies throttling auto-starts `8:00am` and migration auto-resumes at `18:00pm`.

#### HTTP Throttle

The `--throttle-http` flag allows for throttling via HTTP. Every 100ms `gh-ost` issues a `HEAD` request to the provided URL. If the response status code is not `200` throttling will kick in until a `200` response status code is returned.

If no URL is provided or the URL provided doesn't contain the scheme then the HTTP check will be disabled. For example `--throttle-http="http://1.2.3.4:6789/throttle"` will enable the HTTP check/throttling, but `--throttle-http="1.2.3.4:6789/throttle"` will not.

The URL can be queried and updated dynamically via [interactive interface](interactive-commands.md).

#### Manual control

In addition to the above, you are able to take control and throttle the operation any time you like.

- `--throttle-flag-file`: when this file exists, throttling kicks in. Just `touch` the file to begin throttling.

- `--throttle-additional-flag-file`: similar to the above. When this file exists, throttling kicks in.

  Default: `/tmp/gh-ost.throttle`

  The reason for having two files has to do with the intent of being able to run multiple migrations concurrently.
  The setup we wish to use is that each migration would have its own, specific `throttle-flag-file`, but all would use the same `throttle-additional-flag-file`. Thus, we are able to throttle specific migrations by touching their specific files, or we are able to throttle all migrations at once, by touching the shared file.

- `throttle` command via [interactive interface](interactive-commands.md).

  Example:

  ```
    echo throttle | nc -U /tmp/gh-ost.test.sample_data_0.sock
    echo no-throttle | nc -U /tmp/gh-ost.test.sample_data_0.sock
  ```

### Throttle precedence

Any single factor in the above that suggests the migration should throttle - causes throttling. That is, once some component decides to throttle, you cannot override it; you cannot force continued execution of the migration.

`gh-ost` collects different throttle-related metrics at different times, independently. It asynchronously reads the collected metrics and checks if they satisfy conditions/thresholds.

The first check to suggest throttling stops the check; the status message will note the reason for throttling as the first satisfied check.

### Throttle status

The throttle status is printed as part of the periodic [status message](understanding-output.md):

```
Copy: 0/2915 0.0%; Applied: 0; Backlog: 0/100; Time: 41s(total), 41s(copy); streamer: mysql-bin.000551:47983; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, flag-file; ETA: N/A
Copy: 0/2915 0.0%; Applied: 0; Backlog: 0/100; Time: 42s(total), 42s(copy); streamer: mysql-bin.000551:49370; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, commanded by user; ETA: N/A
```

### How long can you throttle for?

Throttling time is limited by the availability of the binary logs. When throttling begins, `gh-ost` suspends reading the binary logs, and expects to resume reading from same binary log where it paused.

Your availability of binary logs is typically determined by the [expire_logs_days](https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html#sysvar_expire_logs_days) variable. If you have `expire_logs_days = 10` (or check `select @@global.expire_logs_days`), then you should be able to throttle for up to `10` days.

Having said that, throttling for so long is far fetching, in that the `gh-ost` process itself must be kept alive during that time; and the amount of binary logs to process once it resumes will potentially take days to replay.

It is worth mentioning that some deployments have external scheduled scripts that purge binary logs, regardless of the `expire_logs_days` configuration. Please verify your own deployment configuration.

To clarify, you only need to keep binary logs on the single server `gh-ost` connects to.


================================================
FILE: doc/triggerless-design.md
================================================
# Triggerless design

A breakdown of the logic and algorithm behind `gh-ost`'s triggerless design, followed by the implications, advantages and disadvantages of such design.

### Trigger-based migrations background

It is worthwhile to consider two popular existing online schema change solutions:

- [pt-online-schema-change](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html)
- [Facebook OSC](https://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932/)

The former uses a synchronous design: it adds three triggers (`AFTER INSERT`, `AFTER UPDATE`, `AFTER DELETE`) on the original table. Each such trigger relays the operation onto the ghost table. So for every `UPDATE` on the original table, an `UPDATE` executes on the ghost table. A `DELETE` on the original table triggers a `DELETE` on the ghost table. Same for `INSERT`. The triggers live in the same transaction space as the original query.

The latter uses an asynchronous design: it adds three triggers (`AFTER INSERT`, `AFTER UPDATE`, `AFTER DELETE`) on the original table. It also creates a _changelog_ table. The triggers do not relay operations directly to the ghost table. Instead, they each add an entry to the changelog table. An `UPDATE` on the original table makes for an `INSERT` on the changelog table saying "There was an UPDATE on the original table with this and that values"; likewise for `INSERT` and `DELETE`.
A background process tails the changelog table and applies the changes onto the ghost table. This approach is asynchronous in that the applier does not live in the same transaction space as the original table, and may operate on a change event seconds or more after said event was written.
It is noteworthy that the writes to the changelog table still live in the same transaction space as the writes on the original table.

### Triggerless based asynchronous migrations

`gh-ost`'s triggerless design uses an asynchronous approach. However it does not require triggers because it does not require having a _changelog_ table like the FB tool does. The reason it does not require a changelog table is that it finds the changelog in another place: the binary logs.

In particular, it reads Row Based Replication (RBR) entries (you can still [use it with Statement Based Replication!](migrating-with-sbr.md)) and searches for entries that apply to the original table.

RBR entries are very convenient for this job: they break complex statements, potentially multi-table, into distinct, per-table, per-row entries, which are easy to read and apply.

`gh-ost` pretends to be a MySQL replica: it connects to the MySQL server and begins requesting for binlog events as though it were a real replication server. Thus, it gets a continuous streaming of the binary logs, and filters out those events that apply to the original table.

`gh-ost` can connect directly to the master, but prefers to connect to one of its replicas. Such a replica would need to use `log-slave-updates` and use `binlog-format=ROW` (`gh-ost` can change the latter setting for you).

Reading from the binary log, specially in the case of reading those on a replica, further stresses the asynchronous nature of the algorithm. While the transaction _may_ (based on configuration) be synced with the binlog entry write, it will take time until `gh-ost` - pretending to be a replica - will get notification for that, copy the event downstream and apply it.

The asynchronous design implies many noteworthy outcomes, to be discussed later on.

### Workflow overview

The workflow includes reading table data from the server, reading event data from the binary log, checking for replication lag or other throttling parameters, applying changes onto the server (typically the master), sending hints through the binary log stream and more.

Some flow breakdown:

#### Initial setup & validation
Initial setup is a no-concurrency operation

- Connecting to replica/master, detecting master identify
- Pre-validating `alter` statement
- Initial sanity: privileges, existence of tables
- Creation of changelog and ghost tables.
- Applying `alter` on ghost table
- Comparing structure of original & ghost table. Looking for shared columns, shared unique keys, validating foreign keys. Choosing shared unique key, the key by which we chunk the table and process it.
- Setting up the binlog listener; begin listening on changelog events
- Injecting a "good to go" entry onto the changelog table (to be intercepted via binary logs)
- Begin listening on binlog events for original table DMLs
- Reading original table's chosen key min/max values

#### Copy flow
This setup includes multiple moving parts, all acting concurrently with some coordination

- Setting up a heartbeat mechanism: frequent writes on the changelog table (we consider this to be low, negligible write load for throttling purposes)
- Continuously updating status
- Periodically (frequently) checking for potential throttle scenarios or hints
- Work through the original table's rows range, chunk by chunk, queueing copy tasks onto the ghost table
- Reading DML events from the binlogs, queueing apply tasks onto the ghost table
- Processing the copy tasks queue and the apply tasks queue and sequentially applying onto ghost table
  - Suspending by throttle state
- Injecting/intercepting "copy all done" once full row-copy range has been exhausted
- Stall/postpone while `postpone-cut-over-flag-file` exists (we keep apply ongoing DMLs)

#### Cut-over and completion

- Locking the original table for writes, working on what remains on the binlog event backlog (recall this is an asynchronous operation, and so even as the table is locked, we still have unhandled events in our pipe).
- Swapping the original table out, the ghost table in
- Cleanup: potential drop of tables

### Asynchronous design implications

#### Cut-over phase

A complication the asynchronous approach presents is the cut-over phase: the swapping of the tables. In the synchronous approach, the two tables are kept in sync thanks to the transaction-space in which the triggers operate. Thus, a simple, atomic `rename table original to _original_old, ghost to original` suffices and is valid.

In the asynchronous approach, as we lock the original table, we often still have events in the pipeline, changes in the binary log we still need to apply onto the ghost table. An atomic swap would be a premature and incorrect solution, since it would imply the write load would immediately proceed to operate on what used to be the ghost table, even before we completed applying those last changes.

The Facebook solution uses an "outage", two-step rename:

- Lock the original table, work on backlog
- Rename original table to `_old`
- Rename ghost table to original

In between those two renames there's a point in time where the table does not exist, hence there's a "table outage".

`gh-ost` solves this by using a two-step algorithm that blocks writes to the table, then issues an atomic swap. It uses safety latches such that the operation either succeeds, atomically, or fails, bringing us back to pre-cut-over stage.

Read more on the [cut-over](cut-over.md) documentation.

#### Decoupling

The most impacting change the triggerless, asynchronous approach provides is the decoupling of workload. With triggers, either synchronous or asynchronous, every write on your table implied an immediate write on another table.

We will break down the meaning of workload decoupling, shortly. But it is important to understand that `gh-ost` interprets the situation in its own time and acts in its own time, yet still makes this an online operation.

The decoupling is important not only as the tool's logic goes, but very importantly as the master server sees it. As far as the master knows, write to the table and writes to the ghost table are unrelated.

#### Writer load

Not using triggers means the master no longer needs to overload multiple, concurrent writes with stored routine interpretation combined with lock contention on the ghost table.

The responsibility for applying data to the ghost table is completely `gh-ost`'s. As such, `gh-ost` decides which data gets to be written to the ghost table and when. We are decoupled from the original table's write load, and choose to write to the ghost table in a single thread.

MySQL does not perform well on multiple concurrent massive writes to a specific table. Locking becomes an issue. This is why we choose to alternate between the massive row-copy and the ongoing binlog events backlog such that the server only sees writes from a single connection.

It is also interesting to observe that `gh-ost` is the only application writing to the ghost table. No one else is even aware of its existence. Thus, the trigger originated problem of high concurrency, high contention writes simply does not exist in `gh-ost`.

#### Pausability

When `gh-ost` pauses (throttles), it issues no writes on the ghost table. Because there are no triggers, write workload is decoupled from the `gh-ost` write workload. And because we're using an asynchronous approach, the algorithm already handles a time difference between a master write time and the ghost apply time. A difference of a few microseconds is no different from a difference of minutes or hours.

When `gh-ost` [throttles](throttle.md), either by replication lag, `max-load` setting or an explicit [interactive user command](interactive-commands.md), the master is back to normal. It sees no more writes on the ghost table.
An exception is the ongoing heartbeat writes onto the changelog table, which we consider to be negligible.

#### Testability

We are able to test the migration process: as we've decoupled the migration operation from the master's workload, we are good to apply the changes not to the master, but to one of its replicas. We are able to migrate a table on a replica.

This in itself is a nice feature; but it also presents us with testability: just as we complete the migration, we stop replication on the replica. We cut-over but rollback again. We do not drop any table. The result is both the original and ghost table exist on the replica, which is not taking any further changes. We have time to examine the two tables and compare them to our satisfaction.

This is the method used by GitHub to continuously validate the tool's integrity: multiple production replicas are continuously and repeatedly doing a "trivial migration" (no actually change of column) on all our production tables. Each migration is followed by a checksum of the entire table data, on both original and ghost tables. We expect the checksums to be identical and we log the results. We expect zero failures.

#### Multiple, concurrent migrations

`gh-ost` was designed with having multiple concurrent migration running in parallel (no two on the same table, of course). The asynchronous approach supports that design by not caring when data is being shipped to the ghost table. The fact no triggers exist means multiple migrations appear to the master (or other migrated host) just as multiple connections, each writing to some otherwise unknown table. Each can throttle in its own time, or we can throttle all together.

#### Going outside the server space

More to come as we make progress.

### No free meals

#### Increased traffic

The existing tools utilize triggers to propagate data changes. `gh-ost` takes upon itself to read the data, then write it back. `gh-ost` actually prefers to read from a replica and write to the master. This implies data transfers between hosts, and certainly in/out the MySQL server daemon. At this time the MySQL client library used by `gh-ost` does not support compression, and so during a migration you can expect the full volume of a table to transfer on the wire.

#### Code complexity

With the synchronous, trigger based approach, the role of the migration tool is relatively small. A lot of the migration is based on the triggers doing their job within the transaction space. Issues such as rollback, datatypes, cut-over are implicitly taken care of by the database. With `gh-ost`'s asynchronous approach, the tool turns complex. It connects to the master and onto a replica; it imposes as a replicating server; it writes heartbeat events; it reads binlog data into the app to be written again onto the migrated host; it need to manage connection failures, replication lag, and more.

The tool has therefore a larger codebase and a more complicated asynchronous, concurrent logic. But we jumped the opportunity to add some [perks](perks.md) and completely redesign how an online migration tool should work.


================================================
FILE: doc/understanding-output.md
================================================
# Understanding gh-ost output

`gh-ost` attempts to be verbose to the point where you really know what it's doing, without completely spamming you.
You can control output levels:
- `--verbose`: common use. Useful output, not tons of it
- `--debug`: everything. Tons of output.

Initial output lines may look like this:
```
2016-05-19 17:57:04 INFO starting gh-ost 0.7.14
2016-05-19 17:57:04 INFO Migrating `mydb`.`mytable`
2016-05-19 17:57:04 INFO connection validated on 127.0.0.1:3306
2016-05-19 17:57:04 INFO User has ALL privileges
2016-05-19 17:57:04 INFO binary logs validated on 127.0.0.1:3306
2016-05-19 17:57:04 INFO Restarting replication on 127.0.0.1:3306 to make sure binlog settings apply to replication thread
2016-05-19 17:57:04 INFO Table found. Engine=InnoDB
2016-05-19 17:57:05 INFO As instructed, I'm issuing a SELECT COUNT(*) on the table. This may take a while
2016-05-19 17:57:11 INFO Exact number of rows via COUNT: 4466810
2016-05-19 17:57:11 INFO --test-on-replica given. Will not execute on master the.master:3306 but rather on replica 127.0.0.1:3306 itself
2016-05-19 17:57:11 INFO Master found to be 127.0.0.1:3306
2016-05-19 17:57:11 INFO connection validated on 127.0.0.1:3306
2016-05-19 17:57:11 INFO Registering replica at 127.0.0.1:3306
2016-05-19 17:57:11 INFO Connecting binlog streamer at mysql-bin.002587:348694066
2016-05-19 17:57:11 INFO connection validated on 127.0.0.1:3306
2016-05-19 17:57:11 INFO rotate to next log name: mysql-bin.002587
2016-05-19 17:57:11 INFO connection validated on 127.0.0.1:3306
2016-05-19 17:57:11 INFO Dropping table `mydb`.`_mytable_gst`
2016-05-19 17:57:11 INFO Table dropped
2016-05-19 17:57:11 INFO Dropping table `mydb`.`_mytable_old`
2016-05-19 17:57:11 INFO Table dropped
2016-05-19 17:57:11 INFO Creating ghost table `mydb`.`_mytable_gst`
2016-05-19 17:57:11 INFO Ghost table created
2016-05-19 17:57:11 INFO Altering ghost table `mydb`.`_mytable_gst`
2016-05-19 17:57:11 INFO Ghost table altered
2016-05-19 17:57:11 INFO Dropping table `mydb`.`_mytable_osc`
2016-05-19 17:57:11 INFO Table dropped
2016-05-19 17:57:11 INFO Creating changelog table `mydb`.`_mytable_osc`
2016-05-19 17:57:11 INFO Changelog table created
2016-05-19 17:57:11 INFO Chosen shared unique key is PRIMARY
2016-05-19 17:57:11 INFO Shared columns are id,name,ref,col4,col5,col6
```
Those are relatively self explanatory. Mostly they indicate that all goes well.

You will be mostly interested in following up on the migration and understanding whether it goes well. Once migration actually begins, you will see output as follows:

```
Copy: 0/752865 0.0%; Applied: 0; Backlog: 0/100; Time: 29s(total), 0s(copy); streamer: mysql-bin.007068:846528615; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: N/A
Copy: 0/752865 0.0%; Applied: 0; Backlog: 0/100; Time: 30s(total), 1s(copy); streamer: mysql-bin.007068:846875570; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: N/A
Copy: 7300/752865 1.0%; Applied: 0; Backlog: 0/100; Time: 31s(total), 2s(copy); streamer: mysql-bin.007068:855439063; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: N/A
Copy: 14100/752865 1.9%; Applied: 0; Backlog: 0/100; Time: 32s(total), 3s(copy); streamer: mysql-bin.007068:864722759; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 2m37s
Copy: 20100/752865 2.7%; Applied: 0; Backlog: 0/100; Time: 33s(total), 4s(copy); streamer: mysql-bin.007068:874346340; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 2m26s
Copy: 27000/752865 3.6%; Applied: 0; Backlog: 0/100; Time: 34s(total), 5s(copy); streamer: mysql-bin.007068:886997306; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 2m14s
...
```
In the above some time was spent on counting table rows. `29s` have elapsed before actual rowcopy began. `gh-ost` will not deliver ETA before `1%` of the copy is complete.

```
Copy: 460900/752865 61.2%; Applied: 0; Backlog: 0/100; Time: 2m35s(total), 2m6s(copy); streamer: mysql-bin.007069:596112173; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 1m19s
Copy: 466600/752865 62.0%; Applied: 0; Backlog: 0/100; Time: 2m40s(total), 2m11s(copy); streamer: mysql-bin.007069:622646704; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, my.replica-01.com:3306 replica-lag=3.000000s; ETA: 1m19s
Copy: 478500/752865 63.6%; Applied: 0; Backlog: 0/100; Time: 2m45s(total), 2m16s(copy); streamer: mysql-bin.007069:641258880; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 1m17s
Copy: 496900/752865 66.0%; Applied: 0; Backlog: 0/100; Time: 2m50s(total), 2m21s(copy); streamer: mysql-bin.007069:678956577; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, my.replica-01.com:3306 replica-lag=2.000000s; ETA: 1m17s
Copy: 496900/752865 66.0%; Applied: 0; Backlog: 0/100; Time: 2m55s(total), 2m26s(copy); streamer: mysql-bin.007069:681610879; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, max-load Threads_running=26 >= 25; ETA: 1m17s
Copy: 528000/752865 70.1%; Applied: 0; Backlog: 0/100; Time: 3m0s(total), 2m31s(copy); streamer: mysql-bin.007069:711177703; Lag: 2.483039s, HeartbeatLag: 0.01s, State: throttled, lag=2.483039s; ETA: 1m17s
Copy: 564900/752865 75.0%; Applied: 0; Backlog: 0/100; Time: 3m30s(total), 3m1s(copy); streamer: mysql-bin.007069:795150744; Lag: 3.482914s, HeartbeatLag: 0.01s, State: throttled, lag=3.482914s; ETA: 1m17s
Copy: 577200/752865 76.7%; Applied: 0; Backlog: 0/100; Time: 3m39s(total), 3m10s(copy); streamer: mysql-bin.007069:819956052; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 57s
Copy: 589300/752865 78.3%; Applied: 0; Backlog: 0/100; Time: 3m56s(total), 3m27s(copy); streamer: mysql-bin.007069:858738375; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 57s
Copy: 595700/752865 79.1%; Applied: 0; Backlog: 0/100; Time: 3m57s(total), 3m28s(copy); streamer: mysql-bin.007069:860745762; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 54s
```

In the above migration is throttled on occasion.

- A few times because one of the control replicas, specifically `my.replica-01.com:3306`, was lagging
- Once because `max-load` threshold has been reached (`Threads_running=26 >= 25`)
- Once because the migration replica itself (the server into which `gh-ost` connected) lagged.

`gh-ost` will always specify the reason for throttling.

### Progress

- `Copy: 595700/752865 79.1%` indicates the number of existing table rows copied onto the _ghost_ table, out of an estimate of the total row count.
- `Applied: 0` indicates the number of entries processed in the binary log and applied onto the _ghost_ table. In the examples above there was no traffic on the migrated table, hence no rows processed.

A migration on a more intensively used table may look like this:

```
Copy: 30713100/43138319 71.2%; Applied: 381910; Backlog: 0/100; Time: 2h6m30s(total), 2h3m20s(copy); streamer: mysql-bin.006792:1001340307; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 49m53s
Copy: 30852500/43138338 71.5%; Applied: 383365; Backlog: 0/100; Time: 2h7m0s(total), 2h3m50s(copy); streamer: mysql-bin.006792:1050191186; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 49m18s
2016-07-25 03:20:41 INFO rotate to next log name: mysql-bin.006793
2016-07-25 03:20:41 INFO rotate to next log name: mysql-bin.006793
Copy: 30925700/43138360 71.7%; Applied: 384873; Backlog: 0/100; Time: 2h7m30s(total), 2h4m20s(copy); streamer: mysql-bin.006793:9144080; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 49m5s
Copy: 31028800/43138380 71.9%; Applied: 386325; Backlog: 0/100; Time: 2h8m0s(total), 2h4m50s(copy); streamer: mysql-bin.006793:47984430; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 48m43s
Copy: 31165600/43138397 72.2%; Applied: 387787; Backlog: 0/100; Time: 2h8m30s(total), 2h5m20s(copy); streamer: mysql-bin.006793:96139474; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 48m8s
Copy: 31291200/43138418 72.5%; Applied: 389257; Backlog: 7/100; Time: 2h9m0s(total), 2h5m50s(copy); streamer: mysql-bin.006793:141094700; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 47m38s
Copy: 31389700/43138432 72.8%; Applied: 390629; Backlog: 100/100; Time: 2h9m30s(total), 2h6m20s(copy); streamer: mysql-bin.006793:179473435; Lag: 1.548707s, HeartbeatLag: 0.01s, State: throttled, lag=1.548707s; ETA: 47m38s
```

Notes:

- `Applied: 381910`: `381910` events in the binary logs presenting changes to the migrated table have been processed and applied on the _ghost_ table since beginning of migration.
- `Backlog: 0/100`: we are performing well on reading the binary log. There's nothing known in the binary log queue that awaits processing.
- `Backlog: 7/100`: while copying rows, a few events have piled up in the binary log _modifying our table_ that we spotted, and still need to apply.
- `Backlog: 100/100`: our buffer of `100` events is full; you may see this during or right after throttling (the binary logs keep filling up with relevant queries that are not being processed), or immediately following a high workload.
  `gh-ost` will always prioritize binlog event processing (backlog) over row-copy; when next possible (throttling completes, in our example), `gh-ost` will drain the queue first, and only then proceed to resume row copy.
  There is nothing wrong with seeing `100/100`; it just indicates we're behind at that point in time.
- `Copy: 31291200/43138418`, `Copy: 31389700/43138432`: this migration executed with `--exact-rowcount`. `gh-ost` continuously heuristically updates the total number of expected row copies as migration proceeds, hence the change from `43138418` to `43138432`
- `streamer: mysql-bin.006793:179473435` tells us which binary log entry is `gh-ost` processing at this time.

### Status hint

In addition, once every `10` minutes, a friendly reminder is printed, in the following form:

```
# Migrating `mydb`.`mytable`; Ghost table is `mydb`.`_mytable_gst`
# Migrating mysql.master-01.com:3306; inspecting mysql.replica-05.com:3306; executing on some.host-17.com
# Migration started at Mon Jul 25 01:13:19 2016
# chunk-size: 500; max lag: 1000ms; max-load: Threads_running=25; critical-load: Threads_running=1000; nice-ratio: 0
# throttle-additional-flag-file: /tmp/gh-ost.throttle.flag.file
# postpone-cut-over-flag-file: /tmp/gh-ost.postpone.flag.file [set]
# panic-flag-file: /tmp/gh-ost.panic.flag.file
# Serving on unix socket: /tmp/gh-ost.mydb.mytable.sock
```

- The above mostly print out the current configuration. Remember you can [dynamically control](interactive-commands.md) most of them.
- `gh-ost` notes that the `postpone-cut-over-flag-file` file actually exists by printing `[set]`


================================================
FILE: doc/what-if.md
================================================
# What if?

Technical questions and answers. This document will be updated as we go

### What if I'm using Statement Based Replication?

You can still migrate tables with `gh-ost`. We do that. What you will need is a replica configured with:

- `log_bin`
- `log_slave_updates`
- `binlog_format=ROW`

Thus, the replica will transform the master's SBR binlogs into RBR binlogs. `gh-ost` is happy to read the binary logs from the replica. [Read more](migrating-with-sbr.md)

### What if gh-ost crashes halfway through, or I kill it?

Unlike trigger-based solutions, there's nothing urgent to clean up in the event `gh-ost` bails out or gets killed. There are the two tables creates by `gh-ost`:

- The _ghost_ table: `_yourtablename_gho`
- The _changelog_ table: `_yourtablename_ghc`

You may instruct `gh-ost` to drop these tables upon startup; or better yet, you drop them.

### What if the cut-over (table switch) is unable to proceed due to locks/timeout?

There is a `lock_wait_timeout` explicitly associated with the cut-over operation. If your table suddenly suffers from a long running query, the cut-over (involving `LOCK` and `RENAME` statements) may be unable to proceed. There's a finite number of retries, and if none of these succeeds, `gh-ost` bails out.

### What if the migration is causing a high load on my master?

This is where `gh-ost` shines. There is no need to kill it as you may be used to with other tools. You can reconfigure `gh-ost` [on the fly](https://github.com/github/gh-ost/blob/master/doc/interactive-commands.md) to be nicer.

You're always able to actively begin [throttling](throttle.md). Just touch the `throttle-file` or `echo throttle` into `gh-ost`. Otherwise, reconfigure your `max-load`, the `nice-ratio`, the `throttle-query` to gain better thresholds that would suit your needs.

### What if my replicas don't use binary logs?

If the master is running Row Based Replication (RBR) - point `gh-ost` to the master, and specify `--allow-on-master`. See [cheatsheets](cheatsheet.md)

If the master is running Statement Based Replication (SBR) - you have no alternative but to reconfigure a replica with:

- `log_bin`
- `log_slave_updates`
- `binlog_format=ROW`


================================================
FILE: doc/why-triggerless.md
================================================
# Why triggerless?

Existing MySQL schema migration tools:

- [pt-online-schema-change](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html)
- [Facebook OSC](https://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932/)
- [LHM](https://github.com/soundcloud/lhm)
- [oak-online-alter-table](https://github.com/shlomi-noach/openarkkit)

are all using [triggers](https://dev.mysql.com/doc/refman/5.7/en/triggers.html) to propagate live changes on your table onto a ghost/shadow table that is slowly being synchronized. The tools not all work the same: while most use a synchronous approach (all changes applied on the ghost table), the Facebook tool uses an asynchronous approach (changes are appended to a changelog table, later reviewed and applied on ghost table).

Use of triggers simplifies a lot of the flow in doing a live table migration, but also poses some limitations or difficulties. Here are reasons why we choose to [design a triggerless solution](triggerless-design.md) to schema migrations.


## Overview

Triggers are stored routines which are invoked on a per-row operation upon `INSERT`, `DELETE`, `UPDATE` on a table.
They were introduced in MySQL `5.0`.
A trigger may contain a set of queries, and these queries run in the same transaction space as the query that manipulates the table. This makes for an atomicity of both the original operation on the table and the trigger-invoked operations.

### Triggers, overhead

A trigger in MySQL is a stored routine. MySQL stored routines are interpreted, never compiled. With triggers, for every `INSERT`, `DELETE`, `UPDATE` on our often busy table, we pay the necessary price of the additional write (onto ghost or changelog table), but also the price of interpreting the trigger body.

We know this to be a visible overhead on very busy or very large tables.

### Triggers, locks

When a table with triggers is concurrently being written to, the triggers, being in same transaction space as the incoming queries, are also executed concurrently. While concurrent queries compete for resources via locks (e.g. the `auto_increment` value), the triggers need to _simultaneously_ compete for their own locks (e.g., likewise on the `auto_increment` value on the ghost table, in a synchronous solution). These competitions are non-coordinated.

We have evidenced near or complete lock downs in production, to the effect of rendering the table or the entire database inaccessible due to lock contention.

### Trigger based migration, no pause

The triggers are used to either apply or record ongoing changes to your original table.

Existing online migration tools (notably `pt-online-schema-change`) support the notion of _throttling_: suspending execution when the master becomes too busy, or replication is unable to catch up.

However this throttling is partial. The tool may only suspend the tedious and long task of copying the millions of rows from the original table onto the ghost table, but the tool may not, at any stage, cancel the triggers. Cancelling the triggers means loss of information, leading to incorrect data.

Thus, triggers must keep operating. On busy servers, we have seen that even as the online operation throttles, the master is brought down by the load of the triggers.

Read more about [`gh-ost` throttling](throttle.md)

### Triggers, multiple migrations

We are interested in being able to run multiple concurrent migrations (not on the same table, of course). Given all the above, we do not have trust that running multiple trigger-based migrations is a safe operation. In our current, past and shared experiences we have never done so; we are unaware of anyone who is doing so.

### Trigger based migration, no reliable production test

We sometimes wish to experiment with a migration, or know in advance how much time it would take. A trigger-based solution allows us to run a migration on a replica, provided it uses Statement Based Replication.

With Row Based Replication there is no option at all to use triggers on a replica, since the triggers only execute on the master (replica only gets notified of the _effect_ of the trigger).

But even with Statement Based Replication we do not get a reliable representation of the migration as it would have executed on the master. MySQL replication (up to and including `5.6`) is single threaded, given a table, and even in `5.7` we do not expect to find concurrency on a single table. The triggers on the replica will invoke sequentially ; they will not simulate the same load, and they will not suffer from the same concurrency and locking problems depicted above, as on the master.

### Trigger based migration, bound to server

The trigger space is within a MySQL service. It cannot go beyond that space. We are working towards a multi-server solution. More discussion as we make progress.

## Triggerless design

Proceed to read about the [triggerless design](triggerless-design.md)


================================================
FILE: docker-compose.yml
================================================
version: "3.5"
services:
  app:
    image: app
    build:
      context: .
      dockerfile: Dockerfile.test


================================================
FILE: go/base/context.go
================================================
/*
   Copyright 2022 GitHub Inc.
	 See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package base

import (
	"context"
	"fmt"
	"math"
	"os"
	"regexp"
	"strings"
	"sync"
	"sync/atomic"
	"time"
	"unicode/utf8"

	uuid "github.com/google/uuid"

	"github.com/github/gh-ost/go/mysql"
	"github.com/github/gh-ost/go/sql"
	"github.com/openark/golib/log"

	"github.com/go-ini/ini"
)

// RowsEstimateMethod is the type of row number estimation
type RowsEstimateMethod string

const (
	TableStatusRowsEstimate RowsEstimateMethod = "TableStatusRowsEstimate"
	ExplainRowsEstimate     RowsEstimateMethod = "ExplainRowsEstimate"
	CountRowsEstimate       RowsEstimateMethod = "CountRowsEstimate"
)

type CutOver int

const (
	CutOverAtomic CutOver = iota
	CutOverTwoStep
)

type ThrottleReasonHint string

const (
	NoThrottleReasonHint                 ThrottleReasonHint = "NoThrottleReasonHint"
	UserCommandThrottleReasonHint        ThrottleReasonHint = "UserCommandThrottleReasonHint"
	LeavingHibernationThrottleReasonHint ThrottleReasonHint = "LeavingHibernationThrottleReasonHint"
)

const (
	HTTPStatusOK       = 200
	MaxEventsBatchSize = 1000
	ETAUnknown         = math.MinInt64
)

var (
	envVariableRegexp = regexp.MustCompile("[$][{](.*)[}]")
)

type ThrottleCheckResult struct {
	ShouldThrottle bool
	Reason         string
	ReasonHint     ThrottleReasonHint
}

func NewThrottleCheckResult(throttle bool, reason string, reasonHint ThrottleReasonHint) *ThrottleCheckResult {
	return &ThrottleCheckResult{
		ShouldThrottle: throttle,
		Reason:         reason,
		ReasonHint:     reasonHint,
	}
}

// MigrationContext has the general, global state of migration. It is used by
// all components throughout the migration process.
type MigrationContext struct {
	Uuid string

	DatabaseName          string
	OriginalTableName     string
	AlterStatement        string
	AlterStatementOptions string // anything following the 'ALTER TABLE [schema.]table' from AlterStatement

	countMutex               sync.Mutex
	countTableRowsCancelFunc func()
	CountTableRows           bool
	ConcurrentCountTableRows bool
	AllowedRunningOnMaster   bool
	AllowedMasterMaster      bool
	SwitchToRowBinlogFormat  bool
	AssumeRBR                bool
	SkipForeignKeyChecks     bool
	SkipStrictMode           bool
	AllowZeroInDate          bool
	NullableUniqueKeyAllowed bool
	ApproveRenamedColumns    bool
	SkipRenamedColumns       bool
	IsTungsten               bool
	DiscardForeignKeys       bool
	AliyunRDS                bool
	GoogleCloudPlatform      bool
	AzureMySQL               bool
	AttemptInstantDDL        bool
	Resume                   bool
	Revert                   bool
	OldTableName             string

	// SkipPortValidation allows skipping the port validation in `ValidateConnection`
	// This is useful when connecting to a MySQL instance where the external port
	// may not match the internal port.
	SkipPortValidation bool
	UseGTIDs           bool

	config            ContextConfig
	configMutex       *sync.Mutex
	ConfigFile        string
	CliUser           string
	CliPassword       string
	UseTLS            bool
	TLSAllowInsecure  bool
	TLSCACertificate  string
	TLSCertificate    string
	TLSKey            string
	CliMasterUser     string
	CliMasterPassword string

	HeartbeatIntervalMilliseconds       int64
	defaultNumRetries                   int64
	ChunkSize                           int64
	niceRatio                           float64
	MaxLagMillisecondsThrottleThreshold int64
	throttleControlReplicaKeys          *mysql.InstanceKeyMap
	ThrottleFlagFile                    string
	ThrottleAdditionalFlagFile          string
	throttleQuery                       string
	throttleHTTP                        string
	IgnoreHTTPErrors                    bool
	ThrottleCommandedByUser             int64
	HibernateUntil                      int64
	maxLoad                             LoadMap
	criticalLoad                        LoadMap
	CriticalLoadIntervalMilliseconds    int64
	CriticalLoadHibernateSeconds        int64
	PostponeCutOverFlagFile             string
	CutOverLockTimeoutSeconds           int64
	CutOverExponentialBackoff           bool
	ExponentialBackoffMaxInterval       int64
	ForceNamedCutOverCommand            bool
	ForceNamedPanicCommand              bool
	PanicFlagFile                       string
	HooksPath                           string
	HooksHintMessage                    string
	HooksHintOwner                      string
	HooksHintToken                      string
	HooksStatusIntervalSec              int64
	PanicOnWarnings                     bool
	Checkpoint                          bool
	CheckpointIntervalSeconds           int64

	DropServeSocket bool
	ServeSocketFile string
	ServeTCPPort    int64

	Noop                         bool
	TestOnReplica                bool
	MigrateOnReplica             bool
	TestOnReplicaSkipReplicaStop bool
	OkToDropTable                bool
	InitiallyDropOldTable        bool
	InitiallyDropGhostTable      bool
	TimestampOldTable            bool // Should old table name include a timestamp
	CutOverType                  CutOver
	ReplicaServerId              uint

	Hostname                               string
	AssumeMasterHostname                   string
	ApplierTimeZone                        string
	ApplierWaitTimeout                     int64
	TableEngine                            string
	RowsEstimate                           int64
	RowsDeltaEstimate                      int64
	UsedRowsEstimateMethod                 RowsEstimateMethod
	HasSuperPrivilege                      bool
	OriginalBinlogFormat                   string
	OriginalBinlogRowImage                 string
	InspectorConnectionConfig              *mysql.ConnectionConfig
	InspectorMySQLVersion                  string
	ApplierConnectionConfig                *mysql.ConnectionConfig
	ApplierMySQLVersion                    string
	StartTime                              time.Time
	RowCopyStartTime                       time.Time
	RowCopyEndTime                         time.Time
	LockTablesStartTime                    time.Time
	RenameTablesStartTime                  time.Time
	RenameTablesEndTime                    time.Time
	pointOfInterestTime                    time.Time
	pointOfInterestTimeMutex               *sync.Mutex
	lastHeartbeatOnChangelogTime           time.Time
	lastHeartbeatOnChangelogMutex          *sync.Mutex
	CurrentLag                             int64
	currentProgress                        uint64
	etaNanoseonds                          int64
	EtaRowsPerSecond                       int64
	ThrottleHTTPIntervalMillis             int64
	ThrottleHTTPStatusCode                 int64
	ThrottleHTTPTimeoutMillis              int64
	controlReplicasLagResult               mysql.ReplicationLagResult
	TotalRowsCopied                        int64
	TotalDMLEventsApplied                  int64
	DMLBatchSize                           int64
	isThrottled                            bool
	throttleReason                         string
	throttleReasonHint                     ThrottleReasonHint
	throttleGeneralCheckResult             ThrottleCheckResult
	throttleMutex                          *sync.Mutex
	throttleHTTPMutex                      *sync.Mutex
	IsPostponingCutOver                    int64
	CountingRowsFlag                       int64
	AllEventsUpToLockProcessedInjectedFlag int64
	CleanupImminentFlag                    int64
	UserCommandedUnpostponeFlag            int64
	CutOverCompleteFlag                    int64
	InCutOverCriticalSectionFlag           int64
	PanicAbort                             chan error

	// Context for cancellation signaling across all goroutines
	// Stored in struct as it spans the entire migration lifecycle, not per-function.
	// context.Context is safe for concurrent use by multiple goroutines.
	ctx        context.Context //nolint:containedctx
	cancelFunc context.CancelFunc

	// Stores the fatal error that triggered abort
	AbortError error
	abortMutex *sync.Mutex

	OriginalTableColumnsOnApplier    *sql.ColumnList
	OriginalTableColumns             *sql.ColumnList
	OriginalTableVirtualColumns      *sql.ColumnList
	OriginalTableUniqueKeys          [](*sql.UniqueKey)
	OriginalTableAutoIncrement       uint64
	GhostTableColumns                *sql.ColumnList
	GhostTableVirtualColumns         *sql.ColumnList
	GhostTableUniqueKeys             [](*sql.UniqueKey)
	UniqueKey                        *sql.UniqueKey
	SharedColumns                    *sql.ColumnList
	ColumnRenameMap                  map[string]string
	DroppedColumnsMap                map[string]bool
	MappedSharedColumns              *sql.ColumnList
	MigrationLastInsertSQLWarnings   []string
	MigrationRangeMinValues          *sql.ColumnValues
	MigrationRangeMaxValues          *sql.ColumnValues
	Iteration                        int64
	MigrationIterationRangeMinValues *sql.ColumnValues
	MigrationIterationRangeMaxValues *sql.ColumnValues
	InitialStreamerCoords            mysql.BinlogCoordinates
	ForceTmpTableName                string

	IncludeTriggers     bool
	RemoveTriggerSuffix bool
	TriggerSuffix       string
	Triggers            []mysql.Trigger

	recentBinlogCoordinates mysql.BinlogCoordinates

	BinlogSyncerMaxReconnectAttempts  int
	AllowSetupMetadataLockInstruments bool
	SkipMetadataLockCheck             bool
	IsOpenMetadataLockInstruments     bool

	Log Logger
}

type Logger interface {
	Debug(args ...interface{})
	Debugf(format string, args ...interface{})
	Info(args ...interface{})
	Infof(format string, args ...interface{})
	Warning(args ...interface{}) error
	Warningf(format string, args ...interface{}) error
	Error(args ...interface{}) error
	Errorf(format string, args ...interface{}) error
	Errore(err error) error
	Fatal(args ...interface{}) error
	Fatalf(format string, args ...interface{}) error
	Fatale(err error) error
	SetLevel(level log.LogLevel)
	SetPrintStackTrace(printStackTraceFlag bool)
}

type ContextConfig struct {
	Client struct {
		User     string
		Password string
	}
	Osc struct {
		Chunk_Size            int64
		Max_Lag_Millis        int64
		Replication_Lag_Query string
		Max_Load              string
	}
}

func NewMigrationContext() *MigrationContext {
	ctx, cancelFunc := context.WithCancel(context.Background())
	return &MigrationContext{
		Uuid:                                uuid.NewString(),
		defaultNumRetries:                   60,
		ChunkSize:                           1000,
		InspectorConnectionConfig:           mysql.NewConnectionConfig(),
		ApplierConnectionConfig:             mysql.NewConnectionConfig(),
		MaxLagMillisecondsThrottleThreshold: 1500,
		CutOverLockTimeoutSeconds:           3,
		DMLBatchSize:                        10,
		etaNanoseonds:                       ETAUnknown,
		maxLoad:                             NewLoadMap(),
		criticalLoad:                        NewLoadMap(),
		throttleMutex:                       &sync.Mutex{},
		throttleHTTPMutex:                   &sync.Mutex{},
		throttleControlReplicaKeys:          mysql.NewInstanceKeyMap(),
		configMutex:                         &sync.Mutex{},
		pointOfInterestTimeMutex:            &sync.Mutex{},
		lastHeartbeatOnChangelogMutex:       &sync.Mutex{},
		ColumnRenameMap:                     make(map[string]string),
		PanicAbort:                          make(chan error),
		ctx:                                 ctx,
		cancelFunc:                          cancelFunc,
		abortMutex:                          &sync.Mutex{},
		Log:                                 NewDefaultLogger(),
	}
}

func (this *MigrationContext) SetConnectionConfig(storageEngine string) error {
	var transactionIsolation string
	switch storageEngine {
	case "rocksdb":
		transactionIsolation = "READ-COMMITTED"
	default:
		transactionIsolation = "REPEATABLE-READ"
	}
	this.InspectorConnectionConfig.TransactionIsolation = transactionIsolation
	this.ApplierConnectionConfig.TransactionIsolation = transactionIsolation
	return nil
}

func (this *MigrationContext) SetConnectionCharset(charset string) {
	if charset == "" {
		charset = "utf8mb4,utf8,latin1"
	}

	this.InspectorConnectionConfig.Charset = charset
	this.ApplierConnectionConfig.Charset = charset
}

func getSafeTableName(baseName string, suffix string) string {
	name := fmt.Sprintf("_%s_%s", baseName, suffix)
	if len(name) <= mysql.MaxTableNameLength {
		return name
	}
	extraCharacters := len(name) - mysql.MaxTableNameLength
	return fmt.Sprintf("_%s_%s", baseName[0:len(baseName)-extraCharacters], suffix)
}

// GetGhostTableName generates the name of ghost table, based on original table name
// or a given table name
func (this *MigrationContext) GetGhostTableName() string {
	if this.Revert {
		// When reverting the "ghost" table is the _del table from the original migration.
		return this.OldTableName
	}
	if this.ForceTmpTableName != "" {
		return getSafeTableName(this.ForceTmpTableName, "gho")
	} else {
		return getSafeTableName(this.OriginalTableName, "gho")
	}
}

// GetOldTableName generates the name of the "old" table, into which the original table is renamed.
func (this *MigrationContext) GetOldTableName() string {
	var tableName string
	if this.ForceTmpTableName != "" {
		tableName = this.ForceTmpTableName
	} else {
		tableName = this.OriginalTableName
	}

	suffix := "del"
	if this.Revert {
		suffix = "rev_del"
	}
	if this.TimestampOldTable {
		t := this.StartTime
		timestamp := fmt.Sprintf("%d%02d%02d%02d%02d%02d",
			t.Year(), t.Month(), t.Day(),
			t.Hour(), t.Minute(), t.Second())
		return getSafeTableName(tableName, fmt.Sprintf("%s_%s", timestamp, suffix))
	}
	return getSafeTableName(tableName, suffix)
}

// GetChangelogTableName generates the name of changelog table, based on original table name
// or a given table name.
func (this *MigrationContext) GetChangelogTableName() string {
	if this.ForceTmpTableName != "" {
		return getSafeTableName(this.ForceTmpTableName, "ghc")
	} else {
		return getSafeTableName(this.OriginalTableName, "ghc")
	}
}

// GetCheckpointTableName generates the name of checkpoint table.
func (this *MigrationContext) GetCheckpointTableName() string {
	if this.ForceTmpTableName != "" {
		return getSafeTableName(this.ForceTmpTableName, "ghk")
	} else {
		return getSafeTableName(this.OriginalTableName, "ghk")
	}
}

// GetVoluntaryLockName returns a name of a voluntary lock to be used throughout
// the swap-tables process.
func (this *MigrationContext) GetVoluntaryLockName() string {
	return fmt.Sprintf("%s.%s.lock", this.DatabaseName, this.OriginalTableName)
}

// RequiresBinlogFormatChange is `true` when the original binlog format isn't `ROW`
func (this *MigrationContext) RequiresBinlogFormatChange() bool {
	return this.OriginalBinlogFormat != "ROW"
}

// GetApplierHostname is a safe access method to the applier hostname
func (this *MigrationContext) GetApplierHostname() string {
	if this.ApplierConnectionConfig == nil {
		return ""
	}
	if this.ApplierConnectionConfig.ImpliedKey == nil {
		return ""
	}
	return this.ApplierConnectionConfig.ImpliedKey.Hostname
}

// GetInspectorHostname is a safe access method to the inspector hostname
func (this *MigrationContext) GetInspectorHostname() string {
	if this.InspectorConnectionConfig == nil {
		return ""
	}
	if this.InspectorConnectionConfig.ImpliedKey == nil {
		return ""
	}
	return this.InspectorConnectionConfig.ImpliedKey.Hostname
}

// InspectorIsAlsoApplier is `true` when the both inspector and applier are the
// same database instance. This would be true when running directly on master or when
// testing on replica.
func (this *MigrationContext) InspectorIsAlsoApplier() bool {
	return this.InspectorConnectionConfig.Equals(this.ApplierConnectionConfig)
}

// HasMigrationRange tells us whether there's a range to iterate for copying rows.
// It will be `false` if the table is initially empty
func (this *MigrationContext) HasMigrationRange() bool {
	return this.MigrationRangeMinValues != nil && this.MigrationRangeMaxValues != nil
}

func (this *MigrationContext) SetCutOverLockTimeoutSeconds(timeoutSeconds int64) error {
	if timeoutSeconds < 1 {
		return fmt.Errorf("Minimal timeout is 1sec. Timeout remains at %d", this.CutOverLockTimeoutSeconds)
	}
	if timeoutSeconds > 10 {
		return fmt.Errorf("Maximal timeout is 10sec. Timeout remains at %d", this.CutOverLockTimeoutSeconds)
	}
	this.CutOverLockTimeoutSeconds = timeoutSeconds
	return nil
}

func (this *MigrationContext) SetExponentialBackoffMaxInterval(intervalSeconds int64) error {
	if intervalSeconds < 2 {
		return fmt.Errorf("Minimal maximum interval is 2sec. Timeout remains at %d", this.ExponentialBackoffMaxInterval)
	}
	this.ExponentialBackoffMaxInterval = intervalSeconds
	return nil
}

func (this *MigrationContext) SetDefaultNumRetries(retries int64) {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()
	if retries > 0 {
		this.defaultNumRetries = retries
	}
}

func (this *MigrationContext) MaxRetries() int64 {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()
	retries := this.defaultNumRetries
	return retries
}

func (this *MigrationContext) IsTransactionalTable() bool {
	switch strings.ToLower(this.TableEngine) {
	case "innodb":
		{
			return true
		}
	case "tokudb":
		{
			return true
		}
	case "rocksdb":
		{
			return true
		}
	}
	return false
}

// SetCountTableRowsCancelFunc sets the cancel function for the CountTableRows query context
func (this *MigrationContext) SetCountTableRowsCancelFunc(f func()) {
	this.countMutex.Lock()
	defer this.countMutex.Unlock()

	this.countTableRowsCancelFunc = f
}

// IsCountingTableRows returns true if the migration has a table count query running
func (this *MigrationContext) IsCountingTableRows() bool {
	this.countMutex.Lock()
	defer this.countMutex.Unlock()

	return this.countTableRowsCancelFunc != nil
}

// CancelTableRowsCount cancels the CountTableRows query context. It is safe to
// call function even when IsCountingTableRows is false.
func (this *MigrationContext) CancelTableRowsCount() {
	this.countMutex.Lock()
	defer this.countMutex.Unlock()

	if this.countTableRowsCancelFunc == nil {
		return
	}

	this.countTableRowsCancelFunc()
	this.countTableRowsCancelFunc = nil
}

// ElapsedTime returns time since very beginning of the process
func (this *MigrationContext) ElapsedTime() time.Duration {
	return time.Since(this.StartTime)
}

// MarkRowCopyStartTime
func (this *MigrationContext) MarkRowCopyStartTime() {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()
	this.RowCopyStartTime = time.Now()
}

// ElapsedRowCopyTime returns time since starting to copy chunks of rows
func (this *MigrationContext) ElapsedRowCopyTime() time.Duration {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	if this.RowCopyStartTime.IsZero() {
		// Row copy hasn't started yet
		return 0
	}

	if this.RowCopyEndTime.IsZero() {
		return time.Since(this.RowCopyStartTime)
	}
	return this.RowCopyEndTime.Sub(this.RowCopyStartTime)
}

// ElapsedRowCopyTime returns time since starting to copy chunks of rows
func (this *MigrationContext) MarkRowCopyEndTime() {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()
	this.RowCopyEndTime = time.Now()
}

func (this *MigrationContext) TimeSinceLastHeartbeatOnChangelog() time.Duration {
	return time.Since(this.GetLastHeartbeatOnChangelogTime())
}

func (this *MigrationContext) GetCurrentLagDuration() time.Duration {
	return time.Duration(atomic.LoadInt64(&this.CurrentLag))
}

func (this *MigrationContext) GetProgressPct() float64 {
	return math.Float64frombits(atomic.LoadUint64(&this.currentProgress))
}

func (this *MigrationContext) SetProgressPct(progressPct float64) {
	atomic.StoreUint64(&this.currentProgress, math.Float64bits(progressPct))
}

func (this *MigrationContext) GetETADuration() time.Duration {
	return time.Duration(atomic.LoadInt64(&this.etaNanoseonds))
}

func (this *MigrationContext) SetETADuration(etaDuration time.Duration) {
	atomic.StoreInt64(&this.etaNanoseonds, etaDuration.Nanoseconds())
}

func (this *MigrationContext) GetETASeconds() int64 {
	nano := atomic.LoadInt64(&this.etaNanoseonds)
	if nano < 0 {
		return ETAUnknown
	}
	return nano / int64(time.Second)
}

// math.Float64bits([f=0..100])

// GetTotalRowsCopied returns the accurate number of rows being copied (affected)
// This is not exactly the same as the rows being iterated via chunks, but potentially close enough
func (this *MigrationContext) GetTotalRowsCopied() int64 {
	return atomic.LoadInt64(&this.TotalRowsCopied)
}

func (this *MigrationContext) GetIteration() int64 {
	return atomic.LoadInt64(&this.Iteration)
}

func (this *MigrationContext) SetNextIterationRangeMinValues() {
	this.MigrationIterationRangeMinValues = this.MigrationIterationRangeMaxValues
	if this.MigrationIterationRangeMinValues == nil {
		this.MigrationIterationRangeMinValues = this.MigrationRangeMinValues
	}
}

func (this *MigrationContext) MarkPointOfInterest() int64 {
	this.pointOfInterestTimeMutex.Lock()
	defer this.pointOfInterestTimeMutex.Unlock()

	this.pointOfInterestTime = time.Now()
	return atomic.LoadInt64(&this.Iteration)
}

func (this *MigrationContext) TimeSincePointOfInterest() time.Duration {
	this.pointOfInterestTimeMutex.Lock()
	defer this.pointOfInterestTimeMutex.Unlock()

	return time.Since(this.pointOfInterestTime)
}

func (this *MigrationContext) SetLastHeartbeatOnChangelogTime(t time.Time) {
	this.lastHeartbeatOnChangelogMutex.Lock()
	defer this.lastHeartbeatOnChangelogMutex.Unlock()

	this.lastHeartbeatOnChangelogTime = t
}

func (this *MigrationContext) GetLastHeartbeatOnChangelogTime() time.Time {
	this.lastHeartbeatOnChangelogMutex.Lock()
	defer this.lastHeartbeatOnChangelogMutex.Unlock()

	return this.lastHeartbeatOnChangelogTime
}

func (this *MigrationContext) SetHeartbeatIntervalMilliseconds(heartbeatIntervalMilliseconds int64) {
	if heartbeatIntervalMilliseconds < 100 {
		heartbeatIntervalMilliseconds = 100
	}
	if heartbeatIntervalMilliseconds > 1000 {
		heartbeatIntervalMilliseconds = 1000
	}
	this.HeartbeatIntervalMilliseconds = heartbeatIntervalMilliseconds
}

func (this *MigrationContext) SetMaxLagMillisecondsThrottleThreshold(maxLagMillisecondsThrottleThreshold int64) {
	if maxLagMillisecondsThrottleThreshold < 100 {
		maxLagMillisecondsThrottleThreshold = 100
	}
	atomic.StoreInt64(&this.MaxLagMillisecondsThrottleThreshold, maxLagMillisecondsThrottleThreshold)
}

func (this *MigrationContext) SetChunkSize(chunkSize int64) {
	if chunkSize < 10 {
		chunkSize = 10
	}
	if chunkSize > 100000 {
		chunkSize = 100000
	}
	atomic.StoreInt64(&this.ChunkSize, chunkSize)
}

func (this *MigrationContext) SetDMLBatchSize(batchSize int64) {
	if batchSize < 1 {
		batchSize = 1
	}
	if batchSize > MaxEventsBatchSize {
		batchSize = MaxEventsBatchSize
	}
	atomic.StoreInt64(&this.DMLBatchSize, batchSize)
}

func (this *MigrationContext) SetThrottleGeneralCheckResult(checkResult *ThrottleCheckResult) *ThrottleCheckResult {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()
	this.throttleGeneralCheckResult = *checkResult
	return checkResult
}

func (this *MigrationContext) GetThrottleGeneralCheckResult() *ThrottleCheckResult {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()
	result := this.throttleGeneralCheckResult
	return &result
}

func (this *MigrationContext) SetThrottled(throttle bool, reason string, reasonHint ThrottleReasonHint) {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()
	this.isThrottled = throttle
	this.throttleReason = reason
	this.throttleReasonHint = reasonHint
}

func (this *MigrationContext) IsThrottled() (bool, string, ThrottleReasonHint) {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	// we don't throttle when cutting over. We _do_ throttle:
	// - during copy phase
	// - just before cut-over
	// - in between cut-over retries
	// When cutting over, we need to be aggressive. Cut-over holds table locks.
	// We need to release those asap.
	if atomic.LoadInt64(&this.InCutOverCriticalSectionFlag) > 0 {
		return false, "critical section", NoThrottleReasonHint
	}
	return this.isThrottled, this.throttleReason, this.throttleReasonHint
}

func (this *MigrationContext) GetThrottleQuery() string {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	var query = this.throttleQuery
	return query
}

func (this *MigrationContext) SetThrottleQuery(newQuery string) {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	this.throttleQuery = newQuery
}

func (this *MigrationContext) GetThrottleHTTP() string {
	this.throttleHTTPMutex.Lock()
	defer this.throttleHTTPMutex.Unlock()

	var throttleHTTP = this.throttleHTTP
	return throttleHTTP
}

func (this *MigrationContext) SetThrottleHTTP(throttleHTTP string) {
	this.throttleHTTPMutex.Lock()
	defer this.throttleHTTPMutex.Unlock()

	this.throttleHTTP = throttleHTTP
}

func (this *MigrationContext) SetIgnoreHTTPErrors(ignoreHTTPErrors bool) {
	this.throttleHTTPMutex.Lock()
	defer this.throttleHTTPMutex.Unlock()

	this.IgnoreHTTPErrors = ignoreHTTPErrors
}

func (this *MigrationContext) GetMaxLoad() LoadMap {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	return this.maxLoad.Duplicate()
}

func (this *MigrationContext) GetCriticalLoad() LoadMap {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	return this.criticalLoad.Duplicate()
}

func (this *MigrationContext) GetNiceRatio() float64 {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	return this.niceRatio
}

func (this *MigrationContext) SetNiceRatio(newRatio float64) {
	if newRatio < 0.0 {
		newRatio = 0.0
	}
	if newRatio > 100.0 {
		newRatio = 100.0
	}

	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()
	this.niceRatio = newRatio
}

func (this *MigrationContext) GetRecentBinlogCoordinates() mysql.BinlogCoordinates {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	return this.recentBinlogCoordinates
}

func (this *MigrationContext) SetRecentBinlogCoordinates(coordinates mysql.BinlogCoordinates) {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()
	this.recentBinlogCoordinates = coordinates
}

// ReadMaxLoad parses the `--max-load` flag, which is in multiple key-value format,
// such as: 'Threads_running=100,Threads_connected=500'
// It only applies changes in case there's no parsing error.
func (this *MigrationContext) ReadMaxLoad(maxLoadList string) error {
	loadMap, err := ParseLoadMap(maxLoadList)
	if err != nil {
		return err
	}
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	this.maxLoad = loadMap
	return nil
}

// ReadCriticalLoad parses the `--max-load` flag, which is in multiple key-value format,
// such as: 'Threads_running=100,Threads_connected=500'
// It only applies changes in case there's no parsing error.
func (this *MigrationContext) ReadCriticalLoad(criticalLoadList string) error {
	loadMap, err := ParseLoadMap(criticalLoadList)
	if err != nil {
		return err
	}
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	this.criticalLoad = loadMap
	return nil
}

func (this *MigrationContext) GetControlReplicasLagResult() mysql.ReplicationLagResult {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	lagResult := this.controlReplicasLagResult
	return lagResult
}

func (this *MigrationContext) SetControlReplicasLagResult(lagResult *mysql.ReplicationLagResult) {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()
	if lagResult == nil {
		this.controlReplicasLagResult = *mysql.NewNoReplicationLagResult()
	} else {
		this.controlReplicasLagResult = *lagResult
	}
}

func (this *MigrationContext) GetThrottleControlReplicaKeys() *mysql.InstanceKeyMap {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	keys := mysql.NewInstanceKeyMap()
	keys.AddKeys(this.throttleControlReplicaKeys.GetInstanceKeys())
	return keys
}

func (this *MigrationContext) ReadThrottleControlReplicaKeys(throttleControlReplicas string) error {
	keys := mysql.NewInstanceKeyMap()
	if err := keys.ReadCommaDelimitedList(throttleControlReplicas); err != nil {
		return err
	}

	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	this.throttleControlReplicaKeys = keys
	return nil
}

func (this *MigrationContext) AddThrottleControlReplicaKey(key mysql.InstanceKey) error {
	this.throttleMutex.Lock()
	defer this.throttleMutex.Unlock()

	this.throttleControlReplicaKeys.AddKey(key)
	return nil
}

// ApplyCredentials sorts out the credentials between the config file and the CLI flags
func (this *MigrationContext) ApplyCredentials() {
	this.configMutex.Lock()
	defer this.configMutex.Unlock()

	if this.config.Client.User != "" {
		this.InspectorConnectionConfig.User = this.config.Client.User
	}
	if this.CliUser != "" {
		// Override
		this.InspectorConnectionConfig.User = this.CliUser
	}
	if this.config.Client.Password != "" {
		this.InspectorConnectionConfig.Password = this.config.Client.Password
	}
	if this.CliPassword != "" {
		// Override
		this.InspectorConnectionConfig.Password = this.CliPassword
	}
}

func (this *MigrationContext) SetupTLS() error {
	if this.UseTLS {
		return this.InspectorConnectionConfig.UseTLS(this.TLSCACertificate, this.TLSCertificate, this.TLSKey, this.TLSAllowInsecure)
	}
	return nil
}

// ReadConfigFile attempts to read the config file, if it exists
func (this *MigrationContext) ReadConfigFile() error {
	this.configMutex.Lock()
	defer this.configMutex.Unlock()

	if this.ConfigFile == "" {
		return nil
	}
	cfg, err := ini.Load(this.ConfigFile)
	if err != nil {
		return err
	}

	if cfg.Section("client").HasKey("user") {
		this.config.Client.User = cfg.Section("client").Key("user").String()
	}

	if cfg.Section("client").HasKey("password") {
		this.config.Client.Password = cfg.Section("client").Key("password").String()
	}

	if cfg.Section("osc").HasKey("chunk_size") {
		this.config.Osc.Chunk_Size, err = cfg.Section("osc").Key("chunk_size").Int64()
		if err != nil {
			return fmt.Errorf("Unable to read osc chunk size: %w", err)
		}
	}

	if cfg.Section("osc").HasKey("max_load") {
		this.config.Osc.Max_Load = cfg.Section("osc").Key("max_load").String()
	}

	if cfg.Section("osc").HasKey("replication_lag_query") {
		this.config.Osc.Replication_Lag_Query = cfg.Section("osc").Key("replication_lag_query").String()
	}

	if cfg.Section("osc").HasKey("max_lag_millis") {
		this.config.Osc.Max_Lag_Millis, err = cfg.Section("osc").Key("max_lag_millis").Int64()
		if err != nil {
			return fmt.Errorf("Unable to read max lag millis: %w", err)
		}
	}

	// We accept user & password in the form "${SOME_ENV_VARIABLE}" in which case we pull
	// the given variable from os env
	if submatch := envVariableRegexp.FindStringSubmatch(this.config.Client.User); len(submatch) > 1 {
		this.config.Client.User = os.Getenv(submatch[1])
	}
	if submatch := envVariableRegexp.FindStringSubmatch(this.config.Client.Password); len(submatch) > 1 {
		this.config.Client.Password = os.Getenv(submatch[1])
	}

	return nil
}

// getGhostTriggerName generates the name of a ghost trigger, based on original trigger name
// or a given trigger name
func (this *MigrationContext) GetGhostTriggerName(triggerName string) string {
	if this.RemoveTriggerSuffix && strings.HasSuffix(triggerName, this.TriggerSuffix) {
		return strings.TrimSuffix(triggerName, this.TriggerSuffix)
	}
	// else
	return triggerName + this.TriggerSuffix
}

// ValidateGhostTriggerLengthBelowMaxLength checks if the given trigger name (already transformed
// by GetGhostTriggerName) does not exceed the maximum allowed length.
func (this *MigrationContext) ValidateGhostTriggerLengthBelowMaxLength(triggerName string) bool {
	return utf8.RuneCountInString(triggerName) <= mysql.MaxTableNameLength
}

// GetContext returns the migration context for cancellation checking
func (this *MigrationContext) GetContext() context.Context {
	return this.ctx
}

// SetAbortError stores the fatal error that triggered abort
// Only the first error is stored (subsequent errors are ignored)
func (this *MigrationContext) SetAbortError(err error) {
	this.abortMutex.Lock()
	defer this.abortMutex.Unlock()
	if this.AbortError == nil {
		this.AbortError = err
	}
}

// GetAbortError retrieves the stored abort error
func (this *MigrationContext) GetAbortError() error {
	this.abortMutex.Lock()
	defer this.abortMutex.Unlock()
	return this.AbortError
}

// CancelContext cancels the migration context to signal all goroutines to stop
// The cancel function is safe to call multiple times and from multiple goroutines.
func (this *MigrationContext) CancelContext() {
	if this.cancelFunc != nil {
		this.cancelFunc()
	}
}

// SendWithContext attempts to send a value to a channel, but returns early
// if the context is cancelled. This prevents goroutine deadlocks when the
// channel receiver has exited due to an error.
//
// Use this instead of bare channel sends (ch <- val) in goroutines to ensure
// proper cleanup when the migration is aborted.
//
// Example:
//
//	if err := base.SendWithContext(ctx, ch, value); err != nil {
//	    return err  // context was cancelled
//	}
func SendWithContext[T any](ctx context.Context, ch chan<- T, val T) error {
	select {
	case ch <- val:
		return nil
	case <-ctx.Done():
		return ctx.Err()
	}
}


================================================
FILE: go/base/context_test.go
================================================
/*
   Copyright 2021 GitHub Inc.
	 See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package base

import (
	"errors"
	"os"
	"strings"
	"sync"
	"testing"
	"time"

	"github.com/openark/golib/log"
	"github.com/stretchr/testify/require"
)

func init() {
	log.SetLevel(log.ERROR)
}

func TestGetTableNames(t *testing.T) {
	{
		context := NewMigrationContext()
		context.OriginalTableName = "some_table"
		require.Equal(t, "_some_table_del", context.GetOldTableName())
		require.Equal(t, "_some_table_gho", context.GetGhostTableName())
		require.Equal(t, "_some_table_ghc", context.GetChangelogTableName(), "_some_table_ghc")
	}
	{
		context := NewMigrationContext()
		context.OriginalTableName = "a123456789012345678901234567890123456789012345678901234567890"
		require.Equal(t, "_a1234567890123456789012345678901234567890123456789012345678_del", context.GetOldTableName())
		require.Equal(t, "_a1234567890123456789012345678901234567890123456789012345678_gho", context.GetGhostTableName())
		require.Equal(t, "_a1234567890123456789012345678901234567890123456789012345678_ghc", context.GetChangelogTableName())
	}
	{
		context := NewMigrationContext()
		context.OriginalTableName = "a123456789012345678901234567890123456789012345678901234567890123"
		oldTableName := context.GetOldTableName()
		require.Equal(t, "_a1234567890123456789012345678901234567890123456789012345678_del", oldTableName)
	}
	{
		context := NewMigrationContext()
		context.OriginalTableName = "a123456789012345678901234567890123456789012345678901234567890123"
		context.TimestampOldTable = true
		longForm := "Jan 2, 2006 at 3:04pm (MST)"
		context.StartTime, _ = time.Parse(longForm, "Feb 3, 2013 at 7:54pm (PST)")
		oldTableName := context.GetOldTableName()
		require.Equal(t, "_a1234567890123456789012345678901234567890123_20130203195400_del", oldTableName)
	}
	{
		context := NewMigrationContext()
		context.OriginalTableName = "foo_bar_baz"
		context.ForceTmpTableName = "tmp"
		require.Equal(t, "_tmp_del", context.GetOldTableName())
		require.Equal(t, "_tmp_gho", context.GetGhostTableName())
		require.Equal(t, "_tmp_ghc", context.GetChangelogTableName())
	}
}

func TestGetTriggerNames(t *testing.T) {
	{
		context := NewMigrationContext()
		context.TriggerSuffix = "_gho"
		require.Equal(t, "my_trigger"+context.TriggerSuffix, context.GetGhostTriggerName("my_trigger"))
	}
	{
		context := NewMigrationContext()
		context.TriggerSuffix = "_gho"
		context.RemoveTriggerSuffix = true
		require.Equal(t, "my_trigger"+context.TriggerSuffix, context.GetGhostTriggerName("my_trigger"))
	}
	{
		context := NewMigrationContext()
		context.TriggerSuffix = "_gho"
		context.RemoveTriggerSuffix = true
		require.Equal(t, "my_trigger", context.GetGhostTriggerName("my_trigger_gho"))
	}
	{
		context := NewMigrationContext()
		context.TriggerSuffix = "_gho"
		context.RemoveTriggerSuffix = false
		require.Equal(t, "my_trigger_gho_gho", context.GetGhostTriggerName("my_trigger_gho"))
	}
}

func TestValidateGhostTriggerLengthBelowMaxLength(t *testing.T) {
	// Tests simulate the real call pattern: GetGhostTriggerName first, then validate the result.
	{
		// Short trigger name with suffix appended: well under 64 chars
		context := NewMigrationContext()
		context.TriggerSuffix = "_gho"
		ghostName := context.GetGhostTriggerName("my_trigger") // "my_trigger_gho" = 14 chars
		require.True(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
	}
	{
		// 64-char original + "_ghost" suffix = 70 chars → exceeds limit
		context := NewMigrationContext()
		context.TriggerSuffix = "_ghost"
		ghostName := context.GetGhostTriggerName(strings.Repeat("my_trigger_ghost", 4)) // 64 + 6 = 70
		require.False(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
	}
	{
		// 48-char original + "_ghost" suffix = 54 chars → valid
		context := NewMigrationContext()
		context.TriggerSuffix = "_ghost"
		ghostName := context.GetGhostTriggerName(strings.Repeat("my_trigger_ghost", 3)) // 48 + 6 = 54
		require.True(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
	}
	{
		// RemoveTriggerSuffix: 64-char name ending in "_ghost" → suffix removed → 58 chars → valid
		context := NewMigrationContext()
		context.TriggerSuffix = "_ghost"
		context.RemoveTriggerSuffix = true
		ghostName := context.GetGhostTriggerName(strings.Repeat("my_trigger_ghost", 4)) // suffix removed → 58
		require.True(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
	}
	{
		// RemoveTriggerSuffix: name doesn't end in suffix → suffix appended → 65 + 6 = 71 chars → exceeds
		context := NewMigrationContext()
		context.TriggerSuffix = "_ghost"
		context.RemoveTriggerSuffix = true
		ghostName := context.GetGhostTriggerName(strings.Repeat("my_trigger_ghost", 4) + "X") // no match, appended → 71
		require.False(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
	}
	{
		// RemoveTriggerSuffix: 70-char name ending in "_ghost" → suffix removed → 64 chars → exactly at limit → valid
		context := NewMigrationContext()
		context.TriggerSuffix = "_ghost"
		context.RemoveTriggerSuffix = true
		ghostName := context.GetGhostTriggerName(strings.Repeat("my_trigger_ghost", 4) + "_ghost") // suffix removed → 64
		require.True(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
	}
	{
		// Edge case: exactly 64 chars after transformation → valid (boundary test)
		context := NewMigrationContext()
		context.TriggerSuffix = "_ght"
		originalName := strings.Repeat("x", 60)                // 60 chars
		ghostName := context.GetGhostTriggerName(originalName) // 60 + 4 = 64
		require.Equal(t, 64, len(ghostName))
		require.True(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
	}
	{
		// Edge case: 65 chars after transformation → exceeds (boundary test)
		context := NewMigrationContext()
		context.TriggerSuffix = "_ght"
		originalName := strings.Repeat("x", 61)                // 61 chars
		ghostName := context.GetGhostTriggerName(originalName) // 61 + 4 = 65
		require.Equal(t, 65, len(ghostName))
		require.False(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
	}
}

func TestReadConfigFile(t *testing.T) {
	{
		context := NewMigrationContext()
		context.ConfigFile = "/does/not/exist"
		if err := context.ReadConfigFile(); err == nil {
			t.Fatal("Expected .ReadConfigFile() to return an error, got nil")
		}
	}
	{
		f, err := os.CreateTemp("", t.Name())
		if err != nil {
			t.Fatalf("Failed to create tmp file: %v", err)
		}
		defer os.Remove(f.Name())

		f.Write([]byte("[client]"))
		context := NewMigrationContext()
		context.ConfigFile = f.Name()
		if err := context.ReadConfigFile(); err != nil {
			t.Fatalf(".ReadConfigFile() failed: %v", err)
		}
	}
	{
		f, err := os.CreateTemp("", t.Name())
		if err != nil {
			t.Fatalf("Failed to create tmp file: %v", err)
		}
		defer os.Remove(f.Name())

		f.Write([]byte("[client]\nuser=test\npassword=123456"))
		context := NewMigrationContext()
		context.ConfigFile = f.Name()
		if err := context.ReadConfigFile(); err != nil {
			t.Fatalf(".ReadConfigFile() failed: %v", err)
		}

		if context.config.Client.User != "test" {
			t.Fatalf("Expected client user %q, got %q", "test", context.config.Client.User)
		} else if context.config.Client.Password != "123456" {
			t.Fatalf("Expected client password %q, got %q", "123456", context.config.Client.Password)
		}
	}
	{
		f, err := os.CreateTemp("", t.Name())
		if err != nil {
			t.Fatalf("Failed to create tmp file: %v", err)
		}
		defer os.Remove(f.Name())

		f.Write([]byte("[osc]\nmax_load=10"))
		context := NewMigrationContext()
		context.ConfigFile = f.Name()
		if err := context.ReadConfigFile(); err != nil {
			t.Fatalf(".ReadConfigFile() failed: %v", err)
		}

		if context.config.Osc.Max_Load != "10" {
			t.Fatalf("Expected osc 'max_load' %q, got %q", "10", context.config.Osc.Max_Load)
		}
	}
}

func TestSetAbortError_StoresFirstError(t *testing.T) {
	ctx := NewMigrationContext()

	err1 := errors.New("first error")
	err2 := errors.New("second error")

	ctx.SetAbortError(err1)
	ctx.SetAbortError(err2)

	got := ctx.GetAbortError()
	if got != err1 { //nolint:errorlint // Testing pointer equality for sentinel error
		t.Errorf("Expected first error %v, got %v", err1, got)
	}
}

func TestSetAbortError_ThreadSafe(t *testing.T) {
	ctx := NewMigrationContext()

	var wg sync.WaitGroup
	errs := []error{
		errors.New("error 1"),
		errors.New("error 2"),
		errors.New("error 3"),
	}

	// Launch 3 goroutines trying to set error concurrently
	for _, err := range errs {
		wg.Add(1)
		go func(e error) {
			defer wg.Done()
			ctx.SetAbortError(e)
		}(err)
	}

	wg.Wait()

	// Should store exactly one of the errors
	got := ctx.GetAbortError()
	if got == nil {
		t.Fatal("Expected error to be stored, got nil")
	}

	// Verify it's one of the errors we sent
	found := false
	for _, err := range errs {
		if got == err { //nolint:errorlint // Testing pointer equality for sentinel error
			found = true
			break
		}
	}
	if !found {
		t.Errorf("Stored error %v not in list of sent errors", got)
	}
}


================================================
FILE: go/base/default_logger.go
================================================
/*
   Copyright 2022 GitHub Inc.
         See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package base

import (
	"github.com/openark/golib/log"
)

type simpleLogger struct{}

func NewDefaultLogger() *simpleLogger {
	return &simpleLogger{}
}

func (*simpleLogger) Debug(args ...interface{}) {
	log.Debug(args[0].(string), args[1:])
}

func (*simpleLogger) Debugf(format string, args ...interface{}) {
	log.Debugf(format, args...)
}

func (*simpleLogger) Info(args ...interface{}) {
	log.Info(args[0].(string), args[1:])
}

func (*simpleLogger) Infof(format string, args ...interface{}) {
	log.Infof(format, args...)
}

func (*simpleLogger) Warning(args ...interface{}) error {
	return log.Warning(args[0].(string), args[1:])
}

func (*simpleLogger) Warningf(format string, args ...interface{}) error {
	return log.Warningf(format, args...)
}

func (*simpleLogger) Error(args ...interface{}) error {
	return log.Error(args[0].(string), args[1:])
}

func (*simpleLogger) Errorf(format string, args ...interface{}) error {
	return log.Errorf(format, args...)
}

func (*simpleLogger) Errore(err error) error {
	return log.Errore(err)
}

func (*simpleLogger) Fatal(args ...interface{}) error {
	return log.Fatal(args[0].(string), args[1:])
}

func (*simpleLogger) Fatalf(format string, args ...interface{}) error {
	return log.Fatalf(format, args...)
}

func (*simpleLogger) Fatale(err error) error {
	return log.Fatale(err)
}

func (*simpleLogger) SetLevel(level log.LogLevel) {
	log.SetLevel(level)
}

func (*simpleLogger) SetPrintStackTrace(printStackTraceFlag bool) {
	log.SetPrintStackTrace(printStackTraceFlag)
}


================================================
FILE: go/base/load_map.go
================================================
/*
   Copyright 2016 GitHub Inc.
	 See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package base

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

// LoadMap is a mapping of status variable & threshold
// e.g. [Threads_connected: 100, Threads_running: 50]
type LoadMap map[string]int64

func NewLoadMap() LoadMap {
	result := make(map[string]int64)
	return result
}

// NewLoadMap parses a `--*-load` flag (e.g. `--max-load`), which is in multiple
// key-value format, such as:
//
//	'Threads_running=100,Threads_connected=500'
func ParseLoadMap(loadList string) (LoadMap, error) {
	result := NewLoadMap()
	if loadList == "" {
		return result, nil
	}

	loadConditions := strings.Split(loadList, ",")
	for _, loadCondition := range loadConditions {
		loadTokens := strings.Split(loadCondition, "=")
		if len(loadTokens) != 2 {
			return result, fmt.Errorf("Error parsing load condition: %s", loadCondition)
		}
		if loadTokens[0] == "" {
			return result, fmt.Errorf("Error parsing status variable in load condition: %s", loadCondition)
		}
		if n, err := strconv.ParseInt(loadTokens[1], 10, 0); err != nil {
			return result, fmt.Errorf("Error parsing numeric value in load condition: %s", loadCondition)
		} else {
			result[loadTokens[0]] = n
		}
	}

	return result, nil
}

// Duplicate creates a clone of this map
func (this *LoadMap) Duplicate() LoadMap {
	dup := make(map[string]int64)
	for k, v := range *this {
		dup[k] = v
	}
	return dup
}

// String() returns a string representation of this map
func (this *LoadMap) String() string {
	tokens := []string{}
	for key, val := range *this {
		token := fmt.Sprintf("%s=%d", key, val)
		tokens = append(tokens, token)
	}
	sort.Strings(tokens)
	return strings.Join(tokens, ",")
}


================================================
FILE: go/base/load_map_test.go
================================================
/*
   Copyright 2016 GitHub Inc.
	 See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package base

import (
	"testing"

	"github.com/openark/golib/log"
	"github.com/stretchr/testify/require"
)

func init() {
	log.SetLevel(log.ERROR)
}

func TestParseLoadMap(t *testing.T) {
	{
		loadList := ""
		m, err := ParseLoadMap(loadList)
		require.NoError(t, err)
		require.Len(t, m, 0)
	}
	{
		loadList := "threads_running=20,threads_connected=10"
		m, err := ParseLoadMap(loadList)
		require.NoError(t, err)
		require.Len(t, m, 2)
		require.Equal(t, int64(20), m["threads_running"])
		require.Equal(t, int64(10), m["threads_connected"])
	}
	{
		loadList := "threads_running=20=30,threads_connected=10"
		_, err := ParseLoadMap(loadList)
		require.Error(t, err)
	}
	{
		loadList := "threads_running=20,threads_connected"
		_, err := ParseLoadMap(loadList)
		require.Error(t, err)
	}
}

func TestString(t *testing.T) {
	{
		m, _ := ParseLoadMap("")
		s := m.String()
		require.Equal(t, "", s)
	}
	{
		loadList := "threads_running=20,threads_connected=10"
		m, _ := ParseLoadMap(loadList)
		s := m.String()
		require.Equal(t, "threads_connected=10,threads_running=20", s)
	}
}


================================================
FILE: go/base/utils.go
================================================
/*
   Copyright 2022 GitHub Inc.
	 See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package base

import (
	"fmt"
	"os"
	"regexp"
	"strings"
	"time"

	gosql "database/sql"

	"github.com/github/gh-ost/go/mysql"
)

var (
	prettifyDurationRegexp = regexp.MustCompile("([.][0-9]+)")
)

func PrettifyDurationOutput(d time.Duration) string {
	if d < time.Second {
		return "0s"
	}
	return prettifyDurationRegexp.ReplaceAllString(d.String(), "")
}

func FileExists(fileName string) bool {
	if _, err := os.Stat(fileName); err == nil {
		return true
	}
	return false
}

func TouchFile(fileName string) error {
	f, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE, 0755)
	if err != nil {
		return err
	}
	return f.Close()
}

// StringContainsAll returns true if `s` contains all non empty given `substrings`
// The function returns `false` if no non-empty arguments are given.
func StringContainsAll(s string, substrings ...string) bool {
	nonEmptyStringsFound := false
	for _, substring := range substrings {
		if substring == "" {
			continue
		}
		if strings.Contains(s, substring) {
			nonEmptyStringsFound = true
		} else {
			// Immediate failure
			return false
		}
	}
	return nonEmptyStringsFound
}

func ValidateConnection(db *gosql.DB, connectionConfig *mysql.ConnectionConfig, migrationContext *MigrationContext, name string) (string, error) {
	versionQuery := `select @@global.version`

	var version string
	if err := db.QueryRow(versionQuery).Scan(&version); err != nil {
		return "", err
	}

	if migrationContext.SkipPortValidation {
		return version, nil
	}

	var extraPort int

	extraPortQuery := `select @@global.extra_port`
	if err := db.QueryRow(extraPortQuery).Scan(&extraPort); err != nil { //nolint:staticcheck
		// swallow this error. not all servers support extra_port
	}

	// AliyunRDS set users port to "NULL", replace it by gh-ost param
	// GCP set users port to "NULL", replace it by gh-ost param
	// Azure MySQL set users port to a different value by design, replace it by gh-ost para
	var port int
	if migrationContext.AliyunRDS || migrationContext.GoogleCloudPlatform || migrationContext.AzureMySQL {
		port = connectionConfig.Key.Port
	} else {
		portQuery := `select @@global.port`
		if err := db.QueryRow(portQuery).Scan(&port); err != nil {
			return "", err
		}
	}

	if connectionConfig.Key.Port == port || (extraPort > 0 && connectionConfig.Key.Port == extraPort) {
		migrationContext.Log.Infof("%s connection validated on %+v", name, connectionConfig.Key)
		return version, nil
	} else if extraPort == 0 {
		return "", fmt.Errorf("Unexpected database port reported: %+v", port)
	} else {
		return "", fmt.Errorf("Unexpected database port reported: %+v / extra_port: %+v", port, extraPort)
	}
}


================================================
FILE: go/base/utils_test.go
================================================
/*
   Copyright 2016 GitHub Inc.
	 See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package base

import (
	"testing"

	"github.com/openark/golib/log"
	"github.com/stretchr/testify/require"
)

func init() {
	log.SetLevel(log.ERROR)
}

func TestStringContainsAll(t *testing.T) {
	s := `insert,delete,update`

	require.False(t, StringContainsAll(s))
	require.False(t, StringContainsAll(s, ""))
	require.False(t, StringContainsAll(s, "drop"))
	require.True(t, StringContainsAll(s, "insert"))
	require.False(t, StringContainsAll(s, "insert", "drop"))
	require.True(t, StringContainsAll(s, "insert", ""))
	require.True(t, StringContainsAll(s, "insert", "update", "delete"))
}


================================================
FILE: go/binlog/binlog_dml_event.go
================================================
/*
   Copyright 2016 GitHub Inc.
	 See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package binlog

import (
	"fmt"
	"strings"

	"github.com/github/gh-ost/go/sql"
)

type EventDML string

const (
	NotDML    EventDML = "NoDML"
	InsertDML EventDML = "Insert"
	UpdateDML EventDML = "Update"
	DeleteDML EventDML = "Delete"
)

func ToEventDML(description string) EventDML {
	// description can be a statement (`UPDATE my_table ...`) or a RBR event name (`UpdateRowsEventV2`)
	description = strings.TrimSpace(strings.Split(description, " ")[0])
	switch strings.ToLower(description) {
	case "insert":
		return InsertDML
	case "update":
		return UpdateDML
	case "delete":
		return DeleteDML
	}
	if strings.HasPrefix(description, "WriteRows") {
		return InsertDML
	}
	if strings.HasPrefix(description, "UpdateRows") {
		return UpdateDML
	}
	if strings.HasPrefix(description, "DeleteRows") {
		return DeleteDML
	}
	return NotDML
}

// BinlogDMLEvent is a binary log rows (DML) event entry, with data
type BinlogDMLEvent struct {
	DatabaseName      string
	TableName         string
	DML               EventDML
	WhereColumnValues *sql.ColumnValues
	NewColumnValues   *sql.ColumnValues
}

func NewBinlogDMLEvent(databaseName, tableName string, dml EventDML) *BinlogDMLEvent {
	event := &BinlogDMLEvent{
		DatabaseName: databaseName,
		TableName:    tableName,
		DML:          dml,
	}
	return event
}

func (this *BinlogDMLEvent) String() string {
	return fmt.Sprintf("[%+v on %s:%s]", this.DML, this.DatabaseName, this.TableName)
}


================================================
FILE: go/binlog/binlog_entry.go
================================================
/*
   Copyright 2022 GitHub Inc.
	 See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package binlog

import (
	"fmt"

	"github.com/github/gh-ost/go/mysql"
)

// BinlogEntry describes an entry in the binary log
type BinlogEntry struct {
	Coordinates mysql.BinlogCoordinates
	DmlEvent    *BinlogDMLEvent
}

// NewBinlogEntryAt creates an empty, ready to go BinlogEntry object
func NewBinlogEntryAt(coordinates mysql.BinlogCoordinates) *BinlogEntry {
	binlogEntry := &BinlogEntry{
		Coordinates: coordinates,
	}
	return binlogEntry
}

// String() returns a string representation of this binlog entry
func (this *BinlogEntry) String() string {
	return fmt.Sprintf("[BinlogEntry at %+v; dml:%+v]", this.Coordinates, this.DmlEvent)
}


================================================
FILE: go/binlog/binlog_reader.go
================================================
/*
   Copyright 2016 GitHub Inc.
	 See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package binlog

// BinlogReader is a general interface whose implementations can choose their methods of reading
// a binary log file and parsing it into binlog entries
type BinlogReader interface {
	StreamEvents(canStopStreaming func() bool, entriesChannel chan<- *BinlogEntry) error
	Reconnect() error
}


================================================
FILE: go/binlog/gomysql_reader.go
================================================
/*
   Copyright 2022 GitHub Inc.
	 See https://github.com/github/gh-ost/blob/master/LICENSE
*/

package binlog

import (
	"fmt"
	"sync"

	"github.com/github/gh-ost/go/base"
	"github.com/github/gh-ost/go/mysql"
	"github.com/github/gh-ost/go/sql"

	"time"

	gomysql "github.com/go-mysql-org/go-mysql/mysql"
	"github.com/go-mysql-org/go-mysql/replication"
	uuid "github.com/google/uuid"
	"golang.org/x/net/context"
)

type GoMySQLReader struct {
	migrationContext        *base.MigrationContext
	connectionConfig        *mysql.ConnectionConfig
	binlogSyncer            *replication.BinlogSyncer
	binlogStreamer          *replication.BinlogStreamer
	currentCoordinates      mysql.BinlogCoordinates
	currentCoordinatesMutex *sync.Mutex
	// LastTrxCoords are the coordinates of the last transaction completely read.
	// If using the file coordinates it is binlog position of the transaction's XID event.
	LastTrxCoords mysql.BinlogCoordinates
}

func NewGoMySQLReader(migrationContext *base.MigrationContext) *GoMySQLReader {
	connectionConfig := migrationContext.InspectorConnectionConfig
	return &GoMySQLReader{
		migrationContext:        migrationContext,
		connectionConfig:        connectionConfig,
		currentCoordinatesMutex: &sync.Mutex{},
		binlogSyncer: replication.NewBinlogSyncer(replication.BinlogSyncerConfig{
			ServerID:                uint32(migrationContext.ReplicaServerId),
			Flavor:                  gomysql.MySQLFlavor,
			Host:                    connectionConfig.Key.Hostname,
			Port:                    uint16(connectionConfig.Key.Port),
			User:                    connectionConfig.User,
			Password:                connectionConfig.Password,
			TLSConfig:               connectionConfig.TLSConfig(),
			UseDecimal:              true,
			TimestampStringLocation: time.UTC,
			MaxReconnectAttempts:    migrationContext.BinlogSyncerMaxReconnectAttempts,
		}),
	}
}

// ConnectBinlogStreamer
func (this *GoMySQLReader) ConnectBinlogStreamer(coordinates mysql.BinlogCoordinates) (err error) {
	if coordinates.IsEmpty() {
		return this.migrationContext.Log.Errorf("Empty coordinates at ConnectBinlogStreamer()")
	}

	this.currentCoordinatesMutex.Lock()
	defer this.currentCoordinatesMutex.Unlock()
	this.currentCoordinates = coordinates
	this.migrationContext.Log.Infof("Connecting binlog streamer at %+v", coordinates)

	// Start sync with specified GTID set or binlog file and position
	if this.migrationContext.UseGTIDs {
		coords := coordinates.(*mysql.GTIDBinlogCoordinates)
		this.binlogStreamer, err = this.binlogSyncer.StartSyncGTID(coords.GTIDSet)
	} else {
		coords := this.currentCoordinates.(*mysql.FileBinlogCoordinates)
		this.binlogStreamer, err = this.binlogSyncer.StartSync(gomysql.Position{
			Name: coords.LogFile,
			Pos:  uint32(coords.LogPos)},
		)
	}
	return err
}

func (this *GoMySQLReader) GetCurrentBinlogCoordinates() mysql.BinlogCoordinates {
	this.currentCoordinatesMutex.Lock()
	defer this.currentCoordinatesMutex.Unlock()
	return this.currentCoordinates.Clone()
}

func (this *GoMySQLReader) handleRowsEvent(ev *replication.BinlogEvent, rowsEvent *replication.RowsEvent, entriesChannel chan<- *BinlogEntry) error {
	currentCoords := this.GetCurrentBinlogCoordinates()
	dml := ToEventDML(ev.Header.EventType.String())
	if dml == NotDML {
		return fmt.Errorf("Unknown DML type: %s", ev.Header.EventType.String())
	}
	for i, row := range rowsEvent.Rows {
		if dml == UpdateDML && i%2 == 1 {
			// An update has two rows (WHERE+SET)
			// We do both at the same time
			continue
		}
		binlogEntry := NewBinlogEntryAt(currentCoords)
		binlogEntry.DmlEvent = NewBinlogDMLEvent(
			string(rowsEvent.Table.Schema),
			string(rowsEvent.Table.Table),
			dml,
		)
		switch dml {
		case InsertDML:
			{
				binlogEntry.DmlEvent.NewColumnValues = sql.ToColumnValues(row)
			}
		case UpdateDML:
			{
				binlogEntry.DmlEvent.WhereColumnValues = sql.ToColumnValues(row)
				binlogEntry.DmlEvent.NewColumnValues = sql.ToColumnValues(rowsEvent.Rows[i+1])
			}
		case DeleteDML:
			{
				binlogEntry.DmlEvent.WhereColumnValues = sql.ToColumnValues(row)
			}
		}

		// The channel will do the throttling. Whoever is reading from the channel
		// decides whether action is taken synchronously (meaning we wait before
		// next iteration) or asynchronously (we keep pushing more events)
		// In reality, reads will be synchronous
		entriesChannel <- binlogEntry
	}
	return nil
}

// StreamEvents
func (this *GoMySQLReader) StreamEvents(canStopStreaming func() bool, entriesChannel chan<- *BinlogEntry) error {
	if canStopStreaming() {
		return nil
	}
	for {
		if canStopStreaming() {
			break
		}
		ev, err := this.binlogStreamer.GetEvent(context.Background())
		if err != nil {
			return err
		}

		// Update binlog coords if using file-based coords.
		// GTID coordinates are updated on receiving GTID events.
		if !this.migrationContext.UseGTIDs {
			this.currentCoordinatesMutex.Lock()
			coords := this.currentCoordinates.(*mysql.FileBinlogCoordinates)
			prevCoords := coords.Clone().(*mysql.FileBinlogCoordinates)
			coords.LogPos = int64(ev.Header.LogPos)
			coords.EventSize = int64(ev.Header.EventSize)
			if coords.IsLogPosOverflowBeyond4Bytes(prevCoords) {
				this.currentCoordinatesMutex.Unlock()
				return fmt.Errorf("Unexpected rows event at %+v, the binlog end_log_pos is overflow 4 bytes", coords)
			}
			this.currentCoordinatesMutex.Unlock()
		}

		switch event := ev.Event.(type) {
		case *replication.GTIDEvent:
			if !this.migrationContext.UseGTIDs {
				continue
			}
			sid, err := uuid.FromBytes(event.SID)
			if err != nil {
				return err
			}
			this.currentCoordinatesMutex.Lock()
			if this.LastTrxCoords != nil {
				this.currentCoordinates = this.LastTrxCoords.Clone()
			}
			coords := this.currentCoordinates.(*mysql.GTIDBinlogCoordinates)
			trxGset := gomysql.NewUUIDSet(sid, gomysql.Interval{Start: event.GNO, Stop: event.GNO + 1})
			coords.GTIDSet.AddSet(trxGset)
			this.currentCoordinatesMutex.Unlock()
		case *replication.RotateEvent:
			if this.migrationContext.UseGTIDs {
				continue
			}
			this.currentCoordinatesMutex.Lock
Download .txt
gitextract_0igtfzyc/

├── .github/
│   ├── CODEOWNERS
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       ├── codeql.yml
│       ├── golangci-lint.yml
│       └── replica-tests.yml
├── .gitignore
├── .golangci.yml
├── Dockerfile.packaging
├── Dockerfile.test
├── LICENSE
├── README.md
├── build.sh
├── doc/
│   ├── azure.md
│   ├── cheatsheet.md
│   ├── coding-ghost.md
│   ├── command-line-flags.md
│   ├── cut-over.md
│   ├── hooks.md
│   ├── interactive-commands.md
│   ├── local-tests.md
│   ├── migrating-with-sbr.md
│   ├── perks.md
│   ├── questions.md
│   ├── rds.md
│   ├── requirements-and-limitations.md
│   ├── resume.md
│   ├── revert.md
│   ├── shared-key.md
│   ├── subsecond-lag.md
│   ├── testing-on-replica.md
│   ├── the-fine-print.md
│   ├── throttle.md
│   ├── triggerless-design.md
│   ├── understanding-output.md
│   ├── what-if.md
│   └── why-triggerless.md
├── docker-compose.yml
├── go/
│   ├── base/
│   │   ├── context.go
│   │   ├── context_test.go
│   │   ├── default_logger.go
│   │   ├── load_map.go
│   │   ├── load_map_test.go
│   │   ├── utils.go
│   │   └── utils_test.go
│   ├── binlog/
│   │   ├── binlog_dml_event.go
│   │   ├── binlog_entry.go
│   │   ├── binlog_reader.go
│   │   ├── gomysql_reader.go
│   │   └── testdata/
│   │       ├── mysql-bin.000066
│   │       ├── mysql-bin.000070
│   │       ├── rbr-sample-0.txt
│   │       ├── rbr-sample-1.txt
│   │       └── rbr-sample-2.txt
│   ├── cmd/
│   │   └── gh-ost/
│   │       └── main.go
│   ├── logic/
│   │   ├── applier.go
│   │   ├── applier_test.go
│   │   ├── checkpoint.go
│   │   ├── hooks.go
│   │   ├── hooks_test.go
│   │   ├── inspect.go
│   │   ├── inspect_test.go
│   │   ├── migrator.go
│   │   ├── migrator_test.go
│   │   ├── my.cnf.test
│   │   ├── server.go
│   │   ├── server_test.go
│   │   ├── streamer.go
│   │   ├── streamer_test.go
│   │   ├── test_utils.go
│   │   └── throttler.go
│   ├── mysql/
│   │   ├── binlog.go
│   │   ├── binlog_file.go
│   │   ├── binlog_file_test.go
│   │   ├── binlog_gtid.go
│   │   ├── connection.go
│   │   ├── connection_test.go
│   │   ├── instance_key.go
│   │   ├── instance_key_map.go
│   │   ├── instance_key_test.go
│   │   ├── replica_terminology_map.go
│   │   └── utils.go
│   └── sql/
│       ├── builder.go
│       ├── builder_test.go
│       ├── encoding.go
│       ├── parser.go
│       ├── parser_test.go
│       ├── types.go
│       └── types_test.go
├── go.mod
├── go.sum
├── localtests/
│   ├── alter-charset/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── alter-charset-all-dml/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── attempt-instant-ddl/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── autoinc-copy-deletes/
│   │   ├── create.sql
│   │   └── expect_table_structure
│   ├── autoinc-copy-deletes-user-defined/
│   │   ├── create.sql
│   │   ├── expect_table_structure
│   │   └── extra_args
│   ├── autoinc-copy-simple/
│   │   ├── create.sql
│   │   └── expect_table_structure
│   ├── autoinc-zero-value/
│   │   └── create.sql
│   ├── bigint-change-nullable/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── binary-to-varbinary/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── bit-add/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── bit-dml/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── compound-pk/
│   │   └── create.sql
│   ├── compound-pk-ts/
│   │   └── create.sql
│   ├── convert-utf8mb4/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── copy-retries-exhausted/
│   │   ├── after.sql
│   │   ├── before.sql
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── datetime/
│   │   └── create.sql
│   ├── datetime-1970/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   ├── orig_columns
│   │   └── sql_mode
│   ├── datetime-submillis/
│   │   └── create.sql
│   ├── datetime-submillis-zeroleading/
│   │   └── create.sql
│   ├── datetime-to-timestamp/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── datetime-to-timestamp-pk-fail/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── datetime-with-zero/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── decimal/
│   │   └── create.sql
│   ├── discard-fk/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   └── ignore_versions
│   ├── docker-compose.yml
│   ├── drop-null-add-not-null/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── enum/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── enum-pk/
│   │   └── create.sql
│   ├── enum-to-varchar/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── existing-datetime-with-zero/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── fail-datetime-with-zero/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-drop-pk/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-existing-datetime-with-zero/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-fk/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── ignore_versions
│   ├── fail-fk-parent/
│   │   ├── create.sql
│   │   ├── destroy.sql
│   │   ├── expect_failure
│   │   ├── extra_args
│   │   └── ignore_versions
│   ├── fail-float-unique-key/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-no-shared-uk/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-no-unique-key/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-rename-table/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── fail-update-pk-column/
│   │   └── create.sql
│   ├── gbk-charset/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── generated-columns/
│   │   ├── create.sql
│   │   └── ignore_versions
│   ├── generated-columns-add/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   ├── ignore_versions
│   │   ├── order_by
│   │   └── orig_columns
│   ├── generated-columns-rename/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   └── ignore_versions
│   ├── generated-columns-unique/
│   │   ├── create.sql
│   │   └── ignore_versions
│   ├── geometry/
│   │   ├── create.sql
│   │   └── ignore_versions
│   ├── gtid/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── gtid_mode
│   │   └── ignore_versions
│   ├── json/
│   │   └── create.sql
│   ├── json-dml/
│   │   └── create.sql
│   ├── keyword-column/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── latin1/
│   │   └── create.sql
│   ├── latin1text/
│   │   └── create.sql
│   ├── mixed-charset/
│   │   └── create.sql
│   ├── modify-change-case/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── modify-change-case-pk/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── panic-on-warnings-duplicate-unique-values-on-column-type-change/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── panic-on-warnings-duplicate-values-for-unique-index/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── panic-on-warnings-update-pk-with-duplicate-on-new-unique-index/
│   │   ├── create.sql
│   │   ├── expect_failure
│   │   ├── extra_args
│   │   └── test.sh
│   ├── rename/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── rename-inserts-only/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── rename-none-column/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── rename-none-comment/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── rename-reorder-column/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── rename-reorder-columns/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── reorder-columns/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── shared-uk/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── spatial/
│   │   ├── create.sql
│   │   └── ignore_versions
│   ├── swap-pk-uk/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   └── order_by
│   ├── swap-uk/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── swap-uk-uk/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   └── order_by
│   ├── sysbench/
│   │   └── create.sql
│   ├── test.sh
│   ├── timestamp/
│   │   └── create.sql
│   ├── timestamp-datetime/
│   │   └── create.sql
│   ├── timestamp-to-datetime/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── trigger-advanced-features/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── trigger-ghost-name-conflict/
│   │   ├── create.sql
│   │   ├── destroy.sql
│   │   ├── expect_failure
│   │   └── extra_args
│   ├── trigger-long-name-validation/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── trivial/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── tz/
│   │   └── create.sql
│   ├── tz-datetime/
│   │   └── create.sql
│   ├── tz-datetime-ts/
│   │   ├── create.sql
│   │   └── extra_args
│   ├── unsigned/
│   │   └── create.sql
│   ├── unsigned-modify/
│   │   └── create.sql
│   ├── unsigned-rename/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── unsigned-reorder/
│   │   ├── create.sql
│   │   ├── extra_args
│   │   ├── ghost_columns
│   │   └── orig_columns
│   ├── utf8/
│   │   └── create.sql
│   ├── utf8mb4/
│   │   └── create.sql
│   └── varbinary/
│       └── create.sql
├── resources/
│   └── hooks-sample/
│       ├── gh-ost-on-before-cut-over-hook
│       ├── gh-ost-on-before-row-copy-hook
│       ├── gh-ost-on-begin-postponed-hook
│       ├── gh-ost-on-failure-hook
│       ├── gh-ost-on-interactive-command-hook
│       ├── gh-ost-on-row-copy-complete-hook
│       ├── gh-ost-on-rowcount-complete-hook
│       ├── gh-ost-on-start-replication-hook
│       ├── gh-ost-on-startup-hook
│       ├── gh-ost-on-status-hook
│       ├── gh-ost-on-stop-replication-hook
│       ├── gh-ost-on-success-hook
│       ├── gh-ost-on-success-hook-2
│       └── gh-ost-on-validated-hook
├── script/
│   ├── bootstrap
│   ├── build
│   ├── build-deploy-tarball
│   ├── cibuild
│   ├── cibuild-gh-ost-build-deploy-tarball
│   ├── dock
│   ├── docker-gh-ost-replica-tests
│   ├── ensure-go-installed
│   ├── ensure-golangci-lint-installed
│   ├── gh-ost-test-mysql-master
│   ├── gh-ost-test-mysql-replica
│   ├── go
│   ├── lint
│   └── test
├── test.sh
├── tmp/
│   └── .gitkeep
└── vendor/
    ├── dario.cat/
    │   └── mergo/
    │       ├── .deepsource.toml
    │       ├── .gitignore
    │       ├── .travis.yml
    │       ├── CODE_OF_CONDUCT.md
    │       ├── CONTRIBUTING.md
    │       ├── LICENSE
    │       ├── README.md
    │       ├── SECURITY.md
    │       ├── doc.go
    │       ├── map.go
    │       ├── merge.go
    │       └── mergo.go
    ├── filippo.io/
    │   └── edwards25519/
    │       ├── LICENSE
    │       ├── README.md
    │       ├── doc.go
    │       ├── edwards25519.go
    │       ├── extra.go
    │       ├── field/
    │       │   ├── fe.go
    │       │   ├── fe_amd64.go
    │       │   ├── fe_amd64.s
    │       │   ├── fe_amd64_noasm.go
    │       │   ├── fe_arm64.go
    │       │   ├── fe_arm64.s
    │       │   ├── fe_arm64_noasm.go
    │       │   ├── fe_extra.go
    │       │   └── fe_generic.go
    │       ├── scalar.go
    │       ├── scalar_fiat.go
    │       ├── scalarmult.go
    │       └── tables.go
    ├── github.com/
    │   ├── Azure/
    │   │   └── go-ansiterm/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── constants.go
    │   │       ├── context.go
    │   │       ├── csi_entry_state.go
    │   │       ├── csi_param_state.go
    │   │       ├── escape_intermediate_state.go
    │   │       ├── escape_state.go
    │   │       ├── event_handler.go
    │   │       ├── ground_state.go
    │   │       ├── osc_string_state.go
    │   │       ├── parser.go
    │   │       ├── parser_action_helpers.go
    │   │       ├── parser_actions.go
    │   │       ├── states.go
    │   │       ├── utilities.go
    │   │       └── winterm/
    │   │           ├── ansi.go
    │   │           ├── api.go
    │   │           ├── attr_translation.go
    │   │           ├── cursor_helpers.go
    │   │           ├── erase_helpers.go
    │   │           ├── scroll_helper.go
    │   │           ├── utilities.go
    │   │           └── win_event_handler.go
    │   ├── Masterminds/
    │   │   └── semver/
    │   │       ├── .travis.yml
    │   │       ├── CHANGELOG.md
    │   │       ├── LICENSE.txt
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── appveyor.yml
    │   │       ├── collection.go
    │   │       ├── constraints.go
    │   │       ├── doc.go
    │   │       ├── version.go
    │   │       └── version_fuzz.go
    │   ├── Microsoft/
    │   │   └── go-winio/
    │   │       ├── .gitattributes
    │   │       ├── .gitignore
    │   │       ├── .golangci.yml
    │   │       ├── CODEOWNERS
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── SECURITY.md
    │   │       ├── backup.go
    │   │       ├── doc.go
    │   │       ├── ea.go
    │   │       ├── file.go
    │   │       ├── fileinfo.go
    │   │       ├── hvsock.go
    │   │       ├── internal/
    │   │       │   ├── fs/
    │   │       │   │   ├── doc.go
    │   │       │   │   ├── fs.go
    │   │       │   │   ├── security.go
    │   │       │   │   └── zsyscall_windows.go
    │   │       │   ├── socket/
    │   │       │   │   ├── rawaddr.go
    │   │       │   │   ├── socket.go
    │   │       │   │   └── zsyscall_windows.go
    │   │       │   └── stringbuffer/
    │   │       │       └── wstring.go
    │   │       ├── pipe.go
    │   │       ├── pkg/
    │   │       │   └── guid/
    │   │       │       ├── guid.go
    │   │       │       ├── guid_nonwindows.go
    │   │       │       ├── guid_windows.go
    │   │       │       └── variant_string.go
    │   │       ├── privilege.go
    │   │       ├── reparse.go
    │   │       ├── sd.go
    │   │       ├── syscall.go
    │   │       └── zsyscall_windows.go
    │   ├── cenkalti/
    │   │   └── backoff/
    │   │       └── v4/
    │   │           ├── .gitignore
    │   │           ├── LICENSE
    │   │           ├── README.md
    │   │           ├── backoff.go
    │   │           ├── context.go
    │   │           ├── exponential.go
    │   │           ├── retry.go
    │   │           ├── ticker.go
    │   │           ├── timer.go
    │   │           └── tries.go
    │   ├── containerd/
    │   │   ├── log/
    │   │   │   ├── .golangci.yml
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   └── context.go
    │   │   └── platforms/
    │   │       ├── .gitattributes
    │   │       ├── .golangci.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── compare.go
    │   │       ├── cpuinfo.go
    │   │       ├── cpuinfo_linux.go
    │   │       ├── cpuinfo_other.go
    │   │       ├── database.go
    │   │       ├── defaults.go
    │   │       ├── defaults_darwin.go
    │   │       ├── defaults_freebsd.go
    │   │       ├── defaults_unix.go
    │   │       ├── defaults_windows.go
    │   │       ├── errors.go
    │   │       ├── platform_compat_windows.go
    │   │       ├── platforms.go
    │   │       ├── platforms_other.go
    │   │       └── platforms_windows.go
    │   ├── cpuguy83/
    │   │   └── dockercfg/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── auth.go
    │   │       ├── config.go
    │   │       └── load.go
    │   ├── davecgh/
    │   │   └── go-spew/
    │   │       ├── LICENSE
    │   │       └── spew/
    │   │           ├── bypass.go
    │   │           ├── bypasssafe.go
    │   │           ├── common.go
    │   │           ├── config.go
    │   │           ├── doc.go
    │   │           ├── dump.go
    │   │           ├── format.go
    │   │           └── spew.go
    │   ├── distribution/
    │   │   └── reference/
    │   │       ├── .gitattributes
    │   │       ├── .gitignore
    │   │       ├── .golangci.yml
    │   │       ├── CODE-OF-CONDUCT.md
    │   │       ├── CONTRIBUTING.md
    │   │       ├── GOVERNANCE.md
    │   │       ├── LICENSE
    │   │       ├── MAINTAINERS
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── SECURITY.md
    │   │       ├── helpers.go
    │   │       ├── normalize.go
    │   │       ├── reference.go
    │   │       ├── regexp.go
    │   │       └── sort.go
    │   ├── docker/
    │   │   ├── docker/
    │   │   │   ├── AUTHORS
    │   │   │   ├── LICENSE
    │   │   │   ├── NOTICE
    │   │   │   ├── api/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── common.go
    │   │   │   │   ├── swagger-gen.yaml
    │   │   │   │   ├── swagger.yaml
    │   │   │   │   └── types/
    │   │   │   │       ├── blkiodev/
    │   │   │   │       │   └── blkio.go
    │   │   │   │       ├── checkpoint/
    │   │   │   │       │   ├── list.go
    │   │   │   │       │   └── options.go
    │   │   │   │       ├── client.go
    │   │   │   │       ├── common/
    │   │   │   │       │   └── id_response.go
    │   │   │   │       ├── container/
    │   │   │   │       │   ├── change_type.go
    │   │   │   │       │   ├── change_types.go
    │   │   │   │       │   ├── commit.go
    │   │   │   │       │   ├── config.go
    │   │   │   │       │   ├── container.go
    │   │   │   │       │   ├── create_request.go
    │   │   │   │       │   ├── create_response.go
    │   │   │   │       │   ├── errors.go
    │   │   │   │       │   ├── exec.go
    │   │   │   │       │   ├── filesystem_change.go
    │   │   │   │       │   ├── health.go
    │   │   │   │       │   ├── hostconfig.go
    │   │   │   │       │   ├── hostconfig_unix.go
    │   │   │   │       │   ├── hostconfig_windows.go
    │   │   │   │       │   ├── network_settings.go
    │   │   │   │       │   ├── options.go
    │   │   │   │       │   ├── port.go
    │   │   │   │       │   ├── stats.go
    │   │   │   │       │   ├── top_response.go
    │   │   │   │       │   ├── update_response.go
    │   │   │   │       │   ├── wait_exit_error.go
    │   │   │   │       │   ├── wait_response.go
    │   │   │   │       │   └── waitcondition.go
    │   │   │   │       ├── error_response.go
    │   │   │   │       ├── error_response_ext.go
    │   │   │   │       ├── events/
    │   │   │   │       │   └── events.go
    │   │   │   │       ├── filters/
    │   │   │   │       │   ├── errors.go
    │   │   │   │       │   └── parse.go
    │   │   │   │       ├── image/
    │   │   │   │       │   ├── delete_response.go
    │   │   │   │       │   ├── image.go
    │   │   │   │       │   ├── image_history.go
    │   │   │   │       │   ├── image_inspect.go
    │   │   │   │       │   ├── manifest.go
    │   │   │   │       │   ├── opts.go
    │   │   │   │       │   └── summary.go
    │   │   │   │       ├── mount/
    │   │   │   │       │   └── mount.go
    │   │   │   │       ├── network/
    │   │   │   │       │   ├── create_response.go
    │   │   │   │       │   ├── endpoint.go
    │   │   │   │       │   ├── ipam.go
    │   │   │   │       │   └── network.go
    │   │   │   │       ├── plugin.go
    │   │   │   │       ├── plugin_device.go
    │   │   │   │       ├── plugin_env.go
    │   │   │   │       ├── plugin_interface_type.go
    │   │   │   │       ├── plugin_mount.go
    │   │   │   │       ├── plugin_responses.go
    │   │   │   │       ├── registry/
    │   │   │   │       │   ├── authconfig.go
    │   │   │   │       │   ├── authenticate.go
    │   │   │   │       │   ├── registry.go
    │   │   │   │       │   └── search.go
    │   │   │   │       ├── storage/
    │   │   │   │       │   └── driver_data.go
    │   │   │   │       ├── strslice/
    │   │   │   │       │   └── strslice.go
    │   │   │   │       ├── swarm/
    │   │   │   │       │   ├── common.go
    │   │   │   │       │   ├── config.go
    │   │   │   │       │   ├── container.go
    │   │   │   │       │   ├── network.go
    │   │   │   │       │   ├── node.go
    │   │   │   │       │   ├── runtime/
    │   │   │   │       │   │   ├── gen.go
    │   │   │   │       │   │   ├── plugin.pb.go
    │   │   │   │       │   │   └── plugin.proto
    │   │   │   │       │   ├── runtime.go
    │   │   │   │       │   ├── secret.go
    │   │   │   │       │   ├── service.go
    │   │   │   │       │   ├── service_create_response.go
    │   │   │   │       │   ├── service_update_response.go
    │   │   │   │       │   ├── swarm.go
    │   │   │   │       │   └── task.go
    │   │   │   │       ├── system/
    │   │   │   │       │   ├── info.go
    │   │   │   │       │   ├── runtime.go
    │   │   │   │       │   └── security_opts.go
    │   │   │   │       ├── time/
    │   │   │   │       │   └── timestamp.go
    │   │   │   │       ├── types.go
    │   │   │   │       ├── types_deprecated.go
    │   │   │   │       ├── versions/
    │   │   │   │       │   └── compare.go
    │   │   │   │       └── volume/
    │   │   │   │           ├── cluster_volume.go
    │   │   │   │           ├── create_options.go
    │   │   │   │           ├── list_response.go
    │   │   │   │           ├── options.go
    │   │   │   │           ├── volume.go
    │   │   │   │           └── volume_update.go
    │   │   │   ├── client/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── build_cancel.go
    │   │   │   │   ├── build_prune.go
    │   │   │   │   ├── checkpoint.go
    │   │   │   │   ├── checkpoint_create.go
    │   │   │   │   ├── checkpoint_delete.go
    │   │   │   │   ├── checkpoint_list.go
    │   │   │   │   ├── client.go
    │   │   │   │   ├── client_deprecated.go
    │   │   │   │   ├── client_interfaces.go
    │   │   │   │   ├── client_unix.go
    │   │   │   │   ├── client_windows.go
    │   │   │   │   ├── config_create.go
    │   │   │   │   ├── config_inspect.go
    │   │   │   │   ├── config_list.go
    │   │   │   │   ├── config_remove.go
    │   │   │   │   ├── config_update.go
    │   │   │   │   ├── container_attach.go
    │   │   │   │   ├── container_commit.go
    │   │   │   │   ├── container_copy.go
    │   │   │   │   ├── container_create.go
    │   │   │   │   ├── container_diff.go
    │   │   │   │   ├── container_exec.go
    │   │   │   │   ├── container_export.go
    │   │   │   │   ├── container_inspect.go
    │   │   │   │   ├── container_kill.go
    │   │   │   │   ├── container_list.go
    │   │   │   │   ├── container_logs.go
    │   │   │   │   ├── container_pause.go
    │   │   │   │   ├── container_prune.go
    │   │   │   │   ├── container_remove.go
    │   │   │   │   ├── container_rename.go
    │   │   │   │   ├── container_resize.go
    │   │   │   │   ├── container_restart.go
    │   │   │   │   ├── container_start.go
    │   │   │   │   ├── container_stats.go
    │   │   │   │   ├── container_stop.go
    │   │   │   │   ├── container_top.go
    │   │   │   │   ├── container_unpause.go
    │   │   │   │   ├── container_update.go
    │   │   │   │   ├── container_wait.go
    │   │   │   │   ├── disk_usage.go
    │   │   │   │   ├── distribution_inspect.go
    │   │   │   │   ├── envvars.go
    │   │   │   │   ├── errors.go
    │   │   │   │   ├── events.go
    │   │   │   │   ├── hijack.go
    │   │   │   │   ├── image_build.go
    │   │   │   │   ├── image_create.go
    │   │   │   │   ├── image_history.go
    │   │   │   │   ├── image_history_opts.go
    │   │   │   │   ├── image_import.go
    │   │   │   │   ├── image_inspect.go
    │   │   │   │   ├── image_inspect_opts.go
    │   │   │   │   ├── image_list.go
    │   │   │   │   ├── image_load.go
    │   │   │   │   ├── image_load_opts.go
    │   │   │   │   ├── image_prune.go
    │   │   │   │   ├── image_pull.go
    │   │   │   │   ├── image_push.go
    │   │   │   │   ├── image_remove.go
    │   │   │   │   ├── image_save.go
    │   │   │   │   ├── image_save_opts.go
    │   │   │   │   ├── image_search.go
    │   │   │   │   ├── image_tag.go
    │   │   │   │   ├── info.go
    │   │   │   │   ├── login.go
    │   │   │   │   ├── network_connect.go
    │   │   │   │   ├── network_create.go
    │   │   │   │   ├── network_disconnect.go
    │   │   │   │   ├── network_inspect.go
    │   │   │   │   ├── network_list.go
    │   │   │   │   ├── network_prune.go
    │   │   │   │   ├── network_remove.go
    │   │   │   │   ├── node_inspect.go
    │   │   │   │   ├── node_list.go
    │   │   │   │   ├── node_remove.go
    │   │   │   │   ├── node_update.go
    │   │   │   │   ├── options.go
    │   │   │   │   ├── ping.go
    │   │   │   │   ├── plugin_create.go
    │   │   │   │   ├── plugin_disable.go
    │   │   │   │   ├── plugin_enable.go
    │   │   │   │   ├── plugin_inspect.go
    │   │   │   │   ├── plugin_install.go
    │   │   │   │   ├── plugin_list.go
    │   │   │   │   ├── plugin_push.go
    │   │   │   │   ├── plugin_remove.go
    │   │   │   │   ├── plugin_set.go
    │   │   │   │   ├── plugin_upgrade.go
    │   │   │   │   ├── request.go
    │   │   │   │   ├── secret_create.go
    │   │   │   │   ├── secret_inspect.go
    │   │   │   │   ├── secret_list.go
    │   │   │   │   ├── secret_remove.go
    │   │   │   │   ├── secret_update.go
    │   │   │   │   ├── service_create.go
    │   │   │   │   ├── service_inspect.go
    │   │   │   │   ├── service_list.go
    │   │   │   │   ├── service_logs.go
    │   │   │   │   ├── service_remove.go
    │   │   │   │   ├── service_update.go
    │   │   │   │   ├── swarm_get_unlock_key.go
    │   │   │   │   ├── swarm_init.go
    │   │   │   │   ├── swarm_inspect.go
    │   │   │   │   ├── swarm_join.go
    │   │   │   │   ├── swarm_leave.go
    │   │   │   │   ├── swarm_unlock.go
    │   │   │   │   ├── swarm_update.go
    │   │   │   │   ├── task_inspect.go
    │   │   │   │   ├── task_list.go
    │   │   │   │   ├── task_logs.go
    │   │   │   │   ├── utils.go
    │   │   │   │   ├── version.go
    │   │   │   │   ├── volume_create.go
    │   │   │   │   ├── volume_inspect.go
    │   │   │   │   ├── volume_list.go
    │   │   │   │   ├── volume_prune.go
    │   │   │   │   ├── volume_remove.go
    │   │   │   │   └── volume_update.go
    │   │   │   ├── errdefs/
    │   │   │   │   ├── defs.go
    │   │   │   │   ├── doc.go
    │   │   │   │   ├── helpers.go
    │   │   │   │   ├── http_helpers.go
    │   │   │   │   └── is.go
    │   │   │   ├── internal/
    │   │   │   │   ├── lazyregexp/
    │   │   │   │   │   └── lazyregexp.go
    │   │   │   │   └── multierror/
    │   │   │   │       └── multierror.go
    │   │   │   └── pkg/
    │   │   │       ├── archive/
    │   │   │       │   ├── archive.go
    │   │   │       │   ├── archive_linux.go
    │   │   │       │   ├── archive_other.go
    │   │   │       │   ├── archive_unix.go
    │   │   │       │   ├── archive_windows.go
    │   │   │       │   ├── changes.go
    │   │   │       │   ├── changes_linux.go
    │   │   │       │   ├── changes_other.go
    │   │   │       │   ├── changes_unix.go
    │   │   │       │   ├── changes_windows.go
    │   │   │       │   ├── copy.go
    │   │   │       │   ├── copy_unix.go
    │   │   │       │   ├── copy_windows.go
    │   │   │       │   ├── dev_freebsd.go
    │   │   │       │   ├── dev_unix.go
    │   │   │       │   ├── diff.go
    │   │   │       │   ├── diff_unix.go
    │   │   │       │   ├── diff_windows.go
    │   │   │       │   ├── path.go
    │   │   │       │   ├── path_unix.go
    │   │   │       │   ├── path_windows.go
    │   │   │       │   ├── time.go
    │   │   │       │   ├── time_nonwindows.go
    │   │   │       │   ├── time_windows.go
    │   │   │       │   ├── whiteouts.go
    │   │   │       │   ├── wrap.go
    │   │   │       │   ├── xattr_supported.go
    │   │   │       │   ├── xattr_supported_linux.go
    │   │   │       │   ├── xattr_supported_unix.go
    │   │   │       │   └── xattr_unsupported.go
    │   │   │       ├── idtools/
    │   │   │       │   ├── idtools.go
    │   │   │       │   ├── idtools_unix.go
    │   │   │       │   └── idtools_windows.go
    │   │   │       ├── jsonmessage/
    │   │   │       │   └── jsonmessage.go
    │   │   │       └── stdcopy/
    │   │   │           └── stdcopy.go
    │   │   ├── go-connections/
    │   │   │   ├── LICENSE
    │   │   │   ├── nat/
    │   │   │   │   ├── nat.go
    │   │   │   │   ├── parse.go
    │   │   │   │   └── sort.go
    │   │   │   ├── sockets/
    │   │   │   │   ├── README.md
    │   │   │   │   ├── inmem_socket.go
    │   │   │   │   ├── proxy.go
    │   │   │   │   ├── sockets.go
    │   │   │   │   ├── sockets_unix.go
    │   │   │   │   ├── sockets_windows.go
    │   │   │   │   ├── tcp_socket.go
    │   │   │   │   └── unix_socket.go
    │   │   │   └── tlsconfig/
    │   │   │       ├── certpool.go
    │   │   │       ├── config.go
    │   │   │       └── config_client_ciphers.go
    │   │   └── go-units/
    │   │       ├── CONTRIBUTING.md
    │   │       ├── LICENSE
    │   │       ├── MAINTAINERS
    │   │       ├── README.md
    │   │       ├── circle.yml
    │   │       ├── duration.go
    │   │       ├── size.go
    │   │       └── ulimit.go
    │   ├── ebitengine/
    │   │   └── purego/
    │   │       ├── .gitignore
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── abi_amd64.h
    │   │       ├── abi_arm64.h
    │   │       ├── cgo.go
    │   │       ├── dlerror.go
    │   │       ├── dlfcn.go
    │   │       ├── dlfcn_android.go
    │   │       ├── dlfcn_darwin.go
    │   │       ├── dlfcn_freebsd.go
    │   │       ├── dlfcn_linux.go
    │   │       ├── dlfcn_nocgo_freebsd.go
    │   │       ├── dlfcn_nocgo_linux.go
    │   │       ├── dlfcn_playground.go
    │   │       ├── dlfcn_stubs.s
    │   │       ├── func.go
    │   │       ├── go_runtime.go
    │   │       ├── internal/
    │   │       │   ├── cgo/
    │   │       │   │   ├── dlfcn_cgo_unix.go
    │   │       │   │   ├── empty.go
    │   │       │   │   └── syscall_cgo_unix.go
    │   │       │   ├── fakecgo/
    │   │       │   │   ├── abi_amd64.h
    │   │       │   │   ├── abi_arm64.h
    │   │       │   │   ├── asm_amd64.s
    │   │       │   │   ├── asm_arm64.s
    │   │       │   │   ├── callbacks.go
    │   │       │   │   ├── doc.go
    │   │       │   │   ├── freebsd.go
    │   │       │   │   ├── go_darwin_amd64.go
    │   │       │   │   ├── go_darwin_arm64.go
    │   │       │   │   ├── go_freebsd_amd64.go
    │   │       │   │   ├── go_freebsd_arm64.go
    │   │       │   │   ├── go_libinit.go
    │   │       │   │   ├── go_linux_amd64.go
    │   │       │   │   ├── go_linux_arm64.go
    │   │       │   │   ├── go_setenv.go
    │   │       │   │   ├── go_util.go
    │   │       │   │   ├── iscgo.go
    │   │       │   │   ├── libcgo.go
    │   │       │   │   ├── libcgo_darwin.go
    │   │       │   │   ├── libcgo_freebsd.go
    │   │       │   │   ├── libcgo_linux.go
    │   │       │   │   ├── setenv.go
    │   │       │   │   ├── symbols.go
    │   │       │   │   ├── symbols_darwin.go
    │   │       │   │   ├── symbols_freebsd.go
    │   │       │   │   ├── symbols_linux.go
    │   │       │   │   ├── trampolines_amd64.s
    │   │       │   │   ├── trampolines_arm64.s
    │   │       │   │   └── trampolines_stubs.s
    │   │       │   └── strings/
    │   │       │       └── strings.go
    │   │       ├── is_ios.go
    │   │       ├── nocgo.go
    │   │       ├── struct_amd64.go
    │   │       ├── struct_arm64.go
    │   │       ├── struct_other.go
    │   │       ├── sys_amd64.s
    │   │       ├── sys_arm64.s
    │   │       ├── sys_unix_arm64.s
    │   │       ├── syscall.go
    │   │       ├── syscall_cgo_linux.go
    │   │       ├── syscall_sysv.go
    │   │       ├── syscall_windows.go
    │   │       ├── zcallback_amd64.s
    │   │       └── zcallback_arm64.s
    │   ├── felixge/
    │   │   └── httpsnoop/
    │   │       ├── .gitignore
    │   │       ├── LICENSE.txt
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── capture_metrics.go
    │   │       ├── docs.go
    │   │       ├── wrap_generated_gteq_1.8.go
    │   │       └── wrap_generated_lt_1.8.go
    │   ├── go-ini/
    │   │   └── ini/
    │   │       ├── .editorconfig
    │   │       ├── .gitignore
    │   │       ├── .golangci.yml
    │   │       ├── LICENSE
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── codecov.yml
    │   │       ├── data_source.go
    │   │       ├── deprecated.go
    │   │       ├── error.go
    │   │       ├── file.go
    │   │       ├── helper.go
    │   │       ├── ini.go
    │   │       ├── key.go
    │   │       ├── parser.go
    │   │       ├── section.go
    │   │       └── struct.go
    │   ├── go-logr/
    │   │   ├── logr/
    │   │   │   ├── .golangci.yaml
    │   │   │   ├── CHANGELOG.md
    │   │   │   ├── CONTRIBUTING.md
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   ├── SECURITY.md
    │   │   │   ├── context.go
    │   │   │   ├── context_noslog.go
    │   │   │   ├── context_slog.go
    │   │   │   ├── discard.go
    │   │   │   ├── funcr/
    │   │   │   │   ├── funcr.go
    │   │   │   │   └── slogsink.go
    │   │   │   ├── logr.go
    │   │   │   ├── sloghandler.go
    │   │   │   ├── slogr.go
    │   │   │   └── slogsink.go
    │   │   └── stdr/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       └── stdr.go
    │   ├── go-mysql-org/
    │   │   └── go-mysql/
    │   │       ├── LICENSE
    │   │       ├── client/
    │   │       │   ├── auth.go
    │   │       │   ├── conn.go
    │   │       │   ├── pool.go
    │   │       │   ├── pool_options.go
    │   │       │   ├── req.go
    │   │       │   ├── resp.go
    │   │       │   ├── stmt.go
    │   │       │   └── tls.go
    │   │       ├── compress/
    │   │       │   └── zlib.go
    │   │       ├── mysql/
    │   │       │   ├── const.go
    │   │       │   ├── errcode.go
    │   │       │   ├── errname.go
    │   │       │   ├── error.go
    │   │       │   ├── field.go
    │   │       │   ├── gtid.go
    │   │       │   ├── mariadb_gtid.go
    │   │       │   ├── mysql_gtid.go
    │   │       │   ├── parse_binary.go
    │   │       │   ├── position.go
    │   │       │   ├── result.go
    │   │       │   ├── resultset.go
    │   │       │   ├── resultset_helper.go
    │   │       │   ├── rowdata.go
    │   │       │   ├── state.go
    │   │       │   ├── util.go
    │   │       │   └── validate.go
    │   │       ├── packet/
    │   │       │   └── conn.go
    │   │       ├── replication/
    │   │       │   ├── backup.go
    │   │       │   ├── binlogstreamer.go
    │   │       │   ├── binlogsyncer.go
    │   │       │   ├── const.go
    │   │       │   ├── doc.go
    │   │       │   ├── event.go
    │   │       │   ├── generic_event.go
    │   │       │   ├── json_binary.go
    │   │       │   ├── parser.go
    │   │       │   ├── row_event.go
    │   │       │   ├── time.go
    │   │       │   └── transaction_payload_event.go
    │   │       └── utils/
    │   │           ├── byte_slice_pool.go
    │   │           ├── bytes_buffer_pool.go
    │   │           ├── now.go
    │   │           ├── now_unix.go
    │   │           └── zeroalloc.go
    │   ├── go-ole/
    │   │   └── go-ole/
    │   │       ├── .travis.yml
    │   │       ├── ChangeLog.md
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── appveyor.yml
    │   │       ├── com.go
    │   │       ├── com_func.go
    │   │       ├── connect.go
    │   │       ├── constants.go
    │   │       ├── error.go
    │   │       ├── error_func.go
    │   │       ├── error_windows.go
    │   │       ├── guid.go
    │   │       ├── iconnectionpoint.go
    │   │       ├── iconnectionpoint_func.go
    │   │       ├── iconnectionpoint_windows.go
    │   │       ├── iconnectionpointcontainer.go
    │   │       ├── iconnectionpointcontainer_func.go
    │   │       ├── iconnectionpointcontainer_windows.go
    │   │       ├── idispatch.go
    │   │       ├── idispatch_func.go
    │   │       ├── idispatch_windows.go
    │   │       ├── ienumvariant.go
    │   │       ├── ienumvariant_func.go
    │   │       ├── ienumvariant_windows.go
    │   │       ├── iinspectable.go
    │   │       ├── iinspectable_func.go
    │   │       ├── iinspectable_windows.go
    │   │       ├── iprovideclassinfo.go
    │   │       ├── iprovideclassinfo_func.go
    │   │       ├── iprovideclassinfo_windows.go
    │   │       ├── itypeinfo.go
    │   │       ├── itypeinfo_func.go
    │   │       ├── itypeinfo_windows.go
    │   │       ├── iunknown.go
    │   │       ├── iunknown_func.go
    │   │       ├── iunknown_windows.go
    │   │       ├── ole.go
    │   │       ├── oleutil/
    │   │       │   ├── connection.go
    │   │       │   ├── connection_func.go
    │   │       │   ├── connection_windows.go
    │   │       │   ├── go-get.go
    │   │       │   └── oleutil.go
    │   │       ├── safearray.go
    │   │       ├── safearray_func.go
    │   │       ├── safearray_windows.go
    │   │       ├── safearrayconversion.go
    │   │       ├── safearrayslices.go
    │   │       ├── utility.go
    │   │       ├── variables.go
    │   │       ├── variant.go
    │   │       ├── variant_386.go
    │   │       ├── variant_amd64.go
    │   │       ├── variant_arm.go
    │   │       ├── variant_arm64.go
    │   │       ├── variant_date_386.go
    │   │       ├── variant_date_amd64.go
    │   │       ├── variant_date_arm.go
    │   │       ├── variant_date_arm64.go
    │   │       ├── variant_ppc64le.go
    │   │       ├── variant_s390x.go
    │   │       ├── vt_string.go
    │   │       ├── winrt.go
    │   │       └── winrt_doc.go
    │   ├── go-sql-driver/
    │   │   └── mysql/
    │   │       ├── .gitignore
    │   │       ├── AUTHORS
    │   │       ├── CHANGELOG.md
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── atomic_bool.go
    │   │       ├── atomic_bool_go118.go
    │   │       ├── auth.go
    │   │       ├── buffer.go
    │   │       ├── collations.go
    │   │       ├── conncheck.go
    │   │       ├── conncheck_dummy.go
    │   │       ├── connection.go
    │   │       ├── connector.go
    │   │       ├── const.go
    │   │       ├── driver.go
    │   │       ├── dsn.go
    │   │       ├── errors.go
    │   │       ├── fields.go
    │   │       ├── infile.go
    │   │       ├── nulltime.go
    │   │       ├── packets.go
    │   │       ├── result.go
    │   │       ├── rows.go
    │   │       ├── statement.go
    │   │       ├── transaction.go
    │   │       └── utils.go
    │   ├── goccy/
    │   │   └── go-json/
    │   │       ├── .codecov.yml
    │   │       ├── .gitignore
    │   │       ├── .golangci.yml
    │   │       ├── CHANGELOG.md
    │   │       ├── LICENSE
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── color.go
    │   │       ├── decode.go
    │   │       ├── docker-compose.yml
    │   │       ├── encode.go
    │   │       ├── error.go
    │   │       ├── internal/
    │   │       │   ├── decoder/
    │   │       │   │   ├── anonymous_field.go
    │   │       │   │   ├── array.go
    │   │       │   │   ├── assign.go
    │   │       │   │   ├── bool.go
    │   │       │   │   ├── bytes.go
    │   │       │   │   ├── compile.go
    │   │       │   │   ├── compile_norace.go
    │   │       │   │   ├── compile_race.go
    │   │       │   │   ├── context.go
    │   │       │   │   ├── float.go
    │   │       │   │   ├── func.go
    │   │       │   │   ├── int.go
    │   │       │   │   ├── interface.go
    │   │       │   │   ├── invalid.go
    │   │       │   │   ├── map.go
    │   │       │   │   ├── number.go
    │   │       │   │   ├── option.go
    │   │       │   │   ├── path.go
    │   │       │   │   ├── ptr.go
    │   │       │   │   ├── slice.go
    │   │       │   │   ├── stream.go
    │   │       │   │   ├── string.go
    │   │       │   │   ├── struct.go
    │   │       │   │   ├── type.go
    │   │       │   │   ├── uint.go
    │   │       │   │   ├── unmarshal_json.go
    │   │       │   │   ├── unmarshal_text.go
    │   │       │   │   └── wrapped_string.go
    │   │       │   ├── encoder/
    │   │       │   │   ├── code.go
    │   │       │   │   ├── compact.go
    │   │       │   │   ├── compiler.go
    │   │       │   │   ├── compiler_norace.go
    │   │       │   │   ├── compiler_race.go
    │   │       │   │   ├── context.go
    │   │       │   │   ├── decode_rune.go
    │   │       │   │   ├── encoder.go
    │   │       │   │   ├── indent.go
    │   │       │   │   ├── int.go
    │   │       │   │   ├── map112.go
    │   │       │   │   ├── map113.go
    │   │       │   │   ├── opcode.go
    │   │       │   │   ├── option.go
    │   │       │   │   ├── optype.go
    │   │       │   │   ├── query.go
    │   │       │   │   ├── string.go
    │   │       │   │   ├── string_table.go
    │   │       │   │   ├── vm/
    │   │       │   │   │   ├── debug_vm.go
    │   │       │   │   │   ├── hack.go
    │   │       │   │   │   ├── util.go
    │   │       │   │   │   └── vm.go
    │   │       │   │   ├── vm_color/
    │   │       │   │   │   ├── debug_vm.go
    │   │       │   │   │   ├── hack.go
    │   │       │   │   │   ├── util.go
    │   │       │   │   │   └── vm.go
    │   │       │   │   ├── vm_color_indent/
    │   │       │   │   │   ├── debug_vm.go
    │   │       │   │   │   ├── util.go
    │   │       │   │   │   └── vm.go
    │   │       │   │   └── vm_indent/
    │   │       │   │       ├── debug_vm.go
    │   │       │   │       ├── hack.go
    │   │       │   │       ├── util.go
    │   │       │   │       └── vm.go
    │   │       │   ├── errors/
    │   │       │   │   └── error.go
    │   │       │   └── runtime/
    │   │       │       ├── rtype.go
    │   │       │       ├── struct_field.go
    │   │       │       └── type.go
    │   │       ├── json.go
    │   │       ├── option.go
    │   │       ├── path.go
    │   │       └── query.go
    │   ├── gogo/
    │   │   └── protobuf/
    │   │       ├── AUTHORS
    │   │       ├── CONTRIBUTORS
    │   │       ├── LICENSE
    │   │       └── proto/
    │   │           ├── Makefile
    │   │           ├── clone.go
    │   │           ├── custom_gogo.go
    │   │           ├── decode.go
    │   │           ├── deprecated.go
    │   │           ├── discard.go
    │   │           ├── duration.go
    │   │           ├── duration_gogo.go
    │   │           ├── encode.go
    │   │           ├── encode_gogo.go
    │   │           ├── equal.go
    │   │           ├── extensions.go
    │   │           ├── extensions_gogo.go
    │   │           ├── lib.go
    │   │           ├── lib_gogo.go
    │   │           ├── message_set.go
    │   │           ├── pointer_reflect.go
    │   │           ├── pointer_reflect_gogo.go
    │   │           ├── pointer_unsafe.go
    │   │           ├── pointer_unsafe_gogo.go
    │   │           ├── properties.go
    │   │           ├── properties_gogo.go
    │   │           ├── skip_gogo.go
    │   │           ├── table_marshal.go
    │   │           ├── table_marshal_gogo.go
    │   │           ├── table_merge.go
    │   │           ├── table_unmarshal.go
    │   │           ├── table_unmarshal_gogo.go
    │   │           ├── text.go
    │   │           ├── text_gogo.go
    │   │           ├── text_parser.go
    │   │           ├── timestamp.go
    │   │           ├── timestamp_gogo.go
    │   │           ├── wrappers.go
    │   │           └── wrappers_gogo.go
    │   ├── google/
    │   │   └── uuid/
    │   │       ├── CHANGELOG.md
    │   │       ├── CONTRIBUTING.md
    │   │       ├── CONTRIBUTORS
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── dce.go
    │   │       ├── doc.go
    │   │       ├── hash.go
    │   │       ├── marshal.go
    │   │       ├── node.go
    │   │       ├── node_js.go
    │   │       ├── node_net.go
    │   │       ├── null.go
    │   │       ├── sql.go
    │   │       ├── time.go
    │   │       ├── util.go
    │   │       ├── uuid.go
    │   │       ├── version1.go
    │   │       ├── version4.go
    │   │       ├── version6.go
    │   │       └── version7.go
    │   ├── hashicorp/
    │   │   └── go-version/
    │   │       ├── CHANGELOG.md
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── constraint.go
    │   │       ├── version.go
    │   │       └── version_collection.go
    │   ├── klauspost/
    │   │   └── compress/
    │   │       ├── .gitattributes
    │   │       ├── .gitignore
    │   │       ├── .goreleaser.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── SECURITY.md
    │   │       ├── compressible.go
    │   │       ├── flate/
    │   │       │   ├── deflate.go
    │   │       │   ├── dict_decoder.go
    │   │       │   ├── fast_encoder.go
    │   │       │   ├── huffman_bit_writer.go
    │   │       │   ├── huffman_code.go
    │   │       │   ├── huffman_sortByFreq.go
    │   │       │   ├── huffman_sortByLiteral.go
    │   │       │   ├── inflate.go
    │   │       │   ├── inflate_gen.go
    │   │       │   ├── level1.go
    │   │       │   ├── level2.go
    │   │       │   ├── level3.go
    │   │       │   ├── level4.go
    │   │       │   ├── level5.go
    │   │       │   ├── level6.go
    │   │       │   ├── matchlen_amd64.go
    │   │       │   ├── matchlen_amd64.s
    │   │       │   ├── matchlen_generic.go
    │   │       │   ├── regmask_amd64.go
    │   │       │   ├── regmask_other.go
    │   │       │   ├── stateless.go
    │   │       │   └── token.go
    │   │       ├── fse/
    │   │       │   ├── README.md
    │   │       │   ├── bitreader.go
    │   │       │   ├── bitwriter.go
    │   │       │   ├── bytereader.go
    │   │       │   ├── compress.go
    │   │       │   ├── decompress.go
    │   │       │   └── fse.go
    │   │       ├── gen.sh
    │   │       ├── huff0/
    │   │       │   ├── .gitignore
    │   │       │   ├── README.md
    │   │       │   ├── bitreader.go
    │   │       │   ├── bitwriter.go
    │   │       │   ├── compress.go
    │   │       │   ├── decompress.go
    │   │       │   ├── decompress_amd64.go
    │   │       │   ├── decompress_amd64.s
    │   │       │   ├── decompress_generic.go
    │   │       │   └── huff0.go
    │   │       ├── internal/
    │   │       │   ├── cpuinfo/
    │   │       │   │   ├── cpuinfo.go
    │   │       │   │   ├── cpuinfo_amd64.go
    │   │       │   │   └── cpuinfo_amd64.s
    │   │       │   └── snapref/
    │   │       │       ├── LICENSE
    │   │       │       ├── decode.go
    │   │       │       ├── decode_other.go
    │   │       │       ├── encode.go
    │   │       │       ├── encode_other.go
    │   │       │       └── snappy.go
    │   │       ├── s2sx.mod
    │   │       ├── s2sx.sum
    │   │       ├── zlib/
    │   │       │   ├── reader.go
    │   │       │   └── writer.go
    │   │       └── zstd/
    │   │           ├── README.md
    │   │           ├── bitreader.go
    │   │           ├── bitwriter.go
    │   │           ├── blockdec.go
    │   │           ├── blockenc.go
    │   │           ├── blocktype_string.go
    │   │           ├── bytebuf.go
    │   │           ├── bytereader.go
    │   │           ├── decodeheader.go
    │   │           ├── decoder.go
    │   │           ├── decoder_options.go
    │   │           ├── dict.go
    │   │           ├── enc_base.go
    │   │           ├── enc_best.go
    │   │           ├── enc_better.go
    │   │           ├── enc_dfast.go
    │   │           ├── enc_fast.go
    │   │           ├── encoder.go
    │   │           ├── encoder_options.go
    │   │           ├── framedec.go
    │   │           ├── frameenc.go
    │   │           ├── fse_decoder.go
    │   │           ├── fse_decoder_amd64.go
    │   │           ├── fse_decoder_amd64.s
    │   │           ├── fse_decoder_generic.go
    │   │           ├── fse_encoder.go
    │   │           ├── fse_predefined.go
    │   │           ├── hash.go
    │   │           ├── history.go
    │   │           ├── internal/
    │   │           │   └── xxhash/
    │   │           │       ├── LICENSE.txt
    │   │           │       ├── README.md
    │   │           │       ├── xxhash.go
    │   │           │       ├── xxhash_amd64.s
    │   │           │       ├── xxhash_arm64.s
    │   │           │       ├── xxhash_asm.go
    │   │           │       ├── xxhash_other.go
    │   │           │       └── xxhash_safe.go
    │   │           ├── matchlen_amd64.go
    │   │           ├── matchlen_amd64.s
    │   │           ├── matchlen_generic.go
    │   │           ├── seqdec.go
    │   │           ├── seqdec_amd64.go
    │   │           ├── seqdec_amd64.s
    │   │           ├── seqdec_generic.go
    │   │           ├── seqenc.go
    │   │           ├── snappy.go
    │   │           ├── zip.go
    │   │           └── zstd.go
    │   ├── lufia/
    │   │   └── plan9stats/
    │   │       ├── .gitignore
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── cpu.go
    │   │       ├── doc.go
    │   │       ├── host.go
    │   │       ├── int.go
    │   │       ├── opts.go
    │   │       └── stats.go
    │   ├── magiconair/
    │   │   └── properties/
    │   │       ├── .gitignore
    │   │       ├── LICENSE.md
    │   │       ├── README.md
    │   │       ├── decode.go
    │   │       ├── doc.go
    │   │       ├── integrate.go
    │   │       ├── lex.go
    │   │       ├── load.go
    │   │       ├── parser.go
    │   │       ├── properties.go
    │   │       └── rangecheck.go
    │   ├── moby/
    │   │   ├── docker-image-spec/
    │   │   │   ├── LICENSE
    │   │   │   └── specs-go/
    │   │   │       └── v1/
    │   │   │           └── image.go
    │   │   ├── patternmatcher/
    │   │   │   ├── LICENSE
    │   │   │   ├── NOTICE
    │   │   │   ├── ignorefile/
    │   │   │   │   └── ignorefile.go
    │   │   │   └── patternmatcher.go
    │   │   └── sys/
    │   │       ├── sequential/
    │   │       │   ├── LICENSE
    │   │       │   ├── doc.go
    │   │       │   ├── sequential_unix.go
    │   │       │   └── sequential_windows.go
    │   │       ├── user/
    │   │       │   ├── LICENSE
    │   │       │   ├── lookup_unix.go
    │   │       │   ├── user.go
    │   │       │   └── user_fuzzer.go
    │   │       └── userns/
    │   │           ├── LICENSE
    │   │           ├── userns.go
    │   │           ├── userns_linux.go
    │   │           ├── userns_linux_fuzzer.go
    │   │           └── userns_unsupported.go
    │   ├── morikuni/
    │   │   └── aec/
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── aec.go
    │   │       ├── ansi.go
    │   │       ├── builder.go
    │   │       └── sgr.go
    │   ├── openark/
    │   │   └── golib/
    │   │       ├── LICENSE
    │   │       ├── log/
    │   │       │   └── log.go
    │   │       └── sqlutils/
    │   │           ├── dialect.go
    │   │           ├── sqlite_dialect.go
    │   │           └── sqlutils.go
    │   ├── opencontainers/
    │   │   ├── go-digest/
    │   │   │   ├── .mailmap
    │   │   │   ├── .pullapprove.yml
    │   │   │   ├── .travis.yml
    │   │   │   ├── CONTRIBUTING.md
    │   │   │   ├── LICENSE
    │   │   │   ├── LICENSE.docs
    │   │   │   ├── MAINTAINERS
    │   │   │   ├── README.md
    │   │   │   ├── algorithm.go
    │   │   │   ├── digest.go
    │   │   │   ├── digester.go
    │   │   │   ├── doc.go
    │   │   │   └── verifiers.go
    │   │   └── image-spec/
    │   │       ├── LICENSE
    │   │       └── specs-go/
    │   │           ├── v1/
    │   │           │   ├── annotations.go
    │   │           │   ├── config.go
    │   │           │   ├── descriptor.go
    │   │           │   ├── index.go
    │   │           │   ├── layout.go
    │   │           │   ├── manifest.go
    │   │           │   └── mediatype.go
    │   │           ├── version.go
    │   │           └── versioned.go
    │   ├── pingcap/
    │   │   ├── errors/
    │   │   │   ├── .gitignore
    │   │   │   ├── .travis.yml
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   ├── compatible_shim.go
    │   │   │   ├── errors.go
    │   │   │   ├── group.go
    │   │   │   ├── juju_adaptor.go
    │   │   │   ├── normalize.go
    │   │   │   └── stack.go
    │   │   └── tidb/
    │   │       └── pkg/
    │   │           └── parser/
    │   │               ├── LICENSE
    │   │               ├── charset/
    │   │               │   ├── BUILD.bazel
    │   │               │   ├── charset.go
    │   │               │   ├── encoding.go
    │   │               │   ├── encoding_ascii.go
    │   │               │   ├── encoding_base.go
    │   │               │   ├── encoding_bin.go
    │   │               │   ├── encoding_gbk.go
    │   │               │   ├── encoding_latin1.go
    │   │               │   ├── encoding_table.go
    │   │               │   └── encoding_utf8.go
    │   │               ├── format/
    │   │               │   ├── BUILD.bazel
    │   │               │   └── format.go
    │   │               ├── mysql/
    │   │               │   ├── BUILD.bazel
    │   │               │   ├── charset.go
    │   │               │   ├── const.go
    │   │               │   ├── errcode.go
    │   │               │   ├── errname.go
    │   │               │   ├── error.go
    │   │               │   ├── locale_format.go
    │   │               │   ├── privs.go
    │   │               │   ├── state.go
    │   │               │   ├── type.go
    │   │               │   └── util.go
    │   │               └── terror/
    │   │                   ├── BUILD.bazel
    │   │                   └── terror.go
    │   ├── pkg/
    │   │   └── errors/
    │   │       ├── .gitignore
    │   │       ├── .travis.yml
    │   │       ├── LICENSE
    │   │       ├── Makefile
    │   │       ├── README.md
    │   │       ├── appveyor.yml
    │   │       ├── errors.go
    │   │       ├── go113.go
    │   │       └── stack.go
    │   ├── pmezard/
    │   │   └── go-difflib/
    │   │       ├── LICENSE
    │   │       └── difflib/
    │   │           └── difflib.go
    │   ├── power-devops/
    │   │   └── perfstat/
    │   │       ├── LICENSE
    │   │       ├── c_helpers.c
    │   │       ├── c_helpers.h
    │   │       ├── config.go
    │   │       ├── cpustat.go
    │   │       ├── diskstat.go
    │   │       ├── doc.go
    │   │       ├── fsstat.go
    │   │       ├── helpers.go
    │   │       ├── lparstat.go
    │   │       ├── lvmstat.go
    │   │       ├── memstat.go
    │   │       ├── netstat.go
    │   │       ├── procstat.go
    │   │       ├── sysconf.go
    │   │       ├── systemcfg.go
    │   │       ├── types_cpu.go
    │   │       ├── types_disk.go
    │   │       ├── types_fs.go
    │   │       ├── types_lpar.go
    │   │       ├── types_lvm.go
    │   │       ├── types_memory.go
    │   │       ├── types_network.go
    │   │       ├── types_process.go
    │   │       └── uptime.go
    │   ├── shirou/
    │   │   └── gopsutil/
    │   │       └── v4/
    │   │           ├── LICENSE
    │   │           ├── common/
    │   │           │   └── env.go
    │   │           ├── cpu/
    │   │           │   ├── cpu.go
    │   │           │   ├── cpu_aix.go
    │   │           │   ├── cpu_aix_cgo.go
    │   │           │   ├── cpu_aix_nocgo.go
    │   │           │   ├── cpu_darwin.go
    │   │           │   ├── cpu_darwin_arm64.go
    │   │           │   ├── cpu_darwin_fallback.go
    │   │           │   ├── cpu_dragonfly.go
    │   │           │   ├── cpu_dragonfly_amd64.go
    │   │           │   ├── cpu_fallback.go
    │   │           │   ├── cpu_freebsd.go
    │   │           │   ├── cpu_freebsd_386.go
    │   │           │   ├── cpu_freebsd_amd64.go
    │   │           │   ├── cpu_freebsd_arm.go
    │   │           │   ├── cpu_freebsd_arm64.go
    │   │           │   ├── cpu_linux.go
    │   │           │   ├── cpu_netbsd.go
    │   │           │   ├── cpu_netbsd_amd64.go
    │   │           │   ├── cpu_netbsd_arm.go
    │   │           │   ├── cpu_netbsd_arm64.go
    │   │           │   ├── cpu_openbsd.go
    │   │           │   ├── cpu_openbsd_386.go
    │   │           │   ├── cpu_openbsd_amd64.go
    │   │           │   ├── cpu_openbsd_arm.go
    │   │           │   ├── cpu_openbsd_arm64.go
    │   │           │   ├── cpu_openbsd_riscv64.go
    │   │           │   ├── cpu_plan9.go
    │   │           │   ├── cpu_solaris.go
    │   │           │   └── cpu_windows.go
    │   │           ├── internal/
    │   │           │   └── common/
    │   │           │       ├── binary.go
    │   │           │       ├── common.go
    │   │           │       ├── common_darwin.go
    │   │           │       ├── common_freebsd.go
    │   │           │       ├── common_linux.go
    │   │           │       ├── common_netbsd.go
    │   │           │       ├── common_openbsd.go
    │   │           │       ├── common_unix.go
    │   │           │       ├── common_windows.go
    │   │           │       ├── endian.go
    │   │           │       ├── sleep.go
    │   │           │       └── warnings.go
    │   │           ├── mem/
    │   │           │   ├── ex_linux.go
    │   │           │   ├── ex_windows.go
    │   │           │   ├── mem.go
    │   │           │   ├── mem_aix.go
    │   │           │   ├── mem_aix_cgo.go
    │   │           │   ├── mem_aix_nocgo.go
    │   │           │   ├── mem_bsd.go
    │   │           │   ├── mem_darwin.go
    │   │           │   ├── mem_fallback.go
    │   │           │   ├── mem_freebsd.go
    │   │           │   ├── mem_linux.go
    │   │           │   ├── mem_netbsd.go
    │   │           │   ├── mem_openbsd.go
    │   │           │   ├── mem_openbsd_386.go
    │   │           │   ├── mem_openbsd_amd64.go
    │   │           │   ├── mem_openbsd_arm.go
    │   │           │   ├── mem_openbsd_arm64.go
    │   │           │   ├── mem_openbsd_riscv64.go
    │   │           │   ├── mem_plan9.go
    │   │           │   ├── mem_solaris.go
    │   │           │   └── mem_windows.go
    │   │           ├── net/
    │   │           │   ├── net.go
    │   │           │   ├── net_aix.go
    │   │           │   ├── net_aix_cgo.go
    │   │           │   ├── net_aix_nocgo.go
    │   │           │   ├── net_darwin.go
    │   │           │   ├── net_fallback.go
    │   │           │   ├── net_freebsd.go
    │   │           │   ├── net_linux.go
    │   │           │   ├── net_openbsd.go
    │   │           │   ├── net_solaris.go
    │   │           │   ├── net_unix.go
    │   │           │   └── net_windows.go
    │   │           └── process/
    │   │               ├── process.go
    │   │               ├── process_bsd.go
    │   │               ├── process_darwin.go
    │   │               ├── process_darwin_amd64.go
    │   │               ├── process_darwin_arm64.go
    │   │               ├── process_fallback.go
    │   │               ├── process_freebsd.go
    │   │               ├── process_freebsd_386.go
    │   │               ├── process_freebsd_amd64.go
    │   │               ├── process_freebsd_arm.go
    │   │               ├── process_freebsd_arm64.go
    │   │               ├── process_linux.go
    │   │               ├── process_openbsd.go
    │   │               ├── process_openbsd_386.go
    │   │               ├── process_openbsd_amd64.go
    │   │               ├── process_openbsd_arm.go
    │   │               ├── process_openbsd_arm64.go
    │   │               ├── process_openbsd_riscv64.go
    │   │               ├── process_plan9.go
    │   │               ├── process_posix.go
    │   │               ├── process_solaris.go
    │   │               ├── process_windows.go
    │   │               ├── process_windows_32bit.go
    │   │               └── process_windows_64bit.go
    │   ├── shopspring/
    │   │   └── decimal/
    │   │       ├── .gitignore
    │   │       ├── .travis.yml
    │   │       ├── CHANGELOG.md
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── decimal-go.go
    │   │       ├── decimal.go
    │   │       └── rounding.go
    │   ├── siddontang/
    │   │   └── go-log/
    │   │       ├── LICENSE
    │   │       ├── log/
    │   │       │   ├── doc.go
    │   │       │   ├── filehandler.go
    │   │       │   ├── handler.go
    │   │       │   ├── log.go
    │   │       │   └── logger.go
    │   │       └── loggers/
    │   │           └── loggers.go
    │   ├── stretchr/
    │   │   └── testify/
    │   │       ├── LICENSE
    │   │       ├── assert/
    │   │       │   ├── assertion_compare.go
    │   │       │   ├── assertion_format.go
    │   │       │   ├── assertion_format.go.tmpl
    │   │       │   ├── assertion_forward.go
    │   │       │   ├── assertion_forward.go.tmpl
    │   │       │   ├── assertion_order.go
    │   │       │   ├── assertions.go
    │   │       │   ├── doc.go
    │   │       │   ├── errors.go
    │   │       │   ├── forward_assertions.go
    │   │       │   ├── http_assertions.go
    │   │       │   └── yaml/
    │   │       │       ├── yaml_custom.go
    │   │       │       ├── yaml_default.go
    │   │       │       └── yaml_fail.go
    │   │       ├── require/
    │   │       │   ├── doc.go
    │   │       │   ├── forward_requirements.go
    │   │       │   ├── require.go
    │   │       │   ├── require.go.tmpl
    │   │       │   ├── require_forward.go
    │   │       │   ├── require_forward.go.tmpl
    │   │       │   └── requirements.go
    │   │       └── suite/
    │   │           ├── doc.go
    │   │           ├── interfaces.go
    │   │           ├── stats.go
    │   │           └── suite.go
    │   ├── tklauser/
    │   │   ├── go-sysconf/
    │   │   │   ├── .cirrus.yml
    │   │   │   ├── .gitignore
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   ├── sysconf.go
    │   │   │   ├── sysconf_bsd.go
    │   │   │   ├── sysconf_darwin.go
    │   │   │   ├── sysconf_dragonfly.go
    │   │   │   ├── sysconf_freebsd.go
    │   │   │   ├── sysconf_generic.go
    │   │   │   ├── sysconf_linux.go
    │   │   │   ├── sysconf_netbsd.go
    │   │   │   ├── sysconf_openbsd.go
    │   │   │   ├── sysconf_posix.go
    │   │   │   ├── sysconf_solaris.go
    │   │   │   ├── sysconf_unsupported.go
    │   │   │   ├── zsysconf_defs_darwin.go
    │   │   │   ├── zsysconf_defs_dragonfly.go
    │   │   │   ├── zsysconf_defs_freebsd.go
    │   │   │   ├── zsysconf_defs_linux.go
    │   │   │   ├── zsysconf_defs_netbsd.go
    │   │   │   ├── zsysconf_defs_openbsd.go
    │   │   │   ├── zsysconf_defs_solaris.go
    │   │   │   ├── zsysconf_values_freebsd_386.go
    │   │   │   ├── zsysconf_values_freebsd_amd64.go
    │   │   │   ├── zsysconf_values_freebsd_arm.go
    │   │   │   ├── zsysconf_values_freebsd_arm64.go
    │   │   │   ├── zsysconf_values_freebsd_riscv64.go
    │   │   │   ├── zsysconf_values_linux_386.go
    │   │   │   ├── zsysconf_values_linux_amd64.go
    │   │   │   ├── zsysconf_values_linux_arm.go
    │   │   │   ├── zsysconf_values_linux_arm64.go
    │   │   │   ├── zsysconf_values_linux_loong64.go
    │   │   │   ├── zsysconf_values_linux_mips.go
    │   │   │   ├── zsysconf_values_linux_mips64.go
    │   │   │   ├── zsysconf_values_linux_mips64le.go
    │   │   │   ├── zsysconf_values_linux_mipsle.go
    │   │   │   ├── zsysconf_values_linux_ppc64.go
    │   │   │   ├── zsysconf_values_linux_ppc64le.go
    │   │   │   ├── zsysconf_values_linux_riscv64.go
    │   │   │   ├── zsysconf_values_linux_s390x.go
    │   │   │   ├── zsysconf_values_netbsd_386.go
    │   │   │   ├── zsysconf_values_netbsd_amd64.go
    │   │   │   ├── zsysconf_values_netbsd_arm.go
    │   │   │   └── zsysconf_values_netbsd_arm64.go
    │   │   └── numcpus/
    │   │       ├── .cirrus.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── numcpus.go
    │   │       ├── numcpus_bsd.go
    │   │       ├── numcpus_linux.go
    │   │       ├── numcpus_solaris.go
    │   │       ├── numcpus_unsupported.go
    │   │       └── numcpus_windows.go
    │   └── yusufpapurcu/
    │       └── wmi/
    │           ├── LICENSE
    │           ├── README.md
    │           ├── swbemservices.go
    │           └── wmi.go
    ├── go.opentelemetry.io/
    │   ├── auto/
    │   │   └── sdk/
    │   │       ├── CONTRIBUTING.md
    │   │       ├── LICENSE
    │   │       ├── VERSIONING.md
    │   │       ├── doc.go
    │   │       ├── internal/
    │   │       │   └── telemetry/
    │   │       │       ├── attr.go
    │   │       │       ├── doc.go
    │   │       │       ├── id.go
    │   │       │       ├── number.go
    │   │       │       ├── resource.go
    │   │       │       ├── scope.go
    │   │       │       ├── span.go
    │   │       │       ├── status.go
    │   │       │       ├── traces.go
    │   │       │       └── value.go
    │   │       ├── limit.go
    │   │       ├── span.go
    │   │       ├── tracer.go
    │   │       └── tracer_provider.go
    │   ├── contrib/
    │   │   └── instrumentation/
    │   │       └── net/
    │   │           └── http/
    │   │               └── otelhttp/
    │   │                   ├── LICENSE
    │   │                   ├── client.go
    │   │                   ├── common.go
    │   │                   ├── config.go
    │   │                   ├── doc.go
    │   │                   ├── handler.go
    │   │                   ├── internal/
    │   │                   │   └── semconvutil/
    │   │                   │       ├── gen.go
    │   │                   │       ├── httpconv.go
    │   │                   │       └── netconv.go
    │   │                   ├── labeler.go
    │   │                   ├── transport.go
    │   │                   ├── version.go
    │   │                   └── wrap.go
    │   └── otel/
    │       ├── .codespellignore
    │       ├── .codespellrc
    │       ├── .gitattributes
    │       ├── .gitignore
    │       ├── .golangci.yml
    │       ├── .lycheeignore
    │       ├── .markdownlint.yaml
    │       ├── CHANGELOG.md
    │       ├── CODEOWNERS
    │       ├── CONTRIBUTING.md
    │       ├── LICENSE
    │       ├── Makefile
    │       ├── README.md
    │       ├── RELEASING.md
    │       ├── VERSIONING.md
    │       ├── attribute/
    │       │   ├── README.md
    │       │   ├── doc.go
    │       │   ├── encoder.go
    │       │   ├── filter.go
    │       │   ├── iterator.go
    │       │   ├── key.go
    │       │   ├── kv.go
    │       │   ├── set.go
    │       │   ├── type_string.go
    │       │   └── value.go
    │       ├── baggage/
    │       │   ├── README.md
    │       │   ├── baggage.go
    │       │   ├── context.go
    │       │   └── doc.go
    │       ├── codes/
    │       │   ├── README.md
    │       │   ├── codes.go
    │       │   └── doc.go
    │       ├── dependencies.Dockerfile
    │       ├── doc.go
    │       ├── error_handler.go
    │       ├── get_main_pkgs.sh
    │       ├── handler.go
    │       ├── internal/
    │       │   ├── attribute/
    │       │   │   └── attribute.go
    │       │   ├── baggage/
    │       │   │   ├── baggage.go
    │       │   │   └── context.go
    │       │   ├── gen.go
    │       │   ├── global/
    │       │   │   ├── handler.go
    │       │   │   ├── instruments.go
    │       │   │   ├── internal_logging.go
    │       │   │   ├── meter.go
    │       │   │   ├── propagator.go
    │       │   │   ├── state.go
    │       │   │   └── trace.go
    │       │   └── rawhelpers.go
    │       ├── internal_logging.go
    │       ├── metric/
    │       │   ├── LICENSE
    │       │   ├── README.md
    │       │   ├── asyncfloat64.go
    │       │   ├── asyncint64.go
    │       │   ├── config.go
    │       │   ├── doc.go
    │       │   ├── embedded/
    │       │   │   ├── README.md
    │       │   │   └── embedded.go
    │       │   ├── instrument.go
    │       │   ├── meter.go
    │       │   ├── syncfloat64.go
    │       │   └── syncint64.go
    │       ├── metric.go
    │       ├── propagation/
    │       │   ├── README.md
    │       │   ├── baggage.go
    │       │   ├── doc.go
    │       │   ├── propagation.go
    │       │   └── trace_context.go
    │       ├── propagation.go
    │       ├── renovate.json
    │       ├── requirements.txt
    │       ├── semconv/
    │       │   ├── v1.20.0/
    │       │   │   ├── README.md
    │       │   │   ├── attribute_group.go
    │       │   │   ├── doc.go
    │       │   │   ├── event.go
    │       │   │   ├── exception.go
    │       │   │   ├── http.go
    │       │   │   ├── resource.go
    │       │   │   ├── schema.go
    │       │   │   └── trace.go
    │       │   └── v1.26.0/
    │       │       ├── README.md
    │       │       ├── attribute_group.go
    │       │       ├── doc.go
    │       │       ├── exception.go
    │       │       ├── metric.go
    │       │       └── schema.go
    │       ├── trace/
    │       │   ├── LICENSE
    │       │   ├── README.md
    │       │   ├── auto.go
    │       │   ├── config.go
    │       │   ├── context.go
    │       │   ├── doc.go
    │       │   ├── embedded/
    │       │   │   ├── README.md
    │       │   │   └── embedded.go
    │       │   ├── internal/
    │       │   │   └── telemetry/
    │       │   │       ├── attr.go
    │       │   │       ├── doc.go
    │       │   │       ├── id.go
    │       │   │       ├── number.go
    │       │   │       ├── resource.go
    │       │   │       ├── scope.go
    │       │   │       ├── span.go
    │       │   │       ├── status.go
    │       │   │       ├── traces.go
    │       │   │       └── value.go
    │       │   ├── nonrecording.go
    │       │   ├── noop/
    │       │   │   ├── README.md
    │       │   │   └── noop.go
    │       │   ├── noop.go
    │       │   ├── provider.go
    │       │   ├── span.go
    │       │   ├── trace.go
    │       │   ├── tracer.go
    │       │   └── tracestate.go
    │       ├── trace.go
    │       ├── verify_readmes.sh
    │       ├── verify_released_changelog.sh
    │       ├── version.go
    │       └── versions.yaml
    ├── golang.org/
    │   └── x/
    │       ├── crypto/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   ├── blowfish/
    │       │   │   ├── block.go
    │       │   │   ├── cipher.go
    │       │   │   └── const.go
    │       │   ├── chacha20/
    │       │   │   ├── chacha_arm64.go
    │       │   │   ├── chacha_arm64.s
    │       │   │   ├── chacha_generic.go
    │       │   │   ├── chacha_noasm.go
    │       │   │   ├── chacha_ppc64x.go
    │       │   │   ├── chacha_ppc64x.s
    │       │   │   ├── chacha_s390x.go
    │       │   │   ├── chacha_s390x.s
    │       │   │   └── xor.go
    │       │   ├── curve25519/
    │       │   │   └── curve25519.go
    │       │   ├── internal/
    │       │   │   ├── alias/
    │       │   │   │   ├── alias.go
    │       │   │   │   └── alias_purego.go
    │       │   │   └── poly1305/
    │       │   │       ├── mac_noasm.go
    │       │   │       ├── poly1305.go
    │       │   │       ├── sum_amd64.s
    │       │   │       ├── sum_asm.go
    │       │   │       ├── sum_generic.go
    │       │   │       ├── sum_loong64.s
    │       │   │       ├── sum_ppc64x.s
    │       │   │       ├── sum_s390x.go
    │       │   │       └── sum_s390x.s
    │       │   └── ssh/
    │       │       ├── buffer.go
    │       │       ├── certs.go
    │       │       ├── channel.go
    │       │       ├── cipher.go
    │       │       ├── client.go
    │       │       ├── client_auth.go
    │       │       ├── common.go
    │       │       ├── connection.go
    │       │       ├── doc.go
    │       │       ├── handshake.go
    │       │       ├── internal/
    │       │       │   └── bcrypt_pbkdf/
    │       │       │       └── bcrypt_pbkdf.go
    │       │       ├── kex.go
    │       │       ├── keys.go
    │       │       ├── mac.go
    │       │       ├── messages.go
    │       │       ├── mux.go
    │       │       ├── server.go
    │       │       ├── session.go
    │       │       ├── ssh_gss.go
    │       │       ├── streamlocal.go
    │       │       ├── tcpip.go
    │       │       └── transport.go
    │       ├── net/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   └── context/
    │       │       └── context.go
    │       ├── sync/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   └── errgroup/
    │       │       └── errgroup.go
    │       ├── sys/
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   ├── cpu/
    │       │   │   ├── asm_aix_ppc64.s
    │       │   │   ├── asm_darwin_x86_gc.s
    │       │   │   ├── byteorder.go
    │       │   │   ├── cpu.go
    │       │   │   ├── cpu_aix.go
    │       │   │   ├── cpu_arm.go
    │       │   │   ├── cpu_arm64.go
    │       │   │   ├── cpu_arm64.s
    │       │   │   ├── cpu_darwin_x86.go
    │       │   │   ├── cpu_gc_arm64.go
    │       │   │   ├── cpu_gc_s390x.go
    │       │   │   ├── cpu_gc_x86.go
    │       │   │   ├── cpu_gc_x86.s
    │       │   │   ├── cpu_gccgo_arm64.go
    │       │   │   ├── cpu_gccgo_s390x.go
    │       │   │   ├── cpu_gccgo_x86.c
    │       │   │   ├── cpu_gccgo_x86.go
    │       │   │   ├── cpu_linux.go
    │       │   │   ├── cpu_linux_arm.go
    │       │   │   ├── cpu_linux_arm64.go
    │       │   │   ├── cpu_linux_loong64.go
    │       │   │   ├── cpu_linux_mips64x.go
    │       │   │   ├── cpu_linux_noinit.go
    │       │   │   ├── cpu_linux_ppc64x.go
    │       │   │   ├── cpu_linux_riscv64.go
    │       │   │   ├── cpu_linux_s390x.go
    │       │   │   ├── cpu_loong64.go
    │       │   │   ├── cpu_loong64.s
    │       │   │   ├── cpu_mips64x.go
    │       │   │   ├── cpu_mipsx.go
    │       │   │   ├── cpu_netbsd_arm64.go
    │       │   │   ├── cpu_openbsd_arm64.go
    │       │   │   ├── cpu_openbsd_arm64.s
    │       │   │   ├── cpu_other_arm.go
    │       │   │   ├── cpu_other_arm64.go
    │       │   │   ├── cpu_other_mips64x.go
    │       │   │   ├── cpu_other_ppc64x.go
    │       │   │   ├── cpu_other_riscv64.go
    │       │   │   ├── cpu_other_x86.go
    │       │   │   ├── cpu_ppc64x.go
    │       │   │   ├── cpu_riscv64.go
    │       │   │   ├── cpu_s390x.go
    │       │   │   ├── cpu_s390x.s
    │       │   │   ├── cpu_wasm.go
    │       │   │   ├── cpu_x86.go
    │       │   │   ├── cpu_zos.go
    │       │   │   ├── cpu_zos_s390x.go
    │       │   │   ├── endian_big.go
    │       │   │   ├── endian_little.go
    │       │   │   ├── hwcap_linux.go
    │       │   │   ├── parse.go
    │       │   │   ├── proc_cpuinfo_linux.go
    │       │   │   ├── runtime_auxv.go
    │       │   │   ├── runtime_auxv_go121.go
    │       │   │   ├── syscall_aix_gccgo.go
    │       │   │   ├── syscall_aix_ppc64_gc.go
    │       │   │   └── syscall_darwin_x86_gc.go
    │       │   ├── plan9/
    │       │   │   ├── asm.s
    │       │   │   ├── asm_plan9_386.s
    │       │   │   ├── asm_plan9_amd64.s
    │       │   │   ├── asm_plan9_arm.s
    │       │   │   ├── const_plan9.go
    │       │   │   ├── dir_plan9.go
    │       │   │   ├── env_plan9.go
    │       │   │   ├── errors_plan9.go
    │       │   │   ├── mkall.sh
    │       │   │   ├── mkerrors.sh
    │       │   │   ├── mksysnum_plan9.sh
    │       │   │   ├── pwd_go15_plan9.go
    │       │   │   ├── pwd_plan9.go
    │       │   │   ├── race.go
    │       │   │   ├── race0.go
    │       │   │   ├── str.go
    │       │   │   ├── syscall.go
    │       │   │   ├── syscall_plan9.go
    │       │   │   ├── zsyscall_plan9_386.go
    │       │   │   ├── zsyscall_plan9_amd64.go
    │       │   │   ├── zsyscall_plan9_arm.go
    │       │   │   └── zsysnum_plan9.go
    │       │   ├── unix/
    │       │   │   ├── .gitignore
    │       │   │   ├── README.md
    │       │   │   ├── affinity_linux.go
    │       │   │   ├── aliases.go
    │       │   │   ├── asm_aix_ppc64.s
    │       │   │   ├── asm_bsd_386.s
    │       │   │   ├── asm_bsd_amd64.s
    │       │   │   ├── asm_bsd_arm.s
    │       │   │   ├── asm_bsd_arm64.s
    │       │   │   ├── asm_bsd_ppc64.s
    │       │   │   ├── asm_bsd_riscv64.s
    │       │   │   ├── asm_linux_386.s
    │       │   │   ├── asm_linux_amd64.s
    │       │   │   ├── asm_linux_arm.s
    │       │   │   ├── asm_linux_arm64.s
    │       │   │   ├── asm_linux_loong64.s
    │       │   │   ├── asm_linux_mips64x.s
    │       │   │   ├── asm_linux_mipsx.s
    │       │   │   ├── asm_linux_ppc64x.s
    │       │   │   ├── asm_linux_riscv64.s
    │       │   │   ├── asm_linux_s390x.s
    │       │   │   ├── asm_openbsd_mips64.s
    │       │   │   ├── asm_solaris_amd64.s
    │       │   │   ├── asm_zos_s390x.s
    │       │   │   ├── auxv.go
    │       │   │   ├── auxv_unsupported.go
    │       │   │   ├── bluetooth_linux.go
    │       │   │   ├── bpxsvc_zos.go
    │       │   │   ├── bpxsvc_zos.s
    │       │   │   ├── cap_freebsd.go
    │       │   │   ├── constants.go
    │       │   │   ├── dev_aix_ppc.go
    │       │   │   ├── dev_aix_ppc64.go
    │       │   │   ├── dev_darwin.go
    │       │   │   ├── dev_dragonfly.go
    │       │   │   ├── dev_freebsd.go
    │       │   │   ├── dev_linux.go
    │       │   │   ├── dev_netbsd.go
    │       │   │   ├── dev_openbsd.go
    │       │   │   ├── dev_zos.go
    │       │   │   ├── dirent.go
    │       │   │   ├── endian_big.go
    │       │   │   ├── endian_little.go
    │       │   │   ├── env_unix.go
    │       │   │   ├── fcntl.go
    │       │   │   ├── fcntl_darwin.go
    │       │   │   ├── fcntl_linux_32bit.go
    │       │   │   ├── fdset.go
    │       │   │   ├── gccgo.go
    │       │   │   ├── gccgo_c.c
    │       │   │   ├── gccgo_linux_amd64.go
    │       │   │   ├── ifreq_linux.go
    │       │   │   ├── ioctl_linux.go
    │       │   │   ├── ioctl_signed.go
    │       │   │   ├── ioctl_unsigned.go
    │       │   │   ├── ioctl_zos.go
    │       │   │   ├── mkall.sh
    │       │   │   ├── mkerrors.sh
    │       │   │   ├── mmap_nomremap.go
    │       │   │   ├── mremap.go
    │       │   │   ├── pagesize_unix.go
    │       │   │   ├── pledge_openbsd.go
    │       │   │   ├── ptrace_darwin.go
    │       │   │   ├── ptrace_ios.go
    │       │   │   ├── race.go
    │       │   │   ├── race0.go
    │       │   │   ├── readdirent_getdents.go
    │       │   │   ├── readdirent_getdirentries.go
    │       │   │   ├── sockcmsg_dragonfly.go
    │       │   │   ├── sockcmsg_linux.go
    │       │   │   ├── sockcmsg_unix.go
    │       │   │   ├── sockcmsg_unix_other.go
    │       │   │   ├── sockcmsg_zos.go
    │       │   │   ├── symaddr_zos_s390x.s
    │       │   │   ├── syscall.go
    │       │   │   ├── syscall_aix.go
    │       │   │   ├── syscall_aix_ppc.go
    │       │   │   ├── syscall_aix_ppc64.go
    │       │   │   ├── syscall_bsd.go
    │       │   │   ├── syscall_darwin.go
    │       │   │   ├── syscall_darwin_amd64.go
    │       │   │   ├── syscall_darwin_arm64.go
    │       │   │   ├── syscall_darwin_libSystem.go
    │       │   │   ├── syscall_dragonfly.go
    │       │   │   ├── syscall_dragonfly_amd64.go
    │       │   │   ├── syscall_freebsd.go
    │       │   │   ├── syscall_freebsd_386.go
    │       │   │   ├── syscall_freebsd_amd64.go
    │       │   │   ├── syscall_freebsd_arm.go
    │       │   │   ├── syscall_freebsd_arm64.go
    │       │   │   ├── syscall_freebsd_riscv64.go
    │       │   │   ├── syscall_hurd.go
    │       │   │   ├── syscall_hurd_386.go
    │       │   │   ├── syscall_illumos.go
    │       │   │   ├── syscall_linux.go
    │       │   │   ├── syscall_linux_386.go
    │       │   │   ├── syscall_linux_alarm.go
    │       │   │   ├── syscall_linux_amd64.go
    │       │   │   ├── syscall_linux_amd64_gc.go
    │       │   │   ├── syscall_linux_arm.go
    │       │   │   ├── syscall_linux_arm64.go
    │       │   │   ├── syscall_linux_gc.go
    │       │   │   ├── syscall_linux_gc_386.go
    │       │   │   ├── syscall_linux_gc_arm.go
    │       │   │   ├── syscall_linux_gccgo_386.go
    │       │   │   ├── syscall_linux_gccgo_arm.go
    │       │   │   ├── syscall_linux_loong64.go
    │       │   │   ├── syscall_linux_mips64x.go
    │       │   │   ├── syscall_linux_mipsx.go
    │       │   │   ├── syscall_linux_ppc.go
    │       │   │   ├── syscall_linux_ppc64x.go
    │       │   │   ├── syscall_linux_riscv64.go
    │       │   │   ├── syscall_linux_s390x.go
    │       │   │   ├── syscall_linux_sparc64.go
    │       │   │   ├── syscall_netbsd.go
    │       │   │   ├── syscall_netbsd_386.go
    │       │   │   ├── syscall_netbsd_amd64.go
    │       │   │   ├── syscall_netbsd_arm.go
    │       │   │   ├── syscall_netbsd_arm64.go
    │       │   │   ├── syscall_openbsd.go
    │       │   │   ├── syscall_openbsd_386.go
    │       │   │   ├── syscall_openbsd_amd64.go
    │       │   │   ├── syscall_openbsd_arm.go
    │       │   │   ├── syscall_openbsd_arm64.go
    │       │   │   ├── syscall_openbsd_libc.go
    │       │   │   ├── syscall_openbsd_mips64.go
    │       │   │   ├── syscall_openbsd_ppc64.go
    │       │   │   ├── syscall_openbsd_riscv64.go
    │       │   │   ├── syscall_solaris.go
    │       │   │   ├── syscall_solaris_amd64.go
    │       │   │   ├── syscall_unix.go
    │       │   │   ├── syscall_unix_gc.go
    │       │   │   ├── syscall_unix_gc_ppc64x.go
    │       │   │   ├── syscall_zos_s390x.go
    │       │   │   ├── sysvshm_linux.go
    │       │   │   ├── sysvshm_unix.go
    │       │   │   ├── sysvshm_unix_other.go
    │       │   │   ├── timestruct.go
    │       │   │   ├── unveil_openbsd.go
    │       │   │   ├── vgetrandom_linux.go
    │       │   │   ├── vgetrandom_unsupported.go
    │       │   │   ├── xattr_bsd.go
    │       │   │   ├── zerrors_aix_ppc.go
    │       │   │   ├── zerrors_aix_ppc64.go
    │       │   │   ├── zerrors_darwin_amd64.go
    │       │   │   ├── zerrors_darwin_arm64.go
    │       │   │   ├── zerrors_dragonfly_amd64.go
    │       │   │   ├── zerrors_freebsd_386.go
    │       │   │   ├── zerrors_freebsd_amd64.go
    │       │   │   ├── zerrors_freebsd_arm.go
    │       │   │   ├── zerrors_freebsd_arm64.go
    │       │   │   ├── zerrors_freebsd_riscv64.go
    │       │   │   ├── zerrors_linux.go
    │       │   │   ├── zerrors_linux_386.go
    │       │   │   ├── zerrors_linux_amd64.go
    │       │   │   ├── zerrors_linux_arm.go
    │       │   │   ├── zerrors_linux_arm64.go
    │       │   │   ├── zerrors_linux_loong64.go
    │       │   │   ├── zerrors_linux_mips.go
    │       │   │   ├── zerrors_linux_mips64.go
    │       │   │   ├── zerrors_linux_mips64le.go
    │       │   │   ├── zerrors_linux_mipsle.go
    │       │   │   ├── zerrors_linux_ppc.go
    │       │   │   ├── zerrors_linux_ppc64.go
    │       │   │   ├── zerrors_linux_ppc64le.go
    │       │   │   ├── zerrors_linux_riscv64.go
    │       │   │   ├── zerrors_linux_s390x.go
    │       │   │   ├── zerrors_linux_sparc64.go
    │       │   │   ├── zerrors_netbsd_386.go
    │       │   │   ├── zerrors_netbsd_amd64.go
    │       │   │   ├── zerrors_netbsd_arm.go
    │       │   │   ├── zerrors_netbsd_arm64.go
    │       │   │   ├── zerrors_openbsd_386.go
    │       │   │   ├── zerrors_openbsd_amd64.go
    │       │   │   ├── zerrors_openbsd_arm.go
    │       │   │   ├── zerrors_openbsd_arm64.go
    │       │   │   ├── zerrors_openbsd_mips64.go
    │       │   │   ├── zerrors_openbsd_ppc64.go
    │       │   │   ├── zerrors_openbsd_riscv64.go
    │       │   │   ├── zerrors_solaris_amd64.go
    │       │   │   ├── zerrors_zos_s390x.go
    │       │   │   ├── zptrace_armnn_linux.go
    │       │   │   ├── zptrace_linux_arm64.go
    │       │   │   ├── zptrace_mipsnn_linux.go
    │       │   │   ├── zptrace_mipsnnle_linux.go
    │       │   │   ├── zptrace_x86_linux.go
    │       │   │   ├── zsymaddr_zos_s390x.s
    │       │   │   ├── zsyscall_aix_ppc.go
    │       │   │   ├── zsyscall_aix_ppc64.go
    │       │   │   ├── zsyscall_aix_ppc64_gc.go
    │       │   │   ├── zsyscall_aix_ppc64_gccgo.go
    │       │   │   ├── zsyscall_darwin_amd64.go
    │       │   │   ├── zsyscall_darwin_amd64.s
    │       │   │   ├── zsyscall_darwin_arm64.go
    │       │   │   ├── zsyscall_darwin_arm64.s
    │       │   │   ├── zsyscall_dragonfly_amd64.go
    │       │   │   ├── zsyscall_freebsd_386.go
    │       │   │   ├── zsyscall_freebsd_amd64.go
    │       │   │   ├── zsyscall_freebsd_arm.go
    │       │   │   ├── zsyscall_freebsd_arm64.go
    │       │   │   ├── zsyscall_freebsd_riscv64.go
    │       │   │   ├── zsyscall_illumos_amd64.go
    │       │   │   ├── zsyscall_linux.go
    │       │   │   ├── zsyscall_linux_386.go
    │       │   │   ├── zsyscall_linux_amd64.go
    │       │   │   ├── zsyscall_linux_arm.go
    │       │   │   ├── zsyscall_linux_arm64.go
    │       │   │   ├── zsyscall_linux_loong64.go
    │       │   │   ├── zsyscall_linux_mips.go
    │       │   │   ├── zsyscall_linux_mips64.go
    │       │   │   ├── zsyscall_linux_mips64le.go
    │       │   │   ├── zsyscall_linux_mipsle.go
    │       │   │   ├── zsyscall_linux_ppc.go
    │       │   │   ├── zsyscall_linux_ppc64.go
    │       │   │   ├── zsyscall_linux_ppc64le.go
    │       │   │   ├── zsyscall_linux_riscv64.go
    │       │   │   ├── zsyscall_linux_s390x.go
    │       │   │   ├── zsyscall_linux_sparc64.go
    │       │   │   ├── zsyscall_netbsd_386.go
    │       │   │   ├── zsyscall_netbsd_amd64.go
    │       │   │   ├── zsyscall_netbsd_arm.go
    │       │   │   ├── zsyscall_netbsd_arm64.go
    │       │   │   ├── zsyscall_openbsd_386.go
    │       │   │   ├── zsyscall_openbsd_386.s
    │       │   │   ├── zsyscall_openbsd_amd64.go
    │       │   │   ├── zsyscall_openbsd_amd64.s
    │       │   │   ├── zsyscall_openbsd_arm.go
    │       │   │   ├── zsyscall_openbsd_arm.s
    │       │   │   ├── zsyscall_openbsd_arm64.go
    │       │   │   ├── zsyscall_openbsd_arm64.s
    │       │   │   ├── zsyscall_openbsd_mips64.go
    │       │   │   ├── zsyscall_openbsd_mips64.s
    │       │   │   ├── zsyscall_openbsd_ppc64.go
    │       │   │   ├── zsyscall_openbsd_ppc64.s
    │       │   │   ├── zsyscall_openbsd_riscv64.go
    │       │   │   ├── zsyscall_openbsd_riscv64.s
    │       │   │   ├── zsyscall_solaris_amd64.go
    │       │   │   ├── zsyscall_zos_s390x.go
    │       │   │   ├── zsysctl_openbsd_386.go
    │       │   │   ├── zsysctl_openbsd_amd64.go
    │       │   │   ├── zsysctl_openbsd_arm.go
    │       │   │   ├── zsysctl_openbsd_arm64.go
    │       │   │   ├── zsysctl_openbsd_mips64.go
    │       │   │   ├── zsysctl_openbsd_ppc64.go
    │       │   │   ├── zsysctl_openbsd_riscv64.go
    │       │   │   ├── zsysnum_darwin_amd64.go
    │       │   │   ├── zsysnum_darwin_arm64.go
    │       │   │   ├── zsysnum_dragonfly_amd64.go
    │       │   │   ├── zsysnum_freebsd_386.go
    │       │   │   ├── zsysnum_freebsd_amd64.go
    │       │   │   ├── zsysnum_freebsd_arm.go
    │       │   │   ├── zsysnum_freebsd_arm64.go
    │       │   │   ├── zsysnum_freebsd_riscv64.go
    │       │   │   ├── zsysnum_linux_386.go
    │       │   │   ├── zsysnum_linux_amd64.go
    │       │   │   ├── zsysnum_linux_arm.go
    │       │   │   ├── zsysnum_linux_arm64.go
    │       │   │   ├── zsysnum_linux_loong64.go
    │       │   │   ├── zsysnum_linux_mips.go
    │       │   │   ├── zsysnum_linux_mips64.go
    │       │   │   ├── zsysnum_linux_mips64le.go
    │       │   │   ├── zsysnum_linux_mipsle.go
    │       │   │   ├── zsysnum_linux_ppc.go
    │       │   │   ├── zsysnum_linux_ppc64.go
    │       │   │   ├── zsysnum_linux_ppc64le.go
    │       │   │   ├── zsysnum_linux_riscv64.go
    │       │   │   ├── zsysnum_linux_s390x.go
    │       │   │   ├── zsysnum_linux_sparc64.go
    │       │   │   ├── zsysnum_netbsd_386.go
    │       │   │   ├── zsysnum_netbsd_amd64.go
    │       │   │   ├── zsysnum_netbsd_arm.go
    │       │   │   ├── zsysnum_netbsd_arm64.go
    │       │   │   ├── zsysnum_openbsd_386.go
    │       │   │   ├── zsysnum_openbsd_amd64.go
    │       │   │   ├── zsysnum_openbsd_arm.go
    │       │   │   ├── zsysnum_openbsd_arm64.go
    │       │   │   ├── zsysnum_openbsd_mips64.go
    │       │   │   ├── zsysnum_openbsd_ppc64.go
    │       │   │   ├── zsysnum_openbsd_riscv64.go
    │       │   │   ├── zsysnum_zos_s390x.go
    │       │   │   ├── ztypes_aix_ppc.go
    │       │   │   ├── ztypes_aix_ppc64.go
    │       │   │   ├── ztypes_darwin_amd64.go
    │       │   │   ├── ztypes_darwin_arm64.go
    │       │   │   ├── ztypes_dragonfly_amd64.go
    │       │   │   ├── ztypes_freebsd_386.go
    │       │   │   ├── ztypes_freebsd_amd64.go
    │       │   │   ├── ztypes_freebsd_arm.go
    │       │   │   ├── ztypes_freebsd_arm64.go
    │       │   │   ├── ztypes_freebsd_riscv64.go
    │       │   │   ├── ztypes_linux.go
    │       │   │   ├── ztypes_linux_386.go
    │       │   │   ├── ztypes_linux_amd64.go
    │       │   │   ├── ztypes_linux_arm.go
    │       │   │   ├── ztypes_linux_arm64.go
    │       │   │   ├── ztypes_linux_loong64.go
    │       │   │   ├── ztypes_linux_mips.go
    │       │   │   ├── ztypes_linux_mips64.go
    │       │   │   ├── ztypes_linux_mips64le.go
    │       │   │   ├── ztypes_linux_mipsle.go
    │       │   │   ├── ztypes_linux_ppc.go
    │       │   │   ├── ztypes_linux_ppc64.go
    │       │   │   ├── ztypes_linux_ppc64le.go
    │       │   │   ├── ztypes_linux_riscv64.go
    │       │   │   ├── ztypes_linux_s390x.go
    │       │   │   ├── ztypes_linux_sparc64.go
    │       │   │   ├── ztypes_netbsd_386.go
    │       │   │   ├── ztypes_netbsd_amd64.go
    │       │   │   ├── ztypes_netbsd_arm.go
    │       │   │   ├── ztypes_netbsd_arm64.go
    │       │   │   ├── ztypes_openbsd_386.go
    │       │   │   ├── ztypes_openbsd_amd64.go
    │       │   │   ├── ztypes_openbsd_arm.go
    │       │   │   ├── ztypes_openbsd_arm64.go
    │       │   │   ├── ztypes_openbsd_mips64.go
    │       │   │   ├── ztypes_openbsd_ppc64.go
    │       │   │   ├── ztypes_openbsd_riscv64.go
    │       │   │   ├── ztypes_solaris_amd64.go
    │       │   │   └── ztypes_zos_s390x.go
    │       │   └── windows/
    │       │       ├── aliases.go
    │       │       ├── dll_windows.go
    │       │       ├── env_windows.go
    │       │       ├── eventlog.go
    │       │       ├── exec_windows.go
    │       │       ├── memory_windows.go
    │       │       ├── mkerrors.bash
    │       │       ├── mkknownfolderids.bash
    │       │       ├── mksyscall.go
    │       │       ├── race.go
    │       │       ├── race0.go
    │       │       ├── security_windows.go
    │       │       ├── service.go
    │       │       ├── setupapi_windows.go
    │       │       ├── str.go
    │       │       ├── syscall.go
    │       │       ├── syscall_windows.go
    │       │       ├── types_windows.go
    │       │       ├── types_windows_386.go
    │       │       ├── types_windows_amd64.go
    │       │       ├── types_windows_arm.go
    │       │       ├── types_windows_arm64.go
    │       │       ├── zerrors_windows.go
    │       │       ├── zknownfolderids_windows.go
    │       │       └── zsyscall_windows.go
    │       ├── term/
    │       │   ├── CONTRIBUTING.md
    │       │   ├── LICENSE
    │       │   ├── PATENTS
    │       │   ├── README.md
    │       │   ├── codereview.cfg
    │       │   ├── term.go
    │       │   ├── term_plan9.go
    │       │   ├── term_unix.go
    │       │   ├── term_unix_bsd.go
    │       │   ├── term_unix_other.go
    │       │   ├── term_unsupported.go
    │       │   ├── term_windows.go
    │       │   └── terminal.go
    │       └── text/
    │           ├── LICENSE
    │           ├── PATENTS
    │           ├── encoding/
    │           │   ├── charmap/
    │           │   │   ├── charmap.go
    │           │   │   └── tables.go
    │           │   ├── encoding.go
    │           │   ├── internal/
    │           │   │   ├── identifier/
    │           │   │   │   ├── identifier.go
    │           │   │   │   └── mib.go
    │           │   │   └── internal.go
    │           │   ├── japanese/
    │           │   │   ├── all.go
    │           │   │   ├── eucjp.go
    │           │   │   ├── iso2022jp.go
    │           │   │   ├── shiftjis.go
    │           │   │   └── tables.go
    │           │   ├── korean/
    │           │   │   ├── euckr.go
    │           │   │   └── tables.go
    │           │   ├── simplifiedchinese/
    │           │   │   ├── all.go
    │           │   │   ├── gbk.go
    │           │   │   ├── hzgb2312.go
    │           │   │   └── tables.go
    │           │   ├── traditionalchinese/
    │           │   │   ├── big5.go
    │           │   │   └── tables.go
    │           │   └── unicode/
    │           │       ├── override.go
    │           │       └── unicode.go
    │           ├── internal/
    │           │   └── utf8internal/
    │           │       └── utf8internal.go
    │           ├── runes/
    │           │   ├── cond.go
    │           │   └── runes.go
    │           └── transform/
    │               └── transform.go
    ├── gopkg.in/
    │   ├── natefinch/
    │   │   └── lumberjack.v2/
    │   │       ├── .gitignore
    │   │       ├── .travis.yml
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── chown.go
    │   │       ├── chown_linux.go
    │   │       └── lumberjack.go
    │   └── yaml.v3/
    │       ├── LICENSE
    │       ├── NOTICE
    │       ├── README.md
    │       ├── apic.go
    │       ├── decode.go
    │       ├── emitterc.go
    │       ├── encode.go
    │       ├── parserc.go
    │       ├── readerc.go
    │       ├── resolve.go
    │       ├── scannerc.go
    │       ├── sorter.go
    │       ├── writerc.go
    │       ├── yaml.go
    │       ├── yamlh.go
    │       └── yamlprivateh.go
    └── modules.txt
Download .txt
Showing preview only (6,872K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (83352 symbols across 1544 files)

FILE: go/base/context.go
  type RowsEstimateMethod (line 30) | type RowsEstimateMethod
  constant TableStatusRowsEstimate (line 33) | TableStatusRowsEstimate RowsEstimateMethod = "TableStatusRowsEstimate"
  constant ExplainRowsEstimate (line 34) | ExplainRowsEstimate     RowsEstimateMethod = "ExplainRowsEstimate"
  constant CountRowsEstimate (line 35) | CountRowsEstimate       RowsEstimateMethod = "CountRowsEstimate"
  type CutOver (line 38) | type CutOver
  constant CutOverAtomic (line 41) | CutOverAtomic CutOver = iota
  constant CutOverTwoStep (line 42) | CutOverTwoStep
  type ThrottleReasonHint (line 45) | type ThrottleReasonHint
  constant NoThrottleReasonHint (line 48) | NoThrottleReasonHint                 ThrottleReasonHint = "NoThrottleRea...
  constant UserCommandThrottleReasonHint (line 49) | UserCommandThrottleReasonHint        ThrottleReasonHint = "UserCommandTh...
  constant LeavingHibernationThrottleReasonHint (line 50) | LeavingHibernationThrottleReasonHint ThrottleReasonHint = "LeavingHibern...
  constant HTTPStatusOK (line 54) | HTTPStatusOK       = 200
  constant MaxEventsBatchSize (line 55) | MaxEventsBatchSize = 1000
  constant ETAUnknown (line 56) | ETAUnknown         = math.MinInt64
  type ThrottleCheckResult (line 63) | type ThrottleCheckResult struct
  function NewThrottleCheckResult (line 69) | func NewThrottleCheckResult(throttle bool, reason string, reasonHint Thr...
  type MigrationContext (line 79) | type MigrationContext struct
    method SetConnectionConfig (line 335) | func (this *MigrationContext) SetConnectionConfig(storageEngine string...
    method SetConnectionCharset (line 348) | func (this *MigrationContext) SetConnectionCharset(charset string) {
    method GetGhostTableName (line 368) | func (this *MigrationContext) GetGhostTableName() string {
    method GetOldTableName (line 381) | func (this *MigrationContext) GetOldTableName() string {
    method GetChangelogTableName (line 405) | func (this *MigrationContext) GetChangelogTableName() string {
    method GetCheckpointTableName (line 414) | func (this *MigrationContext) GetCheckpointTableName() string {
    method GetVoluntaryLockName (line 424) | func (this *MigrationContext) GetVoluntaryLockName() string {
    method RequiresBinlogFormatChange (line 429) | func (this *MigrationContext) RequiresBinlogFormatChange() bool {
    method GetApplierHostname (line 434) | func (this *MigrationContext) GetApplierHostname() string {
    method GetInspectorHostname (line 445) | func (this *MigrationContext) GetInspectorHostname() string {
    method InspectorIsAlsoApplier (line 458) | func (this *MigrationContext) InspectorIsAlsoApplier() bool {
    method HasMigrationRange (line 464) | func (this *MigrationContext) HasMigrationRange() bool {
    method SetCutOverLockTimeoutSeconds (line 468) | func (this *MigrationContext) SetCutOverLockTimeoutSeconds(timeoutSeco...
    method SetExponentialBackoffMaxInterval (line 479) | func (this *MigrationContext) SetExponentialBackoffMaxInterval(interva...
    method SetDefaultNumRetries (line 487) | func (this *MigrationContext) SetDefaultNumRetries(retries int64) {
    method MaxRetries (line 495) | func (this *MigrationContext) MaxRetries() int64 {
    method IsTransactionalTable (line 502) | func (this *MigrationContext) IsTransactionalTable() bool {
    method SetCountTableRowsCancelFunc (line 521) | func (this *MigrationContext) SetCountTableRowsCancelFunc(f func()) {
    method IsCountingTableRows (line 529) | func (this *MigrationContext) IsCountingTableRows() bool {
    method CancelTableRowsCount (line 538) | func (this *MigrationContext) CancelTableRowsCount() {
    method ElapsedTime (line 551) | func (this *MigrationContext) ElapsedTime() time.Duration {
    method MarkRowCopyStartTime (line 556) | func (this *MigrationContext) MarkRowCopyStartTime() {
    method ElapsedRowCopyTime (line 563) | func (this *MigrationContext) ElapsedRowCopyTime() time.Duration {
    method MarkRowCopyEndTime (line 579) | func (this *MigrationContext) MarkRowCopyEndTime() {
    method TimeSinceLastHeartbeatOnChangelog (line 585) | func (this *MigrationContext) TimeSinceLastHeartbeatOnChangelog() time...
    method GetCurrentLagDuration (line 589) | func (this *MigrationContext) GetCurrentLagDuration() time.Duration {
    method GetProgressPct (line 593) | func (this *MigrationContext) GetProgressPct() float64 {
    method SetProgressPct (line 597) | func (this *MigrationContext) SetProgressPct(progressPct float64) {
    method GetETADuration (line 601) | func (this *MigrationContext) GetETADuration() time.Duration {
    method SetETADuration (line 605) | func (this *MigrationContext) SetETADuration(etaDuration time.Duration) {
    method GetETASeconds (line 609) | func (this *MigrationContext) GetETASeconds() int64 {
    method GetTotalRowsCopied (line 621) | func (this *MigrationContext) GetTotalRowsCopied() int64 {
    method GetIteration (line 625) | func (this *MigrationContext) GetIteration() int64 {
    method SetNextIterationRangeMinValues (line 629) | func (this *MigrationContext) SetNextIterationRangeMinValues() {
    method MarkPointOfInterest (line 636) | func (this *MigrationContext) MarkPointOfInterest() int64 {
    method TimeSincePointOfInterest (line 644) | func (this *MigrationContext) TimeSincePointOfInterest() time.Duration {
    method SetLastHeartbeatOnChangelogTime (line 651) | func (this *MigrationContext) SetLastHeartbeatOnChangelogTime(t time.T...
    method GetLastHeartbeatOnChangelogTime (line 658) | func (this *MigrationContext) GetLastHeartbeatOnChangelogTime() time.T...
    method SetHeartbeatIntervalMilliseconds (line 665) | func (this *MigrationContext) SetHeartbeatIntervalMilliseconds(heartbe...
    method SetMaxLagMillisecondsThrottleThreshold (line 675) | func (this *MigrationContext) SetMaxLagMillisecondsThrottleThreshold(m...
    method SetChunkSize (line 682) | func (this *MigrationContext) SetChunkSize(chunkSize int64) {
    method SetDMLBatchSize (line 692) | func (this *MigrationContext) SetDMLBatchSize(batchSize int64) {
    method SetThrottleGeneralCheckResult (line 702) | func (this *MigrationContext) SetThrottleGeneralCheckResult(checkResul...
    method GetThrottleGeneralCheckResult (line 709) | func (this *MigrationContext) GetThrottleGeneralCheckResult() *Throttl...
    method SetThrottled (line 716) | func (this *MigrationContext) SetThrottled(throttle bool, reason strin...
    method IsThrottled (line 724) | func (this *MigrationContext) IsThrottled() (bool, string, ThrottleRea...
    method GetThrottleQuery (line 740) | func (this *MigrationContext) GetThrottleQuery() string {
    method SetThrottleQuery (line 748) | func (this *MigrationContext) SetThrottleQuery(newQuery string) {
    method GetThrottleHTTP (line 755) | func (this *MigrationContext) GetThrottleHTTP() string {
    method SetThrottleHTTP (line 763) | func (this *MigrationContext) SetThrottleHTTP(throttleHTTP string) {
    method SetIgnoreHTTPErrors (line 770) | func (this *MigrationContext) SetIgnoreHTTPErrors(ignoreHTTPErrors boo...
    method GetMaxLoad (line 777) | func (this *MigrationContext) GetMaxLoad() LoadMap {
    method GetCriticalLoad (line 784) | func (this *MigrationContext) GetCriticalLoad() LoadMap {
    method GetNiceRatio (line 791) | func (this *MigrationContext) GetNiceRatio() float64 {
    method SetNiceRatio (line 798) | func (this *MigrationContext) SetNiceRatio(newRatio float64) {
    method GetRecentBinlogCoordinates (line 811) | func (this *MigrationContext) GetRecentBinlogCoordinates() mysql.Binlo...
    method SetRecentBinlogCoordinates (line 818) | func (this *MigrationContext) SetRecentBinlogCoordinates(coordinates m...
    method ReadMaxLoad (line 827) | func (this *MigrationContext) ReadMaxLoad(maxLoadList string) error {
    method ReadCriticalLoad (line 842) | func (this *MigrationContext) ReadCriticalLoad(criticalLoadList string...
    method GetControlReplicasLagResult (line 854) | func (this *MigrationContext) GetControlReplicasLagResult() mysql.Repl...
    method SetControlReplicasLagResult (line 862) | func (this *MigrationContext) SetControlReplicasLagResult(lagResult *m...
    method GetThrottleControlReplicaKeys (line 872) | func (this *MigrationContext) GetThrottleControlReplicaKeys() *mysql.I...
    method ReadThrottleControlReplicaKeys (line 881) | func (this *MigrationContext) ReadThrottleControlReplicaKeys(throttleC...
    method AddThrottleControlReplicaKey (line 894) | func (this *MigrationContext) AddThrottleControlReplicaKey(key mysql.I...
    method ApplyCredentials (line 903) | func (this *MigrationContext) ApplyCredentials() {
    method SetupTLS (line 923) | func (this *MigrationContext) SetupTLS() error {
    method ReadConfigFile (line 931) | func (this *MigrationContext) ReadConfigFile() error {
    method GetGhostTriggerName (line 987) | func (this *MigrationContext) GetGhostTriggerName(triggerName string) ...
    method ValidateGhostTriggerLengthBelowMaxLength (line 997) | func (this *MigrationContext) ValidateGhostTriggerLengthBelowMaxLength...
    method GetContext (line 1002) | func (this *MigrationContext) GetContext() context.Context {
    method SetAbortError (line 1008) | func (this *MigrationContext) SetAbortError(err error) {
    method GetAbortError (line 1017) | func (this *MigrationContext) GetAbortError() error {
    method CancelContext (line 1025) | func (this *MigrationContext) CancelContext() {
  type Logger (line 276) | type Logger interface
  type ContextConfig (line 293) | type ContextConfig struct
  function NewMigrationContext (line 306) | func NewMigrationContext() *MigrationContext {
  function getSafeTableName (line 357) | func getSafeTableName(baseName string, suffix string) string {
  function SendWithContext (line 1043) | func SendWithContext[T any](ctx context.Context, ch chan<- T, val T) err...

FILE: go/base/context_test.go
  function init (line 20) | func init() {
  function TestGetTableNames (line 24) | func TestGetTableNames(t *testing.T) {
  function TestGetTriggerNames (line 64) | func TestGetTriggerNames(t *testing.T) {
  function TestValidateGhostTriggerLengthBelowMaxLength (line 90) | func TestValidateGhostTriggerLengthBelowMaxLength(t *testing.T) {
  function TestReadConfigFile (line 157) | func TestReadConfigFile(t *testing.T) {
  function TestSetAbortError_StoresFirstError (line 219) | func TestSetAbortError_StoresFirstError(t *testing.T) {
  function TestSetAbortError_ThreadSafe (line 234) | func TestSetAbortError_ThreadSafe(t *testing.T) {

FILE: go/base/default_logger.go
  type simpleLogger (line 12) | type simpleLogger struct
    method Debug (line 18) | func (*simpleLogger) Debug(args ...interface{}) {
    method Debugf (line 22) | func (*simpleLogger) Debugf(format string, args ...interface{}) {
    method Info (line 26) | func (*simpleLogger) Info(args ...interface{}) {
    method Infof (line 30) | func (*simpleLogger) Infof(format string, args ...interface{}) {
    method Warning (line 34) | func (*simpleLogger) Warning(args ...interface{}) error {
    method Warningf (line 38) | func (*simpleLogger) Warningf(format string, args ...interface{}) error {
    method Error (line 42) | func (*simpleLogger) Error(args ...interface{}) error {
    method Errorf (line 46) | func (*simpleLogger) Errorf(format string, args ...interface{}) error {
    method Errore (line 50) | func (*simpleLogger) Errore(err error) error {
    method Fatal (line 54) | func (*simpleLogger) Fatal(args ...interface{}) error {
    method Fatalf (line 58) | func (*simpleLogger) Fatalf(format string, args ...interface{}) error {
    method Fatale (line 62) | func (*simpleLogger) Fatale(err error) error {
    method SetLevel (line 66) | func (*simpleLogger) SetLevel(level log.LogLevel) {
    method SetPrintStackTrace (line 70) | func (*simpleLogger) SetPrintStackTrace(printStackTraceFlag bool) {
  function NewDefaultLogger (line 14) | func NewDefaultLogger() *simpleLogger {

FILE: go/base/load_map.go
  type LoadMap (line 17) | type LoadMap
    method Duplicate (line 54) | func (this *LoadMap) Duplicate() LoadMap {
    method String (line 63) | func (this *LoadMap) String() string {
  function NewLoadMap (line 19) | func NewLoadMap() LoadMap {
  function ParseLoadMap (line 28) | func ParseLoadMap(loadList string) (LoadMap, error) {

FILE: go/base/load_map_test.go
  function init (line 15) | func init() {
  function TestParseLoadMap (line 19) | func TestParseLoadMap(t *testing.T) {
  function TestString (line 46) | func TestString(t *testing.T) {

FILE: go/base/utils.go
  function PrettifyDurationOutput (line 24) | func PrettifyDurationOutput(d time.Duration) string {
  function FileExists (line 31) | func FileExists(fileName string) bool {
  function TouchFile (line 38) | func TouchFile(fileName string) error {
  function StringContainsAll (line 48) | func StringContainsAll(s string, substrings ...string) bool {
  function ValidateConnection (line 64) | func ValidateConnection(db *gosql.DB, connectionConfig *mysql.Connection...

FILE: go/base/utils_test.go
  function init (line 15) | func init() {
  function TestStringContainsAll (line 19) | func TestStringContainsAll(t *testing.T) {

FILE: go/binlog/binlog_dml_event.go
  type EventDML (line 15) | type EventDML
  constant NotDML (line 18) | NotDML    EventDML = "NoDML"
  constant InsertDML (line 19) | InsertDML EventDML = "Insert"
  constant UpdateDML (line 20) | UpdateDML EventDML = "Update"
  constant DeleteDML (line 21) | DeleteDML EventDML = "Delete"
  function ToEventDML (line 24) | func ToEventDML(description string) EventDML {
  type BinlogDMLEvent (line 48) | type BinlogDMLEvent struct
    method String (line 65) | func (this *BinlogDMLEvent) String() string {
  function NewBinlogDMLEvent (line 56) | func NewBinlogDMLEvent(databaseName, tableName string, dml EventDML) *Bi...

FILE: go/binlog/binlog_entry.go
  type BinlogEntry (line 15) | type BinlogEntry struct
    method String (line 29) | func (this *BinlogEntry) String() string {
  function NewBinlogEntryAt (line 21) | func NewBinlogEntryAt(coordinates mysql.BinlogCoordinates) *BinlogEntry {

FILE: go/binlog/binlog_reader.go
  type BinlogReader (line 10) | type BinlogReader interface

FILE: go/binlog/gomysql_reader.go
  type GoMySQLReader (line 24) | type GoMySQLReader struct
    method ConnectBinlogStreamer (line 58) | func (this *GoMySQLReader) ConnectBinlogStreamer(coordinates mysql.Bin...
    method GetCurrentBinlogCoordinates (line 82) | func (this *GoMySQLReader) GetCurrentBinlogCoordinates() mysql.BinlogC...
    method handleRowsEvent (line 88) | func (this *GoMySQLReader) handleRowsEvent(ev *replication.BinlogEvent...
    method StreamEvents (line 132) | func (this *GoMySQLReader) StreamEvents(canStopStreaming func() bool, ...
    method Close (line 203) | func (this *GoMySQLReader) Close() error {
  function NewGoMySQLReader (line 36) | func NewGoMySQLReader(migrationContext *base.MigrationContext) *GoMySQLR...

FILE: go/cmd/gh-ost/main.go
  function acceptSignals (line 29) | func acceptSignals(migrationContext *base.MigrationContext) {
  function main (line 49) | func main() {

FILE: go/logic/applier.go
  constant GhostChangelogTableComment (line 33) | GhostChangelogTableComment = "gh-ost changelog"
  constant atomicCutOverMagicHint (line 34) | atomicCutOverMagicHint     = "ghost-cut-over-sentry"
  type dmlBuildResult (line 40) | type dmlBuildResult struct
  function newDmlBuildResult (line 47) | func newDmlBuildResult(query string, args []interface{}, rowsDelta int64...
  function newDmlBuildResultError (line 56) | func newDmlBuildResultError(err error) *dmlBuildResult {
  type Applier (line 67) | type Applier struct
    method compileMigrationKeyWarningRegex (line 101) | func (this *Applier) compileMigrationKeyWarningRegex() (*regexp.Regexp...
    method InitDBConnections (line 112) | func (this *Applier) InitDBConnections() (err error) {
    method prepareQueries (line 148) | func (this *Applier) prepareQueries() (err error) {
    method validateAndReadGlobalVariables (line 189) | func (this *Applier) validateAndReadGlobalVariables() error {
    method generateSqlModeQuery (line 206) | func (this *Applier) generateSqlModeQuery() string {
    method generateInstantDDLQuery (line 221) | func (this *Applier) generateInstantDDLQuery() string {
    method readTableColumns (line 230) | func (this *Applier) readTableColumns() (err error) {
    method showTableStatus (line 240) | func (this *Applier) showTableStatus(tableName string) (rowMap sqlutil...
    method tableExists (line 250) | func (this *Applier) tableExists(tableName string) (tableFound bool) {
    method ValidateOrDropExistingTables (line 257) | func (this *Applier) ValidateOrDropExistingTables() error {
    method AttemptInstantDDL (line 295) | func (this *Applier) AttemptInstantDDL() error {
    method CreateGhostTable (line 338) | func (this *Applier) CreateGhostTable() error {
    method AlterGhost (line 379) | func (this *Applier) AlterGhost() error {
    method AlterGhostAutoIncrement (line 420) | func (this *Applier) AlterGhostAutoIncrement() error {
    method CreateChangelogTable (line 439) | func (this *Applier) CreateChangelogTable() error {
    method CreateCheckpointTable (line 469) | func (this *Applier) CreateCheckpointTable() error {
    method dropTable (line 510) | func (this *Applier) dropTable(tableName string) error {
    method StateMetadataLockInstrument (line 528) | func (this *Applier) StateMetadataLockInstrument() error {
    method DropTriggersFromGhost (line 555) | func (this *Applier) DropTriggersFromGhost() error {
    method createTriggers (line 571) | func (this *Applier) createTriggers(tableName string) error {
    method CreateTriggersOnGhost (line 599) | func (this *Applier) CreateTriggersOnGhost() error {
    method DropChangelogTable (line 605) | func (this *Applier) DropChangelogTable() error {
    method DropCheckpointTable (line 610) | func (this *Applier) DropCheckpointTable() error {
    method DropOldTable (line 615) | func (this *Applier) DropOldTable() error {
    method DropGhostTable (line 620) | func (this *Applier) DropGhostTable() error {
    method WriteChangelog (line 626) | func (this *Applier) WriteChangelog(hint, value string) (string, error) {
    method WriteAndLogChangelog (line 653) | func (this *Applier) WriteAndLogChangelog(hint, value string) (string,...
    method WriteChangelogState (line 658) | func (this *Applier) WriteChangelogState(value string) (string, error) {
    method WriteCheckpoint (line 663) | func (this *Applier) WriteCheckpoint(chk *Checkpoint) (int64, error) {
    method ReadLastCheckpoint (line 680) | func (this *Applier) ReadLastCheckpoint() (*Checkpoint, error) {
    method InitiateHeartbeat (line 718) | func (this *Applier) InitiateHeartbeat() {
    method ExecuteThrottleQuery (line 767) | func (this *Applier) ExecuteThrottleQuery() (int64, error) {
    method readMigrationMinValues (line 781) | func (this *Applier) readMigrationMinValues(tx *gosql.Tx, uniqueKey *s...
    method readMigrationMaxValues (line 806) | func (this *Applier) readMigrationMaxValues(tx *gosql.Tx, uniqueKey *s...
    method ReadMigrationRangeValues (line 847) | func (this *Applier) ReadMigrationRangeValues() error {
    method CalculateNextIterationRangeEndValues (line 872) | func (this *Applier) CalculateNextIterationRangeEndValues() (hasFurthe...
    method ApplyIterationInsertQuery (line 919) | func (this *Applier) ApplyIterationInsertQuery() (chunkSize int64, row...
    method LockOriginalTable (line 1014) | func (this *Applier) LockOriginalTable() error {
    method UnlockTables (line 1032) | func (this *Applier) UnlockTables() error {
    method SwapTablesQuickAndBumpy (line 1046) | func (this *Applier) SwapTablesQuickAndBumpy() error {
    method RenameTablesRollback (line 1074) | func (this *Applier) RenameTablesRollback() (renameError error) {
    method StopSlaveIOThread (line 1118) | func (this *Applier) StopSlaveIOThread() error {
    method StartSlaveIOThread (line 1130) | func (this *Applier) StartSlaveIOThread() error {
    method StopSlaveSQLThread (line 1142) | func (this *Applier) StopSlaveSQLThread() error {
    method StartSlaveSQLThread (line 1154) | func (this *Applier) StartSlaveSQLThread() error {
    method StopReplication (line 1166) | func (this *Applier) StopReplication() error {
    method StartReplication (line 1183) | func (this *Applier) StartReplication() error {
    method GetSessionLockName (line 1195) | func (this *Applier) GetSessionLockName(sessionId int64) string {
    method ExpectUsedLock (line 1200) | func (this *Applier) ExpectUsedLock(sessionId int64) error {
    method ExpectProcess (line 1212) | func (this *Applier) ExpectProcess(sessionId int64, stateHint, infoHin...
    method DropAtomicCutOverSentryTableIfExists (line 1238) | func (this *Applier) DropAtomicCutOverSentryTableIfExists() error {
    method CreateAtomicCutOverSentryTable (line 1254) | func (this *Applier) CreateAtomicCutOverSentryTable() error {
    method InitAtomicCutOverWaitTimeout (line 1283) | func (this *Applier) InitAtomicCutOverWaitTimeout(tx *gosql.Tx) error {
    method RevertAtomicCutOverWaitTimeout (line 1292) | func (this *Applier) RevertAtomicCutOverWaitTimeout() {
    method AtomicCutOverMagicLock (line 1303) | func (this *Applier) AtomicCutOverMagicLock(sessionIdChan chan int64, ...
    method AtomicCutoverRename (line 1426) | func (this *Applier) AtomicCutoverRename(sessionIdChan chan int64, tab...
    method ShowStatusVariable (line 1468) | func (this *Applier) ShowStatusVariable(variableName string) (result i...
    method updateModifiesUniqueKeyColumns (line 1479) | func (this *Applier) updateModifiesUniqueKeyColumns(dmlEvent *binlog.B...
    method buildDMLEventQuery (line 1494) | func (this *Applier) buildDMLEventQuery(dmlEvent *binlog.BinlogDMLEven...
    method ApplyDMLEventQueries (line 1526) | func (this *Applier) ApplyDMLEventQueries(dmlEvents [](*binlog.BinlogD...
    method Teardown (line 1661) | func (this *Applier) Teardown() {
    method ExpectMetadataLock (line 1668) | func (this *Applier) ExpectMetadataLock(sessionId int64) error {
  function NewApplier (line 88) | func NewApplier(migrationContext *base.MigrationContext) *Applier {
  function retryOnLockWaitTimeout (line 317) | func retryOnLockWaitTimeout(operation func() error, logger base.Logger) ...

FILE: go/logic/applier_test.go
  function TestApplierGenerateSqlModeQuery (line 31) | func TestApplierGenerateSqlModeQuery(t *testing.T) {
  function TestApplierUpdateModifiesUniqueKeyColumns (line 67) | func TestApplierUpdateModifiesUniqueKeyColumns(t *testing.T) {
  function TestApplierBuildDMLEventQuery (line 103) | func TestApplierBuildDMLEventQuery(t *testing.T) {
  function TestApplierInstantDDL (line 190) | func TestApplierInstantDDL(t *testing.T) {
  function TestRetryOnLockWaitTimeout (line 204) | func TestRetryOnLockWaitTimeout(t *testing.T) {
  type ApplierTestSuite (line 269) | type ApplierTestSuite struct
    method SetupSuite (line 276) | func (suite *ApplierTestSuite) SetupSuite() {
    method TeardownSuite (line 298) | func (suite *ApplierTestSuite) TeardownSuite() {
    method SetupTest (line 303) | func (suite *ApplierTestSuite) SetupTest() {
    method TearDownTest (line 309) | func (suite *ApplierTestSuite) TearDownTest() {
    method TestInitDBConnections (line 318) | func (suite *ApplierTestSuite) TestInitDBConnections() {
    method TestApplyDMLEventQueries (line 347) | func (suite *ApplierTestSuite) TestApplyDMLEventQueries() {
    method TestValidateOrDropExistingTables (line 412) | func (suite *ApplierTestSuite) TestValidateOrDropExistingTables() {
    method TestValidateOrDropExistingTablesWithGhostTableExisting (line 441) | func (suite *ApplierTestSuite) TestValidateOrDropExistingTablesWithGho...
    method TestValidateOrDropExistingTablesWithGhostTableExistingAndInitiallyDropGhostTableSet (line 474) | func (suite *ApplierTestSuite) TestValidateOrDropExistingTablesWithGho...
    method TestCreateGhostTable (line 511) | func (suite *ApplierTestSuite) TestCreateGhostTable() {
    method TestPanicOnWarningsInApplyIterationInsertQuerySucceedsWithUniqueKeyWarningInsertedByDMLEvent (line 556) | func (suite *ApplierTestSuite) TestPanicOnWarningsInApplyIterationInse...
    method TestPanicOnWarningsInApplyIterationInsertQueryFailsWithTruncationWarning (line 647) | func (suite *ApplierTestSuite) TestPanicOnWarningsInApplyIterationInse...
    method TestWriteCheckpoint (line 705) | func (suite *ApplierTestSuite) TestWriteCheckpoint() {
    method TestPanicOnWarningsWithDuplicateKeyOnNonMigrationIndex (line 793) | func (suite *ApplierTestSuite) TestPanicOnWarningsWithDuplicateKeyOnNo...
    method TestPanicOnWarningsWithDuplicateCompositeUniqueKey (line 882) | func (suite *ApplierTestSuite) TestPanicOnWarningsWithDuplicateComposi...
    method TestUpdateModifyingUniqueKeyWithDuplicateOnOtherIndex (line 984) | func (suite *ApplierTestSuite) TestUpdateModifyingUniqueKeyWithDuplica...
    method TestNormalUpdateWithPanicOnWarnings (line 1079) | func (suite *ApplierTestSuite) TestNormalUpdateWithPanicOnWarnings() {
    method TestDuplicateOnMigrationKeyAllowedInBinlogReplay (line 1159) | func (suite *ApplierTestSuite) TestDuplicateOnMigrationKeyAllowedInBin...
    method TestRegexMetacharactersInIndexName (line 1249) | func (suite *ApplierTestSuite) TestRegexMetacharactersInIndexName() {
    method TestPanicOnWarningsDisabled (line 1351) | func (suite *ApplierTestSuite) TestPanicOnWarningsDisabled() {
  function TestApplier (line 1438) | func TestApplier(t *testing.T) {

FILE: go/logic/checkpoint.go
  type Checkpoint (line 16) | type Checkpoint struct

FILE: go/logic/hooks.go
  constant onStartup (line 21) | onStartup            = "gh-ost-on-startup"
  constant onValidated (line 22) | onValidated          = "gh-ost-on-validated"
  constant onRowCountComplete (line 23) | onRowCountComplete   = "gh-ost-on-rowcount-complete"
  constant onBeforeRowCopy (line 24) | onBeforeRowCopy      = "gh-ost-on-before-row-copy"
  constant onRowCopyComplete (line 25) | onRowCopyComplete    = "gh-ost-on-row-copy-complete"
  constant onBeginPostponed (line 26) | onBeginPostponed     = "gh-ost-on-begin-postponed"
  constant onBeforeCutOver (line 27) | onBeforeCutOver      = "gh-ost-on-before-cut-over"
  constant onInteractiveCommand (line 28) | onInteractiveCommand = "gh-ost-on-interactive-command"
  constant onSuccess (line 29) | onSuccess            = "gh-ost-on-success"
  constant onFailure (line 30) | onFailure            = "gh-ost-on-failure"
  constant onBatchCopyRetry (line 31) | onBatchCopyRetry     = "gh-ost-on-batch-copy-retry"
  constant onStatus (line 32) | onStatus             = "gh-ost-on-status"
  constant onStopReplication (line 33) | onStopReplication    = "gh-ost-on-stop-replication"
  constant onStartReplication (line 34) | onStartReplication   = "gh-ost-on-start-replication"
  type HooksExecutor (line 37) | type HooksExecutor struct
    method applyEnvironmentVariables (line 49) | func (this *HooksExecutor) applyEnvironmentVariables(extraVariables .....
    method executeHook (line 81) | func (this *HooksExecutor) executeHook(hook string, extraVariables ......
    method detectHooks (line 91) | func (this *HooksExecutor) detectHooks(baseName string) (hooks []strin...
    method executeHooks (line 100) | func (this *HooksExecutor) executeHooks(baseName string, extraVariable...
    method onStartup (line 114) | func (this *HooksExecutor) onStartup() error {
    method onValidated (line 118) | func (this *HooksExecutor) onValidated() error {
    method onRowCountComplete (line 122) | func (this *HooksExecutor) onRowCountComplete() error {
    method onBeforeRowCopy (line 125) | func (this *HooksExecutor) onBeforeRowCopy() error {
    method onBatchCopyRetry (line 129) | func (this *HooksExecutor) onBatchCopyRetry(errorMessage string) error {
    method onRowCopyComplete (line 134) | func (this *HooksExecutor) onRowCopyComplete() error {
    method onBeginPostponed (line 138) | func (this *HooksExecutor) onBeginPostponed() error {
    method onBeforeCutOver (line 142) | func (this *HooksExecutor) onBeforeCutOver() error {
    method onInteractiveCommand (line 146) | func (this *HooksExecutor) onInteractiveCommand(command string) error {
    method onSuccess (line 151) | func (this *HooksExecutor) onSuccess() error {
    method onFailure (line 155) | func (this *HooksExecutor) onFailure() error {
    method onStatus (line 159) | func (this *HooksExecutor) onStatus(statusMessage string) error {
    method onStopReplication (line 164) | func (this *HooksExecutor) onStopReplication() error {
    method onStartReplication (line 168) | func (this *HooksExecutor) onStartReplication() error {
  function NewHooksExecutor (line 42) | func NewHooksExecutor(migrationContext *base.MigrationContext) *HooksExe...

FILE: go/logic/hooks_test.go
  function TestHooksExecutorExecuteHooks (line 24) | func TestHooksExecutorExecuteHooks(t *testing.T) {

FILE: go/logic/inspect.go
  constant startReplicationPostWait (line 25) | startReplicationPostWait = 250 * time.Millisecond
  constant startReplicationMaxWait (line 26) | startReplicationMaxWait = 2 * time.Second
  type Inspector (line 30) | type Inspector struct
    method InitDBConnections (line 47) | func (this *Inspector) InitDBConnections() (err error) {
    method ValidateOriginalTable (line 88) | func (this *Inspector) ValidateOriginalTable() (err error) {
    method InspectTableColumnsAndUniqueKeys (line 104) | func (this *Inspector) InspectTableColumnsAndUniqueKeys(tableName stri...
    method InspectOriginalTable (line 120) | func (this *Inspector) InspectOriginalTable() (err error) {
    method inspectOriginalAndGhostTables (line 134) | func (this *Inspector) inspectOriginalAndGhostTables() (err error) {
    method validateConnection (line 221) | func (this *Inspector) validateConnection() error {
    method validateGrants (line 229) | func (this *Inspector) validateGrants() error {
    method restartReplication (line 292) | func (this *Inspector) restartReplication() error {
    method validateReplicationRestarted (line 335) | func (this *Inspector) validateReplicationRestarted() (bool, error) {
    method applyBinlogFormat (line 359) | func (this *Inspector) applyBinlogFormat() error {
    method validateBinlogs (line 386) | func (this *Inspector) validateBinlogs() error {
    method validateGTIDConfig (line 427) | func (this *Inspector) validateGTIDConfig() error {
    method validateLogSlaveUpdates (line 443) | func (this *Inspector) validateLogSlaveUpdates() error {
    method validateTable (line 473) | func (this *Inspector) validateTable() error {
    method validateTableForeignKeys (line 500) | func (this *Inspector) validateTableForeignKeys(allowChildForeignKeys ...
    method validateTableTriggers (line 552) | func (this *Inspector) validateTableTriggers() error {
    method validateGhostTriggersDontExist (line 594) | func (this *Inspector) validateGhostTriggersDontExist() error {
    method validateGhostTriggersLength (line 622) | func (this *Inspector) validateGhostTriggersLength() error {
    method estimateTableRowsViaExplain (line 639) | func (this *Inspector) estimateTableRowsViaExplain() error {
    method CountTableRows (line 661) | func (this *Inspector) CountTableRows(ctx context.Context) error {
    method applyColumnTypes (line 701) | func (this *Inspector) applyColumnTypes(databaseName, tableName string...
    method getAutoIncrementValue (line 764) | func (this *Inspector) getAutoIncrementValue(tableName string) (autoIn...
    method getCandidateUniqueKeys (line 782) | func (this *Inspector) getCandidateUniqueKeys(tableName string) (uniqu...
    method getSharedUniqueKeys (line 864) | func (this *Inspector) getSharedUniqueKeys(originalUniqueKeys, ghostUn...
    method getSharedColumns (line 882) | func (this *Inspector) getSharedColumns(originalColumns, ghostColumns ...
    method showCreateTable (line 928) | func (this *Inspector) showCreateTable(tableName string) (createTableS...
    method readChangelogState (line 936) | func (this *Inspector) readChangelogState(hint string) (string, error) {
    method getMasterConnectionConfig (line 954) | func (this *Inspector) getMasterConnectionConfig() (applierConfig *mys...
    method getReplicationLag (line 960) | func (this *Inspector) getReplicationLag() (replicationLag time.Durati...
    method Teardown (line 968) | func (this *Inspector) Teardown() {
  function NewInspector (line 39) | func NewInspector(migrationContext *base.MigrationContext) *Inspector {

FILE: go/logic/inspect_test.go
  function TestInspectGetSharedUniqueKeys (line 15) | func TestInspectGetSharedUniqueKeys(t *testing.T) {

FILE: go/logic/migrator.go
  type ChangelogState (line 32) | type ChangelogState
  constant AllEventsUpToLockProcessed (line 35) | AllEventsUpToLockProcessed ChangelogState = "AllEventsUpToLockProcessed"
  constant GhostTableMigrated (line 36) | GhostTableMigrated         ChangelogState = "GhostTableMigrated"
  constant Migrated (line 37) | Migrated                   ChangelogState = "Migrated"
  constant ReadMigrationRangeValues (line 38) | ReadMigrationRangeValues   ChangelogState = "ReadMigrationRangeValues"
  function ReadChangelogState (line 41) | func ReadChangelogState(s string) ChangelogState {
  type tableWriteFunc (line 45) | type tableWriteFunc
  type lockProcessedStruct (line 47) | type lockProcessedStruct struct
  type applyEventStruct (line 52) | type applyEventStruct struct
  function newApplyEventStructByFunc (line 58) | func newApplyEventStructByFunc(writeFunc *tableWriteFunc) *applyEventStr...
  function newApplyEventStructByDML (line 63) | func newApplyEventStructByDML(dmlEntry *binlog.BinlogEntry) *applyEventS...
  type PrintStatusRule (line 68) | type PrintStatusRule
  constant NoPrintStatusRule (line 71) | NoPrintStatusRule           PrintStatusRule = iota
  constant HeuristicPrintStatusRule (line 72) | HeuristicPrintStatusRule                    = iota
  constant ForcePrintStatusRule (line 73) | ForcePrintStatusRule                        = iota
  constant ForcePrintStatusOnlyRule (line 74) | ForcePrintStatusOnlyRule                    = iota
  constant ForcePrintStatusAndHintRule (line 75) | ForcePrintStatusAndHintRule                 = iota
  type Migrator (line 79) | type Migrator struct
    method sleepWhileTrue (line 125) | func (this *Migrator) sleepWhileTrue(operation func() (bool, error)) e...
    method retryBatchCopyWithHooks (line 142) | func (this *Migrator) retryBatchCopyWithHooks(operation func() error, ...
    method retryOperation (line 156) | func (this *Migrator) retryOperation(operation func() error, notFatalH...
    method retryOperationWithExponentialBackoff (line 181) | func (this *Migrator) retryOperationWithExponentialBackoff(operation f...
    method consumeRowCopyComplete (line 207) | func (this *Migrator) consumeRowCopyComplete() {
    method canStopStreaming (line 227) | func (this *Migrator) canStopStreaming() bool {
    method onChangelogEvent (line 232) | func (this *Migrator) onChangelogEvent(dmlEntry *binlog.BinlogEntry) (...
    method onChangelogStateEvent (line 244) | func (this *Migrator) onChangelogStateEvent(dmlEntry *binlog.BinlogEnt...
    method onChangelogHeartbeatEvent (line 277) | func (this *Migrator) onChangelogHeartbeatEvent(dmlEntry *binlog.Binlo...
    method abort (line 295) | func (this *Migrator) abort(err error) {
    method listenOnPanicAbort (line 307) | func (this *Migrator) listenOnPanicAbort() {
    method validateAlterStatement (line 316) | func (this *Migrator) validateAlterStatement() (err error) {
    method countTableRows (line 331) | func (this *Migrator) countTableRows() (err error) {
    method createFlagFiles (line 365) | func (this *Migrator) createFlagFiles() (err error) {
    method checkAbort (line 378) | func (this *Migrator) checkAbort() error {
    method Migrate (line 400) | func (this *Migrator) Migrate() (err error) {
    method Revert (line 615) | func (this *Migrator) Revert() error {
    method ExecOnFailureHook (line 724) | func (this *Migrator) ExecOnFailureHook() (err error) {
    method handleCutOverResult (line 728) | func (this *Migrator) handleCutOverResult(cutOverError error) (err err...
    method cutOver (line 760) | func (this *Migrator) cutOver() (err error) {
    method waitForEventsUpToLock (line 841) | func (this *Migrator) waitForEventsUpToLock() error {
    method cutOverTwoStep (line 885) | func (this *Migrator) cutOverTwoStep() (err error) {
    method atomicCutOver (line 917) | func (this *Migrator) atomicCutOver() (err error) {
    method initiateServer (line 1017) | func (this *Migrator) initiateServer() (err error) {
    method initiateInspector (line 1040) | func (this *Migrator) initiateInspector() (err error) {
    method initiateStatus (line 1100) | func (this *Migrator) initiateStatus() {
    method printMigrationStatusHint (line 1123) | func (this *Migrator) printMigrationStatusHint(writers ...io.Writer) {
    method getProgressPercent (line 1201) | func (this *Migrator) getProgressPercent(rowsEstimate int64) (progress...
    method getMigrationETA (line 1210) | func (this *Migrator) getMigrationETA(rowsEstimate int64) (eta string,...
    method getMigrationStateAndETA (line 1251) | func (this *Migrator) getMigrationStateAndETA(rowsEstimate int64) (sta...
    method shouldPrintStatus (line 1266) | func (this *Migrator) shouldPrintStatus(rule PrintStatusRule, elapsedS...
    method shouldPrintMigrationStatusHint (line 1290) | func (this *Migrator) shouldPrintMigrationStatusHint(rule PrintStatusR...
    method printStatus (line 1304) | func (this *Migrator) printStatus(rule PrintStatusRule, writers ...io....
    method initiateStreaming (line 1372) | func (this *Migrator) initiateStreaming() error {
    method addDMLEventsListener (line 1411) | func (this *Migrator) addDMLEventsListener() error {
    method initiateThrottler (line 1426) | func (this *Migrator) initiateThrottler() {
    method initiateApplier (line 1438) | func (this *Migrator) initiateApplier() error {
    method iterateChunks (line 1495) | func (this *Migrator) iterateChunks() error {
    method onApplyEventStruct (line 1595) | func (this *Migrator) onApplyEventStruct(eventStruct *applyEventStruct...
    method Checkpoint (line 1654) | func (this *Migrator) Checkpoint(ctx context.Context) (*Checkpoint, er...
    method CheckpointAfterCutOver (line 1688) | func (this *Migrator) CheckpointAfterCutOver() (*Checkpoint, error) {
    method checkpointLoop (line 1716) | func (this *Migrator) checkpointLoop() {
    method executeWriteFuncs (line 1750) | func (this *Migrator) executeWriteFuncs() error {
    method executeDMLWriteFuncs (line 1804) | func (this *Migrator) executeDMLWriteFuncs() error {
    method finalCleanup (line 1830) | func (this *Migrator) finalCleanup() error {
    method teardown (line 1877) | func (this *Migrator) teardown() {
  function NewMigrator (line 105) | func NewMigrator(context *base.MigrationContext, appVersion string) *Mig...

FILE: go/logic/migrator_test.go
  function TestMigratorOnChangelogEvent (line 37) | func TestMigratorOnChangelogEvent(t *testing.T) {
  function TestMigratorValidateStatement (line 137) | func TestMigratorValidateStatement(t *testing.T) {
  function TestMigratorCreateFlagFiles (line 191) | func TestMigratorCreateFlagFiles(t *testing.T) {
  function TestMigratorGetProgressPercent (line 208) | func TestMigratorGetProgressPercent(t *testing.T) {
  function TestMigratorGetMigrationStateAndETA (line 221) | func TestMigratorGetMigrationStateAndETA(t *testing.T) {
  function TestMigratorShouldPrintStatus (line 275) | func TestMigratorShouldPrintStatus(t *testing.T) {
  type MigratorTestSuite (line 290) | type MigratorTestSuite struct
    method SetupSuite (line 297) | func (suite *MigratorTestSuite) SetupSuite() {
    method TeardownSuite (line 318) | func (suite *MigratorTestSuite) TeardownSuite() {
    method SetupTest (line 323) | func (suite *MigratorTestSuite) SetupTest() {
    method TearDownTest (line 332) | func (suite *MigratorTestSuite) TearDownTest() {
    method TestMigrateEmpty (line 345) | func (suite *MigratorTestSuite) TestMigrateEmpty() {
    method TestRetryBatchCopyWithHooks (line 389) | func (suite *MigratorTestSuite) TestRetryBatchCopyWithHooks() {
    method TestCopierIntPK (line 509) | func (suite *MigratorTestSuite) TestCopierIntPK() {
    method TestCopierCompositePK (line 580) | func (suite *MigratorTestSuite) TestCopierCompositePK() {
    method TestCutOverLossDataCaseLockGhostBeforeRename (line 717) | func (suite *MigratorTestSuite) TestCutOverLossDataCaseLockGhostBefore...
    method TestRevertEmpty (line 797) | func (suite *MigratorTestSuite) TestRevertEmpty() {
    method TestRevert (line 846) | func (suite *MigratorTestSuite) TestRevert() {
  function TestMigratorRetry (line 651) | func TestMigratorRetry(t *testing.T) {
  function TestMigratorRetryWithExponentialBackoff (line 680) | func TestMigratorRetryWithExponentialBackoff(t *testing.T) {
  function TestMigrator (line 929) | func TestMigrator(t *testing.T) {
  function TestPanicAbort_PropagatesError (line 933) | func TestPanicAbort_PropagatesError(t *testing.T) {
  function TestPanicAbort_FirstErrorWins (line 965) | func TestPanicAbort_FirstErrorWins(t *testing.T) {
  function TestAbort_AfterRowCopy (line 992) | func TestAbort_AfterRowCopy(t *testing.T) {
  function TestAbort_DuringInspection (line 1033) | func TestAbort_DuringInspection(t *testing.T) {
  function TestAbort_DuringStreaming (line 1064) | func TestAbort_DuringStreaming(t *testing.T) {
  function TestRetryExhaustion_TriggersAbort (line 1099) | func TestRetryExhaustion_TriggersAbort(t *testing.T) {
  function TestRevert_AbortsOnError (line 1145) | func TestRevert_AbortsOnError(t *testing.T) {
  function TestCheckAbort_ReturnsNilWhenNoError (line 1189) | func TestCheckAbort_ReturnsNilWhenNoError(t *testing.T) {
  function TestCheckAbort_DetectsContextCancellation (line 1200) | func TestCheckAbort_DetectsContextCancellation(t *testing.T) {

FILE: go/logic/server.go
  type printStatusFunc (line 34) | type printStatusFunc
  type Server (line 37) | type Server struct
    method runCPUProfile (line 54) | func (this *Server) runCPUProfile(args string) (io.Reader, error) {
    method createPostponeCutOverFlagFile (line 102) | func (this *Server) createPostponeCutOverFlagFile(filePath string) (er...
    method BindSocketFile (line 112) | func (this *Server) BindSocketFile() (err error) {
    method RemoveSocketFile (line 127) | func (this *Server) RemoveSocketFile() (err error) {
    method BindTCPPort (line 132) | func (this *Server) BindTCPPort() (err error) {
    method Serve (line 145) | func (this *Server) Serve() (err error) {
    method handleConnection (line 171) | func (this *Server) handleConnection(conn net.Conn) (err error) {
    method onServerCommand (line 183) | func (this *Server) onServerCommand(command string, writer *bufio.Writ...
    method applyServerCommand (line 196) | func (this *Server) applyServerCommand(command string, writer *bufio.W...
  function NewServer (line 46) | func NewServer(migrationContext *base.MigrationContext, hooksExecutor *H...

FILE: go/logic/server_test.go
  function TestServerRunCPUProfile (line 13) | func TestServerRunCPUProfile(t *testing.T) {
  function TestServerCreatePostponeCutOverFlagFile (line 72) | func TestServerCreatePostponeCutOverFlagFile(t *testing.T) {

FILE: go/logic/streamer.go
  type BinlogEventListener (line 23) | type BinlogEventListener struct
  constant EventsChannelBufferSize (line 31) | EventsChannelBufferSize       = 1
  constant ReconnectStreamerSleepSeconds (line 32) | ReconnectStreamerSleepSeconds = 1
  type EventsStreamer (line 37) | type EventsStreamer struct
    method AddListener (line 63) | func (this *EventsStreamer) AddListener(
    method notifyListeners (line 86) | func (this *EventsStreamer) notifyListeners(binlogEntry *binlog.Binlog...
    method InitDBConnections (line 108) | func (this *EventsStreamer) InitDBConnections() (err error) {
    method initBinlogReader (line 131) | func (this *EventsStreamer) initBinlogReader(binlogCoordinates mysql.B...
    method GetCurrentBinlogCoordinates (line 140) | func (this *EventsStreamer) GetCurrentBinlogCoordinates() mysql.Binlog...
    method readCurrentBinlogCoordinates (line 145) | func (this *EventsStreamer) readCurrentBinlogCoordinates() error {
    method StreamEvents (line 178) | func (this *EventsStreamer) StreamEvents(canStopStreaming func() bool)...
    method Close (line 236) | func (this *EventsStreamer) Close() (err error) {
    method Teardown (line 242) | func (this *EventsStreamer) Teardown() {
  function NewEventsStreamer (line 50) | func NewEventsStreamer(migrationContext *base.MigrationContext) *EventsS...

FILE: go/logic/streamer_test.go
  type EventsStreamerTestSuite (line 19) | type EventsStreamerTestSuite struct
    method SetupSuite (line 26) | func (suite *EventsStreamerTestSuite) SetupSuite() {
    method TeardownSuite (line 46) | func (suite *EventsStreamerTestSuite) TeardownSuite() {
    method SetupTest (line 51) | func (suite *EventsStreamerTestSuite) SetupTest() {
    method TearDownTest (line 58) | func (suite *EventsStreamerTestSuite) TearDownTest() {
    method TestStreamEvents (line 67) | func (suite *EventsStreamerTestSuite) TestStreamEvents() {
    method TestStreamEventsAutomaticallyReconnects (line 143) | func (suite *EventsStreamerTestSuite) TestStreamEventsAutomaticallyRec...
  function TestEventsStreamer (line 262) | func TestEventsStreamer(t *testing.T) {

FILE: go/logic/test_utils.go
  function getTestTableName (line 23) | func getTestTableName() string {
  function getTestGhostTableName (line 27) | func getTestGhostTableName() string {
  function getTestRevertedTableName (line 31) | func getTestRevertedTableName() string {
  function getTestOldTableName (line 35) | func getTestOldTableName() string {
  function getTestConnectionConfig (line 39) | func getTestConnectionConfig(ctx context.Context, container testcontaine...
  function newTestMigrationContext (line 59) | func newTestMigrationContext() *base.MigrationContext {

FILE: go/logic/throttler.go
  constant frenoMagicHint (line 41) | frenoMagicHint = "freno"
  type Throttler (line 45) | type Throttler struct
    method throttleHttpMessage (line 67) | func (this *Throttler) throttleHttpMessage(statusCode int) string {
    method shouldThrottle (line 81) | func (this *Throttler) shouldThrottle() (result bool, reason string, r...
    method parseChangelogHeartbeat (line 130) | func (this *Throttler) parseChangelogHeartbeat(heartbeatValue string) ...
    method collectReplicationLag (line 140) | func (this *Throttler) collectReplicationLag(firstThrottlingCollected ...
    method collectControlReplicasLag (line 182) | func (this *Throttler) collectControlReplicasLag() {
    method criticalLoadIsMet (line 275) | func (this *Throttler) criticalLoadIsMet() (met bool, variableName str...
    method collectThrottleHTTPStatus (line 290) | func (this *Throttler) collectThrottleHTTPStatus(firstThrottlingCollec...
    method collectGeneralThrottleMetrics (line 352) | func (this *Throttler) collectGeneralThrottleMetrics() error {
    method initiateThrottlerCollection (line 447) | func (this *Throttler) initiateThrottlerCollection(firstThrottlingColl...
    method initiateThrottlerChecks (line 469) | func (this *Throttler) initiateThrottlerChecks() {
    method throttle (line 508) | func (this *Throttler) throttle(onThrottled func()) {
    method Teardown (line 522) | func (this *Throttler) Teardown() {
  function NewThrottler (line 55) | func NewThrottler(migrationContext *base.MigrationContext, applier *Appl...
  function parseChangelogHeartbeat (line 120) | func parseChangelogHeartbeat(heartbeatValue string) (lag time.Duration, ...

FILE: go/mysql/binlog.go
  type BinlogCoordinates (line 9) | type BinlogCoordinates interface

FILE: go/mysql/binlog_file.go
  function init (line 19) | func init() {
  type FileBinlogCoordinates (line 24) | type FileBinlogCoordinates struct
    method DisplayString (line 52) | func (this *FileBinlogCoordinates) DisplayString() string {
    method String (line 57) | func (this FileBinlogCoordinates) String() string {
    method Equals (line 62) | func (this *FileBinlogCoordinates) Equals(other BinlogCoordinates) bool {
    method IsEmpty (line 71) | func (this *FileBinlogCoordinates) IsEmpty() bool {
    method SmallerThan (line 76) | func (this *FileBinlogCoordinates) SmallerThan(other BinlogCoordinates...
    method SmallerThanOrEquals (line 91) | func (this *FileBinlogCoordinates) SmallerThanOrEquals(other BinlogCoo...
    method FileNumberDistance (line 104) | func (this *FileBinlogCoordinates) FileNumberDistance(other *FileBinlo...
    method FileNumber (line 112) | func (this *FileBinlogCoordinates) FileNumber() (int, int) {
    method PreviousFileCoordinatesBy (line 124) | func (this *FileBinlogCoordinates) PreviousFileCoordinatesBy(offset in...
    method PreviousFileCoordinates (line 141) | func (this *FileBinlogCoordinates) PreviousFileCoordinates() (BinlogCo...
    method NextFileCoordinates (line 146) | func (this *FileBinlogCoordinates) NextFileCoordinates() (BinlogCoordi...
    method DetachedCoordinates (line 160) | func (this *FileBinlogCoordinates) DetachedCoordinates() (isDetached b...
    method Clone (line 168) | func (this *FileBinlogCoordinates) Clone() BinlogCoordinates {
    method IsLogPosOverflowBeyond4Bytes (line 181) | func (this *FileBinlogCoordinates) IsLogPosOverflowBeyond4Bytes(preCoo...
  function NewFileBinlogCoordinates (line 30) | func NewFileBinlogCoordinates(logFile string, logPos int64) *FileBinlogC...
  function ParseFileBinlogCoordinates (line 38) | func ParseFileBinlogCoordinates(logFileLogPos string) (*FileBinlogCoordi...

FILE: go/mysql/binlog_file_test.go
  function init (line 17) | func init() {
  function TestBinlogCoordinates (line 21) | func TestBinlogCoordinates(t *testing.T) {
  function TestBinlogCoordinatesAsKey (line 79) | func TestBinlogCoordinatesAsKey(t *testing.T) {
  function TestIsLogPosOverflowBeyond4Bytes (line 95) | func TestIsLogPosOverflowBeyond4Bytes(t *testing.T) {
  function TestBinlogCoordinates_LogFileZeroPaddedTransition (line 138) | func TestBinlogCoordinates_LogFileZeroPaddedTransition(t *testing.T) {
  function TestBinlogCoordinates_SameLogFileDifferentPosition (line 145) | func TestBinlogCoordinates_SameLogFileDifferentPosition(t *testing.T) {

FILE: go/mysql/binlog_gtid.go
  type GTIDBinlogCoordinates (line 13) | type GTIDBinlogCoordinates struct
    method DisplayString (line 27) | func (this *GTIDBinlogCoordinates) DisplayString() string {
    method String (line 35) | func (this GTIDBinlogCoordinates) String() string {
    method Equals (line 40) | func (this *GTIDBinlogCoordinates) Equals(other BinlogCoordinates) bool {
    method IsEmpty (line 54) | func (this *GTIDBinlogCoordinates) IsEmpty() bool {
    method SmallerThan (line 59) | func (this *GTIDBinlogCoordinates) SmallerThan(other BinlogCoordinates...
    method SmallerThanOrEquals (line 74) | func (this *GTIDBinlogCoordinates) SmallerThanOrEquals(other BinlogCoo...
    method Clone (line 78) | func (this *GTIDBinlogCoordinates) Clone() BinlogCoordinates {
  function NewGTIDBinlogCoordinates (line 19) | func NewGTIDBinlogCoordinates(gtidSet string) (*GTIDBinlogCoordinates, e...

FILE: go/mysql/connection.go
  constant TLS_CONFIG_KEY (line 21) | TLS_CONFIG_KEY = "ghost"
  type ConnectionConfig (line 25) | type ConnectionConfig struct
    method DuplicateCredentials (line 45) | func (this *ConnectionConfig) DuplicateCredentials(key InstanceKey) *C...
    method Duplicate (line 69) | func (this *ConnectionConfig) Duplicate() *ConnectionConfig {
    method String (line 73) | func (this *ConnectionConfig) String() string {
    method Equals (line 77) | func (this *ConnectionConfig) Equals(other *ConnectionConfig) bool {
    method UseTLS (line 81) | func (this *ConnectionConfig) UseTLS(caCertificatePath, clientCertific...
    method RegisterTLSConfig (line 119) | func (this *ConnectionConfig) RegisterTLSConfig() error {
    method TLSConfig (line 132) | func (this *ConnectionConfig) TLSConfig() *tls.Config {
    method GetDBUri (line 136) | func (this *ConnectionConfig) GetDBUri(databaseName string) string {
  function NewConnectionConfig (line 36) | func NewConnectionConfig() *ConnectionConfig {
  function GetDBTLSConfigKey (line 169) | func GetDBTLSConfigKey(tlsServerName string) string {

FILE: go/mysql/connection_test.go
  constant transactionIsolation (line 17) | transactionIsolation = "REPEATABLE-READ"
  function init (line 20) | func init() {
  function TestNewConnectionConfig (line 24) | func TestNewConnectionConfig(t *testing.T) {
  function TestDuplicateCredentials (line 36) | func TestDuplicateCredentials(t *testing.T) {
  function TestDuplicate (line 63) | func TestDuplicate(t *testing.T) {
  function TestGetDBUri (line 83) | func TestGetDBUri(t *testing.T) {
  function TestGetDBUriWithTLSSetup (line 96) | func TestGetDBUriWithTLSSetup(t *testing.T) {
  function TestGetDBTLSConfigKey (line 112) | func TestGetDBTLSConfigKey(t *testing.T) {

FILE: go/mysql/instance_key.go
  constant DefaultInstancePort (line 16) | DefaultInstancePort = 3306
  type InstanceKey (line 29) | type InstanceKey struct
    method Equals (line 70) | func (this *InstanceKey) Equals(other *InstanceKey) bool {
    method SmallerThan (line 79) | func (this *InstanceKey) SmallerThan(other *InstanceKey) bool {
    method IsDetached (line 90) | func (this *InstanceKey) IsDetached() bool {
    method IsValid (line 95) | func (this *InstanceKey) IsValid() bool {
    method DetachedKey (line 106) | func (this *InstanceKey) DetachedKey() *InstanceKey {
    method ReattachedKey (line 114) | func (this *InstanceKey) ReattachedKey() *InstanceKey {
    method StringCode (line 122) | func (this *InstanceKey) StringCode() string {
    method DisplayString (line 127) | func (this *InstanceKey) DisplayString() string {
    method String (line 132) | func (this InstanceKey) String() string {
  constant detachHint (line 34) | detachHint = "//"
  function NewRawInstanceKey (line 37) | func NewRawInstanceKey(hostPort string) (*InstanceKey, error) {
  function ParseInstanceKey (line 65) | func ParseInstanceKey(hostPort string) (*InstanceKey, error) {

FILE: go/mysql/instance_key_map.go
  type InstanceKeyMap (line 14) | type InstanceKeyMap
    method Len (line 20) | func (this *InstanceKeyMap) Len() int {
    method AddKey (line 25) | func (this *InstanceKeyMap) AddKey(key InstanceKey) {
    method AddKeys (line 30) | func (this *InstanceKeyMap) AddKeys(keys []InstanceKey) {
    method HasKey (line 37) | func (this *InstanceKeyMap) HasKey(key InstanceKey) bool {
    method GetInstanceKeys (line 43) | func (this *InstanceKeyMap) GetInstanceKeys() []InstanceKey {
    method MarshalJSON (line 52) | func (this *InstanceKeyMap) MarshalJSON() ([]byte, error) {
    method ToJSON (line 57) | func (this *InstanceKeyMap) ToJSON() (string, error) {
    method ToJSONString (line 63) | func (this *InstanceKeyMap) ToJSONString() string {
    method ToCommaDelimitedList (line 69) | func (this *InstanceKeyMap) ToCommaDelimitedList() string {
    method ReadJson (line 78) | func (this *InstanceKeyMap) ReadJson(jsonString string) error {
    method ReadCommaDelimitedList (line 89) | func (this *InstanceKeyMap) ReadCommaDelimitedList(list string) error {
  function NewInstanceKeyMap (line 16) | func NewInstanceKeyMap() *InstanceKeyMap {

FILE: go/mysql/instance_key_test.go
  function init (line 15) | func init() {
  function TestParseInstanceKey (line 19) | func TestParseInstanceKey(t *testing.T) {

FILE: go/mysql/replica_terminology_map.go
  constant MysqlVersionCutoff (line 8) | MysqlVersionCutoff = "8.4"
  function ReplicaTermFor (line 27) | func ReplicaTermFor(mysqlVersion string, term string) string {

FILE: go/mysql/utils.go
  constant MaxTableNameLength (line 22) | MaxTableNameLength   = 64
  constant MaxDBPoolConnections (line 23) | MaxDBPoolConnections = 3
  type ReplicationLagResult (line 26) | type ReplicationLagResult struct
    method HasLag (line 43) | func (this *ReplicationLagResult) HasLag() bool {
  type Trigger (line 32) | type Trigger struct
  function NewNoReplicationLagResult (line 39) | func NewNoReplicationLagResult() *ReplicationLagResult {
  function GetDB (line 51) | func GetDB(migrationUuid string, mysql_uri string) (db *gosql.DB, exists...
  function GetReplicationLagFromSlaveStatus (line 70) | func GetReplicationLagFromSlaveStatus(dbVersion string, informationSchem...
  function GetMasterKeyFromSlaveStatus (line 88) | func GetMasterKeyFromSlaveStatus(dbVersion string, connectionConfig *Con...
  function GetMasterConnectionConfigSafe (line 132) | func GetMasterConnectionConfigSafe(dbVersion string, connectionConfig *C...
  function GetReplicationBinlogCoordinates (line 162) | func GetReplicationBinlogCoordinates(dbVersion string, db *gosql.DB, gti...
  function GetSelfBinlogCoordinates (line 189) | func GetSelfBinlogCoordinates(dbVersion string, db *gosql.DB, gtid bool)...
  function GetInstanceKey (line 206) | func GetInstanceKey(db *gosql.DB) (instanceKey *InstanceKey, err error) {
  function GetTableColumns (line 213) | func GetTableColumns(db *gosql.DB, databaseName, tableName string) (*sql...
  function Kill (line 244) | func Kill(db *gosql.DB, connectionID string) error {
  function GetTriggers (line 250) | func GetTriggers(db *gosql.DB, databaseName, tableName string) (triggers...

FILE: go/sql/builder.go
  type ValueComparisonSign (line 14) | type ValueComparisonSign
  constant LessThanComparisonSign (line 17) | LessThanComparisonSign            ValueComparisonSign = "<"
  constant LessThanOrEqualsComparisonSign (line 18) | LessThanOrEqualsComparisonSign    ValueComparisonSign = "<="
  constant EqualsComparisonSign (line 19) | EqualsComparisonSign              ValueComparisonSign = "="
  constant GreaterThanOrEqualsComparisonSign (line 20) | GreaterThanOrEqualsComparisonSign ValueComparisonSign = ">="
  constant GreaterThanComparisonSign (line 21) | GreaterThanComparisonSign         ValueComparisonSign = ">"
  constant NotEqualsComparisonSign (line 22) | NotEqualsComparisonSign           ValueComparisonSign = "!="
  constant MaxColumnNameLength (line 23) | MaxColumnNameLength                                   = 64
  function EscapeName (line 29) | func EscapeName(name string) string {
  function TruncateColumnName (line 38) | func TruncateColumnName(name string, limit int) string {
  function buildColumnsPreparedValues (line 51) | func buildColumnsPreparedValues(columns *ColumnList) []string {
  function buildPreparedValues (line 69) | func buildPreparedValues(length int) []string {
  function duplicateNames (line 77) | func duplicateNames(names []string) []string {
  function BuildValueComparison (line 83) | func BuildValueComparison(column string, value string, comparisonSign Va...
  function BuildEqualsComparison (line 94) | func BuildEqualsComparison(columns []string, values []string) (result st...
  function BuildEqualsPreparedComparison (line 115) | func BuildEqualsPreparedComparison(columns []string) (result string, err...
  type CheckpointInsertQueryBuilder (line 121) | type CheckpointInsertQueryBuilder struct
    method BuildQuery (line 166) | func (b *CheckpointInsertQueryBuilder) BuildQuery(uniqueKeyArgs []inte...
  function NewCheckpointQueryBuilder (line 126) | func NewCheckpointQueryBuilder(databaseName, tableName string, uniqueKey...
  function BuildSetPreparedClause (line 182) | func BuildSetPreparedClause(columns *ColumnList) (result string, err err...
  function BuildRangeComparison (line 203) | func BuildRangeComparison(columns []string, values []string, args []inte...
  function BuildRangePreparedComparison (line 258) | func BuildRangePreparedComparison(columns *ColumnList, args []interface{...
  function BuildRangeInsertQuery (line 263) | func BuildRangeInsertQuery(databaseName, originalTableName, ghostTableNa...
  function BuildRangeInsertPreparedQuery (line 326) | func BuildRangeInsertPreparedQuery(databaseName, originalTableName, ghos...
  function BuildUniqueKeyRangeEndPreparedQueryViaOffset (line 332) | func BuildUniqueKeyRangeEndPreparedQueryViaOffset(databaseName, tableNam...
  function BuildUniqueKeyRangeEndPreparedQueryViaTemptable (line 385) | func BuildUniqueKeyRangeEndPreparedQueryViaTemptable(databaseName, table...
  function BuildUniqueKeyMinValuesPreparedQuery (line 445) | func BuildUniqueKeyMinValuesPreparedQuery(databaseName, tableName string...
  function BuildUniqueKeyMaxValuesPreparedQuery (line 449) | func BuildUniqueKeyMaxValuesPreparedQuery(databaseName, tableName string...
  function buildUniqueKeyMinMaxValuesPreparedQuery (line 453) | func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName str...
  type DMLDeleteQueryBuilder (line 487) | type DMLDeleteQueryBuilder struct
    method BuildQuery (line 529) | func (b *DMLDeleteQueryBuilder) BuildQuery(args []interface{}) (string...
  function NewDMLDeleteQueryBuilder (line 496) | func NewDMLDeleteQueryBuilder(databaseName, tableName string, tableColum...
  type DMLInsertQueryBuilder (line 544) | type DMLInsertQueryBuilder struct
    method BuildQuery (line 591) | func (b *DMLInsertQueryBuilder) BuildQuery(args []interface{}) (string...
  function NewDMLInsertQueryBuilder (line 553) | func NewDMLInsertQueryBuilder(databaseName, tableName string, tableColum...
  type DMLUpdateQueryBuilder (line 606) | type DMLUpdateQueryBuilder struct
    method BuildQuery (line 664) | func (b *DMLUpdateQueryBuilder) BuildQuery(valueArgs, whereArgs []inte...
  function NewDMLUpdateQueryBuilder (line 615) | func NewDMLUpdateQueryBuilder(databaseName, tableName string, tableColum...

FILE: go/sql/builder_test.go
  function init (line 22) | func init() {
  function normalizeQuery (line 26) | func normalizeQuery(name string) string {
  function TestEscapeName (line 33) | func TestEscapeName(t *testing.T) {
  function TestBuildEqualsComparison (line 41) | func TestBuildEqualsComparison(t *testing.T) {
  function TestBuildEqualsPreparedComparison (line 70) | func TestBuildEqualsPreparedComparison(t *testing.T) {
  function TestBuildSetPreparedClause (line 79) | func TestBuildSetPreparedClause(t *testing.T) {
  function TestBuildRangeComparison (line 99) | func TestBuildRangeComparison(t *testing.T) {
  function TestBuildRangeInsertQuery (line 161) | func TestBuildRangeInsertQuery(t *testing.T) {
  function TestBuildRangeInsertQueryRenameMap (line 230) | func TestBuildRangeInsertQueryRenameMap(t *testing.T) {
  function TestBuildRangeInsertPreparedQuery (line 297) | func TestBuildRangeInsertPreparedQuery(t *testing.T) {
  function TestBuildUniqueKeyRangeEndPreparedQueryViaOffset (line 328) | func TestBuildUniqueKeyRangeEndPreparedQueryViaOffset(t *testing.T) {
  function TestBuildUniqueKeyRangeEndPreparedQueryViaTemptable (line 355) | func TestBuildUniqueKeyRangeEndPreparedQueryViaTemptable(t *testing.T) {
  function TestBuildUniqueKeyMinValuesPreparedQuery (line 387) | func TestBuildUniqueKeyMinValuesPreparedQuery(t *testing.T) {
  function TestBuildDMLDeleteQuery (line 422) | func TestBuildDMLDeleteQuery(t *testing.T) {
  function TestBuildDMLDeleteQuerySignedUnsigned (line 489) | func TestBuildDMLDeleteQuerySignedUnsigned(t *testing.T) {
  function TestBuildDMLInsertQuery (line 529) | func TestBuildDMLInsertQuery(t *testing.T) {
  function TestBuildDMLInsertQuerySignedUnsigned (line 578) | func TestBuildDMLInsertQuerySignedUnsigned(t *testing.T) {
  function TestBuildDMLUpdateQuery (line 639) | func TestBuildDMLUpdateQuery(t *testing.T) {
  function TestBuildDMLUpdateQuerySignedUnsigned (line 745) | func TestBuildDMLUpdateQuerySignedUnsigned(t *testing.T) {
  function TestCheckpointQueryBuilder (line 787) | func TestCheckpointQueryBuilder(t *testing.T) {

FILE: go/sql/encoding.go
  type charsetEncoding (line 14) | type charsetEncoding
  function init (line 18) | func init() {

FILE: go/sql/parser.go
  type AlterTableParser (line 39) | type AlterTableParser struct
    method tokenizeAlterStatement (line 65) | func (this *AlterTableParser) tokenizeAlterStatement(alterStatement st...
    method sanitizeQuotesFromAlterStatement (line 92) | func (this *AlterTableParser) sanitizeQuotesFromAlterStatement(alterSt...
    method parseAlterToken (line 98) | func (this *AlterTableParser) parseAlterToken(alterToken string) {
    method ParseAlterStatement (line 136) | func (this *AlterTableParser) ParseAlterStatement(alterStatement strin...
    method GetNonTrivialRenames (line 161) | func (this *AlterTableParser) GetNonTrivialRenames() map[string]string {
    method HasNonTrivialRenames (line 171) | func (this *AlterTableParser) HasNonTrivialRenames() bool {
    method DroppedColumnsMap (line 175) | func (this *AlterTableParser) DroppedColumnsMap() map[string]bool {
    method IsRenameTable (line 179) | func (this *AlterTableParser) IsRenameTable() bool {
    method IsAutoIncrementDefined (line 183) | func (this *AlterTableParser) IsAutoIncrementDefined() bool {
    method GetExplicitSchema (line 187) | func (this *AlterTableParser) GetExplicitSchema() string {
    method HasExplicitSchema (line 191) | func (this *AlterTableParser) HasExplicitSchema() bool {
    method GetExplicitTable (line 195) | func (this *AlterTableParser) GetExplicitTable() string {
    method HasExplicitTable (line 199) | func (this *AlterTableParser) HasExplicitTable() bool {
    method GetAlterStatementOptions (line 203) | func (this *AlterTableParser) GetAlterStatementOptions() string {
  function NewAlterTableParser (line 52) | func NewAlterTableParser() *AlterTableParser {
  function NewParserFromAlterStatement (line 59) | func NewParserFromAlterStatement(alterStatement string) *AlterTableParser {
  function ParseEnumValues (line 207) | func ParseEnumValues(enumColumnType string) string {

FILE: go/sql/parser_test.go
  function init (line 15) | func init() {
  function TestParseAlterStatement (line 19) | func TestParseAlterStatement(t *testing.T) {
  function TestParseAlterStatementrivialRename (line 29) | func TestParseAlterStatementrivialRename(t *testing.T) {
  function TestParseAlterStatementWithAutoIncrement (line 41) | func TestParseAlterStatementWithAutoIncrement(t *testing.T) {
  function TestParseAlterStatementrivialRenames (line 60) | func TestParseAlterStatementrivialRenames(t *testing.T) {
  function TestParseAlterStatementNonTrivial (line 73) | func TestParseAlterStatementNonTrivial(t *testing.T) {
  function TestTokenizeAlterStatement (line 97) | func TestTokenizeAlterStatement(t *testing.T) {
  function TestSanitizeQuotesFromAlterStatement (line 136) | func TestSanitizeQuotesFromAlterStatement(t *testing.T) {
  function TestParseAlterStatementDroppedColumns (line 150) | func TestParseAlterStatementDroppedColumns(t *testing.T) {
  function TestParseAlterStatementRenameTable (line 189) | func TestParseAlterStatementRenameTable(t *testing.T) {
  function TestParseAlterStatementExplicitTable (line 228) | func TestParseAlterStatementExplicitTable(t *testing.T) {
  function TestParseEnumValues (line 321) | func TestParseEnumValues(t *testing.T) {

FILE: go/sql/types.go
  type ColumnType (line 16) | type ColumnType
  constant UnknownColumnType (line 19) | UnknownColumnType ColumnType = iota
  constant TimestampColumnType (line 20) | TimestampColumnType
  constant DateTimeColumnType (line 21) | DateTimeColumnType
  constant EnumColumnType (line 22) | EnumColumnType
  constant MediumIntColumnType (line 23) | MediumIntColumnType
  constant JSONColumnType (line 24) | JSONColumnType
  constant FloatColumnType (line 25) | FloatColumnType
  constant BinaryColumnType (line 26) | BinaryColumnType
  constant maxMediumintUnsigned (line 29) | maxMediumintUnsigned int32 = 16777215
  type TimezoneConversion (line 31) | type TimezoneConversion struct
  type CharacterSetConversion (line 35) | type CharacterSetConversion struct
  type Column (line 40) | type Column struct
    method convertArg (line 60) | func (this *Column) convertArg(arg interface{}) interface{} {
  function NewColumns (line 122) | func NewColumns(names []string) []Column {
  function ParseColumns (line 130) | func ParseColumns(names string) []Column {
  type ColumnsMap (line 136) | type ColumnsMap
  function NewEmptyColumnsMap (line 138) | func NewEmptyColumnsMap() ColumnsMap {
  function NewColumnsMap (line 143) | func NewColumnsMap(orderedColumns []Column) ColumnsMap {
  type ColumnList (line 152) | type ColumnList struct
    method Columns (line 175) | func (this *ColumnList) Columns() []Column {
    method Names (line 179) | func (this *ColumnList) Names() []string {
    method GetColumn (line 187) | func (this *ColumnList) GetColumn(columnName string) *Column {
    method SetUnsigned (line 194) | func (this *ColumnList) SetUnsigned(columnName string) {
    method IsUnsigned (line 198) | func (this *ColumnList) IsUnsigned(columnName string) bool {
    method SetCharset (line 202) | func (this *ColumnList) SetCharset(columnName string, charset string) {
    method GetCharset (line 206) | func (this *ColumnList) GetCharset(columnName string) string {
    method SetColumnType (line 210) | func (this *ColumnList) SetColumnType(columnName string, columnType Co...
    method GetColumnType (line 214) | func (this *ColumnList) GetColumnType(columnName string) ColumnType {
    method SetConvertDatetimeToTimestamp (line 218) | func (this *ColumnList) SetConvertDatetimeToTimestamp(columnName strin...
    method HasTimezoneConversion (line 222) | func (this *ColumnList) HasTimezoneConversion(columnName string) bool {
    method SetEnumToTextConversion (line 226) | func (this *ColumnList) SetEnumToTextConversion(columnName string) {
    method IsEnumToTextConversion (line 230) | func (this *ColumnList) IsEnumToTextConversion(columnName string) bool {
    method SetEnumValues (line 234) | func (this *ColumnList) SetEnumValues(columnName string, enumValues st...
    method String (line 238) | func (this *ColumnList) String() string {
    method Equals (line 242) | func (this *ColumnList) Equals(other *ColumnList) bool {
    method EqualsByNames (line 246) | func (this *ColumnList) EqualsByNames(other *ColumnList) bool {
    method IsSubsetOf (line 252) | func (this *ColumnList) IsSubsetOf(other *ColumnList) bool {
    method FilterBy (line 261) | func (this *ColumnList) FilterBy(f func(Column) bool) *ColumnList {
    method Len (line 271) | func (this *ColumnList) Len() int {
    method SetCharsetConversion (line 275) | func (this *ColumnList) SetCharsetConversion(columnName string, fromCh...
  function NewColumnList (line 158) | func NewColumnList(names []string) *ColumnList {
  function ParseColumnList (line 167) | func ParseColumnList(names string) *ColumnList {
  type UniqueKey (line 280) | type UniqueKey struct
    method IsPrimary (line 289) | func (this *UniqueKey) IsPrimary() bool {
    method Len (line 293) | func (this *UniqueKey) Len() int {
    method String (line 297) | func (this *UniqueKey) String() string {
  type ColumnValues (line 305) | type ColumnValues struct
    method AbstractValues (line 334) | func (this *ColumnValues) AbstractValues() []interface{} {
    method StringColumn (line 338) | func (this *ColumnValues) StringColumn(index int) string {
    method String (line 346) | func (this *ColumnValues) String() string {
    method Clone (line 354) | func (this *ColumnValues) Clone() *ColumnValues {
  function NewColumnValues (line 310) | func NewColumnValues(length int) *ColumnValues {
  function ToColumnValues (line 322) | func ToColumnValues(abstractValues []interface{}) *ColumnValues {

FILE: go/sql/types_test.go
  function init (line 15) | func init() {
  function TestParseColumnList (line 19) | func TestParseColumnList(t *testing.T) {
  function TestGetColumn (line 30) | func TestGetColumn(t *testing.T) {
  function TestBinaryToString (line 44) | func TestBinaryToString(t *testing.T) {
  function TestConvertArgCharsetDecoding (line 53) | func TestConvertArgCharsetDecoding(t *testing.T) {
  function TestConvertArgBinaryColumnPadding (line 69) | func TestConvertArgBinaryColumnPadding(t *testing.T) {
  function TestConvertArgBinaryColumnNoPaddingWhenFull (line 98) | func TestConvertArgBinaryColumnNoPaddingWhenFull(t *testing.T) {

FILE: localtests/alter-charset-all-dml/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/alter-charset/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/attempt-instant-ddl/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/autoinc-copy-deletes-user-defined/create.sql
  type gh_ost_test (line 4) | create table gh_ost_test (

FILE: localtests/autoinc-copy-deletes/create.sql
  type gh_ost_test (line 4) | create table gh_ost_test (

FILE: localtests/autoinc-copy-simple/create.sql
  type gh_ost_test (line 4) | create table gh_ost_test (

FILE: localtests/autoinc-zero-value/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/bigint-change-nullable/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/binary-to-varbinary/create.sql
  type gh_ost_test (line 7) | create table gh_ost_test (

FILE: localtests/bit-add/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/bit-dml/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/compound-pk-ts/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/compound-pk/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/convert-utf8mb4/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/copy-retries-exhausted/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/datetime-1970/create.sql
  type gh_ost_test (line 4) | create table gh_ost_test (

FILE: localtests/datetime-submillis-zeroleading/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/datetime-submillis/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/datetime-to-timestamp-pk-fail/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/datetime-to-timestamp/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/datetime-with-zero/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/datetime/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/decimal/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/discard-fk/create.sql
  type gh_ost_test_fk_parent (line 4) | create table gh_ost_test_fk_parent (
  type gh_ost_test (line 9) | create table gh_ost_test (

FILE: localtests/drop-null-add-not-null/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/enum-pk/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/enum-to-varchar/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/enum/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/existing-datetime-with-zero/create.sql
  type gh_ost_test (line 3) | create table gh_ost_test (

FILE: localtests/fail-datetime-with-zero/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/fail-drop-pk/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/fail-existing-datetime-with-zero/create.sql
  type gh_ost_test (line 3) | create table gh_ost_test (

FILE: localtests/fail-fk-parent/create.sql
  type gh_ost_test (line 3) | create table gh_ost_test (
  type gh_ost_test_child (line 8) | create table gh_ost_test_child (

FILE: localtests/fail-fk/create.sql
  type gh_ost_test_fk_parent (line 4) | create table gh_ost_test_fk_parent (
  type gh_ost_test (line 9) | create table gh_ost_test (

FILE: localtests/fail-float-unique-key/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/fail-no-shared-uk/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/fail-no-unique-key/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/fail-rename-table/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/fail-update-pk-column/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/gbk-charset/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/generated-columns-add/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/generated-columns-rename/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/generated-columns-unique/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/generated-columns/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/geometry/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/gtid/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/json-dml/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/json/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/keyword-column/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/latin1/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/latin1text/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/mixed-charset/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/modify-change-case-pk/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/modify-change-case/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/panic-on-warnings-duplicate-unique-values-on-column-type-change/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (
  type name_index (line 8) | create unique index name_index on gh_ost_test (name)

FILE: localtests/panic-on-warnings-duplicate-values-for-unique-index/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/panic-on-warnings-update-pk-with-duplicate-on-new-unique-index/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/rename-inserts-only/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/rename-none-column/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/rename-none-comment/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/rename-reorder-column/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/rename-reorder-columns/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/rename/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/reorder-columns/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/shared-uk/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/spatial/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/swap-pk-uk/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/swap-uk-uk/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/swap-uk/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/timestamp-datetime/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/timestamp-to-datetime/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/timestamp/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/trigger-advanced-features/create.sql
  type gh_ost_test (line 15) | create table gh_ost_test (
  type gh_ost_test_log (line 25) | create table gh_ost_test_log (
  type gh_ost_test_stats (line 35) | create table gh_ost_test_stats (

FILE: localtests/trigger-ghost-name-conflict/create.sql
  type gh_ost_test (line 10) | create table gh_ost_test (
  type gh_ost_test_other (line 24) | create table gh_ost_test_other (

FILE: localtests/trigger-long-name-validation/create.sql
  type gh_ost_test (line 8) | create table gh_ost_test (

FILE: localtests/trivial/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/tz-datetime-ts/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/tz-datetime/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/tz/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/unsigned-modify/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/unsigned-rename/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/unsigned-reorder/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/unsigned/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/utf8/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/utf8mb4/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: localtests/varbinary/create.sql
  type gh_ost_test (line 2) | create table gh_ost_test (

FILE: vendor/dario.cat/mergo/map.go
  function changeInitialCase (line 18) | func changeInitialCase(s string, mapper func(rune) rune) string {
  function isExported (line 26) | func isExported(field reflect.StructField) bool {
  function deepMap (line 34) | func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth i...
  function Map (line 132) | func Map(dst, src interface{}, opts ...func(*Config)) error {
  function MapWithOverwrite (line 139) | func MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error {
  function _map (line 143) | func _map(dst, src interface{}, opts ...func(*Config)) error {

FILE: vendor/dario.cat/mergo/merge.go
  function hasMergeableFields (line 16) | func hasMergeableFields(dst reflect.Value) (exported bool) {
  function isExportedComponent (line 28) | func isExportedComponent(field *reflect.StructField) bool {
  type Config (line 40) | type Config struct
  type Transformers (line 52) | type Transformers interface
  function deepMerge (line 59) | func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth...
  function Merge (line 318) | func Merge(dst, src interface{}, opts ...func(*Config)) error {
  function MergeWithOverwrite (line 325) | func MergeWithOverwrite(dst, src interface{}, opts ...func(*Config)) err...
  function WithTransformers (line 330) | func WithTransformers(transformers Transformers) func(*Config) {
  function WithOverride (line 337) | func WithOverride(config *Config) {
  function WithOverwriteWithEmptyValue (line 342) | func WithOverwriteWithEmptyValue(config *Config) {
  function WithOverrideEmptySlice (line 348) | func WithOverrideEmptySlice(config *Config) {
  function WithoutDereference (line 354) | func WithoutDereference(config *Config) {
  function WithAppendSlice (line 359) | func WithAppendSlice(config *Config) {
  function WithTypeCheck (line 364) | func WithTypeCheck(config *Config) {
  function WithSliceDeepCopy (line 369) | func WithSliceDeepCopy(config *Config) {
  function merge (line 374) | func merge(dst, src interface{}, opts ...func(*Config)) error {
  function isReflectNil (line 399) | func isReflectNil(v reflect.Value) bool {

FILE: vendor/dario.cat/mergo/mergo.go
  type visit (line 30) | type visit struct
  function isEmptyValue (line 37) | func isEmptyValue(v reflect.Value, shouldDereference bool) bool {
  function resolveValues (line 65) | func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err ...

FILE: vendor/filippo.io/edwards25519/edwards25519.go
  type projP1xP1 (line 15) | type projP1xP1 struct
    method Add (line 273) | func (v *projP1xP1) Add(p *Point, q *projCached) *projP1xP1 {
    method Sub (line 293) | func (v *projP1xP1) Sub(p *Point, q *projCached) *projP1xP1 {
    method AddAffine (line 313) | func (v *projP1xP1) AddAffine(p *Point, q *affineCached) *projP1xP1 {
    method SubAffine (line 332) | func (v *projP1xP1) SubAffine(p *Point, q *affineCached) *projP1xP1 {
    method Double (line 353) | func (v *projP1xP1) Double(p *projP2) *projP1xP1 {
  type projP2 (line 19) | type projP2 struct
    method Zero (line 59) | func (v *projP2) Zero() *projP2 {
    method FromP1xP1 (line 196) | func (v *projP2) FromP1xP1(p *projP1xP1) *projP2 {
    method FromP3 (line 203) | func (v *projP2) FromP3(p *Point) *projP2 {
  type Point (line 29) | type Point struct
    method Set (line 107) | func (v *Point) Set(u *Point) *Point {
    method Bytes (line 116) | func (v *Point) Bytes() []byte {
    method bytes (line 123) | func (v *Point) bytes(buf *[32]byte) []byte {
    method SetBytes (line 145) | func (v *Point) SetBytes(x []byte) (*Point, error) {
    method fromP1xP1 (line 210) | func (v *Point) fromP1xP1(p *projP1xP1) *Point {
    method fromP2 (line 218) | func (v *Point) fromP2(p *projP2) *Point {
    method Add (line 258) | func (v *Point) Add(p, q *Point) *Point {
    method Subtract (line 266) | func (v *Point) Subtract(p, q *Point) *Point {
    method Negate (line 374) | func (v *Point) Negate(p *Point) *Point {
    method Equal (line 384) | func (v *Point) Equal(u *Point) int {
  type incomparable (line 39) | type incomparable
  function checkInitialized (line 41) | func checkInitialized(points ...*Point) {
  type projCached (line 49) | type projCached struct
    method Zero (line 89) | func (v *projCached) Zero() *projCached {
    method FromP3 (line 234) | func (v *projCached) FromP3(p *Point) *projCached {
    method Select (line 399) | func (v *projCached) Select(a, b *projCached, cond int) *projCached {
    method CondNeg (line 416) | func (v *projCached) CondNeg(cond int) *projCached {
  type affineCached (line 53) | type affineCached struct
    method Zero (line 97) | func (v *affineCached) Zero() *affineCached {
    method FromP3 (line 242) | func (v *affineCached) FromP3(p *Point) *affineCached {
    method Select (line 408) | func (v *affineCached) Select(a, b *affineCached, cond int) *affineCac...
    method CondNeg (line 423) | func (v *affineCached) CondNeg(cond int) *affineCached {
  function NewIdentityPoint (line 72) | func NewIdentityPoint() *Point {
  function NewGeneratorPoint (line 85) | func NewGeneratorPoint() *Point {
  function copyFieldElement (line 189) | func copyFieldElement(buf *[32]byte, v *field.Element) []byte {

FILE: vendor/filippo.io/edwards25519/extra.go
  method ExtendedCoordinates (line 18) | func (v *Point) ExtendedCoordinates() (X, Y, Z, T *field.Element) {
  method extendedCoordinates (line 27) | func (v *Point) extendedCoordinates(e *[4]field.Element) (X, Y, Z, T *fi...
  method SetExtendedCoordinates (line 42) | func (v *Point) SetExtendedCoordinates(X, Y, Z, T *field.Element) (*Poin...
  function isOnCurve (line 53) | func isOnCurve(X, Y, Z, T *field.Element) bool {
  method BytesMontgomery (line 88) | func (v *Point) BytesMontgomery() []byte {
  method bytesMontgomery (line 95) | func (v *Point) bytesMontgomery(buf *[32]byte) []byte {
  method MultByCofactor (line 115) | func (v *Point) MultByCofactor(p *Point) *Point {
  method pow2k (line 128) | func (s *Scalar) pow2k(k int) {
  method Invert (line 137) | func (s *Scalar) Invert(t *Scalar) *Scalar {
  method MultiScalarMult (line 243) | func (v *Point) MultiScalarMult(scalars []*Scalar, points []*Point) *Poi...
  method VarTimeMultiScalarMult (line 297) | func (v *Point) VarTimeMultiScalarMult(scalars []*Scalar, points []*Poin...

FILE: vendor/filippo.io/edwards25519/field/fe.go
  type Element (line 23) | type Element struct
    method Zero (line 40) | func (v *Element) Zero() *Element {
    method One (line 48) | func (v *Element) One() *Element {
    method reduce (line 54) | func (v *Element) reduce() *Element {
    method Add (line 87) | func (v *Element) Add(a, b *Element) *Element {
    method Subtract (line 101) | func (v *Element) Subtract(a, b *Element) *Element {
    method Negate (line 113) | func (v *Element) Negate(a *Element) *Element {
    method Invert (line 120) | func (v *Element) Invert(z *Element) *Element {
    method Set (line 185) | func (v *Element) Set(a *Element) *Element {
    method SetBytes (line 198) | func (v *Element) SetBytes(x []byte) (*Element, error) {
    method Bytes (line 224) | func (v *Element) Bytes() []byte {
    method bytes (line 231) | func (v *Element) bytes(out *[32]byte) []byte {
    method Equal (line 252) | func (v *Element) Equal(u *Element) int {
    method Select (line 261) | func (v *Element) Select(a, b *Element, cond int) *Element {
    method Swap (line 272) | func (v *Element) Swap(u *Element, cond int) {
    method IsNegative (line 292) | func (v *Element) IsNegative() int {
    method Absolute (line 297) | func (v *Element) Absolute(u *Element) *Element {
    method Multiply (line 302) | func (v *Element) Multiply(x, y *Element) *Element {
    method Square (line 308) | func (v *Element) Square(x *Element) *Element {
    method Mult32 (line 314) | func (v *Element) Mult32(x *Element, y uint32) *Element {
    method Pow22523 (line 339) | func (v *Element) Pow22523(x *Element) *Element {
    method SqrtRatio (line 398) | func (r *Element) SqrtRatio(u, v *Element) (R *Element, wasSquare int) {
  constant maskLow51Bits (line 35) | maskLow51Bits uint64 = (1 << 51) - 1
  function mask64Bits (line 258) | func mask64Bits(cond int) uint64 { return ^(uint64(cond) - 1) }
  function mul51 (line 331) | func mul51(a uint64, b uint32) (lo uint64, hi uint64) {

FILE: vendor/filippo.io/edwards25519/field/fe_amd64.go
  function feMul (line 11) | func feMul(out *Element, a *Element, b *Element)
  function feSquare (line 16) | func feSquare(out *Element, a *Element)

FILE: vendor/filippo.io/edwards25519/field/fe_amd64_noasm.go
  function feMul (line 10) | func feMul(v, x, y *Element) { feMulGeneric(v, x, y) }
  function feSquare (line 12) | func feSquare(v, x *Element) { feSquareGeneric(v, x) }

FILE: vendor/filippo.io/edwards25519/field/fe_arm64.go
  function carryPropagate (line 11) | func carryPropagate(v *Element)
  method carryPropagate (line 13) | func (v *Element) carryPropagate() *Element {

FILE: vendor/filippo.io/edwards25519/field/fe_arm64_noasm.go
  method carryPropagate (line 10) | func (v *Element) carryPropagate() *Element {

FILE: vendor/filippo.io/edwards25519/field/fe_extra.go
  method SetWideBytes (line 19) | func (v *Element) SetWideBytes(x []byte) (*Element, error) {

FILE: vendor/filippo.io/edwards25519/field/fe_generic.go
  type uint128 (line 11) | type uint128 struct
  function mul64 (line 16) | func mul64(a, b uint64) uint128 {
  function addMul64 (line 22) | func addMul64(v uint128, a, b uint64) uint128 {
  function shiftRightBy51 (line 30) | func shiftRightBy51(a uint128) uint64 {
  function feMulGeneric (line 34) | func feMulGeneric(v, a, b *Element) {
  function feSquareGeneric (line 165) | func feSquareGeneric(v, a *Element) {
  method carryPropagateGeneric (line 250) | func (v *Element) carryPropagateGeneric() *Element {

FILE: vendor/filippo.io/edwards25519/scalar.go
  type Scalar (line 22) | type Scalar struct
    method MultiplyAdd (line 63) | func (s *Scalar) MultiplyAdd(x, y, z *Scalar) *Scalar {
    method Add (line 70) | func (s *Scalar) Add(x, y *Scalar) *Scalar {
    method Subtract (line 77) | func (s *Scalar) Subtract(x, y *Scalar) *Scalar {
    method Negate (line 84) | func (s *Scalar) Negate(x *Scalar) *Scalar {
    method Multiply (line 91) | func (s *Scalar) Multiply(x, y *Scalar) *Scalar {
    method Set (line 98) | func (s *Scalar) Set(x *Scalar) *Scalar {
    method SetUniformBytes (line 109) | func (s *Scalar) SetUniformBytes(x []byte) (*Scalar, error) {
    method setShortBytes (line 144) | func (s *Scalar) setShortBytes(x []byte) *Scalar {
    method SetCanonicalBytes (line 158) | func (s *Scalar) SetCanonicalBytes(x []byte) (*Scalar, error) {
    method SetBytesWithClamping (line 204) | func (s *Scalar) SetBytesWithClamping(x []byte) (*Scalar, error) {
    method Bytes (line 224) | func (s *Scalar) Bytes() []byte {
    method bytes (line 231) | func (s *Scalar) bytes(out *[32]byte) []byte {
    method Equal (line 239) | func (s *Scalar) Equal(t *Scalar) int {
    method nonAdjacentForm (line 256) | func (s *Scalar) nonAdjacentForm(w uint) [256]int8 {
    method signedRadix16 (line 321) | func (s *Scalar) signedRadix16() [64]int8 {
  function NewScalar (line 57) | func NewScalar() *Scalar {
  function isReduced (line 177) | func isReduced(s []byte) bool {

FILE: vendor/filippo.io/edwards25519/scalar_fiat.go
  type fiatScalarUint1 (line 43) | type fiatScalarUint1
  type fiatScalarInt1 (line 44) | type fiatScalarInt1
  type fiatScalarMontgomeryDomainFieldElement (line 49) | type fiatScalarMontgomeryDomainFieldElement
  type fiatScalarNonMontgomeryDomainFieldElement (line 54) | type fiatScalarNonMontgomeryDomainFieldElement
  function fiatScalarCmovznzU64 (line 71) | func fiatScalarCmovznzU64(out1 *uint64, arg1 fiatScalarUint1, arg2 uint6...
  function fiatScalarMul (line 88) | func fiatScalarMul(out1 *fiatScalarMontgomeryDomainFieldElement, arg1 *f...
  function fiatScalarAdd (line 384) | func fiatScalarAdd(out1 *fiatScalarMontgomeryDomainFieldElement, arg1 *f...
  function fiatScalarSub (line 436) | func fiatScalarSub(out1 *fiatScalarMontgomeryDomainFieldElement, arg1 *f...
  function fiatScalarOpp (line 478) | func fiatScalarOpp(out1 *fiatScalarMontgomeryDomainFieldElement, arg1 *f...
  function fiatScalarNonzero (line 527) | func fiatScalarNonzero(out1 *uint64, arg1 *[4]uint64) {
  function fiatScalarFromMontgomery (line 542) | func fiatScalarFromMontgomery(out1 *fiatScalarNonMontgomeryDomainFieldEl...
  function fiatScalarToMontgomery (line 698) | func fiatScalarToMontgomery(out1 *fiatScalarMontgomeryDomainFieldElement...
  function fiatScalarToBytes (line 969) | func fiatScalarToBytes(out1 *[32]uint8, arg1 *[4]uint64) {
  function fiatScalarFromBytes (line 1082) | func fiatScalarFromBytes(out1 *[4]uint64, arg1 *[32]uint8) {

FILE: vendor/filippo.io/edwards25519/scalarmult.go
  function basepointTable (line 11) | func basepointTable() *[32]affineLookupTable {
  method ScalarBaseMult (line 33) | func (v *Point) ScalarBaseMult(x *Scalar) *Point {
  method ScalarMult (line 85) | func (v *Point) ScalarMult(x *Scalar, q *Point) *Point {
  function basepointNafTable (line 127) | func basepointNafTable() *nafLookupTable8 {
  method VarTimeDoubleScalarBaseMult (line 143) | func (v *Point) VarTimeDoubleScalarBaseMult(a *Scalar, A *Point, b *Scal...

FILE: vendor/filippo.io/edwards25519/tables.go
  type projLookupTable (line 12) | type projLookupTable struct
    method FromP3 (line 34) | func (v *projLookupTable) FromP3(q *Point) {
    method SelectInto (line 90) | func (v *projLookupTable) SelectInto(dest *projCached, x int8) {
  type affineLookupTable (line 17) | type affineLookupTable struct
    method FromP3 (line 49) | func (v *affineLookupTable) FromP3(q *Point) {
    method SelectInto (line 106) | func (v *affineLookupTable) SelectInto(dest *affineCached, x int8) {
  type nafLookupTable5 (line 22) | type nafLookupTable5 struct
    method FromP3 (line 62) | func (v *nafLookupTable5) FromP3(q *Point) {
    method SelectInto (line 122) | func (v *nafLookupTable5) SelectInto(dest *projCached, x int8) {
  type nafLookupTable8 (line 27) | type nafLookupTable8 struct
    method FromP3 (line 76) | func (v *nafLookupTable8) FromP3(q *Point) {
    method SelectInto (line 127) | func (v *nafLookupTable8) SelectInto(dest *affineCached, x int8) {

FILE: vendor/github.com/Azure/go-ansiterm/constants.go
  constant LogEnv (line 3) | LogEnv = "DEBUG_TERMINAL"
  constant ANSI_SGR_RESET (line 21) | ANSI_SGR_RESET              = 0
  constant ANSI_SGR_BOLD (line 22) | ANSI_SGR_BOLD               = 1
  constant ANSI_SGR_DIM (line 23) | ANSI_SGR_DIM                = 2
  constant _ANSI_SGR_ITALIC (line 24) | _ANSI_SGR_ITALIC            = 3
  constant ANSI_SGR_UNDERLINE (line 25) | ANSI_SGR_UNDERLINE          = 4
  constant _ANSI_SGR_BLINKSLOW (line 26) | _ANSI_SGR_BLINKSLOW         = 5
  constant _ANSI_SGR_BLINKFAST (line 27) | _ANSI_SGR_BLINKFAST         = 6
  constant ANSI_SGR_REVERSE (line 28) | ANSI_SGR_REVERSE            = 7
  constant _ANSI_SGR_INVISIBLE (line 29) | _ANSI_SGR_INVISIBLE         = 8
  constant _ANSI_SGR_LINETHROUGH (line 30) | _ANSI_SGR_LINETHROUGH       = 9
  constant _ANSI_SGR_FONT_00 (line 31) | _ANSI_SGR_FONT_00           = 10
  constant _ANSI_SGR_FONT_01 (line 32) | _ANSI_SGR_FONT_01           = 11
  constant _ANSI_SGR_FONT_02 (line 33) | _ANSI_SGR_FONT_02           = 12
  constant _ANSI_SGR_FONT_03 (line 34) | _ANSI_SGR_FONT_03           = 13
  constant _ANSI_SGR_FONT_04 (line 35) | _ANSI_SGR_FONT_04           = 14
  constant _ANSI_SGR_FONT_05 (line 36) | _ANSI_SGR_FONT_05           = 15
  constant _ANSI_SGR_FONT_06 (line 37) | _ANSI_SGR_FONT_06           = 16
  constant _ANSI_SGR_FONT_07 (line 38) | _ANSI_SGR_FONT_07           = 17
  constant _ANSI_SGR_FONT_08 (line 39) | _ANSI_SGR_FONT_08           = 18
  constant _ANSI_SGR_FONT_09 (line 40) | _ANSI_SGR_FONT_09           = 19
  constant _ANSI_SGR_FONT_10 (line 41) | _ANSI_SGR_FONT_10           = 20
  constant _ANSI_SGR_DOUBLEUNDERLINE (line 42) | _ANSI_SGR_DOUBLEUNDERLINE   = 21
  constant ANSI_SGR_BOLD_DIM_OFF (line 43) | ANSI_SGR_BOLD_DIM_OFF       = 22
  constant _ANSI_SGR_ITALIC_OFF (line 44) | _ANSI_SGR_ITALIC_OFF        = 23
  constant ANSI_SGR_UNDERLINE_OFF (line 45) | ANSI_SGR_UNDERLINE_OFF      = 24
  constant _ANSI_SGR_BLINK_OFF (line 46) | _ANSI_SGR_BLINK_OFF         = 25
  constant _ANSI_SGR_RESERVED_00 (line 47) | _ANSI_SGR_RESERVED_00       = 26
  constant ANSI_SGR_REVERSE_OFF (line 48) | ANSI_SGR_REVERSE_OFF        = 27
  constant _ANSI_SGR_INVISIBLE_OFF (line 49) | _ANSI_SGR_INVISIBLE_OFF     = 28
  constant _ANSI_SGR_LINETHROUGH_OFF (line 50) | _ANSI_SGR_LINETHROUGH_OFF   = 29
  constant ANSI_SGR_FOREGROUND_BLACK (line 51) | ANSI_SGR_FOREGROUND_BLACK   = 30
  constant ANSI_SGR_FOREGROUND_RED (line 52) | ANSI_SGR_FOREGROUND_RED     = 31
  constant ANSI_SGR_FOREGROUND_GREEN (line 53) | ANSI_SGR_FOREGROUND_GREEN   = 32
  constant ANSI_SGR_FOREGROUND_YELLOW (line 54) | ANSI_SGR_FOREGROUND_YELLOW  = 33
  constant ANSI_SGR_FOREGROUND_BLUE (line 55) | ANSI_SGR_FOREGROUND_BLUE    = 34
  constant ANSI_SGR_FOREGROUND_MAGENTA (line 56) | ANSI_SGR_FOREGROUND_MAGENTA = 35
  constant ANSI_SGR_FOREGROUND_CYAN (line 57) | ANSI_SGR_FOREGROUND_CYAN    = 36
  constant ANSI_SGR_FOREGROUND_WHITE (line 58) | ANSI_SGR_FOREGROUND_WHITE   = 37
  constant _ANSI_SGR_RESERVED_01 (line 59) | _ANSI_SGR_RESERVED_01       = 38
  constant ANSI_SGR_FOREGROUND_DEFAULT (line 60) | ANSI_SGR_FOREGROUND_DEFAULT = 39
  constant ANSI_SGR_BACKGROUND_BLACK (line 61) | ANSI_SGR_BACKGROUND_BLACK   = 40
  constant ANSI_SGR_BACKGROUND_RED (line 62) | ANSI_SGR_BACKGROUND_RED     = 41
  constant ANSI_SGR_BACKGROUND_GREEN (line 63) | ANSI_SGR_BACKGROUND_GREEN   = 42
  constant ANSI_SGR_BACKGROUND_YELLOW (line 64) | ANSI_SGR_BACKGROUND_YELLOW  = 43
  constant ANSI_SGR_BACKGROUND_BLUE (line 65) | ANSI_SGR_BACKGROUND_BLUE    = 44
  constant ANSI_SGR_BACKGROUND_MAGENTA (line 66) | ANSI_SGR_BACKGROUND_MAGENTA = 45
  constant ANSI_SGR_BACKGROUND_CYAN (line 67) | ANSI_SGR_BACKGROUND_CYAN    = 46
  constant ANSI_SGR_BACKGROUND_WHITE (line 68) | ANSI_SGR_BACKGROUND_WHITE   = 47
  constant _ANSI_SGR_RESERVED_02 (line 69) | _ANSI_SGR_RESERVED_02       = 48
  constant ANSI_SGR_BACKGROUND_DEFAULT (line 70) | ANSI_SGR_BACKGROUND_DEFAULT = 49
  constant ANSI_MAX_CMD_LENGTH (line 73) | ANSI_MAX_CMD_LENGTH = 4096
  constant MAX_INPUT_EVENTS (line 75) | MAX_INPUT_EVENTS = 128
  constant DEFAULT_WIDTH (line 76) | DEFAULT_WIDTH    = 80
  constant DEFAULT_HEIGHT (line 77) | DEFAULT_HEIGHT   = 24
  constant ANSI_BEL (line 79) | ANSI_BEL              = 0x07
  constant ANSI_BACKSPACE (line 80) | ANSI_BACKSPACE        = 0x08
  constant ANSI_TAB (line 81) | ANSI_TAB              = 0x09
  constant ANSI_LINE_FEED (line 82) | ANSI_LINE_FEED        = 0x0A
  constant ANSI_VERTICAL_TAB (line 83) | ANSI_VERTICAL_TAB     = 0x0B
  constant ANSI_FORM_FEED (line 84) | ANSI_FORM_FEED        = 0x0C
  constant ANSI_CARRIAGE_RETURN (line 85) | ANSI_CARRIAGE_RETURN  = 0x0D
  constant ANSI_ESCAPE_PRIMARY (line 86) | ANSI_ESCAPE_PRIMARY   = 0x1B
  constant ANSI_ESCAPE_SECONDARY (line 87) | ANSI_ESCAPE_SECONDARY = 0x5B
  constant ANSI_OSC_STRING_ENTRY (line 88) | ANSI_OSC_STRING_ENTRY = 0x5D
  constant ANSI_COMMAND_FIRST (line 89) | ANSI_COMMAND_FIRST    = 0x40
  constant ANSI_COMMAND_LAST (line 90) | ANSI_COMMAND_LAST     = 0x7E
  constant DCS_ENTRY (line 91) | DCS_ENTRY             = 0x90
  constant CSI_ENTRY (line 92) | CSI_ENTRY             = 0x9B
  constant OSC_STRING (line 93) | OSC_STRING            = 0x9D
  constant ANSI_PARAMETER_SEP (line 94) | ANSI_PARAMETER_SEP    = ";"
  constant ANSI_CMD_G0 (line 95) | ANSI_CMD_G0           = '('
  constant ANSI_CMD_G1 (line 96) | ANSI_CMD_G1           = ')'
  constant ANSI_CMD_G2 (line 97) | ANSI_CMD_G2           = '*'
  constant ANSI_CMD_G3 (line 98) | ANSI_CMD_G3           = '+'
  constant ANSI_CMD_DECPNM (line 99) | ANSI_CMD_DECPNM       = '>'
  constant ANSI_CMD_DECPAM (line 100) | ANSI_CMD_DECPAM       = '='
  constant ANSI_CMD_OSC (line 101) | ANSI_CMD_OSC          = ']'
  constant ANSI_CMD_STR_TERM (line 102) | ANSI_CMD_STR_TERM     = '\\'
  constant KEY_CONTROL_PARAM_2 (line 104) | KEY_CONTROL_PARAM_2 = ";2"
  constant KEY_CONTROL_PARAM_3 (line 105) | KEY_CONTROL_PARAM_3 = ";3"
  constant KEY_CONTROL_PARAM_4 (line 106) | KEY_CONTROL_PARAM_4 = ";4"
  constant KEY_CONTROL_PARAM_5 (line 107) | KEY_CONTROL_PARAM_5 = ";5"
  constant KEY_CONTROL_PARAM_6 (line 108) | KEY_CONTROL_PARAM_6 = ";6"
  constant KEY_CONTROL_PARAM_7 (line 109) | KEY_CONTROL_PARAM_7 = ";7"
  constant KEY_CONTROL_PARAM_8 (line 110) | KEY_CONTROL_PARAM_8 = ";8"
  constant KEY_ESC_CSI (line 111) | KEY_ESC_CSI         = "\x1B["
  constant KEY_ESC_N (line 112) | KEY_ESC_N           = "\x1BN"
  constant KEY_ESC_O (line 113) | KEY_ESC_O           = "\x1BO"
  constant FILL_CHARACTER (line 115) | FILL_CHARACTER = ' '
  function getByteRange (line 118) | func getByteRange(start byte, end byte) []byte {
  function getEscapeToGroundBytes (line 157) | func getEscapeToGroundBytes() []byte {
  function getExecuteBytes (line 167) | func getExecuteBytes() []byte {
  function getToGroundBytes (line 174) | func getToGroundBytes() []byte {

FILE: vendor/github.com/Azure/go-ansiterm/context.go
  type ansiContext (line 3) | type ansiContext struct

FILE: vendor/github.com/Azure/go-ansiterm/csi_entry_state.go
  type csiEntryState (line 3) | type csiEntryState struct
    method Handle (line 7) | func (csiState csiEntryState) Handle(b byte) (s state, e error) {
    method Transition (line 27) | func (csiState csiEntryState) Transition(s state) error {
    method Enter (line 46) | func (csiState csiEntryState) Enter() error {

FILE: vendor/github.com/Azure/go-ansiterm/csi_param_state.go
  type csiParamState (line 3) | type csiParamState struct
    method Handle (line 7) | func (csiState csiParamState) Handle(b byte) (s state, e error) {
    method Transition (line 28) | func (csiState csiParamState) Transition(s state) error {

FILE: vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go
  type escapeIntermediateState (line 3) | type escapeIntermediateState struct
    method Handle (line 7) | func (escState escapeIntermediateState) Handle(b byte) (s state, e err...
    method Transition (line 26) | func (escState escapeIntermediateState) Transition(s state) error {

FILE: vendor/github.com/Azure/go-ansiterm/escape_state.go
  type escapeState (line 3) | type escapeState struct
    method Handle (line 7) | func (escState escapeState) Handle(b byte) (s state, e error) {
    method Transition (line 30) | func (escState escapeState) Transition(s state) error {
    method Enter (line 44) | func (escState escapeState) Enter() error {

FILE: vendor/github.com/Azure/go-ansiterm/event_handler.go
  type AnsiEventHandler (line 3) | type AnsiEventHandler interface

FILE: vendor/github.com/Azure/go-ansiterm/ground_state.go
  type groundState (line 3) | type groundState struct
    method Handle (line 7) | func (gs groundState) Handle(b byte) (s state, e error) {

FILE: vendor/github.com/Azure/go-ansiterm/osc_string_state.go
  type oscStringState (line 3) | type oscStringState struct
    method Handle (line 7) | func (oscState oscStringState) Handle(b byte) (s state, e error) {
  function isOscStringTerminator (line 24) | func isOscStringTerminator(b byte) bool {

FILE: vendor/github.com/Azure/go-ansiterm/parser.go
  type AnsiParser (line 9) | type AnsiParser struct
    method Parse (line 97) | func (ap *AnsiParser) Parse(bytes []byte) (int, error) {
    method handle (line 107) | func (ap *AnsiParser) handle(b byte) error {
    method changeState (line 128) | func (ap *AnsiParser) changeState(newState state) error {
  type Option (line 26) | type Option
  function WithLogf (line 28) | func WithLogf(f func(string, ...interface{})) Option {
  function CreateParser (line 34) | func CreateParser(initialState string, evtHandler AnsiEventHandler, opts...
  function getState (line 87) | func getState(name string, states []state) state {

FILE: vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go
  function parseParams (line 7) | func parseParams(bytes []byte) ([]string, error) {
  function parseCmd (line 33) | func parseCmd(context ansiContext) (string, error) {
  function getInt (line 37) | func getInt(params []string, dflt int) int {
  function getInts (line 42) | func getInts(params []string, minCount int, dflt int) []int {
  method modeDispatch (line 64) | func (ap *AnsiParser) modeDispatch(param string, set bool) error {
  method hDispatch (line 76) | func (ap *AnsiParser) hDispatch(params []string) error {
  method lDispatch (line 84) | func (ap *AnsiParser) lDispatch(params []string) error {
  function getEraseParam (line 92) | func getEraseParam(params []string) int {

FILE: vendor/github.com/Azure/go-ansiterm/parser_actions.go
  method collectParam (line 3) | func (ap *AnsiParser) collectParam() error {
  method collectInter (line 10) | func (ap *AnsiParser) collectInter() error {
  method escDispatch (line 17) | func (ap *AnsiParser) escDispatch() error {
  method csiDispatch (line 39) | func (ap *AnsiParser) csiDispatch() error {
  method print (line 108) | func (ap *AnsiParser) print() error {
  method clear (line 112) | func (ap *AnsiParser) clear() error {
  method execute (line 117) | func (ap *AnsiParser) execute() error {

FILE: vendor/github.com/Azure/go-ansiterm/states.go
  type stateID (line 3) | type stateID
  type state (line 5) | type state interface
  type baseState (line 13) | type baseState struct
    method Enter (line 18) | func (base baseState) Enter() error {
    method Exit (line 22) | func (base baseState) Exit() error {
    method Handle (line 26) | func (base baseState) Handle(b byte) (s state, e error) {
    method Name (line 44) | func (base baseState) Name() string {
    method Transition (line 48) | func (base baseState) Transition(s state) error {
  type dcsEntryState (line 65) | type dcsEntryState struct
  type errorState (line 69) | type errorState struct

FILE: vendor/github.com/Azure/go-ansiterm/utilities.go
  function sliceContains (line 7) | func sliceContains(bytes []byte, b byte) bool {
  function convertBytesToInteger (line 17) | func convertBytesToInteger(bytes []byte) int {

FILE: vendor/github.com/Azure/go-ansiterm/winterm/ansi.go
  constant VK_PRIOR (line 19) | VK_PRIOR    = 0x21
  constant VK_NEXT (line 20) | VK_NEXT     = 0x22
  constant VK_END (line 21) | VK_END      = 0x23
  constant VK_HOME (line 22) | VK_HOME     = 0x24
  constant VK_LEFT (line 23) | VK_LEFT     = 0x25
  constant VK_UP (line 24) | VK_UP       = 0x26
  constant VK_RIGHT (line 25) | VK_RIGHT    = 0x27
  constant VK_DOWN (line 26) | VK_DOWN     = 0x28
  constant VK_SELECT (line 27) | VK_SELECT   = 0x29
  constant VK_PRINT (line 28) | VK_PRINT    = 0x2A
  constant VK_EXECUTE (line 29) | VK_EXECUTE  = 0x2B
  constant VK_SNAPSHOT (line 30) | VK_SNAPSHOT = 0x2C
  constant VK_INSERT (line 31) | VK_INSERT   = 0x2D
  constant VK_DELETE (line 32) | VK_DELETE   = 0x2E
  constant VK_HELP (line 33) | VK_HELP     = 0x2F
  constant VK_F1 (line 34) | VK_F1       = 0x70
  constant VK_F2 (line 35) | VK_F2       = 0x71
  constant VK_F3 (line 36) | VK_F3       = 0x72
  constant VK_F4 (line 37) | VK_F4       = 0x73
  constant VK_F5 (line 38) | VK_F5       = 0x74
  constant VK_F6 (line 39) | VK_F6       = 0x75
  constant VK_F7 (line 40) | VK_F7       = 0x76
  constant VK_F8 (line 41) | VK_F8       = 0x77
  constant VK_F9 (line 42) | VK_F9       = 0x78
  constant VK_F10 (line 43) | VK_F10      = 0x79
  constant VK_F11 (line 44) | VK_F11      = 0x7A
  constant VK_F12 (line 45) | VK_F12      = 0x7B
  constant RIGHT_ALT_PRESSED (line 47) | RIGHT_ALT_PRESSED  = 0x0001
  constant LEFT_ALT_PRESSED (line 48) | LEFT_ALT_PRESSED   = 0x0002
  constant RIGHT_CTRL_PRESSED (line 49) | RIGHT_CTRL_PRESSED = 0x0004
  constant LEFT_CTRL_PRESSED (line 50) | LEFT_CTRL_PRESSED  = 0x0008
  constant SHIFT_PRESSED (line 51) | SHIFT_PRESSED      = 0x0010
  constant NUMLOCK_ON (line 52) | NUMLOCK_ON         = 0x0020
  constant SCROLLLOCK_ON (line 53) | SCROLLLOCK_ON      = 0x0040
  constant CAPSLOCK_ON (line 54) | CAPSLOCK_ON        = 0x0080
  constant ENHANCED_KEY (line 55) | ENHANCED_KEY       = 0x0100
  type ansiCommand (line 58) | type ansiCommand struct
    method paramAsSHORT (line 99) | func (ac *ansiCommand) paramAsSHORT(index int, defaultValue int16) int...
    method String (line 112) | func (ac *ansiCommand) String() string {
  function newAnsiCommand (line 65) | func newAnsiCommand(command []byte) *ansiCommand {
  function isAnsiCommandChar (line 121) | func isAnsiCommandChar(b byte) bool {
  function isXtermOscSequence (line 135) | func isXtermOscSequence(command []byte, current byte) bool {
  function isCharacterSelectionCmdChar (line 139) | func isCharacterSelectionCmdChar(b byte) bool {
  function bytesToHex (line 144) | func bytesToHex(b []byte) string {
  function ensureInRange (line 154) | func ensureInRange(n int16, min int16, max int16) int16 {
  function GetStdFile (line 164) | func GetStdFile(nFile int) (*os.File, uintptr) {

FILE: vendor/github.com/Azure/go-ansiterm/winterm/api.go
  constant ENABLE_PROCESSED_INPUT (line 52) | ENABLE_PROCESSED_INPUT        = 0x0001
  constant ENABLE_LINE_INPUT (line 53) | ENABLE_LINE_INPUT             = 0x0002
  constant ENABLE_ECHO_INPUT (line 54) | ENABLE_ECHO_INPUT             = 0x0004
  constant ENABLE_WINDOW_INPUT (line 55) | ENABLE_WINDOW_INPUT           = 0x0008
  constant ENABLE_MOUSE_INPUT (line 56) | ENABLE_MOUSE_INPUT            = 0x0010
  constant ENABLE_INSERT_MODE (line 57) | ENABLE_INSERT_MODE            = 0x0020
  constant ENABLE_QUICK_EDIT_MODE (line 58) | ENABLE_QUICK_EDIT_MODE        = 0x0040
  constant ENABLE_EXTENDED_FLAGS (line 59) | ENABLE_EXTENDED_FLAGS         = 0x0080
  constant ENABLE_AUTO_POSITION (line 60) | ENABLE_AUTO_POSITION          = 0x0100
  constant ENABLE_VIRTUAL_TERMINAL_INPUT (line 61) | ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200
  constant ENABLE_PROCESSED_OUTPUT (line 63) | ENABLE_PROCESSED_OUTPUT            = 0x0001
  constant ENABLE_WRAP_AT_EOL_OUTPUT (line 64) | ENABLE_WRAP_AT_EOL_OUTPUT          = 0x0002
  constant ENABLE_VIRTUAL_TERMINAL_PROCESSING (line 65) | ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
  constant DISABLE_NEWLINE_AUTO_RETURN (line 66) | DISABLE_NEWLINE_AUTO_RETURN        = 0x0008
  constant ENABLE_LVB_GRID_WORLDWIDE (line 67) | ENABLE_LVB_GRID_WORLDWIDE          = 0x0010
  constant FOREGROUND_BLUE (line 74) | FOREGROUND_BLUE      uint16 = 0x0001
  constant FOREGROUND_GREEN (line 75) | FOREGROUND_GREEN     uint16 = 0x0002
  constant FOREGROUND_RED (line 76) | FOREGROUND_RED       uint16 = 0x0004
  constant FOREGROUND_INTENSITY (line 77) | FOREGROUND_INTENSITY uint16 = 0x0008
  constant FOREGROUND_MASK (line 78) | FOREGROUND_MASK      uint16 = 0x000F
  constant BACKGROUND_BLUE (line 80) | BACKGROUND_BLUE      uint16 = 0x0010
  constant BACKGROUND_GREEN (line 81) | BACKGROUND_GREEN     uint16 = 0x0020
  constant BACKGROUND_RED (line 82) | BACKGROUND_RED       uint16 = 0x0040
  constant BACKGROUND_INTENSITY (line 83) | BACKGROUND_INTENSITY uint16 = 0x0080
  constant BACKGROUND_MASK (line 84) | BACKGROUND_MASK      uint16 = 0x00F0
  constant COMMON_LVB_MASK (line 86) | COMMON_LVB_MASK          uint16 = 0xFF00
  constant COMMON_LVB_REVERSE_VIDEO (line 87) | COMMON_LVB_REVERSE_VIDEO uint16 = 0x4000
  constant COMMON_LVB_UNDERSCORE (line 88) | COMMON_LVB_UNDERSCORE    uint16 = 0x8000
  constant KEY_EVENT (line 92) | KEY_EVENT                = 0x0001
  constant MOUSE_EVENT (line 93) | MOUSE_EVENT              = 0x0002
  constant WINDOW_BUFFER_SIZE_EVENT (line 94) | WINDOW_BUFFER_SIZE_EVENT = 0x0004
  constant MENU_EVENT (line 95) | MENU_EVENT               = 0x0008
  constant FOCUS_EVENT (line 96) | FOCUS_EVENT              = 0x0010
  constant WAIT_ABANDONED (line 99) | WAIT_ABANDONED = 0x00000080
  constant WAIT_FAILED (line 100) | WAIT_FAILED    = 0xFFFFFFFF
  constant WAIT_SIGNALED (line 101) | WAIT_SIGNALED  = 0x0000000
  constant WAIT_TIMEOUT (line 102) | WAIT_TIMEOUT   = 0x00000102
  constant WAIT_INFINITE (line 105) | WAIT_INFINITE       = 0xFFFFFFFF
  constant WAIT_ONE_SECOND (line 106) | WAIT_ONE_SECOND     = 1000
  constant WAIT_HALF_SECOND (line 107) | WAIT_HALF_SECOND    = 500
  constant WAIT_QUARTER_SECOND (line 108) | WAIT_QUARTER_SECOND = 250
  type CHAR_INFO (line 115) | type CHAR_INFO struct
  type CONSOLE_CURSOR_INFO (line 120) | type CONSOLE_CURSOR_INFO struct
  type CONSOLE_SCREEN_BUFFER_INFO (line 125) | type CONSOLE_SCREEN_BUFFER_INFO struct
    method String (line 293) | func (info CONSOLE_SCREEN_BUFFER_INFO) String() string {
  type COORD (line 133) | type COORD struct
    method String (line 297) | func (coord COORD) String() string {
  type SMALL_RECT (line 138) | type SMALL_RECT struct
    method String (line 301) | func (rect SMALL_RECT) String() string {
  type INPUT_RECORD (line 147) | type INPUT_RECORD struct
  type KEY_EVENT_RECORD (line 152) | type KEY_EVENT_RECORD struct
  type WINDOW_BUFFER_SIZE (line 161) | type WINDOW_BUFFER_SIZE struct
  function boolToBOOL (line 167) | func boolToBOOL(f bool) int32 {
  function GetConsoleCursorInfo (line 177) | func GetConsoleCursorInfo(handle uintptr, cursorInfo *CONSOLE_CURSOR_INF...
  function SetConsoleCursorInfo (line 184) | func SetConsoleCursorInfo(handle uintptr, cursorInfo *CONSOLE_CURSOR_INF...
  function SetConsoleCursorPosition (line 191) | func SetConsoleCursorPosition(handle uintptr, coord COORD) error {
  function GetConsoleMode (line 199) | func GetConsoleMode(handle uintptr) (mode uint32, err error) {
  function SetConsoleMode (line 206) | func SetConsoleMode(handle uintptr, mode uint32) error {
  function GetConsoleScreenBufferInfo (line 214) | func GetConsoleScreenBufferInfo(handle uintptr) (*CONSOLE_SCREEN_BUFFER_...
  function ScrollConsoleScreenBuffer (line 223) | func ScrollConsoleScreenBuffer(handle uintptr, scrollRect SMALL_RECT, cl...
  function SetConsoleScreenBufferSize (line 234) | func SetConsoleScreenBufferSize(handle uintptr, coord COORD) error {
  function SetConsoleTextAttribute (line 243) | func SetConsoleTextAttribute(handle uintptr, attribute uint16) error {
  function SetConsoleWindowInfo (line 252) | func SetConsoleWindowInfo(handle uintptr, isAbsolute bool, rect SMALL_RE...
  function WriteConsoleOutput (line 261) | func WriteConsoleOutput(handle uintptr, buffer []CHAR_INFO, bufferSize C...
  function ReadConsoleInput (line 271) | func ReadConsoleInput(handle uintptr, buffer []INPUT_RECORD, count *uint...
  function WaitForSingleObject (line 280) | func WaitForSingleObject(handle uintptr, msWait uint32) (bool, error) {
  function checkError (line 306) | func checkError(r1, r2 uintptr, err error) error {
  function coordToPointer (line 320) | func coordToPointer(c COORD) uintptr {
  function use (line 327) | func use(p interface{}) {}

FILE: vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go
  constant FOREGROUND_COLOR_MASK (line 8) | FOREGROUND_COLOR_MASK = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
  constant BACKGROUND_COLOR_MASK (line 9) | BACKGROUND_COLOR_MASK = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE
  function collectAnsiIntoWindowsAttributes (line 14) | func collectAnsiIntoWindowsAttributes(windowsMode uint16, inverted bool,...
  function invertAttributes (line 98) | func invertAttributes(windowsMode uint16) uint16 {

FILE: vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go
  constant horizontal (line 6) | horizontal = iota
  constant vertical (line 7) | vertical
  method getCursorWindow (line 10) | func (h *windowsAnsiEventHandler) getCursorWindow(info *CONSOLE_SCREEN_B...
  method setCursorPosition (line 30) | func (h *windowsAnsiEventHandler) setCursorPosition(position COORD, wind...
  method moveCursorVertical (line 41) | func (h *windowsAnsiEventHandler) moveCursorVertical(param int) error {
  method moveCursorHorizontal (line 45) | func (h *windowsAnsiEventHandler) moveCursorHorizontal(param int) error {
  method moveCursor (line 49) | func (h *windowsAnsiEventHandler) moveCursor(moveMode int, param int) er...
  method moveCursorLine (line 70) | func (h *windowsAnsiEventHandler) moveCursorLine(param int) error {
  method moveCursorColumn (line 87) | func (h *windowsAnsiEventHandler) moveCursorColumn(param int) error {

FILE: vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go
  method clearRange (line 7) | func (h *windowsAnsiEventHandler) clearRange(attributes uint16, fromCoor...
  method clearRect (line 61) | func (h *windowsAnsiEventHandler) clearRect(attributes uint16, fromCoord...

FILE: vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go
  method effectiveSr (line 6) | func (h *windowsAnsiEventHandler) effectiveSr(window SMALL_RECT) scrollR...
  method scrollUp (line 16) | func (h *windowsAnsiEventHandler) scrollUp(param int) error {
  method scrollDown (line 26) | func (h *windowsAnsiEventHandler) scrollDown(param int) error {
  method deleteLines (line 30) | func (h *windowsAnsiEventHandler) deleteLines(param int) error {
  method insertLines (line 47) | func (h *windowsAnsiEventHandler) insertLines(param int) error {
  method scroll (line 52) | func (h *windowsAnsiEventHandler) scroll(param int, sr scrollRegion, inf...
  method deleteCharacters (line 81) | func (h *windowsAnsiEventHandler) deleteCharacters(param int) error {
  method insertCharacters (line 89) | func (h *windowsAnsiEventHandler) insertCharacters(param int) error {
  method scrollLine (line 94) | func (h *windowsAnsiEventHandler) scrollLine(columns int, position COORD...

FILE: vendor/github.com/Azure/go-ansiterm/winterm/utilities.go
  function addInRange (line 7) | func addInRange(n int16, increment int16, min int16, max int16) int16 {

FILE: vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go
  type windowsAnsiEventHandler (line 14) | type windowsAnsiEventHandler struct
    method simulateLF (line 88) | func (h *windowsAnsiEventHandler) simulateLF(includeCR bool) (bool, er...
    method executeLF (line 154) | func (h *windowsAnsiEventHandler) executeLF() error {
    method Print (line 180) | func (h *windowsAnsiEventHandler) Print(b byte) error {
    method Execute (line 203) | func (h *windowsAnsiEventHandler) Execute(b byte) error {
    method CUU (line 285) | func (h *windowsAnsiEventHandler) CUU(param int) error {
    method CUD (line 294) | func (h *windowsAnsiEventHandler) CUD(param int) error {
    method CUF (line 303) | func (h *windowsAnsiEventHandler) CUF(param int) error {
    method CUB (line 312) | func (h *windowsAnsiEventHandler) CUB(param int) error {
    method CNL (line 321) | func (h *windowsAnsiEventHandler) CNL(param int) error {
    method CPL (line 330) | func (h *windowsAnsiEventHandler) CPL(param int) error {
    method CHA (line 339) | func (h *windowsAnsiEventHandler) CHA(param int) error {
    method VPA (line 348) | func (h *windowsAnsiEventHandler) VPA(param int) error {
    method CUP (line 364) | func (h *windowsAnsiEventHandler) CUP(row int, col int) error {
    method HVP (line 380) | func (h *windowsAnsiEventHandler) HVP(row int, col int) error {
    method DECTCEM (line 389) | func (h *windowsAnsiEventHandler) DECTCEM(visible bool) error {
    method DECOM (line 398) | func (h *windowsAnsiEventHandler) DECOM(enable bool) error {
    method DECCOLM (line 408) | func (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error {
    method ED (line 447) | func (h *windowsAnsiEventHandler) ED(param int) error {
    method EL (line 506) | func (h *windowsAnsiEventHandler) EL(param int) error {
    method IL (line 547) | func (h *windowsAnsiEventHandler) IL(param int) error {
    method DL (line 556) | func (h *windowsAnsiEventHandler) DL(param int) error {
    method ICH (line 565) | func (h *windowsAnsiEventHandler) ICH(param int) error {
    method DCH (line 574) | func (h *windowsAnsiEventHandler) DCH(param int) error {
    method SGR (line 583) | func (h *windowsAnsiEventHandler) SGR(params []int) error {
    method SU (line 622) | func (h *windowsAnsiEventHandler) SU(param int) error {
    method SD (line 631) | func (h *windowsAnsiEventHandler) SD(param int) error {
    method DA (line 640) | func (h *windowsAnsiEventHandler) DA(params []string) error {
    method DECSTBM (line 647) | func (h *windowsAnsiEventHandler) DECSTBM(top int, bottom int) error {
    method RI (line 662) | func (h *windowsAnsiEventHandler) RI() error {
    method IND (line 682) | func (h *windowsAnsiEventHandler) IND() error {
    method Flush (line 687) | func (h *windowsAnsiEventHandler) Flush() error {
    method getCurrentInfo (line 718) | func (h *windowsAnsiEventHandler) getCurrentInfo() (COORD, *CONSOLE_SC...
    method updatePos (line 730) | func (h *windowsAnsiEventHandler) updatePos(pos COORD) {
    method clearWrap (line 740) | func (h *windowsAnsiEventHandler) clearWrap() {
  type Option (line 31) | type Option
  function WithLogf (line 33) | func WithLogf(f func(string, ...interface{})) Option {
  function CreateWinEventHandler (line 39) | func CreateWinEventHandler(fd uintptr, file *os.File, opts ...Option) an...
  type scrollRegion (line 76) | type scrollRegion struct

FILE: vendor/github.com/Masterminds/semver/collection.go
  type Collection (line 6) | type Collection
    method Len (line 10) | func (c Collection) Len() int {
    method Less (line 16) | func (c Collection) Less(i, j int) bool {
    method Swap (line 22) | func (c Collection) Swap(i, j int) {

FILE: vendor/github.com/Masterminds/semver/constraints.go
  type Constraints (line 12) | type Constraints struct
    method Check (line 44) | func (cs Constraints) Check(v *Version) bool {
    method Validate (line 65) | func (cs Constraints) Validate(v *Version) (bool, []error) {
  function NewConstraint (line 18) | func NewConstraint(c string) (*Constraints, error) {
  function init (line 107) | func init() {
  type constraint (line 154) | type constraint struct
    method check (line 175) | func (c *constraint) check(v *Version) bool {
  type cfunc (line 179) | type cfunc
  function parseConstraint (line 181) | func parseConstraint(c string) (*constraint, error) {
  function constraintNotEqual (line 226) | func constraintNotEqual(v *Version, c *constraint) bool {
  function constraintGreaterThan (line 251) | func constraintGreaterThan(v *Version, c *constraint) bool {
  function constraintLessThan (line 263) | func constraintLessThan(v *Version, c *constraint) bool {
  function constraintGreaterThanEqual (line 284) | func constraintGreaterThanEqual(v *Version, c *constraint) bool {
  function constraintLessThanEqual (line 296) | func constraintLessThanEqual(v *Version, c *constraint) bool {
  function constraintTilde (line 323) | func constraintTilde(v *Version, c *constraint) bool {
  function constraintTildeOrEqual (line 355) | func constraintTildeOrEqual(v *Version, c *constraint) bool {
  function constraintCaret (line 377) | func constraintCaret(v *Version, c *constraint) bool {
  constant cvRegex (line 398) | cvRegex string = `v?([0-9|x|X|\*]+)(\.[0-9|x|X|\*]+)?(\.[0-9|x|X|\*]+)?` +
  function isX (line 402) | func isX(x string) bool {
  function rewriteRange (line 411) | func rewriteRange(i string) string {

FILE: vendor/github.com/Masterminds/semver/version.go
  constant SemVerRegex (line 31) | SemVerRegex string = `v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?` +
  constant ValidPrerelease (line 37) | ValidPrerelease string = `^([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*)$`
  type Version (line 40) | type Version struct
    method String (line 110) | func (v *Version) String() string {
    method Original (line 125) | func (v *Version) Original() string {
    method Major (line 130) | func (v *Version) Major() int64 {
    method Minor (line 135) | func (v *Version) Minor() int64 {
    method Patch (line 140) | func (v *Version) Patch() int64 {
    method Prerelease (line 145) | func (v *Version) Prerelease() string {
    method Metadata (line 150) | func (v *Version) Metadata() string {
    method originalVPrefix (line 155) | func (v *Version) originalVPrefix() string {
    method IncPatch (line 169) | func (v Version) IncPatch() Version {
    method IncMinor (line 192) | func (v Version) IncMinor() Version {
    method IncMajor (line 208) | func (v Version) IncMajor() Version {
    method SetPrerelease (line 221) | func (v Version) SetPrerelease(prerelease string) (Version, error) {
    method SetMetadata (line 233) | func (v Version) SetMetadata(metadata string) (Version, error) {
    method LessThan (line 244) | func (v *Version) LessThan(o *Version) bool {
    method GreaterThan (line 249) | func (v *Version) GreaterThan(o *Version) bool {
    method Equal (line 256) | func (v *Version) Equal(o *Version) bool {
    method Compare (line 265) | func (v *Version) Compare(o *Version) int {
    method UnmarshalJSON (line 296) | func (v *Version) UnmarshalJSON(b []byte) error {
    method MarshalJSON (line 316) | func (v *Version) MarshalJSON() ([]byte, error) {
  function init (line 47) | func init() {
  function NewVersion (line 54) | func NewVersion(v string) (*Version, error) {
  function MustParse (line 97) | func MustParse(v string) *Version {
  function compareSegment (line 320) | func compareSegment(v, o int64) int {
  function comparePrerelease (line 331) | func comparePrerelease(v, o string) int {
  function comparePrePart (line 374) | func comparePrePart(s, o string) int {

FILE: vendor/github.com/Masterminds/semver/version_fuzz.go
  function Fuzz (line 5) | func Fuzz(data []byte) int {

FILE: vendor/github.com/Microsoft/go-winio/backup.go
  constant BackupData (line 23) | BackupData = uint32(iota + 1)
  constant BackupEaData (line 24) | BackupEaData
  constant BackupSecurity (line 25) | BackupSecurity
  constant BackupAlternateData (line 26) | BackupAlternateData
  constant BackupLink (line 27) | BackupLink
  constant BackupPropertyData (line 28) | BackupPropertyData
  constant BackupObjectId (line 29) | BackupObjectId
  constant BackupReparseData (line 30) | BackupReparseData
  constant BackupSparseBlock (line 31) | BackupSparseBlock
  constant BackupTxfsData (line 32) | BackupTxfsData
  constant StreamSparseAttributes (line 36) | StreamSparseAttributes = uint32(8)
  constant WRITE_DAC (line 41) | WRITE_DAC              = windows.WRITE_DAC
  constant WRITE_OWNER (line 42) | WRITE_OWNER            = windows.WRITE_OWNER
  constant ACCESS_SYSTEM_SECURITY (line 43) | ACCESS_SYSTEM_SECURITY = windows.ACCESS_SYSTEM_SECURITY
  type BackupHeader (line 47) | type BackupHeader struct
  type win32StreamID (line 56) | type win32StreamID struct
  type BackupStreamReader (line 65) | type BackupStreamReader struct
    method Next (line 77) | func (r *BackupStreamReader) Next() (*BackupHeader, error) {
    method Read (line 120) | func (r *BackupStreamReader) Read(b []byte) (int, error) {
  function NewBackupStreamReader (line 71) | func NewBackupStreamReader(r io.Reader) *BackupStreamReader {
  type BackupStreamWriter (line 138) | type BackupStreamWriter struct
    method WriteHeader (line 149) | func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error {
    method Write (line 182) | func (w *BackupStreamWriter) Write(b []byte) (int, error) {
  function NewBackupStreamWriter (line 144) | func NewBackupStreamWriter(w io.Writer) *BackupStreamWriter {
  type BackupFileReader (line 192) | type BackupFileReader struct
    method Read (line 206) | func (r *BackupFileReader) Read(b []byte) (int, error) {
    method Close (line 221) | func (r *BackupFileReader) Close() error {
  function NewBackupFileReader (line 200) | func NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileRe...
  type BackupFileWriter (line 231) | type BackupFileWriter struct
    method Write (line 245) | func (w *BackupFileWriter) Write(b []byte) (int, error) {
    method Close (line 260) | func (w *BackupFileWriter) Close() error {
  function NewBackupFileWriter (line 239) | func NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWr...
  function OpenForBackup (line 273) | func OpenForBackup(path string, access uint32, share uint32, createmode ...

FILE: vendor/github.com/Microsoft/go-winio/ea.go
  type fileFullEaInformation (line 9) | type fileFullEaInformation struct
  type ExtendedAttribute (line 25) | type ExtendedAttribute struct
  function parseEa (line 31) | func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) {
  function DecodeExtendedAttributes (line 60) | func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err er...
  function writeEa (line 73) | func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error {
  function EncodeExtendedAttributes (line 123) | func EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error) {

FILE: vendor/github.com/Microsoft/go-winio/file.go
  type timeoutError (line 29) | type timeoutError struct
    method Error (line 31) | func (*timeoutError) Error() string   { return "i/o timeout" }
    method Timeout (line 32) | func (*timeoutError) Timeout() bool   { return true }
    method Temporary (line 33) | func (*timeoutError) Temporary() bool { return true }
  type timeoutChan (line 35) | type timeoutChan
  type ioResult (line 41) | type ioResult struct
  type ioOperation (line 47) | type ioOperation struct
  function initIO (line 52) | func initIO() {
  type win32File (line 63) | type win32File struct
    method closeHandle (line 114) | func (f *win32File) closeHandle() {
    method Close (line 131) | func (f *win32File) Close() error {
    method IsClosed (line 137) | func (f *win32File) IsClosed() bool {
    method prepareIO (line 143) | func (f *win32File) prepareIO() (*ioOperation, error) {
    method asyncIO (line 174) | func (f *win32File) asyncIO(c *ioOperation, d *deadlineHandler, bytes ...
    method Read (line 221) | func (f *win32File) Read(b []byte) (int, error) {
    method Write (line 247) | func (f *win32File) Write(b []byte) (int, error) {
    method SetReadDeadline (line 265) | func (f *win32File) SetReadDeadline(deadline time.Time) error {
    method SetWriteDeadline (line 269) | func (f *win32File) SetWriteDeadline(deadline time.Time) error {
    method Flush (line 273) | func (f *win32File) Flush() error {
    method Fd (line 277) | func (f *win32File) Fd() uintptr {
  type deadlineHandler (line 73) | type deadlineHandler struct
    method set (line 281) | func (d *deadlineHandler) set(deadline time.Time) error {
  function makeWin32File (line 82) | func makeWin32File(h windows.Handle) (*win32File, error) {
  function MakeOpenFile (line 99) | func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) {
  function NewOpenFile (line 103) | func NewOpenFile(h windows.Handle) (io.ReadWriteCloser, error) {
  function ioCompletionProcessor (line 157) | func ioCompletionProcessor(h windows.Handle) {

FILE: vendor/github.com/Microsoft/go-winio/fileinfo.go
  type FileBasicInfo (line 15) | type FileBasicInfo struct
  type alignedFileBasicInfo (line 24) | type alignedFileBasicInfo struct
  function GetFileBasicInfo (line 31) | func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) {
  function SetFileBasicInfo (line 48) | func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error {
  type FileStandardInfo (line 67) | type FileStandardInfo struct
  function GetFileStandardInfo (line 74) | func GetFileStandardInfo(f *os.File) (*FileStandardInfo, error) {
  type FileIDInfo (line 88) | type FileIDInfo struct
  function GetFileID (line 94) | func GetFileID(f *os.File) (*FileIDInfo, error) {

FILE: vendor/github.com/Microsoft/go-winio/hvsock.go
  constant afHVSock (line 22) | afHVSock = 34
  function HvsockGUIDWildcard (line 28) | func HvsockGUIDWildcard() guid.GUID { // 00000000-0000-0000-0000-0000000...
  function HvsockGUIDBroadcast (line 33) | func HvsockGUIDBroadcast() guid.GUID { // ffffffff-ffff-ffff-ffff-ffffff...
  function HvsockGUIDLoopback (line 43) | func HvsockGUIDLoopback() guid.GUID { // e0e16197-dd56-4a10-9195-5ee7a15...
  function HvsockGUIDSiloHost (line 55) | func HvsockGUIDSiloHost() guid.GUID { // 36bd0c5c-7276-4223-88ba-7d03b65...
  function HvsockGUIDChildren (line 65) | func HvsockGUIDChildren() guid.GUID { // 90db8b89-0d35-4f79-8ce9-49ea0ac...
  function HvsockGUIDParent (line 80) | func HvsockGUIDParent() guid.GUID { // a42e7cda-d03f-480c-9cc2-a4de20abb878
  function hvsockVsockServiceTemplate (line 90) | func hvsockVsockServiceTemplate() guid.GUID { // 00000000-facb-11e6-bd58...
  type HvsockAddr (line 99) | type HvsockAddr struct
    method Network (line 114) | func (*HvsockAddr) Network() string {
    method String (line 118) | func (addr *HvsockAddr) String() string {
    method raw (line 129) | func (addr *HvsockAddr) raw() rawHvsockAddr {
    method fromRaw (line 137) | func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) {
  type rawHvsockAddr (line 104) | type rawHvsockAddr struct
    method Sockaddr (line 146) | func (r *rawHvsockAddr) Sockaddr() (unsafe.Pointer, int32, error) {
    method FromBytes (line 151) | func (r *rawHvsockAddr) FromBytes(b []byte) error {
  function VsockServiceID (line 123) | func VsockServiceID(port uint32) guid.GUID {
  type HvsockListener (line 167) | type HvsockListener struct
    method opErr (line 223) | func (l *HvsockListener) opErr(op string, err error) error {
    method Addr (line 228) | func (l *HvsockListener) Addr() net.Addr {
    method Accept (line 233) | func (l *HvsockListener) Accept() (_ net.Conn, err error) {
    method Close (line 284) | func (l *HvsockListener) Close() error {
  type HvsockConn (line 175) | type HvsockConn struct
    method opErr (line 443) | func (conn *HvsockConn) opErr(op string, err error) error {
    method Read (line 451) | func (conn *HvsockConn) Read(b []byte) (int, error) {
    method Write (line 473) | func (conn *HvsockConn) Write(b []byte) (int, error) {
    method write (line 486) | func (conn *HvsockConn) write(b []byte) (int, error) {
    method Close (line 507) | func (conn *HvsockConn) Close() error {
    method IsClosed (line 511) | func (conn *HvsockConn) IsClosed() bool {
    method shutdown (line 516) | func (conn *HvsockConn) shutdown(how int) error {
    method CloseRead (line 534) | func (conn *HvsockConn) CloseRead() error {
    method CloseWrite (line 544) | func (conn *HvsockConn) CloseWrite() error {
    method LocalAddr (line 553) | func (conn *HvsockConn) LocalAddr() net.Addr {
    method RemoteAddr (line 558) | func (conn *HvsockConn) RemoteAddr() net.Addr {
    method SetDeadline (line 563) | func (conn *HvsockConn) SetDeadline(t time.Time) error {
    method SetReadDeadline (line 575) | func (conn *HvsockConn) SetReadDeadline(t time.Time) error {
    method SetWriteDeadline (line 580) | func (conn *HvsockConn) SetWriteDeadline(t time.Time) error {
  function newHVSocket (line 182) | func newHVSocket() (*win32File, error) {
  function ListenHvsock (line 197) | func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) {
  type HvsockDialer (line 289) | type HvsockDialer struct
    method Dial (line 315) | func (d *HvsockDialer) Dial(ctx context.Context, addr *HvsockAddr) (co...
    method redialWait (line 406) | func (d *HvsockDialer) redialWait(ctx context.Context) (err error) {
  function Dial (line 306) | func Dial(ctx context.Context, addr *HvsockAddr) (conn *HvsockConn, err ...
  function canRedial (line 432) | func canRedial(err error) bool {

FILE: vendor/github.com/Microsoft/go-winio/internal/fs/fs.go
  constant NullHandle (line 16) | NullHandle windows.Handle = 0
  constant FILE_ANY_ACCESS (line 50) | FILE_ANY_ACCESS AccessMask = 0
  constant GENERIC_READ (line 52) | GENERIC_READ           AccessMask = 0x8000_0000
  constant GENERIC_WRITE (line 53) | GENERIC_WRITE          AccessMask = 0x4000_0000
  constant GENERIC_EXECUTE (line 54) | GENERIC_EXECUTE        AccessMask = 0x2000_0000
  constant GENERIC_ALL (line 55) | GENERIC_ALL            AccessMask = 0x1000_0000
  constant ACCESS_SYSTEM_SECURITY (line 56) | ACCESS_SYSTEM_SECURITY AccessMask = 0x0100_0000
  constant FILE_READ_DATA (line 61) | FILE_READ_DATA      AccessMask = (0x0001)
  constant FILE_LIST_DIRECTORY (line 62) | FILE_LIST_DIRECTORY AccessMask = (0x0001)
  constant FILE_WRITE_DATA (line 64) | FILE_WRITE_DATA AccessMask = (0x0002)
  constant FILE_ADD_FILE (line 65) | FILE_ADD_FILE   AccessMask = (0x0002)
  constant FILE_APPEND_DATA (line 67) | FILE_APPEND_DATA          AccessMask = (0x0004)
  constant FILE_ADD_SUBDIRECTORY (line 68) | FILE_ADD_SUBDIRECTORY     AccessMask = (0x0004)
  constant FILE_CREATE_PIPE_INSTANCE (line 69) | FILE_CREATE_PIPE_INSTANCE AccessMask = (0x0004)
  constant FILE_READ_EA (line 71) | FILE_READ_EA         AccessMask = (0x0008)
  constant FILE_READ_PROPERTIES (line 72) | FILE_READ_PROPERTIES AccessMask = FILE_READ_EA
  constant FILE_WRITE_EA (line 74) | FILE_WRITE_EA         AccessMask = (0x0010)
  constant FILE_WRITE_PROPERTIES (line 75) | FILE_WRITE_PROPERTIES AccessMask = FILE_WRITE_EA
  constant FILE_EXECUTE (line 77) | FILE_EXECUTE  AccessMask = (0x0020)
  constant FILE_TRAVERSE (line 78) | FILE_TRAVERSE AccessMask = (0x0020)
  constant FILE_DELETE_CHILD (line 80) | FILE_DELETE_CHILD AccessMask = (0x0040)
  constant FILE_READ_ATTRIBUTES (line 82) | FILE_READ_ATTRIBUTES AccessMask = (0x0080)
  constant FILE_WRITE_ATTRIBUTES (line 84) | FILE_WRITE_ATTRIBUTES AccessMask = (0x0100)
  constant FILE_ALL_ACCESS (line 86) | FILE_ALL_ACCESS      AccessMask = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZ...
  constant FILE_GENERIC_READ (line 87) | FILE_GENERIC_READ    AccessMask = (STANDARD_RIGHTS_READ | FILE_READ_DATA...
  constant FILE_GENERIC_WRITE (line 88) | FILE_GENERIC_WRITE   AccessMask = (STANDARD_RIGHTS_WRITE | FILE_WRITE_DA...
  constant FILE_GENERIC_EXECUTE (line 89) | FILE_GENERIC_EXECUTE AccessMask = (STANDARD_RIGHTS_EXECUTE | FILE_READ_A...
  constant SPECIFIC_RIGHTS_ALL (line 91) | SPECIFIC_RIGHTS_ALL AccessMask = 0x0000FFFF
  constant DELETE (line 96) | DELETE       AccessMask = 0x0001_0000
  constant READ_CONTROL (line 97) | READ_CONTROL AccessMask = 0x0002_0000
  constant WRITE_DAC (line 98) | WRITE_DAC    AccessMask = 0x0004_0000
  constant WRITE_OWNER (line 99) | WRITE_OWNER  AccessMask = 0x0008_0000
  constant SYNCHRONIZE (line 100) | SYNCHRONIZE  AccessMask = 0x0010_0000
  constant STANDARD_RIGHTS_REQUIRED (line 102) | STANDARD_RIGHTS_REQUIRED AccessMask = 0x000F_0000
  constant STANDARD_RIGHTS_READ (line 104) | STANDARD_RIGHTS_READ    AccessMask = READ_CONTROL
  constant STANDARD_RIGHTS_WRITE (line 105) | STANDARD_RIGHTS_WRITE   AccessMask = READ_CONTROL
  constant STANDARD_RIGHTS_EXECUTE (line 106) | STANDARD_RIGHTS_EXECUTE AccessMask = READ_CONTROL
  constant STANDARD_RIGHTS_ALL (line 108) | STANDARD_RIGHTS_ALL AccessMask = 0x001F_0000
  type FileShareMode (line 111) | type FileShareMode
  constant FILE_SHARE_NONE (line 115) | FILE_SHARE_NONE        FileShareMode = 0x00
  constant FILE_SHARE_READ (line 116) | FILE_SHARE_READ        FileShareMode = 0x01
  constant FILE_SHARE_WRITE (line 117) | FILE_SHARE_WRITE       FileShareMode = 0x02
  constant FILE_SHARE_DELETE (line 118) | FILE_SHARE_DELETE      FileShareMode = 0x04
  constant FILE_SHARE_VALID_FLAGS (line 119) | FILE_SHARE_VALID_FLAGS FileShareMode = 0x07
  type FileCreationDisposition (line 122) | type FileCreationDisposition
  constant CREATE_NEW (line 128) | CREATE_NEW        FileCreationDisposition = 0x01
  constant CREATE_ALWAYS (line 129) | CREATE_ALWAYS     FileCreationDisposition = 0x02
  constant OPEN_EXISTING (line 130) | OPEN_EXISTING     FileCreationDisposition = 0x03
  constant OPEN_ALWAYS (line 131) | OPEN_ALWAYS       FileCreationDisposition = 0x04
  constant TRUNCATE_EXISTING (line 132) | TRUNCATE_EXISTING FileCreationDisposition = 0x05
  type NTFileCreationDisposition (line 136) | type NTFileCreationDisposition
  constant FILE_SUPERSEDE (line 142) | FILE_SUPERSEDE           NTFileCreationDisposition = 0x00
  constant FILE_OPEN (line 143) | FILE_OPEN                NTFileCreationDisposition = 0x01
  constant FILE_CREATE (line 144) | FILE_CREATE              NTFileCreationDisposition = 0x02
  constant FILE_OPEN_IF (line 145) | FILE_OPEN_IF             NTFileCreationDisposition = 0x03
  constant FILE_OVERWRITE (line 146) | FILE_OVERWRITE           NTFileCreationDisposition = 0x04
  constant FILE_OVERWRITE_IF (line 147) | FILE_OVERWRITE_IF        NTFileCreationDisposition = 0x05
  constant FILE_MAXIMUM_DISPOSITION (line 148) | FILE_MAXIMUM_DISPOSITION NTFileCreationDisposition = 0x05
  type FileFlagOrAttribute (line 155) | type FileFlagOrAttribute
  constant FILE_FLAG_WRITE_THROUGH (line 161) | FILE_FLAG_WRITE_THROUGH       FileFlagOrAttribute = 0x8000_0000
  constant FILE_FLAG_OVERLAPPED (line 162) | FILE_FLAG_OVERLAPPED          FileFlagOrAttribute = 0x4000_0000
  constant FILE_FLAG_NO_BUFFERING (line 163) | FILE_FLAG_NO_BUFFERING        FileFlagOrAttribute = 0x2000_0000
  constant FILE_FLAG_RANDOM_ACCESS (line 164) | FILE_FLAG_RANDOM_ACCESS       FileFlagOrAttribute = 0x1000_0000
  constant FILE_FLAG_SEQUENTIAL_SCAN (line 165) | FILE_FLAG_SEQUENTIAL_SCAN     FileFlagOrAttribute = 0x0800_0000
  constant FILE_FLAG_DELETE_ON_CLOSE (line 166) | FILE_FLAG_DELETE_ON_CLOSE     FileFlagOrAttribute = 0x0400_0000
  constant FILE_FLAG_BACKUP_SEMANTICS (line 167) | FILE_FLAG_BACKUP_SEMANTICS    FileFlagOrAttribute = 0x0200_0000
  constant FILE_FLAG_POSIX_SEMANTICS (line 168) | FILE_FLAG_POSIX_SEMANTICS     FileFlagOrAttribute = 0x0100_0000
  constant FILE_FLAG_OPEN_REPARSE_POINT (line 169) | FILE_FLAG_OPEN_REPARSE_POINT  FileFlagOrAttribute = 0x0020_0000
  constant FILE_FLAG_OPEN_NO_RECALL (line 170) | FILE_FLAG_OPEN_NO_RECALL      FileFlagOrAttribute = 0x0010_0000
  constant FILE_FLAG_FIRST_PIPE_INSTANCE (line 171) | FILE_FLAG_FIRST_PIPE_INSTANCE FileFlagOrAttribute = 0x0008_0000
  type NTCreateOptions (line 179) | type NTCreateOptions
  constant FILE_DIRECTORY_FILE (line 185) | FILE_DIRECTORY_FILE            NTCreateOptions = 0x0000_0001
  constant FILE_WRITE_THROUGH (line 186) | FILE_WRITE_THROUGH             NTCreateOptions = 0x0000_0002
  constant FILE_SEQUENTIAL_ONLY (line 187) | FILE_SEQUENTIAL_ONLY           NTCreateOptions = 0x0000_0004
  constant FILE_NO_INTERMEDIATE_BUFFERING (line 188) | FILE_NO_INTERMEDIATE_BUFFERING NTCreateOptions = 0x0000_0008
  constant FILE_SYNCHRONOUS_IO_ALERT (line 190) | FILE_SYNCHRONOUS_IO_ALERT    NTCreateOptions = 0x0000_0010
  constant FILE_SYNCHRONOUS_IO_NONALERT (line 191) | FILE_SYNCHRONOUS_IO_NONALERT NTCreateOptions = 0x0000_0020
  constant FILE_NON_DIRECTORY_FILE (line 192) | FILE_NON_DIRECTORY_FILE      NTCreateOptions = 0x0000_0040
  constant FILE_CREATE_TREE_CONNECTION (line 193) | FILE_CREATE_TREE_CONNECTION  NTCreateOptions = 0x0000_0080
  constant FILE_COMPLETE_IF_OPLOCKED (line 195) | FILE_COMPLETE_IF_OPLOCKED NTCreateOptions = 0x0000_0100
  constant FILE_NO_EA_KNOWLEDGE (line 196) | FILE_NO_EA_KNOWLEDGE      NTCreateOptions = 0x0000_0200
  constant FILE_DISABLE_TUNNELING (line 197) | FILE_DISABLE_TUNNELING    NTCreateOptions = 0x0000_0400
  constant FILE_RANDOM_ACCESS (line 198) | FILE_RANDOM_ACCESS        NTCreateOptions = 0x0000_0800
  constant FILE_DELETE_ON_CLOSE (line 200) | FILE_DELETE_ON_CLOSE        NTCreateOptions = 0x0000_1000
  constant FILE_OPEN_BY_FILE_ID (line 201) | FILE_OPEN_BY_FILE_ID        NTCreateOptions = 0x0000_2000
  constant FILE_OPEN_FOR_BACKUP_INTENT (line 202) | FILE_OPEN_FOR_BACKUP_INTENT NTCreateOptions = 0x0000_4000
  constant FILE_NO_COMPRESSION (line 203) | FILE_NO_COMPRESSION         NTCreateOptions = 0x0000_8000
  constant SECURITY_ANONYMOUS (line 212) | SECURITY_ANONYMOUS      FileSQSFlag = FileSQSFlag(SecurityAnonymous << 16)
  constant SECURITY_IDENTIFICATION (line 213) | SECURITY_IDENTIFICATION FileSQSFlag = FileSQSFlag(SecurityIdentification...
  constant SECURITY_IMPERSONATION (line 214) | SECURITY_IMPERSONATION  FileSQSFlag = FileSQSFlag(SecurityImpersonation ...
  constant SECURITY_DELEGATION (line 215) | SECURITY_DELEGATION     FileSQSFlag = FileSQSFlag(SecurityDelegation << 16)
  constant SECURITY_SQOS_PRESENT (line 217) | SECURITY_SQOS_PRESENT     FileSQSFlag = 0x0010_0000
  constant SECURITY_VALID_SQOS_FLAGS (line 218) | SECURITY_VALID_SQOS_FLAGS FileSQSFlag = 0x001F_0000
  type GetFinalPathFlag (line 224) | type GetFinalPathFlag
  constant GetFinalPathDefaultFlag (line 228) | GetFinalPathDefaultFlag GetFinalPathFlag = 0x0
  constant FILE_NAME_NORMALIZED (line 230) | FILE_NAME_NORMALIZED GetFinalPathFlag = 0x0
  constant FILE_NAME_OPENED (line 231) | FILE_NAME_OPENED     GetFinalPathFlag = 0x8
  constant VOLUME_NAME_DOS (line 233) | VOLUME_NAME_DOS  GetFinalPathFlag = 0x0
  constant VOLUME_NAME_GUID (line 234) | VOLUME_NAME_GUID GetFinalPathFlag = 0x1
  constant VOLUME_NAME_NT (line 235) | VOLUME_NAME_NT   GetFinalPathFlag = 0x2
  constant VOLUME_NAME_NONE (line 236) | VOLUME_NAME_NONE GetFinalPathFlag = 0x4
  function GetFinalPathNameByHandle (line 244) | func GetFinalPathNameByHandle(h windows.Handle, flags GetFinalPathFlag) ...

FILE: vendor/github.com/Microsoft/go-winio/internal/fs/security.go
  type SecurityImpersonationLevel (line 4) | type SecurityImpersonationLevel
  constant SecurityAnonymous (line 8) | SecurityAnonymous      SecurityImpersonationLevel = 0
  constant SecurityIdentification (line 9) | SecurityIdentification SecurityImpersonationLevel = 1
  constant SecurityImpersonation (line 10) | SecurityImpersonation  SecurityImpersonationLevel = 2
  constant SecurityDelegation (line 11) | SecurityDelegation     SecurityImpersonationLevel = 3

FILE: vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go
  constant errnoERROR_IO_PENDING (line 19) | errnoERROR_IO_PENDING = 997
  function errnoErr (line 29) | func errnoErr(e syscall.Errno) error {
  function CreateFile (line 45) | func CreateFile(name string, access AccessMask, mode FileShareMode, sa *...
  function _CreateFile (line 54) | func _CreateFile(name *uint16, access AccessMask, mode FileShareMode, sa...

FILE: vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.go
  type RawSockaddr (line 13) | type RawSockaddr interface

FILE: vendor/github.com/Microsoft/go-winio/internal/socket/socket.go
  constant socketError (line 23) | socketError = uintptr(^uint32(0))
  function GetSockName (line 38) | func GetSockName(s windows.Handle, rsa RawSockaddr) error {
  function GetPeerName (line 52) | func GetPeerName(s windows.Handle, rsa RawSockaddr) error {
  function Bind (line 61) | func Bind(s windows.Handle, rsa RawSockaddr) (err error) {
  type runtimeFunc (line 79) | type runtimeFunc struct
    method Load (line 86) | func (f *runtimeFunc) Load() error {
  function ConnectEx (line 122) | func ConnectEx(
  function connectEx (line 150) | func connectEx(

FILE: vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go
  constant errnoERROR_IO_PENDING (line 19) | errnoERROR_IO_PENDING = 997
  function errnoErr (line 29) | func errnoErr(e syscall.Errno) error {
  function bind (line 47) | func bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err err...
  function getpeername (line 55) | func getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) ...
  function getsockname (line 63) | func getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) ...

FILE: vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go
  constant MinWStringCap (line 13) | MinWStringCap = 310
  function newBuffer (line 25) | func newBuffer() []uint16 { return *(pathPool.Get().(*[]uint16)) }
  function freeBuffer (line 29) | func freeBuffer(b []uint16) { pathPool.Put(&b) }
  type WString (line 36) | type WString struct
    method Free (line 54) | func (b *WString) Free() {
    method ResizeTo (line 64) | func (b *WString) ResizeTo(c uint32) uint32 {
    method Buffer (line 88) | func (b *WString) Buffer() []uint16 {
    method Pointer (line 97) | func (b *WString) Pointer() *uint16 {
    method String (line 107) | func (b *WString) String() string {
    method Cap (line 124) | func (b *WString) Cap() uint32 {
    method cap (line 131) | func (b *WString) cap() uint32 { return uint32(cap(b.b)) }
    method empty (line 132) | func (b *WString) empty() bool { return b == nil || b.cap() == 0 }
  function NewWString (line 48) | func NewWString() *WString {

FILE: vendor/github.com/Microsoft/go-winio/pipe.go
  type PipeConn (line 32) | type PipeConn interface
  type ioStatusBlock (line 46) | type ioStatusBlock struct
  type objectAttributes (line 60) | type objectAttributes struct
  type unicodeString (line 69) | type unicodeString struct
  type securityDescriptor (line 86) | type securityDescriptor struct
  type ntStatus (line 96) | type ntStatus
    method Err (line 98) | func (status ntStatus) Err() error {
  type win32Pipe (line 112) | type win32Pipe struct
    method LocalAddr (line 127) | func (f *win32Pipe) LocalAddr() net.Addr {
    method RemoteAddr (line 131) | func (f *win32Pipe) RemoteAddr() net.Addr {
    method SetDeadline (line 135) | func (f *win32Pipe) SetDeadline(t time.Time) error {
    method Disconnect (line 142) | func (f *win32Pipe) Disconnect() error {
  type win32MessageBytePipe (line 119) | type win32MessageBytePipe struct
    method CloseWrite (line 147) | func (f *win32MessageBytePipe) CloseWrite() error {
    method Write (line 165) | func (f *win32MessageBytePipe) Write(b []byte) (int, error) {
    method Read (line 177) | func (f *win32MessageBytePipe) Read(b []byte) (int, error) {
  type pipeAddress (line 125) | type pipeAddress
    method Network (line 198) | func (pipeAddress) Network() string {
    method String (line 202) | func (s pipeAddress) String() string {
  function tryDialPipe (line 207) | func tryDialPipe(ctx context.Context, path *string, access fs.AccessMask...
  function DialPipe (line 237) | func DialPipe(path string, timeout *time.Duration) (net.Conn, error) {
  function DialPipeContext (line 255) | func DialPipeContext(ctx context.Context, path string) (net.Conn, error) {
  type PipeImpLevel (line 261) | type PipeImpLevel
  constant PipeImpLevelAnonymous (line 264) | PipeImpLevelAnonymous      = PipeImpLevel(fs.SECURITY_ANONYMOUS)
  constant PipeImpLevelIdentification (line 265) | PipeImpLevelIdentification = PipeImpLevel(fs.SECURITY_IDENTIFICATION)
  constant PipeImpLevelImpersonation (line 266) | PipeImpLevelImpersonation  = PipeImpLevel(fs.SECURITY_IMPERSONATION)
  constant PipeImpLevelDelegation (line 267) | PipeImpLevelDelegation     = PipeImpLevel(fs.SECURITY_DELEGATION)
  function DialPipeAccess (line 272) | func DialPipeAccess(ctx context.Context, path string, access uint32) (ne...
  function DialPipeAccessImpLevel (line 279) | func DialPipeAccessImpLevel(ctx context.Context, path string, access uin...
  type acceptResponse (line 309) | type acceptResponse struct
  type win32PipeListener (line 314) | type win32PipeListener struct
    method makeServerPipe (line 416) | func (l *win32PipeListener) makeServerPipe() (*win32File, error) {
    method makeConnectedServerPipe (line 429) | func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, err...
    method listenerRoutine (line 459) | func (l *win32PipeListener) listenerRoutine() {
    method Accept (line 555) | func (l *win32PipeListener) Accept() (net.Conn, error) {
    method Close (line 575) | func (l *win32PipeListener) Close() error {
    method Addr (line 584) | func (l *win32PipeListener) Addr() net.Addr {
  function makeServerPipeHandle (line 323) | func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first b...
  type PipeConfig (line 489) | type PipeConfig struct
  function ListenPipe (line 510) | func ListenPipe(path string, c *PipeConfig) (net.Listener, error) {
  function connectPipe (line 540) | func connectPipe(p *win32File) error {

FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go
  type Variant (line 21) | type Variant
  constant VariantUnknown (line 27) | VariantUnknown Variant = iota
  constant VariantNCS (line 28) | VariantNCS
  constant VariantRFC4122 (line 29) | VariantRFC4122
  constant VariantMicrosoft (line 30) | VariantMicrosoft
  constant VariantFuture (line 31) | VariantFuture
  type Version (line 37) | type Version
    method String (line 39) | func (v Version) String() string {
  function NewV4 (line 47) | func NewV4() (GUID, error) {
  function NewV5 (line 67) | func NewV5(namespace GUID, name []byte) (GUID, error) {
  function fromArray (line 83) | func fromArray(b [16]byte, order binary.ByteOrder) GUID {
  method toArray (line 92) | func (g GUID) toArray(order binary.ByteOrder) [16]byte {
  function FromArray (line 102) | func FromArray(b [16]byte) GUID {
  method ToArray (line 108) | func (g GUID) ToArray() [16]byte {
  function FromWindowsArray (line 113) | func FromWindowsArray(b [16]byte) GUID {
  method ToWindowsArray (line 119) | func (g GUID) ToWindowsArray() [16]byte {
  method String (line 123) | func (g GUID) String() string {
  function FromString (line 136) | func FromString(s string) (GUID, error) {
  method setVariant (line 175) | func (g *GUID) setVariant(v Variant) {
  method Variant (line 195) | func (g GUID) Variant() Variant {
  method setVersion (line 209) | func (g *GUID) setVersion(v Version) {
  method Version (line 214) | func (g GUID) Version() Version {
  method MarshalText (line 219) | func (g GUID) MarshalText() ([]byte, error) {
  method UnmarshalText (line 225) | func (g *GUID) UnmarshalText(text []byte) error {

FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go
  type GUID (line 11) | type GUID struct

FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go
  type GUID (line 13) | type GUID

FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.go
  function _ (line 7) | func _() {
  constant _Variant_name (line 18) | _Variant_name = "UnknownNCSRFC 4122MicrosoftFuture"
  method String (line 22) | func (i Variant) String() string {

FILE: vendor/github.com/Microsoft/go-winio/privilege.go
  constant SE_PRIVILEGE_ENABLED (line 28) | SE_PRIVILEGE_ENABLED = windows.SE_PRIVILEGE_ENABLED
  constant ERROR_NOT_ALL_ASSIGNED (line 31) | ERROR_NOT_ALL_ASSIGNED windows.Errno = windows.ERROR_NOT_ALL_ASSIGNED
  constant SeBackupPrivilege (line 33) | SeBackupPrivilege   = "SeBackupPrivilege"
  constant SeRestorePrivilege (line 34) | SeRestorePrivilege  = "SeRestorePrivilege"
  constant SeSecurityPrivilege (line 35) | SeSecurityPrivilege = "SeSecurityPrivilege"
  type PrivilegeError (line 44) | type PrivilegeError struct
    method Error (line 48) | func (e *PrivilegeError) Error() string {
  function RunWithPrivilege (line 65) | func RunWithPrivilege(name string, fn func() error) error {
  function RunWithPrivileges (line 70) | func RunWithPrivileges(names []string, fn func() error) error {
  function mapPrivileges (line 89) | func mapPrivileges(names []string) ([]uint64, error) {
  function EnableProcessPrivileges (line 108) | func EnableProcessPrivileges(names []string) error {
  function DisableProcessPrivileges (line 113) | func DisableProcessPrivileges(names []string) error {
  function enableDisableProcessPrivilege (line 117) | func enableDisableProcessPrivilege(names []string, action uint32) error {
  function adjustPrivileges (line 134) | func adjustPrivileges(token windows.Token, privileges []uint64, action u...
  function getPrivilegeName (line 153) | func getPrivilegeName(luid uint64) string {
  function newThreadToken (line 172) | func newThreadToken() (windows.Token, error) {
  function releaseThreadToken (line 190) | func releaseThreadToken(h windows.Token) {

FILE: vendor/github.com/Microsoft/go-winio/reparse.go
  constant reparseTagMountPoint (line 16) | reparseTagMountPoint = 0xA0000003
  constant reparseTagSymlink (line 17) | reparseTagSymlink    = 0xA000000C
  type reparseDataBuffer (line 20) | type reparseDataBuffer struct
  type ReparsePoint (line 31) | type ReparsePoint struct
  type UnsupportedReparsePointError (line 38) | type UnsupportedReparsePointError struct
    method Error (line 42) | func (e *UnsupportedReparsePointError) Error() string {
  function DecodeReparsePoint (line 48) | func DecodeReparsePoint(b []byte) (*ReparsePoint, error) {
  function DecodeReparsePointData (line 53) | func DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error) {
  function isDriveLetter (line 75) | func isDriveLetter(c byte) bool {
  function EncodeReparsePoint (line 81) | func EncodeReparsePoint(rp *ReparsePoint) []byte {

FILE: vendor/github.com/Microsoft/go-winio/sd.go
  type AccountLookupError (line 19) | type AccountLookupError struct
    method Error (line 24) | func (e *AccountLookupError) Error() string {
    method Unwrap (line 40) | func (e *AccountLookupError) Unwrap() error { return e.Err }
  type SddlConversionError (line 42) | type SddlConversionError struct
    method Error (line 47) | func (e *SddlConversionError) Error() string {
    method Unwrap (line 51) | func (e *SddlConversionError) Unwrap() error { return e.Err }
  function LookupSidByName (line 56) | func LookupSidByName(name string) (sid string, err error) {
  function LookupNameBySid (line 85) | func LookupNameBySid(sid string) (name string, err error) {
  function SddlToSecurityDescriptor (line 118) | func SddlToSecurityDescriptor(sddl string) ([]byte, error) {
  function SecurityDescriptorToSddl (line 127) | func SecurityDescriptorToSddl(sd []byte) (string, error) {

FILE: vendor/github.com/Microsoft/go-winio/zsyscall_windows.go
  constant errnoERROR_IO_PENDING (line 19) | errnoERROR_IO_PENDING = 997
  function errnoErr (line 29) | func errnoErr(e syscall.Errno) error {
  function adjustTokenPrivileges (line 75) | func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *...
  function convertSidToStringSid (line 88) | func convertSidToStringSid(sid *byte, str **uint16) (err error) {
  function convertStringSidToSid (line 96) | func convertStringSidToSid(str *uint16, sid **byte) (err error) {
  function impersonateSelf (line 104) | func impersonateSelf(level uint32) (err error) {
  function lookupAccountName (line 112) | func lookupAccountName(systemName *uint16, accountName string, sid *byte...
  function _lookupAccountName (line 121) | func _lookupAccountName(systemName *uint16, accountName *uint16, sid *by...
  function lookupAccountSid (line 129) | func lookupAccountSid(systemName *uint16, sid *byte, name *uint16, nameS...
  function lookupPrivilegeDisplayName (line 137) | func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer ...
  function _lookupPrivilegeDisplayName (line 146) | func _lookupPrivilegeDisplayName(systemName *uint16, name *uint16, buffe...
  function lookupPrivilegeName (line 154) | func lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16...
  function _lookupPrivilegeName (line 163) | func _lookupPrivilegeName(systemName *uint16, luid *uint64, buffer *uint...
  function lookupPrivilegeValue (line 171) | func lookupPrivilegeValue(systemName string, name string, luid *uint64) ...
  function _lookupPrivilegeValue (line 185) | func _lookupPrivilegeValue(systemName *uint16, name *uint16, luid *uint6...
  function openThreadToken (line 193) | func openThreadToken(thread windows.Handle, accessMask uint32, openAsSel...
  function revertToSelf (line 205) | func revertToSelf() (err error) {
  function backupRead (line 213) | func backupRead(h windows.Handle, b []byte, bytesRead *uint32, abort boo...
  function backupWrite (line 233) | func backupWrite(h windows.Handle, b []byte, bytesWritten *uint32, abort...
  function cancelIoEx (line 253) | func cancelIoEx(file windows.Handle, o *windows.Overlapped) (err error) {
  function connectNamedPipe (line 261) | func connectNamedPipe(pipe windows.Handle, o *windows.Overlapped) (err e...
  function createIoCompletionPort (line 269) | func createIoCompletionPort(file windows.Handle, port windows.Handle, ke...
  function createNamedPipe (line 278) | func createNamedPipe(name string, flags uint32, pipeMode uint32, maxInst...
  function _createNamedPipe (line 287) | func _createNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxIn...
  function disconnectNamedPipe (line 296) | func disconnectNamedPipe(pipe windows.Handle) (err error) {
  function getCurrentThread (line 304) | func getCurrentThread() (h windows.Handle) {
  function getNamedPipeHandleState (line 310) | func getNamedPipeHandleState(pipe windows.Handle, state *uint32, curInst...
  function getNamedPipeInfo (line 318) | func getNamedPipeInfo(pipe windows.Handle, flags *uint32, outSize *uint3...
  function getQueuedCompletionStatus (line 326) | func getQueuedCompletionStatus(port windows.Handle, bytes *uint32, key *...
  function setFileCompletionNotificationModes (line 334) | func setFileCompletionNotificationModes(h windows.Handle, flags uint8) (...
  function ntCreateNamedPipeFile (line 342) | func ntCreateNamedPipeFile(pipe *windows.Handle, access ntAccessMask, oa...
  function rtlDefaultNpAcl (line 348) | func rtlDefaultNpAcl(dacl *uintptr) (status ntStatus) {
  function rtlDosPathNameToNtPathName (line 354) | func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, fil...
  function rtlNtStatusToDosError (line 360) | func rtlNtStatusToDosError(status ntStatus) (winerr error) {
  function wsaGetOverlappedResult (line 368) | func wsaGetOverlappedResult(h windows.Handle, o *windows.Overlapped, byt...

FILE: vendor/github.com/cenkalti/backoff/v4/backoff.go
  type BackOff (line 16) | type BackOff interface
  constant Stop (line 36) | Stop time.Duration = -1
  type ZeroBackOff (line 40) | type ZeroBackOff struct
    method Reset (line 42) | func (b *ZeroBackOff) Reset() {}
    method NextBackOff (line 44) | func (b *ZeroBackOff) NextBackOff() time.Duration { return 0 }
  type StopBackOff (line 48) | type StopBackOff struct
    method Reset (line 50) | func (b *StopBackOff) Reset() {}
    method NextBackOff (line 52) | func (b *StopBackOff) NextBackOff() time.Duration { return Stop }
  type ConstantBackOff (line 57) | type ConstantBackOff struct
    method Reset (line 61) | func (b *ConstantBackOff) Reset()                     {}
    method NextBackOff (line 62) | func (b *ConstantBackOff) NextBackOff() time.Duration { return b.Inter...
  function NewConstantBackOff (line 64) | func NewConstantBackOff(d time.Duration) *ConstantBackOff {

FILE: vendor/github.com/cenkalti/backoff/v4/context.go
  type BackOffContext (line 10) | type BackOffContext interface
  type backOffContext (line 15) | type backOffContext struct
    method Context (line 51) | func (b *backOffContext) Context() context.Context {
    method NextBackOff (line 55) | func (b *backOffContext) NextBackOff() time.Duration {
  function WithContext (line 23) | func WithContext(b BackOff, ctx context.Context) BackOffContext { // nol...
  function getContext (line 41) | func getContext(b BackOff) context.Context {

FILE: vendor/github.com/cenkalti/backoff/v4/exponential.go
  type ExponentialBackOff (line 54) | type ExponentialBackOff struct
    method Reset (line 109) | func (b *ExponentialBackOff) Reset() {
    method NextBackOff (line 116) | func (b *ExponentialBackOff) NextBackOff() time.Duration {
    method GetElapsedTime (line 133) | func (b *ExponentialBackOff) GetElapsedTime() time.Duration {
    method incrementCurrentInterval (line 138) | func (b *ExponentialBackOff) incrementCurrentInterval() {
  type Clock (line 70) | type Clock interface
  constant DefaultInitialInterval (line 76) | DefaultInitialInterval     = 500 * time.Millisecond
  constant DefaultRandomizationFactor (line 77) | DefaultRandomizationFactor = 0.5
  constant DefaultMultiplier (line 78) | DefaultMultiplier          = 1.5
  constant DefaultMaxInterval (line 79) | DefaultMaxInterval         = 60 * time.Second
  constant DefaultMaxElapsedTime (line 80) | DefaultMaxElapsedTime      = 15 * time.Minute
  function NewExponentialBackOff (line 84) | func NewExponentialBackOff() *ExponentialBackOff {
  type systemClock (line 98) | type systemClock struct
    method Now (line 100) | func (t systemClock) Now() time.Time {
  function getRandomValueFromInterval (line 149) | func getRandomValueFromInterval(randomizationFactor, random float64, cur...

FILE: vendor/github.com/cenkalti/backoff/v4/retry.go
  type OperationWithData (line 10) | type OperationWithData
  type Operation (line 14) | type Operation
    method withEmptyData (line 16) | func (o Operation) withEmptyData() OperationWithData[struct{}] {
  type Notify (line 27) | type Notify
  function Retry (line 37) | func Retry(o Operation, b BackOff) error {
  function RetryWithData (line 42) | func RetryWithData[T any](o OperationWithData[T], b BackOff) (T, error) {
  function RetryNotify (line 48) | func RetryNotify(operation Operation, b BackOff, notify Notify) error {
  function RetryNotifyWithData (line 53) | func RetryNotifyWithData[T any](operation OperationWithData[T], b BackOf...
  function RetryNotifyWithTimer (line 60) | func RetryNotifyWithTimer(operation Operation, b BackOff, notify Notify,...
  function RetryNotifyWithTimerAndData (line 66) | func RetryNotifyWithTimerAndData[T any](operation OperationWithData[T], ...
  function doRetryNotify (line 70) | func doRetryNotify[T any](operation OperationWithData[T], b BackOff, not...
  type PermanentError (line 121) | type PermanentError struct
    method Error (line 125) | func (e *PermanentError) Error() string {
    method Unwrap (line 129) | func (e *PermanentError) Unwrap() error {
    method Is (line 133) | func (e *PermanentError) Is(target error) bool {
  function Permanent (line 139) | func Permanent(err error) error {

FILE: vendor/github.com/cenkalti/backoff/v4/ticker.go
  type Ticker (line 13) | type Ticker struct
    method Stop (line 54) | func (t *Ticker) Stop() {
    method run (line 58) | func (t *Ticker) run() {
    method send (line 82) | func (t *Ticker) send(tick time.Time) <-chan time.Time {
  function NewTicker (line 29) | func NewTicker(b BackOff) *Ticker {
  function NewTickerWithTimer (line 35) | func NewTickerWithTimer(b BackOff, timer Timer) *Ticker {

FILE: vendor/github.com/cenkalti/backoff/v4/timer.go
  type Timer (line 5) | type Timer interface
  type defaultTimer (line 12) | type defaultTimer struct
    method C (line 17) | func (t *defaultTimer) C() <-chan time.Time {
    method Start (line 22) | func (t *defaultTimer) Start(duration time.Duration) {
    method Stop (line 31) | func (t *defaultTimer) Stop() {

FILE: vendor/github.com/cenkalti/backoff/v4/tries.go
  function WithMaxRetries (line 12) | func WithMaxRetries(b BackOff, max uint64) BackOff {
  type backOffTries (line 16) | type backOffTries struct
    method NextBackOff (line 22) | func (b *backOffTries) NextBackOff() time.Duration {
    method Reset (line 35) | func (b *backOffTries) Reset() {

FILE: vendor/github.com/containerd/log/context.go
  type loggerKey (line 60) | type loggerKey struct
  constant RFC3339NanoFixed (line 76) | RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00"
  constant TraceLevel (line 85) | TraceLevel Level = logrus.TraceLevel
  constant DebugLevel (line 89) | DebugLevel Level = logrus.DebugLevel
  constant InfoLevel (line 93) | InfoLevel Level = logrus.InfoLevel
  constant WarnLevel (line 96) | WarnLevel Level = logrus.WarnLevel
  constant ErrorLevel (line 100) | ErrorLevel Level = logrus.ErrorLevel
  constant FatalLevel (line 104) | FatalLevel Level = logrus.FatalLevel
  constant PanicLevel (line 108) | PanicLevel Level = logrus.PanicLevel
  function SetLevel (line 123) | func SetLevel(level string) error {
  function GetLevel (line 134) | func GetLevel() Level {
  type OutputFormat (line 139) | type OutputFormat
  constant TextFormat (line 144) | TextFormat OutputFormat = "text"
  constant JSONFormat (line 147) | JSONFormat OutputFormat = "json"
  function SetFormat (line 151) | func SetFormat(format OutputFormat) error {
  function WithLogger (line 171) | func WithLogger(ctx context.Context, logger *Entry) context.Context {
  function GetLogger (line 177) | func GetLogger(ctx context.Context) *Entry {

FILE: vendor/github.com/containerd/platforms/compare.go
  type MatchComparer (line 28) | type MatchComparer interface
  function platformVector (line 36) | func platformVector(platform specs.Platform) []specs.Platform {
  function Only (line 94) | func Only(platform specs.Platform) MatchComparer {
  function OnlyStrict (line 106) | func OnlyStrict(platform specs.Platform) MatchComparer {
  function Ordered (line 112) | func Ordered(platforms ...specs.Platform) MatchComparer {
  function Any (line 124) | func Any(platforms ...specs.Platform) MatchComparer {
  type orderedPlatformComparer (line 138) | type orderedPlatformComparer struct
    method Match (line 142) | func (c orderedPlatformComparer) Match(platform specs.Platform) bool {
    method Less (line 151) | func (c orderedPlatformComparer) Less(p1 specs.Platform, p2 specs.Plat...
  type anyPlatformComparer (line 165) | type anyPlatformComparer struct
    method Match (line 169) | func (c anyPlatformComparer) Match(platform specs.Platform) bool {
    method Less (line 178) | func (c anyPlatformComparer) Less(p1, p2 specs.Platform) bool {
  type allPlatformComparer (line 195) | type allPlatformComparer struct
    method Match (line 197) | func (allPlatformComparer) Match(specs.Platform) bool {
    method Less (line 201) | func (allPlatformComparer) Less(specs.Platform, specs.Platform) bool {

FILE: vendor/github.com/containerd/platforms/cpuinfo.go
  function cpuVariant (line 32) | func cpuVariant() string {

FILE: vendor/github.com/containerd/platforms/cpuinfo_linux.go
  function getMachineArch (line 32) | func getMachineArch() (string, error) {
  function getCPUInfo (line 47) | func getCPUInfo(pattern string) (info string, err error) {
  function getCPUVariantFromArch (line 77) | func getCPUVariantFromArch(arch string) (string, error) {
  function getCPUVariant (line 114) | func getCPUVariant() (string, error) {

FILE: vendor/github.com/containerd/platforms/cpuinfo_other.go
  function getCPUVariant (line 26) | func getCPUVariant() (string, error) {

FILE: vendor/github.com/containerd/platforms/database.go
  function isKnownOS (line 32) | func isKnownOS(os string) bool {
  function isArmArch (line 43) | func isArmArch(arch string) bool {
  function isKnownArch (line 54) | func isKnownArch(arch string) bool {
  function normalizeOS (line 62) | func normalizeOS(os string) string {
  function normalizeArch (line 76) | func normalizeArch(arch, variant string) (string, string) {

FILE: vendor/github.com/containerd/platforms/defaults.go
  function DefaultString (line 22) | func DefaultString() string {
  function DefaultStrict (line 27) | func DefaultStrict() MatchComparer {

FILE: vendor/github.com/containerd/platforms/defaults_darwin.go
  function DefaultSpec (line 28) | func DefaultSpec() specs.Platform {
  function Default (line 38) | func Default() MatchComparer {

FILE: vendor/github.com/containerd/platforms/defaults_freebsd.go
  function DefaultSpec (line 26) | func DefaultSpec() specs.Platform {
  function Default (line 36) | func Default() MatchComparer {

FILE: vendor/github.com/containerd/platforms/defaults_unix.go
  function DefaultSpec (line 28) | func DefaultSpec() specs.Platform {
  function Default (line 38) | func Default() MatchComparer {

FILE: vendor/github.com/containerd/platforms/defaults_windows.go
  function DefaultSpec (line 30) | func DefaultSpec() specs.Platform {
  type windowsmatcher (line 41) | type windowsmatcher struct
    method Match (line 49) | func (m windowsmatcher) Match(p specs.Platform) bool {
    method Less (line 86) | func (m windowsmatcher) Less(p1, p2 specs.Platform) bool {
  function getOSVersion (line 66) | func getOSVersion(osVersionPrefix string) osVersion {
  function revision (line 95) | func revision(v string) int {
  function prefix (line 107) | func prefix(v string) string {
  function Default (line 116) | func Default() MatchComparer {

FILE: vendor/github.com/containerd/platforms/platform_compat_windows.go
  type osVersion (line 21) | type osVersion struct
  constant rs5 (line 37) | rs5 = 17763
  constant v21H2Server (line 40) | v21H2Server = 20348
  constant v22H2Win11 (line 43) | v22H2Win11 = 22621
  function checkHostAndContainerCompat (line 58) | func checkHostAndContainerCompat(host, ctr osVersion) bool {

FILE: vendor/github.com/containerd/platforms/platforms.go
  constant osAndVersionFormat (line 128) | osAndVersionFormat = "%s(%s)"
  type Matcher (line 134) | type Matcher interface
  function NewMatcher (line 146) | func NewMatcher(platform specs.Platform) Matcher {
  type matcher (line 150) | type matcher struct
    method Match (line 154) | func (m *matcher) Match(platform specs.Platform) bool {
    method String (line 161) | func (m *matcher) String() string {
  function ParseAll (line 166) | func ParseAll(specifiers []string) ([]specs.Platform, error) {
  function Parse (line 189) | func Parse(specifier string) (specs.Platform, error) {
  function MustParse (line 268) | func MustParse(specifier string) specs.Platform {
  function Format (line 277) | func Format(platform specs.Platform) string {
  function FormatAll (line 287) | func FormatAll(platform specs.Platform) string {
  function Normalize (line 303) | func Normalize(platform specs.Platform) specs.Platform {

FILE: vendor/github.com/containerd/platforms/platforms_other.go
  function newDefaultMatcher (line 26) | func newDefaultMatcher(platform specs.Platform) Matcher {

FILE: vendor/github.com/containerd/platforms/platforms_windows.go
  function newDefaultMatcher (line 25) | func newDefaultMatcher(platform specs.Platform) Matcher {

FILE: vendor/github.com/cpuguy83/dockercfg/auth.go
  constant tokenUsername (line 18) | tokenUsername = "<token>"
  function GetRegistryCredentials (line 24) | func GetRegistryCredentials(hostname string) (string, string, error) {
  function ResolveRegistryHost (line 41) | func ResolveRegistryHost(host string) string {
  method GetRegistryCredentials (line 54) | func (c *Config) GetRegistryCredentials(hostname string) (string, string...
  function DecodeBase64Auth (line 91) | func DecodeBase64Auth(auth AuthConfig) (string, string, error) {
  function GetCredentialsFromHelper (line 138) | func GetCredentialsFromHelper(helper, hostname string) (string, string, ...
  function getCredentialHelper (line 198) | func getCredentialHelper() (string, error) {

FILE: vendor/github.com/cpuguy83/dockercfg/config.go
  type Config (line 4) | type Config struct
  type ProxyConfig (line 34) | type ProxyConfig struct
  type AuthConfig (line 42) | type AuthConfig struct
  type KubernetesConfig (line 63) | type KubernetesConfig struct

FILE: vendor/github.com/cpuguy83/dockercfg/load.go
  function UserHomeConfigPath (line 11) | func UserHomeConfigPath() (string, error) {
  function ConfigPath (line 24) | func ConfigPath() (string, error) {
  function LoadDefaultConfig (line 32) | func LoadDefaultConfig() (Config, error) {
  function FromFile (line 43) | func FromFile(configPath string, cfg *Config) error {

FILE: vendor/github.com/davecgh/go-spew/spew/bypass.go
  constant UnsafeDisabled (line 33) | UnsafeDisabled = false
  constant ptrSize (line 36) | ptrSize = unsafe.Sizeof((*byte)(nil))
  type flag (line 39) | type flag
  constant flagKindMask (line 54) | flagKindMask = flag(0x1f)
  function flagField (line 80) | func flagField(v *reflect.Value) *flag {
  function unsafeReflectValue (line 93) | func unsafeReflectValue(v reflect.Value) reflect.Value {
  function init (line 105) | func init() {

FILE: vendor/github.com/davecgh/go-spew/spew/bypasssafe.go
  constant UnsafeDisabled (line 28) | UnsafeDisabled = true
  function unsafeReflectValue (line 36) | func unsafeReflectValue(v reflect.Value) reflect.Value {

FILE: vendor/github.com/davecgh/go-spew/spew/common.go
  function catchPanic (line 72) | func catchPanic(w io.Writer, v reflect.Value) {
  function handleMethods (line 85) | func handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handl...
  function printBool (line 144) | func printBool(w io.Writer, val bool) {
  function printInt (line 153) | func printInt(w io.Writer, val int64, base int) {
  function printUint (line 158) | func printUint(w io.Writer, val uint64, base int) {
  function printFloat (line 164) | func printFloat(w io.Writer, val float64, precision int) {
  function printComplex (line 170) | func printComplex(w io.Writer, c complex128, floatPrecision int) {
  function printHexPtr (line 185) | func printHexPtr(w io.Writer, p uintptr) {
  type valuesSorter (line 219) | type valuesSorter struct
    method Len (line 279) | func (s *valuesSorter) Len() int {
    method Swap (line 285) | func (s *valuesSorter) Swap(i, j int) {
    method Less (line 326) | func (s *valuesSorter) Less(i, j int) bool {
  function newValuesSorter (line 228) | func newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Inter...
  function canSortSimply (line 256) | func canSortSimply(kind reflect.Kind) bool {
  function valueSortLess (line 295) | func valueSortLess(a, b reflect.Value) bool {
  function sortValues (line 336) | func sortValues(values []reflect.Value, cs *ConfigState) {

FILE: vendor/github.com/davecgh/go-spew/spew/config.go
  type ConfigState (line 37) | type ConfigState struct
    method Errorf (line 115) | func (c *ConfigState) Errorf(format string, a ...interface{}) (err err...
    method Fprint (line 127) | func (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, er...
    method Fprintf (line 139) | func (c *ConfigState) Fprintf(w io.Writer, format string, a ...interfa...
    method Fprintln (line 150) | func (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, ...
    method Print (line 162) | func (c *ConfigState) Print(a ...interface{}) (n int, err error) {
    method Printf (line 174) | func (c *ConfigState) Printf(format string, a ...interface{}) (n int, ...
    method Println (line 186) | func (c *ConfigState) Println(a ...interface{}) (n int, err error) {
    method Sprint (line 197) | func (c *ConfigState) Sprint(a ...interface{}) string {
    method Sprintf (line 208) | func (c *ConfigState) Sprintf(format string, a ...interface{}) string {
    method Sprintln (line 219) | func (c *ConfigState) Sprintln(a ...interface{}) string {
    method NewFormatter (line 240) | func (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter {
    method Fdump (line 246) | func (c *ConfigState) Fdump(w io.Writer, a ...interface{}) {
    method Dump (line 273) | func (c *ConfigState) Dump(a ...interface{}) {
    method Sdump (line 279) | func (c *ConfigState) Sdump(a ...interface{}) string {
    method convertArgs (line 288) | func (c *ConfigState) convertArgs(args []interface{}) (formatters []in...
  function NewDefaultConfig (line 304) | func NewDefaultConfig() *ConfigState {

FILE: vendor/github.com/davecgh/go-spew/spew/dump.go
  type dumpState (line 51) | type dumpState struct
    method indent (line 62) | func (d *dumpState) indent() {
    method unpackValue (line 73) | func (d *dumpState) unpackValue(v reflect.Value) reflect.Value {
    method dumpPtr (line 81) | func (d *dumpState) dumpPtr(v reflect.Value) {
    method dumpSlice (line 161) | func (d *dumpState) dumpSlice(v reflect.Value) {
    method dump (line 251) | func (d *dumpState) dump(v reflect.Value) {
  function fdump (line 453) | func fdump(cs *ConfigState, w io.Writer, a ...interface{}) {
  function Fdump (line 472) | func Fdump(w io.Writer, a ...interface{}) {
  function Sdump (line 478) | func Sdump(a ...interface{}) string {
  function Dump (line 507) | func Dump(a ...interface{}) {

FILE: vendor/github.com/davecgh/go-spew/spew/format.go
  constant supportedFlags (line 28) | supportedFlags = "0-+# "
  type formatState (line 34) | type formatState struct
    method buildDefaultFormat (line 47) | func (f *formatState) buildDefaultFormat() (format string) {
    method constructOrigFormat (line 65) | func (f *formatState) constructOrigFormat(verb rune) (format string) {
    method unpackValue (line 94) | func (f *formatState) unpackValue(v reflect.Value) reflect.Value {
    method formatPtr (line 105) | func (f *formatState) formatPtr(v reflect.Value) {
    method format (line 201) | func (f *formatState) format(v reflect.Value) {
    method Format (line 371) | func (f *formatState) Format(fs fmt.State, verb rune) {
  function newFormatter (line 394) | func newFormatter(cs *ConfigState, v interface{}) fmt.Formatter {
  function NewFormatter (line 417) | func NewFormatter(v interface{}) fmt.Formatter {

FILE: vendor/github.com/davecgh/go-spew/spew/spew.go
  function Errorf (line 32) | func Errorf(format string, a ...interface{}) (err error) {
  function Fprint (line 44) | func Fprint(w io.Writer, a ...interface{}) (n int, err error) {
  function Fprintf (line 56) | func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err e...
  function Fprintln (line 67) | func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
  function Print (line 79) | func Print(a ...interface{}) (n int, err error) {
  function Printf (line 91) | func Printf(format string, a ...interface{}) (n int, err error) {
  function Println (line 103) | func Println(a ...interface{}) (n int, err error) {
  function Sprint (line 114) | func Sprint(a ...interface{}) string {
  function Sprintf (line 125) | func Sprintf(format string, a ...interface{}) string {
  function Sprintln (line 136) | func Sprintln(a ...interface{}) string {
  function convertArgs (line 142) | func convertArgs(args []interface{}) (formatters []interface{}) {

FILE: vendor/github.com/distribution/reference/helpers.go
  function IsNameOnly (line 6) | func IsNameOnly(ref Named) bool {
  function FamiliarName (line 18) | func FamiliarName(ref Named) string {
  function FamiliarString (line 27) | func FamiliarString(ref Reference) string {
  function FamiliarMatch (line 36) | func FamiliarMatch(pattern string, ref Reference) (bool, error) {

FILE: vendor/github.com/distribution/reference/normalize.go
  constant legacyDefaultDomain (line 20) | legacyDefaultDomain = "index.docker.io"
  constant defaultDomain (line 31) | defaultDomain = "docker.io"
  constant officialRepoPrefix (line 36) | officialRepoPrefix = "library/"
  constant defaultTag (line 39) | defaultTag = "latest"
  type normalizedNamed (line 47) | type normalizedNamed interface
  function ParseNormalizedNamed (line 56) | func ParseNormalizedNamed(s string) (Named, error) {
  type namedTaggedDigested (line 83) | type namedTaggedDigested interface
  function ParseDockerRef (line 107) | func ParseDockerRef(ref string) (Named, error) {
  function splitDockerDomain (line 126) | func splitDockerDomain(name string) (domain, remoteName string) {
  function familiarizeName (line 179) | func familiarizeName(named namedRepository) repository {
  method Familiar (line 202) | func (r reference) Familiar() Named {
  method Familiar (line 210) | func (r repository) Familiar() Named {
  method Familiar (line 214) | func (t taggedReference) Familiar() Named {
  method Familiar (line 221) | func (c canonicalReference) Familiar() Named {
  function TagNameOnly (line 230) | func TagNameOnly(ref Named) Named {
  function ParseAnyReference (line 246) | func ParseAnyReference(ref string) (Reference, error) {

FILE: vendor/github.com/distribution/reference/reference.go
  constant RepositoryNameTotalLengthMax (line 39) | RepositoryNameTotalLengthMax = 255
  constant NameTotalLengthMax (line 44) | NameTotalLengthMax = RepositoryNameTotalLengthMax
  type Reference (line 72) | type Reference interface
  type Field (line 79) | type Field struct
    method Reference (line 92) | func (f Field) Reference() Reference {
    method MarshalText (line 98) | func (f Field) MarshalText() (p []byte, err error) {
    method UnmarshalText (line 105) | func (f *Field) UnmarshalText(p []byte) error {
  function AsField (line 84) | func AsField(reference Reference) Field {
  type Named (line 116) | type Named interface
  type Tagged (line 122) | type Tagged interface
  type NamedTagged (line 128) | type NamedTagged interface
  type Digested (line 135) | type Digested interface
  type Canonical (line 142) | type Canonical interface
  type namedRepository (line 149) | type namedRepository interface
  function Domain (line 156) | func Domain(named Named) string {
  function Path (line 165) | func Path(named Named) (name string) {
  function splitDomain (line 176) | func splitDomain(name string) (string, string) {
  function Parse (line 186) | func Parse(s string) (Reference, error) {
  function ParseNamed (line 237) | func ParseNamed(s string) (Named, error) {
  function WithName (line 250) | func WithName(name string) (Named, error) {
  function WithTag (line 268) | func WithTag(name Named, tag string) (NamedTagged, error) {
  function WithDigest (line 294) | func WithDigest(name Named, digest digest.Digest) (Canonical, error) {
  function TrimNamed (line 319) | func TrimNamed(ref Named) Named {
  function getBestReferenceType (line 329) | func getBestReferenceType(ref reference) Reference {
  type reference (line 356) | type reference struct
    method String (line 362) | func (r reference) String() string {
    method Tag (line 366) | func (r reference) Tag() string {
    method Digest (line 370) | func (r reference) Digest() digest.Digest {
  type repository (line 374) | type repository struct
    method String (line 379) | func (r repository) String() string {
    method Name (line 383) | func (r repository) Name() string {
    method Domain (line 390) | func (r repository) Domain() string {
    method Path (line 394) | func (r repository) Path() string {
  type digestReference (line 398) | type digestReference
    method String (line 400) | func (d digestReference) String() string {
    method Digest (line 404) | func (d digestReference) Digest() digest.Digest {
  type taggedReference (line 408) | type taggedReference struct
    method String (line 413) | func (t taggedReference) String() string {
    method Tag (line 417) | func (t taggedReference) Tag() string {
  type canonicalReference (line 421) | type canonicalReference struct
    method String (line 426) | func (c canonicalReference) String() string {
    method Digest (line 430) | func (c canonicalReference) Digest() digest.Digest {

FILE: vendor/github.com/distribution/reference/regexp.go
  constant alphanumeric (line 44) | alphanumeric = `[a-z0-9]+`
  constant separator (line 53) | separator = `(?:[._]|__|[-]+)`
  constant localhost (line 57) | localhost = `localhost`
  constant domainNameComponent (line 61) | domainNameComponent = `(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])`
  constant optionalPort (line 65) | optionalPort = `(?::[0-9]+)?`
  constant tag (line 68) | tag = `[\w][\w.-]{0,127}`
  constant digestPat (line 81) | digestPat = `[A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xd...
  constant identifier (line 85) | identifier = `([a-f0-9]{64})`
  constant ipv6address (line 91) | ipv6address = `\[(?:[a-fA-F0-9:]+)\]`
  function optional (line 145) | func optional(res ...string) string {
  function anyTimes (line 151) | func anyTimes(res ...string) string {
  function capture (line 156) | func capture(res ...string) string {
  function anchored (line 161) | func anchored(res ...string) string {

FILE: vendor/github.com/distribution/reference/sort.go
  function Sort (line 33) | func Sort(references []string) []string {
  function refRank (line 61) | func refRank(ref Reference) uint8 {

FILE: vendor/github.com/docker/docker/api/common.go
  constant DefaultVersion (line 6) | DefaultVersion = "1.48"
  constant MinSupportedAPIVersion (line 15) | MinSupportedAPIVersion = "1.24"
  constant NoBaseImageSpecifier (line 19) | NoBaseImageSpecifier = "scratch"

FILE: vendor/github.com/docker/docker/api/types/blkiodev/blkio.go
  type WeightDevice (line 6) | type WeightDevice struct
    method String (line 11) | func (w *WeightDevice) String() string {
  type ThrottleDevice (line 16) | type ThrottleDevice struct
    method String (line 21) | func (t *ThrottleDevice) String() string {

FILE: vendor/github.com/docker/docker/api/types/checkpoint/list.go
  type Summary (line 4) | type Summary struct

FILE: vendor/github.com/docker/docker/api/types/checkpoint/options.go
  type CreateOptions (line 4) | type CreateOptions struct
  type ListOptions (line 11) | type ListOptions struct
  type DeleteOptions (line 16) | type DeleteOptions struct

FILE: vendor/github.com/docker/docker/api/types/client.go
  function NewHijackedResponse (line 15) | func NewHijackedResponse(conn net.Conn, mediaType string) HijackedRespon...
  type HijackedResponse (line 20) | type HijackedResponse struct
    method Close (line 27) | func (h *HijackedResponse) Close() {
    method MediaType (line 33) | func (h *HijackedResponse) MediaType() (string, bool) {
    method CloseWrite (line 47) | func (h *HijackedResponse) CloseWrite() error {
  type CloseWriter (line 42) | type CloseWriter interface
  type ImageBuildOptions (line 56) | type ImageBuildOptions struct
  type ImageBuildOutput (line 109) | type ImageBuildOutput struct
  type BuilderVersion (line 115) | type BuilderVersion
  constant BuilderV1 (line 119) | BuilderV1 BuilderVersion = "1"
  constant BuilderBuildKit (line 121) | BuilderBuildKit BuilderVersion = "2"
  type ImageBuildResponse (line 127) | type ImageBuildResponse struct
  type NodeListOptions (line 133) | type NodeListOptions struct
  type NodeRemoveOptions (line 138) | type NodeRemoveOptions struct
  type ServiceCreateOptions (line 143) | type ServiceCreateOptions struct
  constant RegistryAuthFromSpec (line 159) | RegistryAuthFromSpec         = "spec"
  constant RegistryAuthFromPreviousSpec (line 160) | RegistryAuthFromPreviousSpec = "previous-spec"
  type ServiceUpdateOptions (line 164) | type ServiceUpdateOptions struct
  type ServiceListOptions (line 194) | type ServiceListOptions struct
  type ServiceInspectOptions (line 204) | type ServiceInspectOptions struct
  type TaskListOptions (line 209) | type TaskListOptions struct
  type PluginRemoveOptions (line 214) | type PluginRemoveOptions struct
  type PluginEnableOptions (line 219) | type PluginEnableOptions struct
  type PluginDisableOptions (line 224) | type PluginDisableOptions struct
  type PluginInstallOptions (line 229) | type PluginInstallOptions struct
  type SwarmUnlockKeyResponse (line 248) | type SwarmUnlockKeyResponse struct
  type PluginCreateOptions (line 254) | type PluginCreateOptions struct

FILE: vendor/github.com/docker/docker/api/types/common/id_response.go
  type IDResponse (line 8) | type IDResponse struct

FILE: vendor/github.com/docker/docker/api/types/container/change_type.go
  type ChangeType (line 15) | type ChangeType

FILE: vendor/github.com/docker/docker/api/types/container/change_types.go
  constant ChangeModify (line 5) | ChangeModify ChangeType = 0
  constant ChangeAdd (line 7) | ChangeAdd ChangeType = 1
  constant ChangeDelete (line 9) | ChangeDelete ChangeType = 2
  method String (line 12) | func (ct ChangeType) String() string {

FILE: vendor/github.com/docker/docker/api/types/container/config.go
  constant MinimumDuration (line 15) | MinimumDuration = 1 * time.Millisecond
  type StopOptions (line 18) | type StopOptions struct
  type Config (line 44) | type Config struct

FILE: vendor/github.com/docker/docker/api/types/container/container.go
  type PruneReport (line 25) | type PruneReport struct
  type PathStat (line 33) | type PathStat struct
  type CopyToContainerOptions (line 43) | type CopyToContainerOptions struct
  type StatsResponseReader (line 55) | type StatsResponseReader struct
  type MountPoint (line 62) | type MountPoint struct
  type State (line 106) | type State struct
  type Summary (line 123) | type Summary struct
  type ContainerJSONBase (line 154) | type ContainerJSONBase struct
  type InspectResponse (line 181) | type InspectResponse struct

FILE: vendor/github.com/docker/docker/api/types/container/create_request.go
  type CreateRequest (line 9) | type CreateRequest struct

FILE: vendor/github.com/docker/docker/api/types/container/create_response.go
  type CreateResponse (line 10) | type CreateResponse struct

FILE: vendor/github.com/docker/docker/api/types/container/errors.go
  type errInvalidParameter (line 3) | type errInvalidParameter struct
    method InvalidParameter (line 5) | func (e *errInvalidParameter) InvalidParameter() {}
    method Unwrap (line 7) | func (e *errInvalidParameter) Unwrap() error {

FILE: vendor/github.com/docker/docker/api/types/container/exec.go
  type ExecOptions (line 13) | type ExecOptions struct
  type ExecStartOptions (line 30) | type ExecStartOptions struct
  type ExecInspect (line 45) | type ExecInspect struct

FILE: vendor/github.com/docker/docker/api/types/container/filesystem_change.go
  type FilesystemChange (line 9) | type FilesystemChange struct

FILE: vendor/github.com/docker/docker/api/types/container/health.go
  constant NoHealthcheck (line 7) | NoHealthcheck = "none"
  constant Starting (line 8) | Starting      = "starting"
  constant Healthy (line 9) | Healthy       = "healthy"
  constant Unhealthy (line 10) | Unhealthy     = "unhealthy"
  type Health (line 14) | type Health struct
  type HealthcheckResult (line 21) | type HealthcheckResult struct

FILE: vendor/github.com/docker/docker/api/types/container/hostconfig.go
  type CgroupnsMode (line 17) | type CgroupnsMode
    method IsPrivate (line 27) | func (c CgroupnsMode) IsPrivate() bool {
    method IsHost (line 32) | func (c CgroupnsMode) IsHost() bool {
    method IsEmpty (line 37) | func (c CgroupnsMode) IsEmpty() bool {
    method Valid (line 42) | func (c CgroupnsMode) Valid() bool {
  constant CgroupnsModeEmpty (line 21) | CgroupnsModeEmpty   CgroupnsMode = ""
  constant CgroupnsModePrivate (line 22) | CgroupnsModePrivate CgroupnsMode = "private"
  constant CgroupnsModeHost (line 23) | CgroupnsModeHost    CgroupnsMode = "host"
  type Isolation (line 48) | type Isolation
    method IsDefault (line 60) | func (i Isolation) IsDefault() bool {
    method IsHyperV (line 67) | func (i Isolation) IsHyperV() bool {
    method IsProcess (line 73) | func (i Isolation) IsProcess() bool {
  constant IsolationEmpty (line 52) | IsolationEmpty   Isolation = ""
  constant IsolationDefault (line 53) | IsolationDefault Isolation = "default"
  constant IsolationProcess (line 54) | IsolationProcess Isolation = "process"
  constant IsolationHyperV (line 55) | IsolationHyperV  Isolation = "hyperv"
  type IpcMode (line 79) | type IpcMode
    method IsPrivate (line 91) | func (n IpcMode) IsPrivate() bool {
    method IsHost (line 96) | func (n IpcMode) IsHost() bool {
    method IsShareable (line 101) | func (n IpcMode) IsShareable() bool {
    method IsContainer (line 106) | func (n IpcMode) IsContainer() bool {
    method IsNone (line 112) | func (n IpcMode) IsNone() bool {
    method IsEmpty (line 117) | func (n IpcMode) IsEmpty() bool {
    method Valid (line 122) | func (n IpcMode) Valid() bool {
    method Container (line 128) | func (n IpcMode) Container() (idOrName string) {
  constant IPCModeNone (line 83) | IPCModeNone      IpcMode = "none"
  constant IPCModeHost (line 84) | IPCModeHost      IpcMode = "host"
  constant IPCModeContainer (line 85) | IPCModeContainer IpcMode = "container"
  constant IPCModePrivate (line 86) | IPCModePrivate   IpcMode = "private"
  constant IPCModeShareable (line 87) | IPCModeShareable IpcMode = "shareable"
  type NetworkMode (line 134) | type NetworkMode
    method IsNone (line 137) | func (n NetworkMode) IsNone() bool {
    method IsDefault (line 142) | func (n NetworkMode) IsDefault() bool {
    method IsPrivate (line 147) | func (n NetworkMode) IsPrivate() bool {
    method IsContainer (line 152) | func (n NetworkMode) IsContainer() bool {
    method ConnectedContainer (line 158) | func (n NetworkMode) ConnectedContainer() (idOrName string) {
    method UserDefined (line 164) | func (n NetworkMode) UserDefined() string {
  type UsernsMode (line 172) | type UsernsMode
    method IsHost (line 175) | func (n UsernsMode) IsHost() bool {
    method IsPrivate (line 180) | func (n UsernsMode) IsPrivate() bool {
    method Valid (line 185) | func (n UsernsMode) Valid() bool {
  type CgroupSpec (line 190) | type CgroupSpec
    method IsContainer (line 193) | func (c CgroupSpec) IsContainer() bool {
    method Valid (line 199) | func (c CgroupSpec) Valid() bool {
    method Container (line 205) | func (c CgroupSpec) Container() (idOrName string) {
  type UTSMode (line 211) | type UTSMode
    method IsPrivate (line 214) | func (n UTSMode) IsPrivate() bool {
    method IsHost (line 219) | func (n UTSMode) IsHost() bool {
    method Valid (line 224) | func (n UTSMode) Valid() bool {
  type PidMode (line 229) | type PidMode
    method IsPrivate (line 232) | func (n PidMode) IsPrivate() bool {
    method IsHost (line 237) | func (n PidMode) IsHost() bool {
    method IsContainer (line 242) | func (n PidMode) IsContainer() bool {
    method Valid (line 248) | func (n PidMode) Valid() bool {
    method Container (line 253) | func (n PidMode) Container() (idOrName string) {
  type DeviceRequest (line 260) | type DeviceRequest struct
  type DeviceMapping (line 269) | type DeviceMapping struct
  type RestartPolicy (line 276) | type R
Copy disabled (too large) Download .json
Condensed preview — 2299 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,998K chars).
[
  {
    "path": ".github/CODEOWNERS",
    "chars": 37,
    "preview": "* @rashiq @meiji163 @timvaillancourt\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 2169,
    "preview": "## Contributing\n\nHi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keep"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 571,
    "preview": "> This is the place to report a bug, ask a question, or suggest an enhancement.\n\n> This is also the place to make a disc"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 858,
    "preview": "## A Pull Request should be associated with an Issue.\n\n> We wish to have discussions in Issues. A single issue may be ta"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 109,
    "preview": "---\nversion: 2\nupdates:\n- package-ecosystem: github-actions\n  directory: \"/\"\n  schedule:\n    interval: daily\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 431,
    "preview": "name: CI\npermissions:\n  contents: read\n\non: [pull_request]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    -"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 757,
    "preview": "name: \"CodeQL analysis\"\n\non: \n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n  schedule:\n    "
  },
  {
    "path": ".github/workflows/golangci-lint.yml",
    "chars": 518,
    "preview": "name: golangci-lint\non:\n  push:\n    branches:\n      - master\n  pull_request:\npermissions:\n  contents: read\n  # Optional:"
  },
  {
    "path": ".github/workflows/replica-tests.yml",
    "chars": 1206,
    "preview": "name: migration tests\npermissions:\n  contents: read\n\non: [pull_request]\n\njobs:\n  docker-tests:\n    runs-on: ubuntu-22.04"
  },
  {
    "path": ".gitignore",
    "chars": 49,
    "preview": "/.gopath/\n/bin/\n/libexec/\n/.vendor/\n.idea/\n*.tmp\n"
  },
  {
    "path": ".golangci.yml",
    "chars": 421,
    "preview": "run:\n  timeout: 5m\nlinters:\n  disable:\n    - errcheck\n  enable:\n    - bodyclose\n    - containedctx\n    - contextcheck\n  "
  },
  {
    "path": "Dockerfile.packaging",
    "chars": 491,
    "preview": "FROM golang:1.23-bullseye\n\nRUN apt-get update\nRUN apt-get install -y ruby ruby-dev rubygems build-essential\nRUN gem inst"
  },
  {
    "path": "Dockerfile.test",
    "chars": 253,
    "preview": "FROM golang:1.23-bullseye\nLABEL maintainer=\"github@github.com\"\n\nRUN apt-get update\nRUN apt-get install -y lsb-release\nRU"
  },
  {
    "path": "LICENSE",
    "chars": 1073,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2016 GitHub\n\nPermission is hereby granted, free of charge, to any person obtaining "
  },
  {
    "path": "README.md",
    "chars": 7883,
    "preview": "# gh-ost\n\n[![ci](https://github.com/github/gh-ost/actions/workflows/ci.yml/badge.svg)](https://github.com/github/gh-ost/"
  },
  {
    "path": "build.sh",
    "chars": 2431,
    "preview": "#!/bin/bash\n\nRELEASE_VERSION=\nbuildpath=\n\nfunction setuptree() {\n  b=$( mktemp -d $buildpath/gh-ostXXXXXX ) || return 1\n"
  },
  {
    "path": "doc/azure.md",
    "chars": 1211,
    "preview": "`gh-ost` has been updated to work with Azure Database for MySQL however due to GitHub does not use it, this documentatio"
  },
  {
    "path": "doc/cheatsheet.md",
    "chars": 7225,
    "preview": "# Cheatsheet\n\n### Operation modes\n\n![operation modes](images/gh-ost-operation-modes.png)\n\n\n`gh-ost` operates by connecti"
  },
  {
    "path": "doc/coding-ghost.md",
    "chars": 1260,
    "preview": "# Getting started with gh-ost development.\n\n## Overview\n\nGetting started with gh-ost development is simple!\n\n- First obt"
  },
  {
    "path": "doc/command-line-flags.md",
    "chars": 20630,
    "preview": "# Command line flags\n\nA more in-depth discussion of various `gh-ost` command line flags: implementation, implication, us"
  },
  {
    "path": "doc/cut-over.md",
    "chars": 2390,
    "preview": "# Cut-over step\n\nThe cut-over is the final major step of the migration: it's the moment where your original table is pus"
  },
  {
    "path": "doc/hooks.md",
    "chars": 4456,
    "preview": "# Hooks\n\n`gh-ost` supports _hooks_: external processes which `gh-ost` executes at particular points of interest.\n\nUse ca"
  },
  {
    "path": "doc/interactive-commands.md",
    "chars": 5698,
    "preview": "# Interactive commands\n\n`gh-ost` is designed to be operations friendly. To that effect, it allows the user to control it"
  },
  {
    "path": "doc/local-tests.md",
    "chars": 2083,
    "preview": "# Local tests\n\n`gh-ost` is continuously tested in production via `--test-on-replica alter='engine=innodb'`. These tests "
  },
  {
    "path": "doc/migrating-with-sbr.md",
    "chars": 1924,
    "preview": "# Migrating with Statement Based Replication\n\nEven though `gh-ost` relies on Row Based Replication (RBR), it does not me"
  },
  {
    "path": "doc/perks.md",
    "chars": 3359,
    "preview": "# Perks\n\nListed below are some operation perks that make the DBA happy.\n\n### Dynamic reconfiguration\n\nYou started with a"
  },
  {
    "path": "doc/questions.md",
    "chars": 2076,
    "preview": "# How?\n\n### How does the cut-over work? Is it really atomic?\n\nThe cut-over phase, where the original table is swapped aw"
  },
  {
    "path": "doc/rds.md",
    "chars": 4462,
    "preview": "`gh-ost` has been updated to work with Amazon RDS however due to GitHub not using AWS for databases, this documentation "
  },
  {
    "path": "doc/requirements-and-limitations.md",
    "chars": 3920,
    "preview": "# Requirements and limitations\n\n### Requirements\n\n- `gh-ost` currently requires MySQL versions 5.7 and greater.\n\n- You w"
  },
  {
    "path": "doc/resume.md",
    "chars": 1691,
    "preview": "# Resuming Migrations\n\n`gh-ost` can attempt to resume an interrupted migration from a checkpoint if the following condit"
  },
  {
    "path": "doc/revert.md",
    "chars": 2850,
    "preview": "# Reverting Migrations\n\n`gh-ost` can attempt to revert a previously completed migration if the follow conditions are met"
  },
  {
    "path": "doc/shared-key.md",
    "chars": 4658,
    "preview": "# Shared key\n\ngh-ost requires for every migration that both the _before_ and _after_ versions of the table share the sam"
  },
  {
    "path": "doc/subsecond-lag.md",
    "chars": 1520,
    "preview": "# Sub-second replication lag throttling\n\n`gh-ost` is able to utilize sub-second replication lag measurements.\n\nAt GitHub"
  },
  {
    "path": "doc/testing-on-replica.md",
    "chars": 3983,
    "preview": "# Testing on replica\n\n`gh-ost`'s design allows for trusted and reliable tests of the migration without compromising prod"
  },
  {
    "path": "doc/the-fine-print.md",
    "chars": 2234,
    "preview": "# The Fine Print: What are You Not Telling Me?\n\nHere are technical considerations you may be interested in. We write her"
  },
  {
    "path": "doc/throttle.md",
    "chars": 6917,
    "preview": "# Throttle\n\nThroughout a migration operation, `gh-ost` is either actively copying and applying data, or is _throttling_."
  },
  {
    "path": "doc/triggerless-design.md",
    "chars": 12694,
    "preview": "# Triggerless design\n\nA breakdown of the logic and algorithm behind `gh-ost`'s triggerless design, followed by the impli"
  },
  {
    "path": "doc/understanding-output.md",
    "chars": 10602,
    "preview": "# Understanding gh-ost output\n\n`gh-ost` attempts to be verbose to the point where you really know what it's doing, witho"
  },
  {
    "path": "doc/what-if.md",
    "chars": 2201,
    "preview": "# What if?\n\nTechnical questions and answers. This document will be updated as we go\n\n### What if I'm using Statement Bas"
  },
  {
    "path": "doc/why-triggerless.md",
    "chars": 4987,
    "preview": "# Why triggerless?\n\nExisting MySQL schema migration tools:\n\n- [pt-online-schema-change](https://www.percona.com/doc/perc"
  },
  {
    "path": "docker-compose.yml",
    "chars": 109,
    "preview": "version: \"3.5\"\nservices:\n  app:\n    image: app\n    build:\n      context: .\n      dockerfile: Dockerfile.test\n"
  },
  {
    "path": "go/base/context.go",
    "chars": 33204,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
  },
  {
    "path": "go/base/context_test.go",
    "chars": 9046,
    "preview": "/*\n   Copyright 2021 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
  },
  {
    "path": "go/base/default_logger.go",
    "chars": 1627,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n         See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimp"
  },
  {
    "path": "go/base/load_map.go",
    "chars": 1745,
    "preview": "/*\n   Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
  },
  {
    "path": "go/base/load_map_test.go",
    "chars": 1178,
    "preview": "/*\n   Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
  },
  {
    "path": "go/base/utils.go",
    "chars": 2739,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
  },
  {
    "path": "go/base/utils_test.go",
    "chars": 683,
    "preview": "/*\n   Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
  },
  {
    "path": "go/binlog/binlog_dml_event.go",
    "chars": 1531,
    "preview": "/*\n   Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage binlog\n\nimport ("
  },
  {
    "path": "go/binlog/binlog_entry.go",
    "chars": 739,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage binlog\n\nimport ("
  },
  {
    "path": "go/binlog/binlog_reader.go",
    "chars": 402,
    "preview": "/*\n   Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage binlog\n\n// Binlo"
  },
  {
    "path": "go/binlog/gomysql_reader.go",
    "chars": 6923,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage binlog\n\nimport ("
  },
  {
    "path": "go/binlog/testdata/rbr-sample-0.txt",
    "chars": 9684,
    "preview": "/*\n    these are the statements that were used to execute the RBR log:\n    \n    create table samplet(id int primary key,"
  },
  {
    "path": "go/binlog/testdata/rbr-sample-1.txt",
    "chars": 1070,
    "preview": "/*\n    these are the statements that were used to execute the RBR log:\n\n    drop table if exists samplet;\n    create tab"
  },
  {
    "path": "go/binlog/testdata/rbr-sample-2.txt",
    "chars": 1722,
    "preview": "drop table if exists samplet;\ncreate table samplet(id int primary key, license int, name varchar(64), b tinyblob, unique"
  },
  {
    "path": "go/cmd/gh-ost/main.go",
    "chars": 27300,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage main\n\nimport (\n\t"
  },
  {
    "path": "go/logic/applier.go",
    "chars": 62819,
    "preview": "/*\n   Copyright 2025 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
  },
  {
    "path": "go/logic/applier_test.go",
    "chars": 52475,
    "preview": "/*\n   Copyright 2025 GitHub Inc.\n         See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nim"
  },
  {
    "path": "go/logic/checkpoint.go",
    "chars": 797,
    "preview": "/*\n   Copyright 2025 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
  },
  {
    "path": "go/logic/hooks.go",
    "chars": 6400,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
  },
  {
    "path": "go/logic/hooks_test.go",
    "chars": 3455,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n         See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nim"
  },
  {
    "path": "go/logic/inspect.go",
    "chars": 39421,
    "preview": "/*\n   Copyright 2025 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
  },
  {
    "path": "go/logic/inspect_test.go",
    "chars": 1034,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n         See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nim"
  },
  {
    "path": "go/logic/migrator.go",
    "chars": 72773,
    "preview": "/*\n   Copyright 2025 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
  },
  {
    "path": "go/logic/migrator_test.go",
    "chars": 39468,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n         See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nim"
  },
  {
    "path": "go/logic/my.cnf.test",
    "chars": 585,
    "preview": "# mysql server configuration for testcontainer\n[mysqld]\nmax_connections = 200\ninnodb_log_file_size = 64M\ninnodb_flush_lo"
  },
  {
    "path": "go/logic/server.go",
    "chars": 16167,
    "preview": "/*\n   Copyright 2021 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
  },
  {
    "path": "go/logic/server_test.go",
    "chars": 2634,
    "preview": "package logic\n\nimport (\n\t\"os\"\n\t\"path\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/github/gh-ost/go/base\"\n\t\"github.com/stretchr/test"
  },
  {
    "path": "go/logic/streamer.go",
    "chars": 7972,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
  },
  {
    "path": "go/logic/streamer_test.go",
    "chars": 7252,
    "preview": "package logic\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\tgosql \"database/sql\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/github/"
  },
  {
    "path": "go/logic/test_utils.go",
    "chars": 2114,
    "preview": "package logic\n\nimport (\n\t\"context\"\n\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"runtime\"\n\n\t\"github.com/github/gh-ost/go/base\"\n\t\"github.com"
  },
  {
    "path": "go/logic/throttler.go",
    "chars": 19125,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
  },
  {
    "path": "go/mysql/binlog.go",
    "chars": 417,
    "preview": "/*\n   Copyright 2015 Shlomi Noach, courtesy Booking.com\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh"
  },
  {
    "path": "go/mysql/binlog_file.go",
    "chars": 6810,
    "preview": "/*\n   Copyright 2015 Shlomi Noach, courtesy Booking.com\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh"
  },
  {
    "path": "go/mysql/binlog_file_test.go",
    "chars": 6888,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
  },
  {
    "path": "go/mysql/binlog_gtid.go",
    "chars": 2552,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
  },
  {
    "path": "go/mysql/connection.go",
    "chars": 4626,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
  },
  {
    "path": "go/mysql/connection_test.go",
    "chars": 3756,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
  },
  {
    "path": "go/mysql/instance_key.go",
    "chars": 4131,
    "preview": "/*\n   Copyright 2015 Shlomi Noach, courtesy Booking.com\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh"
  },
  {
    "path": "go/mysql/instance_key_map.go",
    "chars": 2369,
    "preview": "/*\n   Copyright 2015 Shlomi Noach, courtesy Booking.com\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\np"
  },
  {
    "path": "go/mysql/instance_key_test.go",
    "chars": 1687,
    "preview": "/*\n   Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
  },
  {
    "path": "go/mysql/replica_terminology_map.go",
    "chars": 1131,
    "preview": "package mysql\n\nimport (\n\tversion \"github.com/hashicorp/go-version\"\n)\n\nconst (\n\tMysqlVersionCutoff = \"8.4\"\n)\n\nvar MysqlRe"
  },
  {
    "path": "go/mysql/utils.go",
    "chars": 9060,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
  },
  {
    "path": "go/sql/builder.go",
    "chars": 25470,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
  },
  {
    "path": "go/sql/builder_test.go",
    "chars": 27991,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
  },
  {
    "path": "go/sql/encoding.go",
    "chars": 523,
    "preview": "/*\n   Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
  },
  {
    "path": "go/sql/parser.go",
    "chars": 6305,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
  },
  {
    "path": "go/sql/parser_test.go",
    "chars": 11969,
    "preview": "/*\n   Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
  },
  {
    "path": "go/sql/types.go",
    "chars": 9029,
    "preview": "/*\n   Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
  },
  {
    "path": "go/sql/types_test.go",
    "chars": 3115,
    "preview": "/*\n   Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
  },
  {
    "path": "go.mod",
    "chars": 3843,
    "preview": "module github.com/github/gh-ost\n\ngo 1.23.0\n\nrequire (\n\tgithub.com/go-ini/ini v1.67.0\n\tgithub.com/go-mysql-org/go-mysql v"
  },
  {
    "path": "go.sum",
    "chars": 23327,
    "preview": "dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=\ndario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobSt"
  },
  {
    "path": "localtests/alter-charset/create.sql",
    "chars": 821,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  t1 varchar(128)  charset latin1 "
  },
  {
    "path": "localtests/alter-charset/extra_args",
    "chars": 181,
    "preview": "--alter='MODIFY `t1` varchar(128) CHARACTER SET utf8mb4 NOT NULL, MODIFY `t2` varchar(128) CHARACTER SET latin2 NOT NULL"
  },
  {
    "path": "localtests/alter-charset-all-dml/create.sql",
    "chars": 1171,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  t1 varchar(128)  charset latin1 "
  },
  {
    "path": "localtests/alter-charset-all-dml/extra_args",
    "chars": 181,
    "preview": "--alter='MODIFY `t1` varchar(128) CHARACTER SET utf8mb4 NOT NULL, MODIFY `t2` varchar(128) CHARACTER SET latin2 NOT NULL"
  },
  {
    "path": "localtests/attempt-instant-ddl/create.sql",
    "chars": 352,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  color varchar("
  },
  {
    "path": "localtests/attempt-instant-ddl/extra_args",
    "chars": 22,
    "preview": "--attempt-instant-ddl\n"
  },
  {
    "path": "localtests/autoinc-copy-deletes/create.sql",
    "chars": 516,
    "preview": "drop event if exists gh_ost_test;\n\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,"
  },
  {
    "path": "localtests/autoinc-copy-deletes/expect_table_structure",
    "chars": 17,
    "preview": "AUTO_INCREMENT=8\n"
  },
  {
    "path": "localtests/autoinc-copy-deletes-user-defined/create.sql",
    "chars": 516,
    "preview": "drop event if exists gh_ost_test;\n\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,"
  },
  {
    "path": "localtests/autoinc-copy-deletes-user-defined/expect_table_structure",
    "chars": 17,
    "preview": "AUTO_INCREMENT=7\n"
  },
  {
    "path": "localtests/autoinc-copy-deletes-user-defined/extra_args",
    "chars": 27,
    "preview": "--alter='AUTO_INCREMENT=7'\n"
  },
  {
    "path": "localtests/autoinc-copy-simple/create.sql",
    "chars": 350,
    "preview": "drop event if exists gh_ost_test;\n\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,"
  },
  {
    "path": "localtests/autoinc-copy-simple/expect_table_structure",
    "chars": 17,
    "preview": "AUTO_INCREMENT=5\n"
  },
  {
    "path": "localtests/autoinc-zero-value/create.sql",
    "chars": 229,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  primary key(id"
  },
  {
    "path": "localtests/bigint-change-nullable/create.sql",
    "chars": 570,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id bigint auto_increment,\n  val bigint not null,\n  primar"
  },
  {
    "path": "localtests/bigint-change-nullable/extra_args",
    "chars": 33,
    "preview": "--alter=\"change val val bigint\" \n"
  },
  {
    "path": "localtests/binary-to-varbinary/create.sql",
    "chars": 1635,
    "preview": "-- Test for https://github.com/github/gh-ost/issues/909 variant:\n-- Binary columns with trailing zeros should preserve t"
  },
  {
    "path": "localtests/binary-to-varbinary/extra_args",
    "chars": 36,
    "preview": "--alter=\"MODIFY data varbinary(32)\"\n"
  },
  {
    "path": "localtests/bit-add/create.sql",
    "chars": 463,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  primary key(id"
  },
  {
    "path": "localtests/bit-add/extra_args",
    "chars": 49,
    "preview": "--alter=\"add column is_good bit null default 0\" \n"
  },
  {
    "path": "localtests/bit-add/ghost_columns",
    "chars": 6,
    "preview": "id, i\n"
  },
  {
    "path": "localtests/bit-add/orig_columns",
    "chars": 6,
    "preview": "id, i\n"
  },
  {
    "path": "localtests/bit-dml/create.sql",
    "chars": 620,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  is_good bit nu"
  },
  {
    "path": "localtests/bit-dml/extra_args",
    "chars": 81,
    "preview": "--alter=\"modify column is_good bit not null default 0\" --approve-renamed-columns\n"
  },
  {
    "path": "localtests/compound-pk/create.sql",
    "chars": 1436,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  v varchar(128)"
  },
  {
    "path": "localtests/compound-pk-ts/create.sql",
    "chars": 1456,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  ts0 timestamp("
  },
  {
    "path": "localtests/convert-utf8mb4/create.sql",
    "chars": 989,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  t varchar(128) charset utf8 coll"
  },
  {
    "path": "localtests/convert-utf8mb4/extra_args",
    "chars": 43,
    "preview": "--alter='convert to character set utf8mb4'\n"
  },
  {
    "path": "localtests/copy-retries-exhausted/after.sql",
    "chars": 54,
    "preview": "set global max_binlog_cache_size = 1073741824; -- 1GB\n"
  },
  {
    "path": "localtests/copy-retries-exhausted/before.sql",
    "chars": 41,
    "preview": "set global max_binlog_cache_size = 1024;\n"
  },
  {
    "path": "localtests/copy-retries-exhausted/create.sql",
    "chars": 291,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  name mediumtext not null,\n  prim"
  },
  {
    "path": "localtests/copy-retries-exhausted/expect_failure",
    "chars": 88,
    "preview": "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage\n"
  },
  {
    "path": "localtests/copy-retries-exhausted/extra_args",
    "chars": 78,
    "preview": "--alter \"modify column name mediumtext\" --default-retries=1 --chunk-size=1000\n"
  },
  {
    "path": "localtests/datetime/create.sql",
    "chars": 1380,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  dt0 datetime d"
  },
  {
    "path": "localtests/datetime-1970/create.sql",
    "chars": 770,
    "preview": "set session time_zone='+00:00';\n\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n "
  },
  {
    "path": "localtests/datetime-1970/extra_args",
    "chars": 37,
    "preview": "--alter='add column name varchar(1)'\n"
  },
  {
    "path": "localtests/datetime-1970/ghost_columns",
    "chars": 38,
    "preview": "id, create_time, update_time, counter\n"
  },
  {
    "path": "localtests/datetime-1970/orig_columns",
    "chars": 38,
    "preview": "id, create_time, update_time, counter\n"
  },
  {
    "path": "localtests/datetime-1970/sql_mode",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "localtests/datetime-submillis/create.sql",
    "chars": 848,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  dt0 datetime(6"
  },
  {
    "path": "localtests/datetime-submillis-zeroleading/create.sql",
    "chars": 836,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  dt0 datetime(6"
  },
  {
    "path": "localtests/datetime-to-timestamp/create.sql",
    "chars": 1020,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int unsigned auto_increment,\n  i int not null,\n  ts0 t"
  },
  {
    "path": "localtests/datetime-to-timestamp/extra_args",
    "chars": 43,
    "preview": "--alter=\"change column t t timestamp null\"\n"
  },
  {
    "path": "localtests/datetime-to-timestamp-pk-fail/create.sql",
    "chars": 1044,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int unsigned auto_increment,\n  i int not null,\n  ts0 t"
  },
  {
    "path": "localtests/datetime-to-timestamp-pk-fail/expect_failure",
    "chars": 118,
    "preview": "No support at this time for converting a column from DATETIME to TIMESTAMP that is also part of the chosen unique key\n"
  },
  {
    "path": "localtests/datetime-to-timestamp-pk-fail/extra_args",
    "chars": 64,
    "preview": "--alter=\"change column t t timestamp default current_timestamp\"\n"
  },
  {
    "path": "localtests/datetime-with-zero/create.sql",
    "chars": 464,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int unsigned auto_increment,\n  i int not null,\n  dt da"
  },
  {
    "path": "localtests/datetime-with-zero/extra_args",
    "chars": 99,
    "preview": "--allow-zero-in-date --alter=\"change column dt dt datetime not null default '1970-00-00 00:00:00'\"\n"
  },
  {
    "path": "localtests/decimal/create.sql",
    "chars": 787,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  dec0 decimal(65,30) unsigned NOT"
  },
  {
    "path": "localtests/discard-fk/create.sql",
    "chars": 890,
    "preview": "drop table if exists gh_ost_test_child;\ndrop table if exists gh_ost_test;\ndrop table if exists gh_ost_test_fk_parent;\ncr"
  },
  {
    "path": "localtests/discard-fk/extra_args",
    "chars": 23,
    "preview": "--discard-foreign-keys\n"
  },
  {
    "path": "localtests/discard-fk/ignore_versions",
    "chars": 7,
    "preview": "Percona"
  },
  {
    "path": "localtests/docker-compose.yml",
    "chars": 1009,
    "preview": "services:\n  mysql-primary:\n    image: $TEST_MYSQL_IMAGE\n    container_name: mysql-primary\n    command: --server-id=1 --l"
  },
  {
    "path": "localtests/drop-null-add-not-null/create.sql",
    "chars": 928,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  c1 int null,\n  c2 int not null,\n"
  },
  {
    "path": "localtests/drop-null-add-not-null/extra_args",
    "chars": 64,
    "preview": "--alter=\"drop column c1, add column c1 int not null default 47\"\n"
  },
  {
    "path": "localtests/drop-null-add-not-null/ghost_columns",
    "chars": 3,
    "preview": "c2\n"
  },
  {
    "path": "localtests/drop-null-add-not-null/orig_columns",
    "chars": 3,
    "preview": "c2\n"
  },
  {
    "path": "localtests/enum/create.sql",
    "chars": 881,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  e enum('red', "
  },
  {
    "path": "localtests/enum/extra_args",
    "chars": 108,
    "preview": "--alter=\"change e e enum('red', 'green', 'blue', 'orange', 'yellow') null default null collate 'utf8_bin'\" \n"
  },
  {
    "path": "localtests/enum-pk/create.sql",
    "chars": 997,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  e enum('red', "
  },
  {
    "path": "localtests/enum-to-varchar/create.sql",
    "chars": 770,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  e enum('red', "
  },
  {
    "path": "localtests/enum-to-varchar/extra_args",
    "chars": 54,
    "preview": "--alter=\"change e e varchar(32) not null default ''\" \n"
  },
  {
    "path": "localtests/existing-datetime-with-zero/create.sql",
    "chars": 528,
    "preview": "set session sql_mode='';\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int unsigned auto_increment,\n"
  },
  {
    "path": "localtests/existing-datetime-with-zero/extra_args",
    "chars": 45,
    "preview": "--allow-zero-in-date --alter=\"engine=innodb\"\n"
  },
  {
    "path": "localtests/fail-datetime-with-zero/create.sql",
    "chars": 464,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int unsigned auto_increment,\n  i int not null,\n  dt da"
  },
  {
    "path": "localtests/fail-datetime-with-zero/expect_failure",
    "chars": 31,
    "preview": "Invalid default value for 'dt'\n"
  },
  {
    "path": "localtests/fail-datetime-with-zero/extra_args",
    "chars": 78,
    "preview": "--alter=\"change column dt dt datetime not null default '1970-00-00 00:00:00'\"\n"
  },
  {
    "path": "localtests/fail-drop-pk/create.sql",
    "chars": 545,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  ts timestamp,\n"
  },
  {
    "path": "localtests/fail-drop-pk/expect_failure",
    "chars": 41,
    "preview": "No PRIMARY nor UNIQUE key found in table\n"
  },
  {
    "path": "localtests/fail-drop-pk/extra_args",
    "chars": 46,
    "preview": "--alter=\"change id id int, drop primary key\" \n"
  },
  {
    "path": "localtests/fail-existing-datetime-with-zero/create.sql",
    "chars": 528,
    "preview": "set session sql_mode='';\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int unsigned auto_increment,\n"
  },
  {
    "path": "localtests/fail-existing-datetime-with-zero/expect_failure",
    "chars": 31,
    "preview": "Invalid default value for 'dt'\n"
  },
  {
    "path": "localtests/fail-existing-datetime-with-zero/extra_args",
    "chars": 24,
    "preview": "--alter=\"engine=innodb\"\n"
  },
  {
    "path": "localtests/fail-fk/create.sql",
    "chars": 890,
    "preview": "drop table if exists gh_ost_test_child;\ndrop table if exists gh_ost_test;\ndrop table if exists gh_ost_test_fk_parent;\ncr"
  },
  {
    "path": "localtests/fail-fk/expect_failure",
    "chars": 55,
    "preview": "Child-side foreign keys are not supported. Bailing out\n"
  },
  {
    "path": "localtests/fail-fk/ignore_versions",
    "chars": 7,
    "preview": "Percona"
  },
  {
    "path": "localtests/fail-fk-parent/create.sql",
    "chars": 1083,
    "preview": "drop table if exists gh_ost_test_child;\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_incre"
  },
  {
    "path": "localtests/fail-fk-parent/destroy.sql",
    "chars": 40,
    "preview": "drop table if exists gh_ost_test_child;\n"
  },
  {
    "path": "localtests/fail-fk-parent/expect_failure",
    "chars": 43,
    "preview": "Parent-side foreign keys are not supported\n"
  },
  {
    "path": "localtests/fail-fk-parent/extra_args",
    "chars": 23,
    "preview": "--discard-foreign-keys\n"
  },
  {
    "path": "localtests/fail-fk-parent/ignore_versions",
    "chars": 7,
    "preview": "Percona"
  },
  {
    "path": "localtests/fail-float-unique-key/create.sql",
    "chars": 241,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  f float,\n  i int not null,\n  ts timestamp default current"
  },
  {
    "path": "localtests/fail-float-unique-key/expect_failure",
    "chars": 34,
    "preview": "No shared unique key can be found\n"
  },
  {
    "path": "localtests/fail-float-unique-key/extra_args",
    "chars": 35,
    "preview": "--alter=\"add column v varchar(32)\"\n"
  },
  {
    "path": "localtests/fail-no-shared-uk/create.sql",
    "chars": 522,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int not null,\n  i int not null,\n  ts timestamp,\n  prim"
  },
  {
    "path": "localtests/fail-no-shared-uk/expect_failure",
    "chars": 46,
    "preview": "No shared unique key can be found after ALTER\n"
  },
  {
    "path": "localtests/fail-no-shared-uk/extra_args",
    "chars": 49,
    "preview": "--alter=\"drop primary key, add primary key (i)\" \n"
  },
  {
    "path": "localtests/fail-no-unique-key/create.sql",
    "chars": 206,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  i int not null,\n  ts timestamp default current_timestamp,"
  },
  {
    "path": "localtests/fail-no-unique-key/expect_failure",
    "chars": 41,
    "preview": "No PRIMARY nor UNIQUE key found in table\n"
  },
  {
    "path": "localtests/fail-no-unique-key/extra_args",
    "chars": 35,
    "preview": "--alter=\"add column v varchar(32)\"\n"
  },
  {
    "path": "localtests/fail-rename-table/create.sql",
    "chars": 545,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  ts timestamp,\n"
  },
  {
    "path": "localtests/fail-rename-table/expect_failure",
    "chars": 42,
    "preview": "ALTER statement seems to RENAME the table\n"
  },
  {
    "path": "localtests/fail-rename-table/extra_args",
    "chars": 36,
    "preview": "--alter=\"rename as something_else\" \n"
  },
  {
    "path": "localtests/fail-update-pk-column/create.sql",
    "chars": 1847,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  i int not null,\n  primary key(id"
  },
  {
    "path": "localtests/gbk-charset/create.sql",
    "chars": 866,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int(11) NOT NULL AUTO_INCREMENT,\n  name varchar(512) D"
  },
  {
    "path": "localtests/gbk-charset/extra_args",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "localtests/generated-columns/create.sql",
    "chars": 1094,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  a int not null,\n  b int not null"
  },
  {
    "path": "localtests/generated-columns/ignore_versions",
    "chars": 7,
    "preview": "Percona"
  },
  {
    "path": "localtests/generated-columns-add/create.sql",
    "chars": 961,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  a int not null,\n  b int not null"
  },
  {
    "path": "localtests/generated-columns-add/extra_args",
    "chars": 60,
    "preview": "--alter=\"add column sum_ab int as (a + b) virtual not null\"\n"
  },
  {
    "path": "localtests/generated-columns-add/ghost_columns",
    "chars": 9,
    "preview": "id, a, b\n"
  },
  {
    "path": "localtests/generated-columns-add/ignore_versions",
    "chars": 7,
    "preview": "Percona"
  },
  {
    "path": "localtests/generated-columns-add/order_by",
    "chars": 3,
    "preview": "id\n"
  },
  {
    "path": "localtests/generated-columns-add/orig_columns",
    "chars": 9,
    "preview": "id, a, b\n"
  },
  {
    "path": "localtests/generated-columns-rename/create.sql",
    "chars": 1003,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  a int not null,\n  b int not null"
  },
  {
    "path": "localtests/generated-columns-rename/extra_args",
    "chars": 91,
    "preview": "--alter=\"change sum_ab total_ab int as (a + b) virtual not null\" --approve-renamed-columns\n"
  },
  {
    "path": "localtests/generated-columns-rename/ignore_versions",
    "chars": 7,
    "preview": "Percona"
  },
  {
    "path": "localtests/generated-columns-unique/create.sql",
    "chars": 1421,
    "preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n  id int auto_increment,\n  `idb` varchar(36) CHARACTER SET "
  }
]

// ... and 2099 more files (download for full content)

About this extraction

This page contains the full source code of the github/gh-ost GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2299 files (21.9 MB), approximately 4.1M tokens, and a symbol index with 83352 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!