Title: Support `CelOptions.maxRegexProgramSize(int)` to limit RE2 program size · Issue #545 · cel-expr/cel-java · GitHub
Open Graph Title: Support `CelOptions.maxRegexProgramSize(int)` to limit RE2 program size · Issue #545 · cel-expr/cel-java
X Title: Support `CelOptions.maxRegexProgramSize(int)` to limit RE2 program size · Issue #545 · cel-expr/cel-java
Description: Feature request checklist There are no issues that match the desired change The change is large enough it can't be addressed with a simple Pull Request If this is a bug, please file a Bug Report. Change To make CEL environment setup cons...
Open Graph Description: Feature request checklist There are no issues that match the desired change The change is large enough it can't be addressed with a simple Pull Request If this is a bug, please file a Bug Report. C...
X Description: Feature request checklist There are no issues that match the desired change The change is large enough it can't be addressed with a simple Pull Request If this is a bug, please file a Bug Repor...
Opengraph URL: https://github.com/cel-expr/cel-java/issues/545
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Support `CelOptions.maxRegexProgramSize(int)` to limit RE2 program size","articleBody":"### Feature request checklist\n\n- [x] There are no issues that match the desired change\n- [x] The change is large enough it can't be addressed with a simple Pull Request\n- [x] If this is a bug, please file a [Bug Report](./ISSUE_TEMPLATE).\n\n### Change\nTo make CEL environment setup consistent across CEL implementations, I propose to add `CelOptions.maxRegexProgramSize(int)` to CEL-Java. This option should work similar to `InterpreterOptions.regex_max_program_size` in CEL-Cpp (see nuances below).\n\nRE2 program size should be verified when the CEL program is created from the AST (AFAIK this is [how cel-cpp works](https://github.com/google/cel-cpp/blob/e6ba30e29a51a2fec3e176e24789e6113e1cd2af/runtime/standard/regex_functions.cc)).\n\n### Nuances\nThe program size represents a very approximate measure of a regexp's \"cost\". There are no guarantees on the implementation details or claims about the properties of the program size (except \"larger numbers are more expensive than smaller numbers\"). \n\nCurrently the program size is the same as the number of instructions of the regex program. However, the number of instructions in a regex depends on the concrete RE2 implementation. The implication of using the number of instructions as the program size is that:\n\n\u003e [!IMPORTANT]\n\u003e There's no guarantee that RE2 program size has the exact same value in CPP, Go and Java.\n\u003e We should communicate this in the docs.\n\nFor example:\n```py\n[\"\", \"a\", \"^\", \"^$\", \"a+b\", \"a+b?\", \"(a+b)\", \"a+b.*\", \"(a+b?)\"] # pattern\n[4, 5, 2, 2, 7, 8, 9, 15, 10] # program size: cpp re2-2024-07-02\n[3, 3, 3, 4, 5, 6, 7, 7, 8] # program size: java re2j v1.8 \n[3, 3, 3, 4, 5, 6, 7, 7, 8] # program size: go v1.24.1\n# (go v1.24.1 is identical to re2j v1.8)\n```\n\n### Context\nUnlike the canonical C++ RE2 implementation, [re2j](https://github.com/google/re2j) (Java RE2 port) didn't expose the program size in [public APIs](https://javadoc.io/doc/com.google.re2j/re2j/latest). To address this inconsistency I made google/re2j#180, and it was recently merged.\n\nWhen the next re2j version is released, we'll be able to determine the program size using `Pattern.programSize()`.\n\n### Example\n```java\nprivate static final CelRuntime CEL_RUNTIME = CelRuntimeFactory\n .standardCelRuntimeBuilder()\n .setOptions(CelOptions.current().maxRegexProgramSize(5).build())\n .build();\n```\n\n```java\n@Test\npublic void regex_maxProgramSize() throws Exception {\n CelCompiler CEL_COMPILER = CelCompilerFactory.standardCelCompilerBuilder()\n .setResultType(SimpleType.BOOL)\n .build();\n\n String expr = \"matches('foobar', 'a+b?')\";\n CelRuntime.Program program = CEL_RUNTIME.createProgram(CEL_COMPILER.compile(expr).getAst());\n CelEvaluationException celErr = assertThrows(CelEvaluationException.class, program::eval);\n assertThat(celErr.getErrorCode()).isEqualTo(CelErrorCode.INVALID_ARGUMENT);\n}\n```\n\nSome other known regex program sizes for java can be found in re2j's [`PatternTest.java`](https://github.com/google/re2j/blob/2757238ff7144de7ae9bbf707ebc22f9cc3b1249/javatests/com/google/re2j/PatternTest.java#L167-L178.).\n\n### Related\n- google/re2j#180\n- Internal ref: go/grpc-cel-integration\n\nCC @l46kok, @TristonianJones ","author":{"url":"https://github.com/sergiitk","@type":"Person","name":"sergiitk"},"datePublished":"2025-01-07T03:10:22.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/545/cel-java/issues/545"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:fe585e11-39be-ea8d-d7d8-1ba384210366 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 9B8C:1E240D:5398D3:795AC9:6A4E0930 |
| html-safe-nonce | 394cbfb643190d3c191844c47243c4217921445da5553606c6ddbd664385ee55 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5QjhDOjFFMjQwRDo1Mzk4RDM6Nzk1QUM5OjZBNEUwOTMwIiwidmlzaXRvcl9pZCI6Ijg5MDkyMTc5MjU5NTQyOTY4MCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 02f9e59b456fa874ed17712bc71e6edb8785df5148a1a5a772c6f5b0ef6584d1 |
| hovercard-subject-tag | issue:2771800395 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/cel-expr/cel-java/545/issue_layout |
| twitter:image | https://opengraph.githubassets.com/1c25c21935b13f649a793561b36248da8573f96f021ad4eb7cd836e3ecfec911/cel-expr/cel-java/issues/545 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/1c25c21935b13f649a793561b36248da8573f96f021ad4eb7cd836e3ecfec911/cel-expr/cel-java/issues/545 |
| og:image:alt | Feature request checklist There are no issues that match the desired change The change is large enough it can't be addressed with a simple Pull Request If this is a bug, please file a Bug Report. C... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | sergiitk |
| hostname | github.com |
| expected-hostname | github.com |
| None | df0492960db29b4938cb72070351d6b1d0c6c0767b27ceb8394bbf4fcc0223c6 |
| turbo-cache-control | no-preview |
| go-import | github.com/cel-expr/cel-java git https://github.com/cel-expr/cel-java.git |
| octolytics-dimension-user_id | 186625994 |
| octolytics-dimension-user_login | cel-expr |
| octolytics-dimension-repository_id | 587078119 |
| octolytics-dimension-repository_nwo | cel-expr/cel-java |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 587078119 |
| octolytics-dimension-repository_network_root_nwo | cel-expr/cel-java |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 52bde38e24398476f8eb1e0760c81346c6a00812 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width