)]}'
{
  "log": [
    {
      "commit": "d6f1b7f67087bd86f2e0fe6e1b6c897b7e569926",
      "tree": "7c8e723de4c82fd28634dc50cf06591c0c88189a",
      "parents": [
        "a29e2810b1ac5a9e4c3e553879b683a6a1902c8b"
      ],
      "author": {
        "name": "Greg Felice",
        "email": "gregfelice@gmail.com",
        "time": "Mon Apr 06 11:34:47 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 08:34:47 2026 -0700"
      },
      "message": "Fix MATCH on brand-new label after CREATE returning 0 rows (#2341)\n\n* Fix MATCH on brand-new label after CREATE returning 0 rows (issue #2193)\n\nWhen CREATE introduces a new label and a subsequent MATCH references it\n(e.g., CREATE (:Person) WITH ... MATCH (p:Person)), the query returns\n0 rows on first execution but works on the second.\n\nRoot cause: match_check_valid_label() in transform_cypher_match() runs\nbefore transform_prev_cypher_clause() processes the predecessor chain.\nSince CREATE has not yet executed its transform (which creates the label\ntable as a side effect), the label is not in the cache and the check\ngenerates a One-Time Filter: false plan that returns no rows.\n\nFix: Skip the early label validity check when the predecessor clause\nchain contains a data-modifying operation (CREATE, SET, DELETE, MERGE).\nAfter transform_prev_cypher_clause() completes and any new labels exist\nin the cache, run a deferred label check. If the labels are still\ninvalid at that point, generate an empty result via makeBoolConst(false).\n\nThis preserves the existing behavior for MATCH without DML predecessors\n(e.g., MATCH-MATCH chains still get the early check and proper error\nmessages for invalid labels).\n\nDepends on: PR #2340 (clause_chain_has_dml helper)\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* Address review feedback: fix variable registration for deferred label check\n\nWhen the deferred label validity check (DML predecessor + non-existent\nlabel) found an invalid label, the code skipped transform_match_pattern()\nentirely, which meant MATCH-introduced variables were never registered\nin the namespace. This would cause errors if a later clause referenced\nthose variables (e.g., RETURN p).\n\nFix: mirror the early-check strategy by injecting a paradoxical WHERE\n(true \u003d false) and always calling transform_match_pattern(). Variables\nget registered normally; zero rows are returned via the impossible qual.\n\nAlso add ORDER BY to multi-row regression tests for deterministic output,\nand add a test case for DML predecessor + non-existent label + returning\na MATCH-introduced variable.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* Address Copilot review: DRY false-where helper, cache has_dml, ORDER BY in tests\n\n- Factor duplicated WHERE true\u003dfalse construction into\n  make_false_where_clause() helper (used in both early and deferred\n  label validation paths)\n- Compute clause_chain_has_dml() once and reuse, avoiding repeated\n  clause chain traversal\n- Add ORDER BY to the single-CREATE City regression test for\n  deterministic result ordering\n\n* Address Copilot review: volatile false predicate, DML side-effect test\n\n1. Prevent plan elimination of DML predecessor: replace constant\n   (true \u003d false) with volatile (random() IS NULL) in the deferred\n   label check path. PG\u0027s planner can constant-fold the former into\n   a One-Time Filter: false, skipping the DML scan entirely.\n\n2. Unify make_false_where_clause(bool volatile_needed): merge the\n   constant and volatile variants into a single parameterized\n   function. Call sites are now self-documenting:\n   - make_false_where_clause(false) for non-DML path\n   - make_false_where_clause(true) for DML predecessor path\n\n3. Document why add_volatile_wrapper() cannot be reused here (it\n   operates post-transform at the Expr level and returns agtype,\n   while the WHERE clause is built at the parse-tree level).\n\n4. Add regression test verifying CREATE side effects persist when\n   MATCH references a non-existent label after a DML predecessor.\n\nAll regression tests pass (cypher_match: ok).\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* Replace non-ASCII em dashes with -- in C comments\n\nASCII-only codebase convention; avoids encoding/tooling issues.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a29e2810b1ac5a9e4c3e553879b683a6a1902c8b",
      "tree": "cc54935eaba84efe8c9f3b28ef5291828b7e0531",
      "parents": [
        "90c33eb6b7c36f8280893bdc2b64666debb836de"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Apr 06 03:28:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 15:28:46 2026 +0500"
      },
      "message": "Fix nondeterministic age_global_graph regression test (#2365)\n\nThe age_global_graph test had two issues that could cause intermittent\nfailures:\n\n1. Nondeterministic warning output: The graph_stats() call on a graph\n   with deliberately deleted vertices produces WARNING messages for\n   dangling edges. These warnings are emitted by iterating edge label\n   tables (knows, stalks), and the iteration order is not guaranteed.\n   Since PostgreSQL WARNING messages cannot be caught or counted from\n   SQL (only ERROR and above are catchable via PL/pgSQL exception\n   handling), we suppress them with SET client_min_messages \u003d error.\n   The suppressed warnings are documented verbatim in comments. The\n   graph_stats() result row still validates correct dangling-edge\n   handling.\n\n2. Nondeterministic row ordering: Multiple MATCH...RETURN queries\n   returned multi-row results without ORDER BY, relying on scan order.\n   Added ORDER BY id(u), id(v), id(e), id(n), or id(a) as appropriate\n   to all MATCH...RETURN queries for future-proofing, even those\n   currently returning a single row.\n\nFiles changed:\n  regress/sql/age_global_graph.sql\n  regress/expected/age_global_graph.out\n\nCo-authored-by: GitHub Copilot \u003cnoreply@github.com\u003e"
    },
    {
      "commit": "90c33eb6b7c36f8280893bdc2b64666debb836de",
      "tree": "bae2b661e266b63d326b87e37d425589eb460310",
      "parents": [
        "23146a44c36c0ece003b7b91f7942385ae8ac5e7"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Apr 06 03:27:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 15:27:03 2026 +0500"
      },
      "message": "Add extension upgrade template regression test (#2364)\n\nNote: This PR was created with AI tools and a human.\n\nAdd a version-agnostic regression test (age_upgrade) that validates the\nupgrade template (age--\u003cVER\u003e--y.y.y.sql) works correctly by simulating a\nfull extension version upgrade within \"make installcheck\".\n\nAdd full upgrade scripts to the install path (DATA) in the Makefile,\nexcluding template upgrade files. This enables the install to copy all\nversion upgrade files into the PG AGE install. This is needed for\nALTER EXTENSION\n\nAdjusted installcheck.yaml to allow git commit history for this test.\n\nMakefile infrastructure:\n- Build the install SQL (age--\u003cCURR\u003e.sql) from the initial version-bump\n  commit in git history, so CREATE EXTENSION installs \"day-one\" SQL while\n  the .so comes from current HEAD — implicitly testing backward compat.\n- Build a synthetic \"next\" version (age--\u003cNEXT\u003e.sql) from HEAD and stamp\n  the upgrade template to produce age--\u003cCURR\u003e--\u003cNEXT\u003e.sql.\n- Add an installcheck prerequisite that temporarily installs both synthetic\n  files into the PG extension directory; a generated cleanup script removes\n  them at the end of the test via \\! shell escape. EXTRA_CLEAN catches\n  stragglers on \"make clean\".\n- Skip the test automatically when: (a) no git history (tarball builds),\n  (b) no upgrade template exists, or (c) a real upgrade script from the\n  current version is already committed (detected via git ls-files).o\n\nRegression test (regress/sql/age_upgrade.sql):\n- Creates 3 graphs (company, network, routes) with 8 vertex labels,\n  8 edge labels, 23 vertices, 28 edges, and 4 GIN indexes.\n- Records integrity checksums (agtype sums), vertex/edge counts, and\n  label counts before the upgrade; repeats all checks after ALTER\n  EXTENSION UPDATE to the synthetic next version.\n- Verifies structural queries: VLE management chains, circular follow\n  chains, flight distances with edge properties.\n- Verifies all 4 GIN indexes survive the upgrade via pg_indexes.\n- Uses ORDER BY on all multi-row queries for deterministic output.\n- Returns agtype natively (no ::numeric casts) for portability.\n- Avoids version-dependent output (checks boolean IS NOT NULL instead\n  of printing the version string).\n- Uses JOIN-based label counts to avoid NULL comparison bugs with the\n  internal _ag_catalog graph.\n- Cleans up all 3 graphs and restores the default AGE version.\n\nmodified:   Makefile\nnew file:   regress/expected/age_upgrade.out\nnew file:   regress/sql/age_upgrade.sql\nmodified:   .github/workflows/installcheck.yaml"
    },
    {
      "commit": "23146a44c36c0ece003b7b91f7942385ae8ac5e7",
      "tree": "534bdd7ace54c6ac8cf6de56281647cc8a255c84",
      "parents": [
        "d0741d8dc90f0c2f636f049b48b9d41eb54516cf"
      ],
      "author": {
        "name": "Greg Felice",
        "email": "gregfelice@gmail.com",
        "time": "Tue Mar 03 12:52:48 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 03 09:52:48 2026 -0800"
      },
      "message": "Fix crash in PREPARE with property parameter when enable_containment is off (#2339)\n\n* Fix crash in PREPARE with property parameter when enable_containment is off\n\nWhen age.enable_containment is set to off, executing a PREPARE statement\nwith a property parameter (e.g., MATCH (n $props) RETURN n) causes a\nsegfault. The crash occurs in transform_map_to_ind_recursive because\nthe property_constraints node is a cypher_param, not a cypher_map, but\nis blindly cast to cypher_map and its keyvals field is dereferenced.\n\nThree fixes:\n- In create_property_constraints, when enable_containment is off and the\n  constraint is a cypher_param, fall back to the containment operator\n  (@\u003e) since map decomposition requires known keys at parse time.\n- In transform_match_entities, guard the keep_null assignment for both\n  vertex and edge property constraints with is_ag_node checks to avoid\n  writing to the wrong struct layout.\n\nFixes #1964\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* Fix @\u003e vs @\u003e\u003e for \u003dproperties form with PREPARE and add tests\n\nWhen MATCH uses the \u003dproperties form (e.g., MATCH (n \u003d $props)), the\nenable_containment\u003don path correctly uses @\u003e\u003e (top-level containment).\nThe parameter fallback path unconditionally used @\u003e (deep containment),\nignoring the use_equals flag. Fix the fallback to mirror the\nenable_containment path by selecting @\u003e\u003e when use_equals is set.\n\nAdd regression tests for \u003dproperties form with PREPARE for both\nvertices and edges, with enable_containment on and off.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "d0741d8dc90f0c2f636f049b48b9d41eb54516cf",
      "tree": "3937e51275d5ac0b7dd06340fde90d4be1985d32",
      "parents": [
        "a21120bf139b156661ef10374630e688c0cc46fb"
      ],
      "author": {
        "name": "Greg Felice",
        "email": "gregfelice@gmail.com",
        "time": "Mon Mar 02 13:09:19 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 02 10:09:19 2026 -0800"
      },
      "message": "Fix entity_exists() CID visibility for CREATE + WITH + MERGE (#2343)\n\n* Fix entity_exists() CID visibility for CREATE + WITH + MERGE (#1954)\n\nWhen a Cypher query chains CREATE ... WITH ... MERGE, vertices created\nby CREATE become invisible to entity_exists() after a threshold number\nof input rows. This causes MERGE to throw \"vertex assigned to variable\nwas deleted\".\n\nRoot cause: CREATE calls CommandCounterIncrement() which advances the\nglobal command ID, but does not update es_snapshot-\u003ecurcid. The\nDecrement/Increment CID macros used by the executors bring curcid back\nto the same value on each iteration. After enough rows, newly inserted\nvertices have a Cmin \u003e\u003d curcid and HeapTupleSatisfiesMVCC rejects them\n(requires Cmin \u003c curcid).\n\nFix: In entity_exists(), temporarily set es_snapshot-\u003ecurcid to the\ncurrent global command ID (via GetCurrentCommandId) for the duration\nof the scan, then restore it. This makes all entities inserted by\npreceding clauses in the same query visible to the existence check.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* Use Max() to prevent curcid regression in entity_exists()\n\nAddress review feedback: es_snapshot-\u003ecurcid can be ahead of the\nglobal CID due to Increment_Estate_CommandId macros. Unconditionally\nassigning GetCurrentCommandId(false) could decrease curcid, making\npreviously visible tuples invisible. Use Max(saved_curcid,\nGetCurrentCommandId(false)) to ensure we only ever increase visibility.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a21120bf139b156661ef10374630e688c0cc46fb",
      "tree": "e67db7efa4ca9728956810009b1859bac22c5024",
      "parents": [
        "217467a36a1c29df4b918faf6adb6e75aec28817"
      ],
      "author": {
        "name": "Greg Felice",
        "email": "gregfelice@gmail.com",
        "time": "Mon Mar 02 11:27:04 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 02 08:27:04 2026 -0800"
      },
      "message": "Support doubled-quote escaping in Cypher string literals (issue #2222) (#2342)\n\nSQL drivers (psycopg2, JDBC, etc.) escape single quotes by doubling\nthem (\u0027isn\u0027\u0027t\u0027) when substituting parameters into queries. When these\nsubstitutions land inside Cypher\u0027s $$ block, the Cypher scanner rejects\nthem because it only recognizes backslash escaping (\\\u0027). This makes it\ndifficult to pass strings containing apostrophes through SQL drivers.\n\nAdd \u0027\u0027 and \"\" as escape sequences in the Cypher scanner, following the\nsame pattern already used for backtick-quoted identifiers (``). Flex\npicks the longer two-character match over the one-character closing\nquote, so the change is backwards-compatible -- \u0027\u0027 was previously a\nsyntax error.\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "217467a36a1c29df4b918faf6adb6e75aec28817",
      "tree": "c136a7bc5162ef8e4d7feb1eedc1fbcc6b0d038b",
      "parents": [
        "20ada845280c4370909d82b8652f6a082e5aa5df"
      ],
      "author": {
        "name": "Greg Felice",
        "email": "gregfelice@gmail.com",
        "time": "Fri Feb 27 17:10:04 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 27 14:10:04 2026 -0800"
      },
      "message": "Fix MATCH after CREATE returning 0 rows (issue #2308) (#2340)\n\nWhen a MATCH clause follows CREATE + WITH and re-uses bound variables\n(e.g. CREATE (a)-[e]-\u003e(b) WITH a,e,b MATCH p\u003d(a)-[e]-\u003e(b)), the MATCH\ngenerates filter quals (age_start_id(e) \u003d age_id(a), etc.) that\nreference only columns from the predecessor subquery. PostgreSQL\u0027s\noptimizer pushes these quals through the transparent subquery layers\ninto the CREATE\u0027s child plan, where they evaluate on NULL values before\nCREATE has executed — always yielding 0 rows.\n\nFix: mark the predecessor subquery RTE as security_barrier when the\nclause chain contains a data-modifying operation (CREATE, SET, DELETE,\nor MERGE). This prevents PostgreSQL from pushing filter quals into the\nsubquery, ensuring they evaluate after the DML produces output values.\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "20ada845280c4370909d82b8652f6a082e5aa5df",
      "tree": "6945374c4ebd9925cc920f966b9bbb2c31856c5e",
      "parents": [
        "346f319459e18db89deae30a3af7ea945bba101d"
      ],
      "author": {
        "name": "Greg Felice",
        "email": "gregfelice@gmail.com",
        "time": "Fri Feb 27 15:05:31 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 27 12:05:31 2026 -0800"
      },
      "message": "Fix chained MERGE not seeing sibling MERGE\u0027s changes (#1446) (#2344)\n\n* Fix chained MERGE not seeing sibling MERGE\u0027s changes (#1446)\n\nWhen multiple MERGEs are chained (e.g. MATCH ... MERGE ... MERGE ...),\nthe non-terminal (first) MERGE returned rows one at a time to the parent\nplan node. The parent MERGE\u0027s lateral join would materialize its hash\ntable on the first row, before the child MERGE had finished all its\niterations. This caused the second MERGE to not see entities created by\nthe first MERGE, leading to duplicate nodes.\n\nFix by making non-terminal MERGE eager: it processes ALL input rows and\nbuffers the projected results before returning any to the parent. This\nensures all entity creations are committed before any parent plan node\nscans the tables.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* Fix non-terminal MERGE empty-buffer fallthrough and add test\n\nWhen a non-terminal MERGE receives no input rows from its predecessor\n(e.g., MATCH returns 0 rows), the eager buffer is filled but empty.\nThe condition at line 688 checked `css-\u003eeager_tuples !\u003d NIL`, which\nevaluated to false for an empty buffer, causing execution to fall\nthrough to the terminal MERGE code path. This could incorrectly\ncreate entities when none should be created.\n\nFix by checking `css-\u003eeager_buffer_filled` instead, which correctly\ndistinguishes \"buffer not yet filled\" from \"buffer filled but empty\".\n\nAdd regression test for chained MERGE with empty MATCH result.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "346f319459e18db89deae30a3af7ea945bba101d",
      "tree": "3a770416ae7880ad270ca70fcfb3227cb8d884c8",
      "parents": [
        "5005c21e5c2aa5daaca909fee7c4f9ed8ccdf984"
      ],
      "author": {
        "name": "Greg Felice",
        "email": "gregfelice@gmail.com",
        "time": "Thu Feb 26 19:24:58 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 26 16:24:58 2026 -0800"
      },
      "message": "Fix VLE queries failing on read-only replicas (#2160) (#2345)\n\nThe global graph cache used by VLE acquired ShareLock when scanning\nvertex and edge label tables to populate in-memory hashtables. On\nread-only replicas (standby servers in recovery), PostgreSQL only\nallows RowExclusiveLock or less, so VLE queries would fail with:\n\n  \"cannot acquire lock mode ShareLock on database objects while\n   recovery is in progress\"\n\nChange all three functions in age_global_graph.c to use AccessShareLock\ninstead, which is sufficient for read-only table scans and is consistent\nwith the existing ag_cache.c code that performs identical operations.\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "5005c21e5c2aa5daaca909fee7c4f9ed8ccdf984",
      "tree": "dcbea7954f9fed7d88c44f41bd412bcb26330d0f",
      "parents": [
        "55476ad2875f37f5b65919b6eeab7d81fd65aa7c"
      ],
      "author": {
        "name": "Greg Felice",
        "email": "gregfelice@gmail.com",
        "time": "Thu Feb 26 18:30:56 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 26 15:30:56 2026 -0800"
      },
      "message": "Fix VLE NULL handling for chained OPTIONAL MATCH (#2337)\n\n* Fix VLE NULL handling for chained OPTIONAL MATCH (#2092)\n\nVLE functions (age_match_vle_terminal_edge, age_match_two_vle_edges,\nage_match_vle_edge_to_id_qual) threw errors when receiving NULL\narguments from OPTIONAL MATCH (LEFT JOIN) contexts. Additionally,\nbuild_local_vle_context crashed with a segfault when dereferencing\na NULL next_vertex pointer in the cached VLE context path.\n\nThese functions are used as join quals. In a LEFT JOIN, NULL arguments\nmean the inner side produced no match. The correct response is FALSE\n(no match), which lets PostgreSQL emit NULL-extended rows — the\nexpected OPTIONAL MATCH behavior. Errors or crashes are incorrect.\n\nChanges:\n- build_local_vle_context: guard against NULL next_vertex in cached\n  path; return NULL when vertex list is exhausted\n- age_vle: handle NULL return from build_local_vle_context with\n  SRF_RETURN_DONE\n- age_match_vle_terminal_edge: return FALSE on NULL arguments instead\n  of ereport(ERROR)\n- age_match_two_vle_edges: return FALSE on NULL arguments\n- age_match_vle_edge_to_id_qual: return FALSE on NULL arguments\n\nAll 32 regression tests pass including new tests for this fix.\n\n* Address review feedback: fix error message and add ORDER BY to tests\n\n- Fix errmsg in age_match_vle_terminal_edge() to use the correct\n  function name (was age_match_terminal_edge)\n- Add ORDER BY p.name to regression test queries to avoid\n  nondeterministic row ordering in expected output\n\nAI-assisted: Claude (Anthropic) was used in developing this fix.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "55476ad2875f37f5b65919b6eeab7d81fd65aa7c",
      "tree": "cc7a6430d0df83947374b029ecc969b55c8c95bb",
      "parents": [
        "3c4d9cc7456703f37d3f2d02e4cc79731b06542a"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Wed Feb 25 09:41:41 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 25 22:41:41 2026 +0500"
      },
      "message": "fix incorrect variable assignment (#2336)\n\nFixed an incorrect variable assignment, that was causing a warning\nmessage during compilation, on some compilers.\n\nThe create_index_on_column function assigned InvalidOid, instead\nof NIL or NULL.\n\n-    index_col-\u003ecollation \u003d InvalidOid;\n+    index_col-\u003ecollation \u003d NIL;\n\nNo regression tests were impacted.\n\nmodified:   src/backend/commands/label_commands.c"
    },
    {
      "commit": "3c4d9cc7456703f37d3f2d02e4cc79731b06542a",
      "tree": "6f8f5540d908d910a1e6a16136bd8f516804c904",
      "parents": [
        "fa91350b0a524e596e4fc85c9086565c60c00548"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Mon Feb 16 22:09:01 2026 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 16 09:09:01 2026 -0800"
      },
      "message": "Remove labeler github action (#2335)\n\n- dropped the labeler workflow because `pull_request_target` trigger\n  can be dangerous and the workflow wasn’t particularly useful."
    },
    {
      "commit": "fa91350b0a524e596e4fc85c9086565c60c00548",
      "tree": "2c4b38b3d7673207035d4ff3376e169b22bac314",
      "parents": [
        "0c9a527860cde710175fc9c171b6bbe9aaed45d6"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Feb 13 23:24:54 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Feb 14 12:24:54 2026 +0500"
      },
      "message": "Fix ISO C90 forbids mixed declarations and code warning (#2334)\n\nFixed the following ISO C90 warning -\n\nsrc/backend/utils/adt/agtype.c:7503:9: warning: ISO C90 forbids mixed declarations\nand code [-Wdeclaration-after-statement]\n 7503 |         enum agtype_value_type elem_type \u003d elem ? elem-\u003etype : AGTV_NULL;\n      |         ^~~~\n\nNo regression tests impacted.\n\nmodified:   src/backend/utils/adt/agtype.c"
    },
    {
      "commit": "0c9a527860cde710175fc9c171b6bbe9aaed45d6",
      "tree": "3330d15d98f2634e44690b45488be243b36e852e",
      "parents": [
        "77a16ece0bbd8f137ad40b4e203c9622c249352d"
      ],
      "author": {
        "name": "Maxim Korotkov",
        "email": "korotkov.maxim.s@gmail.com",
        "time": "Fri Feb 13 21:57:51 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 13 10:57:51 2026 -0800"
      },
      "message": "Fix null pointer handling in array iteration (#2313)\n\nPreviously, when iterating through an agtype container, the code would\naccess `elem-\u003eval` even when `elem` was null.\nThis adds a null check to set the result type to AGTV_NULL when the\nelement is null, preventing a potential segmentation fault.\n\nFixes: 4274f10 (\"Added the toStringList() function (#1084)\")\nFound by PostgresPro.\n\nSigned-off-by: Maksim Korotkov \u003cm.korotkov@postgrespro.ru\u003e"
    },
    {
      "commit": "77a16ece0bbd8f137ad40b4e203c9622c249352d",
      "tree": "91d8c3563b726194daf25dd2570cc709502b8f77",
      "parents": [
        "5f5b744a08641225652de83332d73bc7acfc889d"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Feb 13 09:31:35 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 13 22:31:35 2026 +0500"
      },
      "message": "Fix security vulnerabilities in Node.js driver (#2329)\n\nFix security vulnerabilities in Node.js driver and harden input\nvalidation and query construction.\n\nNote: This PR was created with AI tools and a human.\n\n- Add input validation for graph names, label names, and column names\n  to prevent SQL injection via string interpolation. Graph name rules\n  are based on Apache AGE\u0027s naming conventions and Neo4j/openCypher\n  compatibility (hyphens and dots permitted, min 3 chars, max 63 chars).\n  Label names follow AGE\u0027s stricter rules (no hyphens or dots).\n- Add design documentation noting intentional ASCII-only restriction\n  in driver-side regex validation as a security hardening measure\n  (homoglyph/encoding attack surface reduction). AGE\u0027s server-side\n  validation (name_validation.h) uses full Unicode ID_Start/ID_Continue\n  and remains the authoritative check for Unicode names.\n- Add safe query helpers: queryCypher(), createGraph(), dropGraph()\n  with graph name validation and dollar-quoting for Cypher strings\n- Add runtime typeof check on dropGraph cascade parameter to prevent\n  injection from plain JavaScript consumers (TypeScript types are\n  erased at runtime)\n- Use BigInt for integer values exceeding Number.MAX_SAFE_INTEGER to\n  prevent silent precision loss with 64-bit AGE graph IDs\n- Make CREATE EXTENSION opt-in via SetAGETypesOptions.createExtension\n  instead of running DDL automatically without user consent\n- Wrap LOAD/search_path setup in try/catch with actionable error\n  message mentioning CREATE EXTENSION and { createExtension: true }\n- Improve agtype-not-found error message with installation guidance\n- Tighten pg dependency from \u003e\u003d6.0.0 to \u003e\u003d8.0.0\n- Add comprehensive test suites covering validation, SQL injection\n  prevention, cascade type safety, hyphenated graph name integration,\n  BigInt parsing, and setAGETypes error handling\n- Add design note in tests documenting why createExtension: false is\n  the correct default (CI image has AGE pre-installed, auto-creating\n  extensions requires SUPERUSER and conflates concerns)\n\nmodified:   drivers/nodejs/package.json\nmodified:   drivers/nodejs/src/antlr4/CustomAgTypeListener.ts\nmodified:   drivers/nodejs/src/index.ts\nmodified:   drivers/nodejs/test/Agtype.test.ts\nmodified:   drivers/nodejs/test/index.test.ts"
    },
    {
      "commit": "5f5b744a08641225652de83332d73bc7acfc889d",
      "tree": "3db8c8e0ef0889e79d8f01ac22f02e251d150d61",
      "parents": [
        "887564d9ce0f153ad7dc9f30223aa303c3fb60d0"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Feb 13 09:30:05 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 13 22:30:05 2026 +0500"
      },
      "message": "Update python-driver security and formatting (#2330)\n\nNote: This PR was created with AI tools and a human.\n\n- Add parameterized query construction using psycopg.sql to prevent\n  SQL injection in all Cypher execution paths (age.py, networkx/lib.py)\n- Replace all %-format and f-string SQL in networkx/lib.py with\n  sql.Identifier() for schema/table names and sql.Literal() for values\n- Add validate_graph_name() with AGE-aligned VALID_GRAPH_NAME regex:\n  start with letter/underscore, allow dots and hyphens in middle positions,\n  end with letter/digit/underscore, min 3 chars, max 63 chars\n- Add validate_identifier() with strict VALID_IDENTIFIER regex for labels,\n  column names, and SQL types (no dots or hyphens)\n- Add validation calls to all networkx/lib.py entry points:\n  graph names validated on entry, labels validated before SQL construction\n- Add _validate_column() to sanitize column specifications in buildCypher()\n- Fix exception constructors (AgeNotSet, GraphNotFound, GraphAlreadyExists)\n  to always call super().__init__() with a meaningful default message so\n  that str(exception) never returns an empty string\n- Add InvalidGraphName and InvalidIdentifier exception classes with\n  structured name/reason/context fields\n- Fix builder.py: change erroneous \u0027return Exception(...)\u0027 to\n  \u0027raise ValueError(...)\u0027 for unknown float expressions\n- Fix copy-paste docstring in create_elabel() (\u0027create_vlabels\u0027 -\u003e \u0027create_elabels\u0027)\n- Remove unused \u0027from psycopg.adapt import Loader\u0027 import in age.py\n- Add design documentation in source explaining:\n  - VALID_GRAPH_NAME regex uses \u0027*\u0027 (not \u0027+\u0027) intentionally so that the\n    min-length check fires first with a clear error message\n  - buildCypher uses string concatenation (not sql.Identifier) because\n    column specs are pre-validated \u0027name type\u0027 pairs that don\u0027t map to\n    sql.Identifier(); graphName and cypherStmt are NOT embedded\n- Update test_networkx.py GraphNotFound assertion to use assertIn()\n  instead of assertEqual() to match the improved exception messages\n- Strip Windows carriage returns (^M) from 7 source files\n- Fix requirements.txt: convert from UTF-16LE+BOM+CRLF to clean UTF-8+LF,\n  move --no-binary flag from requirements.txt to CI workflow pip command\n- Upgrade actions/setup-python from v4 (deprecated) to v5 in CI workflow\n- Add 46 security unit tests in test_security.py covering:\n  - Graph name validation (AGE naming rules, injection, edge cases)\n  - SQL identifier validation (labels, columns, types)\n  - Column spec sanitization\n  - buildCypher injection prevention\n  - Exception constructor correctness (str() never empty)\n- Add test_security.py to CI pipeline (python-driver.yaml)\n- pip-audit: 0 known vulnerabilities in all dependencies\n\nmodified:   .github/workflows/python-driver.yaml\nmodified:   drivers/python/age/VERSION.py\nmodified:   drivers/python/age/__init__.py\nmodified:   drivers/python/age/age.py\nmodified:   drivers/python/age/builder.py\nmodified:   drivers/python/age/exceptions.py\nmodified:   drivers/python/age/models.py\nmodified:   drivers/python/age/networkx/lib.py\nmodified:   drivers/python/requirements.txt\nmodified:   drivers/python/setup.py\nmodified:   drivers/python/test_agtypes.py\nmodified:   drivers/python/test_networkx.py\nnew file:   drivers/python/test_security.py"
    },
    {
      "commit": "887564d9ce0f153ad7dc9f30223aa303c3fb60d0",
      "tree": "46c8503f088337ba2cffaa9cb190093194aaff6b",
      "parents": [
        "5fe2121a06f692efc9a8c3d77b57c67b874e1b69"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Feb 13 01:54:06 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 13 14:54:06 2026 +0500"
      },
      "message": "Fix JDBC driver CI test failures (#2333)\n\nFix JDBC driver CI test failures: encoding, Testcontainers, and\nDocker compatibility.\n\nNote: This PR was created with the help of AI tools and a human.\n\n- Set JavaCompile encoding to UTF-8 to fix unicode test failures in\n  CI environments that default to US-ASCII.\n\n- Add Testcontainers wait strategy (Wait.forLogMessage) to wait for\n  PostgreSQL to be fully ready before connecting.\n\n- Use agensGraphContainer.getHost() instead of hardcoded localhost\n  for Docker-in-Docker compatibility.\n\n- Add sslmode\u003ddisable to JDBC URL since PostgreSQL driver 42.6.0+\n  attempts SSL by default.\n\n- Remove silent exception swallowing around connection setup to fail\n  fast with meaningful errors instead of NullPointerException.\n\n- Upgrade Testcontainers from 1.18.0 to 1.21.4 to fix Docker 29.x\n  detection failure on ubuntu-24.04 runners (docker-java 3.3.x in\n  1.18.0 cannot negotiate with Docker Engine 29.1.5 API).\n\nmodified:   drivers/jdbc/lib/build.gradle.kts\nmodified:   drivers/jdbc/lib/src/test/java/org/apache/age/jdbc/BaseDockerizedTest.java"
    },
    {
      "commit": "5fe2121a06f692efc9a8c3d77b57c67b874e1b69",
      "tree": "53fa0a0da6fd59635306507e95f5ccdb62adf7f4",
      "parents": [
        "858747c7e2a414651b4f8e76558fdce1bbdc0af8"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Tue Feb 10 10:32:29 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 10 23:32:29 2026 +0500"
      },
      "message": "Add pg_upgrade support functions for PostgreSQL (#2326)\n\nAdd pg_upgrade support functions for PostgreSQL for major version\nupgrades\n\nNOTE: This PR was created with AI tools and a human.\n\nThe ag_graph.namespace column uses the regnamespace type, which pg_upgrade\ncannot handle in user tables. This commit adds four SQL functions to enable\nseamless PostgreSQL major version upgrades while preserving all graph data.\n\nNew functions in ag_catalog:\n- age_prepare_pg_upgrade(): Converts namespace from regnamespace to oid,\n  creates backup table with graph-to-namespace mappings (stores nspname\n  directly to avoid quoting issues)\n- age_finish_pg_upgrade(): Remaps stale OIDs after upgrade, restores\n  regnamespace type, invalidates AGE caches while preserving schema ownership\n- age_revert_pg_upgrade_changes(): Cancels preparation if upgrade is aborted\n- age_pg_upgrade_status(): Returns current upgrade readiness status\n\nUsage:\n  1. Before pg_upgrade: SELECT age_prepare_pg_upgrade();\n  2. Run pg_upgrade as normal\n  3. After pg_upgrade:  SELECT age_finish_pg_upgrade();\n\nKey implementation details:\n- Uses transaction-level advisory locks (pg_advisory_xact_lock) for safety\n- Preserves original schema ownership during cache invalidation\n- Validates all backup rows are mapped before proceeding\n- Handles zero-graph edge case gracefully\n- Handles insufficient privileges gracefully with informative notices\n- Backup table deleted only after all steps succeed\n\nFiles changed:\n- sql/age_pg_upgrade.sql: New file with function implementations\n- sql/sql_files: Added age_pg_upgrade entry\n- age--1.7.0--y.y.y.sql: Added functions for extension upgrades\n\nAll regression tests pass."
    },
    {
      "commit": "858747c7e2a414651b4f8e76558fdce1bbdc0af8",
      "tree": "052e8a143a5a4187910077ed16fa1b3c8ed32a00",
      "parents": [
        "6287af85f291e10d048c37ffd22b902950779af7"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Thu Jan 22 09:58:14 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 22 22:58:14 2026 +0500"
      },
      "message": "Advance master branch to Apache AGE version 1.7.0 (#2316)\n\nUpdated the following files to advance the Apache AGE version\nto 1.7.0\n\nmodified:   Makefile\nmodified:   README.md\nmodified:   RELEASE\nrenamed:    age--1.6.0--y.y.y.sql -\u003e age--1.6.0--1.7.0.sql\nnew file:   age--1.7.0--y.y.y.sql\nmodified:   age.control\nmodified:   docker/Dockerfile\ndeleted:    age--1.5.0--1.6.0.sql"
    },
    {
      "commit": "6287af85f291e10d048c37ffd22b902950779af7",
      "tree": "0ec19095337cada5e92ec849f6ab30a26fbd0585",
      "parents": [
        "b3219fd4228cc261df06070e37512c76b8c07678"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Thu Jan 22 21:50:23 2026 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 22 08:50:23 2026 -0800"
      },
      "message": "Fix upgrade script for 1.6.0 to 1.7.0 (#2320)\n\n- Added index creation for existing labels\n\nAssisted-by AI"
    },
    {
      "commit": "b3219fd4228cc261df06070e37512c76b8c07678",
      "tree": "762be11d32cc6df8c097b057ed08e50914624178",
      "parents": [
        "1702ae075de6897e9555fa527060f622304a1d93"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Wed Jan 21 10:01:57 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 21 23:01:57 2026 +0500"
      },
      "message": "Master to PostgreSQL version 18 (#2315)\n\n* Updated CI, Labeler, Docker, and branch security files for PG18 (#2246)\n\nUpdated the CI and Docker files for the PG18\nUpdated the labeler and branch security files for PG18.\n\nSome of these only apply to the master branch but are updated\nfor consistency.\n\nmodified:   .asf.yaml\nmodified:   .github/labeler.yml\nmodified:   .github/workflows/go-driver.yml\nmodified:   .github/workflows/installcheck.yaml\nmodified:   .github/workflows/jdbc-driver.yaml\nmodified:   .github/workflows/nodejs-driver.yaml\nmodified:   .github/workflows/python-driver.yaml\nmodified:   docker/Dockerfile\nmodified:   docker/Dockerfile.dev\nmodified:   drivers/docker-compose.yml\n\n* PG18 port for AGE (#2251)\n\n* [PG18 port][Set1] Fix header dependencies and use TupleDescAttr macro\n\n- Include executor/executor.h for PG18 header reorganization and use \n  TupleDescAttr() accessor macro instead of direct attrs[] access.\n\n* [PG18 port][Set2] Adapt to expandRTE signature change and pg_noreturn\n\n- Add VarReturningType parameter to expandRTE() calls using VAR_RETURNING_DEFAULT.\n- Replace pg_attribute_noreturn() with pg_noreturn prefix specifier.\n\n* [PG18 port][Set3] Fix double ExecOpenIndices call for PG18 compatibility\n\n- PG18 enforces stricter assertions in ExecOpenIndices, requiring\n  ri_IndexRelationDescs to be NULL when called.\n\n- In update_entity_tuple(), indices may already be opened by the\n  caller (create_entity_result_rel_info), causing assertion failures.\n\n- Add a check to only open indices if not already open, and track\n  ownership with a boolean flag to ensure we only close what we opened.\n\n- Found when regression tests failed with assertions, which this change\n  resolves.\n\n* [PG18 port][Set4] Update regression test expected output for ordering\n\nPG18\u0027s implementation changes result in different row ordering for\nqueries without explicit ORDER BY clauses. Update expected output\nfiles to reflect the new ordering while maintaining identical\nresult content.\n\n* [PG18 port][Set5] Address review comments - coding standard fix\n\nNote: Assisted by GitHub Copilot Agent mode.\n\n* Fix DockerHub build warning messages (#2252)\n\nPR fixes build warning messages on DockerHub and on my local build.\n\nNo regression tests needed.\n\nmodified:   src/include/nodes/ag_nodes.h\nmodified:   src/include/optimizer/cypher_createplan.h\nmodified:   src/include/optimizer/cypher_pathnode.h\nmodified:   tools/gen_keywordlist.pl\n\n---------\nCo-authored-by: Krishnakumar R (KK) \u003c65895020+kk-src@users.noreply.github.com\u003e"
    },
    {
      "commit": "1702ae075de6897e9555fa527060f622304a1d93",
      "tree": "071de4a0d3981a3f2bed9bd4239ccc73d8234e20",
      "parents": [
        "b29ca5e7d2f84cfe2619eea70c4ace2cba41aa0b"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Tue Jan 20 23:44:19 2026 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 20 10:44:19 2026 -0800"
      },
      "message": "Add RLS support and fix permission checks (#2309)\n\n- Previously, age only set ACL_SELECT and ACL_INSERT in RTEPermissionInfo,\n  bypassing pg\u0027s privilege checking for DELETE and UPDATE operations.\n- Additionally, RLS policies were not enforced because AGE uses CMD_SELECT\n  for all Cypher queries, causing the rewriter to skip RLS policy application.\n\nPermission fixes:\n- Add ACL_DELETE permission flag for DELETE clause operations\n- Add ACL_UPDATE permission flag for SET/REMOVE clause operations\n- Recursively search RTEs including subqueries for permission info\n\nRLS support:\n- Implemented at executor level because age transforms all cypher\n  queries to CMD_SELECT, so pg\u0027s rewriter never adds RLS\n  policies for INSERT/UPDATE/DELETE operations. There isnt an\n  appropriate rewriter hook to modify this behavior, so we do it\n  in executor instead.\n- Add setup_wcos() to apply WITH CHECK policies at execution time\n  for CREATE, SET, and MERGE operations\n- Add setup_security_quals() and check_security_quals() to apply\n  USING policies for UPDATE and DELETE operations\n- USING policies silently filter rows (matching pg behavior)\n- WITH CHECK policies raise errors on violation\n- DETACH DELETE raises error if edge RLS blocks deletion to prevent\n  dangling edges\n- Add permission checks and rls in startnode/endnode functions\n- Add regression tests\n\nAssisted-by AI"
    },
    {
      "commit": "b29ca5e7d2f84cfe2619eea70c4ace2cba41aa0b",
      "tree": "5587482b9187b9556706ae8f0a1de2b2fa415ab5",
      "parents": [
        "56a92d8c1be364e07bac51665a362ca91957194b"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Mon Jan 19 22:21:02 2026 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 19 09:21:02 2026 -0800"
      },
      "message": "Replace libcsv with pg COPY for csv loading (#2310)\n\n- Commit also adds permission checks\n- Resolves a critical memory spike issue on loading large file\n- Use pg\u0027s COPY infrastructure (BeginCopyFrom, NextCopyFromRawFields)\n  for 64KB buffered CSV parsing instead of libcsv\n- Add byte based flush threshold (64KB) matching COPY behavior for memory safety\n- Use heap_multi_insert with BulkInsertState for optimized batch inserts\n- Add per batch memory context to prevent memory growth during large loads\n- Remove libcsv dependency (libcsv.c, csv.h)\n- Improves loading performance by 15-20%\n- No previous regression tests were impacted\n- Added regression tests for permissions/rls\nAssisted-by AI"
    },
    {
      "commit": "56a92d8c1be364e07bac51665a362ca91957194b",
      "tree": "68ae7e3af1606efbf51dfa6d60f6a8b2f77466d2",
      "parents": [
        "8bdeec54e898451771f4dc021a13b00781d6d1a0"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Sun Jan 18 10:02:55 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 18 23:02:55 2026 +0500"
      },
      "message": "Fix Issue 1884: Ambiguous column reference (#2306)\n\nFix Issue 1884: Ambiguous column reference and invalid AGT header\nerrors.\n\nNote: This PR was created with AI tools and a human, or 2.\n\nThis commit addresses two related bugs that occur when using SET to store\ngraph elements (vertices, edges, paths) as property values:\n\nIssue 1884 - \"column reference is ambiguous\" error:\nWhen a Cypher query uses the same variable in both the SET expression RHS\nand the RETURN clause (e.g., SET n.prop \u003d n RETURN n), PostgreSQL would\nreport \"column reference is ambiguous\" because the variable appeared in\nmultiple subqueries without proper qualification.\n\nSolution: The fix for this issue was already in place through the target\nentry naming scheme that qualifies column references.\n\n\"Invalid AGT header value\" offset error:\nWhen deserializing nested VERTEX, EDGE, or PATH values stored in properties,\nthe system would fail with errors like \"Invalid AGT header value: 0x00000041\".\nThis occurred because ag_serialize_extended_type() did not include alignment\npadding (padlen) in the agtentry length calculation for these types, while\nfill_agtype_value() uses INTALIGN() when reading, causing offset mismatch.\n\nSolution: Modified ag_serialize_extended_type() in agtype_ext.c to include\npadlen in the agtentry length for VERTEX, EDGE, and PATH cases, matching\nthe existing pattern used for INTEGER, FLOAT, and NUMERIC types:\n\n    *agtentry \u003d AGTENTRY_IS_AGTYPE | (padlen + (AGTENTRY_OFFLENMASK \u0026 ...));\n\nThis ensures the serialized length accounts for alignment padding, allowing\ncorrect deserialization of nested graph elements.\n\nAppropriate regression tests were added to verify the fixes.\n\nCo-authored by: Zainab Saad \u003c105385638+Zainab-Saad@users.noreply.github.com\u003e\n\nmodified:   regress/expected/cypher_set.out\nmodified:   regress/sql/cypher_set.sql\nmodified:   src/backend/parser/cypher_clause.c\nmodified:   src/backend/utils/adt/agtype_ext.c"
    },
    {
      "commit": "8bdeec54e898451771f4dc021a13b00781d6d1a0",
      "tree": "9b832ab09abb86f195c566a4aa14e885b4c87951",
      "parents": [
        "b9d0982892306abff0013dd8f336e153684b02e9"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Sat Jan 17 03:18:10 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 17 16:18:10 2026 +0500"
      },
      "message": "Upgrade Jest to v29 for node: protocol compatibility (#2307)\n\nNote: This PR was created with AI tools and a human.\n\nThe pg-connection-string module (dependency of pg) now uses the node:\nprotocol prefix for built-in modules (e.g., require(\u0027node:process\u0027)).\nJest 26 does not support this syntax, causing test failures.\n\nChanges:\n- Upgrade jest from ^26.6.3 to ^29.7.0\n- Upgrade ts-jest from ^26.5.1 to ^29.4.6\n- Upgrade @types/jest from ^26.0.20 to ^29.5.14\n- Update typescript to ^4.9.5\n\nThis also resolves 19 npm audit vulnerabilities (17 moderate, 2 high)\nthat existed in the older Jest 26 dependency tree.\n\nmodified:   drivers/nodejs/package.json"
    },
    {
      "commit": "b9d0982892306abff0013dd8f336e153684b02e9",
      "tree": "bc7bf98751e942cd136bae6bd9aecbdba76798b5",
      "parents": [
        "c979380e9865a624ad73eef01ec84717bb817f2b"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Jan 16 15:12:22 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 17 04:12:22 2026 +0500"
      },
      "message": "Optimize vertex/edge field access with direct array indexing (#2302)\n\nNOTE: This PR was created using AI tools and a human.\n\nLeverage deterministic key ordering from uniqueify_agtype_object() to\naccess vertex/edge fields in O(1) instead of O(log n) binary search.\n\nFields are sorted by key length, giving fixed positions:\n- Vertex: id(0), label(1), properties(2)\n- Edge: id(0), label(1), end_id(2), start_id(3), properties(4)\n\nChanges:\n- Add field index constants and accessor macros to agtype.h\n- Update age_id(), age_start_id(), age_end_id(), age_label(),\n  age_properties() to use direct field access\n- Add fill_agtype_value_no_copy() for read-only scalar extraction\n  without memory allocation\n- Add compare_agtype_scalar_containers() fast path for scalar comparison\n- Update hash_agtype_value(), equals_agtype_scalar_value(), and\n  compare_agtype_scalar_values() to use direct field access macros\n- Add fast path in get_one_agtype_from_variadic_args() bypassing\n  extract_variadic_args() for single argument case\n- Add comprehensive regression test (30 tests)\n\nPerformance impact: Improves ORDER BY, hash joins, aggregations, and\nCypher functions (id, start_id, end_id, label, properties) on vertices\nand edges.\n\nAll previous regression tests were not impacted.\nAdditional regression test added to enhance coverage.\n\nmodified:   Makefile\nnew file:   regress/expected/direct_field_access.out\nnew file:   regress/sql/direct_field_access.sql\nmodified:   src/backend/utils/adt/agtype.c\nmodified:   src/backend/utils/adt/agtype_util.c\nmodified:   src/include/utils/agtype.h"
    },
    {
      "commit": "c979380e9865a624ad73eef01ec84717bb817f2b",
      "tree": "ce149789a3d319fbee5f39feef99288f8f316fc0",
      "parents": [
        "a1f472d6f9344dc4449ac7343bf7d81a31b66f02"
      ],
      "author": {
        "name": "Jean-Paul Abbuehl",
        "email": "jp.abbuehl@gmail.com",
        "time": "Mon Jan 12 21:10:08 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 12 12:10:08 2026 -0800"
      },
      "message": "feat: Add 32-bit platform support for graphid type (#2286)\n\n* feat: Add 32-bit platform support for graphid type\n\nThis enables AGE to work on 32-bit platforms including WebAssembly (WASM).\n\nProblem:\n- graphid is int64 (8 bytes) with PASSEDBYVALUE\n- On 32-bit systems, Datum is only 4 bytes\n- PostgreSQL rejects pass-by-value types larger than Datum\n\nSolution:\n- Makefile-only change (no C code modifications)\n- When SIZEOF_DATUM\u003d4 is passed to make, strip PASSEDBYVALUE from the generated SQL\n- If not specified, normal 64-bit behavior is preserved (PASSEDBYVALUE kept)\n\nThis change is backward compatible:\n- 64-bit systems continue using pass-by-value\n- 32-bit systems now work with pass-by-reference\n\nMotivation: PGlite (PostgreSQL compiled to WebAssembly) uses 32-bit\npointers and requires this patch to run AGE.\n\nTested on:\n- 64-bit Linux (regression tests pass)\n- 32-bit WebAssembly via PGlite (all operations work)\n\nCo-authored-by: abbuehlj \u003cjean-paul.abbuehl@roche.com\u003e"
    },
    {
      "commit": "a1f472d6f9344dc4449ac7343bf7d81a31b66f02",
      "tree": "7a8ce4eae52f05d88a0bf4e60ab1923373039ca7",
      "parents": [
        "7beb653303529b05391667de4204ffb4da318eeb"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Sat Jan 10 08:37:54 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 10 21:37:54 2026 +0500"
      },
      "message": "Fix and improve index.sql addendum (#2301)\n\nNOTE: This PR was created with the help of AI tools and a human.\n\nAdded additional requested regression tests -\n\n *EXPLAIN for pattern with WHERE clause\n\n *EXPLAIN for pattern with filters on both country and city\n\nmodified:   regress/expected/index.out\nmodified:   regress/sql/index.sql"
    },
    {
      "commit": "7beb653303529b05391667de4204ffb4da318eeb",
      "tree": "b32ad7b1b69f4ff7dd40bcb3e085d265928963a0",
      "parents": [
        "2e8f7ab992fc5db6cedf88cbdffc15df3a3cf932"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Jan 09 12:55:36 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 10 01:55:36 2026 +0500"
      },
      "message": "Fix and improve index.sql regression test coverage (#2300)\n\nNOTE: This PR was created with AI tools and a human.\n\n- Remove unused copy command (leftover from deleted agload_test_graph test)\n- Replace broken Section 4 that referenced non-existent graph with\n  comprehensive WHERE clause tests covering string, int, bool, and float\n  properties with AND/OR/NOT operators\n- Add EXPLAIN tests to verify index usage:\n  - Section 3: Validate GIN indices (load_city_gin_idx, load_country_gin_idx)\n    show Bitmap Index Scan for property matching\n  - Section 4: Validate all expression indices (city_country_code_idx,\n    city_id_idx, city_west_coast_idx, country_life_exp_idx) show Index Scan\n    for WHERE clause filtering\n\nAll indices now have EXPLAIN verification confirming they are used as expected.\n\nmodified:   regress/expected/index.out\nmodified:   regress/sql/index.sql"
    },
    {
      "commit": "2e8f7ab992fc5db6cedf88cbdffc15df3a3cf932",
      "tree": "c2e9d3d1245cab4b7fce973f3b99f957bdc08ec4",
      "parents": [
        "4eeceab256f4795e6e8fb1d802935bdf403e5e93"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Jan 09 12:27:47 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 10 01:27:47 2026 +0500"
      },
      "message": "Fix Issue 2289: handle empty list in IN expression (#2294)\n\nNOTE: This PR was created with AI tools and a human.\n\nWhen evaluating \u0027x IN []\u0027 with an empty list, the transform_AEXPR_IN\nfunction would return NULL because no expressions were processed.\nThis caused a \u0027cache lookup failed for type 0\u0027 error downstream.\n\nThis fix adds an early check for the empty list case:\n- \u0027x IN []\u0027 returns false (nothing can be in an empty list)\n\nAdditional NOTE: Cypher does not have \u0027NOT IN\u0027 syntax. To check if\na value is NOT in a list, use \u0027NOT (x IN list)\u0027. The NOT operator\nwill invert the false from an empty list to true as expected.\n\nThe fix returns a boolean constant directly, avoiding the NULL result\nthat caused the type lookup failure.\n\nAdded regression tests.\n\nmodified:   regress/expected/expr.out\nmodified:   regress/sql/expr.sql\nmodified:   src/backend/parser/cypher_expr.c"
    },
    {
      "commit": "4eeceab256f4795e6e8fb1d802935bdf403e5e93",
      "tree": "c7836d4e9c790a2705e1ed2c2f13874998073bf4",
      "parents": [
        "dd6deb70e34e2ab75836dc6d037fde5a360d7075"
      ],
      "author": {
        "name": "M15terHyde",
        "email": "59905806+M15terHyde@users.noreply.github.com",
        "time": "Tue Jan 06 12:52:33 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 06 10:52:33 2026 -0800"
      },
      "message": "Revise README for Python driver updates (#2298)\n\nUpdated README to from psycopg2 to psycopg3 (psycopg)"
    },
    {
      "commit": "dd6deb70e34e2ab75836dc6d037fde5a360d7075",
      "tree": "01d792af46e87ae59c472f070ad73db28a01b991",
      "parents": [
        "48fca83d90f29cf68fd9748db3b2d628f4978749"
      ],
      "author": {
        "name": "Arthur Nascimento",
        "email": "tureba@gmail.com",
        "time": "Tue Jan 06 13:36:49 2026 -0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 06 08:36:49 2026 -0800"
      },
      "message": "Makefile: fix race condition on cypher_gram_def.h (#2273)\n\nThe file cypher_gram.c generates cypher_gram_def.h, which is directly\nnecessary for cypher_parser.o and cypher_keywords.o and their respective\n.bc files.\n\nBut that direct dependency is not reflected in the Makefile, which only\nhad the indirect dependency of .o on .c. So on high parallel builds, the\n.h may not have been generated by bison yet.\n\nAdditionally, the .bc files should have the same dependencies as the .o\nfiles, but those are lacking.\n\nHere is an example output where the .bc file fails to build, as it was\nrunning concurrently with the bison instance that was about to finalize\ncypher_gram_def.h:\n\n  In file included from src/backend/parser/cypher_parser.c:24:\n  clang-17 -Wno-ignored-attributes -fno-strict-aliasing -fwrapv -fexcess-precision\u003dstandard -Wno-unused-command-line-argument -Wno-compound-token-split-by-macro -O2  -I.//src/include -I.//src/include/parser -I. -I./ -I/usr/pgsql-17/include/server -I/usr/pgsql-17/include/internal -D_GNU_SOURCE  -I/usr/include -I/usr/include/libxml2  -flto\u003dthin -emit-llvm -c -o src/backend/parser/cypher_parser.bc src/backend/parser/cypher_parser.c\n  .//src/include/parser/cypher_gram.h:65:10: fatal error: \u0027parser/cypher_gram_def.h\u0027 file not found\n     65 | #include \"parser/cypher_gram_def.h\"\n        |          ^~~~~~~~~~~~~~~~~~~~~~~~~~\n  1 error generated.\n  make: *** [/usr/pgsql-17/lib/pgxs/src/makefiles/../../src/Makefile.global:1085: src/backend/parser/cypher_parser.bc] Error 1\n  make: *** Waiting for unfinished jobs....\n  gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror\u003dvla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough\u003d3 -Wshadow\u003dcompatible-local -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision\u003dstandard -Wno-format-truncation -O2 -g -fmessage-length\u003d0 -D_FORTIFY_SOURCE\u003d2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -fPIC -fvisibility\u003dhidden -I.//src/include -I.//src/include/parser -I. -I./ -I/usr/pgsql-17/include/server -I/usr/pgsql-17/include/internal -D_GNU_SOURCE  -I/usr/include -I/usr/include/libxml2   -c -o src/backend/catalog/ag_label.o src/backend/catalog/ag_label.c\n  /usr/bin/bison -Wno-deprecated  --defines\u003dsrc/include/parser/cypher_gram_def.h -o src/backend/parser/cypher_gram.c src/backend/parser/cypher_gram.y\n\nPreviously, cypher_parser.o was missing the dependency, so it could\nstart before cypher_gram_def.h was available:\n\n Considering target file \u0027src/backend/parser/cypher_parser.o\u0027.\n  File \u0027src/backend/parser/cypher_parser.o\u0027 does not exist.\n  Considering target file \u0027src/backend/parser/cypher_parser.c\u0027.\n  File \u0027src/backend/parser/cypher_parser.c\u0027 was considered already.\n  Considering target file \u0027src/backend/parser/cypher_gram.c\u0027.\n  File \u0027src/backend/parser/cypher_gram.c\u0027 was considered already.\n Finished prerequisites of target file \u0027src/backend/parser/cypher_parser.o\u0027.\n Must remake target \u0027src/backend/parser/cypher_parser.o\u0027.\n\nAs well as cypher_parser.bc, missing the dependency on\ncypher_gram_def.h:\n\n Considering target file \u0027src/backend/parser/cypher_parser.bc\u0027.\n  File \u0027src/backend/parser/cypher_parser.bc\u0027 does not exist.\n  Considering target file \u0027src/backend/parser/cypher_parser.c\u0027.\n  File \u0027src/backend/parser/cypher_parser.c\u0027 was considered already.\n Finished prerequisites of target file \u0027src/backend/parser/cypher_parser.bc\u0027.\n Must remake target \u0027src/backend/parser/cypher_parser.bc\u0027.\n\nNow cypher_parser.o correctly depends on cypher_gram_def.h:\n\n Considering target file \u0027src/backend/parser/cypher_parser.o\u0027.\n  File \u0027src/backend/parser/cypher_parser.o\u0027 does not exist.\n  Considering target file \u0027src/backend/parser/cypher_parser.c\u0027.\n  File \u0027src/backend/parser/cypher_parser.c\u0027 was considered already.\n  Considering target file \u0027src/backend/parser/cypher_gram.c\u0027.\n  File \u0027src/backend/parser/cypher_gram.c\u0027 was considered already.\n  Considering target file \u0027src/include/parser/cypher_gram_def.h\u0027.\n  File \u0027src/include/parser/cypher_gram_def.h\u0027 was considered already.\n Finished prerequisites of target file \u0027src/backend/parser/cypher_parser.o\u0027.\n Must remake target \u0027src/backend/parser/cypher_parser.o\u0027.\n\nAnd cypher_parser.bc correctly depends on cypher_gram_def.h as well:\n\n Considering target file \u0027src/backend/parser/cypher_parser.bc\u0027.\n  File \u0027src/backend/parser/cypher_parser.bc\u0027 does not exist.\n  Considering target file \u0027src/backend/parser/cypher_parser.c\u0027.\n  File \u0027src/backend/parser/cypher_parser.c\u0027 was considered already.\n  Considering target file \u0027src/backend/parser/cypher_gram.c\u0027.\n  File \u0027src/backend/parser/cypher_gram.c\u0027 was considered already.\n  Considering target file \u0027src/include/parser/cypher_gram_def.h\u0027.\n  File \u0027src/include/parser/cypher_gram_def.h\u0027 was considered already.\n Finished prerequisites of target file \u0027src/backend/parser/cypher_parser.bc\u0027.\n Must remake target \u0027src/backend/parser/cypher_parser.bc\u0027."
    },
    {
      "commit": "48fca83d90f29cf68fd9748db3b2d628f4978749",
      "tree": "12f2e80989b270d97c25f235a0f0b423b998bd69",
      "parents": [
        "838926cc35ae64d3514c656959b749719e904b09"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Tue Dec 16 08:33:28 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 16 21:33:28 2025 +0500"
      },
      "message": "Restrict age_load commands (#2274)\n\nThis PR applies restrictions to the following age_load commands -\n\n    load_labels_from_file()\n    load_edges_from_file()\n\nThey are now tied to a specific root directory and are required to have a\nspecific file extension to eliminate any attempts to force them to access\nany other files.\n\nNothing else has changed with the actual command formats or parameters,\nonly that they work out of the /tmp/age directory and only access files\nwith an extension of .csv.\n\nAdded regression tests and updated the location of the csv files for\nthose regression tests.\n\nmodified:   regress/expected/age_load.out\nmodified:   regress/sql/age_load.sql\nmodified:   src/backend/utils/load/age_load.c"
    },
    {
      "commit": "838926cc35ae64d3514c656959b749719e904b09",
      "tree": "d5f2d2be2f856dff7fa28b46cdcebf01ad48694c",
      "parents": [
        "1bb95bf616abe733dd6d5c02aa32c7f419827646"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Thu Dec 11 21:51:12 2025 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 11 08:51:12 2025 -0800"
      },
      "message": "Migrate python driver configuration to pyproject.toml (#2272)\n\n- Add pyproject.toml with package configuration\n- Simplify setup.py to minimal backward-compatible wrapper.\n- Updated CI workflow and .gitignore.\n- Resolves warning about using setup.py directly."
    },
    {
      "commit": "1bb95bf616abe733dd6d5c02aa32c7f419827646",
      "tree": "a48f4367309c0a1d1d54b057ae2bc2326dc582da",
      "parents": [
        "91de779aee0ee241bf8022b4822a9745c8bc9fa3"
      ],
      "author": {
        "name": "jsell-rh",
        "email": "jsell@redhat.com",
        "time": "Thu Dec 11 10:56:37 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 11 20:56:37 2025 +0500"
      },
      "message": "Convert string to raw string to remove invalid escape sequence warning (#2267)\n\n- Changed \u0027\\s\u0027 to r\u0027\\s\u0027"
    },
    {
      "commit": "91de779aee0ee241bf8022b4822a9745c8bc9fa3",
      "tree": "f5af4ddc4d7ba716923362006450356fbdca9f1e",
      "parents": [
        "898481a8c79381cc9f49ca71a9756a6216b61353"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Thu Dec 11 07:32:13 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 11 20:32:13 2025 +0500"
      },
      "message": "Update grammar file for maintainability (#2270)\n\nConsolidated duplicate code, added helper functions, and reviewed\nthe grammar file for issues.\n\nNOTE: I used an AI tool to review and cleanup the grammar file. I\n      have reviewed all of the work it did.\n\nImprovements:\n\n1. Added KEYWORD_STRDUP macro to eliminate hardcoded string lengths\n2. Consolidated EXPLAIN statement handling into make_explain_stmt helper\n3. Extracted WITH clause validation into validate_return_item_aliases helper\n4. Created make_default_return_node helper for subquery return-less logic\n\nBenefits:\n\n- Reduced code duplication by ~150 lines\n- Improved maintainability with helper functions\n- Eliminated manual string length calculations (error-prone)\n\nAll 29 existing regression tests pass\n\nmodified:   src/backend/parser/cypher_gram.y"
    },
    {
      "commit": "898481a8c79381cc9f49ca71a9756a6216b61353",
      "tree": "c1a1fa1a9b854a45eeb04f58a403895328ab765d",
      "parents": [
        "0ea94644f25bdc08c803ff6521bfd412a6690401"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Wed Dec 10 09:08:36 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Dec 10 22:08:36 2025 +0500"
      },
      "message": "Fix ORDER BY alias resolution with AS in Cypher queries (#2269)\n\nNOTE: This PR was partially created with AI tools and reviewed by a human.\n\nORDER BY clauses failed when referencing column aliases from RETURN:\n\n    MATCH (p:Person) RETURN p.age AS age ORDER BY age DESC\n    ERROR: could not find rte for age\n\nAdded SQL-99 compliant alias matching to find_target_list_entry() that\nchecks if ORDER BY identifier matches a target list alias before\nattempting expression transformation. This enables standard SQL behavior\nfor sorting by aliased columns with DESC/DESCENDING/ASC/ASCENDING.\n\nUpdated regression tests.\n\nAdded regression tests.\nmodified:   regress/expected/cypher_match.out\nmodified:   regress/expected/expr.out\nmodified:   regress/sql/expr.sql\nmodified:   src/backend/parser/cypher_clause.c"
    },
    {
      "commit": "0ea94644f25bdc08c803ff6521bfd412a6690401",
      "tree": "1d3af94bfb09b730cdb78378a6367aef9b8cc5e7",
      "parents": [
        "fa9973aab32adb0b611b09ee26ae127b92059af2"
      ],
      "author": {
        "name": "Aleksey Konovkin",
        "email": "alkon2000@mail.ru",
        "time": "Tue Dec 09 22:49:05 2025 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Dec 10 00:49:05 2025 +0500"
      },
      "message": "Fix possible memory and file descriptors leaks (#2258)\n\n- Used postgres memory allocation functions instead of standard ones.\n- Wrapped main loop of csv loader in PG_TRY block for better error handling."
    },
    {
      "commit": "fa9973aab32adb0b611b09ee26ae127b92059af2",
      "tree": "723640921e4e41af463ff761109dd32df6de318d",
      "parents": [
        "26f748c42b01b7d6ff5c5ec7c4eb84d97066103a"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Tue Dec 09 11:15:26 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Dec 10 00:15:26 2025 +0500"
      },
      "message": "Adjust \u0027could not find rte for\u0027 ERROR message (#2266)\n\nAdjusted the following type of error message. It was mentioned in\nissue 2263 as being incorrect, which it isn\u0027t. However, it did need\nsome clarification added -\n\n    ERROR:  could not find rte for \u003ccolumn name\u003e\n\nAdded a HINT for additional clarity -\n\n    HINT:  variable \u003ccolumn name\u003e does not exist within scope of usage\n\nFor example:\n\n    CREATE p0\u003d(n0), (n1{k:EXISTS{WITH p0}}) RETURN 1\n\n    ERROR:  could not find rte for p0\n    LINE 3:     CREATE p0\u003d(n0), (n1{k:EXISTS{WITH p0}})\n                                              ^\n    HINT:  variable p0 does not exist within scope of usage\n\nAdditionally, added pstate-\u003ep_expr_kind \u003d\u003d EXPR_KIND_INSERT_TARGET to\ntransform_cypher_clause_as_subquery.\n\nUpdated existing regression tests.\nAdded regression tests from issue.\n\nmodified:   regress/expected/cypher_call.out\nmodified:   regress/expected/cypher_subquery.out\nmodified:   regress/expected/cypher_union.out\nmodified:   regress/expected/cypher_with.out\nmodified:   regress/expected/expr.out\nmodified:   regress/expected/list_comprehension.out\nmodified:   regress/expected/scan.out\nmodified:   src/backend/parser/cypher_clause.c\nmodified:   src/backend/parser/cypher_expr.c"
    },
    {
      "commit": "26f748c42b01b7d6ff5c5ec7c4eb84d97066103a",
      "tree": "549c06563dcccb5e99c500ad4f41a61a2641160f",
      "parents": [
        "5aed9ecc5b492a47dc0e449421cf344de58b5edd"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Tue Dec 09 10:51:01 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 09 23:51:01 2025 +0500"
      },
      "message": "Fix Issue 2256: segmentation fault when calling coalesce function (#2259)\n\nFixed issue 2256: A segmentation fault occurs when calling the coalesce\nfunction in PostgreSQL version 17. This likely predates 17 and includes\nother similar types of \"functions\".\n\nSee issues 1124 (PR 1125) and 1303 (PR 1317) for more details.\n\nThis issue is due to coalesce() being processed differently from other\nfunctions. Additionally, greatest() was found to exhibit the same\nbehavior. They were added to the list of types to ignore during the\ncypher analyze phase.\n\nA few others were added: CaseExpr, XmlExpr, ArrayExpr, \u0026 RowExpr.\nAlthough, I wasn\u0027t able to find cases where these caused crashes.\n\nAdded regression tests.\n\nmodified:   regress/expected/cypher.out\nmodified:   regress/sql/cypher.sql\nmodified:   src/backend/parser/cypher_analyze.c"
    },
    {
      "commit": "5aed9ecc5b492a47dc0e449421cf344de58b5edd",
      "tree": "c547d2cbd098a033ad4e7c13ac86e2ede2d1483c",
      "parents": [
        "571c1982437fc3a9a0bebca293418c22ba64e270"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Wed Dec 03 22:17:09 2025 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Dec 03 09:17:09 2025 -0800"
      },
      "message": "Add index on id columns (#2117)\n\n- Whenever a label will be created, indices on id columns will be\n  created by default. In case of vertex, a unique index on id column\n  will be created, which will also serve as a unique constraint.\n  In case of edge, a non-unique index on start_id and end_id columns\n  will be created.\n\n- This change is expected to improve the performance of queries that\n  involve joins. From some performance tests, it was observed that\n  the performance of queries improved alot.\n\n- Loader was updated to insert tuples in indices as well. This has\n  caused to slow the loader down a bit, but it was necessary.\n\n- A bug related to command ids in cypher_delete executor was also fixed."
    },
    {
      "commit": "571c1982437fc3a9a0bebca293418c22ba64e270",
      "tree": "371c0882c6d9000fd56d6b4a9988664c4ca3dbb5",
      "parents": [
        "190354c415851b9eba893b314fea55623518b3a6"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Wed Nov 19 13:45:44 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 20 02:45:44 2025 +0500"
      },
      "message": "Fix issue 2245 - Creating more than 41 vlabels causes crash in drop_graph (#2248)\n\nFixed issue 2245 - Creating more than 41 vlabels causes drop_grapth to fail\nwith \"label (relation) cache corrupted\" and crashing out on the following\ncommand.\n\nThis was due to corruption of the label_relation_cache during the HASH_DELETE\nprocess.\n\nAs the issue was with a cache flush routine, it was necessary to fix them\nall. Here is the list of the flush functions that were fixed -\n\n    static void flush_graph_name_cache(void)\n    static void flush_graph_namespace_cache(void)\n    static void flush_label_name_graph_cache(void)\n    static void flush_label_graph_oid_cache(void)\n    static void flush_label_relation_cache(void)\n    static void flush_label_seq_name_graph_cache(void)\n\nAdded regression tests.\n\nmodified:   regress/expected/catalog.out\nmodified:   regress/sql/catalog.sql\nmodified:   src/backend/utils/cache/ag_cache.c"
    },
    {
      "commit": "190354c415851b9eba893b314fea55623518b3a6",
      "tree": "c2bd250633745a4e17edd00264bccfb5e0006f92",
      "parents": [
        "ec457345e25601c947aff73bfcc7354d97e238a6"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Thu Nov 13 07:57:41 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 13 20:57:41 2025 +0500"
      },
      "message": "Fix issue 2243 - Regression in string concatenation (#2244)\n\nFixed issue 2243 - Regression in string concatenation using the + operator.\nThe issue was in versions 1.5.0 and 1.6.0, at least. It was due to using\nInt8GetDatum instead of Int64GetDatum for the agtype integer field in the\nfollowing functions -\n\n    get_numeric_datum_from_agtype_value\n    get_string_from_agtype_value\n\nThis impacted more than what the original issue covered, but those additional\ncases were resolved too.\n\nAdded regression tests.\n\nmodified:   regress/expected/agtype.out\nmodified:   regress/sql/agtype.sql\nmodified:   src/backend/utils/adt/agtype_ops.c"
    },
    {
      "commit": "ec457345e25601c947aff73bfcc7354d97e238a6",
      "tree": "2d1b0ae09d7cdba467e374577e67a7eb58059f02",
      "parents": [
        "9c370f421ff0d138c14080a069524aff14682e19"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Oct 03 18:32:42 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 04 06:32:42 2025 +0500"
      },
      "message": "Add fast functions for checking edge uniqueness (#2227)\n\nAdded fast functions for checking edge uniqueness. This will help\nimprove performance for MATCH queries with paths longer than 3 but\nless than 11. The normal edge uniqueness function will deal with\nany path 11 and over.\n\n    modified:   age--1.6.0--y.y.y.sql\n    modified:   sql/agtype_graphid.sql\n    modified:   src/backend/parser/cypher_clause.c\n    modified:   src/backend/utils/adt/age_vle.c"
    },
    {
      "commit": "9c370f421ff0d138c14080a069524aff14682e19",
      "tree": "5be43c30884c83039d141b1ccef63bc29dc66fa8",
      "parents": [
        "652aa06f26276a240ec419361143819e6f61dbd5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 24 10:50:25 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 24 10:50:25 2025 -0700"
      },
      "message": "Bump gopkg.in/yaml.v3 from 3.0.0 to 3.0.1 in /drivers/golang (#2212)\n\nBumps gopkg.in/yaml.v3 from 3.0.0 to 3.0.1.\n\n---\nupdated-dependencies:\n- dependency-name: gopkg.in/yaml.v3\n  dependency-version: 3.0.1\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "652aa06f26276a240ec419361143819e6f61dbd5",
      "tree": "831e93dde140a84db09f619ad74e1e381436ab05",
      "parents": [
        "94770a69751c8ecdbf21887ee83a98ed6ae979c8"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Sep 15 08:55:24 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 15 20:55:24 2025 +0500"
      },
      "message": "Update branch security (#2219)\n\nUpdate branch security for PG17\n\n    modified:   .asf.yaml"
    },
    {
      "commit": "94770a69751c8ecdbf21887ee83a98ed6ae979c8",
      "tree": "7a9f12cd9770a888bf880dfd5b6eef4f0d4dd6a3",
      "parents": [
        "1afd9fb322c182aef9c79969417582590fb4dd8d"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Sep 15 06:35:52 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 15 18:35:52 2025 +0500"
      },
      "message": "Fix issue with CALL/YIELD for user defined and qualified functions. (#2217)\n\nFixed 2 issues with CALL/YIELD -\n\n   1) If a user defined function was in search_path, the transform_FuncCall\n      logic would only find it, if it were part of an extension.\n\n   2) If a function were qualified, the transform_cypher_call_subquery\n      logic would mistakenly extract the schema name instead of the\n      function name.\n\nNOTE: transform_FuncCall should be reviewed for possible refactor.\n\nAdded regression tests.\n\n    modified:   src/backend/parser/cypher_clause.c\n    modified:   src/backend/parser/cypher_expr.c\n    modified:   regress/expected/cypher_call.out\n    modified:   regress/sql/cypher_call.sql"
    },
    {
      "commit": "1afd9fb322c182aef9c79969417582590fb4dd8d",
      "tree": "cdfdef0070f67c5568b620e9e2a35e675bda996d",
      "parents": [
        "4cc02ad2525172b7417ee4d9afa5ee8015b467cb"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Tue Sep 02 22:05:33 2025 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 02 10:05:33 2025 -0700"
      },
      "message": "Fix upgrade script for 1.5.0 to 1.6.0 (#2210)\n\n- Since there are modifications to agtype gin operators, users\n  will have to drop the gin indexes before running this script\n  and recreate them."
    },
    {
      "commit": "4cc02ad2525172b7417ee4d9afa5ee8015b467cb",
      "tree": "8b042511dc9d4441b76849c98aabcaebfbba7568",
      "parents": [
        "7aa2d885d74cb59985bf51648e25e95506e2f612"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Thu Aug 21 12:37:18 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 22 00:37:18 2025 +0500"
      },
      "message": "Advance master branch to Apache AGE version 1.6.0 (#2196)\n\nUpdated the following files to advance the Apache AGE version\nto 1.6.0\n\n       modified:   Makefile\n       modified:   README.md\n       modified:   RELEASE\n       modified:   age.control\n       modified:   docker/Dockerfile\n       renamed:    age--1.5.0--y.y.y.sql -\u003e age--1.5.0--1.6.0.sql\n       modified:   age--1.5.0--y.y.y.sql\n       new file:    age--1.6.0--y.y.y.sql"
    },
    {
      "commit": "7aa2d885d74cb59985bf51648e25e95506e2f612",
      "tree": "24c49a7850b2dc4bee1e4a69971ecc341a888853",
      "parents": [
        "2803ffa7801f37a0d02a22044150e04b2845d43a"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Aug 18 07:50:17 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 18 19:50:17 2025 +0500"
      },
      "message": "fix issue 2205: left doesn\u0027t catch overflow (#2207)\n\nFixed issue 2205 where large int values aren\u0027t detected. The\nfollowing functions were fixed -\n\nleft, right, and substring\n\n    modified:   regress/expected/expr.out\n    modified:   regress/sql/expr.sql\n    modified:   src/backend/utils/adt/agtype.c\n\nAdded regression tests."
    },
    {
      "commit": "2803ffa7801f37a0d02a22044150e04b2845d43a",
      "tree": "2af612a710cb71189e5012deebf9aec48bf4297a",
      "parents": [
        "c21f0658ab92727dd689b1ed1c84636274933e7b"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Wed Aug 13 08:13:29 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 13 20:13:29 2025 +0500"
      },
      "message": "Fix issue 2201: unexpected empty string behavior (#2203)\n\nThis PR fixes the issue of some string functions returning NULL\ninstead of the empty string.\n\nThe string functions affected and corrected are -\n\nreverse, toupper, tolower, rtrim, ltrim, trim, right, left, substring,\nand replace.\n\nAdded additional regression tests. Corrected previous tests.\n\n    modified:   regress/expected/expr.out\n    modified:   regress/sql/expr.sql\n    modified:   src/backend/utils/adt/agtype.c"
    },
    {
      "commit": "c21f0658ab92727dd689b1ed1c84636274933e7b",
      "tree": "e8da0fd27c655844b407a0a97863d2ee533ed565",
      "parents": [
        "d336d6dfeaea5ab8d5c6f429e32922998f02f117"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Wed Aug 13 19:51:08 2025 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 13 07:51:08 2025 -0700"
      },
      "message": "Add missing dependency in jdbc driver (#2206)\n\n- This was also failing CI. The issue is described here https://github.com/gradle/gradle/issues/33950"
    },
    {
      "commit": "d336d6dfeaea5ab8d5c6f429e32922998f02f117",
      "tree": "4de97e139d07d7ff1c5466f7b3225fdfbee35a20",
      "parents": [
        "1277b8240ae003a2fb1ec9b930edcbda6a0cc3ac"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Aug 01 09:32:57 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 01 21:32:57 2025 +0500"
      },
      "message": "Master to PostgreSQL version 17 (#2197)\n\nConflicts:\n\t.asf.yaml\n\t.github/workflows/installcheck.yaml\n\nChanges to be committed:\n\n\tmodified:   .asf.yaml\n\tmodified:   .github/labeler.yml\n\tmodified:   .github/workflows/installcheck.yaml\n\tmodified:   README.md\n\tmodified:   docker/Dockerfile\n\tmodified:   docker/Dockerfile.dev\n\tmodified:   drivers/docker-compose.yml\n\tmodified:   src/backend/nodes/ag_nodes.c\n\tmodified:   src/backend/parser/cypher_analyze.c\n\n* Add support for PG17 (#2130)\n\n- A new node type is introduced for JSON support, that is\n  JsonConstructorExpr - wrapper over FuncExpr/Aggref/WindowFunc for\n  SQL/JSON constructors.\n- Added additional checks for JsonConstructorExpr expression node for\n  which the walker would crash.\n- Removed palloc0fast function call (which is not available in PG17)\n\n* Update CI, README and repo settings for PG17 (#2156)\n\n- Currently, all workflows are targeting the `PG17_prepare` branch,\n  which will be changed to `PG17` once the branch is renamed.\n- Updated all the github workflows\n- Updated the README\n- Updated repo settings\n- Updated the Dockerfiles\n\n* Remove stale bot and update .asf.yaml settings (#2171)\n\n- Removed stale bot.\n  (https://lists.apache.org/thread/qh4h2z6hsjy2v7wg8mwfnl6cbjp28y08)\n- Decrease required PR approvals by one.\n  (https://lists.apache.org/thread/kmz155t6k0h3b26fjpz36924zthqjlpm)\n- Fixed a warning reported by apache infra i.e.\n  \"An error occurred while processing the github\n   feature in .asf.yaml: GitHub discussions can\n   only be enabled if a mailing list target exists\n   for it.\"\n\n* Update labeler.yml\n\nAdjust workflow/labeler.yml to add permissions.\n\n* Adjust CI for PG17 after rename from PG17_prepare (#2182)\n\nAdjusted the following CI files (workflows) for PG17, they\noriginally pointed to PG17_prepare -\n\nmodified:   .github/workflows/go-driver.yml\nmodified:   .github/workflows/installcheck.yaml\nmodified:   .github/workflows/jdbc-driver.yaml\nmodified:   .github/workflows/nodejs-driver.yaml\nmodified:   .github/workflows/python-driver.yaml\nmodified:   drivers/docker-compose.yml\nmodified:   .github/labeler.yml\n\n* Reimplement list comprehension (#2169) (#2188)\n\n* Revert \"Fix issue 1955 - List comprehension in WHERE clause (#2094)\"\n\nThis reverts commit 0f0d9be9ba02fb90272d2053986f2b5aa4a0c25c.\n\n* Revert \"Fix error using list comprehension with WITH * (#1838)\"\n\nThis reverts commit 5e08a2f58693adca55085da8d56eb1831d963d20.\n\n* Revert \"Fix shift/reduce conflict in grammar (#1719)\"\n\nThis reverts commit fab3119a109280fd63237ce17c6d4dd60b7dfc03.\n\n* Revert \"Implement list comprehension (#1610)\"\n\nThis reverts commit 3b2b394eb669c4f80fc893ad224cf5ea4e10c5a9.\n\n* Reimplement list comprehension\n\n- Reimplement list comprehension to use ARRAY sublinks.\n- Some test results were not correct. All the test results that are\n  modified are correct and are verified with neo4j.\n- Also resolves the issue of using list comprehension in MERGE clause (1611)\n  and issue 1850\n\n* Add expression tree walkers for cypher nodes\n\n- Added cypher_raw_expr_tree_walker and cypher_expr_tree_walker, based\n  on Postgres\u0027s raw_expression_tree_walker and expression_tree_walker.\n  These follow the same walker API as Postgres and add support for\n  Cypher-specific nodes.\n- Also added the agtype[] to agtype func and typecast to 1.5.0-y.y.y.sql\n- Simplifies logic for cypher_subquery handling in where clause.\n- Fixes a crash when list comprehension in the WHERE clause references a\n  variable from the preceding MATCH clause.\n\n* Add support for operators in cypher query (#2172)\n\n- Fixed some operator signatures in .sql\n- Added support for PG operators in cypher. Some\n  hardcoded operators are removed, since they are\n  now covered by the general operator handling.\n- Added full typecast syntax that allows for type\n  modifiers.\n- These changes also improve interoperability with\n  other extensions, as reflected in the regression\n  tests.\n- Added a new function to check if graph_oid exists.\n\n* Prevent object access hook from accesing not installed namespace (#2161)\n\nCurrently we cannot install Age to shared_preload_libraries if\npg_cron is installed.\n\nTo prevent following error we must bail out early.\npostgres\u003d# set backtrace_functions to \u0027get_namespace_oid\u0027;\nSET\npostgres\u003d# create extension pg_cron ;\n2025-04-15 16:59:49.867 +05 [30402] ERROR:  schema \"ag_catalog\" does not exist\n2025-04-15 16:59:49.867 +05 [30402] BACKTRACE:\n\t2   postgres                            0x0000000102401ab0 get_namespace_oid + 204\n\t3   age.so                              0x0000000103285cd0 ag_catalog_namespace_id + 28\n\t4   age.so                              0x00000001032846fc ag_relation_id + 32\n\t5   age.so                              0x00000001032efe9c search_label_relation_cache_miss + 84\n\t6   age.so                              0x00000001032efe30 search_label_relation_cache + 100\n\t7   age.so                              0x00000001032842f4 object_access + 384\n\t8   postgres                            0x000000010240a7a0 RunObjectDropHook + 136\n\t9   postgres                            0x00000001023ee85c deleteOneObject + 108\n\t10  postgres                            0x00000001023eb860 deleteObjectsInList + 476\n\t11  postgres                            0x00000001023eba14 performMultipleDeletions + 316\n\t12  postgres                            0x0000000102560244 ATPostAlterTypeCleanup + 2144\n\t13  postgres                            0x0000000102559fb4 ATRewriteCatalogs + 516\n\t14  postgres                            0x00000001025543a8 ATController + 284\n\t15  postgres                            0x00000001025541bc AlterTable + 96\n\t16  postgres                            0x00000001028b8240 ProcessUtilitySlow + 1812\n\t17  postgres                            0x00000001028b600c standard_ProcessUtility + 3684\n\t18  age.so                              0x00000001032844f8 ag_ProcessUtility_hook + 200\n\t19  postgres                            0x00000001028b516c ProcessUtility + 392\n\t20  postgres                            0x000000010250e5b4 execute_sql_string + 812\n\t21  postgres                            0x000000010250d438 execute_extension_script + 2264\n\t22  postgres                            0x000000010250b330 ApplyExtensionUpdates + 1320\n\t23  postgres                            0x0000000102507954 CreateExtensionInternal + 1896\n\t24  postgres                            0x0000000102506ea4 CreateExtension + 1152\n\t25  postgres                            0x00000001028b8ed4 ProcessUtilitySlow + 5032\n\t26  postgres                            0x00000001028b600c standard_ProcessUtility + 3684\n\t27  age.so                              0x00000001032844f8 ag_ProcessUtility_hook + 200\n\t28  postgres                            0x00000001028b516c ProcessUtility + 392\n\t29  postgres                            0x00000001028b4768 PortalRunUtility + 232\n\t30  postgres                            0x00000001028b3660 PortalRunMulti + 756\n\t31  postgres                            0x00000001028b2abc PortalRun + 1008\n\t32  postgres                            0x00000001028ad870 exec_simple_query + 1436\n\t33  postgres                            0x00000001028ac990 PostgresMain + 2472\n\t34  postgres                            0x00000001027a49ac report_fork_failure_to_client + 0\n\t35  postgres                            0x00000001027a3e54 BackendStartup + 520\n\t36  postgres                            0x00000001027a29f0 ServerLoop + 812\n\t37  postgres                            0x000000010279fe0c PostmasterMain + 6484\n\t38  postgres                            0x000000010266acd0 startup_hacks + 0\n\t39  dyld                                0x000000018a3ab154 start + 2476\n\n* Fix CSV import for edge with one property (#2175)\n\n- start_index marks where property fields begin. For edges, it\u0027s 4.\n  If start_index \u003e\u003d total_fields, create empty properties; otherwise,\n  parse the properties.\n\n---------\n\nCo-authored-by: Umar Hayat \u003cm.umarkiani@gmail.com\u003e\nCo-authored-by: Muhammad Taha Naveed \u003cmtaha@apache.org\u003e\nCo-authored-by: Andrey Borodin \u003camborodin@acm.org\u003e\nCo-authored-by: Moontasir Mahmood \u003c53787290+Munmud@users.noreply.github.com\u003e"
    },
    {
      "commit": "1277b8240ae003a2fb1ec9b930edcbda6a0cc3ac",
      "tree": "67b5a4c5ba65cbf8bf21f6573f35bba18a751174",
      "parents": [
        "1251096556b99b07fd80010eb9245f52cb5e36dd"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Wed Jul 09 20:17:51 2025 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 09 08:17:51 2025 -0700"
      },
      "message": "Add support for operators in cypher query (#2172)\n\n- Fixed some operator signatures in .sql\n- Added support for PG operators in cypher. Some\n  hardcoded operators are removed, since they are\n  now covered by the general operator handling.\n- Added full typecast syntax that allows for type\n  modifiers.\n- These changes also improve interoperability with\n  other extensions, as reflected in the regression\n  tests.\n- Added a new function to check if graph_oid exists."
    },
    {
      "commit": "1251096556b99b07fd80010eb9245f52cb5e36dd",
      "tree": "3b403413296151076126c625746864235bfd80a4",
      "parents": [
        "3f873e3fe1094f770d0936983065deb3089e9785"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Tue Jun 10 23:07:49 2025 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 10 11:07:49 2025 -0700"
      },
      "message": "Reimplement list comprehension (#2169)\n\n* Revert \"Fix issue 1955 - List comprehension in WHERE clause (#2094)\"\n\nThis reverts commit 0f0d9be9ba02fb90272d2053986f2b5aa4a0c25c.\n\n* Revert \"Fix error using list comprehension with WITH * (#1838)\"\n\nThis reverts commit 5e08a2f58693adca55085da8d56eb1831d963d20.\n\n* Revert \"Fix shift/reduce conflict in grammar (#1719)\"\n\nThis reverts commit fab3119a109280fd63237ce17c6d4dd60b7dfc03.\n\n* Revert \"Implement list comprehension (#1610)\"\n\nThis reverts commit 3b2b394eb669c4f80fc893ad224cf5ea4e10c5a9.\n\n* Reimplement list comprehension\n\n- Reimplement list comprehension to use ARRAY sublinks.\n- Some test results were not correct. All the test results that are\n  modified are correct and are verified with neo4j.\n- Also resolves the issue of using list comprehension in MERGE clause (1611)\n  and issue 1850\n\n* Add expression tree walkers for cypher nodes\n\n- Added cypher_raw_expr_tree_walker and cypher_expr_tree_walker, based\n  on Postgres\u0027s raw_expression_tree_walker and expression_tree_walker.\n  These follow the same walker API as Postgres and add support for\n  Cypher-specific nodes.\n- Also added the agtype[] to agtype func and typecast to 1.5.0-y.y.y.sql\n- Simplifies logic for cypher_subquery handling in where clause.\n- Fixes a crash when list comprehension in the WHERE clause references a\n  variable from the preceding MATCH clause."
    },
    {
      "commit": "3f873e3fe1094f770d0936983065deb3089e9785",
      "tree": "8daff83cd19e9f436ca849718f02b10fcf7c974b",
      "parents": [
        "7ae3081f479e655ff1f5592694ad18d68c11434b"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Jun 09 11:06:36 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 09 23:06:36 2025 +0500"
      },
      "message": "Update labeler.yml (#2186)\n\nAdjust workflow/labeler.yml to add permissions."
    },
    {
      "commit": "7ae3081f479e655ff1f5592694ad18d68c11434b",
      "tree": "ec22e49da3d3f96e6917388724563a3c30321647",
      "parents": [
        "04bde30c07600381e5aec4468bdaf4e73a7e948f"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Jun 02 12:23:11 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 03 00:23:11 2025 +0500"
      },
      "message": "Fix issue with the CI build and labeler (#2183)\n\nThe build now needs to use https:, instead of git:\nThe labeler now requires a new step before running.\n\nModified the following files -\n\n    .github/workflows/installcheck.yaml\n    .github/workflows/labeler.yml"
    },
    {
      "commit": "04bde30c07600381e5aec4468bdaf4e73a7e948f",
      "tree": "0d3803b51a0843efb5a6b7c28ffb99e87b300353",
      "parents": [
        "23f3e879e7c6d1ed849f476d99abbb65e57f4207"
      ],
      "author": {
        "name": "Moontasir Mahmood",
        "email": "53787290+Munmud@users.noreply.github.com",
        "time": "Sun May 18 15:56:39 2025 +0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 18 14:56:39 2025 +0500"
      },
      "message": "Fix CSV import for edge with one property (#2175)\n\n- start_index marks where property fields begin. For edges, it\u0027s 4.\n  If start_index \u003e\u003d total_fields, create empty properties; otherwise,\n  parse the properties."
    },
    {
      "commit": "23f3e879e7c6d1ed849f476d99abbb65e57f4207",
      "tree": "70eccf7aa39cfc914f32bfc07a7ff5053229411a",
      "parents": [
        "50422cbd810f35d9ca2111f2be50b4bbc45c175b"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Mon May 12 19:40:33 2025 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 12 07:40:33 2025 -0700"
      },
      "message": "Remove stale bot and update .asf.yaml settings (#2171)\n\n- Removed stale bot.\n  (https://lists.apache.org/thread/qh4h2z6hsjy2v7wg8mwfnl6cbjp28y08)\n- Decrease required PR approvals by one.\n  (https://lists.apache.org/thread/kmz155t6k0h3b26fjpz36924zthqjlpm)\n- Fixed a warning reported by apache infra i.e.\n  \"An error occurred while processing the github\n   feature in .asf.yaml: GitHub discussions can\n   only be enabled if a mailing list target exists\n   for it.\""
    },
    {
      "commit": "50422cbd810f35d9ca2111f2be50b4bbc45c175b",
      "tree": "9a1ae71f4272264e94deae403e806fff592fc1c2",
      "parents": [
        "2d2b8547054a96ef96d89fa84be52486ee7626b3"
      ],
      "author": {
        "name": "Andrey Borodin",
        "email": "amborodin@acm.org",
        "time": "Thu May 08 21:31:28 2025 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 08 21:31:28 2025 +0500"
      },
      "message": "Prevent object access hook from accesing not installed namespace (#2161)\n\nCurrently we cannot install Age to shared_preload_libraries if\npg_cron is installed.\n\nTo prevent following error we must bail out early.\npostgres\u003d# set backtrace_functions to \u0027get_namespace_oid\u0027;\nSET\npostgres\u003d# create extension pg_cron ;\n2025-04-15 16:59:49.867 +05 [30402] ERROR:  schema \"ag_catalog\" does not exist\n2025-04-15 16:59:49.867 +05 [30402] BACKTRACE:\n\t2   postgres                            0x0000000102401ab0 get_namespace_oid + 204\n\t3   age.so                              0x0000000103285cd0 ag_catalog_namespace_id + 28\n\t4   age.so                              0x00000001032846fc ag_relation_id + 32\n\t5   age.so                              0x00000001032efe9c search_label_relation_cache_miss + 84\n\t6   age.so                              0x00000001032efe30 search_label_relation_cache + 100\n\t7   age.so                              0x00000001032842f4 object_access + 384\n\t8   postgres                            0x000000010240a7a0 RunObjectDropHook + 136\n\t9   postgres                            0x00000001023ee85c deleteOneObject + 108\n\t10  postgres                            0x00000001023eb860 deleteObjectsInList + 476\n\t11  postgres                            0x00000001023eba14 performMultipleDeletions + 316\n\t12  postgres                            0x0000000102560244 ATPostAlterTypeCleanup + 2144\n\t13  postgres                            0x0000000102559fb4 ATRewriteCatalogs + 516\n\t14  postgres                            0x00000001025543a8 ATController + 284\n\t15  postgres                            0x00000001025541bc AlterTable + 96\n\t16  postgres                            0x00000001028b8240 ProcessUtilitySlow + 1812\n\t17  postgres                            0x00000001028b600c standard_ProcessUtility + 3684\n\t18  age.so                              0x00000001032844f8 ag_ProcessUtility_hook + 200\n\t19  postgres                            0x00000001028b516c ProcessUtility + 392\n\t20  postgres                            0x000000010250e5b4 execute_sql_string + 812\n\t21  postgres                            0x000000010250d438 execute_extension_script + 2264\n\t22  postgres                            0x000000010250b330 ApplyExtensionUpdates + 1320\n\t23  postgres                            0x0000000102507954 CreateExtensionInternal + 1896\n\t24  postgres                            0x0000000102506ea4 CreateExtension + 1152\n\t25  postgres                            0x00000001028b8ed4 ProcessUtilitySlow + 5032\n\t26  postgres                            0x00000001028b600c standard_ProcessUtility + 3684\n\t27  age.so                              0x00000001032844f8 ag_ProcessUtility_hook + 200\n\t28  postgres                            0x00000001028b516c ProcessUtility + 392\n\t29  postgres                            0x00000001028b4768 PortalRunUtility + 232\n\t30  postgres                            0x00000001028b3660 PortalRunMulti + 756\n\t31  postgres                            0x00000001028b2abc PortalRun + 1008\n\t32  postgres                            0x00000001028ad870 exec_simple_query + 1436\n\t33  postgres                            0x00000001028ac990 PostgresMain + 2472\n\t34  postgres                            0x00000001027a49ac report_fork_failure_to_client + 0\n\t35  postgres                            0x00000001027a3e54 BackendStartup + 520\n\t36  postgres                            0x00000001027a29f0 ServerLoop + 812\n\t37  postgres                            0x000000010279fe0c PostmasterMain + 6484\n\t38  postgres                            0x000000010266acd0 startup_hacks + 0\n\t39  dyld                                0x000000018a3ab154 start + 2476"
    },
    {
      "commit": "2d2b8547054a96ef96d89fa84be52486ee7626b3",
      "tree": "0fe1a0bba9c78cd107d1cdbb6c145315eb107b60",
      "parents": [
        "c75d9e477e2f83016a7a144291d2c15038cf229f"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Thu May 08 20:32:58 2025 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 08 08:32:58 2025 -0700"
      },
      "message": "Fix CI build errors caused by missing dependencies (#2163)\n\nAdds extra step in CI workflow to install missing necessary\ndependencies."
    },
    {
      "commit": "c75d9e477e2f83016a7a144291d2c15038cf229f",
      "tree": "fee8d2b64ccfdba4912b42754a0a922b6aa8df7a",
      "parents": [
        "3247728a610fc9e385707a975e0dcd72a00f1773"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Sep 27 10:51:11 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 27 19:51:11 2024 +0200"
      },
      "message": "Adjust repository settings (#2119)\n\nAdjusted the repository settings to adhere more strictly to Apache\r\npolicies."
    },
    {
      "commit": "3247728a610fc9e385707a975e0dcd72a00f1773",
      "tree": "240255fd45483882518230e56898b85b77a25f62",
      "parents": [
        "bd7dd4c2b57c037c4d4fdbf6df19fcee10c1f827"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Wed Sep 11 21:45:58 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 11 09:45:58 2024 -0700"
      },
      "message": "Add support for external extensions (#2088)\n\n- This commit allows the functions from external extensions to be\r\n  called from the Cypher queries, provided that typecast is available\r\n  for args and return type of that function. The extension should be\r\n  installed and the function should be in the search path.\r\n\r\n- Added cypher typecast for pgvector datatypes, its not a direct cast.\r\n  It casts agtype to text and then text to vector.\r\n\r\n- Added regression tests for pg_trgm, fuzzystrmatch and pgvector\r\n  extensions. pg_trgm is another extension that is used for fuzzy\r\n  string matching. These regression test are extra tests that need to\r\n  be explicitly added to the regression suite.\r\n  Following command can be used to do so:\r\n  make installcheck EXTRA_TESTS\u003d\"pg_trgm pgvector fuzzystrmatch\"\r\n\r\n- Updated CI to run the extra tests for the extensions."
    },
    {
      "commit": "bd7dd4c2b57c037c4d4fdbf6df19fcee10c1f827",
      "tree": "311694877e46549927503f3cfa84352a8b9419a4",
      "parents": [
        "0f0d9be9ba02fb90272d2053986f2b5aa4a0c25c"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Tue Sep 10 11:08:01 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 10 23:08:01 2024 +0500"
      },
      "message": "Fix issue 2093: pfree() called with a NULL pointer (#2095)\n\nFixed issue 2093 where pfree() was called with a NULL pointer.\r\n\r\nThe issue is due to some confusion with pfree(). There are 2\r\ndefinitions for it, one that checks for a passed NULL and the\r\nother which does not.\r\n\r\nCreated a function, pfree_if_not_null(), to check for NULL and\r\ncall pfree() if a NULL wasn\u0027t passed.\r\n\r\nModified the pfree references in the following files -\r\n\r\n   src/backend/commands/label_commands.c\r\n   src/backend/executor/cypher_merge.c\r\n   src/backend/executor/cypher_set.c\r\n   src/backend/parser/ag_scanner.l\r\n   src/backend/parser/cypher_analyze.c\r\n   src/backend/parser/cypher_expr.c\r\n   src/backend/parser/cypher_gram.y\r\n   src/backend/parser/cypher_parse_agg.c\r\n   src/backend/utils/adt/age_global_graph.c\r\n   src/backend/utils/adt/age_graphid_ds.c\r\n   src/backend/utils/adt/age_session_info.c\r\n   src/backend/utils/adt/age_vle.c\r\n   src/backend/utils/adt/agtype.c\r\n   src/backend/utils/adt/agtype_gin.c\r\n   src/backend/utils/adt/agtype_raw.c\r\n   src/backend/utils/adt/agtype_util.c\r\n   src/backend/utils/load/ag_load_edges.c\r\n   src/backend/utils/load/ag_load_labels.c\r\n   src/include/utils/age_graphid_ds.h\r\n   src/include/utils/age_session_info.h\r\n   src/include/utils/agtype.h\r\n\r\nAdded regression tests for the original issue."
    },
    {
      "commit": "0f0d9be9ba02fb90272d2053986f2b5aa4a0c25c",
      "tree": "12c875081c9d33956c4e2057e637dcc8124e860f",
      "parents": [
        "c3d658d3af479f5b7f9e1c606e4c7a402006ad0b"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Mon Sep 09 22:31:26 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 09 10:31:26 2024 -0700"
      },
      "message": "Fix issue 1955 - List comprehension in WHERE clause (#2094)\n\n- Fixed issue when MATCH clause variable is referenced inside list\r\n  comprehension in WHERE clause or in property constraint.\r\n- Added regression tests."
    },
    {
      "commit": "c3d658d3af479f5b7f9e1c606e4c7a402006ad0b",
      "tree": "1a3c92e1c6240bd2bd00c5e82160dce3ce979825",
      "parents": [
        "9c0960efbe5e03c470f3d9b2b1048faa5c81222e"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Sep 02 03:04:10 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 02 15:04:10 2024 +0500"
      },
      "message": "Add support for fuzzystrmatch and other external extensions (#2083)\n\nAdded support for the fuzzystrmatch extension and for other\r\nexternal extensions.\r\n\r\nAdded support for typecasting `::pg_text` to TEXTOID.\r\n\r\nAdded regression tests.\r\n\r\n   modified:   sql/agtype_coercions.sql\r\n   modified:   src/backend/parser/cypher_expr.c\r\n   modified:   src/backend/utils/adt/agtype.c\r\n   modified:   regress/expected/expr.out\r\n   modified:   regress/sql/expr.sql"
    },
    {
      "commit": "9c0960efbe5e03c470f3d9b2b1048faa5c81222e",
      "tree": "6ee637d0d36eb9260b41c58a50f30fe7c016191c",
      "parents": [
        "b45283b9c632cd63b3be6c155f2f0ebf88b76d0a"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Aug 26 02:50:04 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 26 14:50:04 2024 +0500"
      },
      "message": "Fix memory leaks in functions part 1 (#2066)\n\nFixing memory leaks in functions due to contexts not clearing out\r\nthe memory soon enough.\r\n\r\nBackground: Destroying a context will free up its associated memory.\r\nHowever, before that happens, a process can still accumulate a lot of\r\nmemory working on large data sets if it expects the context free to do\r\nit for it. For example, when PG does quicksort the context isn\u0027t\r\ndestroyed until after the qs has finished. This can cause memory to be\r\nexhausted.\r\n\r\nPut in more aggressive freeing of memory. However, there are a lot of\r\nareas that need this applied. So, this is part 1 of at least 3 or 4\r\nparts.\r\n\r\nWorked mainly on `agtype.c` However, dealt with linked functions in\r\nother files.\r\n\r\n    modified:   src/backend/utils/adt/age_vle.c\r\n    modified:   src/backend/utils/adt/agtype.c\r\n    modified:   src/backend/utils/adt/agtype_util.c\r\n    modified:   src/include/utils/agtype.h"
    },
    {
      "commit": "b45283b9c632cd63b3be6c155f2f0ebf88b76d0a",
      "tree": "817d17accbcda5138d790158869eb74efd385415",
      "parents": [
        "05487a08f7b1985c5a815f55918905ede47454da"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Fri Aug 23 21:45:16 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 23 09:45:16 2024 -0700"
      },
      "message": "Issue 1996 - Add agtype to json typecast (#2075)\n\n- Added a helper function to determine agtype value type.\r\n- Added a function to cast agtype to json.\r\n- Added regression tests."
    },
    {
      "commit": "05487a08f7b1985c5a815f55918905ede47454da",
      "tree": "9b80387b125cf068dd71766e4107aaf551591647",
      "parents": [
        "2a67bc6ab9af8abc81da0cfe47824e9dea46198e"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Aug 19 10:35:37 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 19 22:35:37 2024 +0500"
      },
      "message": "Fix issue 2046: Memory leak during btree(agtype) (#2060)\n\nFixed the memory leaks during a btree index build.\r\n\r\nThe issue has to do with how PostgreSQL allocates and frees its\r\nmemory. Usually, contexts are destroyed, freeing up the memory in\r\nthat context for the functions.  However, sometimes this destruction\r\nhappens way too late for it to be helpful. In the case of btree\r\ncompare, the context destruction doesn\u0027t happen until after the sort\r\nhas completed. The solution is to add in pfrees to manage the memory\r\nwe use, ourselves.\r\n\r\nAdditionally, propagated these changes to a few other functions. More\r\nPRs will be created to address other locations where this applies.\r\n\r\nNo regression tests were impacted.\r\nNo additionall regression tests are needed."
    },
    {
      "commit": "2a67bc6ab9af8abc81da0cfe47824e9dea46198e",
      "tree": "e5cd6acd15d4c52d90766599c9b3958ca3e2ea8e",
      "parents": [
        "e370db34afb255236a77012882d17e3f396e7f5b"
      ],
      "author": {
        "name": "Shinya Kato",
        "email": "37682778+shinyaaa@users.noreply.github.com",
        "time": "Sat Aug 17 02:10:55 2024 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 16 22:10:55 2024 +0500"
      },
      "message": "Refactor Dockerfile to use multi-stage builds (#2004)\n\nRefactored Dockerfile to use multi-stage builds for reduction image size.\r\n\r\nThe installation of the packages required for the build and the build process are carried out at the build stage. The built binaries are then placed in the final image.\r\n\r\nThis changes has reduces the image size about 1/3.\r\n```\r\n$ docker image ls apache/age\r\nREPOSITORY   TAG       IMAGE ID       CREATED          SIZE\r\napache/age   tmp       5ffd0b539a88   22 minutes ago   458MB \u003c-- New image\r\napache/age   latest    fb44b5789198   2 months ago     1.5GB \u003c-- Original image\r\n```"
    },
    {
      "commit": "e370db34afb255236a77012882d17e3f396e7f5b",
      "tree": "6abce742ea0b7ccae64243701fddddc0993c0ffe",
      "parents": [
        "64a415ee058d983ee373d1c8e6672a0b4e8b46a9"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Wed Aug 14 23:34:04 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 14 11:34:04 2024 -0700"
      },
      "message": "Revamp age csv loader (#2044)\n\n* Allow 0 as entry_id\r\n\r\n- No regression test were impacted by this change.\r\n\r\n* Use batch inserts to improve performance\r\n\r\n- Changed heap_insert to heap_multi_insert since it is faster than\r\n  calling heap_insert() in a loop. When multiple tuples can be inserted\r\n  on a single page, just a single WAL record covering all of them, and\r\n  only need to lock/unlock the page once.\r\n\r\n- BATCH_SIZE is set to 1000, which is the number of tuples to insert in\r\n  a single batch. This number was chosen after some experimentation.\r\n\r\n- Change some of the field names to avoid confusion.\r\n\r\n* Use sequence for generating ids for edge and vertex\r\n\r\n- Sequence is not used if the id_field_exists is true in\r\n  load_labels_from_file function, since the entry id is present in the\r\n  csv.\r\n\r\n* Add function to create temporary table for ids\r\n\r\n- Created a temporary table and populate it with already generated\r\n  vertex ids. A unique index is created on id column to ensure that\r\n  new ids generated (using entry id from csv) are unique.\r\n\r\n* Insert generated ids in the temporary table to enforce uniqueness\r\n\r\n- Insert ids in the temporary table and also update index to\r\n  enforce uniqueness.\r\n- If the entry id provided in the CSV is greater than the current\r\n  sequence value, the sequence value is updated to match the entry ID.\r\n  For example:\r\n  Suppose the current sequence value is 1, and the CSV entry ID is 2.\r\n  If we use 2 but not update the sequence to 2, next time the CREATE\r\n  clause is used, 2 will be returned by sequence as an entry id,\r\n  resulting in duplicate.\r\n- Update batch functions\r\n\r\n* Add functions to create graph and label automatically\r\n\r\n- These functions will check existence of graph and label, and create\r\n  them if they don\u0027t exist.\r\n\r\n* Add regression tests"
    },
    {
      "commit": "64a415ee058d983ee373d1c8e6672a0b4e8b46a9",
      "tree": "f383d057b6d5aa4872cbc3c87e72e7d7ed694b1b",
      "parents": [
        "e1b47e9e862e5eccba5ad110ccc5cb56bebd087a"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Aug 09 06:22:19 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 09 18:22:19 2024 +0500"
      },
      "message": "Fix issue 2020: Memory leak (#2028)\n\nFixed issue 2020: Memory leak in the VLE cache cleanup routines. Or,\r\nat least I fixed a good part of it.\r\n\r\nNOTE: We should look further into this, resources permitting.\r\n\r\nWhat was causing the leaks were the property datums in the hash tables.\r\nThe property datums were copied via datumCopy into the hash tables for\r\neasier access when rebuilding an edge. However, they needed to be freed\r\nwhen no longer needed.\r\n\r\nNo regression tests were impacted.\r\nNo regression tests were needed."
    },
    {
      "commit": "e1b47e9e862e5eccba5ad110ccc5cb56bebd087a",
      "tree": "edb09f218b1377274852e927e3829089a345c34b",
      "parents": [
        "53999d2467488c3d6cd34005fb6e82570c5535d7"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Wed Aug 07 23:53:03 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 08 11:53:03 2024 +0500"
      },
      "message": "Fix Issue 1907: SET on MERGE not storing edge properties (#2019)\n\nFixed issue 1907: SET on MERGE not storing edge properties. This\r\nissue is the same as the following commit, except that it applies\r\nto edges.\r\n\r\n    commit 99e7c625d97782849e39bca93daca07b35c60772\r\n    Author: John Gemignani \u003cjrgemignani@gmail.com\u003e\r\n    Date:   Wed Jul 6 16:26:14 2022 -0700\r\n\r\nEdges were overlooked when fixing the vertices in that commit.\r\nThis PR corrects that omission.\r\n\r\nCurrent regression tests weren\u0027t impacted.\r\n\r\nAdded additional regression tests."
    },
    {
      "commit": "53999d2467488c3d6cd34005fb6e82570c5535d7",
      "tree": "7d20f0c584a5fe6dd9450fcd7be4f1f0e489644b",
      "parents": [
        "7b1984585deb5a7dc5fdf3d8ac79dc01be5bc842"
      ],
      "author": {
        "name": "Shinya Kato",
        "email": "37682778+shinyaaa@users.noreply.github.com",
        "time": "Thu Aug 08 06:59:40 2024 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 07 14:59:40 2024 -0700"
      },
      "message": "Add EmitWarningsOnPlaceholders(\"age\") (#1997)\n\nAdded EmitWarningsOnPlaceholders(\"age\") to warn when an undefined GUC parameter is set for a placeholder named \"age\".\r\nWarnings are issued when PostgreSQL starts and when SET statements are executed.\r\n\r\nWhen PostgreSQL starts\r\n```\r\n2024-08-01 18:32:31.220 JST [2039799] WARNING: invalid configuration parameter name \"age.invalid_parameter\", removing it\r\n```\r\n\r\nWhen SET statement is executed\r\n```\r\nERROR: invalid configuration parameter name \"age.invalid_parameter\"\r\nDETAIL: \"age\" is a reserved prefix.\r\n```\r\n\r\nRegression tests were added."
    },
    {
      "commit": "7b1984585deb5a7dc5fdf3d8ac79dc01be5bc842",
      "tree": "b6b0df0c0b9097ce9de4c230dc39c8c37f81c056",
      "parents": [
        "12d1a6ed833160ea3f8eeb2ca65f22f44d701b33"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Tue Aug 06 10:48:50 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 06 22:48:50 2024 +0500"
      },
      "message": "Fix Issue 1988: How to update a property which is a keyword (#2005)\n\nFixed issue 1988: Reserved Keyword Handling: How to update a property\r\nwhich is a keyword. Basically, how to use a keyword, aka reserved\r\nword, in a query.\r\n\r\nAdded the appropriate scanner and parser rules to allow keywords to\r\nbe back ticked and used in queries as their name. For example, like\r\nin the following commands -\r\n\r\n    MATCH (n:Person { id: 123 }) SET n.`match` \u003d \u0027matched\u0027 RETURN n;\r\n    MATCH (n:Person { id: 123 }) SET n.`create` \u003d \u0027created\u0027 RETURN n;\r\n\r\nThe changes did not break any regression tests.\r\nAdded additional regression tests."
    },
    {
      "commit": "12d1a6ed833160ea3f8eeb2ca65f22f44d701b33",
      "tree": "60b9b994d2db5949b01c4dfd7d40a0e985319d2f",
      "parents": [
        "ee1bb956ad96359c97a4863c0775bd024bc93d38"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Tue Aug 06 19:40:00 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 06 07:40:00 2024 -0700"
      },
      "message": "Fix obsolete docker-compose command in CIs (#2007)\n\n- This issue occurred because docker Compose v1 is now removed from\r\n  images.\r\n- Related links:\r\n  https://github.com/actions/runner-images/issues/9557\r\n  https://github.com/orgs/community/discussions/116610"
    },
    {
      "commit": "ee1bb956ad96359c97a4863c0775bd024bc93d38",
      "tree": "a40dbdef9b27a1b174c1f1f417a42cc7c76173cf",
      "parents": [
        "92d83e2b3026ea62f23b8fce0c3f9ff53fc95721"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Tue Jul 30 11:14:16 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 30 23:14:16 2024 +0500"
      },
      "message": "Fix issue 1986: Failure creating label name close to MAX_LABEL_NAME_LEN (#1989)\n\nFixed the issue with creating a label name close to MAX_LABEL_NAME_LEN. Well,\r\nsort of.\r\n\r\nThe issue here is that a label name is the name of a relation in PostgreSQL.\r\nWhile the relation name is a char * it is basically converted to a PG type Name\r\nwhen it is used to create a relation. This conversion is a silent truncation,\r\nthere are no warnings or error messages. The Name type is defined as follows -\r\n\r\n    /*\r\n     * Representation of a Name: effectively just a C string, but null-padded to\r\n     * exactly NAMEDATALEN bytes.  The use of a struct is historical.\r\n     */\r\n    typedef struct nameData\r\n    {\r\n        char data[NAMEDATALEN];\r\n    } NameData;\r\n    typedef NameData *Name;\r\n\r\nThis effectively gives us a max label name length of NAMEDATALEN - 1.\r\n\r\n    /*\r\n     * Maximum length for identifiers (e.g. table names, column names,\r\n     * function names).  Names actually are limited to one fewer byte than this,\r\n     * because the length must include a trailing zero byte.\r\n     *\r\n     * This should be at least as much as NAMEDATALEN of the database the\r\n     * applications run against.\r\n     */\r\n    #define NAMEDATALEN 64\r\n\r\nSince there isn\u0027t a way to get around this, the code was modified to reflect the\r\nusage of NAMEDATALEN for the length of label names. This required modifying the\r\ninput parameters to be cstrings, for the functions `create_vlabel` and\r\n`create_elabel` which allows us to tell when NAMEDATALEN has been exceeded.\r\n\r\nAdditionally, the function `is_valid_label` was renamed to `is_valid_label_name`\r\nfor consistency.\r\n\r\nRegression tests were updated and added."
    },
    {
      "commit": "92d83e2b3026ea62f23b8fce0c3f9ff53fc95721",
      "tree": "858ecdb82267808951fbc048826c80c7e633096b",
      "parents": [
        "9b4a3e5c267f74554ed5571754f18f050e2167f3"
      ],
      "author": {
        "name": "Shinya Kato",
        "email": "37682778+shinyaaa@users.noreply.github.com",
        "time": "Tue Jul 16 09:35:48 2024 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 15 17:35:48 2024 -0700"
      },
      "message": "Update README.md (#1976)\n\nmisprint\r\n\r\nCo-authored-by: chitsung.lin \u003cchitsung.lin@gmail.com\u003e"
    },
    {
      "commit": "9b4a3e5c267f74554ed5571754f18f050e2167f3",
      "tree": "33285968f65199e2f032abf6dc16104c7fdd2d2f",
      "parents": [
        "46cc419c1bc476749347adfc71d6d9bf729ab0c2"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Jul 08 16:31:31 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 08 16:31:31 2024 -0700"
      },
      "message": "Fix issue 1953 - PG Boolean used as AGTYPE object (#1959)\n\nFixed issue 1953 - Server crashes when executing -\r\n\r\n SELECT * FROM cypher(\u0027ag_graph_3\u0027...)\r\n\r\nThis was due to the executor phase trying to use a PG Boolean as\r\nan AGTYPE object for the indirection argument.\r\n\r\nThe fix was to use coerce_to_common_type on the input argument in\r\ntransform_A_Indirection.\r\n\r\nAdded regression tests."
    },
    {
      "commit": "46cc419c1bc476749347adfc71d6d9bf729ab0c2",
      "tree": "a59c86677db4c85f668a899674212e4ee0e57df5",
      "parents": [
        "c21537216c14955fe32f2835f394d49e0a2d50cd"
      ],
      "author": {
        "name": "Rafsun Masud",
        "email": "rafsun82@gmail.com",
        "time": "Mon Jul 08 14:59:29 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 08 14:59:29 2024 -0700"
      },
      "message": "Add graph_exists function (#1958)\n\nThis function returns if a graph exists."
    },
    {
      "commit": "c21537216c14955fe32f2835f394d49e0a2d50cd",
      "tree": "4f2d84bb69cda6988a47877d0726de1edc352cc3",
      "parents": [
        "f5169a3708f4dd41b687a1da0f8061c0dee954a0"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Jul 08 12:32:35 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 08 12:32:35 2024 -0700"
      },
      "message": "Fix issue 1956 - null key name passed. (#1957)\n\nFixed issue 1956 - Server crashes when executing\r\n\r\n    SELECT agtype_build_map(\u0027null\u0027::agtype, 1);\r\n\r\nThis issue was due to a missing check for AGTV_NULL values. The\r\ncheck was added and the issue was corrected.\r\n\r\nAdded regression tests."
    },
    {
      "commit": "f5169a3708f4dd41b687a1da0f8061c0dee954a0",
      "tree": "db3dc3da7ee2d75bc798e13068bdc5d5855dbc1f",
      "parents": [
        "7fc34483840596130f11ee0d61b7ac53862eeb10"
      ],
      "author": {
        "name": "Emmanuel Allison",
        "email": "emmanuelallison@outlook.com",
        "time": "Mon Jul 01 16:20:30 2024 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 01 20:20:30 2024 +0500"
      },
      "message": "docs: add link to .NET open-source driver (#1938)\n\n- Link to the driver source code is https://github.com/Allison-E/pg-age\r\n- Link to the driver package https://www.nuget.org/packages/ApacheAGE"
    },
    {
      "commit": "7fc34483840596130f11ee0d61b7ac53862eeb10",
      "tree": "aa662e622d2c8a8e05d28e29c3b96e0baaa35f40",
      "parents": [
        "d73d3eba3350ab1cb4fa3d03b014d1fdd9a85673"
      ],
      "author": {
        "name": "Daan",
        "email": "46441749+daanwa@users.noreply.github.com",
        "time": "Thu Jun 27 21:07:28 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 27 15:07:28 2024 -0400"
      },
      "message": "Add the `load_from_plugins` parameter in the Python driver to load AGE from the $libdir/plugins directory (#1935)\n\nThis is useful when a non-superuser login is used for the connection.\r\n\r\nAdditionally, fixed a small bug where a memoryview was not transformed to bytes before decoding into a UTF-8 string. \r\n\r\nCo-authored-by: Daan Wagenaar \u003cdaan@dutchsecred.eu\u003e"
    },
    {
      "commit": "d73d3eba3350ab1cb4fa3d03b014d1fdd9a85673",
      "tree": "d8107d188ef84bc9dcdea036cafb4fb17aae0684",
      "parents": [
        "9d77790dcdca2eae7e074f6374bc78e4f0f6ab35"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Wed Jun 19 10:00:21 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 19 10:00:21 2024 -0700"
      },
      "message": "Fix issue 1910: Server crashes when using exists(vle path) (#1924)\n\nFixed issue 1910: Server crashes when using exists(path) with explicit\r\nlength paths.\r\n\r\nThe crash was caused because transform_ColumnRef did not pass down the\r\nlevels_up value into scanNSItemForColumn.\r\n\r\nUpon fixing that issue, it was found that the transform_cypher_node\r\nfunction did not correctly process the vle_function_end_var end\r\nvariable. In some cases, in the WHERE clause, it needs to be created.\r\n\r\nAdded regression tests."
    },
    {
      "commit": "9d77790dcdca2eae7e074f6374bc78e4f0f6ab35",
      "tree": "d833045b7916515f77d33aceec7db80f75da90d8",
      "parents": [
        "ed810ef593327383d0a86c08be43982243d913f7"
      ],
      "author": {
        "name": "Umar Hayat",
        "email": "m.umarkiani@gmail.com",
        "time": "Tue Jun 18 04:44:04 2024 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 17 12:44:04 2024 -0700"
      },
      "message": "Converted single line comments to multiline (#1908)\n\nConverted all single line comments in C file to multiline comments based PostgreSQL coding conventions"
    },
    {
      "commit": "ed810ef593327383d0a86c08be43982243d913f7",
      "tree": "004c12745fa48f6cc8ddd1f26c8f18d7e331528d",
      "parents": [
        "110cf1b32f59c3faa180f2ea1cc165bff9bd8c99"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri Jun 14 11:14:00 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 14 14:14:00 2024 -0400"
      },
      "message": "Add function is_valid_label_name (#1911) (#1912)\n\nAdded the function is_valid_label_name (#1911) per user request.\r\n\r\nThis function will return a boolean value for any agtype string\r\npassed, depending on whether it is a valid name for a label. For\r\nall other types, not an agtype string, it will error out. Depending\r\non user requirements, this could be changed in the future.\r\n\r\nAdded regression tests."
    },
    {
      "commit": "110cf1b32f59c3faa180f2ea1cc165bff9bd8c99",
      "tree": "c950882c924fc2ce26df9d1edfd5a2fccf311876",
      "parents": [
        "d80f0860c7b4b587d4243ec41cedbd4b99f5b9b6"
      ],
      "author": {
        "name": "Marco Aurélio Silva de Souza Júnior",
        "email": "57829631+markgomer@users.noreply.github.com",
        "time": "Mon Jun 10 12:37:47 2024 -0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 10 20:37:47 2024 +0500"
      },
      "message": "Fixes small typos in the python driver\u0027s README.md file (#1909)\n\n- Fix a markdown link grammar mistake.\r\n- Fix some \"Age\" misspellings to \"AGE\"."
    },
    {
      "commit": "d80f0860c7b4b587d4243ec41cedbd4b99f5b9b6",
      "tree": "cda72d18fbaf74469f32d1ec22de6b2baeab2c1e",
      "parents": [
        "ef9e0bd67bb8c342c4f6dd04761e2c4b3a3a5f80"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Mon Jun 03 16:16:41 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 03 16:16:41 2024 -0700"
      },
      "message": "Fix agtype_build_map to allow more than 50 pairs (#1901)\n\nFixed agtype_build_map to allow objects to be created with more than\r\n50 pairs. This is a PostgreSQL limitation on the number of function\r\narguments.\r\n\r\nTo achieve this, the agtype_add, aka concat operator, was used to\r\nconcat objects together when the limit was reached for the number\r\nof arguments.\r\n\r\nAdded regression tests."
    },
    {
      "commit": "ef9e0bd67bb8c342c4f6dd04761e2c4b3a3a5f80",
      "tree": "6cdcba2ed094cf16ae76603e0bafbc1bb70f2a34",
      "parents": [
        "3b8aaa6ce7139f3503ebaff3c990b0d2f27259dc"
      ],
      "author": {
        "name": "Christoph Berg",
        "email": "cb@df7cb.de",
        "time": "Thu May 23 19:10:39 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 23 10:10:39 2024 -0700"
      },
      "message": "Agtype hash cmp (#1893)\n\n* Order some regression tests for stability on big-endian\r\n\r\nOn Debian\u0027s s390x architecture, some regression tests were failing\r\nbecause the result set was reordered. Fix by attaching ORDER BY in\r\nproblematic cases.\r\n\r\n* Move agtype_hash_cmp tests to separate file\r\n\r\nOutput of the agtype_hash_cmp function varies depending on the machine\r\nendianness. Move tests to a separate file and supply little-endian and\r\nbig-endian output expected files."
    },
    {
      "commit": "3b8aaa6ce7139f3503ebaff3c990b0d2f27259dc",
      "tree": "e4f806caeeb9946ccb04e844c42a6d03020ade69",
      "parents": [
        "efcde37dd80b9b82caaff72d0b02a929b3c1a8c8"
      ],
      "author": {
        "name": "Christoph Berg",
        "email": "cb@df7cb.de",
        "time": "Thu May 23 18:10:45 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 23 09:10:45 2024 -0700"
      },
      "message": "Order some regression tests for stability on big-endian (#1892)\n\nOn Debian\u0027s s390x architecture, some regression tests were failing\r\nbecause the result set was reordered. Fix by attaching ORDER BY in\r\nproblematic cases."
    },
    {
      "commit": "efcde37dd80b9b82caaff72d0b02a929b3c1a8c8",
      "tree": "9330a7a11e4298f23e96bc048521d39f1fedcfe5",
      "parents": [
        "ed08b870bf419ed5d82619e800f2645c00fc317e"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Tue May 21 23:01:51 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 21 11:01:51 2024 -0700"
      },
      "message": "Update github stale action (#1891)\n\n- Changed the first notice period to 60 days and\r\n  closing period to 14 days.\r\n- Changed label to \u0027Stale\u0027 from \u0027Abondoned\u0027"
    },
    {
      "commit": "ed08b870bf419ed5d82619e800f2645c00fc317e",
      "tree": "2658085e9da72f1d463f1851a72a0582746dbc08",
      "parents": [
        "1f55cfcfc1f09461eccc97508af6ea59ebda05ba"
      ],
      "author": {
        "name": "Rafsun Masud",
        "email": "rafsun82@gmail.com",
        "time": "Fri May 17 14:31:44 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 17 14:31:44 2024 -0700"
      },
      "message": "Make CALL YIELD grammar more precise (#1852)\n\nReplaces `CALL expr . expr` to `CALL expr_var . expr_func_norm`. There was\r\na if-block before that checked if the first `expr` is a ColumnRef and the\r\nsecond `expr` is a FuncCall node. That check is not need now since expr_var\r\nand expr_func_norm are reduced to ColumnRef and FuncCall node respectively.\r\n\r\nThis change also prevents shift\\reduce ambiguity with CALL subquery syntax."
    },
    {
      "commit": "1f55cfcfc1f09461eccc97508af6ea59ebda05ba",
      "tree": "d6cdc15004e4d6936f2cfa1d3e3fa9f896f91571",
      "parents": [
        "149123500d4d662dac2c6877d074d9bf861e02d7"
      ],
      "author": {
        "name": "John Gemignani",
        "email": "jrgemignani@gmail.com",
        "time": "Fri May 17 13:35:38 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 17 13:35:38 2024 -0700"
      },
      "message": "Fix issue 1878 - Regression test failure with delete global graphs (#1881)\n\nFixed issue 1878, an issue with delete_global_graphs during parallel\r\nregression tests.\r\n\r\nAdded locking and some more defensive copies.\r\n\r\nNo regression tests were impacted."
    },
    {
      "commit": "149123500d4d662dac2c6877d074d9bf861e02d7",
      "tree": "5bc97730bc3926aabea5742bcf5ec927b175137f",
      "parents": [
        "86fad09cf28ec812a1595972f66ebce7436b46e4"
      ],
      "author": {
        "name": "Adeel Ahmed",
        "email": "62285793+AdeelAhmedIqbal@users.noreply.github.com",
        "time": "Wed May 15 01:00:08 2024 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 14 15:00:08 2024 -0700"
      },
      "message": "Corrected typos and grammatical errors in apache-age-basic.ipynb (#879)\n\nCorrected typos and grammatical errors in apache-age-basic.ipynb"
    },
    {
      "commit": "86fad09cf28ec812a1595972f66ebce7436b46e4",
      "tree": "6af56cee386a57d7c3372288e7e0bf32fdc3c1af",
      "parents": [
        "ffc9869232a6c8d9a824277971bf4dcc4956bedf"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Sat May 11 04:35:04 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 10 16:35:04 2024 -0700"
      },
      "message": "Add workflow for stale issues and PRs (#1872)\n\n- This workflow will send the first notice to the\r\n  issue/PR author after 45 days of inactivity and\r\n  will close the issue/PR after 7 further days of\r\n  inactivity.\r\n- Only the issues/PRs after 1st Jan 2023 will be\r\n  affected by this workflow.\r\n- Maximum of 500 issues/PRs can be processed in\r\n  one run of this workflow.\r\n- This workflow will run after every 24 hours.\r\n- Issues/PRs with the label `override-stale`\r\n  will not be affected by this workflow.\r\n- \"Abondoned\" label will be added to the issues/PRs\r\n  which are closed by this workflow."
    },
    {
      "commit": "ffc9869232a6c8d9a824277971bf4dcc4956bedf",
      "tree": "92a3fe39cd64d2affbbd74127a3747fa8dd345c3",
      "parents": [
        "1e0200044ed47c4122bb5195331d1f228d0e0aa5"
      ],
      "author": {
        "name": "Dehowe Feng",
        "email": "8065116+dehowef@users.noreply.github.com",
        "time": "Sat May 11 01:35:54 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 10 10:35:54 2024 -0700"
      },
      "message": "Implement Returnless Unions in Subqueries (#1803)\n\nAdded logic to support returnless unions in subqueries.\r\n\r\nAdded regression tests to support this addition. Modified\r\nregression tests to capture more cases."
    },
    {
      "commit": "1e0200044ed47c4122bb5195331d1f228d0e0aa5",
      "tree": "566429d5cdf1bab1467095dcbba97e31b58b623b",
      "parents": [
        "62adf748cd3732c514f720f01cf881f9f50bc879"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Thu May 09 23:39:47 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 09 11:39:47 2024 -0700"
      },
      "message": "[CI] Update docker image tags (#1865)\n\n- Due to the recent changes in the docker image tags, the CI workflows\r\n  need to be updated to use the new tags."
    },
    {
      "commit": "62adf748cd3732c514f720f01cf881f9f50bc879",
      "tree": "4cfea3fa7ab00065297e6cbcdb9f4837e6fbbb5b",
      "parents": [
        "e08cb1b0f69331e4704c86a9edcf9c10decc89b0"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Thu May 09 21:12:05 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 09 09:12:05 2024 -0700"
      },
      "message": "Add branch protection rules in .asf.yaml (#1854)\n\n- All the PRs sent to master and PGXX branches will now require atleast\r\n  1  approving review."
    },
    {
      "commit": "e08cb1b0f69331e4704c86a9edcf9c10decc89b0",
      "tree": "6ff91dde12feff2af86806fbffec39d561b0199f",
      "parents": [
        "5e08a2f58693adca55085da8d56eb1831d963d20"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Wed May 08 23:05:13 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 08 11:05:13 2024 -0700"
      },
      "message": "[CI] Update labeler github action (#1851)\n\n- This action will now add \"override-stale\" label to the PRs\r\n  that are by apache/age committers, this will prevent stale\r\n  action from touching these PRs."
    },
    {
      "commit": "5e08a2f58693adca55085da8d56eb1831d963d20",
      "tree": "aa9b4d4cd295b0c75981d8cb257f10df231062bf",
      "parents": [
        "db0a4421b5c0abc30507793f0da89a2a86b9cf25"
      ],
      "author": {
        "name": "Muhammad Taha Naveed",
        "email": "mtaha@apache.org",
        "time": "Tue May 07 05:38:09 2024 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 06 17:38:09 2024 -0700"
      },
      "message": "Fix error using list comprehension with WITH * (#1838)\n\n- Added a check for the case where the list comprehension is used with\r\n  `WITH *`. Handled this case by adding entries in targetlist to the\r\n  group clause.\r\n\r\n- Added regression tests."
    }
  ],
  "next": "db0a4421b5c0abc30507793f0da89a2a86b9cf25"
}
