在greenplum中将日志中的password密文显示

明文转密文的逻辑比较容易,这里主要描述新字符串内存如何分配及在哪里分配。

第一步:

exec_simple_querypg_parse_query 之后立刻将 query_string 替换为密文,如果要新分配内存,可用 palloc 直接分配(因为此时的 context 就是 query string 产生的 MessageContext,这个string 是在 PostgreMain 的 ReadCommand(&input_message) 中读到input_message上的)
在greenplum中将日志中的password密文显示在greenplum中将日志中的password密文显示
这里 parse 后的 query 可以先做个判断,因为有些语句在后面还会用到(比如创建表,当然创建表语句中也没有 password)。
还有一点,这里有一个全局变量 debug_query_string,它和这个 query string 指向同一内存,如果之前用 palloc 分配了新字符串内存,那么 debug_query_string 也要指向这个内存。

第二步

第一步只拦截下了正常的打日志用的 string,但如果 parse 过程中如果出现语法问题会直接报错和写日志,不能被拦截,因此还要在 scan.l 的 scanner_yyerror 函数中拦截错误的发生:
如果要分配新字符串,依然可以直接分配,因为此时 context 还在 MessageContext 中,但此时要多做两件事:

  1. yyextra->scanbuf 调用 pfree 并赋密文后的值:可用 pstrdup 复制一份密文字符串到 yyextra->scanbuf,它是在 raw_parser->scanner_init 中初始化的( 用gdb 可跳转看到),内存与 debug_query_string 不是同一块内存
    在greenplum中将日志中的password密文显示
    在greenplum中将日志中的password密文显示
  2. 重新更新 loc = yyextra->scanbuf + *yylloc:loc 用来指出出错位置,后面会根据这个位置来打印密文字符,如下图中星号的位置。
    在greenplum中将日志中的password密文显示
    日志中表现为
    在greenplum中将日志中的password密文显示

参考

日志打印是在 logger 进程中做的,可参考
https://blog.****.net/qq_37517281/article/details/106884945
MemoryContext,参考:
https://blog.****.net/qq_37517281/article/details/106889643