我正在try 用PostgreSQL编写一个支持函数来设置 Select 性.

我有一个功能

PG_FUNCTION_INFO_V1(pgq3c_sindist_5);
Datum pgq3c_sindist_5(PG_FUNCTION_ARGS)

我希望有一个辅助功能来设定 Select 性. 函数pgq3c_sindist_5返回布尔值,我有一个 支持功能

PG_FUNCTION_INFO_V1(pgq3c_join_selectivity);
Datum pgq3c_join_selectivity(PG_FUNCTION_ARGS)
{
  Node    *rawreq = (Node *) PG_GETARG_POINTER(0);
  Node    *unknown = (Node *) PG_GETARG_POINTER(1);
  Node    *ret = NULL;
  Datum radDatum;
  double rad;
 if (IsA(rawreq, SupportRequestSelectivity))
    {
      SupportRequestSelectivity *req = (SupportRequestSelectivity *) rawreq;

      radDatum = llast_node(Datum,req->args);
      rad = DatumGetFloat8(radDatum);


      elog(WARNING,"rad = %lf",rad);

      /* I would like to make the selectivity a function of rad */
      req->selectivity = 0.05;
      ret = (Node *) req;
    }

我的非支持函数有五个参数.我希望我的支持功能 在我的支持中使用第五个参数pgq3c_sindist_5 功能.我的代码不转储代码,但我的rad总是以0.0结尾, 当我百分之百确定我没有将零作为我的任何参数传递时 我的主要职能.

如果我对源代码的理解是正确的,那么SupportRequestSelectivity具有 的

/* Input fields: */
struct PlannerInfo *root;   /* Planner's infrastructure */
Oid         funcid;         /* function we are inquiring about */
List       *args;           /* pre-simplified arguments to function */
Oid         inputcollid;    /* function's input collation */
bool        is_join;        /* is this a join or restriction case? */
int         varRelid;       /* if restriction, RTI of target relation */
JoinType    jointype;       /* if join, outer join type */
struct SpecialJoinInfo *sjinfo; /* if outer join, info about join */

由此,我认为List*args应该是我的main函数的参数, 我应该能够解析这个.

我完全找错人了吗?

我想要在我的Support函数中找到Main函数的参数的值.

编辑:我的新代码看起来像

PG_FUNCTION_INFO_V1(pgq3c_join_selectivity);
Datum pgq3c_join_selectivity(PG_FUNCTION_ARGS)
{
  Node    *rawreq = (Node *) PG_GETARG_POINTER(0);
  Node    *ret = NULL;
  Datum radDatum;
  double rad;
  double ratio;
  Node *dummy = NULL;
  
  if (IsA(rawreq, SupportRequestSelectivity))
    {
      SupportRequestSelectivity *req = (SupportRequestSelectivity *) rawreq;
      Selectivity s1;
      
      dummy = (Node *) lfirst(list_nth_cell(req->args, 4));

      if (IsA(dummy,Const))
    {
      Const *con = (Const *) dummy;
      radDatum = PointerGetDatum(con->constvalue);
      rad = DatumGetFloat8(radDatum);     
      ratio = 3.14 * rad * rad / 41252.;  /* pi*r^2/whole_sky_area */
      /* clamp at 0, 1*/
      CLAMP_PROBABILITY(ratio);
      //elog(WARNING, "HERE0.... %e", ratio);
      req->selectivity = ratio;
      ret = (Node *) req;
    }
    }
  if (IsA(rawreq, SupportRequestSimplify))
    {
      SupportRequestSimplify *req = (SupportRequestSimplify *) rawreq;      
      PG_RETURN_POINTER((Node *)0);
    }
  if (IsA(rawreq, SupportRequestCost))
    {
      elog(WARNING,"found SupportRequestCost");
      /* Provide some generic estimate */
      SupportRequestCost *req = (SupportRequestCost *) rawreq;

      /* not yet implemented */
      
      ret = (Node *) req;
    }
  PG_RETURN_POINTER(ret);
}

推荐答案

Support函数只有一个参数,因此您应该删除调用PG_GETARG_POINTER(1)的行.

要获取req->args中的第五个元素,请使用

lfirst(list_nth_cell(req->args, 4))

请注意,结果不会是Datum,而是Node *.毕竟,它不一定是Const *,但它也可以是Var *或其他一些表达式.

C++相关问答推荐

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

将整数的.csv文件解析为C语言中的二维数组

ESP32在vTaskDelay上崩溃

如何跨平台处理UTF-16字符串?

如何知道我是否从非阻塞套接字读取所有内容

Ruby C Api处理异常

在C++中通过空指针隐式访问常量变量的值

每个 struct 变量在C中都有自己的命名空间吗?

为什么memcpy进入缓冲区和指向缓冲区的指针工作相同?

Wcstok导致分段故障

有没有一种方法可以用C创建保留限定符的函数?

如何在C宏定义中包含双引号?

GETS()在C++中重复它前面的行

有没有办法减少C语言中线程的堆大小?

如何在C中定义指向函数的指针并将该指针赋给函数?

强制GCC始终加载常量(即只读),即使启用了优化

将size_t分配给off_t会产生符号转换错误

gdb - 你能找到持有内部 glibc 锁的线程吗?

在 C 中传递参数时出现整数溢出

c 函数指针,另一种语法