检测PostgreSQL集群的字节顺序

时间:2014-10-17 21:24:36

标签: postgresql endianness

一些背景知识。 我正在研究索引的展示案例。为了更深入地了解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做,但我想避免它。

1 个答案:

答案 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"
$$;