lookup. Lookups of this type are conditional expansion items. Different results
can be defined for the cases of lookup success and failure. See chapter
&<<CHAPexpand>>&, where string expansions are described in detail.
-The key for the lookup is specified as part of the string expansion.
+The key for the lookup is &*specified*& as part of the string expansion.
.next
Lists of domains, hosts, and email addresses can contain lookup requests as a
way of avoiding excessively long linear lists. In this case, the data that is
returned by the lookup is often (but not always) discarded; whether the lookup
succeeds or fails is what really counts. These kinds of list are described in
chapter &<<CHAPdomhosaddlists>>&.
-The key for the lookup is given by the context in which the list is expanded.
+The key for the lookup is &*implicit*&,
+given by the context in which the list is expanded.
.endlist
String expansions, lists, and lookups interact with each other in such a way
In the second example, the lookup is a single item in a domain list. It causes
Exim to use a lookup to see if the domain that is being processed can be found
-in the file. The file could contains lines like this:
+in the file.
+The file could contains lines like this:
.code
domain1:
domain2:
.cindex "sqlite lookup type"
.cindex "lookup" "sqlite"
&(sqlite)&: The format of the query is
-new
-an optional filename
-followed by an SQL statement
-that is passed to an SQLite database. See section &<<SECTsqlite>>&.
+an SQL statement that is passed to an SQLite database. See section &<<SECTsqlite>>&.
.next
&(testdb)&: This is a lookup type that is used for testing Exim. It is
addition to the SQL query. An SQLite database is a single file, and there is no
daemon as in the other SQL databases.
+.new
.oindex &%sqlite_dbfile%&
-The preferred way of specifying the file is by using the
-&%sqlite_dbfile%& option, set to
-an absolute path.
+There are two ways of
+specifying the file.
+The first is is by using the &%sqlite_dbfile%& main option.
+The second, which allows separate files for each query,
+is to use an option appended, comma-separated, to the &"sqlite"&
+lookup type word. The option is the word &"file"&, then an equals,
+then the filename.
+The filename in this case cannot contain whitespace or open-brace charachters.
+.wen
+
A deprecated method is available, prefixing the query with the filename
separated by white space.
-This means that the path name cannot contain white space.
+This means that
.cindex "tainted data" "sqlite file"
-It also means that the query cannot use any tainted values, as that taints
+the query cannot use any tainted values, as that taints
the entire query including the filename - resulting in a refusal to open
the file.
+In all the above cases the filename must be an absolute path.
+
Here is a lookup expansion example:
.code
sqlite_dbfile = /some/thing/sqlitedb
.vitem "&*${lookup{*&<&'key'&>&*}&~*&<&'search&~type'&>&*&~&&&
- {*&<&'file'&>&*}&~{*&<&'string1'&>&*}&~{*&<&'string2'&>&*}}*&"
-This is the first of one of two different types of lookup item, which are both
-described in the next item.
-
-.vitem "&*${lookup&~*&<&'search&~type'&>&*&~{*&<&'query'&>&*}&~&&&
+ {*&<&'file'&>&*}&~{*&<&'string1'&>&*}&~{*&<&'string2'&>&*}}*&" &&&
+ "&*${lookup&~*&<&'search&~type'&>&*&~{*&<&'query'&>&*}&~&&&
{*&<&'string1'&>&*}&~{*&<&'string2'&>&*}}*&"
.cindex "expansion" "lookup in"
.cindex "file" "lookups"
dropping to exim gid; retaining priv uid
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- key="select name from them where id='userx';" partial=-1 affix=NULL starflags=0 opts=NULL
+ key="select name from them where id='userx';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
LRU list:
internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- type=sqlite key="select name from them where id='userx';" opts=NULL
+ type=sqlite key="select name from them where id='userx';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
file lookup required for select name from them where id='userx';
in TESTSUITE/aux-fixed/sqlitedb
creating new cache entry
LRU list:
internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
type=sqlite key="select name from them where id='userx';" opts=NULL
+ cached data found but wrong opts; file lookup required for select name from them where id='userx';
+ c in TESTSUITE/aux-fixed/sqlitedb
+ replacing old cache entry
+ lookup yielded: Ayen Other
+ search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
+ cached open
+ search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+ key="select name from them where id='userx';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
+ LRU list:
+ internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+ type=sqlite key="select name from them where id='userx';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
+ cached data found but wrong opts; file lookup required for select name from them where id='userx';
+ c in TESTSUITE/aux-fixed/sqlitedb
+ replacing old cache entry
+ lookup yielded: Ayen Other
+ search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
+ cached open
+ search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+ key="select name from them where id='userx';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
+ LRU list:
+ internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+ type=sqlite key="select name from them where id='userx';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
cached data used for lookup of select name from them where id='userx';
in TESTSUITE/aux-fixed/sqlitedb
lookup yielded: Ayen Other
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
cached open
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- key="select name from them where id='xxxx';" partial=-1 affix=NULL starflags=0 opts=NULL
+ key="select name from them where id='xxxx';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
LRU list:
internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- type=sqlite key="select name from them where id='xxxx';" opts=NULL
+ type=sqlite key="select name from them where id='xxxx';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
file lookup required for select name from them where id='xxxx';
in TESTSUITE/aux-fixed/sqlitedb
lookup forced cache cleanup
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
cached open
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- key="select name from them where id='nothing';" partial=-1 affix=NULL starflags=0 opts=NULL
+ key="select name from them where id='nothing';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
LRU list:
internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- type=sqlite key="select name from them where id='nothing';" opts=NULL
+ type=sqlite key="select name from them where id='nothing';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
file lookup required for select name from them where id='nothing';
in TESTSUITE/aux-fixed/sqlitedb
creating new cache entry
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
cached open
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- key="select id,name from them where id='nothing';" partial=-1 affix=NULL starflags=0 opts=NULL
+ key="select id,name from them where id='nothing';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
LRU list:
internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- type=sqlite key="select id,name from them where id='nothing';" opts=NULL
+ type=sqlite key="select id,name from them where id='nothing';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
file lookup required for select id,name from them where id='nothing';
in TESTSUITE/aux-fixed/sqlitedb
creating new cache entry
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
cached open
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- key="select * from them where id='quote2';" partial=-1 affix=NULL starflags=0 opts=NULL
+ key="select * from them where id='quote2';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
LRU list:
internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- type=sqlite key="select * from them where id='quote2';" opts=NULL
+ type=sqlite key="select * from them where id='quote2';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
file lookup required for select * from them where id='quote2';
in TESTSUITE/aux-fixed/sqlitedb
creating new cache entry
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
cached open
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- key="select * from them where id='newline';" partial=-1 affix=NULL starflags=0 opts=NULL
+ key="select * from them where id='newline';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
LRU list:
internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- type=sqlite key="select * from them where id='newline';" opts=NULL
+ type=sqlite key="select * from them where id='newline';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
file lookup required for select * from them where id='newline';
in TESTSUITE/aux-fixed/sqlitedb
creating new cache entry
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
cached open
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- key="select * from them where id='tab';" partial=-1 affix=NULL starflags=0 opts=NULL
+ key="select * from them where id='tab';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
LRU list:
internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- type=sqlite key="select * from them where id='tab';" opts=NULL
+ type=sqlite key="select * from them where id='tab';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
file lookup required for select * from them where id='tab';
in TESTSUITE/aux-fixed/sqlitedb
creating new cache entry
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
cached open
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- key="select * from them where id='its';" partial=-1 affix=NULL starflags=0 opts=NULL
+ key="select * from them where id='its';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
LRU list:
internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- type=sqlite key="select * from them where id='its';" opts=NULL
+ type=sqlite key="select * from them where id='its';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
file lookup required for select * from them where id='its';
in TESTSUITE/aux-fixed/sqlitedb
creating new cache entry
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
cached open
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- key="select * from them where name='it''s';" partial=-1 affix=NULL starflags=0 opts=NULL
+ key="select * from them where name='it''s';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
LRU list:
internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
- type=sqlite key="select * from them where name='it''s';" opts=NULL
+ type=sqlite key="select * from them where name='it''s';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
file lookup required for select * from them where name='it''s';
in TESTSUITE/aux-fixed/sqlitedb
creating new cache entry
SMTP>> 250 OK
SMTP<< rcpt to:<c@d>
using ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 26)
+processing "accept" (TESTSUITE/test-config 32)
+check domains = +local_domains
+d in "@"? no (end of list)
+d in "+local_domains"? no (end of list)
+accept: condition test failed in ACL "check_recipient"
+processing "accept" (TESTSUITE/test-config 33)
+check hosts = +relay_hosts
+search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
+search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+ key="select * from them where id='10.0.0.0'" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
+LRU list:
+internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+ type=sqlite key="select * from them where id='10.0.0.0'" opts="file=TESTSUITE/aux-fixed/sqlitedb"
+file lookup required for select * from them where id='10.0.0.0'
+ in TESTSUITE/aux-fixed/sqlitedb
+lookup forced cache cleanup
+lookup failed
+host in "sqlite,file=TESTSUITE/aux-fixed/sqlitedb; select * from them where id='10.0.0.0'"? no (end of list)
+host in "+relay_hosts"? no (end of list)
+accept: condition test failed in ACL "check_recipient"
+processing "deny" (TESTSUITE/test-config 34)
+ message: relay not permitted
+deny: condition test succeeded in ACL "check_recipient"
+end of ACL "check_recipient": DENY
+SMTP>> 550 relay not permitted
+LOG: MAIN REJECT
+ H=[10.0.0.0] F=<a@b> rejected RCPT <c@d>: relay not permitted
+SMTP<< rcpt to:<c@d>
+using ACL "check_recipient"
+processing "accept" (TESTSUITE/test-config 32)
+check domains = +local_domains
+d in "@"? no (end of list)
+d in "+local_domains"? no (end of list)
+accept: condition test failed in ACL "check_recipient"
+processing "accept" (TESTSUITE/test-config 33)
+check hosts = +relay_hosts
+search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
+ cached open
+search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+ key="select * from them where id='10.0.0.0'" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
+LRU list:
+internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+ type=sqlite key="select * from them where id='10.0.0.0'" opts="file=TESTSUITE/aux-fixed/sqlitedb"
+file lookup required for select * from them where id='10.0.0.0'
+ in TESTSUITE/aux-fixed/sqlitedb
+lookup forced cache cleanup
+lookup failed
+host in "sqlite,file=TESTSUITE/aux-fixed/sqlitedb; select * from them where id='10.0.0.0'"? no (end of list)
+host in "+relay_hosts"? no (end of list)
+accept: condition test failed in ACL "check_recipient"
+processing "deny" (TESTSUITE/test-config 34)
+ message: relay not permitted
+deny: condition test succeeded in ACL "check_recipient"
+end of ACL "check_recipient": DENY
+SMTP>> 550 relay not permitted
+LOG: MAIN REJECT
+ H=[10.0.0.0] F=<a@b> rejected RCPT <c@d>: relay not permitted
+SMTP<< quit
+SMTP>> 221 myhost.test.ex closing connection
+LOG: smtp_connection MAIN
+ SMTP connection from [10.0.0.0] closed by QUIT
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
+Exim version x.yz ....
+changed uid/gid: forcing real = effective
+ uid=uuuu gid=CALLER_GID pid=pppp
+configuration file is TESTSUITE/test-config
+admin user
+changed uid/gid: privilege not needed
+ uid=EXIM_UID gid=EXIM_GID pid=pppp
+seeking password data for user "CALLER": cache not available
+getpwnam() succeeded uid=CALLER_UID gid=CALLER_GID
+originator: uid=CALLER_UID gid=CALLER_GID login=CALLER name=CALLER_NAME
+sender address = CALLER@myhost.test.ex
+sender_fullhost = [10.0.0.0]
+sender_rcvhost = [10.0.0.0]
+host in hosts_connection_nolog? no (option unset)
+LOG: smtp_connection MAIN
+ SMTP connection from [10.0.0.0]
+host in host_lookup? no (option unset)
+set_process_info: pppp handling incoming connection from [10.0.0.0]
+host in host_reject_connection? no (option unset)
+host in sender_unqualified_hosts? no (option unset)
+host in recipient_unqualified_hosts? no (option unset)
+host in helo_verify_hosts? no (option unset)
+host in helo_try_verify_hosts? no (option unset)
+host in helo_accept_junk_hosts? no (option unset)
+SMTP>> 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+smtp_setup_msg entered
+SMTP<< mail from:<a@b>
+spool directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100 msg_size = 0
+log directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100
+SMTP>> 250 OK
+SMTP<< rcpt to:<c@d>
+using ACL "check_recipient"
+processing "accept" (TESTSUITE/test-config 32)
check domains = +local_domains
d in "@"? no (end of list)
d in "+local_domains"? no (end of list)
accept: condition test failed in ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 27)
+processing "accept" (TESTSUITE/test-config 33)
check hosts = +relay_hosts
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
host in "sqlite;TESTSUITE/aux-fixed/sqlitedb select * from them where id='10.0.0.0'"? no (end of list)
host in "+relay_hosts"? no (end of list)
accept: condition test failed in ACL "check_recipient"
-processing "deny" (TESTSUITE/test-config 28)
+processing "deny" (TESTSUITE/test-config 34)
message: relay not permitted
deny: condition test succeeded in ACL "check_recipient"
end of ACL "check_recipient": DENY
H=[10.0.0.0] F=<a@b> rejected RCPT <c@d>: relay not permitted
SMTP<< rcpt to:<c@d>
using ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 26)
+processing "accept" (TESTSUITE/test-config 32)
check domains = +local_domains
d in "@"? no (end of list)
d in "+local_domains"? no (end of list)
accept: condition test failed in ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 27)
+processing "accept" (TESTSUITE/test-config 33)
check hosts = +relay_hosts
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
cached open
host in "sqlite;TESTSUITE/aux-fixed/sqlitedb select * from them where id='10.0.0.0'"? no (end of list)
host in "+relay_hosts"? no (end of list)
accept: condition test failed in ACL "check_recipient"
-processing "deny" (TESTSUITE/test-config 28)
+processing "deny" (TESTSUITE/test-config 34)
message: relay not permitted
deny: condition test succeeded in ACL "check_recipient"
end of ACL "check_recipient": DENY
SMTP>> 250 OK
SMTP<< rcpt to:<c@d>
using ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 26)
+processing "accept" (TESTSUITE/test-config 32)
check domains = +local_domains
d in "@"? no (end of list)
d in "+local_domains"? no (end of list)
accept: condition test failed in ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 27)
+processing "accept" (TESTSUITE/test-config 33)
check hosts = +relay_hosts
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
search_find: file="TESTSUITE/aux-fixed/sqlitedb"
SMTP>> 250 Accepted
SMTP<< rcpt to:<c@d>
using ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 26)
+processing "accept" (TESTSUITE/test-config 32)
check domains = +local_domains
d in "@"? no (end of list)
d in "+local_domains"? no (end of list)
accept: condition test failed in ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 27)
+processing "accept" (TESTSUITE/test-config 33)
check hosts = +relay_hosts
search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
cached open
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
search_tidyup called
-exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-0005vi-00
+exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DOPT=y -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-0005vi-00
Exim version x.yz ....
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=pppp