我在PostgreSQL中定义了一个新命令my_command
。此命令采用ANALYZE
和analyze.c
内部的路径,如果my_command
,我有一个函数可以执行一些操作。此命令采用输入参数:表名,列名和输入字符串。
当我从命令行psql
运行此命令时,它按预期工作。但是当我从java应用程序调用相同的命令时,存储输入参数的所有变量都是NULL。
我在gram.y文件中打印了输入字符串的值,我在其中定义了my_command
fprintf (stderr, "I am inside gram.y %s\n",n->inp_str);
并正确打印输入字符串。
但是当我在案例stmt->inp_str
的{{1}}函数standard_ProcessUtility()
中打印utility.c
时,我得到的值为NULL。这是我可以从T_VacuumStmt
追溯到的。
我不确定如何从应用程序运行命令可以起作用。
gram.y内容要点:
analyze.c
MyStmt:
my_keyword qualified_name name_list my_inp_str
{
VacuumStmt *n = makeNode(VacuumStmt);
n->options = VACOPT_ANALYZE;
n->freeze_min_age = -1;
n->freeze_table_age = -1;
n->relation = $2;
n->va_cols = $3;
n->inp_str = $4;
fprintf (stderr, "I am inside gram.y %s\n",n->inp_str);
$$ = (Node *)n;
}
;
已添加到char *inp_str
struct VacuumStmt
感谢任何帮助。谢谢!
答案 0 :(得分:0)
我已将此问题邮寄到pgsql-hackers邮件列表,我得到了一个回复,我必须添加代码才能将inp_str
复制到_copyVacuumStmt()
。
完成此操作后,该命令也可以从Java应用程序中运行。即使没有添加上面的代码,我已经从命令行询问了它的工作原因。我会在收到详细信息后更新详细信息。