一些背景知识。
我正在研究索引的展示案例。为了更深入地了解Postgres如何处理它们,我正在使用pageinspect
module。我的设置(在9.3.5
上)如下:
CREATE EXTENSION IF NOT EXISTS pageinspect;
DROP SCHEMA IF EXISTS pin;
CREATE SCHEMA pin;
SET search_path TO pin,public;
CREATE TABLE bat AS
SELECT id,
translate((random()*123456789)::text,'0987654321.','abcdefghijk') str
FROM generate_series(1, 10) id;
ALTER TABLE bat ADD CONSTRAINT p_bat PRIMARY KEY (id);
CREATE INDEX i_bat_str ON bat(str);
VACUUM ANALYZE bat;
现在我可以展示一些细节(元和唯一的叶页):
SELECT * FROM bt_metap('i_bat_str');
WITH pages AS (
SELECT relname, relpages, blkno
FROM pg_class ic, generate_series(1,relpages-1) s(blkno)
WHERE oid='pin.i_bat_str'::regclass
)
SELECT blkno,s.*
FROM pages, bt_page_items('pin.i_bat_str',blkno) s
WHERE blkno=1;
上次查询会生成一系列data
个值。我理解,first byte is a single-byte header,在我的情况下,它的最低位被设置,'因为我在x86_64
。
所以我的问题是 - 是否可以通过函数(或通过SQL)检查服务器字节顺序,而不需要编译额外的代码?我知道怎么用C做,但我想避免它。
答案 0 :(得分:4)
我可能会使用plperl或plpython。
例如:
CREATE OR REPLACE FUNCTION little_endian() RETURNS boolean LANGUAGE plperlu AS $$
use Config;
return $Config{byteorder} eq '1234' || $Config{byteorder} eq '12345678';
$$;
或:
CREATE OR REPLACE FUNCTION little_endian() RETURNS boolean LANGUAGE plpythonu AS $$
import sys
return sys.byteorder == "little"
$$;