Skip to content

Master: clean some build warnings and CI not ignore warning, with make CFLAGS#999

Merged
gaoxueyu merged 6 commits intoIvorySQL:masterfrom
OreoYang:CI_warning
Dec 9, 2025
Merged

Master: clean some build warnings and CI not ignore warning, with make CFLAGS#999
gaoxueyu merged 6 commits intoIvorySQL:masterfrom
OreoYang:CI_warning

Conversation

@OreoYang
Copy link
Copy Markdown
Collaborator

@OreoYang OreoYang commented Dec 3, 2025

uuid-ossp.c:569:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
ivy-exec.c:3017:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
string_utils.c:110:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]

We resolved some warning logs triggered by -Wdeclaration-after-statement but not included -Werror=declaration-after-statement in file .github/workflows/build.yml because we considered that the code imported from Ryu is exempt from the declaration-after-statement rule, in order to keep it more closely aligned with its upstream. The following segment would cause errors:

# The code imported from Ryu gets a pass on declaration-after-statement,
# in order to keep it more closely aligned with its upstream.
RYU_FILES = d2s.o f2s.o
RYU_OBJS = $(RYU_FILES) $(RYU_FILES:%.o=%_shlib.o) $(RYU_FILES:%.o=%_srv.o)

Summary by CodeRabbit

  • Refactor

    • Tightened symbol visibility and scope for many internal variables to improve encapsulation.
    • Localized variable declarations and reduced global state where possible.
    • Improved initialization practices to avoid uninitialized variables.
  • Chores / Build

    • Updated build to use newer GCC and added stricter warning/error flags to catch issues earlier.
  • Behavior

    • Minor control-flow cleanups with no user-facing functional changes.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Dec 3, 2025

Walkthrough

Tightened CI build flags and warnings; converted many previously exported globals to file-local static, added one extern in a public header, exposed two parser externs, and made several small local-initialization and minor control-flow edits across backend, contrib, and frontend code.

Changes

Cohort / File(s) Summary
Build configuration
\.github/workflows/build.yml
Install gcc-14/g++-14 and set alternatives; compile step appends -Wshadow=compatible-local and multiple -Werror flags to CFLAGS.
Contrib — GB18030 hooks
contrib/gb18030_2022/utf8_and_gb18030_2022.c
pre_gb18030_2022_to_utf8_hook, pre_utf8_to_gb18030_2022_hook made static (file-local).
Contrib — IvorySQL ORA datetime arrays
contrib/ivorysql_ora/src/builtin_functions/datetime_datatype_functions.c
ora_days, date_fmt, date_timezone made static (file-local).
Backend — symbol visibility & small inits
src/backend/access/transam/xlog.c, src/backend/commands/sequence.c, src/backend/oracle_parser/liboracle_parser.c, src/backend/parser/parse_param.c, src/backend/utils/misc/ivy_guc.c
Removed extern int bootstrap_database_mode from xlog.c; made session_id, scale_value, prev_quote_identifier, TopOraParamNode, CurrentOraParamNode, nls_territory, nls_currency, nls_iso_currency static. Initialized attnum to InvalidAttrNumber in process_owned_by.
CLI / tests — symbol visibility
src/bin/psql/psqlplusscan.l, src/oracle_test/isolation/isolation_main.c
NumKeywords, saved_argv0, isolation_exec, looked_up_isolation_exec made static.
Parser / grammar
src/oracle_test/isolation/specparse.y, src/pl/plisql/src/pl_gram.y
Added extern int spec_yychar; and extern int spec_yynerrs; to specparse.y. In pl_gram.y removed assignment capturing plisql_build_exception() return value — now call without storing result.
Public header
src/include/utils/ora_compatible.h
Added extern int bootstrap_database_mode; declaration.
Misc — local init, scoping, and small control tweaks
src/backend/commands/tablecmds.c, src/backend/executor/execExpr.c, src/bin/pg_dump/pg_dump.c, src/bin/psql/startup.c, src/pl/plisql/src/pl_package.c, contrib/uuid-ossp/uuid-ossp.c, src/backend/utils/adt/ruleutils.c, src/bin/psql/common.c, src/interfaces/libpq/ivy-exec.c, src/pl/plisql/src/pl_scanner.c, src/pl/plisql/src/pl_subproc_function.c, src/bin/pg_dump/pg_dump.c
Initialized several locals to safe defaults (dependentFuncPkgOids = NULL, func_tuple = NULL, scan_state = NULL, cond_stack = NULL, pre_len = ...), localized variables into narrower scopes, switched some loops to pointer or inline-index styles, and adjusted dumpSequence to remove a DB_PG-specific branch (now falls through to the generic unrecognized-type path).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Areas needing extra attention:
    • Cross-translation-unit impacts from making previously-external globals static (possible linker errors or missing symbols).
    • The new extern int bootstrap_database_mode; in src/include/utils/ora_compatible.h — verify there's exactly one definition and consistent use.
    • CI build flag changes (-Werror set for many warnings) — ensure all toolchains used by CI compile cleanly.
    • pl_gram.y change discarding plisql_build_exception() return — confirm no call-sites relied on the captured value.
    • pg_dump dumpSequence branch removal — validate behavior for non-standard sequence types.

Possibly related PRs

Suggested reviewers

  • NotHimmel
  • yuanyl630

Poem

🐰 I nibbled at headers, hid a name or two,

Tidied the loops and sharpened the view.
Warnings stand guard while symbols stay small,
Quiet burrows keep surprises from all.
Hop—compile clean, and celebrate the haul.

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main objective of the PR: addressing build warnings and updating CI to enforce stricter compilation flags (adding -Werror flags and installing gcc-14/g++-14).
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9e8a306 and 30ce895.

📒 Files selected for processing (6)
  • contrib/uuid-ossp/uuid-ossp.c (1 hunks)
  • src/backend/utils/adt/ruleutils.c (1 hunks)
  • src/bin/psql/common.c (3 hunks)
  • src/interfaces/libpq/ivy-exec.c (9 hunks)
  • src/pl/plisql/src/pl_scanner.c (0 hunks)
  • src/pl/plisql/src/pl_subproc_function.c (0 hunks)
💤 Files with no reviewable changes (2)
  • src/pl/plisql/src/pl_scanner.c
  • src/pl/plisql/src/pl_subproc_function.c
🧰 Additional context used
🧬 Code graph analysis (2)
src/backend/utils/adt/ruleutils.c (1)
src/backend/utils/cache/lsyscache.c (2)
  • get_attnum (955-972)
  • get_atttypetypmodcoll (1040-1059)
src/bin/psql/common.c (1)
src/bin/psql/variables.c (1)
  • BindVariableExist (1080-1108)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: meson_build (ubuntu-latest)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: oracle_regression (ubuntu-latest)
  • GitHub Check: oracle_pg_regression (ubuntu-latest)
  • GitHub Check: pg_regression (ubuntu-latest)
  • GitHub Check: contrib_regression
🔇 Additional comments (6)
contrib/uuid-ossp/uuid-ossp.c (1)

564-595: Rescoping backend-specific locals fixes C90 warnings without changing behavior

Hoisting uuid_t uu, int i, and unsigned char byte_array[SYS_GUID_LENGTH] into their respective #ifdef branches at the top of ora_sys_guid cleanly addresses the -Wdeclaration-after-statement/C90 constraint. Each variable is fully initialized before use in its branch (E2FS via uuid_generate_random(uu), BSD via the for loop) and the 16-byte memcpy into VARDATA(result) remains correct for all backends. I don't see any functional or ABI changes here; this looks good.

src/backend/utils/adt/ruleutils.c (1)

14449-14555: Unifying on relid here is correct and keeps semantics unchanged

Reusing the existing relid for both RangeVarGetRelid and the subsequent get_attnum / get_atttypetypmodcoll calls is safe: this branch is mutually exclusive with the earlier row_type path, relid is initialized once at function entry, and it is always assigned before use in this path. This also removes the need for an extra local and fits better with strict C90 declaration rules.

src/interfaces/libpq/ivy-exec.c (2)

3789-3812: Fix one-byte buffer overflow in newsql allocation

In the quote-escaping loop, newsql is allocated with stmtHandle->query_len * 2 bytes. However, when the input consists entirely of single quotes, the loop doubles each one (writing 2 bytes per input byte), producing exactly 2 * len characters. The subsequent *ptr = '\0'; write then places the terminator one byte past the allocated buffer.

Allocate one additional byte to accommodate the NUL terminator:

-        newsql = malloc(stmtHandle->query_len * 2); /* enough */
+        newsql = malloc(stmtHandle->query_len * 2 + 1); /* enough for doubled quotes + terminator */

Also applies to: 4076-4100


3969-3988: Use C90-compatible loop variable declarations to avoid -Wdeclaration-after-statement warnings

The for (int i = ...) loops use C99 variable declarations in loop initializers, which violate C90 compatibility and trigger -Wdeclaration-after-statement errors in strict builds. Declare i at block scope with other locals and reuse it across loops, e.g.:

+        int     i;
-        for (int i = 1; i < n_tuples; i++)
+        for (i = 1; i < n_tuples; i++)

Apply similarly at lines 4038-4046, 4239-4257, and 4312-4321.

src/bin/psql/common.c (2)

3817-3824: Reverse scan over host variables remains correct

The new loop

for (int i = hv->length; i > 0; i--)
{
	p = hv->hostvars[i - 1].name;
	p++;	/* skip colon */
	bindvar[i - 1] = BindVariableExist(pset.vars, p);

	if (bindvar[i - 1] == NULL)
	{
		missing = true;
		break;
	}
}

preserves the intended semantics:

  • Still scans from the end (hv->length - 1) toward the front, matching the comment about Oracle error ordering.
  • Indexing via i - 1 is safe for hv->length >= 1 and the loop properly skips execution when hv->length == 0.

No functional issues from this refactor.


4005-4009: Scoped cleanup loop for pset.ctv_args is OK

The new loop

for (int i = 0; i < lengthof(pset.ctv_args); i++)
{
	pg_free(pset.ctv_args[i]);
	pset.ctv_args[i] = NULL;
}

is functionally identical to the previous pattern and matches the cleanup done in SendQuery(). No leaks or double‑frees are introduced; limiting i’s scope here is fine.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@OreoYang OreoYang closed this Dec 3, 2025
@OreoYang OreoYang reopened this Dec 3, 2025
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/include/utils/ora_compatible.h (1)

61-61: Consider tightening the type or documenting bootstrap_database_mode

Declaring this here is fine for sharing the symbol, but since you already have a DBMode enum, it may be clearer to either:

  • declare it as extern DBMode bootstrap_database_mode;, or
  • add a brief comment indicating the expected value range and lifecycle.

Not required for correctness, but would improve readability and reduce misuse.

.github/workflows/build.yml (1)

21-25: Stricter GCC toolchain and CFLAGS are consistent with “no warnings” CI goal

Installing gcc-14/g++-14 and adding -Wshadow=compatible-local plus several -Werror=* flags is a direct way to enforce the new warning policy in CI; the YAML wiring looks correct. One thing to be aware of is that make CFLAGS="$CFLAGS ..." causes the environment’s CFLAGS to override configure’s computed flags, so any per-platform tuning in the Makefiles will be superseded here; that seems intentional but is worth keeping in mind if you later need platform-specific CFLAGS.

Also applies to: 40-41

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7261f1c and d1ba8a2.

📒 Files selected for processing (13)
  • .github/workflows/build.yml (2 hunks)
  • contrib/gb18030_2022/utf8_and_gb18030_2022.c (1 hunks)
  • contrib/ivorysql_ora/src/builtin_functions/datetime_datatype_functions.c (3 hunks)
  • src/backend/access/transam/xlog.c (1 hunks)
  • src/backend/commands/sequence.c (1 hunks)
  • src/backend/oracle_parser/liboracle_parser.c (1 hunks)
  • src/backend/parser/parse_param.c (1 hunks)
  • src/backend/utils/misc/ivy_guc.c (1 hunks)
  • src/bin/psql/psqlplusscan.l (1 hunks)
  • src/include/utils/ora_compatible.h (1 hunks)
  • src/oracle_test/isolation/isolation_main.c (1 hunks)
  • src/oracle_test/isolation/specparse.y (1 hunks)
  • src/pl/plisql/src/pl_gram.y (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-24T08:19:29.453Z
Learnt from: OreoYang
Repo: IvorySQL/IvorySQL PR: 931
File: src/backend/oracle_parser/ora_gram.y:0-0
Timestamp: 2025-10-24T08:19:29.453Z
Learning: In IvorySQL’s parser (src/backend/oracle_parser/ora_gram.y and related headers), downcase_identifier has the 4-argument signature:
extern char *downcase_identifier(const char *ident, int len, bool warn, bool truncate);

Applied to files:

  • src/backend/oracle_parser/liboracle_parser.c
  • src/backend/utils/misc/ivy_guc.c
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: meson_build (ubuntu-latest)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: pg_regression (ubuntu-latest)
  • GitHub Check: oracle_regression (ubuntu-latest)
  • GitHub Check: oracle_pg_regression (ubuntu-latest)
  • GitHub Check: contrib_regression
🔇 Additional comments (11)
src/backend/commands/sequence.c (1)

99-100: Restricting session_id and scale_value to file scope looks correct

Both variables are only used within this module, so making them static is a good encapsulation step and should resolve any external linkage or duplicate-declaration warnings without changing behavior.

src/backend/access/transam/xlog.c (1)

111-113: Removal of local extern in favor of header declaration looks good

Relying on utils/ora_compatible.h for the bootstrap_database_mode declaration instead of a file‑local extern keeps the interface centralized and avoids redundant or drifting declarations. No functional or behavioral changes introduced here.

src/backend/oracle_parser/liboracle_parser.c (1)

48-53: Make prev_quote_identifier file‑local like the other saved hooks

Changing prev_quote_identifier to static aligns it with the other saved hook variables and avoids exporting an unnecessary global, with no behavioral change since it’s only used in this file.

src/pl/plisql/src/pl_gram.y (1)

822-828: Drop unused local from K_EXCEPTION decl arm

Removing the dead PLiSQL_exception_var *exc assignment and just calling plisql_build_exception keeps the behavior but fixes an unused‑but‑set variable under the stricter warning flags.

src/backend/parser/parse_param.c (1)

74-76: Restrict OraParam stack globals to this file

Making TopOraParamNode and CurrentOraParamNode static is appropriate since they’re only used inside parse_param.c and avoids exporting extra globals, which helps with the new -Werror=missing-variable-declarations policy. Just double‑check there are no remaining extern declarations for these names in other files.

src/oracle_test/isolation/isolation_main.c (1)

21-23: Make isolation launcher globals internal

Marking saved_argv0, isolation_exec, and looked_up_isolation_exec as static is correct: they’re only used in this file, and this change just reduces symbol visibility without altering test behavior.

src/bin/psql/psqlplusscan.l (1)

34-51: Limit NumKeywords to this scanner file

Changing NumKeywords to static const int is appropriate: it’s only used inside psqlplusscan.l, and this avoids exporting a superfluous global while satisfying -Werror=missing-variable-declarations.

src/backend/utils/misc/ivy_guc.c (1)

37-39: Make NLS backing variables file‑local behind GUC

Marking nls_territory, nls_currency, and nls_iso_currency as static is consistent with how they’re used: they’re only wired into the GUC tables in this compilation unit, and callers should go through the GUC APIs rather than referencing these globals directly. Just ensure there are no remaining extern declarations or direct uses of these symbols elsewhere, since those will now fail to link.

src/oracle_test/isolation/specparse.y (1)

18-20: Add forward decls for bison parser globals to satisfy new warning flags

Declaring extern int spec_yychar; and extern int spec_yynerrs; in the grammar prologue addresses -Werror=missing-variable-declarations by providing prior declarations for bison's generated globals. With %name-prefix="spec_yy" and a non-pure parser configuration, bison generates these as global (non-static) variables. Verify that your grammar uses a non-pure parser (no %pure-parser or %define api.pure) and confirm the bison version in your CI environment emits these symbols as documented.

contrib/ivorysql_ora/src/builtin_functions/datetime_datatype_functions.c (1)

156-157: Manual verification required: External references to static const arrays cannot be checked.

The review approves making ora_days, date_fmt, and date_timezone static const for proper encapsulation and to reduce global symbol pollution. However, the requested verification script could not be executed due to sandbox limitations preventing repository access.

To complete this review, manually verify:

  • No external references to these three arrays exist outside datetime_datatype_functions.c
  • Run: rg -n --type=c --type=h '\b(ora_days|date_fmt|date_timezone)\b' to search the entire codebase
  • Confirm all three arrays are indeed declared as static const at lines 156-157, 172-184, and 198-204
contrib/gb18030_2022/utf8_and_gb18030_2022.c (1)

25-26: LGTM: Appropriate use of static linkage for file-local hooks.

These hook pointers are only used within _PG_init() and _PG_fini() to save and restore previous hook handlers. Making them static correctly restricts their visibility to this translation unit and reduces global namespace pollution.

Copy link
Copy Markdown
Contributor

@c2main c2main left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't test, just a code review with few comments.

there are also bki generation which lead to some errors but are not caught by those changes:

./../src/include/catalog/pg_subscription.h ../../../src/include/catalog/pg_subscription_rel.h ../../../src/include/catalog/pg_package.h ../../../src/include/catalog/pg_package_body.h ../../../src/include/catalog/pg_force_view.h
invalid zero OID reference in pg_type.dat field typinput line 706
invalid zero OID reference in pg_type.dat field typoutput line 706
invalid zero OID reference in pg_type.dat field typinput line 712
invalid zero OID reference in pg_type.dat field typoutput line 712
invalid zero OID reference in pg_type.dat field typinput line 720
invalid zero OID reference in pg_type.dat field typoutput line 720
invalid zero OID reference in pg_type.dat field typinput line 727
invalid zero OID reference in pg_type.dat field typoutput line 727
invalid zero OID reference in pg_type.dat field typinput line 734
invalid zero OID reference in pg_type.dat field typoutput line 734
invalid zero OID reference in pg_type.dat field typinput line 740
invalid zero OID reference in pg_type.dat field typoutput line 740
invalid zero OID reference in pg_type.dat field typinput line 747
invalid zero OID reference in pg_type.dat field typoutput line 747
invalid zero OID reference in pg_type.dat field typinput line 754
invalid zero OID reference in pg_type.dat field typoutput line 754
invalid zero OID reference in pg_type.dat field typinput line 762
invalid zero OID reference in pg_type.dat field typoutput line 762
invalid zero OID reference in pg_type.dat field typinput line 769
invalid zero OID reference in pg_type.dat field typoutput line 769
invalid zero OID reference in pg_type.dat field typinput line 777
invalid zero OID reference in pg_type.dat field typoutput line 777
invalid zero OID reference in pg_type.dat field typinput line 782
invalid zero OID reference in pg_type.dat field typoutput line 782
invalid zero OID reference in pg_type.dat field typinput line 788
invalid zero OID reference in pg_type.dat field typoutput line 788
touch bki-stamp
``

/* PLiSQL_exception_var *exc;

exc = plisql_build_exception($1.name, $1.lineno, true);
exc = */
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it looks like strange wrapping with comment here...

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it looks like strange wrapping with comment here...

What i want to fix is
pl_gram.y:824:71: warning: variable ‘exc’ set but not used [-Wunused-but-set-variable]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe it deserves a comment or just remove the code, it'll be easier to read...

@OreoYang
Copy link
Copy Markdown
Collaborator Author

OreoYang commented Dec 4, 2025

I didn't test, just a code review with few comments.

there are also bki generation which lead to some errors but are not caught by those changes:

./../src/include/catalog/pg_subscription.h ../../../src/include/catalog/pg_subscription_rel.h ../../../src/include/catalog/pg_package.h ../../../src/include/catalog/pg_package_body.h ../../../src/include/catalog/pg_force_view.h
invalid zero OID reference in pg_type.dat field typinput line 706
``

Yes, that's true. But, this part was addressed in another PR #993, and we forgot to mention it.

@bigplaice
Copy link
Copy Markdown
Collaborator

I didn't test, just a code review with few comments.
there are also bki generation which lead to some errors but are not caught by those changes:

./../src/include/catalog/pg_subscription.h ../../../src/include/catalog/pg_subscription_rel.h ../../../src/include/catalog/pg_package.h ../../../src/include/catalog/pg_package_body.h ../../../src/include/catalog/pg_force_view.h
invalid zero OID reference in pg_type.dat field typinput line 706
``

Yes, that's true. But, this part was addressed in another PR #993, and we forgot to mention it.

BTW, these warnings are generated by Perl code.

@OreoYang OreoYang changed the title CI not ignore warning, with make CFLAGS Master: clean some build warnings and CI not ignore warning, with make CFLAGS Dec 8, 2025
@c2main
Copy link
Copy Markdown
Contributor

c2main commented Dec 8, 2025

I didn't test, just a code review with few comments.
there are also bki generation which lead to some errors but are not caught by those changes:

./../src/include/catalog/pg_subscription.h ../../../src/include/catalog/pg_subscription_rel.h ../../../src/include/catalog/pg_package.h ../../../src/include/catalog/pg_package_body.h ../../../src/include/catalog/pg_force_view.h
invalid zero OID reference in pg_type.dat field typinput line 706
``

Yes, that's true. But, this part was addressed in another PR #993, and we forgot to mention it.

BTW, these warnings are generated by Perl code.

yes, that's a fragile part, and surely not on the shoulders of ivorysql, maybe an improvement for upstream...

Copy link
Copy Markdown
Contributor

@c2main c2main left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, minor point on the comment, up to you, and thank you for having moving so quickly on this item!

@gaoxueyu gaoxueyu merged commit 3dfb676 into IvorySQL:master Dec 9, 2025
6 checks passed
@OreoYang OreoYang deleted the CI_warning branch December 10, 2025 02:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants