Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
239 commits
Select commit Hold shift + click to select a range
36aa2b7
refactor(udf): replace legacy Python service with Arrow runtime
iamlinjunhong Sep 9, 2026
91b9be8
fix(udf): tighten runtime naming and lifecycle
iamlinjunhong Sep 9, 2026
90bf43a
fix(udf): rename Python adapter and fence duplicate calls
iamlinjunhong Sep 9, 2026
7f9e835
fix(udf): close remaining Python worker contracts
iamlinjunhong Sep 9, 2026
4d15bc6
fix(udf): align SQL selection and system account fences
iamlinjunhong Sep 9, 2026
23e5ccc
test(udf): add Python cases to CI BVT
iamlinjunhong Sep 9, 2026
e07282b
chore(udf): remove stale Python service ignore rules
iamlinjunhong Sep 9, 2026
64fa5c0
ci(udf): harden Python BVT build fallback
iamlinjunhong Sep 9, 2026
14a62a6
test(udf): run Python cases in ordinary BVT
iamlinjunhong Sep 9, 2026
408b3a4
test(udf): expand Python boundary BVT coverage
iamlinjunhong Sep 9, 2026
f21c6c7
test(udf): cover null multi-argument calls
iamlinjunhong Sep 9, 2026
1ab5807
fix(udf): close Python execution and type contracts
iamlinjunhong Sep 9, 2026
13e143e
fix(udf): separate active and terminal reservations
iamlinjunhong Sep 9, 2026
a53aa08
test(udf): update decimal normalization baseline
iamlinjunhong Sep 9, 2026
11887ce
fix(udf): harden handler response ownership
iamlinjunhong Sep 9, 2026
cd99ebc
refactor(udf): clarify execution sequence ownership
iamlinjunhong Sep 9, 2026
35ac5d9
fix(udf): encode UUID width in the ABI fingerprint
iamlinjunhong Sep 9, 2026
5a6a6ec
fix(udf): close Python execution channel contracts
iamlinjunhong Sep 9, 2026
2d421d2
fix(udf): close Python gateway response contracts
iamlinjunhong Sep 10, 2026
07e4bd3
fix(udf): make Python runtime shutdown terminal
iamlinjunhong Sep 10, 2026
cbd3ac7
fix(udf): close Python SQL and runtime contracts
iamlinjunhong Sep 10, 2026
c41abeb
fix(udf): require complete Python type contracts
iamlinjunhong Sep 10, 2026
5b29e98
fix(udf): enforce one-shot group state transitions
iamlinjunhong Sep 10, 2026
051dc9d
fix(udf): reject late Flight completion controls
iamlinjunhong Sep 10, 2026
1a183d5
fix(udf): align Python JSON validation with SQL
iamlinjunhong Sep 10, 2026
0ed1bff
fix(udf): isolate Python handler environment
iamlinjunhong Sep 10, 2026
2b73eb9
fix(udf): enforce complete Python routine bodies
iamlinjunhong Sep 10, 2026
d1d4751
fix(udf): reject non-finite handler deadlines
iamlinjunhong Sep 10, 2026
8f6feaf
fix(udf): validate Python execution input shapes
iamlinjunhong Sep 10, 2026
e6f9665
fix(udf): validate Arrow physical descriptor limits
iamlinjunhong Sep 10, 2026
b5be39e
fix(udf): ignore null decimal payloads
iamlinjunhong Sep 10, 2026
2eff1bc
fix(udf): honor SQL integer type equivalence
iamlinjunhong Sep 10, 2026
3fccc8c
fix(udf): reject duplicate invocation opens
iamlinjunhong Sep 10, 2026
516742a
fix(udf): reject unknown control envelope fields
iamlinjunhong Sep 10, 2026
bd9e54b
fix(udf): reject duplicate control JSON fields
iamlinjunhong Sep 10, 2026
6e5e6bd
fix(udf): validate opens before ledger admission
iamlinjunhong Sep 10, 2026
1b70a8c
fix(udf): enforce Python descriptor shape
iamlinjunhong Sep 10, 2026
37d1fb3
fix(udf): reject Arrow bodies on control frames
iamlinjunhong Sep 10, 2026
dbedebf
fix(udf): align Python fencing tuple validation
iamlinjunhong Sep 10, 2026
473270b
fix(udf): reject empty Flight input frames
iamlinjunhong Sep 10, 2026
a48ceb3
fix(udf): encode zero sequence control fields
iamlinjunhong Sep 10, 2026
17ceeea
fix(udf): enforce control field ownership
iamlinjunhong Sep 10, 2026
34cb6c2
fix(udf): preserve decimal64 signed range
iamlinjunhong Sep 10, 2026
48d98fc
fix(udf): reject nonstandard control JSON
iamlinjunhong Sep 10, 2026
5e8acf9
fix(udf): preserve fencing tuple encoding
iamlinjunhong Sep 10, 2026
316ae68
fix(udf): validate IANA timezone identities
iamlinjunhong Sep 10, 2026
5599e59
fix(udf): validate input Arrow values
iamlinjunhong Sep 10, 2026
d37857a
fix(udf): reject empty constant inputs
iamlinjunhong Sep 10, 2026
913163f
fix(udf): classify malformed worker frames
iamlinjunhong Sep 10, 2026
f3b986d
fix(udf): enforce descriptor value domains
iamlinjunhong Sep 10, 2026
8dc2205
fix(udf): reject invalid control UTF-8
iamlinjunhong Sep 10, 2026
84dd800
fix(udf): validate every Python input batch
iamlinjunhong Sep 10, 2026
f4ca488
feat(udf): implement long-term Python UDF execution
iamlinjunhong Sep 11, 2026
8bf1102
feat(udf): validate Python definitions before publication
iamlinjunhong Sep 11, 2026
e2de6a6
fix(udf): read handler frames across pipe short reads
iamlinjunhong Sep 11, 2026
9c1cbff
fix(udf): keep Arrow encoder cleanup retryable
iamlinjunhong Sep 11, 2026
2148e12
fix(udf): finalize input before terminal success
iamlinjunhong Sep 11, 2026
2751094
fix(udf): classify invalid handler buffers
iamlinjunhong Sep 11, 2026
b5a08be
fix(udf): reject trailing handler batch bytes
iamlinjunhong Sep 11, 2026
5f2d0d8
fix(udf): validate Python handler bindings at create
iamlinjunhong Sep 11, 2026
7c16191
fix(udf): validate empty and typed input boundaries
iamlinjunhong Sep 11, 2026
7542345
fix(udf): reject unsupported routine types before allocation
iamlinjunhong Sep 11, 2026
e50ad1d
fix(udf): enforce exact external routine selection domain
iamlinjunhong Sep 11, 2026
1c6c1a0
fix(udf): transfer external expression result ownership
iamlinjunhong Sep 14, 2026
8dc37a9
fix(udf): verify frozen definitions before evaluating arguments
iamlinjunhong Sep 14, 2026
d0cf250
fix(udf): skip arguments outside the selected row domain
iamlinjunhong Sep 14, 2026
d73f448
fix(udf): preserve canonical JSON tokens across adapters
iamlinjunhong Sep 14, 2026
a8a960e
fix(udf): avoid re-expanding shared routine query dependencies
iamlinjunhong Sep 14, 2026
ce6e5d5
fix(udf): own handler pipes before subsequent allocations
iamlinjunhong Sep 14, 2026
8f80ac5
docs(udf): describe CI workers without isolation claims
iamlinjunhong Sep 14, 2026
85471eb
test(udf): cover canonical JSON through real Flight batches
iamlinjunhong Sep 14, 2026
13dc070
perf(udf): reduce scalar batch conversion overhead
iamlinjunhong Sep 14, 2026
9763086
refactor(udf): share scalar conversion contract
iamlinjunhong Sep 14, 2026
ee46377
perf(udf): trim handler process startup
iamlinjunhong Sep 14, 2026
9ce9300
perf(udf): trim bounded handler IPC frames
iamlinjunhong Sep 14, 2026
6ae0d0c
perf(udf): avoid Arrow result stream copies
iamlinjunhong Sep 14, 2026
6d133da
perf(udf): batch fixed-width input materialization
iamlinjunhong Sep 14, 2026
0e44545
perf(udf): reuse variable-width input wrappers
iamlinjunhong Sep 14, 2026
06ab426
fix(udf): guard empty variable-width inputs
iamlinjunhong Sep 14, 2026
dcca09b
perf(udf): reduce handler request copies
iamlinjunhong Sep 14, 2026
d144b3b
refactor(udf): clarify varlena cache naming
iamlinjunhong Sep 14, 2026
ea2b88a
fix(udf): handle vector inputs in batch sizing
iamlinjunhong Sep 14, 2026
9099586
perf(udf): reuse result headers during decode
iamlinjunhong Sep 14, 2026
b366a50
fix(udf): preserve Arrow metadata across input batches
iamlinjunhong Sep 14, 2026
529ae67
fix(udf): fence supervisor restart during close
iamlinjunhong Sep 14, 2026
f081a25
fix(udf): require explicit Python invocation language
iamlinjunhong Sep 14, 2026
86ad559
fix(udf): require explicit Python definition language
iamlinjunhong Sep 14, 2026
116dc2a
fix(udf): validate final Python handler binding
iamlinjunhong Sep 14, 2026
fd7f161
fix(udf): fall back when handler group kill is denied
iamlinjunhong Sep 14, 2026
4607d75
fix(udf): include timezone data in runtime image
iamlinjunhong Sep 14, 2026
1f3eede
fix(udf): fail closed on broken liveness watches
iamlinjunhong Sep 14, 2026
85ef4a4
fix(udf): close gateway admission barrier
iamlinjunhong Sep 14, 2026
36d2ec2
fix(udf): validate empty selection domains
iamlinjunhong Sep 14, 2026
b122e22
fix(udf): reject noncanonical JSON results
iamlinjunhong Sep 14, 2026
0c6daa7
fix(udf): reject opaque text descriptors
iamlinjunhong Sep 14, 2026
7b1188b
fix(udf): serialize admission with gateway close
iamlinjunhong Sep 14, 2026
2a2263e
fix(udf): enforce budget during handler writes
iamlinjunhong Sep 14, 2026
5a24f95
fix(udf): validate Python catalog signature before publish
iamlinjunhong Sep 14, 2026
df8c8ac
fix(udf): refresh worker lease for readiness
iamlinjunhong Sep 14, 2026
36325a5
fix(udf): validate temporal child validity
iamlinjunhong Sep 14, 2026
b6a2251
fix(udf): scope worker group fences by account
iamlinjunhong Sep 15, 2026
9dfe495
fix(udf): scope gateway groups by account
iamlinjunhong Sep 15, 2026
58fa069
fix(udf): reject noncanonical descriptor fields
iamlinjunhong Sep 15, 2026
f19dcdb
fix(udf): bound worker fencing identities
iamlinjunhong Sep 15, 2026
051cbf4
fix(udf): align Python security IDs with uint32
iamlinjunhong Sep 15, 2026
ee595d9
fix(udf): enforce required worker controls on encode
iamlinjunhong Sep 15, 2026
b5f8b08
fix(udf): bound Python statement timestamps
iamlinjunhong Sep 15, 2026
49b133f
fix(udf): bound Python descriptor integers
iamlinjunhong Sep 15, 2026
0f22641
fix(udf): verify runtime result production
iamlinjunhong Sep 15, 2026
a451ee7
fix(udf): reject boolean contract versions
iamlinjunhong Sep 15, 2026
8015836
fix(udf): require canonical timezone kinds
iamlinjunhong Sep 15, 2026
3954abc
fix(udf): validate definition schema type
iamlinjunhong Sep 15, 2026
0debee4
fix(udf): cancel exchanges during worker shutdown
iamlinjunhong Sep 15, 2026
1443d49
fix(udf): require canonical routine language
iamlinjunhong Sep 15, 2026
5d4b2a4
fix(udf): reject noncanonical plan languages
iamlinjunhong Sep 15, 2026
986f40e
test(udf): inspect scoped gateway group fences
iamlinjunhong Sep 15, 2026
43d5b5a
fix(udf): align gateway timeout with worker limit
iamlinjunhong Sep 15, 2026
9fab728
fix(udf): preserve large JSON number tokens
iamlinjunhong Sep 15, 2026
599c9db
fix(udf): reject noncanonical routine language at bind
iamlinjunhong Sep 15, 2026
f84a871
fix(udf): enforce Arrow field nullability
iamlinjunhong Sep 15, 2026
ee2f4e7
fix(udf): require object invocation payload
iamlinjunhong Sep 15, 2026
95d565f
fix(udf): reject cancelled worker actions
iamlinjunhong Sep 15, 2026
0259d4b
fix(udf): reject noncanonical catalog languages
iamlinjunhong Sep 15, 2026
1aaff29
fix(udf): validate module handler bindings
iamlinjunhong Sep 15, 2026
00978cd
fix(udf): bound resolved artifact sources
iamlinjunhong Sep 15, 2026
bdfafe8
fix(udf): align statement timestamp bounds
iamlinjunhong Sep 15, 2026
e581045
fix(udf): handle bare except in handler validation
iamlinjunhong Sep 15, 2026
0ca3c75
fix(udf): bound artifact validation resolution
iamlinjunhong Sep 15, 2026
250c16b
fix(udf): inspect mapping pattern handler captures
iamlinjunhong Sep 15, 2026
8060eb0
fix(udf): stop cleanup reaper on worker shutdown errors
iamlinjunhong Sep 15, 2026
d781695
fix(udf): reject null sql mode context
iamlinjunhong Sep 15, 2026
dbaa776
fix(udf): validate IANA zones at CN boundary
iamlinjunhong Sep 15, 2026
1068a15
fix(udf): cap artifact store to wire contract
iamlinjunhong Sep 15, 2026
b959b42
fix(udf): bound control JSON nesting
iamlinjunhong Sep 15, 2026
020479b
fix(udf): bound validation action JSON
iamlinjunhong Sep 15, 2026
52c0ccd
fix(udf): reject sub-minute session offsets
iamlinjunhong Sep 15, 2026
077465a
fix(frontend): stabilize Python replace validation
iamlinjunhong Sep 15, 2026
761e77a
fix(frontend): reject incomplete Python identities
iamlinjunhong Sep 15, 2026
d19fbfe
fix(udf): cancel exchange before releasing admission
iamlinjunhong Sep 15, 2026
8eb7c51
fix(udf): keep native Flight readers on RPC thread
iamlinjunhong Sep 15, 2026
b74040f
fix(udf): distinguish expected worker shutdown
iamlinjunhong Sep 15, 2026
039d06a
fix(udf): complete handler response frame writes
iamlinjunhong Sep 15, 2026
a4cc122
fix(udf): validate handler binding before loading
iamlinjunhong Sep 15, 2026
d77d7c1
fix(udf): kill handler groups before reaping leaders
iamlinjunhong Sep 15, 2026
7dde4a2
fix(udf): reject stale result acknowledgements
iamlinjunhong Sep 15, 2026
0570c67
fix(udf): close Docker contract gaps
iamlinjunhong Sep 15, 2026
fefa999
refactor(udf): centralize logical type mapping
iamlinjunhong Sep 15, 2026
76b4773
fix(udf): preserve legacy python heads on restore
iamlinjunhong Sep 16, 2026
80f31c3
fix(udf): enforce descriptor validity at result boundaries
iamlinjunhong Sep 16, 2026
b034c79
fix(udf): cancel gateway operations on close
iamlinjunhong Sep 16, 2026
33bf5ed
fix(udf): reject incompatible vector descriptor casts
iamlinjunhong Sep 16, 2026
75dc117
fix(udf): bound handler response buffering
iamlinjunhong Sep 16, 2026
e8c03ca
udf: add runtime status bridge and finish fencing
iamlinjunhong Sep 17, 2026
db2419f
test: add Arrow compute correctness cases for Python UDF
iamlinjunhong Sep 18, 2026
b2dbb55
test: make Arrow sort null placement explicit
iamlinjunhong Sep 18, 2026
4656ee5
test: cover null Arrow take indices
iamlinjunhong Sep 18, 2026
60f6591
test: make Arrow arithmetic scalar type explicit
iamlinjunhong Sep 18, 2026
5bb9bad
test: make Arrow string options explicit
iamlinjunhong Sep 18, 2026
c5a1280
test: make Arrow selection safety explicit
iamlinjunhong Sep 18, 2026
9e22802
test: cover Arrow vector cardinality rejection
iamlinjunhong Sep 18, 2026
2a1d270
test: distinguish Arrow string option semantics
iamlinjunhong Sep 18, 2026
3deb4c4
test: bind Arrow scalar arguments to SQL types
iamlinjunhong Sep 18, 2026
1806f29
docs: describe Arrow cardinality coverage
iamlinjunhong Sep 18, 2026
c3d111a
test: clean up BVT service processes
iamlinjunhong Sep 18, 2026
89564f4
test: reap BVT child services
iamlinjunhong Sep 18, 2026
f00d1e0
test: wait for Python UDF capability handshake
iamlinjunhong Sep 18, 2026
549cb0d
test: cover Arrow take bounds errors
iamlinjunhong Sep 18, 2026
5eb4bf3
test: verify Arrow sort index positions
iamlinjunhong Sep 18, 2026
2d160f0
test: cover Arrow float arithmetic
iamlinjunhong Sep 18, 2026
efb2254
fix: preserve vector size during Python UDF binding
iamlinjunhong Sep 18, 2026
5c99180
fix: keep BVT services alive for test runner
iamlinjunhong Sep 18, 2026
e88c71a
fix: clean BVT services after test completion
iamlinjunhong Sep 18, 2026
f14be17
fix: harden BVT launcher argument handling
iamlinjunhong Sep 18, 2026
eda07b0
fix: freeze complete Arrow result frames
iamlinjunhong Sep 18, 2026
a77dd86
fix: verify BVT service liveness during startup
iamlinjunhong Sep 18, 2026
5668ba4
docs: fix Python UDF BVT generation example
iamlinjunhong Sep 18, 2026
2bf1ab4
test: make compose worker readiness verify capabilities
iamlinjunhong Sep 18, 2026
f4d8023
fix: clean BVT services on startup failure
iamlinjunhong Sep 18, 2026
01cb119
ci: preserve BVT logs when setup fails
iamlinjunhong Sep 18, 2026
8632b5d
fix: avoid waiting on exited BVT processes
iamlinjunhong Sep 18, 2026
a4785af
fix: keep handler quota ownership retryable
iamlinjunhong Sep 18, 2026
cc90f24
fix: degrade python runtime initialization failures
iamlinjunhong Sep 18, 2026
6a8b1db
fix: clean up compose BVT services
iamlinjunhong Sep 18, 2026
f8cbffa
test: execute scalar Python UDF BVT case
iamlinjunhong Sep 18, 2026
89baeb6
fix(udf): validate overload namespaces and cancel capability waits
iamlinjunhong Sep 20, 2026
e16e8ce
test(udf): supply NULL input for scalar control-flow assertion
iamlinjunhong Sep 20, 2026
8ba3f21
fix(udf): preserve exact DROP and failed initialization ownership
iamlinjunhong Sep 20, 2026
4eaef42
docs(udf): document execution and rollout scope for review
iamlinjunhong Sep 20, 2026
94a1fdc
fix(ci): add missing license headers for Python UDF files
iamlinjunhong Sep 20, 2026
af518b6
fix(udf): satisfy static checks and import ownership
iamlinjunhong Sep 20, 2026
368b6cd
fix(ci): align Python UDF runtime dependencies
iamlinjunhong Sep 20, 2026
e450974
fix(udf): integrate concurrent CI contract repair
iamlinjunhong Sep 20, 2026
de6819f
fix(udf): remove duplicate frontend import
iamlinjunhong Sep 20, 2026
3b2b046
fix(udf): preserve Python UDF test dependencies
iamlinjunhong Sep 20, 2026
8b8fcbd
test(optools): isolate Python dependency probe in scheduler harness
iamlinjunhong Sep 21, 2026
6d529cd
test(bootstrap): preserve historical upgrade worker fixture
iamlinjunhong Sep 21, 2026
15800d7
test(udf): cover CI contracts and failure paths
iamlinjunhong Sep 23, 2026
85266ac
fix(optools): retain Python runtime loader path
iamlinjunhong Sep 23, 2026
fee03b9
docs(udf): clarify test-stage acceptance scope
iamlinjunhong Sep 24, 2026
0cf365b
docs(udf): approve current-stage design contract
iamlinjunhong Sep 24, 2026
5f64c3a
docs(udf): link design approval record
iamlinjunhong Sep 24, 2026
2b7a445
docs(udf): record current-stage design approvals
iamlinjunhong Sep 24, 2026
f95e25f
fix(optools): keep watchdog diagnostics out of UT report
iamlinjunhong Sep 25, 2026
ef5eef9
fix(udf): preserve recovered catalog and protocol repair
iamlinjunhong Oct 5, 2026
9bc61fd
fix(udf): close catalog and execution protocol admission
iamlinjunhong Oct 6, 2026
18b1706
fix(udf): close catalog repair admission
iamlinjunhong Oct 8, 2026
5d49323
fix(udf): regenerate merged mysql parser
iamlinjunhong Oct 8, 2026
f4fd1a2
test(bootstrap): pin historical compensation fixtures
iamlinjunhong Oct 8, 2026
cbce101
test(udf): clean rebase upgrade imports
iamlinjunhong Oct 8, 2026
e37f1ec
fix(udf): preserve routine catalogs across restore
iamlinjunhong Oct 8, 2026
a844304
test(frontend): mock routine catalog restore schema
iamlinjunhong Oct 8, 2026
30df6d6
docs(udf): clarify independent approval status
iamlinjunhong Oct 9, 2026
28cfb61
fix(udf): assign fresh protocol after main rebase
iamlinjunhong Oct 9, 2026
a95aac3
fix(udf): preserve official catalog migrations and add v4.0.14 repair
iamlinjunhong Oct 9, 2026
eb071d8
fix(udf): allocate protocol after upstream rebase
iamlinjunhong Oct 9, 2026
9182a8c
optools: target embedded watchdog in stderr regression test
iamlinjunhong Oct 10, 2026
21a4fb4
fix(udf): allocate MORPC 110 after upstream rebase
iamlinjunhong Oct 10, 2026
f05d381
test(optools): isolate embedded watchdog fixture by platform
iamlinjunhong Oct 10, 2026
d680009
fix(udf): repair revision restore and preserve published upgrade hand…
iamlinjunhong Oct 11, 2026
39d24f2
fix(udf): preserve protocol and integer contracts after rebase
iamlinjunhong Oct 12, 2026
21bb44e
docs(udf): record r8 contract after upstream rebase
iamlinjunhong Oct 12, 2026
9b01c6c
fix(udf): reconcile Python protocol with index search scans
iamlinjunhong Oct 12, 2026
02e9a81
docs(udf): align active protocol references with MORPC 112
iamlinjunhong Oct 12, 2026
08e2d6c
test: isolate embedded admission release channels after main rebase
iamlinjunhong Oct 12, 2026
fa5cb05
fix(udf): advance Python protocol admission after calendar contracts
iamlinjunhong Oct 13, 2026
12b040d
fix(udf): allocate MORPC 114 after main rebase
iamlinjunhong Oct 14, 2026
818ca31
fix(udf): allocate MORPC 115 and refresh planner fixtures
iamlinjunhong Oct 15, 2026
264c2cb
fix(udf): allocate MORPC 116 after upstream rebase
iamlinjunhong Oct 15, 2026
43b7ef5
fix(udf): allocate MORPC 117 after upstream rebase
iamlinjunhong Oct 16, 2026
85813e6
fix(udf): allocate MORPC 118 and isolate Python test helpers
iamlinjunhong Oct 16, 2026
818d27d
fix(udf): preserve catalog 4.0.17 and add 4.0.18 repair
iamlinjunhong Oct 17, 2026
7121328
fix(udf): advance Python capability after session control rebase
iamlinjunhong Oct 19, 2026
a032ad6
test(ut): synchronize embedded admission with readiness barriers
iamlinjunhong Oct 19, 2026
89426f5
fix(udf): allocate MORPC 122 after DECIMAL DIV rebase
iamlinjunhong Oct 19, 2026
fc106fc
fix(udf): preserve temporal epoch and advance Python admission
iamlinjunhong Oct 19, 2026
d6a4c0d
fix(udf): preserve nonblocking lock protocol during rebase
iamlinjunhong Oct 20, 2026
b128883
Fix Python protocol admission after fractional TIMESTAMPADD rebase
iamlinjunhong Oct 20, 2026
c7a7a87
Test merged diagnostic expression transport contracts
iamlinjunhong Oct 20, 2026
36964f9
Expose fixed-snapshot namespace admission diagnostics
iamlinjunhong Oct 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,6 @@ node-*-data/
pkg/catalog/test/
pkg/config/system_vars.go
pkg/config/system_vars_test.go
pkg/udf/pythonservice/pyserver/udf/
pkg/udf/pythonservice/pyserver/__pycache__/
path_to_file
tester-log/
ut-report/
Expand Down
21 changes: 14 additions & 7 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,20 +35,27 @@ linters:
- $all
- '!$test'
- '!pkg/iceberg/adapter/iceberggo/**/*.go'
# Arrow IPC is isolated to the ingestion bridge and its external
# scan reader. Keep the dependency out of all other production
# packages, including the Iceberg-facing layers.
deny:
- pkg: github.com/apache/iceberg-go
desc: Iceberg dependency must stay behind pkg/iceberg/adapter/iceberggo
arrow-boundary:
list-mode: lax
files:
- $all
- '!$test'
- '!pkg/iceberg/adapter/iceberggo/**/*.go'
# Arrow belongs to the ingestion and external UDF boundaries.
# These owners do not also receive permission to import Iceberg.
- '!**/pkg/container/arrowbridge/*.go'
- '!**/pkg/sql/colexec/external/arrowio/*.go'
- '!**/pkg/sql/colexec/external/reader_arrow.go'
- '!**/pkg/sql/compile/compile.go'
- '!**/pkg/udf/python/*.go'
deny:
- pkg: github.com/apache/iceberg-go
desc: Iceberg dependency must stay behind pkg/iceberg/adapter/iceberggo
- pkg: github.com/apache/arrow-go
desc: Arrow dependency must not leak outside the Iceberg adapter
desc: Arrow dependency must stay behind an approved Arrow owner
- pkg: github.com/apache/arrow/go
desc: Arrow dependency must not leak outside the Iceberg adapter
desc: Arrow dependency must stay behind an approved Arrow owner
govet:
disable:
- fieldalignment
Expand Down
8 changes: 4 additions & 4 deletions cmd/mo-service/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ import (
"github.com/matrixorigin/matrixone/pkg/perfcounter"
"github.com/matrixorigin/matrixone/pkg/proxy"
"github.com/matrixorigin/matrixone/pkg/tnservice"
"github.com/matrixorigin/matrixone/pkg/udf/pythonservice"
"github.com/matrixorigin/matrixone/pkg/udf/python"
"github.com/matrixorigin/matrixone/pkg/util/debug/goroutine"
tomlutil "github.com/matrixorigin/matrixone/pkg/util/toml"
"github.com/matrixorigin/matrixone/pkg/version"
Expand Down Expand Up @@ -118,8 +118,8 @@ type Config struct {
CN cnservice.Config `toml:"cn"`
// ProxyConfig is the config of proxy.
ProxyConfig proxy.Config `toml:"proxy"`
// PythonUdfServerConfig is the config of python udf server
PythonUdfServerConfig pythonservice.Config `toml:"python-udf-server"`
// PythonUdfWorkerConfig is the config of the Python UDF worker.
PythonUdfWorkerConfig python.Config `toml:"python-udf-worker"`
// Observability parameters for the metric/trace
Observability config.ObservabilityParameters `toml:"observability"`

Expand Down Expand Up @@ -594,7 +594,7 @@ func (c *Config) mustGetServiceUUID() string {
case metadata.ServiceType_PROXY:
return c.ProxyConfig.UUID
case metadata.ServiceType_PYTHON_UDF:
return c.PythonUdfServerConfig.UUID
return c.PythonUdfWorkerConfig.UUID
}
panic("impossible")
}
Expand Down
37 changes: 27 additions & 10 deletions cmd/mo-service/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ import (
qclient "github.com/matrixorigin/matrixone/pkg/queryservice/client"
"github.com/matrixorigin/matrixone/pkg/sql/compile"
"github.com/matrixorigin/matrixone/pkg/tnservice"
"github.com/matrixorigin/matrixone/pkg/udf/pythonservice"
"github.com/matrixorigin/matrixone/pkg/udf/python"
"github.com/matrixorigin/matrixone/pkg/util/debug/goroutine"
"github.com/matrixorigin/matrixone/pkg/util/export"
"github.com/matrixorigin/matrixone/pkg/util/export/table"
Expand Down Expand Up @@ -294,7 +294,7 @@ func startService(
case metadata.ServiceType_LOG:
return startLogService(cfg, stopper, fs, shutdownC)
case metadata.ServiceType_PYTHON_UDF:
return startPythonUdfService(cfg, stopper)
return startPythonUdfWorker(cfg, stopper)
default:
panic("unknown service type")
}
Expand Down Expand Up @@ -741,8 +741,8 @@ func waitProxyFileServiceRetry(ctx context.Context, delay time.Duration) error {
}
}

// startPythonUdfService starts the python udf service.
func startPythonUdfService(cfg *Config, stopper *stopper.Stopper) error {
// startPythonUdfWorker starts the Python UDF worker.
func startPythonUdfWorker(cfg *Config, stopper *stopper.Stopper) error {
if err := waitClusterCondition(cfg.mustGetServiceUUID(), cfg.HAKeeperClient, waitHAKeeperRunning); err != nil {
return err
}
Expand All @@ -755,22 +755,39 @@ func startPythonUdfService(cfg *Config, stopper *stopper.Stopper) error {
finish(err)
})
}
err := stopper.RunNamedTask("python-udf-service", func(ctx context.Context) {
err := stopper.RunNamedTask("python-udf-worker", func(ctx context.Context) {
var closeErr error
defer func() { finishTask(closeErr) }()
roleCtx, cancelRole := serviceLifecycle.roleContext(ctx, serviceRolePython)
defer cancelRole()
s, err := pythonservice.NewService(cfg.PythonUdfServerConfig)
s, err := python.NewSupervisor(cfg.PythonUdfWorkerConfig)
if err != nil {
panic(err)
}
if err := s.Start(); err != nil {
panic(err)
}
<-roleCtx.Done()
if err := s.Close(); err != nil {
closeErr = err
logutil.GetGlobalLogger().Error("failed to close python udf service", zap.Error(err))
workerDone := s.Done()
select {
case <-roleCtx.Done():
if err := s.Close(); err != nil {
closeErr = err
logutil.GetGlobalLogger().Error("failed to close Python UDF worker", zap.Error(err))
}
case <-workerDone:
// A worker exit while the role is still running leaves CN with a
// configured but unusable Python runtime. Surface it as a fatal
// service event so the existing lifecycle supervisor drains CN
// before the worker dependency and does not accept partial service
// availability. A zero exit is still unexpected here.
if roleCtx.Err() == nil {
workerErr := s.Err()
if workerErr == nil {
workerErr = errors.New("process exited without an error")
}
closeErr = fmt.Errorf("python UDF worker exited unexpectedly: %w", workerErr)
serviceLifecycle.notifyFatal(closeErr)
}
}
})
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion docs/cn/stream_transport_fast_upload_plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Phase 0 — Protobuf / gRPC contract

New file `proto/datastream/v1/datastream.proto` (proto3, **not** gogoproto —
this proto is shared with Java, so use standard `protoc-gen-go` +
`protoc-gen-go-grpc`, same toolchain as `pkg/udf/udf.proto`, which is the
`protoc-gen-go-grpc`, using the repository's current protobuf toolchain, which is the
existing real-gRPC precedent in the repo; the main `proto/*.proto` files are
gogo-generated and Java-hostile).

Expand Down
112 changes: 112 additions & 0 deletions docs/design/python_udf.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
# Python UDF implementation and rollout scope

This describes the implemented, owner-authorized external Python adapter and its
PR acceptance boundary. The relevant current-stage Catalog, SQL/planner,
migration/restore, Python ABI, Flight, and resource contracts are consolidated
in the [versioned current-stage design](python_udf_current_stage.md). Broader
long-term designs continue to inform future work; this page does not approve a
production tenant-isolation model.

## Owner-approved stage scope

On 2026-09-24, feature owner `iamlinjunhong` approved this PR for testing and
development-stage acceptance. The user guide and SQL examples are recorded in
[issue #28132](https://github.com/matrixorigin/matrixone/issues/28132#issuecomment-5748253137).
This PR does not claim production rollout, sandbox isolation, protection for
untrusted Python, or authenticated/TLS Flight transport. Those remain separate
production acceptance gates. Python stays disabled in generic launch and requires
explicit opt-in in the test/development configurations.

This stage decision is the feature owner's authorization for the current PR
scope; it is not a claim that Architecture, Security, SQL/Planner, Runtime,
Catalog, or Operator owners have approved the future production design.

## Execution and identity

CREATE/REPLACE validates Python syntax and the handler contract before publishing
a definition. The shared Catalog stores immutable typed revisions and complete
argument/return descriptors. Artifacts are digest-addressed, account-scoped and
published through FileService; worker execution receives the verified artifact
from CN. The worker needs no object-storage credentials or query-time package
installation. Old demo definitions are inert: explicitly recreate them using the
current DDL and SDK. Unknown definition, plan, Arrow, SDK or wire contracts fail
before user execution; no legacy fallback or automatic adapter is provided.

Planning resolves an exact FunctionRef and RoutineCall. Prepared/cache reuse
validates the selected revision and the complete overload namespace state; see
[routine namespace validation](routine_namespace_validation.md). Execution never
resolves a mutable latest revision. Clone and restore preserve supported catalog
contracts and republish Python artifacts for the destination account.

CN keeps native MO vectors. The expression framework dispatches typed Python calls
to ExternalRoutineEval; the parent evaluator owns argument evaluation, casts,
CASE/selection and NULL guards. The physical stage compacts selected rows,
admits bounded asynchronous work and scatters verified results, preserving empty
input, NULLs, zero arguments, nested calls and default VOLATILE semantics.

The Gateway is a CN library, not a separately deployed service. It connects to
Arrow Flight served by the Python worker. No second Flight daemon is required.
A worker creates bounded handler subprocesses; each handler/module can be reused
only within the invocation's bounded burst. It does not pool user heaps across
invocations. SCALAR handlers receive `(ctx, scalar...)`; VECTOR handlers receive
`(ctx, arrays...)` and use `ctx.num_rows` for output shape. Arrow field/schema
metadata comes from the trusted adapter, not handler-supplied identity.

## Completion and resources

K bounds active Gateway invocations, H bounds handler execution slots, and W=1
bounds stream batch progress. Admission, group/member state, terminal records and
per-account/per-owner quotas have independent owners and budgets. Protocol steps
include EndInput, InputConsumed, result ACK and Finish/FinishAck. Started work is
never transparently replayed. Cancellation and capability refresh waiters progress
independently; generation fences reject stale completions.

Process cleanup must cover both termination and reaping. Handler sessions own
pipes, child/watchdog processes and H/quota until cleanup succeeds; partial
initialization transfers a failed session to the same bounded pending-cleanup
owner. Linux containers run `/usr/bin/tini -- python -u worker.py`; init adopts
orphaned descendants after their handler leader exits. An Operator command override
must retain this init process. Native Supervisor launches rely on the host's init
(or an explicit subreaper in a container test harness).

## Enablement and deployment boundary

Generic launch keeps Python disabled. The explicit worker-enabled launch and
ordinary BVT entry point enable the unisolated adapter. See
[Python BVT and local launch](../../test/distributed/cases/udf_python/README.md).
Compose configures a separate worker endpoint for each CN. The `PYTHON_UDF`
mo-service role wraps a Go Supervisor; the standalone worker image runs Python
under init. These are different launch forms for the same Flight service.

Gateway and worker must match the current capability contract, including tzdata.
The worker image replaces its entire zoneinfo tree from the MO runtime base;
upgrading tzdata also changes the environment digest of definitions. Check existing
definitions before enabling an incompatible environment and explicitly rebuild
where required. Matching software version strings alone are not this check.

`enabled` and `allow-unisolated` are explicit gates. This implementation does not
provide sandbox isolation or authenticated/TLS Flight transport. Same-Pod Operator
configuration binds the worker to loopback and controls Pod composition; it does
not add broad CN ingress grants. External worker exposure needs a separately
approved security/deployment design. Worker availability is a Python execution
condition, not evidence of production tenant isolation.

## Verification and remaining scope

The regression suite covers scalar/vector Arrow computation, types and malformed
values, guarded SQL positions and DML atomicity, revision/overload invalidation,
exact-descriptor DROP and cross-account snapshot restore. Runtime tests cover
ACK/Finish, cancellation, quotas, initialization/cleanup failure, worker death,
stale events and real Flight consumers. Operator status wire fixtures pin the
producer/consumer error contract.

Linux PR validation uses the repository CGo wrapper, two CNs with distinct
Supervisor/worker endpoints, ordinary SQL/Python BVT, current worker image and
process-tree fault injection. Record the exact revision, selected tests, image
and terminal result with each run; unit or CNI echo tests are not complete
Operator rollout evidence.

Sandbox, production deployment approval, imported dependency environments and
W>1/cumulative ACK enablement remain separate work. W=1 measurements do not prove
that a wider window has no benefit. This PR is related to issue #28132 and does
not close that issue's broader isolated-runtime acceptance criteria.
Loading
Loading