Catching errors in SQL xlat queries

Alan DeKok aland at
Fri May 27 00:54:28 CEST 2016

On May 26, 2016, at 5:59 PM, Pshem Kowalczyk <pshem.k at> wrote:
> We have a setup where a main frontend  cluster (3.0.11) proxies requests to
> various remote radius servers.
> We validate and adjust responses from those serves to match the
> requirements of a particular BNGs the session is on (this is for a
> DSL/fibre setup). For example if the remote radius system wants the speed
> of the connection limited to a given number they reply with our own
> 'SV-Speed-Down' attribute and a value. We do some SQL lookups:


> update {
>        &control:Tmp-String-0 := "%{frontend_sql:SELECT prefix || '#' ||
> suffix FROM attrib_map, nas_type \
>                                                    WHERE
> nas_type.nasid='%{request:NAS-Identifier}' AND \
>                                                    attrib_map.nas_type =
> nas_type.type AND \
>                                                    attrib_map.attribute =
> 'SV-Speed-Down'}"
>    }
> in order to figure out the actual syntax required for the particular BNG.
> Then we use a regex to parse out the details:
> if (&control:Tmp-String-0 =~ /([a-z-]+)#[a-0-9]+)/) {

  Which is fine.

> Recently we had some issues with the DB running out of steam (and handles).
> We've noticed that this didn't stop the queries from running and returning
> empty results (and not matching the regex).

  If the DB fails, the string expansion is empty.  You can do fail-over in string expansions.  See raddb/radiusd.conf, the "instantiate" section.

> With the regular rlm_sql queries the module returns 'fail' if there was a
> problem with the database or 'notfound' if there was nothing to return. Is
> there a way to detect the 'fail' state with the xlat queries?

  The simplest thing is to check for an empty string:

	update {
		&control:Tmp-String-0 := "%{front...

	if ((&control:Tmp-String-0 != "") &&  (&control:Tmp-String-0 =~ /([a-z-]+)#[a-0-9]+)/)) {

  Alan DeKok.

More information about the Freeradius-Users mailing list