首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Postgresql源码分析

    Postgresql使用Plpgsql编译SELECT INTO细节

    PLpgSQL_row中。 PLpgSQL_row中记录了变量名字 和 变量在plpgsql_Datums数组中的位置。 /PLPGSQL_DTYPE_REC则直接组装一个PLpgSQL_variable,返回 -- > 如果不是上面两种,则read_into_scalar_list拼装一个 ) { *target = (PLpgSQL_variable *) yylval.wdatum.datum; plpgsql_push_back_token(tok); } 或PLPGSQL_DTYPE_REC,会直接使用plpgsql_Datums数组中的某一个变量结构。

    92910编辑于 2022-09-26
  • 来自专栏Postgresql源码分析

    Postgresql中plpgsql事务管理实例(commitrollback)

    与普通事务行为一致 drop table test1; create table test1(a int); CREATE PROCEDURE transaction_test1() LANGUAGE plpgsql 与普通事务行为一致 drop table test1; create table test1(a int); CREATE PROCEDURE transaction_test2() LANGUAGE plpgsql commit的数据存在 drop table test1; create table test1(a int); CREATE PROCEDURE transaction_test3() LANGUAGE plpgsql :数据全部回滚 drop table test1; create table test1(a int); CREATE PROCEDURE transaction_test4() LANGUAGE plpgsql drop table test1; create table test1(a int); CREATE PROCEDURE transaction_test51() LANGUAGE plpgsql

    2.7K50编辑于 2022-09-30
  • 来自专栏雨临Lewis的博客

    PostgreSQL - plpgsql的DO关键字

    update student set name = NEW_NAME where id = 10010; END $body$; lang_name 用来解析code的程序语言的名字,如果缺省,默认为plpgsql ,lang_name可以写在code前,也可以写在code后,即 1 DO code; 等效于下边的 1 DO LANGUAGE PLPGSQL code; 或者 1 DO code LANGUAGE PLPGSQL; 这里的code指的是代码块,也就是上边说的内容格式。 SET SIZES = SIZES_VALUE WHERE ID = MEASUREMENT_TEMPLATE.ID; END LOOP; END; $body$ LANGUAGE PLPGSQL

    1.6K20编辑于 2022-01-12
  • 来自专栏Postgresql源码分析

    Postgresql源码(49)plpgsql函数编译执行流程分析总结

    前文 《Postgresql源码(41)plpgsql函数编译执行流程分析》 《Postgresql源码(46)plpgsql中的变量类型及对应关系》 《Postgresql源码(49)plpgsql ; select sn(2, 3); 整体流程理解总结 src/pl/plpgsql下是plpgsql语言的功能模块。 plpgsql_build_variable // 【开始语法解析】plpgsql_yyparse下一章展开 parse_rc = plpgsql_yyparse() // 语法解析的所有语法块都串在 plpgsql_parse_result上 function->action = plpgsql_parse_result plpgsql_scanner_finish // 没有return return PLPGSQL_RC_OK;

    1.5K20编辑于 2022-05-25
  • 来自专栏宗恩

    OushuDB-PL 过程语言-二、PLpgSQL的结构

    FUNCTION populate() RETURNS integer AS $$ DECLARE -- 声明段 BEGIN PERFORM my_function(); END; $$ LANGUAGE plpgsql quantity; END; RAISE NOTICE 'Quantity here is %', quantity; RETURN quantity; END; $$ LANGUAGE plpgsql

    54710编辑于 2023-05-08
  • 来自专栏Postgresql源码分析

    Postgresql源码(53)plpgsql语法解析关键流程、函数分析

    相关 《Postgresql源码(41)plpgsql函数编译执行流程分析》 《Postgresql源码(46)plpgsql中的变量类型及对应关系》 《Postgresql源码(49)plpgsql plpgsql_parse_word/plpgsql_parse_dblword/plpgsql_parse_tripword 调用场景:一/二/三个单词的场景,在函数声明中总是返回T_WORD 功能: ,name2匹配var plpgsql_ns_lookup_label 相对于plpgsql_ns_lookup,该函数只扫label read_datatype 总结: 类型名会在plpgsql_yylex 3 plpgsql_parse_word/plpgsql_parse_dblword/plpgsql_parse_tripword 调用场景:一/二/三个单词的场景,在函数声明中总是返回T_WORD 功能 namespace chain * ---------- */ PLpgSQL_nsitem * plpgsql_ns_lookup_label(PLpgSQL_nsitem *ns_cur, const

    1.3K40编辑于 2022-06-12
  • 来自专栏Postgresql源码分析

    Postgresql源码(46)plpgsql中的变量类型及对应关系

    前文 《Postgresql源码(41)plpgsql函数编译执行流程分析》 《Postgresql源码(46)plpgsql中的变量类型及对应关系》 plpgsql中的变量类型及对应关系 (对应关系见下表中的PLPGSQL_DTYPE_VAR、PLPGSQL_DTYPE_REC) 2、后四种类型单独应用于3种特殊场景(类行数据、列数据、触发器数据) PLpgSQL_datum.dtype dtype就是PLpgSQL_datum_type类型 新增的plpgsql_Datums、ns_top p *((PLpgSQL_var*)plpgsql_Datums[3]) { PLPGSQL_DTYPE_VAR, PLPGSQL_DTYPE_ROW, PLPGSQL_DTYPE_REC, PLPGSQL_DTYPE_RECFIELD, PLPGSQL_DTYPE_PROMISE --<-------------------- (plpgsql_build_variable) PLPGSQL_DTYPE_VAR < PLPGSQL_TTYPE_SCALAR PLPGSQL_DTYPE_REC

    1.6K10编辑于 2022-05-18
  • 来自专栏Postgresql源码分析

    openGauss子事务管理分析(PLpgSQL中的异常子事务)

    2 PLpgSQL中实现检查点的困难 由于PG异常处理本身会启动子事务,就等于启动检查点了,那么如果在begin块中再执行savepoint,会把PG的异常检查点从 事务堆栈顶层 向下压一层, 那么如果异常没发生 _20221222_01 (a) VALUES (4); savepoint sp4; INSERT INTO t_plpgsql_transaction_20221222_01 (a) t_plpgsql_transaction_20221222_01; 结论:不会调整,会出现connectSubid=3 *u_sess->SPI_cxt. 5 复杂场景(有问题,不在测试) drop table if exists t_plpgsql_transaction_20221222_01; create table t_plpgsql_transaction p_outter(); select * from t_plpgsql_transaction_20221222_01; rollback to sp4; select * from t_plpgsql_transaction

    66820编辑于 2023-10-13
  • 来自专栏Postgresql源码分析

    Postgresql源码(77)plpgsql中参数传递和赋值

    编译完成变量: plpgsql_nDatums = 7 p *((PLpgSQL_var*)plpgsql_Datums[0]) { dtype = PLPGSQL_DTYPE_VAR, dno } p *((PLpgSQL_var*)plpgsql_Datums[1]) { dtype = PLPGSQL_DTYPE_VAR, dno = 1, refname = 0x29d8368 } p *((PLpgSQL_var*)plpgsql_Datums[2]) { dtype = PLPGSQL_DTYPE_VAR, dno = 2, refname = 0x29d8508 } p *((PLpgSQL_var*)plpgsql_Datums[3]) { dtype = PLPGSQL_DTYPE_VAR, dno = 3, refname = 0x29d86a8 } p *((PLpgSQL_var*)plpgsql_Datums[4]) { dtype = PLPGSQL_DTYPE_VAR, dno = 4, refname = 0x29d8848

    1.1K10编辑于 2022-09-26
  • 来自专栏Postgresql源码分析

    Postgresql源码(37)plpgsql函数编译执行流程分析

    全文总结 编译 1、编译过程主要是pl_gram.y做语法匹配的过程plpgsql_yyparse,整体匹配后的结果会作为PLpgSQL_stmt_block结构记录在plpgsql_parse_result 4、编译过程会记录变量值:数组plpgsql_Datums(数组个数plpgsql_nDatums),记录所有变量。 PLpgSQL_datum是下面这四个类型的小头 // : PLpgSQL_var PLpgSQL_rec // PLpgSQL_datum is the common supertype for PLpgSQL_var, : PLpgSQL_row PLpgSQL_recfield // PLpgSQL_row, : // PLpgSQL_rec, and PLpgSQL_recfield

    1.6K30编辑于 2022-05-12
  • 来自专栏Postgresql源码分析

    Postgresql使用plpgsql解析stmt_execsql子树过程

    make_execsql_stmt(K_INSERT, @1); } | T_WORD { int tok; tok = yylex(); plpgsql_push_back_token make_execsql_stmt(T_WORD, @1); } | T_CWORD { int tok; tok = yylex(); plpgsql_push_back_token | opt_stmt_label T_WORD { int tok; tok = yylex(); plpgsql_push_back_token

    34830编辑于 2022-05-12
  • 来自专栏宗恩

    OushuDB-PL 过程语言-PLpgSQL - SQL过程语言

    OushuDB兼容PostgreSQL,允许使用除了 SQL 和 C 之外的其他语言编写用户定义的函数。这些其他的 语言通常被称作过程语言(Procedural Language, PL)。对于一个用过程语言编写的函数,数据库服务 器没有关于如何解释该函数的源文本的内建知识。因此,这个任务被交给一个了解语言细节的特殊处理 器。该处理器能够自己处理所有的解析、语法分析、执行工作,或者它可以作为一种PostgreSQL和编程 语言既有实现之间的“粘合剂”。就像任何其他 C 函数一样,处理器本身是一个编译到共享对象并且按需 载入的 C 语言函数。 在OushuDB的标准发布中当前有四种过程语言可用: PL/pgSQL、 PL/Perl、 PL/Python以及 PL/Java, 其中PL/pgSQL是默认安装可用的。 另外还有其他过程语言可用,但是它们没有被包括在核心发布中, 如PL/R等,我们可以在第三方开源网站来获取它们的源码。 接下来我们主要看一下 PL/pgSQL - SQL过程语言。 PL/pgSQL - SQL过程语言 PL/pgSQL 是 PostgreSQL 数据库系统的一个可加载的过程语言,它的设计目标是创建一种可加载的过 程语言,可以: 用于创建函数和触发器过程 为 SQL 语言增加控制结构 执行复杂的计算 继承所有用户定义类型、函数、操作符 定义为被服务器信任的语言 容易使用 除了用于用户定义类型的输入/输出转换和计算函数以外,任何可以在 C 语言函数里定义的东西都可以在 PL/pgSQL 里使用。比如,可以创建复杂的条件计算函数,并随后将之用于定义操作符或者用于函数索 引中。 一、概述: PL/pgSQL函数在第一次被调用时,其函数内的源代码(文本)将被解析为二进制指令树,但是函数内的表 达式和SQL命令只有在首次用到它们的时候,PL/pgSQL解释器才会为其创建一个准备好的执行规划,随 后对该表达式或SQL命令的访问都将使用该规划。如果在一个条件语句中,有部分SQL命令或表达式没 有被用到,那么PL/pgSQL解释器在本次调用中将不会为其准备执行规划,这样的好处是可以有效地减少 为PL/pgSQL函数里的语句生成分析和执行规划的总时间,然而缺点是某些表达式或SQL命令中的错误只 有在其被执行到的时候才能发现。 由于PL/pgSQL在函数里为一个命令制定了执行计划,那么在本次会话中该计划将会被反复使用,这样做 往往可以得到更好的性能,但是如果你动态修改了相关的数据库对象,那么就有可能产生问题,如:

    1.1K10编辑于 2023-05-08
  • 来自专栏Postgresql源码分析

    Postgresql源码(41)plpgsql函数编译执行流程分析

    相关 《Postgresql源码(41)plpgsql函数编译执行流程分析》 《Postgresql源码(46)plpgsql中的变量类型及对应关系》 《Postgresql源码(49)plpgsql ,整体匹配后的结果会作为PLpgSQL_stmt_block结构记录在plpgsql_parse_result中。 PLpgSQL_datum是下面这四个类型的小头 // : PLpgSQL_var PLpgSQL_rec // PLpgSQL_datum is the common supertype for PLpgSQL_var, : PLpgSQL_row PLpgSQL_recfield // PLpgSQL_row, : // PLpgSQL_rec, and PLpgSQL_recfield

    1.4K20编辑于 2022-07-14
  • 来自专栏Hank’s Blog

    PostgreSQL报错:cannot beginend transactions in PLpgSQL解决方法

    语句后用了commit;语句,删除该语句,问题解决了 from: http://www.aiphere.com/postgresql-cannot-begin-end-transactions-in-plpgsql.html

    2.4K30发布于 2021-04-23
  • 来自专栏Greenplum

    PLpgSQL转换问题:如何处理冲突的变量

    create or replace function func1(seqno bigint, comments1 text ) returns setof testproc language plpgsql => \dconfig plpgsql.variable_conflict List of configuration parameters Parameter | create or replace function func1(seqno bigint, comments1 text ) returns setof testproc language plpgsql create or replace function func1(seqno bigint, comments1 text ) returns setof testproc language plpgsql 在某些情况下,您还可以在功能级别利用plpgsql.variable_conflict配置。

    19210编辑于 2025-11-17
  • 来自专栏Postgresql源码分析

    Postgresql中plpgsql数组的赋值与取值分析

    } $7 = {dtype = PLPGSQL_DTYPE_VAR, dno = 1, refname = 0x2b1f1c0 "arr", lineno = 3, isconst = false } $8 = {dtype = PLPGSQL_DTYPE_VAR, dno = 2, refname = 0x2b1fa40 "x", lineno = 4, isconst = false, 《Postgresql源码(79)plpgsql中多层调用时参数传递关键点分析(pl参数)》:问题五) 同样是走assign_simple_var统一赋值入口给arr赋值 exec_stmt_block ]", parseMode = RAW_PARSE_PLPGSQL_EXPR...} 第一步:make_datum_param 由datum: PLpgSQL_var = { dtype = PLPGSQL_DTYPE_VAR, dno = 1, refname = 0x2b13db0

    2.4K20编辑于 2022-10-28
  • 来自专栏Postgresql源码分析

    Postgresql源码(77)plpgsql中参数传递和赋值(pl参数)

    编译完成变量: plpgsql_nDatums = 7 p *((PLpgSQL_var*)plpgsql_Datums[0]) { dtype = PLPGSQL_DTYPE_VAR, dno } p *((PLpgSQL_var*)plpgsql_Datums[1]) { dtype = PLPGSQL_DTYPE_VAR, dno = 1, refname = 0x29d8368 } p *((PLpgSQL_var*)plpgsql_Datums[2]) { dtype = PLPGSQL_DTYPE_VAR, dno = 2, refname = 0x29d8508 } p *((PLpgSQL_var*)plpgsql_Datums[3]) { dtype = PLPGSQL_DTYPE_VAR, dno = 3, refname = 0x29d86a8 } p *((PLpgSQL_var*)plpgsql_Datums[4]) { dtype = PLPGSQL_DTYPE_VAR, dno = 4, refname = 0x29d8848

    1.6K20编辑于 2022-11-30
  • 来自专栏Postgresql源码分析

    Postgresql源码(103)PLpgSQL中的表达式ExprContext

    在SQL层的执行器中运行时状态使用EState记录,在PL中状态信息使用PLpgSQL_execstate结构记录。 /* * Runtime execution data */ typedef struct PLpgSQL_execstate { PLpgSQL_function *func; /* function ... } PLpgSQL_execstate; 在上述PLpgSQL_execstate结构中,为什么会出现EState呢,simple_eval_estate的作用是什么? 答案:表达式计算。 plpgsql_estate_setup 用于创建PL的运行时结构PLpgSQL_execstate 会主动使用EState(shared_simple_eval_estate)。 会调用plpgsql_create_econtext创建ExprContext。

    91520编辑于 2023-03-24
  • 来自专栏Postgresql源码分析

    Postgresql源码(119)PLpgSQL中ExprContext的生命周期

    前言 在PL/pgSQL语言中,执行任何SQL都需要通过SPI调用SQL层解析执行,例如在SQL层执行表达式的入口: static bool exec_eval_simple_expr(PLpgSQL_execstate *estate, PLpgSQL_expr *expr, Datum *result, bool *isNull, Oid *rettype, 数据角度看PL中的ExprContext 例如在三层函数调用下,会产生三层PLpgSQL_execstate结构,代表PL的运行时。 无论几层函数,每层的PLpgSQL_execstate都会公用一个EState,EState会申请上下文es_query_cxt挂在事务上下文下,随顶层事务释放。 注意这里有两类ExprContext 第一类是函数进入时就申请的,跟着plpgsql_estate_setup生成,这类ExprContext在整个调用流程结束时,会被plpgsql_exec_function

    36910编辑于 2023-12-30
  • 来自专栏Postgresql源码分析

    Postgresql中plpgsql异常处理方法与实例(RAISE EXCEPTION)

    Postgresql中有关plpgsql异常处理的一切(RAISE EXCEPTION) 1 抛出异常 主要列出实例,语法比较简单 语法 现在PL中支持使用RAISE语法抛出异常,具体支持下面五种语法

    5.5K31编辑于 2022-09-26
领券