如何為PostgreSQL創建自定義內建函數


  1. 函數 version(),沒有參數,作為例子簡潔明了。如果需要參數,可以查閱 adt 下其他函數定義,也是非常簡單的事情,這就是開源給我們帶來的知識寶庫;

      1.  
        postgres= # select version();
      2.  
                                                             version                                                     
      3.  
        -----------------------------------------------------------------------------------------------------------------
      4.  
         PostgreSQL  9.5devel on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6), 64-bit
      5.  
        (1 row)
      6.  
         
      7.  
        postgres=#
    1. 定義在 src/backend/utils/adt/version.c 里邊:

        1.  
          Datum
        2.  
          pgsql_version(PG_FUNCTION_ARGS)
        3.  
          {
        4.  
          PG_RETURN_TEXT_P(cstring_to_text(PG_VERSION_STR));
        5.  
          }
    2. 其他文件內的定義,/src/include/utils/builtins:

        1.  
          /* version.c */
        2.  
          extern Datum pgsql_version(PG_FUNCTION_ARGS);
    3. 最關鍵的定義,讓用戶可以看到,/src/include/catalog/proc.h,這個文件編譯前會被腳本處理生成 BKI(自行查閱文檔)腳本,初始化數據庫時在 pg_proc 里邊定義函數,類型為internal,這個類型是有別於其他類型的(比如C,定義在外部庫中),關於這些定義的含義,篇幅有限請自行學習吧:

      1. DATA(insert OID =  89 (  version    PGNSP PGUID 12 0 f f f f t f s 25 "" _null_ _null_ _null_ _null_ pgsql_version _null_ _null_ _null_ ));
  2. 定義我們自己的函數:

      1.  
        Datum
      2.  
        quanzl_version(PG_FUNCTION_ARGS)
      3.  
        {
      4.  
        PG_RETURN_TEXT_P(cstring_to_text(“Quan's Database”));
      5.  
        }
    1. builtins.h 在 pgsql_version下添加定義:

      1. extern Datum quanzl_version(PG_FUNCTION_ARGS);
    2. proc.h:

      1. DATA(insert OID =  90 (  quan_version    PGNSP PGUID 12 0 f f f f t f s 25 "" _null_ _null_ _null_ _null_ quanzl_version _null_ _null_ _null_ ));
      2. 這里的 OID = 90 至關重要,並不是隨意選取,必須是未使用的,怎么找呢,PG為我們提供了腳本,在 src/include/catalog/下的 unused_oids,輕松知道哪個可用。(還有一個duplicate_oids用於排錯)

  3. 編譯、運行,就這么簡單

  4. 時間關系,上述過程未經驗證,可能有錯誤,但大致步驟如此。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM