diff --git a/content/zh/post/naihuangbao/.keep b/content/zh/post/naihuangbao/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/content/zh/post/naihuangbao/OpenGauss\345\234\250OpenEuler\344\270\213\347\232\204\345\256\211\350\243\205.md" "b/content/zh/post/naihuangbao/OpenGauss\345\234\250OpenEuler\344\270\213\347\232\204\345\256\211\350\243\205.md" new file mode 100644 index 0000000000000000000000000000000000000000..2eeb9134d21d8925d39734fb810805183db6f1c2 --- /dev/null +++ "b/content/zh/post/naihuangbao/OpenGauss\345\234\250OpenEuler\344\270\213\347\232\204\345\256\211\350\243\205.md" @@ -0,0 +1,385 @@ ++++ +title = "OpenGauss在OpenEuler下的安装" +date = "2022/1/25" +tags = ["OpenGauss安装"] +archives = "2022-01" +author = "naihuangbao" +summary = "OpenGauss安装在OpenEuler下的安装" +times = "03:30" ++++ +1. 安装环境 + + 物理机操作系统为Windows 10。虚拟机平台VMware Workstation 15 pro。 + + 使用openEuler20.03操作系统。CPU为4核X86。 + +2. openEuler操作系统安装 + +3. 安装openGauss需要的软硬件要求 + + 软件要求:X86-openEuler 20.3LTS、bzip2、Python 3.7.X + + 硬件要求:内存32GB、CPU 8核 2.0GHZ、硬盘40GB、网络300兆以上以太网 + +4. 安装虚拟机 + + 进入官网下载VirtualBox虚拟机安装包。 + + ![](media/99e66a0ebb2e68602ce681e2f46a04a8.png) + + 下载完成后只需要一直下一步就可以完成VirtualBox安装,不再赘述。 + +5. 安装OpenEuler操作系统 + + 打开VirtualBox软件。在VirtualBox的管理器上点击”新建”,具体如下。 + + ![](media/4ff4f8dae785d6d99b74fc24a6e84dde.png) + + 在此页面,填好相应的名称(如:openEuler)、文件存放地址(如:d:\\vmwork)、操作系统类型(如:Linux))、版本(如:Other + Linux),然后点击”下一步”。 + + ![](media/0d9942634ae2b544282eb3479e58e519.png) + + 内存设置为2048MB,然后点击”下一步”。 + + ![](media/bfff0b4f4089d5a6935cef73a90dd7ef.png) + + 采用默认设置,直接点击”创建”。 + + ![](media/15515f5af8f7f10ca5c588b991fed017.png) + + 采用默认设置,直接点击”下一步”。 + + ![](media/5b76ba4623ec0414045628d2a2236702.png) + + 采用默认设置,直接点击”下一步”。 + + ![](media/8a850b3053a6f7b93a97d8d501cc5f8c.png) + + 硬盘大小改为10G,然后点击”创建”。 + + ![](media/5ca3fafa21b6a0800dbc8caf7deab1a2.png) + + 新建虚拟电脑已经完成,接下来对虚拟电脑进行设置。 + + ![](media/aadf72c767b8fb2ffe6230755af06f47.png) + + 在VirtualBox的管理器上点击”设置”,具体如下: + + ![](media/c7678f58106e79166b1abe2f2cb7ec7f.png) + + 在设置页面上点击”系统”,进行系统设置,在启动顺序中把”光驱”、”硬盘”移动至第一、二启动,”软驱”去掉勾选,具体如下: + + ![](media/1797251de0fb39e4fe53806c8477ad93.png) + + 处理器中,CPU设置为2,具体如下: + + ![](media/573439cd2dd212f49e45e1c00727ad33.png) + + 点击“存储“设置项,选择光盘并在分配光驱后面点击加载按钮将前面下载的openEuler-20.03-LTS-x86_64-dvd.iso文件加载至光驱中,具体如下: + + ![](media/a226139ff19200426a9286e19c91ca5d.png) + + ![](media/e785f5af36180ec2368a7271699a76ed.png) + + 点击“网络“设置项,这里用到二张网卡,网卡1连接方式下拉选择为”仅主机(Host-Only)网络“,主要用于本地电脑与虚拟电脑相连,具体如下: + + ![](media/bd9f8ada18aa41fec10339087c131939.png) + + 网卡2设置,勾选“启用网络连接”,并且“连接方式选择”下拉选择为“网络地址转换(NAT)“,主要用于虚拟电脑与互联网相连,具体如下: + + ![](media/94ec135904c90dc868e6ba71665fc5d5.png) + + 最后点击“OK“按钮,设置完成,设置完成页面如下。点击启动按钮,开始进入系统安装。 + + ![](media/b9696392b114808a943f48a3628401dd.png) + + 启动后,会看到如下的操作系统开机界面。 + + ![](media/7739e1483ff6daedb7780a2af72b9f83.png) + + 语言选择中文-\>简体中文(中国),然后点击“继续“。 + + ![](media/5dde303a2198ba483ee494f6e3eafd1e.png) + + 在此页面,点击“安装位置“先进行分区,具体如下: + + ![](media/85c154b1b6184689925b26aa34026802.png) + + 选择“自定义“,然后点击”完成“。 + + ![](media/b2a4a091178411e8e47e4a5e32549856.png) + + 下拉选择“标准分区“,然后点击”点击这里自动创建他们“。 + + ![](media/8cf17d31a6daa695aacd8e03566a4e82.png) + + 点击“完成“,进入下一步设置。 + + ![](media/ea4126aafcb550cdb53fe0174485aa65.png) + + 点击“接受更改“,完成分区设置。 + + ![](media/2f323729c7f9c3a48e2dfed79f89696e.png) + + 在安装信息摘要页面,点击“网络和主机名“进行网络和主机名设置,具体如下。 + + 分别针对二张网卡进行设置,如以太网(enpOs3)网卡,先点击“关闭“边上的按钮把网卡打开。 + + ![](media/a775118adcd48949fdde72b8aa0cd2b2.png) + + 接着设置主机名,并点击“应用(A)”,然后点击“配置“。 + + ![](media/0a3971cee2e582a520833152f23f71f2.png) + + 在配置页中,选择“常规“,然后勾选”可用时自动链接到这个网络“,接着点击”保存“。 + + ![](media/3dd88f1e96b769412babd8f18ef28597.png) + + 参考第一张网卡的设置步骤对第二张网卡进行设置,先打开网卡,接着进行配置,具体如下。 + + ![](media/5fee0259a5f435622683f961dbfb054c.png) + + 点击“保存“。 + + ![](media/515d4c7586564e252077a000fbf9e5da.png) + + 在安装信息摘要页面,点击“软件选择 “进行软件安装设置,具体如下。 + + 在此页面选择“虚拟化主机“,并在右边勾选”Linux的远程管理“、”开发工具“、”安全性工具“、”系统管理工具“。然后点击完成。 + + ![](media/db617c2863bf7d03d06fc565b305e89b.png) + + 设置结束,点击“开始安装“,具体如下。 + + ![](media/c57f9f39084df22d7a8fcceaf6b57a13.png) + + 点击“ROOT密码“,给ROOT用户设置密码。点击“创建用户“,在此新创建一个用户,具体如下。 + + ![](media/ec8656384743610b3af14efada5debf0.png) + + 系统安装中,等待数分钟后会出现如下界面。出现此界面表示,系统安装完成,然后点击“重启“,但此时要调整系统从硬盘启动。 + + ![](media/34f6786c27763ffd41a6d0fa9fd10d7a.png) + + 先关闭VM运行窗口,如下。 + + ![](media/a578ceeb0ae3858c6ba4b4a11d5336a2.png) + + 然后设置从硬盘启动,具体如下。 + + ![](media/24cb9dcd9144c638eedc5fd73a4abfd9.png) + +6. OpenGauss安装 + + 在Linux操作系统上,通过ifconfig来查看二张网卡是否都正常启动,具体如下。 + + ![](media/cb12fa721651b1ec95c347a1c8c410e5.png) + + 通过ping baidu.com确认是否能上网,具体如下。 + + ![](media/6208e91d82f875d878fe90212891badf.png) + + 使用 ctrl+c组合键可以结束输出。 + + ![](media/57db252ca95f64000b310b64f6dd5233.png) + + 为了操作方便,可以使用SSH工具从本地电脑通过配置enp0s3网卡的IP地址来连接虚拟机,并使用ROOT用户来登录。 + + ![](media/512a3a3df1c42a004f69caa803180b16.png) + + 使用ROOT及密码登录。 + + ![](media/50404eea84f92c928290b255c2711d89.png)关闭防火墙。执行以下二个命令将防火墙关闭。 + + systemctl stop firewalld.service + + systemctl disable firewalld.service + + ![](media/145667816555676fd25ab3c745d19176.png) + + 设置字符集及环境变量。 + + ![](media/0b15cdab2d52d800b7e32334189197ca.png) + + ![](media/816db0083bad74c91fe36f2d525f0bd0.png) + + 验证变量是否生效。 + + ![](media/a9c40f250d496e92174ba95f103a4ffa.png) + + 关闭swap交换内存。 + + ![](media/2299304d16c035a46866e3eb2548f4c2.png) + + 使用vim打开文件“/etc/profile.d/performance.sh” + + ![](media/607967224d9ccc1e895401f2274f1921.png) + + 输入”i”,进入INSERT模式。用\#注释sysctl -w vm.min_free_kbytes=112640 &\> + /dev/null。 + + 点击“ESC”退出INSERT模式。输入“:wq”后回车,保存退出。 + + ![](media/71f8236dcdcffeea531cc3b3093e993a.png) + + 备份原有的yum配置文件。 + + ![](media/b7c01246e014bd9a58177d9ed46e0297.png)下载可用源的repo文件: + + curl -o /etc/yum.repos.d/openEuler_x86_64.repo + https://mirrors.huaweicloud.com/repository/conf/openeuler_x86_64.repo + + ![](media/db0ea572c7be5d0e948c113d2d2ff084.png) + + 查看repo文件内容是否正确。 + + ![](media/c81a122aea1d986a2b047014c7acbced.png)执行以下命令,安装所需的包 + + yum install libaio\* -y + + yum install libnsl\* -y + + ![](media/73dcf63d5f129f51a0bd53460ec857d3.png) + + ![](media/c6716012a244978c13e29f9b1f78e534.png) + + 设置默认Python版本为3.x。 + + ![](media/75ed5fa711021ee94adfc31711f2fbdf.png) + + 创建存放数据库安装目录。 + + ![](media/c779a6fd9cc4bade480d02bee2cb703e.png) + + 创建XML配置文件,用于数据库安装。将以下内容添加进clusterconfig.xml文件中。 + + ![](media/eace9ccdb9d6effc6531e9bc9b85637d.png) + + 切换到安装目录。 + + ![](media/67912998ba116eee7fafe104e56ef39f.png) + + 使用wget下载安装包。 + + ![](media/2dd7ac9902b53c8ae424d89d40a0d8ec.png) + + ![](media/14be66747c1ebbae308a528af0678f2b.png) + + 安装包所在的目录下,解压安装包。先解压openGauss-1.1.0-openEuler-64bit-all.tar.gz包。再先解压openGauss-1.1.0-openEuler-64bit-om.tar.gz包。 + + ![](media/90201be3ef83bc968f65971ff1d987e3.png) + + 解压后如下,用ls命令查看如下。 + + ![](media/a8c8668d424dad5240338bb6624db098.png) + + 安装包解压后,会在/opt/software/openGauss路径下自动生成script子目录,并且在script目录下生成gs_preinstall等各种OM工具脚本。更改权限。 + + ![](media/ee1909b1a5f44db65083672a72613ef7.png) + + 执行初始化脚本。 + + ![](media/12751fbac29a1d4a70bfd26dd153cdfd.png) + + 用init 6 + 重启下虚拟机。过段时间虚拟机重启好后,再次使用SSH工具从本地电脑通过配置enp0s3网卡的IP地址来连接虚拟机,并使用ROOT用户来登录,然后接着以下操作。 + + ![](media/09f62863ec9f8266621c0fbf93d6ab66.png) + + 然后使用omm用户进行数据库初始化。 + + gs_install -X /opt/software/openGauss/clusterconfig.xml + \--gsinit-parameter="--encoding=UTF8" --dn-guc="max_process_memory=2GB" + \--dn-guc="shared_buffers=128MB" --dn-guc="bulk_write_ring_size=128MB" + \--dn-guc="cstore_buffers=16MB" + + ![](media/da87a64d39704737c415cb169dd72905.png) + + 清理软件安装包。 + + ![](media/a493e448da3fcf1e7074b0f85255bfe6.png) + +7. OpenGauss使用 + +8. 以操作系统用户omm登录数据库主节点。 + + ![](media/45feda5e28f0ede6795b22bf1f15cfcf.png) + +9. 启动服务。 + + ![](media/e5f4515a59055aa97711bc816791f739.png) + +10. 连接数据库。结果显示为如下信息,则表示连接成功。 + + 其中,postgres为openGauss安装完成后默认生成的数据库。初始可以连接到此数据库进行新数据库的创建。26000为数据库主节点的端口号,需根据openGauss的实际情况做替换,请确认连接信息获取。 + + ![](media/4038f25ba45269b144623759cbe1391e.png) + +11. 第一次连接数据库时,需要先修改omm用户密码。新密码为a77161@db。 + + ![](media/748460cf35b44c91e6972a13d30cc52c.png) + +12. 创建数据库用户。当结果显示为如下信息,则表示创建成功。 + + ![](media/748460cf35b44c91e6972a13d30cc52c.png) + +13. 创建数据库。当结果显示为如下信息,则表示创建成功。 + + ![](media/748460cf35b44c91e6972a13d30cc52c.png) + +14. 使用新用户连接到此数据库。 + + ![](media/79bc6c1e46f7262d5d58c3275955fa55.png) + +15. OpenEuler上安装OpenSSL + +16. 搭建 + + ![](media/2823b8c27241b624f6537903d1ecf855.png) + +17. 生成服务端证书请求文件 + + ![](media/9fe4f6f2aecc50b5c79bbaa0b936530c.png) + +18. 生成服务端证书私钥 + + ![](media/03462cb92dbe4325ff8ce36647fe5f2d.png) + +19. 生成根私钥 + + ![](media/658b1b25e68e10ceb2a5d08bc9c18958.png) + +20. 生成根证书请求文件 + + ![](media/6e0c53d3a5d4ee12c4a5f04ee7c595dc.png) + +21. 生成自签发根证书 + + ![](media/8e6ad5b8badb02f2b39a210f2b068695.png) + +22. OpenEuler图形界面安装 + +23. 设置Base + + ![](media/7c5301654c32fdf3c11e655f04fb9c0d.png) + +24. yum makecache + + ![](media/3a400b25c20cbd2e41d158ae39e63f17.png) + +25. 修改配置文件 + + ![](media/dc4876d484e763eeba5c0f2ea5805b57.png) + +26. Wget下载Xsession + + ![](media/4e682fcc5322e2000357705d3fd698db.png) + +27. 使用systemctl命令启动服务 + + ![](media/91deddc60b8626b63f70b92922d60814.png) + +28. 重启可以看到图形界面成功安装。 + + ![](media/00170a2cf58dde5d856e565a6972f9f2.png) diff --git "a/content/zh/post/naihuangbao/OpenGauss\346\237\245\350\257\242\351\207\215\345\206\231\346\272\220\344\273\243\347\240\201\350\247\243\346\236\220.md" "b/content/zh/post/naihuangbao/OpenGauss\346\237\245\350\257\242\351\207\215\345\206\231\346\272\220\344\273\243\347\240\201\350\247\243\346\236\220.md" new file mode 100644 index 0000000000000000000000000000000000000000..f5ee3310cb2a7e317bdb31e5fe5fa5d6ede24c1e --- /dev/null +++ "b/content/zh/post/naihuangbao/OpenGauss\346\237\245\350\257\242\351\207\215\345\206\231\346\272\220\344\273\243\347\240\201\350\247\243\346\236\220.md" @@ -0,0 +1,326 @@ ++++ title = "OpenGauss查询重写源代码解析" date = "2022/1/25" tags = ["OpenGauss源代码"] archives = "2022-01" author = "naihuangbao" summary = "OpenGauss查询重写源代码解析" times = "03:30" +++ + +1. **功能概述——查询重写** + +**定义:** + +查询重写就是把用户输入的SQL语句转换为更高效的等价SQL。 + +**原则:** + +查询重写遵循两个基本原则。 + +(1) 等价性:原语句和重写后的语句,输出结果相同。 + +(2) 高效性:重写后的语句,比原语句在执行时间和资源使用上更高效。 + +**方式:** + +查询重写优化既可以**基于关系代数的理论**进行优化,例如谓词下推、子查询优化等,也可以**基于启发式规则**进行优化,例如Outer +Join消除、表连接消除等。另外还有一些**基于特定的优化规则和实际执行过程相关**的优化,例如在并行扫描的基础上,可以考虑对Aggregation算子分阶段进行,通过将Aggregation划分成不同的阶段,可以提升执行的效率。 + +**代价:** + +查询重写不只是基于经验的查询重写,还可以是**基于代价**的查询重写。 + +1. **源代码文件** + +![](media/2ccc8ade0a3ea47c35c85c623b29b426.png) + +- **目录:** + + src/gausskernel/optimizer/prep![](media/164512cdaeba9fc9b85a3299d669c171.png) + +- **preptlist:** + + 预处理语法树的目标列表。 + + 对于INSERT和UPDATE语句,目标列表中包含的对于每个目标关系的属性的入口必须是正确顺序的。通俗的来说就是INSERT语句中插入数据的顺序可能和关系表中的属性顺序不一致,比如表中属性的顺序是A + B C,而插入语句是按照 B C + A这样插入数据的。对于所有语句,我们有时需要为了返回的属性和EvalPlanQual需要的行号信息加入多余的目标列表入口。举例来说,有时我们的查询结果不一定是关系表中存在的列,而是类似A+B这样的新列(A和B都是原关系表中的属性)。EvalPlanQual是一个函数,主要用于检查被修改的行,在read + commited隔离级别下是否有必要重新去读。 + +- **preprownum:** + + 把rownum改写为limit。 + +{select \* from table_name where rownum \< 5;} + +{select \* from table_name limit 4;} + +- **prepqual:** + + 预处理条件语句。确保语法树是否扁平(flatness),如果不扁平的话需要让这个语法树变平。简单的来说就是将编译阶段被当作二元运算符写入树中的逻辑符(AND,OR)在树中变为多元运算符(A + AND (B AND C) 变成 A AND B AND + C)。现在这项功能主要交给eval_const_expressions这个函数,因为这个函数本来就需要遍历表达式树,可以在遍历的过程中同时将树扁平化,这样就可以免去多次遍历的麻烦。 + +- **prepnonjointree:** + + 预处理子序列和不需要join的操作。 + +- **prepjointree:** + + 预处理子序列和需要join的操作。 + +- **prepunion:** + + 预处理集合运算。但类似UNION ALL的直接附加关系不在这里处理。 + +**架构:** + +![](media/ec3d88a793e2554a1948a6df59adbf65.png) + +(1) +提升子查询:子查询出现在RangeTableEntry中,它存储的是一个子查询树,若子查询不被提升,则经过查询优化之后形成一个子执行计划,上层执行计划和子查询计划做嵌套循环得到最终结果。在该过程中,查询优化模块对这个子查询所能做的优化选择较少。若该子查询被提升,转换成与上层的join,由查询优化模块常数替换等式:由于常数引用速度更快,故将可以求值的变量求出来,并用求得的常数替换它,实现函数为preprocess_const_params。 + +(2) 子查询替换CTE:理论上CTE(common table +expression,通用表达式)与子查询性能相同,但对子查询可以进行进一步的提升重写优化,故尝试用子查询替换CTE,实现函数为substitute_ctes_with_subqueries。 + +(3) multi +count(distinct)替换为多条子查询:如果出现该类查询,则将多个count(distinct)查询分别替换为多条子查询,其中每条子查询中包含一个count(distinct)表达式,实现函数为convert_multi_count_distinct。 + +(4) +提升子链接:子链接出现在WHERE/ON等约束条件中,通常伴随着ANY/ALL/IN/EXISTS/SOME等谓词同时出现。虽然子链接从语句的逻辑层次上是清晰的,但是效率有高有低,比如相关子链接,其执行结果和父查询相关,即父查询的每一条元组都对应着子链接的重新求值,此情况下可通过提升子链接提高效率。在该部分数据库主要针对ANY和EXISTS两种类型的子链接尝试进行提升,提升为Semi +Join或者Anti-SemiJoin,实现函数为pull_up_sublinks。 + +(5) 减少ORDER +BY:由于在父查询中可能需要对数据库的记录进行重新排序,故减少子查询中的ORDER +BY语句以进行链接可提高效率,实现函数为reduce_orderby。 + +(6) 删除NotNullTest:即删除相关的非NULL +Test以提高效率,实现函数为removeNotNullTest。 + +(7) Lazy +Agg重写:顾名思义,即“懒聚集”,目的在于减少聚集次数,实现函数为lazyagg_main。 + +(8) +对连接操作的优化做了很多工作,可能获得更好的执行计划,实现函数为pull_up_subqueries。 + +(9) UNION ALL优化:对顶层的UNION ALL进行处理,目的是将UNION +ALL这种集合操作的形式转换为AppendRelInfo的形式,实现函数为flatten_simple_union_all。 + +(10) +展开继承表:如果在查询语句执行的过程中使用了继承表,那么继承表是以父表的形式存在的,需要将父表展开成为多个继承表,实现函数为expand_inherited_tables。,实现函数为expand_inherited_tables。 + +(11)预处理表达式:该模块是对查询树中的表达式进行规范整理的过程,包括对链接产生的别名Var进行替换、对常量表达式求值、对约束条件进行拉平、为子链接生成执行计划等,实现函数为preprocess_expression。 + +(12) +处理HAVING子句:在Having子句中,有些约束条件是可以转变为过滤条件的(对应WHERE),这里对Having子句中的约束条件进行拆分,以提高效率。 + +(13) +外连接消除:目的在于将外连接转换为内连接,以简化查询优化过程,实现函数为reduce_outer_join函数。 + +(14) 全连接full +join重写:对全连接函数进行重写,以完善其功能。比如对于语句SELECT \* FROM t1 FULL +JOIN t2 ON TRUE可以将其转换为: SELECT \* FROM t1 LEFT JOIN t2 ON TRUE UNION ALL +(SELECT \* FROM t1 RIGHT ANTI FULL JOIN t2 ON +TRUE),实现函数为reduce_inequality_fulljoins。 + +1. **函数解析** + +2. reduce_orderby + +由于在父查询中可能需要对数据库的记录进行重新排序,故减少子查询中的ORDER +BY语句以进行链接可提高效率,实现函数为reduce_orderby。例如在如下SQL语句中子查询的ORDER +BY就可以在实际运行时被删除:select \* from (select \* from table_name order by +column_name desc) 。 + +**void reduce_orderby(Query\* query, bool reduce)** + +- ORDER BY 语句用于根据指定的列对结果集进行排序。 + +- 减少子查询中的orderby,减少无效的orderby(UNION)。 + +- 入口为subquery_planner。query为待处理的查询树。reduce标志是否要减少orderby + +1. 如果目前是update和insert命令,遍历query树,找到为select的子语句。 + + ![](media/a11ee892c25df070f3718ed66cb5b345.png) + +2. 递归查找子查询中的orderby,然后决定是否可以减少。 + + ![](media/6c062992fdeaaf6032fdb25a84ccde3c.png) + +3. 如果有集合操作,需要递归找到orderby,并直接减少。 + + 在如(SELECT \* FROM t1 WHERE username LIKE 'l%' ORDER BY sroce ASC) + + UNION + + (SELECT \* FROM t1 WHERE username LIKE '%m%' ORDER BY score + ASC)的集合操作中order by没有效果。 + + ![](media/8bd9044cac595860d5eeda3197da941f.png) + + 其中RangeTblEntry 为 查询树节点中的表实体对象。 + +**static void reduce_orderby_final(RangeTblEntry\* rte, bool reduce)** + +- 减少orderby语句的执行函数 + +1. 确定当前的表实体对象是子查询。当传入的reduce标志是正且此时子查询内存在排序语句,释放排序语句的节点,并置为空。 + + ![](media/7b32ccd0e5d6e3bf965f9f45de53a9ea.png) + +**static void reduce_orderby_recurse(Query\* query, Node\* jtnode, bool +reduce)** + +- 递归检查join节点,并对表实体对象执行减少orderby操作。 + +1. join节点为集合操作时,orderby可以减少,将标志置为true,继续递归。 + + ![](media/68dee29cd1a5d5d6baf50c4e6125ff5c.png) + +2. join节点为join操作时,检查jointype,orderby可以减少,将标志置为true,继续递归。若jointype不是期望的任意一种类型,报错。 + + ![](media/1f54776a27d0c66c485979e0c075d48c.png) + +3. 当join节点为where...from...结构时,当from还有其他子树时(嵌套查询),可以减少orderby语句。 + + ![](media/aa4a0bd807bd4f04ec2045460d497703.png) + +4. 注意如果存在rownum则不能减少orderby。 + + 例如在如下这种情况中select \* from table_name where rownum \< n union select + \* from (select \* from table_name order by column_name desc) where rownum + \< n; + orderby不能被减少,故需要单独使用contain_rownum_walker函数检测检测这种情况。 + + ![](media/c1c011146e117916bce41c61e22b23d5.png) + + ![](media/693832ccc67cf1518da00d0f9fbfbe6d.png) + +5. 递归到rangetableentry时可以调用final函数执行减少操作。RangeTblRef是Query-\>jointree的叶子节点,所以是该函数递归结束的条件,调用final函数执行减少操作。 + + ![](media/55fb1c507eb8ed2c6c3e2c7b24dc395c.png) + +6. reduce_outer_joins + +- 目的在于将外连接转换为内连接,以简化查询优化过程。 + + 例如,在如下语句中外连接可以被转换为内连接。 + + SELECT ... FROM a LEFT JOIN b ON (...) WHERE b.y = 42; + + 当join条件成立时,返回左表中的数据。如果左表中满足指定条件的某行数据在右表中出现过,则此行保留在结果集中。 + + 当join条件不成立时,返回左表中的数据。如果左表中满足指定条件的某行数据没有在右表中出现过,则此行保留在结果集中。 + +- 当外连接上有一个严格的条件,限制在连接中可能为空的属性不能为空时,外连接可以被转化为内连接。 + + 例如,在如下语句中外连接可以被转换为内连接。 + + SELECT ... FROM a LEFT JOIN b ON (a.x = b.y) WHERE b.y IS NULL; + +- 可以将外连接转换为anti join。 + +- 因为RIGHT JOIN和LEFT JOIN的本质其实是一样的,故可以把把RIGHT JOIN翻转成LEFT + JOIN,这样可以节省代码相同的代码。 + +- 为了识别严格条件语句,这个函数必须在预处理表达时之后执行。 + + **reduce_outer_joins** + + 为了避免检查不必要的条件语句,在当前节点下面没有外连接时停止搜索。将这个过程分为两个部分。第一部分,收集join语句两边的表的信息,并且确定是否存在外连接。第二部分,检查条件语句并且转换连接类型。 + + ![](media/fc0f362a4c2e20cb5b7b2288043765f4.png) + + **reduce_outer_joins_pass1** + + pass1返回一个描述jointree状态的节点。与其他函数类似,讨论join节点为RangeTblRef、FromExpr、JoinExpr的三种情况。 + + ![](media/4872d2d1726b22aabb21c248ad4af0a4.png) + + **reduce_outer_joins_pass2** + +1. 参数nonnullable_vars、forced_null_vars为被条件语句要求必须为空和非空的属性列表。 + + ![](media/714ccd06e3ca4e77feefc1a3f46ca85c.png) + +2. 检查必须为非空/空的属性与在外连接中将要为空/非空的属性有没有重合,由此确定目标的转换连接类型。 + +3. 注意ANTI JOIN类型可以不用讨论,因为ANTI + JOIN只有可能由提升子链接函数引入。上层的条件语句不会涉及到其两侧。 + + ![](media/2546b3d371039e26b0090009c38ebb83.png) + +4. pull_up_sublinks + +- 目的在于提升子链接,是查询重写最基础及重要的函数之一。 + +- 子链接出现在WHERE/ON等约束条件中,通常伴随着ANY/ALL/IN/EXISTS/SOME等谓词同时出现。虽然子链接从语句的逻辑层次上是清晰的,但是效率有高有低,比如相关子链接,其执行结果和父查询相关,即父查询的每一条元组都对应着子链接的重新求值,此情况下可通过提升子链接提高效率。 + +- 在该部分数据库主要针对ANY和EXISTS两种类型的子链接尝试进行提升,提升为Semi + Join或者Anti-SemiJoin,实现函数为pull_up_sublinks。 + +- 因为经过提升子链接处理的语句会变为Join语法,故需要在提升子链接之后进行减少Join的处理。 + +- openGauss数据库为不同的谓词设置了不同的SUBLINK类型。openGauss数据库为子链接定义了单独的结构体——SubLink结构体,其中主要描述了子链接的类型、子链接的操作符等信息。 + + ![](media/83fbb985c5c5e654125bab67cf17b0d1.png) + +- 子链接提升的主要过程是在pull_up_sublinks函数中实现,pull_up_sublinks函数又调用pull_up_sublinks_jointree_recurse递归处理Query-\>jointree中的节点。 + + **pull_up_sublinks_jointree_recurse** + +- jnode分为三种类型:RangeTblRef、FromExpr、JoinExpr。针对这三种类别pull_up_sublinks_jointree_recurse函数分别进行了处理。 + +1. RangeTblRef + + RangeTblRef是Query-\>jointree的叶子节点,所以是该函数递归结束的条件,程序走到该分支,一般有两种情况。 + + ![](media/014cb5f0ea95ee0a84c0b0dd8e0f4989.png) + + 当前语句是单表查询而且不存在连接操作,这种情况递归处理直到结束后,再去查看子链接是否满足其他提升条件。 + + ![](media/1f4820f15f9cf6452c31e06ba14932ab.png) + + 查询语句存在连接关系,在对From-\>fromlist、JoinExpr-\>larg或者JoinExpr-\>rarg递归处理的过程中,当遍历到了RangeTblRef叶子节点时,需要把RangeTblRef节点的relids(表的集合)返回给上一层。主要用于判断该子链接是否能提升。 + + ![](media/7b1a80280a1933b1ab71fcf5484a5503.png) + +2. FromExpr + +![](media/32da5f2a94500261741d20a13df9ced0.png) + +递归遍历From-\>fromlist中的节点,之后对每个节点递归调用pull_up_sublinks_jointree_recurse函数,直到处理到叶子节点RangeTblRef才结束。 + +![](media/d925ba046e7ba14c0cc6222b72e6c429.png) + +调用pull_up_sublinks_qual_recurse函数处理From-\>qual,对其中可能出现的ANY_SUBLINK或EXISTS_SUBLINK进行处理。 + +![](media/b57759f97df1f88d0c706bbfb071b15e.png) + +1. JoinExpr + + ![](media/d7eb4fe3515057789dd04cfeb2722c4b.png) + + 调用pull_up_sublinks_jointree_recurse函数递归处理JoinExpr-\>larg和JoinExpr-\>rarg,直到处理到叶子节点RangeTblRef才结束。另外还需要根据连接操作的类型区分子链接是否能够被提升。 + + ![](media/8ae4ed56cd4bed160c22762937ec6521.png) + + 调用pull_up_sublinks_qual_recurse函数处理JoinExpr-\>quals,对其中可能出现的ANY_SUBLINK或EXISTS_SUBLINK做处理。如果连接类型不同,pull_up_sublinks_qual_recurse函数的available_rels1参数的输入值是不同的。 + + ![](media/ec3f9990acc3550adb18a6161afd95b7.png) + + pull_up_sublinks_qual_recurse函数除了对ANY_SUBLINK和EXISTS_SUBLINK做处理,还对OR子句和EXPR类型子链接做了查询重写优化。 + +2. **源代码学习感悟** + +- **学习源码前必要的准备工作** + + 在学习源码之前首先应该回顾基本的SQL语法和数据库概念。以我学习的查询重写功能为例,如果对SQL语法不了解,那就很难理解很多函数的功能和设计。如果能事先理解哪些语法在什么条件下能够互相改写,那将会事半功倍。 + +- **好用的资料** + + 因为openGauss是在开源数据库postgresql的基础上进行开发的,所以很多部分的代码和postgresql是完全一致的。 + + + + postgresql的源码网站支持检索功能。在阅读源码的过程中,我经常遇到对其他文件中定义的结构或函数的调用。通过在源码网站中查找,可以快速找到该结构或函数是在哪个文件的什么位置定义的,并且可以通过链接快速定位到定义位置,还可以看到相关的其他函数。同时,源码网站的注释非常丰富,遇到一些先前代码中定义的函数,只需要看一下注释就可以大概理解其功能,减轻代码越看越多、逐渐偏离主题的痛苦。 + + ![](media/46f30c9691843211b64bebfad0dd19f4.png) + + ![](media/2dd2aabc3617996c941e2550d9a2dbb3.png) + + ![](media/1d054448663edbc11841b688e796ba16.png) diff --git a/content/zh/post/naihuangbao/media/.keep b/content/zh/post/naihuangbao/media/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/content/zh/post/naihuangbao/media/00170a2cf58dde5d856e565a6972f9f2.png b/content/zh/post/naihuangbao/media/00170a2cf58dde5d856e565a6972f9f2.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb0b349f1038cba264edb94d5e998d5216247a3 Binary files /dev/null and b/content/zh/post/naihuangbao/media/00170a2cf58dde5d856e565a6972f9f2.png differ diff --git a/content/zh/post/naihuangbao/media/014cb5f0ea95ee0a84c0b0dd8e0f4989.png b/content/zh/post/naihuangbao/media/014cb5f0ea95ee0a84c0b0dd8e0f4989.png new file mode 100644 index 0000000000000000000000000000000000000000..0acc7946a97713e3b9836139d9b68092c78d8dff Binary files /dev/null and b/content/zh/post/naihuangbao/media/014cb5f0ea95ee0a84c0b0dd8e0f4989.png differ diff --git a/content/zh/post/naihuangbao/media/03462cb92dbe4325ff8ce36647fe5f2d.png b/content/zh/post/naihuangbao/media/03462cb92dbe4325ff8ce36647fe5f2d.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbfa06578a53521e79ed4cc7809f09914960a11 Binary files /dev/null and b/content/zh/post/naihuangbao/media/03462cb92dbe4325ff8ce36647fe5f2d.png differ diff --git a/content/zh/post/naihuangbao/media/09f62863ec9f8266621c0fbf93d6ab66.png b/content/zh/post/naihuangbao/media/09f62863ec9f8266621c0fbf93d6ab66.png new file mode 100644 index 0000000000000000000000000000000000000000..2dcd060f648fbe9c703c78f24921d125ed1be32c Binary files /dev/null and b/content/zh/post/naihuangbao/media/09f62863ec9f8266621c0fbf93d6ab66.png differ diff --git a/content/zh/post/naihuangbao/media/0a3971cee2e582a520833152f23f71f2.png b/content/zh/post/naihuangbao/media/0a3971cee2e582a520833152f23f71f2.png new file mode 100644 index 0000000000000000000000000000000000000000..e762688785780e53b996d833015e9da0a88dff74 Binary files /dev/null and b/content/zh/post/naihuangbao/media/0a3971cee2e582a520833152f23f71f2.png differ diff --git a/content/zh/post/naihuangbao/media/0b15cdab2d52d800b7e32334189197ca.png b/content/zh/post/naihuangbao/media/0b15cdab2d52d800b7e32334189197ca.png new file mode 100644 index 0000000000000000000000000000000000000000..53339532f72627b3a4f143ab571db99030bcdd9c Binary files /dev/null and b/content/zh/post/naihuangbao/media/0b15cdab2d52d800b7e32334189197ca.png differ diff --git a/content/zh/post/naihuangbao/media/0d9942634ae2b544282eb3479e58e519.png b/content/zh/post/naihuangbao/media/0d9942634ae2b544282eb3479e58e519.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc18efc827f482079537b25ef38d34f53a1ec35 Binary files /dev/null and b/content/zh/post/naihuangbao/media/0d9942634ae2b544282eb3479e58e519.png differ diff --git a/content/zh/post/naihuangbao/media/12751fbac29a1d4a70bfd26dd153cdfd.png b/content/zh/post/naihuangbao/media/12751fbac29a1d4a70bfd26dd153cdfd.png new file mode 100644 index 0000000000000000000000000000000000000000..887557bec2a9cc35c01a4ace3ed2c8c799c3d1d5 Binary files /dev/null and b/content/zh/post/naihuangbao/media/12751fbac29a1d4a70bfd26dd153cdfd.png differ diff --git a/content/zh/post/naihuangbao/media/145667816555676fd25ab3c745d19176.png b/content/zh/post/naihuangbao/media/145667816555676fd25ab3c745d19176.png new file mode 100644 index 0000000000000000000000000000000000000000..69c7196a1413b58df11bc7eb68f065a2efd1590d Binary files /dev/null and b/content/zh/post/naihuangbao/media/145667816555676fd25ab3c745d19176.png differ diff --git a/content/zh/post/naihuangbao/media/14be66747c1ebbae308a528af0678f2b.png b/content/zh/post/naihuangbao/media/14be66747c1ebbae308a528af0678f2b.png new file mode 100644 index 0000000000000000000000000000000000000000..b6fbbbe115e061b3f884cebfe93d64012e81c556 Binary files /dev/null and b/content/zh/post/naihuangbao/media/14be66747c1ebbae308a528af0678f2b.png differ diff --git a/content/zh/post/naihuangbao/media/15515f5af8f7f10ca5c588b991fed017.png b/content/zh/post/naihuangbao/media/15515f5af8f7f10ca5c588b991fed017.png new file mode 100644 index 0000000000000000000000000000000000000000..801135b4c4b05c1cb2c56aa1ff8458a43d888f54 Binary files /dev/null and b/content/zh/post/naihuangbao/media/15515f5af8f7f10ca5c588b991fed017.png differ diff --git a/content/zh/post/naihuangbao/media/164512cdaeba9fc9b85a3299d669c171.png b/content/zh/post/naihuangbao/media/164512cdaeba9fc9b85a3299d669c171.png new file mode 100644 index 0000000000000000000000000000000000000000..172dcee1aff8937402104c6e7f3fb7621a097be4 Binary files /dev/null and b/content/zh/post/naihuangbao/media/164512cdaeba9fc9b85a3299d669c171.png differ diff --git a/content/zh/post/naihuangbao/media/1797251de0fb39e4fe53806c8477ad93.png b/content/zh/post/naihuangbao/media/1797251de0fb39e4fe53806c8477ad93.png new file mode 100644 index 0000000000000000000000000000000000000000..dccea28eede19e2debf89be8d999549dff43484f Binary files /dev/null and b/content/zh/post/naihuangbao/media/1797251de0fb39e4fe53806c8477ad93.png differ diff --git a/content/zh/post/naihuangbao/media/1d054448663edbc11841b688e796ba16.png b/content/zh/post/naihuangbao/media/1d054448663edbc11841b688e796ba16.png new file mode 100644 index 0000000000000000000000000000000000000000..9a038803d97612dd0f87f729fcf72f7d94c367ef Binary files /dev/null and b/content/zh/post/naihuangbao/media/1d054448663edbc11841b688e796ba16.png differ diff --git a/content/zh/post/naihuangbao/media/1f4820f15f9cf6452c31e06ba14932ab.png b/content/zh/post/naihuangbao/media/1f4820f15f9cf6452c31e06ba14932ab.png new file mode 100644 index 0000000000000000000000000000000000000000..807042666fdf6f1b6de87fb5bc53ed88318ca9b0 Binary files /dev/null and b/content/zh/post/naihuangbao/media/1f4820f15f9cf6452c31e06ba14932ab.png differ diff --git a/content/zh/post/naihuangbao/media/1f54776a27d0c66c485979e0c075d48c.png b/content/zh/post/naihuangbao/media/1f54776a27d0c66c485979e0c075d48c.png new file mode 100644 index 0000000000000000000000000000000000000000..57d250cc14256c97d74f31422102b091e9aa929c Binary files /dev/null and b/content/zh/post/naihuangbao/media/1f54776a27d0c66c485979e0c075d48c.png differ diff --git a/content/zh/post/naihuangbao/media/2299304d16c035a46866e3eb2548f4c2.png b/content/zh/post/naihuangbao/media/2299304d16c035a46866e3eb2548f4c2.png new file mode 100644 index 0000000000000000000000000000000000000000..66d8b7cee8afae8f49d90f769bb5e96a17143ecb Binary files /dev/null and b/content/zh/post/naihuangbao/media/2299304d16c035a46866e3eb2548f4c2.png differ diff --git a/content/zh/post/naihuangbao/media/24cb9dcd9144c638eedc5fd73a4abfd9.png b/content/zh/post/naihuangbao/media/24cb9dcd9144c638eedc5fd73a4abfd9.png new file mode 100644 index 0000000000000000000000000000000000000000..54cb27718985ab9c8af8e77b1306f7b1d580027b Binary files /dev/null and b/content/zh/post/naihuangbao/media/24cb9dcd9144c638eedc5fd73a4abfd9.png differ diff --git a/content/zh/post/naihuangbao/media/2546b3d371039e26b0090009c38ebb83.png b/content/zh/post/naihuangbao/media/2546b3d371039e26b0090009c38ebb83.png new file mode 100644 index 0000000000000000000000000000000000000000..a08801efdc925b39b175b424059c798fb13503b2 Binary files /dev/null and b/content/zh/post/naihuangbao/media/2546b3d371039e26b0090009c38ebb83.png differ diff --git a/content/zh/post/naihuangbao/media/2823b8c27241b624f6537903d1ecf855.png b/content/zh/post/naihuangbao/media/2823b8c27241b624f6537903d1ecf855.png new file mode 100644 index 0000000000000000000000000000000000000000..739900a9a199a5eb655b5ac55ad7371f2738873f Binary files /dev/null and b/content/zh/post/naihuangbao/media/2823b8c27241b624f6537903d1ecf855.png differ diff --git a/content/zh/post/naihuangbao/media/2ccc8ade0a3ea47c35c85c623b29b426.png b/content/zh/post/naihuangbao/media/2ccc8ade0a3ea47c35c85c623b29b426.png new file mode 100644 index 0000000000000000000000000000000000000000..2fbe8ed5c5ef56764d97735418c8e9a311837074 Binary files /dev/null and b/content/zh/post/naihuangbao/media/2ccc8ade0a3ea47c35c85c623b29b426.png differ diff --git a/content/zh/post/naihuangbao/media/2dd2aabc3617996c941e2550d9a2dbb3.png b/content/zh/post/naihuangbao/media/2dd2aabc3617996c941e2550d9a2dbb3.png new file mode 100644 index 0000000000000000000000000000000000000000..c4068ab5e92cc3f30d25388cb3d21b6737f227cd Binary files /dev/null and b/content/zh/post/naihuangbao/media/2dd2aabc3617996c941e2550d9a2dbb3.png differ diff --git a/content/zh/post/naihuangbao/media/2dd7ac9902b53c8ae424d89d40a0d8ec.png b/content/zh/post/naihuangbao/media/2dd7ac9902b53c8ae424d89d40a0d8ec.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a3d502cbca88bfce6491b6dcda96ec54b446ee Binary files /dev/null and b/content/zh/post/naihuangbao/media/2dd7ac9902b53c8ae424d89d40a0d8ec.png differ diff --git a/content/zh/post/naihuangbao/media/2f323729c7f9c3a48e2dfed79f89696e.png b/content/zh/post/naihuangbao/media/2f323729c7f9c3a48e2dfed79f89696e.png new file mode 100644 index 0000000000000000000000000000000000000000..01388f7aae64dd4041acebb2182be49182d88a4b Binary files /dev/null and b/content/zh/post/naihuangbao/media/2f323729c7f9c3a48e2dfed79f89696e.png differ diff --git a/content/zh/post/naihuangbao/media/32da5f2a94500261741d20a13df9ced0.png b/content/zh/post/naihuangbao/media/32da5f2a94500261741d20a13df9ced0.png new file mode 100644 index 0000000000000000000000000000000000000000..c107cc34f8989e54a2bde0a6ffc7c43f8e0cf5a9 Binary files /dev/null and b/content/zh/post/naihuangbao/media/32da5f2a94500261741d20a13df9ced0.png differ diff --git a/content/zh/post/naihuangbao/media/34f6786c27763ffd41a6d0fa9fd10d7a.png b/content/zh/post/naihuangbao/media/34f6786c27763ffd41a6d0fa9fd10d7a.png new file mode 100644 index 0000000000000000000000000000000000000000..cd7ec07525b3fe50bcdaf5c90f9495c4265eeeb3 Binary files /dev/null and b/content/zh/post/naihuangbao/media/34f6786c27763ffd41a6d0fa9fd10d7a.png differ diff --git a/content/zh/post/naihuangbao/media/3a400b25c20cbd2e41d158ae39e63f17.png b/content/zh/post/naihuangbao/media/3a400b25c20cbd2e41d158ae39e63f17.png new file mode 100644 index 0000000000000000000000000000000000000000..1d9d6df979bede3e28c994a889cd2977ed364749 Binary files /dev/null and b/content/zh/post/naihuangbao/media/3a400b25c20cbd2e41d158ae39e63f17.png differ diff --git a/content/zh/post/naihuangbao/media/3dd88f1e96b769412babd8f18ef28597.png b/content/zh/post/naihuangbao/media/3dd88f1e96b769412babd8f18ef28597.png new file mode 100644 index 0000000000000000000000000000000000000000..e15e899cd7b6ca572eec546b698769160788c1f1 Binary files /dev/null and b/content/zh/post/naihuangbao/media/3dd88f1e96b769412babd8f18ef28597.png differ diff --git a/content/zh/post/naihuangbao/media/4038f25ba45269b144623759cbe1391e.png b/content/zh/post/naihuangbao/media/4038f25ba45269b144623759cbe1391e.png new file mode 100644 index 0000000000000000000000000000000000000000..d68bea191248d5b6b8ec481cdc24e64558643887 Binary files /dev/null and b/content/zh/post/naihuangbao/media/4038f25ba45269b144623759cbe1391e.png differ diff --git a/content/zh/post/naihuangbao/media/45feda5e28f0ede6795b22bf1f15cfcf.png b/content/zh/post/naihuangbao/media/45feda5e28f0ede6795b22bf1f15cfcf.png new file mode 100644 index 0000000000000000000000000000000000000000..24c2eb00d4561e19a6cae73b17f7f816b6a8bc03 Binary files /dev/null and b/content/zh/post/naihuangbao/media/45feda5e28f0ede6795b22bf1f15cfcf.png differ diff --git a/content/zh/post/naihuangbao/media/46f30c9691843211b64bebfad0dd19f4.png b/content/zh/post/naihuangbao/media/46f30c9691843211b64bebfad0dd19f4.png new file mode 100644 index 0000000000000000000000000000000000000000..137a8e965ff0dea33f9099f5ccb21b5882146fb1 Binary files /dev/null and b/content/zh/post/naihuangbao/media/46f30c9691843211b64bebfad0dd19f4.png differ diff --git a/content/zh/post/naihuangbao/media/4872d2d1726b22aabb21c248ad4af0a4.png b/content/zh/post/naihuangbao/media/4872d2d1726b22aabb21c248ad4af0a4.png new file mode 100644 index 0000000000000000000000000000000000000000..740b72a71838cd8036389b7a71e7a02b44f11387 Binary files /dev/null and b/content/zh/post/naihuangbao/media/4872d2d1726b22aabb21c248ad4af0a4.png differ diff --git a/content/zh/post/naihuangbao/media/4e682fcc5322e2000357705d3fd698db.png b/content/zh/post/naihuangbao/media/4e682fcc5322e2000357705d3fd698db.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e722fac6b3dfa55c2bc444dbb65d6ca0bd040e Binary files /dev/null and b/content/zh/post/naihuangbao/media/4e682fcc5322e2000357705d3fd698db.png differ diff --git a/content/zh/post/naihuangbao/media/4ff4f8dae785d6d99b74fc24a6e84dde.png b/content/zh/post/naihuangbao/media/4ff4f8dae785d6d99b74fc24a6e84dde.png new file mode 100644 index 0000000000000000000000000000000000000000..3feb85a86da8eef6df9b4cb277551788d5e11f34 Binary files /dev/null and b/content/zh/post/naihuangbao/media/4ff4f8dae785d6d99b74fc24a6e84dde.png differ diff --git a/content/zh/post/naihuangbao/media/50404eea84f92c928290b255c2711d89.png b/content/zh/post/naihuangbao/media/50404eea84f92c928290b255c2711d89.png new file mode 100644 index 0000000000000000000000000000000000000000..b015ab8efbd67b3f6cadf8ffb7101928ab9d780e Binary files /dev/null and b/content/zh/post/naihuangbao/media/50404eea84f92c928290b255c2711d89.png differ diff --git a/content/zh/post/naihuangbao/media/512a3a3df1c42a004f69caa803180b16.png b/content/zh/post/naihuangbao/media/512a3a3df1c42a004f69caa803180b16.png new file mode 100644 index 0000000000000000000000000000000000000000..f08cbd626374b8b2321b6166712c059c110d5573 Binary files /dev/null and b/content/zh/post/naihuangbao/media/512a3a3df1c42a004f69caa803180b16.png differ diff --git a/content/zh/post/naihuangbao/media/515d4c7586564e252077a000fbf9e5da.png b/content/zh/post/naihuangbao/media/515d4c7586564e252077a000fbf9e5da.png new file mode 100644 index 0000000000000000000000000000000000000000..2a8c4f1d95359a501172f9a6f41dcd17855765c9 Binary files /dev/null and b/content/zh/post/naihuangbao/media/515d4c7586564e252077a000fbf9e5da.png differ diff --git a/content/zh/post/naihuangbao/media/55fb1c507eb8ed2c6c3e2c7b24dc395c.png b/content/zh/post/naihuangbao/media/55fb1c507eb8ed2c6c3e2c7b24dc395c.png new file mode 100644 index 0000000000000000000000000000000000000000..cdcecda656f5fa3830430c2dd093e1a71642de35 Binary files /dev/null and b/content/zh/post/naihuangbao/media/55fb1c507eb8ed2c6c3e2c7b24dc395c.png differ diff --git a/content/zh/post/naihuangbao/media/573439cd2dd212f49e45e1c00727ad33.png b/content/zh/post/naihuangbao/media/573439cd2dd212f49e45e1c00727ad33.png new file mode 100644 index 0000000000000000000000000000000000000000..458e05b8c63d7d957c0c6b3879959d4d7f2be9c0 Binary files /dev/null and b/content/zh/post/naihuangbao/media/573439cd2dd212f49e45e1c00727ad33.png differ diff --git a/content/zh/post/naihuangbao/media/57db252ca95f64000b310b64f6dd5233.png b/content/zh/post/naihuangbao/media/57db252ca95f64000b310b64f6dd5233.png new file mode 100644 index 0000000000000000000000000000000000000000..14e7c5413cb1a83100718919ed37d9e46d08c980 Binary files /dev/null and b/content/zh/post/naihuangbao/media/57db252ca95f64000b310b64f6dd5233.png differ diff --git a/content/zh/post/naihuangbao/media/5b76ba4623ec0414045628d2a2236702.png b/content/zh/post/naihuangbao/media/5b76ba4623ec0414045628d2a2236702.png new file mode 100644 index 0000000000000000000000000000000000000000..01b86dd02298181d1893979fcf920d93cc7d41eb Binary files /dev/null and b/content/zh/post/naihuangbao/media/5b76ba4623ec0414045628d2a2236702.png differ diff --git a/content/zh/post/naihuangbao/media/5ca3fafa21b6a0800dbc8caf7deab1a2.png b/content/zh/post/naihuangbao/media/5ca3fafa21b6a0800dbc8caf7deab1a2.png new file mode 100644 index 0000000000000000000000000000000000000000..af7df8ee93a1d922775be4382370721c43b9255d Binary files /dev/null and b/content/zh/post/naihuangbao/media/5ca3fafa21b6a0800dbc8caf7deab1a2.png differ diff --git a/content/zh/post/naihuangbao/media/5dde303a2198ba483ee494f6e3eafd1e.png b/content/zh/post/naihuangbao/media/5dde303a2198ba483ee494f6e3eafd1e.png new file mode 100644 index 0000000000000000000000000000000000000000..fe532f2a09cdc9822efd79797f4eacdccd1a22f8 Binary files /dev/null and b/content/zh/post/naihuangbao/media/5dde303a2198ba483ee494f6e3eafd1e.png differ diff --git a/content/zh/post/naihuangbao/media/5fee0259a5f435622683f961dbfb054c.png b/content/zh/post/naihuangbao/media/5fee0259a5f435622683f961dbfb054c.png new file mode 100644 index 0000000000000000000000000000000000000000..0e24d5f980f1111558c30c4e7cf2de07594033fc Binary files /dev/null and b/content/zh/post/naihuangbao/media/5fee0259a5f435622683f961dbfb054c.png differ diff --git a/content/zh/post/naihuangbao/media/607967224d9ccc1e895401f2274f1921.png b/content/zh/post/naihuangbao/media/607967224d9ccc1e895401f2274f1921.png new file mode 100644 index 0000000000000000000000000000000000000000..4521b825ba7cc0b496dbcce8aeaf2494d0aecf08 Binary files /dev/null and b/content/zh/post/naihuangbao/media/607967224d9ccc1e895401f2274f1921.png differ diff --git a/content/zh/post/naihuangbao/media/6208e91d82f875d878fe90212891badf.png b/content/zh/post/naihuangbao/media/6208e91d82f875d878fe90212891badf.png new file mode 100644 index 0000000000000000000000000000000000000000..974cf5e3bc1f149e7c1f874356d98e7719c067c9 Binary files /dev/null and b/content/zh/post/naihuangbao/media/6208e91d82f875d878fe90212891badf.png differ diff --git a/content/zh/post/naihuangbao/media/658b1b25e68e10ceb2a5d08bc9c18958.png b/content/zh/post/naihuangbao/media/658b1b25e68e10ceb2a5d08bc9c18958.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae687053950576eecb73aeb1b612b03fb28a867 Binary files /dev/null and b/content/zh/post/naihuangbao/media/658b1b25e68e10ceb2a5d08bc9c18958.png differ diff --git a/content/zh/post/naihuangbao/media/67912998ba116eee7fafe104e56ef39f.png b/content/zh/post/naihuangbao/media/67912998ba116eee7fafe104e56ef39f.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd144643289da1e2eb658b1bc434ddfb63b8999 Binary files /dev/null and b/content/zh/post/naihuangbao/media/67912998ba116eee7fafe104e56ef39f.png differ diff --git a/content/zh/post/naihuangbao/media/68dee29cd1a5d5d6baf50c4e6125ff5c.png b/content/zh/post/naihuangbao/media/68dee29cd1a5d5d6baf50c4e6125ff5c.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c48b0cff5c274710be365befa06e21c3758582 Binary files /dev/null and b/content/zh/post/naihuangbao/media/68dee29cd1a5d5d6baf50c4e6125ff5c.png differ diff --git a/content/zh/post/naihuangbao/media/693832ccc67cf1518da00d0f9fbfbe6d.png b/content/zh/post/naihuangbao/media/693832ccc67cf1518da00d0f9fbfbe6d.png new file mode 100644 index 0000000000000000000000000000000000000000..8463fedf822596f20eea5350f004e19beee32f8e Binary files /dev/null and b/content/zh/post/naihuangbao/media/693832ccc67cf1518da00d0f9fbfbe6d.png differ diff --git a/content/zh/post/naihuangbao/media/6c062992fdeaaf6032fdb25a84ccde3c.png b/content/zh/post/naihuangbao/media/6c062992fdeaaf6032fdb25a84ccde3c.png new file mode 100644 index 0000000000000000000000000000000000000000..d952e50bb7187aa362eabd9d52234857fe9cbc9c Binary files /dev/null and b/content/zh/post/naihuangbao/media/6c062992fdeaaf6032fdb25a84ccde3c.png differ diff --git a/content/zh/post/naihuangbao/media/6e0c53d3a5d4ee12c4a5f04ee7c595dc.png b/content/zh/post/naihuangbao/media/6e0c53d3a5d4ee12c4a5f04ee7c595dc.png new file mode 100644 index 0000000000000000000000000000000000000000..f2022f6ebc7f35ebd481c53e268051c99da827e2 Binary files /dev/null and b/content/zh/post/naihuangbao/media/6e0c53d3a5d4ee12c4a5f04ee7c595dc.png differ diff --git a/content/zh/post/naihuangbao/media/714ccd06e3ca4e77feefc1a3f46ca85c.png b/content/zh/post/naihuangbao/media/714ccd06e3ca4e77feefc1a3f46ca85c.png new file mode 100644 index 0000000000000000000000000000000000000000..8df130e9d3ac32feb650c4257a827e9f456bc78b Binary files /dev/null and b/content/zh/post/naihuangbao/media/714ccd06e3ca4e77feefc1a3f46ca85c.png differ diff --git a/content/zh/post/naihuangbao/media/71f8236dcdcffeea531cc3b3093e993a.png b/content/zh/post/naihuangbao/media/71f8236dcdcffeea531cc3b3093e993a.png new file mode 100644 index 0000000000000000000000000000000000000000..b11cd7254fa4ad47b9dca50eda9243ff80b2788f Binary files /dev/null and b/content/zh/post/naihuangbao/media/71f8236dcdcffeea531cc3b3093e993a.png differ diff --git a/content/zh/post/naihuangbao/media/73dcf63d5f129f51a0bd53460ec857d3.png b/content/zh/post/naihuangbao/media/73dcf63d5f129f51a0bd53460ec857d3.png new file mode 100644 index 0000000000000000000000000000000000000000..7415f49089849e85c7828eb18f98e015c437ef9d Binary files /dev/null and b/content/zh/post/naihuangbao/media/73dcf63d5f129f51a0bd53460ec857d3.png differ diff --git a/content/zh/post/naihuangbao/media/748460cf35b44c91e6972a13d30cc52c.png b/content/zh/post/naihuangbao/media/748460cf35b44c91e6972a13d30cc52c.png new file mode 100644 index 0000000000000000000000000000000000000000..f5cec088ac864f6a3c2e5cbd136f7c7316c4bf13 Binary files /dev/null and b/content/zh/post/naihuangbao/media/748460cf35b44c91e6972a13d30cc52c.png differ diff --git a/content/zh/post/naihuangbao/media/75ed5fa711021ee94adfc31711f2fbdf.png b/content/zh/post/naihuangbao/media/75ed5fa711021ee94adfc31711f2fbdf.png new file mode 100644 index 0000000000000000000000000000000000000000..7a4ee247c6039199581a3f5242e7f5790787e508 Binary files /dev/null and b/content/zh/post/naihuangbao/media/75ed5fa711021ee94adfc31711f2fbdf.png differ diff --git a/content/zh/post/naihuangbao/media/7739e1483ff6daedb7780a2af72b9f83.png b/content/zh/post/naihuangbao/media/7739e1483ff6daedb7780a2af72b9f83.png new file mode 100644 index 0000000000000000000000000000000000000000..f5e553e3a4da6424258e6ccb651cc90f9383acab Binary files /dev/null and b/content/zh/post/naihuangbao/media/7739e1483ff6daedb7780a2af72b9f83.png differ diff --git a/content/zh/post/naihuangbao/media/79bc6c1e46f7262d5d58c3275955fa55.png b/content/zh/post/naihuangbao/media/79bc6c1e46f7262d5d58c3275955fa55.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b254583791525400ee329fb864104ca4f5fb86 Binary files /dev/null and b/content/zh/post/naihuangbao/media/79bc6c1e46f7262d5d58c3275955fa55.png differ diff --git a/content/zh/post/naihuangbao/media/7b1a80280a1933b1ab71fcf5484a5503.png b/content/zh/post/naihuangbao/media/7b1a80280a1933b1ab71fcf5484a5503.png new file mode 100644 index 0000000000000000000000000000000000000000..3a72fcca54cebcdb5ad1eef442a97dbc455d243d Binary files /dev/null and b/content/zh/post/naihuangbao/media/7b1a80280a1933b1ab71fcf5484a5503.png differ diff --git a/content/zh/post/naihuangbao/media/7b32ccd0e5d6e3bf965f9f45de53a9ea.png b/content/zh/post/naihuangbao/media/7b32ccd0e5d6e3bf965f9f45de53a9ea.png new file mode 100644 index 0000000000000000000000000000000000000000..788b226b8363f358f100293b12f0e0b69940b0b5 Binary files /dev/null and b/content/zh/post/naihuangbao/media/7b32ccd0e5d6e3bf965f9f45de53a9ea.png differ diff --git a/content/zh/post/naihuangbao/media/7c5301654c32fdf3c11e655f04fb9c0d.png b/content/zh/post/naihuangbao/media/7c5301654c32fdf3c11e655f04fb9c0d.png new file mode 100644 index 0000000000000000000000000000000000000000..40073bdae20d44af9b2fa3f9d5f9179fd1fb351a Binary files /dev/null and b/content/zh/post/naihuangbao/media/7c5301654c32fdf3c11e655f04fb9c0d.png differ diff --git a/content/zh/post/naihuangbao/media/816db0083bad74c91fe36f2d525f0bd0.png b/content/zh/post/naihuangbao/media/816db0083bad74c91fe36f2d525f0bd0.png new file mode 100644 index 0000000000000000000000000000000000000000..0845222aa467c4846c58a8a45b59de7f6e6edf3b Binary files /dev/null and b/content/zh/post/naihuangbao/media/816db0083bad74c91fe36f2d525f0bd0.png differ diff --git a/content/zh/post/naihuangbao/media/83fbb985c5c5e654125bab67cf17b0d1.png b/content/zh/post/naihuangbao/media/83fbb985c5c5e654125bab67cf17b0d1.png new file mode 100644 index 0000000000000000000000000000000000000000..227c1b3097afc54b06abda9297e0b81aa35f9772 Binary files /dev/null and b/content/zh/post/naihuangbao/media/83fbb985c5c5e654125bab67cf17b0d1.png differ diff --git a/content/zh/post/naihuangbao/media/85c154b1b6184689925b26aa34026802.png b/content/zh/post/naihuangbao/media/85c154b1b6184689925b26aa34026802.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6e7bd2f4dfe9fc8766b90b2f5843e523ad9f29 Binary files /dev/null and b/content/zh/post/naihuangbao/media/85c154b1b6184689925b26aa34026802.png differ diff --git a/content/zh/post/naihuangbao/media/8a850b3053a6f7b93a97d8d501cc5f8c.png b/content/zh/post/naihuangbao/media/8a850b3053a6f7b93a97d8d501cc5f8c.png new file mode 100644 index 0000000000000000000000000000000000000000..792cd5785e0add91dd3eba2f45c4209cb7c35ef4 Binary files /dev/null and b/content/zh/post/naihuangbao/media/8a850b3053a6f7b93a97d8d501cc5f8c.png differ diff --git a/content/zh/post/naihuangbao/media/8ae4ed56cd4bed160c22762937ec6521.png b/content/zh/post/naihuangbao/media/8ae4ed56cd4bed160c22762937ec6521.png new file mode 100644 index 0000000000000000000000000000000000000000..15565b88a60ceba5b2826d178b89c1bdbed3e7f1 Binary files /dev/null and b/content/zh/post/naihuangbao/media/8ae4ed56cd4bed160c22762937ec6521.png differ diff --git a/content/zh/post/naihuangbao/media/8bd9044cac595860d5eeda3197da941f.png b/content/zh/post/naihuangbao/media/8bd9044cac595860d5eeda3197da941f.png new file mode 100644 index 0000000000000000000000000000000000000000..8be3f810d64713b06427d38fff98ea5f81718061 Binary files /dev/null and b/content/zh/post/naihuangbao/media/8bd9044cac595860d5eeda3197da941f.png differ diff --git a/content/zh/post/naihuangbao/media/8cf17d31a6daa695aacd8e03566a4e82.png b/content/zh/post/naihuangbao/media/8cf17d31a6daa695aacd8e03566a4e82.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6a3441fca621a3d0575ed8d06f997d3efd7ae5 Binary files /dev/null and b/content/zh/post/naihuangbao/media/8cf17d31a6daa695aacd8e03566a4e82.png differ diff --git a/content/zh/post/naihuangbao/media/8e6ad5b8badb02f2b39a210f2b068695.png b/content/zh/post/naihuangbao/media/8e6ad5b8badb02f2b39a210f2b068695.png new file mode 100644 index 0000000000000000000000000000000000000000..b504cba605dd8c69accf346a4dddb481ba03143b Binary files /dev/null and b/content/zh/post/naihuangbao/media/8e6ad5b8badb02f2b39a210f2b068695.png differ diff --git a/content/zh/post/naihuangbao/media/90201be3ef83bc968f65971ff1d987e3.png b/content/zh/post/naihuangbao/media/90201be3ef83bc968f65971ff1d987e3.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab84b5d02ce7b828ae482dd0ebd66583e7cf397 Binary files /dev/null and b/content/zh/post/naihuangbao/media/90201be3ef83bc968f65971ff1d987e3.png differ diff --git a/content/zh/post/naihuangbao/media/91deddc60b8626b63f70b92922d60814.png b/content/zh/post/naihuangbao/media/91deddc60b8626b63f70b92922d60814.png new file mode 100644 index 0000000000000000000000000000000000000000..9d243e38760005d962fbaa1d7beb9ade375b10aa Binary files /dev/null and b/content/zh/post/naihuangbao/media/91deddc60b8626b63f70b92922d60814.png differ diff --git a/content/zh/post/naihuangbao/media/94ec135904c90dc868e6ba71665fc5d5.png b/content/zh/post/naihuangbao/media/94ec135904c90dc868e6ba71665fc5d5.png new file mode 100644 index 0000000000000000000000000000000000000000..058964e150000195872a8e05a62d64cc29b2aeaf Binary files /dev/null and b/content/zh/post/naihuangbao/media/94ec135904c90dc868e6ba71665fc5d5.png differ diff --git a/content/zh/post/naihuangbao/media/99e66a0ebb2e68602ce681e2f46a04a8.png b/content/zh/post/naihuangbao/media/99e66a0ebb2e68602ce681e2f46a04a8.png new file mode 100644 index 0000000000000000000000000000000000000000..5df68970e8c6a1e736d9cb4e9a2ef8072ad2fa6e Binary files /dev/null and b/content/zh/post/naihuangbao/media/99e66a0ebb2e68602ce681e2f46a04a8.png differ diff --git a/content/zh/post/naihuangbao/media/9fe4f6f2aecc50b5c79bbaa0b936530c.png b/content/zh/post/naihuangbao/media/9fe4f6f2aecc50b5c79bbaa0b936530c.png new file mode 100644 index 0000000000000000000000000000000000000000..005e7231981060d40bb8f70a09a449be5543a1c2 Binary files /dev/null and b/content/zh/post/naihuangbao/media/9fe4f6f2aecc50b5c79bbaa0b936530c.png differ diff --git a/content/zh/post/naihuangbao/media/a11ee892c25df070f3718ed66cb5b345.png b/content/zh/post/naihuangbao/media/a11ee892c25df070f3718ed66cb5b345.png new file mode 100644 index 0000000000000000000000000000000000000000..2fefe7c2daf05f3714a8646b64c06d56381ed014 Binary files /dev/null and b/content/zh/post/naihuangbao/media/a11ee892c25df070f3718ed66cb5b345.png differ diff --git a/content/zh/post/naihuangbao/media/a226139ff19200426a9286e19c91ca5d.png b/content/zh/post/naihuangbao/media/a226139ff19200426a9286e19c91ca5d.png new file mode 100644 index 0000000000000000000000000000000000000000..f016a34a702508b683c112fe52bc00215c6d1927 Binary files /dev/null and b/content/zh/post/naihuangbao/media/a226139ff19200426a9286e19c91ca5d.png differ diff --git a/content/zh/post/naihuangbao/media/a493e448da3fcf1e7074b0f85255bfe6.png b/content/zh/post/naihuangbao/media/a493e448da3fcf1e7074b0f85255bfe6.png new file mode 100644 index 0000000000000000000000000000000000000000..0b427c7ee5c489546b27a847497eaddf364b25fa Binary files /dev/null and b/content/zh/post/naihuangbao/media/a493e448da3fcf1e7074b0f85255bfe6.png differ diff --git a/content/zh/post/naihuangbao/media/a578ceeb0ae3858c6ba4b4a11d5336a2.png b/content/zh/post/naihuangbao/media/a578ceeb0ae3858c6ba4b4a11d5336a2.png new file mode 100644 index 0000000000000000000000000000000000000000..5130b4d0f704790232e1f8bdbd0e25a1871d2b98 Binary files /dev/null and b/content/zh/post/naihuangbao/media/a578ceeb0ae3858c6ba4b4a11d5336a2.png differ diff --git a/content/zh/post/naihuangbao/media/a775118adcd48949fdde72b8aa0cd2b2.png b/content/zh/post/naihuangbao/media/a775118adcd48949fdde72b8aa0cd2b2.png new file mode 100644 index 0000000000000000000000000000000000000000..6ab154394e269e32ebf639a659971f0bbb28f0b7 Binary files /dev/null and b/content/zh/post/naihuangbao/media/a775118adcd48949fdde72b8aa0cd2b2.png differ diff --git a/content/zh/post/naihuangbao/media/a8c8668d424dad5240338bb6624db098.png b/content/zh/post/naihuangbao/media/a8c8668d424dad5240338bb6624db098.png new file mode 100644 index 0000000000000000000000000000000000000000..cda29f2b2589c3fd4276ec69335f06b422d01981 Binary files /dev/null and b/content/zh/post/naihuangbao/media/a8c8668d424dad5240338bb6624db098.png differ diff --git a/content/zh/post/naihuangbao/media/a9c40f250d496e92174ba95f103a4ffa.png b/content/zh/post/naihuangbao/media/a9c40f250d496e92174ba95f103a4ffa.png new file mode 100644 index 0000000000000000000000000000000000000000..18043c0a0e5d56d0d491456697d2b36624f4d14f Binary files /dev/null and b/content/zh/post/naihuangbao/media/a9c40f250d496e92174ba95f103a4ffa.png differ diff --git a/content/zh/post/naihuangbao/media/aa4a0bd807bd4f04ec2045460d497703.png b/content/zh/post/naihuangbao/media/aa4a0bd807bd4f04ec2045460d497703.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac81777ff5ed15cd7a873a35b4ceb6024210de7 Binary files /dev/null and b/content/zh/post/naihuangbao/media/aa4a0bd807bd4f04ec2045460d497703.png differ diff --git a/content/zh/post/naihuangbao/media/aadf72c767b8fb2ffe6230755af06f47.png b/content/zh/post/naihuangbao/media/aadf72c767b8fb2ffe6230755af06f47.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2971c2a0d2c4255004df91d71940272dcb837a Binary files /dev/null and b/content/zh/post/naihuangbao/media/aadf72c767b8fb2ffe6230755af06f47.png differ diff --git a/content/zh/post/naihuangbao/media/b2a4a091178411e8e47e4a5e32549856.png b/content/zh/post/naihuangbao/media/b2a4a091178411e8e47e4a5e32549856.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad16ca44bd27599c433e8ab64662ad3b37dcdac Binary files /dev/null and b/content/zh/post/naihuangbao/media/b2a4a091178411e8e47e4a5e32549856.png differ diff --git a/content/zh/post/naihuangbao/media/b57759f97df1f88d0c706bbfb071b15e.png b/content/zh/post/naihuangbao/media/b57759f97df1f88d0c706bbfb071b15e.png new file mode 100644 index 0000000000000000000000000000000000000000..f0508d1e6d639338d4b752a2768b6c3e1c49244d Binary files /dev/null and b/content/zh/post/naihuangbao/media/b57759f97df1f88d0c706bbfb071b15e.png differ diff --git a/content/zh/post/naihuangbao/media/b7c01246e014bd9a58177d9ed46e0297.png b/content/zh/post/naihuangbao/media/b7c01246e014bd9a58177d9ed46e0297.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b857b651227856cdbcbf0f00f9b2a0bb4de8c3 Binary files /dev/null and b/content/zh/post/naihuangbao/media/b7c01246e014bd9a58177d9ed46e0297.png differ diff --git a/content/zh/post/naihuangbao/media/b9696392b114808a943f48a3628401dd.png b/content/zh/post/naihuangbao/media/b9696392b114808a943f48a3628401dd.png new file mode 100644 index 0000000000000000000000000000000000000000..f7019c4b76a30745edb648f6f29ceb124670b6ef Binary files /dev/null and b/content/zh/post/naihuangbao/media/b9696392b114808a943f48a3628401dd.png differ diff --git a/content/zh/post/naihuangbao/media/bd9f8ada18aa41fec10339087c131939.png b/content/zh/post/naihuangbao/media/bd9f8ada18aa41fec10339087c131939.png new file mode 100644 index 0000000000000000000000000000000000000000..c130a57859fed8a6f83a60cb46338f22bd29b831 Binary files /dev/null and b/content/zh/post/naihuangbao/media/bd9f8ada18aa41fec10339087c131939.png differ diff --git a/content/zh/post/naihuangbao/media/bfff0b4f4089d5a6935cef73a90dd7ef.png b/content/zh/post/naihuangbao/media/bfff0b4f4089d5a6935cef73a90dd7ef.png new file mode 100644 index 0000000000000000000000000000000000000000..a3297939d9ce9020554c5652b48d1ec610c67933 Binary files /dev/null and b/content/zh/post/naihuangbao/media/bfff0b4f4089d5a6935cef73a90dd7ef.png differ diff --git a/content/zh/post/naihuangbao/media/c1c011146e117916bce41c61e22b23d5.png b/content/zh/post/naihuangbao/media/c1c011146e117916bce41c61e22b23d5.png new file mode 100644 index 0000000000000000000000000000000000000000..07e808852120f3eb9f3e3594d8b1da348f3e9bbc Binary files /dev/null and b/content/zh/post/naihuangbao/media/c1c011146e117916bce41c61e22b23d5.png differ diff --git a/content/zh/post/naihuangbao/media/c57f9f39084df22d7a8fcceaf6b57a13.png b/content/zh/post/naihuangbao/media/c57f9f39084df22d7a8fcceaf6b57a13.png new file mode 100644 index 0000000000000000000000000000000000000000..e22d21d17529ea197a754fb811db613a3be18f20 Binary files /dev/null and b/content/zh/post/naihuangbao/media/c57f9f39084df22d7a8fcceaf6b57a13.png differ diff --git a/content/zh/post/naihuangbao/media/c6716012a244978c13e29f9b1f78e534.png b/content/zh/post/naihuangbao/media/c6716012a244978c13e29f9b1f78e534.png new file mode 100644 index 0000000000000000000000000000000000000000..536f18e823f7c759de1d3dac5f0008a656d0191d Binary files /dev/null and b/content/zh/post/naihuangbao/media/c6716012a244978c13e29f9b1f78e534.png differ diff --git a/content/zh/post/naihuangbao/media/c7678f58106e79166b1abe2f2cb7ec7f.png b/content/zh/post/naihuangbao/media/c7678f58106e79166b1abe2f2cb7ec7f.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e72d5d717eaa9b69a451c963d39fa3251c7608 Binary files /dev/null and b/content/zh/post/naihuangbao/media/c7678f58106e79166b1abe2f2cb7ec7f.png differ diff --git a/content/zh/post/naihuangbao/media/c779a6fd9cc4bade480d02bee2cb703e.png b/content/zh/post/naihuangbao/media/c779a6fd9cc4bade480d02bee2cb703e.png new file mode 100644 index 0000000000000000000000000000000000000000..56f05dc32b4049329e61e35632f3ef5e5e8b39dc Binary files /dev/null and b/content/zh/post/naihuangbao/media/c779a6fd9cc4bade480d02bee2cb703e.png differ diff --git a/content/zh/post/naihuangbao/media/c81a122aea1d986a2b047014c7acbced.png b/content/zh/post/naihuangbao/media/c81a122aea1d986a2b047014c7acbced.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9cd734f4d1d4da4d19a1603d7c84869b13e18c Binary files /dev/null and b/content/zh/post/naihuangbao/media/c81a122aea1d986a2b047014c7acbced.png differ diff --git a/content/zh/post/naihuangbao/media/cb12fa721651b1ec95c347a1c8c410e5.png b/content/zh/post/naihuangbao/media/cb12fa721651b1ec95c347a1c8c410e5.png new file mode 100644 index 0000000000000000000000000000000000000000..29d5f52d907620e9c089c5d3cbf46aaebc6099c0 Binary files /dev/null and b/content/zh/post/naihuangbao/media/cb12fa721651b1ec95c347a1c8c410e5.png differ diff --git a/content/zh/post/naihuangbao/media/d7eb4fe3515057789dd04cfeb2722c4b.png b/content/zh/post/naihuangbao/media/d7eb4fe3515057789dd04cfeb2722c4b.png new file mode 100644 index 0000000000000000000000000000000000000000..19089875bc2a394643016b940d0c9b828fc3a33a Binary files /dev/null and b/content/zh/post/naihuangbao/media/d7eb4fe3515057789dd04cfeb2722c4b.png differ diff --git a/content/zh/post/naihuangbao/media/d925ba046e7ba14c0cc6222b72e6c429.png b/content/zh/post/naihuangbao/media/d925ba046e7ba14c0cc6222b72e6c429.png new file mode 100644 index 0000000000000000000000000000000000000000..d922b833fcb6c296c2adf2ef97e2a9bc71228b37 Binary files /dev/null and b/content/zh/post/naihuangbao/media/d925ba046e7ba14c0cc6222b72e6c429.png differ diff --git a/content/zh/post/naihuangbao/media/da87a64d39704737c415cb169dd72905.png b/content/zh/post/naihuangbao/media/da87a64d39704737c415cb169dd72905.png new file mode 100644 index 0000000000000000000000000000000000000000..a9797b1ad0c3ebe14ded94b755f797443abbfb67 Binary files /dev/null and b/content/zh/post/naihuangbao/media/da87a64d39704737c415cb169dd72905.png differ diff --git a/content/zh/post/naihuangbao/media/db0ea572c7be5d0e948c113d2d2ff084.png b/content/zh/post/naihuangbao/media/db0ea572c7be5d0e948c113d2d2ff084.png new file mode 100644 index 0000000000000000000000000000000000000000..f8778d7520908b4033bd641717514be6502ef106 Binary files /dev/null and b/content/zh/post/naihuangbao/media/db0ea572c7be5d0e948c113d2d2ff084.png differ diff --git a/content/zh/post/naihuangbao/media/db617c2863bf7d03d06fc565b305e89b.png b/content/zh/post/naihuangbao/media/db617c2863bf7d03d06fc565b305e89b.png new file mode 100644 index 0000000000000000000000000000000000000000..50af470e2b4937c7d4fad39cfee4421ef5a44b28 Binary files /dev/null and b/content/zh/post/naihuangbao/media/db617c2863bf7d03d06fc565b305e89b.png differ diff --git a/content/zh/post/naihuangbao/media/dc4876d484e763eeba5c0f2ea5805b57.png b/content/zh/post/naihuangbao/media/dc4876d484e763eeba5c0f2ea5805b57.png new file mode 100644 index 0000000000000000000000000000000000000000..2ecd587fe5d7eec54cd9066fb9cf4e6be26dce6a Binary files /dev/null and b/content/zh/post/naihuangbao/media/dc4876d484e763eeba5c0f2ea5805b57.png differ diff --git a/content/zh/post/naihuangbao/media/e5f4515a59055aa97711bc816791f739.png b/content/zh/post/naihuangbao/media/e5f4515a59055aa97711bc816791f739.png new file mode 100644 index 0000000000000000000000000000000000000000..4c58393ceca6ef348f29bd25c4931dc23633a071 Binary files /dev/null and b/content/zh/post/naihuangbao/media/e5f4515a59055aa97711bc816791f739.png differ diff --git a/content/zh/post/naihuangbao/media/e785f5af36180ec2368a7271699a76ed.png b/content/zh/post/naihuangbao/media/e785f5af36180ec2368a7271699a76ed.png new file mode 100644 index 0000000000000000000000000000000000000000..9d5025a6c907e0c42cbd95d076c639d048ac0567 Binary files /dev/null and b/content/zh/post/naihuangbao/media/e785f5af36180ec2368a7271699a76ed.png differ diff --git a/content/zh/post/naihuangbao/media/ea4126aafcb550cdb53fe0174485aa65.png b/content/zh/post/naihuangbao/media/ea4126aafcb550cdb53fe0174485aa65.png new file mode 100644 index 0000000000000000000000000000000000000000..64c8a171f541e1f05a8126ce2a2aaefaba52c84d Binary files /dev/null and b/content/zh/post/naihuangbao/media/ea4126aafcb550cdb53fe0174485aa65.png differ diff --git a/content/zh/post/naihuangbao/media/eace9ccdb9d6effc6531e9bc9b85637d.png b/content/zh/post/naihuangbao/media/eace9ccdb9d6effc6531e9bc9b85637d.png new file mode 100644 index 0000000000000000000000000000000000000000..c375cd73eb54ecacdd2e0b4040f7e076a0805b07 Binary files /dev/null and b/content/zh/post/naihuangbao/media/eace9ccdb9d6effc6531e9bc9b85637d.png differ diff --git a/content/zh/post/naihuangbao/media/ec3d88a793e2554a1948a6df59adbf65.png b/content/zh/post/naihuangbao/media/ec3d88a793e2554a1948a6df59adbf65.png new file mode 100644 index 0000000000000000000000000000000000000000..548cbc72db09741ca969c896b845074bee4374b2 Binary files /dev/null and b/content/zh/post/naihuangbao/media/ec3d88a793e2554a1948a6df59adbf65.png differ diff --git a/content/zh/post/naihuangbao/media/ec3f9990acc3550adb18a6161afd95b7.png b/content/zh/post/naihuangbao/media/ec3f9990acc3550adb18a6161afd95b7.png new file mode 100644 index 0000000000000000000000000000000000000000..201c3bd40d7952f2ede74a41e663533c89cab078 Binary files /dev/null and b/content/zh/post/naihuangbao/media/ec3f9990acc3550adb18a6161afd95b7.png differ diff --git a/content/zh/post/naihuangbao/media/ec8656384743610b3af14efada5debf0.png b/content/zh/post/naihuangbao/media/ec8656384743610b3af14efada5debf0.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9f166160068252dd02579b8dedcfaee136c5aa Binary files /dev/null and b/content/zh/post/naihuangbao/media/ec8656384743610b3af14efada5debf0.png differ diff --git a/content/zh/post/naihuangbao/media/ee1909b1a5f44db65083672a72613ef7.png b/content/zh/post/naihuangbao/media/ee1909b1a5f44db65083672a72613ef7.png new file mode 100644 index 0000000000000000000000000000000000000000..906f61ee9bc7046f039f3003f6c12e88977a412b Binary files /dev/null and b/content/zh/post/naihuangbao/media/ee1909b1a5f44db65083672a72613ef7.png differ diff --git a/content/zh/post/naihuangbao/media/fc0f362a4c2e20cb5b7b2288043765f4.png b/content/zh/post/naihuangbao/media/fc0f362a4c2e20cb5b7b2288043765f4.png new file mode 100644 index 0000000000000000000000000000000000000000..8960ec140b75a4fceade910489dc6d533577ad44 Binary files /dev/null and b/content/zh/post/naihuangbao/media/fc0f362a4c2e20cb5b7b2288043765f4.png differ