Sqlite error or missing database

Zeoslib Portal This is the official forum of ZeosLib providing support to all ZeosLib users. SQLite 3 — «SQL logic error or missing database» SQLite 3 — «SQL logic error or missing database» Post by trob » 08.04.2014, 12:33 I use Zeos 7.1.2 with Delphi XE2 for reach my SQLite 3 database. I attach […]

Содержание

  1. Zeoslib Portal
  2. SQLite 3 — «SQL logic error or missing database»
  3. SQLite 3 — «SQL logic error or missing database»
  4. Re: SQLite 3 — «SQL logic error or missing database»
  5. Re: SQLite 3 — «SQL logic error or missing database»
  6. Re: SQLite 3 — «SQL logic error or missing database»
  7. Re: SQLite 3 — «SQL logic error or missing database»
  8. Re: SQLite 3 — «SQL logic error or missing database»
  9. Re: SQLite 3 — «SQL logic error or missing database»
  10. And statement sql logic error or missing database
  11. Answered by:
  12. Question
  13. Answers
  14. All replies
  15. Couldn’t process release.: SQL logic error or missing database. #1390
  16. Comments
  17. WHERE — IS NULL not working in SQLite?

Zeoslib Portal

This is the official forum of ZeosLib providing support to all ZeosLib users.

SQLite 3 — «SQL logic error or missing database»

SQLite 3 — «SQL logic error or missing database»

Post by trob » 08.04.2014, 12:33

I use Zeos 7.1.2 with Delphi XE2 for reach my SQLite 3 database.

I attach the database.

I use the following code on a ZQuery to update an exist table:

when the ExecSQL is fired.

Re: SQLite 3 — «SQL logic error or missing database»

Post by majlumbo » 08.04.2014, 14:28

Re: SQLite 3 — «SQL logic error or missing database»

Post by trob » 08.04.2014, 14:33

Oooooouuuuuuhhh. Now it works. Thank you.

But why is tablename not allowed to set by a parameter?

Re: SQLite 3 — «SQL logic error or missing database»

Post by trob » 08.04.2014, 14:55

One more question:

Why does «LIMIT 1» at the end of the upper statement (with corrected table name part) cause the same error?

Re: SQLite 3 — «SQL logic error or missing database»

Post by majlumbo » 08.04.2014, 17:15

Re: SQLite 3 — «SQL logic error or missing database»

Post by trob » 08.04.2014, 17:26

Re: SQLite 3 — «SQL logic error or missing database»

Post by majlumbo » 08.04.2014, 18:18

This option enables an optional ORDER BY and LIMIT clause on UPDATE and DELETE statements.

If this option is defined, then it must also be defined when using the ‘lemon’ tool to generate a parse.c file. Because of this, this option may only be used when the library is built from source, not from the amalgamation or from the collection of pre-packaged C files provided for non-Unix like platforms on the website.

so it all depends on whether you compiled the library with the proper define enabled.

Also, SQL is set based. If you have the proper indexes established on your data, then the engine is not continuing to «look» for any matching records. Looks like this option is used only to limit the number of records it will update/delete, not how many records it will find. Again, from the link provided:

If an UPDATE statement has a LIMIT clause, the maximum number of rows that will be updated is found by evaluating the accompanying expression and casting it to an integer value. A negative value is interpreted as «no limit».

If the LIMIT expression evaluates to non-negative value N and the UPDATE statement has an ORDER BY clause, then all rows that would be updated in the absence of the LIMIT clause are sorted according to the ORDER BY and the first N updated. If the UPDATE statement also has an OFFSET clause, then it is similarly evaluated and cast to an integer value. If the OFFSET expression evaluates to a non-negative value M, then the first M rows are skipped and the following N rows updated instead.

If the UPDATE statement has no ORDER BY clause, then all rows that would be updated in the absence of the LIMIT clause are assembled in an arbitrary order before applying the LIMIT and OFFSET clauses to determine which are actually updated.

The ORDER BY clause on an UPDATE statement is used only to determine which rows fall within the LIMIT. The order in which rows are modified is arbitrary and is not influenced by the ORDER BY clause.

Источник

And statement sql logic error or missing database

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

System.Data.SQLite.SQLiteException
HResult=0x80004005
Message=SQL logic error or missing database
near «=»: syntax error

I dont know what to do, this error getting up even though i tried adding parameters and so on.

Answers

Thank you for posting here.

According to your description, you want to solve the error that ’ System.Data.SQLite.SQLiteException’.

You could try the following code.

MSDN Community Support
Please remember to click «Mark as Answer» the responses that resolved your issue, and to click «Unmark as Answer» if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

Please consider using parameters (you seem to have said you tried them but not in the code above)

command.Parameters.AddWithValue works 99.99 percent of them time while the remainder use

command.Parameters.Add( new parameter object specifying the type.

Using string concatenation is bad in many ways starting with things like unescaped values generally strings, secondly its unsecure.

Please remember to mark the replies as answers if they help and unmarked them if they provide no help, this will help others who are looking for solutions to the same or similar problem. Contact via my Twitter (Karen Payne) or Facebook (Karen Payne) via my MSDN profile but will not answer coding question on either.

StackOverFlow

Источник

Couldn’t process release.: SQL logic error or missing database. #1390

Just updated to nightly 0.2.0.626 and seeing a lot of these:

Maybe it’s because of the fix for alternative titles but my queue was still filled quite a bit?
And I assume it’s related but the blue badge that on the Activity icon that normally (more or less) shows how much items are in the NZBget queue is a lot lower than normal. (450 in the queue and the badge shows 24)

The text was updated successfully, but these errors were encountered:

I’m getting the same thing, thought it was something on my end.

me 2, movies wont import

Got the same thing and I think it’s related to #555 , check at the bottom of the issue after the latest build. I took screenshot.

Can someone post the full exception? It’s going to be difficult to trace it otherwise.

[v0.2.0.626] System.Data.SQLite.SQLiteException (0x80004005): SQL logic error or missing database
near «WHERE»: syntax error
at System.Data.SQLite.SQLite3.Prepare (System.Data.SQLite.SQLiteConnection cnn, System.String strSql, System.Data.SQLite.SQLiteStatement previous, System.UInt32 timeoutMS, System.String& strRemain) [0x0033c] in :0
at System.Data.SQLite.SQLiteCommand.BuildNextCommand () [0x00068] in :0

17-4-15 12:05:38.7|Info|AcceptableSizeSpecification|[tt2547942][Starship: Rising] has no runtime information using median movie runtime of 110 minutes.
17-4-15 12:05:38.7|Info|AcceptableSizeSpecification|[tt2547942][Starship: Rising] has no runtime information using median movie runtime of 110 minutes.
17-4-15 12:05:38.7|Info|AcceptableSizeSpecification|[tt2547942][Starship: Rising] has no runtime information using median movie runtime of 110 minutes.
17-4-15 12:05:38.8|Info|AcceptableSizeSpecification|[tt2547942][Starship: Rising] has no runtime information using median movie runtime of 110 minutes.
17-4-15 12:05:38.8|Info|AcceptableSizeSpecification|[tt2547942][Starship: Rising] has no runtime information using median movie runtime of 110 minutes.
17-4-15 12:05:38.9|Info|AcceptableSizeSpecification|[tt2547942][Starship: Rising] has no runtime information using median movie runtime of 110 minutes.
17-4-15 12:05:38.9|Info|AcceptableSizeSpecification|[tt2547942][Starship: Rising] has no runtime information using median movie runtime of 110 minutes.
17-4-15 12:05:38.9|Info|AcceptableSizeSpecification|[tt2547942][Starship: Rising] has no runtime information using median movie runtime of 110 minutes.
17-4-15 12:05:39.0|Info|NzbSearchService|Searching 3 indexers for [Sultan]
17-4-15 12:05:39.6|Error|DownloadDecisionMaker|Couldn’t process release.

Источник

WHERE — IS NULL not working in SQLite?

Here’s a strange one:

I can filter on NOT NULLS from SQLite, but not NULLS :

This works:

These don’t:

There is a problem with the syntax of your query (Query was not executed) .

UPDATE:

I am doing this with PHP- through my code with ezSQl and using the PHPLiteAdmin interface

Using the PHPLiteAdmin demo, this expression works- so now I’m suspecting a version issue with my PHP’s SQLite? Could that be? Wasn’t this expression always valid?

UPDATE 2:

When I run the code from PHP using ezSQL, the PHP warning is:

PHP Warning: SQL logic error or missing database

Is there a way to get more information out of PHP? This is maddeningly opaque and weird, especially because the same statement in the CLI works fine.

UPDATE 3

The only other possible clue I have is that the databases that I create with PHP cannot be read by the CLI, and vice versa. I get:

Error: file is encrypted or is not a database

So there’s definitly two SQlite flavors butting heads here. (See this) Still, why the invalid statment??

UPDATE 4

OK I think I’ve traced the problem to the culprit, if not the reason- The DB I created with PHP ezSQL is the one where the IS NULL statement fails. If I create the DB using PHP’s SQLite3 class, the statement works fine, and moreover, I can access the DB from the CLI, whereas ezSQL created DB gave the file is encrypted error.

So I did a little digging into ezSQL code- Off the bat I see it uses PDO methods, not the newer SQLite3 class. Maybe that’s something- I’m not gonna waste further time on it.

In any case, I’ve found my solution, which is to steer clear of ezSQL, and just use PHPs SQLite3 class.

Источник

I’m trying to get requery + SQLite to work under Kotlin.

I don’t see any apparent issues with my models or the database setup.

Stacktrace:

INFO: beforeExecuteUpdate org.sqlite.jdbc4.JDBC4Statement@29176cc1 sql:
drop table if exists QueryItem 
Sep 06, 2018 1:49:41 PM io.requery.sql.LoggingListener afterExecuteUpdate
INFO: afterExecuteUpdate 0
Sep 06, 2018 1:49:41 PM io.requery.sql.LoggingListener beforeExecuteUpdate
INFO: beforeExecuteUpdate org.sqlite.jdbc4.JDBC4Statement@29176cc1 sql:
drop table if exists Beer 
Sep 06, 2018 1:49:41 PM io.requery.sql.LoggingListener afterExecuteUpdate
INFO: afterExecuteUpdate 0
Sep 06, 2018 1:49:41 PM io.requery.sql.LoggingListener beforeExecuteUpdate
INFO: beforeExecuteUpdate org.sqlite.jdbc4.JDBC4Statement@29176cc1 sql:
drop table if exists Details 
Sep 06, 2018 1:49:41 PM io.requery.sql.LoggingListener afterExecuteUpdate
INFO: afterExecuteUpdate 0
Sep 06, 2018 1:49:41 PM io.requery.sql.LoggingListener beforeExecuteUpdate
INFO: beforeExecuteUpdate org.sqlite.jdbc4.JDBC4Statement@29176cc1 sql:
create table Details (id integer primary key autoincrement not null, description varchar(255), details varchar(255), productID varchar(255), stock integer not null)
Sep 06, 2018 1:49:41 PM io.requery.sql.LoggingListener afterExecuteUpdate
INFO: afterExecuteUpdate 0
Sep 06, 2018 1:49:41 PM io.requery.sql.LoggingListener beforeExecuteUpdate
INFO: beforeExecuteUpdate org.sqlite.jdbc4.JDBC4Statement@29176cc1 sql:
create table Beer (id integer autoincrement not null, parseDate integer not null, details integer, image varchar(255), name varchar(255), price float not null, url varchar(255), foreign key (details) references Details (id) on delete cascade, primary key (id, parseDate))
Exception in thread "main" io.requery.sql.TableModificationException: org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (near "autoincrement": syntax error)
	at io.requery.sql.SchemaModifier.createTables(SchemaModifier.java:162)
	at io.requery.sql.SchemaModifier.createTables(SchemaModifier.java:128)
	at MainKt.main(main.kt:18)
Caused by: org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (near "autoincrement": syntax error)
	at org.sqlite.core.DB.newSQLException(DB.java:909)
	at org.sqlite.core.DB.newSQLException(DB.java:921)
	at org.sqlite.core.DB.throwex(DB.java:886)
	at org.sqlite.core.NativeDB.prepare_utf8(Native Method)
	at org.sqlite.core.NativeDB.prepare(NativeDB.java:127)
	at org.sqlite.core.DB.prepare(DB.java:227)
	at org.sqlite.jdbc3.JDBC3Statement.execute(JDBC3Statement.java:60)
	at io.requery.sql.SchemaModifier.createTables(SchemaModifier.java:153)
	... 2 more

DB Setup:

    val datasource = SQLiteDataSource()
    datasource.url = "jdbc:sqlite:beers.db"

    val config = ConfigurationBuilder(datasource, Models.DEFAULT)
            .useDefaultLogging()
            .build()

    val tables = SchemaModifier(config)
    tables.createTables(TableCreationMode.DROP_CREATE)

    val dataStore = KotlinEntityDataStore<Persistable>(config)
}

Models:

interface Beer : Persistable {

    @get:Key
    @get:Generated
    var id: Int

    @get:Key
    var parseDate: Long

    var price: Float
    var name: String
    var url: String
    var image: String

    @get:OneToOne(mappedBy = "beer")
    @get:ForeignKey
    var details: Details

    @get:OneToMany(mappedBy = "beer")
    var queryResults: Set<QueryItem>
}

@Entity
interface Details : Persistable {
    @get:Key
    @get:Generated
    var id: Int

    @get:OneToOne(mappedBy = "details")
    var beer: Beer

    var productID: String
    var stock: Int
    var description: String
    var details: MutableMap<String, String>
}

@Entity
interface QueryItem : Persistable {

    @get:Key
    @get:Generated
    var id: Int

    @get:Key
    var queryDate: Long

    @get:ManyToOne
    var beer: Beer

    var name: String
    var style: String
    var styleScore: Float
    var overallScore: Float
    var averageRating: Float
    var ratingCount: Int
    var imageUrl: String
}

Is there anything obviously wrong with this code? If so please point me in the right direction.

  1. У меня есть вот такой класс DataProvider https://pastebin.com/WKxsCec7 ,
    Который отвечает за коммуникацию плагина с базой данных. Этот класс может работать как с SQLite так и с MySQL. Но проблема в том что при работе с MySQL проблем никаких нет и все Unit тесты проходят но когда я в настройках ставлю isMySqlEnabled false тоесть заставляю работать с SQLite то при сохранении клана мне выдает вот эту ошибку

    java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such column: true)
    
        at org.sqlite.DB.newSQLException(DB.java:383)
        at org.sqlite.DB.newSQLException(DB.java:387)
        at org.sqlite.DB.throwex(DB.java:374)
        at org.sqlite.NativeDB.prepare(Native Method)
        at org.sqlite.DB.prepare(DB.java:123)
        at org.sqlite.Stmt.execute(Stmt.java:113)
        at com.lairon.xclans.data.DataProvider.saveClan(DataProvider.java:114)
        at DataProviderTests.fullClanTest(DataProviderTests.java:94)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
        at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
        at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
        at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
        at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
        at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

    пишет что он не нашел колонку при использовании метода saveClan у DataProvider.

    Юнит тесты: https://pastebin.com/5VDhP7nE

    Пробовал удалять файлик с Базой SQLite не помогло

  2. Быстрая раскрутка сервера Minecraft


  3. Dymeth

    Dymeth
    Активный участник
    Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Dymeth

    Ты пытаешься обратиться к полю с названием «true». Естественно, что такого поля нет.
    Если не можешь понять, где ты его используешь — выведи на экран свой запрос после выполнения всех замен плейсхолдеров на параметры.

    Но один важный момент — запросы так формировать нельзя. Ни в SQLite, ни в MySQL, ни где-либо ещё — ты ставишь под угрозу свой сервер. Почитай в интернете по запросу «SQL-инъекция».

    В твоём случае необходимо заменить в строке запроса все конкретные значения параметров на знаки вопроса, а сами параметры устанавливать в запрос при помощи метода statement.setObject(). Данный метод присутствует у интерфейса PreparedStatement, поэтому тебе необходимо будет вместо connection.createStatement() использовать connection.prepareStatement()

  4. Заменил на PreparedStatement и все заработало как часы с обоими базами.
    Про SQL инъекцию я знал не не думал что она работает именно так.
    И кстати вывел SQL до момента изменения на PreparedStatement и он вроде бы был нормальный с виду да и MySql с ним работал хорошо.
    Огромное спасибо


  5. NuaN

    NuaN
    Активный участник
    Пользователь

    Баллы:
    96
    Имя в Minecraft:
    NuaN

    Ну чтобы внедрить SQL-инъекцию это еще нужно сильно постараться. Особенно когда у тебя нет доступа к структуре БД, ты не знаешь какие там вообще таблицы и какие колонки, то вряд-ли что-то можно сделать. Или не?

  6. Даже если и так, риск все равно будет.
    Если представить что большинства используют таблицу с названием users, можно просто сделать что то вроде этого, при условии что запрос будет выглядеть так:

    //Если представить что пользователь ввел в поле эти данные
    String userName = «test; DROP TABLE users»;
    //Готовый запрос
    String query = «SELECT * FROM users WHERE name = » + userName;

    Или простым перебором таких иньекций, может быть какая та база и дропнится)


  7. Dymeth

    Dymeth
    Активный участник
    Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Dymeth

    Существуют способы выяснения названий таблиц, столбцов и так далее (гугл в помощь). Не всегда это воплотимо, но, как написали выше, рисковать не стоит. Достаточно один раз привыкнуть не передавать параметры в строке. Это достаточно просто


  8. NuaN

    NuaN
    Активный участник
    Пользователь

    Баллы:
    96
    Имя в Minecraft:
    NuaN

    Кстати да) Так хорошо можно нашкодить

  9. Без вывода ошибок только наугад и гугл твой не поможет, яндекс тоже.


  10. Dymeth

    Dymeth
    Активный участник
    Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Dymeth

    А что, ошибки никогда не выводятся? Специально для тебя написал «Не всегда это воплотимо»

  11. Нет конечно, у игрока только стандартная ошибка команды будет и все. Так что инъекцию в плагине будет не так просто заюзать, как на сайтах где гореадмин не отключил логирование.

    Последнее редактирование: 22 апр 2022

  12. Dymeth

    Dymeth
    Активный участник
    Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Dymeth

    Передавать параметры НЕ строкой нужно везде, включая сайты. Хватит на пустом месте полемику разводить

  13. Так это вы разводите, я лишь сказал, что проюзать инъекцию сложно без получения ошибок и ваши гуглы вам не помогут.

Поделиться этой страницей

Русское сообщество Bukkit

Bukkit по-русски - свой сервер Minecraft

KolesnikovIgor

1 / 1 / 1

Регистрация: 05.12.2016

Сообщений: 26

1

29.03.2017, 23:01. Показов 7095. Ответов 4

Метки нет (Все метки)


Здравствуйте! Вот часть моего кода:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.sql.*;
 
class SQLClient {
    private static Connection connection;
    private static Statement statement;
 
    synchronized static void connect() {
        try {
            Class.forName("org.sqlite.JDBC");
            connection = DriverManager.getConnection("jdbc:sqlite:chat_db.sqlite");
            statement = connection.createStatement();
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
 
    synchronized static void disconnect() {
        try {
            connection.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
 
    synchronized static String getNick(String login, String pass) {
        String request = "SELECT nickname FROM users WHERE login='" + login + "' AND password='" + pass + "'";
        try(ResultSet resultSet = statement.executeQuery(request);) {
            if(resultSet.next()) {
                return resultSet.getString(1);
            } else {
                return null;
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

Смысл в том, что это часть кода чата. В чат нужно запихнуть базу данных, но не удаётся. Вылазит следующая ошибка:

[SQLITE_ERROR] SQL error or missing database (no such table: users)

Испробовал различные методы, в том числе подробное указание расположения самой базы данных, но ничего не помогает.
Может вы сможете мне что-нибудь подсказать.
Если нужно, скину весь код.
Заранее спасибо!

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Эксперт Java

3636 / 2968 / 918

Регистрация: 05.07.2013

Сообщений: 14,220

29.03.2017, 23:38

2

Полный путь к файлу укажи, сделай селект в sqlite_master кажется, посмотри что пишет.



0



1 / 1 / 1

Регистрация: 05.12.2016

Сообщений: 26

29.03.2017, 23:51

 [ТС]

3

Пробовал написать полный путь к файлу, но это всё равно не помогло. Делал проверку существования таблицы с помощью селекта. Мне отобразило 1, значит таблица существует, но в джаве почему-то всё равно вылазит ошибка, что таблицы нет



0



183 / 110 / 44

Регистрация: 03.07.2016

Сообщений: 496

30.03.2017, 00:03

4

А класс у тебя тоже users называеться или Users, User. По после FROM с именем поиграться. Блин хотя может этот прикол только в JPA



0



1 / 1 / 1

Регистрация: 05.12.2016

Сообщений: 26

30.03.2017, 11:47

 [ТС]

5

У меня нет класса Users. Так только таблица называется

Добавлено через 11 часов 27 минут
Спасибо всем огромное за помощь! У меня всё работает, но я удалил старую базу данных и создал новую. Кардинально решил проблему



1



Понравилась статья? Поделить с друзьями:
  • Sqlite error no such column
  • Sqlite error near where syntax error
  • Sqlite error near select syntax error
  • Sqlite error code
  • Sqlite error cannot open