From: Alan T. DeKok Date: Thu, 28 Feb 2019 16:16:37 +0000 (-0500) Subject: move procedure to new file X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=09bc751043f1d4f40bcfd3a670bcb58db5afd8e2;p=thirdparty%2Ffreeradius-server.git move procedure to new file It's better to have a different file than to ask the admin to un-comment lots of code. --- diff --git a/raddb/mods-config/sql/ippool/postgresql/procedure.sql b/raddb/mods-config/sql/ippool/postgresql/procedure.sql new file mode 100644 index 00000000000..e68160d6d03 --- /dev/null +++ b/raddb/mods-config/sql/ippool/postgresql/procedure.sql @@ -0,0 +1,57 @@ +-- +-- Use the following indexes and function if using the stored procedure to +-- find the previously used address. +-- +-- You may wish to set the ORDER BY expiry_time to DESC for the first two +-- queries in order to assign the address that the user had most recently, +-- instead of assigning the oldest address the user had used. +-- + +CREATE INDEX radippool_pool_name ON radippool USING btree (pool_name); +CREATE INDEX radippool_username ON radippool USING btree (username); +CREATE INDEX radippool_callingstationid ON radippool USING btree (callingstationid); + +CREATE OR REPLACE FUNCTION find_previous_or_new_framedipaddress ( + v_pool_name VARCHAR(64), + v_username VARCHAR(64), + v_callingstationid VARCHAR(64) +) +RETURNS inet +LANGUAGE plpgsql +AS $$ +DECLARE + r_address inet; +BEGIN + SELECT framedipaddress INTO r_address + FROM radippool + WHERE radippool.pool_name = v_pool_name + AND radippool.expiry_time < 'now'::timestamp(0) + AND radippool.username = v_username + AND radippool.callingstationid = v_callingstationid + ORDER BY expiry_time + LIMIT 1 + FOR UPDATE SKIP LOCKED; + IF r_address <> NULL THEN + RETURN r_address; + END IF; + SELECT framedipaddress INTO r_address + FROM radippool + WHERE radippool.pool_name = v_pool_name + AND radippool.expiry_time < 'now'::timestamp(0) + AND radippool.username = v_username + ORDER BY expiry_time + LIMIT 1 + FOR UPDATE SKIP LOCKED; + IF r_address <> NULL THEN + RETURN r_address; + END IF; + SELECT framedipaddress INTO r_address + FROM radippool + WHERE radippool.pool_name = v_pool_name + AND radippool.expiry_time < 'now'::timestamp(0) + ORDER BY expiry_time + LIMIT 1 + FOR UPDATE SKIP LOCKED; + RETURN r_address; +END +$$; diff --git a/raddb/mods-config/sql/ippool/postgresql/queries.conf b/raddb/mods-config/sql/ippool/postgresql/queries.conf index fbf59f4cd09..560bdb4b053 100644 --- a/raddb/mods-config/sql/ippool/postgresql/queries.conf +++ b/raddb/mods-config/sql/ippool/postgresql/queries.conf @@ -29,7 +29,8 @@ allocate_find = "\ # # Use a stored procedure to find the address. This requires PostgreSQL >= 9.5 as -# SKIP LOCKED is used. +# SKIP LOCKED is used. See `procedure.sql` in this directory for the +# indices and stored procedure used by this query. # # allocate_find = "\ # SELECT find_previous_or_new_framedipaddress( \ diff --git a/raddb/mods-config/sql/ippool/postgresql/schema.sql b/raddb/mods-config/sql/ippool/postgresql/schema.sql index 66591725bed..37a3599d187 100644 --- a/raddb/mods-config/sql/ippool/postgresql/schema.sql +++ b/raddb/mods-config/sql/ippool/postgresql/schema.sql @@ -1,6 +1,9 @@ -- -- Table structure for table 'radippool' -- +-- See also "procedure.sql" in this directory for additional +-- indices and a stored procedure that is much faster. +-- CREATE TABLE radippool ( id BIGSERIAL PRIMARY KEY, @@ -17,62 +20,3 @@ CREATE TABLE radippool ( CREATE INDEX radippool_poolname_expire ON radippool USING btree (pool_name, expiry_time); CREATE INDEX radippool_framedipaddress ON radippool USING btree (framedipaddress); CREATE INDEX radippool_nasip_poolkey_ipaddress ON radippool USING btree (nasipaddress, pool_key, framedipaddress); - - --- --- Use the following indexes and function if using the stored procedure to --- find the previously used address. --- --- You may wish to set the ORDER BY expiry_time to DESC for the first two --- queries in order to assign the address that the user last had, rather --- than the oldest address the user had. --- - --- CREATE INDEX radippool_pool_name ON radippool USING btree (pool_name); --- CREATE INDEX radippool_username ON radippool USING btree (username); --- CREATE INDEX radippool_callingstationid ON radippool USING btree (callingstationid); - --- CREATE OR REPLACE FUNCTION find_previous_or_new_framedipaddress ( --- v_pool_name VARCHAR(64), --- v_username VARCHAR(64), --- v_callingstationid VARCHAR(64) --- ) --- RETURNS inet --- LANGUAGE plpgsql --- AS $$ --- DECLARE --- r_address inet; --- BEGIN --- SELECT framedipaddress INTO r_address --- FROM radippool --- WHERE radippool.pool_name = v_pool_name --- AND radippool.expiry_time < 'now'::timestamp(0) --- AND radippool.username = v_username --- AND radippool.callingstationid = v_callingstationid --- ORDER BY expiry_time --- LIMIT 1 --- FOR UPDATE SKIP LOCKED; --- IF r_address <> NULL THEN --- RETURN r_address; --- END IF; --- SELECT framedipaddress INTO r_address --- FROM radippool --- WHERE radippool.pool_name = v_pool_name --- AND radippool.expiry_time < 'now'::timestamp(0) --- AND radippool.username = v_username --- ORDER BY expiry_time --- LIMIT 1 --- FOR UPDATE SKIP LOCKED; --- IF r_address <> NULL THEN --- RETURN r_address; --- END IF; --- SELECT framedipaddress INTO r_address --- FROM radippool --- WHERE radippool.pool_name = v_pool_name --- AND radippool.expiry_time < 'now'::timestamp(0) --- ORDER BY expiry_time --- LIMIT 1 --- FOR UPDATE SKIP LOCKED; --- RETURN r_address; --- END --- $$;