Constant GENERATE_RANJID_SQL
Source pub const GENERATE_RANJID_SQL: &str = "DO $install$\nDECLARE\n _sch text := COALESCE(current_schema(), \'public\');\nBEGIN\n EXECUTE format($sql$\nCREATE OR REPLACE FUNCTION generate_ranjids(\n in_node_id INTEGER,\n requested_count INTEGER,\n allow_spanning BOOLEAN DEFAULT true\n)\nRETURNS TABLE(id UUID)\nLANGUAGE plpgsql\nSET search_path = %I, pg_catalog\nAS $func$\nDECLARE\n epoch_us NUMERIC(30,0);\n epoch_offset NUMERIC(30,0);\n now_us NUMERIC(30,0);\n last_time NUMERIC(30,0);\n last_seq INTEGER;\n current_tick NUMERIC(30,0);\n next_seq INTEGER;\n remaining INTEGER;\n available_this_tick INTEGER;\n emit_count INTEGER;\n last_emitted_time NUMERIC(30,0);\n last_emitted_seq INTEGER;\n rollback_us NUMERIC(30,0);\n\n ts_high BIGINT;\n ts_mid BIGINT;\n ts_low BIGINT;\n hi BIGINT;\n lo BIGINT;\n precision_bits INTEGER := 0; -- microseconds (matches actual computation)\nBEGIN\n IF requested_count IS NULL OR requested_count <= 0 THEN\n RAISE EXCEPTION \'requested_count must be greater than zero\';\n END IF;\n\n IF in_node_id IS NULL OR in_node_id < 0 OR in_node_id > 32767 THEN\n RAISE EXCEPTION \'node_id %% is out of range for RanjId (0..32767)\', in_node_id;\n END IF;\n\n IF NOT EXISTS (\n SELECT 1 FROM heer_nodes WHERE node_id = in_node_id AND is_active = true\n ) THEN\n RAISE EXCEPTION \'node_id %% is not registered as an active Heer node\', in_node_id;\n END IF;\n\n SELECT FLOOR(EXTRACT(EPOCH FROM c.epoch) * 1000000)::NUMERIC(30,0),\n c.ranj_epoch_offset\n INTO epoch_us, epoch_offset\n FROM heer_config AS c\n WHERE c.id = 1;\n\n IF epoch_us IS NULL THEN\n RAISE EXCEPTION \'heer_config row id=1 must exist before generating IDs\';\n END IF;\n\n INSERT INTO heer_ranj_node_state (node_id)\n VALUES (in_node_id)\n ON CONFLICT (node_id) DO NOTHING;\n\n SELECT s.last_id_time, s.last_sequence\n INTO last_time, last_seq\n FROM heer_ranj_node_state AS s\n WHERE s.node_id = in_node_id\n FOR UPDATE;\n\n -- Calculate current time AFTER acquiring the lock to avoid false clock rollback\n -- under concurrency (another thread may have advanced last_id_time while we waited)\n -- current_tick = (now - epoch_timestamp) + ranj_epoch_offset\n -- The offset extends the epoch beyond TIMESTAMP range (e.g. Big Bang).\n -- When offset is 0 (default), this reduces to simple (now - epoch).\n now_us := FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000000)::NUMERIC(30,0)\n - epoch_us\n + epoch_offset;\n\n rollback_us := last_time - now_us;\n IF rollback_us > 0 THEN\n IF rollback_us < 2000 THEN\n RAISE EXCEPTION \'logical future drift for ranj node %% (%% us) \u{2014} likely batch-induced, check batch sizing\', in_node_id, rollback_us\n USING ERRCODE = \'50021\';\n ELSIF rollback_us < 50000 THEN\n RAISE EXCEPTION \'clock rollback detected for ranj node %% (%% us)\', in_node_id, rollback_us\n USING ERRCODE = \'50020\';\n ELSE\n RAISE EXCEPTION \'hard clock rollback detected for ranj node %% (%% us)\', in_node_id, rollback_us\n USING ERRCODE = \'50022\';\n END IF;\n END IF;\n\n current_tick := GREATEST(now_us, last_time);\n next_seq := CASE\n WHEN current_tick = last_time THEN last_seq + 1\n ELSE 0\n END;\n\n available_this_tick := 65536 - next_seq;\n IF NOT allow_spanning AND requested_count > available_this_tick THEN\n RAISE EXCEPTION\n \'requested %% IDs but only %% remain in microsecond %% for ranj node %%\',\n requested_count,\n available_this_tick,\n current_tick,\n in_node_id;\n END IF;\n\n remaining := requested_count;\n\n WHILE remaining > 0 LOOP\n available_this_tick := 65536 - next_seq;\n emit_count := LEAST(remaining, available_this_tick);\n\n IF current_tick > (2::NUMERIC ^ 89) - 1 THEN\n RAISE EXCEPTION \'RanjId timestamp %% exceeds 89-bit range (2^89 - 1)\', current_tick\n USING ERRCODE = \'50030\';\n END IF;\n\n -- Decompose the 89-bit NUMERIC timestamp using division/modulo\n -- so we never truncate at BIGINT\'s 2^63 limit. Each component\n -- fits safely in a BIGINT after extraction.\n -- Full range: 2^89 microseconds \u{2248} 19.62 billion years.\n ts_high := (floor(current_tick / (2::NUMERIC ^ 41)) %% (2::NUMERIC ^ 48))::BIGINT;\n ts_mid := (floor(current_tick / (2::NUMERIC ^ 29)) %% (2::NUMERIC ^ 12))::BIGINT;\n ts_low := (current_tick %% (2::NUMERIC ^ 29))::BIGINT;\n\n hi := (ts_high << 16)\n | (8::BIGINT << 12)\n | ts_mid;\n\n RETURN QUERY\n SELECT (\n lpad(to_hex(hi), 16, \'0\')\n || lpad(to_hex(\n ((-9223372036854775808)::BIGINT -- 0x8000000000000000 (sets variant bit 1)\n | (precision_bits::BIGINT << 60)\n | (ts_low << 31)\n | (in_node_id::BIGINT << 16)\n | seq.s::BIGINT)\n ), 16, \'0\')\n )::UUID AS id\n FROM generate_series(next_seq, next_seq + emit_count - 1) AS seq(s);\n\n last_emitted_time := current_tick;\n last_emitted_seq := next_seq + emit_count - 1;\n remaining := remaining - emit_count;\n current_tick := current_tick + 1;\n next_seq := 0;\n END LOOP;\n\n UPDATE heer_ranj_node_state\n SET last_id_time = last_emitted_time,\n last_sequence = last_emitted_seq,\n updated_at = CURRENT_TIMESTAMP\n WHERE node_id = in_node_id;\nEND;\n$func$;\n$sql$, _sch);\nEND;\n$install$;\n\nCREATE OR REPLACE FUNCTION generate_ranjids(\n requested_count INTEGER,\n allow_spanning BOOLEAN\n)\nRETURNS TABLE(id UUID)\nLANGUAGE sql\nAS $$\n SELECT id\n FROM generate_ranjids(current_heer_ranj_node_id(), requested_count, allow_spanning);\n$$;\n\nCREATE OR REPLACE FUNCTION generate_ranjids(requested_count INTEGER)\nRETURNS TABLE(id UUID)\nLANGUAGE sql\nAS $$\n SELECT id\n FROM generate_ranjids(current_heer_ranj_node_id(), requested_count, true);\n$$;\n\nCREATE OR REPLACE FUNCTION generate_ranjid(in_node_id INTEGER)\nRETURNS UUID\nLANGUAGE sql\nAS $$\n SELECT id\n FROM generate_ranjids(in_node_id, 1, true);\n$$;\n\nCREATE OR REPLACE FUNCTION generate_ranjid()\nRETURNS UUID\nLANGUAGE sql\nAS $$\n SELECT id\n FROM generate_ranjids(current_heer_ranj_node_id(), 1, true);\n$$;\n";