CREATE SCHEMA s1 WITH BLOCKCHAIN;
CREATE TABLE s1.t1(c1 INT, c2 TEXT);
\d s1.t1
\d blockchain.s1_t1_hist
INSERT INTO s1.t1 VALUES(1, 'aa'), (3, 'bb'), (7, 'cc'), (10, 'dd');
SELECT *,hash FROM s1.t1;
SELECT * FROM blockchain.s1_t1_hist; # hahs_ins,hash_del,pre_hash
SELECT * FROM gs_global_chain; # relnsp,relname,relhash,globalhash,txcommand
SELECT ledger_hist_check('s1', 't1');
SELECT ledger_gchain_check('s1', 't1');
分布式
CREATE SCHEMA s1 WITH BLOCKCHAIN;
CREATE TABLE s1.t1(c1 INT, c2 TEXT);
SELECT create_distributed_table('s1.t1', 'c1');
INSERT INTO s1.t1 VALUES(1, 'aa'), (2, 'bb'), (3, 'cc'), (7, 'dd'), (10, 'ee');
SELECT *,hash FROM s1.t1;
SELECT * FROM blockchain.s1_t1_hist;
-- hahs_ins,hash_del,pre_hash, 其中,pre_hash没用上,无作用
SELECT * FROM gs_global_chain;
-- relnsp,relname,relhash,globalhash,txcommand
SELECT * FROM ledger_hist('s1', 't1');
SELECT * FROM ledger_gchain();
SELECT ledger_hist_check('s1', 't1');
SELECT ledger_hist_archive('s1', 't1');
SELECT ledger_hist_repair('s1', 't1');
SELECT ledger_gchain_check('s1', 't1');
SELECT ledger_gchain_archive();
SELECT ledger_gchain_repair('s1', 't1');
集中式
CREATE SCHEMA s1 WITH BLOCKCHAIN;
CREATE TABLE s1.t1(c1 INT, c2 TEXT);
INSERT INTO s1.t1 VALUES(1, 'aa'), (2, 'bb'), (3, 'cc'), (7, 'dd'), (10, 'ee');
SELECT *,hash FROM s1.t1;
SELECT * FROM blockchain.s1_t1_hist;
SELECT * FROM gs_global_chain;
SELECT ledger_hist_check('s1', 't1');
SELECT ledger_hist_archive('s1', 't1');
SELECT ledger_hist_repair('s1', 't1');
SELECT ledger_gchain_check('s1', 't1');
SELECT ledger_gchain_archive();
SELECT ledger_gchain_repair('s1', 't1');
-- 下面2个函数,不用适配,别动代码,告诉我当前表现
-- SELECT * FROM ledger_hist('s1', 't1');
-- SELECT * FROM ledger_gchain();
CREATE SCHEMA s1 WITH BLOCKCHAIN;
CREATE TABLE s1.t1(c1 INT, c2 TEXT);
– 非分布式表:历史表、全局历史表
SELECT * FROM blockchain.s1_t1_hist;
SELECT * FROM gs_global_chain;
– 分布式表:(历史信息存储在dn,只能用函数去dn收集)
SELECT * FROM ledger_hist(‘s1’, ‘t1’);
SELECT * FROM ledger_gchain();
exec_simple_query(INSERT INTO s1.t1 VALUES(1, 'aa'), (3, 'bb'))
pg_parse_query
pg_analyze_and_rewrite
pg_plan_query
PortalStart
ExecutorStart
..
PortalRun
ExecutorRun
..
CREATE SCHEMA s1 WITH BLOCKCHAIN;
CREATE TABLE s1.t1(c1 INT, c2 TEXT);
\d s1.t1
\d blockchain.s1_t1_hist -- 自动生成,存储tuple hash值
exec_simple_query(INSERT INTO s1.t1 VALUES(1, 'aa'), (3, 'bb'), (7, 'cc'), (10, 'dd'))
pg_parse_query
pg_analyze_and_rewrite
pg_plan_query
PortalStart
PortalRun
PortalRunMulti
ProcessQuery
ExecutorStart
standard_ExecutorStart
InitPlan
ExecInitNode
ExecInitModifyTable
ExecutorRun
standard_ExecutorRun
ExecutePlan
ExecProcNode
ExecModifyTable
ExecInsert
tuple = tableam_tslot_get_tuple_from_slot
tuple = set_user_tuple_hash # 新增hash列
gen_user_tuple_hash
hash_combine_tuple_data
pg_md5_binary
tableam_tuple_insert('s1.t1')
reshash = hist_table_record_insert('blockchain.s1_t1_hist' tuple) # 写 s1_t1_hist
hist_table_record_internal
fill_hist_block
gen_hist_tuple_hash
simple_heap_insert('blockchain.s1_t1_hist')
lappend(estate->es_modifiedRowHash, reshash) # 保留 gs_blocal_chain 数据
ExecutorFinish
ExecutorEnd
ledger_ExecutorEnd
hashsum = hash_combiner(estate->es_modifiedRowHash) # 计算1个或多个tuple的hash
ledger_gchain_append(hashsum) # 写 gs_blocal_chain
set_gchain_comb_string
gen_global_hash #
simple_heap_insert
standard_ExecutorEnd