Title: Build failure in DBMS_SCHEDULER due to incorrect placement of pg_noreturn

未關閉 適合新手
#2,342 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

@darshan-s-44 已經在處理了。

開始於 2026年10月11日。

  • #2356 來自 @darshan-s-44 —— 未關閉
  • #2881 來自 @JINITAIMEI121 —— 未關閉
  • #2902 來自 @yydawx —— 未關閉
  • #2920 來自 @zhang1939 —— 未關閉

評估

難度
1/5
預估耗時
1 小時以內
新手友好度
75/100
Issue 類型
缺陷
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
c, postgresql
領域
databases

研究方向

這三個宣告位於 src/builtin_packages/dbms_scheduler/dbms_scheduler.h 的第 153-155 行,失敗的翻譯單元是 contrib/ivorysql_ora/src/ivorysql_ora.c。先檢查 pg_noreturn 定義在哪裡,以及此屬性相對於 extern 和 PGDLLEXPORT 必須如何排序。使用 gcc 建置 contrib/ivorysql_ora 來重現問題。當這些宣告在受影響的設定下編譯時沒有任何警告或錯誤,即為完成。

由索引模型根據 Issue 內容生成。

描述

bug good first issue
What happened?

Building IvorySQL fails while compiling contrib/ivorysql_ora/src/ivorysql_ora.c. The compiler reports errors for three background worker entry point declarations in dbms_scheduler.h:

  • SchedulerLauncherMain
  • SchedulerDatabaseWorkerMain
  • SchedulerJobWorkerMain
In file included from src/ivorysql_ora.c:45:
src/builtin_packages/dbms_scheduler/dbms_scheduler.h:153:1: warning: ‘noreturn’ attribute ignored [-Wattributes]
  153 | extern PGDLLEXPORT pg_noreturn void SchedulerLauncherMain(Datum main_arg);
      | ^~~~~~
src/builtin_packages/dbms_scheduler/dbms_scheduler.h:153:32: error: expected identifier or ‘(’ before ‘void’
  153 | extern PGDLLEXPORT pg_noreturn void SchedulerLauncherMain(Datum main_arg);
      |                                ^~~~
src/builtin_packages/dbms_scheduler/dbms_scheduler.h:154:1: warning: ‘noreturn’ attribute ignored [-Wattributes]
  154 | extern PGDLLEXPORT pg_noreturn void SchedulerDatabaseWorkerMain(Datum main_arg);
      | ^~~~~~
src/builtin_packages/dbms_scheduler/dbms_scheduler.h:154:32: error: expected identifier or ‘(’ before ‘void’
  154 | extern PGDLLEXPORT pg_noreturn void SchedulerDatabaseWorkerMain(Datum main_arg);
      |                                ^~~~
src/builtin_packages/dbms_scheduler/dbms_scheduler.h:155:1: warning: ‘noreturn’ attribute ignored [-Wattributes]
  155 | extern PGDLLEXPORT pg_noreturn void SchedulerJobWorkerMain(Datum main_arg);
      | ^~~~~~
src/builtin_packages/dbms_scheduler/dbms_scheduler.h:155:32: error: expected identifier or ‘(’ before ‘void’
  155 | extern PGDLLEXPORT pg_noreturn void SchedulerJobWorkerMain(Datum main_arg);
      |                                ^~~~
make[1]: *** [<builtin>: src/ivorysql_ora.o] Error 1
make: *** [GNUmakefile:11: all-contrib/ivorysql_ora-recurse] Error 2
What did you expect to happen?

Compile successfully.

How can we reproduce it (as minimally and precisely as possible)?

Build IvorySQL with

IvorySQL version

master

Compatible mode

oracle

Server encoding

UTF8

Anything else we need to know?

Likely cause

The declarations place pg_noreturn after extern PGDLLEXPORT.

In configurations where pg_noreturn expands to the C23 attribute [[noreturn]], the attribute must appear at the beginning of the declaration. The current placement appears to cause the warnings and syntax errors above.

Proposed fix

Move pg_noreturn before extern and PGDLLEXPORT:

-extern PGDLLEXPORT pg_noreturn void SchedulerLauncherMain(Datum main_arg);
-extern PGDLLEXPORT pg_noreturn void SchedulerDatabaseWorkerMain(Datum main_arg);
-extern PGDLLEXPORT pg_noreturn void SchedulerJobWorkerMain(Datum main_arg);
+pg_noreturn extern PGDLLEXPORT void SchedulerLauncherMain(Datum main_arg);
+pg_noreturn extern PGDLLEXPORT void SchedulerDatabaseWorkerMain(Datum main_arg);
+pg_noreturn extern PGDLLEXPORT void SchedulerJobWorkerMain(Datum main_arg);
OS version
$ cat /etc/os-release

➜  ivorysql_ora git:(pr-1841) ✗ cat /etc/os-release
PRETTY_NAME="Ubuntu 26.04 LTS"
NAME="Ubuntu"
VERSION_ID="26.04"
VERSION="26.04 LTS (Resolute Raccoon)"
VERSION_CODENAME=resolute
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=resolute
LOGO=ubuntu-logo

$ uname -a

Linux e15 7.0.0-34-generic #34-Ubuntu SMP PREEMPT_DYNAMIC Wed Sep  2 14:29:37 UTC 2026 x86_64 GNU/Linux

cc --version
make --version
gcc (Ubuntu 15.2.0-16ubuntu1) 15.2.0
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

cc (Ubuntu 15.2.0-16ubuntu1) 15.2.0
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

GNU Make 4.4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later https://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Before submitting
  • I confirmed the problem still happens on current master
  • I searched existing issues and found no duplicate
主要語言
C
星號
1.1k
分支
232
平均合併
2 天 3 小時
30 天內合併 PR
8

環境準備

這個專案沒有提供開發容器、Dockerfile 或貢獻指南,環境需要你自己搭建:先看它的 README,通用步驟見我們的新手貢獻指南。

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

IvorySQL/IvorySQL 的其他 Issue

查看 IvorySQL/IvorySQL 的全部 Issue

相似的 Issue

更多 C Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。