我在 PostgreSQL 中定义了一个新命令 my_command
。该命令采用ANALYZE
的路径,在analyze.c
内部,我有一个函数可以在其my_command
的情况下执行一些操作。该命令采用输入参数:表名、列名和输入字符串。
当我从命令行 psql
运行此命令时,它按预期工作。但是当我从 java 应用程序调用相同的命令时,存储输入参数的所有变量都是 NULL。
我在 gram.y 文件中打印了输入字符串的值,我在其中定义了 my_command
。
fprintf (stderr, "我在 gram.y %s\n 里面",n->inp_str);
并且输入的字符串被正确打印。
但是当我在 utility.c
的函数 standard_ProcessUtility()
中打印 stmt->inp_str
时,案例 T_VacuumStmt
,我得到的值为 NULL。这是我从 analyze.c
可以追溯到的。
我不确定从应用程序运行命令会产生什么影响。
gram.y 内容要点:
<小时/>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
添加到 parsenodes.h
中的 struct VacuumStmt
感谢任何帮助。谢谢!
最佳答案
我已将这个问题邮寄到 pgsql-hackers 邮件列表,我得到的回复是我必须添加代码以将 inp_str
复制到 _copyVacuumStmt()
。
完成此操作后,该命令也可以在 Java 应用程序中运行。我已经询问了为什么即使不添加上述代码它也可以从命令行工作的原因。一旦获得详细信息,我将更新详细信息。
关于从 Java 应用程序问题调用新的 PostgreSQL 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24552057/